update helpers/location to 'frosted' ui
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_miniworld.c
index e425fa2da2212d24651e1cf91a0f56496c23ee81..2fed03137313e7549a36cfee7939cd716ca2491c 100644 (file)
@@ -1,17 +1,23 @@
 #include "entity.h"
 #include "ent_miniworld.h"
 #include "world_render.h"
+#include "world_load.h"
 #include "input.h"
 #include "gui.h"
 #include "menu.h"
+#include "audio.h"
 
-static void ent_miniworld_call( world_instance *world, ent_call *call ){
+struct global_miniworld global_miniworld;
+
+entity_call_result ent_miniworld_call( world_instance *world, ent_call *call )
+{
    ent_miniworld *miniworld = mdl_arritm( &world->ent_miniworld, 
                                           mdl_entity_id_id(call->id) );
 
    int world_id = world - world_static.instances;
 
-   if( call->function == 0 ){ /* zone() */
+   if( call->function == 0 ) /* zone() */
+   {
       const char *uid = mdl_pstr( &world->meta, miniworld->pstr_world );
       skaterift_load_world_command( 1, (const char *[]){ uid } );
 
@@ -23,20 +29,30 @@ static void ent_miniworld_call( world_instance *world, ent_call *call ){
 
       if( gui_new_helper( input_button_list[k_srbind_miniworld_resume], &text ))
          vg_strcat( &text, "Enter World" );
+
+      return k_entity_call_result_OK;
    }
-   else if( call->function == 1 ){
+   else if( call->function == 1 )
+   {
       global_miniworld.active = NULL;
       gui_helper_clear();
 
-      if( miniworld->proxy ){
+      if( miniworld->proxy )
+      {
          ent_prop *prop = mdl_arritm( &world->ent_prop, 
                                       mdl_entity_id_id(miniworld->proxy) );
          prop->flags &= ~0x1;
       }
+
+      return k_entity_call_result_OK;
    }
+   else
+      return k_entity_call_result_unhandled;
 }
 
-static void miniworld_icon( camera *cam, enum gui_icon icon, v3f pos, f32 size){
+static void miniworld_icon( vg_camera *cam, enum gui_icon icon, 
+                            v3f pos, f32 size)
+{
    m4x3f mmdl;
    v3_copy( cam->transform[2], mmdl[2] );
    mmdl[2][1] = 0.0f;
@@ -58,7 +74,8 @@ static void miniworld_icon( camera *cam, enum gui_icon icon, v3f pos, f32 size){
       mdl_draw_submesh( sm );
 }
 
-static void ent_miniworld_render( world_instance *host_world, camera *cam ){
+void ent_miniworld_render( world_instance *host_world, vg_camera *cam )
+{
    if( host_world != &world_static.instances[k_world_purpose_hub] )
       return;
 
@@ -87,7 +104,7 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){
       return;
 
    render_world_override( dest_world, host_world, global_miniworld.mmdl, cam,
-                          NULL, (v4f){-10000.0f,10000.0f,0.0f,0.0f} );
+                          NULL, (v4f){dest_world->tar_min,10000.0f,0.0f,0.0f} );
    render_world_routes( dest_world, host_world, 
                         global_miniworld.mmdl, cam, 0, 1 );
 
@@ -114,6 +131,19 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){
       miniworld_icon( cam, icon, challenge->transform.co, 1.0f );
    }
 
+   for( u32 i=0; i<mdl_arrcount(&dest_world->ent_route); i++ ){
+      ent_route *route = mdl_arritm( &dest_world->ent_route, i );
+
+      if( route->flags & k_ent_route_flag_achieve_gold ){
+         miniworld_icon( cam, k_gui_icon_rift_run_gold, 
+                         route->board_transform[3],1.0f);
+      }
+      else if( route->flags & k_ent_route_flag_achieve_silver ){
+         miniworld_icon( cam, k_gui_icon_rift_run_silver, 
+                         route->board_transform[3],1.0f);
+      }
+   }
+
    for( u32 i=0; i<mdl_arrcount(&dest_world->ent_route); i++ ){
       ent_route *route = mdl_arritm( &dest_world->ent_route, i );
 
@@ -125,7 +155,8 @@ static void ent_miniworld_render( world_instance *host_world, camera *cam ){
    }
 }
 
-static void ent_miniworld_preupdate(void){
+void ent_miniworld_preupdate(void)
+{
    world_instance *hub = world_current_instance(),
                   *dest = &world_static.instances[k_world_purpose_client];
 
@@ -135,11 +166,21 @@ static void ent_miniworld_preupdate(void){
        (global_miniworld.transition) ||
        (world_static.active_instance != k_world_purpose_hub) ||
        (!miniworld) ||
-       (dest->status != k_world_status_loaded) ){
+       (dest->status != k_world_status_loaded) ||
+       (skaterift.activity != k_skaterift_default)) {
       return;
    }
 
    if( button_down( k_srbind_miniworld_resume ) ){
+      if( skaterift.demo_mode ){
+         if( world_static.instance_addons[1]->flags & ADDON_REG_PREMIUM ){
+            skaterift.activity = k_skaterift_menu;
+            menu.page = 0xffffffff;
+            menu_open_page( "Premium", k_ent_menuitem_stack_append );
+            return;
+         }
+      }
+
       global_miniworld.transition = 1;
       global_miniworld.t = 0.0f;
       global_miniworld.cam = skaterift.cam;
@@ -154,7 +195,8 @@ static void ent_miniworld_preupdate(void){
    }
 }
 
-static void ent_miniworld_goback(void){
+void ent_miniworld_goback(void)
+{
    audio_lock();
    audio_oneshot( &audio_ui[2], 1.0f, 0.0f );
    audio_unlock();
@@ -163,6 +205,6 @@ static void ent_miniworld_goback(void){
    global_miniworld.t = 1.0f;
 
    global_miniworld.cam = skaterift.cam;
-   m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam );
+   vg_m4x3_transform_camera( global_miniworld.mmdl, &global_miniworld.cam );
    world_switch_instance(0);
 }