Merge remote-tracking branch '_merrp_origin/followers-expanded-id' into _RHH/pr/upcoming/merrpFollowers

# Conflicts:
#	src/event_object_movement.c
#	src/scrcmd.c
This commit is contained in:
Eduardo Quezada 2024-06-01 20:17:19 -04:00
commit 1359966a14
6 changed files with 30 additions and 15 deletions

View file

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

@ -26,6 +26,7 @@ UnionRoom_OnResume:
end
UnionRoom_OnTransition:
setflag FLAG_TEMP_HIDE_FOLLOWER
end
UnionRoom_EventScript_Player1::
@ -106,4 +107,3 @@ UnionRoom_EventScript_Unused::
waitstate
releaseall
end

View file

@ -69,7 +69,7 @@ struct FollowerMsgInfoExtended
#define MATCH_SPECIES(species) MATCH_U24(MSG_COND_SPECIES, species)
#define MATCH_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, 0)
// Checks that follower has *neither* of the two types
#define MATCH_NOT_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, TYPE_NONE)
#define MATCH_NOT_TYPES(type1, type2) MATCH_U8(MSG_COND_TYPE, type1, type2, TYPE_NONE | 1)
#define MATCH_STATUS(status) MATCH_U24(MSG_COND_STATUS, status)
#define MATCH_MAPSEC(mapsec) MATCH_U24(MSG_COND_MAPSEC, mapsec)
#define MATCH_MAP_RAW(mapGroup, mapNum) MATCH_U8(MSG_COND_MAP, mapGroup, mapNum, 0)

View file

@ -1507,11 +1507,13 @@ 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,
@ -1526,9 +1528,19 @@ u16 LoadSheetGraphicsInfo(const struct ObjectEventGraphicsInfo *info, u16 uuid,
{
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)
@ -1541,6 +1553,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)
@ -2184,12 +2197,12 @@ bool32 CheckMsgCondition(const struct MsgCondition *cond, struct Pokemon *mon, u
case MSG_COND_TYPE:
multi = (SpeciesHasType(species, cond->data.bytes[0]) ||
SpeciesHasType(species, cond->data.bytes[1]));
// if bytes[2] == TYPE_NONE,
// if bytes[2] nonzero,
// invert; check that mon has *neither* type!
if (cond->data.bytes[2] == 0)
return multi;
else
if (cond->data.bytes[2] != 0)
return !multi;
else
return multi;
break;
case MSG_COND_STATUS:
return (cond->data.raw & mon->status);
@ -2270,9 +2283,11 @@ void GetFollowerAction(struct ScriptContext *ctx) // Essentially a big switch fo
[FOLLOWER_EMOTION_UPSET] = 15,
[FOLLOWER_EMOTION_ANGRY] = 15,
[FOLLOWER_EMOTION_PENSIVE] = 15,
[FOLLOWER_EMOTION_LOVE] = 0,
[FOLLOWER_EMOTION_SURPRISE] = 10,
[FOLLOWER_EMOTION_CURIOUS] = 10,
[FOLLOWER_EMOTION_MUSIC] = 15,
[FOLLOWER_EMOTION_POISONED] = 0,
};
u32 i, j;
bool32 pickedCondition = FALSE;
@ -2303,7 +2318,7 @@ void GetFollowerAction(struct ScriptContext *ctx) // Essentially a big switch fo
if (GetCurrentWeather() == WEATHER_SUNNY_CLOUDS)
condEmotes[condCount++] = (struct SpecialEmote) {.emotion = FOLLOWER_EMOTION_HAPPY, .index = 31};
// Health & status-related
multi = mon->hp * 100 / mon->maxHP;
multi = SAFE_DIV(mon->hp * 100, mon->maxHP);
if (multi < 20)
{
emotion_weight[FOLLOWER_EMOTION_SAD] = 30;

View file

@ -244,16 +244,16 @@ const void *RandomElementArrayDefault(enum RandomTag tag, const void *array, siz
u8 RandomWeightedIndex(u8 *weights, u8 length)
{
u32 i;
u16 random_value;
u16 randomValue;
u16 weightSum = 0;
for (i = 0; i < length; i++)
weightSum += weights[i];
random_value = Random() % weightSum;
randomValue = weightSum > 0 ? Random() % weightSum : 0;
weightSum = 0;
for (i = 0; i < length; i++)
{
weightSum += weights[i];
if (random_value <= weightSum)
if (randomValue <= weightSum)
return i;
}
return 0;

View file

@ -1217,10 +1217,10 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx)
bool8 ScrCmd_createvobject(struct ScriptContext *ctx)
{
u16 graphicsId = ScriptReadByte(ctx);
u16 graphicsId = ScriptReadHalfword(ctx);
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);