162 lines
6.9 KiB
Plaintext
162 lines
6.9 KiB
Plaintext
#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;
|
|
}
|
|
|