rubidium@9374: /* $Id$ */ rubidium@9374: truebrain@9833: /** @file ai_company.cpp Implementation of AICompany. */ rubidium@9374: rubidium@9430: #include "ai_company.hpp" rubidium@9865: #include "ai_error.hpp" rubidium@9723: #include "../../command_func.h" rubidium@9724: #include "../../player_func.h" rubidium@9724: #include "../../player_base.h" rubidium@9723: #include "../../economy_func.h" rubidium@9723: #include "../../strings_func.h" truebrain@9808: #include "../../tile_map.h" glx@9629: #include "../../variables.h" rubidium@9723: #include "../../core/alloc_func.hpp" rubidium@9865: #include "../../string_func.h" glx@9629: #include "table/strings.h" rubidium@9430: truebrain@9737: /* static */ AICompany::CompanyIndex AICompany::ResolveCompanyIndex(AICompany::CompanyIndex company) rubidium@9668: { rubidium@9701: if (company == MY_COMPANY) return (CompanyIndex)((byte)_current_player); rubidium@9668: truebrain@9736: return (::IsValidPlayer((PlayerID)company) && ::GetPlayer((PlayerID)company)->is_active) ? company : INVALID_COMPANY; rubidium@9668: } rubidium@9668: truebrain@9737: /* static */ bool AICompany::SetCompanyName(const char *name) rubidium@9430: { rubidium@9865: if (::StrEmpty(name)) { rubidium@9865: AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED); rubidium@9865: return false; rubidium@9865: } rubidium@9430: rubidium@9430: _cmd_text = name; truebrain@9737: return AIObject::DoCommand(0, 0, 0, CMD_CHANGE_COMPANY_NAME); rubidium@9430: } rubidium@9430: truebrain@9737: /* static */ char *AICompany::GetCompanyName(AICompany::CompanyIndex company) rubidium@9430: { truebrain@9737: company = ResolveCompanyIndex(company); truelight@9696: if (company == INVALID_COMPANY) return NULL; rubidium@9668: rubidium@9430: static const int len = 64; rubidium@9430: char *company_name = MallocT(len); rubidium@9430: truebrain@9736: ::SetDParam(0, GetPlayer((PlayerID)company)->index); truebrain@9736: ::GetString(company_name, STR_COMPANY_NAME, &company_name[len - 1]); rubidium@9430: return company_name; rubidium@9430: } rubidium@9374: truebrain@9737: /* static */ bool AICompany::SetPresidentName(const char *name) truelight@9575: { rubidium@9865: if (::StrEmpty(name)) { rubidium@9865: AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED); rubidium@9865: return false; rubidium@9865: } truelight@9575: truelight@9575: _cmd_text = name; truebrain@9737: return AIObject::DoCommand(0, 0, 0, CMD_CHANGE_PRESIDENT_NAME); truelight@9575: } truelight@9575: truebrain@9737: /* static */ char *AICompany::GetPresidentName(AICompany::CompanyIndex company) truelight@9575: { truebrain@9737: company = ResolveCompanyIndex(company); rubidium@9668: truelight@9575: static const int len = 64; truelight@9575: char *president_name = MallocT(len); rubidium@9668: if (company != INVALID_COMPANY) { truebrain@9736: ::SetDParam(0, GetPlayer((PlayerID)company)->index); truebrain@9736: ::GetString(president_name, STR_PLAYER_NAME, &president_name[len - 1]); rubidium@9668: } else { rubidium@9668: *president_name = '\0'; rubidium@9668: } truelight@9575: truelight@9575: return president_name; truelight@9575: } truelight@9575: truebrain@9737: /* static */ int32 AICompany::GetCompanyValue(AICompany::CompanyIndex company) rubidium@9374: { truebrain@9737: company = ResolveCompanyIndex(company); rubidium@9668: if (company == INVALID_COMPANY) return 0; rubidium@9668: truebrain@9736: return ::GetPlayer((PlayerID)company)->cur_economy.company_value; rubidium@9374: } rubidium@9374: truebrain@9737: /* static */ int32 AICompany::GetBankBalance(AICompany::CompanyIndex company) rubidium@9374: { truebrain@9737: company = ResolveCompanyIndex(company); rubidium@9668: if (company == INVALID_COMPANY) return 0; rubidium@9668: truebrain@9736: return ::ClampToI32(GetPlayer((PlayerID)company)->player_money); rubidium@9374: } rubidium@9374: truebrain@9737: /* static */ int32 AICompany::GetLoanAmount() rubidium@9374: { truebrain@9736: return ::GetPlayer(_current_player)->current_loan; rubidium@9374: } rubidium@9374: truebrain@9737: /* static */ int32 AICompany::GetMaxLoanAmount() rubidium@9374: { rubidium@9374: return _economy.max_loan; rubidium@9374: } rubidium@9374: truebrain@9737: /* static */ int32 AICompany::GetLoanInterval() rubidium@9376: { rubidium@9376: return LOAN_INTERVAL; rubidium@9376: } rubidium@9376: truebrain@9737: /* static */ bool AICompany::SetLoanAmount(int32 loan) rubidium@9374: { rubidium@9374: if (loan < 0 || truebrain@9737: (loan % GetLoanInterval()) != 0 || truebrain@9737: loan > GetMaxLoanAmount() || truebrain@9737: (loan - GetLoanAmount() + GetBankBalance(MY_COMPANY)) < 0) { rubidium@9865: AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED); rubidium@9374: return false; rubidium@9374: } rubidium@9374: truebrain@9737: if (loan == GetLoanAmount()) return true; truelight@9414: truebrain@9737: return AIObject::DoCommand(0, truebrain@9737: abs(loan - GetLoanAmount()), 2, truebrain@9737: (loan > GetLoanAmount()) ? CMD_INCREASE_LOAN : CMD_DECREASE_LOAN); rubidium@9374: } rubidium@9668: truebrain@9737: /* static */ bool AICompany::SetMinimumLoanAmount(int32 loan) rubidium@9668: { rubidium@9865: if (loan < 0) { rubidium@9865: AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED); rubidium@9865: return false; rubidium@9865: } rubidium@9668: truebrain@9737: int32 over_interval = loan % GetLoanInterval(); truebrain@9737: if (over_interval != 0) loan += GetLoanInterval() - over_interval; rubidium@9668: rubidium@9865: if (loan > GetMaxLoanAmount()) { rubidium@9865: AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED); rubidium@9865: return false; rubidium@9865: } rubidium@9668: truebrain@9737: SetLoanAmount(loan); rubidium@9668: truebrain@9737: return GetLoanAmount() == loan; rubidium@9668: } truebrain@9808: truebrain@9808: /* static */ bool AICompany::BuildCompanyHQ(TileIndex tile) truebrain@9808: { rubidium@9865: if (!::IsValidTile(tile)) { rubidium@9865: AIObject::SetLastError(AIError::ERR_PRECONDITION_FAILED); rubidium@9865: return false; rubidium@9865: } truebrain@9808: truebrain@9808: return AIObject::DoCommand(tile, 0, 0, CMD_BUILD_COMPANY_HQ); truebrain@9808: } truebrain@9808: truebrain@9808: /* static */ TileIndex AICompany::GetCompanyHQ(CompanyIndex company) truebrain@9808: { truebrain@9808: company = ResolveCompanyIndex(company); truebrain@9808: if (company == INVALID_COMPANY) return INVALID_TILE; truebrain@9808: truebrain@9808: TileIndex loc = ::GetPlayer((PlayerID)company)->location_of_house; truebrain@9808: return (loc == 0) ? INVALID_TILE : loc; truebrain@9808: }