00001
00002
00003
00004
00005
00006
00007
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 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 bool ScriptCompany::IsMine(ScriptCompany::CompanyID company)
00038 {
00039 return ResolveCompanyID(company) == ResolveCompanyID(COMPANY_SELF);
00040 }
00041
00042 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 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 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 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 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 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 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 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 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 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 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 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 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 Money ScriptCompany::GetMaxLoanAmount()
00191 {
00192 return _economy.max_loan;
00193 }
00194
00195 Money ScriptCompany::GetLoanInterval()
00196 {
00197 return LOAN_INTERVAL;
00198 }
00199
00200 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 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 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 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 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 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 bool ScriptCompany::SetAutoRenewMonths(int16 months)
00261 {
00262 return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew_months"), months, CMD_CHANGE_COMPANY_SETTING);
00263 }
00264
00265 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 bool ScriptCompany::SetAutoRenewMoney(uint32 money)
00274 {
00275 return ScriptObject::DoCommand(0, ::GetCompanySettingIndex("company.engine_renew_money"), money, CMD_CHANGE_COMPANY_SETTING);
00276 }
00277
00278 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 }