summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorscnorton <scnorton@biociphers.org>2017-05-22 17:21:17 -0400
committerscnorton <scnorton@biociphers.org>2017-05-24 16:14:50 -0400
commitabe5f5053624f876ea17c44370b203c0a4ace86b (patch)
tree187c4ff271a901b75360070b3e76e3c986cc72b2
parent4c42206a7f63b2045eae85ad2b4a60a630178d4c (diff)
Another chunk of library-like functions
-rw-r--r--asm/field_map_obj.s285
-rw-r--r--include/field_ground_effect.h10
-rw-r--r--include/field_map_obj.h4
-rw-r--r--include/fieldmap.h4
-rw-r--r--src/field_map_obj.c105
5 files changed, 121 insertions, 287 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index 3db00279d..5de921af9 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -3517,291 +3517,6 @@ sub_805FD08: @ 805FD08
.section .text_805fd18
- thumb_func_start sub_805FE28
-sub_805FE28: @ 805FE28
- push {r4,lr}
- adds r3, r1, 0
- lsls r2, 24
- lsrs r2, 24
- ldrb r0, [r0, 0x1]
- lsls r0, 27
- lsrs r4, r0, 31
- cmp r4, 0
- bne _0805FE5E
- adds r0, r3, 0
- adds r0, 0x2A
- strb r2, [r0]
- adds r0, 0x1
- ldrb r2, [r0]
- adds r1, r0, 0
- cmp r2, 0x1
- bne _0805FE50
- movs r0, 0x2
- strb r0, [r1]
- b _0805FE56
-_0805FE50:
- cmp r2, 0x3
- bne _0805FE56
- strb r4, [r1]
-_0805FE56:
- ldrb r1, [r1]
- adds r0, r3, 0
- bl SeekSpriteAnim
-_0805FE5E:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_805FE28
-
- thumb_func_start sub_805FE64
-sub_805FE64: @ 805FE64
- push {lr}
- lsls r2, 24
- lsrs r2, 24
- ldrb r0, [r0, 0x1]
- lsls r0, 27
- cmp r0, 0
- blt _0805FE8C
- adds r0, r1, 0
- adds r0, 0x2A
- strb r2, [r0]
- movs r2, 0x3
- adds r0, 0x1
- ldrb r0, [r0]
- cmp r0, 0x1
- bhi _0805FE84
- movs r2, 0x1
-_0805FE84:
- adds r0, r1, 0
- adds r1, r2, 0
- bl SeekSpriteAnim
-_0805FE8C:
- pop {r0}
- bx r0
- thumb_func_end sub_805FE64
-
- thumb_func_start sub_805FE90
-sub_805FE90: @ 805FE90
- push {lr}
- lsls r1, 16
- lsrs r1, 16
- lsls r3, 16
- lsrs r3, 16
- lsls r0, 16
- asrs r0, 16
- lsls r2, 16
- asrs r2, 16
- cmp r0, r2
- ble _0805FEAA
- movs r0, 0x3
- b _0805FEC0
-_0805FEAA:
- cmp r0, r2
- bge _0805FEB2
- movs r0, 0x4
- b _0805FEC0
-_0805FEB2:
- lsls r1, 16
- lsls r0, r3, 16
- cmp r1, r0
- bgt _0805FEBE
- movs r0, 0x1
- b _0805FEC0
-_0805FEBE:
- movs r0, 0x2
-_0805FEC0:
- pop {r1}
- bx r1
- thumb_func_end sub_805FE90
-
- thumb_func_start npc_set_running_behaviour_etc
-npc_set_running_behaviour_etc: @ 805FEC4
- push {r4,lr}
- mov r12, r0
- lsls r1, 24
- lsrs r1, 24
- movs r3, 0
- strb r1, [r0, 0x6]
- adds r0, 0x21
- strb r3, [r0]
- adds r0, 0x1
- strb r3, [r0]
- ldr r4, _0805FF08 @ =gSprites
- mov r0, r12
- ldrb r2, [r0, 0x4]
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r2, r4, 0
- adds r2, 0x1C
- adds r0, r2
- ldr r2, _0805FF0C @ =gUnknown_0836DA88
- lsls r1, 2
- adds r1, r2
- ldr r1, [r1]
- str r1, [r0]
- mov r0, r12
- ldrb r1, [r0, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- strh r3, [r0, 0x30]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0805FF08: .4byte gSprites
-_0805FF0C: .4byte gUnknown_0836DA88
- thumb_func_end npc_set_running_behaviour_etc
-
- thumb_func_start npc_running_behaviour_by_direction
-npc_running_behaviour_by_direction: @ 805FF10
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _0805FF1C @ =gUnknown_0837567B
- adds r0, r1
- ldrb r0, [r0]
- bx lr
- .align 2, 0
-_0805FF1C: .4byte gUnknown_0837567B
- thumb_func_end npc_running_behaviour_by_direction
-
- thumb_func_start sub_805FF20
-sub_805FF20: @ 805FF20
- push {r4-r6,lr}
- sub sp, 0x4
- adds r6, r0, 0
- lsls r5, r1, 24
- lsrs r5, 24
- ldrh r1, [r6, 0x10]
- mov r0, sp
- strh r1, [r0]
- ldrh r0, [r6, 0x12]
- mov r4, sp
- adds r4, 0x2
- strh r0, [r4]
- adds r0, r5, 0
- mov r1, sp
- adds r2, r4, 0
- bl MoveCoords
- mov r0, sp
- movs r2, 0
- ldrsh r1, [r0, r2]
- movs r0, 0
- ldrsh r2, [r4, r0]
- adds r0, r6, 0
- adds r3, r5, 0
- bl npc_block_way
- lsls r0, 24
- lsrs r0, 24
- add sp, 0x4
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_805FF20
-
- thumb_func_start npc_block_way
-npc_block_way: @ 805FF60
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r6, r0, 0
- lsls r1, 16
- lsls r2, 16
- lsls r3, 24
- lsrs r7, r3, 24
- mov r8, r7
- lsrs r0, r1, 16
- mov r9, r0
- asrs r5, r1, 16
- lsrs r0, r2, 16
- mov r10, r0
- asrs r4, r2, 16
- adds r0, r6, 0
- adds r1, r5, 0
- adds r2, r4, 0
- bl IsCoordOutsideFieldObjectMovementRect
- lsls r0, 24
- cmp r0, 0
- beq _0805FF96
- movs r0, 0x1
- b _08060016
-_0805FF96:
- adds r0, r5, 0
- adds r1, r4, 0
- bl MapGridIsImpassableAt
- lsls r0, 24
- cmp r0, 0
- bne _0805FFD8
- adds r0, r5, 0
- adds r1, r4, 0
- bl GetMapBorderIdAt
- movs r1, 0x1
- negs r1, r1
- cmp r0, r1
- beq _0805FFD8
- adds r0, r6, 0
- adds r1, r5, 0
- adds r2, r4, 0
- adds r3, r7, 0
- bl IsMetatileDirectionallyImpassable
- lsls r0, 24
- cmp r0, 0
- bne _0805FFD8
- ldrb r0, [r6, 0x1]
- lsrs r0, 7
- cmp r0, 0
- beq _0805FFDC
- mov r0, r8
- bl CanCameraMoveInDirection
- cmp r0, 0
- bne _0805FFDC
-_0805FFD8:
- movs r0, 0x2
- b _08060016
-_0805FFDC:
- ldrb r0, [r6, 0xB]
- lsls r0, 28
- lsrs r0, 28
- mov r2, r9
- lsls r1, r2, 16
- asrs r5, r1, 16
- mov r2, r10
- lsls r1, r2, 16
- asrs r4, r1, 16
- adds r1, r5, 0
- adds r2, r4, 0
- bl IsZCoordMismatchAt
- lsls r0, 24
- cmp r0, 0
- beq _08060000
- movs r0, 0x3
- b _08060016
-_08060000:
- adds r0, r6, 0
- adds r1, r5, 0
- adds r2, r4, 0
- bl CheckForCollisionBetweenFieldObjects
- lsls r0, 24
- cmp r0, 0
- bne _08060014
- movs r0, 0
- b _08060016
-_08060014:
- movs r0, 0x4
-_08060016:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end npc_block_way
-
thumb_func_start sub_8060024
sub_8060024: @ 8060024
push {r4-r7,lr}
diff --git a/include/field_ground_effect.h b/include/field_ground_effect.h
new file mode 100644
index 000000000..590923041
--- /dev/null
+++ b/include/field_ground_effect.h
@@ -0,0 +1,10 @@
+//
+// Created by Scott Norton on 5/22/17.
+//
+
+#ifndef POKERUBY_FIELD_GROUND_EFFECT_H
+#define POKERUBY_FIELD_GROUND_EFFECT_H
+
+bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y);
+
+#endif //POKERUBY_FIELD_GROUND_EFFECT_H
diff --git a/include/field_map_obj.h b/include/field_map_obj.h
index 00fda8358..4f611aab2 100644
--- a/include/field_map_obj.h
+++ b/include/field_map_obj.h
@@ -26,6 +26,8 @@ static u8 callback(struct MapObject *mapObject, struct Sprite *sprite)\
return 0;\
}
+bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y);
+
void sub_805C058(struct MapObject *mapObject, s16 a, s16 b);
void FieldObjectSetDirection(struct MapObject *pObject, u8 unk_18);
void MoveCoords(u8 direction, s16 *x, s16 *y);
@@ -48,4 +50,6 @@ extern const u8 gUnknown_083753C8[2];
extern const u8 gUnknown_083753DC[5];
extern const u8 gUnknown_083753F4[5];
+extern const u8 gUnknown_0837567B[9];
+
#endif // GUARD_FIELD_MAP_OBJ_H
diff --git a/include/fieldmap.h b/include/fieldmap.h
index 936d27b4a..87f113122 100644
--- a/include/fieldmap.h
+++ b/include/fieldmap.h
@@ -1,6 +1,10 @@
#ifndef GUARD_FIELDMAP2_H
#define GUARD_FIELDMAP2_H
+#include "field_map_obj.h"
struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection);
+int GetMapBorderIdAt(int x, int y);
+bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction);
+int CanCameraMoveInDirection(int direction);
#endif
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index b75f16d54..7c332c505 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -1,10 +1,12 @@
#include "global.h"
#include "field_map_obj.h"
+#include "fieldmap.h"
#include "asm.h"
#include "berry.h"
#include "event_data.h"
#include "field_player_avatar.h"
#include "field_effect.h"
+#include "field_ground_effect.h"
#include "palette.h"
#include "rom4.h"
#include "rng.h"
@@ -20,14 +22,14 @@ extern void npc_load_two_palettes__and_record(u16, u8);
extern void sub_8060388(s16, s16, s16 *, s16 *);
extern void sub_80634D0();
extern void pal_patch_for_npc(u16, u16);
-extern void sub_80603CC();
+extern void sub_80603CC(s16, s16, s16 *, s16 *);
extern void CameraObjectReset1(void);
void sub_805AAB0(void);
u8 GetFieldObjectIdByLocalId(u8);
u8 GetFieldObjectIdByLocalIdAndMapInternal(u8, u8, u8);
u8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *);
-void FieldObjectHandleDynamicGraphicsId();
+void FieldObjectHandleDynamicGraphicsId(struct MapObject *);
void RemoveFieldObjectInternal(struct MapObject *);
u16 GetFieldObjectFlagIdByFieldObjectId(u8);
void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables);
@@ -2897,3 +2899,102 @@ u8 get_run_image_anim_num(u8 direction)
{
return gUnknown_08375672[direction];
}
+
+void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum)
+{
+ if (!mapObject->mapobj_bit_12)
+ {
+ sprite->animNum = animNum;
+ if (sprite->animCmdIndex == 1)
+ {
+ sprite->animCmdIndex = 2;
+ } else if (sprite->animCmdIndex == 3)
+ {
+ sprite->animCmdIndex = 0;
+ }
+ SeekSpriteAnim(sprite, sprite->animCmdIndex);
+ }
+}
+
+void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum)
+{
+ u8 animCmdIndex;
+ if (!mapObject->mapobj_bit_12)
+ {
+ sprite->animNum = animNum;
+ animCmdIndex = 3;
+ if (sprite->animCmdIndex < 2)
+ {
+ animCmdIndex = 1;
+ }
+ SeekSpriteAnim(sprite, animCmdIndex);
+ }
+}
+
+u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ if (a0 > a2)
+ {
+ return DIR_WEST;
+ } else if (a0 < a2)
+ {
+ return DIR_EAST;
+ } else if (a1 > a3)
+ {
+ return DIR_NORTH;
+ } else
+ {
+ return DIR_SOUTH;
+ }
+}
+
+void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern)
+{
+ mapObject->animPattern = animPattern;
+ mapObject->mapobj_unk_21 = 0;
+ mapObject->animId = 0;
+ gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern];
+ gSprites[mapObject->spriteId].data1 = 0;
+}
+
+u8 npc_running_behaviour_by_direction(u8 direction)
+{
+ return gUnknown_0837567B[direction];
+}
+
+u8 sub_805FF20(struct MapObject *mapObject, u8 direction)
+{
+ s16 x;
+ s16 y;
+ x = mapObject->coords2.x;
+ y = mapObject->coords2.y;
+ MoveCoords(direction, &x, &y);
+ return npc_block_way(mapObject, x, y, direction);
+}
+
+bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y);
+
+u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
+{
+ if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y))
+ {
+ return 1;
+ }
+ if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction))
+ {
+ return 2;
+ }
+ if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))
+ {
+ return 2;
+ }
+ if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
+ {
+ return 3;
+ }
+ if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
+ {
+ return 4;
+ }
+ return 0;
+}