Пример. Создание кода нового ДМВПС ДТ1 - George-VB/xussrset GitHub Wiki
Определение спрайтов графики
Определение спрайтов графики головного вагона
#define IMAGEFILE "src/dmu/dt1_h.png"
purchase_sprites(dt1_h, 0, 0)
MU_head_middle_sprites(13, dt1_h_v1_mu, 32, 40)
MU_head_middle_sprites(13, dt1_h_v2_mu, 32, 308)
#undef IMAGEFILE
Определение спрайтов графики прицепного моторного вагона
#define IMAGEFILE "src/dmu/dt1_m.png"
purchase_sprites(dt1_mp, 0, 0)
EMU_motor1_middle_sprites(13, dt1_mp_v1_mu, 32, 40)
EMU_motor1_middle_sprites(13, dt1_mp_v2_mu, 32, 308)
#undef IMAGEFILE
Определение спрайтов графики прицепного вагона
#define IMAGEFILE "src/dmu/dt1_c.png"
purchase_sprites(dt1_c, 0, 0)
MU_car_sprites(13, dt1_c_v1_mu, 32, 40)
MU_car_sprites(13, dt1_c_v2_mu, 32, 308)
#undef IMAGEFILE
Определение кода графики
Определение кода графики головного вагона
MU_head_middle_direction_template(dt1_h_v1, dt1_h)
MU_head_middle_direction_template(dt1_h_v2, dt1_h)
switch (FEAT_TRAINS, SELF, dt1_h_sprites_left, cargo_subtype) // будут доступны 2 ливреи- заводская и РЖД
{ 0: dt1_h_v1_sprites_left;
LV_RZD_PID: dt1_h_v2_sprites_left;
align_13_sprites; }
switch (FEAT_TRAINS, SELF, dt1_h_sprites_right, cargo_subtype)
{ 0: dt1_h_v1_sprites_right;
LV_RZD_PID: dt1_h_v2_sprites_right;
align_13_sprites; }
engine_direction_template3m2(dt1_h, dt1_mp, dt1_c, )
long_vehicle(dt1_h)
Определение кода графики прицепного моторного вагона
DEMU_motor_direction_template_DC(dt1_mp_v1, dt1_h)
DEMU_motor_direction_template_DC(dt1_mp_v2, dt1_h)
switch (FEAT_TRAINS, SELF, dt1_mp_direction_left, cargo_subtype) // будут доступны 2 ливреи- заводская и РЖД
{ 0: dt1_mp_v1_direction_left;
LV_RZD_PID: dt1_mp_v2_direction_left;
align_13_sprites; }
switch (FEAT_TRAINS, SELF, dt1_mp_direction_right, cargo_subtype)
{ 0: dt1_mp_v1_direction_right;
LV_RZD_PID: dt1_mp_v2_direction_right;
align_13_sprites; }
EMU_direction_calculation_template_s(dt1_mp, dt1_h, )
long_vehicle_dir(dt1_mp)
Определение кода графики прицепного вагона
EMU_motor_direction_template(dt1_c_v1, dt1_h)
EMU_motor_direction_template(dt1_c_v2, dt1_h)
switch (FEAT_TRAINS, SELF, dt1_c_direction_left, cargo_subtype) // будут доступны 2 ливреи- заводская и РЖД
{ 0: dt1_c_v1_direction_left;
LV_RZD_PID: dt1_c_v2_direction_left;
align_13_sprites; }
switch (FEAT_TRAINS, SELF, dt1_c_direction_right, cargo_subtype)
{ 0: dt1_c_v1_direction_right;
LV_RZD_PID: dt1_c_v2_direction_right;
align_13_sprites; }
EMU_direction_calculation_template_s(dt1_c, dt1_h, )
long_vehicle_dir(dt1_c)
Определение кода сборки поезда (какие вагоны к чему можно присоединять)
Блок конечных вариантов выбора
Допускается присоединение только вагона указанного типа(ов)
switch (FEAT_TRAINS, SELF, dt1_can_attach_wagon_head, vehicle_type_id)
{ dt1_h: return CB_RESULT_ATTACH_ALLOW;
return string(STR_CAN_ATTACH_HEAD_ONLY); }
switch (FEAT_TRAINS, SELF, dt1_can_attach_wagon_mc, vehicle_type_id)
{ dt1_mp: return CB_RESULT_ATTACH_ALLOW;
dt1_c: return CB_RESULT_ATTACH_ALLOW;
return string(STR_CAN_ATTACH_OTHERCAR_ONLY); }
switch (FEAT_TRAINS, SELF, dt1_can_attach_wagon_m, vehicle_type_id)
{ dt1_mp: return CB_RESULT_ATTACH_ALLOW;
return string(STR_CAN_ATTACH_MCARP_ONLY); }
switch (FEAT_TRAINS, SELF, dt1_can_attach_wagon_ch, vehicle_type_id)
{ dt1_c: return CB_RESULT_ATTACH_ALLOW;
dt1_h: return CB_RESULT_ATTACH_ALLOW;
return string(STR_CAN_ATTACH_OTHERCAR_ONLY); }
Блок проверки ранее присоединённых вагонов
switch (FEAT_TRAINS, PARENT, dt1_can_attach_wagon4_c,
[ set_offset_to(num_vehs_in_consist-4), prev_vehicle_type_id() ])
{ dt1_mp: dt1_can_attach_wagon_head;
dt1_h: dt1_can_attach_wagon_m;
return string(STR_CAN_ATTACH_SAME_MU_ONLY); }
switch (FEAT_TRAINS, PARENT, dt1_can_attach_wagon3_m,
[ set_offset_to(num_vehs_in_consist-4), prev_vehicle_type_id() ])
{ dt1_c: dt1_can_attach_wagon_head;
dt1_h: dt1_can_attach_wagon_ch;
return string(STR_CAN_ATTACH_SAME_MU_ONLY); }
switch (FEAT_TRAINS, PARENT, dt1_can_attach_wagon2,
[ set_offset_to(num_vehs_in_consist-2), prev_vehicle_type_id() ])
{ dt1_c: dt1_can_attach_wagon4_c;
dt1_mp: dt1_can_attach_wagon3_m;
dt1_h: dt1_can_attach_wagon_mc;
return string(STR_CAN_ATTACH_SAME_MU_ONLY); }
Блок выбора по количеству уже присоединённых головных вагонов.
0 вагонов - ошибка, головной должен быть первый, 4 и более - перебор. 1 и 3 - дальнейшие проверки. 2 - нужна третья голова.
switch (FEAT_TRAINS, PARENT, dt1_can_attach_wagon1, count_veh_id(dt1_h))
{ 0: return string(STR_CAN_ATTACH_HEAD_ONLY);
1: dt1_can_attach_wagon2;
2: dt1_can_attach_wagon_head;
3: dt1_can_attach_wagon2;
return string(STR_CAN_ATTACH_NO_AFTER_REAR_HEAD); }
Отсечение ПС других типов
switch (FEAT_TRAINS, SELF, dt1_can_attach_wagon, vehicle_type_id)
{ dt1_h: dt1_can_attach_wagon1;
dt1_mp: dt1_can_attach_wagon1;
dt1_c: dt1_can_attach_wagon1;
return string(STR_CAN_ATTACH_SAME_MU_ONLY); }
Определение кода выпуска поезда из депо
Какие вагоны к чему можно присоединять. Только если количество головных вагонов 2 или 4.
switch (FEAT_TRAINS, PARENT, dt1_h_start_stop, count_veh_id(dt1_h))
{ 2: return CB_RESULT_NO_TEXT;
4: return CB_RESULT_NO_TEXT;
return string(STR_START_STOP_NUMBER_OF_HEAD_CAR_MUST_BE_EVEN); }
Определение визуальных эффектов - искр и выхлопа дизеля
engine_diesel_1r_effect(dt1_h_create_effect_sprites, 0, 5, 12)
engine_direction_template3m2(dt1_h, dt1_mp, dt1_c, _create_effect)
is_ERD_ds(dt1_h_create_effect_DC, return 0, dt1_h_create_effect_sprites_start)
engine_effects_MU(dt1_h, _create_effect_DC, dt1_h)
engine_electric1r_1_effect(dt1_mp_create_effect_direction, -2, 7)
EMU_direction_calculation_template_s(dt1_mp, dt1_h, _create_effect)
is_ERD_ds(dt1_mp_create_effect_DC, dt1_mp_create_effect_direction_template, return 0)
engine_effects_MU(dt1_mp, _create_effect_DC, dt1_h)
Определение характеристик ПС - мощности, вместимости, скорости
engine_power_MU(dt1_mp, 1108, dt1_h)
engine_capacity_MU(dt1_h, 76, dt1_h)
engine_capacity_MU(dt1_mp, 73, dt1_h)
engine_capacity_MU(dt1_c, 145, dt1_h)
engine_speed(dt1, 120)
Определение списка доступных ливрей
livery_template_FP(dt1)
Определение стоимости обслуживания
Определение стоимости обслуживания головного вагона
Варианты под током и от дизеля
RC_head_check_new(dt1_h, dt1_h)
switch (FEAT_TRAINS, SELF, dt1_h_running_cost_factor_DC,
[ STORE_TEMP(0, 0), // Моторы
STORE_TEMP(11, 1), // Бригада
STORE_TEMP(28, 2), // Износ
STORE_TEMP(0, 3), // Сопровождение
STORE_TEMP(20, 4), // ТО
STORE_TEMP(1, 5), // Сертификация
STORE_TEMP(120, 6), // Скорость
STORE_TEMP(58, 7), // Тара
STORE_TEMP(LOAD_TEMP(7) + 5, 8)]) // Максимальная масса
{ dt1_h_check_running_cost_factor; } // 141
switch (FEAT_TRAINS, SELF, dt1_h_running_cost_factor_D,
[ STORE_TEMP(80, 0), // Моторы
STORE_TEMP(11, 1), // Бригада
STORE_TEMP(28, 2), // Износ
STORE_TEMP(0, 3), // Сопровождение
STORE_TEMP(20, 4), // ТО
STORE_TEMP(1, 5), // Сертификация
STORE_TEMP(120, 6), // Скорость
STORE_TEMP(58, 7), // Тара
STORE_TEMP(LOAD_TEMP(7) + 5, 8)]) // Максимальная масса
{ dt1_h_check_running_cost_factor; } // 141
is_ERD_ds(dt1_h_running_cost_factor, dt1_h_running_cost_factor_DC, dt1_h_running_cost_factor_D)
Определение стоимости обслуживания прицепного моторного вагона
Варианты под током и от дизеля
RC_head_check_new(dt1_mp, dt1_h)
switch (FEAT_TRAINS, SELF, dt1_mp_running_cost_factor_DC,
[ STORE_TEMP(55, 0), // Моторы
STORE_TEMP(0, 1), // Бригада
STORE_TEMP(19, 2), // Износ
STORE_TEMP(0, 3), // Сопровождение
STORE_TEMP(14, 4), // ТО
STORE_TEMP(1, 5), // Сертификация
STORE_TEMP(120, 6), // Скорость
STORE_TEMP(66, 7), // Тара
STORE_TEMP(LOAD_TEMP(7) + 5, 8)]) // Максимальная масса
{ dt1_mp_check_running_cost_factor; } // 97
switch (FEAT_TRAINS, SELF, dt1_mp_running_cost_factor_D,
[ STORE_TEMP(0, 0), // Моторы
STORE_TEMP(0, 1), // Бригада
STORE_TEMP(19, 2), // Износ
STORE_TEMP(0, 3), // Сопровождение
STORE_TEMP(14, 4), // ТО
STORE_TEMP(1, 5), // Сертификация
STORE_TEMP(120, 6), // Скорость
STORE_TEMP(66, 7), // Тара
STORE_TEMP(LOAD_TEMP(7) + 5, 8)]) // Максимальная масса
{ dt1_mp_check_running_cost_factor; } // 97
is_ERD_ds(dt1_mp_running_cost_factor, dt1_mp_running_cost_factor_DC, dt1_mp_running_cost_factor_D)
Определение стоимости обслуживания прицепного вагона
RC_head_check_new(dt1_c, dt1_h)
switch (FEAT_TRAINS, SELF, dt1_c_running_cost_factor,
[ STORE_TEMP(0, 0), // Моторы
STORE_TEMP(0, 1), // Бригада
STORE_TEMP(18, 2), // Износ
STORE_TEMP(0, 3), // Сопровождение
STORE_TEMP(13, 4), // ТО
STORE_TEMP(1, 5), // Сертификация
STORE_TEMP(120, 6), // Скорость
STORE_TEMP(39, 7), // Тара
STORE_TEMP(LOAD_TEMP(7) + 9, 8)]) // Максимальная масса
{ dt1_c_check_running_cost_factor; } // 91
Определение подсказок в меню
hint_MU(dt1_h,
calc_loading(76 / (2 * WIDERST_D_DOOR)),
STR_PURCHASE_HINT_AGING_PERIOD_1_1,
STR_PURCHASE_HINT_ENGINE_TYPE_DEMU_H_E,
STR_SECTIONS_DEMU_DT1,
2008, 2013,
string(STR_PURCHASE_HINT_FACTORY_TORZHOK_CW))
hint_MU(dt1_mp,
calc_loading(73 / (2 * WIDERST_D_DOOR)),
STR_PURCHASE_HINT_AGING_PERIOD_1_1,
STR_PURCHASE_HINT_ENGINE_TYPE_DEMU_MP,
STR_SECTIONS_DEMU_DT1,
2008, 2013,
string(STR_PURCHASE_HINT_FACTORY_TORZHOK_CW))
hint_MU(dt1_c,
calc_loading(145 / (2 * WIDERST_D_DOOR)),
STR_PURCHASE_HINT_AGING_PERIOD_1_1,
STR_PURCHASE_HINT_ENGINE_TYPE_DEMU_C,
STR_SECTIONS_DEMU_DT1,
2008, 2013,
string(STR_PURCHASE_HINT_FACTORY_TORZHOK_CW))
Определение ПС
Доступные для использования id можно посмотреть в файле IDs_usage
Определение головного вагона
item (FEAT_TRAINS, dt1_h, 741) {
property {
name: string(STR_NAME_DT1);
vehicle_dates(2008, 2013, 25, 10, 8, 19)
vehicle_dmu_c(58, 76, 2 * WIDERST_D_DOOR) }
graphics {
default: dt1_h_sprites;
purchase: dt1_h_purchase_sprites;
cargo_age_period: return 60;
running_cost_factor: dt1_h_running_cost_factor;
articulated_part: articulated_part_dummy5;
can_attach_wagon: dt1_can_attach_wagon;
start_stop: dt1_h_start_stop;
power: return 0;
speed: dt1_speed;
cargo_capacity: dt1_h_cargo_capacity;
cargo_subtype_text: dt1_cargo_subtype_text;
create_effect: dt1_h_create_effect;
colour_mapping: any_cc_colour;
purchase_speed: return 120;
additional_text: dt1_h_additional_text; } }
Определение прицепного моторного вагона
item (FEAT_TRAINS, dt1_mp, 742) {
property {
name: string(STR_NAME_DT1);
vehicle_dates(2008, 2013, 25, 10, 8, 25)
vehicle_dmu(1108, 66, 70.0, 73, 2 * WIDERST_D_DOOR) }
graphics {
default: dt1_mp_sprites;
purchase: dt1_mp_purchase_sprites;
cargo_age_period: return 60;
running_cost_factor: dt1_mp_running_cost_factor;
articulated_part: articulated_part_dummy5;
can_attach_wagon: dt1_can_attach_wagon;
start_stop: return string(STR_START_STOP_HEAD_REQUIRED);
power: dt1_mp_power;
speed: dt1_speed;
cargo_capacity: dt1_mp_cargo_capacity;
cargo_subtype_text: dt1_cargo_subtype_text;
create_effect: dt1_mp_create_effect;
colour_mapping: any_cc_colour;
purchase_speed: return 120;
additional_text: dt1_mp_additional_text; } }
Определение прицепного вагона
item (FEAT_TRAINS, dt1_c, 743) {
property {
name: string(STR_NAME_DT1);
vehicle_dates(2008, 2013, 25, 10, 8, 7)
vehicle_dmu_c(39, 145, 2 * WIDERST_D_DOOR) }
graphics {
default: dt1_c_sprites;
purchase: dt1_c_purchase_sprites;
cargo_age_period: return 60;
running_cost_factor: dt1_c_running_cost_factor;
articulated_part: articulated_part_dummy5;
can_attach_wagon: dt1_can_attach_wagon;
start_stop: return string(STR_START_STOP_HEAD_REQUIRED);
power: return 0;
speed: dt1_speed;
cargo_capacity: dt1_c_cargo_capacity;
cargo_subtype_text: dt1_cargo_subtype_text;
colour_mapping: any_cc_colour;
purchase_speed: return 120;
additional_text: dt1_c_additional_text; } }
Указание длинных имён
long_name_template(dt1_h, STR_LONGNAME_DT1_H)
long_name_template(dt1_mp, STR_LONGNAME_DT1_MP)
long_name_template(dt1_c, STR_LONGNAME_DT1_C)
Указание сокрытия из меню при недоступности ДМВПС
allow_dmu(dt1_h)
allow_dmu(dt1_mp)
allow_dmu(dt1_c)
Итоговый результат - dt1.pnml