Jump to content

Vampiric Touch; familiar


Gort

Recommended Posts

Fixpack v2

 

First: although description of Vampiric Touch says it is not stackable, it actually is. There is no necessary delay between casting.

 

Second: familiar may be dropped from PC inventory when it is full and PC gets some item from script or dialog.

Link to comment
First: although description of Vampiric Touch says it is not stackable, it actually is. There is no necessary delay between casting.

There's no clean way to fix this; I think the best we can do is to prevent a second casting from adding to the caster's HP. Making the victim immune would stop both, but it doesn't make sense as a different mage should be able to use VT on them. Plus, it also wouldn't stop the mage from using VT on another target.

 

Second: familiar may be dropped from PC inventory when it is full and PC gets some item from script or dialog.

Hardcoded.

Link to comment

Hello -

 

First: although description of Vampiric Touch says it is not stackable, it actually is. There is no necessary delay between casting.

There's no clean way to fix this; I think the best we can do is to prevent a second casting from adding to the caster's HP. Making the victim immune would stop both, but it doesn't make sense as a different mage should be able to use VT on them. Plus, it also wouldn't stop the mage from using VT on another target.

 

Larloch's shares this problem. I've already fixed that one so that you can only charge your HPs once per active casting.

 

Vampiric Touch has another issue altogether: the amount of damage you do and the amount of HPs you gain are rarely equal. Plus, the Fixpack version does *not* do 1D6 per two levels as the description states -- you do some sort of sliding fixed damage deal.

 

I'm tempted to change VT to something like 4 fixed dmg per two levels (an extension of Larlcoh's 4 dmg at level 1) in order to fix the damage done != HPs received issue, because there is evidently no way to keep the damage random and coordinate the two.

Link to comment
Larloch's shares this problem. I've already fixed that one so that you can only charge your HPs once per active casting.

Unlike VT, LMD isn't supposed to have this limitation.

 

Vampiric Touch has another issue altogether: the amount of damage you do and the amount of HPs you gain are rarely equal. Plus, the Fixpack version does *not* do 1D6 per two levels as the description states -- you do some sort of sliding fixed damage deal.

Fixpack leaves the damage unchanged in VT--trying to fix it and getting the drain to match the HPs gained is a PITA that, frankly, is low priority.

Link to comment

I've played with this quite a bit and I've been unable to prevent the stacking. The usual sneaky trick of shell spells combined with spell immunity doesn't work--because the original spell is actually targeted at someone else, the immunity doesn't seem to kick in. Making the caster immune to the entire spell means that they're immune to others targeting them with VT, which is, I think, a larger bug than the original. If anyone has ideas, let me know, otherwise there's nothing really to be done here.

Link to comment

Evil Scripting Hacks ?

 

I can think of an evil solution involving opcode #309, but it's most certainly nothing I would want in a fixpack...

Link to comment

Sorry, that was like the least helpful post ever :)

 

I'm just curious why something simple like this didn't work (rough sketch, doubt it works, but you get the drift)

COPY_EXISTING ~spwi314.spl~ ~override/spwi314b.spl~
 PATCH_IF (SOURCE_SIZE > 0x71) THEN BEGIN
WRITE_ASCII 0x10 ~~ #8
WRITE_SHORT 0x22 0x00
WRITE_SHORT 0x25 0x00
WRITE_BYTE  0x27 0x00
READ_LONG   0x64 "ho"
READ_LONG   0x6a "eo"
FOR (READ_SHORT 0x68 "hc"; "hc" > 0x00; "hc" -= 0x1) BEGIN
  WRITE_BYTE ("ho" + (("hc" - 0x01) * 0x28) + 0x0c) 0x05
  WRITE_LONG ("ho" + (("hc" - 0x01) * 0x28) + 0x12) 0x00
  READ_SHORT ("ho" + (("hc" - 0x01) * 0x28) + 0x1e) "ec"
  READ_SHORT ("ho" + (("hc" - 0x01) * 0x28) + 0x20) "ei"
  SET "nc" = "ec"
  FOR ("i2" = "ec"; "i2" > 0x00; "i2" -= 0x01) BEGIN
	READ_BYTE ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x02) "tt"
	PATCH_IF ("tt" = 0x02) THEN BEGIN
	  SET "nc" -= 0x01
	  DELETE_BYTES ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) 0x30
	END ELSE BEGIN
	  WRITE_BYTE ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x03) 0x00
	  WRITE_BYTE ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x0d) 0x03
	  READ_BYTE  ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) "op"
	  PATCH_IF ("op" = 0xce) THEN BEGIN
		WRITE_ASCII ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x14) ~spwi314b~
	  END
	END
  END
  WRITE_SHORT ("ho" + (("i1" - 0x01) * 0x28) + 0x1e) "nc"
END
READ_SHORT  0x68 "hc"
READ_SHORT  0x6e "ei"
READ_SHORT  0x70 "gc"
SET "ei" += "gc"
FOR ("i1" = 0x00; "i1" < ("hc" * 0x28); "i1" += 0x28) BEGIN
  READ_SHORT  ("ho" + "i1" + 0x1e) "ec"
  WRITE_SHORT ("ho" + "i1" + 0x20) "ei"
  SET "ei" += "ec"
END
 END
BUT_ONLY

COPY_EXISTING ~spwi314.spl~ ~override~
PATCH_IF (SOURCE_SIZE > 0x71) THEN BEGIN
READ_LONG   0x64 "ho"
READ_LONG   0x6a "eo"
FOR (READ_SHORT 0x68 "hc"; "hc" > 0x00; "hc" -= 0x1) BEGIN
  READ_SHORT ("ho" + (("hc" - 0x01) * 0x28) + 0x10) "lv"
  READ_SHORT ("ho" + (("hc" - 0x01) * 0x28) + 0x1e) "ec"
  READ_SHORT ("ho" + (("hc" - 0x01) * 0x28) + 0x20) "ei"
  SET "nc" = "ec"
  FOR ("i2" = "ec"; "i2" > 0x00; "i2" -= 0x01) BEGIN
	READ_BYTE ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x02) "tt"
	PATCH_IF ("tt" = 0x01) THEN BEGIN
	  SET "nc" -= 0x01
	  DELETE_BYTES ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) 0x30
	END ELSE BEGIN
	  READ_BYTE  ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) "op"
	  PATCH_IF ("op" = 0xd7) THEN BEGIN
		READ_ASCII   ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) ~fx~ (0x30)
		INSERT_BYTES ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) 0x30
		WRITE_ASCIIE ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) ~%fx%~
		WRITE_SHORT  ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x00) 0x92
		WRITE_BYTE   ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x02) 0x01
		WRITE_LONG   ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x04) "lv"
		WRITE_LONG   ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x08) 0x01
		WRITE_ASCII  ("eo" + (("ei" + "i2" - 0x01) * 0x30) + 0x14) ~spwi314b~
	  END
	END
  END
  WRITE_SHORT ("ho" + (("i1" - 0x01) * 0x28) + 0x1e) "nc"
END
READ_SHORT  0x68 "hc"
READ_SHORT  0x6e "ei"
READ_SHORT  0x70 "gc"
SET "ei" += "gc"
FOR ("i1" = 0x00; "i1" < ("hc" * 0x28); "i1" += 0x28) BEGIN
  READ_SHORT  ("ho" + "i1" + 0x1e) "ec"
  WRITE_SHORT ("ho" + "i1" + 0x20) "ei"
  SET "ei" += "ec"
END
 END
BUT_ONLY

Link to comment

Hello -

 

The approach I took with LMD is to separate the damage and the HP buff into two separate spells, both of which are cast by a cast spell effect from the main spell. The HP buff includes a self-targeted protection from itself which lasts the duration of the buff. Hence, damage an enemy repeatedly, but charge your HPs only once (until the buff wears out). Tested fine.

Link to comment

Archived

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

×
×
  • Create New...