1 /*****************************************************************************
2  * Copyright (c) 2014-2020 OpenRCT2 developers
3  *
4  * For a complete list of all authors, please refer to contributors.md
5  * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
6  *
7  * OpenRCT2 is licensed under the GNU General Public License version 3.
8  *****************************************************************************/
9 
10 #include "StaffSetNameAction.h"
11 
12 #include "../Cheats.h"
13 #include "../Context.h"
14 #include "../core/MemoryStream.h"
15 #include "../drawing/Drawing.h"
16 #include "../interface/Window.h"
17 #include "../localisation/Localisation.h"
18 #include "../localisation/StringIds.h"
19 #include "../peep/Staff.h"
20 #include "../windows/Intent.h"
21 #include "../world/Entity.h"
22 #include "../world/Park.h"
23 
StaffSetNameAction(uint16_t spriteIndex,const std::string & name)24 StaffSetNameAction::StaffSetNameAction(uint16_t spriteIndex, const std::string& name)
25     : _spriteIndex(spriteIndex)
26     , _name(name)
27 {
28 }
29 
GetActionFlags() const30 uint16_t StaffSetNameAction::GetActionFlags() const
31 {
32     return GameAction::GetActionFlags() | GameActions::Flags::AllowWhilePaused;
33 }
34 
Serialise(DataSerialiser & stream)35 void StaffSetNameAction::Serialise(DataSerialiser& stream)
36 {
37     GameAction::Serialise(stream);
38 
39     stream << DS_TAG(_spriteIndex) << DS_TAG(_name);
40 }
41 
Query() const42 GameActions::Result::Ptr StaffSetNameAction::Query() const
43 {
44     if (_spriteIndex >= MAX_ENTITIES)
45     {
46         return std::make_unique<GameActions::Result>(
47             GameActions::Status::InvalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_NONE);
48     }
49 
50     auto staff = TryGetEntity<Staff>(_spriteIndex);
51     if (staff == nullptr)
52     {
53         log_warning("Invalid game command for sprite %u", _spriteIndex);
54         return std::make_unique<GameActions::Result>(
55             GameActions::Status::InvalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_NONE);
56     }
57 
58     return std::make_unique<GameActions::Result>();
59 }
60 
Execute() const61 GameActions::Result::Ptr StaffSetNameAction::Execute() const
62 {
63     auto staff = TryGetEntity<Staff>(_spriteIndex);
64     if (staff == nullptr)
65     {
66         log_warning("Invalid game command for sprite %u", _spriteIndex);
67         return std::make_unique<GameActions::Result>(
68             GameActions::Status::InvalidParameters, STR_STAFF_ERROR_CANT_NAME_STAFF_MEMBER, STR_NONE);
69     }
70 
71     auto curName = staff->GetName();
72     if (curName == _name)
73     {
74         return std::make_unique<GameActions::Result>();
75     }
76 
77     if (!staff->SetName(_name))
78     {
79         return std::make_unique<GameActions::Result>(GameActions::Status::Unknown, STR_CANT_NAME_GUEST, STR_NONE);
80     }
81 
82     gfx_invalidate_screen();
83 
84     auto intent = Intent(INTENT_ACTION_REFRESH_STAFF_LIST);
85     context_broadcast_intent(&intent);
86 
87     auto res = std::make_unique<GameActions::Result>();
88     res->Position = staff->GetLocation();
89 
90     return res;
91 }
92