This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Scripts/PRDemo.cpp

4694 lines
137 KiB
C++
Raw Permalink Normal View History

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/******************************************************************************
*
* FILE
* PRDemo.cpp
*
* DESCRIPTION
* PR Demo Scripts
*
* PROGRAMMER
* Design Team
*
* VERSION INFO
* $Author: Ryan_v $
* $Revision: 21 $
* $Modtime: 7/17/00 10:13a $
* $Archive: /Commando/Code/Scripts/PRDemo.cpp $
*
******************************************************************************/
#include "prdemo.h"
#if 0
/*
MPR_A01_TiberiumCloud
This block controls the tiberium zones - animation and damage.
DEBUG NAMING CONVENTION
DEBUG INNATE?
Parameters:
Death_Rate = DEBUG
Explode_Height = DEBUG
*/
DECLARE_SCRIPT(MPR_A01_TiberiumCloud_PMP, "Death_Rate=5:int,Explode_Height=1.0:float")
{
int Death_Rate;
float Explode_Height;
Vector3 cloud_position;
void Created(GameObject* obj)
{
Death_Rate = Get_Int_Parameter("Death_Rate");
Explode_Height = Get_Float_Parameter("Explode_Height");
Commands->_Start_Timer(obj, this, Commands->Get_Random( 1, Death_Rate ), MPR_TIMER_TIBERIUM_PMP);
}
void Timer_Expired(GameObject* obj, int timerID)
{
if (timerID == MPR_TIMER_TIBERIUM_PMP)
{
cloud_position = Commands->Get_Position(obj);
cloud_position.Z += Explode_Height;
Commands->Create_Explosion("TibCloud",cloud_position,obj);
Commands->_Start_Timer(obj, this, Death_Rate, MPR_TIMER_TIBERIUM_PMP);
}
}
};
/*
MPR_A01_CivLeader
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
Parameters:
Follower_ID = DEBUG
*/
DECLARE_SCRIPT(MPR_A01_CivLeader_PMP, "Follower_ID:int")
{
int Follower_ID;
bool shooting;
Vector3 BarnPoint;
void Created(GameObject* obj)
{
BarnPoint.X = -193;
BarnPoint.Y = -133;
BarnPoint.Z = 4;
MPR_nod_dead_PMP = false;
shooting = false;
MPR_evacing_to_chinook_PMP = false;
Follower_ID = Get_Int_Parameter("Follower_ID");
GameObject* target = Commands->Find_Object(Follower_ID);
if ((Commands->Find_Object(Follower_ID)) && (shooting==false))
{
Commands->Send_Custom_Event(obj, target,MPR_CUSTOM_FOLLOW_ME_DEL, 0);
//Commands->Start_Timer(obj, 2, MPR_TIMER_DELAY_01_PMP);
}
}
void Custom(GameObject* obj, int event, int param, GameObject* host)
{
if (event == MPR_CUSTOM_I_AM_DEAD_DEL)
{
//Commands->Display_Text("Got dead message\n");
MPR_nod_dead_PMP = true;
shooting = true;
Commands->_Start_Timer(obj, this, Commands->Get_Random( 0, 5), MPR_TIMER_DELAY_01_04_PMP);
}
if (event == MPR_CUSTOM_ESCORT_ATTACKED_DEL)
{
//Commands->Display_Text("Got attacked message\n");
Commands->_Start_Timer(obj, this, Commands->Get_Random( 0, 3), MPR_TIMER_DELAY_01_03_PMP);
shooting = true;
}
}
void Timer_Expired(GameObject* obj, int timerID)
{
Vector3 newPoint = RandomVector();
if ((timerID == MPR_TIMER_DELAY_01_PMP) && (Commands->Find_Object(Follower_ID)) && (MPR_nod_dead_PMP == false) && (shooting == false))
{
//Commands->Display_Text("Sending the call\n");
Commands->Send_Custom_Event(obj, Commands->Find_Object(Follower_ID),MPR_CUSTOM_FOLLOW_ME_DEL, 0);
Commands->_Start_Timer(obj, this, 2, MPR_TIMER_DELAY_01_PMP);
}
if (timerID == MPR_TIMER_DELAY_01_03_PMP)
{
ActionParamsStruct params;
params.Set_Animation("S_A_Human.H_A_J21C", false);
Commands->Action_Play_Animation(obj, params);
}
if (timerID == MPR_TIMER_DELAY_01_04_PMP)
{
ActionParamsStruct params;
params.Set_Basic
Commands->Action_Movement_Set_Forward_Speed(obj,.33f);
Commands->Action_Movement_Goto_Location(obj, newPoint,Commands->Get_Random( 0, 2.0 ));
}
}
Vector3 RandomVector(void)
{
Vector3 wanderPoint;
wanderPoint.X = Commands->Get_Random( 0, 3 );
wanderPoint.Y = Commands->Get_Random( 0, 3 );
wanderPoint.Z = 0;
return (BarnPoint + wanderPoint);
}
};
/*
MPR_A01_CivFollower
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
Parameters:
Host_ID = DEBUG
Host_distance = DEBUG
*/
DECLARE_SCRIPT(MPR_A01_CivFollower_PMP, "Host_ID:int, Host_distance=1.5:float")
{
float Host_distance;
int Host_ID;
bool shooting;
void Created(GameObject* obj)
{
shooting = false;
Host_distance = Get_Float_Parameter("Host_distance");
Host_ID = Get_Int_Parameter("Host_ID");
}
void Custom(GameObject* obj, int event, int param, GameObject* host)
{
if (event == MPR_CUSTOM_ESCORT_ATTACKED_DEL)
{
shooting = true;
}
if (( event == MPR_CUSTOM_FOLLOW_ME_DEL ) && ( shooting == false ))
{
//Commands->Display_Text("Heard the call\n");
if (Commands->Find_Object(Host_ID))
{
Commands->Action_Movement_Set_Forward_Speed(obj,.25f);
Commands->Action_Movement_Follow_Object(obj, host, Host_distance);
}
}
}
};
/*
MPR_A01_EscortDestination
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG FRAGMENTED?
*/
DECLARE_SCRIPT(MPR_A01_EscortDestination_PMP,"")
{
void Created(GameObject* obj)
{
//Commands->Display_Text("Moving\n");
Commands->Action_Movement_Set_Forward_Speed(obj, .25f);
//Commands->Action_Movement_Goto_Location(obj,Vector3 (-248,-133,6),0.5f); //Inside Church
Commands->Action_Movement_Goto_Location(obj, Vector3 (-264.0f,-73.0f,-0.67f),0.5f); //temp until pathfind fixed
}
};
/*
MPR_A01_EscortDestination
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG FRAGMENTED
Parameters:
CIV01_ID = DEBUG
CIV02_ID = DEBUG
CIV03_ID = DEBUG
*/
DECLARE_SCRIPT(MPR_A01_EscortDies_PMP,"CIV01_ID:int, CIV02_ID:int, CIV03_ID:int")
{
int CIV01_ID;
int CIV02_ID;
int CIV03_ID;
void Killed(GameObject*obj, GameObject* killer)
{
CIV01_ID = Get_Int_Parameter("CIV01_ID");
CIV02_ID = Get_Int_Parameter("CIV02_ID");
CIV03_ID = Get_Int_Parameter("CIV03_ID");
//Commands->Display_Text("I am dead\n");
MPR_nod_dead_PMP = true;
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV01_ID),MPR_CUSTOM_I_AM_DEAD_DEL, 0);
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV02_ID),MPR_CUSTOM_I_AM_DEAD_DEL, 0);
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV03_ID),MPR_CUSTOM_I_AM_DEAD_DEL, 0);
}
};
/*
MPR_A01_SeeEnemy
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG FRAGMENTED?
Parameters:
CIV01_ID = DEBUG
CIV02_ID = DEBUG
CIV03_ID = DEBUG
NOD01_ID = DEBUG
*/
DECLARE_SCRIPT(MPR_A01_SeeEnemy_PMP,"CIV01_ID:int, CIV02_ID:int, CIV03_ID:int, NOD01_ID:int")
{
int CIV01_ID;
int CIV02_ID;
int CIV03_ID;
int NOD01_ID;
Vector3 start_position;
Vector3 newPoint;
bool shooting;
void Created(GameObject* obj)
{
Commands->Enable_Enemy_Seen(obj, true);
shooting = false;
CIV01_ID = Get_Int_Parameter("CIV01_ID");
CIV02_ID = Get_Int_Parameter("CIV02_ID");
CIV03_ID = Get_Int_Parameter("CIV03_ID");
NOD01_ID = Get_Int_Parameter("NOD01_ID");
}
void Enemy_Seen(GameObject* obj, GameObject* enemy)
{
Vector3 shoot_point;
if ((enemy == (Commands->Get_The_Star())) && (shooting == false))
{
GameObject* civie = (Commands->Find_Object(CIV02_ID));
shoot_point = Commands->Get_Position(civie);
Commands->Action_Attack_Location(obj, shoot_point, 0.01f, .01f);
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV01_ID),MPR_CUSTOM_ESCORT_ATTACKED_DEL, 0);
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV02_ID),MPR_CUSTOM_ESCORT_ATTACKED_DEL, 0);
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV03_ID),MPR_CUSTOM_ESCORT_ATTACKED_DEL, 0);
Commands->Send_Custom_Event(obj, Commands->Find_Object(NOD01_ID),MPR_CUSTOM_ESCORT_ATTACKED_DEL, 0);
Commands->Start_Timer(obj, 4, MPR_TIMER_DELAY_01_02_PMP);
}
if ((enemy == (Commands->Get_The_Star())) && (shooting == true))
{
GameObject* target = Commands->Get_The_Star();
Commands->Action_Attack_Object(obj,target,0,5.0f);
Commands->Innate_Enable(obj);
}
}
void Timer_Expired(GameObject* obj, int timerID)
{
if (timerID == MPR_TIMER_DELAY_01_02_PMP)
{
GameObject* target = Commands->Get_The_Star();
Commands->Action_Attack_Object(obj,target,0,5.0f);
shooting = true;
}
}
};
/*
MPR_A01_GET_BARN_ZONE_ID
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG OBSOLETED
*/
DECLARE_SCRIPT(MPR_A01_Get_Barn_Zone_id_PMP,"")
{
void Created(GameObject* obj)
{
MPR_A01_BARNZONE_GOTHERE_ID_PMP = Commands->Get_ID (obj);
}
};
/*
MPR_A01_EVAC_CALL
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG OBSOLETED?
*/
DECLARE_SCRIPT(MPR_A01_Evac_Call_PMP,"")
{
bool evac_entered;
void Created(GameObject* obj)
{
evac_entered = false;
}
void Entered(GameObject* obj, GameObject* enterer)
{
if((enterer != Commands->Get_The_Star()) && (!evac_entered))
{
//Commands->Display_Text("Chinook Created\n");
GameObject* Chinook_evac = Commands->Create_Object( "Chinook_E", Vector3 (0,0,0) );
if (Chinook_evac)
{
//Commands->Display_Text("Anim Started\n");
Commands->Attach_Script(Chinook_evac, "MPR_A01_Chinook_Evac_Civies", "");
evac_entered = true;
}
}
}
};
/*
MPR_A01_Chinook_Evac_Civies
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A01_Chinook_Evac_Civies_PMP,"")
{
int CIV01_ID;
int CIV02_ID;
int CIV03_ID;
void Created(GameObject* obj)
{
CIV01_ID = MPR_A01_CIV01_ID_PMP;
CIV02_ID = MPR_A01_CIV02_ID_PMP;
CIV03_ID = MPR_A01_CIV03_ID_PMP;
Commands->Set_Animation( obj, "V_GDI_CHINOOKE3.m_ch_evacland", false);
}
void Animation_Complete(GameObject* obj, const char* name)
{
if (stricmp (name,"V_GDI_CHINOOKE3.m_ch_evacland") ==0 )
{
Commands->Set_Animation( obj, "V_GDI_CHINOOKE3.m_ch_evacloiter", true);
Commands->Start_Timer(obj, 13, MPR_TIMER_EVAC_PMP );
if (Commands->Find_Object(CIV01_ID))
{
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV01_ID),MPR_CUSTOM_EVAC_CALL_DEL, 0);
}
if (Commands->Find_Object(CIV02_ID))
{
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV02_ID),MPR_CUSTOM_EVAC_CALL_DEL, 0);
}
if (Commands->Find_Object(CIV03_ID))
{
Commands->Send_Custom_Event(obj, Commands->Find_Object(CIV03_ID),MPR_CUSTOM_EVAC_CALL_DEL, 0);
}
}
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if (Timer_ID == MPR_TIMER_EVAC_PMP)
{
Commands->Set_Animation( obj, "V_GDI_CHINOOKE3.m_ch_evacoff", false);
}
}
};
/*
MPR_A01_GET_TO_CHINOOK
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG FRAGMENTED
*/
DECLARE_SCRIPT(MPR_A01_Get_To_Chinook_PMP,"")
{
void Custom(GameObject* obj, int event, int param, GameObject* host)
{
if (event == MPR_CUSTOM_EVAC_CALL_DEL)
{
//Commands->Display_Text("Going to Chinook\n");
MPR_evacing_to_chinook_PMP = true;
Commands->Action_Movement_Goto_Location(obj, Vector3 (-193,-153,2), 1.0f);
}
}
void Movement_Complete(GameObject* obj, MovementCompleteReason reason)
{
if (MPR_evacing_to_chinook_PMP == true)
{
Commands->Destroy_Object(obj);
}
}
};
/*
MPR_A01_GET_CIV01_ID
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG OBSOLETE
*/
DECLARE_SCRIPT(MPR_A01_Get_Civ01_id_PMP,"")
{
void Created(GameObject* obj)
{
MPR_A01_CIV02_ID_PMP = Commands->Get_ID (obj);
}
};
/*
MPR_A01_GET_CIV02_ID
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG OBSOLETE
*/
DECLARE_SCRIPT(MPR_A01_Get_Civ02_id_PMP,"")
{
void Created(GameObject* obj)
{
MPR_A01_CIV01_ID_PMP = Commands->Get_ID (obj);
}
};
/*
MPR_A01_GET_CIV03_ID
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG OBSOLETE
*/
DECLARE_SCRIPT(MPR_A01_Get_Civ03_ID_PMP,"")
{
void Created(GameObject* obj)
{
MPR_A01_CIV03_ID_PMP = Commands->Get_ID (obj);
}
};
/*
M00_Generic_Wandering
This block is a generic wandering around start point script.
DEBUG NAMING CONVENTION
DEBUG OBSOLETE
DEBUG ToolKit script, M00
Parameters:
Wander_radius = DEBUG
Seconds_to_wait = DEBUG
*/
DECLARE_SCRIPT(M00_Generic_Wandering_PMP, "Wander_radius=:float,Seconds_to_wait=:float")
{
Vector3 start_position;
float Seconds_to_wait;
float Wander_radius;
float randomNumber;
float duration;
void Created(GameObject* obj)
{
start_position = Commands->Get_Position(obj);
Wander_radius = Get_Float_Parameter("Wander_radius");
Seconds_to_wait = Get_Float_Parameter("Seconds_to_wait");
Movement_Complete(obj, MOVEMENT_COMPLETE_ARRIVED);
}
void Movement_Complete(GameObject* obj, MovementCompleteReason reason)
{
duration = Commands->Get_Random(0, Seconds_to_wait);
Commands->Display_Text("Setting new timer\n");
Commands->Start_Timer(obj, duration, MPR_TIMER_WANDER_PMP);
}
void Timer_Expired(GameObject* obj, int timerID)
{
if (timerID == MPR_TIMER_WANDER_PMP)
{
Vector3 newPoint = RandomVector();
Commands->Display_Text("Timer expired\n");
Commands->Display_Text("Moving\n");
Commands->Action_Movement_Set_Forward_Speed(obj, 0.30f);
Commands->Action_Movement_Goto_Location(obj, newPoint,1.0f);
}
}
Vector3 RandomVector(void)
{
Vector3 wanderPoint;
wanderPoint.X = Commands->Get_Random( 0, Wander_radius );
wanderPoint.Y = Commands->Get_Random( 0, Wander_radius );
wanderPoint.Z = 0;
return (start_position + wanderPoint);
}
};
/*
MPR_Looping_Path_JDG
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG UNUSED?
Parameters:
DestObjID1 = DEBUG
DestObjID2 = DEBUG
*/
DECLARE_SCRIPT(MPR_Looping_Path_JDG, "DestObjID1=:int, DestObjID2=:int")
{
int m_CurrentDest;
void Created(GameObject* game_obj)
{
m_CurrentDest = 0;
Goto_Dest(game_obj);
}
void Goto_Dest(GameObject* game_obj)
{
// Find the destination 'object'
GameObject* dest_obj = Commands->Find_Object(Get_Int_Parameter(m_CurrentDest));
if (dest_obj != NULL)
{
// Instruct our game object to goto the location of the destination object
Vector3 pos = Commands->Get_Position(dest_obj);
Commands->Action_Movement_Goto_Location(game_obj, pos, 3.0F);
}
else
{
DebugPrint("Error! Cannot find destination for MPR_Looping_Path_JDG.\n");
}
}
void Movement_Complete(GameObject* game_obj, MovementCompleteReason)
{
m_CurrentDest = !m_CurrentDest;
Goto_Dest(game_obj);
}
};
/*
MPR_A03_Bridge_Exploding_DEL
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG UNUSED
Parameters:
AnimationName = DEBUG
*/
DECLARE_SCRIPT(MPR_A03_Bridge_Exploding_DEL, "AnimationName=:string")
{
void Created(GameObject* game_obj)
{
// Set the animation to the first frame
const char* animName = Get_Parameter("AnimationName");
Commands->Set_Animation_Frame(game_obj, animName, 0);
}
void Custom(GameObject* game_obj, int type, int, GameObject*)
{
// Is this the request to trigger the explosion?
// If so, then kick off the animation
if (type == MPR_CUSTOM_EXPLODE_BRIDGE_DEL) {
const char* animName = Get_Parameter("AnimationName");
Commands->Set_Animation(game_obj, animName, false);
}
}
};
/*
MPR_A03_Bridge_Trigger_DEL
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG UNUSED
Parameters:
BridgeID = DEBUG
*/
DECLARE_SCRIPT(MPR_A03_Bridge_Trigger_DEL, "BridgeID=:int")
{
void Entered(GameObject* obj, GameObject* enterer)
{
// Did the player enter the zone?
if (enterer == Commands->Get_The_Star())
{
int bridgeID = Get_Int_Parameter("BridgeID");
GameObject* dest_obj = Commands->Find_Object(bridgeID);
if (dest_obj != NULL)
{
Commands->Send_Custom_Event(obj, dest_obj, MPR_CUSTOM_EXPLODE_BRIDGE_DEL, 0);
}
}
}
};
/*
Demo_Harvester
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
DEBUG UNUSED
Parameters:
RefineryZoneID = DEBUG
TiberiumZoneID = DEBUG
*/
/*
DEBUG - Harvester Behavior being moved to an innate system - DAY
DECLARE_SCRIPT(Demo_Harvester, "RefineryZoneID:int,TiberiumZoneID:int")
{
#define MIN_HARVEST_TIME (30)
#define MAX_HARVEST_TIME (60)
#define MIN_MOVE_TIME (3)
#define MAX_MOVE_TIME (5)
#define MIN_UNLOAD_TIME (15)
#define MAX_UNLOAD_TIME (30)
enum States
{
IDLE,
GOING_TO_TIBERIUM,
HARVESTING,
MOVING,
RETURNING_TO_REFINERY,
DOCKING,
UNLOADING,
};
States mState;
int mRefineryID;
int mTiberiumID;
void Created(GameObject*)
{
DebugPrint("Harvester %d: Behavior created\n", Commands->Get_ID(Owner()));
mRefineryID = Get_Int_Parameter("RefineryZoneID");
mTiberiumID = Get_Int_Parameter("TiberiumZoneID");
DebugPrint("RefineryID = %d, TiberiumID = %d\n", mRefineryID, mTiberiumID);
mState = IDLE;
GotoTiberium();
}
Vector3 FindTiberium(void)
{
// Locate the tiberium zone and pick a random location within the
// zone to go to.
GameObject* tiberium = Commands->Find_Object(mTiberiumID);
if (tiberium != NULL)
{
Vector3 location = Commands->Get_Position(tiberium);
// Vector3 extent = Commands->Get_Extent(tiberium); // See Byon for a new way to do this, if needed
DebugPrint("TiberiumZone Extent %f,%f,%f\n", extent.X, extent.Y, extent.Z);
location += RandomVector3(extent.X, extent.Y, 0.0f);
return location;
}
return Vector3(0.0f, 0.0f, 0.0f);
}
// Go to the tiberium field
void GotoTiberium(void)
{
DebugPrint("Harvester %d: Going to tiberium\n", Commands->Get_ID(Owner()));
Vector3 location = FindTiberium();
Commands->Action_Movement_Goto_Location(Owner(), location, 1.0f);
mState = GOING_TO_TIBERIUM;
}
// Harvest tiberium
void Harvest(void)
{
DebugPrint("Harvester %d: Harvesting\n", Commands->Get_ID(Owner()));
if (mState != HARVESTING)
{
Commands->Set_Animation(Owner(), "v_nod_harvester.m_harvesting", true);
float harvestTime = Commands->Get_Random(MIN_HARVEST_TIME, MAX_HARVEST_TIME);
DebugPrint("Harvest time %f seconds\n", harvestTime);
Commands->Start_Timer(Owner(), harvestTime, MPR_TIMER_HARVESTER_DONE_DEL);
}
float moveTime = Commands->Get_Random(MIN_MOVE_TIME, MAX_MOVE_TIME);
DebugPrint("Move time %f seconds\n", moveTime);
Commands->Start_Timer(Owner(), moveTime, MPR_TIMER_HARVESTER_MOVE_DEL);
mState = HARVESTING;
}
// Move to new location within tiberium field
void MoveToNewSpot(void)
{
Vector3 location = FindTiberium();
Commands->Action_Movement_Goto_Location(Owner(), location, 1.0f);
mState = MOVING;
}
void ReturnToRefinery(void)
{
DebugPrint("Harvester %d: Returning to refinery\n", Commands->Get_ID(Owner()));
// If there isn't a load and we are at the refinery then just sit idle.
GameObject* refinery = Commands->Find_Object(mRefineryID);
if (refinery != NULL)
{
Vector3 location = Commands->Get_Position(refinery);
Commands->Action_Movement_Goto_Location(Owner(), location, 1.0f);
}
mState = RETURNING_TO_REFINERY;
}
void Dock(void)
{
DebugPrint("Harvester %d: Docking\n", Commands->Get_ID(Owner()));
mState = DOCKING;
Unload(); // Denzil - Temporary
}
void Unload(void)
{
DebugPrint("Harvester %d: Unloading\n", Commands->Get_ID(Owner()));
Commands->Start_Timer(Owner(), 5.0f, MPR_TIMER_HARVESTER_DONE_DEL);
mState = UNLOADING;
}
void Movement_Complete(GameObject* obj, MovementCompleteReason reason)
{
DebugPrint("Harvester %d: movement complete\n", Commands->Get_ID(Owner()));
switch (mState)
{
// Upon reaching tiberium begin harvesting.
case GOING_TO_TIBERIUM:
case MOVING:
Harvest();
break;
// Upon reaching refinery begin docking sequence.
case RETURNING_TO_REFINERY:
Dock();
break;
// When docking is complete being unloading.
case DOCKING:
Unload();
break;
default:
break;
}
}
void Timer_Expired(GameObject* obj, int timer)
{
if (timer == MPR_TIMER_HARVESTER_DONE_DEL)
{
DebugPrint("Harvester %d: Done timer expired\n", Commands->Get_ID(Owner()));
switch (mState)
{
// When finished harvesting return to the refinery.
case HARVESTING:
ReturnToRefinery();
break;
// When finished unloading go back to the tiberium field to resume harvesting.
case UNLOADING:
GotoTiberium();
break;
default:
break;
}
}
else if (timer == MPR_TIMER_HARVESTER_MOVE_DEL)
{
DebugPrint("Harvester %d: Move timer expired\n", Commands->Get_ID(Owner()));
if (mState == HARVESTING)
{
MoveToNewSpot();
}
}
}
};
*/
/*
MPR_ApacheTrigger
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
Parameters:
ApacheID = DEBUG
Position = DEBUG
*/
DECLARE_SCRIPT(MPR_ApacheTrigger, "ApacheID:int,Position:int")
{
void Entered(GameObject*, GameObject* enterer)
{
GameObject* star = Commands->Get_The_Star();
// Only trigger if the commando entered the zone
if (enterer == star)
{
DebugPrint("Apache attack triggered!\n");
// Get apache object
int apacheID = Get_Int_Parameter("ApacheID");
GameObject* apache = Commands->Find_Object(apacheID);
// Tell the apache were to move
if (apache != NULL)
{
int position = Get_Int_Parameter("Position");
Commands->Send_Custom_Event(Owner(), apache, MPR_CUSTOM_APACHE_GOTO_POSITION_DEL, position);
}
}
}
};
/*
MPR_ApacheShootAtPlayer
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
Parameters:
ApacheID = DEBUG
*/
DECLARE_SCRIPT(MPR_ApacheShootAtPlayer, "ApacheID:int")
{
void Entered(GameObject*, GameObject* enterer)
{
GameObject* star = Commands->Get_The_Star();
// Only trigger if the commando entered the zone
if (enterer == star)
{
DebugPrint("Apache shoot at player enabled!\n");
// Get apache object
int apacheID = Get_Int_Parameter("ApacheID");
GameObject* apache = Commands->Find_Object(apacheID);
// Tell the apache were to move
if (apache != NULL)
{
Commands->Send_Custom_Event(Owner(), apache, MPR_CUSTOM_APACHE_SHOOT_DEL, (int)true);
}
}
}
void Exited(GameObject*, GameObject* exiter)
{
GameObject* star = Commands->Get_The_Star();
// Only trigger if the commando entered the zone
if (exiter == star)
{
DebugPrint("Apache shoot at player disabled!\n");
// Get apache object
int apacheID = Get_Int_Parameter("ApacheID");
GameObject* apache = Commands->Find_Object(apacheID);
// Tell the apache were to move
if (apache != NULL)
{
Commands->Send_Custom_Event(Owner(), apache, MPR_CUSTOM_APACHE_SHOOT_DEL, (int)false);
}
}
}
};
/*
MPR_ApacheController
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_ApacheController, "")
{
typedef enum
{
APACHE_POSITION_FIRST = 0,
APACHE_LANDED = APACHE_POSITION_FIRST,
APACHE_POSITION_1,
APACHE_POSITION_2,
APACHE_POSITION_3,
APACHE_POSITION_4,
APACHE_POSITION_COUNT,
} ApachePosition;
typedef struct
{
const char* TransitionAnim;
const char* HoverAnim;
} Transition;
static Transition _mTransitions[APACHE_POSITION_COUNT];
ApachePosition mCurrentPosition;
ApachePosition mDesiredPosition;
bool mCanShoot;
void Created(GameObject*)
{
DebugPrint("Apache attack script created.\n");
//Denzil: I added this line for an idle animation. Change as you need.
//David Y.
//Commands->Set_Animation(Owner(), "V_APACHE-E3.M_AP_POSITION1", true);
// Rotor anim fix
Vector3 origin(0.0f, 0.0f, 0.0f);
Commands->Set_Position(Owner(), origin);
Commands->Set_Facing(Owner(), 0.0f);
Commands->Set_Animation(Owner(), "M_AP_POSITION1", true);
mCurrentPosition = APACHE_LANDED;
mDesiredPosition = APACHE_LANDED;
mCanShoot = false;
}
void Custom(GameObject* apache, int event, int param, GameObject*)
{
if (event == MPR_CUSTOM_APACHE_GOTO_POSITION_DEL)
{
Goto_Position((ApachePosition)param);
}
else if (event == MPR_CUSTOM_APACHE_SHOOT_DEL)
{
mCanShoot = ((param == 0) ? false : true);
Shoot_At_Player();
}
}
void Goto_Position(ApachePosition position)
{
assert(position >= APACHE_POSITION_FIRST);
assert(position < APACHE_POSITION_COUNT);
// If we are not already at the requested position or in the process of
// going to the requested position.
if ((position != mCurrentPosition) || (position != mDesiredPosition))
{
#if(0)
// If currently in the landed position we must first move to 0.0.0
// because the animations are relative to that.
if (mCurrentPosition == APACHE_LANDED)
{
Vector3 origin(0.0f, 0.0f, 0.0f);
Commands->Set_Position(Owner(), origin);
Commands->Set_Facing(Owner(), 0.0f);
}
#endif
mDesiredPosition = position;
DebugPrint("Apache desired position = %d\n", mDesiredPosition);
Transition& transition = _mTransitions[mDesiredPosition];
Commands->Set_Animation(Owner(), transition.TransitionAnim, false);
}
}
void Animation_Complete(GameObject* apache, const char* finishedAnim)
{
assert(finishedAnim != NULL);
DebugPrint("Apache animation '%s' complete.\n", finishedAnim);
Transition& transition = _mTransitions[mDesiredPosition];
// Verify that the expected animation has completed.
const char* animName = strrchr(finishedAnim, '.');
animName++;
if (stricmp(animName, transition.TransitionAnim) == 0)
{
// Arrived at desired position
mCurrentPosition = mDesiredPosition;
DebugPrint("Apache arrived at position = %d\n", mCurrentPosition);
// Get transition for current position
transition = _mTransitions[mCurrentPosition];
Commands->Set_Animation(Owner(), transition.HoverAnim, true);
}
}
void Timer_Expired(GameObject* obj, int timerID)
{
if (timerID == MPR_TIMER_APACHE_SHOOT_DEL)
{
Shoot_At_Player();
}
}
void Shoot_At_Player(void)
{
// Begin shooting if we can
if (mCanShoot == true)
{
// Only shoot if the apache is not transitioning.
if (mCurrentPosition == mDesiredPosition)
{
GameObject* star = Commands->Get_The_Star();
if (star != NULL)
{
Vector3 targetPosition = Commands->Get_Position(star);
targetPosition.X += Commands->Get_Random(-1.0f, 1.0f);
targetPosition.Y += Commands->Get_Random(-1.0f, 1.0f);
targetPosition.Z += Commands->Get_Random(0.0f, 2.0f);
DebugPrint("Apache shooting at location %.02f,%.02f,%.02f\n",targetPosition.X, targetPosition.Y, targetPosition.Z);
Commands->Trigger_Weapon(Owner(), true, targetPosition, true);
}
}
float fireAtInterval = Commands->Get_Random(0.33f, 1.5f);
Commands->Start_Timer(Owner(), fireAtInterval, MPR_TIMER_APACHE_SHOOT_DEL);
}
else
{
Commands->Trigger_Weapon(Owner(), false, Vector3(0.0f, 0.0f, 0.0f), true);
}
}
virtual void Killed(GameObject* obj, GameObject* killer)
{
DebugPrint("Apache killed.\n");
Commands->Create_Explosion_At_Bone("Vehicle Explosion 01", Owner(), "ROOTTRANSFORM", Owner());
}
virtual void Damaged(GameObject* obj, GameObject* damager)
{
DebugPrint("Apache damaged.\n");
}
};
/*
MPR_ApacheController
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
MPR_ApacheController::Transition MPR_ApacheController::_mTransitions[APACHE_POSITION_COUNT] =
{
// Landed
{NULL, NULL},
// Position 1 - Hover above landing pad
{"m_ap_loitr1", "m_ap_loitr1"},
// Position 2 - Move into position on the right side and hover
{"m_ap_move1-2", "m_ap_loitr2"},
// Position 3 - Move into position on front side and hover.
{"m_ap_move2-3", "m_ap_loitr3"},
// Position 4 - Move into position on the left side and hover
{"m_ap_move1-4", "m_ap_loitr4"},
};
/*
MPR_A01_Orca_Strike_On_Turret
This script handles the operations of the ORCA strike on the turret. When the animations that
are pre-placed upon the map are given a custom to start, they play their own animations and
handle firing operations. This code will change later to incorporate full firing routines for
ORCAs, currently being implemented by programming.
Parameters:
Target_Number = What turret this ORCA should be attacking.
Animation_Name = What animation to play upon this ORCA.
Fire_01 = What frame the first fire should be at.
Fire_02 = What frame the second fire should be at.
Fire_03 = What frame the third fire should be at.
Fire_04 = What frame the fourth fire should be at.
Fire_05 = What frame the fifth fire should be at.
Fire_06 = What frame the sixth fire should be at.
DestructionBone = What bone the explosion animation should be played upon if shot down.
ExplosionName = What explosion to play if shot down.
*/
DECLARE_SCRIPT(MPR_A01_Orca_Strike_On_Turret_RAD, "Target_Number:int, AnimationName:string, Fire_01:int, Fire_02:int, Fire_03:int, Fire_04:int, Fire_05:int, Fire_06:int")
{
Vector3 v_target_loc;
int n_target_number;
int n_attack_number;
void Created(GameObject* p_obj)
{
n_target_number = 0;
n_attack_number = 1;
}
void Custom(GameObject* p_obj, int n_type, int n_param, GameObject* p_sender)
{
if (n_type == MPR_A01_CUSTOM_ORCA_TURRETSTRIKE_RAD)
{
// Set up the appropriate target number for the turret target.
switch(Get_Int_Parameter("Target_Number"))
{
case (1):
{
if (Commands->Find_Object(MPR_A01_orca_turret1_RAD))
{
n_target_number = MPR_A01_orca_turret1_RAD;
}
else
{
DebugPrint("RAD-ERROR - MPR_A01_Orca_Strike_On_Turret - ORCA cannot find its turret 1 target!\n");
Commands->Destroy_Object(p_obj);
}
break;
}
case (2):
{
if (Commands->Find_Object(MPR_A01_orca_turret2_RAD))
{
n_target_number = MPR_A01_orca_turret2_RAD;
}
else
{
DebugPrint("RAD-ERROR - MPR_A01_Orca_Strike_On_Turret - ORCA cannot find its turret 2 target!\n");
Commands->Destroy_Object(p_obj);
}
break;
}
default:
{
DebugPrint("RAD-ERROR - MPR_A01_Orca_Strike_On_Turret - ORCA's Target_Number is inappropriate!\n");
Commands->Destroy_Object(p_obj);
}
}
// Find the location of the turret, and start the attack animation on the ORCA.
v_target_loc = Commands->Get_Position(Commands->Find_Object(n_target_number));
v_target_loc.Z += 0.5f;
Commands->Set_Animation(p_obj, Get_Parameter("AnimationName"), 0);
// Start the timer for the first attack. When this ends the attack happens.
Commands->Start_Timer(p_obj, (Get_Int_Parameter("Fire_01") / 30), MPR_A01_TIMER_ORCASTRIKE_RAD);
}
else
{
DebugPrint("RAD-ERROR - MPR_A01_Orca_Strike_On_Turret - Orca strike received an improper custom!\n");
Commands->Destroy_Object(p_obj);
}
}
void Timer_Expired (GameObject* p_obj, int n_timer_id)
{
int n_newtimercount;
int n_timercount;
n_newtimercount = 0;
n_timercount = 0;
switch (n_timer_id)
{
case(MPR_A01_TIMER_ORCASTRIKE_RAD):
{
// Fire the weapon at the target.
Commands->Trigger_Weapon(p_obj, true, v_target_loc, true);
n_attack_number++;
// Start the timer for turning the attack off.
if (n_attack_number < 8)
{
Commands->Start_Timer(p_obj, MPR_A01_orca_attack_stoptime_RAD, MPR_A01_TIMER_ORCASTRIKE_OFF_RAD);
}
break;
}
case(MPR_A01_TIMER_ORCASTRIKE_OFF_RAD):
{
// Turn off the attack, set the timer for the next attack.
Commands->Trigger_Weapon(p_obj, false, v_target_loc, true);
switch (n_attack_number)
{
case (2):
{
n_newtimercount = Get_Int_Parameter("Fire_02");
n_timercount = Get_Int_Parameter("Fire_01");
n_newtimercount -= n_timercount;
break;
}
case (3):
{
n_newtimercount = Get_Int_Parameter("Fire_03");
n_timercount = Get_Int_Parameter("Fire_02");
n_newtimercount -= n_timercount;
break;
}
case (4):
{
n_newtimercount = Get_Int_Parameter("Fire_04");
n_timercount = Get_Int_Parameter("Fire_03");
n_newtimercount -= n_timercount;
break;
}
case (5):
{
n_newtimercount = Get_Int_Parameter("Fire_05");
n_timercount = Get_Int_Parameter("Fire_04");
n_newtimercount -= n_timercount;
break;
}
case (6):
{
n_newtimercount = Get_Int_Parameter("Fire_06");
n_timercount = Get_Int_Parameter("Fire_05");
n_newtimercount -= n_timercount;
break;
}
}
if (n_newtimercount)
{
Commands->Start_Timer(p_obj, (n_newtimercount / 30), MPR_A01_TIMER_ORCASTRIKE_RAD);
}
}
}
}
};
/*
MPR_A01_Orca_Turret
This script is for the turrets themselves. They simply assign their own ID numbers as per standard.
Parameters:
TurretNumber = Which turret this script is operating on.
*/
DECLARE_SCRIPT(MPR_A01_Orca_Turret_RAD, "TurretNumber:int")
{
float f_health;
int n_turret_number;
void Created(GameObject* p_obj)
{
n_turret_number = Get_Int_Parameter("TurretNumber");
MPR_A01_startstrike_RAD = false;
Commands->Set_Health(p_obj, 350.0f);
f_health = Commands->Get_Health(p_obj);
switch (n_turret_number)
{
case (1):
{
MPR_A01_orca_turret1_RAD = Commands->Get_ID(p_obj);
break;
}
case (2):
{
MPR_A01_orca_turret2_RAD = Commands->Get_ID(p_obj);
break;
}
default:
{
DebugPrint("RAD-ERROR - MPR_A01_Orca_Turret - Turret has no indicated number!\n");
}
}
}
void Timer_Expired(GameObject* p_obj, int n_timer_id)
{
if (n_timer_id == 6543)
{
Commands->Create_Sound("TargetAcquired",Commands->Get_Position(Commands->Get_The_Star()),p_obj);
}
}
void Damaged(GameObject* p_obj, GameObject* p_damager)
{
if ((p_damager == Commands->Get_The_Star()) && (!MPR_A01_startstrike_RAD))
{
GameObject* p_orca1;
GameObject* p_orca2;
Vector3 v_zeroorg( 0,0,0 );
MPR_A01_startstrike_RAD = true;
p_orca1 = Commands->Create_Object("Orca airstrike", v_zeroorg);
if (p_orca1)
{
Commands->Attach_Script(p_orca1, "MPR_A01_Orca_Strike_On_Turret", "1,v_orcae3.m_orcastrike_a,195,255,310,348,419,459");
Commands->Send_Custom_Event(p_obj, p_orca1, MPR_A01_CUSTOM_ORCA_TURRETSTRIKE_RAD, 0);
}
else
{
DebugPrint("RAD-ERROR - MPR_A01_Orca_Strike_Spawner - Cannot find proper animation for Orca Strike One!\n");
}
p_orca2 = Commands->Create_Object("Orca airstrike", v_zeroorg);
if (p_orca2)
{
Commands->Create_Sound("AirStrikeReady",Commands->Get_Position(Commands->Get_The_Star()),p_obj);
Commands->Start_Timer(p_obj, 1.5f, 6543);
Commands->Attach_Script(p_orca2, "MPR_A01_Orca_Strike_On_Turret", "2,v_orcae3.m_orcastrike_b,180,235,295,343,400,437");
Commands->Send_Custom_Event(p_obj, p_orca2, MPR_A01_CUSTOM_ORCA_TURRETSTRIKE_RAD, 0);
}
else
{
DebugPrint("RAD-ERROR - MPR_A01_Orca_Strike_Spawner - Cannot find proper animation for Orca Strike Two!\n");
}
}
}
};
/*
MPR_A01_Orca_Turret_Attack_Zone
This script is specifically for the turret attacks - if the commando enters this zone,
the turrets start shooting at him if they still exist.
*/
DECLARE_SCRIPT(MPR_A01_Orca_Turret_Attack_Zone_RAD, "")
{
void Entered(GameObject* p_obj, GameObject* p_enterer)
{
if (p_enterer == Commands->Get_The_Star())
{
if (Commands->Find_Object(MPR_A01_orca_turret1_RAD))
{
Commands->Action_Attack_Object(Commands->Find_Object(MPR_A01_orca_turret1_RAD), p_enterer, 1.0f, 200.0f, true);
}
if (Commands->Find_Object(MPR_A01_orca_turret2_RAD))
{
Commands->Action_Attack_Object(Commands->Find_Object(MPR_A01_orca_turret2_RAD), p_enterer, 1.0f, 200.0f, true);
}
}
}
};
/*
MPR_A04_Obelisk_Weapon
This script handles the obelisk weapon firing. It is attached to a zone.
It handle the following process:
0. When the object is created, it starts a firing timer for target switching.
1. When an object enters the zone, check if it's the player.
2. If it's not the player, add it to an empty slot in the list of targets.
3. When the timer expires, check the list for target ids.
4. If it finds a target ID, it verifies that the object exists.
5. If it exists, the object is fired upon.
6. If it does not exist, the object ID is removed from the list.
Parameters:
ObeliskWeaponID = The ID of the Obelisk weapon object.
NodLightTankID = The ID of Joe's Nod light tank nearby.
*/
DECLARE_SCRIPT(MPR_A04_Obelisk_Weapon_RAD, "ObeliskWeaponID:int, NodLightTankID:int")
{
int a_obelisk_targets [6];
bool b_obelisk_firing;
int n_obelisk_id;
int n_nodtank_id;
void Created(GameObject* p_obj)
{
//Commands->Display_Text("RAD - Obelisk zone created, initializing.\n");
int n_counter;
b_obelisk_firing = true;
n_obelisk_id = Get_Int_Parameter("ObeliskWeaponID");
if (Commands->Find_Object(n_obelisk_id))
{
//Commands->Display_Text("RAD - Found the obelisk weapon itself.\n");
for (n_counter = 0;n_counter < 6;n_counter++)
{
a_obelisk_targets [n_counter] = 0;
}
Commands->Start_Timer(p_obj, MPR_A01_obelisk_firing_time_RAD, MPR_A04_TIMER_OBELISK_PREFIRING_RAD);
}
else
{
DebugPrint("RAD-ERROR - MPR_A04_Obelisk_Weapon - Obelisk weapon is missing!\n");
}
}
void Entered(GameObject* p_obj, GameObject* p_enterer)
{
//Commands->Display_Text("RAD - Obelisk firing zone entered.\n");
int n_counter;
bool b_tankfound;
b_tankfound = false;
// Special casing for Joe's Nod tank.
if (Commands->Find_Object(Get_Int_Parameter("NodLightTankID")))
{
GameObject* p_tank = Commands->Find_Object(Get_Int_Parameter("NodLightTankID"));
if (p_enterer == p_tank)
{
b_tankfound = true;
}
}
if (!b_tankfound)
{
//Commands->Display_Text("RAD - The proper target has entered the zone.\n");
for (n_counter = 0;n_counter < 6;n_counter++)
{
if (!a_obelisk_targets[n_counter])
{
//Commands->Display_Text("RAD - found a blank id slot, inserting.\n");
a_obelisk_targets[n_counter] = Commands->Get_ID(p_enterer);
n_counter = 6;
}
else
{
if (!Commands->Find_Object(a_obelisk_targets[n_counter]))
{
//Commands->Display_Text("RAD - found an obsolete id, replacing.\n");
a_obelisk_targets[n_counter] = Commands->Get_ID(p_enterer);
n_counter = 6;
}
}
}
}
}
void Timer_Expired(GameObject* p_obj, int n_timer_id)
{
int n_counter;
Vector3 v_obeliskloc;
Vector3 v_targetloc;
int n_nontargets;
n_nontargets = 0;
v_obeliskloc = Commands->Get_Position(Commands->Find_Object(n_obelisk_id));
if ((b_obelisk_firing) && (n_timer_id == MPR_A04_TIMER_OBELISK_PREFIRING_RAD))
{
//Commands->Display_Text("RAD - pre-firing timer expired. Creating explosion.\n");
//Commands->Create_Explosion("Obelisk Emitter", v_obeliskloc, p_obj);
Commands->Start_Timer(p_obj, 1.0f, MPR_A04_TIMER_OBELISK_FIRING_RAD);
}
if ((b_obelisk_firing) && (n_timer_id == MPR_A04_TIMER_OBELISK_FIRING_RAD))
{
//Commands->Display_Text("RAD - obelisk firing timer expired. Looking for a target.\n");
for (n_counter = 0;n_counter < 6;n_counter++)
{
if ((Commands->Find_Object(a_obelisk_targets[n_counter])) && (Commands->Find_Object(n_obelisk_id)))
{
v_targetloc = Commands->Get_Position(Commands->Find_Object(a_obelisk_targets[n_counter]));
//Commands->Display_Text("RAD - shooting at target.\n");
if (Commands->Find_Object(a_obelisk_targets[n_counter]) != Commands->Get_The_Star())
{
Commands->Set_Health(Commands->Find_Object(a_obelisk_targets[n_counter]), 1.0f);
}
Commands->Trigger_Weapon(Commands->Find_Object(n_obelisk_id), true, v_targetloc, true);
Commands->Create_Explosion("Obelisk Explosion", v_targetloc, p_obj);
a_obelisk_targets[n_counter] = 0;
n_counter = 6;
}
else
{
n_nontargets++;
}
}
if (n_nontargets == 6)
{
Commands->Trigger_Weapon(Commands->Find_Object(n_obelisk_id), false, v_obeliskloc, true);
}
Commands->Start_Timer(p_obj, 2.0f, MPR_A04_TIMER_OBELISK_STOPFIRING_RAD);
}
if (n_timer_id == MPR_A04_TIMER_OBELISK_STOPFIRING_RAD)
{
//Commands->Display_Text("RAD - obelisk stop firing timer expired. Stopping firing.\n");
v_obeliskloc = Commands->Get_Position(p_obj);
Commands->Trigger_Weapon(Commands->Find_Object(n_obelisk_id), false, v_obeliskloc, true);
Commands->Start_Timer(p_obj, MPR_A01_obelisk_firing_time_RAD, MPR_A04_TIMER_OBELISK_PREFIRING_RAD);
}
}
void Custom(GameObject* p_obj, int n_type, int n_param, GameObject* p_sender)
{
if (n_type == MPR_A04_CUSTOM_OBELISK_FIRING_RAD)
{
//Commands->Display_Text("RAD - obelisk firing being turned off.\n");
b_obelisk_firing = false;
}
}
};
/*
MPR_A04_Main_Control_Terminal
This script handles the deactivation of the Obelisk. It handles the following process:
1. When either the Obelisk Main Control Terminal or the Power Plant Main Control Terminal
are destroyed, the Obelisk receives a custom to disable the firing action.
ObeliskControllerID = The ID of the obelisk controller zone, to tell it to stop firing.
BuildingID = The ID of the building that this console is in, for proper sounds and function.
0 = Hand of Nod
1 = Tiberium Refinery
2 = Obelisk
3 = Power Plant
4 = Airfield
Parameters:
ObeliskControllerID = The ID number of the Obelisk controller object.
BuildingID = Which building this script is operating on.
*/
DECLARE_SCRIPT(MPR_A04_Main_Control_Terminal_RAD, "ObeliskControllerID:int, BuildingID:int")
{
void Killed(GameObject* p_obj, GameObject* p_killer)
{
Vector3 v_consoleloc;
GameObject* p_created;
int n_building_id;
float f_rightbuilding;
n_building_id = Get_Int_Parameter("BuildingID");
if ((n_building_id == 2) || (n_building_id == 3))
{
f_rightbuilding = true;
}
else
{
f_rightbuilding = false;
}
if ((Commands->Find_Object(Get_Int_Parameter("ObeliskControllerID"))) && (f_rightbuilding))
{
Commands->Send_Custom_Event(p_obj, Commands->Find_Object(Get_Int_Parameter("ObeliskControllerID")), MPR_A04_CUSTOM_OBELISK_FIRING_RAD, 0);
}
else
{
DebugPrint("RAD-ERROR - MPR_A04_Main_Control_Terminal - Cannot find Obelisk Controller object!\n");
}
v_consoleloc = Commands->Get_Position(p_obj);
Commands->Create_Explosion("Generic Ground 01", v_consoleloc, p_killer);
p_created = Commands->Create_Object_At_Bone(p_obj, "NOD Console Off", "TM[0]");
if (n_building_id != 2)
{
if (p_created)
{
Vector3 v_created = Commands->Get_Position(p_created);
Commands->Create_Sound(MPR_control_klaxons_RAD[n_building_id], v_created, p_created);
}
}
}
};
/*
MPR_A05_Tank_Controller
This script handles the operation of the Mammoth Tank and Flame Tanks in areas 5 and 6. It performs the following
processes:
1. If enemies are seen, fire upon the enemies.
2. If taking damage, move to a new location among preset coordinates.
3. If the commmando crosses the temple area entry zone, move to the temple area.
4. If I am a temple guarding tank, I will remain motionless until the zone is entered.
My_Number = The number of this particular tank for reference purposes.
1 = Mammoth Tank
2 = Air dropped Flame Tank
3 = Temple Guard Flame Tank
4 = Temple Guard Flame Tank
Four coordintates are needed:
Coordinate 1, 2, and 3 = Primary move locations.
Coordinate 4 = Temple movement coordinate for #1 and #2.
Parameters:
My_Number = What tank number this script is attached to.
MammothTank = The ID number of the Mammoth Tank.
*/
DECLARE_SCRIPT(MPR_A05_Tank_Controller_RAD, "My_Number:int, MammothTank:int")
{
int n_mynumber;
GameObject* p_target;
int n_flametank;
void Created(GameObject* p_obj)
{
n_flametank = 0;
int n_mammoth;
n_mammoth = 8649;
MPR_A05_mammoth_tank_id_RAD = n_mammoth;
n_mynumber = Get_Int_Parameter("My_Number");
if (n_mynumber == 2)
{
Commands->Action_Movement_Goto_Location(p_obj, MPR_A05_tank_move_locations_RAD[1], 2.0f);
if (Commands->Find_Object(n_mammoth))
{
Commands->Send_Custom_Event(p_obj, Commands->Find_Object(n_mammoth), MPR_A05_CUSTOM_MAMMOTH_RAD, Commands->Get_ID(p_obj));
}
}
}
void Custom(GameObject* p_obj, int n_type, int n_param, GameObject* p_sender)
{
if (n_type == MPR_A05_CUSTOM_TEMPLE_ZONE_ENTERED_RAD)
{
switch (n_mynumber)
{
case (1):
{
Commands->Action_Movement_Goto_Location(p_obj, MPR_A05_tank_move_locations_RAD[(n_mynumber - 1)], 2.0f);
break;
}
case (3):
{
Commands->Action_Movement_Goto_Location(p_obj, MPR_A05_tank_move_locations_RAD[(n_mynumber - 1)], 2.0f);
break;
}
case (4):
{
Commands->Action_Movement_Goto_Location(p_obj, MPR_A05_tank_move_locations_RAD[(n_mynumber - 1)], 2.0f);
break;
}
default:
{
DebugPrint("RAD-ERROR - MPR_A05_Tank_Controller - Received an improper custom!\n");
}
}
}
else if (n_type == MPR_A05_CUSTOM_MAMMOTH_RAD)
{
n_flametank = n_param;
}
else
{
p_target = p_sender;
Commands->Start_Timer(p_obj, 2.0f, MPR_A05_TIMER_MAMMOTH_RAD);
}
}
void Timer_Expired(GameObject* p_obj, int n_timer_id)
{
Vector3 c130_location;
if (n_timer_id == MPR_A05_TIMER_MAMMOTH_RAD)
{
if (p_target)
{
c130_location = Commands->Get_Bone_Position(p_target, "BODYMAIN");
Commands->Action_Attack_Location(p_obj,c130_location, 0.0f, 200.0f, true);
}
Commands->Start_Timer(p_obj, 1.0f, MPR_A05_TIMER_MAMMOTH_2_RAD);
}
if (n_timer_id == MPR_A05_TIMER_MAMMOTH_2_RAD)
{
Commands->Action_Attack_Stop(p_obj);
Commands->Start_Timer(p_obj, 2.0f, MPR_A05_TIMER_MAMMOTH_3_RAD);
}
if (n_timer_id == MPR_A05_TIMER_MAMMOTH_3_RAD)
{
if (Commands->Find_Object(n_flametank))
{
Commands->Action_Attack_Object(p_obj, Commands->Find_Object(n_flametank), 1.0f, 100.0f, true);
}
}
}
};
/*
MPR_A06_RMV_Final_Zone_Trigger
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A06_Final_Zone_Trigger_RMV, "")
{
enum
{
apache1_die,
apache2_die,
end_of_demo,
pause_animation,
end_of_whole_thing
};
int apache1_id, apache2_id, end_id;
int havoc_has_entered;
void Created( GameObject * obj )
{
havoc_has_entered = 0;
}
void Entered( GameObject * obj, GameObject * enterer )
{
float apache1_die_frame = 146;
float fadeout_frame = 155;
if ( enterer == Commands->Get_The_Star() && havoc_has_entered == 0 )
{
havoc_has_entered = 1;
GameObject *clouds = Commands->Find_Object(9876);
if (clouds != NULL)
{
Commands->Destroy_Object(clouds);
}
Commands->Create_Sound( "Ion Cannon ready", Commands->Get_Position(Commands->Get_The_Star()), obj );
Commands->Start_Timer( obj, fadeout_frame/30, end_of_demo );
Commands->Create_Object( "Outro Aggregate", Vector3(0,0,0) );
Commands->Create_Sound( "Ion Cannon03", Vector3(-170.0f, 448.0f, 20.0f), obj );
GameObject *apache1 = Commands->Create_Object( "Apache Outro 1", Vector3(0,0,0) );
GameObject *apache2 = Commands->Create_Object( "Apache Outro 2", Vector3(0,0,0) );
Commands->Start_Timer( obj, apache1_die_frame/30, apache1_die );
apache1_id = Commands->Get_ID( apache1 );
apache2_id = Commands->Get_ID( apache2 );
}
}
void Timer_Expired( GameObject * obj, int timer_id )
{
if ( timer_id == apache1_die )
{
GameObject *apache1 = Commands->Find_Object( apache1_id );
GameObject *apache2 = Commands->Find_Object( apache2_id );
if (apache1 != NULL)
{
Vector3 explosion1 = Commands->Get_Bone_Position( apache1, "SEAT" );
Commands->Create_Explosion( "Generic Air 02", explosion1 );
}
if (apache2 != NULL)
{
Vector3 explosion2 = Commands->Get_Bone_Position( apache2, "SEAT" );
Commands->Create_Explosion( "Generic Air 02", explosion2 );
}
}
if (timer_id == end_of_demo)
{
GameObject *fadeout = Commands->Create_Object("outro fadeout", Vector3(0,0,0));
Commands->Create_Sound( "Outro Sound", Vector3(-170.0f, 448.0f, 20.0f), obj );
end_id = Commands->Get_ID(fadeout);
Commands->Enable_HUD(0);
Commands->Control_Enable(Commands->Get_The_Star(), false);
Commands->Start_Timer( obj, 2.0f, pause_animation);
}
if (timer_id == pause_animation)
{
GameObject *fadeout = Commands->Find_Object(end_id);
if (fadeout != NULL)
{
Commands->Set_Animation_Frame(fadeout, "fadeout.fadeout", 61);
}
Commands->Start_Timer( obj, 4.0f, end_of_whole_thing );
}
if (timer_id == end_of_whole_thing)
{
Commands->Mission_Complete(true);
}
}
};
/*
MPR_A05_RMV_C130_Zone_Trigger
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A05_C130_Zone_Trigger_RMV, "")
{
void Entered( GameObject * obj, GameObject * enterer )
{
GameObject *aircraft;
if ( enterer == Commands->Get_The_Star() )
{
aircraft = Commands->Create_Object( "C-130 airdrop", Vector3(160.66f,623.06f,0.00f) );
Commands->Set_Facing( aircraft, 149.54f );
Commands->Destroy_Object( obj );
}
}
};
/*
MPR_A05_RMV_A10_Trigger_When_SAM_Destroyed
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A05_A10_Trigger_When_SAM_Destroyed_RMV, "")
{
void Killed( GameObject * obj, GameObject * killer )
{
Commands->Create_Object( "A-10 with bomb dropper", Vector3(0,0,0) );
Commands->Create_Sound("AirStrikeReady",Commands->Get_Position(Commands->Get_The_Star()),obj);
Commands->Start_Timer(obj, 1.5f, 6543);
}
void Timer_Expired(GameObject* obj, int n_timer_id)
{
if (n_timer_id == 6543)
{
Commands->Create_Sound("TargetAcquired",Commands->Get_Position(Commands->Get_The_Star()),obj);
}
}
};
/*
MPR_A02_RMV_Zone_Trigger_For_Dogfight
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A02_Zone_Trigger_For_Dogfight_RMV, "")
{
void Entered(GameObject * obj, GameObject * enterer)
{
if (enterer == Commands->Get_The_Star())
{
Commands->Create_Object( "Apache Dogfight", Vector3(0,0,0) );
Commands->Create_Object( "Orca Dogfight", Vector3(0,0,0) );
Commands->Destroy_Object( obj );
}
}
};
/*
MPR_A05_RMV_C130_Dropoff_Animation
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
Parameters:
Cinematic = DEBUG
ObjToCreate = DEBUG
DropFrame = DEBUG
BoneName = DEBUG
*/
DECLARE_SCRIPT(MPR_A05_C130_Dropoff_Animation_RMV, "Cinematic=:string,ObjToCreate=:string,DropFrame=:int,BoneName=:string")
{
int debris_1_id, debris_2_id, debris_3_id;
void Created( GameObject * obj )
{
Commands->Set_Animation ( obj, Get_Parameter( "Cinematic" ), 0 );
int drop_frame = Get_Int_Parameter( "DropFrame" );
float drop_time = ( float )drop_frame / 30.0;
Commands->Start_Timer( obj, drop_time, MPR_A05_TIMER_DROP_OBJECT_RMV );
}
void Timer_Expired ( GameObject* obj, int Timer_ID )
{
if ( Timer_ID == MPR_A05_TIMER_DROP_OBJECT_RMV )
{
GameObject* flametank = Commands->Create_Object_At_Bone( obj, Get_Parameter( "ObjToCreate" ), Get_Parameter( "BoneName" ) );
if (flametank)
{
Commands->Attach_Script( flametank,"MPR_A05_Tank_Controller","2" );
}
Commands->Send_Custom_Event( obj, Commands->Find_Object( 8649 ), 0, 0 );
Commands->Start_Timer( obj, 2.0f, MPR_A05_TIMER_DIE_RMV );
}
if (Timer_ID == MPR_A05_TIMER_DIE_RMV)
{
if ( obj != NULL )
{
Commands->Create_Explosion_At_Bone("C-130 Explosion 01", obj, "BODYMAIN", obj);
}
}
}
};
/*
MPR_A05_RMV_A10_Air_Strike
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A05_A10_Air_Strike_RMV, "")
{
enum
{
GO,
SHOOT,
STOP,
STRAFE,
NO_STRAFE
};
void Created( GameObject * obj )
{
float go_time = 3.0;
float shoot_frame = 160; //Frame 70
float shoot_time = shoot_frame / 30;
float stop_frame = 240; //Frame 150
float stop_time = stop_frame / 30;
float begin_strafe_frame = 420;
float begin_strafe_time = begin_strafe_frame / 30;
float stop_strafe_frame = 450;
float stop_strafe_time = stop_strafe_frame / 30;
Commands->Start_Timer( obj, go_time, GO);
Commands->Start_Timer( obj, shoot_time, SHOOT );
Commands->Start_Timer( obj, stop_time, STOP );
Commands->Start_Timer( obj, begin_strafe_time, STRAFE );
Commands->Start_Timer( obj, stop_strafe_time, NO_STRAFE );
}
void Timer_Expired ( GameObject* obj, int timer_id )
{
if ( timer_id == GO )
{
Commands->Set_Animation( obj, "v_gdi-a10e3.m_a10strike_a", 0 );
}
if ( timer_id == SHOOT )
{
Commands->Trigger_Weapon( obj, true, Vector3(85,665,0), true );
}
if ( timer_id == STOP )
{
Commands->Trigger_Weapon( obj, false, Vector3(85,665,0), true );
}
if ( timer_id == STRAFE )
{
Commands->Trigger_Weapon( obj, true, Vector3(-37,679,10), false );
Commands->Create_Explosion( "Generic Ground 01", Vector3(-37,679,10), obj );
}
if ( timer_id == NO_STRAFE )
{
Commands->Trigger_Weapon( obj, false, Vector3(-37,679,10), false );
}
}
void Animation_Complete( GameObject * obj, const char * name )
{
Commands->Destroy_Object( obj );
}
};
/*
MPR_A02_RMV_Apache_Dogfight
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A02_Apache_Dogfight_RMV, "")
{
void Animation_Complete( GameObject * obj, const char * name )
{
Commands->Destroy_Object( obj );
Commands->Create_Object( "Apache Destroyed", Vector3(0,0,0) );
}
};
/*
MPR_A02_RMV_Orca_Dogfight
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A02_Orca_Dogfight_RMV, "")
{
enum
{
FIRE_1,
FIRE_2,
FIRE_3,
FIRE_4,
STOP_FIRE,
};
void Created( GameObject * obj )
{
float fire_1_frame = 80;
float fire_2_frame = 175;
float fire_3_frame = 246;
float fire_4_frame = 285;
Commands->Start_Timer( obj, fire_1_frame / 30, FIRE_1 );
Commands->Start_Timer( obj, fire_2_frame / 30, FIRE_2 );
Commands->Start_Timer( obj, fire_3_frame / 30, FIRE_3 );
Commands->Start_Timer( obj, fire_4_frame / 30, FIRE_4 );
}
void Timer_Expired( GameObject * obj, int timer_id )
{
if ( timer_id == FIRE_1 )
{
Commands->Trigger_Weapon( obj, true, Vector3(-6.195326f,-117.866371f,20.833399f), true );
Commands->Start_Timer(obj, 0.2f, STOP_FIRE);
}
if ( timer_id == FIRE_2 )
{
Commands->Trigger_Weapon( obj, true, Vector3(107.822525f,76.754219f,23.240044f), true );
Commands->Start_Timer( obj, 0.2f, STOP_FIRE );
}
if ( timer_id == FIRE_3 )
{
Commands->Trigger_Weapon( obj, true, Vector3(240.367477f,28.173233f,27.428972f), true );
Commands->Start_Timer( obj, 0.2f, STOP_FIRE );
}
if ( timer_id == FIRE_4 )
{
Commands->Trigger_Weapon( obj, true, Vector3(183.254105f,58.453369f,59.090523f), true );
Commands->Start_Timer( obj, 0.2f, STOP_FIRE );
}
if ( timer_id == STOP_FIRE )
{
Commands->Trigger_Weapon( obj, false, Vector3(240.367477f,28.173233f,27.428972f), true );
}
}
};
/*
MPR_A01_RMV_Intro_Cinematic
DEBUG DESCRIPTION
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A01_Intro_Cinematic_RMV, "")
{
enum
{
CAMERA_B_START,
CAMERA_C_START,
A10_START,
BIKEA_START,
BIKEA_DIE,
BIKEB_START,
BIKEB_DIE,
HAVOC_START,
ROPE_START,
EFFECT_START,
INTRO,
REMOVE,
HAVOC_BLEND
};
Vector3 start_location;
void Created(GameObject * obj)
{
float camera_end_frame = 251;
GameObject *camera;
Commands->Start_Timer( obj, 0.5f, REMOVE );
camera = Commands->Create_Object("Intro Camera 2", Vector3(0,0,0));
Commands->Set_Camera_Host(camera);
Commands->Create_Object("Chinook Intro 2", Vector3(0,0,0));
Commands->Create_Object("Havoc Intro", Vector3(0,0,0));
Commands->Create_Object("Rope Intro", Vector3(0,0,0));
Commands->Start_Timer(obj, camera_end_frame/30, INTRO);
}
void Timer_Expired(GameObject * obj, int timer_id)
{
if ( timer_id == REMOVE )
{
Commands->Control_Enable( Commands->Get_The_Star(), false );
Commands->Enable_HUD(0);
}
if ( timer_id == INTRO )
{
start_location.X = -118.69f;
start_location.Y = -190.68f;
start_location.Z = 3.80f;
Commands->Set_Position( Commands->Get_The_Star(), start_location );
Commands->Set_Facing( Commands->Get_The_Star(), 180.0f );
Commands->Set_Animation( Commands->Get_The_Star(), "s_a_human.m_havok_e3pose", 0 );
Commands->Set_Camera_Host( NULL );
Commands->Control_Enable( Commands->Get_The_Star(), true );
Commands->Enable_HUD(1);
Commands->Destroy_Object(obj);
}
}
};
/*
MPR_A02_DRILL_INSTRUCTOR
The following are the scripts involved with the drill seargent routine.
It is broken up into 6 scripts, 2 zones, the drill seargent, and the three
cadet guys. The following is the script for the Drill Instructor.
DEBUG NAMING CONVENTION
*/
//insert new drill scripts here
DECLARE_SCRIPT(MPR_A02_Drill_Instructor_JDG, "")
{
//state is used to keep track of what DI is doing
typedef enum
{
MPR_A02_drill_instructor_idle = 0,
DI_MOVING,
DI_INNATE,
} DIState;
DIState state;
void Created(GameObject* obj)
{
//DebugPrint("JDG. Demo, Drill Instructor, Created and disallowing innate\n" );
MPR_A02_drill_instructor_id_JDG = Commands->Get_ID (obj);
}
void Killed (GameObject* obj, GameObject* Killer)
{
if (Killer == (Commands->Get_The_Star()))
{
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), MPR_A02_CUSTOM_CADET_1_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), MPR_A02_CUSTOM_CADET_2_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), MPR_A02_CUSTOM_CADET_3_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
}
}
void Custom (GameObject* obj, int Type, int Param, GameObject* Sender)
{
if ((Param == MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG) && (Type == MPR_A02_CUSTOM_DRILL_INSTRUCTOR_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Recieved Innate Custom\n");
state = DI_INNATE;
float timeDelay = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), timeDelay, MPR_A02_TIMER_DRILL_INSTRUCTOR_ATTACK_DELAY_JDG);
}
//When Havoc enters zone come to attention
if ((Param == MPR_A02_PARAM_CADETS_TEN_HUT_JDG) && (Type == MPR_A02_CUSTOM_DRILL_INSTRUCTOR_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Received custom from zone, about to do Ten_Hut\n" );
Ten_Hut (obj);
}
//when cadet 1 is at attention start with pushups
if ((Type == MPR_A02_CUSTOM_CADET_1_JDG) && (Param == MPR_A02_PARAM_CADETS_AT_ATTENTION_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, About to start first pushups\n");
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J04C", 0);
//S_A_HUMAN.H_A_J04C is animation for give order
Commands->Create_Sound ("KeepYourHeadDown02", (Commands->Get_Position (obj)), obj);
//insert "Lets start with pushups" for this dialog line
exercise = PUSHUPS;
Cadet_Mistake ();
}
if ((Type == MPR_A02_CUSTOM_CADET_1_JDG) && (Param == MPR_A02_PARAM_CADETS_MADE_MISTAKE_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, About to Rag on Cadet #1\n");
Rag_On_Cadet (1);
}
if ((Type == MPR_A02_CUSTOM_CADET_2_JDG) && (Param == MPR_A02_PARAM_CADETS_MADE_MISTAKE_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, About to Rag on Cadet #2\n");
Rag_On_Cadet (2);
}
if ((Type == MPR_A02_CUSTOM_CADET_3_JDG) && (Param == MPR_A02_PARAM_CADETS_MADE_MISTAKE_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, About to Rag on Cadet #3\n");
Rag_On_Cadet (3);
}
}
void Ten_Hut (GameObject* obj)
{
//DebugPrint("JDG. Demo, Drill Instructor, Starting Ten_Hut\n");
//check if cadet_2 exists
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Ten_Hut, DI gives order\n");
//instructor faces cadet 2...
Commands->Action_Attack_Object (obj, (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), 1, 0);
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J18C",0);
//S_A_HUMAN.H_A_J18C is animation for ten-hut
Commands->Create_Sound ("LookAlive02", (Commands->Get_Position (obj)), obj);
//insert "Ten Hut" sound here when ready
//Start reaction delay timers on the Cadets
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Ten_Hut, Start C1 delay timer\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_TEN_HUT_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Ten_Hut, Start C2 delay timer\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_TEN_HUT_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Ten_Hut, Start C3 delay timer\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_TEN_HUT_DELAY_JDG);
}
}
}
void Cadet_Mistake (void)
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, Start\n");
//declare and define local variables here
float mistake;
mistake = Commands->Get_Random(0,100);
//there is a 25% chance of mistake
if (mistake > 220)
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, About to goto Choose_Cadet\n");
Choose_Cadet ();
}
//if no mistake tell all cadets to do specific exercise
else
{
if (exercise == PUSHUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #1 do pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_PUSHUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #2 do pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_PUSHUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #3 do pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_PUSHUPS_DELAY_JDG);
}
DI_Goes_To_New_Position ();
}
else if (exercise == SITUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #1 do situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_SITUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #2 do situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_SITUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #3 do situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_SITUPS_DELAY_JDG);
}
DI_Goes_To_New_Position ();
}
else
{
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #1 do j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_JUMPING_JACKS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #2 do j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_JUMPING_JACKS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Cadet_Mistake, No mistake, #3 do j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_JUMPING_JACKS_DELAY_JDG);
}
DI_Goes_To_New_Position ();
}
}
}
void Choose_Cadet (void)
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, Start\n");
float cadet;
cadet = Commands->Get_Random(0,100);
//define cadet as a number between 0 and 100
//choose cadet 1 for mistake
if ((cadet > 0) && (cadet <= 33))
{
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C1 makes mistake\n");
Commands->Create_Sound ("GonnaDieHere02", (Commands->Get_Position (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))), (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)));
//insert "Doh!" sound when ready
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J09C", 0);
//S_A_HUMAN.H_A_J09C is animation for make mistake
}
//tell cadet 2-3 to do proper animation
if (exercise == PUSHUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C1 makes mistake, #2 pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_PUSHUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C1 makes mistake, #3 pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_PUSHUPS_DELAY_JDG);
}
}
else if (exercise == SITUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C1 makes mistake, #2 situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_SITUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C1 makes mistake, #3 situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_SITUPS_DELAY_JDG);
}
}
// jumping jacks
else
{
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C1 makes mistake, #2 j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_JUMPING_JACKS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C1 makes mistake, #3 j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_JUMPING_JACKS_DELAY_JDG);
}
}
}
//choose cadet 2 for mistake
else if ((cadet > 33) && (cadet <= 66))
{
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C2 makes mistake\n");
Commands->Create_Sound ("GonnaDieHere02", (Commands->Get_Position (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))), (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)));
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J09C", 0);
//S_A_HUMAN.H_A_J09C is animation for make mistake
}
//tell cadet 1 and 3 to do proper animation
if (exercise == PUSHUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C2 makes mistake, #1 pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_PUSHUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C2 makes mistake, #3 pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_PUSHUPS_DELAY_JDG);
}
}
else if (exercise == SITUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C2 makes mistake, #1 situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_SITUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C2 makes mistake, #3 situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_SITUPS_DELAY_JDG);
}
}
// jumping jacks
else
{
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C2 makes mistake, #1 j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_JUMPING_JACKS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C2 makes mistake, #3 j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_JUMPING_JACKS_DELAY_JDG);
}
}
}
//choose cadet 3 for mistake
else
{
if (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C3 makes mistake\n");
Commands->Create_Sound ("GonnaDieHere02", (Commands->Get_Position (Commands->Find_Object(MPR_A02_cadet_3_id_JDG))), (Commands->Find_Object(MPR_A02_cadet_3_id_JDG)));
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J09C", 0);
//S_A_HUMAN.H_A_J09C is animation for make mistake
}
//tell cadet 1,2 to do proper animation
if (exercise == PUSHUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C3 makes mistake, #2 pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_PUSHUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C3 makes mistake, #1 pushups\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_PUSHUPS_DELAY_JDG);
}
}
else if (exercise == SITUPS)
{
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C3 makes mistake, #2 situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_SITUPS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C3 makes mistake, #1 situps\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_SITUPS_DELAY_JDG);
}
}
// jumping jacks
else
{
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C3 makes mistake, #2 j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_JUMPING_JACKS_DELAY_JDG);
}
if (Commands->Find_Object(MPR_A02_cadet_1_id_JDG))
{
//DebugPrint("JDG. Demo, Drill Instructor, Choose_Cadet, C3 makes mistake, #1 j-jacks\n");
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_JUMPING_JACKS_DELAY_JDG);
}
}
}
}
void Rag_On_Cadet (int Cadet_Number)
{
//DebugPrint("JDG. Demo, Drill Instructor, Rag_On_Cadet, start\n");
if ((Cadet_Number == 1) && (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)))
{
//DebugPrint("JDG. Demo, Drill Instructor, Rag_On_Cadet, DI rags on C1\n");
//make drill instructor face cadet 1
Commands->Action_Attack_Object((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)),(Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), 1, 0);
Vector3 C1_position (MPR_A02_CADET_1_X_JDG, MPR_A02_CADET_1_Y_JDG, MPR_A02_CADET_1_Z_JDG);
//Drill instructor goes to cadet 1's position
Commands->Action_Movement_Goto_Location ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), C1_position, 0.5f);
}
if ((Cadet_Number == 2) && (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)))
{
//DebugPrint("JDG. Demo, Drill Instructor, Rag_On_Cadet, DI rags on C2\n");
//make drill instructor face cadet 2
Commands->Action_Attack_Object((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)),(Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), 1, 0);
Vector3 C2_position (MPR_A02_CADET_2_X_JDG, MPR_A02_CADET_2_Y_JDG, MPR_A02_CADET_2_Z_JDG);
//Drill instructor goes to cadet 2's position
Commands->Action_Movement_Goto_Location ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), C2_position, 0.5f);
}
if ((Cadet_Number == 3) && (Commands->Find_Object(MPR_A02_cadet_3_id_JDG)))
{
//DebugPrint("JDG. Demo, Drill Instructor, Rag_On_Cadet, DI rags on C3\n");
//make drill instructor face cadet 3
Commands->Action_Attack_Object((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)),(Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), 1, 0);
Vector3 C3_position (MPR_A02_CADET_3_X_JDG, MPR_A02_CADET_3_Y_JDG, MPR_A02_CADET_3_Z_JDG);
//Drill instructor goes to cadet 3's position
Commands->Action_Movement_Goto_Location ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), C3_position, 0.5f);
}
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), "S_A_HUMAN.H_A_J07C", 0);
//S_A_HUMAN.H_A_J07C is animation for rag on cadet
Yell_At_Cadet ();
//sets up random things to yell at cadet guy
}
void Yell_At_Cadet (void)
{
//DebugPrint("JDG. Demo, Drill Instructor, Yell_At_Cadet, start\n");
float n = Commands->Get_Random(0, 100);
if ((n > 0) && (n <= 25) && (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)))
{
Commands->Create_Sound ("KillHim02", (Commands->Get_Position (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG))), (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)));
}
else if ((n > 25) && (n <= 50) && (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)))
{
Commands->Create_Sound ("KeepYourHeadDown02", (Commands->Get_Position (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG))), (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)));
}
else if ((n < 50) && (n <= 75) && (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)))
{
Commands->Create_Sound ("SoundAlarm02", (Commands->Get_Position (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG))), (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)));
}
else
{
Commands->Create_Sound ("FireAtWill02", (Commands->Get_Position (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG))), (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)));
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
//S_A_HUMAN.H_A_J07C is animation for rag on cadet
if ((stricmp("S_A_HUMAN.H_A_J07C", name) == 0) && (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)))
{
//DebugPrint("JDG. Demo, Drill Instructor, Animation_Complete\n");
DI_Goes_To_New_Position ();
}
if ((stricmp("S_A_HUMAN.H_A_DIV1", name) == 0) && (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)) && (state == DI_INNATE))
{
Commands->Action_Attack_Object (obj, (Commands->Get_The_Star()), 1.0f, 50.0f);
//Commands->Set_Animation (obj, "S_A_HUMAN.H_A_C2C0", 1);
}
}
void DI_Goes_To_New_Position (void)
{
if (state != DI_INNATE)
{
//DebugPrint("JDG. Demo, Drill Instructor, DI_Goes_To_New_Position, start\n");
float xnot, ynot, znot;
float random_number = Commands->Get_Random (0,100);
if ((random_number > 0) && (random_number <= 25))
{
xnot = -56.94f;
ynot = -11.48f;
znot = 2.42f;
}
else if ((random_number > 25) && (random_number <= 50))
{
xnot = -56.13f;
ynot = -10.00f;
znot = 2.42f;
}
else if ((random_number > 50) && (random_number <= 75))
{
xnot = -54.70f;
ynot = -8.86f;
znot = 2.42f;
}
else
{
xnot = -53.21f;
ynot = -8.00f;
znot = 2.42f;
}
Vector3 New_Position(xnot, ynot, znot);
if (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG))
{
Commands->Action_Movement_Set_Forward_Speed ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), .15f);
Commands->Action_Movement_Goto_Location ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), New_Position, 0.2f);
float delayTimer = Commands->Get_Random(10,15);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), delayTimer, MPR_A02_TIMER_DI_PRE_GIVE_ORDER_JDG);
//make DI wait for 10-15 secs
state = DI_MOVING;
}
}
}
void Movement_Complete (GameObject* obj, MovementCompleteReason)
{
if ((state == DI_MOVING) && (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)))
{
//when DI reaches new spot, face cadets and start new timer
if (Commands->Find_Object(MPR_A02_cadet_2_id_JDG))
{
// DebugPrint("JDG. Demo, Drill Instructor, Movement_Complete, start\n");
//first, make instructor face cadets...
Commands->Action_Attack_Object (obj, (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), 1, 0);
state = MPR_A02_drill_instructor_idle;
}
}
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A02_TIMER_DI_PRE_GIVE_ORDER_JDG) && (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)) && (state != DI_INNATE))
{
//DebugPrint("JDG. Demo, Drill Instructor, Timer_Expired, start\n");
Next_Exercise ();
}
if ((Timer_ID == MPR_A02_TIMER_DRILL_INSTRUCTOR_ATTACK_DELAY_JDG) && (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)) && (state == DI_INNATE))
{
Commands->Action_Attack_Object (obj, (Commands->Get_The_Star()), 0, 0);
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_DIV1", 0);
//forward roll
}
}
void Next_Exercise (void)
{
//DebugPrint("JDG. Demo, Drill Instructor, Next_Exercise, start\n");
exercise = (Exercise)(exercise + 1);
if (exercise >= JUMPING_JACKS)
{
exercise = PUSHUPS;
}
if ((exercise == PUSHUPS) && (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)))
{
//Omega = 1 is pushups
//have DI do a command animation
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), "S_A_HUMAN.H_A_J04C", 0);
//S_A_HUMAN.H_A_J04C is animation for give order
//have DI tell cadets to start with pushups
Commands->Create_Sound ("LookAlive02", (Commands->Get_Position ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)))), (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)));
Cadet_Mistake ();
}
else if (exercise == SITUPS)
{
//Omega = 2 is situps
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), "S_A_HUMAN.H_A_J04C", 0);
//S_A_HUMAN.H_A_J04C is animation for give order
//have DI tell cadets to start with pushups
Commands->Create_Sound ("HoldYourPositions02", (Commands->Get_Position ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)))), (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)));
Cadet_Mistake ();
}
else
{
//Omega = 3 is situps
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), "S_A_HUMAN.H_A_J04C", 0);
//S_A_HUMAN.H_A_J04C is animation for give order
//have DI tell cadets to start with pushups
Commands->Create_Sound ("KeepYourHeadDown02", (Commands->Get_Position ((Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)))), (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)));
Cadet_Mistake ();
}
}
};
/*
MPR_A02_DRILL_Zone
The following is the script for the kill zone
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A02_Drill_Start_Zone_JDG, "")
{
//declare variables here
int count;
void Created(GameObject* obj)
{
MPR_A02_drill_zone_id_JDG = Commands->Get_ID (obj);
count = 0;
}
void Entered (GameObject* obj, GameObject* Enterer)
{
if (Enterer == (Commands->Get_The_Star()) && (count == 0))
{
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_DRILL_INSTRUCTOR_JDG, MPR_A02_PARAM_CADETS_TEN_HUT_JDG);
//DebugPrint("JDG. Demo, Zone sending custom to Drill instructor\n");
count++;
}
}
};
/*
MPR_A02_DRILL_CADET_1
The following is the script for cadet number 1
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A02_Drill_Cadet_1_JDG, "")
{
typedef enum
{
MPR_A02_cadet_1_id_JDGLE = 0,
CADET_1_INNATE,
} C1State;
C1State state;
//declare variables here
void Created(GameObject* obj)
{
//DebugPrint("JDG. Demo, Cadet 1, Created and turning off innate\n");
MPR_A02_cadet_1_id_JDG = Commands->Get_ID (obj);
Vector3 C1_Start_Spot(MPR_A02_CADET_1_X_JDG, MPR_A02_CADET_1_Y_JDG, MPR_A02_CADET_1_Z_JDG);
Commands->Action_Movement_Goto_Location (obj, C1_Start_Spot, .02f);
Vector3 Cadet_Face_Spot(-56.02f, -9.09f, 2.42f);
Commands->Action_Attack_Location(obj, Cadet_Face_Spot, 0, 0);
}
void Killed (GameObject* obj, GameObject* Killer)
{
if (Killer == (Commands->Get_The_Star()))
{
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_DRILL_INSTRUCTOR_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), MPR_A02_CUSTOM_CADET_2_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), MPR_A02_CUSTOM_CADET_3_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
}
}
void Custom (GameObject* obj, int Type, int Param, GameObject* Sender)
{
if ((Param == MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG) && (Type == MPR_A02_CUSTOM_CADET_1_JDG))
{
//DebugPrint("JDG. Demo, Cadet 1, Recieved Innate Custom\n");
state = CADET_1_INNATE;
float timeDelay = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_ATTACK_DELAY_JDG);
}
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A02_TIMER_CADET_1_ATTACK_DELAY_JDG) && (state == CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Attack Havoc Timer_Expired, start\n");
Commands->Action_Movement_Set_Forward_Speed(obj, 0.55f);
Vector3 C1_Attack_Spot(-51.25f, -6.41f, 2.42f);
Commands->Action_Movement_Goto_Location (obj, C1_Attack_Spot, .02f);
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_D2A3", 0);
//"S_A_HUMAN.H_A_D2A3" is animation for running to left
Commands->Action_Attack_Object (obj, (Commands->Get_The_Star()), 150.0f, 50);
}
if ((Timer_ID == MPR_A02_TIMER_CADET_1_TEN_HUT_DELAY_JDG) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Timer_Expired, start\n");
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_A0A0", 0);
//S_A_HUMAN.H_A_A0A0 is animation for come to attention
}
if ((Timer_ID == MPR_A02_TIMER_CADET_1_PUSHUPS_DELAY_JDG) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Pushups_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J43C", 0);
//S_A_HUMAN.H_A_J13B is animation for pushups
}
if ((Timer_ID == MPR_A02_TIMER_CADET_1_SITUPS_DELAY_JDG) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Situps_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J13C", 0);
//S_A_HUMAN.H_A_J14C is animation for situps
}
if ((Timer_ID == MPR_A02_TIMER_CADET_1_JUMPING_JACKS_DELAY_JDG) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, JJacks_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J43A" , 0);
//S_A_HUMAN.H_A_J43B is animation for j-jacks
}
if ((Timer_ID == MPR_A02_TIMER_CADET_1_MISTAKE_DELAY_JDG) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Mistake_Timer_Expired, start\n");
if (exercise == PUSHUPS)
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J43C", 0);
//S_A_HUMAN.H_A_J13B is animation for pushups
}
else if (exercise == SITUPS)
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J14C", 1);
//S_A_HUMAN.H_A_J14C is animation for situps
}
else
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J43A" , 0);
//S_A_HUMAN.H_A_J43B is animation for j-jacks
}
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
if ((stricmp(name, "S_A_HUMAN.H_A_J43C") == 0) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J13A", 0);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J43A") == 0) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J43B", 1);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J13C") == 0) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J14C", 1);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J13A") == 0) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), "S_A_HUMAN.H_A_J13B", 1);
}
//S_A_HUMAN.H_A_A0A0 is animation for come to attention
if ((stricmp (name,"S_A_HUMAN.H_A_A0A0") ==0 ) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Animation_Complete, Come to Attention\n");
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_CADET_1_JDG, MPR_A02_PARAM_CADETS_AT_ATTENTION_JDG);
}
//S_A_HUMAN.H_A_J09C is animation for make mistake
if ((stricmp (name, "S_A_HUMAN.H_A_J09C") == 0 ) && (state != CADET_1_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Animation_Complete, Make Mistake\n");
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_CADET_1_JDG, MPR_A02_PARAM_CADETS_MADE_MISTAKE_JDG);
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_1_MISTAKE_DELAY_JDG);
}
}
};
/*
MPR_A02_DRILL_CADET_2
The following is the script for cadet number 2
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A02_Drill_Cadet_2_JDG, "")
{
typedef enum
{
MPR_A02_cadet_2_id_JDGLE = 0,
CADET_2_INNATE,
} C2State;
C2State state;
//declare variables here
void Created(GameObject* obj)
{
//DebugPrint("JDG. Demo, Cadet 2, Created and turning off innate\n");
MPR_A02_cadet_2_id_JDG = Commands->Get_ID (obj);
Vector3 C2_Start_Spot(MPR_A02_CADET_2_X_JDG, MPR_A02_CADET_2_Y_JDG, MPR_A02_CADET_2_Z_JDG);
Commands->Action_Movement_Goto_Location (obj, C2_Start_Spot, .02f);
Vector3 Cadet_Face_Spot(-56.02f, -9.09f, 2.42f);
Commands->Action_Attack_Location(obj, Cadet_Face_Spot, 0, 0);
}
void Killed (GameObject* obj, GameObject* Killer)
{
if (Killer == (Commands->Get_The_Star()))
{
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_DRILL_INSTRUCTOR_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), MPR_A02_CUSTOM_CADET_1_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), MPR_A02_CUSTOM_CADET_3_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
}
}
void Custom (GameObject* obj, int Type, int Param, GameObject* Sender)
{
if ((Param == MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG) && (Type == MPR_A02_CUSTOM_CADET_2_JDG))
{
//DebugPrint("JDG. Demo, Cadet 2, Recieved Innate Custom\n");
state = CADET_2_INNATE;
float timeDelay = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_ATTACK_DELAY_JDG);
}
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A02_TIMER_CADET_2_ATTACK_DELAY_JDG) && (state == CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Attack Havoc Timer_Expired, start\n");
Commands->Action_Movement_Set_Forward_Speed(obj, 0.25f);
Vector3 C2_Attack_Spot(-50.03f, -13.23f, 2.42f);
Commands->Action_Movement_Goto_Location (obj, C2_Attack_Spot, .02f);
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_D2B2", 0);
//"S_A_HUMAN.H_A_D2B2" is animation for walking backwards
Commands->Action_Attack_Object (obj, (Commands->Get_The_Star()), 150.0f, 50);
}
if ((Timer_ID == MPR_A02_TIMER_CADET_2_TEN_HUT_DELAY_JDG) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Timer_Expired, start\n");
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_A0A0", 0);
//S_A_HUMAN.H_A_A0A0 is animation for come to attention
}
if ((Timer_ID == MPR_A02_TIMER_CADET_2_PUSHUPS_DELAY_JDG) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Pushups_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J43C", 0);
//S_A_HUMAN.H_A_J13B is animation for pushups
}
if ((Timer_ID == MPR_A02_TIMER_CADET_2_SITUPS_DELAY_JDG) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Situps_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J13C", 0);
//S_A_HUMAN.H_A_J14C is animation for situps
}
if ((Timer_ID == MPR_A02_TIMER_CADET_2_JUMPING_JACKS_DELAY_JDG) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, JJacks_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J43A" , 0);
//S_A_HUMAN.H_A_J43B is animation for j-jacks
}
if ((Timer_ID == MPR_A02_TIMER_CADET_2_MISTAKE_DELAY_JDG) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Mistake_Timer_Expired, start\n");
if (exercise == PUSHUPS)
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J43C", 0);
//S_A_HUMAN.H_A_J13B is animation for pushups
}
else if (exercise == SITUPS)
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J14C", 1);
//S_A_HUMAN.H_A_J14C is animation for situps
}
else
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J43A" , 0);
//S_A_HUMAN.H_A_J43B is animation for j-jacks
}
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
if ((stricmp(name, "S_A_HUMAN.H_A_J43C") == 0) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J13A", 0);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J43A") == 0) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J43B", 1);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J13C") == 0) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J14C", 1);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J13A") == 0) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), "S_A_HUMAN.H_A_J13B", 1);
}
//S_A_HUMAN.H_A_A0A0 is animation for come to attention
if ((stricmp(name, "S_A_HUMAN.H_A_A0A0") == 0) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Animation_Complete, Come to Attention\n");
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_CADET_2_JDG, MPR_A02_PARAM_CADETS_AT_ATTENTION_JDG);
}
//S_A_HUMAN.H_A_J09C is animation for make mistake
if ((stricmp(name, "S_A_HUMAN.H_A_J09C") == 0) && (state != CADET_2_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Animation_Complete, Make Mistake\n");
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_CADET_2_JDG, MPR_A02_PARAM_CADETS_MADE_MISTAKE_JDG);
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_2_MISTAKE_DELAY_JDG);
}
}
};
/*
MPR_A02_DRILL_CADET_3
The following is the script for cadet number 3
DEBUG NAMING CONVENTION
*/
DECLARE_SCRIPT(MPR_A02_Drill_Cadet_3_JDG, "")
{
typedef enum
{
MPR_A02_cadet_3_id_JDGLE = 0,
CADET_3_INNATE,
} C3State;
C3State state;
//declare variables here
void Created(GameObject* obj)
{
//DebugPrint("JDG. Demo, Cadet 3, Created and turning off innate\n");
MPR_A02_cadet_3_id_JDG = Commands->Get_ID (obj);
Vector3 C3_Start_Spot(MPR_A02_CADET_3_X_JDG, MPR_A02_CADET_3_Y_JDG, MPR_A02_CADET_3_Z_JDG);
Commands->Action_Movement_Goto_Location (obj, C3_Start_Spot, .02f);
Vector3 Cadet_Face_Spot(-56.02f, -9.09f, 2.42f);
Commands->Action_Attack_Location(obj, Cadet_Face_Spot, 0, 0);
}
void Killed (GameObject* obj, GameObject* Killer)
{
if (Killer == (Commands->Get_The_Star()))
{
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_DRILL_INSTRUCTOR_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), MPR_A02_CUSTOM_CADET_1_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), MPR_A02_CUSTOM_CADET_2_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
}
}
void Custom (GameObject* obj, int Type, int Param, GameObject* Sender)
{
if ((Param == MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG) && (Type == MPR_A02_CUSTOM_CADET_3_JDG))
{
//DebugPrint("JDG. Demo, Cadet 3, Recieved Innate Custom\n");
state = CADET_3_INNATE;
float timeDelay = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_ATTACK_DELAY_JDG);
}
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A02_TIMER_CADET_3_ATTACK_DELAY_JDG) && (state == CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Attack Havoc Timer_Expired, start\n");
Commands->Action_Movement_Set_Forward_Speed(obj, 0.55f);
Vector3 C3_Attack_Spot(-55.32f, -16.55f, 2.42f);
Commands->Action_Movement_Goto_Location (obj, C3_Attack_Spot, .02f);
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_D2A4", 0);
//"S_A_HUMAN.H_A_D2A4" is animation for running to right
Commands->Action_Attack_Object (obj, (Commands->Get_The_Star()), 150.0f, 50);
}
if ((Timer_ID == MPR_A02_TIMER_CADET_3_TEN_HUT_DELAY_JDG) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Timer_Expired, start\n");
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_A0A0", 0);
//S_A_HUMAN.H_A_A0A0 is animation for come to attention
}
if ((Timer_ID == MPR_A02_TIMER_CADET_3_PUSHUPS_DELAY_JDG) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 1, Pushups_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J43C", 0);
//S_A_HUMAN.H_A_J13A is animation for transition into pushups
}
if ((Timer_ID == MPR_A02_TIMER_CADET_3_SITUPS_DELAY_JDG) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Situps_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J13C", 0);
//S_A_HUMAN.H_A_J14C is animation for situps
}
if ((Timer_ID == MPR_A02_TIMER_CADET_3_JUMPING_JACKS_DELAY_JDG) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, JJacks_Timer_Expired, start\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J43A" , 0);
//S_A_HUMAN.H_A_J43B is animation for j-jacks
}
if ((Timer_ID == MPR_A02_TIMER_CADET_3_MISTAKE_DELAY_JDG) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Mistake_Timer_Expired, start\n");
if (exercise == PUSHUPS)
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J43C", 0);
//S_A_HUMAN.H_A_J13B is animation for pushups
}
else if (exercise == SITUPS)
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J14C", 1);
//S_A_HUMAN.H_A_J13C is animation for transition outof pushups
}
else
{
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J43A" , 0);
//S_A_HUMAN.H_A_J43B is animation for j-jacks
}
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
if ((stricmp(name, "S_A_HUMAN.H_A_J43C") == 0) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J13A", 0);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J43A") == 0) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J43B", 1);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J13C") == 0) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J14C", 1);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J13A") == 0) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Pushup transition Complete, Start pushups\n");
Commands->Set_Animation ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), "S_A_HUMAN.H_A_J13B", 1);
}
//S_A_HUMAN.H_A_A0A0 is animation for come to attention
if ((stricmp(name, "S_A_HUMAN.H_A_A0A0") == 0) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 3, Animation_Complete, Come to Attention\n");
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_CADET_3_JDG, MPR_A02_PARAM_CADETS_AT_ATTENTION_JDG);
}
//S_A_HUMAN.H_A_J09C is animation for make mistake
if ((stricmp(name, "S_A_HUMAN.H_A_J09C") == 0) && (state != CADET_3_INNATE))
{
//DebugPrint("JDG. Demo, Cadet 2, Animation_Complete, Make Mistake\n");
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_CADET_3_JDG, MPR_A02_PARAM_CADETS_MADE_MISTAKE_JDG);
float timeDelay = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), timeDelay, MPR_A02_TIMER_CADET_3_MISTAKE_DELAY_JDG);
}
}
};
/*
MPR_A02_Drill_Kill_Havoc_Zone
The following script is for two zones next to the exercise routine that lets the exercise guys know when
*/
DECLARE_SCRIPT(MPR_A02_Drill_Kill_Havoc_Zone_JDG, "")
{
int Havoc_in_this_Zone;
void Created(GameObject* obj)
{
//DebugPrint("JDG, PRDemo, Drill Instructor, Kill Havoc Zone, Created okay\n");
Havoc_in_this_Zone = 0;
}
void Entered (GameObject* obj, GameObject* Enterer)
{
if (Enterer == (Commands->Get_The_Star()) && (Havoc_in_this_Zone == 0))
{
//DebugPrint("JDG, PRDemo, Drill Instructor, Havoc has penetrated Kill Havoc Zone, Sending Innate Customs\n");
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_drill_instructor_id_JDG)), MPR_A02_CUSTOM_DRILL_INSTRUCTOR_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_1_id_JDG)), MPR_A02_CUSTOM_CADET_1_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_2_id_JDG)), MPR_A02_CUSTOM_CADET_2_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_cadet_3_id_JDG)), MPR_A02_CUSTOM_CADET_3_JDG, MPR_A02_PARAM_CADETS_GOTO_INNATE_JDG);
}
}
};
/*
MPR_A04_SuicideRun_StartZone
The following are the scripts involved with the Obelisk suicide run.
It is broken up into 7 scripts, start zone, GDI minigunner 1, GDI minigunner 2,
GDI medium tank, NOD minigunner, NOD light tank, and the control console.
*/
DECLARE_SCRIPT(MPR_A04_SuicideRun_StartZone_JDG, "")
{
int Havoc_in_this_Zone;
void Created(GameObject* obj)
{
//DebugPrint("JDG, PRDemo, SuicideRun, StartZone, Created okay\n");
Havoc_in_this_Zone = 0;
MPR_A04_suiciderun_enterzone_id_JDG = Commands->Get_ID (obj);
}
void Entered (GameObject* obj, GameObject* Enterer)
{
if (Enterer == (Commands->Get_The_Star()) && (Havoc_in_this_Zone == 0))
{
//DebugPrint("JDG, PRDemo, SuicideRun, Havoc has penetrated StartZone, Start GDI Suicide Team Initial Motion\n");
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), 0.20f);
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), 0.20f);
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 0.35f);
Vector3 NewPosition(203.40f, 364.33f, 1.04f);
Commands->Action_Movement_Goto_Location((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), NewPosition, 0.01f);
Commands->Action_Movement_Follow_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 6.0f);
Commands->Action_Movement_Follow_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 6.0f);
float timeDelay_1 = Commands->Get_Random (8.5f,12.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)), timeDelay_1, MPR_A04_TIMER_SUICIDERUN_NOD_MINIGUNNER_HAVOC_IN_ZONE_DELAY_JDG);
Havoc_in_this_Zone++;
}
}
};
/*
MPR_A04_SuicideRun_GDI_Minigunner_1
The following is the script for the GDI minigunner by the obelisk. Its pretty tightly scripted and fragile.
*/
DECLARE_SCRIPT(MPR_A04_SuicideRun_GDI_Minigunner_1_JDG, "")
{
typedef enum
{
MPR_A04_MPR_A04_SUICIDERUN_GDI_MINIGUNNER_1_IDLE_JDG = 0,
MPR_A04_SUICIDERUN_GDI_MINIGUNNER_1_MOVING_TO_OBELISK,
} GDIM1State;
GDIM1State M1state;
void Created(GameObject* obj)
{
//DebugPrint("JDG, PRDemo, SuicideRun, GDI Minigunner 1, Created okay\n");
MPR_A04_suiciderun_gdi_minigunner_1_id_JDG = Commands->Get_ID (obj);
M1state = MPR_A04_MPR_A04_SUICIDERUN_GDI_MINIGUNNER_1_IDLE_JDG;
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_CHASE_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)))
{
//DebugPrint("JDG, PRDemo, SuicideRun, GDI Minigunner 1 ChaseDelay Timer Expired\n");
if (Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), 0.75f);
Commands->Action_Movement_Follow_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)), 10.0f);
Commands->Action_Attack_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)), 0.0f, 50);
}
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_FOLLOW_TANK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)))
{
//DebugPrint("JDG, PRDemo, SuicideRun, GDI Minigunner 1 Follow Tank Timer Expired\n");
if (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), 0.5f);
Commands->Action_Movement_Follow_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 6.0f);
Commands->Action_Attack_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 0.0f, 0);
}
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_ATTACK_LIGHTTANK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)))
{
Vector3 Escort_1_go_to_Spot(153.19f, 406.50f, 0.65f);
Commands->Action_Movement_Goto_Location (obj, Escort_1_go_to_Spot, 5.5f);
Commands->Action_Attack_Object(obj, (Commands->Find_Object(MPR_A04_suiciderun_nod_light_tank_id_JDG)), 0.0f, 20.f);
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_ATTACK_OBELISK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)))
{
if ( status == MPR_A04_SUICIDERUN_CONSOLE_ALIVE)
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), 0.35f);
float Xnot = Commands->Get_Random (90.69f, 110.69f);
float Ynot = Commands->Get_Random (396.69f, 416.69f);
Vector3 Obelisk_Move_to_Location(Xnot, Ynot, 3.37f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
Vector3 Obelisk_Attack_Location(81.60f, 403.71f, 8.77f);
Commands->Action_Attack_Location(obj, Obelisk_Attack_Location,10.0f, 50.0f);
}
else
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), 0.25f);
Vector3 Obelisk_Move_to_Location(108.19f, 405.22f, 1.35f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
M1state = MPR_A04_SUICIDERUN_GDI_MINIGUNNER_1_MOVING_TO_OBELISK;
}
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_OBELISK_IS_DEAD_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)) && (state == MPR_A04_SUICIDERUN_LIGHTTANK_DEAD))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), 0.25f);
Vector3 Obelisk_Move_to_Location(108.19f, 405.22f, 1.35f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
M1state = MPR_A04_SUICIDERUN_GDI_MINIGUNNER_1_MOVING_TO_OBELISK;
}
}
void Movement_Complete (GameObject* obj, MovementCompleteReason)
{
if ((M1state == MPR_A04_SUICIDERUN_GDI_MINIGUNNER_1_MOVING_TO_OBELISK) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)))
{
Commands->Set_Animation(obj, "S_A_HUMAN.H_A_J33C", 0);
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
if ((stricmp(name, "S_A_HUMAN.H_A_J33C") == 0))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J15C", 0);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J15C") == 0))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J03C", 0);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J03C") == 0))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J33C", 0);
}
}
};
/*
MPR_A04_SuicideRun_GDI_Minigunner_2
The following is the script for the GDI minigunner by the obelisk. Its pretty tightly scripted and fragile.
*/
DECLARE_SCRIPT(MPR_A04_SuicideRun_GDI_Minigunner_2_JDG, "")
{
typedef enum
{
MPR_A04_SUICIDERUN_GDI_MINIGUNNER_2_MOVING_TO_OBELISK = 0,
} GDIM2State;
GDIM2State M2state;
void Created(GameObject* obj)
{
//DebugPrint("JDG, PRDemo, SuicideRun, GDI Minigunner 2, Created okay\n");
MPR_A04_suiciderun_gdi_minigunner_2_id_JDG = Commands->Get_ID (obj);
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_CHASE_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)))
{
//DebugPrint("JDG, PRDemo, SuicideRun, GDI Minigunner 2 ChaseDelay Timer Expired\n");
if (Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), 0.75f);
Commands->Action_Movement_Follow_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)), 10.0f);
Commands->Action_Attack_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)), 0.0f, 50);
}
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_FOLLOW_TANK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)))
{
//DebugPrint("JDG, PRDemo, SuicideRun, GDI Minigunner 2 Follow Tank Timer Expired\n");
if (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), 0.5f);
Commands->Action_Movement_Follow_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 6.0f);
Commands->Action_Attack_Object((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 0.0f, 0);
}
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_ATTACK_LIGHTTANK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)))
{
Vector3 Escort_2_go_to_Spot(163.07f, 403.31f, 1.40f);
Commands->Action_Movement_Goto_Location (obj, Escort_2_go_to_Spot, 5.5f);
Commands->Action_Attack_Object(obj, (Commands->Find_Object(MPR_A04_suiciderun_nod_light_tank_id_JDG)), 0.0f, 20.f);
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_ATTACK_OBELISK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)))
{
if ( status == MPR_A04_SUICIDERUN_CONSOLE_ALIVE)
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), 0.35f);
float Xnot = Commands->Get_Random (90.69f, 110.69f);
float Ynot = Commands->Get_Random (396.69f, 416.69f);
Vector3 Obelisk_Move_to_Location(Xnot, Ynot, 3.37f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
Vector3 Obelisk_Attack_Location(81.60f, 403.71f, 8.77f);
Commands->Action_Attack_Location(obj, Obelisk_Attack_Location,10.0f, 50.0f);
}
else
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), 0.25f);
Vector3 Obelisk_Move_to_Location(97.86f, 411.18f, 2.97f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
M2state = MPR_A04_SUICIDERUN_GDI_MINIGUNNER_2_MOVING_TO_OBELISK;
}
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_OBELISK_IS_DEAD_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)) && (state == MPR_A04_SUICIDERUN_LIGHTTANK_DEAD))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), 0.25f);
Vector3 Obelisk_Move_to_Location(97.86f, 411.18f, 2.97f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
M2state = MPR_A04_SUICIDERUN_GDI_MINIGUNNER_2_MOVING_TO_OBELISK;
}
}
void Movement_Complete (GameObject* obj, MovementCompleteReason)
{
if ((M2state == MPR_A04_SUICIDERUN_GDI_MINIGUNNER_2_MOVING_TO_OBELISK) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)))
{
Commands->Set_Animation(obj, "S_A_HUMAN.H_A_J09C", 0);
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
if ((stricmp(name, "S_A_HUMAN.H_A_J09C") == 0))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J10C", 0);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J10C") == 0))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J11C", 0);
}
if ((stricmp(name, "S_A_HUMAN.H_A_J11C") == 0))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J09C", 0);
}
}
};
/*
MPR_A04_SuicideRun_GDI_Medium_Tank
The following is the script for the GDI medium tank by the obelisk. Its pretty tightly scripted and fragile.
*/
DECLARE_SCRIPT(MPR_A04_SuicideRun_GDI_Medium_Tank_JDG, "")
{
void Created(GameObject* obj)
{
//DebugPrint("JDG, PRDemo, SuicideRun, GDI Medium Tank, Created okay\n");
MPR_A04_suiciderun_gdi_medium_tank_id_JDG = Commands->Get_ID (obj);
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MEDIUMTANK_ATTACK_LIGHTTANK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 0.45f);
Vector3 Tank_go_to_Spot(201.56f, 374.40f, 1.92f);
Commands->Action_Movement_Goto_Location (obj, Tank_go_to_Spot, 0.5f);
Commands->Action_Attack_Object(obj, (Commands->Find_Object(MPR_A04_suiciderun_nod_light_tank_id_JDG)), 0.0f, 100.f);
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MEDIUMTANK_ATTACK_OBELISK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)))
{
if ( status == MPR_A04_SUICIDERUN_CONSOLE_ALIVE)
{
float Xnot = Commands->Get_Random (90.69f, 110.69f);
float Ynot = Commands->Get_Random (396.69f, 416.69f);
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 0.25f);
Vector3 Obelisk_Move_to_Location(Xnot, Ynot, 3.37f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
Vector3 Obelisk_Attack_Location(81.60f, 403.71f, 8.77f);
Commands->Action_Attack_Location(obj, Obelisk_Attack_Location,10.0f, 50.0f);
}
else
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 0.25f);
Vector3 Obelisk_Move_to_Location(95.20f, 405.23f, 4.3f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
}
}
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_GDI_MEDIUMTANK_OBELISK_IS_DEAD_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)) && (state == MPR_A04_SUICIDERUN_LIGHTTANK_DEAD))
{
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 0.25f);
Vector3 Obelisk_Move_to_Location(95.20f, 405.23f, 4.3f);
Commands->Action_Movement_Goto_Location (obj, Obelisk_Move_to_Location, 0.5f);
Vector3 Obelisk_Attack_Location(180.13f, 410.65f, 2.90f);
Commands->Action_Attack_Location(obj, Obelisk_Attack_Location,0, 0);
}
}
};
/*
MPR_A04_SuicideRun_NOD_Minigunner
The following is the script for the NOD minigunner tank by the obelisk. Its pretty tightly scripted and fragile.
*/
DECLARE_SCRIPT(MPR_A04_SuicideRun_NOD_Minigunner_JDG, "")
{
void Created(GameObject* obj)
{
//DebugPrint("JDG, PRDemo, SuicideRun, NOD Minigunner, Created okay\n");
MPR_A04_suiciderun_nod_minigunner_id_JDG = Commands->Get_ID (obj);
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_NOD_MINIGUNNER_HAVOC_IN_ZONE_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)))
{
//DebugPrint("JDG, PRDemo, SuicideRun, NOD Minigunner, Recieved Custom from EnterZone, Starting GDI Minigunner Timers\n");
float timeDelay_1 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), timeDelay_1, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_CHASE_DELAY_JDG);
float timeDelay_2 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), timeDelay_2, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_CHASE_DELAY_JDG);
NOD_MINIGUNNER_ATTACKS_HAVOC ();
}
}
void NOD_MINIGUNNER_ATTACKS_HAVOC (void)
{
//DebugPrint("JDG, PRDemo, SuicideRun, NOD Minigunner, NOD_MINIGUNNER_ATTACKS_HAVOC start\n");
Commands->Action_Movement_Set_Forward_Speed((Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)), 0.6f);
Commands->Action_Movement_Follow_Object((Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG)), (Commands->Get_The_Star()), 10.0f);
}
void Damaged (GameObject* obj, GameObject* Damager)
{
if ((Damager == (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG))) || (Damager == (Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG))))
//DebugPrint("JDG, PRDemo, SuicideRun, NOD Minigunner, Has been damaged\n");
{
GameObject* nodGunner = Commands->Find_Object(MPR_A04_suiciderun_nod_minigunner_id_JDG);
if (nodGunner != NULL)
{
Commands->Action_Movement_Stop(nodGunner);
//DebugPrint("JDG, PRDemo, SuicideRun, NOD Minigunner, Has stopped\n");
}
}
}
void Killed(GameObject* obj, GameObject* Killer)
{
//DebugPrint("JDG, PRDemo, SuicideRun, NOD Minigunner, NOD_MINIGUNNER Killed, Start new GDI timers\n");
float timeDelay_1 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), timeDelay_1, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_FOLLOW_TANK_DELAY_JDG);
float timeDelay_2 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), timeDelay_2, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_FOLLOW_TANK_DELAY_JDG);
float timeDelay_4 = Commands->Get_Random (3.5f,6.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_nod_light_tank_id_JDG)), timeDelay_4, MPR_A04_TIMER_SUICIDERUN_NOD_LIGHTTANK_ATTACK_MEDIUMTANK_DELAY_JDG);
}
};
/*
MPR_A04_SuicideRun_NOD_Light_Tank
The following is the script for the NOD light tank by the obelisk. Its pretty tightly scripted and fragile.
*/
DECLARE_SCRIPT(MPR_A04_SuicideRun_NOD_Light_Tank_JDG, "")
{
void Created(GameObject* obj)
{
//DebugPrint("JDG, PRDemo, SuicideRun, NOD Light Tank, Created okay\n");
MPR_A04_suiciderun_nod_light_tank_id_JDG = Commands->Get_ID (obj);
Commands->Set_Health(obj, 400.0f);
state = MPR_A04_SUICIDERUN_LIGHTTANK_ALIVE;
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A04_TIMER_SUICIDERUN_NOD_LIGHTTANK_ATTACK_MEDIUMTANK_DELAY_JDG) && (Commands->Find_Object(MPR_A04_suiciderun_nod_light_tank_id_JDG)))
{
Commands->Action_Attack_Object(obj, (Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), 10.0f, 100.0f);
float timeDelay_1 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), timeDelay_1, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_ATTACK_LIGHTTANK_DELAY_JDG);
float timeDelay_2 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), timeDelay_2, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_ATTACK_LIGHTTANK_DELAY_JDG);
float timeDelay_4 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), timeDelay_4, MPR_A04_TIMER_SUICIDERUN_GDI_MEDIUMTANK_ATTACK_LIGHTTANK_DELAY_JDG);
}
}
void Killed(GameObject* obj, GameObject* Killer)
{
float timeDelay_1 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), timeDelay_1, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_ATTACK_OBELISK_DELAY_JDG);
float timeDelay_2 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), timeDelay_2, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_ATTACK_OBELISK_DELAY_JDG);
float timeDelay_4 = Commands->Get_Random (1.5f,2.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), timeDelay_4, MPR_A04_TIMER_SUICIDERUN_GDI_MEDIUMTANK_ATTACK_OBELISK_DELAY_JDG);
state = MPR_A04_SUICIDERUN_LIGHTTANK_DEAD;
}
};
/*
MPR_A04_SuicideRun_Console
The following is a script for the suicide run. It goes on both the obelisk and power plant consoles and lets
the gdi guys know if/when the console gets destroyed.
*/
DECLARE_SCRIPT(MPR_A04_SuicideRun_Console_JDG, "")
{
void Created(GameObject* obj)
{
status = MPR_A04_SUICIDERUN_CONSOLE_ALIVE;
}
void Killed(GameObject* obj, GameObject* Killer)
{
float timeDelay_1 = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_1_id_JDG)), timeDelay_1, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_1_OBELISK_IS_DEAD_DELAY_JDG);
float timeDelay_2 = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_minigunner_2_id_JDG)), timeDelay_2, MPR_A04_TIMER_SUICIDERUN_GDI_MINIGUNNER_2_OBELISK_IS_DEAD_DELAY_JDG);
float timeDelay_4 = Commands->Get_Random (0.5f,1.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A04_suiciderun_gdi_medium_tank_id_JDG)), timeDelay_4, MPR_A04_TIMER_SUICIDERUN_GDI_MEDIUMTANK_OBELISK_IS_DEAD_DELAY_JDG);
status = MPR_A04_SUICIDERUN_CONSOLE_DEAD;
}
};
/*
MPR_A02_DriveBy_EnterZone
The following are the scripts involved in the harvester escort routine.
There are 2 scripts, one for a zone and the other for the Harvester
*/
DECLARE_SCRIPT(MPR_A02_DriveBy_EnterZone_JDG, "")
{
int Havoc_in_this_Zone;
void Created(GameObject* obj)
{
//DebugPrint("JDG, MPR_A02_HarvesterDriveBy_EnterZone, Created Okay\n");
Havoc_in_this_Zone = 0;
}
void Entered (GameObject* obj, GameObject* Enterer)
{
if (Enterer == (Commands->Get_The_Star()) && (Havoc_in_this_Zone == 0))
{
//Commands->DebugPrint("JDG, MPRA02, Havoc has Entered the DriveBy start zone, Sending customs to harvester patrol group\n");
//Commands->Display_Text_Colored(Vector3(1.0f,0.0f,0.7f),"JDG, MPRA02, Havoc has Entered the DriveBy start zone, Sending customs to harvester patrol group\n" );
Commands->Send_Custom_Event (obj, (Commands->Find_Object(MPR_A02_driveby_harvester_id_JDG)), MPR_A02_CUSTOM_DRIVEBY_HARVESTER_JDG, MPR_A00_PARAM_HAVOC_IN_ENTER_ZONE_JDG);
Havoc_in_this_Zone++;
}
}
};
/*
MPR_A02_DriveBy_Harvester
The following is the script for the harvester that comes from the refinery. It basicly just follows
a waypath to the tiberium field and then does nothing.
*/
DECLARE_SCRIPT(MPR_A02_DriveBy_Harvester_JDG, "")
{
void Created(GameObject* obj)
{
//DebugPrint("JDG, MPRA02, DriveBy, Harvester Created Okay\n");
MPR_A02_driveby_harvester_id_JDG = Commands->Get_ID (obj);
Commands->Set_Health(obj, 400.0f);
}
void Custom (GameObject* obj, int Type, int Param, GameObject* Sender)
{
if ((Type == MPR_A02_CUSTOM_DRIVEBY_HARVESTER_JDG) && (Param == MPR_A00_PARAM_HAVOC_IN_ENTER_ZONE_JDG))
{
//DebugPrint("JDG, MPRA02, Harvester, Recieved Custom from EnterZone, Starting Scenario\n");
Commands->Action_Movement_Set_Forward_Speed(obj, 0.25f);
Commands->Action_Movement_Follow_Waypath ( obj, MPR_A02_HARVESTER_WAYPATH_JDG, MPR_A02_HARVESTER_WAYPATH_START_JDG, MPR_A02_HARVESTER_WAYPATH_STOP_JDG, true );
}
}
};
/*
MPR_A03_Helicopter_EnterZone
The following are the scripts involved with the injured pilot at
the crashed Apache. There are two scripts, the first is for a zone
that acts as a controller for the random explosions, and the second
is for the pilot himself.
*/
DECLARE_SCRIPT(MPR_A03_Helicopter_EnterZone_JDG, "")
{
int Havoc_in_this_Zone;
int Explosion_Count;
int count;
int MPR_A03_HELI_EXLOSION_ZONE_ID;
typedef enum
{
MPR_A03_JDG_EXPLOSION_TIMER_1,
MPR_A03_JDG_EXPLOSION_TIMER_2,
MPR_A03_JDG_EXPLOSION_TIMER_3,
MPR_A03_JDG_EXPLOSION_TIMER_4,
} PRTIMER_TIMERS;
void Created(GameObject* obj)
{
//DebugPrint("JDG, MPRA03, Heli_Explosion EnterZone created okay\n");
Havoc_in_this_Zone = 0;
MPR_A03_HELI_EXLOSION_ZONE_ID = Commands->Get_ID (obj);
}
void Entered (GameObject* obj, GameObject* Enterer)
{
if (Enterer == (Commands->Get_The_Star()) && (Havoc_in_this_Zone == 0))
{
//DebugPrint("JDG, MPRA03, Havoc has Entered the Heli_Explosion EnterZone, Starting Explosions\n");
//Havoc_in_this_Zone++;
Explosion_Count = (int)Commands->Get_Random (10, 15);
count = 0;
Commands->Start_Timer((Commands->Find_Object(MPR_A03_helicopter_injured_nod_pilot_id_JDG)), .71f, MPR_A03_TIMER_INJURED_PILOT_CRAWL_1_JDG);
Havoc_in_this_Zone++;
Make_Explosions ();
}
}
void Make_Explosions ()
{
//DebugPrint("JDG, MPRA03, Make Explosions start\n");
int Explosion_Number = (int)Commands->Get_Random(1, 5);
if ((Explosion_Number == 1) && (count <= Explosion_Count))
{
//DebugPrint("JDG, MPRA03, Make Explosions Starting Timer 1\n");
count++;
float timeDelay = Commands->Get_Random(3.0f, 5.0f);
Commands->Start_Timer((Commands->Find_Object(MPR_A03_HELI_EXLOSION_ZONE_ID)), timeDelay, MPR_A03_JDG_EXPLOSION_TIMER_1);
}
else if ((Explosion_Number == 2) && (count <= Explosion_Count))
{
//DebugPrint("JDG, MPRA03, Make Explosions Starting Timer 2\n");
count++;
float timeDelay = Commands->Get_Random(3.0f, 5.0f);
Commands->Start_Timer((Commands->Find_Object(MPR_A03_HELI_EXLOSION_ZONE_ID)), timeDelay, MPR_A03_JDG_EXPLOSION_TIMER_2);
}
else if ((Explosion_Number == 3) && (count <= Explosion_Count))
{
//DebugPrint("JDG, MPRA03, Make Explosions Starting Timer 3\n");
count++;
float timeDelay = Commands->Get_Random(3.0f, 5.0f);
Commands->Start_Timer((Commands->Find_Object(MPR_A03_HELI_EXLOSION_ZONE_ID)), timeDelay, MPR_A03_JDG_EXPLOSION_TIMER_3);
}
else if (count <= Explosion_Count)
{
//DebugPrint("JDG, MPRA03, Make Explosions Starting Timer 4\n");
count++;
float timeDelay = Commands->Get_Random(3.0f, 5.0f);
Commands->Start_Timer((Commands->Find_Object(MPR_A03_HELI_EXLOSION_ZONE_ID)), timeDelay, MPR_A03_JDG_EXPLOSION_TIMER_4);
}
}
void Timer_Expired (GameObject*obj, int Timer_ID)
{
if (Timer_ID == MPR_A03_JDG_EXPLOSION_TIMER_1)
{
float Xnot = Commands->Get_Random (186.20f, 190.21f);
float Ynot = Commands->Get_Random (31.0f, 35.0f);
float Znot = Commands->Get_Random (2.59f, 4.69f);
Vector3 Explosion_Location(Xnot, Ynot, Znot);
//DebugPrint("JDG, MPRA03, Timer Expired Explosion 1\n");
Commands->Create_Explosion ("Rocket Explosion", Explosion_Location, obj);
Make_Explosions ();
}
if (Timer_ID == MPR_A03_JDG_EXPLOSION_TIMER_2)
{
float Xnot = Commands->Get_Random (178.21f, 180.21f);
float Ynot = Commands->Get_Random (38.0f, 40.0f);
float Znot = Commands->Get_Random (2.69f, 4.69f);
Vector3 Explosion_Location(Xnot, Ynot, Znot);
//DebugPrint("JDG, MPRA03, Timer Expired Explosion 2\n");
Commands->Create_Explosion ("Rocket Explosion", Explosion_Location, obj);
Make_Explosions ();
}
if (Timer_ID == MPR_A03_JDG_EXPLOSION_TIMER_3)
{
float Xnot = Commands->Get_Random (183.21f, 185.21f);
float Ynot = Commands->Get_Random (46.0f, 49.0f);
float Znot = Commands->Get_Random (6.15f, 7.69f);
Vector3 Explosion_Location(Xnot, Ynot, Znot);
//DebugPrint("JDG, MPRA03, Timer Expired Explosion 3\n");
Commands->Create_Explosion ("Rocket Explosion", Explosion_Location, obj);
Make_Explosions ();
}
if (Timer_ID == MPR_A03_JDG_EXPLOSION_TIMER_4)
{
float Xnot = Commands->Get_Random (188.21f, 190.21f);
float Ynot = Commands->Get_Random (47.0f, 49.0f);
float Znot = Commands->Get_Random (8.06f, 10.69f);
Vector3 Explosion_Location(Xnot, Ynot, Znot);
//DebugPrint("JDG, MPRA03, Timer Expired Explosion 4\n");
Commands->Create_Explosion ("Rocket Explosion", Explosion_Location, obj);
Make_Explosions ();
}
}
};
/*
MPR_A03_Helicopter_Injured_NOD_Pilot
The following is the script for the injured pilot by the downed Apache.
*/
DECLARE_SCRIPT(MPR_A03_Helicopter_Injured_NOD_Pilot_JDG, "")
{
typedef enum
{
MPR_A03_PILOT_IDLE = 0,
MPR_A03_PILOT_STANDING_UP,
MPR_A03_PILOT_STAMMERING,
MPR_A03_PILOT_LOOKING_BACK,
MPR_A03_PILOT_ADJUSTING_KEVLAR,
MPR_A03_PILOT_ATTACKING,
} PILOTState;
PILOTState state;
void Created(GameObject* obj)
{
//DebugPrint("JDG, MPRA03, Injured Pilot Created Okay\n");
MPR_A03_helicopter_injured_nod_pilot_id_JDG = Commands->Get_ID (obj);
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_601A", 1);
state = MPR_A03_PILOT_IDLE;
}
void Timer_Expired (GameObject*obj, int Timer_ID)
{
if ((Timer_ID == MPR_A03_TIMER_INJURED_PILOT_CRAWL_1_JDG) && (Commands->Find_Object(MPR_A03_helicopter_injured_nod_pilot_id_JDG)))
{
//DebugPrint("JDG, MPRA03, Injured Pilot Timer Expired, Start Crawling\n");
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_H11C", 0);
//"S_A_HUMAN.H_A_H11C" is animation for standing up
state = MPR_A03_PILOT_STANDING_UP;
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
if ((stricmp("S_A_HUMAN.H_A_H11C", name) == 0) && (Commands->Find_Object(MPR_A03_helicopter_injured_nod_pilot_id_JDG)) && (state == MPR_A03_PILOT_STANDING_UP))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_611A", 0);
state = MPR_A03_PILOT_STAMMERING;
}
if ((stricmp("S_A_HUMAN.H_A_611A", name) == 0) && (Commands->Find_Object(MPR_A03_helicopter_injured_nod_pilot_id_JDG)) && (state == MPR_A03_PILOT_STAMMERING))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J11C", 0);
state = MPR_A03_PILOT_LOOKING_BACK;
}
if ((stricmp("S_A_HUMAN.H_A_J11C", name) == 0) && (Commands->Find_Object(MPR_A03_helicopter_injured_nod_pilot_id_JDG)) && (state == MPR_A03_PILOT_LOOKING_BACK))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J22C", 0);
state = MPR_A03_PILOT_ADJUSTING_KEVLAR;
}
if ((stricmp("S_A_HUMAN.H_A_J22C", name) == 0) && (Commands->Find_Object(MPR_A03_helicopter_injured_nod_pilot_id_JDG)) && (state == MPR_A03_PILOT_ADJUSTING_KEVLAR))
{
Commands->Action_Movement_Set_Forward_Speed (obj, 0.5f);
Commands->Action_Movement_Goto_Object (obj, (Commands->Get_The_Star()), 6.0f);
Commands->Action_Attack_Object (obj, (Commands->Get_The_Star()), 1.0f, 20.0f);
}
}
};
/*
MPR_A03_BridgeScene_EnterZone
The following are the scripts involved in the bridge blow up scenario.
There are presently 3 scripts, 2 zones and 1 engineer.
*/
DECLARE_SCRIPT(MPR_A03_BridgeScene_EnterZone_JDG, "")
{
int Havoc_in_this_Zone;
void Created(GameObject* obj)
{
//DebugPrint("JDG, MPRA03, BridgeScene, EnterZone, Created Okay\n");
Havoc_in_this_Zone = 0;
MPR_A03_bridgescene_enterzone_id_JDG = Commands->Get_ID (obj);
Commands->Static_Anim_Phys_Goto_Frame ( MPR_A03_BRIDGESCENE_BRIDGE_ID_JDG, 0.0f, "BRIDGE_EXPLDA02.BRIDGE_EXPLDA02");
}
void Entered (GameObject* obj, GameObject* Enterer)
{
if (Enterer == (Commands->Get_The_Star()) && (Havoc_in_this_Zone == 0))
{
//DebugPrint("JDG, MPRA03, BridgeScene, EnterZone, Havoc has entered Zone. Starting Delay timers on Bridge Team\n");
float timeDelay_3 = Commands->Get_Random (0.0f, 0.5f);
Commands->Start_Timer ((Commands->Find_Object(MPR_A03_bridgescene_engineer_id_JDG)), timeDelay_3, MPR_A03_TIMER_BRIDGESCENE_ENGINEER_HAVOC_IN_ZONE_DELAY_JDG);
float timeDelay_4 = 8.0f;
Commands->Start_Timer (obj, timeDelay_4, MPR_A03_TIMER_BRIDGESCENE_ENTER_ZONE_EXPLOSION_DELAY_JDG);
Havoc_in_this_Zone++;
}
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if (Timer_ID == MPR_A03_TIMER_BRIDGESCENE_ENTER_ZONE_EXPLOSION_DELAY_JDG)
{
Commands->Static_Anim_Phys_Goto_Last_Frame (MPR_A03_BRIDGESCENE_BRIDGE_ID_JDG, "BRIDGE_EXPLDA02.BRIDGE_EXPLDA02" );
}
}
};
/*
MPR_A03_BridgeScene_BlowUpZone
The following script is for a zone right next to the bridge that immediately blows the
bridge when entered. This is to prevent the player from reaching the other side before
the bridge blows.
*/
DECLARE_SCRIPT(MPR_A03_BridgeScene_BlowUpZone_JDG, "")
{
int Havoc_in_this_Zone;
void Created(GameObject* obj)
{
//DebugPrint("JDG, MPRA03, BridgeScene, EnterZone, Created Okay\n");
Havoc_in_this_Zone = 0;
MPR_A03_bridgescene_blowupzone_id_JDG = Commands->Get_ID (obj);
}
void Entered (GameObject* obj, GameObject* Enterer)
{
if (Enterer == (Commands->Get_The_Star()) && (Havoc_in_this_Zone == 0))
{
//DebugPrint("JDG, MPRA03, BridgeScene, EnterZone, Havoc has entered Zone. Starting Delay timers on Bridge Team\n");
Commands->Static_Anim_Phys_Goto_Last_Frame (MPR_A03_BRIDGESCENE_BRIDGE_ID_JDG, "BRIDGE_EXPLDA02.BRIDGE_EXPLDA02" );
}
}
};
/*
MPR_A03_BridgeScene_Engineer
The following is for the engineer next to the bridge. He does a few animations then runs through the
tunnel and is deleted.
*/
DECLARE_SCRIPT(MPR_A03_BridgeScene_Engineer_JDG, "")
{
typedef enum
{
MPR_A03_BRIDGESCENE_ENGINEER_IDLE = 0,
MPR_A03_BRIDGESCENE_ENGINEER_PLACING_BOMB,
MPR_A03_BRIDGESCENE_ENGINEER_WAVING,
MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_INT_SPOT,
MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_TUNNEL,
MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_FINAL_POSITION,
} ENGINEERState;
ENGINEERState state;
void Created(GameObject* obj)
{
//DebugPrint("JDG, MPRA03, BridgeScene, Engineer, Created Okay\n");
MPR_A03_bridgescene_engineer_id_JDG = Commands->Get_ID (obj);
Commands->Action_Attack_Object( obj, (Commands->Get_The_Star()), 0, 0);
state = MPR_A03_BRIDGESCENE_ENGINEER_IDLE;
}
void Timer_Expired (GameObject* obj, int Timer_ID)
{
if ((Timer_ID == MPR_A03_TIMER_BRIDGESCENE_ENGINEER_HAVOC_IN_ZONE_DELAY_JDG) && (Commands->Find_Object(MPR_A03_bridgescene_engineer_id_JDG)))
{
//DebugPrint("JDG, MPRA03, BridgeScene, Engineer, Havoc/EnterZone Timer Expired\n");
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J12C", 0);
//"S_A_HUMAN.H_A_J12C" is animation for tying your shoe
state = MPR_A03_BRIDGESCENE_ENGINEER_PLACING_BOMB;
}
}
void Animation_Complete (GameObject* obj, const char* name)
{
if ((stricmp("S_A_HUMAN.H_A_J12C", name) == 0) && (Commands->Find_Object(MPR_A03_bridgescene_engineer_id_JDG)) && (state == MPR_A03_BRIDGESCENE_ENGINEER_PLACING_BOMB))
{
Commands->Set_Animation (obj, "S_A_HUMAN.H_A_J18C", 0);
//"S_A_HUMAN.H_A_J18C" is animation for waving
state = MPR_A03_BRIDGESCENE_ENGINEER_WAVING;
}
if ((stricmp("S_A_HUMAN.H_A_J18C", name) == 0) && (Commands->Find_Object(MPR_A03_bridgescene_engineer_id_JDG)) && (state == MPR_A03_BRIDGESCENE_ENGINEER_WAVING))
{
//DebugPrint("JDG, MPRA03, BridgeScene, Engineer, Finished waving\n");
Vector3 Engineers_Int_Position (234.26f, 202.66f, 3.92f);
Commands->Action_Attack_Location(obj, Engineers_Int_Position, 0, 0);
Commands->Action_Movement_Set_Forward_Speed(obj, 0.7f);
Commands->Action_Movement_Goto_Location(obj, Engineers_Int_Position, 0.05f);
//DebugPrint("JDG, MPRA03, BridgeScene, Engineer, start moving away\n");
state = MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_INT_SPOT;
}
}
void Movement_Complete(GameObject* obj, MovementCompleteReason reason)
{
static const char* _reasons[] =
{
"Arrived",
"Bad Start",
"Bad Dest",
"No progress"
};
//DebugPrint("Movement_Complete Reason = %s\n", _reasons[reason]);
if ((Commands->Find_Object(MPR_A03_bridgescene_engineer_id_JDG)) && (state == MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_INT_SPOT))
{
//DebugPrint("JDG, MPRA03, BridgeScene, Engineer, Reached intermediate spot\n");
Vector3 Engineers_Tunnel_Position (154.90f, 242.68f, 0.39f);
Commands->Action_Attack_Location(obj, Engineers_Tunnel_Position, 0, 0);
Commands->Action_Movement_Goto_Location(obj, Engineers_Tunnel_Position, 0.05f);
state = MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_TUNNEL;
}
if ((Commands->Find_Object(MPR_A03_bridgescene_engineer_id_JDG)) && (state == MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_TUNNEL))
{
//DebugPrint("JDG, MPRA03, BridgeScene, Engineer, Reached bridge location\n");
Vector3 Engineers_Final_Position (141.95f, 297.41f, 0.86f);
Commands->Action_Attack_Location(obj, Engineers_Final_Position, 0, 0);
Commands->Action_Movement_Goto_Location(obj, Engineers_Final_Position, 0.05f);
state = MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_FINAL_POSITION;
}
if ((Commands->Find_Object(MPR_A03_bridgescene_engineer_id_JDG)) && (state == MPR_A03_BRIDGESCENE_ENGINEER_MOVING_TO_FINAL_POSITION))
{
//DebugPrint("JDG, MPRA03, BridgeScene, Engineer, Destroying\n");
Commands->Destroy_Object( obj );
}
}
};
#endif