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

Копошимся во внутренностях игр и даем выход своему креативу...
b00jum
Сообщения: 724
Зарегистрирован: 01 апр 2013, 19:37

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

Сообщение b00jum »

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

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

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

Сообщение saigon1983 »

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

На текущем этапе изменениям подвергаются все стрелы, болты, ядра и дротики. До кинжалов и топоров пока не добрался.
Кроме того, на данный момент они появляются с вероятностью 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 »

Есть ненулевая вероятность, что у предмета будет несколько абилок. Хотя я и не слыхал о таком для амуниции.
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
Переводчик
Переводчик
Сообщения: 527
Зарегистрирован: 25 янв 2015, 21:43
Откуда: Санкт-Петербург

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

Сообщение saigon1983 »

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

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

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

Сообщение saigon1983 »

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

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

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

Сообщение Ardanis »

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

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

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

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

Сообщение Dzhudaga »

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

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

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

Сообщение Dzhudaga »

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

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

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

Сообщение b00jum »

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

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

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

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

Сообщение PowerLich »

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

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

Аватара пользователя
prozh
Лит. редактор
Лит. редактор
Сообщения: 1158
Зарегистрирован: 30 янв 2011, 20:41
Контактная информация:

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

Сообщение prozh »

PowerLich писал(а):Ну так вот, было бы здорово сделать Кристин и Слитха присоединяемой парочкой
Ну так вперед, делай... 8-)

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

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

Сообщение b00jum »

да тут вопрос в другом.. когда их присоединяют
если в момент встречи - так бг1 уже почти кончилось...
если, как было объявлено - консолью - когда? - при старте? - то ну его наф )

ну и то, что ломается сюжет.. мм

Аватара пользователя
prozh
Лит. редактор
Лит. редактор
Сообщения: 1158
Зарегистрирован: 30 янв 2011, 20:41
Контактная информация:

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

Сообщение prozh »

b00jum писал(а):если, как было объявлено - консолью
разработчики вообще зря оставили консоль открытой... меньше бы вопросов возникало...

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

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

Сообщение PowerLich »

b00jum писал(а):да тут вопрос в другом.. когда их присоединяют
если в момент встречи - так бг1 уже почти кончилось...
если, как было объявлено - консолью - когда? - при старте? - то ну его наф )

ну и то, что ломается сюжет.. мм
Все это писалось для EET
Ну перед началом Dragonspear и BG2, как раз перед тем, как Имоен типа в очередной раз заболела и продинамила отряд.

Сюжет не ломается, все, что нужно об сладкой парочки - это приглашение на коронацию и документы. А там мало ли что Таноко просила (вот ее кстати тоже можно в отряд брать перед храмом, экспириенс все равно распределится).
prozh писал(а): Ну так вперед, делай... 8-)
Мне и консоли хватает:-)
Вообще посмотрим, пройду Pillars Of Eternity, там поддержка EET в BWS уже объявлена, заново установлю и может что-то поковыряю. Вот только нужно много времени, чтобы разобраться в геморе со строками и диалогами.
разработчики вообще зря оставили консоль открытой... меньше бы вопросов возникало...
Тогда повторно было бы неинтересно играть, да и в случае фейлов или глюков, вызванными модами, нельзя было бы преодолеть проблемы.
А так ставлю новые паки с портретами для всех NPC в игре, и потом присоединяю интересных персов, чтобы потом их прокачать и экспортировать для последующего использования.
Помимо Кристин и Слитха, еще присоединял к примеру Самию, отличный боец и симпотный портрет в PPE. Эта которая в лабиринте Фиркраага засаду делает.
Проходил вампиром, брал в отряд некоторых из вампирш в склепе Бодхи, а также Флигию в Сарадуше (она вообще зверь).
Присоединял монашку в убежище Мае Вара, прокачал ее к концу игры, но все равно класс монаха - отстойный. Тем более, то почти каждые противники норовят на нее напасть и убить первым делом, использовать монаха выгодно только в качестве приманки.

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

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

Сообщение PowerLich »

Кстати, часто играю в BG1/2 за вампира/вампиров, вот такой код вставляю в DPLAYER3.bcs:

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

IF
	InParty(Player1)
	Race(Player1,VAMPIRE)
	AreaType(OUTDOOR)
	TimeGT(DAWN_START)
	TimeLT(DUSK_END)
	!HasItemEquiped("ohhcloak",Player1) // Cloak of Dragomir
	!HasItemEquiped("ohhkork",Player1) // Korkorran
THEN
	RESPONSE #100
		ApplyDamage(Player1,10,FIRE)
		DisplayString(Player1,42935) // Oooh, that burns. 
		Continue()
END

IF
	InParty(Player2)
	Race(Player2,VAMPIRE)
	AreaType(OUTDOOR)
	TimeGT(DAWN_START)
	TimeLT(DUSK_END)
	!HasItemEquiped("ohhcloak",Player2) // Cloak of Dragomir
	!HasItemEquiped("ohhkork",Player2) // Korkorran
THEN
	RESPONSE #100
		ApplyDamage(Player2,10,FIRE)
		DisplayString(Player2,42935) // Oooh, that burns. 
		Continue()
END

IF
	InParty(Player3)
	Race(Player3,VAMPIRE)
	AreaType(OUTDOOR)
	TimeGT(DAWN_START)
	TimeLT(DUSK_END)
	!HasItemEquiped("ohhcloak",Player3) // Cloak of Dragomir
	!HasItemEquiped("ohhkork",Player3) // Korkorran
THEN
	RESPONSE #100
		ApplyDamage(Player3,10,FIRE)
		DisplayString(Player3,42935) // Oooh, that burns. 
		Continue()
END

IF
	InParty(Player4)
	Race(Player4,VAMPIRE)
	AreaType(OUTDOOR)
	TimeGT(DAWN_START)
	TimeLT(DUSK_END)
	!HasItemEquiped("ohhcloak",Player4) // Cloak of Dragomir
	!HasItemEquiped("ohhkork",Player4) // Korkorran
THEN
	RESPONSE #100
		ApplyDamage(Player4,10,FIRE)
		DisplayString(Player4,42935) // Oooh, that burns. 
		Continue()
END

IF
	InParty(Player5)
	Race(Player5,VAMPIRE)
	AreaType(OUTDOOR)
	TimeGT(DAWN_START)
	TimeLT(DUSK_END)
	!HasItemEquiped("ohhcloak",Player5) // Cloak of Dragomir
	!HasItemEquiped("ohhkork",Player5) // Korkorran
THEN
	RESPONSE #100
		ApplyDamage(Player5,10,FIRE)
		DisplayString(Player5,42935) // Oooh, that burns. 
		Continue()
END

IF
	InParty(Player6)
	Race(Player6,VAMPIRE)
	AreaType(OUTDOOR)
	TimeGT(DAWN_START)
	TimeLT(DUSK_END)
	!HasItemEquiped("ohhcloak",Player6) // Cloak of Dragomir
	!HasItemEquiped("ohhkork",Player6) // Korkorran
THEN
	RESPONSE #100
		ApplyDamage(Player6,10,FIRE)
		DisplayString(Player6,42935) // Oooh, that burns. 
		Continue()
END
Если у вампиров нет Cloak of Dragomir или Korkorran Cloak, солнце начинает их обжигать при выходе на улицу днем.
Арты выдаю консолью. Сделано, чтобы отразить солнцебоязнь вампиров:-)

Если присоединяете вампиров Bodhi или Сарадуша (или любых других обычно неприсоединяемых NPC) консолью, не забудьте еще удалить EE Keeper-ом прописанные на вкладке Miscelanious script Name, Override Script,... в пустую строку. Вампиры Bodhi к примеру при появлении после 6-00 на улице превращаются в облачко и исчезают из отряда, если это не сделать.

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

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

Сообщение b00jum »

думается, в этом топике предполагалось немного другими вещами заниматься, чем обменом читингом

Ответить