From d5e3c556bf1812c89dea13a5924e619dd2b8ccef Mon Sep 17 00:00:00 2001 From: Jakob Fries Date: Thu, 9 Aug 2007 00:18:11 +0000 Subject: [PATCH] emotes --- datasrc/teewars.ds | 4 ++++ src/game/client/game_client.cpp | 32 ++++++++++++++++++++------- src/game/game.h | 5 +++-- src/game/server/game_server.cpp | 38 +++++++++++++++++++++++++++++---- src/game/server/game_server.h | 3 +++ 5 files changed, 68 insertions(+), 14 deletions(-) diff --git a/datasrc/teewars.ds b/datasrc/teewars.ds index 807bd0650..e020b6694 100644 --- a/datasrc/teewars.ds +++ b/datasrc/teewars.ds @@ -570,6 +570,10 @@ sprites { tee_foot_outline 13 2 2 1 tee_eye_normal 10 2 1 1 + tee_eye_pain 11 3 1 1 + tee_eye_happy 11 2 1 1 + tee_eye_surprise 12 0 1 1 + tee_eye_angry 10 3 1 1 } chatbubbles images.chat_bubbles 4 4 { diff --git a/src/game/client/game_client.cpp b/src/game/client/game_client.cpp index 487ec73d9..38515b7f7 100644 --- a/src/game/client/game_client.cpp +++ b/src/game/client/game_client.cpp @@ -790,7 +790,7 @@ static void anim_eval_add(animstate *state, animation *anim, float time, float a anim_add(state, &add, amount); } -static void render_tee(animstate *anim, int skin, vec2 dir, vec2 pos) +static void render_tee(animstate *anim, int skin, int emote, vec2 dir, vec2 pos) { vec2 direction = dir; vec2 position = pos; @@ -819,10 +819,26 @@ static void render_tee(animstate *anim, int skin, vec2 dir, vec2 pos) // draw eyes if(p == 1) { - // normal - select_sprite(SPRITE_TEE_EYE_NORMAL, 0, 0, shift*4); + switch (emote) + { + case EMOTE_PAIN: + select_sprite(SPRITE_TEE_EYE_PAIN, 0, 0, shift*4); + break; + case EMOTE_HAPPY: + select_sprite(SPRITE_TEE_EYE_HAPPY, 0, 0, shift*4); + break; + case EMOTE_SURPRISE: + select_sprite(SPRITE_TEE_EYE_SURPRISE, 0, 0, shift*4); + break; + case EMOTE_ANGRY: + select_sprite(SPRITE_TEE_EYE_ANGRY, 0, 0, shift*4); + break; + default: + select_sprite(SPRITE_TEE_EYE_NORMAL, 0, 0, shift*4); + break; + } gfx_quads_draw(position.x-4+direction.x*4, position.y-8+direction.y*3, basesize, basesize); - gfx_quads_draw(position.x+4+direction.x*4, position.y-8+direction.y*3, basesize, basesize); + gfx_quads_draw(position.x+4+direction.x*4, position.y-8+direction.y*3, -basesize, basesize); } } @@ -1078,7 +1094,7 @@ static void render_player(const obj_player *prev, const obj_player *player) // render the tee int skin = gametype == GAMETYPE_TDM ? skinseed + player->team : player->clientid; - render_tee(&state, skin, direction, position); + render_tee(&state, skin, player->emote, direction, position); if(player->state == STATE_CHATTING) { @@ -1552,7 +1568,7 @@ void render_game() // render victim tee x -= 24.0f; int skin = gametype == GAMETYPE_TDM ? skinseed + client_datas[killmsgs[r].victim].team : killmsgs[r].victim; - render_tee(&idlestate, skin, vec2(1,0), vec2(x, y+28)); + render_tee(&idlestate, skin, EMOTE_NORMAL, vec2(1,0), vec2(x, y+28)); x -= 32.0f; // render weapon @@ -1570,7 +1586,7 @@ void render_game() // render killer tee x -= 24.0f; skin = gametype == GAMETYPE_TDM ? skinseed + client_datas[killmsgs[r].killer].team : killmsgs[r].killer; - render_tee(&idlestate, skin, vec2(1,0), vec2(x, y+28)); + render_tee(&idlestate, skin, EMOTE_NORMAL, vec2(1,0), vec2(x, y+28)); x -= 32.0f; // render killer name @@ -1746,7 +1762,7 @@ void render_game() gfx_pretty_text(x+w-tw-35, y, font_size, buf); // render avatar - render_tee(&idlestate, player->clientid, vec2(1,0), vec2(x+90, y+28)); + render_tee(&idlestate, player->clientid, EMOTE_NORMAL, vec2(1,0), vec2(x+90, y+28)); y += 50.0f; } diff --git a/src/game/game.h b/src/game/game.h index bcb5007cb..ef2007a9a 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -58,10 +58,11 @@ enum enum { EMOTE_NORMAL=0, - EMOTE_BLINK, - EMOTE_WINK, EMOTE_PAIN, EMOTE_HAPPY, + EMOTE_SURPRISE, + EMOTE_ANGRY, + EMOTE_BLINK, }; enum diff --git a/src/game/server/game_server.cpp b/src/game/server/game_server.cpp index 1d6b101fe..5428ef5fb 100644 --- a/src/game/server/game_server.cpp +++ b/src/game/server/game_server.cpp @@ -806,6 +806,9 @@ void player::try_respawn() active_weapon = WEAPON_GUN; reload_timer = 0; + + emote_type = EMOTE_HAPPY; + emote_stop = server_tick() + server_tickspeed(); // Create sound and spawn effects create_sound(pos, SOUND_PLAYER_SPAWN); @@ -1407,7 +1410,7 @@ bool player::take_damage(vec2 force, int dmg, int from, int weapon) // do damage hit sound if(from >= 0) - create_targetted_sound(pos, SOUND_HIT, from); + create_targetted_sound(players[from].pos, SOUND_HIT, from); // check for death if(health <= 0) @@ -1433,6 +1436,8 @@ bool player::take_damage(vec2 force, int dmg, int from, int weapon) else create_sound(pos, SOUND_PLAYER_PAIN_SHORT); + emote_type = EMOTE_PAIN; + emote_stop = server_tick() + 500 * server_tickspeed() / 1000; // spawn blood? return true; @@ -1446,7 +1451,14 @@ void player::snap(int snaping_client) player->y = (int)pos.y; player->vx = (int)vel.x; player->vy = (int)vel.y; - player->emote = EMOTE_NORMAL; + + if (emote_stop < server_tick()) + { + emote_type = EMOTE_NORMAL; + emote_stop = -1; + } + + player->emote = emote_type; player->latency = latency_avg; player->latency_flux = latency_max-latency_min; @@ -1472,8 +1484,8 @@ void player::snap(int snaping_client) if(length(vel) > 15.0f) player->emote = EMOTE_HAPPY; - if(damage_taken_tick+50 > server_tick()) - player->emote = EMOTE_PAIN; + //if(damage_taken_tick+50 > server_tick()) + // player->emote = EMOTE_PAIN; if(player->emote == EMOTE_NORMAL) { @@ -1590,6 +1602,24 @@ void powerup::tick() pplayer->active_weapon = WEAPON_NINJA; respawntime = data->powerupinfo[type].respawntime; create_sound(pos, SOUND_PICKUP_NINJA); + + // loop through all players, setting their emotes + entity *ents[64]; + const int types[] = {OBJTYPE_PLAYER}; + int num = world.find_entities(vec2(0, 0), 1000000, ents, 64, types, 1); + for (int i = 0; i < num; i++) + { + player *p = (player *)ents[i]; + if (p != pplayer) + { + p->emote_type = EMOTE_SURPRISE; + p->emote_stop = server_tick() + server_tickspeed(); + } + } + + pplayer->emote_type = EMOTE_ANGRY; + pplayer->emote_stop = server_tick() + 1200 * server_tickspeed() / 1000; + break; } default: diff --git a/src/game/server/game_server.h b/src/game/server/game_server.h index f084ae16b..91727b065 100644 --- a/src/game/server/game_server.h +++ b/src/game/server/game_server.h @@ -218,6 +218,9 @@ public: int attack_tick; int damage_taken; + + int emote_type; + int emote_stop; // we need a defered position so we can handle the physics correctly baselib::vec2 defered_pos;