Jump to content

Otiluke's Resilient Sphere


Recommended Posts

It's possible something changed along the line, sure - I certainly never tested the BG1 behavior.

 

Ancillary weapon effects are not stopped by physical damage resistance, however, and the spell still protects against its own effects. Immunity to Hold2 has been dropped from the Fixpack's minhp1 batch (I think?) so it can be done more nicely now than the way I have it.

 

There's no way to include all of the exant immunity effects without shell spelling it or a porcine trough of .effs; there's no way to include even one of magic resistance/immunity level 4/immunity transmutation/immunity disabling without re-ordering the effects.

 

The only thing that matters with information, Miloch, is the structure. These two patches

OUTER_PATCH ~01234576~ BEGIN
 WRITE_LONG 0x00 0x23222120
 WRITE_LONG 0x04 0x27262524
END

 

and

 

OUTER_PATCH ~01234576~ BEGIN
 READ_BYTE  0x00 "1st"
 READ_BYTE  0x01 "2nd"
 READ_BYTE  0x02 "3rd"
 READ_BYTE  0x03 "4th"
 READ_BYTE  0x04 "5th"
 READ_BYTE  0x05 "6th"
 READ_BYTE  0x06 "7th"
 READ_BYTE  0x07 "8th"
 WRITE_BYTE 0x00 ("1st" = 0x20 ? "1st" :
			   "2nd" = 0x20 ? "2nd" :
			   "3rd" = 0x20 ? "3rd" :
			   "4th" = 0x20 ? "4th" :
			   "5th" = 0x20 ? "5th" :
			   "6th" = 0x20 ? "6th" :
			   "7th" = 0x20 ? "7th" :
			   "8th" = 0x20 ? "8th" : 0x20)
 WRITE_BYTE 0x01 ("1st" = 0x21 ? "1st" :
			   "2nd" = 0x21 ? "2nd" :
			   "3rd" = 0x21 ? "3rd" :
			   "4th" = 0x21 ? "4th" :
			   "5th" = 0x21 ? "5th" :
			   "6th" = 0x21 ? "6th" :
			   "7th" = 0x21 ? "7th" :
			   "8th" = 0x21 ? "8th" : 0x21)
 WRITE_BYTE 0x02 ("1st" = 0x22 ? "1st" :
			   "2nd" = 0x22 ? "2nd" :
			   "3rd" = 0x22 ? "3rd" :
			   "4th" = 0x22 ? "4th" :
			   "5th" = 0x22 ? "5th" :
			   "6th" = 0x22 ? "6th" :
			   "7th" = 0x22 ? "7th" :
			   "8th" = 0x22 ? "8th" : 0x22)
 WRITE_BYTE 0x03 ("1st" = 0x23 ? "1st" :
			   "2nd" = 0x23 ? "2nd" :
			   "3rd" = 0x23 ? "3rd" :
			   "4th" = 0x23 ? "4th" :
			   "5th" = 0x23 ? "5th" :
			   "6th" = 0x23 ? "6th" :
			   "7th" = 0x23 ? "7th" :
			   "8th" = 0x23 ? "8th" : 0x23)
 WRITE_BYTE 0x04 ("1st" = 0x24 ? "1st" :
			   "2nd" = 0x24 ? "2nd" :
			   "3rd" = 0x24 ? "3rd" :
			   "4th" = 0x24 ? "4th" :
			   "5th" = 0x24 ? "5th" :
			   "6th" = 0x24 ? "6th" :
			   "7th" = 0x24 ? "7th" :
			   "8th" = 0x24 ? "8th" : 0x24)
 WRITE_BYTE 0x05 ("1st" = 0x25 ? "1st" :
			   "2nd" = 0x25 ? "2nd" :
			   "3rd" = 0x25 ? "3rd" :
			   "4th" = 0x25 ? "4th" :
			   "5th" = 0x25 ? "5th" :
			   "6th" = 0x25 ? "6th" :
			   "7th" = 0x25 ? "7th" :
			   "8th" = 0x25 ? "8th" : 0x25)
 WRITE_BYTE 0x06 ("1st" = 0x26 ? "1st" :
			   "2nd" = 0x26 ? "2nd" :
			   "3rd" = 0x26 ? "3rd" :
			   "4th" = 0x26 ? "4th" :
			   "5th" = 0x26 ? "5th" :
			   "6th" = 0x26 ? "6th" :
			   "7th" = 0x26 ? "7th" :
			   "8th" = 0x26 ? "8th" : 0x26)
 WRITE_BYTE 0x07 ("1st" = 0x27 ? "1st" :
			   "2nd" = 0x27 ? "2nd" :
			   "3rd" = 0x27 ? "3rd" :
			   "4th" = 0x27 ? "4th" :
			   "5th" = 0x27 ? "5th" :
			   "6th" = 0x27 ? "6th" :
			   "7th" = 0x27 ? "7th" :
			   "8th" = 0x27 ? "8th" : 0x27)
END

 

are exactly the same, except one of them is badly written.

Link to comment

I can't find it, and it's not really suitable anyway (I omit the hold effect so that the ensphered can drink potions and such - given the existing climate of Protection From Magic Phobia, that's not going to fly here. Also eases the copy to Lathander's Shield :band: ).

 

It's pretty much like this, though I've probably forgotten one or two effects. The only really dubious part is the minhp ring from a create magical weapon effect; feel free to turn up your noses if you find it hackish, because it is.

COPY_EXISTING spwi413.spl override
 PATCH_IF SOURCE_SIZE > 0x71 BEGIN
READ_LONG   0x64 ho
READ_SHORT  0x68 hc
READ_LONG   0x6a eo
FOR (i1 = hc; i1 > 0x00; i1 -= 0x01) BEGIN
  READ_SHORT   (ho + i1 * 0x28 - 0x0a) ec
  WRITE_SHORT  (ho + i1 * 0x28 - 0x0a) 0x01
  READ_SHORT   (ho + i1 * 0x28 - 0x08) ei
  WRITE_SHORT  (ho + i1 * 0x28 - 0x08) i1 - 0x01
  DELETE_BYTES (eo + ei * 0x30) (0x30 * (ec - 0x01))
  WRITE_SHORT  (eo + 0x00) 0x92
  WRITE_BYTE   (eo + 0x02) 0x02
  WRITE_BYTE   (eo + 0x03) 0x04
  WRITE_LONG   (eo + 0x04) 0x00
  WRITE_LONG   (eo + 0x08) 0x01
  WRITE_BYTE   (eo + 0x0c) 0x00
  WRITE_BYTE   (eo + 0x0d) 0x01
  WRITE_LONG   (eo + 0x0e) 0x00
  WRITE_BYTE   (eo + 0x12) 0x64
  WRITE_BYTE   (eo + 0x13) 0x00
  WRITE_ASCII  (eo + 0x14) ~spwi413a~
  WRITE_LONG   (eo + 0x24) 0x01
  WRITE_LONG   (eo + 0x28) 0x00
END
WRITE_SHORT 0x6e 0x00
WRITE_SHORT 0x70 0x00
DELETE_BYTES (0x72 + 0x58 * hc) (BUFFER_LENGTH - (0x72 + 0x58 * hc))
 END
BUT_ONLY
COPY_EXISTING spwi413.spl ~override/spwi413a.spl~
 PATCH_IF SOURCE_SIZE > 0x71 BEGIN
WRITE_LONG  0x08 ` 0x00
WRITE_ASCII 0x10 ~~ #8
WRITE_LONG  0x18 0x00
WRITE_SHORT 0x22 0x00
WRITE_SHORT 0x25 0x00
WRITE_BYTE  0x27 0x00
WRITE_LONG  0x34 0x00
READ_LONG   0x64 ho
READ_SHORT  0x68 hc
READ_LONG   0x6a eo
READ_ASCII  eo ef (0x30)
INNER_PATCH_SAVE ef ~%ef%~ BEGIN
  WRITE_BYTE  0x03 0x00
  WRITE_LONG  0x08 0x00
  WRITE_BYTE  0x0d 0x00
  WRITE_LONG  0x0e 0x3c
  WRITE_ASCII 0x14 ~~ #8
  WRITE_LONG  0x24 0x00
END
FOR (i1 = 0x00; i1 < hc; i1 += 0x01) BEGIN
  WRITE_LONG  (ho + i1 * 0x28 + 0x12) 0x00
  WRITE_SHORT (ho + i1 * 0x28 + 0x1e) 0x29
  WRITE_SHORT (ho + i1 * 0x28 + 0x20) 0x29 * i1
  INSERT_BYTES eo (0x30 * 0x28)
  FOR (i2 = 0x00; i2 < 0x29; i2 += 0x01) BEGIN
	WRITE_ASCIIE eo + i2 * 0x30 ~%ef%~
  END
  WRITE_SHORT (eo + 0x30 * 0x00 + 0x00) 0xae // expiry sound effect
  WRITE_BYTE  (eo + 0x30 * 0x00 + 0x0c) 0x0c
  WRITE_ASCII (eo + 0x30 * 0x00 + 0x14) ~eff_m12b~
  WRITE_SHORT (eo + 0x30 * 0x01 + 0x00) 0xd7 // play whiffleball effect
  WRITE_LONG  (eo + 0x30 * 0x01 + 0x08) 0x01
  WRITE_ASCII (eo + 0x30 * 0x01 + 0x14) ~minorglb~
  WRITE_SHORT (eo + 0x30 * 0x02 + 0x00) 0xb9 // hold creature 2
  WRITE_LONG  (eo + 0x30 * 0x02 + 0x08) 0x02
  WRITE_SHORT (eo + 0x30 * 0x03 + 0x00) 0x14 // invisibility
  WRITE_SHORT (eo + 0x30 * 0x04 + 0x00) 0x14 // improved invisibility
  WRITE_LONG  (eo + 0x30 * 0x04 + 0x08) 0x01
  WRITE_SHORT (eo + 0x30 * 0x05 + 0x00) 0x01 // APR modifier
  WRITE_LONG  (eo + 0x30 * 0x05 + 0x08) 0x01
  WRITE_SHORT (eo + 0x30 * 0x06 + 0x00) 0xb0 // movement rate modifier
  WRITE_LONG  (eo + 0x30 * 0x06 + 0x08) 0x01
  WRITE_SHORT (eo + 0x30 * 0x07 + 0x00) 0x8e // portrait icon
  WRITE_LONG  (eo + 0x30 * 0x07 + 0x08) 0x0d
  WRITE_SHORT (eo + 0x30 * 0x08 + 0x00) 0x65 // immunity to effect - damage
  WRITE_LONG  (eo + 0x30 * 0x08 + 0x08) 0x0c
  WRITE_SHORT (eo + 0x30 * 0x09 + 0x00) 0x78 // immunity to weapons - magical
  WRITE_LONG  (eo + 0x30 * 0x09 + 0x08) 0x01
  WRITE_SHORT (eo + 0x30 * 0x0a + 0x00) 0x78 // immunity to weapons - non-magical
  WRITE_LONG  (eo + 0x30 * 0x0a + 0x08) 0x02
  FOR (i2 = 0x01; i2 < 0x0b; i2 += 0x01) BEGIN
	WRITE_SHORT (eo + 0x30 * (0x0a + i2) + 0x00) 0x66 // protection from spell level
	WRITE_LONG  (eo + 0x30 * (0x0a + i2) + 0x04) i2
  END
  FOR (i2 = 0x00; i2 < 0x13; i2 += 0x01) BEGIN
	WRITE_SHORT (eo + 0x30 * (0x14 + i2) + 0x00) 0xce // immunity to specific spell
	WRITE_LONG  (eo + 0x30 * (0x14 + i2) + 0x04) ` 0x00
  END
  WRITE_ASCII (eo + 0x30 * 0x14 + 0x14) ~sppr105~
  WRITE_ASCII (eo + 0x30 * 0x15 + 0x14) ~sppr211~
  WRITE_ASCII (eo + 0x30 * 0x16 + 0x14) ~sppr302~
  WRITE_ASCII (eo + 0x30 * 0x17 + 0x14) ~sppr304~
  WRITE_ASCII (eo + 0x30 * 0x18 + 0x14) ~sppr313~
  WRITE_ASCII (eo + 0x30 * 0x19 + 0x14) ~sppr314~
  WRITE_ASCII (eo + 0x30 * 0x1a + 0x14) ~spwi213~
  WRITE_ASCII (eo + 0x30 * 0x1b + 0x14) ~spwi215~
  WRITE_ASCII (eo + 0x30 * 0x1c + 0x14) ~spwi313~
  WRITE_ASCII (eo + 0x30 * 0x1d + 0x14) ~spwi502~
  WRITE_ASCII (eo + 0x30 * 0x1e + 0x14) ~sppr603d~
  WRITE_ASCII (eo + 0x30 * 0x1f + 0x14) ~spwi614~
  WRITE_ASCII (eo + 0x30 * 0x20 + 0x14) ~sppr705~
  WRITE_ASCII (eo + 0x30 * 0x21 + 0x14) ~sppr725d~
  WRITE_ASCII (eo + 0x30 * 0x22 + 0x14) ~spwi712~
  WRITE_ASCII (eo + 0x30 * 0x23 + 0x14) ~spwi810~
  WRITE_ASCII (eo + 0x30 * 0x24 + 0x14) ~spwi911~
  WRITE_ASCII (eo + 0x30 * 0x25 + 0x14) ~spwish25~
  WRITE_ASCII (eo + 0x30 * 0x26 + 0x14) ~spwish32~
  WRITE_SHORT (eo + 0x30 * 0x27 + 0x00) 0xcd // immunity to secondary type
  WRITE_LONG  (eo + 0x30 * 0x27 + 0x08) 0x04	  
  WRITE_SHORT (eo + 0x30 * 0x28 + 0x00) 0x66 // protection from spell level
END
 END

 

/edit

 

Aha, found it. Looks like I dropped the minhp1 effect - maybe it was potentially fudging some script somewhere. Replaced with secondary type immunity.

 

Also, devSin has a Bounty Hunter special snare patch floating around that addresses some of the same issues for the third extended header for that spell - I just use the same triggered spell for both (less hassle for me, but more files).

The Bounty Hunter ability needs a good deal more fixing (second and third headers are ranged, third and fourth headers do no damage, blah blah blah...)

Link to comment

Since you've showed me yours, I'll show you mine!

COPY_EXISTING SPCL415.SPL OVERRIDE
WRITE_BYTE 0x27 0x0
READ_LONG 0x6A eo
WRITE_BYTE eo + 0x63 0x3
WRITE_BYTE eo + 0x6D 0x1
READ_SHORT 0x10A x
l = eo + (x * 0x30)
WRITE_BYTE l + 0x3 0x8
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xC 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x802008B
WRITE_LONG l + 0x4 0x206A
READ_SHORT 0xE2 ne
WRITE_SHORT 0xE2 ne + 0x1
WRITE_SHORT 0x10A ne + 0x34
eo += ne * 0x30
DELETE_BYTES eo 0x4B0
INNER_PATCH_FILE SPWI413.SPL BEGIN
READ_LONG 0x6A o
WRITE_ASCIIT o + 0x764 SPWI415
WRITE_LONG o + 0x1B4 0x0
WRITE_LONG o + 0x304 0x3
WRITE_LONG o + 0x728 0x9
WRITE_LONG o + 0x784 0xA
WRITE_SHORT o + 0x1B0 0x123
FOR (l = o + 0x21E; l < 0x84A; l += 0x30) BEGIN
	WRITE_LONG l 0x2A
END
READ_SHORT 0x90 n
WRITE_SHORT 0x90 n + 0x9
l = o + (n * 0x30)
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x40200A6
WRITE_LONG l + 0x4 0x64
WRITE_LONG l + 0x8 0x1
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x402001F
WRITE_LONG l + 0x4 0x64
WRITE_LONG l + 0x8 0x1
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x402001E
WRITE_LONG l + 0x4 0x64
WRITE_LONG l + 0x8 0x1
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x402001D
WRITE_LONG l + 0x4 0x64
WRITE_LONG l + 0x8 0x1
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x402001C
WRITE_LONG l + 0x4 0x64
WRITE_LONG l + 0x8 0x1
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x402001B
WRITE_LONG l + 0x4 0x64
WRITE_LONG l + 0x8 0x1
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x4020065
WRITE_LONG l + 0x8 0x19
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x40200AD
WRITE_LONG l + 0x4 0x64
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
INSERT_BYTES l 0x30
WRITE_BYTE l + 0xD 0x1
WRITE_BYTE l + 0x12 0x64
WRITE_LONG l 0x402008E
WRITE_LONG l + 0x8 0x7D
WRITE_LONG l + 0xE 0x2A
WRITE_LONG l + 0x24 0x1
READ_SHORT 0x90 n
READ_ASCII o e (n * 0x30)
END
INSERT_BYTES eo + 0x30 n * 0x30
WRITE_ASCIIE eo + 0x30 "%e%"
WRITE_SHORT 0xE0 n + 0x1
READ_SHORT 0x90 ne
WRITE_SHORT 0x90 ne + 0x2
WRITE_SHORT 0xBA ne + 0x3
READ_LONG 0x6A eo
eo += ne * 0x30
DELETE_BYTES eo + 0x60 0x30
WRITE_LONG eo + 0x6E 0x1E
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x302008B
WRITE_LONG eo + 0x4 0x394C
WRITE_LONG eo + 0x24 0x1
WRITE_LONG eo + 0x28 `0x3
WRITE_SHORT eo + 0xC 0x101
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x302008D
WRITE_LONG eo + 0x8 0x6
WRITE_LONG eo + 0x24 0x1
WRITE_LONG eo + 0x28 `0x3
WRITE_SHORT eo + 0xC 0x101
READ_SHORT 0xB8 n
WRITE_SHORT 0xB8 n - 0x1
READ_SHORT 0x108 n
WRITE_SHORT 0x108 n + 0x1

COPY_EXISTING SPWI413.SPL OVERRIDE
READ_BYTE 0x19 f
WRITE_BYTE 0x19 f & `0x4
READ_LONG 0x6A eo
WRITE_ASCIIT eo + 0x764 SPWI415
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x3E 0x3C
WRITE_LONG eo + 0x6E 0x3C
WRITE_LONG eo + 0x9E 0x3C
WRITE_LONG eo + 0xCE 0x3C
WRITE_LONG eo + 0xFE 0x3C
WRITE_LONG eo + 0x12E 0x3C
WRITE_LONG eo + 0x15E 0x3C
WRITE_LONG eo + 0x18E 0x3C
WRITE_LONG eo + 0x1BE 0x3C
WRITE_LONG eo + 0x1EE 0x3C
WRITE_LONG eo + 0x1B4 0x0
WRITE_LONG eo + 0x304 0x3
WRITE_LONG eo + 0x728 0x9
WRITE_LONG eo + 0x784 0xA
WRITE_SHORT eo + 0x1B0 0x123
READ_SHORT 0x90 ne
WRITE_SHORT 0x90 ne + 0xA
eo += ne * 0x30
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x40200A6
WRITE_LONG eo + 0x4 0x64
WRITE_LONG eo + 0x8 0x1
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x402001F
WRITE_LONG eo + 0x4 0x64
WRITE_LONG eo + 0x8 0x1
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x402001E
WRITE_LONG eo + 0x4 0x64
WRITE_LONG eo + 0x8 0x1
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x402001D
WRITE_LONG eo + 0x4 0x64
WRITE_LONG eo + 0x8 0x1
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x402001C
WRITE_LONG eo + 0x4 0x64
WRITE_LONG eo + 0x8 0x1
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x402001B
WRITE_LONG eo + 0x4 0x64
WRITE_LONG eo + 0x8 0x1
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x4020065
WRITE_LONG eo + 0x8 0x19
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x402008E
WRITE_LONG eo + 0x8 0x7D
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x40200AD
WRITE_LONG eo + 0x4 0x64
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1
INSERT_BYTES eo 0x30
WRITE_BYTE eo + 0xD 0x1
WRITE_BYTE eo + 0x12 0x64
WRITE_LONG eo 0x40200B0
WRITE_LONG eo + 0x8 0x1
WRITE_LONG eo + 0xE 0x3C
WRITE_LONG eo + 0x24 0x1

Loops are so WeiDU v185! ;)

Link to comment

Alrighty then. I like Nythrun's approach, with the shell spell as it allows for a more thorough application of the blocking of spell levels and MR and whatnot. The original spell checks MR and allows for save; if it goes through then it casts the secondary spell which is schoolless, level 0, and bypasses MR. Similarities:

  • Sound effect, visual. Duh.
  • Movement rate (via 176) to 0 and hold via 185.
  • Both set immunities to spells of levels 1-9.

Differences:

  • Nythrun's uses the Held icon whereas devSin's uses the Otiluke's icon.
  • Both include Invisible (20) but Nythrun's has the second normal invisibility opcode.
  • Nythrun sets ApR to 0.
  • Nythrun sets immunity to magical and non-magical weapons.
  • Nythrun sets immunity to damage (12) opcode.
  • Nythrun sets a lot of individual spell immunities to area-effect spells.
  • Nythrun sets spell deflection on 'remove spell protection' type spells; devSin adds it to all known types (save 11 so it won't block itself).
  • devSin sets 100% resistance to all damage types (pierce, slash, crush, missile, fire, cold, acid, electricity, and magical damage) as well as immunity to poison damage and the poison opcode
  • devSin adds a disable visual (291) opcode
  • devSin adds protection from all spell schools (save 8 to prevent self-blocking)
  • devSin sets MR to 100%

I'd personally just go overkill and use the effects from both patches. It's a grip, I know, but it's also the most likely to cover all bases (including mods). So, proposed:

  • Use Nythrun's shell spell approach.
  • Same visuals, sound, hold, immunities to spells level 0-9.
  • ApR to 0.
  • Uses the Otiluke's icon.
  • Apply normal and improved invisibility.
  • Set immunity to magical and non-magical weapons.
  • Immunity to damage (12) opcode.
  • Spell deflection to all spell types.
  • 100% resistance to all damage types (pierce, slash, crush, missile, fire, cold, acid, electricity, and magical damage) as well as immunity to poison damage and the poison opcode
  • Disable visual (291) opcode
  • Protection from all spell schools
  • MR to 100%
  • Run it through the relevant effects immunity batches to provide protections against area-effect spells

Look good?

Link to comment

Make sure that disable visuals comes first (before the deflection opcodes; prevents unwanted whiffle ball from playing); make sure magic resistance comes last (prevents resisting subsequent effects). Otherwise, I don't think there's much problem with the suggestion (a tad overkill, maybe; you know how I hate the shell spells!).

 

Mine shouldn't set immunity to spell level 4 (kinda defeats the purpose; the spell would block its own subsequent effects); Nythrun cheats. ;) There's no great harm to having novisuals later in the list, but it can cause the whiffle ball to briefly pop up when the deflection effects are applied, which is why I suggest having it as high up as possible. I don't bother with the specific immunities, because there's no AoE in the default game that will bypass the magic resistance, but I don't think there's anything really wrong with adding them.

 

I don't like having it non-dispellable as the original can be dispelled...

Link to comment

I can get away with not adding the prevent visual effect opcode because I'm not adding any primary/secondary type protections (it's quite redundant with levels 0-9 prevented) in my copy - otherwise it's a must, as the minor globe fails to completely eclipse the whiffleball and it looks horrid.

 

The double invisibility was only because I wanted to make sure Detect Illusions doesn't make the ensphered target visible - it probably isn't necessary, but I don't know all the ins and outs of that ability.

 

You'll need to drop immunity to spell level 0 (almost every dispel), primary type 0 (item dispels), primary type 1 (abjuration), secondary type 0 (almost every dispel), secondary type 4 (beholder anti-magic ray), secondary type 5 (HELL_DISPEL, if it's not already changed along with the primary type (3), and secondary type 11 (DISPEL_NO_SAVE) in addition to changing the bit in all the spell effects - I might be forgetting some.

 

Hold creature II ought to let scripts run unimpeded, so nothing should break. We hope. I don't know of any perfect methods for pausing them anyway.

 

Unless it's too tweakish for everyone's taste, I like unsetting the hostility flag in spwi413.

 

We're both upping the duration to 60 from 42 I think :band:

 

.tp2 spam is so hawt.

Link to comment
I can get away with not adding the prevent visual effect opcode because I'm not adding any primary/secondary type protections (it's quite redundant with levels 0-9 prevented) in my copy - otherwise it's a must, as the minor globe fails to completely eclipse the whiffleball and it looks horrid.
Yeah, I remove level 0 to not interfere with dispels and true innates (the bad stuff gets blocked by MR anyway). The school/type protections should be all but those actually used by the sphere (again, MR saves me from having to get any more funky).

 

The double invisibility was only because I wanted to make sure Detect Illusions doesn't make the ensphered target visible - it probably isn't necessary, but I don't know all the ins and outs of that ability.
It should work fine. I like just improved since it keeps them out of spell targeting and makes them just hazy (it may also make NPCs real invisible until an actual attack, but I can't remember). I think there's a reason for me not bothering to add normal invisibility (I'm sure I used to add it somewhere where only improved was added before), but I'm not sure if it was because the behavior was identical to just improved or something else.

 

You'll need to drop immunity to spell level 0 (almost every dispel), primary type 0 (item dispels), primary type 1 (abjuration), secondary type 0 (almost every dispel), secondary type 4 (beholder anti-magic ray), secondary type 5 (HELL_DISPEL, if it's not already changed along with the primary type (3), and secondary type 11 (DISPEL_NO_SAVE) in addition to changing the bit in all the spell effects - I might be forgetting some.
I think I change the types of the dispels to not suck in any case (I consolidate at least HELL_DISPEL and maybe one other into ToB's simple DISPEL_NO_SAVE or vice versa or something); if not, I'll get around to it eventually. I guess it's easier for us to just leave them all alone and further hobble the sphere, yeah.

 

Unless it's too tweakish for everyone's taste, I like unsetting the hostility flag in spwi413.
Yep. That should be my f & `0x4 in the patch. I think it's worthwhile since the sphere could technically be used to protect an NPC (this would never, ever happen, but the hostility flag would just turn them hostile regardless of intent). I usually disable it for either that reason (how a spell should be treated by NPCs) or if the combat counter shouldn't start (no hostile flagged summoning spells for me, thanks); targetting other people directly and causing damage are treated as hostile and break invisibility without the flag, so it's pretty useless.
Link to comment
The double invisibility was only because I wanted to make sure Detect Illusions doesn't make the ensphered target visible - it probably isn't necessary, but I don't know all the ins and outs of that ability.

 

Ask me. :band: Basically, it dispels any form of dispellable invisibility (i.e. everything except the Baldurdashed Staff of the Magi), blur, mirror/reflected image and also destroys all illusionary clones in a small radius. However, it cannot dispel Sanctuary under any circumstances.

 

BTW, the sphere should definitively be susceptible to Dispel Magic both per the BG2 description and per PnP rules.

Link to comment
I don't know all the ins and outs of that ability.
Detect Illusions removes by primary type (5) - the dispel settings are irrelevant, as is the secondary type. Which means I don't have to rererewrite my improved invisibility patch. Good thing too. I might have gone berserk.

 

After double checking, we're setting HELL_DISPELL (sic) to no secondary type already, so secondary type five can stay. I've already set FORCE_DISPEL to nulls locally; beholder rays I leave alone - who knows what was going on there.

 

If I'd been awake when I through together that "this is something like what I did" patch, I'd have written a disable held icon effect rather than a display held icon effect. I'll probably add a no foot circle effect as well, since party members won't lose that upon going improved invisible.

 

Disable priest/wizard/innate spellcasting effects do indeed stop ForceSpell() - adding those will make beholders shut the @#$% up already without killing scripts. ReallyForceSpell() is still really unstoppable, but it's not abused often enough to care about.

 

I don't trust magic resistance to stop a caster's own persistent area effect spells, and two of the wish damage spells punch through almost everything.

Link to comment

As somebody who's run through multiple intensive testing runs of the game with boffo magic resistance, I can unequivocally state that it's pretty absolute. :) The person in the sphere is held and can't cast magic missile and such preset target spells on themselves, and the area effects wouldn't do anything even if they could cast those.

 

The held icon doesn't bother me (I think it's auto-added by Hold2 along with the yellow color glow and string); the sphere icon was just fluff (why not, I figured). Meh for disabling spellcasting (either/or, I don't think it much matters); canon beholders are supposed to be able to fire off rays through hold effects anyway (even though they can't move the eyestalks).

 

What's your improved invis patch? It would have been nice if the spell were abjuration/non-combat, but I couldn't justify that change locally (I've never really counted on non-detection doing anything worthwhile, so why bother). I'd like having it non-combat, but that wouldn't actually do anything, so I just left it alone.

Link to comment

After replacing the immunity to Entangle with 100% magic resistance and having Jaheira ReallyForce Otiluke's and Entangle, she's still being affected (rolling saving throws, displaying icons, and generally being a nuisance). That doesn't matter so much (as she can't move anyway) and immunity to damage will take care of most AoEs, but I don't want to worry about bodging in immunity to slay from Cloudkill and whatever else is floating around :D Some of the wish and wild magic spells actually end up being self-cast on all actors and are extremely nasty.

 

As I recall, though, my list of persistent immunity-bypassing spells wasn't quite the same as yours, so there's probably something else going on here that I've not yet figured out.

 

The sphere icon may be fluff, but it's nice fluff, and it's not difficult to figure out where it was intended to go :D Yes to beholders firing rays when held, no to beholders firing rays while "completely unable to affect the outside world". None of which will ever matter, as the spell is really not very good even after being completely rebuilt :band: Hmm, maybe blindness would be better than disabling the spellcasting - I'll try that instead. Nothing's ever quite good enough.

 

My improved invisibility patch is dynamically adding a new secondary type, then patching all spells that use the improved invisibility effect to use the new secondary type, then adding to the beginning of their effects list a zero duration immunity to string (blocking the string displayed when a remove by secondary effect runs - this works only on the initial casting) followed by a remove secondary type: improved invisibility effect. At the end of the effects list goes the saving throw bonus. It's been solid - I just had a paroxysm of anxiety when I realized I hadn't accounted for thief Detect Illusions. Fortunately it's a non-issue; I'd iterated through about five versions of Improved Invisibility and this has been the only thing that I've been happy with. I've done similiarly for Slow, Haste, Deafness, Blindness, Silence, Poison and Disease (which have to be redone, thank you research of ill-omen!), and Bard Song, and will probably add a few more before I'm through. It may not be a fix, but they work correctly now, and otherwise don't ;)

Link to comment

Archived

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

×
×
  • Create New...