Files
dsrc/sku.0/sys.server/compiled/game/script/systems/gcw/gcw_city.script
T

1642 lines
54 KiB
Plaintext

include library.ai_lib;
include library.colors_hex;
include library.factions;
include library.gcw;
include library.planetary_map;
include library.player_structure;
include library.trial;
include library.utils;
const location KEREN_ANNOUNCEMENT_ORIGIN = new location (1616, 24, 2705, "naboo", null);
const location BESTINE_ANNOUNCEMENT_ORIGIN = new location (-1097, 12, -3583, "tatooine", null);
const location DEARIC_ANNOUNCEMENT_ORIGIN = new location (435, 6, -2966, "talus", null);
const float KEREN_ANNOUNCEMENT_RADIUS = 700.0f;
const float BESTINE_ANNOUNCEMENT_RADIUS = 450.0f;
const float DEARIC_ANNOUNCEMENT_RADIUS = 650.0f;
const string COLOR_REBELS = "\\" + colors_hex.COLOR_REBELS;
const string COLOR_IMPERIALS = "\\" + colors_hex.COLOR_IMPERIALS;
/*
CITY_OBJECT_BESTINE 9835358 tatooine(-1292.5868, 12.0, -3590.0999)
CITY_OBJECT_DEARIC 9805353 talus(329.7967, 6.0, -2930.803)
CITY_OBJECT_KEREN 9865353 naboo(1434.6715, 13.0, 2771.1726)
*/
const obj_id CITY_OBJECT_BESTINE = getObjIdWithNull(9835358);
const obj_id CITY_OBJECT_DEARIC = getObjIdWithNull(9805353);
const obj_id CITY_OBJECT_KEREN = getObjIdWithNull(9865353);
void qaInstabuild(obj_id[] kits)
{
for(int i = 0, j = kits.length; i < j; i++)
{
if(!isIdValid(kits[i]) || !exists(kits[i]))
{
continue;
}
int construction = getIntObjVar(kits[i], "gcw.constructionQuestsCompleted");
int newConstruction = gcw.GCW_CONSTRUCTION_MAXIMUM / 2;
if(construction >= newConstruction)
{
newConstruction = gcw.GCW_CONSTRUCTION_MAXIMUM;
}
setObjVar(kits[i], "gcw.constructionQuestsCompleted", newConstruction);
messageTo(kits[i], "handleUpdateName", null, 1.0f, false);
}
}
void qaInstaclear(obj_id[] kits)
{
for(int i = 0, j = kits.length; i < j; i++)
{
if(!isIdValid(kits[i]) || !exists(kits[i]))
{
continue;
}
setObjVar(kits[i], "gcw.constructionQuestsCompleted", 0);
messageTo(kits[i], "handleUpdateName", null, 1.0f, false);
}
}
trigger OnHearSpeech(obj_id objSpeaker, string strText)
{
if(!isGod(objSpeaker))
{
return SCRIPT_CONTINUE;
}
dictionary params = trial.getSessionDict(self);
if(strText.equals("gcwcleanup") || strText.equals("gcwend"))
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.OnHearSpeech: God Player: "+objSpeaker+" has used the gcwcleanup command. session: "+params.getInt(trial.MESSAGE_SESSION));
obj_id planet = getPlanetByName("tatooine");
if(!isValidId(planet))
{
debugSpeakMsg(self, "GCW Controller: Failed to find planet Tatooine.");
return SCRIPT_CONTINUE;
}
string city = gcw.getCityFromTable(self);
if(city == null || city.length() <= 0)
{
debugSpeakMsg(self, "GCW Controller: Failed to find city name.");
return SCRIPT_CONTINUE;
}
utils.setScriptVar(planet, "gcw.calendar_time." + city, getCalendarTime() - gcw.GCW_CONSTRUCTION_END_TIMER - gcw.GCW_COMBAT_END_TIMER);
messageTo(self, "cleanupInvasion", params, 1.0f, false);
sendSystemMessageTestingOnly(objSpeaker, "GCW Controller: Cleaning up invasion.");
}
else if(strText.equals("gcwdefensewin"))
{
if(!utils.hasScriptVar(self, "gcw.constructionEnded") && !utils.hasScriptVar(self, "gcw.invasionRunning"))
{
debugSpeakMsg(self, "Must be used when in construction or combat phase.");
return SCRIPT_CONTINUE;
}
CustomerServiceLog("gcw_city_invasion", "gcw_city.OnHearSpeech: God Player: "+objSpeaker+" has used the gcwcleanup command. session: "+params.getInt(trial.MESSAGE_SESSION));
obj_id planet = getPlanetByName("tatooine");
if(!isValidId(planet))
{
debugSpeakMsg(self, "GCW Controller: Failed to find planet Tatooine.");
return SCRIPT_CONTINUE;
}
string city = gcw.getCityFromTable(self);
if(city == null || city.length() <= 0)
{
debugSpeakMsg(self, "GCW Controller: Failed to find city name.");
return SCRIPT_CONTINUE;
}
obj_id defendingGeneral = utils.getObjIdScriptVar(self, "defendingGeneral");
if(!isValidId(defendingGeneral) || !exists(defendingGeneral))
{
return SCRIPT_CONTINUE;
}
resizeable obj_id[] loserDefenseParticipants = new obj_id[0];
resizeable obj_id[] winnerOffenseParticipants = new obj_id[0];
int loserFactionFlag = factions.FACTION_FLAG_UNKNOWN;
int winnerFactionFlag = factions.FACTION_FLAG_UNKNOWN;
if(factions.isImperialorImperialHelper(defendingGeneral))
{
loserDefenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_REBEL);
loserFactionFlag = factions.FACTION_FLAG_REBEL;
winnerOffenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_IMPERIAL);
winnerFactionFlag = factions.FACTION_FLAG_IMPERIAL;
}
else if(factions.isRebelorRebelHelper(defendingGeneral))
{
loserDefenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_IMPERIAL);
loserFactionFlag = factions.FACTION_FLAG_IMPERIAL;
winnerOffenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_REBEL);
winnerFactionFlag = factions.FACTION_FLAG_REBEL;
}
if(loserDefenseParticipants != null && loserDefenseParticipants.length > 0)
{
gcw.awardGcwInvasionParticipants(loserDefenseParticipants, loserFactionFlag, gcw.GCW_TOKENS_LOSER_PARTICIPANTS, gcw.GCW_POINTS_LOSER_PARTICIPANTS, null);
}
if(winnerOffenseParticipants != null && winnerOffenseParticipants.length > 0)
{
string iconicMob = "";
string music = "";
string kudosText = "";
if(winnerFactionFlag == factions.FACTION_FLAG_IMPERIAL)
{
iconicMob = "object/mobile/darth_vader.iff";
music = "sound/music_darth_vader_theme.snd";
kudosText = "gcw_announcement_city_end_safe_imperial_"+planet+"_"+city;
}
else
{
iconicMob = "object/mobile/rebel_emperorsday_leia.iff";
music = "sound/music_leia_theme.snd";
kudosText = "gcw_announcement_city_end_safe_rebel_"+planet+"_"+city;
}
dictionary iconicParams = new dictionary();
iconicParams.put("string_file", "gcw");
if((iconicMob != null && iconicMob.length() > 0)
&& (music != null && music.length() > 0)
&& (kudosText != null && kudosText.length() > 0))
{
iconicParams.put("iconicMob", iconicMob);
iconicParams.put("music", music);
iconicParams.put("kudosText", kudosText);
}
gcw.awardGcwInvasionParticipants(winnerOffenseParticipants, winnerFactionFlag, gcw.GCW_TOKENS_WINNER_PARTICIPANTS, gcw.GCW_POINTS_WINNER_PARTICIPANTS, iconicParams);
}
utils.setScriptVar(planet, "gcw.calendar_time." + city, getCalendarTime() - gcw.GCW_CONSTRUCTION_END_TIMER - gcw.GCW_COMBAT_END_TIMER);
messageTo(self, "cleanupInvasion", params, 1.0f, false);
sendSystemMessageTestingOnly(objSpeaker, "GCW Controller: Defense has won the invasion -- No announcements will be sent.");
}
else if(strText.equals("gcwbegin") || strText.equals("gcwstart"))
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.OnHearSpeech: God Player: "+objSpeaker+" has used the gcwbegin command. session: "+params.getInt(trial.MESSAGE_SESSION));
obj_id planet = getPlanetByName("tatooine");
if(!isValidId(planet))
{
debugSpeakMsg(self, "GCW Controller: Failed to find planet Tatooine.");
return SCRIPT_CONTINUE;
}
string city = gcw.getCityFromTable(self);
if(city == null || city.length() <= 0)
{
debugSpeakMsg(self, "GCW Controller: Failed to find city name.");
return SCRIPT_CONTINUE;
}
string cityConfig = getConfigSetting("GameServer", "gcwcity" + city);
if(cityConfig == null || cityConfig.length() <= 0)
{
sendSystemMessageTestingOnly(objSpeaker, "The city configuration (gcwcity" + city + ") is turned off. OVERRIDING");
utils.setScriptVar(self, "gcw.configOverride", 1);
}
utils.setScriptVar(planet, "gcw.time." + city, getGameTime());
utils.setScriptVar(planet, "gcw.object." + city, self);
utils.setScriptVar(planet, "gcw.calendar_time." + city, getCalendarTime());
messageTo(self, "beginInvasion", null, 1.0f, false);
sendSystemMessageTestingOnly(objSpeaker, "GCW Controller: Starting construction.");
}
else if(strText.equals("gcwendbuild") || strText.equals("gcwstartinvasion"))
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.OnHearSpeech: God Player: "+objSpeaker+" has used the gcwendbuild command. session: "+params.getInt(trial.MESSAGE_SESSION));
obj_id planet = getPlanetByName("tatooine");
if(!isValidId(planet))
{
debugSpeakMsg(self, "GCW Controller: Failed to find planet Tatooine.");
return SCRIPT_CONTINUE;
}
string city = gcw.getCityFromTable(self);
if(city == null || city.length() <= 0)
{
debugSpeakMsg(self, "GCW Controller: Failed to find city name.");
return SCRIPT_CONTINUE;
}
utils.setScriptVar(planet, "gcw.calendar_time." + city, getCalendarTime() - gcw.GCW_CONSTRUCTION_END_TIMER);
messageTo(self, "endConstruction", params, 1.0f, false);
sendSystemMessageTestingOnly(objSpeaker, "GCW Controller: Starting invasion.");
}
else if(strText.equals("gcwkits"))
{
obj_id[] npcs = trial.getObjectsInInstanceBySpawnId(self, "defense_kit");
sendSystemMessageTestingOnly(self, "count: " + npcs.length);
}
else if(strText.equals("gcwquickbuild"))
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.OnHearSpeech: God Player: "+objSpeaker+" has used the gcwquickbuild command. session: "+params.getInt(trial.MESSAGE_SESSION));
obj_id[] kits = trial.getObjectsInInstanceBySpawnId(self, "defense_kit");
qaInstabuild(kits);
int kitsLength = kits.length / 2;
kits = trial.getObjectsInInstanceBySpawnId(self, "defense_patrol");
qaInstabuild(kits);
kitsLength += kits.length / 2;
kits = trial.getObjectsInInstanceBySpawnId(self, "offense_patrol");
qaInstabuild(kits);
kitsLength += kits.length / 2;
kits = trial.getObjectsInInstanceBySpawnId(self, "vehicle_patrol");
qaInstabuild(kits);
kitsLength += kits.length / 2;
sendSystemMessageTestingOnly(objSpeaker, "GCW Controller: " + kitsLength + " Construction kits modified.");
}
else if(strText.equals("gcwquickbuildclear"))
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.OnHearSpeech: God Player: "+objSpeaker+" has used the gcwquickbuildclear command. session: "+params.getInt(trial.MESSAGE_SESSION));
obj_id[] kits = trial.getObjectsInInstanceBySpawnId(self, "defense_kit");
qaInstaclear(kits);
int kitsLength = kits.length / 2;
kits = trial.getObjectsInInstanceBySpawnId(self, "defense_patrol");
qaInstaclear(kits);
kitsLength += kits.length / 2;
kits = trial.getObjectsInInstanceBySpawnId(self, "offense_patrol");
qaInstaclear(kits);
kitsLength += kits.length / 2;
kits = trial.getObjectsInInstanceBySpawnId(self, "vehicle_patrol");
qaInstaclear(kits);
kitsLength += kits.length / 2;
sendSystemMessageTestingOnly(objSpeaker, "GCW Controller: " + kitsLength + " Construction kits modified to zero quests completed.");
}
return SCRIPT_CONTINUE;
}
trigger OnInitialize()
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.OnInitialize: The city sequencer object is starting for the fist time.");
messageTo(self, "checkForInvasion", null, 1.0f, false);
return SCRIPT_CONTINUE;
}
messageHandler checkForInvasion()
{
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
obj_id planet = getPlanetByName("tatooine");
string cityName = gcw.getCityFromTable(self);
if(cityName != null && cityName.length() > 0 && isIdValid(planet))
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.checkForInvasion: The city sequencer object is being checked for a running invasion. session: "+params.getInt(trial.MESSAGE_SESSION));
params = new dictionary();
params.put("sequencer", self);
params.put("city", cityName);
int gameTime = getGameTime();
params.put("gameTime" + cityName, gameTime);
utils.setScriptVar(planet, "gcw.lastTrackTime." + cityName, gameTime);
utils.setScriptVar(self, "phase", gcw.GCW_CITY_PHASE_UNKNOWN);
setAnnouncementLocation(self, cityName);
int percentage = gcw.getRebelPercentileByRegion(self);
if(percentage > 50)
{
utils.setScriptVar(self, "currentOccupyFaction", factions.FACTION_FLAG_REBEL);
}
else
{
utils.setScriptVar(self, "currentOccupyFaction", factions.FACTION_FLAG_IMPERIAL);
}
utils.setScriptVar(self, "cityName", cityName);
messageTo(planet, "gcwInvasionTracker", params, 1.0f, false);
messageTo(self, "updateGcwMapData", params, 5.0f, false);
}
return SCRIPT_CONTINUE;
}
/*
This is the messageHandler received when construction
phase starts.
*/
messageHandler beginInvasion()
{
LOG("gcw_announcement", "beginInvasion init");
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
LOG("gcwlog", "gcw_city beginInvasion");
obj_id planet = getPlanetByName("tatooine");
if(!isIdValid(planet))
{
return SCRIPT_CONTINUE;
}
string cityName = gcw.getCityFromTable(self);
string cityConfig = getConfigSetting("GameServer", "gcwcity" + cityName);
if(!utils.hasScriptVar(self, "gcw.configOverride") && (cityConfig == null || cityConfig.length() <= 0))
{
LOG("gcwlog", "beginInvasion bad config gcwcity" + cityName);
return SCRIPT_CONTINUE;
}
utils.removeScriptVar(self, "gcw.configOverride");
// If the invasion is already running, then do not start again.
if(utils.hasScriptVar(self, "gcw.invasionRunning"))
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.beginInvasion: beginInvasion has been called but according to the city object AN INVASION IS CURRENTLY RUNNING. session: "+params.getInt(trial.MESSAGE_SESSION));
if(cityName == null || cityName.length() < 1)
{
return SCRIPT_CONTINUE;
}
int lastPulse = utils.getIntScriptVar(self, "gcw.time." + cityName);
int gameTime = getGameTime();
if(gameTime - lastPulse > gcw.gcwGetTimeToInvasion()) // 3 hours by default, although can be configured
{
CustomerServiceLog("gcw_city_invasion", "gcw_city.beginInvasion: The city sequencer object had a gcw.invasionRunning var on it. The invasionRunning and constructionEnded vars are being removed because the system thinks we have an invasion that failed to end properly. Removing vars at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
messageTo(self, "cleanupInvasion", params, 1.0f, false);
utils.removeScriptVar(self, "gcw.invasionRunning");
utils.removeScriptVar(planet, "gcw.invasionRunning." + cityName);
utils.removeScriptVar(self, "gcw.constructionEnded");
}
return SCRIPT_CONTINUE;
}
int calendarTime = getCalendarTime();
// When did this city last have its invasion?
int[] convertedCalendarTime = player_structure.convertSecondsTime(calendarTime);
int hour = convertedCalendarTime[1];
CustomerServiceLog("gcw_city_invasion_started", "gcw_city.beginInvasion: cityName: " + cityName+ " interval: " + gcw.gcwGetTimeToInvasion() + " cycle: " + gcw.gcwCalculateInvasionCycle() + " hour: " + hour);
CustomerServiceLog("gcw_city_invasion", "gcw_city.beginInvasion: beginInvasion has been called. we are starting the construction phase at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
messageTo(self, "beginSpawn", null, 1.0f, false);
messageTo(self, "startFactionDefense", null, 5.0f, false);
utils.setScriptVar(self, "gcw.invasionRunning", 1);
gcw_score.setGcwPhase(gcw.GCW_CITY_PHASE_CONSTRUCTION);
utils.setScriptVar(planet, "gcw.invasionRunning." + cityName, 1);
LOG("gcw_announcement", "beginInvasion getting defending general");
return SCRIPT_CONTINUE;
}
void setAnnouncementLocation(obj_id self, string cityName)
{
if(cityName == null || cityName.length() <= 0)
{
return;
}
if(cityName.equals(gcw.CITY_DEARIC))
{
utils.setScriptVar(self, "announcementOrigin", DEARIC_ANNOUNCEMENT_ORIGIN);
utils.setScriptVar(self, "announcementRadius", DEARIC_ANNOUNCEMENT_RADIUS);
utils.setScriptVar(self, "cityObject", CITY_OBJECT_DEARIC);
}
else if(cityName.equals(gcw.CITY_BESTINE))
{
utils.setScriptVar(self, "announcementOrigin", BESTINE_ANNOUNCEMENT_ORIGIN);
utils.setScriptVar(self, "announcementRadius", BESTINE_ANNOUNCEMENT_RADIUS);
utils.setScriptVar(self, "cityObject", CITY_OBJECT_BESTINE);
}
else if(cityName.equals(gcw.CITY_KEREN))
{
utils.setScriptVar(self, "announcementOrigin", KEREN_ANNOUNCEMENT_ORIGIN);
utils.setScriptVar(self, "announcementRadius", KEREN_ANNOUNCEMENT_RADIUS);
utils.setScriptVar(self, "cityObject", CITY_OBJECT_KEREN);
}
}
messageHandler beginInvasionNotifyFactions()
{
LOG("gcw_announcement", "beginInvasionNotifyFactions init");
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
obj_id defendingGeneralList[] = trial.getObjectsInInstanceBySpawnId(self, "defense_camp");
if(defendingGeneralList == null || defendingGeneralList.length <= 0)
{
return SCRIPT_CONTINUE;
}
obj_id defendingGeneral = defendingGeneralList[0];
if(!isValidId(defendingGeneral) || !exists(defendingGeneral))
{
return SCRIPT_CONTINUE;
}
utils.setScriptVar(self, "defendingGeneral", defendingGeneral);
utils.setScriptVar(self, "currentOccupyFaction", getIntObjVar(defendingGeneral, "factionFlag"));
dictionary dict = trial.getSessionDict(self);
messageTo(self, "checkGeneral", dict, 30.0f, false);
if(!utils.hasScriptVar(self, "planetName")
|| !utils.hasScriptVar(self, "cityName"))
{
string planetName = getCurrentSceneName();
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = gcw.getCityFromTable(self);
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
setAnnouncementLocation(self, cityName);
utils.setScriptVar(self, "planetName", planetName);
utils.setScriptVar(self, "cityName", cityName);
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
LOG("gcw_announcement", "beginInvasionNotifyFactions planetName: "+planetName+" cityName: "+cityName);
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
if(factions.isImperialorImperialHelper(defendingGeneral))
{
LOG("gcw_announcement", "beginInvasionNotifyFactions defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_construct_defenses_imperial_");
webster.put("rebel_announcement", "gcw_announcement_call_to_arms_rebel_");
}
else if(factions.isRebelorRebelHelper(defendingGeneral))
{
LOG("gcw_announcement", "beginInvasionNotifyFactions defending general is Rebel");
webster.put("imperial_announcement", "gcw_announcement_call_to_arms_imperial_");
webster.put("rebel_announcement", "gcw_announcement_construct_defenses_rebel_");
}
webster.put("neutral_announcement", "gcw_announcement_construct_defenses_neutral_");
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
CustomerServiceLog("gcw_city_invasion", "gcw_city.beginInvasionNotifyFactions: beginInvasionNotifyFactions has sent all players messages regarding the construction phase starting at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
utils.setScriptVar(self, "phase", gcw.GCW_CITY_PHASE_CONSTRUCTION);
messageTo(self, "updateGcwMapData", params, 0.0f, false);
return SCRIPT_CONTINUE;
}
/*
This is the messageHandler received when the construction
phase is about to end.
*/
messageHandler constructionEndsSoon()
{
LOG("gcw_announcement", "constructionEndsSoon init");
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
if(!utils.hasScriptVar(self, "defendingGeneral") || !utils.hasScriptVar(self, "planetName") || !utils.hasScriptVar(self, "cityName"))
{
return SCRIPT_CONTINUE;
}
obj_id defendingGeneral = utils.getObjIdScriptVar(self, "defendingGeneral");
if(!isValidId(defendingGeneral) || !exists(defendingGeneral))
{
return SCRIPT_CONTINUE;
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
if(factions.isImperialorImperialHelper(defendingGeneral))
{
LOG("gcw_announcement", "constructionEndsSoon defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_building_almost_complete_imperial_");
webster.put("rebel_announcement", "gcw_announcement_rally_for_invasion_rebel_");
}
else if(factions.isRebelorRebelHelper(defendingGeneral))
{
LOG("gcw_announcement", "constructionEndsSoon defending general is Rebel");
webster.put("imperial_announcement", "gcw_announcement_rally_for_invasion_imperial_");
webster.put("rebel_announcement", "gcw_announcement_building_almost_complete_rebel_");
}
webster.put("neutral_announcement", "gcw_announcement_rally_for_invasion_neutral_");
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
CustomerServiceLog("gcw_city_invasion", "gcw_city.constructionEndsSoon: constructionEndsSoon has sent all players messages regarding the construction phase ending soon. Message sent at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
return SCRIPT_CONTINUE;
}
/*
This is the messageHandler received when the battle phase is
about to end.
*/
messageHandler invasionEndsSoon()
{
LOG("gcw_announcement", "invasionEndsSoon init");
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
if(!utils.hasScriptVar(self, "defendingGeneral")
|| !utils.hasScriptVar(self, "planetName")
|| !utils.hasScriptVar(self, "cityName"))
{
return SCRIPT_CONTINUE;
}
obj_id defendingGeneral = utils.getObjIdScriptVar(self, "defendingGeneral");
if(!isValidId(defendingGeneral) || !exists(defendingGeneral))
{
return SCRIPT_CONTINUE;
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
if(factions.isImperialorImperialHelper(defendingGeneral))
{
LOG("gcw_announcement", "invasionEndsSoon defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_invasion_almost_defeated_imperial_");
webster.put("rebel_announcement", "gcw_announcement_invasion_almost_lost_rebel_");
}
else if(factions.isRebelorRebelHelper(defendingGeneral))
{
LOG("gcw_announcement", "invasionEndsSoon defending general is Rebel");
webster.put("imperial_announcement", "gcw_announcement_invasion_almost_lost_imperial_");
webster.put("rebel_announcement", "gcw_announcement_invasion_almost_defeated_rebel_");
}
webster.put("neutral_announcement", "gcw_announcement_invasion_almost_defeated_neutral_");
CustomerServiceLog("gcw_city_invasion", "gcw_city.invasionEndsSoon: invasionEndsSoon has sent all players messages regarding the combat phase ending soon. Message sent at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
return SCRIPT_CONTINUE;
}
//not used yet
messageHandler defenseGeneralUnderSustainedAttack()
{
LOG("gcw_announcement", "defenseGeneralUnderSustainedAttack init");
if(!utils.hasScriptVar(self, "defendingGeneral")
|| !utils.hasScriptVar(self, "planetName")
|| !utils.hasScriptVar(self, "cityName"))
{
return SCRIPT_CONTINUE;
}
obj_id defendingGeneral = utils.getObjIdScriptVar(self, "defendingGeneral");
if(!isValidId(defendingGeneral) || !exists(defendingGeneral))
{
return SCRIPT_CONTINUE;
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
if(factions.isImperialorImperialHelper(defendingGeneral))
{
LOG("gcw_announcement", "defenseGeneralUnderSustainedAttack defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_general_under_attack_imperial_");
}
else if(factions.isRebelorRebelHelper(defendingGeneral))
{
LOG("gcw_announcement", "defenseGeneralUnderSustainedAttack defending general is Rebel");
webster.put("rebel_announcement", "gcw_announcement_general_under_attack_rebel_");
}
webster.put("neutral_announcement", "gcw_announcement_general_under_attack_neutral_");
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
CustomerServiceLog("gcw_city_invasion", "gcw_city.defenseGeneralUnderSustainedAttack: defenseGeneralUnderSustainedAttack has sent all players messages regarding the generals status. Message sent at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
return SCRIPT_CONTINUE;
}
messageHandler startFactionDefense()
{
if(!isIdValid(self) && !exists(self))
{
return SCRIPT_CONTINUE;
}
// Clean up the previous score
gcw_score.clearGcwData();
gcw_score.setGcwPhase(gcw.GCW_CITY_PHASE_CONSTRUCTION);
int percentage = gcw.getRebelPercentileByRegion(self);
obj_id planet = getPlanetByName("tatooine");
string cityName = gcw.getCityFromTable(self);
// Rebels own this region?
if(percentage > 50)
{
LOG("dologging", "gcw_city beginInvasion rebel_defense > 50");
sendSequenceTrigger(self, "rebel_defense");
CustomerServiceLog("gcw_city_invasion", "gcw_city.startFactionDefense: startFactionDefense is setting the city object "+self+" to be rebel_defense at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
utils.setScriptVar(planet, "gcw.factionDefending." + cityName, factions.FACTION_FLAG_REBEL);
}
// Imperials own this region
else if(percentage < 50)
{
LOG("dologging", "gcw_city beginInvasion imperial_defense < 50");
sendSequenceTrigger(self, "imperial_defense");
CustomerServiceLog("gcw_city_invasion", "gcw_city.startFactionDefense: startFactionDefense is setting the city object "+self+" to be imperial_defense at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
utils.setScriptVar(planet, "gcw.factionDefending." + cityName, factions.FACTION_FLAG_IMPERIAL);
}
else if(percentage == 50)
{
LOG("dologging", "gcw_city beginInvasion rebel_defense == 50");
sendSequenceTrigger(self, "rebel_defense");
CustomerServiceLog("gcw_city_invasion", "gcw_city.startFactionDefense: startFactionDefense is setting the city object "+self+" to be rebel_defense at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
utils.setScriptVar(planet, "gcw.factionDefending." + cityName, factions.FACTION_FLAG_REBEL);
}
return SCRIPT_CONTINUE;
}
messageHandler endConstruction()
{
LOG("gcw", "endConstruction");
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
if(utils.hasScriptVar(self, "gcw.constructionEnded"))
{
return SCRIPT_CONTINUE;
}
utils.setScriptVar(self, "gcw.constructionEnded", 1);
gcw_score.setGcwPhase(gcw.GCW_CITY_PHASE_COMBAT);
LOG("gcw", "endConstruction 2");
sendSequenceTrigger(self, "invasion");
if(!utils.hasScriptVar(self, "defendingGeneral")
|| !utils.hasScriptVar(self, "planetName")
|| !utils.hasScriptVar(self, "cityName"))
{
return SCRIPT_CONTINUE;
}
obj_id defendingGeneral = utils.getObjIdScriptVar(self, "defendingGeneral");
if(!isValidId(defendingGeneral) || !exists(defendingGeneral))
{
return SCRIPT_CONTINUE;
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
if(factions.isImperialorImperialHelper(defendingGeneral))
{
LOG("gcw_announcement", "endConstruction defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_man_defenses_imperial_");
webster.put("rebel_announcement", "gcw_announcement_attack_city_rebel_");
CustomerServiceLog("gcw_city_invasion", "gcw_city.endConstruction: Construction Phase over. Imperials are defending city: "+cityName+" from Rebel forces.");
}
else if(factions.isRebelorRebelHelper(defendingGeneral))
{
LOG("gcw_announcement", "endConstruction defending general is Rebel");
webster.put("imperial_announcement", "gcw_announcement_attack_city_imperial_");
webster.put("rebel_announcement", "gcw_announcement_man_defenses_rebel_");
CustomerServiceLog("gcw_city_invasion", "gcw_city.endConstruction: Construction Phase over. Rebels are defending city: "+cityName+" from Imperial forces.");
}
resizeable obj_id[] rebelParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_REBEL);
resizeable obj_id[] imperialParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_IMPERIAL);
gcw.awardGcwInvasionParticipants(rebelParticipants, factions.FACTION_FLAG_REBEL, gcw.GCW_TOKENS_CONSTRUCTION_PHASE, gcw.GCW_POINTS_CONSTRUCTION_PHASE, null);
gcw.awardGcwInvasionParticipants(imperialParticipants, factions.FACTION_FLAG_IMPERIAL, gcw.GCW_TOKENS_CONSTRUCTION_PHASE, gcw.GCW_POINTS_CONSTRUCTION_PHASE, null);
webster.put("neutral_announcement", "gcw_announcement_man_defenses_neutral_");
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
CustomerServiceLog("gcw_city_invasion", "gcw_city.endConstruction: endConstruction has sent all players messages regarding the construction phase has ended. Message sent at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
utils.setScriptVar(self, "phase", gcw.GCW_CITY_PHASE_COMBAT);
messageTo(self, "updateGcwMapData", params, 0.0f, false);
return SCRIPT_CONTINUE;
}
void sendSequenceTrigger(obj_id self, string trig)
{
dictionary dict = trial.getSessionDict(self);
LOG("dologging", "sendSequenceTrigger dict.getInt(MESSAGE_SESSION): " + dict.getInt(trial.MESSAGE_SESSION));
dict.put("triggerType", "triggerId");
dict.put("triggerName", trig);
messageTo(self, "triggerFired", dict, 2.0f, false);
}
messageHandler invasionHalfWayPoint()
{
LOG("gcw_announcement", "invasionHalfWayPoint init");
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
if(!utils.hasScriptVar(self, "defendingGeneral")
|| !utils.hasScriptVar(self, "planetName")
|| !utils.hasScriptVar(self, "cityName"))
{
return SCRIPT_CONTINUE;
}
obj_id defendingGeneral = utils.getObjIdScriptVar(self, "defendingGeneral");
if(!isValidId(defendingGeneral) || !exists(defendingGeneral))
{
return SCRIPT_CONTINUE;
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
if(factions.isImperialorImperialHelper(defendingGeneral))
{
LOG("gcw_announcement", "invasionHalfWayPoint defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_defense_half_done_imperial_");
webster.put("rebel_announcement", "gcw_announcement_attack_half_done_rebel_");
}
else if(factions.isRebelorRebelHelper(defendingGeneral))
{
LOG("gcw_announcement", "invasionHalfWayPoint defending general is Rebel");
webster.put("imperial_announcement", "gcw_announcement_attack_half_done_imperial_");
webster.put("rebel_announcement", "gcw_announcement_defense_half_done_rebel_");
}
webster.put("neutral_announcement", "gcw_announcement_defense_half_done_neutral_");
CustomerServiceLog("gcw_city_invasion", "gcw_city.invasionHalfWayPoint: invasionHalfWayPoint has sent all players messages regarding the combat phase being half over Message sent at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
return SCRIPT_CONTINUE;
}
/*
The City has been invaded and the defenders have lost.
*/
messageHandler defendersEvacuate()
{
LOG("gcw_announcement", "defendersEvacuate init");
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
messageTo(self, "cleanupInvasion", params, 1.0f, false);
if(!utils.hasScriptVar(self, "planetName") || !utils.hasScriptVar(self, "cityName"))
{
return SCRIPT_CONTINUE;
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
obj_id planet = getPlanetByName("tatooine");
if(!isValidId(planet))
{
return SCRIPT_CONTINUE;
}
int faction = utils.getIntScriptVar(planet, "gcw.factionDefending." + cityName);
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
resizeable obj_id[] loserDefenseParticipants = new obj_id[0];
resizeable obj_id[] winnerOffenseParticipants = new obj_id[0];
int loserFactionFlag = factions.FACTION_FLAG_UNKNOWN;
int winnerFactionFlag = factions.FACTION_FLAG_UNKNOWN;
if(faction == factions.FACTION_FLAG_IMPERIAL)
{
LOG("gcw_announcement", "defendersEvacuate defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_city_lost_imperial_");
webster.put("rebel_announcement", "gcw_announcement_city_won_rebel_");
loserDefenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_IMPERIAL);
loserFactionFlag = factions.FACTION_FLAG_IMPERIAL;
winnerOffenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_REBEL);
winnerFactionFlag = factions.FACTION_FLAG_REBEL;
CustomerServiceLog("gcw_city_invasion", "gcw_city.cityAttackUnsuccessful: Imperials have lost the city: "+cityName+". Rebel forces have successfully invaded. The General has been killed.");
}
else if(faction == factions.FACTION_FLAG_REBEL)
{
LOG("gcw_announcement", "defendersEvacuate defending general is Rebel");
webster.put("imperial_announcement", "gcw_announcement_city_won_imperial_");
webster.put("rebel_announcement", "gcw_announcement_city_lost_rebel_");
loserDefenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_REBEL);
loserFactionFlag = factions.FACTION_FLAG_REBEL;
winnerOffenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_IMPERIAL);
winnerFactionFlag = factions.FACTION_FLAG_IMPERIAL;
CustomerServiceLog("gcw_city_invasion", "gcw_city.cityAttackUnsuccessful: Rebels have lost the city: "+cityName+". Imperial forces have successfully invaded. The General has been killed.");
}
gcw_score.setGcwWinner(winnerFactionFlag);
webster.put("neutral_announcement", "gcw_announcement_city_lost_neutral_");
CustomerServiceLog("gcw_city_invasion", "gcw_city.defendersEvacuate: defendersEvacuate has sent all players messages regarding the defense losing the battle. Message sent at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
if(loserDefenseParticipants != null && loserDefenseParticipants.length > 0)
{
gcw.awardGcwInvasionParticipants(loserDefenseParticipants, loserFactionFlag, gcw.GCW_TOKENS_LOSER_PARTICIPANTS, gcw.GCW_POINTS_LOSER_PARTICIPANTS, null);
}
if(winnerOffenseParticipants != null && winnerOffenseParticipants.length > 0)
{
string iconicMob = "";
string music = "";
string kudosText = "";
if(winnerFactionFlag == factions.FACTION_FLAG_IMPERIAL)
{
iconicMob = "object/mobile/darth_vader.iff";
music = "sound/music_darth_vader_theme.snd";
kudosText = "gcw_announcement_city_end_won_imperial_"+planetName+"_"+cityName;
}
else
{
iconicMob = "object/mobile/rebel_emperorsday_leia.iff";
music = "sound/music_leia_theme.snd";
kudosText = "gcw_announcement_city_end_won_rebel_"+planetName+"_"+cityName;
}
dictionary iconicParams = new dictionary();
iconicParams.put("string_file", "gcw");
if((iconicMob != null && iconicMob.length() > 0)
&& (music != null && music.length() > 0)
&& (kudosText != null && kudosText.length() > 0))
{
iconicParams.put("iconicMob", iconicMob);
iconicParams.put("music", music);
iconicParams.put("kudosText", kudosText);
}
gcw.awardGcwInvasionParticipants(winnerOffenseParticipants, winnerFactionFlag, gcw.GCW_TOKENS_WINNER_PARTICIPANTS, gcw.GCW_POINTS_WINNER_PARTICIPANTS, iconicParams);
}
return SCRIPT_CONTINUE;
}
/*
The Defenders have won.
*/
messageHandler cityAttackUnsuccessful()
{
LOG("gcw_announcement", "cityAttackUnsuccessful init");
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
messageTo(self, "cleanupInvasion", params, 1.0f, false);
if(!utils.hasScriptVar(self, "planetName") || !utils.hasScriptVar(self, "cityName"))
{
return SCRIPT_CONTINUE;
}
string planetName = utils.getStringScriptVar(self, "planetName");
if(planetName == null || planetName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
return SCRIPT_CONTINUE;
}
obj_id planet = getPlanetByName("tatooine");
if(!isValidId(planet))
{
return SCRIPT_CONTINUE;
}
int faction = utils.getIntScriptVar(planet, "gcw.factionDefending." + cityName);
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
return SCRIPT_CONTINUE;
}
float announcementRadius = utils.getFloatScriptVar(self, "announcementRadius");
if(announcementRadius <= -1)
{
return SCRIPT_CONTINUE;
}
dictionary webster = new dictionary();
webster.put("string_file", "gcw");
webster.put("planetName", planetName);
webster.put("cityName", cityName);
resizeable obj_id[] loserDefenseParticipants = new obj_id[0];
resizeable obj_id[] winnerOffenseParticipants = new obj_id[0];
int loserFactionFlag = factions.FACTION_FLAG_UNKNOWN;
int winnerFactionFlag = factions.FACTION_FLAG_UNKNOWN;
if(faction == factions.FACTION_FLAG_IMPERIAL)
{
LOG("gcw_announcement", "cityAttackUnsuccessful defending general is Imperial");
webster.put("imperial_announcement", "gcw_announcement_city_safe_imperial_");
webster.put("rebel_announcement", "gcw_announcement_attack_unsuccessful_rebel_");
loserDefenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_REBEL);
loserFactionFlag = factions.FACTION_FLAG_REBEL;
winnerOffenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_IMPERIAL);
winnerFactionFlag = factions.FACTION_FLAG_IMPERIAL;
CustomerServiceLog("gcw_city_invasion", "gcw_city.cityAttackUnsuccessful: Imperials have successfully defended the city: "+cityName+" from Rebel forces.");
}
else if(faction == factions.FACTION_FLAG_REBEL)
{
LOG("gcw_announcement", "cityAttackUnsuccessful defending general is Rebel");
webster.put("imperial_announcement", "gcw_announcement_attack_unsuccessful_imperial_");
webster.put("rebel_announcement", "gcw_announcement_city_safe_rebel_");
loserDefenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_IMPERIAL);
loserFactionFlag = factions.FACTION_FLAG_IMPERIAL;
winnerOffenseParticipants = trial.getNonInstanceFactionParticipants(self, factions.FACTION_FLAG_REBEL);
winnerFactionFlag = factions.FACTION_FLAG_REBEL;
CustomerServiceLog("gcw_city_invasion", "gcw_city.cityAttackUnsuccessful: Rebels have successfully defended the city: "+cityName+" from Imperial forces.");
}
gcw_score.setGcwWinner(winnerFactionFlag);
webster.put("neutral_announcement", "gcw_announcement_city_safe_neutral_");
CustomerServiceLog("gcw_city_invasion", "gcw_city.cityAttackUnsuccessful: cityAttackUnsuccessful has sent all players messages regarding the offense losing the battle. Message sent at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
messageToPlayersOnPlanet("notifyPlayerOfGcwCityEventAnnouncement", webster, 0.0f, announcementOrigin, announcementRadius, false);
if(loserDefenseParticipants != null && loserDefenseParticipants.length > 0)
{
gcw.awardGcwInvasionParticipants(loserDefenseParticipants, loserFactionFlag, gcw.GCW_TOKENS_LOSER_PARTICIPANTS, gcw.GCW_POINTS_LOSER_PARTICIPANTS, null);
}
if(winnerOffenseParticipants != null && winnerOffenseParticipants.length > 0)
{
string iconicMob = "";
string music = "";
string kudosText = "";
if(winnerFactionFlag == factions.FACTION_FLAG_IMPERIAL)
{
iconicMob = "object/mobile/darth_vader.iff";
music = "sound/music_darth_vader_theme.snd";
kudosText = "gcw_announcement_city_end_safe_imperial_"+planetName+"_"+cityName;
}
else
{
iconicMob = "object/mobile/rebel_emperorsday_leia.iff";
music = "sound/music_leia_theme.snd";
kudosText = "gcw_announcement_city_end_safe_rebel_"+planetName+"_"+cityName;
}
dictionary iconicParams = new dictionary();
iconicParams.put("string_file", "gcw");
if((iconicMob != null && iconicMob.length() > 0)
&& (music != null && music.length() > 0)
&& (kudosText != null && kudosText.length() > 0))
{
iconicParams.put("iconicMob", iconicMob);
iconicParams.put("music", music);
iconicParams.put("kudosText", kudosText);
}
gcw.awardGcwInvasionParticipants(winnerOffenseParticipants, winnerFactionFlag, gcw.GCW_TOKENS_WINNER_PARTICIPANTS, gcw.GCW_POINTS_WINNER_PARTICIPANTS, iconicParams);
}
return SCRIPT_CONTINUE;
}
messageHandler cleanupInvasion()
{
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
trial.clearNonInstanceFactionParticipants(self);
utils.setScriptVar(self, "phase", gcw.GCW_CITY_PHASE_UNKNOWN);
messageTo(self, "updateGcwMapData", params, 0.0f, false);
utils.removeScriptVar(self, "gcw.constructionEnded");
utils.removeScriptVar(self, "gcw.invasionRunning");
gcw_score.setGcwPhase(gcw.GCW_CITY_PHASE_UNKNOWN);
obj_id planet = getPlanetByName("tatooine");
string cityName = gcw.getCityFromTable(self);
if(isIdValid(planet))
{
utils.removeScriptVar(planet, "gcw.invasionRunning." + cityName);
utils.removeScriptVar(planet, "gcw.factionDefending." + cityName);
}
messageTo(self, "cleanupSpawn", null, 1.0f, false);
CustomerServiceLog("gcw_city_invasion", "gcw_city.cleanupInvasion: cleanupInvasion is cleaning up all the assets for the battle. This happened at: "+getGameTime()+" session: "+params.getInt(trial.MESSAGE_SESSION));
return SCRIPT_CONTINUE;
}
/*
This handler updates the player overhead map. There are a few possible phases identified
in the handler:
1. Rebel Construction
2. Imperial Construction
3. Rebel Attack
4. Imperial Attack
5. Rebel Occupation
6. Imperial Occupation
*/
messageHandler updateGcwMapData()
{
LOG("gcw_map_data", "updateGcwMapData init");
if(!isIdValid(self) || !exists(self))
{
LOG("gcw_map_data", "!isIdValid(self) || !exists(self)");
return SCRIPT_CONTINUE;
}
if(!utils.hasScriptVar(self, "phase"))
{
LOG("gcw_map_data", "!utils.hasScriptVar(self, 'phase')");
return SCRIPT_CONTINUE;
}
int phase = utils.getIntScriptVar(self, "phase");
if(phase < gcw.GCW_CITY_PHASE_UNKNOWN)
{
LOG("gcw_map_data", "phase < gcw.GCW_CITY_PHASE_UNKNOWN");
return SCRIPT_CONTINUE;
}
obj_id cityObject = utils.getObjIdScriptVar(self, "cityObject");
if(!isValidId(cityObject) || !exists(cityObject))
{
LOG("gcw_map_data_faction", "(!isValidId(cityObject) || !exists(cityObject))");
return SCRIPT_CONTINUE;
}
/*
CHECK TO MAKE SURE THE CITY REGION FACTION IS THE SAME AS
THE OCCUPATION FACTION
*/
if(phase == gcw.GCW_CITY_PHASE_UNKNOWN)
{
LOG("gcw_map_data_faction", "verifyCurrentOccupyFaction");
int percentage = gcw.getRebelPercentileByRegion(self);
if(percentage > -1)
{
// Rebels own this region?
if(percentage > 50)
{
removePlanetaryMapLocation(cityObject);
LOG("gcw_map_data_faction", "switchCurrentOccupyFaction switching to REB faction");
utils.setScriptVar(self, "currentOccupyFaction", factions.FACTION_FLAG_REBEL);
}
// Imperials own this region
else if(percentage < 50)
{
removePlanetaryMapLocation(cityObject);
LOG("gcw_map_data_faction", "switchCurrentOccupyFaction switching to IMP faction");
utils.setScriptVar(self, "currentOccupyFaction", factions.FACTION_FLAG_IMPERIAL);
}
}
}
LOG("gcw_map_data", "updateGcwMapData phase: "+phase);
if(params == null)
{
LOG("gcw_map_data", "(params == null)");
return SCRIPT_CONTINUE;
}
location announcementOrigin = utils.getLocationScriptVar(self, "announcementOrigin");
if(announcementOrigin == null)
{
LOG("gcw_map_data", "(announcementOrigin == null)");
return SCRIPT_CONTINUE;
}
string cityName = utils.getStringScriptVar(self, "cityName");
if(cityName == null || cityName.length() <= 0)
{
LOG("gcw_map_data", "(cityName == null || cityName.length() <= 0)");
return SCRIPT_CONTINUE;
}
string cityFirstLetter = cityName.substring(0,1);
string remainder = cityName.substring(1);
string cityNameString = cityFirstLetter.toUpperCase() + remainder.toLowerCase();
string cityConfig = getConfigSetting("GameServer", "gcwcity" + cityName);
if(cityConfig == null || cityConfig.length() <= 0)
{
LOG("gcw_map_data", "(cityConfig == null || cityConfig.length() <= 0)");
removePlanetaryMapLocation(cityObject);
return SCRIPT_CONTINUE;
}
string color = "";
string defenders = "";
string invaders = "";
string stringName = "";
int faction = utils.getIntScriptVar(self, "currentOccupyFaction");
LOG("gcw_map_data", "updateGcwMapData faction: "+faction);
if(faction != factions.FACTION_FLAG_REBEL && faction != factions.FACTION_FLAG_IMPERIAL)
{
LOG("gcw_map_data", "(cityConfig == null || cityConfig.length() <= 0)");
return SCRIPT_CONTINUE;
}
if(faction == factions.FACTION_FLAG_REBEL)
{
LOG("gcw_map_data", "updateGcwMapData faction is REB");
color = COLOR_REBELS;
defenders = "Rebel";
invaders = "Imperial";
}
else if(faction == factions.FACTION_FLAG_IMPERIAL)
{
LOG("gcw_map_data", "updateGcwMapData faction is IMP");
color = COLOR_IMPERIALS;
defenders = "Imperial";
invaders = "Rebel";
}
if(phase == gcw.GCW_CITY_PHASE_CONSTRUCTION)
{
string theNextPulse = gcw.getFormattedInvasionTime(self, gcw.GCW_CITY_PHASE_CONSTRUCTION);
if(theNextPulse != null && theNextPulse.length() > 0)
{
stringName = color + cityNameString + "\n" + defenders + "s Building Defenses\n"+ theNextPulse;;
}
else
{
stringName = color + cityNameString + "\n" + defenders + "s Building Defenses";
}
}
else if(phase == gcw.GCW_CITY_PHASE_COMBAT)
{
string theNextPulse = gcw.getFormattedInvasionTime(self, gcw.GCW_CITY_PHASE_COMBAT);
if(theNextPulse != null && theNextPulse.length() > 0)
{
stringName = color + cityNameString + "\n" + invaders + "s Invading\n"+ theNextPulse;;
}
else
{
stringName = color + cityNameString + "\n" + invaders + "s Invading ";
}
}
else if(phase == gcw.GCW_CITY_PHASE_UNKNOWN)
{
string theNextPulse = gcw.getFormattedInvasionTime(self, gcw.GCW_CITY_PHASE_UNKNOWN);
if(theNextPulse != null && theNextPulse.length() > 0)
{
stringName = color + cityNameString + "\n" + defenders + " Occupation\n"+ theNextPulse;
}
else
{
stringName = color + cityNameString + "\n" + defenders + " Occupation";
}
}
LOG("gcw_map_data", "updateGcwMapData stringName: "+stringName);
removePlanetaryMapLocation(cityObject);
if(!addPlanetaryMapLocation(cityObject, stringName, (int)announcementOrigin.x, (int)announcementOrigin.z - 10, planetary_map.CITY, null, MLT_STATIC, planetary_map.NO_FLAG))
LOG("gcw_map_data", "updateGcwMapData addPlanetaryMapLocation FAILED to update planet map");
else
LOG("gcw_map_data", "updateGcwMapData addPlanetaryMapLocation successfully updated planet map");
messageTo(self, "updateGcwMapData", params, 60.0f, false);
return SCRIPT_CONTINUE;
}
boolean verifyCurrentOccupyFaction(obj_id cityObject)
{
LOG("gcw_map_data", "switchCurrentOccupyFaction init");
if(!isValidId(cityObject) || !exists(cityObject))
return false;
if(!utils.hasScriptVar(cityObject, "currentOccupyFaction"))
return false;
int faction = utils.getIntScriptVar(cityObject, "currentOccupyFaction");
LOG("gcw_map_data", "switchCurrentOccupyFaction faction: "+faction);
if(faction != factions.FACTION_FLAG_REBEL && faction != factions.FACTION_FLAG_IMPERIAL)
{
return false;
}
int percentage = gcw.getRebelPercentileByRegion(cityObject);
// Rebels own this region?
if(percentage > 50 && faction == factions.FACTION_FLAG_IMPERIAL)
{
LOG("gcw_map_data", "switchCurrentOccupyFaction switching to REB faction");
utils.setScriptVar(cityObject, "currentOccupyFaction", factions.FACTION_FLAG_REBEL);
}
// Imperials own this region
else if(percentage < 50 && faction == factions.FACTION_FLAG_REBEL)
{
LOG("gcw_map_data", "switchCurrentOccupyFaction switching to IMP faction");
utils.setScriptVar(cityObject, "currentOccupyFaction", factions.FACTION_FLAG_IMPERIAL);
}
else if(percentage == 50 && faction == factions.FACTION_FLAG_IMPERIAL)
{
LOG("gcw_map_data", "switchCurrentOccupyFaction switching to REB faction");
utils.setScriptVar(cityObject, "currentOccupyFaction", factions.FACTION_FLAG_REBEL);
}
dictionary dict = trial.getSessionDict(cityObject);
messageTo(cityObject, "updateGcwMapData", dict, 0.0f, false);
return true;
}
// The general is checked every 30 seconds to see if the object is valid.
messageHandler checkGeneral()
{
// self is invalid if the object is null or does not exist
if(!isIdValid(self) || !exists(self))
{
return SCRIPT_CONTINUE;
}
// only process messageTo()'s that are for this version of the sequencer
if(!trial.verifySession(self, params))
{
return SCRIPT_CONTINUE;
}
if(!utils.hasScriptVar(self, "defendingGeneral"))
{
return SCRIPT_CONTINUE;
}
obj_id general = utils.getObjIdScriptVar(self, "defendingGeneral");
if(isIdValid(general) && exists(general))
{
dictionary dict = trial.getSessionDict(self);
messageTo(self, "checkGeneral", dict, 30.0f, false);
return SCRIPT_CONTINUE;
}
CustomerServiceLog("gcw_city_invasion", "gcw_city.checkGeneral: The general is dead, but the invasion has not cleaned up. Starting cleanup!");
obj_id planet = getPlanetByName("tatooine");
if(!isValidId(planet))
{
return SCRIPT_CONTINUE;
}
string cityName = gcw.getCityFromTable(self);
int faction = utils.getIntScriptVar(planet, "gcw.factionDefending." + cityName);
if(faction == factions.FACTION_FLAG_REBEL)
{
sendSequenceTrigger(self, "rebel_general_died");
}
else if(faction == factions.FACTION_FLAG_IMPERIAL)
{
sendSequenceTrigger(self, "imperial_general_died");
}
return SCRIPT_CONTINUE;
}