Files
pokeruby/src/field_map_obj_helpers.c
camthesaxman 270bd98d41 more labeling
2017-09-13 00:03:22 -05:00

319 lines
7.4 KiB
C

#include "global.h"
#include "field_map_obj_helpers.h"
#include "field_effect.h"
#include "field_ground_effect.h"
#include "field_map_obj.h"
#include "sprite.h"
typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
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 FreezeMapObject(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 FreezeMapObjects(void)
{
u8 i;
for (i = 0; i < 16; i++)
if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
FreezeMapObject(&gMapObjects[i]);
}
void FreezeMapObjectsExceptOne(u8 a1)
{
u8 i;
for (i = 0; i < 16; i++)
if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
FreezeMapObject(&gMapObjects[i]);
}
void UnfreezeMapObject(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 UnfreezeMapObjects(void)
{
u8 i;
for (i = 0; i < 16; i++)
if (gMapObjects[i].active)
UnfreezeMapObject(&gMapObjects[i]);
}
void Step1(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += gDirectionToVector[dir].x;
sprite->pos1.y += gDirectionToVector[dir].y;
}
void Step2(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x;
sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y;
}
void Step3(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x;
sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y;
}
void Step4(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x;
sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y;
}
void Step8(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x;
sprite->pos1.y += 8 * (u16) 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))
{
Step1(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)
Step1(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))
Step1(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 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[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)
{
const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
gFieldEffectArguments[0] = sprite->pos1.x;
gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
gFieldEffectArguments[2] = 151;
gFieldEffectArguments[3] = 3;
FieldEffectStart(FLDEFF_RIPPLE);
}