--- 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); } }