Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New component: More Sensible Cowled Wizards #115

Merged
merged 6 commits into from
Jan 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cdtweaks/languages/english/weidu.tra
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,8 @@ Use Baldur.lua options: a7_interval_ini
@341100 = ~Mage, priest, and innate spells only~
@341200 = ~All spells (check readme)~

@342000 = "More Sensible Cowled Wizards [Luke (EEex)]"

/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
///// \\\\\
Expand Down
2 changes: 2 additions & 0 deletions cdtweaks/languages/italian/weidu.tra
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,8 @@ Usa opzioni di Baldur.lua: a7_interval_ini

@336000 = ~Ripristina la nebbia di guerra nei sotterranei di Sigil~

@342000 = "Gli Stregoni Incappucciati reagiranno in maniera più sensata all'uso della magia senza licenza [Luke (EEex)]"

/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
///// \\\\\
Expand Down
15 changes: 15 additions & 0 deletions cdtweaks/lib/comp_3420.tpa
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\////\\\\////
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\////\\\\////
///// \\\\\////\\\\////
///// More Sensible Cowled Wizards \\\\\
///// \\\\\////\\\\////
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\////\\\\////
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\////\\\\////

WITH_SCOPE BEGIN
INCLUDE "cdtweaks\luke\misc.tph"
//
INCLUDE "cdtweaks\lib\cowled_wizards.tph"
//
LAF "COWLED_WIZARDS" END
END
53 changes: 53 additions & 0 deletions cdtweaks/lib/cowled_wizards.tph
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
DEFINE_ACTION_FUNCTION "COWLED_WIZARDS"
BEGIN
// patch relevant area scripts \\
WITH_SCOPE BEGIN
COPY_EXISTING
"ar0020.bcs" "override" // City Gates
"ar0300.bcs" "override" // The Docks
"ar0400.bcs" "override" // Slums
"ar0500.bcs" "override" // Bridge District
"ar0700.bcs" "override" // Waukeen's Promenade
"ar0900.bcs" "override" // Temple District
"ar1000.bcs" "override" // Government District
//
DECOMPILE_AND_PATCH BEGIN
// first relevant block
SET "found" = INDEX_BUFFER (CASE_SENSITIVE EXACT_MATCH ~CreateCreatureObjectDoor("COWENF2",LastTrigger,0,0,0)~)
//
PATCH_IF ("%found%" >= 0) BEGIN
SET "start" = RINDEX_BUFFER (CASE_SENSITIVE EXACT_MATCH ~SpellCast([PC],0)~ "%found%")
SET "end" = INDEX_BUFFER (CASE_INSENSITIVE EVALUATE_REGEXP ~$~ "%start%")
//
DELETE_BYTES "%start%" ("%end%" - "%start%")
//
INSERT_BYTES "%start%" STRING_LENGTH ~Global("gt_CowledWizardsTriggered","GLOBAL",1)~
WRITE_ASCII "%start%" ~Global("gt_CowledWizardsTriggered","GLOBAL",1)~
//
SET "found" = INDEX_BUFFER (CASE_SENSITIVE EXACT_MATCH ~CreateCreatureObjectDoor("COWENF2",LastTrigger,0,0,0)~)
INSERT_BYTES "%found%" STRING_LENGTH ~SetGlobal("gt_CowledWizardsTriggered","GLOBAL",0)~
WRITE_ASCII "%found%" ~SetGlobal("gt_CowledWizardsTriggered","GLOBAL",0)~
END
// second relevant block
SET "found" = INDEX_BUFFER (CASE_SENSITIVE EVALUATE_REGEXP ~[ %TAB%]*GlobalTimerNotExpired("SpellsBad","GLOBAL")~)
//
PATCH_IF ("%found%" >= 0) BEGIN
SET "start" = RINDEX_BUFFER (CASE_SENSITIVE EXACT_MATCH ~SpellCast([PC],0)~)
SET "end" = INDEX_BUFFER (CASE_INSENSITIVE EVALUATE_REGEXP ~$~ "%start%")
//
DELETE_BYTES "%start%" ("%end%" - "%start%")
//
INSERT_BYTES "%start%" STRING_LENGTH ~Global("gt_CowledWizardsTriggered","GLOBAL",1)~
WRITE_ASCII "%start%" ~Global("gt_CowledWizardsTriggered","GLOBAL",1)~
//
SET "found" = INDEX_BUFFER (CASE_SENSITIVE EXACT_MATCH ~Wait(1)~ "%start%")
INSERT_BYTES "%found%" STRING_LENGTH ~SetGlobal("gt_CowledWizardsTriggered","GLOBAL",0)~
WRITE_ASCII "%found%" ~SetGlobal("gt_CowledWizardsTriggered","GLOBAL",0)~
END
END
BUT_ONLY_IF_IT_CHANGES
END
// lua
LAF "APPEND_LUA_FUNCTION" STR_VAR "description" = "Utility" "sourceFileSpec" = "cdtweaks\luke\lua\utility\decode_spell.lua" "destRes" = "m_gtutil" END
LAF "APPEND_LUA_FUNCTION" STR_VAR "description" = "Misc Tweaks" "sourceFileSpec" = "cdtweaks\luke\lua\tweaks\cowled_wizards.lua" "destRes" = "m_gttwks" END
END
118 changes: 118 additions & 0 deletions cdtweaks/luke/lua/tweaks/cowled_wizards.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
--[[
+----------------------------------------+
| cdtweaks, more sensible cowled wizards |
+----------------------------------------+
--]]

-- set a GLOBAL var when a PC casts a wizard spell and is in Athkatla --

GTCOWENF = {

["typeMutator"] = function(context)
local actionSources = {
[EEex_Projectile_DecodeSource.CGameSprite_Spell] = true,
[EEex_Projectile_DecodeSource.CGameSprite_SpellPoint] = true,
[EEex_Projectile_DecodeSource.CGameAIBase_ForceSpell] = true,
[EEex_Projectile_DecodeSource.CGameAIBase_ForceSpellPoint] = true,
}
--
if not actionSources[context.decodeSource] then
return
end
end,

["projectileMutator"] = function(context)
local actionSources = {
[EEex_Projectile_DecodeSource.CGameSprite_Spell] = true,
[EEex_Projectile_DecodeSource.CGameSprite_SpellPoint] = true,
[EEex_Projectile_DecodeSource.CGameAIBase_ForceSpell] = true,
[EEex_Projectile_DecodeSource.CGameAIBase_ForceSpellPoint] = true,
}
--
if not actionSources[context.decodeSource] then
return
end
--
local originatingSprite = context["originatingSprite"] -- CGameSprite
--
local areaCheck = EEex_Trigger_ParseConditionalString('OR(7) \n AreaCheck("AR0020") AreaCheck("AR0300") AreaCheck("AR0400") AreaCheck("AR0500") AreaCheck("AR0700") AreaCheck("AR0900") AreaCheck("AR1000")')
--
local spellResRef = originatingSprite.m_curAction.m_string1.m_pchData:get()
if spellResRef == "" then
spellResRef = GT_Utility_DecodeSpell(originatingSprite.m_curAction.m_specificID)
end
--
local spellHeader = EEex_Resource_Demand(spellResRef, "SPL")
--
if spellHeader.itemType == 1 and areaCheck:evalConditionalAsAIBase(originatingSprite) then -- if wizard spell and in Athkatla ...
EEex_GameState_SetGlobalInt("gt_CowledWizardsTriggered", 1)
end
--
areaCheck:free()
end,

["effectMutator"] = function(context)
local actionSources = {
[EEex_Projectile_AddEffectSource.CGameSprite_Spell] = true,
[EEex_Projectile_AddEffectSource.CGameSprite_SpellPoint] = true,
[EEex_Projectile_AddEffectSource.CGameAIBase_ForceSpell] = true,
[EEex_Projectile_AddEffectSource.CGameAIBase_ForceSpellPoint] = true,
}
--
if not actionSources[context.addEffectSource] then
return
end
end,
}

--

EEex_Opcode_AddListsResolvedListener(function(sprite)
-- Sanity check
if not EEex_GameObject_IsSprite(sprite) then
return
end
-- internal function that applies the actual condition
local apply = function()
-- Mark the creature as 'condition applied'
sprite:setLocalInt("cdtweaksCowledWizards", 1)
--
local effectCodes = {
{["op"] = 321}, -- Remove effects by resource
{["op"] = 408}, -- Projectile mutator
}
--
for _, attributes in ipairs(effectCodes) do
sprite:applyEffect({
["effectID"] = attributes["op"] or EEex_Error("opcode number not specified"),
["durationType"] = 9,
["res"] = "GTCOWENF",
["m_sourceRes"] = "GTCOWENF",
["sourceID"] = sprite.m_id,
["sourceTarget"] = sprite.m_id,
})
end
end
-- Check creature's EA
local applyCondition = sprite.m_typeAI.m_EnemyAlly == 2 -- PC
--
if sprite:getLocalInt("cdtweaksCowledWizards") == 0 then
if applyCondition then
apply()
end
else
if applyCondition then
-- do nothing
else
-- Mark the creature as 'condition removed'
sprite:setLocalInt("cdtweaksCowledWizards", 0)
--
sprite:applyEffect({
["effectID"] = 321, -- Remove effects by resource
["res"] = "GTCOWENF",
["sourceID"] = sprite.m_id,
["sourceTarget"] = sprite.m_id,
})
end
end
end)
6 changes: 6 additions & 0 deletions cdtweaks/readme-cdtweaks.html
Original file line number Diff line number Diff line change
Expand Up @@ -1361,6 +1361,12 @@ <h3> <a id="contents_convenience" name="contents_convenience"></a>Convenience Tw
<li><em>Mage, priest, and innate spells</em> - as above, but adds spells traditionally in the innate and kit ability space such as Lay on Hands or Boon of Lathander</li>
<li><em>All spells</em> - because the game uses spells to perform a lot of different functions, such as traps or cutscene effects,this option may provide more feedback than desired or expose purely internal spell names such as &quot;just 10 damage&quot;. It is, however, the best way to guarantee that all spells from mods are caught</li>
</ul>

<p> <strong>More Sensible Cowled Wizards</strong><br />
<em><abbr title="Baldur's Gate: Enhanced Edition">EEex</abbr></em></p>
<p>As you probably know, party items that cast spell effects that are coded as "Wizard" spells can trigger the Cowled Wizards - even if the player didn't intend to actually cast an ordinary wizard spell.
This component simply makes sure that such items do not trigger the Cowled Wizards.
</p>
</div>
<div class="ribbon_rectangle_h3">
<h3> <a id="contents_npc" name="contents_npc"></a>Joinable <abbr title="Non-Player Character">NPC</abbr> Tweaks </h3>
Expand Down
14 changes: 14 additions & 0 deletions cdtweaks/setup-cdtweaks.tp2
Original file line number Diff line number Diff line change
Expand Up @@ -4420,6 +4420,20 @@ GROUP @4
SUBCOMPONENT @341000
LABEL ~cd_tweaks_casting_warnings_all~

/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
///// \\\\\
///// More Sensible Cowled Wizards \\\\\
///// \\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\

BEGIN @342000 DESIGNATED 3420
GROUP @4
REQUIRE_PREDICATE GAME_IS ~bg2ee eet~ @25
REQUIRE_PREDICATE MOD_IS_INSTALLED "EEex.tp2" 0 @29
LABEL ~cd_tweaks_more_sensible_cowled_wizards~

/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\
///// \\\\\
Expand Down