Jump to content

Already fixed bug still a bug? (Trolls)

Recommended Posts

We might go through and make sure that the comatose trolls have the same level as their standing levels (I don't know if it makes sense to only be able to slay them while they're down).

The big, big problem is the generic troll pair, troll01 (live, level 8) and troll02 (dead, level 6). Many other trolls become troll02 when they die--eletro02 (level 8), firtrl01 (6), kptrol01 (6), kptrol02 (6), kptrol04 (6), kptrol05 (6), and trollens (unused, 8). The only other mismatch is obsice01 (9), which goes to trolsn02 (6) and then revives as trolsn01 (6), which goes back to trolsn02.


While I was there, I also checked DVs. These get lost or changed during their transformations:

  • eletro02, firtrl01, kptrol01, kptrol02, kptrol04, and troll01 use their resrefs as DVs but change to troll02 (troll02 DV) when 'dead'
  • Live/dead pairs dgtrol01/dgtrol02, hgtrol01/hgtrol02, trolde01/trolde02, trolfr01/trolfr02, troll03/tromsm2, and trolsp01/trolsp02 use their own resrefs as DVs
  • Live/dead pair trolgi01/trolgi02 use their own resrefs as DVs; they're both referenced correctly by the ar1300 area script
  • kptrol06 (no DV) and trolic01 (no DV) both transform into trolic02, which uses troll02 as a DV
  • obsice01 (no DV) and trolsn01 (trolsn01) both transform into trolsn02 (trolsn01)
  • trolic03 (no DV) transforms into trolic04 (troll02 DV) when dead
  • rogtro01/rogtro02 had mismatched DVs (already fixed)
  • trollens has a special DV, but it's an unused file

These are all no problem, as they're either not referenced at all or referenced correctly. The one issue is the firamb03/firamb05 troll. In Firkraag's dungeon, this is part of the three monsters facing off: the wolfwere captain (firamb01/firamb04), Gerg the hobgoblin, and the troll (firamb03/firamb05). If the wolfwere captain kills his two underlings, he then initiate dialogues by checking for Dead() firamb02 and firamb05. But if the party intervenes and hits the troll with an instant death spell, the game will never think that firamb05 has died. We should alter the triggers for his script and dialogue to make this an OR(2) check. firamb04 (pre-transformed wolfwere captain) should also be assigned firamb01 as a DV, as Gerg and the troll won't do anything if he's killed by a pre-emptive party strike (i.e. backstab).


So, actual action items:

  • Change troll02 to level 8.
  • Clone troll01 and troll02 into new creatures, set to level 6, then route all of the level 6 trolls that were using troll01/troll02 into them instead
  • Clone obsice01 into its own dead version
  • Replace firamb05 checks in firamb01.bcs and firamb01.dlg with checks for both firamb03 and firamb05 resources
  • Assign firamb01 as a DV to firamb04.cre

Phew! Code will follow.

Link to comment

I'm so sick of trolls. Really. Let this be the last issue for them. Please.


// wolfwere capt should have same DV for transformed, non-transformed creature files
COPY_EXISTING ~firamb04.cre~ ~override~
 WRITE_ASCII 0x280 ~firamb01~ #32

// script should check live and dead troll DV
COPY_EXISTING ~firamb01.bcs~ ~override~
REPLACE_TEXTUALLY ~\([^!]\)Dead("firamb05")~ ~\1OR(2) Dead("firamb03") Dead("firamb05")~

<<<<<<<< v5_test.d
REPLACE_TRIGGER_TEXT ~firamb01~ ~Dead("firamb05")~ ~OR(2) Dead("firamb03") Dead("firamb05")~

COMPILE ~v5_test.d~

// knocked-down trolls should match their live counterparts
COPY_EXISTING ~troll02.cre~ ~override~
 WRITE_BYTE 0x234 8

// knocked-down trolls should match their live counterparts
COPY_EXISTING ~troll01.cre~ ~override/cdtroll1.cre~
		  ~troll02.cre~ ~override/cdtroll2.cre~
 WRITE_BYTE   0x234 6

// new troll scripts to transform to dead versions at low HP
COPY_EXISTING ~troll01.bcs~  ~override/cdtroll1.bcs~
		  ~trolsn01.bcs~ ~override/obsice11.bcs~
REPLACE_TEXTUALLY ~ChangeAnimationNoEffect("TROLSN02")~ ~ChangeAnimationNoEffect("obsice11")~
REPLACE_TEXTUALLY ~ChangeAnimationNoEffect("TROLL02")~  ~ChangeAnimationNoEffect("cdtroll2")~

// new troll scripts to transform from dead to alive after time expires
COPY_EXISTING ~troll02.bcs~  ~override/cdtroll2.bcs~
		  ~trolsn02.bcs~ ~override/obsice01.bcs~
REPLACE_TEXTUALLY ~ReallyForceSpell(Myself,TROLL_CHANGE)~	  ~ReallyForceSpellRES("cdtroll1",Myself)~
REPLACE_TEXTUALLY ~ReallyForceSpell(Myself,TROLL_SNOW_CHANGE)~ ~ReallyForceSpellRES("obsice01",Myself)~

// create 'dead' or 'knocked down' versions of 'special' trolls
COPY_EXISTING ~obsice01.cre~ ~override/obsice11.cre~
 WRITE_SHORT		   0x24	1			// current HP
 WRITE_SHORT		   0x46   10			// natural AC
 WRITE_SHORT		   0x48   10			// effective AC
 WRITE_BYTE			0x5a  100			// resist cold
 WRITE_BYTE			0x5b  100			// resist electricity
 WRITE_BYTE			0x5f  100			// resist magic cold
 WRITE_BYTE			0x60  100			// resist slashing
 WRITE_BYTE			0x61  100			// resist crushing
 WRITE_BYTE			0x62  100			// resist piercing
 WRITE_BYTE			0x63  100			// resist missile
 WRITE_BYTE			0x23c   9			// dexterity
 WRITE_BYTE			0x270 255			// enemy
 WRITE_EVALUATED_ASCII 0x248 ~%SOURCE_RES%~ // new script
 WRITE_ASCII		   0x250 ~~ #32		 // blanks all other script references
 WRITE_ASCII		   0x2cc ~~ #8		  // blanks dialog file
 // item changes
 READ_LONG 0x2bc "itm_off"
 READ_LONG 0x2c0 "itm_num"
 FOR (index = 0; index < itm_num; index = index + 1) BEGIN
READ_ASCII ("%itm_off%" + (0x14 * "%index%")) "item"
		   ("%item%" STRING_COMPARE_CASE "monhp1" = 0) OR // so they can die
		   ("%item%" STRING_COMPARE_CASE "trollreg" = 0) OR // can't regenerate
		   ("%item%" STRING_COMPARE_CASE "trollspi" = 0) // makes dead spirit troll invisible
		 ) BEGIN
  WRITE_ASCII ("%itm_off%" + (0x14 * "%index%")) ~trolldie~

// lvl 6 trolls should be routed through a different knocked-down version
COPY_EXISTING ~firtrl01.cre~ ~override~
		  ~kptrol01.cre~ ~override~
		  ~kptrol02.cre~ ~override~
		  ~kptrol04.cre~ ~override~
		  ~kptrol05.cre~ ~override~
 WRITE_ASCII 0x248 ~cdtroll1~

// add monhp1 item to trolls to prevent death; assign script to force transformation to dead form at low HP
COPY_EXISTING ~obsice01.cre~ ~override~
 ADD_CRE_ITEM ~monhp1~ #0 #0 #0 ~NONE~ ~AMULET~
 WRITE_ASCII 0x260 ~obsice11~

// spells to transform trolls back from dead to alive
COPY_EXISTING ~spin955.spl~ ~override/cdtroll1.spl~
		  ~spin955.spl~ ~override/obsice01.spl~
 READ_LONG  0x64 "abil_off"
 READ_SHORT 0x68 "abil_num"
 READ_LONG  0x6a "fx_off"
 FOR (index = 0; index < abil_num; index = index + 1) BEGIN
READ_SHORT ("%abil_off%" + 0x1e + (0x28 * "%index%")) "abil_fx_num"
READ_SHORT ("%abil_off%" + 0x20 + (0x28 * "%index%")) "abil_fx_idx"
FOR (index2 = 0; index2 < abil_fx_num; index2 = index2 + 1) BEGIN
  READ_SHORT ("%fx_off%" +		(("%abil_fx_idx%" + "%index2%") * 0x30)) "opcode"
  READ_ASCII ("%fx_off%" + 0x14 + (("%abil_fx_idx%" + "%index2%") * 0x30)) "eff_file"
  PATCH_IF (("%opcode%" = 151) AND ("%eff_file%" STRING_COMPARE_CASE "troll01" = 0)) BEGIN
	WRITE_EVALUATED_ASCII ("%fx_off%" + 0x14 + (("%abil_fx_idx%" + "%index2%") * 0x30)) "%DEST_RES%" #8


To be incorporated into the existing code.

Link to comment


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

  • Create New...