Jump to content

Version 28 of Sword Coast Stratagems released


DavidW

Recommended Posts

fiends dont cast dispel in almost all cases....

 

find\ssl\dispel.ssl --- both "(OR13)" have to be changed in "(OR14)"

 

mage\ssl\bg2\generalblocks\renew.ssl --- the stoneskinblock..

 

THEN DO Action(SequencerMyself,1,WIZARD_IMPROVED_INVISIBILITY,WIZARD_STONE_SKIN,WIZARD_FIRE_SHIELD_RED) // II, Stoneskin, fire shield
Action(SequencerMyself,6,WIZARD_IMPROVED_INVISIBILITY,WIZARD_FIRE_SHIELD_BLUE,WIZARD_FIRE_SHIELD_RED) // II, fire shield x2
Action(SequencerMyself,2,WIZARD_STONE_SKIN,WIZARD_FIRE_SHIELD_BLUE,WIZARD_FIRE_SHIELD_RED) // Stoneskin, fire shield x2
Action(SpellMyself,WIZARD_STONE_SKIN)
SetGlobalTimer("redefend","LOCALS",8) // don't get stuck in a defend-defend-defend loop and forget to do any damage
SetGlobalTimer("stonetimer","LOCALS",12)
END

the red sequencer is in the "THEN DO" row. so sequencer 1 isnt in the mage scripts.

 

THEN DO
Action(SequencerMyself,1,WIZARD_IMPROVED_INVISIBILITY,WIZARD_STONE_SKIN,WIZARD_FIRE_SHIELD_RED) // II, Stoneskin, fire shield
Action(SequencerMyself,6,WIZARD_IMPROVED_INVISIBILITY,WIZARD_FIRE_SHIELD_BLUE,WIZARD_FIRE_SHIELD_RED) // II, fire shield x2
Action(SequencerMyself,2,WIZARD_STONE_SKIN,WIZARD_FIRE_SHIELD_BLUE,WIZARD_FIRE_SHIELD_RED) // Stoneskin, fire shield x2
Action(SpellMyself,WIZARD_STONE_SKIN)
SetGlobalTimer("redefend","LOCALS",8) // don't get stuck in a defend-defend-defend loop and forget to do any damage
SetGlobalTimer("stonetimer","LOCALS",12)
END

 

fiend\fiend.tpa

 

// correct the Guarded-Compound summonings

LAF swap_text STR_VAR files=kettaatk.bcs swaps=~ForceSpell(LastTrigger(Myself),WIZARD_SUMMON_FIEND)=>ForceSpellRES("dw#sumgl",LastTrigger(Myself))~ END

wont work because scs changed the dw#sumgl in order to detect the alignment of the summoner. maybe its better to leave the player summoned fiend in that trap.

 

mage\ssl\bg2\combatblocks\arrows.ssl

//////////////////////////////////////////////////////////////////////////
/// ATTACK PHASE 6: Use magic missiles to bring down mirror images
//////////////////////////////////////////////////////////////////////////

IF TRIGGER
TargetBlock(PCSpellcasters)
IgnoreBlock(Indiscriminate)
IgnoreBlock(IsEnchanter)
TriggerBlock(MR100|SIEvocation|Enemy|MagicMissile|L1safe) <-- MinorGlobe|SpellTurn
StateCheck(scstarget,STATE_MIRRORIMAGE)
Allegiance(Myself,ENEMY)
THEN DO
Action(Spell,WIZARD_MAGIC_MISSILE)
END

MirrorImages cant be hit if the target is protected with spellprotections.

 

//////////////////////////////////////////////////////////////////////////
/// At this point we put flame arrows, magic missiles and Melfs into PCs
//////////////////////////////////////////////////////////////////////////

not sure if the 5 blocks below this are in use anyway, but they lack the proper SIConjuration/SIEvocation and MirrorImage (melf/flamearrow)

TriggerBlock(MR100|SpellTurn|MinorGlobe|L1safe|MagicMissile|ResistMagicDamage)

many level 1-2 spells got this trigger

L1safe/L2safe means "!HasItemEquiped("misc73",scstarget)" but just equip the Horn of Kazgaroth dont makes me immune.

 

and add the resist acid check in the main, thus it looks like this:
TriggerBlock(MR100|SIConjuration|MirrorImage|MinorGlobe|ArrowSafe|SpellTurn|Enemy|ResistAcid)

 

I guess almost all Melfs acid arrow Blocks miss the acid trigger. e.g. all dragons in \dragon\ssl

but i think it should be better check for 100 Resist Aciddamage instead of 50. because it can still interrupt spellcasting.

dont know how it works in BGEE without TobEx, does it always interrupt spellcasting?

Link to comment

/// At this point we put flame arrows, magic missiles and Melfs into PCs

I'm not sure about this. Maybe it's intentional, I left it alone.

 

TriggerBlock(MR100|SpellTurn|MinorGlobe|L1safe|MagicMissile|ResistMagicDamage)

many level 1-2 spells got this trigger

L1safe/L2safe means "!HasItemEquiped("misc73",scstarget)" but just equip the Horn of Kazgaroth dont makes me immune.

 

No, it doesn't.. afaik Horn cannot even be "equiped", it's "used". For SR needs I've changed it into plat13 (Gorgon plate). I don't know how Horn works tbh. If we agree this is wrong, the simplest way of fixing it is to remove the misc73 entry from library file, not changing every script which includes it.
and add the resist acid check in the main, thus it looks like this:
TriggerBlock(MR100|SIConjuration|MirrorImage|MinorGlobe|ArrowSafe|SpellTurn|Enemy|ResistAcid)

I guess almost all Melfs acid arrow Blocks miss the acid trigger. e.g. all dragons in \dragon\ssl

but i think it should be better check for 100 Resist Aciddamage instead of 50. because it can still interrupt spellcasting.

dont know how it works in BGEE without TobEx, does it always interrupt spellcasting?

Yeah, it always disrupts casting. What's better and what's not imo isn't really for us to decide. I mentioned this because ResistMagicDamage is clearly wrong, and it seems that here should be an "usual" Acid resist block.
Link to comment

But from a merely rational standpoint there is no excuse for the AI to know what protections the player has so I find hard to defend a "I disagree" position. The AI cheats. The one round "delay" is simply a "I let the AI wait one round before I start cheating" because there is no causal effect between waiting one round and gaining knowledge of the player's protection.

I'm puzzled why you think this is impossible to defend (whether or not you agree with the defence) as I have defended it to you several times before. But for the benefit of third parties:

 

Suppose (say) that you have a ring giving immunity to Magic Missile. There are two undesirable possibilities:

(1) the wizard never casts MM at you at all, despite not clearly having a way to know about your ring;

(2) the wizard casts MM at you multiple times, even though it's obvious after the first casting that you are immune.

 

I regard (2) as much worse than (1), because it breaks immersion (and avoiding immersion-breaking is SCS's #1 priority). There are lots of reasons that someone might not cast MM at you; there are no plausible reasons why they will keep casting it at you even though they can see that you are immune. (And (2) will happen quite a lot if items can't be detected; just because of how IE scripting works: ultimately, a script is a list of instructions, and the engine goes down the list and executes the first one that fits.)

 

Can both (1) and (2) be avoided? Well, the ideal would be for the script to notice your immunity only after the first time the spell is cast. That's not impossible, but it's fairly expensive in script length and I'm already pushing the edge of what the engine can cope with. (SCS scripts are typically - literally - 100 times the length of their vanilla counterparts.) My "detect after 1 round" is a crude approximation: it at least ensures that for the first spell cast on you the caster doesn't know about your protections. It's somewhat experimental at present and is implemented only for some creatures (*not* including mages).

 

I was under the impression that the AI wouldn't detect any kind of immunity or resistance granted by all equipped items.

It doesn't detect the item itself but it does detect its effects on your ability scores, which includes saving throws and resistances. (And no, that's not going to change in future versions: being able just to look at your Fire Resistance is a major saving of script length relative to having to check individually for all the various spells, items and innate abilities that increase fire resistance, and as I say, I don't have script length to spare.)

 

 

It can detect resistances, kits, spell protections, and whatever it's told to detect.

I don't really know if you can extend the delay.

Not readily. I might look at letting the ini control it when (don't hold your breath) I do v29; until then, it's only affecting a relatively small number of effects anyway. (It's actually of somewhat variable length for different creatures.)
Link to comment

 

I'm puzzled why you think this is impossible to defend (whether or not you agree with the defence) as I have defended it to you several times before. But for the benefit of third parties:

 

Suppose (say) that you have a ring giving immunity to Magic Missile. There are two undesirable possibilities:

(1) the wizard never casts MM at you at all, despite not clearly having a way to know about your ring;

(2) the wizard casts MM at you multiple times, even though it's obvious after the first casting that you are immune.

 

I regard (2) as much worse than (1), because it breaks immersion (and avoiding immersion-breaking is SCS's #1 priority). There are lots of reasons that someone might not cast MM at you; there are no plausible reasons why they will keep casting it at you even though they can see that you are immune. (And (2) will happen quite a lot if items can't be detected; just because of how IE scripting works: ultimately, a script is a list of instructions, and the engine goes down the list and executes the first one that fits.)

 

The part that I find hard to defend is not the rationale for choosing to have the AI cheat (because that is what it does, in my opinion - and kreso who shares your same conviction, agrees). I understand perfectly why you chose to do it and why some people think it's necessary.

 

What I find hard to defend is the fact that the AI would consistently learn about immunity or resistances without a valid reason if not other to optimize the efficiency of their arsenal of spells.

 

I can't buy the "There are lots of reasons that someone might not cast MM at me" because I can argue that there are plenty of reasons why a mage keep on casting MM or Fireball against me too even if the first 2 attempts fail. Perhaps he thinks I might have some temporary immunity that is going to expire soon. Perhaps it's the only spell left in their spellbook. Perhaps he is not very lucid because of some personal affliction. And so on...

 

To summarize: having the AI misuse their spells breaks immersion by generally behaving unintelligently in some situations. But having the AI magically learn about my protections and act on that knowledge every time (1) still breaks immersion because it's unrealistic and (2) is cheating.

 

One evil is better than two.

Link to comment

@Kreso: yes, in principle, but you'd have to code it, and it means mucking with the core function library. Look at stratagems/sfo/general/lib_general.tpa, in the compile_ssl_to_bcs_core function. (& bear in mind that I'll probably revert it when I get around to doing v29, as I'm possessive about that function library - though I might externalise library choice while I'm at it.)

 

Incidentally, you do know that the library file is mostly auto-generated?

 

Also, if you're adding SR-friendly code via Require/Ignore, keep a good documentation of what you're doing, as I'll consider including it.

 

@Salk: forgive me, but those are fairly silly reasons someone might keep casting MM at you. You wouldn't do it yourself, after all. (And "it's their last spell" isn't persuasive given that it usually *isn't* their last spell.) But beyond that, this is an old argument that I suspect we won't make progress with.

 

@all: if someone could in due course organize these various fixes into a coherent list, I'd appreciate it. (No rush; I'm expecting to come back to this around December with luck, though who knows if it'll be sooner or later.)

Link to comment

@Salk: forgive me, but those are fairly silly reasons someone might keep casting MM at you. You wouldn't do it yourself, after all. (And "it's their last spell" isn't persuasive given that it usually *isn't* their last spell.) But beyond that, this is an old argument that I suspect we won't make progress with.

 

DavidW,

 

I agree completely. Those are fairly silly reasons (except the first - an immunity can indeed be temporary in the game. It is a fact.) just like I found silly the reasons you provided for the AI to know in advance what kind of protections my party have.

Link to comment

@Kreso: yes, in principle, but you'd have to code it, and it means mucking with the core function library. Look at stratagems/sfo/general/lib_general.tpa, in the compile_ssl_to_bcs_core function. (& bear in mind that I'll probably revert it when I get around to doing v29, as I'm possessive about that function library - though I might externalise library choice while I'm at it.)

Thank you, you're a true benefactor. I'll see what I can do about it then.

 

 

Incidentally, you do know that the library file is mostly auto-generated?

 

Also, if you're adding SR-friendly code via Require/Ignore, keep a good documentation of what you're doing, as I'll consider including it.

Will do. What I meant to do was if SR is detected, install would read from a different library, not library.ssl but let's call is srlibrary.ssl.

This would have a rather neat effect - much of the added code would simply be autogenerated, and I'd have much less work. :)

No, I didn't.

 

 

@all: if someone could in due course organize these various fixes into a coherent list, I'd appreciate it. (No rush; I'm expecting to come back to this around December with luck, though who knows if it'll be sooner or later.)

Mad Mate is already documenting every single change we here post about, both file/line number/reason why it's changed, and who proposed it. It's fairly important to keep track of such stuff.

Link to comment

snip

Thanks!

Added all, except

// correct the Guarded-Compound summonings

LAF swap_text STR_VAR files=kettaatk.bcs swaps=~ForceSpell(LastTrigger(Myself),WIZARD_SUMMON_FIEND)=>ForceSpellRES("dw#sumgl",LastTrigger(Myself))~ END

Not sure, what to do here? What to change?

 

-initial\initial.tpa (line 441) add

END ELSE BEGIN

LAF run STR_VAR file=beholder_pnp_antimagic locbase=beholder END

Reason: compatibility with Spell Revisions v4, because SCS skips Spell Shield Patch if you have SR4 installed, but patch includes important tpa for beholders to work

Ummm....what did you do here? I do know SCS skips that, but SRv4 hasn't fixed spell shield (yet). Thus one has to either comment out SR marker or SCS check for SRv4, until SR does include Spell Shield fix. If SRv4 isn't installed (or SCS thinks it isn't) this won't break anything, right?

 

You are right. This doesn't break anything, but it isn't full fix, 'cause Spell Shield Patch must be processed to use new beholder pnp antimagic ray, anyway. I'll remove it. It is better that, for now, SR4 users comment out SR4 marker, until official SR4 is released. Than we'll see what to do.

Speaking of golems and statues — there's a similar encounter in Durlag's tower, iirc all creatures there are 'golems' (so they can't use potions etc), but they still can cast spells and such.

I checked this, and found out that DavidW already changed chess pieces from BG1 to golem, and queen is a mage, and still could cast spells. So I changed rest of the statues to golems. Thanks!

Link to comment

 

@Salk: forgive me, but those are fairly silly reasons someone might keep casting MM at you. You wouldn't do it yourself, after all. (And "it's their last spell" isn't persuasive given that it usually *isn't* their last spell.) But beyond that, this is an old argument that I suspect we won't make progress with.

DavidW,

 

I agree completely. Those are fairly silly reasons (except the first - an immunity can indeed be temporary in the game. It is a fact.) just like I found silly the reasons you provided for the AI to know in advance what kind of protections my party have.

 

Please respond to the argument I made, not the argument you think I should make. I *did not give* any reasons. I said "There are lots of reasons that someone might not cast MM at you". If you seriously want to maintain that *there are no reasons* someone might not use a particular spell at a particular target that aren't as silly as the reasons you give for repeatedly attacking a clearly-immune adversary, there's not a lot I can say that will help. (I find myself slightly regretting spending a nontrivial amount of time coding the .ini alternative specifically for your benefit if you are going to be this ridiculous.)

 

(Incidentally: protections expire, but those that expire are almost all clearly visible with in-game-accessible signals.)

Link to comment

All Mages/Priest are using Spwi898 (WIZARD_NPC_SYMBOL_FEAR), but both Mage-Cleric Sendai versions gets Sppr718.

 

Caster_shared\Clericmage\clericmage.tpa

ACTION_IF refinements=1 BEGIN
OUTER_SPRINT $patch_data(add_spells') ~IMPRISONMENT SPELL_TRAP POWER_WORD_KILL UNHOLY_WORD CLERIC_SYMBOL_STUN CLERIC_GATE AEGIS DRAGONS_BREATH SUMMON_PLANATAR_EVIL UNION DIVINE_SHELL IMPLOSION STORM_OF_VENGEANCE AURA_OF_FLAMING_DEATH IMPROVED_ALUCRITY~
END ELSE BEGIN
OUTER_SPRINT $patch_data(add_spells') ~ABSOLUTE_IMMUNITY SPELL_TRAP IMPRISONMENT UNHOLY_WORD CLERIC_SYMBOL_STUN(2) COMET DRAGONS_BREATH SUMMON_PLANATAR_EVIL AURA_OF_FLAMING_DEATH IMPLOSION IMPROVED_ALUCRITY STORM_OF_VENGEANCE~

 

should be changed in

END ELSE BEGIN
OUTER_SPRINT $patch_data(add_spells') ~ABSOLUTE_IMMUNITY SPELL_TRAP IMPRISONMENT UNHOLY_WORD WIZARD_NPC_SYMBOL_STUN(2) COMET DRAGONS_BREATH SUMMON_PLANATAR_EVIL AURA_OF_FLAMING_DEATH IMPLOSION IMPROVED_ALUCRITY STORM_OF_VENGEANCE~

at both Sendais in this File.

 

 

drow\drow.tpa

// the drow ambush on the bridge. We'll keep to the assumption that it's not got any uber-powerful creatures in,
// but we'll up the numbers by adding secondary priests, more fighters, and the mage who looks as if he was
// forgotten about, and we'll give the drow fighters some reasonable ability scores

MAKE_PATCH
add_items=>helmnoan
str=>17
dex=>19
END
LAF edit_creature STR_VAR creature=~uddrow27 uddrow28~ edits=patch_data END

LAF edit_creature STR_VAR creature=uddrow30 editstring=~add_items=>dwchan01~ END

LAF swap_text STR_VAR files=cut44a.bcs
swaps=~CreateCreatureDoor("uddrow27",\[4099.1668\],0)=>CreateCreatureDoor("uddrow27",[4099.1668],0)CreateCreatureDoor("uddrow27",[4115.1616],0)
CreateCreatureDoor("uddrow28",\[3945.1915\],8)=>CreateCreatureDoor("uddrow28",[3945.1915],8)CreateCreatureDoor("uddrow28",[4064.1624],0)
CreateCreatureDoor("uddrow29",\[4094.1632\],0)=>CreateCreatureDoor("uddrow29",[4094.1632],8)CreateCreatureDoor("uddrow29",[4014.1620],0)
CreateCreatureDoor("uddrow29",\[3893.1944\],8)=>CreateCreatureDoor("uddrow29",[3893.1944],8)CreateCreatureDoor("uddrow29",[4197.1675],0)
CreateCreatureDoor("uddrow31",\[3914.1875\],8)=>CreateCreatureDoor("uddrow31",[3914.1875],8)CreateCreatureDoor("drow04",[3799.2008],8)CreateCreatureDoor("uddrow30",[4201.1639],8)~
END

improved Drow Ambush in my scs28 install that dosent work it seems, no clue why.

in scs21 cut44a.bcs is expanded correctly, it should look like

IF
True()
THEN
RESPONSE #100
CutSceneId(Player1)
CreateVisualEffect("spdimndr",[4099.1668])
Wait(1)
CreateCreature("uddrow27",[4099.1668],0)
CreateVisualEffect("spdimndr",[4115.1616])
Wait(1)
CreateCreature("uddrow27",[4115.1616],0)
CreateVisualEffect("spdimndr",[3945.1915])
Wait(1)
CreateCreature("uddrow28",[3945.1915],8)
CreateVisualEffect("spdimndr",[4064.1624])
Wait(1)
CreateCreature("uddrow28",[4064.1624],0)
CreateVisualEffect("spdimndr",[4094.1632])
Wait(1)
CreateCreature("uddrow29",[4094.1632],8)
CreateVisualEffect("spdimndr",[4014.1620])
Wait(1)
CreateCreature("uddrow29",[4014.1620],0)
CreateVisualEffect("spdimndr",[3893.1944])
Wait(1)
CreateCreature("uddrow29",[3893.1944],8)
CreateVisualEffect("spdimndr",[4197.1675])
Wait(1)
CreateCreature("uddrow29",[4197.1675],0)
CreateVisualEffect("spdimndr",[3914.1875])
Wait(1)
CreateCreature("uddrow31",[3914.1875],8)
CreateVisualEffect("spdimndr",[3799.2008])
Wait(1)
CreateCreature("drow04",[3799.2008],8)
CreateVisualEffect("spdimndr",[4201.1639])
Wait(1)
CreateCreature("uddrow30",[4201.1639],8)
Wait(4)
EndCutSceneMode()
END

 

But in my scs28 install cut44a keeps vanilla.

 

 

another strange Thing..

 

spell\insect_plague.tpa

ACTION_DEFINE_ASSOCIATIVE_ARRAY insect_plague_patch BEGIN // note that, for reasons that escape me, opcodes 216 and 206 must PRECEDE 232
clone_effect_inline=>~match=>"opcode=232"
opcode=>206
parameter1=>0
number_to_add=>2
resource=>"entry_index from [sppr517a sppr717a]~
clone_effect_inline'=>~match=>"opcode=232"
opcode=>221
parameter1=>10
parameter2=>%Insects%
resource=>null~
END
END

In my Install. I had to do that green part manually in NearInfinity. (cut out the "Spell on Condition (232)" effect and past it at the end) in all the Fireshield spells (spwi403,spwi418,dw#0w403,dw#0w418,dw#sw403,dw#sw418,sppr730,dw#sp730) otherwise Fireshield will not stop or protect against Insectspells. again no clue why.

 

Not sure, what to do here? What to change?

 

the intention for this seems to let the guarded-compount Trap summon a enemy alignment Glabrezu like enemy mages did. if u exclude that whole part, at least a Glabrezu appear but he might show some strange behavior.

for me i changed dw#sumgl with a homemade spell that calls a scs Glabrezu.

Link to comment

Please respond to the argument I made, not the argument you think I should make. I *did not give* any reasons. I said "There are lots of reasons that someone might not cast MM at you". If you seriously want to maintain that *there are no reasons* someone might not use a particular spell at a particular target that aren't as silly as the reasons you give for repeatedly attacking a clearly-immune adversary, there's not a lot I can say that will help. (I find myself slightly regretting spending a nontrivial amount of time coding the .ini alternative specifically for your benefit if you are going to be this ridiculous.)

(Incidentally: protections expire, but those that expire are almost all clearly visible with in-game-accessible signals.)

 

 

I politely ask you to not resort to insults.

 

You are saying there are lots of reasons why someone might not cast MM at you. You don't provide any and that is an argument? There can be only a valid reason for it: AI tries to use a spell at least once and it doesn't work. Your AI takes the shortcut by cheating and skipping that mandatory step. I don't think there is much more to add so I won't continue this debate.

 

I am sorry you feel regret for working on the .ini customization specifically for my benefit. I can only hope I am not the only one using it.

Link to comment

I politely ask you to not resort to insults.

 

"Ridiculous" (the only word I used that even might count as an insult) is a straight description of an action, just as "cheating" (your word, and at least as loaded) is. You are being hypocritical. I'm usually less forceful but I am offended when you make claims (that I have said things I have not said) that are flatly untrue.

 

You are saying there are lots of reasons why someone might not cast MM at you. You don't provide any and that is an argument?

 

I had thought it was so obvious not to need saying but if you really insist, here are some reasons why someone might not wish to cast MM at you:

(1) because they decided to cast Fireball at you instead

(2) because they decided to cast Acid Arrow at you instead

(3) because they decided to cast Hold Person at you instead

(4) because they decided to cast Magic Missile at Khalid instead

(5) because they decided to cast Magic Missile at Jaheira instead

(6) because they decided to attack in melee instead

 

Etc, etc,etc.

 

You may want to say that that isn't the real reason. But there are no real reasons. Or rather, the real reason an NPC in BG does anything is because that thing is the action condition of the first block in their script whose conditions are satisfied, period. BG AI -like any game AI - is about *pretending* to be a real intelligent being, not actually being one. The pretence is successful if each action the AI takes is a plausible action for a real intelligent being to take. Item autodetection, while not ideal, does basically achieve that: there are so many options available to a spell caster that it is virtually certain that not casting some particular spell at some particular person will not in itself be unrealistic, provided that they choose one of the many other sensible options available to them. Item non detection, on the other hand, is guaranteed to lead with some frequency to the pretence failing, when the AI does something absurd.

Link to comment

Archived

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

×
×
  • Create New...