mirror of
https://github.com/SAT-R/sa2.git
synced 2026-10-28 18:02:16 +00:00
match sprite function (from katam), more clean up
This commit is contained in:
1 parent
89949b4546
commit
976999a807
7 files changed
+232
-608
No files matched your search
Vendored
+2
-1
@@ -329,7 +329,8 @@
|
||||
"sonic_boom_particles.h": "c",
|
||||
"communication_outcome.h": "c",
|
||||
"tilemap.h": "c",
|
||||
"tilemap_data.h": "c"
|
||||
"tilemap_data.h": "c",
|
||||
"game_7.h": "c"
|
||||
},
|
||||
"asm-code-lens.donated": true,
|
||||
"editor.formatOnSave": true,
|
||||
|
||||
-487
@@ -1,487 +0,0 @@
|
||||
.include "asm/macros.inc"
|
||||
.include "constants/constants.inc"
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.arm
|
||||
|
||||
@ sub_081569A0 in KATAM?
|
||||
thumb_func_start sub_800550C
|
||||
sub_800550C: @ 0x0800550C
|
||||
push {r4, r5, r6, r7, lr}
|
||||
mov r7, sl
|
||||
mov r6, sb
|
||||
mov r5, r8
|
||||
push {r5, r6, r7}
|
||||
sub sp, #0x2c
|
||||
mov r8, r0
|
||||
str r1, [sp, #8]
|
||||
lsls r2, r2, #0x18
|
||||
lsrs r2, r2, #0x18
|
||||
str r2, [sp, #0xc]
|
||||
ldr r2, [r0, #0xc]
|
||||
movs r0, #1
|
||||
rsbs r0, r0, #0
|
||||
cmp r2, r0
|
||||
bne _0800552E
|
||||
b _08005888
|
||||
_0800552E:
|
||||
mov sl, r2
|
||||
ldrh r1, [r2, #2]
|
||||
mov r0, r8
|
||||
adds r0, #0x24
|
||||
strb r1, [r0]
|
||||
mov r1, r8
|
||||
movs r2, #0x16
|
||||
ldrsh r0, [r1, r2]
|
||||
str r0, [sp]
|
||||
movs r4, #0x18
|
||||
ldrsh r0, [r1, r4]
|
||||
str r0, [sp, #4]
|
||||
ldr r3, [r1, #0x10]
|
||||
movs r0, #0x80
|
||||
lsls r0, r0, #0xa
|
||||
ands r0, r3
|
||||
cmp r0, #0
|
||||
beq _08005568
|
||||
ldr r2, _080055A8 @ =gUnknown_030017F4
|
||||
movs r0, #0
|
||||
ldrsh r1, [r2, r0]
|
||||
ldr r0, [sp]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp]
|
||||
movs r4, #2
|
||||
ldrsh r1, [r2, r4]
|
||||
ldr r0, [sp, #4]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp, #4]
|
||||
_08005568:
|
||||
mov r0, sl
|
||||
ldrh r0, [r0, #4]
|
||||
str r0, [sp, #0x10]
|
||||
mov r1, sl
|
||||
ldrh r1, [r1, #6]
|
||||
str r1, [sp, #0x14]
|
||||
movs r0, #0x20
|
||||
ands r0, r3
|
||||
cmp r0, #0
|
||||
beq _080055AC
|
||||
movs r0, #0x40
|
||||
ands r3, r0
|
||||
cmp r3, #0
|
||||
beq _080055F4
|
||||
ldr r2, [sp, #0x10]
|
||||
lsrs r1, r2, #1
|
||||
ldr r0, [sp]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp]
|
||||
mov r4, sl
|
||||
ldrh r1, [r4, #6]
|
||||
lsrs r1, r1, #1
|
||||
ldr r0, [sp, #4]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp, #4]
|
||||
lsls r2, r2, #1
|
||||
str r2, [sp, #0x10]
|
||||
ldr r0, [sp, #0x14]
|
||||
lsls r0, r0, #1
|
||||
str r0, [sp, #0x14]
|
||||
b _080055F4
|
||||
.align 2, 0
|
||||
_080055A8: .4byte gUnknown_030017F4
|
||||
_080055AC:
|
||||
movs r0, #0x80
|
||||
lsls r0, r0, #4
|
||||
ands r3, r0
|
||||
cmp r3, #0
|
||||
beq _080055C2
|
||||
mov r2, sl
|
||||
movs r4, #0xa
|
||||
ldrsh r1, [r2, r4]
|
||||
ldr r0, [sp, #0x14]
|
||||
subs r1, r0, r1
|
||||
b _080055C8
|
||||
_080055C2:
|
||||
mov r2, sl
|
||||
movs r4, #0xa
|
||||
ldrsh r1, [r2, r4]
|
||||
_080055C8:
|
||||
ldr r0, [sp, #4]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp, #4]
|
||||
mov r1, r8
|
||||
ldr r0, [r1, #0x10]
|
||||
movs r1, #0x80
|
||||
lsls r1, r1, #3
|
||||
ands r0, r1
|
||||
cmp r0, #0
|
||||
beq _080055E8
|
||||
mov r2, sl
|
||||
movs r4, #8
|
||||
ldrsh r1, [r2, r4]
|
||||
ldr r0, [sp, #0x10]
|
||||
subs r1, r0, r1
|
||||
b _080055EE
|
||||
_080055E8:
|
||||
mov r2, sl
|
||||
movs r4, #8
|
||||
ldrsh r1, [r2, r4]
|
||||
_080055EE:
|
||||
ldr r0, [sp]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp]
|
||||
_080055F4:
|
||||
mov r0, r8
|
||||
movs r2, #0x16
|
||||
ldrsh r1, [r0, r2]
|
||||
ldr r0, [sp]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp, #0x24]
|
||||
mov r4, r8
|
||||
movs r0, #0x18
|
||||
ldrsh r1, [r4, r0]
|
||||
ldr r0, [sp, #4]
|
||||
subs r0, r0, r1
|
||||
str r0, [sp, #0x28]
|
||||
ldr r0, [sp]
|
||||
ldr r1, [sp, #0x10]
|
||||
adds r0, r0, r1
|
||||
cmp r0, #0
|
||||
bge _08005618
|
||||
b _08005888
|
||||
_08005618:
|
||||
ldr r0, [sp]
|
||||
cmp r0, #0xf0
|
||||
ble _08005620
|
||||
b _08005888
|
||||
_08005620:
|
||||
ldr r0, [sp, #4]
|
||||
ldr r2, [sp, #0x14]
|
||||
adds r0, r0, r2
|
||||
cmp r0, #0
|
||||
bge _0800562C
|
||||
b _08005888
|
||||
_0800562C:
|
||||
ldr r0, [sp, #4]
|
||||
cmp r0, #0xa0
|
||||
ble _08005634
|
||||
b _08005888
|
||||
_08005634:
|
||||
movs r4, #0
|
||||
str r4, [sp, #0x18]
|
||||
mov r0, sl
|
||||
ldrh r0, [r0, #2]
|
||||
cmp r4, r0
|
||||
blo _08005642
|
||||
b _08005888
|
||||
_08005642:
|
||||
ldr r0, _080056FC @ =gUnknown_03002794
|
||||
ldr r1, [r0]
|
||||
mov r2, r8
|
||||
ldrh r0, [r2, #0xa]
|
||||
ldr r1, [r1, #8]
|
||||
lsls r0, r0, #2
|
||||
adds r0, r0, r1
|
||||
ldr r4, [r0]
|
||||
ldrh r0, [r2, #0x1a]
|
||||
movs r2, #0xf8
|
||||
lsls r2, r2, #3
|
||||
adds r1, r2, #0
|
||||
ands r0, r1
|
||||
lsrs r0, r0, #6
|
||||
bl OamMalloc
|
||||
adds r6, r0, #0
|
||||
ldr r0, _08005700 @ =iwram_end
|
||||
ldr r0, [r0]
|
||||
cmp r0, r6
|
||||
bne _0800566E
|
||||
b _08005888
|
||||
_0800566E:
|
||||
ldr r2, _08005704 @ =0x040000D4
|
||||
mov r0, sl
|
||||
ldrb r1, [r0, #1]
|
||||
ldr r0, [sp, #0x18]
|
||||
adds r1, r1, r0
|
||||
lsls r0, r1, #1
|
||||
adds r0, r0, r1
|
||||
lsls r0, r0, #1
|
||||
adds r0, r4, r0
|
||||
str r0, [r2]
|
||||
str r6, [r2, #4]
|
||||
ldr r0, _08005708 @ =0x80000003
|
||||
str r0, [r2, #8]
|
||||
ldr r0, [r2, #8]
|
||||
ldrh r1, [r6, #2]
|
||||
ldr r2, _0800570C @ =0x000001FF
|
||||
adds r0, r2, #0
|
||||
adds r4, r0, #0
|
||||
ands r4, r1
|
||||
str r4, [sp, #0x1c]
|
||||
ldrh r0, [r6]
|
||||
ldrb r2, [r6]
|
||||
str r2, [sp, #0x20]
|
||||
movs r3, #0xfe
|
||||
lsls r3, r3, #8
|
||||
ands r3, r1
|
||||
movs r4, #0
|
||||
strh r3, [r6, #2]
|
||||
movs r2, #0xfe
|
||||
lsls r2, r2, #8
|
||||
ands r2, r0
|
||||
strh r2, [r6]
|
||||
mov r0, r8
|
||||
adds r0, #0x25
|
||||
ldrb r0, [r0]
|
||||
lsls r0, r0, #0xc
|
||||
ldrh r1, [r6, #4]
|
||||
adds r0, r0, r1
|
||||
strh r0, [r6, #4]
|
||||
mov r0, r8
|
||||
ldr r5, [r0, #0x10]
|
||||
movs r0, #0x20
|
||||
ands r0, r5
|
||||
cmp r0, #0
|
||||
beq _08005710
|
||||
movs r1, #0x80
|
||||
lsls r1, r1, #1
|
||||
adds r0, r1, #0
|
||||
orrs r2, r0
|
||||
orrs r2, r4
|
||||
strh r2, [r6]
|
||||
mov r1, r8
|
||||
ldr r0, [r1, #0x10]
|
||||
movs r1, #0x40
|
||||
ands r0, r1
|
||||
cmp r0, #0
|
||||
beq _080056EA
|
||||
movs r4, #0x80
|
||||
lsls r4, r4, #2
|
||||
adds r0, r4, #0
|
||||
orrs r2, r0
|
||||
strh r2, [r6]
|
||||
_080056EA:
|
||||
mov r1, r8
|
||||
ldr r0, [r1, #0x10]
|
||||
movs r1, #0x1f
|
||||
ands r0, r1
|
||||
lsls r0, r0, #9
|
||||
ldrh r1, [r6, #2]
|
||||
orrs r0, r1
|
||||
strh r0, [r6, #2]
|
||||
b _08005786
|
||||
.align 2, 0
|
||||
_080056FC: .4byte gUnknown_03002794
|
||||
_08005700: .4byte iwram_end
|
||||
_08005704: .4byte 0x040000D4
|
||||
_08005708: .4byte 0x80000003
|
||||
_0800570C: .4byte 0x000001FF
|
||||
_08005710:
|
||||
movs r1, #0xc0
|
||||
lsls r1, r1, #8
|
||||
adds r0, r2, #0
|
||||
ands r0, r1
|
||||
lsrs r4, r0, #0xc
|
||||
adds r0, r3, #0
|
||||
ands r0, r1
|
||||
lsrs r0, r0, #0xe
|
||||
orrs r4, r0
|
||||
lsrs r1, r5, #0xb
|
||||
movs r5, #1
|
||||
mov r2, sl
|
||||
ldrb r0, [r2]
|
||||
lsrs r0, r0, #1
|
||||
eors r0, r1
|
||||
ands r0, r5
|
||||
cmp r0, #0
|
||||
beq _08005754
|
||||
movs r0, #0x80
|
||||
lsls r0, r0, #6
|
||||
adds r1, r0, #0
|
||||
adds r0, r3, #0
|
||||
eors r0, r1
|
||||
strh r0, [r6, #2]
|
||||
ldr r0, _08005898 @ =gOamShapesSizes
|
||||
lsls r1, r4, #1
|
||||
adds r0, #1
|
||||
adds r1, r1, r0
|
||||
ldrb r0, [r1]
|
||||
ldr r1, [sp, #0x14]
|
||||
subs r0, r1, r0
|
||||
ldr r2, [sp, #0x20]
|
||||
subs r2, r0, r2
|
||||
str r2, [sp, #0x20]
|
||||
_08005754:
|
||||
mov r1, r8
|
||||
ldr r0, [r1, #0x10]
|
||||
lsrs r0, r0, #0xa
|
||||
ands r0, r5
|
||||
mov r1, sl
|
||||
ldrb r2, [r1]
|
||||
adds r1, r5, #0
|
||||
ands r1, r2
|
||||
cmp r0, r1
|
||||
beq _08005786
|
||||
ldrh r0, [r6, #2]
|
||||
movs r2, #0x80
|
||||
lsls r2, r2, #5
|
||||
adds r1, r2, #0
|
||||
eors r0, r1
|
||||
strh r0, [r6, #2]
|
||||
ldr r1, _08005898 @ =gOamShapesSizes
|
||||
lsls r0, r4, #1
|
||||
adds r0, r0, r1
|
||||
ldrb r0, [r0]
|
||||
ldr r4, [sp, #0x10]
|
||||
subs r0, r4, r0
|
||||
ldr r1, [sp, #0x1c]
|
||||
subs r1, r0, r1
|
||||
str r1, [sp, #0x1c]
|
||||
_08005786:
|
||||
mov r4, r8
|
||||
ldr r2, [r4, #0x10]
|
||||
movs r0, #0xc0
|
||||
lsls r0, r0, #1
|
||||
ands r2, r0
|
||||
lsls r2, r2, #3
|
||||
ldrh r0, [r6]
|
||||
orrs r2, r0
|
||||
strh r2, [r6]
|
||||
ldr r0, [r4, #0x10]
|
||||
movs r1, #0xc0
|
||||
lsls r1, r1, #6
|
||||
ands r0, r1
|
||||
lsrs r3, r0, #2
|
||||
ldrh r0, [r6, #4]
|
||||
orrs r3, r0
|
||||
strh r3, [r6, #4]
|
||||
ldr r0, [sp, #4]
|
||||
ldr r1, [sp, #0x20]
|
||||
adds r0, r0, r1
|
||||
movs r1, #0xff
|
||||
ands r0, r1
|
||||
adds r2, r2, r0
|
||||
strh r2, [r6]
|
||||
ldr r0, [sp]
|
||||
ldr r4, [sp, #0x1c]
|
||||
adds r0, r0, r4
|
||||
ldr r4, _0800589C @ =0x000001FF
|
||||
adds r1, r4, #0
|
||||
ands r0, r1
|
||||
ldrh r1, [r6, #2]
|
||||
adds r0, r0, r1
|
||||
strh r0, [r6, #2]
|
||||
movs r4, #0x80
|
||||
lsls r4, r4, #6
|
||||
adds r0, r4, #0
|
||||
ands r2, r0
|
||||
cmp r2, #0
|
||||
beq _080057E0
|
||||
ldr r0, _080058A0 @ =0x000003FF
|
||||
adds r1, r0, #0
|
||||
adds r0, r3, #0
|
||||
ands r0, r1
|
||||
adds r0, r3, r0
|
||||
strh r0, [r6, #4]
|
||||
_080057E0:
|
||||
mov r1, r8
|
||||
ldr r0, [r1, #4]
|
||||
ldr r2, _080058A4 @ =0xF9FF0000
|
||||
adds r0, r0, r2
|
||||
lsrs r0, r0, #5
|
||||
ldrh r4, [r6, #4]
|
||||
adds r0, r0, r4
|
||||
strh r0, [r6, #4]
|
||||
movs r7, #0
|
||||
ldr r0, [sp, #0xc]
|
||||
cmp r7, r0
|
||||
bhs _08005874
|
||||
ldr r1, _080058A8 @ =0x040000D4
|
||||
mov sb, r1
|
||||
_080057FC:
|
||||
mov r2, r8
|
||||
ldrh r0, [r2, #0x1a]
|
||||
movs r4, #0xf8
|
||||
lsls r4, r4, #3
|
||||
adds r1, r4, #0
|
||||
ands r0, r1
|
||||
lsrs r0, r0, #6
|
||||
bl OamMalloc
|
||||
adds r5, r0, #0
|
||||
ldr r0, _080058AC @ =iwram_end
|
||||
ldr r0, [r0]
|
||||
cmp r0, r6
|
||||
beq _08005888
|
||||
mov r0, sb
|
||||
str r6, [r0]
|
||||
str r5, [r0, #4]
|
||||
ldr r0, _080058B0 @ =0x80000003
|
||||
mov r1, sb
|
||||
str r0, [r1, #8]
|
||||
ldr r0, [r1, #8]
|
||||
ldrh r4, [r5, #2]
|
||||
movs r2, #0xfe
|
||||
lsls r2, r2, #8
|
||||
ands r4, r2
|
||||
strh r4, [r5, #2]
|
||||
ldrh r2, [r5]
|
||||
movs r1, #0xff
|
||||
lsls r1, r1, #8
|
||||
adds r0, r1, #0
|
||||
ands r2, r0
|
||||
strh r2, [r5]
|
||||
lsls r3, r7, #2
|
||||
ldr r0, [sp, #8]
|
||||
adds r3, r3, r0
|
||||
ldrh r0, [r3, #2]
|
||||
ldr r1, [sp, #0x28]
|
||||
adds r0, r0, r1
|
||||
ldr r1, [sp, #0x20]
|
||||
adds r0, r0, r1
|
||||
movs r1, #0xff
|
||||
ands r0, r1
|
||||
adds r2, r2, r0
|
||||
strh r2, [r5]
|
||||
ldrh r0, [r3]
|
||||
ldr r2, [sp, #0x24]
|
||||
adds r0, r0, r2
|
||||
ldr r1, [sp, #0x1c]
|
||||
adds r0, r0, r1
|
||||
ldr r2, _0800589C @ =0x000001FF
|
||||
adds r1, r2, #0
|
||||
ands r0, r1
|
||||
adds r4, r4, r0
|
||||
strh r4, [r5, #2]
|
||||
adds r0, r7, #1
|
||||
lsls r0, r0, #0x18
|
||||
lsrs r7, r0, #0x18
|
||||
ldr r4, [sp, #0xc]
|
||||
cmp r7, r4
|
||||
blo _080057FC
|
||||
_08005874:
|
||||
ldr r0, [sp, #0x18]
|
||||
adds r0, #1
|
||||
lsls r0, r0, #0x18
|
||||
lsrs r0, r0, #0x18
|
||||
str r0, [sp, #0x18]
|
||||
mov r1, sl
|
||||
ldrh r1, [r1, #2]
|
||||
cmp r0, r1
|
||||
bhs _08005888
|
||||
b _08005642
|
||||
_08005888:
|
||||
add sp, #0x2c
|
||||
pop {r3, r4, r5}
|
||||
mov r8, r3
|
||||
mov sb, r4
|
||||
mov sl, r5
|
||||
pop {r4, r5, r6, r7}
|
||||
pop {r0}
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_08005898: .4byte gOamShapesSizes
|
||||
_0800589C: .4byte 0x000001FF
|
||||
_080058A0: .4byte 0x000003FF
|
||||
_080058A4: .4byte 0xF9FF0000
|
||||
_080058A8: .4byte 0x040000D4
|
||||
_080058AC: .4byte iwram_end
|
||||
_080058B0: .4byte 0x80000003
|
||||
@@ -10,4 +10,6 @@ void sub_802DCC8(u8 p0, u16 p1);
|
||||
void sub_802DDC4(u8 p0, u16 p1);
|
||||
void sub_802DF18(u8 p0, u16 p1);
|
||||
|
||||
void sub_802E784(u16, u16, u16, s16 x, s16 y, s16);
|
||||
|
||||
#endif // GUARD_GAME_7_H
|
||||
@@ -93,8 +93,6 @@ SECTIONS
|
||||
build/sa2/src/sprite_2.o(.text);
|
||||
build/sa2/asm/sprite_2.o(.text);
|
||||
build/sa2/src/sprite_3.o(.text);
|
||||
build/sa2/asm/sprite_3.o(.text);
|
||||
build/sa2/src/sprite_3_2.o(.text);
|
||||
build/sa2/src/animation_commands.o(.text);
|
||||
build/sa2/asm/bg_triangles_unused_0.o(.text);
|
||||
build/sa2/src/bg_triangles_0.o(.text);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "game/stage/collision.h"
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
#include "game/stage/game_7.h"
|
||||
|
||||
#include "game/stage/screen_fade.h"
|
||||
|
||||
@@ -158,9 +159,6 @@ static const u16 gUnknown_080D7FF0[][16] = {
|
||||
INCBIN_U16("graphics/80D8010.gbapal"),
|
||||
};
|
||||
|
||||
// stage intro related
|
||||
extern void sub_802E784(u16, u16, u16, s16 x, s16 y, s16);
|
||||
|
||||
void Task_EggSaucerIntro(void);
|
||||
void TaskDestructor_EggSaucerMain(struct Task *);
|
||||
static void SaucerUpdatePosAndRotate(EggSaucer *);
|
||||
|
||||
+227
-1
@@ -1,9 +1,10 @@
|
||||
#include "global.h"
|
||||
#include "core.h"
|
||||
#include "sprite.h"
|
||||
#include "data/sprite_data.h"
|
||||
#include "flags.h"
|
||||
|
||||
#include "data/sprite_data.h"
|
||||
|
||||
const u8 gOamShapesSizes[12][2] = {
|
||||
// Square
|
||||
{ 8, 8 },
|
||||
@@ -138,3 +139,228 @@ void DisplaySprite(Sprite *sprite)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_081569A0(Sprite *sprite, u16 *sp08, u8 sp0C)
|
||||
{
|
||||
vs32 x, y;
|
||||
s32 sprWidth, sprHeight;
|
||||
u8 sp18, i;
|
||||
u32 x1, y1, sp24, sp28;
|
||||
|
||||
if ((u32)sprite->dimensions != -1) {
|
||||
const SpriteOffset *sprDims = sprite->dimensions;
|
||||
|
||||
sprite->numSubFrames = sprDims->numSubframes;
|
||||
x = sprite->x;
|
||||
y = sprite->y;
|
||||
|
||||
if (sprite->unk10 & SPRITE_FLAG_MASK_17) {
|
||||
x -= gUnknown_030017F4[0];
|
||||
y -= gUnknown_030017F4[1];
|
||||
}
|
||||
|
||||
sprWidth = sprDims->width;
|
||||
sprHeight = sprDims->height;
|
||||
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) {
|
||||
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) {
|
||||
x -= sprDims->width / 2;
|
||||
y -= sprDims->height / 2;
|
||||
sprWidth *= 2;
|
||||
sprHeight *= 2;
|
||||
}
|
||||
} else {
|
||||
if (sprite->unk10 & SPRITE_FLAG_MASK_Y_FLIP) {
|
||||
y -= sprHeight - sprDims->offsetY;
|
||||
} else {
|
||||
y -= sprDims->offsetY;
|
||||
}
|
||||
|
||||
if (sprite->unk10 & SPRITE_FLAG_MASK_X_FLIP) {
|
||||
x -= sprWidth - sprDims->offsetX;
|
||||
} else {
|
||||
x -= sprDims->offsetX;
|
||||
}
|
||||
}
|
||||
|
||||
sp24 = x - sprite->x;
|
||||
sp28 = y - sprite->y;
|
||||
if (x + sprWidth >= 0 && x <= 240 && y + sprHeight >= 0 && y <= 160) {
|
||||
for (sp18 = 0; sp18 < sprDims->numSubframes; ++sp18) {
|
||||
const u16 *oamData = gUnknown_03002794->oamData[sprite->graphics.anim];
|
||||
OamData *oam = OamMalloc(GET_SPRITE_OAM_ORDER(sprite));
|
||||
|
||||
if (iwram_end == oam) {
|
||||
return;
|
||||
}
|
||||
|
||||
DmaCopy16(3, &oamData[3 * ((sprDims->oamIndex & 0x3FFF) + sp18)], oam,
|
||||
6); // excluding affine params
|
||||
x1 = oam->all.attr1 & 0x1FF;
|
||||
y1 = oam->all.attr0 & 0xFF;
|
||||
oam->all.attr1 &= 0xFE00;
|
||||
oam->all.attr0 &= 0xFE00;
|
||||
oam->all.attr2 += sprite->palId << 12;
|
||||
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) {
|
||||
oam->all.attr0 |= 0x100;
|
||||
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) {
|
||||
oam->all.attr0 |= 0x200;
|
||||
}
|
||||
oam->all.attr1 |= (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE) << 9;
|
||||
} else {
|
||||
u32 shapeAndSize = ((oam->all.attr0 & 0xC000) >> 12);
|
||||
u32 flipY;
|
||||
u32 r6;
|
||||
|
||||
shapeAndSize |= ((oam->all.attr1 & 0xC000) >> 14);
|
||||
flipY = sprite->unk10 >> 11;
|
||||
r6 = 1;
|
||||
|
||||
// y-flip
|
||||
if ((((sprDims->flip >> 1) ^ flipY) & r6) != 0) {
|
||||
oam->all.attr1 ^= 0x2000;
|
||||
y1 = sprHeight - gOamShapesSizes[shapeAndSize][1] - y1;
|
||||
}
|
||||
|
||||
// x-flip
|
||||
if (((sprite->unk10 >> 10) & r6) != (sprDims->flip & 1)) {
|
||||
oam->all.attr1 ^= 0x1000;
|
||||
x1 = sprWidth - gOamShapesSizes[shapeAndSize][0] - x1;
|
||||
}
|
||||
}
|
||||
|
||||
oam->all.attr0 |= (sprite->unk10 & SPRITE_FLAG_MASK_OBJ_MODE) * 8;
|
||||
oam->all.attr2 |= (sprite->unk10 & SPRITE_FLAG_MASK_PRIORITY) >> 2;
|
||||
oam->all.attr0 += ((y + y1) & 0xFF);
|
||||
oam->all.attr1 += ((x + x1) & 0x1FF);
|
||||
|
||||
if (oam->all.attr0 & (ST_OAM_8BPP << 13)) {
|
||||
oam->all.attr2 += oam->all.attr2 & 0x3FF;
|
||||
}
|
||||
oam->all.attr2 += GET_TILE_NUM(sprite->graphics.dest);
|
||||
|
||||
for (i = 0; i < sp0C; ++i) {
|
||||
OamData *r5 = OamMalloc(GET_SPRITE_OAM_ORDER(sprite));
|
||||
|
||||
if (iwram_end == oam)
|
||||
return;
|
||||
DmaCopy16(3, oam, r5, 6);
|
||||
r5->all.attr1 &= 0xFE00;
|
||||
r5->all.attr0 &= 0xFF00;
|
||||
r5->all.attr0 += (sp08[2 * i + 1] + sp28 + y1) & 0xFF;
|
||||
r5->all.attr1 += (sp08[2 * i + 0] + sp24 + x1) & 0x1FF;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The parameter to this determines the order this sprite is expected to be drawn at.
|
||||
//
|
||||
// If you have created n Sprite instances, and you want them to be drawn in a certain
|
||||
// order, you'd set their OAM order value (inside Sprite.unk1A) accordingly.
|
||||
// A higher value gets drawn first
|
||||
// (Higher order value == Higher Priority -> Drawn first).
|
||||
// This only applies if these sprites all have the same priority value (0-3) in OAM.
|
||||
// For OAM priority values the same rule (Higher value == Higher Priority) applies.
|
||||
//
|
||||
// This behavior is used by the Pause Menu, whereby all existing OAM values get put to
|
||||
// the end of the OAM buffer, while the pause menu itself gets put to the beginning.
|
||||
OamData *OamMalloc(u8 order)
|
||||
{
|
||||
OamData *result;
|
||||
|
||||
if (order > 31) {
|
||||
order = 31;
|
||||
}
|
||||
|
||||
if (gOamFreeIndex > OAM_ENTRY_COUNT - 1) {
|
||||
result = (OamData *)iwram_end;
|
||||
} else {
|
||||
if (gUnknown_03001850[order] == 0xFF) {
|
||||
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
|
||||
gUnknown_03001850[order] = gOamFreeIndex;
|
||||
gUnknown_03004D60[order] = gOamFreeIndex;
|
||||
} else {
|
||||
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
|
||||
gOamBuffer2[gUnknown_03004D60[order]].split.fractional = gOamFreeIndex;
|
||||
gUnknown_03004D60[order] = gOamFreeIndex;
|
||||
}
|
||||
|
||||
gOamFreeIndex++;
|
||||
result = &gOamBuffer2[gOamFreeIndex - 1];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void CopyOamBufferToOam(void)
|
||||
{
|
||||
OamData *dstOam = &gOamBuffer[0];
|
||||
u8 i = 0;
|
||||
s32 r3;
|
||||
|
||||
for (r3 = 0; r3 < 32; r3++) {
|
||||
s8 index = gUnknown_03001850[r3];
|
||||
|
||||
while (index != -1) {
|
||||
u8 newI;
|
||||
u8 *byteArray = gUnknown_03002710;
|
||||
DmaCopy16(3, &gOamBuffer2[index], dstOam, sizeof(OamDataShort));
|
||||
dstOam++;
|
||||
|
||||
byteArray += index;
|
||||
newI = i++;
|
||||
*byteArray = newI;
|
||||
index = gOamBuffer2[index].split.fractional;
|
||||
};
|
||||
}
|
||||
|
||||
if (gFlags & FLAGS_800) {
|
||||
r3 = gOamFreeIndex;
|
||||
dstOam = &gOamBuffer[r3];
|
||||
|
||||
while (r3 < gOamFirstPausedIndex) {
|
||||
DmaFill16(3, 0x200, dstOam, sizeof(OamDataShort));
|
||||
dstOam++;
|
||||
r3++;
|
||||
}
|
||||
} else if (gFlags & FLAGS_PAUSE_GAME) {
|
||||
/* Push all active OAM entries to te end of OAM temporarily while
|
||||
* the game is paused */
|
||||
s32 k, l;
|
||||
r3 = gOamFreeIndex - 1;
|
||||
dstOam = &gOamBuffer[r3];
|
||||
|
||||
for (k = l = 0; r3 >= 0;) {
|
||||
s32 size = sizeof(OamDataShort);
|
||||
DmaCopy16(3, dstOam - k, &gOamBuffer[OAM_ENTRY_COUNT - 1 - l], size);
|
||||
k++, r3--, l++;
|
||||
}
|
||||
|
||||
// _08005A5E
|
||||
|
||||
gOamFirstPausedIndex = OAM_ENTRY_COUNT - gOamFreeIndex;
|
||||
|
||||
for (r3 = 0; r3 < gOamFirstPausedIndex; r3++) {
|
||||
DmaFill16(3, 0x200, &gOamBuffer[r3], sizeof(OamDataShort));
|
||||
#ifndef NON_MATCHING
|
||||
// unlike when using --, using ++ changes the condition to something entirely
|
||||
// different unless we tell the compiler that we want to use r3's values
|
||||
// (without actually doing so)
|
||||
asm("" ::"r"(r3));
|
||||
#endif
|
||||
}
|
||||
|
||||
} else {
|
||||
gOamFirstPausedIndex = 0;
|
||||
}
|
||||
|
||||
gOamFreeIndex = 0;
|
||||
if (gFlags & FLAGS_4000) {
|
||||
CpuFill32(-1, gUnknown_03001850, sizeof(gUnknown_03001850));
|
||||
CpuFill32(-1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
|
||||
} else {
|
||||
DmaFill32(3, -1, gUnknown_03001850, sizeof(gUnknown_03001850));
|
||||
DmaFill32(3, -1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
|
||||
}
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "core.h"
|
||||
#include "flags.h"
|
||||
|
||||
// The parameter to this determines the order this sprite is expected to be drawn at.
|
||||
//
|
||||
// If you have created n Sprite instances, and you want them to be drawn in a certain
|
||||
// order, you'd set their OAM order value (inside Sprite.unk1A) accordingly.
|
||||
// A higher value gets drawn first
|
||||
// (Higher order value == Higher Priority -> Drawn first).
|
||||
// This only applies if these sprites all have the same priority value (0-3) in OAM.
|
||||
// For OAM priority values the same rule (Higher value == Higher Priority) applies.
|
||||
//
|
||||
// This behavior is used by the Pause Menu, whereby all existing OAM values get put to
|
||||
// the end of the OAM buffer, while the pause menu itself gets put to the beginning.
|
||||
OamData *OamMalloc(u8 order)
|
||||
{
|
||||
OamData *result;
|
||||
|
||||
if (order > 31) {
|
||||
order = 31;
|
||||
}
|
||||
|
||||
if (gOamFreeIndex > OAM_ENTRY_COUNT - 1) {
|
||||
result = (OamData *)iwram_end;
|
||||
} else {
|
||||
if (gUnknown_03001850[order] == 0xFF) {
|
||||
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
|
||||
gUnknown_03001850[order] = gOamFreeIndex;
|
||||
gUnknown_03004D60[order] = gOamFreeIndex;
|
||||
} else {
|
||||
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
|
||||
gOamBuffer2[gUnknown_03004D60[order]].split.fractional = gOamFreeIndex;
|
||||
gUnknown_03004D60[order] = gOamFreeIndex;
|
||||
}
|
||||
|
||||
gOamFreeIndex++;
|
||||
result = &gOamBuffer2[gOamFreeIndex - 1];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void CopyOamBufferToOam(void)
|
||||
{
|
||||
OamData *dstOam = &gOamBuffer[0];
|
||||
u8 i = 0;
|
||||
s32 r3;
|
||||
|
||||
for (r3 = 0; r3 < 32; r3++) {
|
||||
s8 index = gUnknown_03001850[r3];
|
||||
|
||||
while (index != -1) {
|
||||
u8 newI;
|
||||
u8 *byteArray = gUnknown_03002710;
|
||||
DmaCopy16(3, &gOamBuffer2[index], dstOam, sizeof(OamDataShort));
|
||||
dstOam++;
|
||||
|
||||
byteArray += index;
|
||||
newI = i++;
|
||||
*byteArray = newI;
|
||||
index = gOamBuffer2[index].split.fractional;
|
||||
};
|
||||
}
|
||||
|
||||
if (gFlags & FLAGS_800) {
|
||||
r3 = gOamFreeIndex;
|
||||
dstOam = &gOamBuffer[r3];
|
||||
|
||||
while (r3 < gOamFirstPausedIndex) {
|
||||
DmaFill16(3, 0x200, dstOam, sizeof(OamDataShort));
|
||||
dstOam++;
|
||||
r3++;
|
||||
}
|
||||
} else if (gFlags & FLAGS_PAUSE_GAME) {
|
||||
/* Push all active OAM entries to te end of OAM temporarily while
|
||||
* the game is paused */
|
||||
s32 k, l;
|
||||
r3 = gOamFreeIndex - 1;
|
||||
dstOam = &gOamBuffer[r3];
|
||||
|
||||
for (k = l = 0; r3 >= 0;) {
|
||||
s32 size = sizeof(OamDataShort);
|
||||
DmaCopy16(3, dstOam - k, &gOamBuffer[OAM_ENTRY_COUNT - 1 - l], size);
|
||||
k++, r3--, l++;
|
||||
}
|
||||
|
||||
// _08005A5E
|
||||
|
||||
gOamFirstPausedIndex = OAM_ENTRY_COUNT - gOamFreeIndex;
|
||||
|
||||
for (r3 = 0; r3 < gOamFirstPausedIndex; r3++) {
|
||||
DmaFill16(3, 0x200, &gOamBuffer[r3], sizeof(OamDataShort));
|
||||
#ifndef NON_MATCHING
|
||||
// unlike when using --, using ++ changes the condition to something entirely
|
||||
// different unless we tell the compiler that we want to use r3's values
|
||||
// (without actually doing so)
|
||||
asm("" ::"r"(r3));
|
||||
#endif
|
||||
}
|
||||
|
||||
} else {
|
||||
gOamFirstPausedIndex = 0;
|
||||
}
|
||||
|
||||
gOamFreeIndex = 0;
|
||||
if (gFlags & FLAGS_4000) {
|
||||
CpuFill32(-1, gUnknown_03001850, sizeof(gUnknown_03001850));
|
||||
CpuFill32(-1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
|
||||
} else {
|
||||
DmaFill32(3, -1, gUnknown_03001850, sizeof(gUnknown_03001850));
|
||||
DmaFill32(3, -1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user