// uc_h - Unit Creation Version 2 - Header File // By Deva Bryson Winblood. 04/10/2005 #include "rtsh_multiplay" #include "color_header" #include "x3_inc_string" ///////////////////////////////////////// // PROTOTYPES ///////////////////////////////////////// // FILE: uc_h FUNCTION: GetUnitDescription() // This function will return a string which can be used in // a token that describes the unit. It will be in the format of // Name M: # G: # S: # Tax In:# Tax Out: # [Abilities] string GetUnitDescription(string sID,int nNumber,int nQuantity=1,int nUpgradeFrom=-1,object oPC=OBJECT_INVALID); // FILE: uc_h FUNCTION: HasSufficientResources() // This function will return TRUE if the PC has sufficient resources // to produce nQuantity number of the specified unit. // If bUpgrade is set to TRUE then this is an upgrade int HasSufficientResources(object oPC,int nNumber,int nQuantity,int nUpgradeFrom=-1); // FILE: uc_h FUNCTION: TakeResourceCost() // This function will take the resources required to produce // nQuantity of unit number nNumber from oPC. void TakeResourceCost(object oPC,int nNumber,int nQuantity,int nUpgradeFrom=-1); // FILE: uc_h FUNCTION: GetManaCost() // This function will return the mana cost of the unit int GetManaCost(string sID,int nNumber); // FILE: uc_h FUNCTION: GetGoldCost() // This function will return the gold cost of the unit int GetGoldCost(string sID,int nNumber); // FILE: uc_h FUNCTION: GetSoulCost() // This function will return the soul cost of the unit int GetSoulCost(string sID,int nNumber); // FILE: uc_h FUNCTION: GetTaxIn() // This function will return the amount of tax in int GetTaxIn(string sID,int nNumber); // FILE: uc_h FUNCTION: GetTaxOut() // This function will return the amount of tax out int GetTaxOut(string sID,int nNumber); // FILE: uc_h FUNCTION: GetRequiredUnit() // This function will return the tag of a unit that must // exist on this team before this unit can be built. string GetRequiredUnit(string sID,int nNumber); // FILE: uc_h FUNCTION: GetCanScout() // This function will return TRUE if the unit can scout int GetCanScout(string sID,int nNumber); // FILE: uc_h FUNCTION: GetCanHarvest() // This function will return TRUE if the unit can harvest int GetCanHarvest(string sID,int nNumber); // FILE: uc_h FUNCTION: GetCanUpgrade() // This function will return TRUE if the unit can be upgraded int GetCanUpgrade(string sID,int nNumber); // FILE: uc_h FUNCTION: GetMinimumLevelReq() // This function will return the minimum level the team leader // must be before this unit can be constructed. int GetMinimumLevelReq(string sID,int nNumber); // FILE: uc_h FUNCTION: GetCanGrow() // This function will return TRUE if the unit in question // is on a timed upgrade. int GetCanGrow(string sID,int nNumber); // FILE: uc_h FUNCTION: GetCanBeCreated() // This function will return TRUE if the unit can be created int GetCanBeCreated(string sID,int nNumber); // FILE: uc_h FUNCTION: GetRequiredItem() // This function will return the TAG of an item required to // create this unit. string GetRequiredItem(string sID,int nNumber); // FILE: uc_h FUNCTION: GetHasSoul() // This function will return TRUE if the unit has a soul int GetHasSoul(string sID,int nNumber); // FILE: uc_h FUNCTION: GetLightSensitivity() // This function will return the light sensitivity level of the unit // 0 = none, 1 = light sensitive, 2 = sun fatal int GetLightSensitivity(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitName() // This function will return the name of the specified unit string GetUnitName(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitHitDice() // This function will return the hit dice of the specified unit int GetUnitHitDice(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitTag() string GetUnitTag(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitURequiredName() string GetUnitURequiredName(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitIRequiredName() string GetUnitIRequiredName(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitSubRaceOverride() string GetUnitSubRaceOverride(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitUpgradeNumber() int GetUnitUpgradeNumber(string sID,int nNumber,int nUpgradeSlot); // FILE: uc_h FUNCTION: GetUnitLevel() int GetUnitLevel(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitResRef() string GetUnitResRef(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitConsumeItem() int GetUnitConsumeItem(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitTimedUpgradeTime() int GetUnitTimedUpgradeTime(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitTimedUpgradeResRef() string GetUnitTimedUpgradeResRef(string sID,int nNumber); // FILE: uc_h FUNCTION: GetUnitTimedUpgradeUnitNum() int GetUnitTimedUpgradeUnitNum(string sID,int nNumber); ///////////////////////////////////////// // FUNCTIONS ///////////////////////////////////////// string GetUnitTag(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); string sReq=GetLocalString(oMod,sVar+"_tag"); return sReq; } // GetUnitTag() string GetUnitResRef(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); string sReq=GetLocalString(oMod,sVar+"_res"); return sReq; } // GetUnitResRef() int GetUnitTimedUpgradeTime(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); return GetLocalInt(oMod,sVar+"_timeup"); } // GetUnitTimedUpgradeTime() string GetUnitTimedUpgradeResRef(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); return GetLocalString(oMod,sVar+"_timers"); } // GetUnitTimedUpgradeResRef() int GetUnitTimedUpgradeUnitNum(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); return GetLocalInt(oMod,sVar+"_untimers"); } // GetUnitTimedUpgradeUnitNum() int GetUnitConsumeItem(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); return GetLocalInt(oMod,sVar+"_cons"); } // GetUnitConsumeItem() string GetUnitURequiredName(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); string sReq=GetLocalString(oMod,sVar+"_unitn"); return sReq; } // GetUnitURequiredName() string GetUnitIRequiredName(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); string sReq=GetLocalString(oMod,sVar+"_itemn"); return sReq; } // GetUnitIRequiredName() int GetUnitUpgradeNumber(string sID,int nNumber,int nUpgradeSlot) { return GetLocalInt(GetModule(),sID+IntToString(nNumber)+"_up"+IntToString(nUpgradeSlot)); } // GetUnitUpgradeNumber() int GetUnitLevel(string sID,int nNumber) { object oMod=GetModule(); int nRet=-1; string sVar=sID+IntToString(nNumber); nRet=GetLocalInt(oMod,sVar+"_hd"); return nRet; } // GetUnitLevel() string GetUnitSubRaceOverride(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); string sReq=GetLocalString(oMod,sVar+"_srovr"); return sReq; } // GetUnitSubRaceOverride() int GetManaCost(string sID,int nNumber) { object oMod=GetModule(); int nRet=-1; int nMin=0; string sVar=sID+IntToString(nNumber); float fMult=GetLocalFloat(oMod,"fUCMultpile"); if (fMult<0.01) { // find nRet=GetLocalInt(oMod,"nGSUnitCostMult"); fMult=1.0; if (nRet==1) fMult=0.25; else if (nRet==2) fMult=0.5; else if (nRet==3) fMult=0.75; else if (nRet==4) fMult=1.25; else if (nRet==5) fMult=1.5; else if (nRet==6) fMult=1.75; else if (nRet==7) fMult=2.0; else if (nRet==8) fMult=3.0; else if (nRet==9) fMult=4.0; SetLocalFloat(oMod,"fUCMultiple",fMult); } // find nRet=GetLocalInt(oMod,sVar+"_ccmana"); if (nRet>0) nMin=1; nRet=FloatToInt(IntToFloat(nRet)*fMult); if (nRet0) nMin=1; nRet=FloatToInt(IntToFloat(nRet)*fMult); if (nRet-1) return TRUE; return FALSE; } // GetCanUpgrade() int GetCanGrow(string sID,int nNumber) { object oMod=GetModule(); string sTag; string sVar=sID+IntToString(nNumber); sTag=GetLocalString(oMod,sVar+"_timers"); if (sTag!="NA"||GetStringLength(sTag)<2) return TRUE; return FALSE; } // GetCanGrow() int GetCanHarvest(string sID,int nNumber) { object oMod=GetModule(); int nVal; string sVar=sID+IntToString(nNumber); nVal=GetLocalInt(oMod,sVar+"_harvest"); if (nVal==1) return TRUE; return FALSE; } // GetCanHarvest() int GetCanScout(string sID,int nNumber) { object oMod=GetModule(); int nVal; string sVar=sID+IntToString(nNumber); nVal=GetLocalInt(oMod,sVar+"_scout"); if (nVal==1) return TRUE; return FALSE; } // GetCanScout() string GetRequiredUnit(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); string sReq=GetLocalString(oMod,sVar+"_requnit"); return sReq; } // GetRequiredUnit() string GetRequiredItem(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); string sReq=GetLocalString(oMod,sVar+"_item"); return sReq; } // GetRequiredItem() int GetMinimumLevelReq(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); int nRet=GetLocalInt(oMod,sVar+"_minlev"); return nRet; } // GetMinimumLevelReq() int GetCanBeCreated(string sID,int nNumber) { object oMod=GetModule(); int nVal; string sVar=sID+IntToString(nNumber); nVal=GetLocalInt(oMod,sVar+"_create"); if (nVal==1) return TRUE; return FALSE; } // GetCanBeCreated() int GetHasSoul(string sID,int nNumber) { object oMod=GetModule(); int nVal; string sVar=sID+IntToString(nNumber); nVal=GetLocalInt(oMod,sVar+"_soul"); if (nVal==1) return TRUE; return FALSE; } // GetHasSoul() int GetLightSensitivity(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); return GetLocalInt(oMod,sVar+"_light"); } // GetLightSensitivity() string GetUnitName(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); return GetLocalString(oMod,sVar+"_name"); } // GetUnitName() int GetUnitHitDice(string sID,int nNumber) { object oMod=GetModule(); string sVar=sID+IntToString(nNumber); return GetLocalInt(oMod,sVar+"_hitdice"); } // GetUnitHitDice() int fnGetHasQtyOfItem(object oPC,string sTag,int nQty) { int nC; object oItem; oItem=GetItemPossessedBy(oPC,sTag); if (!GetIsObjectValid(oItem)) return FALSE; oItem=GetFirstItemInInventory(oPC); while(GetIsObjectValid(oItem)&&nC=nQty) return TRUE; return FALSE; } // fnGetHasQtyOfItem() string GetUnitDescription(string sID,int nNumber,int nQuantity=1,int nUpgradeFrom=-1,object oPC=OBJECT_INVALID) { string sDesc; int nV; int nUC; string sS; string sName=GetUnitName(sID,nNumber); int bCanBuild=TRUE; int nMana=100000; int nGold=100000; int nSouls=10000; int nLevel=60; int bConsumeItem=GetUnitConsumeItem(sID,nNumber); object oOb; int bOverride=FALSE; sName=GetStringUpperCase(sName); nV=GetUnitLevel(sID,nNumber); sDesc="[Lvl:"+IntToString(nV)+"]"; if (GetIsObjectValid(oPC)) { // PC in play nMana=fnGetTeamMana(oPC); nGold=GetGold(oPC); nSouls=fnGetTeamSouls(oPC); nLevel=GetLevelByPosition(1,oPC)+GetLevelByPosition(2,oPC)+GetLevelByPosition(3,oPC); } // PC in play sDesc=sDesc+"(Cost: M:"; nV=GetManaCost(sID,nNumber); nV=nV*nQuantity; if (nUpgradeFrom>-1) { // upgrade from nUC=GetManaCost(sID,nUpgradeFrom); nUC=nUC*nQuantity; nV=nV-nUC; } // upgrade from if (nV>nMana) { sDesc=sDesc+StringToRGBString(IntToString(nV),"733"); bCanBuild=FALSE; } else { sDesc=sDesc+StringToRGBString(IntToString(nV),"555"); } sDesc=sDesc+",G:"; nV=GetGoldCost(sID,nNumber); nV=nV*nQuantity; if (nUpgradeFrom>-1) { // upgrade from nUC=GetGoldCost(sID,nUpgradeFrom); nUC=nUC*nQuantity; nV=nV-nUC; } // upgrade from if (nV>nGold) { sDesc=sDesc+StringToRGBString(IntToString(nV),"733"); bCanBuild=FALSE; } else { sDesc=sDesc+StringToRGBString(IntToString(nV),"555"); } sDesc=sDesc+",S:"; nV=GetSoulCost(sID,nNumber); nV=nV*nQuantity; if (nUpgradeFrom>-1) { // upgrade from nUC=GetSoulCost(sID,nUpgradeFrom); nUC=nUC*nQuantity; nV=nV-nUC; } // upgrade from if (nV>nSouls) { sDesc=sDesc+StringToRGBString(IntToString(nV),"733"); bCanBuild=FALSE; } else { sDesc=sDesc+StringToRGBString(IntToString(nV),"555"); } sDesc=sDesc+")"; nV=GetMinimumLevelReq(sID,nNumber); if (nV>0) { // minimum level required sDesc=sDesc+"(Lvl Req:"; if (nV>nLevel) { sDesc=sDesc+StringToRGBString(IntToString(nV),"733"); bCanBuild=FALSE; } else { sDesc=sDesc+StringToRGBString(IntToString(nV),"555"); } sDesc=sDesc+")"; } // minimum level required nV=GetTaxIn(sID,nNumber); if (nV>0) { // tax in nUC=GetLocalInt(GetModule(),"nManaGoldMultiplier"); if (nUC<1) nUC=1; nV=nV*nUC; sDesc=sDesc+"[Income:"+StringToRGBString(IntToString(nV),"777")+"]"; } // tax in nV=GetTaxOut(sID,nNumber); if (nV>0) { // tax out sDesc=sDesc+"[Hourly Cost:"+StringToRGBString(IntToString(nV),"474")+"]"; } // tax out sS=GetUnitSubRaceOverride(sID,nNumber); if (GetStringLength(sS)>0&&GetStringUpperCase(GetSubRace(oPC))==GetStringUpperCase(sS)) bOverride=TRUE; sS=GetRequiredItem(sID,nNumber); if (bConsumeItem&&GetStringLength(sS)>0&&sS!="NA") { // consumeable item required sDesc=sDesc+"(Consumeable Item:'"; if (GetIsObjectValid(oPC)) { // PC exists if (fnGetHasQtyOfItem(oPC,sS,nQuantity)) { // has the item sDesc=sDesc+StringToRGBString(GetUnitIRequiredName(sID,nNumber),"555"); } // has the item else { // does not have sufficient quantity of the item sDesc=sDesc+StringToRGBString(GetUnitIRequiredName(sID,nNumber),"733"); bCanBuild=FALSE; } // does not have sufficient quantity of the item } // PC exists else { // list item sDesc=sDesc+StringToRGBString(GetUnitIRequiredName(sID,nNumber),"555"); } // list item sDesc=sDesc+"')"; } // consumeable item required else if (GetStringLength(sS)>0&&sS!="NA") { // required item sDesc=sDesc+"(Item:'"; if (GetIsObjectValid(oPC)) { // PC exists oOb=GetItemPossessedBy(oPC,sS); if (GetIsObjectValid(oOb)) { // has item sDesc=sDesc+StringToRGBString(GetUnitIRequiredName(sID,nNumber),"555"); } // has item else { // does not have item sDesc=sDesc+StringToRGBString(GetUnitIRequiredName(sID,nNumber),"733"); if (!bOverride) bCanBuild=FALSE; } // does not have item } // PC exists else { // list item sDesc=sDesc+StringToRGBString(GetUnitIRequiredName(sID,nNumber),"555"); } // list item sDesc=sDesc+"')"; } // required item sS=GetRequiredUnit(sID,nNumber); if (GetStringLength(sS)>0&&sS!="NA") { // required unit oOb=GetObjectByTag(sS); sDesc=sDesc+"(Unit:'"; if (GetIsObjectValid(oOb)) { // unit exists sDesc=sDesc+StringToRGBString(GetUnitURequiredName(sID,nNumber),"555"); } // unit exists else { // unit does not exist sDesc=sDesc+StringToRGBString(GetUnitURequiredName(sID,nNumber),"733"); if (!bOverride) bCanBuild=FALSE; } // unit does not exist sDesc=sDesc+"')"; } // required unit sS=GetUnitSubRaceOverride(sID,nNumber); if (GetStringLength(sS)>0) { // sub-race override sDesc=sDesc+"(Override:'"+StringToRGBString(sS,"555")+"')"; } // sub-race override if (GetCanUpgrade(sID,nNumber)) { // can upgrade sDesc=sDesc+"["+StringToRGBString("Upgradeable","474")+"]"; } // can upgrade if (GetCanGrow(sID,nNumber)) { // timed upgrade sDesc=sDesc+"["+StringToRGBString("Grows","474")+"]"; } // timed upgrade if (GetCanHarvest(sID,nNumber)) { // can harvest sDesc=sDesc+"["+StringToRGBString("Harvests","474")+"]"; } // can harvest if (GetCanScout(sID,nNumber)) { // can scout sDesc=sDesc+"["+StringToRGBString("Scouts","474")+"]"; } // can scout nV=GetLightSensitivity(sID,nNumber); if (nV>0) { // light sensitivity if (nV==1) { // light sensitive sDesc=sDesc+"["+StringToRGBString("Light Sensitive","744")+"]"; } // light sensitive else if (nV==2) { // sun fatal sDesc=sDesc+"["+StringToRGBString("Sun Fatal","744")+"]"; } // sun fatal } // light sensitivity if (bCanBuild) sDesc=StringToRGBString(sName,"477")+": "+sDesc; else { sDesc=StringToRGBString(sName,"755")+": "+sDesc; } return sDesc; } // GetUnitDescription() int HasSufficientResources(object oPC,int nNumber,int nQuantity,int nUpgradeFrom=-1) { object oMod=GetModule(); int bRet=TRUE; string sID=GetLocalString(oPC,"sTeamID"); int nMana=fnGetTeamMana(oPC); int nGold=GetGold(oPC); int nSouls=fnGetTeamSouls(oPC); int nV; int nUC; string sS,sU; object oIt; int bOverride=FALSE; object oLeader=GetLocalObject(oMod,"oTeamLead"+sID); int nLevel=GetLevelByPosition(1,oLeader)+GetLevelByPosition(2,oLeader)+GetLevelByPosition(3,oLeader); string sSROverride=GetUnitSubRaceOverride(sID,nNumber); int bConsumeItem=GetUnitConsumeItem(sID,nNumber); nV=GetCanBeCreated(sID,nNumber); if (nV!=TRUE&&nUpgradeFrom<0) return FALSE; if (bConsumeItem) { // consumeable item required sS=GetRequiredItem(sID,nNumber); if (nUpgradeFrom>-1) { // upgrade check sU=GetRequiredItem(sID,nUpgradeFrom); if (!GetUnitConsumeItem(sID,nUpgradeFrom)||sU!=sS) { // new items to be consumed if (!fnGetHasQtyOfItem(oPC,sS,nQuantity)) return FALSE; } // new items to be consumed } // upgrade check else { // consume item if (!fnGetHasQtyOfItem(oPC,sS,nQuantity)) return FALSE; } // consume item } // consumeable item required if (GetStringLength(sSROverride)>0&&sSROverride!=GetSubRace(oPC)) { // not sub-race overridden sS=GetRequiredItem(sID,nNumber); if (sS!="NA"&&GetStringLength(sS)>2) { // item required bOverride=TRUE; oIt=GetItemPossessedBy(oPC,sS); if (oIt==OBJECT_INVALID) return FALSE; } // item required sS=GetRequiredUnit(sID,nNumber); if (sS!="NA"&&GetStringLength(sS)>2) { // unit is required bOverride=TRUE; bRet=FALSE; nV=0; oIt=GetObjectByTag(sS,nV); while(oIt!=OBJECT_INVALID&&bRet==FALSE) { // check units with tag if (GetLocalString(oIt,"sTeamID")==sID) bRet=TRUE; nV++; oIt=GetObjectByTag(sS,nV); } // check units with tag if (!bRet) return FALSE; } // unit is required if(!bOverride) return FALSE; } // not sub-race overridden nV=GetMinimumLevelReq(sID,nNumber); if (nLevel-1) { // upgrade nUC=GetManaCost(sID,nUpgradeFrom); nV=nV-(nUC*nQuantity); } // upgrade if (nMana-1) { // upgrade nUC=GetGoldCost(sID,nUpgradeFrom); nV=nV-(nUC*nQuantity); } // upgrade if (nGold-1) { // upgrade nUC=GetSoulCost(sID,nUpgradeFrom); nV=nV-(nUC*nQuantity); } // upgrade if (nSouls0) { // consume items if (GetTag(oItem)==sItemTag) { // this is the item nStack=GetItemStackSize(oItem); if (nStack==1) { // one item nRem=nRem-1; DelayCommand(0.1,DestroyObject(oItem)); } // one item else { // multiple item stack if (nStack<=nRem) { // consume stack nRem=nRem-nStack; DelayCommand(0.1,DestroyObject(oItem)); } // consume stack else { // decrease stack SetItemStackSize(oItem,nStack-nRem); nRem=0; } // decrease stack } // multiple item stack } // this is the item oItem=GetNextItemInInventory(oPC); } // consume items } // fnConsumeItems() void TakeResourceCost(object oPC,int nNumber,int nQuantity,int nUpgradeFrom=-1) { object oMod=GetModule(); int bRet=TRUE; string sID=GetLocalString(oPC,"sTeamID"); int nMana=fnGetTeamMana(oPC); int nGold=GetGold(oPC); int nSouls=fnGetTeamSouls(oPC); int nV; int nUC; string sS; if (GetUnitConsumeItem(sID,nNumber)) { // consumeable items sS=GetRequiredItem(sID,nNumber); if (sS!="NA"&&GetStringLength(sS)>0) fnConsumeItems(oPC,sS,nQuantity); } // consumeable items nV=GetManaCost(sID,nNumber); nV=nV*nQuantity; if (nUpgradeFrom>-1) { // upgrade nUC=GetManaCost(sID,nUpgradeFrom); nV=nV-(nUC*nQuantity); } // upgrade nMana=nMana-nV; if (nV>0) fnSetTeamMana(oPC,nMana); nV=GetGoldCost(sID,nNumber); nV=nV*nQuantity; if (nUpgradeFrom>-1) { // upgrade nUC=GetGoldCost(sID,nUpgradeFrom); nV=nV-(nUC*nQuantity); } // upgrade if (nV>0) TakeGoldFromCreature(nV,oPC,TRUE); nV=GetSoulCost(sID,nNumber); nV=nV*nQuantity; if (nUpgradeFrom>-1) { // upgrade nUC=GetSoulCost(sID,nUpgradeFrom); nV=nV-(nUC*nQuantity); } // upgrade nSouls=nSouls-nV; if (nV>0) fnSetTeamSouls(oPC,nSouls); } // TakeResourceCost() //void main(){}