branch | noai |
changeset 9624 | b71483f2330f |
parent 9620 | 31e38d28a0af |
child 9625 | 3301b1b3889c |
9623:ee0173281563 | 9624:b71483f2330f |
---|---|
25 #include "vehicle_gui.h" |
25 #include "vehicle_gui.h" |
26 #include "newgrf_engine.h" |
26 #include "newgrf_engine.h" |
27 #include "date.h" |
27 #include "date.h" |
28 #include "strings.h" |
28 #include "strings.h" |
29 #include "cargotype.h" |
29 #include "cargotype.h" |
30 #include "group.h" |
|
30 |
31 |
31 |
32 |
32 enum BuildVehicleWidgets { |
33 enum BuildVehicleWidgets { |
33 BUILD_VEHICLE_WIDGET_CLOSEBOX = 0, |
34 BUILD_VEHICLE_WIDGET_CLOSEBOX = 0, |
34 BUILD_VEHICLE_WIDGET_CAPTION, |
35 BUILD_VEHICLE_WIDGET_CAPTION, |
384 y += 10; |
385 y += 10; |
385 |
386 |
386 /* Wagon weight - (including cargo) */ |
387 /* Wagon weight - (including cargo) */ |
387 uint weight = GetEngineProperty(engine_number, 0x16, rvi->weight); |
388 uint weight = GetEngineProperty(engine_number, 0x16, rvi->weight); |
388 SetDParam(0, weight); |
389 SetDParam(0, weight); |
389 SetDParam(1, (GetCargo(rvi->cargo_type)->weight * rvi->capacity >> 4) + weight); |
390 SetDParam(1, (GetCargo(rvi->cargo_type)->weight * GetEngineProperty(engine_number, 0x14, rvi->capacity) >> 4) + weight); |
390 DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0); |
391 DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0); |
391 y += 10; |
392 y += 10; |
392 |
393 |
393 /* Wagon speed limit, displayed if above zero */ |
394 /* Wagon speed limit, displayed if above zero */ |
394 if (_patches.wagon_speed_limits) { |
395 if (_patches.wagon_speed_limits) { |
459 DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0); |
460 DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0); |
460 y += 10; |
461 y += 10; |
461 |
462 |
462 /* Cargo type + capacity */ |
463 /* Cargo type + capacity */ |
463 SetDParam(0, rvi->cargo_type); |
464 SetDParam(0, rvi->cargo_type); |
464 SetDParam(1, rvi->capacity); |
465 SetDParam(1, GetEngineProperty(engine_number, 0x0F, rvi->capacity)); |
465 SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY); |
466 SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY); |
466 DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0); |
467 DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0); |
467 y += 10; |
468 y += 10; |
468 |
469 |
469 return y; |
470 return y; |
478 DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0); |
479 DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0); |
479 y += 10; |
480 y += 10; |
480 |
481 |
481 /* Cargo type + capacity */ |
482 /* Cargo type + capacity */ |
482 SetDParam(0, svi->cargo_type); |
483 SetDParam(0, svi->cargo_type); |
483 SetDParam(1, svi->capacity); |
484 SetDParam(1, GetEngineProperty(engine_number, 0x0D, svi->capacity)); |
484 SetDParam(2, svi->refittable ? STR_9842_REFITTABLE : STR_EMPTY); |
485 SetDParam(2, svi->refittable ? STR_9842_REFITTABLE : STR_EMPTY); |
485 DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0); |
486 DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0); |
486 y += 10; |
487 y += 10; |
487 |
488 |
488 /* Running cost */ |
489 /* Running cost */ |
541 YearMonthDay ymd; |
542 YearMonthDay ymd; |
542 ConvertDateToYMD(e->intro_date, &ymd); |
543 ConvertDateToYMD(e->intro_date, &ymd); |
543 bool refitable = false; |
544 bool refitable = false; |
544 |
545 |
545 switch (e->type) { |
546 switch (e->type) { |
547 default: NOT_REACHED(); |
|
546 case VEH_TRAIN: { |
548 case VEH_TRAIN: { |
547 const RailVehicleInfo *rvi = RailVehInfo(engine_number); |
549 const RailVehicleInfo *rvi = RailVehInfo(engine_number); |
548 |
550 uint capacity = GetEngineProperty(engine_number, 0x14, rvi->capacity); |
549 refitable = (EngInfo(engine_number)->refit_mask != 0) && (rvi->capacity > 0); |
551 |
552 refitable = (EngInfo(engine_number)->refit_mask != 0) && (capacity > 0); |
|
550 |
553 |
551 if (rvi->railveh_type == RAILVEH_WAGON) { |
554 if (rvi->railveh_type == RAILVEH_WAGON) { |
552 y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi); |
555 y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi); |
553 } else { |
556 } else { |
554 y = DrawRailEnginePurchaseInfo(x, y, engine_number, rvi); |
557 y = DrawRailEnginePurchaseInfo(x, y, engine_number, rvi); |
560 SetDParam(2, STR_EMPTY); |
563 SetDParam(2, STR_EMPTY); |
561 } else { |
564 } else { |
562 int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0); |
565 int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0); |
563 |
566 |
564 SetDParam(0, rvi->cargo_type); |
567 SetDParam(0, rvi->cargo_type); |
565 SetDParam(1, (rvi->capacity * (CountArticulatedParts(engine_number) + 1)) << multihead); |
568 SetDParam(1, (capacity * (CountArticulatedParts(engine_number) + 1)) << multihead); |
566 SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY); |
569 SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY); |
567 } |
570 } |
568 DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0); |
571 DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0); |
569 y += 10; |
572 y += 10; |
570 } |
573 } |
717 static void GenerateBuildList(Window *w) |
720 static void GenerateBuildList(Window *w) |
718 { |
721 { |
719 buildvehicle_d *bv = &WP(w, buildvehicle_d); |
722 buildvehicle_d *bv = &WP(w, buildvehicle_d); |
720 |
723 |
721 switch (bv->vehicle_type) { |
724 switch (bv->vehicle_type) { |
725 default: NOT_REACHED(); |
|
722 case VEH_TRAIN: |
726 case VEH_TRAIN: |
723 GenerateBuildTrainList(w); |
727 GenerateBuildTrainList(w); |
724 return; // trains should not reach the last sorting |
728 return; // trains should not reach the last sorting |
725 case VEH_ROAD: |
729 case VEH_ROAD: |
726 GenerateBuildRoadVehList(w); |
730 GenerateBuildRoadVehList(w); |
754 * @param min where to start in the list |
758 * @param min where to start in the list |
755 * @param max where in the list to end |
759 * @param max where in the list to end |
756 * @param selected_id what engine to highlight as selected, if any |
760 * @param selected_id what engine to highlight as selected, if any |
757 * @param show_count Display the number of vehicles (used by autoreplace) |
761 * @param show_count Display the number of vehicles (used by autoreplace) |
758 */ |
762 */ |
759 void DrawEngineList(byte type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count) |
763 void DrawEngineList(VehicleType type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group) |
760 { |
764 { |
761 byte step_size = GetVehicleListHeight(type); |
765 byte step_size = GetVehicleListHeight(type); |
762 byte x_offset = 0; |
766 byte x_offset = 0; |
763 byte y_offset = 0; |
767 byte y_offset = 0; |
764 Player *p = GetPlayer(_local_player); |
768 Player *p = GetPlayer(_local_player); |
790 default: NOT_REACHED(); |
794 default: NOT_REACHED(); |
791 } |
795 } |
792 |
796 |
793 for (; min < max; min++, y += step_size) { |
797 for (; min < max; min++, y += step_size) { |
794 const EngineID engine = eng_list[min]; |
798 const EngineID engine = eng_list[min]; |
799 const uint num_engines = IsDefaultGroupID(selected_group) ? p->num_engines[engine] : GetGroup(selected_group)->num_engines[engine]; |
|
795 |
800 |
796 DrawString(x + x_offset, y, GetCustomEngineName(engine), engine == selected_id ? 0xC : 0x10); |
801 DrawString(x + x_offset, y, GetCustomEngineName(engine), engine == selected_id ? 0xC : 0x10); |
797 DrawVehicleEngine(type, x, y + y_offset, engine, (show_count && p->num_engines[engine] == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_player)); |
802 DrawVehicleEngine(type, x, y + y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_player)); |
798 if (show_count) { |
803 if (show_count) { |
799 SetDParam(0, p->num_engines[engine]); |
804 SetDParam(0, num_engines); |
800 DrawStringRightAligned(213, y + (GetVehicleListHeight(type) == 14 ? 3 : 8), STR_TINY_BLACK, 0); |
805 DrawStringRightAligned(213, y + (GetVehicleListHeight(type) == 14 ? 3 : 8), STR_TINY_BLACK, 0); |
801 } |
806 } |
802 } |
807 } |
803 } |
808 } |
804 |
809 |
828 |
833 |
829 SetVScrollCount(w, EngList_Count(&bv->eng_list)); |
834 SetVScrollCount(w, EngList_Count(&bv->eng_list)); |
830 SetDParam(0, bv->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles |
835 SetDParam(0, bv->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles |
831 DrawWindowWidgets(w); |
836 DrawWindowWidgets(w); |
832 |
837 |
833 DrawEngineList(bv->vehicle_type, 2, 27, bv->eng_list, w->vscroll.pos, max, bv->sel_engine, false); |
838 DrawEngineList(bv->vehicle_type, 2, 27, bv->eng_list, w->vscroll.pos, max, bv->sel_engine, false, DEFAULT_GROUP); |
834 |
839 |
835 if (bv->sel_engine != INVALID_ENGINE) { |
840 if (bv->sel_engine != INVALID_ENGINE) { |
836 const Widget *wi = &w->widget[BUILD_VEHICLE_WIDGET_PANEL]; |
841 const Widget *wi = &w->widget[BUILD_VEHICLE_WIDGET_PANEL]; |
837 int text_end = DrawVehiclePurchaseInfo(2, wi->top + 1, wi->right - wi->left - 2, bv->sel_engine); |
842 int text_end = DrawVehiclePurchaseInfo(2, wi->top + 1, wi->right - wi->left - 2, bv->sel_engine); |
838 |
843 |
869 |
874 |
870 case BUILD_VEHICLE_WIDGET_BUILD: { |
875 case BUILD_VEHICLE_WIDGET_BUILD: { |
871 EngineID sel_eng = bv->sel_engine; |
876 EngineID sel_eng = bv->sel_engine; |
872 if (sel_eng != INVALID_ENGINE) { |
877 if (sel_eng != INVALID_ENGINE) { |
873 switch (bv->vehicle_type) { |
878 switch (bv->vehicle_type) { |
879 default: NOT_REACHED(); |
|
874 case VEH_TRAIN: |
880 case VEH_TRAIN: |
875 DoCommandP(w->window_number, sel_eng, 0, (RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) ? CcBuildWagon : CcBuildLoco, |
881 DoCommandP(w->window_number, sel_eng, 0, (RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) ? CcBuildWagon : CcBuildLoco, |
876 CMD_BUILD_RAIL_VEHICLE | CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE)); |
882 CMD_BUILD_RAIL_VEHICLE | CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE)); |
877 break; |
883 break; |
878 case VEH_ROAD: |
884 case VEH_ROAD: |
894 if (sel_eng != INVALID_ENGINE) { |
900 if (sel_eng != INVALID_ENGINE) { |
895 StringID str = STR_NULL; |
901 StringID str = STR_NULL; |
896 |
902 |
897 bv->rename_engine = sel_eng; |
903 bv->rename_engine = sel_eng; |
898 switch (bv->vehicle_type) { |
904 switch (bv->vehicle_type) { |
905 default: NOT_REACHED(); |
|
899 case VEH_TRAIN: str = STR_886A_RENAME_TRAIN_VEHICLE_TYPE; break; |
906 case VEH_TRAIN: str = STR_886A_RENAME_TRAIN_VEHICLE_TYPE; break; |
900 case VEH_ROAD: str = STR_9036_RENAME_ROAD_VEHICLE_TYPE; break; |
907 case VEH_ROAD: str = STR_9036_RENAME_ROAD_VEHICLE_TYPE; break; |
901 case VEH_SHIP: str = STR_9838_RENAME_SHIP_TYPE; break; |
908 case VEH_SHIP: str = STR_9838_RENAME_SHIP_TYPE; break; |
902 case VEH_AIRCRAFT: str = STR_A039_RENAME_AIRCRAFT_TYPE; break; |
909 case VEH_AIRCRAFT: str = STR_A039_RENAME_AIRCRAFT_TYPE; break; |
903 } |
910 } |
937 case WE_ON_EDIT_TEXT: { |
944 case WE_ON_EDIT_TEXT: { |
938 if (e->we.edittext.str[0] != '\0') { |
945 if (e->we.edittext.str[0] != '\0') { |
939 StringID str = STR_NULL; |
946 StringID str = STR_NULL; |
940 _cmd_text = e->we.edittext.str; |
947 _cmd_text = e->we.edittext.str; |
941 switch (bv->vehicle_type) { |
948 switch (bv->vehicle_type) { |
949 default: NOT_REACHED(); |
|
942 case VEH_TRAIN: str = STR_886B_CAN_T_RENAME_TRAIN_VEHICLE; break; |
950 case VEH_TRAIN: str = STR_886B_CAN_T_RENAME_TRAIN_VEHICLE; break; |
943 case VEH_ROAD: str = STR_9037_CAN_T_RENAME_ROAD_VEHICLE; break; |
951 case VEH_ROAD: str = STR_9037_CAN_T_RENAME_ROAD_VEHICLE; break; |
944 case VEH_SHIP: str = STR_9839_CAN_T_RENAME_SHIP_TYPE; break; |
952 case VEH_SHIP: str = STR_9839_CAN_T_RENAME_SHIP_TYPE; break; |
945 case VEH_AIRCRAFT: str = STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE; break; |
953 case VEH_AIRCRAFT: str = STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE; break; |
946 } |
954 } |
974 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, |
982 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, |
975 _build_vehicle_widgets, |
983 _build_vehicle_widgets, |
976 NewVehicleWndProc |
984 NewVehicleWndProc |
977 }; |
985 }; |
978 |
986 |
979 void ShowBuildVehicleWindow(TileIndex tile, byte type) |
987 void ShowBuildVehicleWindow(TileIndex tile, VehicleType type) |
980 { |
988 { |
981 buildvehicle_d *bv; |
989 buildvehicle_d *bv; |
982 Window *w; |
990 Window *w; |
983 |
991 |
984 assert(IsPlayerBuildableVehicleType(type)); |
992 assert(IsPlayerBuildableVehicleType(type)); |
1003 |
1011 |
1004 bv->sort_criteria = _last_sort_criteria[type]; |
1012 bv->sort_criteria = _last_sort_criteria[type]; |
1005 bv->descending_sort_order = _last_sort_order[type]; |
1013 bv->descending_sort_order = _last_sort_order[type]; |
1006 |
1014 |
1007 switch (type) { |
1015 switch (type) { |
1016 default: NOT_REACHED(); |
|
1008 case VEH_TRAIN: |
1017 case VEH_TRAIN: |
1009 WP(w, buildvehicle_d).filter.railtype = (tile == 0) ? RAILTYPE_END : GetRailType(tile); |
1018 WP(w, buildvehicle_d).filter.railtype = (tile == 0) ? RAILTYPE_END : GetRailType(tile); |
1010 ResizeWindow(w, 0, 16); |
1019 ResizeWindow(w, 0, 16); |
1011 break; |
1020 break; |
1012 case VEH_ROAD: |
1021 case VEH_ROAD: |