home *** CD-ROM | disk | FTP | other *** search
- /*
- Capture the flag routines
-
- Written by W.Harris
- */
-
- void() ActivateFlag;
- void() PlaceBase;
-
- void() CheckFlag =
- {
- local entity newflag;
- local entity oldbase;
- local float flag_color;
-
- self.think = CheckFlag;
- self.nextthink = time + 1;
- if (self.watertype < -3)
- {
- flag_color = self.items;
- if (flag_color == FLAG_1)
- bprint ("Silver ");
- if (flag_color == FLAG_2)
- bprint ("Gold ");
- bprint("flag unreachable. Respawning.");
- remove(self);
-
- oldbase = world;
- while (oldbase.items != flag_color)
- oldbase = find(oldbase,classname,"base");
-
- newflag = spawn();
- newflag.owner = oldbase;
- newflag.movetype = MOVETYPE_NONE;
- newflag.solid = SOLID_NOT;
- newflag.items = flag_color;
- newflag.classname = "flag";
- newflag.think = ActivateFlag;
- newflag.nextthink = time + 0.5;
- setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newflag, oldbase.origin);
- newflag.pos1 = newflag.origin;
- newflag.velocity = VEC_ORIGIN;
- if (flag_color == FLAG_1)
- setmodel(newflag,"progs/m_s_key.mdl");
- else
- setmodel(newflag,"progs/m_g_key.mdl");
- return;
- }
- };
-
- void() PickupFlag =
- {
- local float team_color;
- local float flag_color;
- local entity newflag;
- local entity oldbase;
-
- if (world_flag) return;
- if (other == world) return;
- if (other.classname != "player") return;
- flag_color = self.items;
- team_color = other.team;
- if (team_color > 2)
- {
- sprint(other,"You must be either Silver or Yellow\n");
- sprint(other,"Type COLOR 0 or COLOR 1\n");
- return;
- }
- if ((flag_color == team_color) && (self.origin_x == self.pos1_x) && (self.origin_y == self.pos1_y))
- {
- // You cannot take your flag from your base
- return;
- }
- if (flag_color != team_color)
- {
- bprint(other.netname);
- bprint(" picked up the ");
- if (flag_color == FLAG_1) bprint("silver flag.\n");
- if (flag_color == FLAG_2) bprint("gold flag.\n");
- sound (self, CHAN_WEAPON, "misc/secret.wav", 1, ATTN_NORM);
- }
- else
- {
- sprint(other,"You recovered your flag!\n");
- sound (self, CHAN_WEAPON, "misc/secret.wav", 1, ATTN_NORM);
- // respawn at flag base
-
- oldbase = world;
- while (oldbase.items != team_color)
- oldbase = find(oldbase,classname,"base");
-
- newflag = spawn();
- newflag.owner = self;
- newflag.movetype = MOVETYPE_NONE;
- newflag.solid = SOLID_NOT;
- newflag.items = team_color;
- newflag.classname = "flag";
- newflag.think = ActivateFlag;
- newflag.nextthink = time + 0.1;
- setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newflag, oldbase.origin);
- newflag.pos1 = newflag.origin;
- newflag.velocity = VEC_ORIGIN;
- if (team_color == FLAG_1)
- setmodel(newflag,"progs/m_s_key.mdl");
- else
- setmodel(newflag,"progs/m_g_key.mdl");
- remove(self);
- return;
- }
- other.have_flag = other.have_flag + flag_color;
- remove(self);
- };
-
- void() ActivateFlag =
- {
- local entity newflag;
- local entity oldbase;
- local float flag_color;
-
- self.owner = self;
- self.movetype = MOVETYPE_TOSS;
- self.velocity_x = self.velocity_x + (50 * (random() - 0.5));
- self.velocity_y = self.velocity_y + (50 * (random() - 0.5));
- self.solid = SOLID_TRIGGER;
- self.touch = PickupFlag;
- self.think = CheckFlag;
- self.effects = self.effects | EF_DIMLIGHT;
- self.nextthink = time + 5;
- if (world_flag)
- {
- self.pos1 = self.origin;
- PlaceBase();
- }
- };
-
- void() TouchBase =
- {
- local float team_color;
- local float base_color;
- local entity newflag;
- local entity oldbase;
-
- if (other == world) return;
- if (other.classname != "player") return;
- if (other.have_flag == 0) return;
- base_color = self.items;
- team_color = other.team;
- if (team_color > 2)
- {
- sprint(self,"You must be either Silver or Yellow\n");
- sprint(self,"Type COLOR 0 or COLOR 1\n");
- return;
- }
- if (team_color == base_color)
- {
- if (other.have_flag == 0) return;
- if (other.have_flag & team_color)
- {
- // return your flag to base
- sprint(other,"You return your flag to your base\n");
- sound (other, CHAN_WEAPON, "misc/secret.wav", 1, ATTN_NORM);
- newflag = spawn();
- newflag.owner = self;
- newflag.movetype = MOVETYPE_NONE;
- newflag.solid = SOLID_NOT;
- newflag.items = team_color;
- newflag.classname = "flag";
- newflag.think = ActivateFlag;
- newflag.nextthink = time + 0.1;
- setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newflag, self.origin);
- newflag.pos1 = newflag.origin;
- newflag.velocity = VEC_ORIGIN;
- if (team_color == FLAG_1)
- setmodel(newflag,"progs/m_s_key.mdl");
- else
- setmodel(newflag,"progs/m_g_key.mdl");
-
- other.have_flag = other.have_flag - team_color;
-
- }
- if (other.have_flag & (3 - team_color))
- {
- // secure enemy flag
- bprint(other.netname);
- bprint(" secures ");
- if (team_color == FLAG_1)
- bprint("yellow flag.\n");
- if (team_color == FLAG_2)
- bprint("silver flag.\n");
- sound (other, CHAN_WEAPON, "misc/secret.wav", 1, ATTN_NORM);
- other.frags = other.frags + 3 + numplayers;
-
- oldbase = world;
- while (oldbase.items != (3 - team_color))
- oldbase = find(oldbase,classname,"base");
-
- newflag = spawn();
- newflag.owner = oldbase;
- newflag.movetype = MOVETYPE_NONE;
- newflag.solid = SOLID_NOT;
- newflag.items = (3 - team_color);
- newflag.classname = "flag";
- newflag.think = ActivateFlag;
- newflag.nextthink = time + 0.1;
- setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newflag, oldbase.origin);
- newflag.pos1 = newflag.origin;
- newflag.velocity = VEC_ORIGIN;
- if ((3 - team_color) == FLAG_1)
- setmodel(newflag,"progs/m_s_key.mdl");
- else
- setmodel(newflag,"progs/m_g_key.mdl");
-
- other.have_flag = other.have_flag - (3 - team_color);
- }
- }
- };
-
- void() ActivateBase =
- {
- local entity found;
-
- self.owner = self;
- self.movetype = MOVETYPE_TOSS;
- self.solid = SOLID_TRIGGER;
- self.touch = TouchBase;
- world_flag = world_flag - self.items;
- if (world_flag == 0)
- {
- bprint("Both flags placed. GO!\n");
- return;
- }
- };
-
- void () PlaceBase =
- {
- local entity newbase;
-
- newbase = spawn();
- newbase.owner = self;
- newbase.movetype = MOVETYPE_NONE;
- newbase.solid = SOLID_NOT;
- newbase.items = self.items;
- newbase.classname = "base";
- newbase.think = ActivateBase;
- newbase.nextthink = time;
- newbase.effects = newbase.effects | EF_DIMLIGHT;
- setsize (newbase, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newbase, self.origin + '0 0 3');
- newbase.velocity = VEC_ORIGIN;
- if (self.items == FLAG_1)
- setmodel(newbase,"progs/w_s_key.mdl");
- else
- setmodel(newbase,"progs/w_g_key.mdl");
- };
-
- void(float checkflag) DropFlag =
- {
- local float flag_color;
- local entity newflag;
- if (teamplay != 7)
- {
- sprint(self,"Not Capture the Flag\n");
- return;
- }
- if (self.team == 1)
- flag_color = FLAG_1;
- if (self.team == 2)
- flag_color = FLAG_2;
- if (world_flag == 0)
- flag_color = self.have_flag;
- if (flag_color == 3)
- {
- // you have both flags
- self.have_flag = FLAG_1;
- DropFlag(TRUE);
- self.have_flag = FLAG_2;
- DropFlag(TRUE);
- return;
- }
- if (self.team > 2)
- {
- sprint(self,"You must be either Silver or Yellow\n");
- sprint(self,"Type COLOR 0 or COLOR 1\n");
- return;
- }
- if ((checkflag == TRUE) && !(self.have_flag & flag_color))
- {
- sprint(self,"You don't carry a flag\n");
- return;
- }
- if (world_flag == 0)
- self.have_flag = self.have_flag - flag_color;
-
- newflag = spawn();
- newflag.owner = self;
- newflag.movetype = MOVETYPE_NONE;
- newflag.solid = SOLID_NOT;
- newflag.items = flag_color;
- newflag.classname = "flag";
- newflag.think = ActivateFlag;
- newflag.nextthink = time + 1;
- setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newflag, self.origin);
- newflag.velocity = VEC_ORIGIN;
- if (flag_color == FLAG_1)
- setmodel(newflag,"progs/m_s_key.mdl");
- else
- setmodel(newflag,"progs/m_g_key.mdl");
- self.attack_finished = time + 1.1;
- };
-
- void() W_PlaceFlag =
- {
- if (world_flag == 0)
- {
- bprint("Both Flags already placed.\n");
- return;
- }
- if (self.team == 1)
- {
- if (world_flag & FLAG_1)
- {
- bprint("Silver Flag Placed by ");
- bprint(self.netname);
- bprint("\n");
- DropFlag(FALSE);
- return;
- }
- else
- {
- sprint(self,"Silver flag already dropped\n");
- return;
- }
- }
- if (self.team == 2)
- {
- if (world_flag & FLAG_2)
- {
- bprint("Gold Flag Placed by ");
- bprint(self.netname);
- bprint("\n");
- DropFlag(FALSE);
- return;
- }
- else
- {
- sprint(self,"Yellow flag already dropped\n");
- return;
- }
- }
- if (self.team > 2)
- {
- sprint(self,"You must be either Silver or Yellow\n");
- sprint(self,"Type COLOR 0 or COLOR 1\n");
- return;
- }
- };
-