// -------------------------------------------------------- // sparky_inc Sparky Spawner v2 include file // // original version by Sparky1479 // recode and expansion by Malishara // // 10/28/2009 Malishara: added SMS encounter type // 10/29/2009 Malishara: added static encounter type // added music encounter type // 11/10/2009 Malishara: added disable encounter type // 11/14/2009 Malishara: added equip and unequip encounter types // 11/20/2009 Malishara: added ability to store encounters on, // and spawn from, a trigger // -------------------------------------------------------- #include "mali_string_fns" #include "mcs_inc" #include "x0_i0_position" #include "dm_sm_inc" int WhichSlot(string sSlot) { if (sSlot == "head") { return INVENTORY_SLOT_HEAD; } if (sSlot == "lefthand") { return INVENTORY_SLOT_LEFTHAND; } if (sSlot == "righthand") { return INVENTORY_SLOT_RIGHTHAND; } if (sSlot == "cloak") { return INVENTORY_SLOT_CLOAK; } if (sSlot == "arms") { return INVENTORY_SLOT_ARMS; } if (sSlot == "belt") { return INVENTORY_SLOT_BELT; } if (sSlot == "boots") { return INVENTORY_SLOT_BOOTS; } if (sSlot == "rightring") { return INVENTORY_SLOT_RIGHTRING; } if (sSlot == "leftring") { return INVENTORY_SLOT_LEFTRING; } if (sSlot == "arrows") { return INVENTORY_SLOT_ARROWS; } if (sSlot == "bolts") { return INVENTORY_SLOT_BOLTS; } if (sSlot == "bullets") { return INVENTORY_SLOT_BULLETS; } if ((sSlot == "neck") || (sSlot == "necklace") || (sSlot == "amulet")) { return INVENTORY_SLOT_NECK; } if ((sSlot == "chest") || (sSlot == "armor") || (sSlot == "torso")) { return INVENTORY_SLOT_CHEST; } return -1; } object FindSMSWidget(string sSMS_Crate, string sName) { object oSMS_Crate = GetObjectByTag(sSMS_Crate); if (!GetIsObjectValid(oSMS_Crate)) { return OBJECT_INVALID; } object oSMS = GetFirstItemInInventory(oSMS_Crate); int iLoop = TRUE; while (iLoop) { if (!GetIsObjectValid(oSMS)) { iLoop = FALSE; } else if (GetStringLowerCase(sName) == GetStringLowerCase(SearchAndReplace(SearchAndReplace(GetName(oSMS), ",", ""), " ", ""))) { iLoop = FALSE; } else { oSMS = GetNextItemInInventory(oSMS_Crate); } } return oSMS; } int ProcessTrapType(string sTrapType) { string sTrapStrength = FirstWord(sTrapType, " "); string sTrapDamageType = RestWords(sTrapType, " "); int iStrength = 0; if (sTrapStrength == "random") { switch (Random(5)) { case 0: sTrapStrength = "minor"; break; case 1: sTrapStrength = "average"; break; case 2: sTrapStrength = "strong"; break; case 3: sTrapStrength = "deadly"; break; case 4: sTrapStrength = "epic"; break; } } if (sTrapStrength == "epic") { if ((sTrapDamageType == "electrical") || (sTrapDamageType == "electric") || (sTrapDamageType == "elec")) { return 44; } if (sTrapDamageType == "fire") { return 45; } if (sTrapDamageType == "frost") { return 46; } if (sTrapDamageType == "sonic") { return 47; } return Random(4) + 44; } if (sTrapStrength == "minor") { iStrength = 0; } else if (sTrapStrength == "average") { iStrength = 1; } else if (sTrapStrength == "strong") { iStrength = 2; } else if (sTrapStrength == "deadly") { iStrength = 3; } if (sTrapDamageType == "spike") { return iStrength + 0; } else if (sTrapDamageType == "holy") { return iStrength + 4; } else if (sTrapDamageType == "tangle") { return iStrength + 8; } else if (sTrapDamageType == "acid") { return iStrength + 12; } else if (sTrapDamageType == "fire") { return iStrength + 16; } else if ((sTrapDamageType == "electrical") || (sTrapDamageType == "electric") || (sTrapDamageType == "elec")) { return iStrength + 20; } else if (sTrapDamageType == "gas") { return iStrength + 24; } else if (sTrapDamageType == "frost") { return iStrength + 28; } else if (sTrapDamageType == "negative") { return iStrength + 32; } else if (sTrapDamageType == "sonic") { return iStrength + 36; } else if (sTrapDamageType == "acid splash") { return iStrength + 40; } else { return (Random(11) * 4) + iStrength; } return 0; } void ProcessSingleAction(object oCreature, string sAction) { if ((sAction == "walk") || (sAction == "1")) { AssignCommand(oCreature, ActionRandomWalk()); return; } if (sAction == "chair") { object oChair = GetNearestObjectByTag("Chair", oCreature, 1); if (GetIsObjectValid(oChair)) { AssignCommand(oCreature, ActionSit(oChair)); } return; } if (sAction == "dead") { AssignCommand(oCreature, SetIsDestroyable(FALSE, TRUE, TRUE)); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oCreature); return; } if (sAction == "corpse") { AssignCommand(oCreature, SetIsDestroyable(FALSE, FALSE, FALSE)); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oCreature); return; } if (FirstWord(sAction, ":") == "faction") { object oFactionNPC = GetObjectByTag("Faction_" + RestWords(sAction, ":")); if (GetIsObjectValid(oFactionNPC)) { ChangeFaction(oCreature, oFactionNPC); } return; } if (FirstWord(sAction, ":") == "unequip") { string sSlot = RestWords(sAction, ":"); object oItem = GetItemInSlot(WhichSlot(sSlot), oCreature); if (GetIsObjectValid(oItem)) { AssignCommand(oCreature, ActionUnequipItem(oItem)); } return; } if (FirstWord(sAction, ":") == "equip") { string sSlot = FirstWord(RestWords(sAction, ":"), ":"); string sTag = RestWords(RestWords(sAction, ":"), ":"); object oItem = GetItemPossessedBy(oCreature, sTag); if (GetIsObjectValid(oItem)) { AssignCommand(oCreature, ActionEquipItem(oItem, WhichSlot(sSlot))); } return; } int iAnim; if (sAction == "spasm") { iAnim = ANIMATION_LOOPING_SPASM; } else if (sAction == "sit") { iAnim = ANIMATION_LOOPING_SIT_CROSS; } else if (sAction == "threaten") { iAnim = ANIMATION_LOOPING_TALK_FORCEFUL; } else if (sAction == "laugh") { iAnim = ANIMATION_LOOPING_TALK_LAUGHING; } else if (sAction == "talk") { iAnim = ANIMATION_LOOPING_TALK_NORMAL; } else if (sAction == "beg") { iAnim = ANIMATION_LOOPING_TALK_PLEADING; } else if (sAction == "worship") { iAnim = ANIMATION_LOOPING_WORSHIP; } else if (sAction == "pray") { iAnim = ANIMATION_LOOPING_MEDITATE; } else if (sAction == "conjure1") { iAnim = ANIMATION_LOOPING_CONJURE1; } else if (sAction == "conjure2") { iAnim = ANIMATION_LOOPING_CONJURE2; } else { return; } AssignCommand(oCreature, ActionPlayAnimation(iAnim, 1.0f, 9999.0f)); return; } void ProcessActions(object oCreature, string sActionList) { string sAction = FirstWord(sActionList, ";"); sActionList = RestWords(sActionList, ";"); while (sAction != "") { ProcessSingleAction(oCreature, sAction); sAction = FirstWord(sActionList, ";"); sActionList = RestWords(sActionList, ";"); } } location ProcessLocation(string sLoc, string sOffset, int iSpawn, int iTotalSpawns, object oArea) { string sAngle = RestWords(sLoc, "@"); sLoc = FirstWord(sLoc, "@"); location lLoc; float fAngle; if (sAngle == "") { fAngle = IntToFloat(Random(360)); } else if (sAngle == "last") { lLoc = GetLocalLocation(oArea, "lLastSpawn"); fAngle = GetFacingFromLocation(lLoc); } else { fAngle = StringToFloat(sAngle); } string sType = GetStringLowerCase(FirstWord(sLoc, ":")); string sParameter = RestWords(sLoc, ":"); float fOffset = StringToFloat(sOffset); vector vVector; float fROffset; float fFacingOffset = 0.0f; if ((sType == "circle") || (sType == "circleflip")) { if (iSpawn > 0) { lLoc = GetLocalLocation(oArea, "lLastSpawn"); } else { lLoc = ProcessLocation(sParameter, "", 0, 0, oArea); SetLocalLocation(oArea, "lLastSpawn", lLoc); } vVector = GetPositionFromLocation(lLoc); fAngle = (360.0f / IntToFloat(iTotalSpawns)) * iSpawn; if (sType == "circleflip") { fFacingOffset = 180.0f; } lLoc = Location(oArea, GetChangedPosition(vVector, fOffset, fAngle), fFacingOffset + fAngle); return lLoc; } if ((sType == "loc") || (sType == "location")) { sParameter = GetStringLowerCase(sParameter); float fLocX = StringToFloat(FirstWord(sParameter, "x")); sParameter = RestWords(sParameter, "x"); float fLocY = StringToFloat(FirstWord(sParameter, "y")); sParameter = RestWords(sParameter, "y"); float fLocZ = 0.0f; if (sParameter != "") { fLocZ = StringToFloat(FirstWord(sParameter, "z")); } lLoc = Location(oArea, Vector(fLocX, fLocY, fLocZ), fAngle); SetLocalLocation(oArea, "lLastSpawn", lLoc); if (sOffset != "") { vVector = GetPositionFromLocation(lLoc); fROffset = IntToFloat(Random(FloatToInt(fOffset * 100.0f))) / 100.0f; lLoc = Location(oArea, GetChangedPosition(vVector, fROffset, fAngle), fAngle); } return lLoc; } if ((sType == "wp") || (sType == "waypoint")) { lLoc = GetLocation(GetWaypointByTag(sParameter)); SetLocalLocation(oArea, "lLastSpawn", lLoc); if (sOffset != "") { vVector = GetPositionFromLocation(lLoc); fROffset = IntToFloat(Random(FloatToInt(fOffset * 100.0f))) / 100.0f; lLoc = Location(oArea, GetChangedPosition(vVector, fROffset, fAngle), fAngle); } return lLoc; } if ((sType == "object") || (sType == "obj")) { lLoc = GetLocation(GetNearestObjectByTag(sParameter, GetFirstObjectInArea(oArea))); SetLocalLocation(oArea, "lLastSpawn", lLoc); if (sOffset != "") { vVector = GetPositionFromLocation(lLoc); fROffset = IntToFloat(Random(FloatToInt(fOffset * 100.0f))) / 100.0f; lLoc = Location(oArea, GetChangedPosition(vVector, fROffset, fAngle), fAngle); } return lLoc; } if (sType == "last") { lLoc = GetLocalLocation(oArea, "lLastSpawn"); return lLoc; } // Return a random location. Do not use the edges (.05 width). int iAreaX = GetAreaSize(AREA_WIDTH, oArea); int iAreaY = GetAreaSize(AREA_HEIGHT, oArea); float fRandX = IntToFloat(Random(iAreaX * 10)) + (IntToFloat(Random(90)) / 100) + 0.05f; float fRandY = IntToFloat(Random(iAreaY * 10)) + (IntToFloat(Random(90)) / 100) + 0.05f; lLoc = Location(oArea, Vector(fRandX, fRandY, 0.0f), fAngle); SetLocalLocation(oArea, "lLastSpawn", lLoc); return lLoc; } int GetSpawnAmount(string sAmt) { if (TestStringAgainstPattern("*n-*n", sAmt)) { int iLowAmt = StringToInt(FirstWord(sAmt, "-")); int iHighAmt = StringToInt(RestWords(sAmt, "-")); return (Random((iHighAmt - iLowAmt) +1) + iLowAmt); } else { return StringToInt(sAmt); } } int ProcessV2Entry(string sEnc, object oArea, object oDB, string sLocationOverride = "", string sOffsetOverride = "") { string sResRef; int iAmt; string sLocation; string sOffset; location lLocation; int iLoop; object oSpawn; int iEntry; int iContinue; string sAction; string sNewTag; string sType = GetStringLowerCase(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); if (sType == "music") { string sMusic = GetStringLowerCase(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); int iMusicTrack = StringToInt(FirstWord(sEnc, ",")); if (iMusicTrack == 0) { return TRUE; } if (sMusic == "day") { SetLocalInt(oArea, "iSparkyMusicDay", MusicBackgroundGetDayTrack(oArea)); MusicBackgroundStop(oArea); MusicBackgroundChangeDay(oArea, iMusicTrack); } else if (sMusic == "night") { SetLocalInt(oArea, "iSparkyMusicNight", MusicBackgroundGetNightTrack(oArea)); MusicBackgroundStop(oArea); MusicBackgroundChangeNight(oArea, iMusicTrack); } else if (sMusic == "battle") { SetLocalInt(oArea, "iSparkyMusicBattle", MusicBackgroundGetBattleTrack(oArea)); MusicBattleChange(oArea, iMusicTrack); } return (StringToInt(sEnc)); } if ((sType == "creature") || (sType == "npc")) { sResRef = FirstWord(FirstWord(sEnc, ","), ":"); sNewTag = RestWords(FirstWord(sEnc, ","), ":"); sEnc = RestWords(sEnc, ","); iAmt = GetSpawnAmount(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } sAction = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); for (iLoop = 0; iLoop < iAmt; iLoop++) { lLocation = ProcessLocation(sLocation, sOffset, iLoop, iAmt, oArea); oSpawn = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lLocation, FALSE, sNewTag); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); ProcessActions(oSpawn, sAction); } return (StringToInt(sEnc)); } if (sType == "mcs") { object oMCS_Spawn; location lHoldingCell = GetLocation(GetWaypointByTag("MCS_CELL")); string sRecord; string sMCS_Unit = "ENC_MCS_" + FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); string sMCS_BagName = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); object oMCS = FindMCSBag(sMCS_Unit, sMCS_BagName); if (!GetIsObjectValid(oMCS)) { return TRUE; } string sMCSData = GetDescription(oMCS, FALSE, FALSE); iAmt = StringToInt(FirstWord(sMCSData, "|")); sMCSData = RestWords(sMCSData, "|"); sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } sAction = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); for (iLoop = 0; iLoop < iAmt; iLoop++) { lLocation = ProcessLocation(sLocation, sOffset, iLoop, iAmt, oArea); object oMCSSpawn = CreateObject(OBJECT_TYPE_CREATURE, FirstWord(sMCSData, "|"), lHoldingCell); sMCSData = RestWords(sMCSData, "|"); sRecord = FirstWord(sMCSData, "<<>>|"); sMCSData = RestWords(sMCSData, "<<>>|"); RestoreCreature(oMCSSpawn, sRecord); oSpawn = CopyObject(oMCSSpawn, lLocation); DestroyObject(oMCSSpawn); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); ProcessActions(oSpawn, sAction); sLocation = "last"; sOffset = ""; } return (StringToInt(sEnc)); } if (sType == "sms") { string sSMS_Crate = "ENC_SMS_" + FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); string sSMSWidgetName = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); object oSMS = FindSMSWidget(sSMS_Crate, sSMSWidgetName); if (!GetIsObjectValid(oSMS)) { return TRUE; } sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } if ((sLocation == "absolute") || (sLocation == "abs")) { lLocation = ProcessLocation("1.0x1.0y", sOffset, 1, 1, oArea); Unpack(oSMS, lLocation, OBJECT_INVALID, FALSE, FALSE, FALSE, 2); } else { lLocation = ProcessLocation(sLocation, sOffset, 1, 1, oArea); Unpack(oSMS, lLocation, OBJECT_INVALID, TRUE, TRUE, FALSE, 2); } return (StringToInt(sEnc)); } if ((sType == "placeable") || (sType == "prop") || (sType == "static")) { sResRef = FirstWord(FirstWord(sEnc, ","), ":"); sNewTag = RestWords(FirstWord(sEnc, ","), ":"); sEnc = RestWords(sEnc, ","); iAmt = GetSpawnAmount(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } for (iLoop = 0; iLoop < iAmt; iLoop++) { lLocation = ProcessLocation(sLocation, sOffset, iLoop, iAmt, oArea); oSpawn = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, lLocation, FALSE, sNewTag); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); if (sType == "static") { AssignCommand(oSpawn, SetIsDestroyable(FALSE)); } } return (StringToInt(sEnc)); } if ((sType == "waypoint") || (sType == "wp")) { sNewTag = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } lLocation = ProcessLocation(sLocation, sOffset, 1, 1, oArea); oSpawn = CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", lLocation, FALSE, sNewTag); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); return (StringToInt(sEnc)); } if (sType == "item") { sResRef = FirstWord(FirstWord(sEnc, ","), ":"); sNewTag = RestWords(FirstWord(sEnc, ","), ":"); sEnc = RestWords(sEnc, ","); iAmt = GetSpawnAmount(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } for (iLoop = 0; iLoop < iAmt; iLoop++) { lLocation = ProcessLocation(sLocation, sOffset, iLoop, iAmt, oArea); oSpawn = CreateObject(OBJECT_TYPE_ITEM, sResRef, lLocation, FALSE, sNewTag); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); } return (StringToInt(sEnc)); } if ((sType == "trap") || (sType == "traps")) { string sTrapStrength = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); string sTrapDmgType = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); string sTrapType = sTrapStrength + " " + sTrapDmgType; iAmt = GetSpawnAmount(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); float fTrapSize = StringToFloat(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); if (fTrapSize < 1.0f) { fTrapSize = 2.0f; } string sDetectDC = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); string sDisarmDC = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); int iRecoverable = StringToInt(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } for (iLoop = 0; iLoop < iAmt; iLoop++) { lLocation = ProcessLocation(sLocation, sOffset, iLoop, iAmt, oArea); oSpawn = CreateTrapAtLocation(ProcessTrapType(sTrapType), lLocation, fTrapSize); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); if (sDetectDC == "-1") { SetTrapDetectable(oSpawn, FALSE); } else if (sDetectDC != "") { SetTrapDetectDC(oSpawn, StringToInt(sDetectDC)); } if (sDisarmDC == "-1") { SetTrapDisarmable(oSpawn, FALSE); } else if (sDisarmDC != "") { SetTrapDisarmDC(oSpawn, StringToInt(sDisarmDC)); } if (!iRecoverable) { SetTrapRecoverable(oSpawn, FALSE); } } return (StringToInt(sEnc)); } if (sType == "script") { sResRef = FirstWord(FirstWord(sEnc, ","), ":"); string sRunAs = RestWords(FirstWord(sEnc, ","), ":"); object oRunAs; if (sRunAs != "") { oRunAs = GetObjectByTag(sRunAs); if (!GetIsObjectValid(oRunAs)) { oRunAs = oDB; } } else { oRunAs = oDB; } ExecuteScript(sResRef, oRunAs); return TRUE; } if (sType == "group") { string sGroup = "group_" + GetStringLowerCase(FirstWord(sEnc, ",")); iEntry = 1; for (iEntry = 1; sEnc != ""; iEntry++) { sEnc = GetLocalString(oArea, sGroup + ((iEntry < 10) ? "_0" : "_") + IntToString(iEntry)); iContinue = ProcessV2Entry(SearchAndReplace(sEnc, " ", ""), oArea, oDB, sLocationOverride, sOffsetOverride); } return iContinue; } if (sType == "table") { string sTable = "table_" + GetStringLowerCase(FirstWord(sEnc, ",")); int iDieRoll = d100(); int iChance = 0; iEntry = 1; for (iEntry = 1; iDieRoll > iChance; iEntry++) { sEnc = GetLocalString(oArea, sTable + ((iEntry < 10) ? "_0" : "_") + IntToString(iEntry)); iChance = StringToInt(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); } iContinue = ProcessV2Entry(SearchAndReplace(sEnc, " ", ""), oArea, oDB, sLocationOverride, sOffsetOverride); return iContinue; } if ((sType == "level") || (sType == "lvl")) { int iSparkyPartyLvls = GetLocalInt(oArea, "iSparkyPartyLvls"); string sTable = "lvltable_" + GetStringLowerCase(FirstWord(sEnc, ",")); int iEntryLvl = 10000; iEntry = 1; for (iEntry = 1; iSparkyPartyLvls < iEntryLvl; iEntry++) { sEnc = GetLocalString(oArea, sTable + ((iEntry < 10) ? "_0" : "_") + IntToString(iEntry)); iEntryLvl = StringToInt(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); } iContinue = ProcessV2Entry(SearchAndReplace(sEnc, " ", ""), oArea, oDB, sLocationOverride, sOffsetOverride); return iContinue; } if (sType == "copy") { string sAreaTag = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); string sObjTag = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); sNewTag = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); object oSourceArea = GetObjectByTag(sAreaTag); object oObject = GetFirstObjectInArea(oSourceArea); if (GetTag(oObject) != sObjTag) { oObject = GetNearestObjectByTag(sObjTag, oObject); } iAmt = GetSpawnAmount(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); sLocation = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sLocationOverride !="") { sLocation = sLocationOverride; } sOffset = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); if (sOffsetOverride !="") { sOffset = sOffsetOverride; } if (GetObjectType(oObject) == OBJECT_TYPE_CREATURE) { sAction = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); } for (iLoop = 0; iLoop < iAmt; iLoop++) { lLocation = ProcessLocation(sLocation, sOffset, iLoop, iAmt, oArea); oSpawn = CopyObject(oObject, lLocation, OBJECT_INVALID, sNewTag); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); if (GetObjectType(oObject) == OBJECT_TYPE_CREATURE) { ProcessActions(oSpawn, sAction); } } return (StringToInt(sEnc)); } if (sType == "disable") { string sEntry = FirstWord(sEnc, ","); iContinue = StringToInt(RestWords(sEnc, ",")); sEnc = GetLocalString(oDB, "encounter_" + sEntry); if (!TestStringAgainstPattern("OFF:**", sEnc)) { SetLocalString(oDB, "encounter_" + sEntry, "OFF:" + sEnc); SetLocalString(oDB, "sSparky_Disabled_List", GetLocalString(oArea, "sSparky_Disabled_List") + sEntry + " "); } return iContinue; } return TRUE; } int ProcessTime(string sTime) { if (sTime == "always") { return TRUE; } if (sTime == "day") { return GetIsDay(); } if (sTime == "night") { return GetIsNight(); } if (TestStringAgainstPattern("*n", sTime)) { return (StringToInt(sTime) == GetTimeHour()); } if (TestStringAgainstPattern("*n-*n", sTime)) { int iHour = GetTimeHour(); int iHour1 = StringToInt(FirstWord(sTime, "-")); int iHour2 = StringToInt(FirstWord(RestWords(sTime, "-"), ",")); if (iHour2 < iHour1) { return (iHour1 <= iHour) || (iHour <= iHour2); } else { return (iHour1 <= iHour) && (iHour <= iHour2); } } return FALSE; } int ProcessV2Encounter(string sEnc, object oArea, object oDB) { int iRightTime = ProcessTime(GetStringLowerCase(FirstWord(sEnc, ","))); sEnc = RestWords(sEnc, ","); int iChance = StringToInt(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); if ((d100() <= iChance) && iRightTime) { int iContinue = ProcessV2Entry(sEnc, oArea, oDB); return iContinue; } return TRUE; } int ProcessEncounter(string sEnc, object oArea, object oDB) { int iContinue; int iLoop; object oSpawn; if (TestStringAgainstPattern("OFF:**", sEnc)) { return TRUE; } if (GetStringLowerCase(FirstWord(sEnc, ",")) == "v2") { iContinue = ProcessV2Encounter(RestWords(sEnc, ","), oArea, oDB); return iContinue; } if (GetStringLowerCase(FirstWord(sEnc, ":")) == "runscript") { ExecuteScript(RestWords(sEnc, ":"), oDB); return TRUE; } int iChance = StringToInt(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); string sResRef = FirstWord(sEnc, ","); sEnc = RestWords(sEnc, ","); int iAmt = StringToInt(FirstWord(sEnc, ",")); sEnc = RestWords(sEnc, ","); object oWP = GetWaypointByTag(FirstWord(sEnc, ",")); location lWP = GetLocation(oWP); iContinue = StringToInt(RestWords(sEnc, ",")); if (iChance <= d100()) { for (iLoop = 0; iLoop < iAmt; iLoop++) { oSpawn = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lWP); SetLocalInt(oSpawn, "iSparkySpawn", TRUE); AssignCommand(oSpawn, ActionRandomWalk()); } return iContinue; } return TRUE; } void SpawnEncounters(object oArea) { int iDone = FALSE; int iEnc = 1; string sEnc; object oDB = oArea; if (GetObjectType(oArea) == OBJECT_TYPE_TRIGGER) { oArea = GetArea(oDB); int iSparkyTriggers = GetLocalInt(oArea, "iSparkyTriggers"); SetLocalObject(oArea, "oSparkyTrigger" + IntToString(iSparkyTriggers), oDB); SetLocalInt(oArea, "iSparkyTriggers", iSparkyTriggers + 1); } while (!iDone) { sEnc = GetLocalString(oDB, "encounter" + ((iEnc < 10) ? "_0" : "_") + IntToString(iEnc)); sEnc = SearchAndReplace(sEnc, " ", ""); if (sEnc == "") { iDone = TRUE;} else { iDone = ProcessEncounter(sEnc, oArea, oDB); iDone = abs(iDone - 1); iEnc++; } } SetLocalInt(oDB, "iSparkySpawned", TRUE); } void Despawn(object oArea) { object oObject; int iObjectType; int iSpawned; string sEntry; string sEnc; iSpawned = GetLocalInt(oArea, "iSparkySpawned"); if (!iSpawned) { return; } string sSparky_Disabled_List = GetLocalString(oArea, "sSparky_Disabled_List"); while (sSparky_Disabled_List != "") { sEntry = FirstWord(sSparky_Disabled_List, " "); sSparky_Disabled_List = RestWords(sSparky_Disabled_List, " "); sEnc = GetLocalString(oArea, "encounter_" + sEntry); if (TestStringAgainstPattern("OFF:**", sEnc)) { SetLocalString(oArea, "encounter_" + sEntry, RestWords(sEnc, "OFF:")); } } DeleteLocalString(oArea, "sSparky_Disabled_List"); oObject = GetFirstObjectInArea(oArea); while (GetIsObjectValid(oObject)) { iObjectType = GetObjectType(oObject); iSpawned = GetLocalInt(oObject, "iSparkySpawn"); if (iSpawned) { if ((iObjectType == OBJECT_TYPE_PLACEABLE) && GetHasInventory(oObject)) { DestroyContents(oObject); } AssignCommand(oObject, SetIsDestroyable(TRUE)); DestroyObject(oObject); } oObject = GetNextObjectInArea(oArea); } int iMusic = GetLocalInt(oArea, "iSparkyMusicDay"); if ( iMusic!= 0) { MusicBackgroundStop(oArea); MusicBackgroundChangeDay(oArea, iMusic); DeleteLocalInt(oArea, "iSparkyMusicDay"); } iMusic = GetLocalInt(oArea, "iSparkyMusicNight"); if ( iMusic!= 0) { MusicBackgroundStop(oArea); MusicBackgroundChangeNight(oArea, iMusic); DeleteLocalInt(oArea, "iSparkyMusicNight"); } iMusic = GetLocalInt(oArea, "iSparkyMusicBattle"); if ( iMusic!= 0) { MusicBattleChange(oArea, iMusic); DeleteLocalInt(oArea, "iSparkyMusicBattle"); } MusicBackgroundStop(oArea); MusicBackgroundPlay(oArea); SetLocalInt(oArea, "iSparkySpawned", FALSE); int iSparkyTriggers = GetLocalInt(oArea, "iSparkyTriggers"); int iLoop; object oDB; string sDB; for (iLoop = 0; iLoop < iSparkyTriggers; iLoop++) { sDB = "oSparkyTrigger" + IntToString(iLoop); oDB = GetLocalObject(oArea, sDB); SetLocalInt(oDB, "iSparkySpawned", FALSE); DeleteLocalObject(oArea, sDB); } DeleteLocalInt(oArea, "iSparkyTriggers"); }