X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=ent_region.c;h=5e0ec03dd2349891f09ee00bfca3c07aa3a19081;hb=304647a7672165dd35ffe54884ed9aedcc9bf363;hp=720cb3c72a2ac369ce5099cded5e41f08c1b3892;hpb=23ba25574349652d86979fc787ec4b0214001333;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/ent_region.c b/ent_region.c index 720cb3c..5e0ec03 100644 --- a/ent_region.c +++ b/ent_region.c @@ -1,47 +1,85 @@ #include "ent_region.h" #include "gui.h" +#include "network_common.h" +#include "network.h" -static void ent_region_call( world_instance *world, ent_call *call ){ +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 ) + return 0xffc2c2c2; + else + return 0x00; +} + +entity_call_result ent_region_call( world_instance *world, ent_call *call ) +{ ent_region *region = mdl_arritm( &world->ent_region, mdl_entity_id_id(call->id) ); if( !region->zone_volume ) - return; + return k_entity_call_result_invalid; ent_volume *volume = mdl_arritm( &world->ent_volume, mdl_entity_id_id(region->zone_volume) ); - if( call->function == 0 ){ /* enter */ - for( u32 i=0; ient_route); i ++ ){ + if( call->function == 0 ) /* enter */ + { + for( u32 i=0; ient_route); i ++ ) + { ent_route *route = mdl_arritm( &world->ent_route, i ); v3f local; m4x3_mulv( volume->to_local, route->board_transform[3], local ); if( (fabsf(local[0]) <= 1.0f) && (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f) ){ + (fabsf(local[2]) <= 1.0f) ) + { route->flags &= ~k_ent_route_flag_out_of_zone; } - else { + else + { route->flags |= k_ent_route_flag_out_of_zone; } } gui_location_print_ccmd( 1, (const char *[]){ mdl_pstr(&world->meta,region->pstr_title)} ); + + 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); + return k_entity_call_result_OK; } - else if( call->function == 1 ){ /* leave */ - for( u32 i=0; ient_route); i ++ ){ + else if( call->function == 1 ) /* leave */ + { + for( u32 i=0; ient_route); i ++ ) + { ent_route *route = mdl_arritm( &world->ent_route, i ); route->flags |= k_ent_route_flag_out_of_zone; } + localplayer.effect_data.spark.colour = 0x00; + return k_entity_call_result_OK; } + else + return k_entity_call_result_unhandled; } /* * 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; ient_region); i ++ ){ ent_region *region = mdl_arritm(&world->ent_region, i); @@ -68,8 +106,60 @@ static void ent_region_re_eval( world_instance *world ){ combined &= route->flags; } + for( u32 j=0; jent_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; + + /* 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(); + } + } - /* TODO: Challenges */ + if( world_static.instance_addons[instance_id]->flags & ADDON_REG_CITY ){ + steam_set_achievement( "CITY_COMPLETE" ); + steam_store_achievements(); } }