mirror of
https://github.com/id-Software/quake-rerelease-qc.git
synced 2024-11-24 05:01:43 +00:00
416 lines
11 KiB
C++
416 lines
11 KiB
C++
/* Copyright (C) 1996-2022 id Software LLC
|
|
|
|
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 2 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, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
See file, 'COPYING', for details.
|
|
*/
|
|
|
|
// ending.qc
|
|
// code to handle big ending of Xpack.
|
|
// ------------------------------------------------
|
|
$frame axrun1 axrun2 axrun3 axrun4 axrun5 axrun6
|
|
$frame rockrun1 rockrun2 rockrun3 rockrun4 rockrun5 rockrun6
|
|
$frame stand1 stand2 stand3 stand4 stand5
|
|
$frame axstnd1 axstnd2 axstnd3 axstnd4 axstnd5 axstnd6
|
|
$frame axstnd7 axstnd8 axstnd9 axstnd10 axstnd11 axstnd12
|
|
$frame axpain1 axpain2 axpain3 axpain4 axpain5 axpain6
|
|
$frame pain1 pain2 pain3 pain4 pain5 pain6
|
|
$frame axdeth1 axdeth2 axdeth3 axdeth4 axdeth5 axdeth6
|
|
$frame axdeth7 axdeth8 axdeth9
|
|
$frame deatha1 deatha2 deatha3 deatha4 deatha5 deatha6 deatha7 deatha8
|
|
$frame deatha9 deatha10 deatha11
|
|
$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
|
|
$frame deathb9
|
|
$frame deathc1 deathc2 deathc3 deathc4 deathc5 deathc6 deathc7 deathc8
|
|
$frame deathc9 deathc10 deathc11 deathc12 deathc13 deathc14 deathc15
|
|
$frame deathd1 deathd2 deathd3 deathd4 deathd5 deathd6 deathd7
|
|
$frame deathd8 deathd9
|
|
$frame deathe1 deathe2 deathe3 deathe4 deathe5 deathe6 deathe7
|
|
$frame deathe8 deathe9
|
|
$frame nailatt1 nailatt2
|
|
$frame light1 light2
|
|
$frame rockatt1 rockatt2 rockatt3 rockatt4 rockatt5 rockatt6
|
|
$frame shotatt1 shotatt2 shotatt3 shotatt4 shotatt5 shotatt6
|
|
$frame axatt1 axatt2 axatt3 axatt4 axatt5 axatt6
|
|
$frame axattb1 axattb2 axattb3 axattb4 axattb5 axattb6
|
|
$frame axattc1 axattc2 axattc3 axattc4 axattc5 axattc6
|
|
$frame axattd1 axattd2 axattd3 axattd4 axattd5 axattd6
|
|
|
|
entity theActor;
|
|
entity theMachine;
|
|
|
|
float actorStage;
|
|
|
|
float STAGE_START = 0;
|
|
float STAGE_TO_POINT1 = 1;
|
|
float STAGE_AT_POINT1 = 2;
|
|
float STAGE_TO_POINT2 = 3;
|
|
float STAGE_AT_POINT2 = 4;
|
|
float STAGE_FIRING = 5;
|
|
|
|
void(entity thePlayer) spawn_actor;
|
|
void() actor_control;
|
|
void(entity playerEnt) move_camera;
|
|
void() time_crash;
|
|
void() ending_remove_stuff;
|
|
|
|
void() ending_for_coop =
|
|
{
|
|
intermission_exittime = time + 3;
|
|
intermission_running = 1;
|
|
|
|
self.model = "";
|
|
self.yaw_speed = 20;
|
|
self.view_ofs = '0 0 0';
|
|
self.takedamage = DAMAGE_NO;
|
|
self.solid = SOLID_NOT;
|
|
self.movetype = MOVETYPE_NONE;
|
|
self.modelindex = 0;
|
|
setorigin (self, self.origin + '0 0 48');
|
|
|
|
WriteByte (MSG_ALL, SVC_FINALE);
|
|
WriteString (MSG_ALL, "$qc_finale_coop");
|
|
|
|
ending_remove_stuff();
|
|
|
|
theMachine.think = time_crash;
|
|
theMachine.nextthink = time + 0.1;
|
|
};
|
|
|
|
// ------------------------------------------------
|
|
// Camera and control functions
|
|
// ------------------------------------------------
|
|
|
|
void() xpackEnding =
|
|
{
|
|
local entity cameraview;
|
|
|
|
if (coop)
|
|
{
|
|
ending_for_coop();
|
|
return;
|
|
}
|
|
|
|
intermission_exittime = time + 10000000; // never allow exit
|
|
intermission_running = 1;
|
|
|
|
WriteByte (MSG_ALL, SVC_CUTSCENE);
|
|
WriteString (MSG_ALL, "");
|
|
|
|
cameraview = find ( world, targetname, "cameraview");
|
|
if (cameraview == world)
|
|
{
|
|
ending_for_coop();
|
|
return;
|
|
}
|
|
|
|
self.solid = SOLID_NOT;
|
|
self.movetype = MOVETYPE_NONE;
|
|
spawn_actor(self);
|
|
move_camera(self);
|
|
};
|
|
|
|
void() track_camera =
|
|
{
|
|
local vector cameraAngle;
|
|
|
|
cameraAngle = theActor.origin - self.origin;
|
|
cameraAngle_z = 0 - cameraAngle_z;
|
|
self.angles = vectoangles ( cameraAngle );
|
|
self.v_angle = self.angles;
|
|
|
|
self.think = track_camera;
|
|
self.nextthink = time + 0.1;
|
|
};
|
|
|
|
void(entity playerEnt) move_camera =
|
|
{
|
|
local entity cameraPoint;
|
|
local vector cameraAngle;
|
|
|
|
cameraPoint = find ( world, targetname, "cameraview");
|
|
if ( cameraPoint == world )
|
|
objerror ("Could not find camerapoint!");
|
|
|
|
self.model = "";
|
|
self.yaw_speed = 20;
|
|
self.view_ofs = '0 0 0';
|
|
self.takedamage = DAMAGE_NO;
|
|
self.solid = SOLID_NOT;
|
|
self.movetype = MOVETYPE_NONE;
|
|
self.modelindex = 0;
|
|
setorigin (self, cameraPoint.origin);
|
|
|
|
cameraAngle = theActor.origin - self.origin;
|
|
self.angles = vectoangles ( cameraAngle );
|
|
self.v_angle = self.angles;
|
|
|
|
self.think = track_camera;
|
|
self.nextthink = time + 0.05;
|
|
};
|
|
|
|
void() ending_remove_stuff =
|
|
{
|
|
local entity curEnt;
|
|
local entity removeEnt;
|
|
|
|
curEnt = find ( world, classname, "ltrail_start");
|
|
while(curEnt)
|
|
{
|
|
remove(curEnt);
|
|
curEnt = find ( world, classname, "ltrail_start");
|
|
}
|
|
|
|
curEnt = find ( world, classname, "item_time_core");
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_EXPLOSION2);
|
|
WriteCoord (MSG_BROADCAST, curEnt.origin_x);
|
|
WriteCoord (MSG_BROADCAST, curEnt.origin_y);
|
|
WriteCoord (MSG_BROADCAST, curEnt.origin_z);
|
|
WriteByte (MSG_BROADCAST, 230);
|
|
WriteByte (MSG_BROADCAST, 5);
|
|
|
|
curEnt.think = SUB_Remove;
|
|
curEnt.nextthink = time + 0.1;
|
|
};
|
|
|
|
// ------------------------------------------------
|
|
// actor code
|
|
// ------------------------------------------------
|
|
void() actor_run =
|
|
{
|
|
local vector dist;
|
|
local float ang;
|
|
local entity pointOne;
|
|
|
|
if ( pointcontents (self.origin) == CONTENT_LAVA )
|
|
{
|
|
pointOne = find ( world, targetname, "point1" );
|
|
if (pointOne != world)
|
|
setorigin ( self, pointOne.origin );
|
|
}
|
|
|
|
if ( self.goalentity.targetname == "endpoint1")
|
|
{
|
|
actorStage = STAGE_AT_POINT1;
|
|
self.think = actor_control;
|
|
self.nextthink = time + 0.1;
|
|
return;
|
|
}
|
|
if ( self.goalentity.targetname == "endpoint2")
|
|
{
|
|
actorStage = STAGE_AT_POINT2;
|
|
self.think = actor_control;
|
|
self.nextthink = time + 0.1;
|
|
return;
|
|
}
|
|
|
|
self.frame = self.frame + 1;
|
|
if (self.frame > 11)
|
|
self.frame = 6;
|
|
|
|
dist = self.goalentity.origin - self.origin;
|
|
// self.ideal_yaw = vectoyaw ( dist );
|
|
// ChangeYaw();
|
|
|
|
movetogoal ( 15 );
|
|
self.think = actor_run;
|
|
self.nextthink = time + 0.1;
|
|
};
|
|
|
|
void() finale_transition =
|
|
{
|
|
if (!coop) {
|
|
localcmd("menu_credits\n");
|
|
localcmd("disconnect\n");
|
|
} else {
|
|
changelevel("start");
|
|
}
|
|
}
|
|
|
|
void() finale_check =
|
|
{
|
|
if (finaleFinished()) {
|
|
self.nextthink = time + 5;
|
|
self.think = finale_transition;
|
|
} else {
|
|
self.nextthink = time + 0.1;
|
|
}
|
|
}
|
|
|
|
void() actor_fire1 =[$rockatt1, actor_fire2 ]
|
|
{
|
|
self.goalentity = theMachine;
|
|
theMachine.th_pain = time_crash;
|
|
theMachine.th_die = time_crash;
|
|
theMachine.health = 1;
|
|
|
|
self.angles = vectoangles ( self.goalentity.origin - self.origin );
|
|
self.v_angle = self.angles;
|
|
self.v_angle_x = 0 - self.angles_x;
|
|
self.effects = EF_MUZZLEFLASH;
|
|
W_FireRocket();
|
|
|
|
// start the end text
|
|
WriteByte (MSG_ALL, SVC_FINALE);
|
|
|
|
WriteString (MSG_ALL, "$qc_finale_rogue_end");
|
|
|
|
if (campaign && world.model == "maps/r2m8.bsp")
|
|
{
|
|
WriteByte (MSG_ALL, SVC_ACHIEVEMENT);
|
|
WriteString(MSG_ALL, "ACH_COMPLETE_R2M8");
|
|
if (skill == 3)
|
|
{
|
|
WriteByte (MSG_ALL, SVC_ACHIEVEMENT);
|
|
WriteString(MSG_ALL, "ACH_COMPLETE_R2M8_NIGHTMARE");
|
|
}
|
|
}
|
|
|
|
// instead of sitting here forever, run the quake ex credits and send the user back to start
|
|
local entity timer = spawn();
|
|
timer.nextthink = time + 1;
|
|
timer.think = finale_check;
|
|
};
|
|
void() actor_fire2 =[$rockatt2, actor_fire3 ]
|
|
{self.v_angle_x = 0; self.angles_x = 0; self.nextthink=time+0.15;};
|
|
void() actor_fire3 =[$rockatt3, actor_fire4 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire4 =[$rockatt4, actor_fire5 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire5 =[$rockatt5, actor_fire6 ]
|
|
{
|
|
self.nextthink=time+0.15;
|
|
ending_remove_stuff();
|
|
if (theMachine.health > 0)
|
|
{
|
|
theMachine.think = time_crash;
|
|
theMachine.nextthink = time + 0.1;
|
|
}
|
|
};
|
|
void() actor_fire6 =[$rockatt6, actor_fire7 ]
|
|
{ self.effects=0;self.nextthink=time+0.15;};
|
|
void() actor_fire7 =[$stand1, actor_fire8 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire8 =[$stand2, actor_fire9 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire9 =[$stand3, actor_fire10 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire10 =[$stand4, actor_fire11 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire11 =[$stand5, actor_fire12 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire12 =[$stand1, actor_fire13 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire13 =[$stand2, actor_fire14 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire14 =[$stand3, actor_fire15 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire15 =[$stand4, actor_fire16 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire16 =[$stand5, actor_fire17 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire17 =[$stand1, actor_fire18 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire18 =[$stand2, actor_fire19 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire19 =[$stand3, actor_fire20 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire20 =[$stand4, actor_fire21 ] {self.nextthink=time+0.15;};
|
|
void() actor_fire21 =[$stand5, actor_control ]
|
|
{
|
|
self.nextthink=time+0.15;
|
|
actorStage = STAGE_TO_POINT2;
|
|
};
|
|
|
|
void() actor_teleport =
|
|
{
|
|
spawn_tfog(self.origin);
|
|
self.model = string_null;
|
|
self.think = SUB_Null;
|
|
self.nextthink = time + 999999;
|
|
};
|
|
|
|
void() actor_control =
|
|
{
|
|
local entity timepod;
|
|
|
|
if (actorStage == STAGE_START)
|
|
{
|
|
self.target = "point1";
|
|
self.movetarget = find (world, targetname, self.target);
|
|
self.goalentity = self.movetarget;
|
|
if ( self.goalentity == world )
|
|
objerror ("End Sequence point1 placing screwed up!");
|
|
self.frame = 6;
|
|
self.think = actor_run;
|
|
self.nextthink = time + 0.1;
|
|
actorStage = STAGE_TO_POINT1;
|
|
}
|
|
else if (actorStage == STAGE_AT_POINT1)
|
|
{
|
|
self.target = "machine";
|
|
self.movetarget = find (world, targetname, self.target);
|
|
self.goalentity = self.movetarget;
|
|
if ( self.goalentity == world )
|
|
objerror ("End Sequence machine placing screwed up!");
|
|
actorStage = STAGE_FIRING;
|
|
self.think = actor_fire1;
|
|
self.nextthink = time + 0.1;
|
|
}
|
|
else if (actorStage == STAGE_AT_POINT2)
|
|
{
|
|
self.frame = $stand1;
|
|
self.think = actor_teleport;
|
|
self.nextthink = time + 2;
|
|
}
|
|
else if (actorStage == STAGE_TO_POINT2)
|
|
{
|
|
self.target = "timepod";
|
|
SUB_UseTargets();
|
|
|
|
self.target = "point2";
|
|
self.movetarget = find (world, targetname, self.target);
|
|
self.goalentity = self.movetarget;
|
|
if ( self.goalentity == world )
|
|
objerror ("End Sequence point2 placing screwed up!");
|
|
self.frame = 6;
|
|
self.think = actor_run;
|
|
self.nextthink = time + 0.1;
|
|
}
|
|
};
|
|
|
|
// ==============
|
|
// player actor spawn function
|
|
// ==============
|
|
void(entity thePlayer) spawn_actor =
|
|
{
|
|
local entity pointOne;
|
|
|
|
theActor = spawn();
|
|
theActor.owner = self;
|
|
theActor.classname = "actor";
|
|
theActor.health = 100;
|
|
theActor.solid = SOLID_SLIDEBOX;
|
|
theActor.movetype = MOVETYPE_STEP;
|
|
theActor.frame = self.frame;
|
|
setmodel ( theActor, "progs/player.mdl");
|
|
setorigin ( theActor, self.origin);
|
|
setsize (theActor, VEC_HULL_MIN, VEC_HULL_MAX);
|
|
theActor.view_ofs = '0 0 22';
|
|
theActor.angles = self.angles;
|
|
theActor.ideal_yaw = theActor.angles * '0 1 0';
|
|
if (!theActor.yaw_speed)
|
|
theActor.yaw_speed = 20;
|
|
theActor.view_ofs = '0 0 25';
|
|
theActor.flags = theActor.flags | FL_MONSTER;
|
|
actorStage == STAGE_START;
|
|
|
|
if ( pointcontents (theActor.origin) == CONTENT_LAVA )
|
|
{
|
|
pointOne = find ( world, targetname, "point1" );
|
|
if (pointOne != world)
|
|
setorigin ( theActor, pointOne.origin );
|
|
}
|
|
|
|
theActor.think = actor_control;
|
|
theActor.nextthink = time + 0.1;
|
|
};
|
|
|