Jump to content

Melf's Minute Meteors and Offensive Spin


Recommended Posts

We included this fix from Baldurdash, and with the exception in these two cases (whirlwind and minute meteors) it's been a better fix. Haste effects interact poorly with offhand attacks, i.e. you no longer get any, so it was replaced by three different effects that (cumulatively) provide the same effect without losing the offhand attacks.

 

Nythrum's got an excellent handle on how personal initiative, haste, and ApR opcodes interact (see his IESDP post); I'm hoping he's got a better solution that can address all of these issues. :blush: Fighting the engine at this level generally frustrates and annoys me.

Link to comment

Let's say you've got Haer'Daelis using Chaos mainhand and Entropy offhand. Normally six seconds of attacking will look like this:

Attack (with Chaos)
Attack (left) (with Entropy)
Autopause - round end

Using the Offensive Spin that comes standard with the game (or regular haste, they work in the same way) can give you one of four results at random:

Attack (with Chaos)
Autopause - round end
Attack (with Chaos)
Autopause - round end

or

Attack (with Chaos)
Attack (with Chaos)
Autopause - round end
Attack (with Chaos)
Autopause - round end

or

Attack (with Chaos)
Autopause - round end
Attack (with Chaos)
Attack (with Chaos)
Autopause - round end

or even

Attack (with Chaos)
Attack (with Chaos)
Autopause - round end
Attack (with Chaos)
Attack (with Chaos)
Autopause - round end

Although this scenario looks worse than it is (if you don't realize that haste makes your melee round last only three seconds you'll probably think that you're losing attacks, which isn't the case) there are still problems: sometimes you still only attack twice in six seconds (which stinks, Offensive Spin is supposed to make you attack more often always, not just when it feels like doing so) and your offhand mysteriously decides to go on holiday. The fixpack version, like Baldurdash before it, avoids both of these problems and makes more sense in general - except for when combined with Melf's Minute Meteors, which is proving more intractible than one would like :blush:

 

The solution that I'm using locally has worked just fine for me, and didn't work for CamDawg - so the thing to do is figure out which of several methods causes the engine to have conniptions least often and use that one. Whichever it may be.

 

I'm not a he, by the way :hm:

Link to comment

Thanks again for your research. :blush: However, I'm really not keen on changing Melf's to 4.5 ApR instead of 5--I think it's a case of introducing a more widespread bug to solve what is a relatively rare one.

 

Immunity to opcode 1 causes issues, np. I think we can hack around it by adding offensive spin's haste effect through a secondary spell and then adding immunity to the secondary spell in melfmet.itm. I think the only other spell that messes with ApR is Boon of Lathander, and I can't remember if it uses a cumulative or static ApR effect.

Link to comment

Immunity effect, at least for now, to solve the spell cumulativity issue?

 

// Melf's Minute Meteors causing an attack per round overflow bug with certain spells
COPY_EXISTING ~melfmet.itm~  ~override~ // Melf's Minute Meteor
 PATCH_IF (SOURCE_SIZE>0x71) THEN		  BEGIN // protects against invalid files
READ_LONG	 0x64  "abil_off"
READ_SHORT	0x68  "abil_num"
READ_LONG	 0x6a  "fx_off"
READ_SHORT	0x70  "glb_fx_num"
FOR ("i"="%abil_num%"; "%i%">0; "i"-=1) BEGIN
  READ_SHORT  ("%abil_off%"+(0x38*"%i%")+0x20)		"abil_fx_idx"
  WRITE_SHORT ("%abil_off%"+(0x38*"%i%")+0x20)		("%abil_fx_idx%"+0x01)
END // FOR i, repairing extended header effect indices
PATCH_IF	  ("%abil_off%">"%fx_off%") BEGIN
  WRITE_LONG  0x64  ("%abil_off%"+0x30)
  SET		"abil_off"=("%abil_off%"+0x30)
END // PATCH_IF offset re-ordering
WRITE_SHORT   0x70 ("%glb_fx_num%"+0x01)
INSERT_BYTES  ("%fx_off%"+(0x30*"%glb_fx_num%")+0x00) 0x30 // new while equipped effect
WRITE_SHORT   ("%fx_off%"+(0x30*"%glb_fx_num%")+0x00) 0x65 // protection from opcode
WRITE_BYTE	("%fx_off%"+(0x30*"%glb_fx_num%")+0x02) 0x01 // target: self
WRITE_LONG	("%fx_off%"+(0x30*"%glb_fx_num%")+0x08) 0x01 // opcode1: apr modifier
WRITE_BYTE	("%fx_off%"+(0x30*"%glb_fx_num%")+0x0c) 0x02 // timing mode: while equipped
WRITE_BYTE	("%fx_off%"+(0x30*"%glb_fx_num%")+0x12) 0x64 // min probability 100%
 END // PATCH_IF filesize sanity check
BUT_ONLY_IF_IT_CHANGES // COPY_EXISTING ~melfmet.itm~ closed

Link to comment

Archived

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

×
×
  • Create New...