reverse skate into glider
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_region.c
1 #include "ent_region.h"
2 #include "gui.h"
3 #include "network_common.h"
4 #include "network.h"
5
6 static u32 region_spark_colour( u32 flags ){
7 if( flags & k_ent_route_flag_achieve_gold )
8 return 0xff8ce0fa;
9 else if( flags & k_ent_route_flag_achieve_silver )
10 return 0xffc2c2c2;
11 else
12 return 0x00;
13 }
14
15 static void ent_region_call( world_instance *world, ent_call *call ){
16 ent_region *region =
17 mdl_arritm( &world->ent_region, mdl_entity_id_id(call->id) );
18
19 if( !region->zone_volume )
20 return;
21
22 ent_volume *volume =
23 mdl_arritm( &world->ent_volume, mdl_entity_id_id(region->zone_volume) );
24
25 if( call->function == 0 ){ /* enter */
26 for( u32 i=0; i<mdl_arrcount(&world->ent_route); i ++ ){
27 ent_route *route = mdl_arritm( &world->ent_route, i );
28
29 v3f local;
30 m4x3_mulv( volume->to_local, route->board_transform[3], local );
31 if( (fabsf(local[0]) <= 1.0f) &&
32 (fabsf(local[1]) <= 1.0f) &&
33 (fabsf(local[2]) <= 1.0f) ){
34 route->flags &= ~k_ent_route_flag_out_of_zone;
35 }
36 else {
37 route->flags |= k_ent_route_flag_out_of_zone;
38 }
39 }
40
41 gui_location_print_ccmd( 1, (const char *[]){
42 mdl_pstr(&world->meta,region->pstr_title)} );
43
44 vg_strncpy( mdl_pstr(&world->meta,region->pstr_title),
45 global_ent_region.location, NETWORK_REGION_MAX,
46 k_strncpy_always_add_null );
47 global_ent_region.flags = region->flags;
48 network_send_region();
49
50 localplayer.effect_data.spark.colour = region_spark_colour(region->flags);
51 }
52 else if( call->function == 1 ){ /* leave */
53 for( u32 i=0; i<mdl_arrcount(&world->ent_route); i ++ ){
54 ent_route *route = mdl_arritm( &world->ent_route, i );
55 route->flags |= k_ent_route_flag_out_of_zone;
56 }
57 localplayer.effect_data.spark.colour = 0x00;
58 }
59 }
60
61 /*
62 * reevaluate all achievements to calculate the compiled achievement
63 */
64 static void ent_region_re_eval( world_instance *world ){
65 u32 world_total = k_ent_route_flag_achieve_gold |
66 k_ent_route_flag_achieve_silver;
67
68 for( u32 i=0; i<mdl_arrcount(&world->ent_region); i ++ ){
69 ent_region *region = mdl_arritm(&world->ent_region, i);
70
71 if( !region->zone_volume )
72 continue;
73
74 ent_volume *volume = mdl_arritm(&world->ent_volume,
75 mdl_entity_id_id(region->zone_volume));
76
77 u32 combined = k_ent_route_flag_achieve_gold |
78 k_ent_route_flag_achieve_silver;
79
80 for( u32 j=0; j<mdl_arrcount(&world->ent_route); j ++ ){
81 ent_route *route = mdl_arritm(&world->ent_route, j );
82
83 v3f local;
84 m4x3_mulv( volume->to_local, route->board_transform[3], local );
85 if( !((fabsf(local[0]) <= 1.0f) &&
86 (fabsf(local[1]) <= 1.0f) &&
87 (fabsf(local[2]) <= 1.0f)) ){
88 continue;
89 }
90
91 combined &= route->flags;
92 }
93
94 for( u32 j=0; j<mdl_arrcount(&world->ent_challenge); j ++ ){
95 ent_challenge *challenge = mdl_arritm( &world->ent_challenge, j );
96
97 v3f local;
98 m4x3_mulv( volume->to_local, challenge->transform.co, local );
99 if( !((fabsf(local[0]) <= 1.0f) &&
100 (fabsf(local[1]) <= 1.0f) &&
101 (fabsf(local[2]) <= 1.0f)) ){
102 continue;
103 }
104
105 u32 flags = 0x00;
106 if( challenge->status ){
107 flags |= k_ent_route_flag_achieve_gold;
108 flags |= k_ent_route_flag_achieve_silver;
109 }
110
111 combined &= flags;
112 }
113
114 region->flags = combined;
115 world_total &= combined;
116 }
117
118 u32 instance_id = world - world_static.instances;
119
120 if( world_static.instance_addons[instance_id]->flags & ADDON_REG_MTZERO ){
121 if( world_total & k_ent_route_flag_achieve_gold ){
122 steam_set_achievement( "MTZERO_GOLD" );
123 steam_store_achievements();
124 }
125
126 if( world_total & k_ent_route_flag_achieve_silver ){
127 steam_set_achievement( "MTZERO_SILVER" );
128 steam_store_achievements();
129 }
130 }
131
132 if( world_static.instance_addons[instance_id]->flags & ADDON_REG_CITY ){
133 steam_set_achievement( "CITY_COMPLETE" );
134 steam_store_achievements();
135 }
136 }