Nythrun Posted October 9, 2010 Share Posted October 9, 2010 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 doCOPY_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 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
Nythrun Posted October 9, 2010 Author Share Posted October 9, 2010 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
Galactygon Posted October 9, 2010 Share Posted October 9, 2010 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 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
DavidW Posted October 9, 2010 Share Posted October 9, 2010 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
Wisp Posted October 9, 2010 Share Posted October 9, 2010 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
DavidW Posted October 9, 2010 Share Posted October 9, 2010 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
Ardanis Posted October 10, 2010 Share Posted October 10, 2010 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
Nythrun Posted October 10, 2010 Author Share Posted October 10, 2010 Welcome back Nythrun!Thank you; it's always gratifying to find other spell perfectionists around 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
DavidW Posted October 10, 2010 Share Posted October 10, 2010 Welcome back Nythrun!Thank you; it's always gratifying to find other spell perfectionists around 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
Nythrun Posted October 11, 2010 Author Share Posted October 11, 2010 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 Link to comment
Jarno Mikkola Posted October 11, 2010 Share Posted October 11, 2010 Again, just because it has to be said, I am in awe... and so is everyone else Nythrun ! Link to comment
DavidW Posted October 11, 2010 Share Posted October 11, 2010 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 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
Galactygon Posted October 11, 2010 Share Posted October 11, 2010 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
Recommended Posts
Archived
This topic is now archived and is closed to further replies.