2025/07/18 Update
Added PEPS. Full compile.
This commit is contained in:
161
_module/nss/mm_prc_spells.nss
Normal file
161
_module/nss/mm_prc_spells.nss
Normal file
@@ -0,0 +1,161 @@
|
||||
#include "0i_menus"
|
||||
// Does startup check if the game has just been loaded.
|
||||
int StartingUp(object oPC);
|
||||
json ai_CheckToReplaceSpell(json jSpellList, int nClass, int nLevel, int nSlot)
|
||||
{
|
||||
//if(d100() > 49) return jSpellList;
|
||||
string sSpellTableColumn = Get2DAString("classes", "SpellTableColumn", nClass);
|
||||
int nRoll = d10() + 1 + nLevel * 10;
|
||||
int nSpell = StringToInt(Get2DAString("prc_add_spells", sSpellTableColumn, nRoll));
|
||||
if(nSpell > 0)
|
||||
{
|
||||
//WriteTimestampedLogEntry("mm_prc_spells, 13 nSpell: " + IntToString(nSpell) +
|
||||
// " nLevel: " + IntToString(nLevel) + " nSlot: " + IntToString(nSlot));
|
||||
json jSpellArray = JsonArrayGet(jSpellList, nSlot);
|
||||
json jSpell = JsonObjectGet(jSpellArray, "Spell");
|
||||
jSpell = JsonObjectSet(jSpell, "value", JsonInt(nSpell));
|
||||
jSpellArray = JsonObjectSet(jSpellArray, "Spell", jSpell);
|
||||
return JsonArraySet(jSpellList, nSlot, jSpellArray);
|
||||
}
|
||||
return jSpellList;
|
||||
}
|
||||
void main()
|
||||
{
|
||||
object oPC = OBJECT_SELF;
|
||||
if(StartingUp(oPC)) return;
|
||||
int bChanged, bCreatureChanged, nPosition, nClass, nLevel, nSlot, nMaxSlots;
|
||||
json jClass, jMemorizedList, jKnownList;
|
||||
object oModule = GetModule();
|
||||
json jCreature = GetLocalJson(oModule, AI_MONSTER_JSON);
|
||||
object oCreature = GetLocalObject(oModule, AI_MONSTER_OBJECT);
|
||||
json jClassList = GffGetList(jCreature, "ClassList");
|
||||
while(nPosition <= AI_MAX_CLASSES_PER_CHARACTER)
|
||||
{
|
||||
nClass = GetClassByPosition(nPosition, oCreature);
|
||||
if(Get2DAString("classes", "SpellCaster", nClass) == "1")
|
||||
{
|
||||
//WriteTimestampedLogEntry("mm_prc_spells, 39 " + GetName(oCreature) + JsonDump(jClassList, 4));
|
||||
jClass = JsonArrayGet(jClassList, nPosition - 1);
|
||||
if(Get2DAString("classes", "MemorizesSpells", nClass) == "1")
|
||||
{
|
||||
nLevel = 1;
|
||||
while(nLevel < 9)
|
||||
{
|
||||
jMemorizedList = GffGetList(jClass, "MemorizedList" + IntToString(nLevel));
|
||||
if(JsonGetType(jMemorizedList) != JSON_TYPE_NULL)
|
||||
{
|
||||
nSlot = 0;
|
||||
nMaxSlots = GetMemorizedSpellCountByLevel(oCreature, nClass, nLevel);
|
||||
while(nSlot < nMaxSlots)
|
||||
{
|
||||
jMemorizedList = ai_CheckToReplaceSpell(jMemorizedList, nClass, nLevel, nSlot);
|
||||
nSlot++;
|
||||
}
|
||||
//WriteTimestampedLogEntry("nClass: " + IntToString(nClass) + " nLevel: " + IntToString(nLevel) +
|
||||
// " nSlot: " + IntToString(nSlot) + " jMemorizedList " + JsonDump(jMemorizedList, 4));
|
||||
jClass = GffReplaceList(jClass, "MemorizedList" + IntToString(nLevel), jMemorizedList);
|
||||
bChanged = TRUE;
|
||||
}
|
||||
nLevel++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nLevel = 1;
|
||||
while(nLevel < 9)
|
||||
{
|
||||
jKnownList = GffGetList(jClass, "KnownList" + IntToString(nLevel));
|
||||
if(JsonGetType(jMemorizedList) != JSON_TYPE_NULL)
|
||||
{
|
||||
nSlot = 0;
|
||||
nMaxSlots = GetKnownSpellCount(oCreature, nClass, nLevel);
|
||||
while(nSlot < nMaxSlots)
|
||||
{
|
||||
jKnownList = ai_CheckToReplaceSpell(jKnownList, nClass, nLevel, nSlot);
|
||||
nSlot++;
|
||||
}
|
||||
jClass = GffReplaceList(jClass, "KnownList" + IntToString(nLevel), jKnownList);
|
||||
bChanged = TRUE;
|
||||
}
|
||||
nLevel++;
|
||||
}
|
||||
}
|
||||
if(bChanged)
|
||||
{
|
||||
//WriteTimestampedLogEntry("0i_module, 87 " + GetName(oCreature) + " jClass: " + JsonDump(jClass, 4));
|
||||
jClassList = JsonArraySet(jClassList, nPosition - 1, jClass);
|
||||
//if(AI_DEBUG) ai_Debug("0i_module, 89 " + GetName(oCreature) + " jClassList: " + JsonDump(jClassList, 4));
|
||||
jCreature = GffReplaceList(jCreature, "ClassList", jClassList);
|
||||
bCreatureChanged = TRUE;
|
||||
bChanged = FALSE;
|
||||
}
|
||||
}
|
||||
nPosition++;
|
||||
}
|
||||
if(bCreatureChanged)
|
||||
{
|
||||
//WriteTimestampedLogEntry("mm_prc_spells, 99 " + GetName(oCreature) + " jClassList: " + JsonDump(jClassList, 4));
|
||||
SetLocalJson(oModule, AI_MONSTER_JSON, jCreature);
|
||||
SetLocalInt(oModule, AI_MONSTER_CHANGED, TRUE);
|
||||
}
|
||||
}
|
||||
int PRCSpellsSetup(object oPC)
|
||||
{
|
||||
// Check to make sure prc_add_spells.2da is loaded.
|
||||
if(ResManGetAliasFor("prc_add_spells", RESTYPE_2DA) == "")
|
||||
{
|
||||
SendMessageToPC(oPC, "prc_add_spells.2da is not loaded! Make sure it is in the override or development folder.");
|
||||
return FALSE;
|
||||
}
|
||||
// Check to make sure PRC is loaded.
|
||||
if(!GetLocalInt(GetModule(), AI_USING_PRC))
|
||||
{
|
||||
SendMessageToPC(oPC, "PRC is not being used. PRC must be active for this mod to work.");
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
void SetMonsterModJson(object oPC)
|
||||
{
|
||||
object oModule = GetModule();
|
||||
json jMonsterMods = GetLocalJson(oModule, AI_MONSTER_MOD_JSON);
|
||||
if(JsonGetType(jMonsterMods) == JSON_TYPE_NULL) jMonsterMods = JsonArray();
|
||||
int nIndex;
|
||||
string sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, nIndex));
|
||||
while(sMonsterMod != "")
|
||||
{
|
||||
if(sMonsterMod == "mm_prc_spells") return;
|
||||
sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, ++nIndex));
|
||||
}
|
||||
jMonsterMods = JsonArrayInsert(jMonsterMods, JsonString("mm_prc_spells"));
|
||||
SetLocalJson(oModule, AI_MONSTER_MOD_JSON, jMonsterMods);
|
||||
ai_SendMessages("mm_prc_spells loaded! Monsters will be using PRC spells.", AI_COLOR_YELLOW, oPC);
|
||||
}
|
||||
int StartingUp(object oPC)
|
||||
{
|
||||
if(!PRCSpellsSetup(oPC))
|
||||
{
|
||||
SendMessageToPC(oPC, "mm_prc_spells monster mod has failed to load due to an error.");
|
||||
// Return -1 in AI_PLUGIN_SET to tell PEPS that we failed to load.
|
||||
SetLocalInt(oPC, AI_PLUGIN_SET, -1);
|
||||
return TRUE;
|
||||
}
|
||||
if(GetLocalInt(oPC, AI_ADD_PLUGIN))
|
||||
{
|
||||
json jPlugin = JsonArray();
|
||||
jPlugin = JsonArrayInsert(jPlugin, JsonString("mm_prc_spells"));
|
||||
jPlugin = JsonArrayInsert(jPlugin, JsonInt(3));
|
||||
jPlugin = JsonArrayInsert(jPlugin, JsonString("Monsters will use PRC spells!"));
|
||||
jPlugin = JsonArrayInsert(jPlugin, JsonString(""));
|
||||
json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS);
|
||||
jPlugins = JsonArrayInsert(jPlugins, jPlugin);
|
||||
SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin);
|
||||
SetLocalInt(oPC, AI_PLUGIN_SET, TRUE);
|
||||
SetMonsterModJson(oPC);
|
||||
return TRUE;
|
||||
}
|
||||
if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE;
|
||||
SetMonsterModJson(oPC);
|
||||
return TRUE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user