PRC8/nwn/nwnprc/trunk/racescripts/race_ev_aquire.nss
Jaysyn904 53149108fe Fixed Thrall of Grazzt not getting a marker feat
Fixed Thrall of Grazzt not getting a marker feat.  Fixed TLK error with Elemental Savant marker feat.  Added grey elf to Racial IP list for Elves.  Updated release archive.

All @Barmlot: Added Empty Vessel race.  Fixed Necropolitian name/tlk.  Fixed Incarnum Blade meldshaping.  Fixed Hybsil's Pass Without Trace.  Fixed Kalashtar's Skill Affinity: Persuade.  Fixed missing Marrutact Howl.  Added Immunity to Sleep to Mongrelfolk & removed Charm Animal.  (thanks @barmlot!)
2024-10-22 10:09:54 -04:00

272 lines
10 KiB
Plaintext

/** @file
This handles subraces and race restricted items.
Drow should be able to use Elven only items for example.
*/
#include "prc_racial_const"
#include "prc_alterations"
//#include "psi_inc_manifest"
const string ARRAY_NAME = "PRC_Racial_IPs";
void AddRaceIP(object oItem, int iIP)
{
if(array_get_string(oItem, ARRAY_NAME, iIP) == "")
{
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyLimitUseByRace(iIP), oItem);
array_set_string(oItem, ARRAY_NAME, iIP, "1");
}
}
void AddRacialRestrictions(object oItem)
{
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_ABERRATION) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_DRIDER);
AddRaceIP(oItem, RACIAL_TYPE_ELAN);
AddRaceIP(oItem, RACIAL_TYPE_ILLITHID);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_CONSTRUCT) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_WARFORGED);
AddRaceIP(oItem, RACIAL_TYPE_WARFORGED_CHARGER);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_DRAGON) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_BAAZ);
AddRaceIP(oItem, RACIAL_TYPE_BOZAK);
AddRaceIP(oItem, RACIAL_TYPE_KAPAK);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_DWARF) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_ARC_DWARF);
AddRaceIP(oItem, RACIAL_TYPE_DS_DWARF);
AddRaceIP(oItem, RACIAL_TYPE_DARK_DWARF);
AddRaceIP(oItem, RACIAL_TYPE_DUERGAR);
AddRaceIP(oItem, RACIAL_TYPE_FIREBLOOD_DWARF);
AddRaceIP(oItem, RACIAL_TYPE_GOLD_DWARF);
AddRaceIP(oItem, RACIAL_TYPE_GULLY_DWARF);
AddRaceIP(oItem, RACIAL_TYPE_KOROBKURU);
AddRaceIP(oItem, RACIAL_TYPE_MUL);
AddRaceIP(oItem, RACIAL_TYPE_URDINNIR);
AddRaceIP(oItem, RACIAL_TYPE_WILD_DWARF);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_ELF) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_AQELF);
AddRaceIP(oItem, RACIAL_TYPE_DS_ELF);
AddRaceIP(oItem, RACIAL_TYPE_AVARIEL);
AddRaceIP(oItem, RACIAL_TYPE_DROW_FEMALE);
AddRaceIP(oItem, RACIAL_TYPE_DROW_MALE);
AddRaceIP(oItem, RACIAL_TYPE_FEYRI);
AddRaceIP(oItem, RACIAL_TYPE_FORESTLORD_ELF);
AddRaceIP(oItem, RACIAL_TYPE_KAGONESTI_ELF);
AddRaceIP(oItem, RACIAL_TYPE_SILVANESTI_ELF);
AddRaceIP(oItem, RACIAL_TYPE_SNOW_ELF);
AddRaceIP(oItem, RACIAL_TYPE_SUN_ELF);
AddRaceIP(oItem, RACIAL_TYPE_WILD_ELF);
AddRaceIP(oItem, RACIAL_TYPE_WOOD_ELF);
AddRaceIP(oItem, RACIAL_TYPE_GREY_ELF);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_FEY) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_BROWNIE);
AddRaceIP(oItem, RACIAL_TYPE_GRIG);
AddRaceIP(oItem, RACIAL_TYPE_NIXIE);
AddRaceIP(oItem, RACIAL_TYPE_NYMPH);
AddRaceIP(oItem, RACIAL_TYPE_PIXIE);
AddRaceIP(oItem, RACIAL_TYPE_SATYR);
AddRaceIP(oItem, RACIAL_TYPE_HYBSIL);
AddRaceIP(oItem, RACIAL_TYPE_GLOURA);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_GIANT) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_DS_HALFGIANT);
AddRaceIP(oItem, RACIAL_TYPE_PH_HALFGIANT);
AddRaceIP(oItem, RACIAL_TYPE_HALFOGRE);
AddRaceIP(oItem, RACIAL_TYPE_KRYNN_HOGRE);
AddRaceIP(oItem, RACIAL_TYPE_OGRE);
AddRaceIP(oItem, RACIAL_TYPE_TROLL);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_GNOME) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_FOR_GNOME);
AddRaceIP(oItem, RACIAL_TYPE_ROCK_GNOME);
AddRaceIP(oItem, RACIAL_TYPE_STONEHUNTER_GNOME);
AddRaceIP(oItem, RACIAL_TYPE_DEEP_GNOME);
AddRaceIP(oItem, RACIAL_TYPE_TINK_GNOME);
AddRaceIP(oItem, RACIAL_TYPE_WHISPER_GNOME);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_HUMANOID_GOBLINOID) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_BUGBEAR);
AddRaceIP(oItem, RACIAL_TYPE_GOBLIN);
AddRaceIP(oItem, RACIAL_TYPE_HOBGOBLIN);
AddRaceIP(oItem, RACIAL_TYPE_SUNSCORCH_HOBGOBLIN);
AddRaceIP(oItem, RACIAL_TYPE_TASLOI);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_HALFELF) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_DS_HALFELF);
AddRaceIP(oItem, RACIAL_TYPE_HALFDROW);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_HALFLING) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_DS_HALFLING);
AddRaceIP(oItem, RACIAL_TYPE_DEEP_HALFLING);
AddRaceIP(oItem, RACIAL_TYPE_GHOSTWISE_HALFLING);
AddRaceIP(oItem, RACIAL_TYPE_GLIMMERSKIN_HALFING);
AddRaceIP(oItem, RACIAL_TYPE_KENDER);
AddRaceIP(oItem, RACIAL_TYPE_STRONGHEART_HALFLING);
AddRaceIP(oItem, RACIAL_TYPE_TALLFELLOW_HALFLING);
AddRaceIP(oItem, RACIAL_TYPE_TUNDRA_HALFLING);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_HUMAN) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_AASIMAR);
AddRaceIP(oItem, RACIAL_TYPE_AIR_GEN);
AddRaceIP(oItem, RACIAL_TYPE_IMASKARI);
AddRaceIP(oItem, RACIAL_TYPE_EARTH_GEN);
AddRaceIP(oItem, RACIAL_TYPE_FIRE_GEN);
AddRaceIP(oItem, RACIAL_TYPE_GITHYANKI);
AddRaceIP(oItem, RACIAL_TYPE_GITHZERAI);
AddRaceIP(oItem, RACIAL_TYPE_KALASHTAR);
AddRaceIP(oItem, RACIAL_TYPE_EMPTY_VESSEL);
AddRaceIP(oItem, RACIAL_TYPE_MAENADS);
AddRaceIP(oItem, RACIAL_TYPE_SILVERBROW_HUMAN);
AddRaceIP(oItem, RACIAL_TYPE_KRINTH);
AddRaceIP(oItem, RACIAL_TYPE_SPIRIT_FOLK);
AddRaceIP(oItem, RACIAL_TYPE_TIEFLING);
AddRaceIP(oItem, RACIAL_TYPE_WATER_GEN);
AddRaceIP(oItem, RACIAL_TYPE_XEPH);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_HUMANOID_MONSTROUS) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_CATFOLK);
AddRaceIP(oItem, RACIAL_TYPE_DROMITE);
AddRaceIP(oItem, RACIAL_TYPE_FLIND);
AddRaceIP(oItem, RACIAL_TYPE_GNOLL);
AddRaceIP(oItem, RACIAL_TYPE_KRYNN_MINOTAUR);
AddRaceIP(oItem, RACIAL_TYPE_MINOTAUR);
AddRaceIP(oItem, RACIAL_TYPE_NEZUMI);
AddRaceIP(oItem, RACIAL_TYPE_WEMIC);
AddRaceIP(oItem, RACIAL_TYPE_PURE_YUAN);
AddRaceIP(oItem, RACIAL_TYPE_ARKAMOI);
AddRaceIP(oItem, RACIAL_TYPE_LASHEMOI);
AddRaceIP(oItem, RACIAL_TYPE_TURLEMOI);
AddRaceIP(oItem, RACIAL_TYPE_HADRIMOI);
AddRaceIP(oItem, RACIAL_TYPE_REDSPAWN_ARCANISS);
AddRaceIP(oItem, RACIAL_TYPE_MARRULURK);
AddRaceIP(oItem, RACIAL_TYPE_MARRUSAULT);
AddRaceIP(oItem, RACIAL_TYPE_MARRUTACT);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_HALFORC) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_FROSTBLOOD_ORC);
AddRaceIP(oItem, RACIAL_TYPE_GRAYORC);
AddRaceIP(oItem, RACIAL_TYPE_ORC);
AddRaceIP(oItem, RACIAL_TYPE_OROG);
AddRaceIP(oItem, RACIAL_TYPE_SCRO);
AddRaceIP(oItem, RACIAL_TYPE_TANARUKK);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_OUTSIDER) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_AASIMAR);
AddRaceIP(oItem, RACIAL_TYPE_AIR_GEN);
AddRaceIP(oItem, RACIAL_TYPE_AZER);
AddRaceIP(oItem, RACIAL_TYPE_BARIAUR);
AddRaceIP(oItem, RACIAL_TYPE_BLADELING);
AddRaceIP(oItem, RACIAL_TYPE_BRALANI);
AddRaceIP(oItem, RACIAL_TYPE_BUOMMANS);
AddRaceIP(oItem, RACIAL_TYPE_CHAOND);
AddRaceIP(oItem, RACIAL_TYPE_EARTH_GEN);
AddRaceIP(oItem, RACIAL_TYPE_FEYRI);
AddRaceIP(oItem, RACIAL_TYPE_FIRE_GEN);
AddRaceIP(oItem, RACIAL_TYPE_GITHYANKI);
AddRaceIP(oItem, RACIAL_TYPE_GITHZERAI);
AddRaceIP(oItem, RACIAL_TYPE_HOUND_ARCHON);
AddRaceIP(oItem, RACIAL_TYPE_KHAASTA);
AddRaceIP(oItem, RACIAL_TYPE_NATHRI);
AddRaceIP(oItem, RACIAL_TYPE_NAZTHARUNE_RAKSHASA);
AddRaceIP(oItem, RACIAL_TYPE_NERAPHIM);
AddRaceIP(oItem, RACIAL_TYPE_RAKSHASA);
AddRaceIP(oItem, RACIAL_TYPE_SHADOWSWYFT);
AddRaceIP(oItem, RACIAL_TYPE_TANARUKK);
AddRaceIP(oItem, RACIAL_TYPE_TIEFLING);
AddRaceIP(oItem, RACIAL_TYPE_TULADHARA);
AddRaceIP(oItem, RACIAL_TYPE_WATER_GEN);
AddRaceIP(oItem, RACIAL_TYPE_ZAKYA_RAKSHASA);
AddRaceIP(oItem, RACIAL_TYPE_ZENYRTHRI);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_PLANT) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_VOLODNI);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_HUMANOID_REPTILIAN) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_ASABI);
AddRaceIP(oItem, RACIAL_TYPE_DRAGONKIN);
AddRaceIP(oItem, RACIAL_TYPE_KOBOLD);
AddRaceIP(oItem, RACIAL_TYPE_LIZARDFOLK);
AddRaceIP(oItem, RACIAL_TYPE_POISON_DUSK);
AddRaceIP(oItem, RACIAL_TYPE_PTERRAN);
AddRaceIP(oItem, RACIAL_TYPE_VILETOOTH_LIZARDFOLK);
AddRaceIP(oItem, RACIAL_TYPE_MUCKDWELLER);
}
if(array_get_string(oItem, ARRAY_NAME, RACIAL_TYPE_SHAPECHANGER) != "")
{
AddRaceIP(oItem, RACIAL_TYPE_CHANGELING);
AddRaceIP(oItem, RACIAL_TYPE_IRDA);
AddRaceIP(oItem, RACIAL_TYPE_SHIFTER);
AddRaceIP(oItem, RACIAL_TYPE_ARANEA);
}
//clean up
array_delete(oItem, ARRAY_NAME);
}
void main()
{
//object oCreature = GetModuleItemAcquiredBy();
object oItem = GetModuleItemAcquired();
//int nRace = GetRacialType(oCreature);
// Only do this once per item
if(GetLocalInt(oItem, "PRC_RacialRestrictionsExpanded"))
return;
// Ignore tokens and creature items
int nBaseItem = GetBaseItemType(oItem);
string sResRef = GetStringLowerCase(GetResRef(oItem));
if(nBaseItem == BASE_ITEM_CBLUDGWEAPON
|| nBaseItem == BASE_ITEM_CPIERCWEAPON
|| nBaseItem == BASE_ITEM_CREATUREITEM
|| nBaseItem == BASE_ITEM_CSLASHWEAPON
|| nBaseItem == BASE_ITEM_CSLSHPRCWEAP
|| sResRef == "hidetoken"
|| sResRef == "prc_maniftoken")
return;
if(array_exists(oItem, ARRAY_NAME))
array_delete(oItem, ARRAY_NAME);
array_create(oItem, ARRAY_NAME);
SetLocalInt(oItem, "PRC_RacialRestrictionsExpanded", TRUE);
// Loop over all itemproperties, looking for racial restrictions
int bModifyItem = FALSE;
itemproperty ipTest = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ipTest))
{
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE)
{
int nIPRace = GetItemPropertySubType(ipTest);
array_set_string(oItem, ARRAY_NAME, nIPRace, "1");
bModifyItem = TRUE;
}
ipTest = GetNextItemProperty(oItem);
}
if(bModifyItem)
DelayCommand(0.0f, AddRacialRestrictions(oItem));
}