SpawnFieldObject

This commit is contained in:
PikalaxALT 2017-09-06 21:46:53 -04:00
parent b79e3af0a8
commit bd4b3c4c6d
2 changed files with 29 additions and 101 deletions

View file

@ -5,105 +5,6 @@
.text
thumb_func_start SpawnFieldObject
@ u8 SpawnFieldObject(struct FieldObjectTemplate *romNpc, u8 mapId, u8 mapGroupId, u16 movingCameraOffsetX, u16 movingCameraOffsetY)
SpawnFieldObject: @ 808DB40
push {r4-r7,lr}
mov r7, r9
mov r6, r8
push {r6,r7}
sub sp, 0x2C
mov r9, r0
adds r6, r1, 0
mov r8, r2
adds r4, r3, 0
ldr r5, [sp, 0x48]
lsls r6, 24
lsrs r6, 24
mov r0, r8
lsls r0, 24
lsrs r0, 24
mov r8, r0
lsls r4, 16
lsrs r4, 16
lsls r5, 16
lsrs r5, 16
movs r0, 0
str r0, [sp, 0x20]
mov r1, r9
ldrb r0, [r1, 0x1]
bl GetFieldObjectGraphicsInfo
adds r7, r0, 0
add r2, sp, 0x20
mov r0, r9
add r1, sp, 0x8
bl MakeObjectTemplateFromFieldObjectTemplate
ldrh r3, [r7, 0x6]
ldr r2, =0xffff0000
add r1, sp, 0x24
ldr r0, [r1, 0x4]
ands r0, r2
orrs r0, r3
str r0, [r1, 0x4]
str r1, [sp, 0x14]
lsls r4, 16
asrs r4, 16
str r4, [sp]
lsls r5, 16
asrs r5, 16
str r5, [sp, 0x4]
mov r0, r9
add r1, sp, 0x8
adds r2, r6, 0
mov r3, r8
bl SpawnFieldObjectInternal
lsls r0, 24
lsrs r2, r0, 24
adds r5, r2, 0
cmp r2, 0x10
bne _0808DBBC
movs r0, 0x10
b _0808DBF2
.pool
_0808DBBC:
ldr r4, =gSprites
ldr r1, =gMapObjects
lsls r0, r2, 3
adds r0, r2
lsls r0, 2
adds r3, r0, r1
ldrb r1, [r3, 0x4]
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r1, r4, 0
adds r1, 0xC
adds r0, r1
ldr r1, [r7, 0x1C]
str r1, [r0]
ldr r2, [sp, 0x20]
cmp r2, 0
beq _0808DBF0
ldrb r1, [r3, 0x4]
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r0, r4
adds r1, r2, 0
bl SetSubspriteTables
_0808DBF0:
adds r0, r5, 0
_0808DBF2:
add sp, 0x2C
pop {r3,r4}
mov r8, r3
mov r9, r4
pop {r4-r7}
pop {r1}
bx r1
.pool
thumb_func_end SpawnFieldObject
thumb_func_start SpawnSpecialFieldObject
@ u8 SpawnSpecialFieldObject(struct FieldObjectTemplate *romFieldObject)
SpawnSpecialFieldObject: @ 808DC08

View file

@ -23,8 +23,9 @@ static bool8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *);
/*static*/ void FieldObjectHandleDynamicGraphicsId(struct MapObject *);
static void RemoveFieldObjectInternal (struct MapObject *);
/*static*/ u16 GetFieldObjectFlagIdByFieldObjectId(u8);
/*static*/ struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8);
/*static*/ const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8);
void sub_8096518(struct MapObject *, struct Sprite *);
/*static*/ void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *, struct SpriteTemplate *, const struct SubspriteTable **);
// ROM data
@ -461,7 +462,7 @@ void unref_sub_808D958(void)
u8 SpawnFieldObjectInternal(struct MapObjectTemplate *mapObjectTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
{
struct MapObject *mapObject;
struct MapObjectGraphicsInfo *graphicsInfo;
const struct MapObjectGraphicsInfo *graphicsInfo;
struct Sprite *sprite;
u8 mapObjectId;
u8 paletteSlot;
@ -518,3 +519,29 @@ u8 SpawnFieldObjectInternal(struct MapObjectTemplate *mapObjectTemplate, struct
sub_8096518(mapObject, sprite);
return mapObjectId;
}
u8 SpawnFieldObject(struct MapObjectTemplate *mapObjectTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
{
const struct MapObjectGraphicsInfo *graphicsInfo;
struct SpriteTemplate spriteTemplate;
const struct SubspriteTable *subspriteTable;
struct SpriteFrameImage spriteFrameImage;
u8 mapObjectId;
subspriteTable = NULL;
graphicsInfo = GetFieldObjectGraphicsInfo(mapObjectTemplate->graphicsId);
MakeObjectTemplateFromFieldObjectTemplate(mapObjectTemplate, &spriteTemplate, &subspriteTable);
spriteFrameImage.size = graphicsInfo->size;
spriteTemplate.images = &spriteFrameImage;
mapObjectId = SpawnFieldObjectInternal(mapObjectTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY);
if (mapObjectId == ARRAY_COUNT(gMapObjects))
{
return ARRAY_COUNT(gMapObjects);
}
gSprites[gMapObjects[mapObjectId].spriteId].images = graphicsInfo->images;
if (subspriteTable != NULL)
{
SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTable);
}
return mapObjectId;
}