diff options
Diffstat (limited to 'src/goal.cpp')
-rw-r--r-- | src/goal.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/goal.cpp b/src/goal.cpp index 91ba6d288..5a3433573 100644 --- a/src/goal.cpp +++ b/src/goal.cpp @@ -26,6 +26,8 @@ #include "command_func.h" #include "company_base.h" #include "string_func.h" +#include "gui.h" +#include "network/network.h" #include "table/strings.h" @@ -118,3 +120,65 @@ CommandCost CmdRemoveGoal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 return CommandCost(); } + + +/** + * Ask a goal related question + * @param tile unused. + * @param flags type of operation + * @param p1 various bitstuffed elements + * - p1 = (bit 0 - 15) - Unique ID to use for this question. + * - p1 = (bit 16 - 23) - Company for which this question is. + * @param p2 Buttons of the question. + * @param text Text of the question. + * @return the cost of this operation or an error + */ +CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + uint16 uniqueid = (GoalType)GB(p1, 0, 16); + CompanyID company = (CompanyID)GB(p1, 16, 8); + + if (_current_company != OWNER_DEITY) return CMD_ERROR; + if (StrEmpty(text)) return CMD_ERROR; + if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR; + if (CountBits(p2) < 1 || CountBits(p2) > 3) return CMD_ERROR; + + if (flags & DC_EXEC) { + if (company == _local_company || (company == INVALID_COMPANY && Company::IsValidID(_local_company))) ShowGoalQuestion(uniqueid, p2, text); + } + + return CommandCost(); +} + +/** + * Reply to a goal question. + * @param tile unused. + * @param flags type of operation + * @param p1 Unique ID to use for this question. + * @param p2 Button the company pressed + * @param text Text of the question. + * @return the cost of this operation or an error + */ +CommandCost CmdGoalQuestionAnswer(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + if (p1 > UINT16_MAX) return CMD_ERROR; + if (p2 >= GOAL_QUESTION_BUTTON_COUNT) return CMD_ERROR; + + if (_current_company == OWNER_DEITY) { + /* It has been requested to close this specific question on all clients */ + if (flags & DC_EXEC) DeleteWindowById(WC_GOAL_QUESTION, p1); + return CommandCost(); + } + + if (_networking && _local_company == _current_company) { + /* Somebody in the same company answered the question. Close the window */ + if (flags & DC_EXEC) DeleteWindowById(WC_GOAL_QUESTION, p1); + if (!_network_server) return CommandCost(); + } + + if (flags & DC_EXEC) { + Game::NewEvent(new ScriptEventGoalQuestionAnswer(p1, (ScriptCompany::CompanyID)(byte)_current_company, (ScriptGoal::QuestionButton)(1 << p2))); + } + + return CommandCost(); +} |