//Cohort HB script #include "prc_alterations" #include "prc_inc_leadersh" void main() { object oCohort = OBJECT_SELF; object oPC = GetMaster(oCohort); object oMaster = GetLocalObject(oCohort, "MasterObject"); if(!GetIsObjectValid(oPC) && GetIsObjectValid(oMaster)) { //must have become disconnected from master //re-add it as a cohort, but dont re-setup it AddCohortToPlayerByObject(oCohort, oMaster, FALSE); //dont continue this script, allow next HB to kick in instead return; } else if(!GetIsObjectValid(oPC) && !GetIsObjectValid(oMaster)) { //master no longer exists RemoveCohortFromPlayer(oCohort, oPC); return; } //if it doesnt have a tag, abort if(GetTag(OBJECT_SELF) == "") return; //cohort XP gain //get the amount the PC has gained int XPGained = GetXP(oPC)-GetLocalInt(OBJECT_SELF, "MastersXP"); //correct for simple LA XP penalty if(GetPRCSwitch(PRC_XP_USE_SIMPLE_LA)) { int iPCLvl = GetHitDice(oPC); int nRace = GetRacialType(oPC); int iLvlAdj = StringToInt(Get2DACache("ECL", "LA", nRace)); if(GetPRCSwitch(PRC_XP_INCLUDE_RACIAL_HIT_DIE_IN_LA)) iLvlAdj += StringToInt(Get2DACache("ECL", "RaceHD", nRace)); float fRealXPToLevel = IntToFloat(GetXPForLevel(iPCLvl+1)); float fECLXPToLevel = IntToFloat(GetXPForLevel(iPCLvl+1+iLvlAdj)); float fXPRatio = fECLXPToLevel/fRealXPToLevel; XPGained = FloatToInt(IntToFloat(XPGained)*fXPRatio); } //store the amount the PC now has for the next HB SetLocalInt(OBJECT_SELF, "MastersXP", GetXP(oPC)); //work out proportion based on relative ECLs int nPCECL = GetECL(oPC); int nCohortECL = GetECL(oCohort); int nCohortLag = GetLocalInt(oCohort, "CohortLevelLag"); int nCohortMaxHD = nPCECL-nCohortLag-StringToInt(Get2DACache("ECL", "LA", GetRacialType(oCohort))); if(GetPRCSwitch(PRC_XP_INCLUDE_RACIAL_HIT_DIE_IN_LA)) nCohortMaxHD -= StringToInt(Get2DACache("ECL", "RaceHD", GetRacialType(oCohort))); float ECLRatio = IntToFloat(nPCECL)/IntToFloat(nCohortECL); //get the amount to gain int nCohortXPGain = FloatToInt(IntToFloat(XPGained)*ECLRatio); //get the current amount int nCohortXP = GetXP(oCohort); //work out the new amount int nCohortNewXP = nCohortXP+nCohortXPGain; //get the cap based on PC level and cohort LA int nCohortXPCap = ((nCohortMaxHD)*(nCohortMaxHD+1)*500)-1; //this is how much XP the next levelup will be at int nCohortXPLevel = nCohortECL*(nCohortECL+1)*500; //DoDebug("XPGained = "+IntToString(XPGained)); //DoDebug("nPCECL = "+IntToString(nPCECL)); //DoDebug("nCohortECL = "+IntToString(nCohortECL)); //DoDebug("nCohortXPGain = "+IntToString(nCohortXPGain)); //DoDebug("nCohortXP = "+IntToString(nCohortXP)); //DoDebug("nCohortNewXP = "+IntToString(nCohortNewXP)); //DoDebug("nCohortXPCap = "+IntToString(nCohortXPCap)); //DoDebug("nCohortXPLevel = "+IntToString(nCohortXPLevel)); //apply the cap if(nCohortNewXP > nCohortXPCap) nCohortNewXP = nCohortXPCap; //give the XP SetXP(oCohort, nCohortNewXP); //handle levelup if(nCohortNewXP >= nCohortXPLevel) { //standard if(GetResRef(oCohort) != "") { LevelUpHenchman(oCohort, CLASS_TYPE_INVALID, TRUE); } else { //custom //resummon it but dont decrease XP as much int nCohortID = GetLocalInt(oCohort, "CohortID"); //Call creation of new cohort object oNewCohort = AddCohortToPlayer(nCohortID, oPC); object oTest; //copy its equipment & inventory // object oTest = GetFirstItemInInventory(oCohort); // while(GetIsObjectValid(oTest)) // { // if(!GetLocalInt(oTest, "CohortCopied")) // object oNewTest = CopyItem(oTest, oNewCohort, TRUE); // SetLocalInt(oTest, "CohortCopied", TRUE); // DestroyObject(oTest, 0.01); // oTest = GetNextItemInInventory(oCohort); //} //Delete new cohorts items (todo: prevent having them added in first place) object currItem = GetFirstItemInInventory(oNewCohort); while(GetIsObjectValid(currItem)){ DestroyObject(currItem, 0.01); currItem = GetNextItemInInventory(oNewCohort); } //Copy Inventory Items currItem = GetFirstItemInInventory(oCohort); while(GetIsObjectValid(currItem)){ CopyItem(currItem,oNewCohort,TRUE); DestroyObject(currItem, 0.01); currItem = GetNextItemInInventory(oCohort); } //Copy Equiped items (todo: fix equipping) int nSlot; for(nSlot = 0;nSlot<14;nSlot++) { oTest = GetItemInSlot(nSlot, OBJECT_SELF); object oTest2 = CopyItem(oTest, oNewCohort, TRUE); //currently isn't equiping it AssignCommand(oNewCohort, ClearAllActions()); AssignCommand(oNewCohort, ActionEquipItem(oTest2, nSlot)); DestroyObject(oTest, 0.01); } //destroy old cohort SetIsDestroyable(TRUE, FALSE, FALSE); DestroyObject(OBJECT_SELF, 0.1); } }/* //and now for some intelligence to the AI //if you have a familiar, summon it if(GetHasFeat(FEAT_SUMMON_FAMILIAR, oCohort) //&& !GetIsObjectValid(GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oCohort)) ) ActionUseFeat(FEAT_SUMMON_FAMILIAR, oCohort); //SummonFamiliar(oCohort); //if you have an animal companion, summon it if(GetHasFeat(FEAT_ANIMAL_COMPANION, oCohort) //&& !GetIsObjectValid(GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oCohort)) ) ActionUseFeat(FEAT_ANIMAL_COMPANION, oCohort); //SummonAnimalCompanion(oCohort);*/ }