Merge branch 'followers-expanded-id' into lighting-expanded-id
This commit is contained in:
commit
3abf4871fd
@ -1347,7 +1347,7 @@
|
||||
@ The specified id can be used to refer to the sprite again later with turnvobject.
|
||||
.macro createvobject graphicsId:req, id:req, x:req, y:req, elevation=3, direction=DIR_SOUTH
|
||||
.byte 0xaa
|
||||
.byte \graphicsId
|
||||
.2byte \graphicsId
|
||||
.byte \id
|
||||
.2byte \x
|
||||
.2byte \y
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
"connections": null,
|
||||
"object_events": [
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_MON_BASE+SPECIES_REGIROCK",
|
||||
"graphics_id": "OBJ_EVENT_GFX_SPECIES(REGIROCK)",
|
||||
"x": 8,
|
||||
"y": 7,
|
||||
"elevation": 3,
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
"connections": 0,
|
||||
"object_events": [
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_MON_BASE+SPECIES_REGICE",
|
||||
"graphics_id": "OBJ_EVENT_GFX_SPECIES(REGICE)",
|
||||
"x": 8,
|
||||
"y": 7,
|
||||
"elevation": 3,
|
||||
|
||||
@ -1496,7 +1496,7 @@ void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotat
|
||||
CopyOamMatrix(matrixNum, &matrix);
|
||||
}
|
||||
|
||||
u16 LoadSpriteSheet(const struct SpriteSheet *sheet)
|
||||
static u16 LoadSpriteSheetWithOffset(const struct SpriteSheet *sheet, u32 offset)
|
||||
{
|
||||
s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP);
|
||||
|
||||
@ -1507,11 +1507,16 @@ u16 LoadSpriteSheet(const struct SpriteSheet *sheet)
|
||||
else
|
||||
{
|
||||
AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP);
|
||||
CpuSmartCopy16(sheet->data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size);
|
||||
CpuSmartCopy16(sheet->data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart + offset, sheet->size - offset);
|
||||
return (u16)tileStart;
|
||||
}
|
||||
}
|
||||
|
||||
u16 LoadSpriteSheet(const struct SpriteSheet *sheet)
|
||||
{
|
||||
return LoadSpriteSheetWithOffset(sheet, 0);
|
||||
}
|
||||
|
||||
// Like LoadSpriteSheet, but checks if already loaded, and uses template image frames
|
||||
u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u32 frame, s32 offset) {
|
||||
u16 tileStart;
|
||||
@ -1521,10 +1526,10 @@ u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u32 frame,
|
||||
return TAG_NONE;
|
||||
if ((tileStart = GetSpriteTileStartByTag(template->tileTag)) != TAG_NONE) // return if already loaded
|
||||
return tileStart;
|
||||
sheet.data = template->images[frame].data - offset;
|
||||
sheet.data = template->images[frame].data;
|
||||
sheet.size = template->images[frame].size;
|
||||
sheet.tag = template->tileTag;
|
||||
return LoadSpriteSheet(&sheet);
|
||||
return LoadSpriteSheetWithOffset(&sheet, offset);
|
||||
}
|
||||
|
||||
void LoadSpriteSheets(const struct SpriteSheet *sheets)
|
||||
|
||||
@ -34,9 +34,9 @@ struct FacilityMon
|
||||
};
|
||||
|
||||
extern const u8 gTowerMaleFacilityClasses[30];
|
||||
extern const u8 gTowerMaleTrainerGfxIds[30];
|
||||
extern const u16 gTowerMaleTrainerGfxIds[30];
|
||||
extern const u8 gTowerFemaleFacilityClasses[20];
|
||||
extern const u8 gTowerFemaleTrainerGfxIds[20];
|
||||
extern const u16 gTowerFemaleTrainerGfxIds[20];
|
||||
extern const u16 gBattleFrontierHeldItems[];
|
||||
extern const struct FacilityMon gBattleFrontierMons[];
|
||||
extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
|
||||
|
||||
@ -281,6 +281,10 @@
|
||||
#define OBJ_EVENT_GFX_SPECIES_BITS 11
|
||||
#define OBJ_EVENT_GFX_SPECIES_MASK ((1 << OBJ_EVENT_GFX_SPECIES_BITS) - 1)
|
||||
|
||||
// Used to call a specific species' follower graphics. Useful for static encounters.
|
||||
#define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_GFX_MON_BASE)
|
||||
#define OBJ_EVENT_GFX_SPECIES_SHINY(name) (SPECIES_##name + OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG)
|
||||
|
||||
#define OW_SPECIES(x) (((x)->graphicsId & OBJ_EVENT_GFX_SPECIES_MASK) - OBJ_EVENT_GFX_MON_BASE)
|
||||
#define OW_FORM(x) ((x)->graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS)
|
||||
|
||||
|
||||
@ -419,6 +419,8 @@
|
||||
|
||||
#define NUM_SPECIES SPECIES_EGG
|
||||
|
||||
#define SPECIES_SHINY_TAG 500
|
||||
|
||||
#define SPECIES_UNOWN_B (NUM_SPECIES + 1)
|
||||
#define SPECIES_UNOWN_C (SPECIES_UNOWN_B + 1)
|
||||
#define SPECIES_UNOWN_D (SPECIES_UNOWN_B + 2)
|
||||
|
||||
@ -3,7 +3,6 @@
|
||||
|
||||
#include "constants/moves.h"
|
||||
|
||||
#define SPECIES_SHINY_TAG 500
|
||||
#define N_FOLLOWER_HAPPY_MESSAGES 31
|
||||
#define N_FOLLOWER_NEUTRAL_MESSAGES 14
|
||||
#define N_FOLLOWER_SAD_MESSAGES 3
|
||||
|
||||
@ -208,7 +208,7 @@ const u8 gTowerFemaleFacilityClasses[20] =
|
||||
FACILITY_CLASS_LASS
|
||||
};
|
||||
|
||||
const u8 gTowerMaleTrainerGfxIds[30] =
|
||||
const u16 gTowerMaleTrainerGfxIds[30] =
|
||||
{
|
||||
OBJ_EVENT_GFX_HIKER,
|
||||
OBJ_EVENT_GFX_TUBER_M,
|
||||
@ -242,7 +242,7 @@ const u8 gTowerMaleTrainerGfxIds[30] =
|
||||
OBJ_EVENT_GFX_HIKER
|
||||
};
|
||||
|
||||
const u8 gTowerFemaleTrainerGfxIds[20] =
|
||||
const u16 gTowerFemaleTrainerGfxIds[20] =
|
||||
{
|
||||
OBJ_EVENT_GFX_WOMAN_2,
|
||||
OBJ_EVENT_GFX_TUBER_F,
|
||||
@ -3469,7 +3469,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
|
||||
u16 FacilityClassToGraphicsId(u8 facilityClass)
|
||||
{
|
||||
u8 trainerObjectGfxId;
|
||||
u16 trainerObjectGfxId;
|
||||
u8 i;
|
||||
|
||||
// Search male classes.
|
||||
|
||||
@ -1593,10 +1593,12 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid,
|
||||
u32 sheetSpan = GetSpanPerImage(info->oam->shape, info->oam->size);
|
||||
u16 oldTiles = 0;
|
||||
u16 tileStart;
|
||||
bool32 oldInvisible;
|
||||
if (tag == TAG_NONE)
|
||||
tag = COMP_OW_TILE_TAG_BASE + uuid;
|
||||
|
||||
if (sprite) {
|
||||
oldInvisible = sprite->invisible;
|
||||
oldTiles = sprite->sheetTileStart;
|
||||
sprite->sheetTileStart = 0; // mark unused
|
||||
// Note: If sprite was not allocated to use a sheet,
|
||||
@ -1610,9 +1612,19 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid,
|
||||
if (tileStart == TAG_NONE) {
|
||||
struct SpriteFrameImage image = {.size = info->size, .data = info->images->data};
|
||||
struct SpriteTemplate template = {.tileTag = tag, .images = &image};
|
||||
if (oldTiles)
|
||||
FieldEffectFreeTilesIfUnused(oldTiles);
|
||||
// Load, then free, in order to avoid displaying garbage data
|
||||
// before sprite's `sheetTileStart` is repointed
|
||||
tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan);
|
||||
if (oldTiles) {
|
||||
FieldEffectFreeTilesIfUnused(oldTiles);
|
||||
// We weren't able to load the sheet;
|
||||
// retry (after having freed), and set sprite to invisible until done
|
||||
if (tileStart <= 0) {
|
||||
if (sprite)
|
||||
sprite->invisible = TRUE;
|
||||
tileStart = LoadCompressedSpriteSheetByTemplate(&template, TILE_SIZE_4BPP << sheetSpan);
|
||||
}
|
||||
}
|
||||
// sheet loaded; unload any *other* sheet for sprite
|
||||
} else if (oldTiles && oldTiles != tileStart) {
|
||||
FieldEffectFreeTilesIfUnused(oldTiles);
|
||||
@ -1622,6 +1634,7 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid,
|
||||
sprite->sheetTileStart = tileStart;
|
||||
sprite->sheetSpan = sheetSpan;
|
||||
sprite->usingSheet = TRUE;
|
||||
sprite->invisible = oldInvisible;
|
||||
}
|
||||
// Going from sheet -> !sheet, reset tile number
|
||||
// (sheet stays loaded)
|
||||
@ -1665,6 +1678,12 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven
|
||||
spriteTemplate->tileTag = LoadSheetGraphicsInfo(graphicsInfo, objectEvent->graphicsId, NULL);
|
||||
#endif
|
||||
|
||||
if (objectEvent->graphicsId >= OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG)
|
||||
{
|
||||
objectEvent->shiny = TRUE;
|
||||
objectEvent->graphicsId -= SPECIES_SHINY_TAG;
|
||||
}
|
||||
|
||||
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
|
||||
if (spriteId == MAX_SPRITES)
|
||||
{
|
||||
@ -2892,6 +2911,8 @@ const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u16 graphicsId)
|
||||
if (graphicsId >= OBJ_EVENT_GFX_VARS && graphicsId <= OBJ_EVENT_GFX_VAR_F)
|
||||
graphicsId = VarGetObjectEventGraphicsId(graphicsId - OBJ_EVENT_GFX_VARS);
|
||||
|
||||
if (graphicsId >= OBJ_EVENT_GFX_MON_BASE + SPECIES_SHINY_TAG)
|
||||
graphicsId -= SPECIES_SHINY_TAG;
|
||||
// graphicsId may contain mon form info
|
||||
if (graphicsId > OBJ_EVENT_GFX_SPECIES_MASK) {
|
||||
form = graphicsId >> OBJ_EVENT_GFX_SPECIES_BITS;
|
||||
|
||||
@ -1219,10 +1219,10 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx)
|
||||
|
||||
bool8 ScrCmd_createvobject(struct ScriptContext *ctx)
|
||||
{
|
||||
u16 graphicsId = ScriptReadByte(ctx); // Support u16 in createvobject
|
||||
u16 graphicsId = ScriptReadHalfword(ctx); // Support u16 in createvobject
|
||||
u8 virtualObjId = ScriptReadByte(ctx);
|
||||
u16 x = VarGet(ScriptReadHalfword(ctx));
|
||||
u32 y = VarGet(ScriptReadHalfword(ctx));
|
||||
u16 y = VarGet(ScriptReadHalfword(ctx));
|
||||
u8 elevation = ScriptReadByte(ctx);
|
||||
u8 direction = ScriptReadByte(ctx);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user