src/ai/api/ai_sign.cpp
author rubidium
Thu, 03 Apr 2008 23:01:54 +0000
branchnoai
changeset 9865 f241472f09dc
parent 9837 c9ec4f82e0d0
child 10090 d6a6cac2fb25
permissions -rw-r--r--
(svn r12555) [NoAI] -Add: support for GetLastError for AICompany.
/* $Id$ */

/** @file ai_sign.cpp Implementation of AISign. */

#include "ai_sign.hpp"
#include "table/strings.h"
#include "../../command_func.h"
#include "../../core/alloc_func.hpp"
#include "../../signs_base.h"
#include "../../strings_func.h"
#include "../../tile_map.h"

/* static */ SignID AISign::GetMaxSignID()
{
	return ::GetMaxSignIndex();
}

/* static */ int32 AISign::GetSignCount()
{
	return ::GetNumSigns();
}

/* static */ bool AISign::IsValidSign(SignID sign_id)
{
	return ::IsValidSignID(sign_id);
}

/* static */ char *AISign::GetText(SignID sign_id)
{
	if (!IsValidSign(sign_id)) return NULL;
	static const int len = 64;
	char *sign_name = MallocT<char>(len);

	::SetDParam(0, sign_id);
	::GetString(sign_name, STR_SIGN_NAME, &sign_name[len - 1]);

	return sign_name;
}

/* static */ TileIndex AISign::GetLocation(SignID sign_id)
{
	if (!IsValidSign(sign_id)) return INVALID_TILE;
	const Sign *sign = ::GetSign(sign_id);
	return ::TileVirtXY(sign->x, sign->y);
}

/* static */ bool AISign::RemoveSign(SignID sign_id)
{
	_cmd_text = "";
	return AIObject::DoCommand(0, sign_id, 0, CMD_RENAME_SIGN);
}

/* static */ SignID AISign::BuildSign(TileIndex location, const char *text)
{
	if (!::IsValidTile(location)) return INVALID_SIGN;

	/* Reset the internal NewSignID in case we are in TestMode */
	AIObject::SetNewSignID(0);

	bool ret = AIObject::DoCommand(location, 0, 0, CMD_PLACE_SIGN);
	if (!ret) return INVALID_SIGN;

	SignID new_sign_id = AIObject::GetNewSignID();
	_cmd_text = text;
	ret = AIObject::DoCommand(0, new_sign_id, 0, CMD_RENAME_SIGN);
	if (!ret) {
		RemoveSign(new_sign_id);
		return INVALID_SIGN;
	}
	return new_sign_id;
}