Files
@ r28475:11127afc698f
Branch filter:
Location: cpp/openttd-patchpack/source/src/script/api/script_goal.cpp - annotation
r28475:11127afc698f
6.6 KiB
text/x-c
Fix #11785, cf16f45: when bumping aircraft into the air, remove them from the loading vehicle list again
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r22831:2d7a323f310a r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r20947:e99af07846a3 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r22831:2d7a323f310a r26105:23588534dec9 r18772:80ffc4ed8122 r21383:942c32fb8b0e r21383:942c32fb8b0e r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r26971:659b0a3fbb51 r18772:80ffc4ed8122 r18778:4848b0595531 r18778:4848b0595531 r26996:7064173a70ca r23607:36c15679007d r27687:9834f91f0c39 r20025:983c2ed8d329 r18772:80ffc4ed8122 r27553:ad2bff42f7f5 r20947:e99af07846a3 r27553:ad2bff42f7f5 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r18772:80ffc4ed8122 r26996:7064173a70ca r18772:80ffc4ed8122 r18772:80ffc4ed8122 r26117:dec8ad7628ec r18772:80ffc4ed8122 r18872:35e831d058c7 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r27553:ad2bff42f7f5 r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r26996:7064173a70ca r23607:36c15679007d r27687:9834f91f0c39 r26891:5a795b8188a7 r20289:1f623493c20d r26891:5a795b8188a7 r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r26996:7064173a70ca r20289:1f623493c20d r26891:5a795b8188a7 r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r26996:7064173a70ca r20289:1f623493c20d r26117:dec8ad7628ec r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r20289:1f623493c20d r26996:7064173a70ca r20289:1f623493c20d r20289:1f623493c20d r23607:36c15679007d r20289:1f623493c20d r20289:1f623493c20d r27737:728d55b97775 r18872:35e831d058c7 r18872:35e831d058c7 r18872:35e831d058c7 r26996:7064173a70ca r23607:36c15679007d r27687:9834f91f0c39 r20025:983c2ed8d329 r24808:e7cb02d1ad0d r24808:e7cb02d1ad0d r26971:659b0a3fbb51 r24808:e7cb02d1ad0d r26971:659b0a3fbb51 r18872:35e831d058c7 r26117:dec8ad7628ec r22831:2d7a323f310a r22831:2d7a323f310a r26971:659b0a3fbb51 r22831:2d7a323f310a r22831:2d7a323f310a r27737:728d55b97775 r18872:35e831d058c7 r18872:35e831d058c7 r22831:2d7a323f310a r22831:2d7a323f310a r22831:2d7a323f310a r26971:659b0a3fbb51 r22831:2d7a323f310a r22831:2d7a323f310a r22831:2d7a323f310a r23780:2fc4e08e27f6 r18872:35e831d058c7 r18872:35e831d058c7 r26971:659b0a3fbb51 r18872:35e831d058c7 r26996:7064173a70ca r26971:659b0a3fbb51 r18872:35e831d058c7 r26117:dec8ad7628ec r18872:35e831d058c7 | /*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @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"
#include "script_map.hpp"
#include "script_town.hpp"
#include "script_story_page.hpp"
#include "../script_instance.hpp"
#include "../../goal_base.h"
#include "../../string_func.h"
#include "../../network/network_base.h"
#include "../../goal_cmd.h"
#include "../../safeguards.h"
/* static */ bool ScriptGoal::IsValidGoal(GoalID goal_id)
{
return ::Goal::IsValidID(goal_id);
}
/* static */ bool ScriptGoal::IsValidGoalDestination(ScriptCompany::CompanyID company, GoalType type, SQInteger destination)
{
CompanyID c = (::CompanyID)company;
if (company == ScriptCompany::COMPANY_INVALID) c = INVALID_COMPANY;
StoryPage *story_page = nullptr;
if (type == GT_STORY_PAGE && ScriptStoryPage::IsValidStoryPage((ScriptStoryPage::StoryPageID)destination)) story_page = ::StoryPage::Get((ScriptStoryPage::StoryPageID)destination);
return (type == GT_NONE && destination == 0) ||
(type == GT_TILE && ScriptMap::IsValidTile(destination)) ||
(type == GT_INDUSTRY && ScriptIndustry::IsValidIndustry(destination)) ||
(type == GT_TOWN && ScriptTown::IsValidTown(destination)) ||
(type == GT_COMPANY && ScriptCompany::ResolveCompanyID((ScriptCompany::CompanyID)destination) != ScriptCompany::COMPANY_INVALID) ||
(type == GT_STORY_PAGE && story_page != nullptr && (c == INVALID_COMPANY ? story_page->company == INVALID_COMPANY : story_page->company == INVALID_COMPANY || story_page->company == c));
}
/* static */ ScriptGoal::GoalID ScriptGoal::New(ScriptCompany::CompanyID company, Text *goal, GoalType type, SQInteger destination)
{
CCountedPtr<Text> counter(goal);
EnforceDeityMode(GOAL_INVALID);
EnforcePrecondition(GOAL_INVALID, goal != nullptr);
std::string text = goal->GetEncodedText();
EnforcePreconditionEncodedText(GOAL_INVALID, text);
EnforcePrecondition(GOAL_INVALID, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID);
EnforcePrecondition(GOAL_INVALID, IsValidGoalDestination(company, type, destination));
if (!ScriptObject::Command<CMD_CREATE_GOAL>::Do(&ScriptInstance::DoCommandReturnGoalID, (::CompanyID)company, (::GoalType)type, destination, text)) return GOAL_INVALID;
/* In case of test-mode, we return GoalID 0 */
return (ScriptGoal::GoalID)0;
}
/* static */ bool ScriptGoal::Remove(GoalID goal_id)
{
EnforceDeityMode(false);
EnforcePrecondition(false, IsValidGoal(goal_id));
return ScriptObject::Command<CMD_REMOVE_GOAL>::Do(goal_id);
}
/* static */ bool ScriptGoal::SetDestination(GoalID goal_id, GoalType type, SQInteger destination)
{
EnforceDeityMode(false);
EnforcePrecondition(false, IsValidGoal(goal_id));
Goal *g = Goal::Get(goal_id);
EnforcePrecondition(false, IsValidGoalDestination((ScriptCompany::CompanyID)g->company, type, destination));
return ScriptObject::Command<CMD_SET_GOAL_DESTINATION>::Do(goal_id, (::GoalType)type, destination);
}
/* static */ bool ScriptGoal::SetText(GoalID goal_id, Text *goal)
{
CCountedPtr<Text> counter(goal);
EnforcePrecondition(false, IsValidGoal(goal_id));
EnforceDeityMode(false);
EnforcePrecondition(false, goal != nullptr);
std::string text = goal->GetEncodedText();
EnforcePreconditionEncodedText(false, text);
return ScriptObject::Command<CMD_SET_GOAL_TEXT>::Do(goal_id, text);
}
/* static */ bool ScriptGoal::SetProgress(GoalID goal_id, Text *progress)
{
CCountedPtr<Text> counter(progress);
EnforcePrecondition(false, IsValidGoal(goal_id));
EnforceDeityMode(false);
return ScriptObject::Command<CMD_SET_GOAL_PROGRESS>::Do(goal_id, progress != nullptr ? progress->GetEncodedText() : std::string{});
}
/* static */ bool ScriptGoal::SetCompleted(GoalID goal_id, bool completed)
{
EnforcePrecondition(false, IsValidGoal(goal_id));
EnforceDeityMode(false);
return ScriptObject::Command<CMD_SET_GOAL_COMPLETED>::Do(goal_id, completed);
}
/* static */ bool ScriptGoal::IsCompleted(GoalID goal_id)
{
EnforcePrecondition(false, IsValidGoal(goal_id));
EnforceDeityMode(false);
Goal *g = Goal::Get(goal_id);
return g != nullptr && g->completed;
}
/* static */ bool ScriptGoal::DoQuestion(SQInteger uniqueid, uint32_t target, bool is_client, Text *question, QuestionType type, SQInteger buttons)
{
CCountedPtr<Text> counter(question);
EnforceDeityMode(false);
EnforcePrecondition(false, question != nullptr);
std::string text = question->GetEncodedText();
EnforcePreconditionEncodedText(false, text);
uint min_buttons = (type == QT_QUESTION ? 1 : 0);
EnforcePrecondition(false, CountBits(buttons) >= min_buttons && CountBits(buttons) <= 3);
EnforcePrecondition(false, buttons >= 0 && buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT));
EnforcePrecondition(false, (int)type < ::GQT_END);
EnforcePrecondition(false, uniqueid >= 0 && uniqueid <= UINT16_MAX);
return ScriptObject::Command<CMD_GOAL_QUESTION>::Do(uniqueid, target, is_client, buttons, (::GoalQuestionType)type, text);
}
/* static */ bool ScriptGoal::Question(SQInteger uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, SQInteger buttons)
{
EnforcePrecondition(false, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID);
uint8_t c = company;
if (company == ScriptCompany::COMPANY_INVALID) c = INVALID_COMPANY;
return DoQuestion(uniqueid, c, false, question, type, buttons);
}
/* static */ bool ScriptGoal::QuestionClient(SQInteger uniqueid, ScriptClient::ClientID client, Text *question, QuestionType type, SQInteger buttons)
{
EnforcePrecondition(false, ScriptGame::IsMultiplayer());
EnforcePrecondition(false, ScriptClient::ResolveClientID(client) != ScriptClient::CLIENT_INVALID);
return DoQuestion(uniqueid, client, true, question, type, buttons);
}
/* static */ bool ScriptGoal::CloseQuestion(SQInteger uniqueid)
{
EnforceDeityMode(false);
EnforcePrecondition(false, uniqueid >= 0 && uniqueid <= UINT16_MAX);
return ScriptObject::Command<CMD_GOAL_QUESTION_ANSWER>::Do(uniqueid, 0);
}
|