src/ai/api/ai_company.cpp
author rubidium
Thu, 03 Apr 2008 23:01:54 +0000
branchnoai
changeset 9865 f241472f09dc
parent 9833 89a64246458f
child 9868 3998f2e73dda
permissions -rw-r--r--
(svn r12555) [NoAI] -Add: support for GetLastError for AICompany.
/* $Id$ */

/** @file ai_company.cpp Implementation of AICompany. */

#include "ai_company.hpp"
#include "ai_error.hpp"
#include "../../command_func.h"
#include "../../player_func.h"
#include "../../player_base.h"
#include "../../economy_func.h"
#include "../../strings_func.h"
#include "../../tile_map.h"
#include "../../variables.h"
#include "../../core/alloc_func.hpp"
#include "../../string_func.h"
#include "table/strings.h"

/* static */ AICompany::CompanyIndex AICompany::ResolveCompanyIndex(AICompany::CompanyIndex company)
{
	if (company == MY_COMPANY) return (CompanyIndex)((byte)_current_player);

	return (::IsValidPlayer((PlayerID)company) && ::GetPlayer((PlayerID)company)->is_active) ? company : INVALID_COMPANY;
}

/* static */ bool AICompany::SetCompanyName(const char *name)
{
	if (::StrEmpty(name)) {
		AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED);
		return false;
	}

	_cmd_text = name;
	return AIObject::DoCommand(0, 0, 0, CMD_CHANGE_COMPANY_NAME);
}

/* static */ char *AICompany::GetCompanyName(AICompany::CompanyIndex company)
{
	company = ResolveCompanyIndex(company);
	if (company == INVALID_COMPANY) return NULL;

	static const int len = 64;
	char *company_name = MallocT<char>(len);

	::SetDParam(0, GetPlayer((PlayerID)company)->index);
	::GetString(company_name, STR_COMPANY_NAME, &company_name[len - 1]);
	return company_name;
}

/* static */ bool AICompany::SetPresidentName(const char *name)
{
	if (::StrEmpty(name)) {
		AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED);
		return false;
	}

	_cmd_text = name;
	return AIObject::DoCommand(0, 0, 0, CMD_CHANGE_PRESIDENT_NAME);
}

/* static */ char *AICompany::GetPresidentName(AICompany::CompanyIndex company)
{
	company = ResolveCompanyIndex(company);

	static const int len = 64;
	char *president_name = MallocT<char>(len);
	if (company != INVALID_COMPANY) {
		::SetDParam(0, GetPlayer((PlayerID)company)->index);
		::GetString(president_name, STR_PLAYER_NAME, &president_name[len - 1]);
	} else {
		*president_name = '\0';
	}

	return president_name;
}

/* static */ int32 AICompany::GetCompanyValue(AICompany::CompanyIndex company)
{
	company = ResolveCompanyIndex(company);
	if (company == INVALID_COMPANY) return 0;

	return ::GetPlayer((PlayerID)company)->cur_economy.company_value;
}

/* static */ int32 AICompany::GetBankBalance(AICompany::CompanyIndex company)
{
	company = ResolveCompanyIndex(company);
	if (company == INVALID_COMPANY) return 0;

	return ::ClampToI32(GetPlayer((PlayerID)company)->player_money);
}

/* static */ int32 AICompany::GetLoanAmount()
{
	return ::GetPlayer(_current_player)->current_loan;
}

/* static */ int32 AICompany::GetMaxLoanAmount()
{
	return _economy.max_loan;
}

/* static */ int32 AICompany::GetLoanInterval()
{
	return LOAN_INTERVAL;
}

/* static */ bool AICompany::SetLoanAmount(int32 loan)
{
	if (loan < 0 ||
			(loan % GetLoanInterval()) != 0 ||
			loan > GetMaxLoanAmount() ||
			(loan - GetLoanAmount() + GetBankBalance(MY_COMPANY)) < 0) {
		AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED);
		return false;
	}

	if (loan == GetLoanAmount()) return true;

	return AIObject::DoCommand(0,
			abs(loan - GetLoanAmount()), 2,
			(loan > GetLoanAmount()) ? CMD_INCREASE_LOAN : CMD_DECREASE_LOAN);
}

/* static */ bool AICompany::SetMinimumLoanAmount(int32 loan)
{
	if (loan < 0) {
		AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED);
		return false;
	}

	int32 over_interval = loan % GetLoanInterval();
	if (over_interval != 0) loan += GetLoanInterval() - over_interval;

	if (loan > GetMaxLoanAmount()) {
		AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED);
		return false;
	}

	SetLoanAmount(loan);

	return GetLoanAmount() == loan;
}

/* static */ bool AICompany::BuildCompanyHQ(TileIndex tile)
{
	if (!::IsValidTile(tile)) {
		AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED);
		return false;
	}

	return AIObject::DoCommand(tile, 0, 0, CMD_BUILD_COMPANY_HQ);
}

/* static */ TileIndex AICompany::GetCompanyHQ(CompanyIndex company)
{
	company = ResolveCompanyIndex(company);
	if (company == INVALID_COMPANY) return INVALID_TILE;

	TileIndex loc = ::GetPlayer((PlayerID)company)->location_of_house;
	return (loc == 0) ? INVALID_TILE : loc;
}