src/engine.cpp
branchgamebalance
changeset 9895 7bd07f43b0e3
parent 6535 1a5437f36d78
child 9909 dce9a6923bb7
equal deleted inserted replaced
9894:70d78ac95d6c 9895:7bd07f43b0e3
    32 };
    32 };
    33 
    33 
    34 
    34 
    35 void ShowEnginePreviewWindow(EngineID engine);
    35 void ShowEnginePreviewWindow(EngineID engine);
    36 
    36 
    37 void DeleteCustomEngineNames(void)
    37 void DeleteCustomEngineNames()
    38 {
    38 {
    39 	uint i;
    39 	uint i;
    40 	StringID old;
    40 	StringID old;
    41 
    41 
    42 	for (i = 0; i != TOTAL_NUM_ENGINES; i++) {
    42 	for (i = 0; i != TOTAL_NUM_ENGINES; i++) {
    46 	}
    46 	}
    47 
    47 
    48 	_vehicle_design_names &= ~1;
    48 	_vehicle_design_names &= ~1;
    49 }
    49 }
    50 
    50 
    51 void LoadCustomEngineNames(void)
    51 void LoadCustomEngineNames()
    52 {
    52 {
    53 	/* XXX: not done */
    53 	/* XXX: not done */
    54 	DEBUG(misc, 1, "LoadCustomEngineNames: not done");
    54 	DEBUG(misc, 1, "LoadCustomEngineNames: not done");
    55 }
    55 }
    56 
    56 
    57 static void SetupEngineNames(void)
    57 static void SetupEngineNames()
    58 {
    58 {
    59 	StringID *name;
    59 	StringID *name;
    60 
    60 
    61 	for (name = _engine_name_strings; name != endof(_engine_name_strings); name++)
    61 	for (name = _engine_name_strings; name != endof(_engine_name_strings); name++)
    62 		*name = STR_SV_EMPTY;
    62 		*name = STR_SV_EMPTY;
    90 	}
    90 	}
    91 	InvalidateWindowClasses(WC_BUILD_VEHICLE); // Update to show the new reliability
    91 	InvalidateWindowClasses(WC_BUILD_VEHICLE); // Update to show the new reliability
    92 	InvalidateWindowClasses(WC_REPLACE_VEHICLE);
    92 	InvalidateWindowClasses(WC_REPLACE_VEHICLE);
    93 }
    93 }
    94 
    94 
    95 void AddTypeToEngines(void)
    95 void AddTypeToEngines()
    96 {
    96 {
    97 	Engine* e = _engines;
    97 	Engine* e = _engines;
    98 
    98 
    99 	do e->type = VEH_Train;    while (++e < &_engines[ROAD_ENGINES_INDEX]);
    99 	do e->type = VEH_TRAIN;    while (++e < &_engines[ROAD_ENGINES_INDEX]);
   100 	do e->type = VEH_Road;     while (++e < &_engines[SHIP_ENGINES_INDEX]);
   100 	do e->type = VEH_ROAD;     while (++e < &_engines[SHIP_ENGINES_INDEX]);
   101 	do e->type = VEH_Ship;     while (++e < &_engines[AIRCRAFT_ENGINES_INDEX]);
   101 	do e->type = VEH_SHIP;     while (++e < &_engines[AIRCRAFT_ENGINES_INDEX]);
   102 	do e->type = VEH_Aircraft; while (++e < &_engines[TOTAL_NUM_ENGINES]);
   102 	do e->type = VEH_AIRCRAFT; while (++e < &_engines[TOTAL_NUM_ENGINES]);
   103 }
   103 }
   104 
   104 
   105 void StartupEngines(void)
   105 void StartupEngines()
   106 {
   106 {
   107 	Engine *e;
   107 	Engine *e;
   108 	const EngineInfo *ei;
   108 	const EngineInfo *ei;
   109 	/* Aging of vehicles stops, so account for that when starting late */
   109 	/* Aging of vehicles stops, so account for that when starting late */
   110 	const Date aging_date = min(_date, ConvertYMDToDate(YEAR_ENGINE_AGING_STOPS, 0, 1));
   110 	const Date aging_date = min(_date, ConvertYMDToDate(YEAR_ENGINE_AGING_STOPS, 0, 1));
   167 static void AcceptEnginePreview(EngineID eid, PlayerID player)
   167 static void AcceptEnginePreview(EngineID eid, PlayerID player)
   168 {
   168 {
   169 	Engine *e = GetEngine(eid);
   169 	Engine *e = GetEngine(eid);
   170 
   170 
   171 	SETBIT(e->player_avail, player);
   171 	SETBIT(e->player_avail, player);
   172 	if (e->type == VEH_Train) {
   172 	if (e->type == VEH_TRAIN) {
   173 		const RailVehicleInfo *rvi = RailVehInfo(eid);
   173 		const RailVehicleInfo *rvi = RailVehInfo(eid);
   174 		Player *p = GetPlayer(player);
   174 		Player *p = GetPlayer(player);
   175 
   175 
   176 		assert(rvi->railtype < RAILTYPE_END);
   176 		assert(rvi->railtype < RAILTYPE_END);
   177 		SETBIT(p->avail_railtypes, rvi->railtype);
   177 		SETBIT(p->avail_railtypes, rvi->railtype);
   207 	} while (pp--, pp != 0);
   207 	} while (pp--, pp != 0);
   208 
   208 
   209 	return best_player;
   209 	return best_player;
   210 }
   210 }
   211 
   211 
   212 void EnginesDailyLoop(void)
   212 void EnginesDailyLoop()
   213 {
   213 {
   214 	EngineID i;
   214 	EngineID i;
   215 
   215 
   216 	if (_cur_year >= YEAR_ENGINE_AGING_STOPS) return;
   216 	if (_cur_year >= YEAR_ENGINE_AGING_STOPS) return;
   217 
   217 
   287 
   287 
   288 			/* We assume the user did NOT build it.. prove me wrong ;) */
   288 			/* We assume the user did NOT build it.. prove me wrong ;) */
   289 			p->block_preview = 20;
   289 			p->block_preview = 20;
   290 
   290 
   291 			FOR_ALL_VEHICLES(v) {
   291 			FOR_ALL_VEHICLES(v) {
   292 				if (v->type == VEH_Train || v->type == VEH_Road || v->type == VEH_Ship ||
   292 				if (v->type == VEH_TRAIN || v->type == VEH_ROAD || v->type == VEH_SHIP ||
   293 						(v->type == VEH_Aircraft && IsNormalAircraft(v))) {
   293 						(v->type == VEH_AIRCRAFT && IsNormalAircraft(v))) {
   294 					if (v->owner == p->index && v->engine_type == index) {
   294 					if (v->owner == p->index && v->engine_type == index) {
   295 						/* The user did prove me wrong, so restore old value */
   295 						/* The user did prove me wrong, so restore old value */
   296 						p->block_preview = block_preview;
   296 						p->block_preview = block_preview;
   297 						break;
   297 						break;
   298 					}
   298 					}
   319 		}
   319 		}
   320 	}
   320 	}
   321 	AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL), 0, 0);
   321 	AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL), 0, 0);
   322 }
   322 }
   323 
   323 
   324 void EnginesMonthlyLoop(void)
   324 void EnginesMonthlyLoop()
   325 {
   325 {
   326 	Engine *e;
   326 	Engine *e;
   327 
   327 
   328 	if (_cur_year < YEAR_ENGINE_AGING_STOPS) {
   328 	if (_cur_year < YEAR_ENGINE_AGING_STOPS) {
   329 		for (e = _engines; e != endof(_engines); e++) {
   329 		for (e = _engines; e != endof(_engines); e++) {
   421 		er->from = INVALID_ENGINE;
   421 		er->from = INVALID_ENGINE;
   422 	}
   422 	}
   423 }
   423 }
   424 
   424 
   425 
   425 
   426 static EngineRenew *AllocateEngineRenew(void)
   426 static EngineRenew *AllocateEngineRenew()
   427 {
   427 {
   428 	EngineRenew *er;
   428 	EngineRenew *er;
   429 
   429 
   430 	/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
   430 	/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
   431 	 *  TODO - This is just a temporary stage, this will be removed. */
   431 	 *  TODO - This is just a temporary stage, this will be removed. */
   536 	SLE_REF(EngineRenew, next, REF_ENGINE_RENEWS),
   536 	SLE_REF(EngineRenew, next, REF_ENGINE_RENEWS),
   537 
   537 
   538 	SLE_END()
   538 	SLE_END()
   539 };
   539 };
   540 
   540 
   541 static void Save_ERNW(void)
   541 static void Save_ERNW()
   542 {
   542 {
   543 	EngineRenew *er;
   543 	EngineRenew *er;
   544 
   544 
   545 	FOR_ALL_ENGINE_RENEWS(er) {
   545 	FOR_ALL_ENGINE_RENEWS(er) {
   546 		SlSetArrayIndex(er->index);
   546 		SlSetArrayIndex(er->index);
   547 		SlObject(er, _engine_renew_desc);
   547 		SlObject(er, _engine_renew_desc);
   548 	}
   548 	}
   549 }
   549 }
   550 
   550 
   551 static void Load_ERNW(void)
   551 static void Load_ERNW()
   552 {
   552 {
   553 	int index;
   553 	int index;
   554 
   554 
   555 	while ((index = SlIterateArray()) != -1) {
   555 	while ((index = SlIterateArray()) != -1) {
   556 		EngineRenew *er;
   556 		EngineRenew *er;
   588 	SLE_CONDNULL(16, 2, SL_MAX_VERSION),
   588 	SLE_CONDNULL(16, 2, SL_MAX_VERSION),
   589 
   589 
   590 	SLE_END()
   590 	SLE_END()
   591 };
   591 };
   592 
   592 
   593 static void Save_ENGN(void)
   593 static void Save_ENGN()
   594 {
   594 {
   595 	uint i;
   595 	uint i;
   596 
   596 
   597 	for (i = 0; i != lengthof(_engines); i++) {
   597 	for (i = 0; i != lengthof(_engines); i++) {
   598 		SlSetArrayIndex(i);
   598 		SlSetArrayIndex(i);
   599 		SlObject(&_engines[i], _engine_desc);
   599 		SlObject(&_engines[i], _engine_desc);
   600 	}
   600 	}
   601 }
   601 }
   602 
   602 
   603 static void Load_ENGN(void)
   603 static void Load_ENGN()
   604 {
   604 {
   605 	int index;
   605 	int index;
   606 	while ((index = SlIterateArray()) != -1) {
   606 	while ((index = SlIterateArray()) != -1) {
   607 		SlObject(GetEngine(index), _engine_desc);
   607 		SlObject(GetEngine(index), _engine_desc);
   608 	}
   608 	}
   609 }
   609 }
   610 
   610 
   611 static void LoadSave_ENGS(void)
   611 static void LoadSave_ENGS()
   612 {
   612 {
   613 	SlArray(_engine_name_strings, lengthof(_engine_name_strings), SLE_STRINGID);
   613 	SlArray(_engine_name_strings, lengthof(_engine_name_strings), SLE_STRINGID);
   614 }
   614 }
   615 
   615 
   616 extern const ChunkHandler _engine_chunk_handlers[] = {
   616 extern const ChunkHandler _engine_chunk_handlers[] = {
   617 	{ 'ENGN', Save_ENGN,     Load_ENGN,     CH_ARRAY          },
   617 	{ 'ENGN', Save_ENGN,     Load_ENGN,     CH_ARRAY          },
   618 	{ 'ENGS', LoadSave_ENGS, LoadSave_ENGS, CH_RIFF           },
   618 	{ 'ENGS', LoadSave_ENGS, LoadSave_ENGS, CH_RIFF           },
   619 	{ 'ERNW', Save_ERNW,     Load_ERNW,     CH_ARRAY | CH_LAST},
   619 	{ 'ERNW', Save_ERNW,     Load_ERNW,     CH_ARRAY | CH_LAST},
   620 };
   620 };
   621 
   621 
   622 void InitializeEngines(void)
   622 void InitializeEngines()
   623 {
   623 {
   624 	/* Clean the engine renew pool and create 1 block in it */
   624 	/* Clean the engine renew pool and create 1 block in it */
   625 	CleanPool(&_EngineRenew_pool);
   625 	CleanPool(&_EngineRenew_pool);
   626 	AddBlockToPool(&_EngineRenew_pool);
   626 	AddBlockToPool(&_EngineRenew_pool);
   627 }
   627 }