generated from Jaysyn/ModuleTemplate
2026/03/17 Update
Added DMFI components Updated dynamic conversations.
This commit is contained in:
647
src/nss/bg_apply_cv.nss
Normal file
647
src/nss/bg_apply_cv.nss
Normal file
@@ -0,0 +1,647 @@
|
||||
// LordValinar's Scripts - Background Application (12/18/2023)
|
||||
// =============================================================================
|
||||
/*
|
||||
The final process, to take all of the saved settings from character
|
||||
creation and apply them here. (This was to prevent exploits)
|
||||
*/
|
||||
// =============================================================================
|
||||
#include "nwnx_creature"
|
||||
#include "te_afflic_func"
|
||||
#include "lv_inc"
|
||||
#include "inc_persist_loca"
|
||||
#include "te_lang"
|
||||
|
||||
// Ensure the PC Data Object exists; create if missing
|
||||
object EnsurePlayerDataObject(object oPC)
|
||||
{
|
||||
object oItem = GetItemPossessedBy(oPC, "PC_Data_Object");
|
||||
if (!GetIsObjectValid(oItem))
|
||||
{
|
||||
oItem = CreateItemOnObject("pc_data_object", oPC);
|
||||
SendMessageToPC(oPC, "Language data object recreated");
|
||||
WriteTimestampedLogEntry("Language data object recreated");
|
||||
}
|
||||
return oItem;
|
||||
}
|
||||
|
||||
void ApplyProficiencies(object oPC)
|
||||
{
|
||||
object oItem = EnsurePlayerDataObject(oPC);
|
||||
if (!GetIsObjectValid(oItem)) {
|
||||
SendMessageToPC(oPC, "DEBUG: Invalid player data object");
|
||||
return;
|
||||
}
|
||||
|
||||
int iLore = GetSkillRank(SKILL_LORE, oPC, TRUE);
|
||||
int iSpellCraft = GetSkillRank(SKILL_SPELLCRAFT, oPC, TRUE);
|
||||
|
||||
int i = 0;
|
||||
string sSlot;
|
||||
int nFound = 0;
|
||||
|
||||
while (i < 99)
|
||||
{
|
||||
sSlot = "PROFICIENCY_" + (i < 10 ? "0" : "") + IntToString(i);
|
||||
|
||||
int nProficiencyFeat = GetPersistantLocalInt(oPC, sSlot);
|
||||
if (nProficiencyFeat == 0)
|
||||
nProficiencyFeat = GetLocalInt(oItem, sSlot);
|
||||
|
||||
if (nProficiencyFeat > 0)
|
||||
{
|
||||
SendMessageToPC(oPC, "DEBUG: Applying feat " + IntToString(nProficiencyFeat) + " from slot " + sSlot);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, nProficiencyFeat, 1);
|
||||
nFound++;
|
||||
|
||||
if (nProficiencyFeat == PROFICIENCY_ASTROLOGY)
|
||||
{
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_LORE, iLore +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_SPELLCRAFT, iSpellCraft +2);
|
||||
}
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
SendMessageToPC(oPC, "DEBUG: Applied " + IntToString(nFound) + " proficiencies");
|
||||
}
|
||||
|
||||
/* void ApplyProficiencies(object oPC)
|
||||
{
|
||||
object oItem = EnsurePlayerDataObject(oPC);
|
||||
if (!GetIsObjectValid(oItem)) return;
|
||||
|
||||
int iLore = GetSkillRank(SKILL_LORE, oPC, TRUE);
|
||||
int iSpellCraft = GetSkillRank(SKILL_SPELLCRAFT, oPC, TRUE);
|
||||
|
||||
int i = 0;
|
||||
string sSlot;
|
||||
|
||||
// Check all PROFICIENCY_* slots
|
||||
while (i < 99)
|
||||
{
|
||||
sSlot = "PROFICIENCY_" + (i < 10 ? "0" : "") + IntToString(i);
|
||||
|
||||
// Check both persistent and item local variables
|
||||
int nProficiencyFeat = GetPersistantLocalInt(oPC, sSlot);
|
||||
if (nProficiencyFeat == 0)
|
||||
nProficiencyFeat = GetLocalInt(oItem, sSlot);
|
||||
|
||||
// Apply the feat if found
|
||||
if (nProficiencyFeat > 0)
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, nProficiencyFeat, 1);
|
||||
|
||||
if (nProficiencyFeat == PROFICIENCY_ASTROLOGY)
|
||||
{
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_LORE, iLore +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_SPELLCRAFT, iSpellCraft +2);
|
||||
}
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
*/
|
||||
void ApplyBonusLanguages(object oPC)
|
||||
{
|
||||
object oItem = GetItemPossessedBy(oPC, "PC_Data_Object");
|
||||
if (!GetIsObjectValid(oItem)) return;
|
||||
|
||||
int i = 0;
|
||||
string sSlot;
|
||||
|
||||
// Check all LANGUAGE_* slots
|
||||
while (i < 99)
|
||||
{
|
||||
sSlot = "LANGUAGE_" + (i < 10 ? "0" : "") + IntToString(i);
|
||||
|
||||
// Check both persistent and item local variables
|
||||
int nLanguageFeat = GetPersistantLocalInt(oPC, sSlot);
|
||||
if (nLanguageFeat == 0)
|
||||
nLanguageFeat = GetLocalInt(oItem, sSlot);
|
||||
|
||||
// Apply the feat if found
|
||||
if (nLanguageFeat > 0)
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, nLanguageFeat, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(nLanguageFeat)), 1);
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
object oPC = OBJECT_SELF; // from ExecuteScript()
|
||||
object oItem = GetItemPossessedBy(oPC, "PC_Data_Object");
|
||||
int nSubrace = GetLocalInt(oItem, "CC0"); /**/ DeleteLocalInt(oItem, "CC0");
|
||||
int nClass = GetLocalInt(oItem, "CC1"); /**/ DeleteLocalInt(oItem, "CC1");
|
||||
int nBackground = GetLocalInt(oItem, "CC2"); /**/ DeleteLocalInt(oItem, "CC2");
|
||||
int nDeity = GetLocalInt(oItem, "CC3"); /**/ DeleteLocalInt(oItem, "CC3");
|
||||
int nAge = GetLocalInt(oItem, "CC6"); /**/ DeleteLocalInt(oItem, "CC6");
|
||||
int bDisfigured = GetLocalInt(oItem, "CC7"); /**/ DeleteLocalInt(oItem, "CC7");
|
||||
// Stats
|
||||
int iCL = GetHitDice(oPC);
|
||||
int iSTR = GetAbilityScore(oPC, ABILITY_STRENGTH, TRUE);
|
||||
int iDEX = GetAbilityScore(oPC, ABILITY_DEXTERITY, TRUE);
|
||||
int iCON = GetAbilityScore(oPC, ABILITY_CONSTITUTION, TRUE);
|
||||
int iINT = GetAbilityScore(oPC, ABILITY_INTELLIGENCE, TRUE);
|
||||
int iWIS = GetAbilityScore(oPC, ABILITY_WISDOM, TRUE);
|
||||
int iCHA = GetAbilityScore(oPC, ABILITY_CHARISMA, TRUE);
|
||||
// Skills
|
||||
int iHide = GetSkillRank(SKILL_HIDE, oPC, TRUE);
|
||||
int iBluff = GetSkillRank(SKILL_BLUFF, oPC, TRUE);
|
||||
int iSpot = GetSkillRank(SKILL_SPOT, oPC, TRUE);
|
||||
int iListen = GetSkillRank(SKILL_LISTEN, oPC, TRUE);
|
||||
int iLore = GetSkillRank(SKILL_LORE, oPC, TRUE);
|
||||
int iMoveSil = GetSkillRank(SKILL_MOVE_SILENTLY, oPC, TRUE);
|
||||
int iSpellCraft = GetSkillRank(SKILL_SPELLCRAFT, oPC, TRUE);
|
||||
// Effects
|
||||
effect eSpellResist = EffectSpellResistanceIncrease(11+iCL);
|
||||
|
||||
|
||||
// Step 0: Subrace/Ethnicity (some of this might be redundant now)
|
||||
if (nSubrace > 0) NWNX_Creature_AddFeatByLevel(oPC, nSubrace, 1);
|
||||
switch (nSubrace)
|
||||
{
|
||||
case ETHNICITY_TETHYRIAN: case ETHNICITY_CALISHITE:
|
||||
{
|
||||
//SetLocalInt(oItem, "23", 1); // Language: Alzhedo
|
||||
SetPersistantLocalInt(oPC, "23", 1);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ALZHEDO, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ALZHEDO)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_CHONDATHAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "53", 1); // Language: Chondathan
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_CHONDATHAN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_CHONDATHAN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_DAMARAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "56", 1); // Language: Damaran
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_DAMARAN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_DAMARAN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_FFOLK:
|
||||
{ // Talfiric
|
||||
//SetLocalInt(oItem, "38", 1); // Language: Talfiric
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_TALFIRIC, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_DAMARAN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_ILLUSKAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "22", 1); // Language: Illuskan
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ILLUSKAN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ILLUSKAN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_IMASKARI:
|
||||
{ // Imaskari
|
||||
//SetLocalInt(oItem, "24", 1); // Language: Imaskari
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_IMASKARI, 1);
|
||||
//SetLocalInt(oItem, "46", 1); // Language: Undercommon
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_UNDERCOMMON, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_IMASKARI)), 1);
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_UNDERCOMMON)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_MULAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "27", 1); // Language: Mulanese
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_MULANESE, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_MULANESE)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_RASHEMI:
|
||||
{
|
||||
//SetLocalInt(oItem, "30", 1); // Langauge: Rashemi
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_RASHEMI, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_RASHEMI)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_SHAARAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "34", 1); // Language: Shaaran
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_SHAARAN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_SHAARAN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_SHOU:
|
||||
{
|
||||
SetLocalInt(oItem, "35", 1); // Language: Shou (no feat for this one)
|
||||
//NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_SHAARAN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
//SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_SHAARAN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_CHULTAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "31", 1); // Langauge: Chultan
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_CHULTAN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_CHULTAN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_MAZTILAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "32", 1); // Langauge: Maztilan
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_MAZTILAN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_MAZTILAN)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_TIEFLING:
|
||||
{
|
||||
SetLocalInt(oItem, "iPCSubrace", 11);
|
||||
SetLocalInt(oItem, "PC_ECL", 1);
|
||||
SetSubRace(oPC, "Tiefling");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_DARKVISION,1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA -2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_BLUFF, iBluff +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_HIDE, iHide+2);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_NAT_LYCAN:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 2);
|
||||
if (GetRacialType(oPC) == RACIAL_TYPE_ELF) {
|
||||
SetSubRace(oPC, "Lythari");
|
||||
} else {
|
||||
SetSubRace(oPC, "Natural Lycanthrope");
|
||||
}
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_WISDOM, iWIS + 2);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_AASIMAR:
|
||||
{
|
||||
SetLocalInt(oItem, "iPCSubrace", 10);
|
||||
SetLocalInt(oItem, "PC_ECL",1);
|
||||
SetSubRace(oPC, "Aasimar");
|
||||
NWNX_Creature_AddFeatByLevel(oPC,228,1); // Darkvision
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_WISDOM, iWIS +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_SPOT, iSpot +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_LISTEN, iListen+2);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_GOLD_DWARF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Gold Dwarf");
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA +4);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX -2);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_DWARVEN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_DWARVEN)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_GREY_DWARF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 2);
|
||||
SetSubRace(oPC, "Grey Dwarf");
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_MOVE_SILENTLY, iMoveSil +4);
|
||||
AddSubraceEffect(oPC, EffectImmunity(IMMUNITY_TYPE_POISON));
|
||||
AddSubraceEffect(oPC, EffectImmunity(IMMUNITY_TYPE_PARALYSIS));
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_DUERGAR, 1);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_UNDERCOMMON, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_DUERGAR)), 1);
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_UNDERCOMMON)), 1);
|
||||
|
||||
//SetLocalInt(oItem, "64", 1); // Language: Duergar
|
||||
//SetLocalInt(oItem, "46", 1); // Language: Undercommon
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_SHIELD_DWARF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Shield Dwarf");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_DWARVEN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_DWARVEN)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_COPPER_ELF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Copper Elf");
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_STRENGTH, iSTR +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT -2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA -2);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ELVEN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ELVEN)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_DARK_ELF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 2);
|
||||
SetSubRace(oPC, "Dark Elf");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, 228, 1); // Darkvision
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA +2);
|
||||
AddSubraceEffect(oPC, eSpellResist);
|
||||
//SetLocalInt(oItem, "81", 1); // Language: Drow
|
||||
//SetLocalInt(oItem, "46", 1); // Language: Undercommon
|
||||
//SetLocalInt(oItem, "13", 1); // Language: Drow Sign
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_DROW, 1);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_UNDERCOMMON, 1);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_DROW_HAND_CANT, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_DROW)), 1);
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_UNDERCOMMON)), 1);
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_DROW_HAND_CANT)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_FEYRI:
|
||||
{ // BACKGROUND_ELF_FEYRI
|
||||
SetLocalInt(oItem, "PC_ECL", 3);
|
||||
SetSubRace(oPC, "Fey'ri");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_DARKVISION, 1); // Darkvision
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CONSTITUTION, iCON -2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_BLUFF, iBluff +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_HIDE, iHide +2);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ELVEN, 1);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ABYSSAL, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ELVEN)), 1);
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ABYSSAL)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_GREEN_ELF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Green Elf");
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CONSTITUTION, iCON +4);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT -2);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ELVEN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ELVEN)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_GOLD_ELF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Gold Elf");
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX -2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT +2);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ELVEN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ELVEN)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_SILVER_ELF:
|
||||
{
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Silver Elf");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ELVEN, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ELVEN)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_DEEP_GNOME:
|
||||
{ // BACKGROUND_GNOME_DEEP
|
||||
SetLocalInt(oItem, "PC_ECL", 2);
|
||||
SetSubRace(oPC, "Deep Gnome");
|
||||
NWNX_Creature_AddFeatByLevel(oPC,nSubrace,1);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_DARKVISION, 1); // Darkvision
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_STONECUNNING, 1); // Stonecunning
|
||||
AddSubraceEffect(oPC, eSpellResist);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CONSTITUTION, iCON -4);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_WISDOM, iWIS +2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA -4);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_HIDE, iHide +2);
|
||||
//SetLocalInt(oItem,"46",1); // Language: Undercommon
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_UNDERCOMMON, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_UNDERCOMMON)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_FOREST_GNOME:
|
||||
{ // BACKGROUND_GNOME_FOREST
|
||||
SetLocalInt(oItem, "PC_ECL", 1);
|
||||
SetSubRace(oPC, "Forest Gnome");
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_HIDE, iHide + 4);
|
||||
//SetLocalInt(oItem, "8", 1); // Language: Animals
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_GNOMISH, 1);
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ANIMAL, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_GNOMISH)), 1);
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ANIMAL)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_ROCK_GNOME:
|
||||
{ // BACKGROUND_GNOME_ROCK
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Rock Gnome");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_GNOMISH, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_GNOMISH)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_GHOSTWISE:
|
||||
{ // BACKGROUND_HALFLING_GHOSTWISE
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Ghostwise Halfling");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_HALFLING, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_HALFLING)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_LIGHTFOOT:
|
||||
{ // BACKGROUND_HALFLING_LIGHTFOOT
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Lightfoot Halfling");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_HALFLING, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_HALFLING)), 1);
|
||||
}
|
||||
break;
|
||||
case ETHNICITY_STRONGHEART:
|
||||
{ // BACKGROUND_HALFLING_STRONGHEART
|
||||
SetLocalInt(oItem, "PC_ECL", 0);
|
||||
SetSubRace(oPC, "Strongheart Halfling");
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_HALFLING, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_HALFLING)), 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Step 1: Class Adjustments
|
||||
if (nClass > 0) NWNX_Creature_AddFeatByLevel(oPC, nClass, 1);
|
||||
|
||||
// Step 2: Background Adjustments
|
||||
if (nBackground > 0) NWNX_Creature_AddFeatByLevel(oPC, nBackground, 1);
|
||||
switch (nBackground)
|
||||
{
|
||||
case BACKGROUND_CALISHITE_TRAINED:
|
||||
{
|
||||
//SetLocalInt(oItem, "23", 1); // Language: Alzhedo
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ALZHEDO, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ALZHEDO)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_CIRCLE_BORN:
|
||||
{
|
||||
//SetLocalInt(oItem, "8", 1); // Language: Animals
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_ANIMAL, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_ANIMAL)), 1);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_OCCULTIST:
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, PROFICIENCY_ASTROLOGY, 1);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_LORE, iLore +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_SPELLCRAFT, iSpellCraft +2);
|
||||
}
|
||||
break;
|
||||
case BACKGROUND_TALFIRIAN:
|
||||
{
|
||||
//SetLocalInt(oItem, "38", 1); // Language: Talfirian
|
||||
NWNX_Creature_AddFeatByLevel(oPC, FEAT_LANGUAGE_TALFIRIC, 1);
|
||||
|
||||
//:: For legacy DMFI
|
||||
SetLocalInt(oItem, IntToString(LangFeatToLangID(FEAT_LANGUAGE_TALFIRIC)), 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Step 4: Deity Adjustments
|
||||
if (nDeity > 0) NWNX_Creature_AddFeat(oPC, nDeity);
|
||||
|
||||
// Step 5: Languages
|
||||
ApplyBonusLanguages(oPC);
|
||||
|
||||
/* string sArr = GetLocalString(oItem, "ARR_LANGUAGES");
|
||||
int i; for (i = 0; i < ArrayLength(sArr); i++)
|
||||
{
|
||||
string lang = ArrayParse(sArr, i);
|
||||
SetLocalInt(oItem, lang, 1);
|
||||
}
|
||||
DeleteLocalString(oItem, "ARR_LANGUAGES"); */
|
||||
|
||||
// Step 6: Proficiencies
|
||||
ApplyProficiencies(oPC);
|
||||
|
||||
/* sArr = GetLocalString(oItem, "ARR_PROF");
|
||||
for (i = 0; i < ArrayLength(sArr); i++)
|
||||
{
|
||||
int nFeat = StringToInt(ArrayParse(sArr, i));
|
||||
if (nFeat > 0) NWNX_Creature_AddFeatByLevel(oPC, nFeat, 1);
|
||||
if (nFeat == PROFICIENCY_ASTROLOGY)
|
||||
{
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_LORE, iLore +2);
|
||||
NWNX_Creature_SetSkillRank(oPC, SKILL_SPELLCRAFT, iSpellCraft +2);
|
||||
}
|
||||
}
|
||||
DeleteLocalString(oItem, "ARR_PROF"); */
|
||||
|
||||
// Step 7: Age Settings
|
||||
switch (nAge)
|
||||
{
|
||||
case AGE_CATEGORY_YOUTHFUL:
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, AGE_CATEGORY_YOUTHFUL, 1);
|
||||
break;
|
||||
}
|
||||
case AGE_CATEGORY_MIDDLE:
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, AGE_CATEGORY_MIDDLE, 1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_STRENGTH, iSTR-1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CONSTITUTION, iCON-1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX-1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT+1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA+1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_WISDOM, iWIS+1);
|
||||
break;
|
||||
}
|
||||
case AGE_CATEGORY_OLD:
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, AGE_CATEGORY_OLD, 1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_STRENGTH, iSTR-2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CONSTITUTION, iCON-2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX-2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT+2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA+2);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_WISDOM, iWIS+2);
|
||||
break;
|
||||
}
|
||||
case AGE_CATEGORY_VENERABLE:
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, AGE_CATEGORY_VENERABLE, 1);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_STRENGTH, iSTR-3);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CONSTITUTION, iCON-3);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_DEXTERITY, iDEX-3);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_INTELLIGENCE, iINT+3);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_CHARISMA, iCHA+3);
|
||||
NWNX_Creature_SetRawAbilityScore(oPC, ABILITY_WISDOM, iWIS+3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Step 8: One-Armed?
|
||||
if (bDisfigured)
|
||||
{
|
||||
NWNX_Creature_AddFeatByLevel(oPC, DISABILITY_ONE_ARMED, 1);//One-Armed
|
||||
//Set Arm to be nonexistent. I set the non-models to be all model number 200.
|
||||
|
||||
SetCreatureBodyPart(CREATURE_PART_LEFT_BICEP, 200, oPC);
|
||||
SetCreatureBodyPart(CREATURE_PART_LEFT_FOREARM, 200, oPC);
|
||||
SetCreatureBodyPart(CREATURE_PART_LEFT_HAND, 200, oPC);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user