133 lines
No EOL
3.2 KiB
C
133 lines
No EOL
3.2 KiB
C
/*----------------------------------------------------------
|
|
* HTBLA-Leonding
|
|
* ---------------------------------------------------------
|
|
* Author: Marc Tismonar
|
|
* ----------------------------------------------------------
|
|
* Description:
|
|
* Implementation of car.h.
|
|
* ----------------------------------------------------------
|
|
*/
|
|
#include "car.h"
|
|
|
|
struct CarData {
|
|
CarType type;
|
|
Color color;
|
|
double fill_level;
|
|
double acceleration_rate;
|
|
double speed;
|
|
};
|
|
|
|
static struct CarData aixam = {AIXAM, RED, 16.0, 0.0, -1};
|
|
static struct CarData fiat_multipla_green = {FIAT_MULTIPLA, GREEN, 65.0, 0.0, -1};
|
|
static struct CarData fiat_multipla_blue = {FIAT_MULTIPLA, BLUE, 65.0, 0.0, -1};
|
|
static struct CarData fiat_multipla_orange = {FIAT_MULTIPLA, ORANGE, 65.0, 0.0, -1};
|
|
static struct CarData jeep_silver = {JEEP, SILVER, 80.0, 0.0, -1};
|
|
static struct CarData jeep_black = {JEEP, BLACK, 80.0, 0.0, -1};
|
|
|
|
// Create a local array car_park to store all cars
|
|
static struct CarData* car_park[] = {
|
|
&aixam,
|
|
&fiat_multipla_green,
|
|
&fiat_multipla_blue,
|
|
&fiat_multipla_orange,
|
|
&jeep_silver,
|
|
&jeep_black
|
|
};
|
|
|
|
#define TOTAL_CARS (sizeof(car_park) / sizeof(car_park[0]))
|
|
|
|
|
|
Car get_car(CarType carType) {
|
|
for (int i = 0; i < TOTAL_CARS; i++) {
|
|
if (car_park[i]->type == carType && car_park[i]->speed == -1) {
|
|
car_park[i]->speed = 0;
|
|
return car_park[i];
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
CarType get_type(Car car) {
|
|
return car->type;
|
|
}
|
|
|
|
Color get_color(Car car) {
|
|
return car->color;
|
|
}
|
|
|
|
double get_fill_level(Car car) {
|
|
return car->fill_level;
|
|
}
|
|
|
|
double get_acceleration_rate(Car car) {
|
|
return car->acceleration_rate;
|
|
}
|
|
|
|
int get_speed(Car car) {
|
|
if (car->speed - (int)car->speed >= 0.5) {
|
|
return (int)car->speed + 1;
|
|
}
|
|
return (int)car->speed;
|
|
}
|
|
|
|
void set_acceleration_rate(Car car, double acceleration_rate) {
|
|
double max_accel;
|
|
double min_accel = -8.0;
|
|
|
|
switch (get_type(car)) {
|
|
case AIXAM:
|
|
max_accel = 1.0;
|
|
break;
|
|
case FIAT_MULTIPLA:
|
|
max_accel = 2.26;
|
|
break;
|
|
case JEEP:
|
|
max_accel = 3.14;
|
|
break;
|
|
default:
|
|
max_accel = 0.0;
|
|
break;
|
|
}
|
|
|
|
if (acceleration_rate > max_accel) {
|
|
car->acceleration_rate = max_accel;
|
|
} else if (acceleration_rate < min_accel) {
|
|
car->acceleration_rate = min_accel;
|
|
} else {
|
|
car->acceleration_rate = acceleration_rate;
|
|
}
|
|
}
|
|
|
|
void accelerate(Car car) {
|
|
if (car->speed == -1) {
|
|
return;
|
|
}
|
|
double max_speed;
|
|
switch(get_type(car)) {
|
|
case AIXAM:
|
|
max_speed = 45;
|
|
break;
|
|
case FIAT_MULTIPLA:
|
|
max_speed = 170;
|
|
break;
|
|
case JEEP:
|
|
max_speed = 196;
|
|
break;
|
|
default:
|
|
max_speed = 0;
|
|
break;
|
|
}
|
|
double calc_speed = car->speed + car->acceleration_rate * 3.6061946903;
|
|
if (calc_speed >= max_speed) {
|
|
car->speed = max_speed;
|
|
return;
|
|
}
|
|
car->speed = calc_speed;
|
|
}
|
|
|
|
void init() {
|
|
for (int i = 0; i < TOTAL_CARS; i++) {
|
|
car_park[i]->speed = -1;
|
|
car_park[i]->acceleration_rate = 0.0;
|
|
}
|
|
} |