roadveh_cmd.c
changeset 374 0309a855fc66
parent 337 cbe0c766c947
child 378 3f1eef0eb2c0
equal deleted inserted replaced
373:9eda1aad5f04 374:0309a855fc66
    21 	0xDCC, 0xDD4, 0xDE4, 0xDDC, 0xDEC, 0xDC4, 0xDDC, 0xDE4,
    21 	0xDCC, 0xDD4, 0xDE4, 0xDDC, 0xDEC, 0xDC4, 0xDDC, 0xDE4,
    22 	0xE2C, 0xE34, 0xE3C, 0xC14, 0xC1C, 0xC2C, 0xC3C, 0xC4C,
    22 	0xE2C, 0xE34, 0xE3C, 0xC14, 0xC1C, 0xC2C, 0xC3C, 0xC4C,
    23 	0xC5C, 0xC64, 0xC6C, 0xC74, 0xC84, 0xC94, 0xCA4
    23 	0xC5C, 0xC64, 0xC6C, 0xC74, 0xC84, 0xC94, 0xCA4
    24 };
    24 };
    25 
    25 
    26 
       
    27 static const uint16 _roadveh_full_adder[63] = {
    26 static const uint16 _roadveh_full_adder[63] = {
    28     0,  88,   0,   0,   0,   0,  48,  48,
    27     0,  88,   0,   0,   0,   0,  48,  48,
    29    48,  48,   0,   0,  64,  64,   0,  16,
    28    48,  48,   0,   0,  64,  64,   0,  16,
    30    16,   0,  88,   0,   0,   0,   0,  48,
    29    16,   0,  88,   0,   0,   0,   0,  48,
    31    48,  48,  48,   0,   0,  64,  64,   0,
    30    48,  48,  48,   0,   0,  64,  64,   0,
    33    48,  48,  48,  48,   0,   0,  64,  64,
    32    48,  48,  48,  48,   0,   0,  64,  64,
    34     0,  16,  16,   0,   8,   8,   8,   8,
    33     0,  16,  16,   0,   8,   8,   8,   8,
    35     0,   0,   0,   8,   8,   8,   8
    34     0,   0,   0,   8,   8,   8,   8
    36 };
    35 };
    37 
    36 
    38 static const byte _roadveh_spritenum[88] = {
       
    39 	0, 17, 17, 34, 51, 51, 51, 1,
       
    40 	18, 35, 2, 19, 36, 57, 57, 57,
       
    41 	3, 20, 37, 4, 21, 38, 5, 22,
       
    42 
       
    43 	39, 6, 23, 40, 7, 24, 41, 8,
       
    44 	25, 42, 9, 26, 43, 10, 27, 44,
       
    45 	11, 28, 45, 12, 29, 46, 13, 30,
       
    46 	47, 14, 31, 48, 15, 32, 49, 16,
       
    47 
       
    48 	33, 50, 52, 52, 52, 53, 53, 53,
       
    49 	54, 54, 54, 55, 55, 55, 56, 56,
       
    50 	56, 58, 58, 58, 59, 59, 59, 60,
       
    51 	60, 60, 61, 61, 61, 62, 62, 62,
       
    52 };
       
    53 
       
    54 const byte _roadveh_speed[88] = {
       
    55 	 112, 176, 224, 255, 112, 192, 240,  96,
       
    56 	 176, 224,  96, 176, 224,  96, 176, 224,
       
    57 	  96, 176, 224,  96, 176, 224,  96, 176,
       
    58 	 224,  96, 176, 224,  96, 176, 224,  96,
       
    59 	 176, 224,  96, 176, 224,  96, 176, 224,
       
    60 	  96, 176, 224,  96, 176, 224,  96, 176,
       
    61 	 224,  96, 176, 224,  96, 176, 224,  96,
       
    62 	 176, 224,  96, 176, 224,  96, 176, 224,
       
    63 	  96, 176, 224,  96, 176, 224,  96, 176,
       
    64 	 224,  96, 176, 224,  96, 176, 224,  96,
       
    65 	 176, 224,  96, 176, 224,  96, 176, 224,
       
    66 };
       
    67 
       
    68 
       
    69 const byte _roadveh_runningcost[88] = {
       
    70 	  91, 128, 178, 240,  91, 171, 240,  90,
       
    71 	 168, 240,  90, 168, 240,  90, 168, 240,
       
    72 	  90, 168, 240,  90, 168, 240,  90, 168,
       
    73 	 240,  90, 168, 240,  90, 168, 240,  90,
       
    74 	 168, 240,  90, 168, 240,  90, 168, 240,
       
    75 	  90, 168, 240,  90, 168, 240,  90, 168,
       
    76 	 240,  90, 168, 240,  90, 168, 240,  90,
       
    77 	 168, 240,  90, 168, 240,  90, 168, 240,
       
    78 	  90, 168, 240,  90, 168, 240,  90, 168,
       
    79 	 240,  90, 168, 240,  90, 168, 240,  90,
       
    80 	 168, 240,  90, 168, 240,  90, 168, 240,
       
    81 };
       
    82 
       
    83 
       
    84 const byte _roadveh_capacity[88] = {
       
    85 	31,  35,  37,  40,  30,  35,  38,  20,
       
    86 	25,  28,  22,  28,  30,  22,  28,  30,
       
    87 	21,  25,  27,  14,  16,  18,  14,  16,
       
    88 	18,  20,  25,  30,  20,  22,  24,  22,
       
    89 	25,  27,  15,  18,  20,  12,  15,  16,
       
    90 	17,  20,  22,  15,  18,  20,  22,  25,
       
    91 	27,  21,  25,  27,  18,  20,  23,  17,
       
    92 	19,  22,  17,  19,  22,  17,  19,  22,
       
    93 	17,  19,  22,  17,  19,  22,  17,  19,
       
    94 	22,  17,  19,  22,  17,  19,  22,  17,
       
    95 	19,  22,  17,  19,  22,  17,  19,  22,
       
    96 };
       
    97 
       
    98 const byte _roadveh_cargo_type[88] = {
       
    99 	 0, 0, 0, 0, 0, 0, 0, 1,
       
   100 	 1, 1, 2, 2, 2, 2, 2, 2,
       
   101 	 3, 3, 3, 4, 4, 4, 5, 5,
       
   102 	 5, 6, 6, 6, 7, 7, 7, 8,
       
   103 	 8, 8, 9, 9, 9,10,10,10,
       
   104 	11,11,11, 9, 9, 9, 8, 8,
       
   105 	 8, 9, 9, 9, 4, 4, 4, 1,
       
   106 	 1, 1, 1, 1, 1, 7, 7, 7,
       
   107 	 8, 8, 8, 6, 6, 6, 3, 3,
       
   108 	 3, 5, 5, 5, 4, 4, 4,11,
       
   109 	11,11,10,10,10, 9, 9, 9,
       
   110 };
       
   111 
       
   112 const byte _roadveh_price[88] = {
       
   113 	120,140,150,160,120,140,160,108,
       
   114 	128,138,115,135,145,115,135,145,
       
   115 	110,140,150,105,130,140,107,130,
       
   116 	140,114,133,143,118,137,147,121,
       
   117 	140,150,112,135,145,145,170,180,
       
   118 	112,134,144,112,135,145,121,140,
       
   119 	150,111,141,151,118,148,158,117,
       
   120 	147,157,117,147,157,117,147,157,
       
   121 	117,147,157,117,147,157,117,147,
       
   122 	157,117,147,157,117,147,157,117,
       
   123 	147,157,117,147,157,117,147,157,
       
   124 };
       
   125 
       
   126 static const byte _road_engine_sounds[88] = {
       
   127 	23, 26, 25, 25, 60, 62, 60, 23,
       
   128 	23, 23, 23, 23, 23, 62, 60, 62,
       
   129 	23, 23, 23, 23, 23, 23, 23, 23,
       
   130 	23, 23, 23, 23, 23, 23, 23, 23,
       
   131 	23, 23, 23, 23, 23, 23, 23, 23,
       
   132 	23, 23, 23, 23, 23, 23, 23, 23,
       
   133 	23, 23, 23, 23, 23, 23, 23, 23,
       
   134 	23, 23, 63, 64, 63, 64, 63, 64,
       
   135 	63, 64, 63, 64, 63, 64, 63, 64,
       
   136 	63, 64, 63, 64, 63, 64, 63, 64,
       
   137 	63, 64, 63, 64, 63, 64, 63, 64,
       
   138 };
       
   139 
    37 
   140 static const uint16 _road_veh_fp_ax_or[4] = {
    38 static const uint16 _road_veh_fp_ax_or[4] = {
   141 	0x100,0x200,1,2,
    39 	0x100,0x200,1,2,
   142 };
    40 };
   143 
    41 
   172 	return image;
    70 	return image;
   173 }
    71 }
   174 
    72 
   175 void DrawRoadVehEngine(int x, int y, int engine, uint32 image_ormod)
    73 void DrawRoadVehEngine(int x, int y, int engine, uint32 image_ormod)
   176 {
    74 {
   177 	DrawSprite((6 + _roadveh_images[_roadveh_spritenum[engine - ROAD_ENGINES_INDEX]]) | image_ormod, x, y);
    75 	DrawSprite((6 + _roadveh_images[road_vehicle_info(engine)->image_index]) | image_ormod, x, y);
   178 }
    76 }
   179 
    77 
   180 void DrawRoadVehEngineInfo(int engine, int x, int y, int maxw)
    78 void DrawRoadVehEngineInfo(int engine, int x, int y, int maxw)
   181 {
    79 {
   182 	engine -= ROAD_ENGINES_INDEX;
    80 	SET_DPARAM32(0, ((_price.roadveh_base >> 3) * road_vehicle_info(engine)->base_cost) >> 5);
   183 
    81 	SET_DPARAM16(1, road_vehicle_info(engine)->max_speed * 10 >> 5);
   184 	SET_DPARAM32(0, ((_price.roadveh_base >> 3) * _roadveh_price[engine]) >> 5);
    82 	SET_DPARAM32(2, road_vehicle_info(engine)->running_cost * _price.roadveh_running >> 8);
   185 	SET_DPARAM16(1, _roadveh_speed[engine] * 10 >> 5);
    83 
   186 	SET_DPARAM32(2, _roadveh_runningcost[engine] * _price.roadveh_running >> 8);
    84 	SET_DPARAM16(4, road_vehicle_info(engine)->capacity);
   187 
    85 	SET_DPARAM16(3, _cargoc.names_long_p[road_vehicle_info(engine)->cargo_type]);
   188 	SET_DPARAM16(4, _roadveh_capacity[engine]);
       
   189 	SET_DPARAM16(3, _cargoc.names_long_p[_roadveh_cargo_type[engine]]);
       
   190 
    86 
   191 	DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw);
    87 	DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw);
   192 }
    88 }
   193 
    89 
   194 static int32 EstimateRoadVehCost(byte engine_type)
    90 static int32 EstimateRoadVehCost(byte engine_type)
   195 {
    91 {
   196 	return ((_price.roadveh_base >> 3) * _roadveh_price[engine_type - ROAD_ENGINES_INDEX]) >> 5;
    92 	return ((_price.roadveh_base >> 3) * road_vehicle_info(engine_type)->base_cost) >> 5;
   197 }
    93 }
   198 
    94 
   199 int32 CmdBuildRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
    95 int32 CmdBuildRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
   200 {
    96 {
   201 	int32 cost;
    97 	int32 cost;
   233 		v->z_height = 6;
   129 		v->z_height = 6;
   234 
   130 
   235 		v->u.road.state = 254;
   131 		v->u.road.state = 254;
   236 		v->vehstatus = VS_HIDDEN|VS_STOPPED|VS_DEFPAL;
   132 		v->vehstatus = VS_HIDDEN|VS_STOPPED|VS_DEFPAL;
   237 
   133 
   238 		v->spritenum = _roadveh_spritenum[p1 - ROAD_ENGINES_INDEX];
   134 		v->spritenum = road_vehicle_info(p1)->image_index;
   239 		v->cargo_type = _roadveh_cargo_type[p1 - ROAD_ENGINES_INDEX];
   135 		v->cargo_type = road_vehicle_info(p1)->cargo_type;
   240 		v->cargo_cap = _roadveh_capacity[p1 - ROAD_ENGINES_INDEX];
   136 		v->cargo_cap = road_vehicle_info(p1)->capacity;
   241 //		v->cargo_count = 0;
   137 //		v->cargo_count = 0;
   242 		v->value = cost;
   138 		v->value = cost;
   243 //		v->day_counter = 0;
   139 //		v->day_counter = 0;
   244 //		v->next_order_param = v->next_order = 0;
   140 //		v->next_order_param = v->next_order = 0;
   245 //		v->load_unload_time_rem = 0;
   141 //		v->load_unload_time_rem = 0;
   247 
   143 
   248 //	v->u.road.unk2 = 0;
   144 //	v->u.road.unk2 = 0;
   249 //	v->u.road.overtaking = 0;
   145 //	v->u.road.overtaking = 0;
   250 
   146 
   251 		v->last_station_visited = 0xFF;
   147 		v->last_station_visited = 0xFF;
   252 		v->max_speed = _roadveh_speed[p1 - ROAD_ENGINES_INDEX];
   148 		v->max_speed = road_vehicle_info(p1)->max_speed;
   253 		v->engine_type = (byte)p1;
   149 		v->engine_type = (byte)p1;
   254 
   150 
   255 		e = &_engines[p1];
   151 		e = &_engines[p1];
   256 		v->reliability = e->reliability;
   152 		v->reliability = e->reliability;
   257 		v->reliability_spd_dec = e->reliability_spd_dec;
   153 		v->reliability_spd_dec = e->reliability_spd_dec;
   723 	InvalidateVehicleOrderWidget(v);
   619 	InvalidateVehicleOrderWidget(v);
   724 }
   620 }
   725 
   621 
   726 static void StartRoadVehSound(Vehicle *v)
   622 static void StartRoadVehSound(Vehicle *v)
   727 {
   623 {
   728 	int s = _road_engine_sounds[v->engine_type - ROAD_ENGINES_INDEX];
   624 	int s = road_vehicle_info(v->engine_type)->sfx;
   729 	if (s == 23 && (v->tick_counter&3) == 0) s++;
   625 	if (s == 23 && (v->tick_counter&3) == 0) s++;
   730 	SndPlayVehicleFx(s, v);
   626 	SndPlayVehicleFx(s, v);
   731 }
   627 }
   732 
   628 
   733 typedef struct RoadVehFindData {
   629 typedef struct RoadVehFindData {
  1567 	}
  1463 	}
  1568 
  1464 
  1569 	if (v->vehstatus & VS_STOPPED)
  1465 	if (v->vehstatus & VS_STOPPED)
  1570 		return;
  1466 		return;
  1571 
  1467 
  1572 	cost = _roadveh_runningcost[v->engine_type - ROAD_ENGINES_INDEX] * _price.roadveh_running / 364;
  1468 	cost = road_vehicle_info(v->engine_type)->running_cost * _price.roadveh_running / 364;
  1573 
  1469 
  1574 	v->profit_this_year -= cost >> 8;
  1470 	v->profit_this_year -= cost >> 8;
  1575 
  1471 
  1576 	SET_EXPENSES_TYPE(EXPENSES_ROADVEH_RUN);
  1472 	SET_EXPENSES_TYPE(EXPENSES_ROADVEH_RUN);
  1577 	SubtractMoneyFromPlayerFract(v->owner, cost);
  1473 	SubtractMoneyFromPlayerFract(v->owner, cost);