script_company.cpp

Go to the documentation of this file.
00001 /* $Id$ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00012 #include "../../stdafx.h"
00013 #include "script_company.hpp"
00014 #include "script_error.hpp"
00015 #include "../../command_func.h"
00016 #include "../../company_func.h"
00017 #include "../../company_base.h"
00018 #include "../../company_manager_face.h"
00019 #include "../../economy_func.h"
00020 #include "../../object_type.h"
00021 #include "../../strings_func.h"
00022 #include "../../tile_map.h"
00023 #include "../../string_func.h"
00024 #include "../../settings_func.h"
00025 #include "table/strings.h"
00026 
00027 /* static */ ScriptCompany::CompanyID ScriptCompany::ResolveCompanyID(ScriptCompany::CompanyID company)
00028 {
00029   if (company == COMPANY_SELF) return (CompanyID)((byte)_current_company);
00030 
00031   return ::Company::IsValidID((::CompanyID)company) ? company : COMPANY_INVALID;
00032 }
00033 
00034 /* static */ bool ScriptCompany::IsMine(ScriptCompany::CompanyID company)
00035 {
00036   return ResolveCompanyID(company) == ResolveCompanyID(COMPANY_SELF);
00037 }
00038 
00039 /* static */ bool ScriptCompany::SetName(const char *name)
00040 {
00041   EnforcePrecondition(false, !::StrEmpty(name));
00042   EnforcePreconditionCustomError(false, ::Utf8StringLength(name) < MAX_LENGTH_COMPANY_NAME_CHARS, ScriptError::ERR_PRECONDITION_STRING_TOO_LONG);
00043 
00044   return ScriptObject::DoCommand(0, 0, 0, CMD_RENAME_COMPANY, name);
00045 }
00046 
00047 /* static */ char *ScriptCompany::GetName(ScriptCompany::CompanyID company)
00048 {
00049   company = ResolveCompanyID(company);
00050   if (company == COMPANY_INVALID) return NULL;
00051 
00052   static const int len = 64;
00053   char *company_name = MallocT<char>(len);
00054 
00055 	::SetDParam(0, company);
00056   ::GetString(company_name, STR_COMPANY_NAME, &company_name[len - 1]);
00057   return company_name;
00058 }
00059 
00060 /* static */ bool ScriptCompany::SetPresidentName(const char *name)
00061 {
00062   EnforcePrecondition(false, !::StrEmpty(name));
00063 
00064   return ScriptObject::DoCommand(0, 0, 0, CMD_RENAME_PRESIDENT, name);
00065 }
00066 
00067 /* static */ char *ScriptCompany::GetPresidentName(ScriptCompany::CompanyID company)
00068 {
00069   company = ResolveCompanyID(company);
00070 
00071   static const int len = 64;
00072   char *president_name = MallocT<char>(len);
00073   if (company != COMPANY_INVALID) {
00074 		::SetDParam(0, company);
00075     ::GetString(president_name, STR_PRESIDENT_NAME, &president_name[len - 1]);
00076   } else {
00077     *president_name = '\0';
00078   }
00079 
00080   return president_name;
00081 }
00082 
00083 /* static */ bool ScriptCompany::SetPresidentGender(Gender gender)
00084 {
00085   EnforcePrecondition(false, gender == GENDER_MALE || gender == GENDER_FEMALE);
00086   EnforcePrecondition(false, GetPresidentGender(ScriptCompany::COMPANY_SELF) != gender);
00087 
00088   CompanyManagerFace cmf;
00089   GenderEthnicity ge = (GenderEthnicity)((gender == GENDER_FEMALE ? (1 << ::GENDER_FEMALE) : 0) | (::InteractiveRandom() & (1 << ETHNICITY_BLACK)));
00090   RandomCompanyManagerFaceBits(cmf, ge, false);
00091 
00092   return ScriptObject::DoCommand(0, 0, cmf, CMD_SET_COMPANY_MANAGER_FACE);
00093 }
00094 
00095 /* static */ ScriptCompany::Gender ScriptCompany::GetPresidentGender(CompanyID company)
00096 {
00097   company = ResolveCompanyID(company);
00098   if (company == COMPANY_INVALID) return GENDER_INVALID;
00099 
00100   GenderEthnicity ge = (GenderEthnicity)GetCompanyManagerFaceBits(Company::Get(company)->face, CMFV_GEN_ETHN, GE_WM);
00101   return HasBit(ge, ::GENDER_FEMALE) ? GENDER_FEMALE : GENDER_MALE;
00102 }
00103 
00104 /* static */ Money ScriptCompany::GetQuarterlyIncome(ScriptCompany::CompanyID company, uint32 quarter)
00105 {
00106   company = ResolveCompanyID(company);
00107   if (company == COMPANY_INVALID) return -1;
00108   if (quarter > EARLIEST_QUARTER) return -1;
00109 
00110   if (quarter == CURRENT_QUARTER) {
00111     return ::Company::Get((::CompanyID)company)->cur_economy.income;
00112   }
00113   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].income;
00114 }
00115 
00116 /* static */ Money ScriptCompany::GetQuarterlyExpenses(ScriptCompany::CompanyID company, uint32 quarter)
00117 {
00118   company = ResolveCompanyID(company);
00119   if (company == COMPANY_INVALID) return -1;
00120   if (quarter > EARLIEST_QUARTER) return -1;
00121 
00122   if (quarter == CURRENT_QUARTER) {
00123     return ::Company::Get((::CompanyID)company)->cur_economy.expenses;
00124   }
00125   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].expenses;
00126 }
00127 
00128 /* static */ int32 ScriptCompany::GetQuarterlyCargoDelivered(ScriptCompany::CompanyID company, uint32 quarter)
00129 {
00130   company = ResolveCompanyID(company);
00131   if (company == COMPANY_INVALID) return -1;
00132   if (quarter > EARLIEST_QUARTER) return -1;
00133 
00134   if (quarter == CURRENT_QUARTER) {
00135     return ::Company::Get((::CompanyID)company)->cur_economy.delivered_cargo;
00136   }
00137   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].delivered_cargo;
00138 }
00139 
00140 /* static */ int32 ScriptCompany::GetQuarterlyPerformanceRating(ScriptCompany::CompanyID company, uint32 quarter)
00141 {
00142   company = ResolveCompanyID(company);
00143   if (company == COMPANY_INVALID) return -1;
00144   if (quarter > EARLIEST_QUARTER) return -1;
00145   if (quarter == CURRENT_QUARTER) return -1;
00146 
00147   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].performance_history;
00148 }
00149 
00150 /* static */ Money ScriptCompany::GetQuarterlyCompanyValue(ScriptCompany::CompanyID company, uint32 quarter)
00151 {
00152   company = ResolveCompanyID(company);
00153   if (company == COMPANY_INVALID) return -1;
00154   if (quarter > EARLIEST_QUARTER) return -1;
00155 
00156   if (quarter == CURRENT_QUARTER) {
00157     return ::CalculateCompanyValue(::Company::Get((::CompanyID)company));
00158   }
00159   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].company_value;
00160 }
00161 
00162 
00163 /* static */ Money ScriptCompany::GetBankBalance(ScriptCompany::CompanyID company)
00164 {
00165   company = ResolveCompanyID(company);
00166   if (company == COMPANY_INVALID) return -1;
00167 
00168   return ::Company::Get((CompanyID)company)->money;
00169 }
00170 
00171 /* static */ Money ScriptCompany::GetLoanAmount()
00172 {
00173   return ::Company::Get(_current_company)->current_loan;
00174 }
00175 
00176 /* static */ Money ScriptCompany::GetMaxLoanAmount()
00177 {
00178   return _economy.max_loan;
00179 }
00180 
00181 /* static */ Money ScriptCompany::GetLoanInterval()
00182 {
00183   return LOAN_INTERVAL;
00184 }
00185 
00186 /* static */ bool ScriptCompany::SetLoanAmount(int32 loan)
00187 {
00188   EnforcePrecondition(false, loan >= 0);
00189   EnforcePrecondition(false, (loan % GetLoanInterval()) == 0);
00190   EnforcePrecondition(false, loan <= GetMaxLoanAmount());
00191   EnforcePrecondition(false, (loan - GetLoanAmount() + GetBankBalance(COMPANY_SELF)) >= 0);
00192 
00193   if (loan == GetLoanAmount()) return true;
00194 
00195   return ScriptObject::DoCommand(0,
00196       abs(loan - GetLoanAmount()), 2,
00197       (loan > GetLoanAmount()) ? CMD_INCREASE_LOAN : CMD_DECREASE_LOAN);
00198 }
00199 
00200 /* static */ bool ScriptCompany::SetMinimumLoanAmount(int32 loan)
00201 {
00202   EnforcePrecondition(false, loan >= 0);
00203 
00204   int32 over_interval = loan % GetLoanInterval();
00205   if (over_interval != 0) loan += GetLoanInterval() - over_interval;
00206 
00207   EnforcePrecondition(false, loan <= GetMaxLoanAmount());
00208 
00209   SetLoanAmount(loan);
00210 
00211   return GetLoanAmount() == loan;
00212 }
00213 
00214 /* static */ bool ScriptCompany::BuildCompanyHQ(TileIndex tile)
00215 {
00216   EnforcePrecondition(false, ::IsValidTile(tile));
00217 
00218   return ScriptObject::DoCommand(tile, OBJECT_HQ, 0, CMD_BUILD_OBJECT);
00219 }
00220 
00221 /* static */ TileIndex ScriptCompany::GetCompanyHQ(CompanyID company)
00222 {
00223   company = ResolveCompanyID(company);
00224   if (company == COMPANY_INVALID) return INVALID_TILE;
00225 
00226   TileIndex loc = ::Company::Get((CompanyID)company)->location_of_HQ;
00227   return (loc == 0) ? INVALID_TILE : loc;
00228 }
00229 
00230 /* static */ bool ScriptCompany::SetAutoRenewStatus(bool autorenew)
00231 {
00232   return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew"), autorenew ? 1 : 0, CMD_CHANGE_COMPANY_SETTING);
00233 }
00234 
00235 /* static */ bool ScriptCompany::GetAutoRenewStatus(CompanyID company)
00236 {
00237   company = ResolveCompanyID(company);
00238   if (company == COMPANY_INVALID) return false;
00239 
00240   return ::Company::Get((CompanyID)company)->settings.engine_renew;
00241 }
00242 
00243 /* static */ bool ScriptCompany::SetAutoRenewMonths(int16 months)
00244 {
00245   return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew_months"), months, CMD_CHANGE_COMPANY_SETTING);
00246 }
00247 
00248 /* static */ int16 ScriptCompany::GetAutoRenewMonths(CompanyID company)
00249 {
00250   company = ResolveCompanyID(company);
00251   if (company == COMPANY_INVALID) return 0;
00252 
00253   return ::Company::Get((CompanyID)company)->settings.engine_renew_months;
00254 }
00255 
00256 /* static */ bool ScriptCompany::SetAutoRenewMoney(uint32 money)
00257 {
00258   return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew_money"), money, CMD_CHANGE_COMPANY_SETTING);
00259 }
00260 
00261 /* static */ uint32 ScriptCompany::GetAutoRenewMoney(CompanyID company)
00262 {
00263   company = ResolveCompanyID(company);
00264   if (company == COMPANY_INVALID) return 0;
00265 
00266   return ::Company::Get((CompanyID)company)->settings.engine_renew_money;
00267 }