Merge branch 'followers-expanded-id' into lighting-expanded-id

This commit is contained in:
Ariel A 2024-08-12 23:13:02 -04:00
commit 3abf4871fd
11 changed files with 48 additions and 17 deletions

View File

@ -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

View File

@ -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,

View File

@ -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,

View File

@ -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)

View File

@ -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[];

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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.

View File

@ -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;

View File

@ -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);