Files @ r23482:de566f8c088d
Branch filter:

Location: cpp/openttd-patchpack/source/src/script/api/script_goal.cpp - annotation

Patric Stout
Remove: DOS support

In 10 years there was no active development on DOS. Although it
turned out to still work, the FPS was very bad. There is little
interest in the current community to look into this.

Further more, we like to switch to c++11 functions for threads,
which are not implemented by DJGPP, the only current compiler
for DOS.

Additionally, DOS is the only platform which does not support
networking. It is the reason we have tons of #ifdefs to support
disabling networking.

By removing DOS support, we can both use c++11 functions for threads,
and remove all the code related to disabling network. Sadly, this
means we have to see DOS go.

Of course, if you feel up for the task, simply revert this commit,
and implement stub c++11 functions for threads and stub functions
for networking. We are more than happy to accept such Pull Request.
r18772:80ffc4ed8122
r18772:80ffc4ed8122
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
r18772:80ffc4ed8122
r21383:942c32fb8b0e
r21383:942c32fb8b0e
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18778:4848b0595531
r18772:80ffc4ed8122
r18778:4848b0595531
r18778:4848b0595531
r18872:35e831d058c7
r18778:4848b0595531
r20025:983c2ed8d329
r20025:983c2ed8d329
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r20947:e99af07846a3
r20947:e99af07846a3
r20947:e99af07846a3
r20947:e99af07846a3
r20947:e99af07846a3
r20947:e99af07846a3
r20947:e99af07846a3
r20947:e99af07846a3
r20947:e99af07846a3
r18772:80ffc4ed8122
r20025:983c2ed8d329
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18872:35e831d058c7
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r18872:35e831d058c7
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r22831:2d7a323f310a
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r20025:983c2ed8d329
r20025:983c2ed8d329
r18872:35e831d058c7
r18962:69567f39810d
r20912:595943d1a598
r18872:35e831d058c7
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r22831:2d7a323f310a
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
r18872:35e831d058c7
/* $Id$ */

/*
 * 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 "../../safeguards.h"

/* static */ bool ScriptGoal::IsValidGoal(GoalID goal_id)
{
	return ::Goal::IsValidID(goal_id);
}

/* static */ ScriptGoal::GoalID ScriptGoal::New(ScriptCompany::CompanyID company, Text *goal, GoalType type, uint32 destination)
{
	CCountedPtr<Text> counter(goal);

	EnforcePrecondition(GOAL_INVALID, ScriptObject::GetCompany() == OWNER_DEITY);
	EnforcePrecondition(GOAL_INVALID, goal != NULL);
	const char *text = goal->GetEncodedText();
	EnforcePreconditionEncodedText(GOAL_INVALID, text);
	EnforcePrecondition(GOAL_INVALID, company == ScriptCompany::COMPANY_INVALID || ScriptCompany::ResolveCompanyID(company) != ScriptCompany::COMPANY_INVALID);

	uint8 c = company;
	if (company == ScriptCompany::COMPANY_INVALID) c = INVALID_COMPANY;
	StoryPage *story_page = NULL;
	if (type == GT_STORY_PAGE && ScriptStoryPage::IsValidStoryPage((ScriptStoryPage::StoryPageID)destination)) story_page = ::StoryPage::Get((ScriptStoryPage::StoryPageID)destination);

	EnforcePrecondition(GOAL_INVALID, (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 != NULL && (c == INVALID_COMPANY ? story_page->company == INVALID_COMPANY : story_page->company == INVALID_COMPANY || story_page->company == c)));

	if (!ScriptObject::DoCommand(0, type | (c << 8), destination, CMD_CREATE_GOAL, text, &ScriptInstance::DoCommandReturnGoalID)) return GOAL_INVALID;

	/* In case of test-mode, we return GoalID 0 */
	return (ScriptGoal::GoalID)0;
}

/* static */ bool ScriptGoal::Remove(GoalID goal_id)
{
	EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY);
	EnforcePrecondition(false, IsValidGoal(goal_id));

	return ScriptObject::DoCommand(0, goal_id, 0, CMD_REMOVE_GOAL);
}

/* static */ bool ScriptGoal::SetText(GoalID goal_id, Text *goal)
{
	CCountedPtr<Text> counter(goal);

	EnforcePrecondition(false, IsValidGoal(goal_id));
	EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY);
	EnforcePrecondition(false, goal != NULL);
	EnforcePrecondition(false, !StrEmpty(goal->GetEncodedText()));

	return ScriptObject::DoCommand(0, goal_id, 0, CMD_SET_GOAL_TEXT, goal->GetEncodedText());
}

/* static */ bool ScriptGoal::SetProgress(GoalID goal_id, Text *progress)
{
	CCountedPtr<Text> counter(progress);

	EnforcePrecondition(false, IsValidGoal(goal_id));
	EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY);

	/* Ensure null as used for emtpy string. */
	if (progress != NULL && StrEmpty(progress->GetEncodedText())) {
		progress = NULL;
	}

	return ScriptObject::DoCommand(0, goal_id, 0, CMD_SET_GOAL_PROGRESS, progress != NULL ? progress->GetEncodedText() : NULL);
}

/* static */ bool ScriptGoal::SetCompleted(GoalID goal_id, bool completed)
{
	EnforcePrecondition(false, IsValidGoal(goal_id));
	EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY);

	return ScriptObject::DoCommand(0, goal_id, completed ? 1 : 0, CMD_SET_GOAL_COMPLETED);
}

/* static */ bool ScriptGoal::IsCompleted(GoalID goal_id)
{
	EnforcePrecondition(false, IsValidGoal(goal_id));
	EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY);

	Goal *g = Goal::Get(goal_id);
	return g != NULL && g->completed;
}

/* static */ bool ScriptGoal::DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons)
{
	CCountedPtr<Text> counter(question);

	EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY);
	EnforcePrecondition(false, question != NULL);
	const char *text = question->GetEncodedText();
	EnforcePreconditionEncodedText(false, text);
	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 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)
{
	EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY);

	return ScriptObject::DoCommand(0, uniqueid, 0, CMD_GOAL_QUESTION_ANSWER);
}