1 void spawnfunc_func_breakable();
2 void target_objective_decrease_activate();
3 .entity assault_decreaser;
4 .entity assault_sprite;
6 void spawnfunc_info_player_attacker() {
12 self.team = COLOR_TEAM1; // red, gets swapped every round
13 spawnfunc_info_player_deathmatch();
16 void spawnfunc_info_player_defender() {
22 self.team = COLOR_TEAM2; // blue, gets swapped every round
23 spawnfunc_info_player_deathmatch();
26 // reset this objective. Used when spawning an objective
27 // and when a new round starts
28 void assault_objective_reset() {
29 self.health = ASSAULT_VALUE_INACTIVE;
32 void assault_objective_use() {
33 if(other.classname == "info_player_deathmatch") // a spawn, a spawn
38 //print("^2Activated objective ", self.targetname, "=", etos(self), "\n");
39 //print("Activator is ", activator.classname, "\n");
44 for(self = world; (self = find(self, target, oldself.targetname)); )
46 if(self.classname == "target_objective_decrease")
47 target_objective_decrease_activate();
53 void spawnfunc_target_objective() {
59 self.classname = "target_objective";
60 self.use = assault_objective_use;
61 assault_objective_reset();
62 self.reset = assault_objective_reset;
66 // decrease the health of targeted objectives
67 void assault_objective_decrease_use() {
68 if(activator.team != assault_attacker_team) {
69 // wrong team triggered decrease
73 if(other.assault_sprite)
74 WaypointSprite_Disown(other.assault_sprite, waypointsprite_deadlifetime);
76 return; // already activated! cannot activate again!
78 if(self.enemy.health < ASSAULT_VALUE_INACTIVE)
80 if(self.enemy.health - self.dmg > 0.5)
82 PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.dmg);
83 self.enemy.health = self.enemy.health - self.dmg;
87 PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.enemy.health);
88 PlayerTeamScore_Add(activator, SP_ASSAULT_OBJECTIVES, ST_ASSAULT_OBJECTIVES, 1);
89 self.enemy.health = -1;
91 entity oldself, oldactivator;
95 oldactivator = activator;
98 activator = oldactivator;
104 void assault_setenemytoobjective()
106 local entity objective;
107 for(objective = world; (objective = find(objective, targetname, self.target)); ) {
108 if(objective.classname == "target_objective") {
109 if(self.enemy == world)
110 self.enemy = objective;
112 objerror("more than one objective as target - fix the map!");
117 if(self.enemy == world)
118 objerror("no objective as target - fix the map!");
121 float assault_decreaser_sprite_visible(entity e)
125 decreaser = self.assault_decreaser;
127 if(decreaser.enemy.health >= ASSAULT_VALUE_INACTIVE)
133 void target_objective_decrease_activate()
137 for(ent = world; (ent = find(ent, target, self.targetname)); )
139 if(ent.assault_sprite != world)
140 WaypointSprite_Disown(ent.assault_sprite, waypointsprite_deadlifetime);
142 spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
143 spr.assault_decreaser = self;
144 spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible;
145 spr.classname = "sprite_waypoint";
146 WaypointSprite_UpdateRule(spr, assault_attacker_team, SPRITERULE_TEAMPLAY);
147 if(ent.classname == "func_assault_destructible")
148 WaypointSprite_UpdateSprites(spr, "as-defend", "as-destroy", "as-destroy");
150 WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
151 WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
155 void target_objective_decrease_findtarget()
157 assault_setenemytoobjective();
160 //=============================================================================
162 void spawnfunc_target_objective_decrease() {
169 self.classname = "target_objective_decrease";
174 self.use = assault_objective_decrease_use;
175 self.health = ASSAULT_VALUE_INACTIVE;
176 self.max_health = ASSAULT_VALUE_INACTIVE;
179 InitializeEntity(self, target_objective_decrease_findtarget, INITPRIO_FINDTARGET);
182 // destructible walls that can be used to trigger target_objective_decrease
183 void spawnfunc_func_assault_destructible() {
190 if(assault_attacker_team == COLOR_TEAM1) {
191 self.team = COLOR_TEAM2;
193 self.team = COLOR_TEAM1;
195 spawnfunc_func_breakable();
198 void assault_wall_think() {
199 if(self.enemy.health < 0) {
201 self.solid = SOLID_NOT;
203 self.model = self.mdl;
204 self.solid = SOLID_BSP;
207 self.nextthink = time + 0.2;
210 void spawnfunc_func_assault_wall() {
216 self.classname = "func_assault_wall";
217 self.mdl = self.model;
218 setmodel(self, self.mdl);
219 self.solid = SOLID_BSP;
220 self.think = assault_wall_think;
221 self.nextthink = time;
222 InitializeEntity(self, assault_setenemytoobjective, INITPRIO_FINDTARGET);
226 void target_assault_roundend_reset() {
227 //print("round end reset\n");
228 self.cnt = self.cnt + 1; // up round counter
229 self.winning = 0; // up round
232 void target_assault_roundend_use() {
233 self.winning = 1; // round has been won by attackers
236 void spawnfunc_target_assault_roundend() {
242 self.winning = 0; // round not yet won by attackers
243 self.classname = "target_assault_roundend";
244 self.use = target_assault_roundend_use;
245 self.cnt = 0; // first round
246 self.reset = target_assault_roundend_reset;
249 void assault_roundstart_use() {
255 #ifdef TTURRETS_ENABLED
258 //(Re)spawn all turrets
260 ent = find(world, classname, "turret_main");
263 if(ent.team == COLOR_TEAM1)
264 ent.team = COLOR_TEAM2;
266 ent.team = COLOR_TEAM1;
270 // Dubbles as teamchange
271 turret_stdproc_respawn();
273 ent = find(ent, classname, "turret_main");
281 void spawnfunc_target_assault_roundstart() {
287 assault_attacker_team = COLOR_TEAM1;
288 self.classname = "target_assault_roundstart";
289 self.use = assault_roundstart_use;
290 self.reset2 = assault_roundstart_use;
291 InitializeEntity(self, assault_roundstart_use, INITPRIO_FINDTARGET);
295 // reset objectives, toggle spawnpoints, reset triggers, ...
296 void assault_new_round() {
297 //bprint("ASSAULT: new round\n");
300 self.winning = self.winning + 1;
302 // swap attacker/defender roles
303 if(assault_attacker_team == COLOR_TEAM1) {
304 assault_attacker_team = COLOR_TEAM2;
306 assault_attacker_team = COLOR_TEAM1;
311 for(ent = world; (ent = nextent(ent)); )
313 if(clienttype(ent) == CLIENTTYPE_NOTACLIENT)
315 if(ent.team_saved == COLOR_TEAM1)
316 ent.team_saved = COLOR_TEAM2;
317 else if(ent.team_saved == COLOR_TEAM2)
318 ent.team_saved = COLOR_TEAM1;
322 // reset the level with a countdown
323 cvar_set("timelimit", ftos(ceil(time - game_starttime) / 60));
324 ReadyRestartForce(); // sets game_starttime