Jump to content

The Glitterdust spell (SPWI224.SPL) doesn't display the Blind icon

Recommended Posts

As the title says. I'm guessing that this wasn't reported so far because, AFAIK, the Glitterdust spell is never used by enemy mages in the unmodded game.


However, in the recent revisions of RR, the improved Shadow Thieves occasionally cast it from scrolls so I've managed notice it during my test runs.

Link to comment

Same thing with sppr313 (and spin595 and spwi958, if you're considering mods), but yes.


It's up to Cam whether this is another Polymorph Other-style "it's broke and we ain't fixin' it".


I didn't think the Glitterdust description of blindness deserved to stand though, and that isn't salvagable without secondary type hijinks.

Link to comment

We may need to start a new effects batch to counterpoint the immunity effects batching.


Remind me how I abused my power in tweaking Poly Other to shut out non-mainstream modders again.







(For those who don't recognize it, that was humor. :cry: )

Link to comment
Remind me how I abused my power in tweaking Poly Other to shut out non-mainstream modders again.


You always ask for specifics because you can never handle generalities.


Polymorph Other uses IDS targetted .effs (which are absolute) rather than projectile IDS targetting (which is relative) so it can't affect the party regardless of who casts it, enemy or not. But it's also never cast by an enemy in the unmodded game, so swapping in some variant of hold.pro won't actually make any difference except to modders.


Similar arguments apply to creating a short-radius party only .pro for Magic Resistance and Strength and other "exploitables" (I don't have any interest in arguing about this, so it's getting dropped here :cry: )


I care more about the blindness icon than most of the others because sporadic permanent blindness reports still crop up in the Bioware fora.


Adding an icon to sppr313 is a fix from either perspective though (more .eff files = more awesome!). And the Glitterdust description of the blindness effect really is poppycock.

Link to comment

Chromatic Orb (both mage and avenger version) also lacks a blind icon. So does 'Yellow Dragon Scorching Sand' (spin595) and a Powerword: Blind (spwi958) but these appear to be unused.


// new eff for holy smite; needs to display blind icon for blinded creatures
COPY_EXISTING ~blind.eff~	~override/cdblind.eff~
 WRITE_LONG 0x10 142 // display portrait icon
 WRITE_LONG 0x20 8   // icon: blinded

// make sure blindness effects always have a blind icon
COPY_EXISTING ~spdr101.spl~ ~override~ // chromatic orb (avenger)
		  ~spin595.spl~ ~override~ // scorching sand
		  ~sppr313.spl~ ~override~ // holy smite
		  ~spwi118.spl~ ~override~ // chromatic orb (mage)
		  ~spwi224.spl~ ~override~ // glitterdust
		  ~spwi958.spl~ ~override~ // pw: blind (unused?)
 LAUNCH_PATCH_MACRO ~add_fx_batch_prep~ // defines vars for rest of patch
SET "new_fx" = 0
FOR (index = (0 - global_loop); index < abil_num; index = index + 1) BEGIN
  SET "new_fx_1" = 0
  SET "new_fx_2" = 0
  SET "new_fx_3" = 0
  SET "new_fx_4" = 0
  PATCH_IF ("%index%" < 0) BEGIN // if loop through globals needed
	SET "abil_fx_idx" = 0
  END ELSE BEGIN // otherwise normal ability
	SET "counter_offset" = ("%abil_off%" + 0x1e + ("%abil_length%" * "%index%"))
	READ_SHORT  ("%abil_off%" + 0x20 + ("%abil_length%" * "%index%")) "abil_fx_idx"
	SET "abil_fx_idx" = ("%abil_fx_idx%" + "%new_fx%")
	WRITE_SHORT ("%abil_off%" + 0x20 + ("%abil_length%" * "%index%")) ("%abil_fx_idx%")
  READ_SHORT "%counter_offset%" "counter" // fx_num on global loop, otherwise abil_fx_num
  FOR (index2 = 0; index2 < counter; index2 = index2 + 1) BEGIN
	READ_SHORT ("%fx_off%"		+ (0x08 * "%fx_type%") + (("%abil_fx_idx%" + "%index2%") * (0x30 + (0xd8 * "%fx_type%")))) "opcode"
	READ_LONG  ("%fx_off%" + 0x04 + (0x10 * "%fx_type%") + (("%abil_fx_idx%" + "%index2%") * (0x30 + (0xd8 * "%fx_type%")))) "param1"
	READ_LONG  ("%fx_off%" + 0x08 + (0x10 * "%fx_type%") + (("%abil_fx_idx%" + "%index2%") * (0x30 + (0xd8 * "%fx_type%")))) "param2"
	READ_ASCII ("%fx_off%" + 0x14 + (0x14 * "%fx_type%") + (("%abil_fx_idx%" + "%index2%") * (0x30 + (0xd8 * "%fx_type%")))) "resref"
	PATCH_IF ("%opcode%" = 74) BEGIN // blindness
	  SET "new_fx_1" = 1
	  READ_ASCII ("%fx_off%" +							 (("%abil_fx_idx%" + "%index2%") * (0x30 + (0xd8 * "%fx_type%")))) "template" ((0x30 + (0xd8 * "%fx_type%")))
	PATCH_IF (("%opcode%" = 142) AND ("%param2%" = 8)) BEGIN // display blinded portrait icon
	  SET "new_fx_2" = 1
	PATCH_IF (("%opcode%" = 177) AND ("%resref%" STRING_COMPARE_CASE "blind" = 0)) BEGIN // blindness via eff
	  SET "new_fx_3" = 1
	  READ_ASCII ("%fx_off%" +							 (("%abil_fx_idx%" + "%index2%") * (0x30 + (0xd8 * "%fx_type%")))) "template" ((0x30 + (0xd8 * "%fx_type%")))
	PATCH_IF (("%opcode%" = 177) AND ("%resref%" STRING_COMPARE_CASE "cdblind" = 0)) BEGIN // blindness icon via eff
	  SET "new_fx_4" = 1
  PATCH_IF ("%new_fx_1%" = 1) BEGIN
	PATCH_IF ("%new_fx_2%" = 0) BEGIN
	  INSERT_BYTES   ("%fx_off%"							   + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) (0x30 + (0xd8 * "%fx_type%"))
		WRITE_ASCIIE ("%fx_off%"							   + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) "%template%" // clones immunity effect
		WRITE_SHORT  ("%fx_off%"		+ (0x08 * "%fx_type%") + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) 142		  // display portrait icon
		WRITE_LONG   ("%fx_off%" + 0x08 + (0x10 * "%fx_type%") + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) 8			// blinded
	  SET "new_fx" = ("%new_fx%" + 1)
	  SET "counter" = ("%counter%" + 1)
  PATCH_IF ("%new_fx_3%" = 1) BEGIN
	PATCH_IF ("%new_fx_4%" = 0) BEGIN
	  INSERT_BYTES   ("%fx_off%"							   + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) (0x30 + (0xd8 * "%fx_type%"))
		WRITE_ASCIIE ("%fx_off%"							   + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) "%template%" // clones immunity effect
		WRITE_SHORT  ("%fx_off%"		+ (0x08 * "%fx_type%") + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) 177		  // display portrait icon
		WRITE_ASCII  ("%fx_off%" + 0x14 + (0x14 * "%fx_type%") + ("%abil_fx_idx%" * (0x30 + (0xd8 * "%fx_type%")))) ~cdblind~ #8 // resref
	  SET "new_fx" = ("%new_fx%" + 1)
	  SET "counter" = ("%counter%" + 1)
  WRITE_SHORT "%counter_offset%" "%counter%"
LAUNCH_PATCH_MACRO ~add_fx_batch_final~ // wrapup creature offset patching


If we want to add the 'blinded' string to everything that causes blindness, the list will get a bit longer:


			  ~gorwom4.itm~ ~override~ // drow flail +3
		  ~sorb.itm~	~override~ // searing orb
		  ~sw1h51.itm~  ~override~ // celestial fury +3
		  ~wand19.itm~  ~override~ // wand of cursing
		  ~spdr101.spl~ ~override~ // chromatic orb
		  ~spin595.spl~ ~override~ // yellow dragon scorching sand
		  ~spin878.spl~ ~override~ // level drain
		  ~spin893.spl~ ~override~ // shadow dragon breath
		  ~spin929.spl~ ~override~ // mist ball
		  ~spin931.spl~ ~override~ // sooty ball
		  ~sppr313.spl~ ~override~ // holy smite
		  ~sppr707.spl~ ~override~ // sunray
		  ~spwi118.spl~ ~override~ // chromatic orb
		  ~spwi224.spl~ ~override~ // glitterdust
		  ~spwi714.spl~ ~override~ // prismatic spray
		  ~spwi815.spl~ ~override~ // power word blind
		  ~spwi958.spl~ ~override~ // power word, blind


I'm not in favor of adding strings, as we'd robably end up having to add strings to just about every item and spell for every effect by the time we were done. Though, as usual, discuss any away.

Link to comment

My big concern would be for mods--with changes to efftext, (good) modders would have to add or remove an effect depending on whether Fixpack is present or not. Being as we have another way to address it I'd go with the alternative (asuuming folks think this is a fix and it gets included).


It's probably not a ban candidate for Tweaks, though, because then I could purge strings from all spells (including mods) with a few regexp patches. It's even nicer since devSin already did most of the legwork.

Link to comment

Fine by me, I'll just PATCH_LAZY the strings in :help:




By PATCH_LAZY I mean I'll throw something like this down before reading off item effects into their own spells. After checking that it parses, or course.

COPY_EXISTING ~spdr101.spl~  ~override~ // Chromatic Orb (Stalker) (Uses "Blindness" rather than "Blinded")
		  ~spin595.spl~  ~override~ // YELLOW_DRAGON_BREATH
		  ~spin878.spl~  ~override~ // SHADOW_DRAIN
		  ~spin893.spl~  ~override~ // SHADOW_DRAGON_BREATH
		  ~spin929.spl~  ~override~ // MEPHIT_MIST
		  ~spin931.spl~  ~override~ // MEPHIT_SOOTY_BALL
		  ~sppr313.spl~  ~override~ // Holy Smite
//			~sppr704.spl~  ~override~ // Nature's Beauty
		  ~sppr707.spl~  ~override~ // Sunray
//			~spwi106.spl~  ~override~ // Blindness
		  ~spwi118.spl~  ~override~ // Chromatic Orb (Uses "Blindness" rather than "Blinded")
//			~spwi224.spl~  ~override~ // Glitterdust
		  ~spwi714.spl~  ~override~ // Prismatic Spray
		  ~spwi815.spl~  ~override~ // Power Word Blind
		  ~spwi958.spl~  ~override~ // POWERWORD_BLIND
		  ~spwm178.spl~  ~override~ // Wild Magic Blindness
		  ~chalcy2.itm~  ~override~ // Pocket Plane Cyricist Ambush Undroppable Widget
		  ~gorwom4.itm~  ~override~ // Ameralis Zauviir's Flail
//			~halb06.itm~   ~override~ // Blackmist +4
		  ~sorb.itm~	 ~override~ // Searing Orb
		  ~sw1h51.itm~   ~override~ // Celestial Fury +3
		  ~wand19.itm~   ~override~ // Wand of Cursing
  SET "hs" = 0x28
  SET "hs" = 0x38
READ_LONG  0x64 "ho"
READ_LONG  0x6a "eo"
READ_SHORT 0x68 "hc"
FOR ("i1" = ("hc" * "hs"); "i1" > 0x00; "i1" -= "hs") BEGIN
  READ_SHORT ("ho" + "i1" - "hs" + 0x1e) "ec"
  READ_SHORT ("ho" + "i1" - "hs" + 0x20) "ei"
  FOR ("i2" = (("ei" + "ec") * 0x30); "i2" > ("ei" * 0x30); "i2" -= 0x30) BEGIN
	READ_SHORT ("eo" + "i2" - 0x30 + 0x00) "op"
	READ_ASCII ("eo" + "i2" - 0x30 + 0x14) ~rr~
	PATCH_IF (("op" = 0x4a) OR (("op" = 0xb1) AND (~%rr%~ STRING_EQUAL_CASE ~blind~))) THEN BEGIN
	  READ_ASCII ("eo" + "i2" - 0x30 + 0x00) ~ef~ (0x30)
	  SET "i2" = 0x00
  SET "del" = 0x00
  FOR ("i2" = (("ei" + "ec") * 0x30); "i2" > ("ei" * 0x30); "i2" -= 0x30) BEGIN
	READ_SHORT	 ("eo" + "i2" - 0x30 + 0x00) "op"
	READ_LONG	  ("eo" + "i2" - 0x30 + 0x04) "st"
	PATCH_IF (("op" = 0x8b) AND (("st" = 0x3952) OR ("st" = 0x5c2) OR ("st" = 0x2eef) OR ("st" = 0x3294) OR ("st" = 0x32d9) OR ("st" = 0x36f7) OR ("st" = 0x3937) OR ("st" = 0x43f7))) THEN BEGIN
	  DELETE_BYTES ("eo" + "i2" - 0x30 + 0x00) 0x30
	  SET "del" += 0x01
  WRITE_SHORT   ("ho" + "i1" - "hs" + 0x1e) ("ec" - "del" + 0x01)
  INSERT_BYTES  ("eo" + (("ec" + "ei" - "del") * 0x30) + 0x00) 0x30
  WRITE_ASCIIE  ("eo" + (("ec" + "ei" - "del") * 0x30) + 0x00) ~%ef%~
	WRITE_ASCII ("eo" + (("ec" + "ei" - "del") * 0x30) + 0x14) ~cdblinds~
	WRITE_SHORT ("eo" + (("ec" + "ei" - "del") * 0x30) + 0x00) 0x8b
	WRITE_LONG  ("eo" + (("ec" + "ei" - "del") * 0x30) + 0x04) 0x3952
	WRITE_LONG  ("eo" + (("ec" + "ei" - "del") * 0x30) + 0x08) 0x00
	WRITE_ASCII ("eo" + (("ec" + "ei" - "del") * 0x30) + 0x14) ~~ #8
  WRITE_BYTE	("eo" + (("ec" + "ei" - "del") * 0x30) + 0x0c) 0x01
  WRITE_LONG	("eo" + (("ec" + "ei" - "del") * 0x30) + 0x0e) 0x00
READ_SHORT  0x70 "ei"
FOR ("i1" = 0x00; "i1" < ("hc" * "hs"); "i1" += "hs") BEGIN
  WRITE_SHORT ("ho" + "i1" + 0x20) "ei"
  READ_SHORT  ("ho" + "i1" + 0x1e) "ec"
  SET "ei" += "ec"
COPY_EXISTING ~blind.eff~	~override/cdblinds.eff~
WRITE_LONG  0x10 0x8b
WRITE_LONG  0x1c 0x3952
WRITE_LONG  0x28 0x00
WRITE_ASCII 0x30 ~~ #8
WRITE_LONG  0x38 0x00
WRITE_LONG  0x3c 0x00
WRITE_LONG  0x60 0x00

Link to comment

Note that I removed that a long time ago. It leads to a ton of incessant feedback, and some effects fire on GAM characters that aren't actually in the party or even in the same area (loading any game, for instance, would fire a "Cernd - Regenerating" message). Especially fun is where random spawns fire and you get a ton of messages when the creatures have equipping effects or cast spells offscreen.


I now take the "long" approach of patching every item and spell where necessary; it was tremendously boring sifting through every single file, but I really did find a lot of stuff in need of improvement, so I guess it wasn't a complete waste.

Link to comment


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

  • Create New...