diff options
author | camthesaxman <cameronghall@cox.net> | 2018-02-07 15:32:43 -0600 |
---|---|---|
committer | camthesaxman <cameronghall@cox.net> | 2018-02-07 15:32:43 -0600 |
commit | 1dd9be3869f99ae7256c6f7a04e78322d4f9a0cd (patch) | |
tree | 85f7f0af4c90410afb96cd16b7fd9bf0da57999a /src/field/field_map_obj.c | |
parent | c130c5aebaf05f6a256a24181033e54cf59d52bb (diff) |
InitFieldObjectStateFromTemplate fakematching
Diffstat (limited to 'src/field/field_map_obj.c')
-rw-r--r-- | src/field/field_map_obj.c | 429 |
1 files changed, 80 insertions, 349 deletions
diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index 2352b82d1..f3a949b51 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -2023,190 +2023,80 @@ u8 GetFieldObjectIdByLocalId(u8 localId) return 16; } -#if DEBUG -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm( - " push {r4, r5, r6, r7, lr}\n" - " mov r7, r9\n" - " mov r6, r8\n" - " push {r6, r7}\n" - " add sp, sp, #0xfffffffc\n" - " add r5, r0, #0\n" - " lsl r1, r1, #0x18\n" - " lsr r6, r1, #0x18\n" - " lsl r2, r2, #0x18\n" - " lsr r7, r2, #0x18\n" - " ldrb r0, [r5]\n" - " add r1, r6, #0\n" - " add r2, r7, #0\n" - " mov r3, sp\n" - " bl GetAvailableFieldObjectSlot\n" - " lsl r0, r0, #0x18\n" - " cmp r0, #0\n" - " beq ._35 @cond_branch\n" - " mov r0, #0x10\n" - " b ._36\n" - "._35:\n" - " mov r0, sp\n" - " ldrb r1, [r0]\n" - " lsl r0, r1, #0x3\n" - " add r0, r0, r1\n" - " lsl r0, r0, #0x2\n" - " ldr r1, ._40 @ gMapObjects\n" - " add r4, r0, r1\n" - " add r0, r4, #0\n" - " bl npc_clear_ids_and_state\n" - " ldrh r3, [r5, #0x4]\n" - " add r3, r3, #0x7\n" - " lsl r3, r3, #0x10\n" - " lsr r3, r3, #0x10\n" - " ldrh r2, [r5, #0x6]\n" - " add r2, r2, #0x7\n" - " lsl r2, r2, #0x10\n" - " lsr r2, r2, #0x10\n" - " ldrb r0, [r4]\n" - " mov r1, #0x1\n" - " orr r0, r0, r1\n" - " mov r1, #0x4\n" - " orr r0, r0, r1\n" - " strb r0, [r4]\n" - " ldrb r0, [r5, #0x1]\n" - " strb r0, [r4, #0x5]\n" - " ldrb r0, [r5, #0x9]\n" - " strb r0, [r4, #0x6]\n" - " ldrb r0, [r5]\n" - " strb r0, [r4, #0x8]\n" - " strb r6, [r4, #0x9]\n" - " strb r7, [r4, #0xa]\n" - " strh r3, [r4, #0xc]\n" - " strh r2, [r4, #0xe]\n" - " strh r3, [r4, #0x10]\n" - " strh r2, [r4, #0x12]\n" - " strh r3, [r4, #0x14]\n" - " strh r2, [r4, #0x16]\n" - " ldrb r0, [r5, #0x8]\n" - " mov r7, #0xf\n" - " add r1, r7, #0\n" - " and r1, r1, r0\n" - " ldrb r2, [r4, #0xb]\n" - " mov r0, #0x10\n" - " neg r0, r0\n" - " mov r8, r0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0xb]\n" - " ldrb r1, [r5, #0x8]\n" - " lsl r1, r1, #0x4\n" - " and r0, r0, r7\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0xb]\n" - " ldrb r1, [r5, #0xa]\n" - " lsl r1, r1, #0x1c\n" - " mov r0, #0xf\n" - " mov r9, r0\n" - " lsr r1, r1, #0x1c\n" - " ldrb r2, [r4, #0x19]\n" - " mov r0, r8\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - " ldrb r1, [r5, #0xa]\n" - " lsr r1, r1, #0x4\n" - " lsl r1, r1, #0x4\n" - " and r0, r0, r7\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - " ldrh r0, [r5, #0xc]\n" - " strb r0, [r4, #0x7]\n" - " ldrh r0, [r5, #0xe]\n" - " strb r0, [r4, #0x1d]\n" - " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n" - " ldrb r0, [r5, #0x9]\n" - " add r0, r0, r1\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " add r0, r0, #0x20\n" - " strb r1, [r0]\n" - " ldrb r1, [r0]\n" - " add r0, r4, #0\n" - " bl FieldObjectSetDirection\n" - " add r0, r4, #0\n" - " bl FieldObjectHandleDynamicGraphicsId\n" - " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n" - " ldrb r0, [r4, #0x6]\n" - " add r0, r0, r1\n" - " ldrb r0, [r0]\n" - " cmp r0, #0\n" - " beq ._39 @cond_branch\n" - " ldrb r2, [r4, #0x19]\n" - " add r0, r7, #0\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._38 @cond_branch\n" - " lsl r0, r2, #0x1c\n" - " lsr r0, r0, #0x1c\n" - " add r0, r0, #0x1\n" - " mov r1, r9\n" - " and r0, r0, r1\n" - " mov r1, r8\n" - " and r1, r1, r2\n" - " orr r1, r1, r0\n" - " strb r1, [r4, #0x19]\n" - "._38:\n" - " ldrb r2, [r4, #0x19]\n" - " mov r0, #0xf0\n" - " and r0, r0, r2\n" - " cmp r0, #0\n" - " bne ._39 @cond_branch\n" - " lsr r1, r2, #0x4\n" - " add r1, r1, #0x1\n" - " lsl r1, r1, #0x4\n" - " add r0, r7, #0\n" - " and r0, r0, r2\n" - " orr r0, r0, r1\n" - " strb r0, [r4, #0x19]\n" - "._39:\n" - " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n" - " ldrb r0, [r1]\n" - " add r0, r0, #0x1\n" - " strb r0, [r1]\n" - " mov r0, sp\n" - " ldrb r0, [r0]\n" - "._36:\n" - " add sp, sp, #0x4\n" - " pop {r3, r4}\n" - " mov r8, r3\n" - " mov r9, r4\n" - " pop {r4, r5, r6, r7}\n" - " pop {r1}\n" - " bx r1\n" - "._41:\n" - " .align 2, 0\n" - "._40:\n" - " .word gMapObjects\n" - " .word gUnknown_0836DC09\n" - " .word gUnknown_0836DBBC\n" - " .word gUnknown_Debug_03004BC0\n" - "\n" - ); -} -#else -#ifdef NONMATCHING +// The bitfield at 0x18 needs to be u16 for this function to match +struct MapObjectAlt +{ + /*0x00*/ u32 active:1; + u32 mapobj_bit_1:1; + u32 mapobj_bit_2:1; + u32 mapobj_bit_3:1; + u32 mapobj_bit_4:1; + u32 mapobj_bit_5:1; + u32 mapobj_bit_6:1; + u32 mapobj_bit_7:1; + /*0x01*/ u32 mapobj_bit_8:1; + u32 mapobj_bit_9:1; + u32 mapobj_bit_10:1; + u32 mapobj_bit_11:1; + u32 mapobj_bit_12:1; + u32 mapobj_bit_13:1; + u32 mapobj_bit_14:1; + u32 mapobj_bit_15:1; + /*0x02*/ u32 mapobj_bit_16:1; + u32 mapobj_bit_17:1; + u32 mapobj_bit_18:1; + u32 mapobj_bit_19:1; + u32 mapobj_bit_20:1; + u32 mapobj_bit_21:1; + u32 mapobj_bit_22:1; + u32 mapobj_bit_23:1; + /*0x03*/ u32 mapobj_bit_24:1; + u32 mapobj_bit_25:1; + u32 mapobj_bit_26:1; + u32 mapobj_bit_27:1; + u32 mapobj_bit_28:1; + u32 mapobj_bit_29:1; + u32 mapobj_bit_30:1; + u32 mapobj_bit_31:1; + /*0x04*/ u8 spriteId; + /*0x05*/ u8 graphicsId; + /*0x06*/ u8 animPattern; + /*0x07*/ u8 trainerType; + /*0x08*/ u8 localId; + /*0x09*/ u8 mapNum; + /*0x0A*/ u8 mapGroup; + /*0x0B*/ u8 mapobj_unk_0B_0:4; + u8 elevation:4; + /*0x0C*/ struct Coords16 coords1; + /*0x10*/ struct Coords16 coords2; + /*0x14*/ struct Coords16 coords3; + /*0x18*/ u16 mapobj_unk_18:4; //current direction? + /*0x18*/ u16 placeholder18:4; + /*0x19*/ u16 rangeX:4; + /*0x19*/ u16 rangeY:4; + /*0x1A*/ u8 mapobj_unk_1A; + /*0x1B*/ u8 mapobj_unk_1B; + /*0x1C*/ u8 mapobj_unk_1C; + /*0x1D*/ u8 trainerRange_berryTreeId; + /*0x1E*/ u8 mapobj_unk_1E; + /*0x1F*/ u8 mapobj_unk_1F; + /*0x20*/ u8 mapobj_unk_20; + /*0x21*/ u8 mapobj_unk_21; + /*0x22*/ u8 animId; + /*size = 0x24*/ +}; + u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) { - struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness + struct MapObjectAlt *mapObj; //TODO: resolve the mapobj_unk_19b weirdness u8 var; - u16 r3; - u16 r2; + s16 r3; + s16 r2; - //asm("nop"::"r"(b)); if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0) return 16; - //_0805ACCE - mapObj = &gMapObjects[var]; - npc_clear_ids_and_state(mapObj); + mapObj = (void *)&gMapObjects[var]; + npc_clear_ids_and_state((struct MapObject *)mapObj); r3 = template->x + 7; r2 = template->y + 7; mapObj->active = TRUE; @@ -2215,6 +2105,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 mapObj->animPattern = template->movementType; mapObj->localId = template->localId; mapObj->mapNum = b; + asm("":::"r6"); mapObj->mapGroup = c; mapObj->coords1.x = r3; mapObj->coords1.y = r2; @@ -2224,186 +2115,26 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 mapObj->coords3.y = r2; mapObj->mapobj_unk_0B_0 = template->elevation; mapObj->elevation = template->elevation; - mapObj->range.as_nybbles.x = template->unkA_0; - mapObj->range.as_nybbles.y = template->unkA_4; + mapObj->rangeX = template->unkA_0; + mapObj->rangeY = template->unkA_4; mapObj->trainerType = template->unkC; mapObj->trainerRange_berryTreeId = template->unkE; mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType]; FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20); - FieldObjectHandleDynamicGraphicsId(mapObj); - //asm("":::"r5","r6"); + asm("":::"r5","r6"); + FieldObjectHandleDynamicGraphicsId((struct MapObject *)mapObj); if (gUnknown_0836DBBC[mapObj->animPattern] != 0) { - if (mapObj->range.as_nybbles.x == 0) - mapObj->range.as_nybbles.x++; - if (mapObj->range.as_nybbles.y == 0) - mapObj->range.as_nybbles.y++; + if (mapObj->rangeX == 0) + mapObj->rangeX++; + if (mapObj->rangeY == 0) + mapObj->rangeY++; } +#if DEBUG + gUnknown_Debug_03004BC0++; +#endif return var; } -#else -__attribute__((naked)) -u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r6, r1, 24\n\ - lsls r2, 24\n\ - lsrs r7, r2, 24\n\ - ldrb r0, [r5]\n\ - adds r1, r6, 0\n\ - adds r2, r7, 0\n\ - mov r3, sp\n\ - bl GetAvailableFieldObjectSlot\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0805ACCE\n\ - movs r0, 0x10\n\ - b _0805ADC2\n\ -_0805ACCE:\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 3\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, _0805ADD0 @ =gMapObjects\n\ - adds r4, r0, r1\n\ - adds r0, r4, 0\n\ - bl npc_clear_ids_and_state\n\ - ldrh r3, [r5, 0x4]\n\ - adds r3, 0x7\n\ - lsls r3, 16\n\ - lsrs r3, 16\n\ - ldrh r2, [r5, 0x6]\n\ - adds r2, 0x7\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - ldrb r0, [r4]\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r4]\n\ - ldrb r0, [r5, 0x1]\n\ - strb r0, [r4, 0x5]\n\ - ldrb r0, [r5, 0x9]\n\ - strb r0, [r4, 0x6]\n\ - ldrb r0, [r5]\n\ - strb r0, [r4, 0x8]\n\ - strb r6, [r4, 0x9]\n\ - strb r7, [r4, 0xA]\n\ - strh r3, [r4, 0xC]\n\ - strh r2, [r4, 0xE]\n\ - strh r3, [r4, 0x10]\n\ - strh r2, [r4, 0x12]\n\ - strh r3, [r4, 0x14]\n\ - strh r2, [r4, 0x16]\n\ - ldrb r0, [r5, 0x8]\n\ - movs r7, 0xF\n\ - adds r1, r7, 0\n\ - ands r1, r0\n\ - ldrb r2, [r4, 0xB]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - mov r8, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0x8]\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0xB]\n\ - ldrb r1, [r5, 0xA]\n\ - lsls r1, 28\n\ - movs r0, 0xF\n\ - mov r9, r0\n\ - lsrs r1, 28\n\ - ldrb r2, [r4, 0x19]\n\ - mov r0, r8\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrb r1, [r5, 0xA]\n\ - lsrs r1, 4\n\ - lsls r1, 4\n\ - ands r0, r7\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ - ldrh r0, [r5, 0xC]\n\ - strb r0, [r4, 0x7]\n\ - ldrh r0, [r5, 0xE]\n\ - strb r0, [r4, 0x1D]\n\ - ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\ - ldrb r0, [r5, 0x9]\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - adds r0, 0x20\n\ - strb r1, [r0]\n\ - ldrb r1, [r0]\n\ - adds r0, r4, 0\n\ - bl FieldObjectSetDirection\n\ - adds r0, r4, 0\n\ - bl FieldObjectHandleDynamicGraphicsId\n\ - ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\ - ldrb r0, [r4, 0x6]\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _0805ADBE\n\ - ldrb r2, [r4, 0x19]\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADA6\n\ - lsls r0, r2, 28\n\ - lsrs r0, 28\n\ - adds r0, 0x1\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r8\n\ - ands r1, r2\n\ - orrs r1, r0\n\ - strb r1, [r4, 0x19]\n\ -_0805ADA6:\n\ - ldrb r2, [r4, 0x19]\n\ - movs r0, 0xF0\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - bne _0805ADBE\n\ - lsrs r1, r2, 4\n\ - adds r1, 0x1\n\ - lsls r1, 4\n\ - adds r0, r7, 0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r4, 0x19]\n\ -_0805ADBE:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ -_0805ADC2:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_0805ADD0: .4byte gMapObjects\n\ -_0805ADD4: .4byte gUnknown_0836DC09\n\ -_0805ADD8: .4byte gUnknown_0836DBBC\n\ - .syntax divided\n"); -} -#endif -#endif u8 sub_805ADDC(u8 localId) { |