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); |
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 } |