about summary refs log tree commit diff
path: root/src/game/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/client')
-rw-r--r--src/game/client/gc_client.cpp28
-rw-r--r--src/game/client/gc_client.h1
-rw-r--r--src/game/client/gc_effects.cpp54
-rw-r--r--src/game/client/gc_particles.cpp1
-rw-r--r--src/game/client/gc_render_obj.cpp45
5 files changed, 108 insertions, 21 deletions
diff --git a/src/game/client/gc_client.cpp b/src/game/client/gc_client.cpp
index 7b191fbf..2526ab83 100644
--- a/src/game/client/gc_client.cpp
+++ b/src/game/client/gc_client.cpp
@@ -1373,11 +1373,15 @@ void render_game()
 	{
 		gfx_mapscreen(0, 0, 300*gfx_screenaspect(), 300);
 		
-		float speed = distance(vec2(netobjects.local_prev_character->x, netobjects.local_prev_character->y),
-			vec2(netobjects.local_character->x, netobjects.local_character->y));
+		/*float speed = distance(vec2(netobjects.local_prev_character->x, netobjects.local_prev_character->y),
+			vec2(netobjects.local_character->x, netobjects.local_character->y));*/
+
+		float velspeed = length(vec2(netobjects.local_character->vx/256.0f, netobjects.local_character->vy/256.0f))*50;
+		
+		float ramp = velocity_ramp(velspeed, tuning.velramp_start, tuning.velramp_range, tuning.velramp_curvature);
 		
 		char buf[512];
-		str_format(buf, sizeof(buf), "%.2f %d", speed/2, netobj_num_corrections());
+		str_format(buf, sizeof(buf), "%.0f\n%.0f\n%.2f\n%d", velspeed, velspeed*ramp, ramp, netobj_num_corrections());
 		gfx_text(0, 150, 50, 12, buf, -1);
 	}
 
@@ -1481,6 +1485,24 @@ void render_game()
 				
 				count++;
 			}
+			
+			y = y+count*6;
+			
+			gfx_texture_set(-1);
+			gfx_blend_normal();
+			gfx_lines_begin();
+			float height = 50.0f;
+			float pv = 1;
+			for(int i = 0; i < 100; i++)
+			{
+				float speed = i/100.0f * 3000;
+				float ramp = velocity_ramp(speed, tuning.velramp_start, tuning.velramp_range, tuning.velramp_curvature);
+				float rampedspeed = (speed * ramp)/1000.0f;
+				gfx_lines_draw((i-1)*2, y+height-pv*height, i*2, y+height-rampedspeed*height);
+				//gfx_lines_draw((i-1)*2, 200, i*2, 200);
+				pv = rampedspeed;
+			}
+			gfx_lines_end();
 		}
 		
 		gfx_text_color(1,1,1,1);
diff --git a/src/game/client/gc_client.h b/src/game/client/gc_client.h
index e6145954..55a880ed 100644
--- a/src/game/client/gc_client.h
+++ b/src/game/client/gc_client.h
@@ -142,6 +142,7 @@ void effects_update();
 
 void effect_bullettrail(vec2 pos);
 void effect_smoketrail(vec2 pos, vec2 vel);
+void effect_skidtrail(vec2 pos, vec2 vel);
 void effect_explosion(vec2 pos);
 void effect_air_jump(vec2 pos);
 void effect_damage_indicator(vec2 pos, vec2 dir);
diff --git a/src/game/client/gc_effects.cpp b/src/game/client/gc_effects.cpp
index fcf7ac93..094392e5 100644
--- a/src/game/client/gc_effects.cpp
+++ b/src/game/client/gc_effects.cpp
@@ -2,7 +2,8 @@
 #include "gc_client.h"
 #include "../generated/gc_data.h"
 
-static bool add_trail = false;
+static bool add_50hz = false;
+static bool add_100hz = false;
 
 void effect_air_jump(vec2 pos)
 {
@@ -27,7 +28,7 @@ void effect_air_jump(vec2 pos)
 
 void effect_powerupshine(vec2 pos, vec2 size)
 {
-	if(!add_trail)
+	if(!add_50hz)
 		return;
 		
 	particle p;
@@ -48,7 +49,7 @@ void effect_powerupshine(vec2 pos, vec2 size)
 
 void effect_smoketrail(vec2 pos, vec2 vel)
 {
-	if(!add_trail)
+	if(!add_50hz)
 		return;
 		
 	particle p;
@@ -65,9 +66,28 @@ void effect_smoketrail(vec2 pos, vec2 vel)
 }
 
 
+void effect_skidtrail(vec2 pos, vec2 vel)
+{
+	if(!add_100hz)
+		return;
+	
+	particle p;
+	p.set_default();
+	p.spr = SPRITE_PART_SMOKE;
+	p.pos = pos;
+	p.vel = vel + random_dir()*50.0f;
+	p.life_span = 0.5f + frandom()*0.5f;
+	p.start_size = 24.0f + frandom()*12;
+	p.end_size = 0;
+	p.friction = 0.7f;
+	p.gravity = frandom()*-500.0f;
+	p.color = vec4(0.75f,0.75f,0.75f,1.0f);
+	particle_add(PARTGROUP_GENERAL, &p);	
+}
+
 void effect_bullettrail(vec2 pos)
 {
-	if(!add_trail)
+	if(!add_100hz)
 		return;
 		
 	particle p;
@@ -77,7 +97,7 @@ void effect_bullettrail(vec2 pos)
 	p.life_span = 0.25f + frandom()*0.25f;
 	p.start_size = 8.0f;
 	p.end_size = 0;
-	p.friction = 0.7;
+	p.friction = 0.7f;
 	particle_add(PARTGROUP_PROJECTILE_TRAIL, &p);
 }
 
@@ -170,14 +190,26 @@ void effect_explosion(vec2 pos)
 
 void effects_update()
 {
-	static float last_update = 0;
-	if(client_localtime()-last_update > 0.02f)
+	static float last_update_100hz = 0;
+	static float last_update_50hz = 0;
+
+	if(client_localtime()-last_update_100hz > 0.01f)
 	{
-		add_trail = true;
-		last_update = client_localtime();
-		flow_update();
+		add_100hz = true;
+		last_update_100hz = client_localtime();
 	}
 	else
-		add_trail = false;
+		add_100hz = false;
+
+	if(client_localtime()-last_update_50hz > 0.02f)
+	{
+		add_50hz = true;
+		last_update_50hz = client_localtime();
+	}
+	else
+		add_50hz = false;
+		
+	if(add_50hz)
+		flow_update();
 		
 }
diff --git a/src/game/client/gc_particles.cpp b/src/game/client/gc_particles.cpp
index bdeb26fd..a0b1ff92 100644
--- a/src/game/client/gc_particles.cpp
+++ b/src/game/client/gc_particles.cpp
@@ -107,6 +107,7 @@ void particle_update(float time_passed)
 					particles[first_free].prev_part = i;
 				particles[i].prev_part = -1;
 				particles[i].next_part = first_free;
+				first_free = i;
 			}
 			
 			i = next;
diff --git a/src/game/client/gc_render_obj.cpp b/src/game/client/gc_render_obj.cpp
index 73f58a85..839a5261 100644
--- a/src/game/client/gc_render_obj.cpp
+++ b/src/game/client/gc_render_obj.cpp
@@ -25,15 +25,29 @@ void render_projectile(const NETOBJ_PROJECTILE *current, int itemid)
 	gfx_quads_begin();
 
 	// get positions
-	float gravity = -400;
-	if(current->type != WEAPON_GRENADE)
-		gravity = -100;
+	float curvature = 0;
+	float speed = 0;
+	if(current->type == WEAPON_GRENADE)
+	{
+		curvature = tuning.grenade_curvature;
+		speed = tuning.grenade_speed;
+	}
+	else if(current->type == WEAPON_SHOTGUN)
+	{
+		curvature = tuning.shotgun_curvature;
+		speed = tuning.shotgun_speed;
+	}
+	else if(current->type == WEAPON_GUN)
+	{
+		curvature = tuning.gun_curvature;
+		speed = tuning.gun_speed;
+	}
 
 	float ct = (client_tick()-current->start_tick)/(float)SERVER_TICK_SPEED + client_ticktime()*1/(float)SERVER_TICK_SPEED;
 	vec2 startpos(current->x, current->y);
-	vec2 startvel(current->vx, current->vy);
-	vec2 pos = calc_pos(startpos, startvel, gravity, ct);
-	vec2 prevpos = calc_pos(startpos, startvel, gravity, ct-0.001f);
+	vec2 startvel(current->vx/100.0f, current->vy/100.0f);
+	vec2 pos = calc_pos(startpos, startvel, curvature, speed, ct);
+	vec2 prevpos = calc_pos(startpos, startvel, curvature, speed, ct-0.001f);
 
 	select_sprite(data->weapons[clamp(current->type, 0, NUM_WEAPONS-1)].sprite_proj);
 	vec2 vel = pos-prevpos;
@@ -295,6 +309,7 @@ void render_player(
 
 	bool stationary = player.vx < 1 && player.vx > -1;
 	bool inair = col_check_point(player.x, player.y+16) == 0;
+	bool want_other_dir = (player.wanted_direction == -1 && vel.x > 0) || (player.wanted_direction == 1 && vel.x < 0);
 
 	// evaluate animation
 	float walk_time = fmod(position.x, 100.0f)/100.0f;
@@ -305,7 +320,7 @@ void render_player(
 		anim_eval_add(&state, &data->animations[ANIM_INAIR], 0, 1.0f); // TODO: some sort of time here
 	else if(stationary)
 		anim_eval_add(&state, &data->animations[ANIM_IDLE], 0, 1.0f); // TODO: some sort of time here
-	else
+	else if(!want_other_dir)
 		anim_eval_add(&state, &data->animations[ANIM_WALK], walk_time, 1.0f);
 
 	if (player.weapon == WEAPON_HAMMER)
@@ -318,6 +333,22 @@ void render_player(
 		float a = clamp((client_tick()-player.attacktick+ticktime)/40.0f, 0.0f, 1.0f);
 		anim_eval_add(&state, &data->animations[ANIM_NINJA_SWING], a, 1.0f);
 	}
+	
+	// do skidding
+	if(!inair && want_other_dir && length(vec2(prev.vx/256.0f, prev.vy/256.0f)*50) > 500.0f)
+	{
+		static int64 skid_sound_time = 0;
+		if(time_get()-skid_sound_time > time_freq()/10)
+		{
+			snd_play_random(CHN_WORLD, SOUND_PLAYER_SKID, 0.25f, position);
+			skid_sound_time = time_get();
+		}
+		
+		effect_skidtrail(
+			position+vec2(-player.wanted_direction*6,12),
+			vec2(-player.wanted_direction*100*length(vel),-50)
+		);
+	}
 
 	// draw hook
 	if (prev.hook_state>0 && player.hook_state>0)