diff --git a/arm9/asm/map_object_s.s b/arm9/asm/map_object_s.s index 46643d3ad..7b7305278 100644 --- a/arm9/asm/map_object_s.s +++ b/arm9/asm/map_object_s.s @@ -4,119 +4,11 @@ .extern UNK_020F6364 .extern sub_02057EE0 .extern sub_02057F18 + .extern sub_0205815C + .extern sub_0205818C .text - thumb_func_start MapObjectManager_GetFirstObjectAndIndexWithFlag -MapObjectManager_GetFirstObjectAndIndexWithFlag: ; 0x020580F4 - push {r3-r7, lr} - add r5, r2, #0x0 - add r4, r0, #0x0 - str r1, [sp, #0x0] - add r6, r3, #0x0 - bl MapObjectManager_GetObjectCount - add r7, r0, #0x0 - ldr r0, [r5, #0x0] - cmp r0, r7 - blt _0205810E - mov r0, #0x0 - pop {r3-r7, pc} -_0205810E: - add r0, r4, #0x0 - bl MapObjectManager_GetConstObjects - mov r1, #0x4a - ldr r2, [r5, #0x0] - lsl r1, r1, #0x2 - mul r1, r2 - add r4, r0, r1 -_0205811E: - ldr r0, [r5, #0x0] - add r1, r6, #0x0 - add r0, r0, #0x1 - str r0, [r5, #0x0] - add r0, r4, #0x0 - bl MapObject_GetFlagsBits - cmp r6, r0 - bne _02058138 - ldr r0, [sp, #0x0] - str r4, [r0, #0x0] - mov r0, #0x1 - pop {r3-r7, pc} -_02058138: - mov r0, #0x4a - lsl r0, r0, #0x2 - add r4, r4, r0 - ldr r0, [r5, #0x0] - cmp r0, r7 - blt _0205811E - mov r0, #0x0 - pop {r3-r7, pc} - - thumb_func_start sub_02058148 -sub_02058148: ; 0x02058148 - push {r4, lr} - add r4, r0, #0x0 - mov r1, #0x4 - bl MapObject_SetFlagsBits - add r0, r4, #0x0 - bl sub_0205815C - pop {r4, pc} - .balign 4 - - thumb_func_start sub_0205815C -sub_0205815C: ; 0x0205815C - ldr r3, _02058164 ; =MapObject_ClearFlagsBits - ldr r1, _02058168 ; =0x05108000 - bx r3 - nop -_02058164: .word MapObject_ClearFlagsBits -_02058168: .word 0x05108000 - - thumb_func_start sub_0205816C -sub_0205816C: ; 0x0205816C - bx lr - .balign 4 - - thumb_func_start FieldSystem_ResolveObjectSpriteID -FieldSystem_ResolveObjectSpriteID: ; 0x02058170 - push {r3, lr} - cmp r1, #0x65 - blt _02058186 - cmp r1, #0x75 - bgt _02058186 - sub r1, #0x65 - lsl r1, r1, #0x10 - lsr r1, r1, #0x10 - bl sub_02039504 - add r1, r0, #0x0 -_02058186: - add r0, r1, #0x0 - pop {r3, pc} - .balign 4 - - thumb_func_start sub_0205818C -sub_0205818C: ; 0x0205818C - push {r4, lr} - mov r1, #0x1 - lsl r1, r1, #0xc - add r4, r0, #0x0 - bl MapObject_GetFlagsBits - cmp r0, #0x0 - beq _020581A2 - add r0, r4, #0x0 - bl sub_02059D1C -_020581A2: - pop {r4, pc} - - thumb_func_start sub_020581A4 -sub_020581A4: ; 0x020581A4 - push {r4, lr} - add r4, r0, #0x0 - bl sub_02057EE0 - add r0, r4, #0x0 - bl sub_02058EE8 - pop {r4, pc} - thumb_func_start sub_020581B4 sub_020581B4: ; 0x020581B4 push {r4, lr} diff --git a/arm9/asm/unk_02038C78.s b/arm9/asm/unk_02038C78.s index 8cb977fce..4dff53c45 100644 --- a/arm9/asm/unk_02038C78.s +++ b/arm9/asm/unk_02038C78.s @@ -1982,8 +1982,8 @@ _020394FE: pop {r4, pc} .balign 4 - thumb_func_start sub_02039504 -sub_02039504: ; 0x02039504 + thumb_func_start FieldSystem_VarGetObjectEventGraphicsId +FieldSystem_VarGetObjectEventGraphicsId: ; 0x02039504 push {r3-r5, lr} add r4, r1, #0x0 add r5, r0, #0x0 diff --git a/arm9/asm/unk_0204B34C.s b/arm9/asm/unk_0204B34C.s index da37f6f5d..8e49197a7 100644 --- a/arm9/asm/unk_0204B34C.s +++ b/arm9/asm/unk_0204B34C.s @@ -210,7 +210,7 @@ sub_0204B490: ; 0x0204B490 add r1, sp, #0x0 add r2, sp, #0x4 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x1 bne _0204B4F8 mov r6, #0x0 @@ -240,7 +240,7 @@ _0204B4E8: add r1, sp, #0x0 add r2, sp, #0x4 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x1 beq _0204B4B6 _0204B4F8: diff --git a/arm9/asm/unk_02055068.s b/arm9/asm/unk_02055068.s index a38ad5ad6..4c0ac6587 100644 --- a/arm9/asm/unk_02055068.s +++ b/arm9/asm/unk_02055068.s @@ -271,7 +271,7 @@ sub_020552A4: ; 0x020552A4 add r2, sp, #0x4 mov r3, #0x1 add r5, r0, #0x0 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x0 beq _020552DE add r4, sp, #0x0 @@ -286,7 +286,7 @@ _020552C4: add r1, r4, #0x0 add r2, r6, #0x0 add r3, r7, #0x0 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x0 bne _020552C4 _020552DE: diff --git a/arm9/asm/unk_0205C598.s b/arm9/asm/unk_0205C598.s index e6768d0e1..5d6f41dbf 100644 --- a/arm9/asm/unk_0205C598.s +++ b/arm9/asm/unk_0205C598.s @@ -175,7 +175,7 @@ sub_0205C6BC: ; 0x0205C6BC add r1, sp, #0x4 add r2, sp, #0xc mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x0 beq _0205C734 _0205C6DE: @@ -216,7 +216,7 @@ _0205C724: add r1, sp, #0x4 add r2, sp, #0xc mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x0 bne _0205C6DE _0205C734: @@ -599,7 +599,7 @@ sub_0205C9F0: ; 0x0205C9F0 add r1, sp, #0x0 add r2, sp, #0x4 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x0 beq _0205CA40 add r7, sp, #0x0 @@ -623,7 +623,7 @@ _0205CA30: add r1, r7, #0x0 add r2, sp, #0x4 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x0 bne _0205CA10 _0205CA40: diff --git a/arm9/asm/unk_0205E4EC.s b/arm9/asm/unk_0205E4EC.s index e710bb58c..c80e41c87 100644 --- a/arm9/asm/unk_0205E4EC.s +++ b/arm9/asm/unk_0205E4EC.s @@ -441,7 +441,7 @@ _0205E810: add r1, sp, #0x4 add r2, sp, #0x8 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x1 bne _0205E84C _0205E81E: @@ -463,7 +463,7 @@ _0205E83C: add r1, sp, #0x4 add r2, sp, #0x8 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x1 beq _0205E81E _0205E84C: @@ -492,7 +492,7 @@ sub_0205E854: ; 0x0205E854 add r1, sp, #0x4 add r2, sp, #0x8 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x1 bne _0205E8C6 _0205E886: @@ -523,7 +523,7 @@ _0205E8B6: add r1, sp, #0x4 add r2, sp, #0x8 mov r3, #0x1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #0x1 beq _0205E886 _0205E8C6: diff --git a/arm9/global.inc b/arm9/global.inc index cb748c6b6..0449e5ce4 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -2680,7 +2680,7 @@ .extern sub_02039460 .extern GetVarPointer .extern FieldSystem_VarGet -.extern sub_02039504 +.extern FieldSystem_VarGetObjectEventGraphicsId .extern FieldSystem_FlagCheck .extern FieldSystem_FlagSet .extern FlagClear @@ -4001,7 +4001,7 @@ .extern MapObject_CreateFromMultipleObjectEvents .extern MapObjectManager_GetFirstActiveObjectByID .extern MapObjectManager_GetFirstActiveObjectWithMovement -.extern MapObjectManager_GetFirstObjectAndIndexWithFlag +.extern MapObjectManager_GetNextObjectWithFlagFromIndex .extern sub_0205829C .extern sub_020582A8 .extern sub_020582F8 diff --git a/arm9/overlays/05/asm/ov05_021F1F04.s b/arm9/overlays/05/asm/ov05_021F1F04.s index 421be3a0a..6dfb22dd7 100644 --- a/arm9/overlays/05/asm/ov05_021F1F04.s +++ b/arm9/overlays/05/asm/ov05_021F1F04.s @@ -1585,7 +1585,7 @@ ov05_021F2B10: ; 0x021F2B10 add r2, sp, #4 mov r3, #1 add r7, r0, #0 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #1 bne _021F2B6A _021F2B2E: @@ -1615,7 +1615,7 @@ _021F2B5A: add r1, sp, #0 add r2, sp, #4 mov r3, #1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #1 beq _021F2B2E _021F2B6A: @@ -1636,7 +1636,7 @@ ov05_021F2B70: ; 0x021F2B70 add r2, sp, #4 mov r3, #1 add r7, r0, #0 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #1 bne _021F2BEE _021F2B8E: @@ -1682,7 +1682,7 @@ _021F2BDE: add r1, sp, #0 add r2, sp, #4 mov r3, #1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #1 beq _021F2B8E _021F2BEE: @@ -1705,7 +1705,7 @@ ov05_021F2BF8: ; 0x021F2BF8 add r2, sp, #4 mov r3, #1 add r7, r0, #0 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #1 bne _021F2C74 _021F2C16: @@ -1750,7 +1750,7 @@ _021F2C64: add r1, sp, #0 add r2, sp, #4 mov r3, #1 - bl MapObjectManager_GetFirstObjectAndIndexWithFlag + bl MapObjectManager_GetNextObjectWithFlagFromIndex cmp r0, #1 beq _021F2C16 _021F2C74: diff --git a/arm9/src/map_object.c b/arm9/src/map_object.c index 2ee6c6f21..572060295 100644 --- a/arm9/src/map_object.c +++ b/arm9/src/map_object.c @@ -24,8 +24,12 @@ static void sub_02057E90(LocalMapObject *object, MapObjectManager *manager); static void MapObject_Clear(LocalMapObject *object); static u32 sub_02057F90(LocalMapObject *object, u32 flagId, u32 objectEventCount, ObjectEvent *objectEvents); static LocalMapObject *MapObjectManager_GetFirstObjectWithID(MapObjectManager *manager, u32 objectId, u32 flagId); - -extern BOOL MapObjectManager_GetFirstObjectAndIndexWithFlag(MapObjectManager *manager, LocalMapObject **object, s32 *index, MapObjectFlagBits bits); +static void sub_02058148(LocalMapObject *object); +/*static*/ void sub_0205815C(LocalMapObject *object); +static void MapObject_NoOp(LocalMapObject *object); +static u32 FieldSystem_ResolveObjectSpriteID(FieldSystem *fieldSystem, s32 spriteId); +/*static*/ void sub_0205818C(LocalMapObject *object); +static void sub_020581A4(LocalMapObject *object); extern void MapObjectManager_SetFieldSystemPtr(MapObjectManager *manager, FieldSystem *fieldSystem); extern void MapObjectManager_SetObjectCount(MapObjectManager *manager, u32 objectCount); @@ -46,7 +50,6 @@ extern void sub_02058258(LocalMapObject *object, u32 mapNo, ObjectEvent *objectE extern FieldSystem *MapObjectManager_GetFieldSystemPtr(MapObjectManager *manager); extern void sub_02057E90(LocalMapObject *object, MapObjectManager *manager); extern void sub_0205844C(LocalMapObject *object, u32 mapNo); -extern void sub_020581A4(LocalMapObject *object); extern void sub_020581B4(LocalMapObject *object); extern void MapObject_SetFlagsBits(LocalMapObject *object, MapObjectFlagBits bits); extern MapObjectManager *MapObjectManager_GetMapObjectManager(MapObjectManager *manager); @@ -68,7 +71,6 @@ extern u32 ObjectEvent_GetFlagID(ObjectEvent *objectEvent); extern ObjectEvent *ObjectEvent_GetById(u32 id, u32 objectEventCount, ObjectEvent *events); extern u8 FieldSystem_FlagCheck(FieldSystem *fieldSystem, u16 flag); extern void MapObject_SetSpriteID(LocalMapObject *object, u32 sprite); -extern void sub_02058148(LocalMapObject *object); extern void MapObject_ClearFlagsBits(LocalMapObject *object, MapObjectFlagBits bits); extern BOOL sub_02058934(LocalMapObject *object); extern MapObjectManager *MapObject_GetManager(LocalMapObject *object); @@ -92,7 +94,6 @@ extern void sub_020586AC(LocalMapObject *object, LocalMapObject_UnkCallback call extern void sub_020586C0(LocalMapObject *object, LocalMapObject_UnkCallback callback); extern void sub_020586D4(LocalMapObject *object, LocalMapObject_UnkCallback callback); extern void sub_020586C8(LocalMapObject *object); -extern void sub_0205816C(LocalMapObject *object); extern BOOL MapObject_CheckFlag14(LocalMapObject *object); extern void sub_020586DC(LocalMapObject *object); extern void sub_02057AEC(MapObjectManager *manager, LocalMapObject *object); @@ -145,7 +146,6 @@ extern void MapObject_SetPositionVec(LocalMapObject *object, VecFx32 *coords); extern void MapObject_SetManager(LocalMapObject *object, MapObjectManager *manager); extern void MapObject_ClearHeldMovement(LocalMapObject *object); extern void sub_0205866C(LocalMapObject *object); -extern void sub_0205815C(LocalMapObject *object); extern void MapObject_GetPositionVec(LocalMapObject *object, VecFx32 *position); extern void MapObject_SetPreviousX(LocalMapObject *object, u32 previousX); extern void MapObject_SetPreviousHeight(LocalMapObject *object, u32 previousHeight); @@ -157,7 +157,6 @@ extern void sub_0205832C(SysTask *task, LocalMapObject *object); extern u32 MapObjectManager_GetPriority(MapObjectManager *manager); extern void sub_02058554(LocalMapObject *object, SysTask *task); extern u16 ObjectEvent_GetSpriteID(ObjectEvent *objectEvent); -extern u32 FieldSystem_ResolveObjectSpriteID(FieldSystem *fieldSystem, u16 spriteId); extern u16 ObjectEvent_GetMovement(ObjectEvent *objectEvent); extern u16 ObjectEvent_GetType(ObjectEvent *objectEvent); extern u16 ObjectEvent_GetScript(ObjectEvent *objectEvent); @@ -189,6 +188,9 @@ extern void sub_020586C0(LocalMapObject *object, LocalMapObject_UnkCallback call extern LocalMapObject_UnkCallback sub_02058D48(UnkLMOCallbackStruct2 *callbackStruct); extern void sub_020586D4(LocalMapObject *object, LocalMapObject_UnkCallback callback); extern const LocalMapObject *MapObjectManager_GetConstObjects(MapObjectManager *manager); +extern u16 FieldSystem_VarGetObjectEventGraphicsId(FieldSystem *fieldSystem, u16 spriteId); +extern u32 sub_02059D1C(LocalMapObject *object); +extern void sub_02058EE8(LocalMapObject *object); MapObjectManager *MapObjectManager_Init(FieldSystem *fieldSystem, u32 objectCount, u32 priority) { MapObjectManager *ret = MapObjectManager_New(objectCount); @@ -383,7 +385,7 @@ void sub_02057750(MapObjectManager *manager) { do { if (MapObject_GetFlagsBits(objects, MAPOBJECTFLAG_ACTIVE) != 0 && MapObject_GetFlagsBits(objects, MAPOBJECTFLAG_UNK14) != 0) { sub_020586C8(objects); - sub_0205816C(objects); + MapObject_NoOp(objects); } i++; @@ -418,7 +420,7 @@ void FieldSystem_SyncMapObjectsToSaveEx(FieldSystem *fieldSystem, MapObjectManag s32 index = 0; LocalMapObject *object; - while (MapObjectManager_GetFirstObjectAndIndexWithFlag(manager, &object, &index, MAPOBJECTFLAG_ACTIVE)) { //MapObjectManager_GetNextActiveObject? this is an iterator however + while (MapObjectManager_GetNextObjectWithFlagFromIndex(manager, &object, &index, MAPOBJECTFLAG_ACTIVE)) { //MapObjectManager_GetNextActiveObject? this is an iterator however SavedMapObject_InitFromLocalMapObject(fieldSystem, object, savedObjects); count--; @@ -611,7 +613,7 @@ static LocalMapObject *sub_02057C98(MapObjectManager *manager, u32 id, u32 mapNo s32 index = 0; LocalMapObject *object; - while (MapObjectManager_GetFirstObjectAndIndexWithFlag(manager, &object, &index, MAPOBJECTFLAG_ACTIVE) == TRUE) { + while (MapObjectManager_GetNextObjectWithFlagFromIndex(manager, &object, &index, MAPOBJECTFLAG_ACTIVE) == TRUE) { if (MapObject_CheckFlag25(object) == TRUE && MapObject_GetID(object) == id && sub_02058750(object) == mapNo) { return object; } @@ -738,7 +740,7 @@ static LocalMapObject *MapObjectManager_GetFirstObjectWithID(MapObjectManager *m s32 index = 0; LocalMapObject *object; - while (MapObjectManager_GetFirstObjectAndIndexWithFlag(manager, &object, &index, MAPOBJECTFLAG_ACTIVE) == TRUE) { + while (MapObjectManager_GetNextObjectWithFlagFromIndex(manager, &object, &index, MAPOBJECTFLAG_ACTIVE) == TRUE) { if (MapObject_GetID(object) == objectId && sub_02058450(object) == flagId) { return object; } @@ -781,3 +783,59 @@ LocalMapObject *MapObjectManager_GetFirstActiveObjectWithMovement(MapObjectManag return NULL; } + +BOOL MapObjectManager_GetNextObjectWithFlagFromIndex(MapObjectManager *manager, LocalMapObject **objectDest, s32 *index, MapObjectFlagBits flag) { + s32 count = MapObjectManager_GetObjectCount(manager); + if (*index >= count) { + return FALSE; + } + + LocalMapObject *objects = (LocalMapObject *)MapObjectManager_GetConstObjects(manager); + LocalMapObject *object = objects + *index; + do { + (*index)++; + + if (flag == (MapObjectFlagBits)MapObject_GetFlagsBits(object, flag)) { + *objectDest = object; + return TRUE; + } + + object++; + } while (*index < count); + + return FALSE; +} + +static void sub_02058148(LocalMapObject *object) { + MapObject_SetFlagsBits(object, MAPOBJECTFLAG_UNK2); + sub_0205815C(object); +} + +/*static*/ void sub_0205815C(LocalMapObject *object) { + MapObject_ClearFlagsBits(object, (MapObjectFlagBits)(MAPOBJECTFLAG_UNK26 | MAPOBJECTFLAG_UNK24 | + MAPOBJECTFLAG_UNK20 | MAPOBJECTFLAG_UNK15)); +} + +static void MapObject_NoOp(LocalMapObject *object) { + // NoOp +} + +static u32 FieldSystem_ResolveObjectSpriteID(FieldSystem *fieldSystem, s32 spriteId) { + //BUG: index out of range, should be < not <= + //TODO: check these with sprite constants, these should be variable sprites but this starts at 101 not 100 + if (spriteId >= 101 && spriteId <= 117) { + spriteId = FieldSystem_VarGetObjectEventGraphicsId(fieldSystem, (u16)(spriteId - 101)); + } + return spriteId; +} + +/*static*/ void sub_0205818C(LocalMapObject *object) { + if (MapObject_GetFlagsBits(object, MAPOBJECTFLAG_UNK12) != 0) { + sub_02059D1C(object); + } +} + +static void sub_020581A4(LocalMapObject *object) { + sub_02057EE0(object); + sub_02058EE8(object); +} diff --git a/include/map_object.h b/include/map_object.h index b03cb27c9..dbbd4ae61 100644 --- a/include/map_object.h +++ b/include/map_object.h @@ -126,5 +126,6 @@ void MapObjectManager_RestoreFromSave(MapObjectManager *manager, SavedMapObject void MapObject_CreateFromMultipleObjectEvents(MapObjectManager *manager, u32 mapNo, u32 objectEventCount, ObjectEvent *objectEvents); LocalMapObject *MapObjectManager_GetFirstActiveObjectByID(MapObjectManager *manager, u32 id); LocalMapObject *MapObjectManager_GetFirstActiveObjectWithMovement(MapObjectManager *manager, u32 movement); +BOOL MapObjectManager_GetNextObjectWithFlagFromIndex(MapObjectManager *manager, LocalMapObject **objectDest, s32 *index, MapObjectFlagBits flag); #endif //POKEDIAMOND_MAP_OBJECT_H