1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 12:33:17 +01:00

Add litter entity to scripting

This commit is contained in:
ZehMatt
2021-08-07 22:28:48 +03:00
parent 94daa1e42c
commit 29e5ec634c
3 changed files with 97 additions and 1 deletions

View File

@@ -1470,6 +1470,34 @@ declare global {
type StaffType = "handyman" | "mechanic" | "security" | "entertainer";
/**
* Represents litter entity.
*/
interface Litter extends Entity {
/**
* The type of the litter.
*/
litterType: LitterType;
/**
* The tick number this entity was created.
*/
creationTime: number;
}
type LitterType = "vomit" |
"vomit_alt" |
"empty_can" |
"rubbish" |
"burger_box" |
"empty_cup" |
"empty_box" |
"empty_bottle" |
"empty_bowl_red" |
"empty_drink_carton" |
"empty_juice_cup" |
"empty_bowl_blue";
/**
* Network APIs
* Use `network.status` to determine whether the current game is a client, server or in single player mode.

View File

@@ -17,6 +17,7 @@
# include "../peep/Staff.h"
# include "../util/Util.h"
# include "../world/EntityList.h"
# include "../world/Litter.h"
# include "../world/Sprite.h"
# include "Duktape.hpp"
# include "ScRide.hpp"
@@ -1244,6 +1245,71 @@ namespace OpenRCT2::Scripting
}
};
static const DukEnumMap<Litter::Type> LitterTypeMap({
{ "vomit", Litter::Type::Vomit },
{ "vomit_alt", Litter::Type::VomitAlt },
{ "empty_can", Litter::Type::EmptyCan },
{ "rubbish", Litter::Type::Rubbish },
{ "burger_box", Litter::Type::BurgerBox },
{ "empty_cup", Litter::Type::EmptyCup },
{ "empty_box", Litter::Type::EmptyBox },
{ "empty_bottle", Litter::Type::EmptyBottle },
{ "empty_bowl_red", Litter::Type::EmptyBowlRed },
{ "empty_drink_carton", Litter::Type::EmptyDrinkCarton },
{ "empty_juice_cup", Litter::Type::EmptyJuiceCup },
{ "empty_bowl_blue", Litter::Type::EmptyBowlBlue },
});
class ScLitter : public ScEntity
{
public:
ScLitter(uint16_t Id)
: ScEntity(Id)
{
}
static void Register(duk_context* ctx)
{
dukglue_set_base_class<ScEntity, ScLitter>(ctx);
dukglue_register_property(ctx, &ScLitter::litterType_get, &ScLitter::litterType_set, "litterType");
dukglue_register_property(ctx, &ScLitter::creationTick_get, nullptr, "creationTick");
}
private:
Litter* GetLitter() const
{
return ::GetEntity<Litter>(_id);
}
std::string litterType_get() const
{
auto* litter = GetLitter();
auto it = LitterTypeMap.find(litter->SubType);
if (it == LitterTypeMap.end())
return "";
return std::string{ it->first };
}
void litterType_set(const std::string& litterType)
{
ThrowIfGameStateNotMutable();
auto it = LitterTypeMap.find(litterType);
if (it == LitterTypeMap.end())
return;
auto* litter = GetLitter();
litter->SubType = it->second;
}
uint32_t creationTick_get() const
{
auto* litter = GetLitter();
if (litter == nullptr)
return 0;
return litter->creationTick;
}
};
} // namespace OpenRCT2::Scripting
#endif

View File

@@ -230,7 +230,7 @@ namespace OpenRCT2::Scripting
}
else if (type == "litter")
{
return createEntityType<Litter, ScEntity>(initializer);
return createEntityType<Litter, ScLitter>(initializer);
}
else
{
@@ -263,6 +263,8 @@ namespace OpenRCT2::Scripting
return GetObjectAsDukValue(_context, std::make_shared<ScStaff>(spriteId));
case EntityType::Guest:
return GetObjectAsDukValue(_context, std::make_shared<ScGuest>(spriteId));
case EntityType::Litter:
return GetObjectAsDukValue(_context, std::make_shared<ScLitter>(spriteId));
default:
return GetObjectAsDukValue(_context, std::make_shared<ScEntity>(spriteId));
}