summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/field_message_box.c153
-rw-r--r--src/map_obj_80643A4.c324
-rw-r--r--src/map_obj_lock.c125
-rw-r--r--src/sprite.c2
4 files changed, 602 insertions, 2 deletions
diff --git a/src/field_message_box.c b/src/field_message_box.c
new file mode 100644
index 000000000..34670f956
--- /dev/null
+++ b/src/field_message_box.c
@@ -0,0 +1,153 @@
+#include "global.h"
+#include "text.h"
+#include "text_window.h"
+#include "task.h"
+#include "string_util.h"
+
+extern struct Window unk_202E87C;
+extern u16 word_202E9D2;
+
+extern u16 gMenuTextTileOffset;
+
+extern u8 byte_30005A8;
+
+void textbox_fdecode_auto_and_task_add(u8 *);
+void textbox_auto_and_task_add(void);
+
+void sub_8064A74(void)
+{
+ byte_30005A8 = 0;
+ SetMessageBoxBaseTileNum(word_202E9D2);
+ InitWindowFromConfig(&unk_202E87C, (struct WindowConfig *)&gWindowConfig_81E6CE4);
+}
+
+void sub_8064AA0(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ LoadMessageBoxTiles(&unk_202E87C);
+ task->data[0]++;
+ break;
+ case 1:
+ DrawStandardMessageBox(&unk_202E87C);
+ task->data[0]++;
+ break;
+ case 2:
+ switch (byte_30005A8)
+ {
+ case 2:
+ if (!sub_80035AC(&unk_202E87C))
+ return;
+ break;
+ case 3:
+ if (!sub_8003778(&unk_202E87C))
+ return;
+ break;
+ }
+ byte_30005A8 = 0;
+ DestroyTask(taskId);
+ }
+}
+
+void task_add_textbox(void)
+{
+ CreateTask(sub_8064AA0, 80);
+}
+
+void task_del_textbox()
+{
+ u8 taskId = FindTaskIdByFunc(sub_8064AA0);
+ if (taskId != 0xFF)
+ DestroyTask(taskId);
+}
+
+bool8 box_related_two__2(u8 *a1)
+{
+ if (byte_30005A8)
+ {
+ return FALSE;
+ }
+ else
+ {
+ textbox_fdecode_auto_and_task_add(a1);
+ byte_30005A8 = 2;
+ return TRUE;
+ }
+}
+
+bool8 box_related_two__3(u8 *a1)
+{
+ if (byte_30005A8)
+ {
+ return FALSE;
+ }
+ else
+ {
+ byte_30005A8 = 3;
+ textbox_fdecode_auto_and_task_add(a1);
+ return TRUE;
+ }
+}
+
+bool8 unref_sub_8064BB8(u8 *a1)
+{
+ byte_30005A8 = 3;
+ textbox_fdecode_auto_and_task_add(a1);
+ return TRUE;
+}
+
+bool8 unref_sub_8064BD0(u8 *a1)
+{
+ if (byte_30005A8)
+ {
+ return FALSE;
+ }
+ else
+ {
+ byte_30005A8 = 2;
+ textbox_auto_and_task_add();
+ return TRUE;
+ }
+}
+
+void textbox_fdecode_auto_and_task_add(u8 *a1)
+{
+ StringExpandPlaceholders(gStringVar4, a1);
+ sub_8002EB0(&unk_202E87C, gStringVar4, gMenuTextTileOffset, 2, 15);
+ task_add_textbox();
+}
+
+void textbox_auto_and_task_add(void)
+{
+ sub_8002EB0(&unk_202E87C, gStringVar4, gMenuTextTileOffset, 2, 15);
+ task_add_textbox();
+}
+
+void textbox_close()
+{
+ task_del_textbox();
+ sub_806536C(&unk_202E87C);
+ byte_30005A8 = 0;
+}
+
+u8 textbox_any_visible()
+{
+ return byte_30005A8;
+}
+
+bool8 sub_8064C84()
+{
+ if (byte_30005A8 == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void unref_sub_8064CA0()
+{
+ task_del_textbox();
+ DrawStandardMessageBox(&unk_202E87C);
+ byte_30005A8 = 0;
+}
diff --git a/src/map_obj_80643A4.c b/src/map_obj_80643A4.c
new file mode 100644
index 000000000..8e2faf268
--- /dev/null
+++ b/src/map_obj_80643A4.c
@@ -0,0 +1,324 @@
+#include "global.h"
+#include "sprite.h"
+#include "fieldmap.h"
+
+extern void SetObjectSubpriorityByZCoord(u8, struct Sprite *, u8);
+extern u8 FieldObjectDirectionToImageAnimId(u8);
+extern u32 FieldEffectStart(u8);
+extern void FieldObjectGetLocalIdAndMap(struct MapObject *, u8 *, u8 *, u8 *);
+extern struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8);
+
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
+
+extern u32 gUnknown_0202FF84[];
+
+extern struct UCoords16 gDirectionToVector[];
+extern s16 gUnknown_08376194[];
+extern SpriteStepFunc *gUnknown_08376180[];
+extern s8 *gUnknown_083761D0[];
+extern s16 gUnknown_083761DC[];
+extern u8 gUnknown_083761E2[];
+extern s16 gUnknown_083761E6[];
+extern u8 gUnknown_083761EC[];
+
+bool8 sub_80643A4(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8)
+ {
+ return TRUE;
+ }
+ else
+ {
+ mapObject->mapobj_bit_8 = 1;
+ mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused;
+ mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused;
+ gSprites[mapObject->spriteId].animPaused = 1;
+ gSprites[mapObject->spriteId].affineAnimPaused = 1;
+ return FALSE;
+ }
+}
+
+void player_bitmagic()
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ sub_80643A4(&gMapObjects[i]);
+}
+
+void sub_8064470(u8 a1)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ sub_80643A4(&gMapObjects[i]);
+}
+
+void npc_sync_anim_pause_bits(struct MapObject *mapObject)
+{
+ if (mapObject->active && mapObject->mapobj_bit_8)
+ {
+ mapObject->mapobj_bit_8 = 0;
+ gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23;
+ gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24;
+ }
+}
+
+void sub_806451C(void)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (gMapObjects[i].active)
+ npc_sync_anim_pause_bits(&gMapObjects[i]);
+}
+
+void little_step(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += gDirectionToVector[dir].x;
+ sprite->pos1.y += gDirectionToVector[dir].y;
+}
+
+void sub_806456C(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * gDirectionToVector[dir].x;
+ sprite->pos1.y += 2 * gDirectionToVector[dir].y;
+}
+
+void sub_8064590(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * gDirectionToVector[dir].x + gDirectionToVector[dir].x;
+ sprite->pos1.y += 2 * gDirectionToVector[dir].y + gDirectionToVector[dir].y;
+}
+
+void sub_80645B8(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 4 * gDirectionToVector[dir].x;
+ sprite->pos1.y += 4 * gDirectionToVector[dir].y;
+}
+
+void sub_80645DC(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 8 * gDirectionToVector[dir].x;
+ sprite->pos1.y += 8 * gDirectionToVector[dir].y;
+}
+
+void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->data3 = a2;
+ sprite->data4 = a3;
+ sprite->data5 = 0;
+}
+
+bool8 obj_npc_ministep(struct Sprite *sprite)
+{
+ if (sprite->data5 >= gUnknown_08376194[sprite->data4])
+ return FALSE;
+
+ gUnknown_08376180[sprite->data4][sprite->data5](sprite, sprite->data3);
+
+ sprite->data5++;
+
+ if (sprite->data5 < gUnknown_08376194[sprite->data4])
+ return FALSE;
+
+ return TRUE;
+}
+
+void sub_806467C(struct Sprite *sprite, u8 a2)
+{
+ sprite->data3 = a2;
+ sprite->data4 = 0;
+ sprite->data5 = 0;
+}
+
+bool8 sub_806468C(struct Sprite *sprite)
+{
+ if (!(sprite->data4 & 1))
+ {
+ little_step(sprite, sprite->data3);
+ sprite->data5++;
+ }
+
+ sprite->data4++;
+
+ if (sprite->data5 > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+s16 sub_80646C8(s16 a1, u8 a2)
+{
+ return gUnknown_083761D0[a2][a1];
+}
+
+void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
+{
+ sprite->data3 = a2;
+ sprite->data4 = a3;
+ sprite->data5 = a4;
+ sprite->data6 = 0;
+}
+
+u8 sub_8064704(struct Sprite *sprite)
+{
+ u8 v2;
+ s16 v5[3];
+ u8 v6[3];
+
+ memcpy(v5, gUnknown_083761DC, 6);
+ memcpy(v6, gUnknown_083761E2, 3);
+
+ v2 = 0;
+
+ if (sprite->data4)
+ little_step(sprite, sprite->data3);
+
+ sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5);
+
+ sprite->data6++;
+
+ if (sprite->data6 == (v5[sprite->data4] >> 1))
+ v2 = 1;
+
+ if (sprite->data6 >= v5[sprite->data4])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+u8 sub_806478C(struct Sprite *sprite)
+{
+ u8 v2;
+ s16 v5[3];
+ u8 v6[3];
+
+ memcpy(v5, gUnknown_083761E6, 6);
+ memcpy(v6, gUnknown_083761EC, 3);
+
+ v2 = 0;
+
+ if (sprite->data4 && !(sprite->data6 & 1))
+ little_step(sprite, sprite->data3);
+
+ sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5);
+
+ sprite->data6++;
+
+ if (sprite->data6 == (v5[sprite->data4] >> 1))
+ v2 = 1;
+
+ if (sprite->data6 >= v5[sprite->data4])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+void sub_8064820(struct Sprite *sprite, u16 a2)
+{
+ sprite->data3 = a2;
+}
+
+bool8 sub_8064824(struct Sprite *sprite)
+{
+ sprite->data3--;
+
+ if (sprite->data3 == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->animNum = a2;
+ sprite->animPaused = 0 ;
+ SeekSpriteAnim(sprite, a3);
+}
+
+bool8 sub_8064864(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_806487C(struct Sprite *sprite, bool8 invisible)
+{
+ u16 x, y;
+ s16 x2, y2;
+
+ sprite->invisible = invisible;
+
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ }
+ else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+
+ x2 = x - (sprite->centerToCornerVecX >> 1);
+ y2 = y - (sprite->centerToCornerVecY >> 1);
+
+ if ((s16)x > 255 || x2 < -16)
+ sprite->invisible = 1;
+ if ((s16)y > 175 || y2 < -16)
+ sprite->invisible = 1;
+}
+
+void sub_8064970(struct Sprite *sprite)
+{
+ SetObjectSubpriorityByZCoord(sprite->data1, sprite, 1);
+ sub_806487C(sprite, 0);
+}
+
+void sub_8064990(u8 a1, u8 dir)
+{
+ u8 i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data0 == a1)
+ {
+ u8 animNum = FieldObjectDirectionToImageAnimId(dir);
+ StartSpriteAnim(sprite, animNum);
+ break;
+ }
+ }
+}
+
+u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
+ return FieldEffectStart(fieldEffectId);
+}
+
+void DoShadowFieldEffect(struct MapObject *mapObject)
+{
+ if (!mapObject->mapobj_bit_22)
+ {
+ mapObject->mapobj_bit_22 = 1;
+ oe_exec_and_other_stuff(3, mapObject);
+ }
+}
+
+void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ gUnknown_0202FF84[0] = sprite->pos1.x;
+ gUnknown_0202FF84[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
+ gUnknown_0202FF84[2] = 151;
+ gUnknown_0202FF84[3] = 3;
+ FieldEffectStart(5);
+}
diff --git a/src/map_obj_lock.c b/src/map_obj_lock.c
new file mode 100644
index 000000000..d4115418b
--- /dev/null
+++ b/src/map_obj_lock.c
@@ -0,0 +1,125 @@
+#include "global.h"
+#include "task.h"
+#include "fieldmap.h"
+
+extern void sub_80594C0(void);
+extern void sub_80597F4(void);
+extern void player_bitmagic(void);
+extern void sub_80643A4(struct MapObject *);
+extern void sub_8064470(u8);
+extern u8 GetFieldObjectIdByLocalIdAndMap(u8, u8, u8);
+extern u8 FieldObjectClearAnimIfSpecialAnimFinished(void *);
+extern void sub_80A2178(void);
+extern void sub_806451C(void);
+extern u8 FieldObjectFaceOppositeDirection(void *, u8);
+
+extern u16 gUnknown_0202E8E0;
+
+bool8 walkrun_is_standing_still(void)
+{
+ if (gPlayerAvatar.running1 == 1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_8064CDC(u8 taskId)
+{
+ if (walkrun_is_standing_still())
+ {
+ sub_80594C0();
+ DestroyTask(taskId);
+ }
+}
+
+bool8 sub_8064CFC(void)
+{
+ if (FuncIsActiveTask(sub_8064CDC))
+ {
+ return FALSE;
+ }
+ else
+ {
+ sub_80597F4();
+ return TRUE;
+ }
+}
+
+void sub_8064D20(void)
+{
+ player_bitmagic();
+ CreateTask(sub_8064CDC, 80);
+}
+
+void sub_8064D38(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (!task->data[0] && walkrun_is_standing_still() == TRUE)
+ {
+ sub_80594C0();
+ task->data[0] = 1;
+ }
+ if (!task->data[1] && !gMapObjects[gSelectedMapObject].mapobj_bit_1)
+ {
+ sub_80643A4(&gMapObjects[gSelectedMapObject]);
+ task->data[1] = 1;
+ }
+ if (task->data[0] && task->data[1])
+ DestroyTask(taskId);
+}
+
+bool8 sub_8064DB4(void)
+{
+ if (FuncIsActiveTask(sub_8064D38))
+ {
+ return FALSE;
+ }
+ else
+ {
+ sub_80597F4();
+ return TRUE;
+ }
+}
+
+void sub_8064DD8(void)
+{
+ u8 taskId;
+ sub_8064470(gSelectedMapObject);
+ taskId = CreateTask(sub_8064D38, 80);
+ if (!gMapObjects[gSelectedMapObject].mapobj_bit_1)
+ {
+ sub_80643A4(&gMapObjects[gSelectedMapObject]);
+ gTasks[taskId].data[1] = 1;
+ }
+}
+
+void sub_8064E2C(void)
+{
+ u8 objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
+ sub_80A2178();
+ sub_806451C();
+}
+
+void unref_sub_8064E5C(void)
+{
+ u8 objectId;
+
+ if (gMapObjects[gSelectedMapObject].active)
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]);
+ objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
+ sub_80A2178();
+ sub_806451C();
+}
+
+void sub_8064EAC(void)
+{
+ FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gUnknown_0202E8E0);
+}
+
+void sub_8064ED4(void)
+{
+ FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[gSelectedMapObject]);
+}
diff --git a/src/sprite.c b/src/sprite.c
index b96f264a3..9072a487e 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -2,8 +2,6 @@
#include "main.h"
#include "sprite.h"
-#define MAX_SPRITES 64
-
#define MAX_SPRITE_COPY_REQUESTS 64
#define OAM_MATRIX_COUNT 32