Jump to content
Sign in to follow this  
Gort

Vampiric Touch; familiar

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.

Edited by Gort

Share this post


Link to post
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.

Share this post


Link to post

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.

Share this post


Link to post
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.

Share this post


Link to post
Guest Guest

it'd be good to remove stacking, at least.. my sorc had over 400 hp once

Share this post


Link to post

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.

Share this post


Link to post

spwi119 stays the same except the hitpoint bonus is replaced with spwi119b which is hitpoint bonus + immunity to spwi119b didn't work?

 

It's kinda worth preventing since the max hitpoints opcode stacks geometrically :)

Share this post


Link to post
Guest erik

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...

Share this post


Link to post

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

Edited by Nythrun

Share this post


Link to post

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.

Share this post


Link to post

Well, I swear the first time it didn't work--it is now. VT no longer stacks HP for the caster.

Share this post


Link to post
Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...