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/Test_DME.cpp

1059 lines
28 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
*
* DESCRIPTION
*
* VERSION INFO
* $Author: Dan_e $
* $Revision: 39 $
* $Modtime: 1/07/02 2:51p $
* $Archive: /Commando/Code/Scripts/Test_DME.cpp $
*
******************************************************************************/
#include "toolkit.h"
#define DME_OCCUPIED 13000
DECLARE_SCRIPT (DME_Test_Powerup, "")
{
int reward_type;
REGISTER_VARIABLES()
{
SAVE_VARIABLE(reward_type, 1);
}
void Killed( GameObject * obj, GameObject * killer )
{
Commands->Trigger_Spawner ( 100022 );
reward_type = Get_Int_Random(0, 7);
Vector3 enemy_loc = Commands->Get_Position ( obj );
enemy_loc.Z += 1.0f;
switch (reward_type)
{
case 0:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "Armor 025 PowerUp", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
case 1:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "Armor 050 PowerUp", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
case 2:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "Armor 100 PowerUp", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
case 3:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "Health 025 PowerUp", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
case 4:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "Health 050 PowerUp", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
case 5:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "Health 100 PowerUp", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
case 6:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "Shotgun Weapon PowerUps", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
case 7:
{
GameObject *spawn_objectarmor;
spawn_objectarmor = Commands->Create_Object( "Spawner Created Special Effect", enemy_loc );
if (spawn_objectarmor)
{
Commands->Attach_Script( spawn_objectarmor, "M00_Create_Anim_Effect_DAY", "C4_EX1A.C4_EX1A");
}
GameObject *armor;
armor = Commands->Create_Object ( "MiniGun Weapon PowerUps", enemy_loc );
Commands->Attach_Script (armor, "DME_Destroy_Item", "15.0f");
break;
}
default:
{
Commands->Debug_Message ("********NO POWER-UP CREATED********");
break;
}
}
}
};
DECLARE_SCRIPT (DME_Destroy_Item, "timer_length: float")
{
void Created( GameObject * obj )
{
float timer_length = Get_Float_Parameter("timer_length");
Commands->Start_Timer(obj, this, timer_length, 10);
}
void Timer_Expired (GameObject* obj, int timer_id)
{
if (timer_id ==10)
{
Commands->Destroy_Object (obj);
}
}
};
DECLARE_SCRIPT (DME_Waypath_test, "")
{
void Created ( GameObject * obj )
{
ActionParamsStruct params;
params.Set_Basic( this, 100, 10 );
params.Set_Movement( Vector3(0,0,0), 1.5f, 0 );
params.WaypathID = 100036;
params.WaypointStartID = 100037;
params.WaypointEndID = 100039;
params.WaypathSplined = true;
Commands->Action_Goto( obj, params );
}
};
DECLARE_SCRIPT (DME_Test_Ejected_Soldier, "")
{
void Killed ( GameObject * obj, GameObject * killer )
{
Vector3 spawn_loc = Commands->Get_Position ( obj );
spawn_loc.Z -= 30.0f;
GameObject *spawn_objectsoldier;
spawn_objectsoldier = Commands->Create_Object( "Spawner Created Special Effect", spawn_loc );
GameObject *soldier;
soldier = Commands->Create_Object ( "Nod_Technician_0", spawn_loc );
Commands->Attach_Script (soldier, "DME_Test_Paradrop", "");
}
};
DECLARE_SCRIPT (DME_Test_Paradrop, "")
{
void Created ( GameObject * obj )
{
/*Vector3 loc = Commands->Get_Position ( obj );
GameObject *para1;
para1 = Commands->Create_Object_At_Bone (obj, "Generic_Cinematic", "C HEAD");
Commands->Attach_To_Object_Bone( obj, para1, "C HEAD" );
Commands->Set_Model(para1, "X5D_Parachute");
Commands->Set_Animation(para1, "X5D_Parachute.X5D_ParaC_1", false);
Commands->Create_3D_Sound_At_Bone("parachute_open", para1, "ROOTTRANSFORM");*/
Commands->Start_Timer (obj, this, .8385f, 10);
Vector3 loc = Commands->Get_Position ( obj );
float facing = Commands->Get_Facing(obj);
GameObject *box1 = Commands->Create_Object("Generic_Cinematic", loc);
Commands->Set_Model(box1, "X5D_Box01");
Commands->Set_Facing(box1, facing);
Commands->Set_Animation(box1, "X5D_Box01.X5D_Box01", false);
GameObject *soldier1;
soldier1 = Commands->Create_Object_At_Bone(box1, "Nod_Technician_0", "Box01");
Commands->Set_Facing(soldier1, facing);
Commands->Attach_Script(soldier1, "RMV_Trigger_Killed", "1144444, 1000, 1000");
Commands->Attach_To_Object_Bone( soldier1, box1, "Box01" );
Commands->Set_Animation(soldier1, "s_a_human.H_A_X5D_ParaT_1", false);
}
void Timer_Expired (GameObject* obj, int timer_id)
{
if (timer_id == 10)
{
GameObject *para1;
Vector3 loc = Commands->Get_Position ( obj );
loc.Z += 1.5;
float facing = Commands->Get_Facing(obj);
para1 = Commands->Create_Object("Generic_Cinematic", loc);
Commands->Set_Facing(para1, facing);
Commands->Set_Model(para1, "X5D_Parachute");
Commands->Set_Animation(para1, "X5D_Parachute.X5D_ParaC_1", false);
Commands->Create_3D_Sound_At_Bone("parachute_open", para1, "ROOTTRANSFORM");
Commands->Attach_Script(para1, "M03_No_More_Parachute", "");
}
}
};
DECLARE_SCRIPT (DME_Test_Worker_Wander, "Work_Area=3:int")
{
int loc_id [20], count, choice, last_loc, poke_choice;
int area_range, area_start, area_end;
char area_anim [9];
bool work_done[20], star_seen, poked, reward_given, anim_playing;
float facing;
Vector3 location;
GameObject *destination_object;
void init () //initializes count and work_done values.
{
int x;
count = 0;
for (x = area_start; x <= area_end; x++)
{
work_done [x] = 1;
}
}
void Custom (GameObject* obj, int type, int param, GameObject* sender) //recieves custom from dave's arrow as to if the location is occupied or not.
{ //100 not occupied, 200 is occupied.
if (type == DME_OCCUPIED && param == 100)
{
Commands->Send_Custom_Event(obj, sender, 70, 70); //if not occupied, sends custom to set status to occupied.
}
else if (type == 200 && param == 200)
{
Commands->Debug_Message("Custom received on worker type: %d param: %d sender_id %d. \n", type, param, Commands->Get_ID(sender));
Worker_Loop (obj); //if occupied, tells worker to choose a now location.
}
}
void Worker_Loop ( GameObject * obj ) //this is the main function that checks if the location is occupied
{ //and if it is not, tells the servant to go to that location.
if (count == area_range)
{
init ();
}
GameObject *work_loc;
choice = Get_Int_Random (area_start, area_end);
while (work_done [choice] == 0 || choice == last_loc)
{
choice = Get_Int_Random (area_start, area_end);
}
work_done [choice] = 0;
last_loc = choice;
count++;
destination_object = Commands->Find_Object (loc_id [choice]);
Commands->Send_Custom_Event(obj, destination_object, 50, 50, 0.5f);
work_loc = Commands->Find_Object (loc_id [choice]);
location = Commands->Get_Position ( work_loc );
facing = Commands->Get_Facing (work_loc);
ActionParamsStruct params;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 1, 90 );
params.Set_Movement( location, WALK, 0.0f );
Commands->Action_Goto( obj, params );
}
void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason ) //this is called when the servant reaches the destination location.
{ //the purpose of this function is to have the servant perform their destination animation.
Vector3 current_loc = Commands->Get_Position ( obj );
float distance = Commands->Get_Distance ( current_loc, location );
if (action_id == 90)
{
if (star_seen == false && distance <= 3.0f)
{
anim_playing = true;
Commands->Start_Timer (obj, this, 2.0f, 500);
Commands->Set_Facing(obj, facing);
ActionParamsStruct params;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 1);
params.Set_Animation( area_anim, true );
Commands->Action_Play_Animation (obj, params);
}
}
}
void Created ( GameObject * obj ) //this is the created function for the servant, it sets up most of the variables.
{
int work_area = Get_Int_Parameter("Work_Area");
Commands->Set_Player_Type( obj, 0 );
Commands->Innate_Disable( obj );
poke_choice = 3; //Get_Int_Random (1, 3);
star_seen = false;
reward_given = false;
poked = false;
anim_playing = false;
loc_id [0] = 100001; //these are the dave's arrow id's for all 3 work areas.
loc_id [1] = 100002;
loc_id [2] = 100003;
loc_id [3] = 2000217;
loc_id [4] = 2000218;
loc_id [5] = 2000219;
loc_id [6] = 2000220;
loc_id [7] = 2000221;
loc_id [8] = 2000222;
loc_id [9] = 2000223;
loc_id [10] = 2000224;
loc_id [11] = 2000225;
loc_id [12] = 2000226;
loc_id [13] = 2000227;
loc_id [14] = 2000228;
loc_id [15] = 2000229;
loc_id [16] = 2000230;
loc_id [17] = 2000231;
loc_id [18] = 2000232;
loc_id [19] = 2000233;
//Area 1 Variables.
if (work_area == 1)
{
area_range = 3;
area_start = 0;
area_end = 2;
sprintf(area_anim, "%s", "H_A_a0f0");
}
//Area 2 Variables.
else if (work_area == 2)
{
area_range = 4;
area_start = 12;
area_end = 15;
sprintf(area_anim, "%s", "H_A_a0f0");
}
//Area 3 Variables.
else if (work_area == 3)
{
area_range = 4;
area_start = 16;
area_end = 19;
sprintf(area_anim, "%s", "H_A_a0f0");
}
init ();
Worker_Loop (obj);
}
void Timer_Expired (GameObject* obj, int timer_id)
{
if (timer_id == 500) //this timer resets the servant from his animation loop and calls Worker_Loop to send him to a new location.
{
anim_playing = false;
Commands->Action_Reset(obj, 99);
Commands->Set_Animation( obj, NULL, false );
destination_object = Commands->Find_Object (loc_id [choice]);
Commands->Send_Custom_Event(obj, destination_object, 90, 90);
Worker_Loop (obj);
}
else if (timer_id == 510) //this timer resets the servant after seeing the star. He completes his animation and returns to work.
{
star_seen = false;
Commands->Action_Reset(obj, 99);
Commands->Set_Animation( obj, "H_A_HOST_L1B", false );
Commands->Set_Animation_Frame(obj, "H_A_HOST_L1B", 16);
Worker_Loop (obj);
}
else if (timer_id == 520) //this timer is a general reset after being poked.
{
poked = false;
Commands->Set_Player_Type( obj, 0 );
Worker_Loop ( obj );
}
else if (timer_id == 530) //this timer resets the servant after giving the star assistance.
{
poked = false;
Worker_Loop ( obj );
}
}
void Enemy_Seen (GameObject* obj, GameObject* enemy) //this function sets the servant in a "don't hurt me!" stance (based on a timer)
{
if (star_seen == false)
{
if (anim_playing == false)
{
destination_object = Commands->Find_Object (loc_id [choice]);
Commands->Send_Custom_Event(obj, destination_object, 90, 90);
star_seen = true;
Commands->Start_Timer (obj, this, 9.0f, 510);
const char *conv_name = ("IDS_M06_DME");
int conv_id = Commands->Create_Conversation (conv_name);
Commands->Join_Conversation(obj, conv_id, false, false);
Commands->Start_Conversation (conv_id, 1);
ActionParamsStruct params;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1);
params.Set_Animation( "H_A_HOST_L1B", true );
Commands->Action_Play_Animation (obj, params);
}
}
}
void Poked(GameObject * obj, GameObject * poker) //function runs from a pre-defined random poke_choice.
{
if (poked == !true)
{
Commands->Set_Player_Type( obj, -2 );
destination_object = Commands->Find_Object (loc_id [choice]);
Commands->Send_Custom_Event(obj, destination_object, 90, 90);
poked = true;
switch (poke_choice)
{
case 1: //call for guards
{
Commands->Start_Timer (obj, this, 5.0f, 520);
const char *conv_name = ("IDS_M06_DME02");
int conv_id = Commands->Create_Conversation (conv_name);
Commands->Join_Conversation(obj, conv_id, false, false);
Commands->Start_Conversation (conv_id, 1);
Commands->Create_Logical_Sound(obj, SOUND_TYPE_GUNSHOT, Commands->Get_Position(obj), 75.0f);
}
break;
case 2: //sound alarm
{
Commands->Start_Timer (obj, this, 5.0f, 520);
const char *conv_name = ("IDS_M06_D05");
int conv_id = Commands->Create_Conversation (conv_name);
Commands->Join_Conversation(obj, conv_id, false, false);
Commands->Start_Conversation (conv_id, 1);
}
break;
case 3: //give assistance
{
if (reward_given == false)
{
Commands->Action_Reset(obj, 99);
Commands->Set_Animation( obj, "H_A_HOST_L1B", false );
Commands->Set_Animation_Frame(obj, "H_A_HOST_L1B", 16);
reward_given = true; //records that the reward has been given.
int reward_type = Get_Int_Random(0, 5);
Commands->Start_Timer (obj, this, 5.0f, 530);
const char *conv_name = ("IDS_M06_DME3"); //starts conversation.
int conv_id = Commands->Create_Conversation (conv_name);
Commands->Join_Conversation(obj, conv_id, false, false);
Commands->Start_Conversation (conv_id, 1);
Vector3 pos = Commands->Get_Position(obj); //specifies drop location and plays droping anim.
float facing = Commands->Get_Facing(obj);
Commands->Set_Animation( obj, "H_A_J12C", false );
float a = cos(DEG_TO_RADF(facing)) * 1.5;
float b = sin(DEG_TO_RADF(facing)) * 1.5;
Vector3 powerup_loc = pos + Vector3(a, b, 0.5f);
switch (reward_type) //random reward type.
{
case 0:
{
Commands->Create_Object("Armor 025 PowerUp", powerup_loc);
}
break;
case 1:
{
Commands->Create_Object("Armor 050 PowerUp", powerup_loc);
}
break;
case 2:
{
Commands->Create_Object("Armor 100 PowerUp", powerup_loc);
}
break;
case 3:
{
Commands->Create_Object("Health 025 PowerUp", powerup_loc);
}
break;
case 4:
{
Commands->Create_Object("Health 025 PowerUp", powerup_loc);
}
break;
case 5:
{
Commands->Create_Object("Health 025 PowerUp", powerup_loc);
}
break;
}
}
else
{
Commands->Start_Timer (obj, this, 3.0f, 530);
}
}
break;
default:
{
Commands->Debug_Message ("********poke_choice out of range");
break;
}
}
}
}
};
DECLARE_SCRIPT (DME_Test_Work_Area, "") //this script needs to be placed on all daves arrows.
{ //the script takes and returns customs to tell servants if a location is occupied.
bool occupied; //type & param info:
//50 - is destination occupied?
void Created( GameObject * obj ) // 100 - no
{ // 200 - yes
occupied = false; //70 - change occupied status to true
} //90 - change occupied status to false
void Custom (GameObject* obj, int type, int param, GameObject* sender)
{
if (type == 50 && param == 50)
{
if (!occupied)
{
Commands->Debug_Message("Not occupied\n");
Commands->Send_Custom_Event(obj, sender, DME_OCCUPIED, 100);
}
else
{
Commands->Debug_Message("Occupied\n");
Commands->Send_Custom_Event(obj, sender, 200, 200);
}
}
else if (type == 70 && param == 70)
{
occupied = true;
}
else if (type == 90 && param == 90)
{
occupied = false;
}
}
};
DECLARE_SCRIPT (M05_Tank_Drop_01_DME, "")
{
bool entered;
void Created ( GameObject * obj)
{
entered = false;
}
void Custom(GameObject * obj, int type, int param, GameObject * sender)
{
if (entered == false)
{
if (type == CUSTOM_EVENT_VEHICLE_ENTERED && Commands->Is_A_Star(sender))
{
entered = true;
Vector3 drop_loc;
drop_loc.X = -476.07f;
drop_loc.Y = -130.76f;
drop_loc.Z = 13.020f;
float facing = 337.603f;
GameObject * chinook_obj = Commands->Create_Object ( "Invisible_Object", drop_loc);
Commands->Set_Facing(chinook_obj, facing);
Commands->Attach_Script(chinook_obj, "Test_Cinematic", "M05_XG_VehicleDrop1.txt");
}
}
}
};
DECLARE_SCRIPT (M05_Tank_Attack_DME, "")
{
bool attacking, first;
enum{ATTACK_OVER};
// Register variables to be Auto-Saved
// All variables must have a unique ID, less than 256, that never changes
REGISTER_VARIABLES()
{
SAVE_VARIABLE( attacking, 1 );
}
void Created (GameObject * obj)
{
Commands->Enable_Enemy_Seen( obj, true);
attacking = false;
first = true;
}
void Enemy_Seen(GameObject * obj, GameObject *enemy )
{
ActionParamsStruct params;
Vector3 current_loc;
Vector3 enemy_loc;
current_loc = Commands->Get_Position ( obj );
enemy_loc = Commands->Get_Position ( enemy );
if ((Commands->Get_Distance(current_loc, enemy_loc)) < 65)
{
if(!attacking && first)
{
attacking = true;
first = false;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
params.Set_Attack (enemy, 65.0f, 3.0f, 1);
params.AttackCheckBlocked = true;
Commands->Action_Attack( obj, params );
Commands->Start_Timer(obj, this, 5.0f, ATTACK_OVER);
}
}
else if (!attacking && !first)
{
attacking = true;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1 );
params.Set_Attack (enemy, 250.0f, 3.0f, 1);
params.AttackCheckBlocked = true;
Commands->Action_Attack( obj, params );
Commands->Start_Timer(obj, this, 5.0f, ATTACK_OVER);
}
}
void Timer_Expired (GameObject* obj, int timer_id)
{
ActionParamsStruct params;
if(timer_id == ATTACK_OVER)
{
attacking = false;
}
}
};
DECLARE_SCRIPT (M05_Tech_Wander_DME, "Work_Area=1:int")
{
int loc_id [7], count, choice, last_loc, poke_choice;
int area_range, area_start, area_end;
char area_anim [9];
bool work_done[20], star_seen, poked, reward_given, anim_playing;
float facing;
Vector3 location;
GameObject *destination_object;
void init () //initializes count and work_done values.
{
int x;
count = 0;
for (x = area_start; x <= area_end; x++)
{
work_done [x] = 1;
}
}
void Custom (GameObject* obj, int type, int param, GameObject* sender) //recieves custom from dave's arrow as to if the location is occupied or not.
{ //100 not occupied, 200 is occupied.
if (type == DME_OCCUPIED && param == 100)
{
Commands->Send_Custom_Event(obj, sender, 70, 70); //if not occupied, sends custom to set status to occupied.
}
else if (type == 200 && param == 200)
{
Commands->Debug_Message("Custom received on worker type: %d param: %d sender_id %d. \n", type, param, Commands->Get_ID(sender));
Worker_Loop (obj); //if occupied, tells worker to choose a now location.
}
}
void Worker_Loop ( GameObject * obj ) //this is the main function that checks if the location is occupied
{ //and if it is not, tells the servant to go to that location.
if (count == area_range)
{
init ();
}
GameObject *work_loc;
choice = Get_Int_Random (area_start, area_end);
while (work_done [choice] == 0 || choice == last_loc)
{
choice = Get_Int_Random (area_start, area_end);
}
work_done [choice] = 0;
last_loc = choice;
count++;
destination_object = Commands->Find_Object (loc_id [choice]);
Commands->Send_Custom_Event(obj, destination_object, 50, 50, 0.5f);
work_loc = Commands->Find_Object (loc_id [choice]);
location = Commands->Get_Position ( work_loc );
facing = Commands->Get_Facing (work_loc);
ActionParamsStruct params;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN - 1, 90 );
params.Set_Movement( location, WALK, 0.0f );
Commands->Action_Goto( obj, params );
}
void Action_Complete( GameObject * obj, int action_id, ActionCompleteReason complete_reason ) //this is called when the servant reaches the destination location.
{ //the purpose of this function is to have the servant perform their destination animation.
Vector3 current_loc = Commands->Get_Position ( obj );
float distance = Commands->Get_Distance ( current_loc, location );
if (action_id == 90)
{
if (star_seen == false && distance <= 3.0f)
{
anim_playing = true;
Commands->Start_Timer (obj, this, 2.0f, 500);
Commands->Set_Facing(obj, facing);
ActionParamsStruct params;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN + 5, 1);
params.Set_Animation( area_anim, true );
Commands->Action_Play_Animation (obj, params);
}
}
}
void Created ( GameObject * obj ) //this is the created function for the servant, it sets up most of the variables.
{
int work_area = Get_Int_Parameter("Work_Area");
Commands->Set_Player_Type( obj, 0 );
Commands->Innate_Disable( obj );
poke_choice = 3; //Get_Int_Random (1, 3);
star_seen = false;
reward_given = false;
anim_playing = false;
loc_id [0] = 2000025; //these are the dave's arrow id's for all 3 work areas.
loc_id [1] = 2000026;
loc_id [2] = 2000027;
loc_id [3] = 2000028;
loc_id [4] = 2000031;
loc_id [5] = 2000032;
loc_id [6] = 2000030;
//Area 1 Variables.
if (work_area == 1)
{
area_range = 7;
area_start = 0;
area_end = 6;
sprintf(area_anim, "%s", "H_A_a0f0");
}
init ();
Worker_Loop (obj);
}
void Timer_Expired (GameObject* obj, int timer_id)
{
if (timer_id == 500) //this timer resets the servant from his animation loop and calls Worker_Loop to send him to a new location.
{
anim_playing = false;
Commands->Action_Reset(obj, 99);
Commands->Set_Animation( obj, NULL, false );
destination_object = Commands->Find_Object (loc_id [choice]);
Commands->Send_Custom_Event(obj, destination_object, 90, 90);
Worker_Loop (obj);
}
else if (timer_id == 510) //this timer resets the servant after seeing the star. He completes his animation and returns to work.
{
star_seen = false;
Commands->Action_Reset(obj, 99);
Commands->Set_Animation( obj, "H_A_HOST_L1B", false );
Commands->Set_Animation_Frame(obj, "H_A_HOST_L1B", 16);
Worker_Loop (obj);
}
}
void Enemy_Seen (GameObject* obj, GameObject* enemy) //this function sets the servant in a "don't hurt me!" stance (based on a timer)
{
if (star_seen == false)
{
if (anim_playing == false)
{
destination_object = Commands->Find_Object (loc_id [choice]);
Commands->Send_Custom_Event(obj, destination_object, 90, 90);
star_seen = true;
Commands->Start_Timer (obj, this, 9.0f, 510);
const char *conv_name = ("IDS_M06_DME");
int conv_id = Commands->Create_Conversation (conv_name);
Commands->Join_Conversation(obj, conv_id, false, false);
Commands->Start_Conversation (conv_id, 1);
ActionParamsStruct params;
params.Set_Basic( this, INNATE_PRIORITY_ENEMY_SEEN, 1);
params.Set_Animation( "H_A_HOST_L1B", true );
Commands->Action_Play_Animation (obj, params);
}
}
}
};
DECLARE_SCRIPT (test_Ssm_Trigger, "")
{
void Damaged( GameObject * obj, GameObject * damager, float amount )
{
if (damager == STAR)
{
Commands->Send_Custom_Event (obj, obj, M00_LAUNCH_SSM, 0);
}
}
};
DECLARE_SCRIPT(DME_Cinematic_Test, "")
{
void Created (GameObject * obj)
{
/* Commands->Enable_Hibernation(obj, false);
Commands->Set_Player_Type(obj, PLAYERTYPE_NEUTRAL );
Commands->Create_Object ( "XG_TransprtBone", Vector3(0.0f, 0.0f, 0.0f));*/
}
void Damaged( GameObject * obj, GameObject * damager, float amount )
{
/* GameObject * chinook_obj0 = Commands->Create_Object ( "Invisible_Object", Vector3(0.0f, 0.0f, 0.0f));
Commands->Set_Facing(chinook_obj0, 0.0f);
Commands->Attach_Script(chinook_obj0, "Test_Cinematic", "X7A_TrnsptCt_00.txt");
GameObject * chinook_obj1 = Commands->Create_Object ( "Invisible_Object", Vector3(0.0f, 0.0f, 0.0f));
Commands->Set_Facing(chinook_obj1, 0.0f);
Commands->Attach_Script(chinook_obj1, "Test_Cinematic", "X7A_TrnsptCt_01.txt");*/
GameObject * chinook_obj2 = Commands->Create_Object ( "Invisible_Object", Vector3(0.0f, 0.0f, 0.0f));
Commands->Set_Facing(chinook_obj2, 0.0f);
Commands->Attach_Script(chinook_obj2, "Test_Cinematic", "X10D_CHTroopdrop1.txt");
// GameObject * napc = Commands->Create_Object("Invisible_Object", Vector3(0.0f, 0.0f, 0.0f));
// Commands->Set_Model(napc, "e_chopperdust1");
/* Commands->Send_Custom_Event(obj, Commands->Find_Object(100001), M07_EVAC_INN, 1, 0.0f);
Commands->Enable_Spawner(100002, true);
Commands->Enable_Spawner(100004, true);
Commands->Enable_Spawner(100005, true);
Commands->Enable_Spawner(100006, true);
Commands->Enable_Spawner(100007, true);*/
}
};
//////////////////////////////////////////////////////////////////////////
// //
// MISSION X0 //
// //
//////////////////////////////////////////////////////////////////////////