Jump to content

6.2 Suggestions thus far


Recommended Posts

/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////												  \\\\\
/////	Amaturish hackery from Nythrun begins here	\\\\\
/////												  \\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\



// .ids fixes

// This may be a little sketchy, but fireblns doesn't work otherwise
COPY_EXISTING projectl.ids override
 REPLACE_TEXTUALLY ~^0x00D2 +HOLDNECR~ ~0x00D1 HOLDNECR~
BUT_ONLY
UNLESS ~0x00D1~


// .tlk strings

// GTU strings without translations
ACTION_IF ~%LANGUAGE%~ STRING_EQUAL_CASE ~ENGLISH~ THEN BEGIN
 OUTER_SPRINT gtu_additions placeholder
 OUTER_WHILE NOT IS_AN_INT gtu_additions  || gtu_additions  > 0x01 || gtu_additions  < 0x00 BEGIN
PRINT ~Add three Game Text Update strings? Enter 0 for no, 1 for yes~
ACTION_READLN gtu_additions
 END
 ACTION_IF gtu_additions THEN BEGIN
// Evidently poor spelling is the punishment for cowardice
STRING_SET 11536 ~Truly? I had not thought you to be a coward until this day. Mingle with your brethren, coward, I shall test your mettle!~
// Harper Plot was moved from Jaheira romance only to any protagonist, but Dermin didn't get the memo
STRING_SET 26968 ~This is an internal matter of justice, and does not involve this <CHARNAME>. You can spare <PRO_HIMHER> the attacks if you submit.~
// Holy Word does more than promised
STRING_SET 25764 ~Holy Word (Conjuration/Summoning)
Level: 7
Sphere: Combat
Range: 0
Duration: Special
Casting Time: 1
Area of Effect: 30' radius
Saving Throw: None

Uttering a holy word spell creates magic of tremendous power.  The priest acts as a bridge between his god and the prime material plane causing a small explosion centered on the priest and reaching up to a 30' radius.  It affects only evil creatures or undead of any alignment that are caught in the area of effect.  The effects differ according to the level of the target as follows:

Hit Dice or levels  --  Effects of Holy word
Less than 4  --  Death
4 to 7  --  Stunned for 1 turn
8 to 11  --  Slowed for 1 turn with 75% chance of spell failure
12 and up  --  Deafened for 1 turn with 50% chance of spell failure

There is no saving throw vs. this spell and the effects last for the duration of the spell or until dispelled.  Note this spell may not be cast by any priest of evil alignment.~
 END
END

// Sound file not referenced by relevant string
OUTER_SET	strref = 27406
OUTER_SPRINT wav ~[JAHEIRBX]~
<<<<<<<<fj_set_a_string.tpp
DEFINE_ACTION_MACRO fj_set_a_string BEGIN
 OUTER_PATCH action_get_strref_yeah BEGIN
GET_STRREF strref string
 END
 STRING_SET %strref% ~%wav% %string%~%wav%
END
>>>>>>>>
COPY - fj_set_a_string.tpp fj_set_a_string.tpp
 EVALUATE_BUFFER
REINCLUDE fj_set_a_string.tpp
LAUNCH_ACTION_MACRO fj_set_a_string


// .are

// Extended Night tilesets exist, but aren't referenced (part one)
// See also ar1900n.wed
COPY_EXISTING ar1900.are override
		  ar2807.are override
 READ_SHORT  0x48  location_flags
 WRITE_SHORT 0x48 (location_flags | 0x40)
BUT_ONLY


// .bcs

// Temple of Talos script can loop interminably if <CHARNAME> murders too wantonly
COPY_EXISTING ar0904.bcs override
 DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY ~^  Dead("talmiss")~
				  ~  Dead("talmiss")  Exists("talmiss2")  !Dead("talmiss2")~
REPLACE_TEXTUALLY ~^  Dead("talmiss2")~
				  ~  Dead("talmiss2")  Exists("talmiss")  !Dead("talmiss")~
 COMPILE_BAF_TO_BCS
BUT_ONLY
UNLESS ~16465 0 1 0 0 "talmiss[2]?" "" OB~

// Celestials heal and cure party members even if hostile
ACTION_FOR_EACH script IN devaevil.bcs devagood.bcs plangood.bcs BEGIN
 ACTION_IF GAME_IS ~tob~ && FILE_EXISTS_IN_GAME ~%script%~ THEN BEGIN
COPY_EXISTING ~%script%~ override
  DECOMPILE_BCS_TO_BAF
	PATCH_FOR_EACH trigger IN
	~HaveSpell(CLERIC_LESSER_RESTORATION)~
	~HaveSpell(CLERIC_NEUTRALIZE_POISON)~
	~HaveSpell(CLERIC_REMOVE_FEAR)~
	~HPPercentLT(MostDamagedOf(Myself),25)~
	~HaveSpell(CLERIC_DISPEL_MAGIC)~
	BEGIN
	  REPLACE_TEXTUALLY ~^  \(%trigger%\)~ ~  Allegiance(Myself,[4])%lnl%  \1~
	END
  COMPILE_BAF_TO_BCS
BUT_ONLY
UNLESS ~^16395 4 0 0 0 "" "" OB~
 END
END

// Remove Mislead clones' sound sets
<<<<<<<<inlined/scripts/are/gauche/fjmislea.baf
IF
 Global("FJSetMisleadSounds","LOCALS",0)
THEN
 RESPONSE #1
SetGlobal("FJSetMisleadSounds","LOCALS",1)
SetPlayerSound(Myself,-1,0)
SetPlayerSound(Myself,-1,1)
SetPlayerSound(Myself,-1,2)
SetPlayerSound(Myself,-1,3)
SetPlayerSound(Myself,-1,4)
SetPlayerSound(Myself,-1,5)
SetPlayerSound(Myself,-1,6)
SetPlayerSound(Myself,-1,7)
SetPlayerSound(Myself,-1,8)
SetPlayerSound(Myself,-1,9)
SetPlayerSound(Myself,-1,10)
SetPlayerSound(Myself,-1,11)
SetPlayerSound(Myself,-1,12)
SetPlayerSound(Myself,-1,13)
SetPlayerSound(Myself,-1,14)
SetPlayerSound(Myself,-1,15)
SetPlayerSound(Myself,-1,16)
SetPlayerSound(Myself,-1,17)
SetPlayerSound(Myself,-1,18)
SetPlayerSound(Myself,-1,19)
SetPlayerSound(Myself,-1,20)
SetPlayerSound(Myself,-1,21)
SetPlayerSound(Myself,-1,22)
SetPlayerSound(Myself,-1,23)
SetPlayerSound(Myself,-1,24)
SetPlayerSound(Myself,-1,25)
SetPlayerSound(Myself,-1,26)
SetPlayerSound(Myself,-1,27)
SetPlayerSound(Myself,-1,28)
SetPlayerSound(Myself,-1,29)
SetPlayerSound(Myself,-1,30)
SetPlayerSound(Myself,-1,31)
SetPlayerSound(Myself,-1,32)
SetPlayerSound(Myself,-1,33)
SetPlayerSound(Myself,-1,34)
SetPlayerSound(Myself,-1,35)
SetPlayerSound(Myself,-1,36)
SetPlayerSound(Myself,-1,37)
SetPlayerSound(Myself,-1,38)
SetPlayerSound(Myself,-1,39)
SetPlayerSound(Myself,-1,40)
SetPlayerSound(Myself,-1,41)
SetPlayerSound(Myself,-1,42)
SetPlayerSound(Myself,-1,43)
SetPlayerSound(Myself,-1,44)
SetPlayerSound(Myself,-1,45)
SetPlayerSound(Myself,-1,46)
SetPlayerSound(Myself,-1,47)
SetPlayerSound(Myself,-1,48)
SetPlayerSound(Myself,-1,49)
SetPlayerSound(Myself,-1,50)
SetPlayerSound(Myself,-1,51)
SetPlayerSound(Myself,-1,52)
SetPlayerSound(Myself,-1,53)
SetPlayerSound(Myself,-1,54)
SetPlayerSound(Myself,-1,55)
SetPlayerSound(Myself,-1,55)
SetPlayerSound(Myself,-1,56)
SetPlayerSound(Myself,-1,57)
SetPlayerSound(Myself,-1,58)
SetPlayerSound(Myself,-1,59)
SetPlayerSound(Myself,-1,60)
SetPlayerSound(Myself,-1,61)
SetPlayerSound(Myself,-1,62)
SetPlayerSound(Myself,-1,63)
SetPlayerSound(Myself,-1,64)
SetPlayerSound(Myself,-1,65)
SetPlayerSound(Myself,-1,66)
SetPlayerSound(Myself,-1,67)
SetPlayerSound(Myself,-1,68)
SetPlayerSound(Myself,-1,69)
SetPlayerSound(Myself,-1,70)
SetPlayerSound(Myself,-1,71)
SetPlayerSound(Myself,-1,72)
SetPlayerSound(Myself,-1,73)
SetPlayerSound(Myself,-1,74)
SetPlayerSound(Myself,-1,75)
//SetName(8291)
//ChangeClass(Myself,210)
ChangeAIScript("",1)
END
>>>>>>>>
COMPILE ~inlined/scripts/are/gauche/fjmislea.baf~

/*
// Spore Colonies checking wrong variable for their summonings
COPY_EXISTING
icfung02.bcs override
icfungus.bcs override
 REPLACE_TEXTUALLY ~"LOCALSMushroom"~ ~"LOCALSMushroomSummon"~
BUT_ONLY
*/

// Hostile and out of party Minsc and Valygar shouldn't heal party members
COPY_EXISTING minscx.bcs   override
		  valvsed.bcs  override
		  valygx.bcs   override
 REPLACE_TEXTUALLY ~^0 0 0 0 0 0 0 1 6 0 0 0 ""OB~ ~0 0 0 0 0 0 0 1 0 0 0 0 ""OB~
BUT_ONLY
IF ~^0 0 0 0 0 0 0 1 6 0 0 0 ""OB~


// .cre

// mismatching names
COPY_EXISTING 
alphonse.cre override // alphonse - servant
elesah02.cre override // sahuagin baronial guard - baronial guard
// gorlum.cre   override // machine of lum the mad - machine of lum
kuotoa01.cre override // kuo-toa warrior - kuo-toa
life01.cre   override // tortured one - life support creature
life02.cre   override // tortured one - life support creature
life03.cre   override // tortured one - life support creature
life04.cre   override // tortured one - life support creature
obssah03.cre override // sahuagin baronial guard - baronial guard
sahbar01.cre override // sahuagin baronial guard - baronial guard
sahextra.cre override // sahuagin royal guard - royal guard
sahgrd01.cre override // sahuagin royal guard - royal guard
sahgrd02.cre override // sahuagin royal guard - royal guard
sahgrd03.cre override // sahuagin royal guard - royal guard
 READ_LONG  0x08 name
 WRITE_LONG 0x0c name
BUT_ONLY

// mismatching names
COPY_EXISTING 
gendjn01.cre override // djinni - noble djinni
genefn01.cre override // efreeti - noble efreeti
kptrol06.cre override // troll - ice troll
lasmist.cre  override // djinni - gaseous form
obsfir01.cre override // efreeti - noble efreeti
ppbodbat.cre override // vampire - vampire bat
ppdjinn2.cre override // djinni - noble djinni
ppmind01.cre override // mind flayer - ulitharid
tanomist.cre override // vampire - gaseous form
trolfr01.cre override // troll - freshwater troll
trolfr02.cre override // troll - freshwater troll
trolsn01.cre override // troll - snow troll
trolsn02.cre override // troll - snow troll
udelder.cre  override // beholder - elder orb
valemist.cre override // vampire - gaseous form
vampbat.cre  override // vampire - vampire bat
 READ_LONG  0x0c name
 WRITE_LONG 0x08 name
BUT_ONLY

// Jan is a specialist mage without his bonus spell per level
COPY_EXISTING jan8.cre	 override
		  jan10.cre	override
		  jan11.cre	override
		  jan12.cre	override
		  jan15.cre	override
 PATCH_IF SOURCE_SIZE > 0x2d3 BEGIN
ADD_MEMORIZED_SPELL spwi118 #0 WIZARD
ADD_MEMORIZED_SPELL spwi201 #1 WIZARD
ADD_MEMORIZED_SPELL spwi302 #2 WIZARD
PATCH_IF		  ~%SOURCE_RES%~ STRING_EQUAL jan8  BEGIN
  ADD_MEMORIZED_SPELL spwi405 #3 WIZARD
END ELSE PATCH_IF ~%SOURCE_RES%~ STRING_EQUAL jan10 BEGIN
  ADD_MEMORIZED_SPELL spwi405 #3 WIZARD
  ADD_MEMORIZED_SPELL spwi508 #4 WIZARD
END ELSE BEGIN
  ADD_MEMORIZED_SPELL spwi401 #3 WIZARD
  ADD_MEMORIZED_SPELL spwi508 #4 WIZARD
END
 END
BUT_ONLY


// .dlg - inlined ugliness to avoid splitting fixes among multiple files

// Invincible Imoen in Chateau Irenicus exploit
<<<<<<<<inlined/dialogues/are/gauche/betabetasoa.d
REPLACE_STATE_TRIGGER imoenp 3 ~Global("ImoenRunning","LOCALS",1)~
SET_WEIGHT imoenp 3 #-1
>>>>>>>>
COMPILE ~inlined/dialogues/are/gauche/betabetasoa.d~

// Deck of Many Things can't figure out the prime requisite for rogues and bards
ACTION_IF GAME_IS ~tob~ THEN BEGIN
 <<<<<<<<inlined/dialogues/are/gauche/betabetatob.d
 ALTER_TRANS domt BEGIN 19 END BEGIN 3 END BEGIN
~TRIGGER~ ~OR(2)
Class(LastTalkedToBy,BARD_ALL)
Class(LastTalkedToBy,THIEF_ALL)~
 END
 >>>>>>>>
 COMPILE ~inlined/dialogues/are/gauche/betabetatob.d~
END


// .eff

// Even MORE Assassin poison; type is incorrect
COPY_EXISTING spcl422a.eff override
 WRITE_LONG 0x20 0x02
BUT_ONLY

ACTION_IF GAME_IS ~tob~ THEN BEGIN

 // Missing charges for Wish: Wand of Fire
 COPY_EXISTING wish14d.eff override
WRITE_LONG 0x60 0x05
 BUT_ONLY

 // Missing charges for Wish: Wand of Spellstriking
 COPY_EXISTING wish14g.eff override
WRITE_LONG 0x60 0x05
 BUT_ONLY

END

// Bolt of Glory has an inadequate understanding of "Prime" (vide infra)
COPY_EXISTING 
daystar1.eff ~override/sppr612p.eff~
daystar1.eff ~override/sppr612u.eff~
 WRITE_LONG  0x1c ~%DEST_RES%~ STRING_EQUAL sppr612p ? 2 : 4
 WRITE_LONG  0x20 3
 WRITE_LONG  0x24 0x00 // timing mode
 WRITE_ASCII 0x30 boltprim
 PATCH_IF ~%DEST_RES%~ STRING_EQUAL sppr612u BEGIN
WRITE_ASCII 0x30 boltelem
 END
 WRITE_LONG  0x38 0x00
 WRITE_LONG  0x3c 0x00
 WRITE_LONG  0x60 0x00
 WRITE_ASCII 0x78 ~~ #8
 WRITE_LONG  0xa4 ` 0x00
IF_SIZE_IS 0x110


// .itm

// Long Bows provide +1 THAC0, unless magical, sometimes
COPY_EXISTING
bow09.itm override // Ripper +2
bow13.itm override // Mana Bow +4
bow17.itm override // Long Bow +2
bow22.itm override // Taralash +4
bow23.itm override // Taralash +5
bow25.itm override // Long Bow +3
 PATCH_IF SOURCE_SIZE > 0x71 BEGIN
READ_LONG  0x60 enchantment
READ_LONG  0x64 ho
READ_SHORT 0x68 hc
FOR (i_0 = 0x00; i_0 < hc; i_0 += 0x01) BEGIN
  READ_BYTE  ho + 0x38 * i_0 + 0x00 type
  READ_SHORT ho + 0x38 * i_0 + 0x14 thac0
  PATCH_IF type = 0x04 && thac0 = enchantment BEGIN
	SET thac0 = enchantment + 0x01
	WRITE_SHORT ho + 0x38 * i_0 + 0x14 thac0
	PATCH_IF ~%LANGUAGE%~ STRING_EQUAL_CASE ~ENGLISH~ BEGIN
	  READ_STRREF 0x54 id
	  INNER_PATCH_SAVE id ~%id%~ BEGIN
		REPLACE_TEXTUALLY ~^ *THAC[O0]: +\+%enchantment%~ ~THAC0: +%thac0%~
	  END
	  SAY_EVALUATED 0x54 ~%id%~
	END
  END
END
 END
BUT_ONLY

// Skull of Death allows two saving throws and magic resistance checks
COPY_EXISTING helm17.itm override
 READ_LONG  0x64 ho
 READ_SHORT 0x68 hc
 READ_LONG  0x6a eo
 SPRINT resref null
 FOR (i_0 = 0x00; i_0 < hc && ~%resref%~ STRING_COMPARE_CASE ~spwi605~; i_0 += 0x01) BEGIN
READ_SHORT ho + 0x38 * i_0 + 0x1e ec
READ_SHORT ho + 0x38 * i_0 + 0x20 ei
FOR (i_1 = 0x00; i_1 < ec && ~%resref%~ STRING_COMPARE_CASE ~spwi605~; i_1 += 0x01) BEGIN
  READ_ASCII eo + 0x30 * (ei + i_1) + 0x14 resref
  PATCH_IF ~%resref%~ STRING_EQUAL_CASE spwi605 BEGIN
	WRITE_BYTE eo + 0x30 * (ei + i_1) + 0x0d 0x00 // no magic resistance check
	WRITE_LONG eo + 0x30 * (ei + i_1) + 0x24 0x00 // no save
  END
END
 END
BUT_ONLY


// .spl

// Mislead clones able to affect the world through Bard Song
COPY_EXISTING mislead.spl  override
 READ_LONG  0x64 ho
 READ_SHORT 0x68 hc
 READ_LONG  0x6a eo
 FOR (i_0 = 0x00; i_0 < hc; i_0 += 0x01) BEGIN
READ_SHORT ho + 0x28 * i_0 + 0x1e ec
READ_SHORT ho + 0x28 * i_0 + 0x20 ei
FOR (i_1 = 0x00 opcode = 0xffff; i_1 < ec && opcode != 0x48; i_1 += 0x01) BEGIN
  READ_SHORT eo + 0x30 * (i_1 + ei) + 0x00 opcode
  WRITE_BYTE eo + 0x30 * (i_1 + ei) + 0x0c 0x01 // permanent
  WRITE_BYTE eo + 0x30 * (i_1 + ei) + 0x0d 0x00 // color effects not dispellable
  WRITE_LONG eo + 0x30 * (i_1 + ei) + 0x0e 0x00 // nulling useless duration
  PATCH_IF i_1 = 0x00 BEGIN
	READ_ASCII eo + 0x30 * ei + 0x00 ef_0 (0x30)
	INNER_PATCH_SAVE ef_0 ~%ef_0%~ BEGIN
	  WRITE_SHORT  0x00 0x48 // Change IDS state
	  WRITE_LONG   0x04 0xd2 // Wizard Eye
	  WRITE_LONG   0x08 0x03 // Class.ids
	  WRITE_ASCII  0x14 ~~ #8
	END
	INNER_PATCH_SAVE ef_1 ~%ef_0%~ BEGIN
	  WRITE_SHORT  0x00 0x52 // Change AI Script
	  WRITE_LONG   0x04 0x00 // Unused
	  WRITE_LONG   0x08 0x01 // Type: Area
	  WRITE_ASCII  0x14 fjmislea
	END
  END
END
PATCH_IF opcode != 0x48 BEGIN
  WRITE_SHORT ho + 0x28 * i_0 + 0x1e ec + 0x02
  INSERT_BYTES eo + 0x30 * (ec + ei) + 0x00 0x60
  WRITE_ASCIIE eo + 0x30 * (ec + ei) + 0x00 ~%ef_0%~
  WRITE_ASCIIE eo + 0x30 * (ec + ei) + 0x30 ~%ef_1%~
  FOR (i_1 = i_0 + 0x01; i_1 < hc; i_1 += 0x01) BEGIN
	READ_SHORT  ho + 0x28 * i_1 + 0x20 ei
	WRITE_SHORT ho + 0x28 * i_1 + 0x20 ei + 0x02
  END
END
 END
BUT_ONLY

// Two varieties of Bounty Hunter Special Snare can be "thrown"
COPY_EXISTING spcl415.spl override
 READ_LONG  0x64 ho
 FOR (READ_SHORT 0x68 hc; hc; hc -= 0x01) BEGIN
WRITE_BYTE ho + 0x28 * hc - 0x28 0x01
 END
BUT_ONLY

// Pointless global effects on party exclusive projectiles
COPY_EXISTING
spin681.spl override // BANSHEE_WAIL
spin789.spl override // Demilich Howl
spin820.spl override // ELVEN_GUARD_WAIL
spwi913.spl override // Wail of the Banshee
 READ_LONG  0x64 ho
 READ_LONG  0x6a eo
 READ_SHORT 0x6e gi
 READ_SHORT 0x70 ec
 FOR (READ_SHORT 0x68 hc; hc; hc -= 0x01) BEGIN
READ_SHORT  ho + 0x28 * (hc - 0x01) + 0x20 ei
WRITE_SHORT ho + 0x28 * (hc - 0x01) + 0x20 ei < gi + ec ? ei : ei - ec
 END
 DELETE_BYTES eo + 0x30 * gi 0x30 * ec
 WRITE_SHORT 0x70 0x00
BUT_ONLY  

// Bolt of Glory has an inadequate understanding of "Prime" (part two)
COPY_EXISTING sppr612.spl  override
 READ_LONG  0x64 ho
 READ_SHORT 0x68 hc
 READ_LONG  0x6a eo
 FOR (i_0 = 0x00; i_0 < hc; i_0 += 0x01) BEGIN
READ_SHORT ho + 0x28 * i_0 + 0x1e ec
READ_SHORT ho + 0x28 * i_0 + 0x20 ei
FOR (i_1 = 0x00 opcode = 0xffff; i_1 < ec && opcode != 0xd7; i_1 += 0x01) BEGIN
  READ_SHORT eo + 0x30 * (i_1 + ei) + 0x00 opcode
  PATCH_IF opcode = 0xd7 BEGIN
	READ_ASCII eo + 0x30 * (i_1 + ei) + 0x00 ef_0 (0x30)
  END
END
DELETE_BYTES eo + 0x30 * ei 0x30 * ec
INSERT_BYTES eo + 0x30 * ei 0x30 
WRITE_ASCIIE eo + 0x30 * ei ~%ef_0%~
INNER_PATCH_SAVE ef_0 ~%ef_0%~ BEGIN
  WRITE_SHORT 0x00 0xb1 // Use .eff
  WRITE_LONG  0x08 0x04 // Race.ids
  WRITE_BYTE  0x0c 0x00 // timing mode: duration
  WRITE_ASCII 0x14 boltprim
END
SET en = 0x01
PATCH_FOR_EACH race IN 
1 2 3 4 5 6 7 101 102 103 104 105 106 107 109 110 111 112 
113 116 117 118 119 120 122 123 124 127 129 130 131 135 
137 138 140 141 142 143 144 146 151 154 199 206 213 214
BEGIN
  INSERT_BYTES eo + 0x30 * (en + ei) + 0x00 0x30
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x00 ~%ef_0%~
  WRITE_LONG   eo + 0x30 * (en + ei) + 0x04 race
  SET en += 0x01
END
INNER_PATCH_SAVE ef_0 ~%ef_0%~ BEGIN
  WRITE_ASCII 0x14 boltund #8
END
PATCH_FOR_EACH race IN 108 115 125 126 132 133 134 136 148 150 155 BEGIN
  INSERT_BYTES eo + 0x30 * (en + ei) + 0x00 0x30
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x00 ~%ef_0%~
  WRITE_LONG   eo + 0x30 * (en + ei) + 0x04 race
  SET en += 0x01
END
INNER_PATCH_SAVE ef_0 ~%ef_0%~ BEGIN
  WRITE_ASCII 0x14 boltdem #8
END
PATCH_FOR_EACH race IN 121 BEGIN
  INSERT_BYTES eo + 0x30 * (en + ei) + 0x00 0x30
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x00 ~%ef_0%~
  WRITE_LONG   eo + 0x30 * (en + ei) + 0x04 race
  SET en += 0x01
END
INNER_PATCH_SAVE ef_0 ~%ef_0%~ BEGIN
  WRITE_ASCII 0x14 boltelem #8
END
PATCH_FOR_EACH race IN 145 BEGIN
  INSERT_BYTES eo + 0x30 * (en + ei) + 0x00 0x30
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x00 ~%ef_0%~
  WRITE_LONG   eo + 0x30 * (en + ei) + 0x04 race
  SET en += 0x01
END
PATCH_FOR_EACH eff IN sppr612p BEGIN
  INSERT_BYTES eo + 0x30 * (en + ei) + 0x00 0x30
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x00 ~%ef_0%~
  WRITE_LONG   eo + 0x30 * (en + ei) + 0x04 255
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x14 ~%eff%~
  SET en += 0x01
END
PATCH_FOR_EACH eff IN sppr612u BEGIN
  INSERT_BYTES eo + 0x30 * (en + ei) + 0x00 0x30
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x00 ~%ef_0%~
  WRITE_LONG   eo + 0x30 * (en + ei) + 0x04 123
  WRITE_ASCIIE eo + 0x30 * (en + ei) + 0x14 ~%eff%~
  SET en += 0x01
END
WRITE_SHORT ho + 0x28 * i_0 + 0x1e en
FOR (i_1 = i_0 + 0x01; i_1 < hc; i_1 += 0x01) BEGIN
  READ_SHORT  ho + 0x28 * i_1 + 0x20 ei
  WRITE_SHORT ho + 0x28 * i_1 + 0x20 ei + en - ec
END
 END
BUT_ONLY

// Spells using inconsistent, or wrong projectiles
OUTER_PATCH action_define_associative_array_in_204 BEGIN
 DEFINE_ASSOCIATIVE_ARRAY fj_projectile_fix BEGIN
sppr508.spl => 0x30 // Chaotic Commands => Sparkle Gold (sparklgo)
sppr512.spl => 0x9f // Greater Command => In Area Not Party (inareanp)
//  sppr710.spl => 0xd4 // Holy Word => In Area Not Self (inareans)
 END
END
ACTION_PHP_EACH fj_projectile_fix AS file => proj BEGIN
 COPY_EXISTING ~%file_0%~ override
READ_LONG  0x64 ho
FOR (READ_SHORT 0x68 hc; hc; hc -= 0x01) BEGIN
  WRITE_SHORT ho + 0x28 * hc - 0x02 proj
END
 BUT_ONLY
END
OUTER_PATCH action_clear_array_yeah BEGIN
 CLEAR_ARRAY fj_projectile_fix
END

// Shield spells not protecting against TRAP_MAGIC_MISSILE
COPY_EXISTING 
spwi114.spl override // Shield
amul15.itm  override // Shield Amulet
 READ_LONG  0x64 ho
 READ_SHORT 0x68 hc
 READ_LONG  0x6a eo
 SET hs = ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.itm$~ ? 0x28 : 0x38
 FOR (i_0 = 0x00; i_0 < hc; i_0 += 0x01) BEGIN
READ_SHORT  ho + hs * i_0 + 0x1e ec
READ_SHORT  ho + hs * i_0 + 0x20 ei
SPRINT resref ~null~
FOR (i_1 = 0x00; i_1 < ec && ~%resref%~ STRING_COMPARE_CASE ~spwi003~; i_1 += 0x01) BEGIN
  READ_ASCII eo + 0x30 * (i_1 + ei) + 0x14 resref
  PATCH_IF ~%resref%~ STRING_EQUAL_CASE spwi112 BEGIN
	READ_ASCII eo + 0x30 * (i_1 + ei) ef (0x30)
  END
END
PATCH_IF ~%resref%~ STRING_COMPARE_CASE ~spwi003~ BEGIN
  WRITE_SHORT ho + 0x28 * i_0 + 0x1e ec + 0x01
  INSERT_BYTES eo + 0x30 * (ec + ei) + 0x00 0x30
  WRITE_ASCIIE eo + 0x30 * (ec + ei) + 0x00 ~%ef_0%~
  WRITE_ASCII  eo + 0x30 * (ec + ei) + 0x14 spwi003 #8
  FOR (i_1 = i_0 + 0x01; i_1 < hc; i_1 += 0x01) BEGIN
	READ_SHORT  ho + hs * i_1 + 0x20 ei
	WRITE_SHORT ho + hs * i_1 + 0x20 ei + 0x01
  END
END
 END
BUT_ONLY

// Sunfire interrupts caster, adds resist fire, sometimes bypasses immunities
// due to bizzare implementation
COPY_EXISTING spwi523.spl override
 READ_LONG  0x64 ho
 READ_SHORT 0x68 hc
 READ_LONG  0x6a eo
 FOR (i_0 = 0x00; i_0 < hc; i_0 += 0x01) BEGIN
READ_SHORT  ho + 0x28 * i_0 + 0x1e ec
READ_SHORT  ho + 0x28 * i_0 + 0x20 ei
WRITE_SHORT ho + 0x28 * i_0 + 0x26 0xd3 // Projectile: Fireball No Center (fireblns)
FOR (i_1 = 0x00 opcode = 0xffff; i_1 < ec && opcode != 0x1e; i_1 += 0x01) BEGIN
  READ_SHORT eo + 0x30 * (i_1 + ei) + 0x00 opcode
  PATCH_IF opcode = 0x1e BEGIN
	WRITE_SHORT ho + 0x28 * i_0 + 0x1e ec - 0x01
	DELETE_BYTES eo + 0x30 * (i_1 + ei) 0x30 // delete fire resistance
	FOR (i_2 = i_0 + 0x01; i_2 < hc; i_2 += 0x01) BEGIN
	  READ_SHORT  ho + 0x28 * i_2 + 0x20 ei
	  WRITE_SHORT ho + 0x28 * i_2 + 0x20 ei - 0x01
	END
  END
END
 END
BUT_ONLY

// Prismatic Spray only blinding targets up to level five, rather than seven
COPY_EXISTING spwi714.spl override
 READ_LONG  0x64 ho
 READ_SHORT 0x68 hc
 READ_LONG  0x6a eo
 FOR (i_0 = 0x00; i_0 < hc; i_0 += 0x01) BEGIN
READ_SHORT  ho + 0x28 * i_0 + 0x1e ec
READ_SHORT  ho + 0x28 * i_0 + 0x20 ei
FOR (i_1 = 0x00 opcode = 0xffff; i_1 < ec && opcode != 0x4a; i_1 += 0x01) BEGIN
  READ_SHORT eo + 0x30 * (i_1 + ei) + 0x00 opcode
  PATCH_IF opcode = 0x4a BEGIN
	WRITE_SHORT eo + 0x30 * (i_1 + ei) + 0x1c 0x07
  END
END
 END
BUT_ONLY

// Pierce Shield provides no feedback when it lowers magic resistance
COPY_EXISTING spwi805.spl override
 READ_LONG  0x64 ho
 READ_SHORT 0x68 hc
 READ_LONG  0x6a eo
 FOR (i_0 = 0x00; i_0 < hc; i_0 += 0x01) BEGIN
READ_SHORT  ho + 0x28 * i_0 + 0x10 ml
READ_SHORT  ho + 0x28 * i_0 + 0x1e ec
READ_SHORT  ho + 0x28 * i_0 + 0x20 ei
FOR (i_1 = 0x00 opcode = 0xffff; i_1 < ec && opcode != 0x8b; i_1 += 0x01) BEGIN
  READ_SHORT eo + 0x30 * (i_1 + ei) + 0x00 opcode
  PATCH_IF i_1 = 0x00 BEGIN
	READ_ASCII eo + 0x30 * ei + 0x00 ef_0 (0x30)
	INNER_PATCH_SAVE ef_0 ~%ef_0%~ BEGIN
	  WRITE_SHORT  0x00 0x8b // Display String Feedback
	  WRITE_LONG   0x04 ml < 17 ? 32869 : ml < 20 ? 32853 + ml : 32875 // String to run
	  WRITE_LONG   0x08 0x00 // Unused
	  WRITE_ASCII  0x14 ~~ #8
	END
  END
END
PATCH_IF opcode != 0x8b BEGIN
  WRITE_SHORT ho + 0x28 * i_0 + 0x1e ec + 0x01
  INSERT_BYTES eo + 0x30 * (ec + ei) 0x30
  WRITE_ASCIIE eo + 0x30 * (ec + ei) ~%ef_0%~
  FOR (i_1 = i_0 + 0x01; i_1 < hc; i_1 += 0x01) BEGIN
	READ_SHORT  ho + 0x28 * i_1 + 0x20 ei
	WRITE_SHORT ho + 0x28 * i_1 + 0x20 ei + 0x01
  END
END
 END
BUT_ONLY


// .wed

// Extended Night tilesets exist, but unreferenced (part two)
COPY ~bg2fixpack/wed/ar1900n.wed~ override

Link to comment
DEFINE_PATCH_MACRO fj_add_batch_effects BEGIN
 LOCAL_SET ho	= 0
 LOCAL_SET hc	= 0
 LOCAL_SET eo	= 0
 LOCAL_SET ec	= 0
 LOCAL_SET ei_0  = 0
 LOCAL_SET ei_1  = 0
 LOCAL_SET fl	= 0
 LOCAL_SET ft	= 0
 LOCAL_SET cs	= 0
 LOCAL_SET nf	= 0
 LOCAL_SET i_0   = 0
 LOCAL_SET i_1   = 0
 LOCAL_SET match = 0
 LOCAL_SET int_0 = 0
 LOCAL_SET val_0 = 0
 LOCAL_SET t_0   = 0
 LOCAL_SET o_0   = 0
 LOCAL_SET o_1   = 0
 LOCAL_SET es	= 0x30
 LOCAL_SET gl	= (NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.spl$~) ? 0	 : 1
 LOCAL_SET co	= (NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.cre$~) ? 0x2c8 : 0x70
 LOCAL_SET ms	= (NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.cre$~) ? 0x2d4 : 0x72
 LOCAL_SET hs	= (NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.spl$~) ? 0x28  :
				(NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.itm$~) ? 0x38  : 0
 PATCH_IF NOT SOURCE_SIZE < ms BEGIN
PATCH_IF		  NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.spl$~ BEGIN
  READ_LONG   0x64 ho
  READ_SHORT  0x68 hc
  READ_LONG   0x6a eo
  SET cs = 1
END ELSE PATCH_IF NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.itm$~ BEGIN
  READ_BYTE   0x18 fl
  READ_LONG   0x64 ho
  READ_SHORT  0x68 hc
  READ_LONG   0x6a eo
  PATCH_IF ~%SOURCE_RES%~ STRING_MATCHES_REGEXP ~^\(imoenhp1\)$~ BEGIN
	SET cs = (fl & 0x4) = 0x4 ? 1 : 0
  END
END ELSE PATCH_IF NOT ~%SOURCE_FILE%~ STRING_MATCHES_REGEXP ~^.+\.cre$~ BEGIN
  READ_LONG  0x2c4 eo
  READ_BYTE  0x033 ft
  SET es = ft = 0x1 ? 0x108 : 0x30
END
FOR (i_0 = 0 - gl; i_0 < hc; i_0 += 1) BEGIN
  SPRINT match ~~
  LAUNCH_PATCH_MACRO ~fj_list_batch_%immunity_type%~
  READ_SHORT (i_0 < 0 ? co : ho + i_0 * hs + 0x1e) ec
  PATCH_IF co = 0x70 BEGIN
	READ_SHORT (i_0 < 0 ? 0x6e : ho + i_0 * hs + 0x20) ei_0
  END
  FOR (i_1 = 0; i_1 < ec; i_1 += 1) BEGIN
	READ_SHORT eo + 0x00 + ft * 0x08 + es * (ei_0 + i_1) op
	PHP_EACH match_op AS int => val_0 BEGIN
	  PATCH_IF val_0 = op BEGIN
		READ_LONG  eo + 0x04 + ft * 0x10 + es * (ei_0 + i_1) p1
		READ_LONG  eo + 0x08 + ft * 0x10 + es * (ei_0 + i_1) p2
		READ_ASCII eo + 0x14 + ft * 0x14 + es * (ei_0 + i_1) rr
		PATCH_IF ($match_p1(~%int_0%~) = p1 || $match_p1(~%int_0%~) = 0) &&
				 ($match_p2(~%int_0%~) = p2 || $match_p2(~%int_0%~) = 0) &&
		($match_rr(~%int_0%~) STRING_EQUAL_CASE ~%rr%~ || $match_rr(~%int_0%~) STRING_EQUAL_CASE ~~) BEGIN
		  SET $match_op(~%int_0%~) = (` 0)
		  PATCH_IF ~%match%~ STRING_EQUAL ~~ BEGIN
			READ_ASCII eo + es * (ei_0 + i_1) match (es)
		  END
		END
	  END
	END
	PHP_EACH new_op AS int => val_0 BEGIN
	  PATCH_IF val_0 = op BEGIN
		READ_LONG  eo + 0x04 + ft * 0x10 + es * (ei_0 + i_1) p1
		READ_LONG  eo + 0x08 + ft * 0x10 + es * (ei_0 + i_1) p2
		READ_ASCII eo + 0x14 + ft * 0x14 + es * (ei_0 + i_1) rr
		PATCH_IF ($new_p1(~%int_0%~) = p1 || $new_p1(~%int_0%~) = 0) &&
				 ($new_p2(~%int_0%~) = p2 || $new_p2(~%int_0%~) = 0) &&
		($new_rr(~%int_0%~) STRING_EQUAL_CASE ~%rr%~ || $new_rr(~%int_0%~) STRING_EQUAL_CASE ~~) BEGIN
		  SET $new_op(~%int_0%~) = (` 0)
		END
	  END
	END
	PATCH_IF cs BEGIN
	  PHP_EACH cosmetic_op AS int => val_0 BEGIN
		PATCH_IF val_0 = op BEGIN
		  READ_LONG  eo + 0x04 + ft * 0x10 + es * (ei_0 + i_1) p1
		  READ_LONG  eo + 0x08 + ft * 0x10 + es * (ei_0 + i_1) p2
		  READ_ASCII eo + 0x14 + ft * 0x14 + es * (ei_0 + i_1) rr
		  PATCH_IF ($cosmetic_p1(~%int_0%~) = p1 || $cosmetic_p1(~%int_0%~) = 0) &&
				   ($cosmetic_p2(~%int_0%~) = p2 || $cosmetic_p2(~%int_0%~) = 0) &&
		  ($cosmetic_rr(~%int_0%~) STRING_EQUAL_CASE ~%rr%~ || $cosmetic_rr(~%int_0%~) STRING_EQUAL_CASE ~~) BEGIN
			SET $cosmetic_op(~%int_0%~) = (` 0)
		  END
		END
	  END
	END
  END
  SET nf = 0
  SET o_0 = eo + es * (ei_0 + ec)
  PATCH_IF ~%match%~ STR_CMP ~~ BEGIN
	PATCH_FOR_EACH array IN new match cosmetic BEGIN
	  PHP_EACH ~%array%_op~ AS int => val_0 BEGIN
		PATCH_IF cs || ~%array%~ STR_CMP cosmetic BEGIN
		  PATCH_IF val_0 > (` 0) BEGIN
			INNER_PATCH_SAVE match ~%match%~ BEGIN
			  WRITE_SHORT  0x00 + ft * 0x08 $EVALUATE_BUFFER ~%array%_op~(~%int_0%~)
			  WRITE_LONG   0x04 + ft * 0x10 $EVALUATE_BUFFER ~%array%_p1~(~%int_0%~)
			  WRITE_LONG   0x08 + ft * 0x10 $EVALUATE_BUFFER ~%array%_p2~(~%int_0%~)
			  SPRINT t_0 $EVALUATE_BUFFER ~%array%_rr~(~%int_0%~)
			  WRITE_ASCIIE 0x14 + ft * 0x14 ~%t_0%~ #8
			END
			INSERT_BYTES o_0 es
			WRITE_ASCIIE o_0 ~%match%~
			SET o_0 += es
			SET nf += 1
		  END
		END
	  END
	END
	PATCH_IF nf BEGIN
	  WRITE_SHORT (i_0 < 0 ? co : ho + i_0 * hs + 0x1e) ec + nf
	  PATCH_IF co != 0x70 BEGIN
		PATCH_FOR_EACH o_0 IN 0x02a0 0x02a8 0x02b0 0x02b8 0x02bc BEGIN
		  READ_LONG  o_0 o_1
		  WRITE_LONG o_0 o_1 < eo ? o_1 : o_1 + nf * es
		END
	  END ELSE BEGIN
		FOR (i_1 = i_0 + 1; i_1 < hc; i_1 += 1) BEGIN
		  READ_SHORT  ho + hs * i_1 + 0x20 ei_1
		  WRITE_SHORT ho + hs * i_1 + 0x20 ei_1 < ei_0 + ec ? ei_1 : ei_1 + nf
		END
	  END
	END
  END
END
 END
END

DEFINE_PATCH_MACRO fj_list_batch_fear BEGIN
 // morale modifier immunity
 SET	$match_op(0) = 101
 SET	$match_p1(0) = 0
 SET	$match_p2(0) = 23
 SPRINT $match_rr(0) ~~
 // horror immunity
 SET	$match_op(1) = 101
 SET	$match_p1(1) = 0
 SET	$match_p2(1) = 24
 SPRINT $match_rr(1) ~~
 // morale break modifier immunity
 SET	$match_op(2) = 101
 SET	$match_p1(2) = 0
 SET	$match_p2(2) = 106
 SPRINT $match_rr(2) ~~
 // modify morale
 SET	$new_op(0) = 23
 SET	$new_p1(0) = 0
 SET	$new_p2(0) = 0
 SPRINT $new_rr(0) ~~
 // cure horror
 SET	$new_op(1) = 161
 SET	$new_p1(1) = 0
 SET	$new_p2(1) = 0
 SPRINT $new_rr(1) ~~
 // morale break modifier
 SET	$new_op(2) = 106
 SET	$new_p1(2) = 0
 SET	$new_p2(2) = 1
 SPRINT $new_rr(2) ~~
 // disable string "Panic"
 SET	$new_op(3) = 267
 SET	$new_p1(3) = 14007
 SET	$new_p2(3) = 0
 SPRINT $new_rr(3) ~~
 // disable string "Panic"
 SET	$new_op(4) = 267
 SET	$new_p1(4) = 17427
 SET	$new_p2(4) = 0
 SPRINT $new_rr(4) ~~
 // immunity to spell: Cloak of Fear
 SET	$new_op(5) = 206
 SET	$new_p1(5) = 0xffffffff
 SET	$new_p2(5) = 0
 SPRINT $new_rr(5) sppr416
 // immunity to spell: Wandering Horror
 SET	$new_op(6) = 206
 SET	$new_p1(6) = 0xffffffff
 SET	$new_p2(6) = 0
 SPRINT $new_rr(6) spin675
 // prevent portrait icon: panic
 SET	$cosmetic_op(0) = 169
 SET	$cosmetic_p1(0) = 0
 SET	$cosmetic_p2(0) = 36
 SPRINT $cosmetic_rr(0) ~~
 // remove portrait icon : panic
 SET	$cosmetic_op(1) = 240
 SET	$cosmetic_p1(1) = 0
 SET	$cosmetic_p2(1) = 36
 SPRINT $cosmetic_rr(1) ~~
 // display portrait icon: resist fear
 SET	$cosmetic_op(2) = 142
 SET	$cosmetic_p1(2) = 0
 SET	$cosmetic_p2(2) = 37
 SPRINT $cosmetic_rr(2) ~~
END
OUTER_SPRINT immunity_type fear
COPY_EXISTING
abazring.itm override // ring
ammonk07.cre override // monk
ammonk08.cre override // monk
amsmith.cre  override // kerrick the smith
amul17.itm   override // greenstone amulet
balth.cre	override // balthazar
bazdra02.cre override // draconis
bazpatrg.itm override // ring
bhaalhp1.itm override // <invalid strref -1>
bhaalimm.itm override // <invalid strref -1>
brdflute.itm override // magic flute
chalcy3.itm  override // greenstone amulet
chalslay.itm override // ring
chwraith.itm override // <invalid strref -1>
clck30.itm   override // cloak of bravery
ddguard1.cre override // guardian
ddguard2.cre override // guardian
ddguard3.cre override // guardian
ddguard4.cre override // guardian
ddguard5.cre override // guardian
ddguard6.cre override // guardian
ddguard7.cre override // guardian
demogorg.itm override // <invalid strref -1>
elemhydr.cre override // olhydra
finmel01.itm override // <invalid strref -1>
firlch01.cre override // fire lich
fsspir.itm   override // ring
golbra01.cre override // brain golem
golbra.itm   override // brain golem item
golcla.itm   override // clay golem item
golfle.itm   override // flesh golem item
golmag01.itm override // magic golem item
golstone.itm override // stone golem item
gorair01.cre override // lesser air elemental
gorair02.cre override // greater air elemental
gorcamb6.cre override // fell cat
gorcamb7.cre override // fell cat
gorchr.itm   override // ring
gorfirg.itm  override // ring
gorjelfu.itm override // ring
gorjelgr.itm override // ring
gormisti.itm override // ring
gormistp.cre override // poison mist
gorstalk.cre override // guardian of air
hamm11.itm   override // runehammer +5
helljon.cre  override // jon irenicus
helljon2.cre override // jon irenicus
helm14.itm   override // kiel's helmet
hgber01.itm  override // two handed sword +1
hgfel01.cre  override // fell cat
hllich.cre   override // elemental lich
hlshade.cre  override // shade lich
holdring.itm override // ring
igolem01.cre override // sewage golem
imoenhp1.itm override // imoen's belt
innoc.itm	override // ring
invulner.itm override // ring
ipsion.itm   override // greenstone amulet
irongol.itm  override // iron golem item
jonhp1.itm   override // <invalid strref -1>
kaypal02.cre override // reynald de chatillon
kaypal03.cre override // fallen paladin
kaysmg01.cre override // rindus
kaysmg02.cre override // smuggler
kaysmg03.cre override // smuggler
killsw01.itm override // long sword +2
lichel01.cre override // elemental lich
mage20.cre   override // mage
mage20b.cre  override // mage
mage20c.cre  override // mage
maharper.itm override // master harper item
mane01.itm   override // ring
mdk2gun.itm  override // big gun
mdk2ring.itm override // big gun
mdog1.itm	override // <invalid strref -1>
mel01.itm	override // imoen's belt
minhp1.itm   override // <invalid strref -1>
miscbc.itm   override // blackrazor
mistpo01.cre override // poison mist
nofear.itm   override // <invalid strref -1>
objring.itm  override // ring
palring.itm  override // ring
potn21.itm   override // potion of clarity
ppireni2.cre override // jon irenicus
ravag03.itm  override // <invalid strref -1>
ring94.itm   override // ring
ring95.itm   override // ring
ring98.itm   override // ring
ring99.itm   override // ring
ringdemn.itm override // <invalid strref -1>
ringkora.itm override // ring
sarvie01.cre override // viekang
sendai7.cre  override // sendai
sengua04.itm override // <invalid strref -1>
sewyag04.cre override // yaga-shura mage
shalt01.itm  override // ring
shararm.itm  override // darkmail +3
spcl152.spl  override // barbarian rage
spcl221.spl  override // <invalid strref -1>
spcl222.spl  override // remove fear
spcl321.spl  override // enrage
spcl542a.spl override // <invalid strref -1>
spcl920a.spl override // <invalid strref -1>
spcl921a.spl override // <invalid strref -1>
spec01.itm   override // ring
spec02.itm   override // <invalid strref -1>
spin117.spl  override // berserk
spin676.spl  override // invoke courage
spin823.spl  override // slayer change
spin872.spl  override // <invalid strref -1>
spin891.spl  override // moon dog howl
spin906.spl  override // <invalid strref -1>
sppr108.spl  override // remove fear
spwi210.spl  override // resist fear
spwi411.spl  override // emotion
stalker.itm  override // ring
sujon.cre	override // jon irenicus
sujon2.cre   override // jon irenicus
suraam.cre   override // raamilat
surehp1.itm  override // ring
susuneer.cre override // suneer
sw1h32.itm   override // dragonslayer
sword01.cre  override // magical sword
telslav2.itm override // <invalid strref -1>
torgal.cre   override // torgal
torgal2.cre  override // torgal
torgal3.cre  override // torgal
trollimm.itm override // ring
tstatue.itm  override // <invalid strref -1>
uddrow50.cre override // drow wizard
udgolem.cre  override // brain golem
udlesa.cre   override // lasaonar
vampreg.itm  override // ring
vampreg1.itm override // ring
vampreg2.itm override // ring
 LAUNCH_PATCH_MACRO fj_add_batch_effects
BUT_ONLY
OUTER_PATCH action_clear_array_yeah BEGIN
 PATCH_FOR_EACH array IN match new cosmetic BEGIN
PATCH_FOR_EACH parameter IN op p1 p2 rr BEGIN
  CLEAR_ARRAY ~%array%_%parameter%~
END
 END
END

Link to comment

Heh, an ancient developer interview apparently indicates that Monks are actually supposed to be able to use priest scrolls and the Sensate Amulet.

 

On Monks: 1) Monks aren't supposed to be able to use any mage scrolls, no. Obviously a mistake. 2) Monks are supposed to be able to use the priest scrolls, according to James. (And since ALL of them are marked this way, this backs up his claim. 3) Yes, Monks can use the (Sensate) amulet.

 

Since the fixpack currently treats this as a bugfix, a revision of the issue might be in order.

Link to comment

On a somewhat related note, according to the developers Aran Linvail (the Shadow Thief leader) is supposed to be True Neutral.

 

The Shadow Thieves aren't evil per se...just unethical. Even Linvail himself is simple True Neutral...although the fact that the Shadow Thieves have assassins certainly wouldn't bode well for them in the eyes of any paladin.

 

IIRC, think one of Fixpack's components changed him to Lawful Evil and I adopted this for RR as well. Time to revert that I guess.

Link to comment

If anyone wants to resurrect of those damned alignment discussion threads, now's not a bad time. If I recall correctly, the only other Shadow Thief whose alignment we change is Anishai the Chaotic Neutral Monk - but a triple check wouldn't hurt.

Link to comment

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...