(svn r12431) [NoAI] -Add: added AIEventSubsidiaryOffer, which keeps you informed about new Subsidiaries
/* $Id$ */
/** @file ai_company.cpp handles the functions of the AICompany class */
#include "ai_company.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 "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 (name == NULL) 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 (name == NULL) 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) {
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) return false;
int32 over_interval = loan % GetLoanInterval();
if (over_interval != 0) loan += GetLoanInterval() - over_interval;
if (loan > GetMaxLoanAmount()) return false;
SetLoanAmount(loan);
return GetLoanAmount() == loan;
}
/* static */ bool AICompany::BuildCompanyHQ(TileIndex tile)
{
if (!::IsValidTile(tile)) 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;
}