diff options
| author | Olle Rosenquist <phobos99@gmail.com> | 2007-07-21 21:17:38 +0000 |
|---|---|---|
| committer | Olle Rosenquist <phobos99@gmail.com> | 2007-07-21 21:17:38 +0000 |
| commit | 1120a86b252d0d526b634552c8c2fe2611a9bd15 (patch) | |
| tree | 0f68c062292c96b9ab045e284414f3d5b554a17f /src/game/client | |
| parent | b6c9c311c5008b6f4be5c483d14847a3485a3ae4 (diff) | |
| download | zcatch-1120a86b252d0d526b634552c8c2fe2611a9bd15.tar.gz zcatch-1120a86b252d0d526b634552c8c2fe2611a9bd15.zip | |
Updated stuff
Diffstat (limited to 'src/game/client')
| -rw-r--r-- | src/game/client/game_client.cpp | 73 |
1 files changed, 70 insertions, 3 deletions
diff --git a/src/game/client/game_client.cpp b/src/game/client/game_client.cpp index b1071b76..a0886974 100644 --- a/src/game/client/game_client.cpp +++ b/src/game/client/game_client.cpp @@ -336,7 +336,39 @@ public: }; static particle_system temp_system; - + +class projectile_particles +{ +public: + enum + { + LISTSIZE = 1000, + }; + // meh, just use size % + int lastadd[LISTSIZE]; + projectile_particles() + { + for (int i = 0; i < LISTSIZE; i++) + lastadd[i] = -1000; + } + + void addparticle(int projectiletype, int projectileid, vec2 pos, vec2 vel) + { + int particlespersecond = data->projectileparticles[projectiletype].particlespersecond; + int lastaddtick = lastadd[projectileid % LISTSIZE]; + if ((client_tick() - lastaddtick) > (client_tickspeed() / particlespersecond)) + { + lastadd[projectileid % LISTSIZE] = client_tick(); + float life = data->projectileparticles[projectiletype].particlelife; + float size = data->projectileparticles[projectiletype].particlesize; + vec2 v = vel * 0.2f + normalize(vec2(frandom()-0.5f, -frandom()))*(32.0f+frandom()*32.0f); + + // add the particle (from projectiletype later on, but meh...) + temp_system.new_particle(pos, v, life, size, 0, 0.95f); + } + } +}; +static projectile_particles proj_particles; static bool chat_active = false; static char chat_input[512]; @@ -504,6 +536,31 @@ void modc_newsnapshot() temp_system.new_particle(p, v, 0.5f+0.5f*frandom(), 16.0f, 128.0f, 0.985f); } } + else if(item.type == EVENT_DEATH) + { + ev_explosion *ev = (ev_explosion *)data; + vec2 p(ev->x, ev->y); + + // center explosion + vec2 v = normalize(vec2(frandom()-0.5f, -frandom()))*(32.0f+frandom()*32.0f); + temp_system.new_particle(p, v, 1.2f, 64.0f, 0, 0.95f); + v = normalize(vec2(frandom()-0.5f, -frandom()))*(128.0f+frandom()*128.0f); + temp_system.new_particle(p, v, 1.2f, 32.0f, 0, 0.95f); + v = normalize(vec2(frandom()-0.5f, -frandom()))*(128.0f+frandom()*128.0f); + temp_system.new_particle(p, v, 1.2f, 16.0f, 0, 0.95f); + + for(int i = 0; i < 8; i++) + { + vec2 v = normalize(vec2(frandom()-0.5f, frandom()-0.5f))*(64.0f+frandom()*64.0f); + temp_system.new_particle(p, v, 0.5f+0.5f*frandom(), 16.0f, 0, 0.985f); + } + + for(int i = 0; i < 8; i++) + { + vec2 v = normalize(vec2(frandom()-0.5f, frandom()-0.5f))*(128.0f+frandom()*256.0f); + temp_system.new_particle(p, v, 0.5f+0.5f*frandom(), 16.0f, 128.0f, 0.985f); + } + } else if(item.type == EVENT_SOUND) { ev_sound *ev = (ev_sound *)data; @@ -524,7 +581,7 @@ void modc_newsnapshot() } } -static void render_projectile(obj_projectile *prev, obj_projectile *current) +static void render_projectile(obj_projectile *prev, obj_projectile *current, int itemid) { gfx_texture_set(data->images[IMAGE_WEAPONS].id); gfx_quads_begin(); @@ -533,6 +590,9 @@ static void render_projectile(obj_projectile *prev, obj_projectile *current) vec2 vel = mix(vec2(prev->vx, prev->vy), vec2(current->vx, current->vy), client_intratick()); vec2 pos = mix(vec2(prev->x, prev->y), vec2(current->x, current->y), client_intratick()); + // add particle for this projectile + proj_particles.addparticle(current->type, itemid, pos, vel); + if(length(vel) > 0.00001f) gfx_quads_setrotation(get_angle(vel)); else @@ -719,6 +779,13 @@ static void render_player(obj_player *prev, obj_player *player) if(player->health < 0) // dont render dead players return; + if (prev->health < 0) + { + // Don't flicker from previous position + prev->x = player->x; + prev->y = player->y; + } + vec2 direction = get_direction(player->angle); float angle = player->angle/256.0f; vec2 position = mix(vec2(prev->x, prev->y), vec2(player->x, player->y), client_intratick()); @@ -1090,7 +1157,7 @@ void modc_render() { void *prev = snap_find_item(SNAP_PREV, item.type, item.id); if(prev) - render_projectile((obj_projectile *)prev, (obj_projectile *)data); + render_projectile((obj_projectile *)prev, (obj_projectile *)data, item.id); } else if(item.type == OBJTYPE_POWERUP) { |