Пример. Создание кода нового ДМВПС ДТ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