sparks for player and remote blinking
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_region.c
1 #include "ent_region.h"
2 #include "gui.h"
3
4 static void ent_region_call( world_instance *world, ent_call *call ){
5 ent_region *region =
6 mdl_arritm( &world->ent_region, mdl_entity_id_id(call->id) );
7
8 if( !region->zone_volume )
9 return;
10
11 ent_volume *volume =
12 mdl_arritm( &world->ent_volume, mdl_entity_id_id(region->zone_volume) );
13
14 if( call->function == 0 ){ /* enter */
15 for( u32 i=0; i<mdl_arrcount(&world->ent_route); i ++ ){
16 ent_route *route = mdl_arritm( &world->ent_route, i );
17
18 v3f local;
19 m4x3_mulv( volume->to_local, route->board_transform[3], local );
20 if( (fabsf(local[0]) <= 1.0f) &&
21 (fabsf(local[1]) <= 1.0f) &&
22 (fabsf(local[2]) <= 1.0f) ){
23 route->flags &= ~k_ent_route_flag_out_of_zone;
24 }
25 else {
26 route->flags |= k_ent_route_flag_out_of_zone;
27 }
28 }
29
30 gui_location_print_ccmd( 1, (const char *[]){
31 mdl_pstr(&world->meta,region->pstr_title)} );
32
33 if( region->flags & k_ent_route_flag_achieve_gold )
34 localplayer.effect_data.spark.colour = 0xff8ce0fa;
35 else if( region->flags & k_ent_route_flag_achieve_silver )
36 localplayer.effect_data.spark.colour = 0xffc2c2c2;
37 else
38 localplayer.effect_data.spark.colour = 0x00;
39 }
40 else if( call->function == 1 ){ /* leave */
41 for( u32 i=0; i<mdl_arrcount(&world->ent_route); i ++ ){
42 ent_route *route = mdl_arritm( &world->ent_route, i );
43 route->flags |= k_ent_route_flag_out_of_zone;
44 }
45 localplayer.effect_data.spark.colour = 0x00;
46 }
47 }
48
49 /*
50 * reevaluate all achievements to calculate the compiled achievement
51 */
52 static void ent_region_re_eval( world_instance *world ){
53 for( u32 i=0; i<mdl_arrcount(&world->ent_region); i ++ ){
54 ent_region *region = mdl_arritm(&world->ent_region, i);
55
56 if( !region->zone_volume )
57 continue;
58
59 ent_volume *volume = mdl_arritm(&world->ent_volume,
60 mdl_entity_id_id(region->zone_volume));
61
62 u32 combined = k_ent_route_flag_achieve_gold |
63 k_ent_route_flag_achieve_silver;
64
65 for( u32 j=0; j<mdl_arrcount(&world->ent_route); j ++ ){
66 ent_route *route = mdl_arritm(&world->ent_route, j );
67
68 v3f local;
69 m4x3_mulv( volume->to_local, route->board_transform[3], local );
70 if( !((fabsf(local[0]) <= 1.0f) &&
71 (fabsf(local[1]) <= 1.0f) &&
72 (fabsf(local[2]) <= 1.0f)) ){
73 continue;
74 }
75
76 combined &= route->flags;
77 }
78
79 region->flags = combined;
80
81 /* TODO: Challenges */
82 }
83 }