Сделан и отлажен инкремент зон травления и цинкования.
This commit is contained in:
89
utils.c
89
utils.c
@@ -44,25 +44,24 @@ short get_first_night_zone() {
|
||||
}
|
||||
|
||||
|
||||
// TODO обновить метод для работы с двумя роботами
|
||||
// вернет можно ли ехать и главное куда ехать, если можно (нельзя если вернулось значение < 0)
|
||||
// -1 вернет что перемещать нельзя
|
||||
short can_move(struct barrel *bar, char robot_id) {
|
||||
if (robot_id != 1 && robot_id != 2) {
|
||||
return -1;
|
||||
return -3;
|
||||
}
|
||||
|
||||
// сразу отсекаем варианты, при которых невозможно переместить барабан
|
||||
if (!bar->flags.is_exist) {
|
||||
return -1;
|
||||
return -3;
|
||||
}
|
||||
|
||||
if (bar->software_timer > 0) {
|
||||
return -1;
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (bar->flags.robot != 0) {
|
||||
return -2;
|
||||
return -3;
|
||||
}
|
||||
|
||||
// проверка ночного режима
|
||||
@@ -70,8 +69,6 @@ short can_move(struct barrel *bar, char robot_id) {
|
||||
if (bar->flags.is_night && !bar->flags.is_empty) {
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
// дальше нужно проверить, что можно передвигать бочку
|
||||
@@ -705,3 +702,81 @@ void create_operation(struct robot_code *code, short barrel_id, const short star
|
||||
#endif
|
||||
code->PC = 0;
|
||||
}
|
||||
|
||||
char increment_zone(short zone) {
|
||||
if (zone == ROBOT_ZONE_ETCH) {
|
||||
if ((hla_disabled_zones & DISABLED_ETCH) == DISABLED_ETCH) {
|
||||
etching_zone = -1;
|
||||
return 0;
|
||||
} else {
|
||||
if ((hla_disabled_zones & DISABLED_ETCH) == 0) {
|
||||
// если обе зоны активны
|
||||
if (etching_zone < 0) {
|
||||
etching_zone = 0;
|
||||
} else {
|
||||
if (etching_zone == 0) {
|
||||
etching_zone = 1;
|
||||
} else {
|
||||
etching_zone = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// если только одна зона
|
||||
if (hla_disabled_zones & DISABLED_ETCH_1) {
|
||||
etching_zone = 1;
|
||||
} else {
|
||||
etching_zone = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
} else if (zone == ROBOT_ZONE_GAL) {
|
||||
// с зонами цинкования все несколько сложнее...
|
||||
// сначала надо посчитать кол-во включенных зон
|
||||
short enabled_zones = 0;
|
||||
for (short z = DISABLED_GAL_1; z & DISABLED_GAL; z <<= 1) {
|
||||
if ((hla_disabled_zones & z) == 0) {
|
||||
enabled_zones++;
|
||||
}
|
||||
}
|
||||
|
||||
if (enabled_zones == 0) {
|
||||
// таких зон нет...
|
||||
galvanizing_zone = -1;
|
||||
return 0;
|
||||
} else if (enabled_zones == 1) {
|
||||
// зона одна, ее только найти надо и установить
|
||||
for (short z = 0; z < 8; z++) {
|
||||
if ((hla_disabled_zones & (DISABLED_GAL_1 << z)) == 0) {
|
||||
galvanizing_zone = z;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// зон несколько, поэтому берем текущую, пробегаемся по битам и ищем другую
|
||||
// всего может быть 7 зон, куда мы еще посмотрим
|
||||
short bit_id = galvanizing_zone + 1;
|
||||
if (galvanizing_zone < 0) {
|
||||
bit_id = 0;
|
||||
}
|
||||
for (short i = 0; i < 7 + (galvanizing_zone < 0 ? 1 : 0); i++) {
|
||||
if (bit_id >= 8) {
|
||||
bit_id = 0;
|
||||
}
|
||||
if ((hla_disabled_zones & (DISABLED_GAL_1 << bit_id)) == 0) {
|
||||
// свободная зона
|
||||
galvanizing_zone = bit_id;
|
||||
break;
|
||||
}
|
||||
|
||||
bit_id++;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
} else {
|
||||
// неверный аргумент
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user