summaryrefslogtreecommitdiff
path: root/src/script
diff options
context:
space:
mode:
authorPavel Stupnikov <dp@dpointer.org>2018-04-28 18:37:59 +0300
committerPatric Stout <truebrain@openttd.org>2018-04-28 17:37:59 +0200
commit913119487fa58bb4346af8d0024f95b6517f4d46 (patch)
treecf3d223aaaf54839a6b097a79619c11d3c5cc2cb /src/script
parent8e4bce58ea299527003cd2da5ef8dcb5f84b7f23 (diff)
downloadopenttd-913119487fa58bb4346af8d0024f95b6517f4d46.tar.xz
Feature: Add GS method to question a single client (#6748)
Diffstat (limited to 'src/script')
-rw-r--r--src/script/api/game/game_goal.hpp.sq19
-rw-r--r--src/script/api/game_changelog.hpp1
-rw-r--r--src/script/api/script_goal.cpp25
-rw-r--r--src/script/api/script_goal.hpp27
4 files changed, 59 insertions, 13 deletions
diff --git a/src/script/api/game/game_goal.hpp.sq b/src/script/api/game/game_goal.hpp.sq
index 7d8a3bf5e..4cf15b3fc 100644
--- a/src/script/api/game/game_goal.hpp.sq
+++ b/src/script/api/game/game_goal.hpp.sq
@@ -51,15 +51,16 @@ void SQGSGoal_Register(Squirrel *engine)
SQGSGoal.DefSQConst(engine, ScriptGoal::BUTTON_SURRENDER, "BUTTON_SURRENDER");
SQGSGoal.DefSQConst(engine, ScriptGoal::BUTTON_CLOSE, "BUTTON_CLOSE");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsValidGoal, "IsValidGoal", 2, ".i");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::New, "New", 5, ".i.ii");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Remove, "Remove", 2, ".i");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetText, "SetText", 3, ".i.");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetProgress, "SetProgress", 3, ".i.");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetCompleted, "SetCompleted", 3, ".ib");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsCompleted, "IsCompleted", 2, ".i");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Question, "Question", 6, ".ii.ii");
- SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::CloseQuestion, "CloseQuestion", 2, ".i");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsValidGoal, "IsValidGoal", 2, ".i");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::New, "New", 5, ".i.ii");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Remove, "Remove", 2, ".i");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetText, "SetText", 3, ".i.");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetProgress, "SetProgress", 3, ".i.");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::SetCompleted, "SetCompleted", 3, ".ib");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::IsCompleted, "IsCompleted", 2, ".i");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::Question, "Question", 6, ".ii.ii");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::QuestionClient, "QuestionClient", 6, ".ii.ii");
+ SQGSGoal.DefSQStaticMethod(engine, &ScriptGoal::CloseQuestion, "CloseQuestion", 2, ".i");
SQGSGoal.PostRegister(engine);
}
diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp
index 5f278e4f0..390c1f31f 100644
--- a/src/script/api/game_changelog.hpp
+++ b/src/script/api/game_changelog.hpp
@@ -25,6 +25,7 @@
* \li GSViewport::ScrollEveryoneTo
* \li GSViewport::ScrollCompanyClientsTo
* \li GSViewport::ScrollClientTo
+ * \li GSGoal::QuestionClient
*
* \b 1.8.0
*
diff --git a/src/script/api/script_goal.cpp b/src/script/api/script_goal.cpp
index 5153e0ef0..c183b7583 100644
--- a/src/script/api/script_goal.cpp
+++ b/src/script/api/script_goal.cpp
@@ -10,6 +10,7 @@
/** @file script_goal.cpp Implementation of ScriptGoal. */
#include "../../stdafx.h"
+#include "script_game.hpp"
#include "script_goal.hpp"
#include "script_error.hpp"
#include "script_industry.hpp"
@@ -19,6 +20,7 @@
#include "../script_instance.hpp"
#include "../../goal_base.h"
#include "../../string_func.h"
+#include "../../network/network_base.h"
#include "../../safeguards.h"
@@ -107,7 +109,7 @@
return g != NULL && g->completed;
}
-/* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons)
+/* static */ bool ScriptGoal::DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons)
{
CCountedPtr<Text> counter(question);
@@ -115,15 +117,32 @@
EnforcePrecondition(false, question != NULL);
const char *text = question->GetEncodedText();
EnforcePreconditionEncodedText(false, text);
- EnforcePrecondition(false, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID);
EnforcePrecondition(false, CountBits(buttons) >= 1 && CountBits(buttons) <= 3);
EnforcePrecondition(false, buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT));
EnforcePrecondition(false, (int)type < ::GOAL_QUESTION_TYPE_COUNT);
+ return ScriptObject::DoCommand(0, uniqueid | (target << 16) | (type << 24) | (is_client ? (1 << 31) : 0), buttons, CMD_GOAL_QUESTION, text);
+}
+
+/* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons)
+{
+ EnforcePrecondition(false, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID);
uint8 c = company;
if (company == ScriptCompany::COMPANY_INVALID) c = INVALID_COMPANY;
- return ScriptObject::DoCommand(0, uniqueid | (c << 16) | (type << 24), buttons, CMD_GOAL_QUESTION, text);
+ return DoQuestion(uniqueid, c, false, question, type, buttons);
+}
+
+/* static */ bool ScriptGoal::QuestionClient(uint16 uniqueid, ScriptClient::ClientID client, Text *question, QuestionType type, int buttons)
+{
+ EnforcePrecondition(false, ScriptGame::IsMultiplayer());
+ EnforcePrecondition(false, ScriptClient::ResolveClientID(client) != ScriptClient::CLIENT_INVALID);
+#ifdef ENABLE_NETWORK
+ ClientIndex c = NetworkClientInfo::GetByClientID((::ClientID)client)->index;
+ return DoQuestion(uniqueid, c, true, question, type, buttons);
+#else
+ return false;
+#endif
}
/* static */ bool ScriptGoal::CloseQuestion(uint16 uniqueid)
diff --git a/src/script/api/script_goal.hpp b/src/script/api/script_goal.hpp
index a9c7b239d..f5dfba095 100644
--- a/src/script/api/script_goal.hpp
+++ b/src/script/api/script_goal.hpp
@@ -12,6 +12,7 @@
#ifndef SCRIPT_GOAL_HPP
#define SCRIPT_GOAL_HPP
+#include "script_client.hpp"
#include "script_company.hpp"
#include "../../goal_type.h"
@@ -160,7 +161,7 @@ public:
static bool IsCompleted(GoalID goal_id);
/**
- * Ask a question.
+ * Ask a question of all players in a company.
* @param uniqueid Your unique id to distinguish results of multiple questions in the returning event.
* @param company The company to ask the question, or ScriptCompany::COMPANY_INVALID for all.
* @param question The question to ask (can be either a raw string, or a ScriptText object).
@@ -177,6 +178,24 @@ public:
static bool Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons);
/**
+ * Ask client a question.
+ * @param uniqueid Your unique id to distinguish results of multiple questions in the returning event.
+ * @param client The client to ask the question.
+ * @param question The question to ask (can be either a raw string, or a ScriptText object).
+ * @param type The type of question that is being asked.
+ * @param buttons Any combinations (at least 1, up to 3) of buttons defined in QuestionButton. Like BUTTON_YES + BUTTON_NO.
+ * @return True if the action succeeded.
+ * @pre No ScriptCompanyMode may be in scope.
+ * @pre ScriptGame::IsMultiplayer()
+ * @pre question != NULL && len(question) != 0.
+ * @pre ResolveClientID(client) != CLIENT_INVALID.
+ * @pre CountBits(buttons) >= 1 && CountBits(buttons) <= 3.
+ * @note Replies to the question are given by you via the event ScriptEvent_GoalQuestionAnswer.
+ * @note There is no guarantee you ever get a reply on your question.
+ */
+ static bool QuestionClient(uint16 uniqueid, ScriptClient::ClientID client, Text *question, QuestionType type, int buttons);
+
+ /**
* Close the question on all clients.
* @param uniqueid The uniqueid of the question you want to close.
* @return True if the action succeeded.
@@ -187,6 +206,12 @@ public:
* companies, but you are only interested in the reply of the first.
*/
static bool CloseQuestion(uint16 uniqueid);
+
+protected:
+ /**
+ * Does common checks and asks the question.
+ */
+ static bool DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons);
};
#endif /* SCRIPT_GOAL_HPP */