fix regression with gate flipping
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_region.c
index eecf22d05ff65d1b4846bdb324c56733ed0c2b33..e58d594708443bd46c3ef92e70569932410348ff 100644 (file)
@@ -3,7 +3,10 @@
 #include "network_common.h"
 #include "network.h"
 
-static u32 region_spark_colour( u32 flags ){
+struct global_ent_region global_ent_region;
+
+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 )
@@ -12,7 +15,8 @@ static u32 region_spark_colour( u32 flags ){
       return 0x00;
 }
 
-static void ent_region_call( world_instance *world, ent_call *call ){
+void ent_region_call( world_instance *world, ent_call *call )
+{
    ent_region *region = 
       mdl_arritm( &world->ent_region, mdl_entity_id_id(call->id) );
 
@@ -61,7 +65,11 @@ 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 ){
+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);
 
@@ -109,5 +117,39 @@ static void ent_region_re_eval( world_instance *world ){
       }
 
       region->flags = combined;
+      world_total &= combined;
+
+      /* run unlock triggers. v105+ */
+      if( world->meta.info.version >= 105 ){
+         if( region->flags & (k_ent_route_flag_achieve_gold|
+                              k_ent_route_flag_achieve_silver) ){
+            if( region->target0[0] ){
+               ent_call call;
+               call.data = NULL;
+               call.id = region->target0[0];
+               call.function = region->target0[1];
+               entity_call( world, &call );
+            }
+         }
+      }
+   }
+
+   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();
+      }
+   }
+
+   if( world_static.instance_addons[instance_id]->flags & ADDON_REG_CITY ){
+      steam_set_achievement( "CITY_COMPLETE" );
+      steam_store_achievements();
    }
 }