actually render trails
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_region.c
index 026af35d89042fb24231232b354e2cee75c2c8a1..fd24f4e1cd3b6f3dc98bfc6b025475b011de76f7 100644 (file)
@@ -1,5 +1,16 @@
 #include "ent_region.h"
 #include "gui.h"
+#include "network_common.h"
+#include "network.h"
+
+static u32 region_spark_colour( u32 flags ){
+   if( flags & k_ent_route_flag_achieve_gold )
+      return 0xff8ce0fa;
+   else if( flags & k_ent_route_flag_achieve_silver )
+      return 0xffc2c2c2;
+   else 
+      return 0x00;
+}
 
 static void ent_region_call( world_instance *world, ent_call *call ){
    ent_region *region = 
@@ -30,12 +41,13 @@ static void ent_region_call( world_instance *world, ent_call *call ){
       gui_location_print_ccmd( 1, (const char *[]){
             mdl_pstr(&world->meta,region->pstr_title)} );
 
-      if( region->flags & k_ent_route_flag_achieve_gold )
-         localplayer.effect_data.spark.colour = 0xff8ce0fa;
-      else if( region->flags & k_ent_route_flag_achieve_silver )
-         localplayer.effect_data.spark.colour = 0xffc2c2c2;
-      else 
-         localplayer.effect_data.spark.colour = 0x00;
+      vg_strncpy( mdl_pstr(&world->meta,region->pstr_title), 
+                  global_ent_region.location, NETWORK_REGION_MAX,
+                  k_strncpy_always_add_null );
+      global_ent_region.flags = region->flags;
+      network_send_region();
+
+      localplayer.effect_data.spark.colour = region_spark_colour(region->flags);
    }
    else if( call->function == 1 ){ /* leave */
       for( u32 i=0; i<mdl_arrcount(&world->ent_route); i ++ ){
@@ -50,6 +62,9 @@ static void ent_region_call( world_instance *world, ent_call *call ){
  * reevaluate all achievements to calculate the compiled achievement
  */
 static void ent_region_re_eval( world_instance *world ){
+   u32 world_total = k_ent_route_flag_achieve_gold | 
+                     k_ent_route_flag_achieve_silver;
+
    for( u32 i=0; i<mdl_arrcount(&world->ent_region); i ++ ){
       ent_region *region = mdl_arritm(&world->ent_region, i);
 
@@ -76,8 +91,46 @@ static void ent_region_re_eval( world_instance *world ){
          combined &= route->flags;
       }
 
+      for( u32 j=0; j<mdl_arrcount(&world->ent_challenge); j ++ ){
+         ent_challenge *challenge = mdl_arritm( &world->ent_challenge, j );
+
+         v3f local;
+         m4x3_mulv( volume->to_local, challenge->transform.co, local );
+         if( !((fabsf(local[0]) <= 1.0f) &&
+               (fabsf(local[1]) <= 1.0f) &&
+               (fabsf(local[2]) <= 1.0f)) ){
+            continue;
+         }
+
+         u32 flags = 0x00;
+         if( challenge->status ){
+            flags |= k_ent_route_flag_achieve_gold;
+            flags |= k_ent_route_flag_achieve_silver;
+         }
+
+         combined &= flags;
+      }
+
       region->flags = combined;
+      world_total &= combined;
+   }
+
+   u32 instance_id = world - world_static.instances;
+
+   if( world_static.instance_addons[instance_id]->flags & ADDON_REG_MTZERO ){
+      if( world_total & k_ent_route_flag_achieve_gold ){
+         steam_set_achievement( "MTZERO_GOLD" );
+         steam_store_achievements();
+      }
+
+      if( world_total & k_ent_route_flag_achieve_silver ){
+         steam_set_achievement( "MTZERO_SILVER" );
+         steam_store_achievements();
+      }
+   }
 
-      /* TODO: Challenges */
+   if( world_static.instance_addons[instance_id]->flags & ADDON_REG_CITY ){
+      steam_set_achievement( "CITY_COMPLETE" );
+      steam_store_achievements();
    }
 }