script_company.cpp

Go to the documentation of this file.
00001 /* $Id: script_company.cpp 23636 2011-12-19 21:06:06Z truebrain $ */
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) {
00030     if (!::Company::IsValidID((::CompanyID)_current_company)) return COMPANY_INVALID;
00031     return (CompanyID)((byte)_current_company);
00032   }
00033 
00034   return ::Company::IsValidID((::CompanyID)company) ? company : COMPANY_INVALID;
00035 }
00036 
00037 /* static */ bool ScriptCompany::IsMine(ScriptCompany::CompanyID company)
00038 {
00039   return ResolveCompanyID(company) == ResolveCompanyID(COMPANY_SELF);
00040 }
00041 
00042 /* static */ bool ScriptCompany::SetName(Text *name)
00043 {
00044   CCountedPtr<Text> counter(name);
00045 
00046   EnforcePrecondition(false, name != NULL);
00047   const char *text = name->GetEncodedText();
00048   EnforcePrecondition(false, !::StrEmpty(text));
00049   EnforcePreconditionCustomError(false, ::Utf8StringLength(text) < MAX_LENGTH_COMPANY_NAME_CHARS, ScriptError::ERR_PRECONDITION_STRING_TOO_LONG);
00050 
00051   return ScriptObject::DoCommand(0, 0, 0, CMD_RENAME_COMPANY, text);
00052 }
00053 
00054 /* static */ char *ScriptCompany::GetName(ScriptCompany::CompanyID company)
00055 {
00056   company = ResolveCompanyID(company);
00057   if (company == COMPANY_INVALID) return NULL;
00058 
00059   static const int len = 64;
00060   char *company_name = MallocT<char>(len);
00061 
00062 	::SetDParam(0, company);
00063   ::GetString(company_name, STR_COMPANY_NAME, &company_name[len - 1]);
00064   return company_name;
00065 }
00066 
00067 /* static */ bool ScriptCompany::SetPresidentName(Text *name)
00068 {
00069   CCountedPtr<Text> counter(name);
00070 
00071   EnforcePrecondition(false, name != NULL);
00072   const char *text = name->GetEncodedText();
00073   EnforcePrecondition(false, !::StrEmpty(text));
00074 
00075   return ScriptObject::DoCommand(0, 0, 0, CMD_RENAME_PRESIDENT, text);
00076 }
00077 
00078 /* static */ char *ScriptCompany::GetPresidentName(ScriptCompany::CompanyID company)
00079 {
00080   company = ResolveCompanyID(company);
00081 
00082   static const int len = 64;
00083   char *president_name = MallocT<char>(len);
00084   if (company != COMPANY_INVALID) {
00085 		::SetDParam(0, company);
00086     ::GetString(president_name, STR_PRESIDENT_NAME, &president_name[len - 1]);
00087   } else {
00088     *president_name = '\0';
00089   }
00090 
00091   return president_name;
00092 }
00093 
00094 /* static */ bool ScriptCompany::SetPresidentGender(Gender gender)
00095 {
00096   EnforcePrecondition(false, gender == GENDER_MALE || gender == GENDER_FEMALE);
00097   EnforcePrecondition(false, GetPresidentGender(ScriptCompany::COMPANY_SELF) != gender);
00098 
00099   CompanyManagerFace cmf;
00100   GenderEthnicity ge = (GenderEthnicity)((gender == GENDER_FEMALE ? (1 << ::GENDER_FEMALE) : 0) | (::InteractiveRandom() & (1 << ETHNICITY_BLACK)));
00101   RandomCompanyManagerFaceBits(cmf, ge, false);
00102 
00103   return ScriptObject::DoCommand(0, 0, cmf, CMD_SET_COMPANY_MANAGER_FACE);
00104 }
00105 
00106 /* static */ ScriptCompany::Gender ScriptCompany::GetPresidentGender(CompanyID company)
00107 {
00108   company = ResolveCompanyID(company);
00109   if (company == COMPANY_INVALID) return GENDER_INVALID;
00110 
00111   GenderEthnicity ge = (GenderEthnicity)GetCompanyManagerFaceBits(Company::Get(company)->face, CMFV_GEN_ETHN, GE_WM);
00112   return HasBit(ge, ::GENDER_FEMALE) ? GENDER_FEMALE : GENDER_MALE;
00113 }
00114 
00115 /* static */ Money ScriptCompany::GetQuarterlyIncome(ScriptCompany::CompanyID company, uint32 quarter)
00116 {
00117   company = ResolveCompanyID(company);
00118   if (company == COMPANY_INVALID) return -1;
00119   if (quarter > EARLIEST_QUARTER) return -1;
00120 
00121   if (quarter == CURRENT_QUARTER) {
00122     return ::Company::Get((::CompanyID)company)->cur_economy.income;
00123   }
00124   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].income;
00125 }
00126 
00127 /* static */ Money ScriptCompany::GetQuarterlyExpenses(ScriptCompany::CompanyID company, uint32 quarter)
00128 {
00129   company = ResolveCompanyID(company);
00130   if (company == COMPANY_INVALID) return -1;
00131   if (quarter > EARLIEST_QUARTER) return -1;
00132 
00133   if (quarter == CURRENT_QUARTER) {
00134     return ::Company::Get((::CompanyID)company)->cur_economy.expenses;
00135   }
00136   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].expenses;
00137 }
00138 
00139 /* static */ int32 ScriptCompany::GetQuarterlyCargoDelivered(ScriptCompany::CompanyID company, uint32 quarter)
00140 {
00141   company = ResolveCompanyID(company);
00142   if (company == COMPANY_INVALID) return -1;
00143   if (quarter > EARLIEST_QUARTER) return -1;
00144 
00145   if (quarter == CURRENT_QUARTER) {
00146     return ::Company::Get((::CompanyID)company)->cur_economy.delivered_cargo;
00147   }
00148   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].delivered_cargo;
00149 }
00150 
00151 /* static */ int32 ScriptCompany::GetQuarterlyPerformanceRating(ScriptCompany::CompanyID company, uint32 quarter)
00152 {
00153   company = ResolveCompanyID(company);
00154   if (company == COMPANY_INVALID) return -1;
00155   if (quarter > EARLIEST_QUARTER) return -1;
00156   if (quarter == CURRENT_QUARTER) return -1;
00157 
00158   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].performance_history;
00159 }
00160 
00161 /* static */ Money ScriptCompany::GetQuarterlyCompanyValue(ScriptCompany::CompanyID company, uint32 quarter)
00162 {
00163   company = ResolveCompanyID(company);
00164   if (company == COMPANY_INVALID) return -1;
00165   if (quarter > EARLIEST_QUARTER) return -1;
00166 
00167   if (quarter == CURRENT_QUARTER) {
00168     return ::CalculateCompanyValue(::Company::Get((::CompanyID)company));
00169   }
00170   return ::Company::Get((::CompanyID)company)->old_economy[quarter - 1].company_value;
00171 }
00172 
00173 
00174 /* static */ Money ScriptCompany::GetBankBalance(ScriptCompany::CompanyID company)
00175 {
00176   company = ResolveCompanyID(company);
00177   if (company == COMPANY_INVALID) return -1;
00178 
00179   return ::Company::Get((CompanyID)company)->money;
00180 }
00181 
00182 /* static */ Money ScriptCompany::GetLoanAmount()
00183 {
00184   ScriptCompany::CompanyID company = ResolveCompanyID(COMPANY_SELF);
00185   if (company == COMPANY_INVALID) return -1;
00186 
00187   return ::Company::Get(company)->current_loan;
00188 }
00189 
00190 /* static */ Money ScriptCompany::GetMaxLoanAmount()
00191 {
00192   return _economy.max_loan;
00193 }
00194 
00195 /* static */ Money ScriptCompany::GetLoanInterval()
00196 {
00197   return LOAN_INTERVAL;
00198 }
00199 
00200 /* static */ bool ScriptCompany::SetLoanAmount(int32 loan)
00201 {
00202   EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00203   EnforcePrecondition(false, loan >= 0);
00204   EnforcePrecondition(false, (loan % GetLoanInterval()) == 0);
00205   EnforcePrecondition(false, loan <= GetMaxLoanAmount());
00206   EnforcePrecondition(false, (loan - GetLoanAmount() + GetBankBalance(COMPANY_SELF)) >= 0);
00207 
00208   if (loan == GetLoanAmount()) return true;
00209 
00210   return ScriptObject::DoCommand(0,
00211       abs(loan - GetLoanAmount()), 2,
00212       (loan > GetLoanAmount()) ? CMD_INCREASE_LOAN : CMD_DECREASE_LOAN);
00213 }
00214 
00215 /* static */ bool ScriptCompany::SetMinimumLoanAmount(int32 loan)
00216 {
00217   EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00218   EnforcePrecondition(false, loan >= 0);
00219 
00220   int32 over_interval = loan % GetLoanInterval();
00221   if (over_interval != 0) loan += GetLoanInterval() - over_interval;
00222 
00223   EnforcePrecondition(false, loan <= GetMaxLoanAmount());
00224 
00225   SetLoanAmount(loan);
00226 
00227   return GetLoanAmount() == loan;
00228 }
00229 
00230 /* static */ bool ScriptCompany::BuildCompanyHQ(TileIndex tile)
00231 {
00232   EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
00233   EnforcePrecondition(false, ::IsValidTile(tile));
00234 
00235   return ScriptObject::DoCommand(tile, OBJECT_HQ, 0, CMD_BUILD_OBJECT);
00236 }
00237 
00238 /* static */ TileIndex ScriptCompany::GetCompanyHQ(CompanyID company)
00239 {
00240   company = ResolveCompanyID(company);
00241   if (company == COMPANY_INVALID) return INVALID_TILE;
00242 
00243   TileIndex loc = ::Company::Get((CompanyID)company)->location_of_HQ;
00244   return (loc == 0) ? INVALID_TILE : loc;
00245 }
00246 
00247 /* static */ bool ScriptCompany::SetAutoRenewStatus(bool autorenew)
00248 {
00249   return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew"), autorenew ? 1 : 0, CMD_CHANGE_COMPANY_SETTING);
00250 }
00251 
00252 /* static */ bool ScriptCompany::GetAutoRenewStatus(CompanyID company)
00253 {
00254   company = ResolveCompanyID(company);
00255   if (company == COMPANY_INVALID) return false;
00256 
00257   return ::Company::Get((CompanyID)company)->settings.engine_renew;
00258 }
00259 
00260 /* static */ bool ScriptCompany::SetAutoRenewMonths(int16 months)
00261 {
00262   return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew_months"), months, CMD_CHANGE_COMPANY_SETTING);
00263 }
00264 
00265 /* static */ int16 ScriptCompany::GetAutoRenewMonths(CompanyID company)
00266 {
00267   company = ResolveCompanyID(company);
00268   if (company == COMPANY_INVALID) return 0;
00269 
00270   return ::Company::Get((CompanyID)company)->settings.engine_renew_months;
00271 }
00272 
00273 /* static */ bool ScriptCompany::SetAutoRenewMoney(uint32 money)
00274 {
00275   return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew_money"), money, CMD_CHANGE_COMPANY_SETTING);
00276 }
00277 
00278 /* static */ uint32 ScriptCompany::GetAutoRenewMoney(CompanyID company)
00279 {
00280   company = ResolveCompanyID(company);
00281   if (company == COMPANY_INVALID) return 0;
00282 
00283   return ::Company::Get((CompanyID)company)->settings.engine_renew_money;
00284 }