1 void spawnfunc_func_breakable();
\r
2 void target_objective_decrease_activate();
\r
3 .entity assault_decreaser;
\r
4 .entity assault_sprite;
\r
6 void spawnfunc_info_player_attacker() {
\r
12 self.team = COLOR_TEAM1; // red, gets swapped every round
\r
13 spawnfunc_info_player_deathmatch();
\r
16 void spawnfunc_info_player_defender() {
\r
22 self.team = COLOR_TEAM2; // blue, gets swapped every round
\r
23 spawnfunc_info_player_deathmatch();
\r
26 // reset this objective. Used when spawning an objective
\r
27 // and when a new round starts
\r
28 void assault_objective_reset() {
\r
29 self.health = ASSAULT_VALUE_INACTIVE;
\r
32 void assault_objective_use() {
\r
33 if(other.classname == "info_player_deathmatch") // a spawn, a spawn
\r
36 // activate objective
\r
38 //print("^2Activated objective ", self.targetname, "=", etos(self), "\n");
\r
39 //print("Activator is ", activator.classname, "\n");
\r
44 for(self = world; (self = find(self, target, oldself.targetname)); )
\r
46 if(self.classname == "target_objective_decrease")
\r
47 target_objective_decrease_activate();
\r
53 void spawnfunc_target_objective() {
\r
59 self.classname = "target_objective";
\r
60 self.use = assault_objective_use;
\r
61 assault_objective_reset();
\r
62 self.reset = assault_objective_reset;
\r
66 // decrease the health of targeted objectives
\r
67 void assault_objective_decrease_use() {
\r
68 if(activator.team != assault_attacker_team) {
\r
69 // wrong team triggered decrease
\r
73 if(other.assault_sprite.classname == "assault_decreaser_sprite")
\r
74 WaypointSprite_Disown(other.assault_sprite, waypointsprite_deadlifetime);
\r
76 return; // already activated! cannot activate again!
\r
78 if(self.enemy.health < ASSAULT_VALUE_INACTIVE)
\r
80 if(self.enemy.health - self.dmg > 0.5)
\r
82 PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.dmg);
\r
83 self.enemy.health = self.enemy.health - self.dmg;
\r
87 PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.enemy.health);
\r
88 PlayerTeamScore_Add(activator, SP_ASSAULT_OBJECTIVES, ST_ASSAULT_OBJECTIVES, 1);
\r
89 self.enemy.health = -1;
\r
91 entity oldself, oldactivator;
\r
94 self = oldself.enemy;
\r
95 oldactivator = activator;
\r
96 activator = oldself;
\r
98 activator = oldactivator;
\r
104 void assault_setenemytoobjective()
\r
106 local entity objective;
\r
107 for(objective = world; (objective = find(objective, targetname, self.target)); ) {
\r
108 if(objective.classname == "target_objective") {
\r
109 if(self.enemy == world)
\r
110 self.enemy = objective;
\r
112 objerror("more than one objective as target - fix the map!");
\r
117 if(self.enemy == world)
\r
118 objerror("no objective as target - fix the map!");
\r
121 float assault_decreaser_sprite_visible(entity e)
\r
125 decreaser = self.assault_decreaser;
\r
127 if(decreaser.enemy.health >= ASSAULT_VALUE_INACTIVE)
\r
133 void target_objective_decrease_activate()
\r
136 self.owner = world;
\r
137 for(ent = world; (ent = find(ent, target, self.targetname)); )
\r
139 if(ent.assault_sprite != world)
\r
140 WaypointSprite_Disown(ent.assault_sprite, waypointsprite_deadlifetime);
\r
142 spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
\r
143 spr.assault_decreaser = self;
\r
144 spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible;
\r
145 spr.classname = "assault_decreaser_sprite";
\r
146 WaypointSprite_UpdateRule(spr, assault_attacker_team, SPRITERULE_TEAMPLAY);
\r
147 if(ent.classname == "func_assault_destructible")
\r
148 WaypointSprite_UpdateSprites(spr, "as-defend", "as-destroy", "as-destroy");
\r
150 WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
\r
151 WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
\r
155 void target_objective_decrease_findtarget()
\r
157 assault_setenemytoobjective();
\r
160 //=============================================================================
\r
162 void spawnfunc_target_objective_decrease() {
\r
169 self.classname = "target_objective_decrease";
\r
174 self.use = assault_objective_decrease_use;
\r
175 self.health = ASSAULT_VALUE_INACTIVE;
\r
176 self.max_health = ASSAULT_VALUE_INACTIVE;
\r
177 self.enemy = world;
\r
179 InitializeEntity(self, target_objective_decrease_findtarget, INITPRIO_FINDTARGET);
\r
182 // destructible walls that can be used to trigger target_objective_decrease
\r
183 void spawnfunc_func_assault_destructible() {
\r
189 self.spawnflags = 3;
\r
190 spawnfunc_func_breakable();
\r
193 void assault_wall_think() {
\r
194 if(self.enemy.health < 0) {
\r
196 self.solid = SOLID_NOT;
\r
198 self.model = self.mdl;
\r
199 self.solid = SOLID_BSP;
\r
202 self.nextthink = time + 0.2;
\r
205 void spawnfunc_func_assault_wall() {
\r
211 self.classname = "func_assault_wall";
\r
212 self.mdl = self.model;
\r
213 setmodel(self, self.mdl);
\r
214 self.solid = SOLID_BSP;
\r
215 self.think = assault_wall_think;
\r
216 self.nextthink = time;
\r
217 InitializeEntity(self, assault_setenemytoobjective, INITPRIO_FINDTARGET);
\r
221 void target_assault_roundend_reset() {
\r
222 //print("round end reset\n");
\r
223 self.cnt = self.cnt + 1; // up round counter
\r
224 self.winning = 0; // up round
\r
227 void target_assault_roundend_use() {
\r
228 self.winning = 1; // round has been won by attackers
\r
231 void spawnfunc_target_assault_roundend() {
\r
237 self.winning = 0; // round not yet won by attackers
\r
238 self.classname = "target_assault_roundend";
\r
239 self.use = target_assault_roundend_use;
\r
240 self.cnt = 0; // first round
\r
241 self.reset = target_assault_roundend_reset;
\r
244 void assault_roundstart_use() {
\r
250 #ifdef TTURRETS_ENABLED
\r
251 entity ent,oldself;
\r
253 //(Re)spawn all turrets
\r
255 ent = find(world, classname, "turret_main");
\r
257 // Swap turret teams
\r
258 if(ent.team == COLOR_TEAM1)
\r
259 ent.team = COLOR_TEAM2;
\r
261 ent.team = COLOR_TEAM1;
\r
265 // Dubbles as teamchange
\r
266 turret_stdproc_respawn();
\r
267 //ent.turret_spawnfunc();
\r
269 ent = find(ent, classname, "turret_main");
\r
277 void spawnfunc_target_assault_roundstart() {
\r
283 assault_attacker_team = COLOR_TEAM1;
\r
284 self.classname = "target_assault_roundstart";
\r
285 self.use = assault_roundstart_use;
\r
286 self.reset2 = assault_roundstart_use;
\r
287 InitializeEntity(self, assault_roundstart_use, INITPRIO_FINDTARGET);
\r
290 // trigger new round
\r
291 // reset objectives, toggle spawnpoints, reset triggers, ...
\r
292 void assault_new_round() {
\r
293 //bprint("ASSAULT: new round\n");
\r
295 // up round counter
\r
296 self.winning = self.winning + 1;
\r
298 // swap attacker/defender roles
\r
299 if(assault_attacker_team == COLOR_TEAM1) {
\r
300 assault_attacker_team = COLOR_TEAM2;
\r
302 assault_attacker_team = COLOR_TEAM1;
\r
307 for(ent = world; (ent = nextent(ent)); )
\r
309 if(clienttype(ent) == CLIENTTYPE_NOTACLIENT)
\r
311 if(ent.team_saved == COLOR_TEAM1)
\r
312 ent.team_saved = COLOR_TEAM2;
\r
313 else if(ent.team_saved == COLOR_TEAM2)
\r
314 ent.team_saved = COLOR_TEAM1;
\r
318 // reset the level with a countdown
\r
319 cvar_set("timelimit", ftos(ceil(time - game_starttime) / 60));
\r
320 ReadyRestartForce(); // sets game_starttime
\r