|
|
|
@ -73,44 +73,44 @@ namespace gui { |
|
|
|
|
state(State::END); |
|
|
|
|
return; // done
|
|
|
|
|
case FU::MOVE_FORWARD: |
|
|
|
|
$camera.plan_run($rayview, 1); |
|
|
|
|
state(State::MOVING); |
|
|
|
|
try_move(1, false); |
|
|
|
|
break; |
|
|
|
|
case FU::MOVE_BACK: |
|
|
|
|
$camera.plan_run($rayview, -1); |
|
|
|
|
state(State::MOVING); |
|
|
|
|
try_move(-1, false); |
|
|
|
|
break; |
|
|
|
|
case FU::MOVE_LEFT: |
|
|
|
|
$camera.plan_strafe($rayview, 1); |
|
|
|
|
state(State::MOVING); |
|
|
|
|
try_move(1, true); |
|
|
|
|
break; |
|
|
|
|
case FU::MOVE_RIGHT: |
|
|
|
|
$camera.plan_strafe($rayview, -1); |
|
|
|
|
state(State::MOVING); |
|
|
|
|
try_move(-1, true); |
|
|
|
|
break; |
|
|
|
|
case FU::ROTATE_LEFT: |
|
|
|
|
$camera.plan_rotate($rayview, 1); |
|
|
|
|
state(State::ROTATING); |
|
|
|
|
return; // get out early since can always rotate
|
|
|
|
|
break; |
|
|
|
|
case FU::ROTATE_RIGHT: |
|
|
|
|
$camera.plan_rotate($rayview, -1); |
|
|
|
|
state(State::ROTATING); |
|
|
|
|
return; // get out early since can always rotate
|
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
dbc::sentinel("unhandled event in IDLE"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FSM::try_move(int dir, bool strafe) { |
|
|
|
|
// prevent moving into occupied space
|
|
|
|
|
if(!can_move({size_t($camera.targetX), size_t($camera.targetY)})) { |
|
|
|
|
$camera.plan_move($rayview, dir, strafe); |
|
|
|
|
|
|
|
|
|
Point move_to{size_t($camera.targetX), size_t($camera.targetY)}; |
|
|
|
|
|
|
|
|
|
if(level.map->can_move(move_to) && !level.collision->occupied(move_to)) { |
|
|
|
|
state(State::MOVING); |
|
|
|
|
} else { |
|
|
|
|
state(State::IDLE); |
|
|
|
|
$camera.abort_plan($rayview); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FSM::can_move(Point move_to) { |
|
|
|
|
return level.map->can_move(move_to) && !level.collision->occupied(move_to); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FSM::END(Event ev) { |
|
|
|
|
fmt::println("END: received event after done: {}", int(ev)); |
|
|
|
|
} |
|
|
|
|