#include "rd_camptype" #include "rd_spawnmobs" #include "rd_misc" void SpawnCamps(string sZone, int iLevel, int iSpecialSpawn = 0); void SpawnCamp(string sZone, int iCamp, int iLevel); void SpawnMobs(string sZone, int iLevel); void SpawnMob(string sEncounter); object SpawnQuestCamp(string sZone, int iCamp, int iLevel, int iLeader=0, string sCType = ""); int CampPoints(string sZone, int iCamp); int IsQuestCampUsed(string sZone, int iCamp); //int CheckForHardcore(); void SpawnCamps(string sZone, int iLevel, int iSpecialSpawn = 0) { string sCampTest; string sTagBase; int iIndex; int iFlag; int iArea; int iBaseLevel; int iSpawned; int iRandom; object oEncounter; object oCreature; object oArea; iIndex = 1; iFlag = 1; sCampTest = sZone + "_C1_Boss"; oEncounter = GetObjectByTag(sCampTest); if (GetIsObjectValid(oEncounter)) { oArea = GetArea(oEncounter); iArea=GetIsAreaInterior(oArea); //iBaseLevel=AdjustLevel(iLevel); if (iSpecialSpawn == 0) { if (iArea == FALSE) SetupCampTypes(iLevel,0,0,1); else SetupCampTypes(iLevel,0,1,1); } else { SetupSpecialCamps(iSpecialSpawn); } iSpawned = GetLocalInt(oArea,"Spawned"); while (iFlag == 1) { sCampTest = sZone + "_C" + IntToString(iIndex) + "_Boss"; oEncounter = GetObjectByTag(sCampTest); if (GetIsObjectValid(oEncounter)) if (iSpawned == 0) { DelayCommand(0.1f,SpawnCamp(sZone,iIndex,iLevel)); } else { iRandom = Random(4); if (iRandom > 0) DelayCommand(0.1f,SpawnCamp(sZone,iIndex,iLevel)); } else iFlag = 0; iIndex++; if (iIndex>99) iFlag = 0; } } } void SpawnCamp(string sZone, int iCamp, int iLevel) { int iFlag; int iIndex; int iType; int iBoss; int iBaseLevel; int iBase; int iBaseStart; int iBaseMax; int iCampType; int iCampPoints; int iArea; string sEncounter; string sBossTest; string sCampType; string sTreasure; object oEncounter; object oCreature; object oArea; object oMod; object oEnemyBoss; object oTreasure; location lEncounter; location lHostage; string sHostage; int iHostage; int iAltSpawn; int iSkip; oMod = GetModule(); sEncounter = sZone + "_C" + IntToString(iCamp) + "_Boss"; oArea=GetArea(GetObjectByTag(sEncounter)); iBoss = 0; sBossTest = sZone + "_C" + IntToString(iCamp) + "_Boss_S"; oCreature = GetObjectByTag(sBossTest); if (GetIsObjectValid(oCreature)) { iBoss=1; sCampType = GetLocalString(oCreature,"CampType"); iBaseLevel = GetLocalInt(oCreature,"BaseLevel"); iBase = GetLocalInt(oCreature,"iBase"); iBaseStart = GetLocalInt(oCreature,"iBaseStart"); iBaseMax= GetLocalInt(oCreature,"iBaseMax"); iCampType= GetLocalInt(oCreature,"iCampType"); iAltSpawn = GetLocalInt(oCreature,"iAltSpawn"); } else { sTreasure = sZone + "_C" + IntToString(iCamp) + "_Treasure"; oTreasure = GetObjectByTag(sTreasure); if (GetIsObjectValid(oTreasure)) SetLocalInt(oTreasure,"NW_DO_ONCE",0); iBaseLevel=iLevel; //Deal with one camp attacking and killing another camp's boss by populating with the apparent winner oEncounter = GetObjectByTag(sEncounter); if (GetLocalString(oEncounter,"EN4AttackedBy") == "") { sCampType = GetCampType(); } else { oEnemyBoss = GetObjectByTag(GetLocalString(oEncounter,"EN4AttackedBy")); if (GetIsObjectValid(oEnemyBoss) && GetLocalString(oEnemyBoss,"CampType") == GetLocalString(oEncounter,"EN4AttackedByCampType")) { sCampType = GetLocalString(oEnemyBoss,"CampType"); SetLocalInt(oMod,"iBase",GetLocalInt(oEnemyBoss,"iBase")); SetLocalInt(oMod,"iBaseStart",GetLocalInt(oEnemyBoss,"iBaseStart")); SetLocalInt(oMod,"iBaseMax",GetLocalInt(oEnemyBoss,"iBaseMax")); SetLocalInt(oMod,"iCampType",GetLocalInt(oEnemyBoss,"iCampType")); } else { sCampType = GetCampType(); } } SetLocalString(oEncounter,"EN4AttackedBy",""); SetLocalString(oEncounter,"EN4AttackedByCampType",""); iBase = GetLocalInt(oMod,"iBase"); iBaseStart = GetLocalInt(oMod,"iBaseStart"); iBaseMax = GetLocalInt(oMod,"iBaseMax"); iCampType = GetLocalInt(oMod,"iCampType"); SetLocalInt(oMod,"iBase",0); SetLocalInt(oMod,"iBaseStart",0); SetLocalInt(oMod,"iBaseMax",0); SetLocalInt(oMod,"iCampType",0); sEncounter = sZone + "_C" + IntToString(iCamp) + "_Boss"; //if less than 5 camp spawn points don't spawn boss mob, spawn type 3 instead. iCampPoints = CampPoints(sZone, iCamp); if (iCampPoints > 4) { oCreature = GetCampMob(99,sEncounter,sCampType,iBaseLevel,iBaseStart,iBase,iBaseMax,iCampType); iHostage = Random(15); if (sCampType == "dwarf" || sCampType == "elf" || sCampType == "human" || sCampType == "halfling" || sCampType == "angelic") iHostage=1; if (iCampType == 1 && iHostage == 0) { lHostage = GetLocation(oCreature); sHostage = "en3_hostage" + IntToString(Random(6)+1); CreateObject(OBJECT_TYPE_CREATURE,sHostage,lHostage); if (Random(6)==0) { sHostage = "en3_hostage" + IntToString(Random(6)+1); CreateObject(OBJECT_TYPE_CREATURE,sHostage,lHostage); } } } else { oCreature = GetCampMob(3,sEncounter,sCampType,iBaseLevel,iBaseStart,iBase,iBaseMax,iCampType); } SetLocalString(oCreature,"CampType",sCampType); SetLocalInt(oCreature,"BaseLevel",iBaseLevel); SetLocalInt(oCreature,"iBase",iBase); SetLocalInt(oCreature,"iBaseStart",iBaseStart); SetLocalInt(oCreature,"iBaseMax",iBaseMax); SetLocalInt(oCreature,"iCampType",iCampType); iAltSpawn = 0; if (CheckHardcore()) iAltSpawn = Random(3)+1; SetLocalInt(oCreature,"iAltSpawn",iAltSpawn); } iType = 1; while (iType <4) { iFlag = 1; iIndex = 1; while (iFlag == 1) { sEncounter = sZone + "_C" + IntToString(iCamp) + "_T" + IntToString(iType) + "_" + IntToString(iIndex); oEncounter = GetObjectByTag(sEncounter); if (GetIsObjectValid(oEncounter)) { if (iAltSpawn == 0) DelayCommand(0.5f,SpawnCampMob(iType,sEncounter,sCampType,iBaseLevel,iBaseStart,iBase,iBaseMax,iCampType)); else { iSkip = FALSE; if (iAltSpawn == 1 && iIndex % 2 == 0) iSkip = TRUE; if (iAltSpawn == 2 && iIndex % 2 == 1) iSkip = TRUE; if (iAltSpawn == 3 && iIndex % 3 == 0) iSkip = TRUE; if (iSkip == FALSE) DelayCommand(0.5f,SpawnCampMob(iType,sEncounter,sCampType,iBaseLevel,iBaseStart,iBase,iBaseMax,iCampType)); } } else iFlag =0; iIndex++; if (iIndex > 1000) { iFlag = 0; } } iType++; } } int CampPoints(string sZone, int iCamp) { int iType; int iFlag; int iIndex; int iCount; string sEncounter; object oEncounter; //set iCount to one and skip Boss which is a given iCount = 1; iType = 1; while (iType <4) { iFlag = 1; iIndex = 1; while (iFlag == 1) { sEncounter = sZone + "_C" + IntToString(iCamp) + "_T" + IntToString(iType) + "_" + IntToString(iIndex); oEncounter = GetObjectByTag(sEncounter); if (GetIsObjectValid(oEncounter)) { iCount++; } else iFlag =0; iIndex++; if (iIndex > 1000) { iFlag = 0; } } iType++; } return iCount; } void SpawnMobs(string sZone, int iLevel) { string sTagBase; string sEncounter; int iRandom; int iFlag; int iIndex; int iArea; int iSpawned; location lEncounter; object oEncounter; object oCreature; object oArea; //SendMessageToPC(GetFirstPC(),"Checking Zone"); sTagBase = sZone + "_S_"; iFlag = 1; iIndex = 1; sEncounter = sTagBase + IntToString(iIndex); oEncounter = GetObjectByTag(sEncounter); if (GetIsObjectValid(oEncounter)) { oArea=GetArea(oEncounter); iArea=GetIsAreaInterior(oArea); if (iArea == FALSE) SetCreatureTags(iLevel,0); else SetCreatureTags(iLevel,1); iSpawned = GetLocalInt(oArea,"Spawned"); while (iFlag == 1) { sEncounter = sTagBase + IntToString(iIndex); iIndex++; oEncounter = GetObjectByTag(sEncounter); //SendMessageToPC(GetFirstPC(),"Checking " + sEncounter); if (GetIsObjectValid(oEncounter)) { if (iSpawned == 0) { SpawnMob(sEncounter); } else { iRandom = Random(4); if (iRandom > 0) SpawnMob(sEncounter); } } else { iFlag = 0; } if (iIndex > 1000) { iFlag = 0; } } } } void SpawnMob(string sEncounter) { object oCreature; object oCreature2; object oSpawn; location lLoc; string sCreature; int iNewLevel; int iRace; int iFlag; int iRandom; int iTest; oCreature = GetObjectByTag(sEncounter + "_S"); //oCreature2 = GetObjectByTag(sEncounter + "_W"); //if (!GetIsObjectValid(oCreature) && !GetIsObjectValid(oCreature2)) if (!GetIsObjectValid(oCreature)) { sCreature=GetCreatureTag(); oSpawn=GetCreature(sEncounter,sCreature); if (Random(5) == 0) SetLocalInt(oCreature,"Wander",Random(10)+1); iRace = GetRacialType(oSpawn); iFlag = 0; switch (iRace) { case RACIAL_TYPE_DRAGON: case RACIAL_TYPE_DWARF: case RACIAL_TYPE_ELF: case RACIAL_TYPE_FEY: case RACIAL_TYPE_GIANT: case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFELF: case RACIAL_TYPE_HALFLING: case RACIAL_TYPE_HALFORC: case RACIAL_TYPE_HUMAN: case RACIAL_TYPE_HUMANOID_GOBLINOID: case RACIAL_TYPE_HUMANOID_MONSTROUS: case RACIAL_TYPE_HUMANOID_ORC: case RACIAL_TYPE_HUMANOID_REPTILIAN: case RACIAL_TYPE_OUTSIDER: case RACIAL_TYPE_SHAPECHANGER: case RACIAL_TYPE_UNDEAD: iFlag = 1; break; } if (iFlag == 1) { iRandom = Random(100)+1; if (iRandom < (GetHitDice(oSpawn)/6 + 1)) { if (Random(2)==0) CreateRandomItem(oSpawn); else GetMagicItem(oSpawn); } } } } int IsQuestCampUsed(string sZone, int iCamp) { string sBossTest; object oCreature; int iReturn; sBossTest = sZone + "_Q" + IntToString(iCamp) + "_Boss_S"; oCreature = GetObjectByTag(sBossTest); iReturn = FALSE; if (GetIsObjectValid(oCreature)) iReturn=TRUE; return iReturn; } object SpawnQuestCamp(string sZone, int iCamp, int iLevel, int iLeader=0, string sCType = "") { int iFlag; int iIndex; int iType; int iBaseLevel; int iBase; int iBaseStart; int iBaseMax; int iCampType; int iArea; int iAltSpawn; int iSkip; string sEncounter; string sBossTest; string sCampType; string sCD; object oEncounter; object oCreature; object oBoss; object oMod; object oArea; location lEncounter; oMod = GetModule(); sEncounter = sZone + "_Q" + IntToString(iCamp) + "_Boss"; oEncounter = GetObjectByTag(sEncounter); oArea = GetArea(oEncounter); iArea=GetIsAreaInterior(oArea); iBaseLevel=iLevel; if (iArea == FALSE) SetupCampTypes(iBaseLevel,1,0,0); else SetupCampTypes(iBaseLevel,1,1,0); if (sCType == "") sCampType = GetCampType(); else sCampType = GetSpecificCampType(sCType); iBase = GetLocalInt(oMod,"iBase"); iBaseStart = GetLocalInt(oMod,"iBaseStart"); iBaseMax = GetLocalInt(oMod,"iBaseMax"); iCampType = GetLocalInt(oMod,"iCampType"); sCD = GetLocalString(oMod,"sCD"); //debug line //SendMessageToPC(GetFirstPC(),"Spawn Specific camptype " + sCampType + " at type " + IntToString(iCampType)); SetLocalInt(oMod,"iBase",0); SetLocalInt(oMod,"iBaseStart",0); SetLocalInt(oMod,"iBaseMax",0); SetLocalInt(oMod,"iCampType",0); SetLocalString(oMod,"sCD",""); sEncounter = sZone + "_Q" + IntToString(iCamp) + "_Boss"; oBoss = GetCampMob(99,sEncounter,sCampType,iBaseLevel,iBaseStart,iBase,iBaseMax,iCampType); SetLocalString(oBoss,"CampType",sCampType); SetLocalInt(oBoss,"BaseLevel",iBaseLevel); SetLocalInt(oBoss,"iBase",iBase); SetLocalInt(oBoss,"iBaseStart",iBaseStart); SetLocalInt(oBoss,"iBaseMax",iBaseMax); SetLocalInt(oBoss,"iCampType",iCampType); SetLocalString(oBoss,"Description",sCD); iAltSpawn = 0; if (CheckHardcore()) iAltSpawn = Random(3)+1; SetLocalInt(oBoss,"iAltSpawn",iAltSpawn); iType = 1; while (iType <4) { iFlag = 1; iIndex = 1; while (iFlag == 1) { sEncounter = sZone + "_Q" + IntToString(iCamp) + "_T" + IntToString(iType) + "_" + IntToString(iIndex); oEncounter = GetObjectByTag(sEncounter); if (GetIsObjectValid(oEncounter)) { if (iAltSpawn == 0) DelayCommand(0.5f,SpawnCampMob(iType,sEncounter,sCampType,iBaseLevel,iBaseStart,iBase,iBaseMax,iCampType)); else { iSkip = FALSE; if (iAltSpawn == 1 && iIndex % 2 == 0) iSkip = TRUE; if (iAltSpawn == 2 && iIndex % 2 == 1) iSkip = TRUE; if (iAltSpawn == 3 && iIndex % 3 == 0) iSkip = TRUE; if (iSkip == FALSE) DelayCommand(0.5f,SpawnCampMob(iType,sEncounter,sCampType,iBaseLevel,iBaseStart,iBase,iBaseMax,iCampType)); } } else iFlag =0; iIndex++; if (iIndex > 1000) { iFlag = 0; } } iType++; } return oBoss; }