src/behavior.c

changeset 274
ba7f043f9fdf
parent 268
d8c05102b017
--- a/src/behavior.c	Thu Aug 21 22:13:51 2025 +0200
+++ b/src/behavior.c	Fri Aug 22 23:27:36 2025 +0200
@@ -58,9 +58,11 @@
     cxmutstr name = args.name == NULL
         ? asc_util_gen_name("behavior")
         : cx_mutstr(strdup(args.name));
+    // FIXME: we need the ordered map here, because the execution order of behaviors is important
     AscBehavior *behavior = cxMapEmplace(node->behaviors, name);
     assert(behavior != NULL);
-    behavior->enabled = true;
+    behavior->enabled = !args.start_disabled;
+    behavior->always_enabled = args.always_enabled;
     behavior->killed = false;
     behavior->node = node;
     behavior->func = args.func;
@@ -83,7 +85,7 @@
 void asc_behavior_trigger(AscBehavior *behavior) {
     if (!behavior->enabled) return;
     if (behavior->last_execution + behavior->interval > asc_context.total_nanos) return;
-    if (behavior->pause_while_hidden && asc_scene_node_is_hidden(behavior->node)) return;
+    if (!behavior->always_enabled && behavior->pause_while_hidden && asc_scene_node_is_hidden(behavior->node)) return;
 
     behavior->func(behavior);
     behavior->last_execution = asc_context.total_nanos;
@@ -99,27 +101,27 @@
 void asc_behavior_enable_all(AscSceneNode *node) {
     CxMapIterator iter = cxMapIteratorValues(node->behaviors);
     cx_foreach(AscBehavior*, behavior, iter) {
-        behavior->enabled = true;
+        asc_behavior_enable(behavior);
     }
 }
 
 void asc_behavior_disable_all(AscSceneNode *node) {
     CxMapIterator iter = cxMapIteratorValues(node->behaviors);
     cx_foreach(AscBehavior*, behavior, iter) {
-        behavior->enabled = false;
+        asc_behavior_disable(behavior);
     }
 }
 
 void asc_behavior_pause_all_while_hidden(AscSceneNode *node) {
     CxMapIterator iter = cxMapIteratorValues(node->behaviors);
     cx_foreach(AscBehavior*, behavior, iter) {
-        behavior->pause_while_hidden = true;
+        asc_behavior_pause_while_hidden(behavior);
     }
 }
 
 void asc_behavior_continue_all_while_hidden(AscSceneNode *node) {
     CxMapIterator iter = cxMapIteratorValues(node->behaviors);
     cx_foreach(AscBehavior*, behavior, iter) {
-        behavior->pause_while_hidden= false;
+        asc_behavior_continue_while_hidden(behavior);
     }
 }

mercurial