diff options
| author | PikalaxALT <pikalaxalt@gmail.com> | 2017-09-06 21:46:53 -0400 | 
|---|---|---|
| committer | PikalaxALT <pikalaxalt@gmail.com> | 2017-09-06 21:46:53 -0400 | 
| commit | bd4b3c4c6da148415e8c5ebeb8c72455776a5f19 (patch) | |
| tree | 8913a8f4e6270d7cfc8e46c8e6f41affbaf87384 | |
| parent | b79e3af0a8aaed5528e57c965101aa4c0b59bad1 (diff) | |
SpawnFieldObject
| -rw-r--r-- | asm/field_map_obj.s | 99 | ||||
| -rw-r--r-- | src/field_map_obj.c | 31 | 
2 files changed, 29 insertions, 101 deletions
| diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s index f59a3a7c9..600997c7f 100644 --- a/asm/field_map_obj.s +++ b/asm/field_map_obj.s @@ -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 diff --git a/src/field_map_obj.c b/src/field_map_obj.c index a3fb1a5d3..8b78a54a1 100644 --- a/src/field_map_obj.c +++ b/src/field_map_obj.c @@ -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; +} | 
