rubidium@9374: /* $Id$ */ rubidium@9374: rubidium@9436: /** @file ai_company.cpp handles the functions of the AICompany class */ rubidium@9374: rubidium@9430: #include "ai_company.hpp" truelight@9441: #include "../../command.h" rubidium@9430: #include "../../player.h" rubidium@9430: #include "../../economy.h" rubidium@9430: #include "../../strings.h" glx@9629: #include "../../variables.h" glx@9629: #include "table/strings.h" rubidium@9430: rubidium@9668: AICompany::CompanyIndex AICompany::ResolveCompanyIndex(AICompany::CompanyIndex company) rubidium@9668: { rubidium@9668: if (company == MY_COMPANY) return (CompanyIndex)_current_player; rubidium@9668: rubidium@9668: return (IsValidPlayer((PlayerID)company) && GetPlayer((PlayerID)company)->is_active) ? company : INVALID_COMPANY; rubidium@9668: } rubidium@9668: rubidium@9430: bool AICompany::SetCompanyName(const char *name) rubidium@9430: { rubidium@9430: if (name == NULL) return false; rubidium@9430: rubidium@9430: _cmd_text = name; truelight@9575: return this->DoCommand(0, 0, 0, CMD_CHANGE_COMPANY_NAME); rubidium@9430: } rubidium@9430: rubidium@9668: char *AICompany::GetCompanyName(AICompany::CompanyIndex company) rubidium@9430: { rubidium@9668: company = this->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: truelight@9696: SetDParam(0, GetPlayer((PlayerID)company)->index); truelight@9696: GetString(company_name, STR_COMPANY_NAME, &company_name[len - 1]); rubidium@9430: return company_name; rubidium@9430: } rubidium@9374: truelight@9575: bool AICompany::SetPresidentName(const char *name) truelight@9575: { truelight@9575: if (name == NULL) return false; truelight@9575: truelight@9575: _cmd_text = name; truelight@9575: return this->DoCommand(0, 0, 0, CMD_CHANGE_PRESIDENT_NAME); truelight@9575: } truelight@9575: rubidium@9668: char *AICompany::GetPresidentName(AICompany::CompanyIndex company) truelight@9575: { rubidium@9668: company = this->ResolveCompanyIndex(company); rubidium@9668: truelight@9575: static const int len = 64; truelight@9575: char *president_name = MallocT(len); rubidium@9668: if (company != INVALID_COMPANY) { rubidium@9668: SetDParam(0, GetPlayer((PlayerID)company)->index); rubidium@9668: 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: rubidium@9668: int32 AICompany::GetCompanyValue(AICompany::CompanyIndex company) rubidium@9374: { rubidium@9668: company = this->ResolveCompanyIndex(company); rubidium@9668: if (company == INVALID_COMPANY) return 0; rubidium@9668: rubidium@9668: return GetPlayer((PlayerID)company)->cur_economy.company_value; rubidium@9374: } rubidium@9374: rubidium@9668: int32 AICompany::GetBankBalance(AICompany::CompanyIndex company) rubidium@9374: { rubidium@9668: company = this->ResolveCompanyIndex(company); rubidium@9668: if (company == INVALID_COMPANY) return 0; rubidium@9668: rubidium@9668: return GetPlayer((PlayerID)company)->player_money; rubidium@9374: } rubidium@9374: rubidium@9374: int32 AICompany::GetLoanAmount() rubidium@9374: { rubidium@9374: return GetPlayer(_current_player)->current_loan; rubidium@9374: } rubidium@9374: rubidium@9374: int32 AICompany::GetMaxLoanAmount() rubidium@9374: { rubidium@9374: return _economy.max_loan; rubidium@9374: } rubidium@9374: rubidium@9376: int32 AICompany::GetLoanInterval() rubidium@9376: { rubidium@9376: return LOAN_INTERVAL; rubidium@9376: } rubidium@9376: rubidium@9374: bool AICompany::SetLoanAmount(int32 loan) rubidium@9374: { rubidium@9374: if (loan < 0 || rubidium@9376: (loan % this->GetLoanInterval()) != 0 || rubidium@9374: loan > this->GetMaxLoanAmount() || rubidium@9668: (loan - this->GetLoanAmount() + this->GetBankBalance(MY_COMPANY)) < 0) { rubidium@9374: return false; rubidium@9374: } rubidium@9374: rubidium@9462: if (loan == this->GetLoanAmount()) return true; truelight@9414: rubidium@9462: return this->DoCommand(0, truelight@9486: abs(loan - this->GetLoanAmount()), 2, rubidium@9462: (loan > this->GetLoanAmount()) ? CMD_INCREASE_LOAN : CMD_DECREASE_LOAN); rubidium@9374: } rubidium@9668: rubidium@9668: bool AICompany::SetMinimumLoanAmount(int32 loan) rubidium@9668: { rubidium@9668: if (loan < 0) return false; rubidium@9668: rubidium@9668: int32 over_interval = loan % this->GetLoanInterval(); rubidium@9668: if (over_interval != 0) loan += this->GetLoanInterval() - over_interval; rubidium@9668: rubidium@9668: if (loan > this->GetMaxLoanAmount()) return false; rubidium@9668: rubidium@9668: this->SetLoanAmount(loan); rubidium@9668: rubidium@9668: return this->GetLoanAmount() == loan; rubidium@9668: }