adjust walkout anim length & masked anim blending
[carveJwlIkooP6JGAAIwe30JlM.git] / highscores.h
index 2ffaf6acdd19f90bea341182801835b31c181900..0c4ae54131fe58546f0a2798652a56d05af5d636 100644 (file)
@@ -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; i<vg_list_size(sys->dbheader.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 */