fixed score board stuff for CTF and improved kill messages for it aswell

This commit is contained in:
Magnus Auvinen 2007-11-18 23:29:34 +00:00
parent 9be8a4c39d
commit adb6b58e3c
6 changed files with 136 additions and 28 deletions

View file

@ -50,6 +50,7 @@ static vec2 local_target_pos;
static const obj_player_character *local_character = 0;
static const obj_player_character *local_prev_character = 0;
const obj_player_info *local_info = 0;
static const obj_flag *flags[2] = {0,0};
static const obj_game *gameobj = 0;
static struct client_data
@ -166,6 +167,7 @@ void sound_vol_pan(const vec2& p, float *vol, float *pan)
enum
{
SPRITE_FLAG_FLIP_Y=1,
SPRITE_FLAG_FLIP_X=2,
};
static float sprite_w_scale;
@ -184,10 +186,27 @@ static void select_sprite(sprite *spr, int flags=0, int sx=0, int sy=0)
sprite_w_scale = w/f;
sprite_h_scale = h/f;
float x1 = x/(float)cx;
float x2 = (x+w)/(float)cx;
float y1 = y/(float)cy;
float y2 = (y+h)/(float)cy;
float temp = 0;
if(flags&SPRITE_FLAG_FLIP_Y)
gfx_quads_setsubset(x/(float)cx,(y+h)/(float)cy,(x+w)/(float)cx,y/(float)cy);
else
gfx_quads_setsubset(x/(float)cx,y/(float)cy,(x+w)/(float)cx,(y+h)/(float)cy);
{
temp = y1;
y1 = y2;
y2 = temp;
}
if(flags&SPRITE_FLAG_FLIP_X)
{
temp = x1;
x1 = x2;
x2 = temp;
}
gfx_quads_setsubset(x1, y1, x2, y2);
}
void select_sprite(int id, int flags=0, int sx=0, int sy=0)
@ -472,6 +491,7 @@ struct killmsg
int weapon;
int victim;
int killer;
int mode_special; // for CTF, if the guy is carrying a flag for example
int tick;
};
@ -807,6 +827,8 @@ extern "C" void modc_newsnapshot()
local_character = 0;
local_prev_character = 0;
local_info = 0;
flags[0] = 0;
flags[1] = 0;
gameobj = 0;
// setup world view
@ -839,6 +861,10 @@ extern "C" void modc_newsnapshot()
}
else if(item.type == OBJTYPE_GAME)
gameobj = (obj_game *)data;
else if(item.type == OBJTYPE_FLAG)
{
flags[item.id%2] = (const obj_flag *)data;
}
}
}
}
@ -2286,9 +2312,6 @@ void render_game()
p1f.x,p1f.y);
gfx_quads_end();
//gfx_mapscreen(0,0,400*3,300*3);
}
if(local_character && !spectate)
@ -2369,7 +2392,24 @@ void render_game()
// render victim tee
x -= 24.0f;
//int skin = gametype == GAMETYPE_TDM ? skinseed + client_datas[killmsgs[r].victim].team : killmsgs[r].victim;
if(gameobj && gameobj->gametype == GAMETYPE_CTF)
{
if(killmsgs[r].mode_special&1)
{
gfx_blend_normal();
gfx_texture_set(data->images[IMAGE_GAME].id);
gfx_quads_begin();
if(client_datas[killmsgs[r].victim].team == 0) select_sprite(SPRITE_FLAG_BLUE);
else select_sprite(SPRITE_FLAG_RED);
float size = 56.0f;
gfx_quads_drawTL(x, y-16, size/2, size);
gfx_quads_end();
}
}
render_tee(&idlestate, &client_datas[killmsgs[r].victim].skin_info, EMOTE_PAIN, vec2(-1,0), vec2(x, y+28));
x -= 32.0f;
@ -2385,15 +2425,34 @@ void render_game()
}
x -= 52.0f;
if(killmsgs[r].victim != killmsgs[r].killer)
{
if(gameobj && gameobj->gametype == GAMETYPE_CTF)
{
if(killmsgs[r].mode_special&2)
{
gfx_blend_normal();
gfx_texture_set(data->images[IMAGE_GAME].id);
gfx_quads_begin();
if(client_datas[killmsgs[r].killer].team == 0) select_sprite(SPRITE_FLAG_BLUE, SPRITE_FLAG_FLIP_X);
else select_sprite(SPRITE_FLAG_RED, SPRITE_FLAG_FLIP_X);
float size = 56.0f;
gfx_quads_drawTL(x-56, y-16, size/2, size);
gfx_quads_end();
}
}
// render killer tee
x -= 24.0f;
//skin = gametype == GAMETYPE_TDM ? skinseed + client_datas[killmsgs[r].killer].team : killmsgs[r].killer;
render_tee(&idlestate, &client_datas[killmsgs[r].killer].skin_info, EMOTE_ANGRY, vec2(1,0), vec2(x, y+28));
x -= 32.0f;
// render killer name
x -= killername_w;
gfx_pretty_text(x, y, font_size, client_datas[killmsgs[r].killer].name, -1);
}
y += 44;
}
@ -2474,6 +2533,7 @@ void render_game()
gfx_pretty_text(200-w/2, 2, 16, text, -1);
}
// render small score hud
if(gametype == GAMETYPE_TDM || gametype == GAMETYPE_CTF)
{
for(int t = 0; t < 2; t++)
@ -2485,13 +2545,47 @@ void render_game()
gfx_setcolor(1,0,0,0.5f);
else
gfx_setcolor(0,0,1,0.5f);
draw_round_rect(320+t*35, 300-15, 30, 50, 5.0f);
draw_round_rect(400-40, 300-40-15+t*20, 50, 18, 5.0f);
gfx_quads_end();
char buf[32];
sprintf(buf, "%d", gameobj->teamscore[t]);
float w = gfx_pretty_text_width(14, buf, -1);
gfx_pretty_text(320+t*35+30/2-w/2, 300-15, 14, buf, -1);
if(gametype == GAMETYPE_CTF)
{
gfx_pretty_text(400-20-w/2+5, 300-40-15+t*20+2, 14, buf, -1);
if(flags[t])
{
if(flags[t]->carried_by == -2 || (flags[t]->carried_by == -1 && ((client_tick()/10)&1)))
{
gfx_blend_normal();
gfx_texture_set(data->images[IMAGE_GAME].id);
gfx_quads_begin();
if(t == 0) select_sprite(SPRITE_FLAG_RED);
else select_sprite(SPRITE_FLAG_BLUE);
float size = 16;
gfx_quads_drawTL(400-40+5, 300-40-15+t*20+1, size/2, size);
gfx_quads_end();
}
else if(flags[t]->carried_by >= 0)
{
int id = flags[t]->carried_by%MAX_CLIENTS;
const char *name = client_datas[id].name;
float w = gfx_pretty_text_width(10, name, -1);
gfx_pretty_text(400-40-5-w, 300-40-15+t*20+2, 10, name, -1);
tee_render_info info = client_datas[id].skin_info;
info.size = 18.0f;
render_tee(&idlestate, &info, EMOTE_NORMAL, vec2(1,0),
vec2(400-40+10, 300-40-15+9+t*20+1));
}
}
}
else
gfx_pretty_text(400-20-w/2, 300-40-15+t*20+2, 14, buf, -1);
}
}
@ -2682,6 +2776,7 @@ extern "C" void modc_message(int msg)
killmsgs[killmsg_current].killer = msg_unpack_int();
killmsgs[killmsg_current].victim = msg_unpack_int();
killmsgs[killmsg_current].weapon = msg_unpack_int();
killmsgs[killmsg_current].mode_special = msg_unpack_int();
killmsgs[killmsg_current].tick = client_tick();
}
else if (msg == MSG_EMOTICON)

View file

@ -992,17 +992,18 @@ void player::tick_defered()
void player::die(int killer, int weapon)
{
gameobj->on_player_death(this, get_player(killer), weapon);
int mode_special = gameobj->on_player_death(this, get_player(killer), weapon);
dbg_msg("game", "kill killer='%d:%s' victim='%d:%s' weapon=%d",
dbg_msg("game", "kill killer='%d:%s' victim='%d:%s' weapon=%d special=%d",
killer, server_clientname(killer),
client_id, server_clientname(client_id), weapon);
client_id, server_clientname(client_id), weapon, mode_special);
// send the kill message
msg_pack_start(MSG_KILLMSG, MSGFLAG_VITAL);
msg_pack_int(killer);
msg_pack_int(client_id);
msg_pack_int(weapon);
msg_pack_int(mode_special);
msg_pack_end();
server_send_msg(-1);

View file

@ -127,15 +127,16 @@ void gameobject::on_player_info_change(class player *p)
}
void gameobject::on_player_death(class player *victim, class player *killer, int weapon)
int gameobject::on_player_death(class player *victim, class player *killer, int weapon)
{
// do scoreing
if(!killer)
return;
return 0;
if(killer == victim)
victim->score--; // klant arschel
else
killer->score++; // good shit
return 0;
}
void gameobject::do_warmup(int seconds)

View file

@ -136,7 +136,7 @@ public:
virtual void tick();
virtual void on_player_spawn(class player *p) {}
virtual void on_player_death(class player *victim, class player *killer, int weapon);
virtual int on_player_death(class player *victim, class player *killer, int weapon);
virtual void on_player_info_change(class player *p);

View file

@ -29,18 +29,27 @@ void gameobject_ctf::on_player_spawn(class player *p)
{
}
void gameobject_ctf::on_player_death(class player *victim, class player *killer, int weaponid)
int gameobject_ctf::on_player_death(class player *victim, class player *killer, int weaponid)
{
gameobject::on_player_death(victim, killer, weaponid);
int had_flag = 0;
// drop flags
for(int fi = 0; fi < 2; fi++)
{
flag *f = flags[fi];
if(f && f->carrying_player == killer)
had_flag |= 2;
if(f && f->carrying_player == victim)
{
f->carrying_player = 0;
had_flag |= 1;
}
}
return had_flag;
}
void gameobject_ctf::tick()
{
gameobject::tick();
@ -125,12 +134,14 @@ void flag::snap(int snapping_client)
if(spawntick != -1)
return;
obj_flag *flag = (obj_flag *)snap_new_item(OBJTYPE_FLAG, id, sizeof(obj_flag));
obj_flag *flag = (obj_flag *)snap_new_item(OBJTYPE_FLAG, team, sizeof(obj_flag));
flag->x = (int)pos.x;
flag->y = (int)pos.y;
flag->team = team;
flag->carried_by = -1;
if(carrying_player)
if(at_stand)
flag->carried_by = -2;
else if(carrying_player)
flag->carried_by = carrying_player->client_id;
}

View file

@ -9,7 +9,7 @@ public:
virtual void tick();
virtual void on_player_spawn(class player *p);
virtual void on_player_death(class player *victim, class player *killer, int weapon);
virtual int on_player_death(class player *victim, class player *killer, int weapon);
};
// TODO: move to seperate file