Files
dsrc/sku.0/sys.server/compiled/game/script/poi/tusken_attack/master.script
T
2013-09-10 23:17:15 -07:00

485 lines
12 KiB
Plaintext

/**
* Copyright (c) ©2000,2001 Sony Online Entertainment Inc.
* All Rights Reserved
*
* Title: master.script
* Description: master poi object script: POI = gangwar
* @author $Author: breinhart $
* @version $Revision: #1 $
*/
//------------------------------------------------
// Includes
//------------------------------------------------
include library.ai_lib;
include library.scenario;
include library.poi;
include library.locations;
//------------------------------------------------
// Inherits
//------------------------------------------------
inherits theme_park.poi.base;
//------------------------------------------------
// Constants
//------------------------------------------------
const string SCENARIO_NAME = "tusken_attack";
const string LOG_NAME = "poiTuskenAttack Master";
const string BASE_PATH = "poi." + SCENARIO_NAME;
const string SCRIPT_ANTAGONIST = BASE_PATH + ".antagonist";
const string SCRIPT_BEAST = BASE_PATH + ".beast";
const string SCRIPT_MEDIATOR = BASE_PATH + ".mediator";
const string TBL = "datatables/poi/" + SCENARIO_NAME + "/setup.iff";
const string MEDIATOR_THUG_TYPE = "MEDIATOR_THUG_TYPE";
const string MEDIATOR_LEADER_TYPE = "MEDIATOR_LEADER_TYPE";
const string MEDIATOR_BEAST_TYPE = "MEDIATOR_BEAST_TYPE";
const string MEDIATOR_COUNT = "MEDIATOR_COUNT";
const string ANTAGONIST_THUG_TYPE = "ANTAGONIST_THUG_TYPE";
const string ANTAGONIST_LEADER_TYPE = "ANTAGONIST_LEADER_TYPE";
const string ANTAGONIST_BEAST_TYPE = "ANTAGONIST_BEAST_TYPE";
const string ANTAGONIST_COUNT = "ANTAGONIST_COUNT";
const string THEATER_FILE = "THEATER_FILE";
const int DEFAULT_ANTAGONIST_COUNT = 1;
const int MAX_DIFF = 70;
const string joyEmotes[] = { "cheer", "applaud", "laugh", "yes", "glow" };
//------------------------------------------------
// Methods
//------------------------------------------------
//------------------------------------------------
// OnAttach
//------------------------------------------------
trigger OnAttach()
{
if ( !scenario.initScenario( self, TBL ) )
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// OnInitialize
//------------------------------------------------
trigger OnInitialize()
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// OnUnloadedFromMemory
//------------------------------------------------
trigger OnUnloadedFromMemory()
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// cleanupScenario
//------------------------------------------------
messageHandler cleanupScenario()
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// destroySelf
//------------------------------------------------
messageHandler destroySelf()
{
destroyObject( self );
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// initScenario
//
// Called by message from OnAttach.
// This calls all methods necessary to set up the POI.
//------------------------------------------------
messageHandler initScenario()
{
// Validate parameters.
if ( (params == null) || (params.isEmpty()) )
{
scenario.cleanup(self);
return SCRIPT_CONTINUE;
}
/*
Environment Setup
*/
// Get our mediator types.
setObjVar( self, MEDIATOR_THUG_TYPE, params.getString( MEDIATOR_THUG_TYPE ) );
setObjVar( self, MEDIATOR_LEADER_TYPE, params.getString( MEDIATOR_LEADER_TYPE ) );
setObjVar( self, MEDIATOR_BEAST_TYPE, params.getString( MEDIATOR_BEAST_TYPE ) );
setObjVar( self, MEDIATOR_COUNT, params.getInt( MEDIATOR_COUNT ) );
// Get our antagonist type.
setObjVar( self, ANTAGONIST_THUG_TYPE, params.getString( ANTAGONIST_THUG_TYPE ) );
setObjVar( self, ANTAGONIST_LEADER_TYPE,params.getString( ANTAGONIST_LEADER_TYPE ) );
setObjVar( self, ANTAGONIST_BEAST_TYPE, params.getString( ANTAGONIST_BEAST_TYPE ) );
setObjVar( self, ANTAGONIST_COUNT, params.getInt( ANTAGONIST_COUNT ) );
// Get our theater file
setObjVar( self, THEATER_FILE, params.getString( THEATER_FILE ) );
// Create teams.
scenario.createTeam( self, "mediator", self.toString() + "_mediator" );
scenario.createTeam( self, "antagonist", self.toString() + "_antagonist" );
/*
Spawn Theaters
*/
if ( !createTheater( self ) )
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
/*
Spawn Antagonist
*/
if ( !createAntagonist( self ) )
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
if ( !createAntagonistMinions( self ) )
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
/*
Spawn Mediators
*/
if ( !createMediator( self ) )
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
if ( !createMediatorMinions( self ) )
{
scenario.cleanup( self );
return SCRIPT_CONTINUE;
}
obj_id a = poi.findObject( "antagonist_0" );
messageTo( a, "startAttack", null, 90, false );
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// createTheater
//
// Spawns the theater for the scenario.
//------------------------------------------------
boolean createTheater( obj_id self )
{
string theater_file = getStringObjVar(self, THEATER_FILE);
if (theater_file == null || theater_file.equals(""))
return false;
// Create the theater.
obj_id theater = poi.createObject( theater_file, 0, 0 );
if ( (theater == null) || (theater == obj_id.NULL_ID) )
return false;
// Store theater reference.
setObjVar( self, "theater", theater );
return true;
}
//------------------------------------------------
// handleTheaterComplete
//
// Called when the theaters load.
//------------------------------------------------
messageHandler handleTheaterComplete()
{
/*
Finalize theater.
*/
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// createAntagonist
//------------------------------------------------
boolean createAntagonist( obj_id self )
{
// Spawn the scenario antagonist.
string type = getStringObjVar( self, ANTAGONIST_LEADER_TYPE );
string ident = "antagonist_0";
location baseloc = getLocation(self);
baseloc.z += 60;
location loc = null;
int i = 0;
while (i < 10)
{
loc = locations.getGoodLocationAroundLocation(baseloc, 10, 10, 75, 25);
if (loc != null)
break;
i++;
}
if (loc == null)
return false;
obj_id antagonist = scenario.createTeamNpc( self, "antagonist", type, ident, loc );
if ( (antagonist == null) || (antagonist == obj_id.NULL_ID) )
return false;
// Assign initial behavior to the antagonist.
ai_lib.setDefaultCalmBehavior( antagonist, ai_lib.BEHAVIOR_SENTINEL );
attachScript( antagonist, SCRIPT_ANTAGONIST );
return true;
}
//------------------------------------------------
// createAntagonistMinions
//
// Creates the rest of the antagonist group.
//------------------------------------------------
boolean createAntagonistMinions(obj_id self)
{
location baseloc = getLocation(self);
location leaderloc = getLocation(scenario.getRandomTeamMember(self, "antagonist"));
string type = getStringObjVar(self, ANTAGONIST_THUG_TYPE);
string beasttype = getStringObjVar(self, ANTAGONIST_BEAST_TYPE);
int count = getIntObjVar(self, ANTAGONIST_COUNT);
if ( !type.equals("") )
{
for (int i = 0; i < count; i++)
{
string ident = "antagonist_" + (i + 1);
location minionloc = new location(leaderloc);
minionloc.x += (rand(-6,6) * 5);
minionloc.z += (rand(-6,6) * 5);
obj_id minion = scenario.createTeamNpc(self, "antagonist", type, ident, minionloc);
if ((minion == null) || (minion == obj_id.NULL_ID))
{
LOG(LOG_NAME, "Couldn't create antagonist minion.");
}
else
{
ai_lib.setDefaultCalmBehavior(minion, ai_lib.BEHAVIOR_SENTINEL);
attachScript(minion, SCRIPT_ANTAGONIST);
}
}
for (int i = -1; i <= 1; i++)
{
string ident = "antagonist_" + (count + i + 2);
location beastloc = new location(leaderloc);
beastloc.x += 5;
beastloc.z += 5;
float xdelta = baseloc.x - beastloc.x;
float zdelta = baseloc.z - beastloc.z;
beastloc.x += ((10 * i) * (xdelta/zdelta));
beastloc.z += (10 * i);
obj_id beast = scenario.createTeamNpc( self, "antagonist", beasttype, ident, beastloc );
if ((beast== null) || (beast== obj_id.NULL_ID))
{
LOG(LOG_NAME, "Couldn't create antagonist beast.");
}
else
{
ai_lib.setDefaultCalmBehavior( beast, ai_lib.BEHAVIOR_SENTINEL );
attachScript( beast, SCRIPT_BEAST );
}
}
}
return true;
}
//------------------------------------------------
// createMediator
//------------------------------------------------
boolean createMediator( obj_id self )
{
// Spawn the scenario mediator (prisoner leader).
string type = getStringObjVar( self, MEDIATOR_LEADER_TYPE );
string ident = "mediator_0";
location loc = getLocation( self );
loc.z += 15;
obj_id mediator = scenario.createTeamNpc( self, "mediator", type, ident, loc );
if ( (mediator == null) || (mediator == obj_id.NULL_ID) )
return false;
// Assign initial behavior to the mediator.
setYaw( mediator, 180 );
ai_lib.setDefaultCalmBehavior( mediator, ai_lib.BEHAVIOR_SENTINEL );
attachScript( mediator, SCRIPT_MEDIATOR );
return true;
}
//------------------------------------------------
// createMediatorMinions
//
// Creates the rest of the mediator group.
//------------------------------------------------
boolean createMediatorMinions( obj_id self )
{
location baseloc = getLocation( self );
string type = getStringObjVar( self, MEDIATOR_THUG_TYPE );
string beasttype = getStringObjVar( self, MEDIATOR_BEAST_TYPE );
if ( !type.equals("") )
{
int count = getIntObjVar( self, MEDIATOR_COUNT );
for ( int i = 0; i < count; i++ )
{
string ident = "mediator_" + (i + 1);
float xdelta = rand(-15,15) * 2;
float zdelta = 15 + (rand(-3,5) * 2);
location loiterloc = new location( baseloc );
loiterloc.x += xdelta;
loiterloc.z += zdelta;
obj_id mediator;
if ( (i==4) && !beasttype.equals("none") )
mediator = scenario.createTeamNpc( self, "mediator", beasttype, ident, loiterloc );
else
mediator = scenario.createTeamNpc( self, "mediator", type, ident, loiterloc );
if ( (mediator == null) || (mediator == obj_id.NULL_ID) )
{
LOG( LOG_NAME, "Couldn't create mediator minion." );
}
else
{
setYaw( mediator, 180 );
ai_lib.setDefaultCalmBehavior( mediator, ai_lib.BEHAVIOR_SENTINEL );
attachScript( mediator, SCRIPT_MEDIATOR );
}
}
}
return true;
}
//------------------------------------------------
// handleActorDeath
//------------------------------------------------
messageHandler handleActorDeath()
{
// Get antagonists
obj_id[] antagonists = scenario.getTeamMembers( "antagonist" );
if ( antagonists == null )
return SCRIPT_CONTINUE;
// Get mediators.
obj_id[] mediators = scenario.getTeamMembers( "mediator" );
if ( mediators == null )
return SCRIPT_CONTINUE;
// Are all antagonists dead?
int deadcount = scenario.getDeadTeamMemberCount( self, "antagonist" );
if ( (deadcount) == antagonists.length )
{
// All antagonists are dead.
celebrateVictory( mediators, "m_victory" );
return SCRIPT_CONTINUE;
}
// Are all mediators dead?
deadcount = scenario.getDeadTeamMemberCount( self, "mediator" );
if ( (deadcount) == mediators.length )
{
// Everyone is dead.
celebrateVictory( antagonists, "a_victory" );
return SCRIPT_CONTINUE;
}
return SCRIPT_CONTINUE;
}
//------------------------------------------------
// celebrateVictory
//------------------------------------------------
void celebrateVictory( obj_id[] team, string comment )
{
int j = 0;
for ( int i=0; i<team.length; i++ )
{
if ( isIncapacitated( team[i] ) || isDead( team[i] ) )
continue;
string skeleton = dataTableGetString("datatables/ai/species.iff", ai_lib.aiGetSpecies( team[i] ), "Skeleton");
if ( skeleton != "human" )
continue;
// Celebrate.
ai_lib.setDefaultCalmBehavior( team[i], ai_lib.BEHAVIOR_WANDER );
stop( team[i] );
int whichsocial = rand( 0, 4 );
queueCommand( team[i], ##"social", null, joyEmotes[whichsocial], COMMAND_PRIORITY_DEFAULT );
messageTo( team[i], "resumeDefaultCalmBehavior", null, 3, false );
// Leader say somethin.
if ( j == 0 )
poi.quickSay( team[i], comment );
j++;
}
}