Jump to content

Scriptable Spells v3


Recommended Posts

Gotcha...unfortuately the last public release is already trying to use more stats than are actually available. No one has done anything with 193/ss 37 yet, so if you want to experiment, feel free - it'll won't conflict with anything other than lack of ToB. It also hasn't seen extensive testing...so if anything odd turns up, you'll have interesting discoveries to report :D
I'll try that, thanks.

 

Of course, you've already EXTEND_BOTTOMed every creature script once, might as well do it again /teasing
Whatever gets the job done... ;)

But let's hope I won't need to. ;)

Link to comment

Just double checking, but you used the scripting state opcode with a value of 36, right (cause stats.ids counts from one, but the opcode counts from zero)?

 

Might actually have time to look at this today, I'll double check my work if I do ;)

Link to comment

I appended "193 PHANTASMALKILLERMARK" to STATS.IDS and picked corresponding value in NI listbox (which was 37) to set the scripting state in effect. As far as I can see, all values in this listbox are values from STATS.IDS minus 156. If NI is wrong here, then how come doing the same with SCRIPTINGSTATE1 works?

Link to comment

Ni is okay, as expected, then - and there's your first interesting discovery ;)

 

Pinning down exactly what stats over 176 do is bothersome, but it's going to have to be done at some point. I'm so not looking forward to it.

 

I suppose you could try 188 also (though that's first on my list of things to investigate) - again, I can't really point you to an unused stat, as detectable spells is already using too many ;)

Link to comment

Just ran through 193 again on a different .cre than the one I used initially, and it's fixed at zero. Interesting, though not really helpful yet.

 

/edit

 

For quicky searches, I'm just using this sort of thing (OUTER_SET "stat" to whatever)

BEGIN ~morestats~


OUTER_PATCH ~asdf~ BEGIN
 SAY 0x0 ~0~
 READ_LONG 0x0 "0s"
 SAY 0x0 ~1~
 READ_LONG 0x0 "1s"
 SAY 0x0 ~2~
 READ_LONG 0x0 "2s"
 SAY 0x0 ~3~
 READ_LONG 0x0 "3s"
 SAY 0x0 ~4~
 READ_LONG 0x0 "4s"
 SAY 0x0 ~5~
 READ_LONG 0x0 "5s"
 SAY 0x0 ~6~
 READ_LONG 0x0 "6s"
 SAY 0x0 ~7~
 READ_LONG 0x0 "7s"
 SAY 0x0 ~8~
 READ_LONG 0x0 "8s"
 SAY 0x0 ~9~
 READ_LONG 0x0 "9s"
 SAY 0x0 ~10~
 READ_LONG 0x0 "10s"
 SAY 0x0 ~11~
 READ_LONG 0x0 "11s"
 SAY 0x0 ~12~
 READ_LONG 0x0 "12s"
 SAY 0x0 ~13~
 READ_LONG 0x0 "13s"
 SAY 0x0 ~14~
 READ_LONG 0x0 "14s"
 SAY 0x0 ~15~
 READ_LONG 0x0 "15s"
 SAY 0x0 ~16~
 READ_LONG 0x0 "16s"
 SAY 0x0 ~17~
 READ_LONG 0x0 "17s"
 SAY 0x0 ~18~
 READ_LONG 0x0 "18s"
 SAY 0x0 ~19~
 READ_LONG 0x0 "19s"
 SAY 0x0 ~20~
 READ_LONG 0x0 "20s"
 SAY 0x0 ~100~
 READ_LONG 0x0 "100s"
END

OUTER_SET "stat" = 188

<<<<<<<<zzstatsc.baf
IF
Global("FJStatsCheck","LOCALS",0)
THEN
RESPONSE #100
ReallyForceSpellRes("zzstatsc",Myself)
DisplayStringHead(Myself,2642)
SetGlobal("FJStatsCheck","LOCALS",1)
END

IF
CheckStat(Myself,0,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%0s%)
END

IF
CheckStatGT(Myself,0,%stat%)
CheckStatLT(Myself,2,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%1s%)
END

IF
CheckStatGT(Myself,1,%stat%)
CheckStatLT(Myself,3,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%2s%)
END

IF
CheckStatGT(Myself,2,%stat%)
CheckStatLT(Myself,4,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%3s%)
END

IF
CheckStatGT(Myself,3,%stat%)
CheckStatLT(Myself,5,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%4s%)
END

IF
CheckStatGT(Myself,4,%stat%)
CheckStatLT(Myself,6,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%5s%)
END

IF
CheckStatGT(Myself,5,%stat%)
CheckStatLT(Myself,7,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%6s%)
END

IF
CheckStatGT(Myself,6,%stat%)
CheckStatLT(Myself,8,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%7s%)
END

IF
CheckStatGT(Myself,7,%stat%)
CheckStatLT(Myself,9,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%8s%)
END

IF
CheckStatGT(Myself,8,%stat%)
CheckStatLT(Myself,10,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%9s%)
END

IF
CheckStatGT(Myself,9,%stat%)
CheckStatLT(Myself,11,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%10s%)
END

IF
CheckStatGT(Myself,10,%stat%)
CheckStatLT(Myself,12,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%11s%)
END

IF
CheckStatGT(Myself,11,%stat%)
CheckStatLT(Myself,13,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%12s%)
END

IF
CheckStatGT(Myself,12,%stat%)
CheckStatLT(Myself,14,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%13s%)
END

IF
CheckStatGT(Myself,13,%stat%)
CheckStatLT(Myself,15,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%14s%)
END

IF
CheckStatGT(Myself,14,%stat%)
CheckStatLT(Myself,16,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%15s%)
END

IF
CheckStatGT(Myself,15,%stat%)
CheckStatLT(Myself,17,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%16s%)
END

IF
CheckStatGT(Myself,16,%stat%)
CheckStatLT(Myself,18,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%17s%)
END

IF
CheckStatGT(Myself,17,%stat%)
CheckStatLT(Myself,19,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%18s%)
END

IF
CheckStatGT(Myself,18,%stat%)
CheckStatLT(Myself,20,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%19s%)
END

IF
CheckStatGT(Myself,19,%stat%)
CheckStatLT(Myself,100,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%20s%)
END

IF
CheckStatGT(Myself,100,%stat%)
THEN
RESPONSE #100
DisplayStringHead(Myself,%100s%)
END
>>>>>>>>

COPY ~zzstatsc.baf~ ~override/zzstatsc.bcs~
 EVALUATE_BUFFER
 COMPILE_BAF_TO_BCS  

COPY_EXISTING ~aataqah.cre~ ~override/zzstatsc.cre~
 WRITE_SHORT 0x024 0x64
 WRITE_SHORT 0x026 0x64
 WRITE_BYTE  0x234 0x20
 WRITE_ASCII 0x248 ~zzstatsc~
 WRITE_ASCII 0x280 ~zzstatsc~

COPY_EXISTING ~spcl131.spl~ ~override/zzstatsc.spl~
 DELETE_BYTES 0x72 (SOURCE_SIZE - 0x72)
 INSERT_BYTES 0x72 (0x28 + 0x60)
 WRITE_LONG   0x64 0x72
 WRITE_SHORT  0x68 0x1
 WRITE_LONG   0x6a (0x72 + 0x28)
 WRITE_SHORT  0x6e 0x0
 WRITE_SHORT  0x70 0x0
 WRITE_BYTE   (0x72 + 0x00) 0x1
 WRITE_SHORT  (0x72 + 0x02) 0x4
 WRITE_BYTE   (0x72 + 0x0c) 0x5
 WRITE_SHORT  (0x72 + 0x0e) 0x1
 WRITE_SHORT  (0x72 + 0x10) 0x1
 WRITE_SHORT  (0x72 + 0x1c) 0x1
 WRITE_SHORT  (0x72 + 0x1e) 0x2
 WRITE_SHORT  (0x72 + 0x22) 0x1
 WRITE_SHORT  (0x72 + 0x24) 0x1
 WRITE_SHORT  (0x72 + 0x26) 0x1
 WRITE_SHORT  (0x9a + 0x00) ("stat" > 155 ? 0x11a : 0xe9)
 WRITE_BYTE   (0x9a + 0x02) 0x2
 WRITE_LONG   (0x9a + 0x04) 0x1
 WRITE_LONG   (0x9a + 0x08) ("stat" > 155 ? ("stat" - 156) : "stat")
 WRITE_BYTE   (0x9a + 0x0c) 0x0
 WRITE_LONG   (0x9a + 0x0e) 0x10
 WRITE_BYTE   (0x9a + 0x12) 0x64
 WRITE_SHORT  (0x9a + 0x30) 0xd8
 WRITE_BYTE   (0x9a + 0x32) 0x2
 WRITE_LONG   (0x9a + 0x34) 0x2
 WRITE_LONG   (0x9a + 0x38) 0x0
 WRITE_BYTE   (0x9a + 0x3c) 0x0
 WRITE_LONG   (0x9a + 0x3e) 0x100
 WRITE_BYTE   (0x9a + 0x42) 0x64

COPY_EXISTING ~zzstatsc.spl~ ~override/zzstatsr.spl~
 WRITE_SHORT  (0x9a + 0x00) 0xe9
 WRITE_BYTE   (0x9a + 0x02) 0x2
 WRITE_LONG   (0x9a + 0x04) 0x0
 WRITE_LONG   (0x9a + 0x08) 0x0
 WRITE_BYTE   (0x9a + 0x0c) 0x0
 WRITE_LONG   (0x9a + 0x0e) 0x1
 WRITE_BYTE   (0x9a + 0x12) 0x64
 WRITE_SHORT  (0x9a + 0x30) 0xe0
 WRITE_BYTE   (0x9a + 0x32) 0x2
 WRITE_LONG   (0x9a + 0x34) 0x0
 WRITE_LONG   (0x9a + 0x38) 0x0
 WRITE_BYTE   (0x9a + 0x3c) 0x0
 WRITE_LONG   (0x9a + 0x3e) 0x1
 WRITE_BYTE   (0x9a + 0x42) 0x64

Link to comment

I've quick-tested everything from 177 to 198:

 

177 = works

178 = works

179 = works

180 = works

181 = works

182 = works

183 = works

184 = works

185 = works

186 = works

187 = works

188 = doesn't work (target gains [Minor] Spell Turning animation effect)

189 = doesn't work

190 = doesn't work

191 = doesn't work

192 = doesn't work

193 = doesn't work

194 = doesn't work

195 = doesn't work

196 = doesn't work

197 = doesn't work

198 = doesn't work

 

Not sure if it's of any use, but looks like it's possible to use negative parameter values and change stats below 156. I've only tested it with "-1" (= 0xFFFFFFFF), and checking for stat 155 IMPROVEDHASTE.

 

So, can I use any of those 177-187, or they are a no-no?

Link to comment

That pretty much matches what I've got, although both 188 and 193 have worked conditionally (though I did not yet test that they're valid for longer than one script cycle). Please note that 182 - 187 inclusive are actually used by the engine and are not fully available

  REPLACE_TEXTUALLY ~^182 +.+~ ~182 UNKNOWNSS27~
 REPLACE_TEXTUALLY ~^183 +.+~ ~183 ENABLEOFFSCREENAI~
 REPLACE_TEXTUALLY ~^184 +.+~ ~184 EXISTANCEDELAY~
 REPLACE_TEXTUALLY ~^185 +.+~ ~185 UNKNOWNSS30~
 REPLACE_TEXTUALLY ~^186 +.+~ ~186 DISABLECHUNKING~
 REPLACE_TEXTUALLY ~^187 +.+~ ~187 NOTURNABLE~

 

I also have yet to finish testing 176 - 181 with every non-instant opcode to verify that they're always available - if they're being set by some commonly used effect, then they're not available either. I haven't found one yet, but there may be some ;)

 

Here's two other ideas:

 

Grab a seldom used, short duration stat (such as 156 WINGBUFFET) and set that scripting state to a value greater than what's already in use (say, 0x10 + spell level).

 

Skip the stats entirely and have the spell set the targetted creature's area script to something you write that includes some shouting ;)

Link to comment

Hmm, perhaps I can make use of 178 WIZARD_RESIST_FEAR slot? This custom spell is not supposed to work on creatures immune to/protected from fear (I'm going through all item/spell/cre effects and adding "protection from spell" after each immunity opcode). I'm using short effect duration - fixed at 2 rounds, and it actually makes sense if everyone during this period will avoid casting HORROR at the CRE which failed initial saving throw here, since there's a chance it will be dead in several moments. ;)

 

Or another possibility - any stat which is responsible for stunned/held condition. I've decided to add "paralyzed with fear" stun effect to this spell, anyway.

Link to comment

That sounds even better ;) I'd like to move FEARIMMUNITY or whatever it's finally called down to a lower stat (Sim, among others, have wanted stuff more applicable to lower level characters listed earlier and the ToB rubbish listed last) - but since there's been scant input on this matter so far, I don't think there's a preferential order just yet.

Link to comment

It appears stat 185 is being set by opcode 313 (denote high level ability) - neither parameter is preserved, the stat detects as zero if opcode 313 is not present on the creature, and detects at one if the opcode is present.

 

Smallest discovery ever, I call dibs ;)

Link to comment

Before I try to impose a canonical stat order on everyone, here's where I'm at.

 

Not available:

  REPLACE_TEXTUALLY ~^115 +.+~ ~115 PROFICIENCYCLUB~
 REPLACE_TEXTUALLY ~^156 +.+~ ~156 WINGBUFFET~
 REPLACE_TEXTUALLY ~^157 +.+~ ~157 DEATHWARD~
 REPLACE_TEXTUALLY ~^158 +.+~ ~158 LEVELDRAINIMMUNITY~
 REPLACE_TEXTUALLY ~^165 +.+~ ~165 BLADEBARRIER~
 REPLACE_TEXTUALLY ~^166 +.+~ ~166 MELEETHAC0BONUS~
 REPLACE_TEXTUALLY ~^167 +.+~ ~167 MELEEDAMAGEBONUS~
 REPLACE_TEXTUALLY ~^168 +.+~ ~168 MISSILEDAMAGEBONUS~
 REPLACE_TEXTUALLY ~^169 +.+~ ~169 NOCIRCLE~
 REPLACE_TEXTUALLY ~^170 +.+~ ~170 FISTTHAC0BONUS~
 REPLACE_TEXTUALLY ~^171 +.+~ ~171 FISTDAMAGEBONUS~
 REPLACE_TEXTUALLY ~^172 +.+~ ~172 TITLE1~
 REPLACE_TEXTUALLY ~^173 +.+~ ~173 TITLE2~
 REPLACE_TEXTUALLY ~^174 +.+~ ~174 NOVISUALS~
 REPLACE_TEXTUALLY ~^175 +.+~ ~175 BACKSTABIMMUNITY~
 REPLACE_TEXTUALLY ~^183 +.+~ ~183 ENABLEOFFSCREENAI~
 REPLACE_TEXTUALLY ~^184 +.+~ ~184 EXISTANCEDELAY~
 REPLACE_TEXTUALLY ~^185 +.+~ ~185 HIGHLEVELABILITY~
 REPLACE_TEXTUALLY ~^186 +.+~ ~186 DISABLECHUNKING~
 REPLACE_TEXTUALLY ~^187 +.+~ ~187 NOTURNABLE~
 REPLACE_TEXTUALLY ~^188 +.+~ ~188 DISPLAYBAMSCRIPTINGSTATE32~
 REPLACE_TEXTUALLY ~^189 +.+~ ~189 CHAOSSHIELD~
 REPLACE_TEXTUALLY ~^190 +.+~ ~190 NPCBUMP~
 REPLACE_TEXTUALLY ~^191 +.+~ ~191 CANUSEANYITEM~
 REPLACE_TEXTUALLY ~^192 +.+~ ~192 ALWAYSBACKSTAB~
 REPLACE_TEXTUALLY ~^193 +.+~ ~193 UNKNOWNSCRIPTINGSTATE37~
 REPLACE_TEXTUALLY ~^194 +.+~ ~194 SPELLFAILUREINNATE~
 REPLACE_TEXTUALLY ~^195 +.+~ ~195 NOTRACKING~
 REPLACE_TEXTUALLY ~^196 +.+~ ~196 DEADMAGIC~
 REPLACE_TEXTUALLY ~^197 +.+~ ~197 DISABLETIMESTOP~
 REPLACE_TEXTUALLY ~^198 +.+~ ~198 NOSEQUESTER~
 REPLACE_TEXTUALLY ~^199 +.+~ ~199 STONESKINGOLEM~
 REPLACE_TEXTUALLY ~^200 +.+~ ~200 LEVELDRAIN~
 REPLACE_TEXTUALLY ~^201 +.+~ ~201 AVATARREMOVAL~

 

The 33 or 34 stats that are available:

109
 110
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 159
 160
 161
 162
 163
 164
 176
 177
 178
 179
 180
 181
 182 - maybe

 

The stats added by the last BP version:

IMMUNITY_ENCHANTMENT
 WEAPON_ENCHANTMENT
 SPELL_DEFLECTION
 PROTECTION_ALIGNMENT
 TRUE_SIGHT
 MIND_SHIELD
 PROTECTION_SPELL_LEVEL
 IMMUNITY_NECROMANCY
 PHYSICAL_MIRROR
 IMMUNITY_ABJURATION
 REGENERATION
 FIRE_SHIELD
 IMMUNITY_ALTERATION
 IMMUNITY_CONJURATION
 PROTECTION_MAGIC_WEAPONS
 SPELL_TURNING
 IMMUNITY_DIVINATION
 FREE_ACTION
 KHELBENS_WARDING_WHIP
 IMMUNITY_ILLUSION
 LEVEL_DRAINED
 COMBAT_BUFF
 ARMOR_SPELL
 STRENGTH_BUFF
 IMMUNITY_INVOCATION
 NEEDS_BREACH
 SPELL_TRAP
 GAZE_REFLECTION
 SPELL_SHIELD
 RESIST_FEAR
 DISPEL_BAD
 INSIDE_OF_CLOUD
 PROTECTION_NORMAL_WEAPONS
 DISPEL_GOOD

 

Stuff I change:

 

Things I've removed entirely:

 

RESIST_FEAR: As of Fixpack beta3, fear immunity effects include a batch that modifies the morale break stat - this is no longer needed.

 

PROTECTION_NORMAL_WEAPONS/PROTECTION_MAGIC_WEAPONS: No need for two stats, use value of 1 = normal weapons, 2 = +1 weapons, 3 = +2 weapons, 256 = protection magical weapons. Having one of these stats would be hugely useful and really needs retaining ;)

 

ARMOR_SPELL: This is not actually used by any in game resources; Horred noted this and then left the stat in anyway. Other creatures don't need to know which spells in which order you've cast to get an armor class, and you need to track the spells with variables anyway.

 

SPELL_TRAP, SPELL_TURNING, SPELL_DEFLECTION: After a minor spell turning is overloaded with a fifth level spell, the stat would remain in place because it's not possible to directly bind new effects into opcodes. Only spell reflection would change strategies in any case. They'd be nice, but they'll never work correctly.

 

COMBAT_BUFF: Again, Tenser's Transformation and its ilk do not actually set this stat - what is really meant to do? There are spell failure stats aplenty.

 

LEVEL_DRAINED: Redundant

 

 

Things I've considered removing:

 

WEAPON_ENCHANTMENT: can be done with a while-equipped LOCALS, would only be useful if other creatures need to check your weapon enchantment level readily. Still on the fence about this one.

 

 

Things I've added:

 

NORMALMISSILEIMMUNITY: It's too important at lower levels

 

 

Things that I'd like to expand:

 

MIND_SHIELD: It's just Chaotic Commands, would be handy to check for fear/charm immunities seperately

 

FREE_ACTION: Free action itself is an instant effect, really this is a bundle of spell immunities

 

 

Things other people are using:

 

MAGICMISSILEIMMUNITY/SHIELD: In Scs

 

 

It's also worth noting that spells can be updated to set local variables that match their duration, type, and dispellabillity, if this is something that people find useful (uh huh uh huh!) This can't be done by script.

 

/edit

 

Forgot to add, I'd prefer to reserve 109 and 110 for their intended use as weapon proficiencies. While my implementation of the Blackjack sucks a whole lot, it's something other people have done too.

Link to comment

I agree with the reflection; HasBounceEffects() is comparatively reliable since the only false positive you'll really come across are bounce projectile effects (Physical Mirror).

 

But the deflection effects are very tricky. Since it picks up immunity to effect, HasImmunityEffects() is completely worthless; I've never checked to see how (or if) any of the big scripters get around this (beyond using the broken detectable effects system).

 

I used to hope that two of the unknown stats were set by the hardcoded visuals (the disc and whiffle ball), which would be reliable enough to detect bounce and immunity effects; hope is for suckers.

Link to comment

Archived

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

×
×
  • Create New...