1 #include "ent_region.h"
4 static void ent_region_call( world_instance
*world
, ent_call
*call
){
6 mdl_arritm( &world
->ent_region
, mdl_entity_id_id(call
->id
) );
8 if( !region
->zone_volume
)
12 mdl_arritm( &world
->ent_volume
, mdl_entity_id_id(region
->zone_volume
) );
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
);
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
;
26 route
->flags
|= k_ent_route_flag_out_of_zone
;
30 gui_location_print_ccmd( 1, (const char *[]){
31 mdl_pstr(&world
->meta
,region
->pstr_title
)} );
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;
38 localplayer
.effect_data
.spark
.colour
= 0x00;
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
;
45 localplayer
.effect_data
.spark
.colour
= 0x00;
50 * reevaluate all achievements to calculate the compiled achievement
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
);
56 if( !region
->zone_volume
)
59 ent_volume
*volume
= mdl_arritm(&world
->ent_volume
,
60 mdl_entity_id_id(region
->zone_volume
));
62 u32 combined
= k_ent_route_flag_achieve_gold
|
63 k_ent_route_flag_achieve_silver
;
65 for( u32 j
=0; j
<mdl_arrcount(&world
->ent_route
); j
++ ){
66 ent_route
*route
= mdl_arritm(&world
->ent_route
, j
);
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
)) ){
76 combined
&= route
->flags
;
79 region
->flags
= combined
;
81 /* TODO: Challenges */