Jump to content

Six impossible things before breakfast


Recommended Posts

Randomly, infrequently, irreproducibly, the game crashes to desktop when you look at the map screen. I have no idea why this is or how to fix it.
Wasn't this at least partly a .mos dimension issue before? Do you useful assertion errors out of the crash, or do you get a bewildering assortment of function calls (which would indicate that something without bounds checking is dumping garbage onto random memory addresses)?

 

I can't convert thieves' Evasion or Sneak Attack abilities
Evasion is possible, I'll post sample code momentarily. The drastically-nerfed pseudo-third-ed sneak attack option would constitute a formidable assembly patch without a .dll injection; .dll injection is still difficult.

 

The Bhaalspawn death movie plays at game-over
This is a pretty easy .exe hack, but easier still would be to biff an empty deathand.mve.

 

The spell animations in IWD often have a sort of glow around them which I find a bit unattractive and which doesn't appear in IWD. I think this is because of some basic engine-level difference, but it might just be down to a VVC setting which I don't know.
Engine-level, since only the BGII engine supports .vvcs! Most of the .bams from ID need one with the blended flag (0x8) ticked. If that's not enough, ticking 0x4 and making sure that 255,255,255 is the second color in the palette index helps; if that's not enough 0x2 helps; if that's not enough you get the pleasures of manually redithering the frames (in other words, put it off indefinately).

 

Summoned monsters don't appear as quickly as I'd like (there's a puff of smoke, then a two-second pause, then they're there.) I could fix this if I knew the BAM file for the "golden bubble" animation that plays when monsters are summoned, but I can't find it.
Is it conjh.bam? I don't even remember.

 

For some reason, the floor in certain areas (wooden floors, mostly) hides the selection circle of characters standing over it.
Bad hightmap?

 

Save-games get labelled as "-ToB".
There's a bunch of these and I don't recall where to find the appended token. You probably could do
COPY_EXISTING bgmain.exe bgmain.exe
 READ_ASCII 0x7294d2 string (13)
 PATCH_IF( ~%string%~ STRING_EQUAL ~Auto-Save-TOB~ )BEGIN
WRITE_ASCII 0x7294d2 ~Auto-Save-HOW~
 END
 READ_ASCII 0x7294ea string (14)
 PATCH_IF( ~%string%~ STRING_EQUAL ~Quick-Save-TOB~ )BEGIN
WRITE_ASCII 0x7294ea ~Quick-Save-HOW~
 END
 READ_ASCII 0x729506 string (14)
 PATCH_IF( ~%string%~ STRING_EQUAL ~Final-Save-TOB~ )BEGIN
WRITE_ASCII 0x729506 ~Final-Save-HOW~
 END
 // .... more offsets

but I wouldn't bother.

 

Selecting a fist (i.e. unarmed attack) seems to select all fists (i.e. put a green box around all empty weapon quick-slots). As far as I can see this is purely cosmetic; in any case, I've no idea why it's happening.
Sounds like something's gone wrong with charbase.cre. Does that receive patches at any point?

 

I did most of the spells for Dalepillager a while back, but that may have done the impossible by disappearing from the internet; if I find a copy I'll pass it along so you can skip these paltry details. From untrustworthy memory (and at an abysmally low priority):

Seven Eyes
Requires patching so many other files that you're wise to put it off to later. Much later.

 

Soul Eater
IF
 Die()
 SpellCastOnMe(Player1,WIZARD_SOUL_EATER)
THEN
 RESPONSE #100
DropAllItems()
ReallyForceSpellRes("mytrivialbuffspell",Player1)
ChangeAnimationNoEffect("sometrivialskellington")
Continue()
END
IF
 Die()
 SpellCastOnMe(Player2,WIZARD_SOUL_EATER) ....

Or some such thing. Drop it off in the creature's "area" script [sic]. It doesn't work correctly on party members, but it didn't in Icewind Dale either, and I don't recall anyone scripted to cast it anyway.

 

(Great) Shout
Did that with two spells, a single target with only visuals and an invisible cone with the effects.

 

Mordenkainen's Force Missiles
Did that with staggered spells using magic missile projectiles, each with damage effects and a triggered spell for the concussion damage. Not great, perhaps servicable.

 

Spiritual Wrath
I cheated; the invisible .cre hack didn't look good enough to me to justify the absurd layers of indirection. If you make your own invisible projectile to apply the area effects (rather than using Gozer the Traveller) it'll miss often enough that you can barely tell it doesn't match the description :beer:

 

Mold Touch
Faked it with a short radius spell: cast spell on condition is whack and I didn't want to use yet another inviso-cre running a Nearest() script. I don't think this worked quite right in Icewind Dale either.

 

Smashing Wave
Same trick as Shout.

 

Whirlwind
I guess Refinements has it covered, otherwise an invisible summon with whirlx.vcc(?) looping atop is the way to go.

 

 

Most of the minor cosmetic stuff sounds like gui misalignment.

Link to comment

Disgustingly hasty evasion

/*
the jist here is, using e.g. sppr503 CLERIC_FLAME_STRIKE
 sppr503's abilities contain the following effects
fake-explosion-projectile-vvc (play on point)
cast sppr503v on a rogue of $type with level > 6
grant immunity to sppr503 to a rogue of $type with level > 6
cast sppr503w on everybody (which won't affect the rogues)
 sppr503v has the payload, but with
"save or else" replaced by "save"
followed by "save or else immune to sppr503v"
followed by play string "Evades effects"
all the level based headers work in the usual way
only the aoe graphics aren't duped
 sppr503w also has the usual payload
it's just like unmodded sppr503 except
the explosion effect isn't reduplicated
 both of the triggered spells have primary type,
 secondary type, and power set to 0 so there's
 only one interaction with spell protections
that's it.
*/



<<<<<<<<null.inlined
>>>>>>>>



DEFINE_ACTION_FUNCTION evasion_shells
BEGIN

// stoopit hack
ACTION_IF!( VARIABLE_IS_SET evasion_string )BEGIN
 OUTER_PATCH ~SAY (0 ** 0) @(0 / 0)~ BEGIN
SAY	   0x00 ~evades effects~
READ_LONG 0x00 evasion_string
 END
END

// seven characters is love
OUTER_PATCH_SAVE spell7 ~%spell%~ BEGIN
 PATCH_IF( BUFFER_LENGTH > 7 )BEGIN
DELETE_BYTES 6 ( BUFFER_LENGTH - 7 )
 END
END

// make sure we're patching an extant spell and not overwriting anything
ACTION_IF(
  FILE_EXISTS_IN_GAME ~%spell%.spl~   && // the spell we're patching
 !FILE_EXISTS_IN_GAME ~%spell7%v.spl~ && // the save-or-nothin payload clone
 !FILE_EXISTS_IN_GAME ~%spell7%w.spl~ && // the standard payload clone
 !FILE_EXISTS_IN_GAME ~%spell7%i.eff~ && // immunity to source spell
 !FILE_EXISTS_IN_GAME ~%spell7%v.eff~	// cast spell7v
)BEGIN

 // triggered spell that's applied to unroguely rubes
 COPY_EXISTING ~%spell%.spl~ ~override/%spell7%w.spl~
WRITE_ASCII  0x10 ~~ #8  // null casting sound
WRITE_LONG   0x18 0x4800 // flags: no LOS, no wild/dead magic
WRITE_SHORT  0x1e 0x00   // exclusion flags
WRITE_BYTE   0x22 0x00   // casting animation
WRITE_BYTE   0x25 0x00   // primary type
WRITE_BYTE   0x27 0x00   // secondary type
CLEAR_ARRAY delete_this_effect
GET_OFFSET_ARRAY abl 0x64 0x04 0x68 0x02 0x00 0x00 0x28
PHP_EACH abl AS abl_num => abl_off BEGIN
  WRITE_BYTE   abl_off + 0x00 0x01 // change ability targeting
  WRITE_BYTE   abl_off + 0x0c 0x01 // target: actor
  WRITE_SHORT  abl_off + 0x0e 0x01 // range
  WRITE_LONG   abl_off + 0x12 0x00 // casting time
  GET_OFFSET_ARRAY2 abl_eff abl_off ITM_V10_HEAD_EFFECTS
  PHP_EACH abl_eff AS eff_num => eff_off BEGIN
	PATCH_IF(
	  ( BYTE_AT   ( eff_off + 0x02 ) == 0x001 ) || // it's a caster only effect
	  (
		SHORT_AT  ( eff_off + 0x00 ) == 0x0d7 &&   // play-over-point .vvc
		LONG_AT   ( eff_off + 0x08 ) != 0x001
	  )										 ||
	  ( SHORT_AT  ( eff_off + 0x00 ) == 0x109 )	// set global variable
	)BEGIN
	  SET $delete_this_effect( ~%eff_off%~ ) = abl_off
	END ELSE BEGIN
	  WRITE_BYTE eff_off + 0x03 0x00 // power 0
	END
  END
  CLEAR_ARRAY abl_eff
END
SET offset = 0
PHP_EACH delete_this_effect AS eff_off => abl_off BEGIN
  WRITE_SHORT abl_off + 0x1e THIS - 0x01 // effect count - 1
  PHP_EACH abl AS abl_num1 => abl_off1 BEGIN
	PATCH_IF( abl_num1 > abl_num )BEGIN
	  WRITE_SHORT abl_off1 + 0x20 THIS - 0x01 // reindex the extended headers
	END
  END
  DELETE_BYTES eff_off - offset 0x30
  SET offset += 0x30
END
CLEAR_ARRAY delete_this_effect
PATCH_IF( SHORT_AT 0x70 )BEGIN // delete all global effects
  PHP_EACH abl AS abl_num => abl_off BEGIN
	WRITE_SHORT abl_off + 0x20 THIS - SHORT_AT 0x70
  END
  DELETE_BYTES LONG_AT 0x6a 0x30 * SHORT_AT 0x70
  WRITE_SHORT 0x70 0x00
END
CLEAR_ARRAY abl
 // that's one spell done

 // triggered spell that's applied to rogues
 COPY_EXISTING ~%spell7%w.spl~ ~override/%spell7%v.spl~
GET_OFFSET_ARRAY abl 0x64 0x04 0x68 0x02 0x00 0x00 0x28
PHP_EACH abl AS abl_num => abl_off BEGIN
  SET save_type  = 0
  TEXT_SPRINT dupe ~~
  GET_OFFSET_ARRAY2 abl_eff abl_off ITM_V10_HEAD_EFFECTS
  PHP_EACH abl_eff AS eff_num => eff_off BEGIN
	PATCH_IF( !save_type && LONG_AT( eff_off + 0x24 ) )BEGIN
	  READ_ASCII eff_off + 0x00 dupe (0x30)
	  READ_LONG  eff_off + 0x24 save_type
	  READ_LONG  eff_off + 0x28 save_bonus
	END
  END
  CLEAR_ARRAY abl_eff
  WRITE_SHORT  abl_off + 0x1e THIS + 0x02
  WRITE_SHORT  abl_off + 0x20 THIS + 0x02 * abl_num
  SET offset = eff_off + 0x30
  INSERT_BYTES offset + 0x00 0x60
  WRITE_ASCIIE offset + 0x00 ~%dupe%~
  WRITE_SHORT  offset + 0x00 0xce // protection from spell
  WRITE_BYTE   offset + 0x02 0x02 // preprojectile target
  WRITE_LONG   offset + 0x04 ` 0  // display no string
  WRITE_LONG   offset + 0x08 0x00 // unused
  WRITE_BYTE   offset + 0x0c 0x00 // timing mode: duration
  WRITE_LONG   offset + 0x0e 0x00 // duration 0
  WRITE_BYTE   offset + 0x12 0x64 // probability high
  WRITE_BYTE   offset + 0x13 0x00 // probability low
  WRITE_ASCIIE offset + 0x14 ~%spell7%v~
  WRITE_LONG   offset + 0x1c 0x00 // level limits
  WRITE_LONG   offset + 0x20 0x00 // level limits
  WRITE_LONG   offset + 0x24 save_type
  WRITE_LONG   offset + 0x28 save_bonus
  SET offset += 0x30
  WRITE_ASCIIE offset + 0x00 ~%dupe%~
  WRITE_SHORT  offset + 0x00 0x8b  // string display
  WRITE_BYTE   offset + 0x02 0x02  // preprojectile target
  WRITE_LONG   offset + 0x04 evasion_string
  WRITE_LONG   offset + 0x08 0x00  // unused
  WRITE_BYTE   offset + 0x0c 0x01  // timing mode: permanent (irrelevant)
  WRITE_LONG   offset + 0x0e 0x00  // duration (irrelevant)
  WRITE_BYTE   offset + 0x12 0x64  // probability high
  WRITE_BYTE   offset + 0x13 0x00  // probability low
  WRITE_ASCII  offset + 0x14 ~~ #8 // unused
  WRITE_LONG   offset + 0x1c 0x00  // level limits
  WRITE_LONG   offset + 0x20 0x00
  WRITE_LONG   offset + 0x24 0x00  // no save
  WRITE_LONG   offset + 0x28 0x00  // no save bonus
END
CLEAR_ARRAY abl
 // that's the other new spell done

 // turn the spell itself into an empty husk
 COPY_EXISTING ~%spell%.spl~ ztest
GET_OFFSET_ARRAY abl 0x64 0x04 0x68 0x02 0x00 0x00 0x28
PHP_EACH abl AS abl_num => abl_off BEGIN
  TEXT_SPRINT dupe ~~
  CLEAR_ARRAY delete_this_effect
  GET_OFFSET_ARRAY2 abl_eff abl_off ITM_V10_HEAD_EFFECTS
  PHP_EACH abl_eff AS eff_num => eff_off BEGIN
	PATCH_IF!(									 // if it's not something we deleted from spellw
	  ( BYTE_AT   ( eff_off + 0x02 ) == 0x001 ) || // it's a caster only effect
	  (
		SHORT_AT  ( eff_off + 0x00 ) == 0x0d7 &&   // play-over-point .vvc
		LONG_AT   ( eff_off + 0x08 ) != 0x001
	  ) ||
	  ( SHORT_AT  ( eff_off + 0x00 ) == 0x109 )	// set global variable
	)BEGIN
	  SET $delete_this_effect( ~%eff_off%~ ) = abl_off
	  PATCH_IF( ~~ STRING_EQUAL ~%dupe%~ )BEGIN
		READ_ASCII eff_off dupe (0x30)
	  END
	END ELSE BEGIN
	  WRITE_BYTE eff_off + 0x03 0x00 // power 0
	  WRITE_BYTE eff_off + 0x0d 0x03 // dispel/bypass
	END
  END
  CLEAR_ARRAY abl_eff
  SET offset = 0
  PHP_EACH delete_this_effect AS eff_off => abl_off BEGIN
	WRITE_SHORT abl_off + 0x1e THIS - 0x01 // effect count - 1
	PHP_EACH abl AS abl_num1 => abl_off1 BEGIN
	  PATCH_IF( abl_num1 > abl_num )BEGIN
		WRITE_SHORT abl_off1 + 0x20 THIS - 0x01 // reindex the extended headers
	  END
	END
	DELETE_BYTES eff_off - offset 0x30
	SET offset += 0x30
  END
  CLEAR_ARRAY delete_this_effect
  SET offset = LONG_AT 0x6a + 0x30 * ( SHORT_AT( abl_off + 0x20 ) + SHORT_AT( abl_off + 0x1e ) )
  INNER_PATCH_SAVE dupe ~%dupe%~ BEGIN
	WRITE_SHORT 0x00 0xb1  // use .eff file
	WRITE_LONG  0x08 0x05  // on class.ids
	WRITE_BYTE  0x0c 0x01  // permanent
	WRITE_BYTE  0x12 0x64  // prob high
	WRITE_BYTE  0x13 0x00  // prob low
	WRITE_ASCII 0x14 ~~ #8 // null resref
	WRITE_LONG  0x1c 0x00  // max level
	WRITE_LONG  0x20 0x01  // min level
	WRITE_LONG  0x24 0x00  // save type
	WRITE_LONG  0x28 0x00  // save bonus
  END
  PATCH_FOR_EACH class IN
  4  // thief
  9  // fighter_thief
  10 // fighter_mage_thief
  13 // mage_thief
  15 // cleric_thief
  20 // monk
  BEGIN
	INSERT_BYTES offset + 0x00 0x60
	WRITE_ASCIIE offset + 0x00 ~%dupe%~
	WRITE_LONG   offset + 0x04 class
	WRITE_ASCIIE offset + 0x14 ~%spell7%v~
	WRITE_ASCIIE offset + 0x30 ~%dupe%~
	WRITE_LONG   offset + 0x34 class
	WRITE_ASCIIE offset + 0x44 ~%spell7%i~
	SET offset += 0x60
  END
  INSERT_BYTES offset + 0x00 0x30
  WRITE_ASCIIE offset + 0x00 ~%dupe%~
  WRITE_SHORT  offset + 0x00 0x92 // cast spell at creature
  WRITE_LONG   offset + 0x04 0x00
  WRITE_LONG   offset + 0x08 0x00
  WRITE_ASCIIE offset + 0x14 ~%spell7%w~
  WRITE_LONG   offset + 0x20 0x00
  WRITE_SHORT  abl_off + 0x1e THIS + 0x0d
  PHP_EACH abl AS abl_num1 => abl_off1 BEGIN
	PATCH_IF( abl_num1 > abl_num )BEGIN
	  WRITE_SHORT abl_off1 + 0x20 THIS + 0x0d
	END
  END
END
CLEAR_ARRAY abl
 // original spell gutted

 // make some .effs out of whole cloth
 COPY null.inlined ~override/%spell7%i.eff~
INSERT_BYTES 0x00 0x110
WRITE_ASCII  0x00 ~EFF V2.0~
WRITE_ASCII  0x08 ~EFF V2.0~
WRITE_LONG   0x10 0xce // immunity to spell
WRITE_LONG   0x1c evasion_string
WRITE_SHORT  0x2c 0x64
WRITE_ASCIIE 0x30 ~%spell%~
WRITE_LONG   0x80 0xffffffff	 // caster coordinates
WRITE_LONG   0x84 0xffffffff
WRITE_LONG   0x88 0xffffffff
WRITE_LONG   0x8c 0xffffffff
WRITE_LONG   0xa4 0xffffffff	 // source item slot
WRITE_LONG   0xcc 0x01
 IF_SIZE_IS 0

 COPY_EXISTING ~%spell7%i.eff~ ~override/%spell7%v.eff~
WRITE_LONG   0x10 0x92 // cast spell on creature
WRITE_LONG   0x1c 0x00 // nulled
WRITE_ASCIIE 0x30 ~%spell7%v~
 IF_SIZE_IS 0x110

END ELSE BEGIN
 PRINT ~Failure adding evasion to %spell%.~
END

END

// list the spells
ACTION_FOR_EACH file IN
 drgrbrht // green dragon breath hit
 spcryo01 // elemental prince of evil incompletely implemented cold
 spdr601  // avenger chain lightning
 spin539  // FLAMING_SKULL_BOLT
 spin564  // SKULL_EXPLODE
 spin579  // POWER_AMP
 spin595  // YELLOW_DRAGON_BREATH
 spin596  // BROWN_DRAGON_BREATH
 spin597  // BLUE_DRAGON_BREATH
 spin691  // BLACK_DRAGON_BREATH
 spin693  // RED_DRAGON_HIT
 spin819  // LAVA_BURST
 spin833  // SILVER_DRAGON_BREATH_COLD
 spin885  // KAMIKAZE_EXPLOSION
 spin936  // MEPHIT_ICE_SHARD
 spin939  // MEPHIT_FLAME_JET
 spin956  // HELL_HOUND_FLAME
 spin979  // GOLEM_GASCLOUD
 spin989  // BEHOLDER_LIGHTNING_BOLT
 sppr302  // CLERIC_CALL_LIGHTNING
 sppr313  // CLERIC_HOLY_SMITE
 sppr314  // CLERIC_UNHOLY_BLIGHT
 sppr503  // CLERIC_FLAME_STRIKE
 sppr720  // CLERIC_EARTHQUAKE
 sppr722  // CLERIC_STORM_OF_VENGEANCE
 sppr725d // CLERIC_GLOBE_OF_BLADES
 sppr984  // TRAP_CHROMATIC_ORB
 sppr985  // TRAP_FLAMESTRIKE
 sppr987  // TRAP_CALL_LIGHTNING
 spwi001  // TRAP_FIREBALL
 spwi002  // Trap Lightning Bolt
 spwi008  // TRAP_ARROW_BITING
 spwi017  // TRAP_MINOR_LIGHTNING_BOLT
 spwi015  // Trap Frost
 spwi103  // WIZARD_BURNING_HANDS
 spwi303  // WIZARD_FLAME_ARROW
 spwi304  // WIZARD_FireBall! (c)
 spwi308  // WIZARD_LIGHTNING_BOLT
 spwi313  // WIZARD_SKULL_TRAP
 spwi503  // WIZARD_CONE_OF_COLD
 spwi523  // WIZARD_SUN_FIRE
 spwi615  // WIZARD_CHAIN_LIGHTNING
 spwi712  // WIZARD_DELAYED_BLAST_FIREBALL
 spwi714  // WIZARD_PRISMATIC_SPRAY
 spwi810  // WIZARD_INCENDIARY_CLOUD
 spwi812  // WIZARD_ABI_DALZIMS_HORRID_WILTING - but it's a "fort" save
 spwi922  // WIZARD_DRAGONS_BREATH
BEGIN
 LAF evasion_shells 
STR_VAR spell = EVAL ~%file%~
 END
END

 

...in case illustrations are helpful. It'll work unless I bungled something in the code.

Link to comment

Welcome back Nythrun!

 

Soul Eater
IF
 Die()
 SpellCastOnMe(Player1,WIZARD_SOUL_EATER)
THEN
 RESPONSE #100
DropAllItems()
ReallyForceSpellRes("mytrivialbuffspell",Player1)
ChangeAnimationNoEffect("sometrivialskellington")
Continue()
END
IF
 Die()
 SpellCastOnMe(Player2,WIZARD_SOUL_EATER) ....

Or some such thing. Drop it off in the creature's "area" script [sic]. It doesn't work correctly on party members, but it didn't in Icewind Dale either, and I don't recall anyone scripted to cast it anyway.

You can cast a shell spell inside an embedded .eff that does everything that Soul Eater should do (chunk replace pre-target and add stats on the caster). This embedded .eff affects a GENERAL of 3 [DEAD] only. The engine internally sets the general of any killed creature to 3 - so you will have to place this at the end of the feature block, after effects that cause damage.

 

(Great) Shout
Did that with two spells, a single target with only visuals and an invisible cone with the effects.

This won't look very nice if you cast Great Shout 10 feet away from your character - the projectile visuals will travel to that point and end there. I've done an invisible creature-passwall-wing buffet trick in SpellPack B6. The link is in the workroom, feel free to use it.

 

Spiritual Wrath
I cheated; the invisible .cre hack didn't look good enough to me to justify the absurd layers of indirection. If you make your own invisible projectile to apply the area effects (rather than using Gozer the Traveller) it'll miss often enough that you can barely tell it doesn't match the description :beer:

I think this is completely impossible to do. There is no way you could create invisible .cre at offsets relative to which way the caster is facing.

 

As for evasion: Have you tried externalizing all damage-causing spells into external .eff files with custom secondary types? They should work in BG2; the save-or-else damage effects would be split 2 sectypes/.eff files: one for the .eff that allows a saving throw, the other for the .eff that doesn't. A thief with evasion would be protected from one of the sectypes. Your solution is pretty good though.

 

-Galactygon

Link to comment

I am in awe.

 

Randomly, infrequently, irreproducibly, the game crashes to desktop when you look at the map screen. I have no idea why this is or how to fix it.
Wasn't this at least partly a .mos dimension issue before? Do you useful assertion errors out of the crash, or do you get a bewildering assortment of function calls (which would indicate that something without bounds checking is dumping garbage onto random memory addresses)?

 

Pass - next time I actually see it, I'll check. (Reading these things is beyond my competence but I'll post them.)

 

I can't convert thieves' Evasion or Sneak Attack abilities
Evasion is possible, I'll post sample code momentarily.

Great, got it working. (Not quite your code, but same principle.)

 

The Bhaalspawn death movie plays at game-over
This is a pretty easy .exe hack, but easier still would be to biff an empty deathand.mve.

Works fine, thanks.

 

The spell animations in IWD often have a sort of glow around them which I find a bit unattractive and which doesn't appear in IWD. I think this is because of some basic engine-level difference, but it might just be down to a VVC setting which I don't know.
Engine-level, since only the BGII engine supports .vvcs! Most of the .bams from ID need one with the blended flag (0x8) ticked. If that's not enough, ticking 0x4 and making sure that 255,255,255 is the second color in the palette index helps; if that's not enough 0x2 helps; if that's not enough you get the pleasures of manually redithering the frames (in other words, put it off indefinately).

 

I've basically tried all that, so yes, "put it off indefinitely" looks pretty appealing right now.

 

Summoned monsters don't appear as quickly as I'd like (there's a puff of smoke, then a two-second pause, then they're there.) I could fix this if I knew the BAM file for the "golden bubble" animation that plays when monsters are summoned, but I can't find it.
Is it conjh.bam? I don't even remember.

'Fraid not.

 

For some reason, the floor in certain areas (wooden floors, mostly) hides the selection circle of characters standing over it.
Bad hightmap?

Very plausible, will check.

 

Selecting a fist (i.e. unarmed attack) seems to select all fists (i.e. put a green box around all empty weapon quick-slots). As far as I can see this is purely cosmetic; in any case, I've no idea why it's happening.
Sounds like something's gone wrong with charbase.cre. Does that receive patches at any point?

 

It does, and it shouldn't, but that isn't the problem (deleting it and going with the core-game version doesn't help).

 

I did most of the spells for Dalepillager a while back, but that may have done the impossible by disappearing from the internet; if I find a copy I'll pass it along so you can skip these paltry details.

 

That would be great.

Link to comment
Summoned monsters don't appear as quickly as I'd like (there's a puff of smoke, then a two-second pause, then they're there.) I could fix this if I knew the BAM file for the "golden bubble" animation that plays when monsters are summoned, but I can't find it.
Is it conjh.bam? I don't even remember.

'Fraid not.

It's almost certainly a sp-prefixed bam.

Drawing upon my detailed knowledge of bams (I played them one by one, without remembering this) I can tell you the golden bubble is spplanar. You also have spanisum and spmonsum to play with.

Link to comment
Summoned monsters don't appear as quickly as I'd like (there's a puff of smoke, then a two-second pause, then they're there.) I could fix this if I knew the BAM file for the "golden bubble" animation that plays when monsters are summoned, but I can't find it.
Is it conjh.bam? I don't even remember.

'Fraid not.

It's almost certainly a sp-prefixed bam.

Drawing upon my detailed knowledge of bams (I played them one by one, without remembering this) I can tell you the golden bubble is spplanar. You also have spanisum and spmonsum to play with.

 

Actually - having looked at that list - I think it's SPGFLSH1. Thanks for the pointer, though - that's really helpful.

Link to comment

Soul Eater

I've converted it almost completely to BG2 years ago with summonable scripting and it worked, but I vaguely recall there was something I didn't quite like http://rapidshare.com/files/424307072/souleater.rar

 

As for evasion: Have you tried externalizing all damage-causing spells into external .eff files with custom secondary types?
Maybe I've missed something very obvious, but isn't EFF's sectype getting converted to parent SPL's? I did try a solution like this once, and I'm fairly sure the saved CRE had SPL's sectype written down, not EFF's.
Link to comment
Welcome back Nythrun!
Thank you; it's always gratifying to find other spell perfectionists around :cringe:

 

Your Soul Eater solution sounds cleaner than what I did, I'll have to explore the idea sometime.

 

As for evasion, Ardanis is correct: 0x110 byte .effs inherit their secondary type (and primary type, and targeting....) from their parent resource. Bioware themselves couldn't keep the inheritance chain straight sometimes, which is why saving throws are accidentally reduplicated on a whole mess of things we had to correct for the Fixpack. You probably meant to have those .effs call other spells, though, and that's fine. I wouldn't use it here for these reasons: corner cases (think Horrid Wilting and Magic Missile impacting simultaneously - the Horrid Wilting's immunity to magic damage would carry over to the Magic Missiles, which should not be subject to evasion; this is contrived, but contingencies can make this sort of thing happen repeatably) and because elemental damage isn't the only effect that needs checking (immunity to cold should not stop the impact damage from one of Ice Storm's 4kg mini-comets from bopping your head, but it should stop the slow effect from Frost Fingers).

 

It's okay this way, with four files per spell, but kind of a drag for other people to mod subsequently. It does have the advantage of working :) But the impediments to other modders will worsen once every freaking weapon has to be patched to use a Remove Eye-of-the-Whatever Sectype; it may be worth keeping in mind here.

 

Oh well. Despite having wasted too much development time on Seven Eyes, HoW still rocks the socks off of ToB (and breaks less of the original executable to boot). A few mods like Kulyok's NPCs and this conversion will really make ToB look bad.

 

 

'Fraid not.
Meh, sorry for my yap, then; I only recall pinching the spell hits, asum1x, and msum1x. If it continues to prove elusive, you can put "none" in the second resource field of the .vvc - this skips the default delay and icky unpaletted spboom.bam that otherwise runs if the field is left null. Beware that if the .cre summoned has a *gu.bam wake sequence, they'll play it before doing anything.

 

Sorry I can't be of more help at the moment.

Link to comment
Welcome back Nythrun!
Thank you; it's always gratifying to find other spell perfectionists around :cringe:

 

Your Soul Eater solution sounds cleaner than what I did, I'll have to explore the idea sometime.

 

As for evasion, Ardanis is correct: 0x110 byte .effs inherit their secondary type (and primary type, and targeting....) from their parent resource. Bioware themselves couldn't keep the inheritance chain straight sometimes, which is why saving throws are accidentally reduplicated on a whole mess of things we had to correct for the Fixpack. You probably meant to have those .effs call other spells, though, and that's fine. I wouldn't use it here for these reasons: corner cases (think Horrid Wilting and Magic Missile impacting simultaneously - the Horrid Wilting's immunity to magic damage would carry over to the Magic Missiles, which should not be subject to evasion; this is contrived, but contingencies can make this sort of thing happen repeatably) and because elemental damage isn't the only effect that needs checking (immunity to cold should not stop the impact damage from one of Ice Storm's 4kg mini-comets from bopping your head, but it should stop the slow effect from Frost Fingers).

 

It's okay this way, with four files per spell, but kind of a drag for other people to mod subsequently. It does have the advantage of working :) But the impediments to other modders will worsen once every freaking weapon has to be patched to use a Remove Eye-of-the-Whatever Sectype; it may be worth keeping in mind here.

 

Oh well. Despite having wasted too much development time on Seven Eyes, HoW still rocks the socks off of ToB (and breaks less of the original executable to boot). A few mods like Kulyok's NPCs and this conversion will really make ToB look bad.

 

 

'Fraid not.
Meh, sorry for my yap, then; I only recall pinching the spell hits, asum1x, and msum1x. If it continues to prove elusive, you can put "none" in the second resource field of the .vvc - this skips the default delay and icky unpaletted spboom.bam that otherwise runs if the field is left null. Beware that if the .cre summoned has a *gu.bam wake sequence, they'll play it before doing anything.

 

Sorry I can't be of more help at the moment.

 

Don't be - apart from the six or seven things in the original post that I didn't know, I'm still running off your original convert_pro code.

 

Here's how I ended up doing Evasion, btw:

 

sppr503 (say) ends up

 

(i) applying cosmetic effects

(ii) applying immunity to sppr503v to thieves (save vs Dragon Breath to avoid)

(iii) applying sppr503v to thieves

(iv) applying sppr503w to everyone

 

sppr503v just grants immunity to sppr503w (with the Evades Effects string)

sppr503w is the payload

 

*If* I've done that right (big "if") then thieves get to save vs. dragon breath to avoid the spell; if they fail, they get to save vs. the spell as normal. That's how HoW's Evasion works, according to the manual; it's different from the 3rd ed Evasion, where one saving throw does double duty.

Link to comment

Sounds good. The trick with zero duration effects is that they only last for one ai update, and with spell_1 -> eff -> spell_2 then spell_2 is processed one update later than spell_1. But you have all the real effects happening one tick late, so it ought to come out in the wash. If not it'll be obvious and easy to fix.

 

I don't think I even read the manual :cringe:

Link to comment
Sounds good. The trick with zero duration effects is that they only last for one ai update, and with spell_1 -> eff -> spell_2 then spell_2 is processed one update later than spell_1. But you have all the real effects happening one tick late, so it ought to come out in the wash. If not it'll be obvious and easy to fix.

 

I don't think I even read the manual :cringe:

 

I think I ended up doing a one-second duration for robustness' sake (and accepting a very theoretical problem with carefully synchronised spellcasting).

Link to comment
As for evasion, Ardanis is correct: 0x110 byte .effs inherit their secondary type (and primary type, and targeting....) from their parent resource. Bioware themselves couldn't keep the inheritance chain straight sometimes, which is why saving throws are accidentally reduplicated on a whole mess of things we had to correct for the Fixpack. You probably meant to have those .effs call other spells, though, and that's fine.

 

IIRC sectypes and schools are not inherited from their parent spells, but are nested. This would imply a creature could be carrying effects that can be dispelled if any one of the sectypes are dispelled. I´m pretty sure the first one works, but the second theory needs testing.

 

-Galactygon

Link to comment

Archived

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

×
×
  • Create New...