Есть идеи? Делимся!

Копошимся во внутренностях игр и даем выход своему креативу...

Модератор: Austin

b00jum
Сообщения: 635
Зарегистрирован: 01 апр 2013, 19:37

Re: Есть идеи? Делимся!

Сообщение b00jum » 21 апр 2015, 00:12

ну я по аналогии подумал, что ты говоришь про стрелы в своем инвентори...
ок, но все равно логично же, ты же не знаешь, что это именно твоя стрела, а не заначка жертвы трехгодичной давности
но вот если ты её при этом НЕ УЗНАЕШЬ, то да, возникнет нестыковочка.. )

Аватара пользователя
saigon1983
Переводчик
Переводчик
Сообщения: 526
Зарегистрирован: 25 янв 2015, 22:43
Откуда: Санкт-Петербург

Re: Есть идеи? Делимся!

Сообщение saigon1983 » 26 апр 2015, 19:30

Я все-таки сделал этот мини-мод, который позволяет выпущенным снарядам появляться в инвентаре противника

На текущем этапе изменениям подвергаются все стрелы, болты, ядра и дротики. До кинжалов и топоров пока не добрался.
Кроме того, на данный момент они появляются с вероятностью 100% (то есть. каждый выпущенный и ПОПАВШИЙ В ЦЕЛЬ снаряд можно подобрать с тела врага).

Мод должен быть совместим с любыми играми IE, включая EE и моды и не привносит (не должен, по крайней мере) каких-либо конфликтов

Составлен исключительно с помощью WeiDU (классная вещь, что ни говори), и не изначально не имеет ни одного доп. файла, кроме TP2.

ОГРОМНАЯ просьба ко всем понимающим в моддинге людям! Прошу посмотреть код и высказать свое мнение. Это ВАЖНО, потому что это мой САМЫЙ ПЕРВЫЙ мод (если не считать скрипта, позволяющего всем бутылочкам стакаться до 20 штук).

Мне важно получить фидбэк не в плане его полезности или баланса в игре, а с точки зрения грамотности кода, полезных советов по коду и т.п.

Вот, собственно, сам код:

Код: Выделить всё

BACKUP ~NewRules/backup~
AUTHOR ~Salazar aka saigon1983~

BEGIN ~New Rules patch for IE Games~

COPY_EXISTING_REGEXP ~.*\.itm~ ~override~
	READ_SHORT 0x1c itemtype // Определяем текущий тип предмета
	READ_SHORT 0x38 maxstack // Определяем максимальное количество в стоке
	
	PATCH_IF (SOURCE_SIZE > 0x71) BEGIN // Проверка на "пустые" предметы
	
		PATCH_IF (itemtype=5) OR //Если стрела,
				 (itemtype=14) OR //или ядро,
				 (itemtype=24) OR //или дротик
				 (itemtype=31) BEGIN //или болт, то продолжаем патчить
				 
			PATCH_IF (maxstack>1) BEGIN //Патчим только, если предмет можно складывать в сток (исключаем колчаны и возвращающиеся дротики)
			
				READ_BYTE 0x72 attktype  // Залезаем в способность и определяем тип 
				READ_BYTE 0x89 primtype  // этой способности, ее магическую школу
				READ_BYTE 0x8b secdtype  // и тип заклинания
				
				PATCH_IF (attktype=2) AND   //Если тип атаки стрелковый и при этом
						 (primtype=0) AND   //нет ни магической школы ни типа заклинания,
						 (secdtype=0) BEGIN //значит предмет не волшебный и может застревать в теле
							READ_LONG 0x64 ab_offset  //Получаем офсет первой способности
							READ_SHORT 0x68 ab_number //Получаем количество способностей
							READ_LONG 0x6a ef_offset  //Получаем офсет первого эффекта
							READ_SHORT 0x6e ef_index  //Получаем индекс первого эффекта
							READ_SHORT 0x70 ef_global //Получаем количество глобальных эффектов
							READ_SHORT 0x90 in_numeff //Получаем количество эффектов в способности
							
							INNER_ACTION BEGIN //Для каждого предмета создаем отдельный эффект, помещающий в инвентарь цели этот самый предмет
								CREATE EFF "%SOURCE_RES%" //Для удобство имя файла эффекта будет эквивалентно имени файла предмета
								WRITE_LONG 0x10 122
								WRITE_LONG 0x14 2
								WRITE_LONG 0x1c 1
								WRITE_LONG 0x24 9
								WRITE_SHORT 0x2c 100
								WRITE_ASCII 0x30 ~%SOURCE_RES%~ //Прописываем в ресурс имя текущего предмета
							END
							
							SET startpoint=(0x38+ab_offset+(ef_global*0x30)+(in_numeff*0x30)) //Определяем начальную точку добавления новых эффектов
							INSERT_BYTES startpoint 0x60 //Подготавливаем почву в 30 байт для новых эффектов
							WRITE_SHORT 0x90 in_numeff+0x2 //Увеличиваем текущее количество эффектов на 2
							
							//Добавляем сами эффекты
							//Первый эффект
							WRITE_SHORT startpoint 177			//Type
							WRITE_BYTE (startpoint+0x2) 2		//Target
							WRITE_LONG (startpoint+0x4) 128	    //IDS target 2nd byte. Снаряд появится в инвентаре, если цель нейтральна по отношению к вам
							WRITE_LONG (startpoint+0x8) 2	    //IDS target 1st byte
							WRITE_BYTE (startpoint+0xc) 9		//Timing mode
							WRITE_BYTE (startpoint+0x12) 0x64		//Probability1
							WRITE_ASCIIE (startpoint+0x14) ~%SOURCE_RES%~		//Resourse. Прописываем ресурсный файл EFF
							//Второй эффект
							WRITE_SHORT (startpoint+0x30) 177			//Type
							WRITE_BYTE (startpoint+0x2+0x30) 2		//Target
							WRITE_LONG (startpoint+0x4+0x30) 255	    //IDS target 2nd byte.  Снаряд появится в инвентаре, если цель враждебна по отношению к вам
							WRITE_LONG (startpoint+0x8+0x30) 2	    //IDS target 1st byte
							WRITE_BYTE (startpoint+0xc+0x30) 9		//Timing mode
							WRITE_BYTE (startpoint+0x12+0x30) 0x64		//Probability1
							WRITE_ASCIIE (startpoint+0x14+0x30) ~%SOURCE_RES%~		//Resourse.  Прописываем ресурсный файл EFF
						//Закругляемся						
				END
			END
		END
	END
BUT_ONLY_IF_IT_CHANGES
А вот ссылка на сам мод: https://yadi.sk/d/-EUj_RIfgFmX5

Аватара пользователя
Ardanis
Сообщения: 533
Зарегистрирован: 16 июн 2010, 22:54

Re: Есть идеи? Делимся!

Сообщение Ardanis » 27 апр 2015, 02:39

Есть ненулевая вероятность, что у предмета будет несколько абилок. Хотя я и не слыхал о таком для амуниции.
SET startpoint=(0x38+ab_offset+(ef_global*0x30)+(in_numeff*0x30))
Только при условии, что предмет приведен к стандартной структуре. Игре глубоко плевать, в каком порядке идут эффекты, есть ли пропущенные или перекрываемые несколькими абилками. Имеет значение только индекс и количество. Опять же, для амуниции это нонсенс, но в более сложных случаях встречается сплошь и рядом.

Навскидку, должно выглядеть примерно так, на деле не проверял:

Код: Выделить всё

  READ_LONG  0x64 ab_offset // ability offset
  READ_SHORT 0x68 ab_number // ability count
  READ_LONG  0x6a ef_offset // effect offset
  FOR (i=0;i<ab_number;i+=1) BEGIN
    READ_SHORT ab_offset+i*0x38+0x1e ef_index // effect index
    READ_SHORT ab_offset+i*0x38+0x20 ef_count // effect count
    INNER_ACTION BEGIN

    //... create EFF file

    END
    insert_offset = ef_offset+(ef_index+ef_count+delta)*0x30
    INSERT_BYTES insert_offset 0x60

    //... write new EFFs at insert_offset

    WRITE_SHORT ab_offset+i*0x38+0x1e ef_index+delta // effect index
    WRITE_SHORT ab_offset+i*0x38+0x20 ef_count+2 // effect count
    delta+=2 // for ab_number>1
  END
Это тоже предполагает стандартную структуру, если что... Т.к. глобальные эффекты могут иметь ненулевой индекс, и вообще весь их блок может идти перед абилками.

Вообще, лучше пользоваться стандартными макросами. Ручная обработка файла хороша для понимания логики, но макросы значительно надежнее в плане избежания багов.

Аватара пользователя
saigon1983
Переводчик
Переводчик
Сообщения: 526
Зарегистрирован: 25 янв 2015, 22:43
Откуда: Санкт-Петербург

Re: Есть идеи? Делимся!

Сообщение saigon1983 » 27 апр 2015, 11:02

Ardanis писал(а):Есть ненулевая вероятность, что у предмета будет несколько абилок. Хотя я и не слыхал о таком для амуниции.
Ardanis писал(а):Только при условии, что предмет приведен к стандартной структуре. Игре глубоко плевать, в каком порядке идут эффекты, есть ли пропущенные или перекрываемые несколькими абилками. Имеет значение только индекс и количество. Опять же, для амуниции это нонсенс, но в более сложных случаях встречается сплошь и рядом.
Я как раз и смотрел по аммуниции. Из 60-ти просмотренных примеров все совпадало. Правда, я не смотрел ту, которая добавляется модами. Но, насколько я помню, у всех снарядов только одна способность, остальные - эффекты, но они как раз учтены.
Ardanis писал(а):Вообще, лучше пользоваться стандартными макросами. Ручная обработка файла хороша для понимания логики, но макросы значительно надежнее в плане избежания багов.
А вот тут бы поподробнее, т.к. до макросов я еще не дошел))

Аватара пользователя
saigon1983
Переводчик
Переводчик
Сообщения: 526
Зарегистрирован: 25 янв 2015, 22:43
Откуда: Санкт-Петербург

Re: Есть идеи? Делимся!

Сообщение saigon1983 » 27 апр 2015, 11:03

Ardanis писал(а):delta+=2
А разве WeiDU поддерживает такой вид записи инкремента? Видимо, я смотрел старые инструкции по нему, там такого не встретил

Аватара пользователя
Ardanis
Сообщения: 533
Зарегистрирован: 16 июн 2010, 22:54

Re: Есть идеи? Делимся!

Сообщение Ardanis » 27 апр 2015, 12:06

Вейду много чего поддерживает :) Большинство гайдов были написаны много лет назад, когда он не то что функции или массивы, а даже циклы только начал поддерживать.

Сейчас у всех "серьезных" модов имеются собственные библиотеки макросов, которые заимствуются между собой, а некоторые попадают и в сам Вейду. Для начала знакомства см соответствующий раздел в ридми, также можно поискать в БГ2 фикспаке и твиках, а также других технически продвинутых.

Dzhudaga
Сообщения: 4
Зарегистрирован: 29 янв 2015, 03:11

Re: Есть идеи? Делимся!

Сообщение Dzhudaga » 27 апр 2015, 17:26

Привет всем. Существуют моды по Dark Sun? Сеттинг отличный, мод можно сделать какой-нить коротенький(для начала). Я правда не программист, но могу картинок нарисовать.

Dzhudaga
Сообщения: 4
Зарегистрирован: 29 янв 2015, 03:11

Re: Есть идеи? Делимся!

Сообщение Dzhudaga » 27 апр 2015, 17:40

Помню, есть в BG куча зацепок, для путешествий по планам. Тот же Дроу в Уст-Ната( Путешественник из Spelljammer'a).

b00jum
Сообщения: 635
Зарегистрирован: 01 апр 2013, 19:37

Re: Есть идеи? Делимся!

Сообщение b00jum » 01 май 2015, 20:34

saigon1983, а твои стрелы будут выбрасывать шмот из полного инвентори? )

Dzhudaga, в непонятно пока насколько далеком будущем не отказался бы от пары карт на Лимбо )

PowerLich
Сообщения: 112
Зарегистрирован: 19 май 2016, 22:08

Re: Есть идеи? Делимся!

Сообщение PowerLich » 23 ноя 2016, 14:00

Хочу поделиться своей идеей для NPC мода.

Есть в БГ1 такие замечательные персонажи как Krystin и Slithe. У них хорошие параметры и отличная озвучка (и в PPE у них портреты неплохие, хотя Слитху я меняю портрет). И они как парочка из "Прирожденных убийц". Я обычно, когда прохожу БГ (уже не один раз:-), их консолью забираю и хожу с ними. Кристин заменяет Имоен (которую потом неоднократно выводят из отряда и которую вообще становится бесполезно таскать в отряде, а в Ascension она вообще становится врагом, то есть тратить на нее время бессмысленно 100%). Слитх - воин-вор, что тоже неплохо, можно поменять его на воина-ассасина или сделать просто воином.
А если еще ГГ - девушка, то можно с нашей парочкой заняться чем-то поинтереснее перед боем в Русалке (romantic encouters).
Ну так вот, было бы здорово сделать Кристин и Слитха присоединяемой парочкой, с возможностью постельных сцен по ходу прохождения и доп. диалогами в стиле "Давайте просто их убьем" (Вален они понравятся). И чтобы они оставались после ареста в замке Драгонспира.
Заманить в отряд их можно предложением убить Саревока, а не какого-то дебильного герцога. Или пообещать им кровавой резни, как они любят.
Вот чего не хватает в BG/EET.

Ответить