695 lines
24 KiB
Plaintext
695 lines
24 KiB
Plaintext
////////////////////////////////////////////////////////////////////////////////
|
|
// lib_hos2_team - Team Support Functions
|
|
// By Deva B. Winblood. March 31st, 2008
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "nbde_inc"
|
|
#include "lib_hos2_pc"
|
|
#include "lib_hos2_data"
|
|
#include "lib_nais_persist"
|
|
|
|
/////////////////////////////////
|
|
// CONSTANTS
|
|
/////////////////////////////////
|
|
|
|
const int RESOURCE_TYPE_GOLD = 0;
|
|
const int RESOURCE_TYPE_MANA = 1;
|
|
const int RESOURCE_TYPE_SOUL = 2;
|
|
const int RESOURCE_TYPE_WOOD = 3;
|
|
const int RESOURCE_TYPE_IRON = 4;
|
|
const int RESOURCE_TYPE_MITHRIL = 5;
|
|
const int RESOURCE_TYPE_ADAMANTIUM = 6;
|
|
const int RESOURCE_TYPE_GOLDBAR = 7;
|
|
|
|
|
|
////////////////////////////////
|
|
// PROTOTYPES
|
|
////////////////////////////////
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_SetResource()
|
|
// This function wll enable you to set what the current resource for this team
|
|
// is.
|
|
void Team_SetResource(string sTeamID,int nResourceType,int nAmount);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_GetResource()
|
|
// This function will return what the specified teams resources are now.
|
|
int Team_GetResource(string sTeamID,int nResourceType);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_ProcessResourceHour()
|
|
// This function will process an hour of resource collection for the specified
|
|
// team and will update the journal for what the team has stored. It will
|
|
// also inform PC team members of the results if bVerbose is set to TRUE.
|
|
void Team_ProcessResourceHour(string sTeamID,int bVerbose=TRUE);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_GiveStartingResources()
|
|
// This function will give the specified team its starting resources.
|
|
void Team_GiveStartingResources(string sTeamID,int bStartingAdvantage=FALSE);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_SetRelation()
|
|
// This function will get the relation between nTeamNum1 and nTeamNum2.
|
|
// 0 = Neutral, 1 = Friend, -1 = Enemy
|
|
void Team_SetRelation(int nTeamNum1,int nTeamNum2,int nRelation);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_GetRelation()
|
|
// This function will return the relation between two teams.
|
|
// 0 Neutral, 1 = Friend, -1 = Enemy
|
|
int Team_GetRelation(int nTeamNum1,int nTeamNum2);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_AIReactPerception()
|
|
// This will cause oAI to check factional relationships with oPerceived and
|
|
// if they are enemy or otherwise it will adjust it's reactions to them
|
|
// accordingly.
|
|
void Team_AIReactPerception(object oAI,object oPerceived);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_GetTeamLeader()
|
|
// This will return who the team leader is.
|
|
object Team_GetTeamLeader(int nTeamNum);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_SetTeamLeader()
|
|
// Set who the leader for the team is.
|
|
void Team_SetTeamLeader(int nTeamNum,object oLeader);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_SetBuildingRights()
|
|
// This will grant oCreature with the right to construct objects or not.
|
|
void Team_SetBuildingRights(object oCreature,int bCanBuild=TRUE);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_GetBuildingRights()
|
|
// This will return whether oCreature has building rights.
|
|
int Team_GetBuildingRights(object oCreature);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_SetCreationRights()
|
|
// This will set whether oCreature can create units or not.
|
|
void Team_SetCreationRights(object oCreature,int bCanCreate=TRUE);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_GetCreationRights()
|
|
// This will return whether oCreature can create units or not.
|
|
int Team_GetCreationRights(object oCreature);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_SetPCRelation()
|
|
// This will setup how each team perceives this PC.
|
|
void Team_SetPCRelation(object oPC);
|
|
|
|
|
|
// FILE: lib_hos2_team FUNCTION: Team_SetAllPCRelations()
|
|
// This will adjust the relations of ALL PCs.
|
|
void Team_SetAllPCRelations();
|
|
|
|
|
|
////////////////////////////////
|
|
// FUNCTIONS
|
|
////////////////////////////////
|
|
|
|
|
|
void Team_SetResource(string sTeamID,int nResourceType,int nAmount)
|
|
{ // PURPOSE: Set the stored resource amount for the specified team.
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
string sVar="n"+sTeamID+IntToString(nResourceType);
|
|
int nN=nAmount;
|
|
if (nN<1) nN=0;
|
|
NBDE_SetCampaignInt(sDB,sVar,nN);
|
|
} // Team_SetResource()
|
|
|
|
|
|
int Team_GetResource(string sTeamID,int nResourceType)
|
|
{ // PURPOSE: Return the amount of resources
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
string sVar="n"+sTeamID+IntToString(nResourceType);
|
|
return NBDE_GetCampaignInt(sDB,sVar);
|
|
} // Team_GetResource()
|
|
|
|
|
|
int fnTeam_GetTax(string sTeamID)
|
|
{ // PURPOSE: Get Taxes
|
|
int nRet;
|
|
int nTeamNum=lib_DataGetTeamNumber(sTeamID);
|
|
int nUnit=1;
|
|
string sTag;
|
|
int nTax;
|
|
int nN;
|
|
object oUnit;
|
|
sTag=Unit_GetUnitTag(nTeamNum,nUnit);
|
|
while(GetStringLength(sTag)>0)
|
|
{ // check for tax units
|
|
nTax=Unit_GetUnitTax(nTeamNum,nUnit);
|
|
if (nTax>0)
|
|
{ // unit type has tax
|
|
nN=0;
|
|
oUnit=GetObjectByTag(sTag,nN);
|
|
while(GetIsObjectValid(oUnit))
|
|
{ // get tax for each
|
|
nRet=nRet+nTax;
|
|
nN++;
|
|
oUnit=GetObjectByTag(sTag,nN);
|
|
} // get tax for each
|
|
} // unit type has tax
|
|
nUnit++;
|
|
sTag=Unit_GetUnitTag(nTeamNum,nUnit);
|
|
} // check for tax units
|
|
nRet=nRet+GetLocalInt(GetModule(),"nAreaTax"+IntToString(nTeamNum));
|
|
string sDB=GetTag(GetModule())+"SU";
|
|
nN=NBDE_GetCampaignInt(sDB,"nGSManaMult");
|
|
if (nN>0) nRet=nRet*(nN+1);
|
|
return nRet;
|
|
} // fnTeam_GetTax
|
|
|
|
|
|
int fnTeam_GetMana(string sTeamID)
|
|
{ // PURPOSE: Get Mana production
|
|
int nRet;
|
|
int nN;
|
|
object oPool;
|
|
object oVault=GetWaypointByTag("MANA_VAULT_"+sTeamID);
|
|
if (GetIsObjectValid(oVault))
|
|
{ // mana vault found
|
|
nN=1;
|
|
oPool=GetNearestObjectByTag("plc_res_mana5",oVault,nN);
|
|
while(GetIsObjectValid(oPool)&&GetDistanceBetween(oVault,oPool)<15.0)
|
|
{ // count 5
|
|
nRet=nRet+5;
|
|
nN++;
|
|
oPool=GetNearestObjectByTag("plc_res_mana5",oVault,nN);
|
|
} // count 5
|
|
nN=1;
|
|
oPool=GetNearestObjectByTag("plc_res_mana2",oVault,nN);
|
|
while(GetIsObjectValid(oPool)&&GetDistanceBetween(oVault,oPool)<15.0)
|
|
{ // count 5
|
|
nRet=nRet+2;
|
|
nN++;
|
|
oPool=GetNearestObjectByTag("plc_res_mana2",oVault,nN);
|
|
} // count 5
|
|
nN=1;
|
|
oPool=GetNearestObjectByTag("plc_res_mana1",oVault,nN);
|
|
while(GetIsObjectValid(oPool)&&GetDistanceBetween(oVault,oPool)<15.0)
|
|
{ // count 5
|
|
nRet=nRet+1;
|
|
nN++;
|
|
oPool=GetNearestObjectByTag("plc_res_mana1",oVault,nN);
|
|
} // count 5
|
|
} // mana vault found
|
|
else
|
|
{ // not found
|
|
PrintString("ERROR [lib_hos2_team]: Waypoint 'MANA_VAULT_"+sTeamID+"' not found!");
|
|
} // not found
|
|
string sDB=GetTag(GetModule())+"SU";
|
|
nN=NBDE_GetCampaignInt(sDB,"nGSManaMult");
|
|
if (nN>0) nRet=nRet*(nN+1);
|
|
return nRet;
|
|
} // fnTeam_GetMana
|
|
|
|
|
|
string fnArea_GetAreaController(object oArea)
|
|
{ // PURPOSE: To return the team ID that is currently controlling this area
|
|
object oWP=GetWaypointByTag("AREA_"+GetTag(oArea));
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
object oControl=GetNearestObjectByTag("CAPTURE_POINT",oWP,1);
|
|
string sRet="";
|
|
if (GetIsObjectValid(oControl))
|
|
{ // control point exists
|
|
sRet=NBDE_GetCampaignString(sDB,"sCtrl_"+GetTag(oArea));
|
|
} // control point exists
|
|
return sRet;
|
|
} // fnArea_GetAreaController()
|
|
|
|
|
|
string fnArea_GetDefaultController(object oArea)
|
|
{ // PURPOSE: Return who the default controller of this area is
|
|
object oWP=GetWaypointByTag("AREA_"+GetTag(oArea));
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
object oControl=GetNearestObjectByTag("CAPTURE_POINT",oWP,1);
|
|
string sRet="";
|
|
if (GetIsObjectValid(oControl))
|
|
{ // control point exists
|
|
sRet=GetLocalString(oControl,"sStart");
|
|
} // control point exists
|
|
return sRet;
|
|
} // fnArea_GetDefaultController()
|
|
|
|
|
|
void fnTeam_SetupAreaTaxes()
|
|
{ // PURPOSE: Set Tax values for areas
|
|
int nTeamNum=1;
|
|
int nN;
|
|
int nV;
|
|
object oWP;
|
|
string sS=lib_DataGetStoredTeamID(nTeamNum);
|
|
while(GetStringLength(sS)>0)
|
|
{ // zero out area taxes
|
|
DeleteLocalInt(GetModule(),"nAreaTax"+IntToString(nTeamNum));
|
|
nTeamNum++;
|
|
sS=lib_DataGetStoredTeamID(nTeamNum);
|
|
} // zero out area taxes
|
|
nN=0;
|
|
oWP=GetObjectByTag("CAPTURE_POINT",nN);
|
|
while(GetIsObjectValid(oWP))
|
|
{ // check each capture point
|
|
nV=GetLocalInt(oWP,"nTax");
|
|
if (nV>0)
|
|
{ // tax
|
|
sS=fnArea_GetAreaController(GetArea(oWP));
|
|
if (GetStringLength(sS)<1) sS=fnArea_GetDefaultController(GetArea(oWP));
|
|
if (GetStringLength(sS)>0)
|
|
{ // determine tax
|
|
nTeamNum=lib_DataGetTeamNumber(sS);
|
|
sS="nAreaTax"+IntToString(nTeamNum);
|
|
SetLocalInt(GetModule(),sS,GetLocalInt(GetModule(),sS)+nV);
|
|
} // determine tax
|
|
} // tax
|
|
nN++;
|
|
oWP=GetObjectByTag("CAPTURE_POINT",nN);
|
|
} // check each capture point
|
|
} // fnTeam_SetupAreaTaxes()
|
|
|
|
|
|
void fnTeam_SetTeamResourceJournal(string sTeamID,string sJournal,int nTeamNum)
|
|
{ // PURPOSE: Set and update the journal entry
|
|
object oPC=GetFirstPC();
|
|
SetCustomToken(112680+nTeamNum,sJournal);
|
|
while(GetIsObjectValid(oPC))
|
|
{ // set journal on each team member
|
|
if (PC_GetTeamID(oPC)==sTeamID)
|
|
{ // member
|
|
RemoveJournalQuestEntry("TEAMRESOURCES",oPC,FALSE,FALSE);
|
|
DelayCommand(1.0,AddJournalQuestEntry("TEAMRESOURCES",nTeamNum,oPC,FALSE,FALSE,TRUE));
|
|
} // member
|
|
oPC=GetNextPC();
|
|
} // set journal on each team member
|
|
} // fnTeam_SetTeamResourceJournal()
|
|
|
|
|
|
void Team_ProcessResourceHour(string sTeamID,int bVerbose=TRUE)
|
|
{ // PURPOSE: Process an hour of resource processing for the team
|
|
string sMsg;
|
|
object oMod=GetModule();
|
|
int nTeamNum=GetLocalInt(oMod,"nTeamID_"+sTeamID);
|
|
int nCurrResource;
|
|
int nN;
|
|
string sS;
|
|
object oOb;
|
|
float fF;
|
|
string sJournalEntry;
|
|
if (nTeamNum>0)
|
|
{ // valid team
|
|
sS=GetLocalString(oMod,"sTeamName_"+IntToString(nTeamNum));
|
|
sS=lib_SetStringColor(sS,"363");
|
|
sMsg=sS+": Wood:";
|
|
nN=Team_GetResource(sTeamID,RESOURCE_TYPE_WOOD);
|
|
sS=lib_SetStringColor(IntToString(nN),"446");
|
|
sMsg=sMsg+sS+", Iron:";
|
|
nN=Team_GetResource(sTeamID,RESOURCE_TYPE_IRON);
|
|
sS=lib_SetStringColor(IntToString(nN),"446");
|
|
sMsg=sMsg+sS+", Souls:";
|
|
nN=Team_GetResource(sTeamID,RESOURCE_TYPE_SOUL);
|
|
sS=lib_SetStringColor(IntToString(nN),"446");
|
|
sMsg=sMsg+sS+", Gold Bars:";
|
|
nN=Team_GetResource(sTeamID,RESOURCE_TYPE_GOLDBAR);
|
|
sS=lib_SetStringColor(IntToString(nN),"555");
|
|
sMsg=sMsg+sS+", Mithril Bars:";
|
|
nN=Team_GetResource(sTeamID,RESOURCE_TYPE_MITHRIL);
|
|
sS=lib_SetStringColor(IntToString(nN),"555");
|
|
sMsg=sMsg+sS+", Adamantium Bars:";
|
|
nN=Team_GetResource(sTeamID,RESOURCE_TYPE_ADAMANTIUM);
|
|
sS=lib_SetStringColor(IntToString(nN),"555");
|
|
sMsg=sMsg+sS+", Gold:";
|
|
nCurrResource=Team_GetResource(sTeamID,RESOURCE_TYPE_GOLD);
|
|
nN=fnTeam_GetTax(sTeamID);
|
|
nCurrResource=nCurrResource+nN;
|
|
if (nCurrResource<1) nCurrResource=0;
|
|
Team_SetResource(sTeamID,RESOURCE_TYPE_GOLD,nCurrResource);
|
|
sS=lib_SetStringColor(IntToString(nCurrResource),"446");
|
|
sMsg=sMsg+sS+" [Produced:";
|
|
if (nN>=0) sS=lib_SetStringColor(IntToString(nN),"066");
|
|
else { sS=lib_SetStringColor(IntToString(nN),"622"); }
|
|
sMsg=sMsg+sS+"], Mana:";
|
|
nCurrResource=Team_GetResource(sTeamID,RESOURCE_TYPE_MANA);
|
|
nN=fnTeam_GetMana(sTeamID);
|
|
nCurrResource=nCurrResource+nN;
|
|
if (nCurrResource<1) nCurrResource=0;
|
|
Team_SetResource(sTeamID,RESOURCE_TYPE_MANA,nCurrResource);
|
|
sS=lib_SetStringColor(IntToString(nCurrResource),"446");
|
|
sMsg=sMsg+sS+" [Produced:";
|
|
if (nN>=0) sS=lib_SetStringColor(IntToString(nN),"066");
|
|
else { sS=lib_SetStringColor(IntToString(nN),"622"); }
|
|
sMsg=sMsg+sS+"].";
|
|
if (bVerbose)
|
|
{ // send message
|
|
DelayCommand(2.0,Msg_Team(oMod,"[== HOURLY RESOURCE REPORT ==] "+sMsg,"","",sTeamID,FALSE));
|
|
} // send message
|
|
sJournalEntry="[== LAST TEAM RESOURCE REPORT ==] "+sMsg;
|
|
DelayCommand(4.0,fnTeam_SetTeamResourceJournal(sTeamID,sJournalEntry,nTeamNum));
|
|
} // valid team
|
|
} // Team_ProcessResourceHour()
|
|
|
|
|
|
void Team_GiveStartingResources(string sTeamID,int bStartingAdvantage=FALSE)
|
|
{ // PURPOSE: Give starting resources
|
|
object oMod=GetModule();
|
|
int nTeamNum=GetLocalInt(oMod,"nTeamID_"+sTeamID);
|
|
int nN=GetLocalInt(oMod,"nTeamStartMana_"+IntToString(nTeamNum));
|
|
if (bStartingAdvantage) nN=FloatToInt(IntToFloat(nN)*1.25);
|
|
Team_SetResource(sTeamID,RESOURCE_TYPE_MANA,nN);
|
|
nN=GetLocalInt(oMod,"nTeamStartGold_"+IntToString(nTeamNum));
|
|
if (bStartingAdvantage) nN=FloatToInt(IntToFloat(nN)*1.25);
|
|
Team_SetResource(sTeamID,RESOURCE_TYPE_GOLD,nN);
|
|
nN=GetLocalInt(oMod,"nTeamStartSoul_"+IntToString(nTeamNum));
|
|
if (bStartingAdvantage) nN=FloatToInt(IntToFloat(nN)*1.25);
|
|
Team_SetResource(sTeamID,RESOURCE_TYPE_SOUL,nN);
|
|
nN=GetLocalInt(oMod,"nTeamStartIron_"+IntToString(nTeamNum));
|
|
if (bStartingAdvantage) nN=FloatToInt(IntToFloat(nN)*1.25);
|
|
Team_SetResource(sTeamID,RESOURCE_TYPE_IRON,nN);
|
|
nN=GetLocalInt(oMod,"nTeamStartWood_"+IntToString(nTeamNum));
|
|
if (bStartingAdvantage) nN=FloatToInt(IntToFloat(nN)*1.25);
|
|
Team_SetResource(sTeamID,RESOURCE_TYPE_WOOD,nN);
|
|
} // Team_GiveStartingResources()
|
|
|
|
|
|
void Team_SetRelation(int nTeamNum1,int nTeamNum2,int nRelation)
|
|
{ // PURPOSE: Set Factional Relationship of teams
|
|
object oProxy1;
|
|
object oProxy2;
|
|
string sTeamID1=lib_DataGetStoredTeamID(nTeamNum1);
|
|
string sTeamID2=lib_DataGetStoredTeamID(nTeamNum2);
|
|
string sDB=GetTag(GetModule())+"SU";
|
|
int nN;
|
|
int nDiff;
|
|
if (GetStringLength(sTeamID1)>0&&GetStringLength(sTeamID2)>0&&sTeamID1!=sTeamID2)
|
|
{ // set factional relationships
|
|
oProxy1=GetObjectByTag("proxy_"+sTeamID1);
|
|
oProxy2=GetObjectByTag("proxy_"+sTeamID2);
|
|
NBDE_SetCampaignInt(sDB,"nFactionRel"+IntToString(nTeamNum1)+"_"+IntToString(nTeamNum2),nRelation);
|
|
NBDE_SetCampaignInt(sDB,"nFactionRel"+IntToString(nTeamNum2)+"_"+IntToString(nTeamNum1),nRelation);
|
|
if (GetIsObjectValid(oProxy1)&&GetIsObjectValid(oProxy2))
|
|
{ // proxies exist
|
|
nN=GetReputation(oProxy1,oProxy2);
|
|
if (nN==0)
|
|
{ // neutral
|
|
nDiff=50-nN;
|
|
AdjustReputation(oProxy1,oProxy2,nDiff);
|
|
AdjustReputation(oProxy2,oProxy1,nDiff);
|
|
} // neutral
|
|
else if (nN==1)
|
|
{ // friend
|
|
AdjustReputation(oProxy1,oProxy2,100);
|
|
AdjustReputation(oProxy2,oProxy1,100);
|
|
} // friend
|
|
else if (nN==-1)
|
|
{ // enemy
|
|
AdjustReputation(oProxy1,oProxy2,-100);
|
|
AdjustReputation(oProxy2,oProxy1,-100);
|
|
} // enemy
|
|
} // proxies exist
|
|
} // set factional relationships
|
|
} // Team_SetRelation()
|
|
|
|
|
|
int Team_GetRelation(int nTeamNum1,int nTeamNum2)
|
|
{ // PURPOSE: Return team relation
|
|
string sDB=GetTag(GetModule())+"SU";
|
|
return NBDE_GetCampaignInt(sDB,"nFactionRel"+IntToString(nTeamNum2)+"_"+IntToString(nTeamNum1));
|
|
} // Team_GetRelation()
|
|
|
|
|
|
void Team_AIReactPerception(object oAI,object oPerceived)
|
|
{ // PURPOSE: Handle Perception
|
|
int nTeamAI=GetLocalInt(oAI,"nTeamNum");
|
|
int nTeamPerc=GetLocalInt(oPerceived,"nTeamNum");
|
|
int nRep;
|
|
int bPassive=GetLocalInt(oAI,"bPassive"); // 0 = normal react, 1 = passive
|
|
if (bPassive) return;
|
|
if (GetIsPC(oPerceived)) nTeamPerc=PC_GetTeamNum(oPerceived);
|
|
if (nTeamAI!=nTeamPerc)
|
|
{ // other teams
|
|
nRep=Team_GetRelation(nTeamAI,nTeamPerc);
|
|
if (nRep==1)
|
|
{ // friend
|
|
SetIsTemporaryFriend(oAI,oPerceived);
|
|
SetIsTemporaryFriend(oPerceived,oAI);
|
|
SetLocalObject(oAI,"oLastFriendlyTarget",oPerceived);
|
|
ExecuteScript("npc_e_startfr",oAI);
|
|
} // friend
|
|
else if (nRep==-1)
|
|
{ // enemy
|
|
if (!GetIsInCombat(oAI))
|
|
{ // not in combat
|
|
SetIsTemporaryEnemy(oAI,oPerceived);
|
|
SetIsTemporaryEnemy(oPerceived,oAI);
|
|
SetLocalObject(oAI,"oLastEnemyTarget",oPerceived);
|
|
ExecuteScript("npc_e_startcmb",oAI);
|
|
} // not in combat
|
|
else
|
|
{ // make sure perceived as enemy
|
|
SetIsTemporaryEnemy(oAI,oPerceived);
|
|
SetIsTemporaryEnemy(oPerceived,oAI);
|
|
SetLocalObject(oAI,"oLastEnemyTarget",oPerceived);
|
|
} // make sure perceived as enemy
|
|
} // enemy
|
|
else
|
|
{ // neutral
|
|
SetIsTemporaryNeutral(oAI,oPerceived);
|
|
SetIsTemporaryNeutral(oPerceived,oAI);
|
|
} // neutral
|
|
} // other teams
|
|
else if (nTeamAI!=0)
|
|
{ // same team and not zero
|
|
SetIsTemporaryFriend(oAI,oPerceived);
|
|
SetIsTemporaryFriend(oPerceived,oAI);
|
|
SetLocalObject(oAI,"oLastFriendlyTarget",oPerceived);
|
|
ExecuteScript("npc_e_startfr",oAI);
|
|
} // same team and not zero
|
|
else
|
|
{ // standard
|
|
} // standard
|
|
} // Team_AIReactPerception()
|
|
|
|
|
|
string GetTeamID(object oTarget)
|
|
{ // PURPOSE: To return the sTeamID of oTarget
|
|
string sID=GetLocalString(oTarget,"sTeamID");
|
|
if (GetIsPC(oTarget))
|
|
{ // PC
|
|
sID=PC_GetTeamID(oTarget);
|
|
} // PC
|
|
return sID;
|
|
} // GetTeamID()
|
|
|
|
|
|
string Team_GetTeamID(object oTarget)
|
|
{ // PURPOSE: Wraps GetTeamID()
|
|
return GetTeamID(oTarget);
|
|
} // Team_GetTeamID()
|
|
|
|
|
|
|
|
object Team_GetTeamLeader(int nTeamNum)
|
|
{ // PURPOSE: Get Team Leader
|
|
string sTeamID=lib_DataGetStoredTeamID(nTeamNum);
|
|
object oMod=GetModule();
|
|
object oLead=GetLocalObject(oMod,"oLead_"+sTeamID);
|
|
if (GetIsObjectValid(oLead)) return oLead;
|
|
string sDB=GetTag(oMod)+"TM";
|
|
string sLead=NBDE_GetCampaignString(sDB,"sLead_"+sTeamID);
|
|
if (GetStringLeft(sLead,1)=="P")
|
|
{ // PC
|
|
sLead=GetStringRight(sLead,GetStringLength(sLead)-1);
|
|
object oPC=GetFirstPC();
|
|
string sID;
|
|
while(GetIsObjectValid(oPC))
|
|
{ // return leader
|
|
sID=GetPCPublicCDKey(oPC)+"_"+GetName(oPC);
|
|
if (sID==sLead)
|
|
{ // leader
|
|
SetLocalObject(oMod,"oLead_"+sTeamID,oPC);
|
|
return oPC;
|
|
} // leader
|
|
oPC=GetNextPC();
|
|
} // return leader
|
|
} // PC
|
|
else if (GetStringLeft(sLead,1)=="N")
|
|
{ // NPC
|
|
sLead=GetStringRight(sLead,GetStringLength(sLead)-1);
|
|
int nUID=StringToInt(sLead);
|
|
if (nUID>0)
|
|
{ // find leader
|
|
oLead=NPC_GetNPCObjectByID(nUID);
|
|
if (GetIsObjectValid(oLead))
|
|
{ // found
|
|
SetLocalObject(oMod,"oLead_"+sTeamID,oLead);
|
|
return oLead;
|
|
} // found
|
|
} // find leader
|
|
} // NPC
|
|
return OBJECT_INVALID;
|
|
} // Team_GetTeamLeader()
|
|
|
|
|
|
void Team_SetTeamLeader(int nTeamNum,object oLeader)
|
|
{ // PURPOSE: Set the Team Leader
|
|
string sTeamID=lib_DataGetStoredTeamID(nTeamNum);
|
|
object oMod=GetModule();
|
|
object oLead=Team_GetTeamLeader(nTeamNum);
|
|
string sDB=GetTag(oMod)+"TM";
|
|
string sID;
|
|
if (oLeader==oLead) return;
|
|
if (GetTeamID(oLeader)!=sTeamID) return;
|
|
if (GetIsPC(oLeader))
|
|
{ // PC
|
|
sID=GetPCPublicCDKey(oLeader)+"_"+GetName(oLeader);
|
|
NBDE_SetCampaignString(sDB,"sLead_"+sTeamID,"P"+sID);
|
|
SetLocalObject(oMod,"oLead_"+sTeamID,oLeader);
|
|
NBDE_FlushCampaignDatabase(sDB);
|
|
} // PC
|
|
else
|
|
{ // NPC
|
|
sID=IntToString(GetLocalInt(oLeader,"nUID"));
|
|
NBDE_SetCampaignString(sDB,"sLead_"+sTeamID,"N"+sID);
|
|
SetLocalObject(oMod,"oLead_"+sTeamID,oLeader);
|
|
NBDE_FlushCampaignDatabase(sDB);
|
|
} // NPC
|
|
} // Team_SetTeamLeader()
|
|
|
|
|
|
void Team_SetBuildingRights(object oCreature,int bCanBuild=TRUE)
|
|
{ // PURPOSE: Set Building Rights
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
string sID;
|
|
if (GetIsPC(oCreature))
|
|
{ // PC
|
|
sID=GetPCPublicCDKey(oCreature)+"_"+GetName(oCreature);
|
|
NBDE_SetCampaignInt(sDB,"bBR_"+sID,bCanBuild);
|
|
} // PC
|
|
else
|
|
{ // NPC
|
|
sID=IntToString(GetLocalInt(oCreature,"nUID"));
|
|
NBDE_SetCampaignInt(sDB,"bBR_"+sID,bCanBuild);
|
|
} // NPC
|
|
} // Team_SetBuildingRights()
|
|
|
|
|
|
int Team_GetBuildingRights(object oCreature)
|
|
{ // PURPOSE: Get Building Rights
|
|
int nTeamNum;
|
|
string sID;
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
if (GetIsPC(oCreature))
|
|
{ // PC
|
|
nTeamNum=PC_GetTeamNum(oCreature);
|
|
if (Team_GetTeamLeader(nTeamNum)==oCreature) return TRUE;
|
|
sID=GetPCPublicCDKey(oCreature)+"_"+GetName(oCreature);
|
|
return NBDE_GetCampaignInt(sDB,"bBR_"+sID);
|
|
} // PC
|
|
else
|
|
{ // NPC
|
|
nTeamNum=GetLocalInt(oCreature,"nTeamNum");
|
|
if (Team_GetTeamLeader(nTeamNum)==oCreature) return TRUE;
|
|
sID=IntToString(GetLocalInt(oCreature,"nUID"));
|
|
return NBDE_GetCampaignInt(sDB,"bBR_"+sID);
|
|
} // NPC
|
|
return FALSE;
|
|
} // Team_SetBuildingRights()
|
|
|
|
|
|
void Team_SetCreationRights(object oCreature,int bCanBuild=TRUE)
|
|
{ // PURPOSE: Set Creation Rights
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
string sID;
|
|
if (GetIsPC(oCreature))
|
|
{ // PC
|
|
sID=GetPCPublicCDKey(oCreature)+"_"+GetName(oCreature);
|
|
NBDE_SetCampaignInt(sDB,"bCR_"+sID,bCanBuild);
|
|
} // PC
|
|
else
|
|
{ // NPC
|
|
sID=IntToString(GetLocalInt(oCreature,"nUID"));
|
|
NBDE_SetCampaignInt(sDB,"bCR_"+sID,bCanBuild);
|
|
} // NPC
|
|
} // Team_SetCreationRights()
|
|
|
|
|
|
int Team_GetCreationRights(object oCreature)
|
|
{ // PURPOSE: Get Creation Rights
|
|
int nTeamNum;
|
|
string sID;
|
|
string sDB=GetTag(GetModule())+"TM";
|
|
if (GetIsPC(oCreature))
|
|
{ // PC
|
|
nTeamNum=PC_GetTeamNum(oCreature);
|
|
if (Team_GetTeamLeader(nTeamNum)==oCreature) return TRUE;
|
|
sID=GetPCPublicCDKey(oCreature)+"_"+GetName(oCreature);
|
|
return NBDE_GetCampaignInt(sDB,"bCR_"+sID);
|
|
} // PC
|
|
else
|
|
{ // NPC
|
|
nTeamNum=GetLocalInt(oCreature,"nTeamNum");
|
|
if (Team_GetTeamLeader(nTeamNum)==oCreature) return TRUE;
|
|
sID=IntToString(GetLocalInt(oCreature,"nUID"));
|
|
return NBDE_GetCampaignInt(sDB,"bCR_"+sID);
|
|
} // NPC
|
|
return FALSE;
|
|
} // Team_SetCreationRights()
|
|
|
|
|
|
void Team_SetPCRelation(object oPC)
|
|
{ // PURPOSE: Adjust the relations of all teams with regards to this PC
|
|
string sTeamID=PC_GetTeamID(oPC);
|
|
int nTeamNum=PC_GetTeamNum(oPC);
|
|
int nTN=1;
|
|
string sTID;
|
|
object oProxy;
|
|
int nR;
|
|
sTID=lib_DataGetStoredTeamID(nTN);
|
|
while(GetStringLength(sTID)>0)
|
|
{ // process each team
|
|
oProxy=GetObjectByTag("proxy_"+sTID);
|
|
if (GetIsObjectValid(oProxy))
|
|
{ // proxy found
|
|
nR=Team_GetRelation(nTeamNum,nTN);
|
|
if (nTeamNum==nTN) nR=1;
|
|
if (nR==0)
|
|
{ // neutral
|
|
nR=GetReputation(oProxy,oPC);
|
|
if (nR<21) AdjustReputation(oPC,oProxy,50-nR);
|
|
else if (nR>79) AdjustReputation(oPC,oProxy,50-nR);
|
|
} // neutral
|
|
else if (nR==1)
|
|
{ // friend
|
|
AdjustReputation(oPC,oProxy,100);
|
|
} // friend
|
|
else if (nR==-1)
|
|
{ // enemy
|
|
AdjustReputation(oPC,oProxy,-100);
|
|
} // enemy
|
|
} // proxy found
|
|
nTN++;
|
|
sTID=lib_DataGetStoredTeamID(nTN);
|
|
} // process each team
|
|
} // Team_SetPCRelation()
|
|
|
|
|
|
void Team_SetAllPCRelations()
|
|
{ // PURPOSE: Adjust all PC relations
|
|
object oPC=GetFirstPC();
|
|
float fDelay=0.1;
|
|
while(GetIsObjectValid(oPC))
|
|
{ // all PCs
|
|
DelayCommand(fDelay,Team_SetPCRelation(oPC));
|
|
oPC=GetNextPC();
|
|
fDelay=fDelay+0.25;
|
|
} // all PCs
|
|
} // Team_SetAllPCRelations()
|
|
|
|
|
|
//void main(){}
|