diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-09-25 23:03:15 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-09-25 23:03:15 +0000 |
| commit | fb87d00c8dfde266a46d5479838f06bce0b375fd (patch) | |
| tree | 01fa66bbc4db4a54bc1c7dd55bc2f087dd0b5ed7 /src/game/server/srv_ctf.cpp | |
| parent | 31861cf222939ca26578010d5bbda61c8e2cd238 (diff) | |
| download | zcatch-fb87d00c8dfde266a46d5479838f06bce0b375fd.tar.gz zcatch-fb87d00c8dfde266a46d5479838f06bce0b375fd.zip | |
moved out dm, tdm and ctf rules to separate files
Diffstat (limited to 'src/game/server/srv_ctf.cpp')
| -rw-r--r-- | src/game/server/srv_ctf.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/game/server/srv_ctf.cpp b/src/game/server/srv_ctf.cpp new file mode 100644 index 00000000..8f345436 --- /dev/null +++ b/src/game/server/srv_ctf.cpp @@ -0,0 +1,148 @@ +#include "srv_common.h" +#include "srv_ctf.h" + +gameobject_ctf::gameobject_ctf() +{ + // fetch flagstands + for(int i = 0; i < 2; i++) + { + mapres_flagstand *stand; + stand = (mapres_flagstand *)map_find_item(MAPRES_FLAGSTAND_RED+i, 0); + if(stand) + { + flag *f = new flag(i); + f->stand_pos = vec2(stand->x, stand->y); + f->pos = f->stand_pos; + flags[i] = f; + //dbg_msg("game", "flag at %f,%f", f->pos.x, f->pos.y); + } + else + { + // report massive failure + } + } +} + +void gameobject_ctf::on_player_spawn(class player *p) +{ +} + +void gameobject_ctf::on_player_death(class player *victim, class player *killer, int weapon) +{ + // drop flags + for(int fi = 0; fi < 2; fi++) + { + flag *f = flags[fi]; + if(f && f->carrying_player == victim) + f->carrying_player = 0; + } +} + +void gameobject_ctf::tick() +{ + gameobject::tick(); + + // do flags + for(int fi = 0; fi < 2; fi++) + { + flag *f = flags[fi]; + + // + if(f->carrying_player) + { + // update flag position + f->pos = f->carrying_player->pos; + + if(flags[fi^1]->at_stand) + { + if(distance(f->pos, flags[fi^1]->pos) < 24) + { + // CAPTURE! \o/ + for(int i = 0; i < 2; i++) + flags[i]->reset(); + } + } + } + else + { + player *players[MAX_CLIENTS]; + int types[] = {OBJTYPE_PLAYER}; + int num = world->find_entities(f->pos, 32.0f, (entity**)players, MAX_CLIENTS, types, 1); + for(int i = 0; i < num; i++) + { + if(players[i]->team == f->team) + { + // return the flag + f->reset(); + } + else + { + // take the flag + f->at_stand = 0; + f->carrying_player = players[i]; + break; + } + } + + if(!f->carrying_player) + { + f->vel.y += gravity; + move_box(&f->pos, &f->vel, vec2(f->phys_size, f->phys_size), 0.5f); + } + } + } +} + +////////////////////////////////////////////////// +// FLAG +////////////////////////////////////////////////// +flag::flag(int _team) +: entity(OBJTYPE_FLAG) +{ + team = _team; + proximity_radius = phys_size; + carrying_player = 0x0; + + reset(); + + // TODO: should this be done here? + world->insert_entity(this); +} + +void flag::reset() +{ + carrying_player = 0; + at_stand = 1; + pos = stand_pos; + spawntick = -1; +} + +void flag::tick() +{ +} + +bool flag::is_grounded() +{ + if(col_check_point((int)(pos.x+phys_size/2), (int)(pos.y+phys_size/2+5))) + return true; + if(col_check_point((int)(pos.x-phys_size/2), (int)(pos.y+phys_size/2+5))) + return true; + return false; +} + +void flag::snap(int snapping_client) +{ + if(spawntick != -1) + return; + + obj_flag *flag = (obj_flag *)snap_new_item(OBJTYPE_FLAG, id, sizeof(obj_flag)); + flag->x = (int)pos.x; + flag->y = (int)pos.y; + flag->team = team; + + if(carrying_player && carrying_player->client_id == snapping_client) + flag->local_carry = 1; + else + flag->local_carry = 0; +} +// FLAG END /////////////////////// |