mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 11:03:00 +01:00
WIP: start reworking PeepAnimationGroup
This commit is contained in:
@@ -33,6 +33,8 @@
|
||||
#include <openrct2/entity/Staff.h>
|
||||
#include <openrct2/localisation/Formatter.h>
|
||||
#include <openrct2/management/Finance.h>
|
||||
#include <openrct2/object/ObjectManager.h>
|
||||
#include <openrct2/object/PeepAnimationsObject.h>
|
||||
#include <openrct2/peep/PeepAnimationData.h>
|
||||
#include <openrct2/sprites.h>
|
||||
#include <openrct2/ui/UiContext.h>
|
||||
@@ -461,7 +463,7 @@ namespace OpenRCT2::Ui::Windows
|
||||
}
|
||||
else
|
||||
{
|
||||
GfxDrawSprite(dpi, ImageId(GetEntertainerCostumeSprite(peep->AnimationGroup)), { staffOrderIcon_x, y });
|
||||
GfxDrawSprite(dpi, GetCostumeInlineSprite(peep->AnimationObjectIndex), { staffOrderIcon_x, y });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -728,36 +730,11 @@ namespace OpenRCT2::Ui::Windows
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t GetEntertainerCostumeSprite(PeepAnimationGroup type)
|
||||
static ImageId GetCostumeInlineSprite(ObjectEntryIndex index)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case PeepAnimationGroup::EntertainerPanda:
|
||||
return SPR_STAFF_COSTUME_PANDA;
|
||||
case PeepAnimationGroup::EntertainerTiger:
|
||||
return SPR_STAFF_COSTUME_TIGER;
|
||||
case PeepAnimationGroup::EntertainerElephant:
|
||||
return SPR_STAFF_COSTUME_ELEPHANT;
|
||||
case PeepAnimationGroup::EntertainerRoman:
|
||||
return SPR_STAFF_COSTUME_ROMAN;
|
||||
case PeepAnimationGroup::EntertainerGorilla:
|
||||
return SPR_STAFF_COSTUME_GORILLA;
|
||||
case PeepAnimationGroup::EntertainerSnowman:
|
||||
return SPR_STAFF_COSTUME_SNOWMAN;
|
||||
case PeepAnimationGroup::EntertainerKnight:
|
||||
return SPR_STAFF_COSTUME_KNIGHT;
|
||||
case PeepAnimationGroup::EntertainerAstronaut:
|
||||
return SPR_STAFF_COSTUME_ASTRONAUT;
|
||||
case PeepAnimationGroup::EntertainerBandit:
|
||||
return SPR_STAFF_COSTUME_BANDIT;
|
||||
case PeepAnimationGroup::EntertainerSheriff:
|
||||
return SPR_STAFF_COSTUME_SHERIFF;
|
||||
case PeepAnimationGroup::EntertainerPirate:
|
||||
return SPR_STAFF_COSTUME_PIRATE;
|
||||
case PeepAnimationGroup::Normal:
|
||||
default:
|
||||
return SPR_PEEP_SMALL_FACE_HAPPY;
|
||||
}
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
auto* animObj = objManager.GetLoadedObject<PeepAnimationsObject>(index);
|
||||
return ImageId(animObj->GetInlineImageId());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "../management/Marketing.h"
|
||||
#include "../management/NewsItem.h"
|
||||
#include "../network/network.h"
|
||||
#include "../object/ObjectManager.h"
|
||||
#include "../object/PeepAnimationsObject.h"
|
||||
#include "../paint/Paint.h"
|
||||
#include "../peep/GuestPathfinding.h"
|
||||
#include "../peep/PeepAnimationData.h"
|
||||
@@ -471,7 +473,10 @@ std::optional<CoordsXY> Peep::UpdateAction(int16_t& xy_distance)
|
||||
|
||||
bool Peep::UpdateActionAnimation()
|
||||
{
|
||||
const PeepAnimation& peepAnimation = GetPeepAnimation(AnimationGroup, AnimationType);
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
auto* animObj = objManager.GetLoadedObject<PeepAnimationsObject>(AnimationObjectIndex);
|
||||
|
||||
const PeepAnimation& peepAnimation = animObj->GetPeepAnimation(AnimationGroup, AnimationType);
|
||||
AnimationFrameNum++;
|
||||
|
||||
// If last frame of action
|
||||
@@ -529,8 +534,11 @@ std::optional<CoordsXY> Peep::UpdateWalkingAction(const CoordsXY& differenceLoc,
|
||||
|
||||
void Peep::UpdateWalkingAnimation()
|
||||
{
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
auto* animObj = objManager.GetLoadedObject<PeepAnimationsObject>(AnimationObjectIndex);
|
||||
|
||||
WalkingAnimationFrameNum++;
|
||||
const PeepAnimation& peepAnimation = GetPeepAnimation(AnimationGroup, AnimationType);
|
||||
const PeepAnimation& peepAnimation = animObj->GetPeepAnimation(AnimationGroup, AnimationType);
|
||||
if (WalkingAnimationFrameNum >= peepAnimation.frame_offsets.size())
|
||||
{
|
||||
WalkingAnimationFrameNum = 0;
|
||||
@@ -2896,9 +2904,12 @@ void Peep::Paint(PaintSession& session, int32_t imageDirection) const
|
||||
imageOffset = 0;
|
||||
}
|
||||
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
auto* animObj = objManager.GetLoadedObject<PeepAnimationsObject>(AnimationObjectIndex);
|
||||
|
||||
// In the following 4 calls to PaintAddImageAsParent/PaintAddImageAsChild, we add 5 (instead of 3) to the
|
||||
// bound_box_offset_z to make sure peeps are drawn on top of railways
|
||||
uint32_t baseImageId = GetPeepAnimation(AnimationGroup, actionAnimationGroup).base_image;
|
||||
uint32_t baseImageId = animObj->GetPeepAnimation(AnimationGroup, actionAnimationGroup).base_image;
|
||||
|
||||
// Offset frame onto the base image, using rotation except for the 'picked up' state
|
||||
if (actionAnimationGroup != PeepAnimationType::Hanging)
|
||||
|
||||
@@ -234,54 +234,60 @@ enum PeepNextFlags
|
||||
enum class PeepAnimationGroup : uint8_t
|
||||
{
|
||||
Normal = 0,
|
||||
Handyman = 1,
|
||||
Mechanic = 2,
|
||||
Security = 3,
|
||||
EntertainerPanda = 4,
|
||||
EntertainerTiger = 5,
|
||||
EntertainerElephant = 6,
|
||||
EntertainerRoman = 7,
|
||||
EntertainerGorilla = 8,
|
||||
EntertainerSnowman = 9,
|
||||
EntertainerKnight = 10,
|
||||
EntertainerAstronaut = 11,
|
||||
EntertainerBandit = 12,
|
||||
EntertainerSheriff = 13,
|
||||
EntertainerPirate = 14,
|
||||
IceCream = 15,
|
||||
Chips = 16,
|
||||
Burger = 17,
|
||||
Drink = 18,
|
||||
Balloon = 19,
|
||||
Candyfloss = 20,
|
||||
Umbrella = 21,
|
||||
Pizza = 22,
|
||||
SecurityAlt = 23,
|
||||
Popcorn = 24,
|
||||
ArmsCrossed = 25,
|
||||
HeadDown = 26,
|
||||
Nauseous = 27,
|
||||
VeryNauseous = 28,
|
||||
RequireToilet = 29,
|
||||
Hat = 30,
|
||||
HotDog = 31,
|
||||
Tentacle = 32,
|
||||
ToffeeApple = 33,
|
||||
Doughnut = 34,
|
||||
Coffee = 35,
|
||||
Chicken = 36,
|
||||
Lemonade = 37,
|
||||
Watching = 38,
|
||||
Pretzel = 39,
|
||||
Sunglasses = 40,
|
||||
SuJongkwa = 41,
|
||||
Juice = 42,
|
||||
FunnelCake = 43,
|
||||
Noodles = 44,
|
||||
Sausage = 45,
|
||||
Soup = 46,
|
||||
Sandwich = 47,
|
||||
Count = 48,
|
||||
Handyman = 0, // 1,
|
||||
Mechanic = 0, // 2,
|
||||
|
||||
Security = 0, // 3,
|
||||
SecurityAlt = 1, // 23,
|
||||
|
||||
EntertainerPanda = 0, // 4,
|
||||
EntertainerTiger = 0, // 5,
|
||||
EntertainerElephant = 0, // 6,
|
||||
EntertainerRoman = 0, // 7,
|
||||
EntertainerGorilla = 0, // 8,
|
||||
EntertainerSnowman = 0, // 9,
|
||||
EntertainerKnight = 0, // 10,
|
||||
EntertainerAstronaut = 0, // 11,
|
||||
EntertainerBandit = 0, // 12,
|
||||
EntertainerSheriff = 0, // 13,
|
||||
EntertainerPirate = 0, // 14,
|
||||
|
||||
// Guest variations (compensate for Staff/Entertainer slots)
|
||||
IceCream = 15 - 14,
|
||||
Chips = 16 - 14,
|
||||
Burger = 17 - 14,
|
||||
Drink = 18 - 14,
|
||||
Balloon = 19 - 14,
|
||||
Candyfloss = 20 - 14,
|
||||
Umbrella = 21 - 14,
|
||||
Pizza = 22 - 14,
|
||||
|
||||
// Guest variations (compensate for SecurityAlt as well)
|
||||
Popcorn = 24 - 15,
|
||||
ArmsCrossed = 25 - 15,
|
||||
HeadDown = 26 - 15,
|
||||
Nauseous = 27 - 15,
|
||||
VeryNauseous = 28 - 15,
|
||||
RequireToilet = 29 - 15,
|
||||
Hat = 30 - 15,
|
||||
HotDog = 31 - 15,
|
||||
Tentacle = 32 - 15,
|
||||
ToffeeApple = 33 - 15,
|
||||
Doughnut = 34 - 15,
|
||||
Coffee = 35 - 15,
|
||||
Chicken = 36 - 15,
|
||||
Lemonade = 37 - 15,
|
||||
Watching = 38 - 15,
|
||||
Pretzel = 39 - 15,
|
||||
Sunglasses = 40 - 15,
|
||||
SuJongkwa = 41 - 15,
|
||||
Juice = 42 - 15,
|
||||
FunnelCake = 43 - 15,
|
||||
Noodles = 44 - 15,
|
||||
Sausage = 45 - 15,
|
||||
Soup = 46 - 15,
|
||||
Sandwich = 47 - 15,
|
||||
Count = 48 - 15,
|
||||
|
||||
Invalid = 255
|
||||
};
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "../core/Guard.hpp"
|
||||
#include "../core/Json.hpp"
|
||||
#include "../peep/PeepAnimations.h"
|
||||
#include "../rct12/RCT12.h"
|
||||
|
||||
using namespace OpenRCT2;
|
||||
|
||||
@@ -94,7 +95,7 @@ void PeepAnimationsObject::ReadJson(IReadObjectContext* context, json_t& root)
|
||||
if (groupJson.contains("legacyPosition"))
|
||||
{
|
||||
auto position = Json::GetNumber<uint8_t>(groupJson["legacyPosition"]);
|
||||
if (position <= EnumValue(PeepAnimationGroup::Count))
|
||||
if (position <= EnumValue(RCT12PeepAnimationGroup::Count))
|
||||
{
|
||||
group.legacyPosition = static_cast<PeepAnimationGroup>(position);
|
||||
}
|
||||
@@ -104,6 +105,16 @@ void PeepAnimationsObject::ReadJson(IReadObjectContext* context, json_t& root)
|
||||
}
|
||||
}
|
||||
|
||||
ImageIndex PeepAnimationsObject::GetInlineImageId() const
|
||||
{
|
||||
return _imageOffsetId;
|
||||
}
|
||||
|
||||
const PeepAnimation& PeepAnimationsObject::GetPeepAnimation(PeepAnimationGroup animGroup, PeepAnimationType animType) const
|
||||
{
|
||||
return _animationGroups[EnumValue(animGroup)][animType];
|
||||
}
|
||||
|
||||
size_t PeepAnimationsObject::GetNumAnimationGroups() const
|
||||
{
|
||||
return _animationGroups.size();
|
||||
|
||||
@@ -29,6 +29,10 @@ public:
|
||||
void Load() override;
|
||||
void Unload() override;
|
||||
|
||||
ImageIndex GetInlineImageId() const;
|
||||
const OpenRCT2::PeepAnimation& GetPeepAnimation(
|
||||
PeepAnimationGroup animGroup, PeepAnimationType animType = PeepAnimationType::Walking) const;
|
||||
|
||||
size_t GetNumAnimationGroups() const;
|
||||
PeepAnimationGroup GetLegacyPosition(PeepAnimationGroup animGroup) const;
|
||||
|
||||
|
||||
@@ -1323,7 +1323,8 @@ namespace OpenRCT2::RCT1
|
||||
{
|
||||
// TODO
|
||||
dst->AnimationObjectIndex = OBJECT_ENTRY_INDEX_NULL;
|
||||
dst->AnimationGroup = RCT1::GetPeepAnimationGroup(src->AnimationGroup);
|
||||
auto rct12AnimGroup = RCT1::GetPeepAnimationGroup(src->AnimationGroup);
|
||||
dst->AnimationGroup = static_cast<::PeepAnimationGroup>(rct12AnimGroup);
|
||||
|
||||
dst->Action = static_cast<PeepActionType>(src->Action);
|
||||
dst->SpecialSprite = src->SpecialSprite;
|
||||
|
||||
@@ -67,50 +67,50 @@ namespace OpenRCT2::RCT1
|
||||
return map[colour];
|
||||
}
|
||||
|
||||
::PeepAnimationGroup GetPeepAnimationGroup(RCT1::PeepAnimationGroup rct1AnimationGroup)
|
||||
RCT12PeepAnimationGroup GetPeepAnimationGroup(PeepAnimationGroup rct1AnimationGroup)
|
||||
{
|
||||
static constexpr ::PeepAnimationGroup map[] =
|
||||
static constexpr RCT12PeepAnimationGroup map[] =
|
||||
{
|
||||
::PeepAnimationGroup::Normal, // 0x00
|
||||
::PeepAnimationGroup::Handyman, // 0x01
|
||||
::PeepAnimationGroup::Mechanic, // 0x02
|
||||
::PeepAnimationGroup::Security, // 0x03
|
||||
::PeepAnimationGroup::EntertainerPanda, // 0x04
|
||||
::PeepAnimationGroup::EntertainerTiger, // 0x05
|
||||
::PeepAnimationGroup::EntertainerElephant, // 0x06
|
||||
::PeepAnimationGroup::EntertainerRoman, // 0x07
|
||||
::PeepAnimationGroup::EntertainerGorilla, // 0x08
|
||||
::PeepAnimationGroup::EntertainerSnowman, // 0x09
|
||||
::PeepAnimationGroup::EntertainerKnight, // 0x0A
|
||||
::PeepAnimationGroup::EntertainerAstronaut, // 0x0B
|
||||
::PeepAnimationGroup::IceCream, // 0x0C
|
||||
::PeepAnimationGroup::Chips, // 0x0D
|
||||
::PeepAnimationGroup::Burger, // 0x0E
|
||||
::PeepAnimationGroup::Drink, // 0x0F
|
||||
::PeepAnimationGroup::Balloon, // 0x10
|
||||
::PeepAnimationGroup::Candyfloss, // 0x11
|
||||
::PeepAnimationGroup::Umbrella, // 0x12
|
||||
::PeepAnimationGroup::Pizza, // 0x13
|
||||
::PeepAnimationGroup::SecurityAlt, // 0x14
|
||||
::PeepAnimationGroup::Popcorn, // 0x15
|
||||
::PeepAnimationGroup::ArmsCrossed, // 0x16
|
||||
::PeepAnimationGroup::HeadDown, // 0x17
|
||||
::PeepAnimationGroup::Nauseous, // 0x18
|
||||
::PeepAnimationGroup::VeryNauseous, // 0x19
|
||||
::PeepAnimationGroup::RequireToilet, // 0x1A
|
||||
::PeepAnimationGroup::Hat, // 0x1B
|
||||
::PeepAnimationGroup::HotDog, // 0x1C
|
||||
::PeepAnimationGroup::Tentacle, // 0x1D
|
||||
::PeepAnimationGroup::ToffeeApple, // 0x1E
|
||||
::PeepAnimationGroup::Doughnut, // 0x1F
|
||||
::PeepAnimationGroup::Coffee, // 0x20
|
||||
::PeepAnimationGroup::Chicken, // 0x21
|
||||
::PeepAnimationGroup::Lemonade, // 0x22
|
||||
RCT12PeepAnimationGroup::Normal, // 0x00
|
||||
RCT12PeepAnimationGroup::Handyman, // 0x01
|
||||
RCT12PeepAnimationGroup::Mechanic, // 0x02
|
||||
RCT12PeepAnimationGroup::Security, // 0x03
|
||||
RCT12PeepAnimationGroup::EntertainerPanda, // 0x04
|
||||
RCT12PeepAnimationGroup::EntertainerTiger, // 0x05
|
||||
RCT12PeepAnimationGroup::EntertainerElephant, // 0x06
|
||||
RCT12PeepAnimationGroup::EntertainerRoman, // 0x07
|
||||
RCT12PeepAnimationGroup::EntertainerGorilla, // 0x08
|
||||
RCT12PeepAnimationGroup::EntertainerSnowman, // 0x09
|
||||
RCT12PeepAnimationGroup::EntertainerKnight, // 0x0A
|
||||
RCT12PeepAnimationGroup::EntertainerAstronaut, // 0x0B
|
||||
RCT12PeepAnimationGroup::IceCream, // 0x0C
|
||||
RCT12PeepAnimationGroup::Chips, // 0x0D
|
||||
RCT12PeepAnimationGroup::Burger, // 0x0E
|
||||
RCT12PeepAnimationGroup::Drink, // 0x0F
|
||||
RCT12PeepAnimationGroup::Balloon, // 0x10
|
||||
RCT12PeepAnimationGroup::Candyfloss, // 0x11
|
||||
RCT12PeepAnimationGroup::Umbrella, // 0x12
|
||||
RCT12PeepAnimationGroup::Pizza, // 0x13
|
||||
RCT12PeepAnimationGroup::SecurityAlt, // 0x14
|
||||
RCT12PeepAnimationGroup::Popcorn, // 0x15
|
||||
RCT12PeepAnimationGroup::ArmsCrossed, // 0x16
|
||||
RCT12PeepAnimationGroup::HeadDown, // 0x17
|
||||
RCT12PeepAnimationGroup::Nauseous, // 0x18
|
||||
RCT12PeepAnimationGroup::VeryNauseous, // 0x19
|
||||
RCT12PeepAnimationGroup::RequireToilet, // 0x1A
|
||||
RCT12PeepAnimationGroup::Hat, // 0x1B
|
||||
RCT12PeepAnimationGroup::HotDog, // 0x1C
|
||||
RCT12PeepAnimationGroup::Tentacle, // 0x1D
|
||||
RCT12PeepAnimationGroup::ToffeeApple, // 0x1E
|
||||
RCT12PeepAnimationGroup::Doughnut, // 0x1F
|
||||
RCT12PeepAnimationGroup::Coffee, // 0x20
|
||||
RCT12PeepAnimationGroup::Chicken, // 0x21
|
||||
RCT12PeepAnimationGroup::Lemonade, // 0x22
|
||||
};
|
||||
if (EnumValue(rct1AnimationGroup) >= std::size(map))
|
||||
{
|
||||
LOG_WARNING("Unsupported RCT1 peep sprite type: %d.", EnumValue(rct1AnimationGroup));
|
||||
return ::PeepAnimationGroup::Normal;
|
||||
return RCT12PeepAnimationGroup::Normal;
|
||||
}
|
||||
return map[EnumValue(rct1AnimationGroup)];
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace OpenRCT2::RCT1
|
||||
enum class PeepAnimationGroup : uint8_t;
|
||||
|
||||
colour_t GetColour(colour_t colour);
|
||||
::PeepAnimationGroup GetPeepAnimationGroup(PeepAnimationGroup rct1AnimationGroup);
|
||||
RCT12PeepAnimationGroup GetPeepAnimationGroup(PeepAnimationGroup rct1AnimationGroup);
|
||||
|
||||
uint8_t GetRideType(RideType rideType, VehicleType vehicleType);
|
||||
VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(VehicleType vehicleType);
|
||||
|
||||
@@ -985,6 +985,61 @@ enum class RCT12PeepType : uint8_t
|
||||
Invalid = 0xFF
|
||||
};
|
||||
|
||||
enum class RCT12PeepAnimationGroup : uint8_t
|
||||
{
|
||||
Normal = 0,
|
||||
Handyman = 1,
|
||||
Mechanic = 2,
|
||||
Security = 3,
|
||||
EntertainerPanda = 4,
|
||||
EntertainerTiger = 5,
|
||||
EntertainerElephant = 6,
|
||||
EntertainerRoman = 7,
|
||||
EntertainerGorilla = 8,
|
||||
EntertainerSnowman = 9,
|
||||
EntertainerKnight = 10,
|
||||
EntertainerAstronaut = 11,
|
||||
EntertainerBandit = 12,
|
||||
EntertainerSheriff = 13,
|
||||
EntertainerPirate = 14,
|
||||
IceCream = 15,
|
||||
Chips = 16,
|
||||
Burger = 17,
|
||||
Drink = 18,
|
||||
Balloon = 19,
|
||||
Candyfloss = 20,
|
||||
Umbrella = 21,
|
||||
Pizza = 22,
|
||||
SecurityAlt = 23,
|
||||
Popcorn = 24,
|
||||
ArmsCrossed = 25,
|
||||
HeadDown = 26,
|
||||
Nauseous = 27,
|
||||
VeryNauseous = 28,
|
||||
RequireToilet = 29,
|
||||
Hat = 30,
|
||||
HotDog = 31,
|
||||
Tentacle = 32,
|
||||
ToffeeApple = 33,
|
||||
Doughnut = 34,
|
||||
Coffee = 35,
|
||||
Chicken = 36,
|
||||
Lemonade = 37,
|
||||
Watching = 38,
|
||||
Pretzel = 39,
|
||||
Sunglasses = 40,
|
||||
SuJongkwa = 41,
|
||||
Juice = 42,
|
||||
FunnelCake = 43,
|
||||
Noodles = 44,
|
||||
Sausage = 45,
|
||||
Soup = 46,
|
||||
Sandwich = 47,
|
||||
Count = 48,
|
||||
|
||||
Invalid = 255
|
||||
};
|
||||
|
||||
struct RCT12EntityBase
|
||||
{
|
||||
RCT12EntityIdentifier EntityIdentifier; // 0x00
|
||||
|
||||
Reference in New Issue
Block a user