X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=highscores.h;h=0c4ae54131fe58546f0a2798652a56d05af5d636;hb=fbc68c65e01838feb77f47b30994b45fcc39ebaf;hp=2ffaf6acdd19f90bea341182801835b31c181900;hpb=5ee174baa9b2c30e01dc0ca0dfa38f916f805636;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/highscores.h b/highscores.h index 2ffaf6a..0c4ae54 100644 --- a/highscores.h +++ b/highscores.h @@ -1,8 +1,13 @@ +/* + * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved + */ + #ifndef HIGHSCORES_H #define HIGHSCORES_H #include "vg/vg_store.h" #include "vg/vg_stdint.h" +#include "world_info.h" /* * Designed to be used across client and server, @@ -14,15 +19,28 @@ typedef struct highscore highscore; typedef struct highscore_record highscore_record; typedef struct highscore_track_table highscore_track_table; typedef struct highscore_database highscore_database; +typedef struct highscore_playerinfo highscore_playerinfo; #pragma pack(push,1) + +struct highscore_playerinfo +{ + char nickname[16]; + u64 playerid; + + union + { + aatree_pool_node aapn; + aatree_node aa_playerid; + }; +}; + struct highscore_record { u16 trackid, points, time, reserved0; u64 playerid; u32 datetime; - - u32 reserved[7]; + u32 reserved1; union { @@ -35,12 +53,7 @@ struct highscore_record } aa; - struct - { - /* TODO pool allocator */ - u32 next, prev; - } - pool; + aatree_pool_node pool; }; }; @@ -58,8 +71,11 @@ struct highscore_database { highscore_track_table tracks[ 128 ]; - aatree_ptr pool_head; - u32 reserved[63]; + aatree_ptr pool_head, playerinfo_head; + u32 entry_capacity, + playerinfo_capacity, playerinfo_root; + + u32 reserved[59]; }; #pragma pack(pop) @@ -71,201 +87,26 @@ static struct highscore_system aainfo_points, aainfo_time, aainfo_playerid, - aainfo_datetime; - - void *data; -} -highscore_system; - -static int highscore_cmp_points( void *a, void *b ) -{ - highscore_record *pa = a, *pb = b; - return (int)pa->points - (int)pb->points; -} - -static int highscore_cmp_datetime( void *a, void *b ) -{ - highscore_record *pa = a, *pb = b; - - if( pa->datetime == pb->datetime ) return 0; - return pa->datetime < pb->datetime? 1: -1; -} - -static int highscore_cmp_time( void *a, void *b ) -{ - highscore_record *pa = a, *pb = b; - return (int)pb->time - (int)pa->time; -} - -static int highscore_cmp_playerid( void *a, void *b ) -{ - highscore_record *pa = a, *pb = b; - if( pa->playerid == pb->playerid ) return 0; - return pa->playerid < pb->playerid? -1: 1; -} - -static int highscores_init( u32 pool_size ) -{ - struct highscore_system *sys = &highscore_system; - - size_t requested_mem = pool_size * sizeof(highscore_record); - sys->data = malloc( requested_mem ); - - requested_mem /= 1024; - requested_mem /= 1024; - - if( !highscore_system.data ) - { - vg_error( "Could not allocated %dmb of memory for database\n", - requested_mem ); - return 0; - } - else - vg_success( "Allocated %dmb for database\n", requested_mem ); - - /* This is ugly.. too bad! */ - sys->aainfo.base = highscore_system.data; - sys->aainfo.stride = sizeof(highscore_record); - sys->aainfo.offset = offsetof(highscore_record,pool); - sys->aainfo.p_cmp = NULL; - - sys->aainfo_datetime.base = highscore_system.data; - sys->aainfo_datetime.stride = sizeof(highscore_record); - sys->aainfo_datetime.offset = offsetof(highscore_record,aa.datetime); - sys->aainfo_datetime.p_cmp = highscore_cmp_datetime; - - sys->aainfo_points.base = highscore_system.data; - sys->aainfo_points.stride = sizeof(highscore_record); - sys->aainfo_points.offset = offsetof(highscore_record,aa.points); - sys->aainfo_points.p_cmp = highscore_cmp_points; + aainfo_datetime, + aainfo_playerinfo_playerid, + aainfo_playerinfo; - sys->aainfo_time.base = highscore_system.data; - sys->aainfo_time.stride = sizeof(highscore_record); - sys->aainfo_time.offset = offsetof(highscore_record,aa.time); - sys->aainfo_time.p_cmp = highscore_cmp_time; + void *data, + *playerinfo_data; - sys->aainfo_playerid.base = highscore_system.data; - sys->aainfo_playerid.stride = sizeof(highscore_record); - sys->aainfo_playerid.offset = offsetof(highscore_record,aa.playerid); - sys->aainfo_playerid.p_cmp = highscore_cmp_playerid; - - - /* TODO: Load from disk if avalible */ - if( 0 ) - { - - } - else - { - vg_info( "Initializing database nodes\n" ); - sys->dbheader.pool_head = aatree_init_pool( &sys->aainfo, pool_size ); - - for( int i=0; idbheader.tracks); i++ ) - { - highscore_track_table *table = &sys->dbheader.tracks[i]; - table->root_points = AATREE_PTR_NIL; - table->root_playerid = AATREE_PTR_NIL; - table->root_time = AATREE_PTR_NIL; - table->root_datetime = AATREE_PTR_NIL; - } - } - - return 1; + u32 pool_size, playerinfo_pool_size; } +highscore_system; -static void highscores_free(void) -{ - free( highscore_system.data ); -} - -static aatree_ptr highscores_push_record( highscore_record *record ) -{ - struct highscore_system *sys = &highscore_system; - - /* TODO: Verify steam ID */ - vg_log( "Inserting record into database for track %hu\n",record->trackid ); - - if( record->trackid >= vg_list_size(sys->dbheader.tracks) ) - { - vg_error( "TrackID out of range (%hu>=%d)\n", record->trackid, - vg_list_size(sys->dbheader.tracks) ); - - return AATREE_PTR_NIL; - } - - /* Search for existing record on this track */ - highscore_track_table *table = &sys->dbheader.tracks[record->trackid]; - aatree_ptr existing = aatree_find( &sys->aainfo_playerid, - table->root_playerid, - record ); - - if( existing != AATREE_PTR_NIL ) - { - vg_log( "Freeing existing record for player %lu\n", record->playerid ); - table->root_playerid = aatree_del( &sys->aainfo_playerid, existing ); - table->root_datetime = aatree_del( &sys->aainfo_datetime, existing ); - table->root_points = aatree_del( &sys->aainfo_points, existing ); - table->root_time = aatree_del( &sys->aainfo_time, existing ); - - aatree_pool_free( &sys->aainfo, existing, &sys->dbheader.pool_head ); - } - - aatree_ptr index = - aatree_pool_alloc( &sys->aainfo, &sys->dbheader.pool_head ); - - if( index == AATREE_PTR_NIL ) - return index; - - highscore_record *dst = aatree_get_data( &sys->aainfo, index ); - memset( dst, 0, sizeof(highscore_record) ); - - dst->trackid = record->trackid; - dst->datetime = record->datetime; - dst->playerid = record->playerid; - dst->points = record->points; - dst->time = record->time; - - table->root_time = - aatree_insert( &sys->aainfo_time, table->root_time, index ); - table->root_datetime = - aatree_insert( &sys->aainfo_datetime, table->root_datetime, index ); - table->root_playerid = - aatree_insert( &sys->aainfo_playerid, table->root_playerid, index ); - table->root_points = - aatree_insert( &sys->aainfo_points, table->root_points, index ); - - return index; -} - -static void _highscore_showtime( void *data ) -{ - highscore_record *record = data; - printf( "%hu", record->time ); -} - -static void highscores_print_track( u32 trackid, u32 count ) -{ - struct highscore_system *sys = &highscore_system; - - highscore_track_table *table = &sys->dbheader.tracks[ trackid ]; - aatree_ptr it = aatree_kth( &sys->aainfo_time, table->root_time, 0 ); - - vg_info( "Highscores, top %u records for track %u\n", count, trackid ); - vg_info( "==============================================\n" ); - - int i=0; - while( it != AATREE_PTR_NIL && i < 10 ) - { - highscore_record *record = aatree_get_data( &sys->aainfo_time, it ); - vg_info( " [%d]: player(%lu), time: %hu, score: %hu, track:%hu\n", - i+1, record->playerid, record->time, record->points, - record->trackid ); - - i++; - it = aatree_next( &sys->aainfo_time, it ); - } - - vg_info( "==============================================\n" ); -} +static int highscore_intr( char *buf, int value, int len, char alt ); +static int highscore_intl( char *buf, int value, int len ); +static void highscores_board_printf( FILE *fp, const char *buf, u32 count ); +static aatree_ptr highscore_set_user_nickname( u64 steamid, char nick[16] ); +static aatree_ptr highscores_push_record( highscore_record *record ); +static void highscores_board_generate( char *buf, u32 id, u32 count ); +static void highscores_init( u32 pool_size, u32 playerinfo_pool_size ); +static int highscores_read( const char *path ); +static void highscores_create_db(void); +static int highscores_serialize_all(void); #endif /* HIGHSCORES_H */