about summary refs log tree commit diff
path: root/src/game/client
diff options
context:
space:
mode:
authorOlle Rosenquist <phobos99@gmail.com>2007-07-21 21:17:38 +0000
committerOlle Rosenquist <phobos99@gmail.com>2007-07-21 21:17:38 +0000
commit1120a86b252d0d526b634552c8c2fe2611a9bd15 (patch)
tree0f68c062292c96b9ab045e284414f3d5b554a17f /src/game/client
parentb6c9c311c5008b6f4be5c483d14847a3485a3ae4 (diff)
downloadzcatch-1120a86b252d0d526b634552c8c2fe2611a9bd15.tar.gz
zcatch-1120a86b252d0d526b634552c8c2fe2611a9bd15.zip
Updated stuff
Diffstat (limited to 'src/game/client')
-rw-r--r--src/game/client/game_client.cpp73
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)
 		{