spawn filtering
authorhgn <hgodden00@gmail.com>
Thu, 6 Mar 2025 16:38:01 +0000 (16:38 +0000)
committerhgn <hgodden00@gmail.com>
Thu, 6 Mar 2025 16:38:01 +0000 (16:38 +0000)
content_skaterift/maps/dev_hub/main.mdl
skaterift_blender/sr_main.py
skaterift_blender/sr_mdl.py
src/entity.h
src/skaterift_script.c
src/world_entity.c
src/world_map.c

index 7bf820a4c0b944c4aa87bdb850c786cfe7c48a4c..8119612824db71f38cb3ac5f557cc91c03ce171c 100644 (file)
Binary files a/content_skaterift/maps/dev_hub/main.mdl and b/content_skaterift/maps/dev_hub/main.mdl differ
index cabbc9661224215e6005e982706a23022af55dc6..3370d20647be5dc32cf4c90c34b574eae76e3955 100644 (file)
@@ -179,7 +179,8 @@ class mdl_texture(Structure):
 class ent_spawn(Structure):
 #{
    _fields_ = [("transform",mdl_transform),
-               ("pstr_name",c_uint32)]
+               ("pstr_name",c_uint32),
+               ("flags",c_uint32)]
 #}
 
 class ent_light(Structure):
@@ -1162,6 +1163,7 @@ def sr_on_type_change( _, context ):
 class SR_OBJECT_ENT_SPAWN(bpy.types.PropertyGroup):
 #{
    alias: bpy.props.StringProperty( name='alias' )
+   flags: bpy.props.IntProperty()
 #}
 
 class SR_OBJECT_ENT_GATE(bpy.types.PropertyGroup):
index 3dc6deef6264df2cd0fa1cf5d7320f542fdb3d09..c352c8606f7e3fe92b61b5d99b450a08ca139859 100644 (file)
@@ -679,6 +679,7 @@ def _mdl_compiler_compile_entities():
             compile_obj_transform( obj, spawn.transform )
             obj_data = obj.SR_data.ent_spawn[0]
             spawn.pstr_name = _af_pack_string( obj_data.alias )
+            spawn.flags = obj_data.flags
             sr_ent_push( spawn )
          #}
          elif ent_type == 'ent_water':#{
index e340efe523e18428724c95e3d18cfd87dacdcb08..dc1a81c7f5cb3f3233aed52d7d1ae0e01ec9b189 100644 (file)
@@ -135,9 +135,19 @@ enum entity_function
    k_ent_function_trigger_leave
 };
 
+enum ent_spawn_flag
+{
+   k_ent_spawn_flag_locked = 0x1,
+   k_ent_spawn_flag_group_1 = 0x10,
+   k_ent_spawn_flag_group_2 = 0x20,
+   k_ent_spawn_flag_group_3 = 0x40,
+   k_ent_spawn_flag_group_4 = 0x80
+};
+
 struct ent_spawn{
    mdl_transform transform;
    u32 pstr_name;
+   u32 flags;
 };
 
 enum light_type{
index 9ba1abebab9388c1ed853e63e6dffa5f8186cfce..efa1b4093dbf0640327a1990d1b9720a2b8870c9 100644 (file)
@@ -1793,6 +1793,25 @@ static bool _skaterift_script_hub_setup( enum escript_event ev, const char *inf
             if( unlock_valley )
                prop->flags |= k_prop_flag_hidden;
       }
+
+      u32 spawns_allowed = 0;
+      if( unlock_mtzero ) spawns_allowed |= k_ent_spawn_flag_group_1;
+      if( unlock_city ) spawns_allowed |= k_ent_spawn_flag_group_2;
+      if( unlock_valley ) spawns_allowed |= k_ent_spawn_flag_group_3;
+
+      for( u32 i=0; i<af_arrcount(&world->ent_spawn); i++ )
+      {
+         ent_spawn *spawn = af_arritm( &world->ent_spawn, i );
+
+         bool allow = 0;
+
+         if( spawn->flags == 0 ) allow = 1;
+         if( spawn->flags & spawns_allowed ) allow = 1;
+
+         if( allow ) spawn->flags &= ~(u32)k_ent_spawn_flag_locked;
+         else        spawn->flags |= k_ent_spawn_flag_locked;
+      }
+
       return 1;
    }
 
index 01360237c3052b1404260fdb19e67affaef4a814..5a59acf46161c6b0b3aafe7328106a19fe8763cf 100644 (file)
@@ -340,8 +340,13 @@ ent_spawn *world_find_closest_spawn( world_instance *world, v3f position )
    ent_spawn *rp = NULL, *r;
    float min_dist = INFINITY;
 
-   for( u32 i=0; i<af_arrcount(&world->ent_spawn); i++ ){
+   for( u32 i=0; i<af_arrcount(&world->ent_spawn); i++ )
+   {
       r = af_arritm( &world->ent_spawn, i );
+
+      if( r->flags & k_ent_spawn_flag_locked )
+         continue;
+
       float d = v3_dist2( r->transform.co, position );
       
       if( d < min_dist ){
index 0a618acd63be34ceb765cc9b3f986653a6f3f797..76bbe5b84109d4d68c7d5a58d1e886075dbbc415 100644 (file)
@@ -162,6 +162,9 @@ void render_world_map(void)
       {
          ent_spawn *spawn = af_arritm(&world->ent_spawn,i);
 
+         if( spawn->flags & k_ent_spawn_flag_locked )
+            continue;
+
          if( world_map.sel_spawn )
          {
             spawn->transform.s[0] = ( spawn == world_map.sel_spawn )? 0.0f: 10000.0f;
@@ -246,6 +249,9 @@ void render_world_map(void)
       {
          ent_spawn *spawn = af_arritm( &world->ent_spawn, i );
 
+         if( spawn->flags & k_ent_spawn_flag_locked )
+            continue;
+
          if( spawn->transform.s[0] > 0.3f )
             continue;