if( (type == k_netmsg_playeritem_world0) ||
(type == k_netmsg_playeritem_world1) ){
- addon_reg *reg = world_static.addon_hub;
-
- if( type == k_netmsg_playeritem_world1 )
- reg = world_static.addon_client;
+ enum world_purpose purpose = type - k_netmsg_playeritem_world0;
+ addon_reg *reg = world_static.instance_addons[ purpose ];
if( reg )
addon_alias_uid( ®->alias, item->uid );
u8 type_index;
char uid[];
};
-typedef enum netmsg_playeritem_type netmsg_playeritem_type;
enum netmsg_playeritem_type {
k_netmsg_playeritem_board = 0,
k_netmsg_playeritem_player,
player__debugtext( 2, "instance #%u", world_static.active_instance );
- char buf_hub[96],
- buf_client[96];
- if( world_static.addon_client )
- addon_alias_uid( &world_static.addon_client->alias, buf_client );
- else
- strcpy( buf_client, "none" );
-
- if( world_static.addon_hub )
- addon_alias_uid( &world_static.addon_hub->alias, buf_hub );
- else
- strcpy( buf_hub, "none" );
-
- player__debugtext( 1, "hub uid: %s", buf_hub );
- player__debugtext( 1, "client uid: %s", buf_client );
+ char buf[96];
+ for( u32 i=0; i<k_world_max; i++ ){
+ if( world_static.instance_addons[ i ] )
+ addon_alias_uid( &world_static.instance_addons[ i ]->alias, buf );
+ else
+ strcpy( buf, "none" );
+
+ player__debugtext( 1, "world #%u: %s", i, buf );
+ }
+
player__debugtext( 2, "director" );
player__debugtext( 1, "activity: %s",
(const char *[]){ [k_skaterift_menu] = "menu",
static void relink_remote_player_worlds( u32 client_id ){
struct network_player *player = &netplayers.list[client_id];
- player->hub_match = 0;
- player->client_match = 0;
-
- addon_alias q0,q1;
- addon_uid_to_alias( player->items[k_netmsg_playeritem_world0], &q0 );
- addon_uid_to_alias( player->items[k_netmsg_playeritem_world1], &q1 );
+ addon_alias q[2];
+ addon_uid_to_alias( player->items[k_netmsg_playeritem_world0], &q[0] );
+ addon_uid_to_alias( player->items[k_netmsg_playeritem_world1], &q[1] );
/*
* currently in 10.23, the hub world will always be the same.
* this might but probably wont change in the future
*/
- if( world_static.addon_hub )
- if( addon_alias_eq( &q0, &world_static.addon_hub->alias ) )
- player->hub_match = 1;
+ for( u32 i=0; i<k_world_max; i++ ){
+ addon_reg *reg = world_static.instance_addons[ i ];
+
+ player->world_match[i] = 0;
- if( world_static.addon_client )
- if( addon_alias_eq( &q1, &world_static.addon_client->alias ) )
- player->client_match = 1;
+ if( reg ){
+ if( addon_alias_eq( &q[i], &world_static.instance_addons[i]->alias ) )
+ player->world_match[i] = 1;
+ }
+ }
}
/*
memcpy( board_pose, &pose0.board, sizeof(*board_pose) );
}
- if( instance_id ){
- if( player->client_match ){
- player->active_world = &world_static.instances[ instance_id ];
- }
- }
- else{
- if( player->hub_match ){
- player->active_world = &world_static.instances[ instance_id ];
- }
- }
+ if( player->world_match[ instance_id ] )
+ player->active_world = &world_static.instances[ instance_id ];
}
/*
/* this is set IF they exist in a world that we have loaded */
world_instance *active_world;
- int hub_match, client_match;
+ int world_match[ k_world_max ];
/* TODO: Compression with server code */
char username[ NETWORK_USERNAME_MAX ];
enum world_purpose which ){
file->path[0] = '\0';
file->len = 0;
- addon_reg *reg = NULL;
- if( which == k_world_purpose_hub ) reg = world_static.addon_hub;
- else reg = world_static.addon_client;
+ addon_reg *reg = world_static.instance_addons[ which ];
if( !reg ){
vg_error( "Tried to save unspecified world (reg was null)\n" );
vg_msg_frame( &sav, "world" );
{
- addon_reg *reg = world_static.addon_client;
+ addon_reg *reg = world_static.instance_addons[ k_world_purpose_client ];
if( reg && (world_static.active_instance > 0) ){
skaterift_write_addon_alias( &sav, "alias", ®->alias );
}
if( !vg_loader_availible() ) return 0;
u32 save_files = 2;
- if( world_static.addon_client )
+ if( world_static.instance_addons[ k_world_purpose_client ] )
save_files ++;
vg_linear_clear( vg_async.buffer );
skaterift_populate_main_savedata( &group->files[0] );
skaterift_populate_world_savedata( &group->files[1], k_world_purpose_hub );
- if( world_static.addon_client )
+ if( world_static.instance_addons[ k_world_purpose_client ] ){
skaterift_populate_world_savedata( &group->files[2],
k_world_purpose_client );
+ }
if( async )
vg_loader_start( (void *)savedata_group_write, group );
static void skaterift_world_get_save_path( enum world_purpose which,
char buf[128] ){
- addon_reg *reg;
-
- if( which == k_world_purpose_hub ) reg = world_static.addon_hub;
- else reg = world_static.addon_client;
-
+ addon_reg *reg = world_static.instance_addons[ which ];
assert( reg );
char id[76];
snprintf( buf, 128, "savedata/%s.bkv", id );
}
-
#include "world_entity.c"
#include "world_gate.c"
#include "world_gen.c"
};
enum world_purpose{
- k_world_purpose_hub,
- k_world_purpose_client
-}
-purpose;
+ k_world_purpose_hub = 0,
+ k_world_purpose_client = 1,
+ k_world_max
+};
typedef struct world_instance world_instance;
u32 active_trigger_volumes[8];
u32 active_trigger_volume_count;
- world_instance instances[4];
- i32 active_instance;
+ addon_reg *instance_addons[ k_world_max ];
+ world_instance instances[ k_world_max ];
+
+ enum world_purpose active_instance;
u32 focused_entity; /* like skateshop, challenge.. */
f32 focus_strength;
camera focus_cam;
ent_objective *challenge_target;
f32 challenge_timer;
- addon_reg *addon_hub,
- *addon_client;
-
enum world_loader_state{
k_world_loader_none,
k_world_loader_preload,
*/
static void skaterift_world_load_thread( void *_args ){
struct world_load_args *args = _args;
- enum world_purpose purpose = args->purpose;
- addon_reg *reg = args->reg;
- if( purpose == k_world_purpose_hub ) world_static.addon_hub = reg;
- else world_static.addon_client = reg;
+ addon_reg *reg = args->reg;
+ world_static.instance_addons[ args->purpose ] = reg;
char path_buf[4096];
vg_str path;
return;
}
- char worlds[3][4096];
+ char worlds[k_world_max-1][4096];
u32 i=0;
vg_dir dir;
if( !ext ) continue;
if( strcmp(ext,".mdl") ) continue;
- if( i == 3 ){
+ if( i == k_world_max-1 ){
vg_warn( "There are too many .mdl files in the map folder!(3)\n" );
break;
}
}
u32 instance_start = 0, instance_count = 1;
- if( purpose == k_world_purpose_client ) instance_start = 1;
+ if( args->purpose == k_world_purpose_client ) instance_start = 1;
world_instance_load_mdl( instance_start, worlds[first_index] );
data->instance_start = instance_start;
data->instance_count = instance_count;
- skaterift_world_get_save_path( purpose, data->save.path );
+ skaterift_world_get_save_path( args->purpose, data->save.path );
savedata_file_read( &data->save );
vg_async_dispatch( final_call, skaterift_world_load_done );
/* holding pattern before we can start loading the new world, since we might be
* waiting for audio to stop */
static void skaterift_change_client_world_preupdate(void){
- for( u32 i=1; i<vg_list_size(world_static.instances); i++ ){
+ for( u32 i=1; i<k_world_max; i++ ){
world_instance *inst = &world_static.instances[i];
if( inst->status == k_world_status_unloading ){
struct world_load_args *args =
vg_linear_alloc( vg_async.buffer, sizeof(struct world_load_args) );
args->purpose = k_world_purpose_client;
- args->reg = world_static.addon_client;
+ args->reg = world_static.instance_addons[ k_world_purpose_client ];
/* this is replaces the already correct reg but we have to set it again
* TOO BAD */
if( world_static.active_instance != 0 )
vg_error( "Cannot change worlds while in non-root world\n" );
else{
- if( world_static.addon_client == reg ){
+ if( world_static.instance_addons[ k_world_purpose_client ] == reg ){
vg_warn( "World is already loaded\n" );
return;
}
}
}
- world_static.addon_client = reg;
+ world_static.instance_addons[ k_world_purpose_client ] = reg;
network_send_item( k_netmsg_playeritem_world1 );
relink_all_remote_player_worlds();
}
/*
* Free all resources for world instance
*/
-static void world_free( world_instance *world )
-{
+static void world_free( world_instance *world ){
vg_info( "Free world @%p\n", world );
/* free meshes */
* reset the world structure without deallocating persistent buffers
* TODO: Make this a memset(0), and have persistent items live in a static loc
*/
-static void world_init_blank( world_instance *world )
-{
+static void world_init_blank( world_instance *world ){
memset( &world->meta, 0, sizeof(mdl_context) );
world->textures = NULL;
static void async_world_render_init( void *payload, u32 size )
{
vg_info( "Allocate uniform buffers\n" );
- for( int i=0; i<4; i++ ){
+ for( int i=0; i<k_world_max; i++ ){
world_instance *world = &world_static.instances[i];
world->ubo_bind_point = i;
}
vg_info( "Allocate frame buffers\n" );
- for( int i=0; i<4; i++ ){
+ for( int i=0; i<k_world_max; i++ ){
world_instance *world = &world_static.instances[i];
struct framebuffer *fb = &world->heightmap;
}
}
- addon_alias *alias = &world_static.addon_hub->alias;
- if( world_static.active_instance )
- alias = &world_static.addon_client->alias;
+ addon_alias *alias =
+ &world_static.instance_addons[ world_static.active_instance ]->alias;
- /* TODO: we should probably generate this once. and also ditch
- * sub-worlds */
char mod_uid[ ADDON_UID_MAX ];
- addon_alias_uid( &world_static.addon_client->alias, mod_uid );
+ addon_alias_uid( alias, mod_uid );
network_publish_laptime( mod_uid,
mdl_pstr( &world->meta, route->pstr_name ),
lap_time );
vg_info( "Distributed %u points over %fkm^2!\n",
pcbuf->count, area/1e6f );
- world_write_preview( instance_id? world_static.addon_client:
- world_static.addon_hub,
- pcbuf );
+ world_write_preview( world_static.instance_addons[ instance_id ], pcbuf );
vg_async_dispatch( call_pointcloud, async_pointcloud_sub );
}
return (float)value;
}
-static void sfd_encode( u32 row, const char *str )
-{
+static void sfd_encode( u32 row, const char *str ){
int end=0;
u32 row_h = world_sfd.h -1 -row;
world_sfd.active_route_board = closest;
ent_route *route = mdl_arritm( &world->ent_route, closest );
- addon_reg *world_reg = world_static.addon_hub;
- if( world_static.active_instance )
- world_reg = world_static.addon_client;
+ addon_reg *world_reg =
+ world_static.instance_addons[ world_static.active_instance ];
char mod_uid[ ADDON_UID_MAX ];
addon_alias_uid( &world_reg->alias, mod_uid );
mod_uid,
mdl_pstr( &world->meta, route->pstr_name ),
0 );
-#if 0
- u32 id = route->anon.official_track_id;
-
- if( id != 0xffffffff ){
- struct netmsg_board *local_board =
- &scoreboard_client_data.boards[id];
-
- for( int i=0; i<13; i++ ){
- sfd_encode( i, &local_board->data[27*i] );
- }
- }else{
- sfd_encode( 0, mdl_pstr( &world->meta, route->pstr_name ) );
- sfd_encode( 1, "No data" );
- }
-#endif
}
}