mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 11:03:00 +01:00
List available staff costumes dynamically
This commit is contained in:
@@ -1164,17 +1164,6 @@ STR_1773 :Only one on-ride photo section allowed per ride
|
||||
STR_1774 :Only one cable lift hill allowed per ride
|
||||
STR_1777 :Ride music
|
||||
STR_1778 :{STRINGID} - -
|
||||
STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume
|
||||
STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume
|
||||
STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume
|
||||
STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume
|
||||
STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume
|
||||
STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume
|
||||
STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume
|
||||
STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume
|
||||
STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume
|
||||
STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume
|
||||
STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume
|
||||
STR_1790 :Select uniform colour for this type of staff
|
||||
STR_1791 :{WINDOW_COLOUR_2}Uniform colour:
|
||||
STR_1792 :Responding to {STRINGID} breakdown call
|
||||
|
||||
@@ -31,12 +31,14 @@
|
||||
#include <openrct2/network/network.h>
|
||||
#include <openrct2/object/ObjectManager.h>
|
||||
#include <openrct2/object/PeepAnimationsObject.h>
|
||||
#include <openrct2/peep/PeepAnimations.h>
|
||||
#include <openrct2/sprites.h>
|
||||
#include <openrct2/ui/UiContext.h>
|
||||
#include <openrct2/ui/WindowManager.h>
|
||||
#include <openrct2/windows/Intent.h>
|
||||
#include <openrct2/world/Footpath.h>
|
||||
#include <openrct2/world/Park.h>
|
||||
#include <sstream>
|
||||
|
||||
using namespace OpenRCT2::Numerics;
|
||||
|
||||
@@ -129,10 +131,18 @@ namespace OpenRCT2::Ui::Windows
|
||||
_staffStatsWidgets,
|
||||
};
|
||||
|
||||
struct AvailableCostume
|
||||
{
|
||||
ObjectEntryIndex index;
|
||||
PeepAnimationsObject* object;
|
||||
std::string rawName;
|
||||
std::string friendlyName;
|
||||
};
|
||||
|
||||
class StaffWindow final : public Window
|
||||
{
|
||||
private:
|
||||
EntertainerCostume _availableCostumes[EnumValue(EntertainerCostume::Count)]{};
|
||||
std::vector<AvailableCostume> _availableCostumes;
|
||||
uint16_t _tabAnimationOffset = 0;
|
||||
int32_t _pickedPeepOldX = kLocationNull;
|
||||
|
||||
@@ -140,6 +150,41 @@ namespace OpenRCT2::Ui::Windows
|
||||
void Initialise(EntityId entityId)
|
||||
{
|
||||
number = entityId.ToUnderlying();
|
||||
|
||||
if (GetStaff()->AssignedStaffType == StaffType::Entertainer)
|
||||
InitialiseCostumeList();
|
||||
}
|
||||
|
||||
void InitialiseCostumeList()
|
||||
{
|
||||
auto availCostumeIndexes = findAllPeepAnimationsIndexesForType(AnimationPeepType::Entertainer);
|
||||
auto availCostumeObjects = findAllPeepAnimationsObjectForType(AnimationPeepType::Entertainer);
|
||||
|
||||
_availableCostumes = {};
|
||||
for (auto i = 0u; i < availCostumeObjects.size(); i++)
|
||||
{
|
||||
auto baseName = availCostumeObjects[i]->GetCostumeName();
|
||||
auto inlineImageId = availCostumeObjects[i]->GetInlineImageId();
|
||||
|
||||
// std::format doesn't appear to be available on macOS <13.3
|
||||
std::stringstream out{};
|
||||
out << "{INLINE_SPRITE}";
|
||||
for (auto b = 0; b < 32; b += 8)
|
||||
out << '{' << ((inlineImageId >> b) & 0xFF) << '}';
|
||||
out << ' ';
|
||||
out << baseName;
|
||||
|
||||
_availableCostumes.push_back({
|
||||
.index = availCostumeIndexes[i],
|
||||
.object = availCostumeObjects[i],
|
||||
.rawName = baseName,
|
||||
.friendlyName = out.str(),
|
||||
});
|
||||
}
|
||||
|
||||
std::sort(_availableCostumes.begin(), _availableCostumes.end(), [](const auto& a, const auto& b) {
|
||||
return a.rawName < b.rawName;
|
||||
});
|
||||
}
|
||||
|
||||
void OnOpen() override
|
||||
@@ -152,6 +197,12 @@ namespace OpenRCT2::Ui::Windows
|
||||
CancelTools();
|
||||
}
|
||||
|
||||
void OnLanguageChange() override
|
||||
{
|
||||
if (GetStaff()->AssignedStaffType == StaffType::Entertainer)
|
||||
InitialiseCostumeList();
|
||||
}
|
||||
|
||||
void OnMouseUp(WidgetIndex widgetIndex) override
|
||||
{
|
||||
if (widgetIndex <= WIDX_TAB_3)
|
||||
@@ -778,19 +829,18 @@ namespace OpenRCT2::Ui::Windows
|
||||
}
|
||||
|
||||
int32_t checkedIndex = -1;
|
||||
// This will be moved below where Items Checked is when all
|
||||
// of dropdown related functions are finished. This prevents
|
||||
// the dropdown from not working on first click.
|
||||
int32_t numCostumes = StaffGetAvailableEntertainerCostumeList(_availableCostumes);
|
||||
for (int32_t i = 0; i < numCostumes; i++)
|
||||
auto numCostumes = _availableCostumes.size();
|
||||
for (auto i = 0u; i < numCostumes; i++)
|
||||
{
|
||||
EntertainerCostume costume = _availableCostumes[i];
|
||||
if (staff->AnimationGroup == EntertainerCostumeToSprite(costume))
|
||||
{
|
||||
// TODO: refactor this hack
|
||||
auto* nameStr = _availableCostumes[i].friendlyName.c_str();
|
||||
std::memcpy(&gDropdownItems[i].Args, &nameStr, sizeof(const char*));
|
||||
gDropdownItems[i].Format = STR_OPTIONS_DROPDOWN_ITEM;
|
||||
|
||||
// Remember what item to check for the end of this event function
|
||||
auto costumeIndex = _availableCostumes[i].index;
|
||||
if (staff->AnimationObjectIndex == costumeIndex)
|
||||
checkedIndex = i;
|
||||
}
|
||||
gDropdownItems[i].Args = StaffCostumeNames[EnumValue(costume)];
|
||||
gDropdownItems[i].Format = STR_DROPDOWN_MENU_LABEL;
|
||||
}
|
||||
|
||||
auto ddPos = ScreenCoordsXY{ ddWidget->left + windowPos.x, ddWidget->top + windowPos.y };
|
||||
@@ -798,11 +848,9 @@ namespace OpenRCT2::Ui::Windows
|
||||
int32_t ddWidth = ddWidget->width() - 3;
|
||||
WindowDropdownShowTextCustomWidth(ddPos, ddHeight, colours[1], 0, Dropdown::Flag::StayOpen, numCostumes, ddWidth);
|
||||
|
||||
// See above note.
|
||||
// Set selection
|
||||
if (checkedIndex != -1)
|
||||
{
|
||||
Dropdown::SetChecked(checkedIndex, true);
|
||||
}
|
||||
}
|
||||
|
||||
void OptionsOnDropdown(WidgetIndex widgetIndex, int32_t dropdownIndex)
|
||||
@@ -815,7 +863,7 @@ namespace OpenRCT2::Ui::Windows
|
||||
if (dropdownIndex == -1)
|
||||
return;
|
||||
|
||||
EntertainerCostume costume = _availableCostumes[dropdownIndex];
|
||||
ObjectEntryIndex costume = _availableCostumes[dropdownIndex].index;
|
||||
auto staffSetCostumeAction = StaffSetCostumeAction(EntityId::FromUnderlying(number), costume);
|
||||
GameActions::Execute(&staffSetCostumeAction);
|
||||
}
|
||||
@@ -839,12 +887,23 @@ namespace OpenRCT2::Ui::Windows
|
||||
widgets[WIDX_COSTUME_BOX].type = WindowWidgetType::DropdownMenu;
|
||||
widgets[WIDX_COSTUME_BTN].type = WindowWidgetType::Button;
|
||||
|
||||
// TODO: retrieve string from object instead
|
||||
auto costumeType = EnumValue(staff->AnimationGroup) - EnumValue(PeepAnimationGroup::EntertainerPanda);
|
||||
if (costumeType >= 0)
|
||||
widgets[WIDX_COSTUME_BOX].text = StaffCostumeNames[costumeType];
|
||||
auto pos = std::find_if(_availableCostumes.begin(), _availableCostumes.end(), [staff](auto costume) {
|
||||
return costume.index == staff->AnimationObjectIndex;
|
||||
});
|
||||
|
||||
if (pos != _availableCostumes.end())
|
||||
{
|
||||
auto index = std::distance(_availableCostumes.begin(), pos);
|
||||
auto name = _availableCostumes[index].friendlyName.c_str();
|
||||
widgets[WIDX_COSTUME_BOX].string = const_cast<utf8*>(name);
|
||||
widgets[WIDX_COSTUME_BOX].flags |= WIDGET_FLAGS::TEXT_IS_STRING;
|
||||
}
|
||||
else
|
||||
widgets[WIDX_COSTUME_BOX].text = STR_UNKNOWN_OBJECT_TYPE;
|
||||
{
|
||||
widgets[WIDX_COSTUME_BOX].text = STR_EMPTY;
|
||||
widgets[WIDX_COSTUME_BOX].flags &= ~WIDGET_FLAGS::TEXT_IS_STRING;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case StaffType::Handyman:
|
||||
|
||||
@@ -701,19 +701,6 @@ namespace OpenRCT2::Ui::Windows
|
||||
return closestPeep;
|
||||
}
|
||||
|
||||
static EntertainerCostume GetRandomEntertainerCostume()
|
||||
{
|
||||
auto result = EntertainerCostume::Panda;
|
||||
EntertainerCostume costumeList[EnumValue(EntertainerCostume::Count)];
|
||||
int32_t numCostumes = StaffGetAvailableEntertainerCostumeList(costumeList);
|
||||
if (numCostumes > 0)
|
||||
{
|
||||
int32_t index = UtilRand() % numCostumes;
|
||||
result = costumeList[index];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static constexpr StaffNamingConvention GetStaffNamingConvention(StaffType type)
|
||||
{
|
||||
switch (type)
|
||||
|
||||
@@ -161,6 +161,10 @@ GameActions::Result StaffHireNewAction::QueryExecute(bool execute) const
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
auto* animObj = objManager.GetLoadedObject<PeepAnimationsObject>(animObjectIndex);
|
||||
|
||||
newPeep->PeepFlags &= ~PEEP_FLAGS_SLOW_WALK;
|
||||
if (animObj->IsSlowWalking())
|
||||
newPeep->PeepFlags |= PEEP_FLAGS_SLOW_WALK;
|
||||
|
||||
const auto& spriteBounds = animObj->GetSpriteBounds(newPeep->AnimationGroup);
|
||||
newPeep->SpriteData.Width = spriteBounds.sprite_width;
|
||||
newPeep->SpriteData.HeightMin = spriteBounds.sprite_height_negative;
|
||||
|
||||
@@ -14,31 +14,13 @@
|
||||
#include "../entity/EntityRegistry.h"
|
||||
#include "../interface/Window.h"
|
||||
#include "../localisation/StringIds.h"
|
||||
#include "../object/ObjectManager.h"
|
||||
#include "../object/PeepAnimationsObject.h"
|
||||
#include "../windows/Intent.h"
|
||||
|
||||
using namespace OpenRCT2;
|
||||
|
||||
/** rct2: 0x00982134 */
|
||||
constexpr bool peep_slow_walking_types[] = {
|
||||
false, // PeepAnimationGroup::Normal
|
||||
false, // PeepAnimationGroup::Handyman
|
||||
false, // PeepAnimationGroup::Mechanic
|
||||
false, // PeepAnimationGroup::Security
|
||||
false, // PeepAnimationGroup::EntertainerPanda
|
||||
false, // PeepAnimationGroup::EntertainerTiger
|
||||
false, // PeepAnimationGroup::EntertainerElephant
|
||||
false, // PeepAnimationGroup::EntertainerRoman
|
||||
false, // PeepAnimationGroup::EntertainerGorilla
|
||||
false, // PeepAnimationGroup::EntertainerSnowman
|
||||
false, // PeepAnimationGroup::EntertainerKnight
|
||||
true, // PeepAnimationGroup::EntertainerAstronaut
|
||||
false, // PeepAnimationGroup::EntertainerBandit
|
||||
false, // PeepAnimationGroup::EntertainerSheriff
|
||||
true, // PeepAnimationGroup::EntertainerPirate
|
||||
true, // PeepAnimationGroup::Balloon
|
||||
};
|
||||
|
||||
StaffSetCostumeAction::StaffSetCostumeAction(EntityId spriteIndex, EntertainerCostume costume)
|
||||
StaffSetCostumeAction::StaffSetCostumeAction(EntityId spriteIndex, ObjectEntryIndex costume)
|
||||
: _spriteIndex(spriteIndex)
|
||||
, _costume(costume)
|
||||
{
|
||||
@@ -78,8 +60,11 @@ GameActions::Result StaffSetCostumeAction::Query() const
|
||||
return GameActions::Result(GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND);
|
||||
}
|
||||
|
||||
auto spriteType = EntertainerCostumeToSprite(_costume);
|
||||
if (EnumValue(spriteType) > std::size(peep_slow_walking_types))
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
auto* animObj = objManager.GetLoadedObject<PeepAnimationsObject>(_costume);
|
||||
|
||||
auto animPeepType = AnimationPeepType(static_cast<uint8_t>(staff->AssignedStaffType) + 1);
|
||||
if (animObj->GetPeepType() != animPeepType)
|
||||
{
|
||||
LOG_ERROR("Invalid entertainer costume %u", _costume);
|
||||
return GameActions::Result(
|
||||
@@ -97,13 +82,16 @@ GameActions::Result StaffSetCostumeAction::Execute() const
|
||||
return GameActions::Result(GameActions::Status::InvalidParameters, STR_ERR_INVALID_PARAMETER, STR_ERR_STAFF_NOT_FOUND);
|
||||
}
|
||||
|
||||
auto spriteType = EntertainerCostumeToSprite(_costume);
|
||||
staff->AnimationGroup = spriteType;
|
||||
staff->AnimationObjectIndex = _costume;
|
||||
staff->AnimationGroup = PeepAnimationGroup::Normal;
|
||||
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
auto* animObj = objManager.GetLoadedObject<PeepAnimationsObject>(_costume);
|
||||
|
||||
staff->PeepFlags &= ~PEEP_FLAGS_SLOW_WALK;
|
||||
if (peep_slow_walking_types[EnumValue(spriteType)])
|
||||
{
|
||||
if (animObj->IsSlowWalking())
|
||||
staff->PeepFlags |= PEEP_FLAGS_SLOW_WALK;
|
||||
}
|
||||
|
||||
staff->AnimationFrameNum = 0;
|
||||
staff->UpdateCurrentAnimationType();
|
||||
staff->Invalidate();
|
||||
|
||||
@@ -16,11 +16,11 @@ class StaffSetCostumeAction final : public GameActionBase<GameCommand::SetStaffC
|
||||
{
|
||||
private:
|
||||
EntityId _spriteIndex{ EntityId::GetNull() };
|
||||
EntertainerCostume _costume = EntertainerCostume::Count;
|
||||
ObjectEntryIndex _costume = OBJECT_ENTRY_INDEX_NULL;
|
||||
|
||||
public:
|
||||
StaffSetCostumeAction() = default;
|
||||
StaffSetCostumeAction(EntityId spriteIndex, EntertainerCostume costume);
|
||||
StaffSetCostumeAction(EntityId spriteIndex, ObjectEntryIndex costume);
|
||||
|
||||
void AcceptParameters(GameActionParameterVisitor& visitor) override;
|
||||
|
||||
|
||||
@@ -57,22 +57,6 @@
|
||||
|
||||
using namespace OpenRCT2;
|
||||
|
||||
// clang-format off
|
||||
const StringId StaffCostumeNames[] = {
|
||||
STR_STAFF_OPTION_COSTUME_PANDA,
|
||||
STR_STAFF_OPTION_COSTUME_TIGER,
|
||||
STR_STAFF_OPTION_COSTUME_ELEPHANT,
|
||||
STR_STAFF_OPTION_COSTUME_ROMAN,
|
||||
STR_STAFF_OPTION_COSTUME_GORILLA,
|
||||
STR_STAFF_OPTION_COSTUME_SNOWMAN,
|
||||
STR_STAFF_OPTION_COSTUME_KNIGHT,
|
||||
STR_STAFF_OPTION_COSTUME_ASTRONAUT,
|
||||
STR_STAFF_OPTION_COSTUME_BANDIT,
|
||||
STR_STAFF_OPTION_COSTUME_SHERIFF,
|
||||
STR_STAFF_OPTION_COSTUME_PIRATE,
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
// Maximum manhattan distance that litter can be for a handyman to seek to it
|
||||
const uint16_t MAX_LITTER_DISTANCE = 3 * kCoordsXYStep;
|
||||
|
||||
@@ -963,14 +947,6 @@ int32_t Staff::GetHireDate() const
|
||||
return HireDate;
|
||||
}
|
||||
|
||||
PeepAnimationGroup EntertainerCostumeToSprite(EntertainerCostume entertainerType)
|
||||
{
|
||||
uint8_t value = static_cast<uint8_t>(entertainerType);
|
||||
PeepAnimationGroup newAnimationGroup = static_cast<PeepAnimationGroup>(
|
||||
value + EnumValue(PeepAnimationGroup::EntertainerPanda));
|
||||
return newAnimationGroup;
|
||||
}
|
||||
|
||||
colour_t StaffGetColour(StaffType staffType)
|
||||
{
|
||||
const auto& gameState = GetGameState();
|
||||
@@ -1011,42 +987,6 @@ GameActions::Result StaffSetColour(StaffType staffType, colour_t value)
|
||||
return GameActions::Result();
|
||||
}
|
||||
|
||||
uint32_t StaffGetAvailableEntertainerCostumes()
|
||||
{
|
||||
uint32_t entertainerCostumes = 0;
|
||||
for (int32_t i = 0; i < kMaxSceneryGroupObjects; i++)
|
||||
{
|
||||
if (SceneryGroupIsInvented(i))
|
||||
{
|
||||
const auto sgEntry = OpenRCT2::ObjectManager::GetObjectEntry<SceneryGroupEntry>(i);
|
||||
entertainerCostumes |= sgEntry->entertainer_costumes;
|
||||
}
|
||||
}
|
||||
|
||||
// For some reason the flags are +4 from the actual costume IDs
|
||||
entertainerCostumes >>= 4;
|
||||
|
||||
// Fix #6593: force enable the default costumes, which normally get enabled through the default scenery groups.
|
||||
entertainerCostumes |= (1 << static_cast<uint8_t>(EntertainerCostume::Panda))
|
||||
| (1 << static_cast<uint8_t>(EntertainerCostume::Tiger)) | (1 << static_cast<uint8_t>(EntertainerCostume::Elephant));
|
||||
|
||||
return entertainerCostumes;
|
||||
}
|
||||
|
||||
int32_t StaffGetAvailableEntertainerCostumeList(EntertainerCostume* costumeList)
|
||||
{
|
||||
uint32_t availableCostumes = StaffGetAvailableEntertainerCostumes();
|
||||
int32_t numCostumes = 0;
|
||||
for (uint8_t i = 0; i < static_cast<uint8_t>(EntertainerCostume::Count); i++)
|
||||
{
|
||||
if (availableCostumes & (1 << i))
|
||||
{
|
||||
costumeList[numCostumes++] = static_cast<EntertainerCostume>(i);
|
||||
}
|
||||
}
|
||||
return numCostumes;
|
||||
}
|
||||
|
||||
/** rct2: 0x009929C8 */
|
||||
static constexpr CoordsXY _MowingWaypoints[] = {
|
||||
{ 28, 28 }, { 28, 4 }, { 20, 4 }, { 20, 28 }, { 12, 28 }, { 12, 4 }, { 4, 4 }, { 4, 28 },
|
||||
|
||||
@@ -155,12 +155,8 @@ enum class EntertainerCostume : uint8_t
|
||||
Count
|
||||
};
|
||||
|
||||
extern const StringId StaffCostumeNames[EnumValue(EntertainerCostume::Count)];
|
||||
|
||||
colour_t StaffGetColour(StaffType staffType);
|
||||
OpenRCT2::GameActions::Result StaffSetColour(StaffType staffType, colour_t value);
|
||||
uint32_t StaffGetAvailableEntertainerCostumes();
|
||||
int32_t StaffGetAvailableEntertainerCostumeList(EntertainerCostume* costumeList);
|
||||
|
||||
money64 GetStaffWage(StaffType type);
|
||||
PeepAnimationGroup EntertainerCostumeToSprite(EntertainerCostume entertainerType);
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
#include "../object/ObjectList.h"
|
||||
#include "../object/ObjectManager.h"
|
||||
#include "../object/ObjectRepository.h"
|
||||
#include "../object/PeepAnimationsObject.h"
|
||||
#include "../platform/Platform.h"
|
||||
#include "../profiling/Profiling.h"
|
||||
#include "../ride/Ride.h"
|
||||
@@ -476,14 +477,15 @@ static void ConsoleCommandStaff(InteractiveConsole& console, const arguments_t&
|
||||
{
|
||||
console.WriteFormatLine("staff set energy <staff id> <value 0-255>");
|
||||
console.WriteFormatLine("staff set costume <staff id> <costume id>");
|
||||
for (int32_t i = 0; i < static_cast<uint8_t>(EntertainerCostume::Count); i++)
|
||||
|
||||
auto _availableCostumeIndexes = findAllPeepAnimationsIndexesForType(AnimationPeepType::Entertainer);
|
||||
auto _availableCostumeObjects = findAllPeepAnimationsObjectForType(AnimationPeepType::Entertainer);
|
||||
|
||||
for (auto i = 0u; i < _availableCostumeIndexes.size(); i++)
|
||||
{
|
||||
char costume_name[128] = { 0 };
|
||||
StringId costume = StaffCostumeNames[i];
|
||||
OpenRCT2::FormatStringLegacy(costume_name, 128, STR_STRINGID, &costume);
|
||||
// That's a terrible hack here. Costume names include inline sprites
|
||||
// that don't work well with the console, so manually skip past them.
|
||||
console.WriteFormatLine(" costume %i: %s", i, costume_name + 7);
|
||||
auto index = _availableCostumeIndexes[i];
|
||||
auto name = _availableCostumeObjects[i]->GetCostumeName();
|
||||
console.WriteFormatLine(" costume %i: %s", index, name.c_str());
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -526,13 +528,14 @@ static void ConsoleCommandStaff(InteractiveConsole& console, const arguments_t&
|
||||
console.WriteLineError("Specified staff is not entertainer");
|
||||
return;
|
||||
}
|
||||
if (!int_valid[1] || int_val[1] < 0 || int_val[1] >= static_cast<uint8_t>(EntertainerCostume::Count))
|
||||
auto& objManager = GetContext()->GetObjectManager();
|
||||
if (!int_valid[1] || int_val[1] < 0 || objManager.GetLoadedObject<PeepAnimationsObject>(int_val[1]) == nullptr)
|
||||
{
|
||||
console.WriteLineError("Invalid costume ID");
|
||||
return;
|
||||
}
|
||||
|
||||
EntertainerCostume costume = static_cast<EntertainerCostume>(int_val[1]);
|
||||
auto costume = static_cast<ObjectEntryIndex>(int_val[1]);
|
||||
auto staffSetCostumeAction = StaffSetCostumeAction(EntityId::FromUnderlying(int_val[0]), costume);
|
||||
GameActions::Execute(&staffSetCostumeAction);
|
||||
}
|
||||
|
||||
@@ -602,17 +602,17 @@ enum : StringId
|
||||
// STR_OPTIONS_RIDE_MUSIC_OFF = 1775,
|
||||
// STR_OPTIONS_RIDE_MUSIC_ON = 1776,
|
||||
STR_SCROLLING_SIGN_TEXT = 1778,
|
||||
STR_STAFF_OPTION_COSTUME_PANDA = 1779,
|
||||
STR_STAFF_OPTION_COSTUME_TIGER = 1780,
|
||||
STR_STAFF_OPTION_COSTUME_ELEPHANT = 1781,
|
||||
STR_STAFF_OPTION_COSTUME_ROMAN = 1782,
|
||||
STR_STAFF_OPTION_COSTUME_GORILLA = 1783,
|
||||
STR_STAFF_OPTION_COSTUME_SNOWMAN = 1784,
|
||||
STR_STAFF_OPTION_COSTUME_KNIGHT = 1785,
|
||||
STR_STAFF_OPTION_COSTUME_ASTRONAUT = 1786,
|
||||
STR_STAFF_OPTION_COSTUME_BANDIT = 1787,
|
||||
STR_STAFF_OPTION_COSTUME_SHERIFF = 1788,
|
||||
STR_STAFF_OPTION_COSTUME_PIRATE = 1789,
|
||||
// STR_STAFF_OPTION_COSTUME_PANDA = 1779,
|
||||
// STR_STAFF_OPTION_COSTUME_TIGER = 1780,
|
||||
// STR_STAFF_OPTION_COSTUME_ELEPHANT = 1781,
|
||||
// STR_STAFF_OPTION_COSTUME_ROMAN = 1782,
|
||||
// STR_STAFF_OPTION_COSTUME_GORILLA = 1783,
|
||||
// STR_STAFF_OPTION_COSTUME_SNOWMAN = 1784,
|
||||
// STR_STAFF_OPTION_COSTUME_KNIGHT = 1785,
|
||||
// STR_STAFF_OPTION_COSTUME_ASTRONAUT = 1786,
|
||||
// STR_STAFF_OPTION_COSTUME_BANDIT = 1787,
|
||||
// STR_STAFF_OPTION_COSTUME_SHERIFF = 1788,
|
||||
// STR_STAFF_OPTION_COSTUME_PIRATE = 1789,
|
||||
STR_RESPONDING_TO_RIDE_BREAKDOWN_CALL = 1792,
|
||||
STR_HEADING_TO_RIDE_FOR_INSPECTION = 1793,
|
||||
STR_FIXING_RIDE = 1794,
|
||||
|
||||
@@ -60,6 +60,9 @@ void PeepAnimationsObject::ReadJson(IReadObjectContext* context, json_t& root)
|
||||
Guard::Assert(root["peepType"].is_string(), "PeepAnimationsObject::ReadJson expects peepType to be a string");
|
||||
_peepType = animationPeepTypeMap[Json::GetString(root["peepType"])];
|
||||
|
||||
Guard::Assert(root["isSlowWalking"].is_boolean(), "PeepAnimationsObject::ReadJson expects isSlowWalking to be a boolean");
|
||||
_slowWalking = Json::GetBoolean(root["isSlowWalking"]);
|
||||
|
||||
auto& requiredAnimationMap = getAnimationsByPeepType(_peepType);
|
||||
_animationGroups.clear();
|
||||
|
||||
@@ -105,6 +108,11 @@ void PeepAnimationsObject::ReadJson(IReadObjectContext* context, json_t& root)
|
||||
}
|
||||
}
|
||||
|
||||
std::string PeepAnimationsObject::GetCostumeName() const
|
||||
{
|
||||
return GetStringTable().GetString(ObjectStringID::NAME);
|
||||
}
|
||||
|
||||
ImageIndex PeepAnimationsObject::GetInlineImageId() const
|
||||
{
|
||||
return _imageOffsetId;
|
||||
|
||||
@@ -20,6 +20,7 @@ class PeepAnimationsObject final : public Object
|
||||
private:
|
||||
ImageIndex _imageOffsetId;
|
||||
OpenRCT2::AnimationPeepType _peepType;
|
||||
bool _slowWalking;
|
||||
std::vector<OpenRCT2::PeepAnimations> _animationGroups;
|
||||
|
||||
public:
|
||||
@@ -29,7 +30,9 @@ public:
|
||||
void Load() override;
|
||||
void Unload() override;
|
||||
|
||||
std::string GetCostumeName() const;
|
||||
ImageIndex GetInlineImageId() const;
|
||||
|
||||
const OpenRCT2::PeepAnimation& GetPeepAnimation(
|
||||
PeepAnimationGroup animGroup, PeepAnimationType animType = PeepAnimationType::Walking) const;
|
||||
const OpenRCT2::SpriteBounds& GetSpriteBounds(
|
||||
@@ -39,5 +42,10 @@ public:
|
||||
size_t GetNumAnimationGroups() const;
|
||||
PeepAnimationGroup GetLegacyPosition(PeepAnimationGroup animGroup) const;
|
||||
|
||||
bool IsSlowWalking()
|
||||
{
|
||||
return _slowWalking;
|
||||
};
|
||||
|
||||
void DrawPreview(DrawPixelInfo& dpi, int32_t width, int32_t height) const override;
|
||||
};
|
||||
|
||||
@@ -154,7 +154,7 @@ void SceneryGroupObject::ReadJson(IReadObjectContext* context, json_t& root)
|
||||
if (properties.is_object())
|
||||
{
|
||||
_legacyType.priority = Json::GetNumber<uint8_t>(properties["priority"], 40);
|
||||
_legacyType.entertainer_costumes = ReadJsonEntertainerCostumes(properties["entertainerCostumes"]);
|
||||
_legacyType.entertainer_costumes = 0;
|
||||
|
||||
_items = ReadJsonEntries(context, properties["entries"]);
|
||||
}
|
||||
@@ -162,45 +162,6 @@ void SceneryGroupObject::ReadJson(IReadObjectContext* context, json_t& root)
|
||||
PopulateTablesFromJson(context, root);
|
||||
}
|
||||
|
||||
uint32_t SceneryGroupObject::ReadJsonEntertainerCostumes(json_t& jCostumes)
|
||||
{
|
||||
uint32_t costumes = 0;
|
||||
for (auto& jCostume : jCostumes)
|
||||
{
|
||||
auto entertainer = ParseEntertainerCostume(Json::GetString(jCostume));
|
||||
auto peepSprite = EntertainerCostumeToSprite(entertainer);
|
||||
costumes |= 1 << (static_cast<uint8_t>(peepSprite));
|
||||
}
|
||||
return costumes;
|
||||
}
|
||||
|
||||
EntertainerCostume SceneryGroupObject::ParseEntertainerCostume(const std::string& s)
|
||||
{
|
||||
if (s == "panda")
|
||||
return EntertainerCostume::Panda;
|
||||
if (s == "tiger")
|
||||
return EntertainerCostume::Tiger;
|
||||
if (s == "elephant")
|
||||
return EntertainerCostume::Elephant;
|
||||
if (s == "roman")
|
||||
return EntertainerCostume::Roman;
|
||||
if (s == "gorilla")
|
||||
return EntertainerCostume::Gorilla;
|
||||
if (s == "snowman")
|
||||
return EntertainerCostume::Snowman;
|
||||
if (s == "knight")
|
||||
return EntertainerCostume::Knight;
|
||||
if (s == "astronaut")
|
||||
return EntertainerCostume::Astronaut;
|
||||
if (s == "bandit")
|
||||
return EntertainerCostume::Bandit;
|
||||
if (s == "sheriff")
|
||||
return EntertainerCostume::Sheriff;
|
||||
if (s == "pirate")
|
||||
return EntertainerCostume::Pirate;
|
||||
return EntertainerCostume::Panda;
|
||||
}
|
||||
|
||||
std::vector<ObjectEntryDescriptor> SceneryGroupObject::ReadJsonEntries(IReadObjectContext* context, json_t& jEntries)
|
||||
{
|
||||
std::vector<ObjectEntryDescriptor> entries;
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
struct ObjectRepositoryItem;
|
||||
|
||||
enum class EntertainerCostume : uint8_t;
|
||||
|
||||
class SceneryGroupObject final : public Object
|
||||
{
|
||||
private:
|
||||
@@ -47,7 +45,5 @@ public:
|
||||
|
||||
private:
|
||||
static std::vector<ObjectEntryDescriptor> ReadItems(OpenRCT2::IStream* stream);
|
||||
static uint32_t ReadJsonEntertainerCostumes(json_t& jCostumes);
|
||||
static EntertainerCostume ParseEntertainerCostume(const std::string& s);
|
||||
static std::vector<ObjectEntryDescriptor> ReadJsonEntries(IReadObjectContext* context, json_t& jEntries);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user