diff --git a/src/pc/lua/utils/smlua_obj_utils.c b/src/pc/lua/utils/smlua_obj_utils.c index b93575cbf..afa70ffc1 100644 --- a/src/pc/lua/utils/smlua_obj_utils.c +++ b/src/pc/lua/utils/smlua_obj_utils.c @@ -114,20 +114,45 @@ struct Object *obj_get_first(enum ObjectList objList) { if (gObjectLists && objList >= 0 && objList < NUM_OBJ_LISTS) { struct Object *head = (struct Object *) &gObjectLists[objList]; struct Object *obj = (struct Object *) head->header.next; - if (obj != head) { - return obj; + while (obj != head) { + if (obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) { + return obj; + } + obj = (struct Object *) obj->header.next; } } return NULL; } +static struct Object *obj_get_next_internal(struct Object *o, enum ObjectList objList) { + if (gObjectLists && o) { + struct Object *head = (struct Object *) &gObjectLists[objList]; + struct Object *next = (struct Object *) o->header.next; + while (next != head) { + if (next->activeFlags != ACTIVE_FLAG_DEACTIVATED) { + return next; + } + next = (struct Object *) o->header.next; + } + } + return NULL; +} + +struct Object *obj_get_next(struct Object *o) { + if (gObjectLists && o) { + enum ObjectList objList = get_object_list_from_behavior(o->behavior); + return obj_get_next_internal(o, objList); + } + return NULL; +} + struct Object *obj_get_first_with_behavior_id(enum BehaviorId behaviorId) { const BehaviorScript* behavior = get_behavior_from_id(behaviorId); u32 sanityDepth = 0; behavior = smlua_override_behavior(behavior); if (behavior) { enum ObjectList objList = get_object_list_from_behavior(behavior); - for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) { + for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { if (++sanityDepth > 10000) { break; } if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) { return obj; @@ -144,7 +169,7 @@ struct Object *obj_get_first_with_behavior_id_and_field_s32(enum BehaviorId beha behavior = smlua_override_behavior(behavior); if (behavior) { enum ObjectList objList = get_object_list_from_behavior(behavior); - for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) { + for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { if (++sanityDepth > 10000) { break; } if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_S32(fieldIndex) == value) { return obj; @@ -160,7 +185,7 @@ struct Object *obj_get_first_with_behavior_id_and_field_f32(enum BehaviorId beha behavior = smlua_override_behavior(behavior); if (behavior) { enum ObjectList objList = get_object_list_from_behavior(behavior); - for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) { + for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_F32(fieldIndex) == value) { return obj; } @@ -177,7 +202,7 @@ struct Object *obj_get_nearest_object_with_behavior_id(struct Object *o, enum Be if (behavior) { enum ObjectList objList = get_object_list_from_behavior(behavior); - for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) { + for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) { f32 objDist = dist_between_objects(o, obj); if (objDist < minDist) { @@ -197,29 +222,18 @@ s32 obj_count_objects_with_behavior_id(enum BehaviorId behaviorId) { if (behavior) { enum ObjectList objList = get_object_list_from_behavior(behavior); - for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next(obj)) { - if (obj->behavior == behavior) { count++; } + for (struct Object *obj = obj_get_first(objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { + if (obj->behavior == behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) { count++; } } } return count; } -struct Object *obj_get_next(struct Object *o) { - if (gObjectLists && o) { - enum ObjectList objList = get_object_list_from_behavior(o->behavior); - struct Object *head = (struct Object *) &gObjectLists[objList]; - struct Object *next = (struct Object *) o->header.next; - if (next != head) { - return next; - } - } - return NULL; -} - struct Object *obj_get_next_with_same_behavior_id(struct Object *o) { if (o) { - for (struct Object *obj = obj_get_next(o); obj != NULL; obj = obj_get_next(obj)) { + enum ObjectList objList = get_object_list_from_behavior(o->behavior); + for (struct Object *obj = obj_get_next_internal(o, objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { if (obj->behavior == o->behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED) { return obj; } @@ -231,7 +245,8 @@ struct Object *obj_get_next_with_same_behavior_id(struct Object *o) { struct Object *obj_get_next_with_same_behavior_id_and_field_s32(struct Object *o, s32 fieldIndex, s32 value) { if (fieldIndex < 0 || fieldIndex >= OBJECT_NUM_FIELDS) { return NULL; } if (o) { - for (struct Object *obj = obj_get_next(o); obj != NULL; obj = obj_get_next(obj)) { + enum ObjectList objList = get_object_list_from_behavior(o->behavior); + for (struct Object *obj = obj_get_next_internal(o, objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { if (obj->behavior == o->behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_S32(fieldIndex) == value) { return obj; } @@ -243,7 +258,8 @@ struct Object *obj_get_next_with_same_behavior_id_and_field_s32(struct Object *o struct Object *obj_get_next_with_same_behavior_id_and_field_f32(struct Object *o, s32 fieldIndex, f32 value) { if (fieldIndex < 0 || fieldIndex >= OBJECT_NUM_FIELDS) { return NULL; } if (o) { - for (struct Object *obj = obj_get_next(o); obj != NULL; obj = obj_get_next(obj)) { + enum ObjectList objList = get_object_list_from_behavior(o->behavior); + for (struct Object *obj = obj_get_next_internal(o, objList); obj != NULL; obj = obj_get_next_internal(obj, objList)) { if (obj->behavior == o->behavior && obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj->OBJECT_FIELD_F32(fieldIndex) == value) { return obj; }