00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "unitcostcalculator-standard.h"
00029
00030 #include "vehicletype.h"
00031
00032
00033
00034
00035 ASCString StandardUnitCostCalculator::getCalculatorName()
00036 {
00037 return "standard";
00038 }
00039
00040 Resources StandardUnitCostCalculator :: productionCost( const VehicleType* vehicle )
00041 {
00042 Resources res;
00043
00044 res.energy = 0;
00045 res.material = 0;
00046 res.fuel = 0;
00047 int typecoste = 0;
00048 int typecostm = 0;
00049 int weaponcoste = 0;
00050 int weaponcostm = 0;
00051 int specialcoste = 0;
00052 int specialcostm = 0;
00053 int maxmoverange = 0;
00054 int maxweaponrange = 0;
00055
00056
00057 bool carrierCharge = false;
00058 for ( int T=0; T < vehicle->entranceSystems.size(); ++T )
00059 if ((( vehicle->entranceSystems[T].container_height < chtieffliegend && (vehicle->entranceSystems[T].height_abs & (chtieffliegend | chfliegend | chhochfliegend | chsatellit))) ||
00060 (( vehicle->entranceSystems[T].container_height & ( chfliegend | chhochfliegend | chsatellit)) && (vehicle->entranceSystems[T].height_abs & ( chfliegend | chhochfliegend | chsatellit))))
00061 && vehicle->maxLoadableUnits > 6 )
00062 carrierCharge = true;
00063
00064
00065 for ( int M=0; M < vehicle->movement.size(); ++M ) {
00066 if ( maxmoverange < vehicle->movement[M] ) {
00067 maxmoverange = vehicle->movement[M];
00068 }
00069 }
00070
00071 if ( vehicle->weapons.count > 0 ) {
00072 for ( int WR=0; WR < vehicle->weapons.count; ++WR ) {
00073 if ( maxweaponrange < vehicle->weapons.weapon[WR].maxdistance ) {
00074 maxweaponrange = vehicle->weapons.weapon[WR].maxdistance;
00075 }
00076 }
00077 }
00078
00079
00080
00081 if ( vehicle->movemalustyp == MoveMalusType::trooper) {
00082 typecoste += vehicle->armor*3;
00083 typecostm += vehicle->armor*3;
00084 } else if ( vehicle->movemalustyp == MoveMalusType::light_wheeled_vehicle ) {
00085 typecoste += vehicle->armor*6;
00086 typecostm += vehicle->armor*6;
00087 } else if ( vehicle->movemalustyp == MoveMalusType::light_tracked_vehicle || vehicle->movemalustyp == MoveMalusType::medium_wheeled_vehicle ) {
00088 typecoste += vehicle->armor*7;
00089 typecostm += vehicle->armor*7;
00090 } else if ( vehicle->movemalustyp == MoveMalusType::medium_tracked_vehicle || vehicle->movemalustyp == MoveMalusType::heavy_wheeled_vehicle || vehicle->movemalustyp == MoveMalusType::rail_vehicle || vehicle->movemalustyp == MoveMalusType::structure) {
00091 typecoste += vehicle->armor*8;
00092 typecostm += vehicle->armor*8;
00093 } else if ( vehicle->movemalustyp == MoveMalusType::heavy_tracked_vehicle ) {
00094 typecoste += vehicle->armor*9;
00095 typecostm += vehicle->armor*9;
00096 } else if ( vehicle->movemalustyp == MoveMalusType::hoovercraft) {
00097 typecoste += vehicle->armor*9;
00098 typecostm += vehicle->armor*9;
00099 } else if ( vehicle->movemalustyp == MoveMalusType::light_ship ) {
00100 typecoste += vehicle->armor*8;
00101 typecostm += vehicle->armor*8;
00102 } else if ( vehicle->movemalustyp == MoveMalusType::medium_ship ) {
00103 typecoste += vehicle->armor*10;
00104 typecostm += vehicle->armor*10;
00105 } else if ( vehicle->movemalustyp == MoveMalusType::heavy_ship ) {
00106 typecoste += vehicle->armor*12;
00107 typecostm += vehicle->armor*12;
00108 } else if ( vehicle->movemalustyp == MoveMalusType::helicopter ) {
00109 typecoste += vehicle->armor*14;
00110 typecostm += vehicle->armor*14;
00111 } else if ( vehicle->movemalustyp == MoveMalusType::light_aircraft ) {
00112 typecoste += vehicle->armor*16;
00113 typecostm += vehicle->armor*16;
00114 } else if ( vehicle->movemalustyp == MoveMalusType::medium_aircraft || vehicle->movemalustyp == MoveMalusType::heavy_aircraft ) {
00115 typecoste += vehicle->armor*18;
00116 typecostm += vehicle->armor*18;
00117
00118 } else {
00119 typecoste += vehicle->armor*6;
00120 typecostm += vehicle->armor*6;
00121 }
00122
00123
00124 if ( vehicle->hasFunction( ContainerBaseType::IceBreaker ) ) {
00125 typecoste += vehicle->armor *2;
00126 typecostm += vehicle->armor *2;
00127 }
00128
00129 if ( vehicle->height & chgetaucht ) {
00130 if ( vehicle->movemalustyp == MoveMalusType::light_ship || vehicle->movemalustyp == MoveMalusType::medium_ship || vehicle->movemalustyp == MoveMalusType::heavy_ship ) {
00131 typecoste += vehicle->armor*2;
00132 typecostm += vehicle->armor*2;
00133 } else {
00134 if ( vehicle->movemalustyp == MoveMalusType::trooper ) {
00135 typecoste += vehicle->armor*10;
00136 typecostm += vehicle->armor*10;
00137 } else {
00138 typecoste += vehicle->armor*6;
00139 typecostm += vehicle->armor*6;
00140 }
00141 }
00142 }
00143
00144 if ( vehicle->height & chsatellit ) {
00145 typecoste += vehicle->armor*3;
00146 typecostm += vehicle->armor*2;
00147 }
00148
00149 if ( vehicle->height & chhochfliegend ) {
00150 typecoste += vehicle->armor*4;
00151 typecostm += vehicle->armor*4;
00152 }
00153
00154 if ( vehicle->height & chfliegend ) {
00155 typecoste += vehicle->armor*3;
00156 typecostm += vehicle->armor*3;
00157 }
00158
00159 if ( vehicle->height & chtieffliegend ) {
00160 typecoste += vehicle->armor*2;
00161 typecostm += vehicle->armor*2;
00162 }
00163
00164 if ( vehicle->entranceSystems.size() > 0 ) {
00165 typecoste += vehicle->maxLoadableUnits*100;
00166 typecostm += vehicle->maxLoadableUnits*100;
00167
00168 if ( carrierCharge ) {
00169 typecoste += vehicle->maxLoadableUnits*1000;
00170 typecostm += vehicle->maxLoadableUnits*1000;
00171 }
00172 }
00173
00174 if (maxmoverange > 60 ) {
00175 typecoste += (maxmoverange-60)*10;
00176 typecostm += (maxmoverange-60)*5;
00177 }
00178
00179 if (maxmoverange > 110 ) {
00180 typecoste += (maxmoverange-110)*10;
00181 typecostm += (maxmoverange-110)*5;
00182 }
00183
00184 if (maxmoverange > 150 ) {
00185 typecoste += (maxmoverange-150)*10;
00186 typecostm += (maxmoverange-150)*5;
00187 }
00188
00189 if (maxmoverange > 190 ) {
00190 typecoste += (maxmoverange-190)*10;
00191 typecostm += (maxmoverange-190)*5;
00192 }
00193
00194
00195
00196
00197
00198 if ( vehicle->weapons.count > 0 ) {
00199 for ( int W=0; W < vehicle->weapons.count; ++W ) {
00200 int weaponsinglecoste = 0;
00201 int weaponsinglecostm = 0;
00202 if (vehicle->weapons.weapon[W].getScalarWeaponType() == cwminen) {
00203 if ( vehicle->weapons.weapon[W].shootable() ) {
00204 weaponsinglecoste += vehicle->weapons.weapon[W].maxstrength;
00205 weaponsinglecostm += vehicle->weapons.weapon[W].maxstrength;
00206 } else {
00207 weaponsinglecoste += 100;
00208 weaponsinglecostm += 50;
00209 }
00210 }
00211 if (vehicle->weapons.weapon[W].getScalarWeaponType() == cwmachinegunn || vehicle->weapons.weapon[W].getScalarWeaponType() == cwsmallmissilen || vehicle->weapons.weapon[W].getScalarWeaponType() == cwbombn) {
00212 if ( vehicle->weapons.weapon[W].shootable() ) {
00213 weaponsinglecoste += vehicle->weapons.weapon[W].maxstrength*5;
00214 weaponsinglecostm += vehicle->weapons.weapon[W].maxstrength*5;
00215 } else {
00216 weaponsinglecoste += 100;
00217 weaponsinglecostm += 50;
00218 }
00219 }
00220 if (vehicle->weapons.weapon[W].getScalarWeaponType() == cwlargemissilen || vehicle->weapons.weapon[W].getScalarWeaponType() == cwtorpedon) {
00221 if ( vehicle->weapons.weapon[W].shootable() ) {
00222 weaponsinglecoste += vehicle->weapons.weapon[W].maxstrength*10;
00223 weaponsinglecostm += vehicle->weapons.weapon[W].maxstrength*10;
00224 } else {
00225 weaponsinglecoste += 100;
00226 weaponsinglecostm += 50;
00227 }
00228 }
00229 if (vehicle->weapons.weapon[W].getScalarWeaponType() == cwcannonn || vehicle->weapons.weapon[W].getScalarWeaponType() == cwcruisemissile) {
00230 if ( vehicle->weapons.weapon[W].shootable() ) {
00231 weaponsinglecoste += vehicle->weapons.weapon[W].maxstrength*15;
00232 weaponsinglecostm += vehicle->weapons.weapon[W].maxstrength*15;
00233 } else {
00234 weaponsinglecoste += 100;
00235 weaponsinglecostm += 50;
00236 }
00237 }
00238 if (vehicle->weapons.weapon[W].getScalarWeaponType() == cwlasern && vehicle->weapons.weapon[W].shootable() ) {
00239 weaponsinglecoste += vehicle->weapons.weapon[W].maxstrength*12;
00240 weaponsinglecostm += vehicle->weapons.weapon[W].maxstrength*10;
00241 }
00242 if (vehicle->weapons.weapon[W].service() ) {
00243 weaponsinglecoste += 1000;
00244 weaponsinglecostm += 500;
00245 }
00246 if (vehicle->weapons.weapon[W].canRefuel() ) {
00247 weaponsinglecoste += 100;
00248 weaponsinglecostm += 50;
00249 }
00250
00251 if (vehicle->weapons.weapon[W].maxdistance > 19 ) {
00252 weaponsinglecoste += (vehicle->weapons.weapon[W].maxdistance-10)*80;
00253 weaponsinglecostm += (vehicle->weapons.weapon[W].maxdistance-10)*80;
00254 }
00255
00256 if (vehicle->weapons.weapon[W].maxdistance > 69 ) {
00257 weaponsinglecoste += (vehicle->weapons.weapon[W].maxdistance-60)*150;
00258 weaponsinglecostm += (vehicle->weapons.weapon[W].maxdistance-60)*140;
00259 }
00260
00261 if (vehicle->weapons.weapon[W].maxdistance > 99 ) {
00262 weaponsinglecoste += (vehicle->weapons.weapon[W].maxdistance-90)*220;
00263 weaponsinglecostm += (vehicle->weapons.weapon[W].maxdistance-90)*200;
00264 }
00265
00266 if (vehicle->weapons.weapon[W].maxdistance > 129 ) {
00267 weaponsinglecoste += (vehicle->weapons.weapon[W].maxdistance-120)*250;
00268 weaponsinglecostm += (vehicle->weapons.weapon[W].maxdistance-120)*250;
00269 }
00270
00271 int weaponspecial = 0;
00272 int weaponRF = vehicle->weapons.weapon[W].reactionFireShots*weaponsinglecostm/10;
00273 int weaponMAM = maxmoverange*weaponsinglecostm/500;
00274 int weaponNAAM = weaponsinglecostm/4;
00275 int weaponMDRF = vehicle->weapons.weapon[W].reactionFireShots*weaponsinglecostm*maxmoverange/400;
00276
00277 if ( vehicle->weapons.weapon[W].shootable() ) {
00278 if ( vehicle->hasFunction( ContainerBaseType::MoveWithReactionFire ) ) {
00279 if ( vehicle->wait ) {
00280 if ( vehicle->hasFunction( ContainerBaseType::MoveAfterAttack ) ) {
00281 weaponspecial += weaponMDRF+weaponMAM-weaponNAAM;
00282 } else {
00283 weaponspecial += weaponMDRF-weaponNAAM;
00284 }
00285 } else {
00286 if ( vehicle->hasFunction( ContainerBaseType::MoveAfterAttack ) ) {
00287 weaponspecial += weaponMDRF+weaponMAM;
00288 } else {
00289 weaponspecial += weaponMDRF;
00290 }
00291 }
00292 } else {
00293 if ( vehicle->wait ) {
00294 if ( vehicle->hasFunction( ContainerBaseType::MoveAfterAttack ) ) {
00295 weaponspecial += weaponRF+weaponMAM-weaponNAAM;
00296 } else {
00297 weaponspecial += weaponRF-weaponNAAM;
00298 }
00299 } else {
00300 if ( vehicle->hasFunction( ContainerBaseType::MoveAfterAttack ) ) {
00301 weaponspecial += weaponRF+weaponMAM;
00302 } else {
00303 weaponspecial += weaponRF;
00304 }
00305 }
00306 }
00307 }
00308
00309 weaponcoste += weaponsinglecoste + weaponspecial ;
00310 weaponcostm += weaponsinglecostm + weaponspecial ;
00311 }
00312 }
00313
00314
00315
00316
00317 if ( vehicle->jamming > 0 && vehicle->hasFunction( ContainerBaseType::JamsOnlyOwnField ) ) {
00318 if (vehicle->jamming < 31 ) {
00319 typecoste += vehicle->jamming*20;
00320 typecostm += vehicle->jamming*10;
00321 } else {
00322 typecoste += vehicle->jamming*60;
00323 typecostm += vehicle->jamming*50;
00324 }
00325 } else {
00326 specialcoste += vehicle->jamming*200;
00327 specialcostm += vehicle->jamming*150;
00328
00329 specialcostm += vehicle->jamming*vehicle->armor/10;
00330
00331 if (maxmoverange > 70 ) {
00332 specialcostm += vehicle->jamming*(maxmoverange-70);
00333 }
00334 if (maxmoverange > 120 ) {
00335 specialcostm += vehicle->jamming*(maxmoverange-120);
00336 }
00337 if (maxmoverange > 170 ) {
00338 specialcostm += vehicle->jamming*(maxmoverange-170);
00339 }
00340 if (maxmoverange > 200 ) {
00341 specialcostm += vehicle->jamming*(maxmoverange-200);
00342 }
00343 }
00344
00345
00346 if ( vehicle->hasFunction( ContainerBaseType::ConstructBuildings )) {
00347 specialcoste += 1000;
00348 specialcostm += 500;
00349 }
00350 if ( vehicle->hasFunction( ContainerBaseType::InternalVehicleProduction ) || vehicle->hasFunction( ContainerBaseType::ExternalVehicleProduction )) {
00351 specialcoste += 1000;
00352 specialcostm += 500;
00353 }
00354 if ( vehicle->objectsBuildable.size() > 0 ||vehicle-> objectGroupsBuildable.size() > 0 ) {
00355 specialcoste += 1000;
00356 specialcostm += 500;
00357 }
00358
00359 if ( vehicle->hasFunction( ContainerBaseType::DetectsMineralResources )) {
00360 specialcoste += vehicle->digrange*150;
00361 specialcostm += vehicle->digrange*100;
00362 }
00363
00364 if ( vehicle->hasFunction( ContainerBaseType::MatterConverter) ) {
00365 specialcoste += 1000;
00366 specialcostm += 500;
00367 }
00368
00369 if ( vehicle->hasFunction( ContainerBaseType::Paratrooper ) ) {
00370 specialcoste += vehicle->armor*2 ;
00371 specialcostm += vehicle->armor ;
00372 }
00373
00374 if ( vehicle->hasFunction(ContainerBaseType::InternalUnitRepair) || vehicle->hasFunction(ContainerBaseType::ExternalRepair) ) {
00375 specialcoste += 1000;
00376 specialcostm += 500;
00377 }
00378
00379 if ( vehicle->hasFunction( ContainerBaseType::AutoRepair ) ) {
00380 specialcoste += vehicle->autorepairrate*vehicle->armor / 15;
00381 specialcostm += vehicle->autorepairrate*vehicle->armor / 15;
00382 }
00383
00384 if ( vehicle->view > 40 ) {
00385 specialcoste += (vehicle->view-40)*90;
00386 specialcostm += (vehicle->view-40)*75;
00387 specialcoste += maxmoverange*(vehicle->view-40)/3;
00388 specialcostm += maxmoverange*(vehicle->view-40)/5;
00389 }
00390
00391 if ( vehicle->hasFunction( ContainerBaseType::SatelliteView ) ) {
00392 specialcoste += vehicle->view*20;
00393 specialcostm += vehicle->view*8;
00394 }
00395
00396 if ( vehicle->hasFunction(ContainerBaseType::Sonar) && (vehicle->movemalustyp == MoveMalusType::trooper) ) {
00397 specialcoste += vehicle->view*10;
00398 specialcostm += vehicle->view*4;
00399 } else {
00400 if ( vehicle->hasFunction(ContainerBaseType::Sonar)) {
00401 specialcoste += vehicle->view*20;
00402 specialcostm += vehicle->view*10;
00403 }
00404 }
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422 if ( vehicle->jumpDrive.height ) {
00423 int distance = vehicle->jumpDrive.maxDistance;
00424 if ( distance > 1000 )
00425 distance = 1000;
00426 if ( vehicle->hasFunction( ContainerBaseType::MoveWithReactionFire ) && (maxmoverange < 30)) {
00427 specialcoste += distance * 14;
00428 specialcostm += distance * 12;
00429 } else {
00430 specialcoste += distance * 7;
00431 specialcostm += distance * 5;
00432 }
00433 }
00434
00435
00436 res.energy += typecoste + weaponcoste + specialcoste;
00437 res.material += typecostm + weaponcostm + specialcostm;
00438
00439
00440
00441 if ( vehicle->hasFunction( ContainerBaseType::NoInairRefuelling )) {
00442 res.energy -= typecoste/6;
00443 res.material -= typecostm/6;
00444 }
00445
00446
00447 if ( vehicle->hasFunction( ContainerBaseType::KamikazeOnly )) {
00448 res.energy -= (typecoste+weaponcoste)/2;
00449 res.material -= (typecostm+weaponcostm)/2;
00450 }
00451
00452
00453 if (maxmoverange < 20 ) {
00454 res.energy -= typecoste/4;
00455 res.material -= typecostm/4;
00456 }
00457
00458
00459 if (maxmoverange < 10 ) {
00460 res.energy -= typecoste/4;
00461 res.material -= typecostm/4;
00462 }
00463
00464
00465 return res;
00466 }