{ .path = "sound/ding.ogg", .source_mode=k_audio_source_compressed };
audio_clip audio_jumps[] = {
- { .path = "sound/snap0.ogg", .source_mode=k_audio_source_compressed, },
- { .path = "sound/snap1.ogg", .source_mode=k_audio_source_compressed, },
- { .path = "sound/snap2.ogg", .source_mode=k_audio_source_compressed, },
- { .path = "sound/snap3.ogg", .source_mode=k_audio_source_compressed, }
+ { .path = "sound/jump0.ogg", .source_mode=k_audio_source_compressed, },
+ { .path = "sound/jump1.ogg", .source_mode=k_audio_source_compressed, },
+ { .path = "sound/jump2.ogg", .source_mode=k_audio_source_compressed, },
+ { .path = "sound/jump3.ogg", .source_mode=k_audio_source_compressed, }
+};
+
+audio_clip audio_footsteps[] = {
+ {.path = "sound/step_concrete0.ogg", .source_mode=k_audio_source_compressed,},
+ {.path = "sound/step_concrete1.ogg", .source_mode=k_audio_source_compressed,},
+ {.path = "sound/step_concrete2.ogg", .source_mode=k_audio_source_compressed,},
+ {.path = "sound/step_concrete3.ogg", .source_mode=k_audio_source_compressed,}
};
audio_clip audio_lands[] = {
audio_clip_loadn( &audio_gate_ambient, 1 );
audio_clip_loadn( audio_jumps, vg_list_size(audio_jumps) );
audio_clip_loadn( audio_lands, vg_list_size(audio_lands) );
+ audio_clip_loadn( audio_footsteps, vg_list_size(audio_footsteps) );
audio_lock();
u32 flags = AUDIO_FLAG_LOOP|AUDIO_FLAG_SPACIAL_3D;
class classtype_route(Structure):
_pack_ = 1
- _fields_ = [("pstr_name",c_uint32),
- ("id_start",c_uint32),
+ _fields_ = [("id_start",c_uint32),
("colour",c_float*3)]
class classtype_skin(Structure):
("angle_limits",(c_float*3)*2),
("hitbox",(c_float*3)*2)]
-class subclass_audio_channel(Structure):
- _pack_ = 1
- _fields_ = [("sound",c_uint32),
- ("target",c_uint32),
- ("")]
-
-class classtype_audio_system(Structure):
- _pack_ = 1
- _fields_ = [("sounds", subclass_audio_channel * 4),
- ("len", c_uint32)]
-
-class classtype_audio_zone(Structure):
- _pack_ = 1
- _fields_ = [("system",c_uint32)]
-
# Exporter
# ==============================================================================
node.classtype = 9
entdata_length += sizeof( classtype_route )
r = classtype_route()
- r.pstr_name = emplace_string("not-implemented")
r.colour[0] = obj.cv_data.colour[0]
r.colour[1] = obj.cv_data.colour[1]
r.colour[2] = obj.cv_data.colour[2]
return 1;
}
+static highscore_record *highscore_find_user_record( u64 playerid, u32 trackid )
+{
+ struct highscore_system *sys = &highscore_system;
+
+ highscore_track_table *table = &sys->dbheader.tracks[trackid];
+ highscore_record temp;
+ temp.playerid = playerid;
+
+ aatree_ptr find =
+ aatree_find( &sys->aainfo_playerid, table->root_playerid, &temp );
+
+ if( find == AATREE_PTR_NIL )
+ return NULL;
+
+ return aatree_get_data( &sys->aainfo_playerid, find );
+}
+
static aatree_ptr highscores_push_record( highscore_record *record )
{
struct highscore_system *sys = &highscore_system;
highscore_strl( line+3, inf->nickname, 10 );
}
- u16 miliseconds = record->time,
- seconds = miliseconds / 100,
- minutes = seconds / 60;
+ u16 centiseconds = record->time,
+ seconds = centiseconds / 100,
+ minutes = seconds / 60;
- miliseconds %= 100;
+ centiseconds %= 100;
seconds %= 60;
minutes %= 60;
line[15] = ':';
highscore_intr( line+16, seconds, 2, '0' );
line[18] = '.';
- highscore_intr( line+19, miliseconds, 2, '0' );
+ highscore_intr( line+19, centiseconds, 2, '0' );
/* Score */
- highscore_intl( line+22, record->time, 5 );
+ highscore_intl( line+22, record->points, 5 );
it = aatree_next( &sys->aainfo_time, it );
}
}
static int cl_ui = 1;
/* Components */
-//#define SR_NETWORKED
+#define SR_NETWORKED
/* uncomment this to run the game without any graphics being drawn */
//#define SR_NETWORK_TEST
int main( int argc, char *argv[] )
{
+ highscores_init( 2000, 50 );
vg_init( argc, argv, "Voyager Game Engine" );
}
vg_tex2d_free( texture_list, vg_list_size(texture_list) );
/* TODO: THE REST OF THE GOD DAMN FREEING STUFF */
steam_end();
+
+ highscores_serialize_all();
+ highscores_free();
}
void vg_update(void)
struct classtype_route
{
- u32 pstr_name;
u32 id_start;
v3f colour;
};
/*
* Interface
*/
-#define SR_USE_LOCALHOST
+//#define SR_USE_LOCALHOST
/* Call it at start; Connects us to the gameserver */
static void network_init(void);
{
vg_info( "Sending scores\n" );
u32 size = sizeof(netmsg_set_score) +
- 1 * sizeof(struct netmsg_score_record);
-
+ vg_list_size(track_infos)*sizeof(struct netmsg_score_record);
netmsg_set_score *setscore = alloca( size );
setscore->inetmsg_id = k_inetmsg_set_score;
- setscore->record_count = 1;
- setscore->records[0].trackid = 0;
- setscore->records[0].playerid = 0;
- setscore->records[0].points = 1386;
- setscore->records[0].time = 19432;
+
+ int count = 0;
+ for( u32 i=0; i<vg_list_size(track_infos); i++ )
+ {
+ if( track_infos[i].push )
+ {
+ track_infos[i].push = 0;
+ highscore_record *user_record = highscore_find_user_record( 0, i );
+
+ if( !user_record )
+ {
+ vg_error( "No score set but tried to upload for track %u\n", i );
+ continue;
+ }
+
+ setscore->records[count].trackid = i;
+ setscore->records[count].playerid = 0;
+ setscore->records[count].points = user_record->points;
+ setscore->records[count].time = user_record->time;
+
+ count ++;
+ }
+ }
+
+ if( count == 0 )
+ return;
+
+ u32 send_size = sizeof(netmsg_set_score) +
+ count*sizeof(struct netmsg_score_record);
+ setscore->record_count = count;
SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
- hSteamNetworkingSockets, cremote, setscore, size,
+ hSteamNetworkingSockets, cremote, setscore, send_size,
k_nSteamNetworkingSend_Reliable, NULL );
}
nick.inetmsg_id = k_inetmsg_set_nickname;
memset( nick.nickname, 0, 10 );
- strcpy( nick.nickname, "real H" );
+ strcpy( nick.nickname, "Harry" );
SteamAPI_ISteamNetworkingSockets_SendMessageToConnection(
hSteamNetworkingSockets, cremote, &nick, sizeof(netmsg_set_nickname),
fsetup,
walk_timer,
fonboard;
+
+ v3f last_step_pos;
+ int step_phase;
}
player =
{
}
}
}
+
+ player.in_air = len==0?1:0;
v3_zero( player.rb.w );
q_axis_angle( player.rb.q, (v3f){0.0f,1.0f,0.0f}, -player.angles[0] );
v3_muladds( player.rb.v, forward_dir, diff, player.rb.v );
/* TODO move */
- float walk_norm = (float)player.mdl.anim_walk->length / 30.0f,
- run_norm = (float)player.mdl.anim_run->length / 30.0f;
+ float walk_norm = 30.0f/(float)player.mdl.anim_walk->length,
+ run_norm = 30.0f/(float)player.mdl.anim_run->length ;
player.walk_timer += ktimestep * vg_lerpf( walk_norm,run_norm,move_norm );
}
audio_lock();
audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
audio_player_set_position( &audio_player_extra, player.rb.co );
- audio_player_set_vol( &audio_player_extra, 3.0f );
+ audio_player_set_vol( &audio_player_extra, 20.0f );
audio_player_playclip( &audio_player_extra, &audio_jumps[rand()%4] );
audio_unlock();
}
mdl_keyframe apose[32], bpose[32];
struct skeleton *sk = &player.mdl.sk;
- float walk_norm = 30.0f/(float)player.mdl.anim_walk->length,
- run_norm = 30.0f/(float)player.mdl.anim_run->length,
+ float walk_norm = (float)player.mdl.anim_walk->length/30.0f,
+ run_norm = (float)player.mdl.anim_run->length/30.0f,
t = player.walk_timer,
l = vg_get_axis("grabr") * 0.5f + 0.5f;
skeleton_sample_anim( sk, player.mdl.anim_walk, t*walk_norm, apose );
- skeleton_sample_anim( sk, player.mdl.anim_run, t*run_norm, bpose );
+ skeleton_sample_anim( sk, player.mdl.anim_run, t*run_norm, bpose );
skeleton_lerp_pose( sk, apose, bpose, l, apose );
audio_lock();
double revert_delta = vg_time - last_revert;
- if( (!_air && l2) && (fabsf(player.slip) > 0.5f) && (revert_delta > 0.7) )
+ if( player.on_board && (!_air && l2) && (fabsf(player.slip) > 0.5f) &&
+ (revert_delta > 0.7) )
{
audio_player_set_position( &audio_player_extra, player.rb.co );
audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
audio_player_set_vol( &audio_player0, 0.0f );
audio_player_set_vol( &audio_player1, 0.0f );
audio_player_set_vol( &audio_player2, 0.0f );
+
+ int walk_phase = 0;
+ if( vg_fractf(player.walk_timer) > 0.5f )
+ walk_phase = 1;
+ else
+ walk_phase = 0;
+
+ if( (player.step_phase != walk_phase) && !player.in_air )
+ {
+ v3_copy( player.rb.co, player.last_step_pos );
+
+ audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
+ audio_player_set_position( &audio_player_extra, player.rb.co );
+ audio_player_set_vol( &audio_player_extra, 6.0f );
+ audio_player_playclip( &audio_player_extra,
+ &audio_footsteps[rand()%4] );
+ }
+
+ player.step_phase = walk_phase;
}
else
{
instance_cache_cap;
v3f render_gate_pos;
+ int active_route_board;
}
world;
{
world_routes_update();
world_routes_debug();
+
+
sfd_update( &world.sfd.tester );
#if 0
render_world_alphatest( projection, camera[3] );
render_terrain( projection, camera[3] );
- m4x3f identity_matrix;
- m4x3_identity( identity_matrix );
- identity_matrix[3][1] = 125.0f;
+ int closest = 0;
+ float min_dist = INFINITY;
- v4f t;
- q_axis_angle( t, (v3f){0.0f,1.0f,0.0f}, 2.3f );
- q_m3x3( t, identity_matrix );
+ for( int i=0; i<world.routes.route_count; i++ )
+ {
+ float dist = v3_dist2( world.routes.routes[i].scoreboard_transform[3],
+ camera[3] );
+
+ if( dist < min_dist )
+ {
+ min_dist = dist;
+ closest = i;
+ }
+ }
- //sfd_render( &world.sfd.tester, projection, camera[3], identity_matrix );
+ sfd_render( &world.sfd.tester, projection, camera[3],
+ world.routes.routes[closest].scoreboard_transform );
}
static void render_world_depth( m4x4f projection, m4x3f camera )
static struct track_info
{
const char *name;
+ int push;
}
track_infos[] =
{
{
- .name = "Megapark Green"
+ .name = "Megapark Green",
+ .push = 1
},
{
- .name = "Megapark Blue"
+ .name = "Megapark Blue",
+ .push = 1
},
{
- .name = "Megapark Yellow"
+ .name = "Megapark Yellow",
+ .push = 1
},
{
- .name = "Megapark Red"
+ .name = "Megapark Red",
+ .push = 1
+ },
+ {
+ .name = "Town Coast (Blue)",
+ .push = 1
+ },
+ {
+ .name = "Town Downhill (Orange)",
+ .push = 1
}
};
#include "common.h"
#include "model.h"
#include "gate.h"
+#include "world_info.h"
+#include "highscores.h"
#include "shaders/vblend.h"
#include "shaders/route.h"
struct route
{
- const char *name;
+ u32 track_id;
v4f colour;
u32 start;
float xpos;
}
ui;
+
+ m4x3f scoreboard_transform;
}
*routes;
pr->ui.xpos = vg_lerpf( pr->ui.xpos, -main_block_size * 0.5f, 0.03f );
}
+static void world_routes_local_set_record( u32 route, double lap_time )
+{
+ vg_success( " NEW LAP TIME: %f\n", lap_time );
+
+ struct subworld_routes *r = subworld_routes();
+ struct route *pr = &r->routes[route];
+
+ if( pr->track_id != 0xffffffff )
+ {
+ double time_centiseconds = lap_time * 100.0;
+ if( time_centiseconds > (float)0xfffe )
+ return;
+
+ highscore_record temp;
+ temp.trackid = pr->track_id;
+ temp.datetime = time(NULL);
+ temp.playerid = 0;
+ temp.points = 0;
+ temp.time = time_centiseconds;
+
+ highscores_push_record( &temp );
+ track_infos[ pr->track_id ].push = 1;
+ }
+ else
+ {
+ vg_warn( "There is no associated track for this record...\n" );
+ }
+}
+
/*
* Will scan the whole run for two things;
* 1: we set a new record for the total, complete loop around the course
if( verified )
{
- vg_success( " NEW LAP TIME: %f\n", lap_time );
+ world_routes_local_set_record( route, lap_time );
world_routes_ui_popfirst(route);
pr->ui.fade_count ++;
}
v3_copy( inf->colour, route->colour );
route->colour[3] = 1.0f;
- route->name = NULL;
+
+ route->track_id = 0xffffffff;
+ for( u32 j=0; j<vg_list_size(track_infos); j++ )
+ {
+ if( !strcmp( mdl_pstr(mdl,pnode->pstr_name), track_infos[j].name ))
+ {
+ route->track_id = j;
+ break;
+ }
+ }
+
route->start = inf->id_start;
route->active = 0;
route->factive = 0.0f;
+ mdl_node_transform( pnode, route->scoreboard_transform );
/* OpenGL strips */
glGenVertexArrays( 1, &route->ui.vao );