/* 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; };