Combat is now unlocked.
This commit is contained in:
parent
3d8572117c
commit
2e0cc11555
5 changed files with 22 additions and 85 deletions
|
|
@ -85,8 +85,7 @@ void Autowalker::handle_window_events() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Autowalker::process_combat() {
|
void Autowalker::process_combat() {
|
||||||
while(fsm.in_state(gui::State::IN_COMBAT)
|
while(near_enemies() || fsm.in_state(gui::State::ATTACKING))
|
||||||
|| fsm.in_state(gui::State::ATTACKING))
|
|
||||||
{
|
{
|
||||||
if(fsm.in_state(gui::State::ATTACKING)) {
|
if(fsm.in_state(gui::State::ATTACKING)) {
|
||||||
send_event(game::Event::TICK);
|
send_event(game::Event::TICK);
|
||||||
|
|
@ -143,8 +142,7 @@ void Autowalker::rotate_player(Point target) {
|
||||||
|
|
||||||
send_event(dir);
|
send_event(dir);
|
||||||
|
|
||||||
while(fsm.in_state(gui::State::ROTATING) ||
|
while(fsm.in_state(gui::State::ROTATING))
|
||||||
fsm.in_state(gui::State::COMBAT_ROTATE))
|
|
||||||
{
|
{
|
||||||
send_event(game::Event::TICK);
|
send_event(game::Event::TICK);
|
||||||
}
|
}
|
||||||
|
|
@ -164,7 +162,7 @@ void Autowalker::update_state(ai::EntityAI& player_ai) {
|
||||||
player_ai.set_state("health_good", player_health_good());
|
player_ai.set_state("health_good", player_health_good());
|
||||||
|
|
||||||
player_ai.set_state("in_combat",
|
player_ai.set_state("in_combat",
|
||||||
fsm.in_state(gui::State::IN_COMBAT) ||
|
near_enemies() ||
|
||||||
fsm.in_state(gui::State::ATTACKING));
|
fsm.in_state(gui::State::ATTACKING));
|
||||||
|
|
||||||
auto inv = player_item_count();
|
auto inv = player_item_count();
|
||||||
|
|
@ -198,7 +196,7 @@ void Autowalker::handle_player_walk(ai::State& start, ai::State& goal) {
|
||||||
} else if(player_ai.wants_to("kill_enemy")) {
|
} else if(player_ai.wants_to("kill_enemy")) {
|
||||||
status(L"KILLING ENEMY");
|
status(L"KILLING ENEMY");
|
||||||
|
|
||||||
if(fsm.in_state(gui::State::IN_COMBAT)) {
|
if(near_enemies()) {
|
||||||
if(face_enemy()) {
|
if(face_enemy()) {
|
||||||
process_combat();
|
process_combat();
|
||||||
}
|
}
|
||||||
|
|
@ -459,3 +457,7 @@ void Autowalker::pickup_item() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Autowalker::near_enemies() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,4 +51,5 @@ struct Autowalker {
|
||||||
void pickup_item();
|
void pickup_item();
|
||||||
void pocket_potion(GameDB::Level &level);
|
void pocket_potion(GameDB::Level &level);
|
||||||
void click_inventory(const std::string& name, guecs::Modifiers mods);
|
void click_inventory(const std::string& name, guecs::Modifiers mods);
|
||||||
|
bool near_enemies();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,6 @@ namespace gui {
|
||||||
FSM_STATE(State, ATTACKING, ev, data);
|
FSM_STATE(State, ATTACKING, ev, data);
|
||||||
FSM_STATE(State, ROTATING, ev);
|
FSM_STATE(State, ROTATING, ev);
|
||||||
FSM_STATE(State, IDLE, ev, data);
|
FSM_STATE(State, IDLE, ev, data);
|
||||||
FSM_STATE(State, IN_COMBAT, ev);
|
|
||||||
FSM_STATE(State, COMBAT_ROTATE, ev);
|
|
||||||
FSM_STATE(State, CUT_SCENE_PLAYING, ev, data);
|
FSM_STATE(State, CUT_SCENE_PLAYING, ev, data);
|
||||||
FSM_STATE(State, BOSS_FIGHT, ev, data);
|
FSM_STATE(State, BOSS_FIGHT, ev, data);
|
||||||
FSM_STATE(State, LOOTING, ev, data);
|
FSM_STATE(State, LOOTING, ev, data);
|
||||||
|
|
@ -77,26 +75,11 @@ namespace gui {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::ATTACKING(Event ev, std::any data) {
|
void FSM::ATTACKING(Event ev, std::any data) {
|
||||||
using enum Event;
|
// if(!$main_ui.hands_playing()) {
|
||||||
switch(ev) {
|
// run combat one more time
|
||||||
case TICK: {
|
|
||||||
dbc::log("!!!!!! FIX System::combat(0) doesn't use any weapons, only first");
|
|
||||||
$systems.runCombat(0);
|
$systems.runCombat(0);
|
||||||
run_systems();
|
|
||||||
state(State::IN_COMBAT);
|
|
||||||
} break;
|
|
||||||
case COMBAT_STOP:
|
|
||||||
state(State::IDLE);
|
state(State::IDLE);
|
||||||
break;
|
// }
|
||||||
case ATTACK: {
|
|
||||||
int attack_id = std::any_cast<int>(data);
|
|
||||||
$systems.runCombat(attack_id);
|
|
||||||
run_systems();
|
|
||||||
} break;
|
|
||||||
default:
|
|
||||||
dbc::log($F("In ATTACKING state, unhandled event {}", (int)ev));
|
|
||||||
state(State::IDLE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::ROTATING(Event) {
|
void FSM::ROTATING(Event) {
|
||||||
|
|
@ -107,14 +90,6 @@ namespace gui {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::COMBAT_ROTATE(Event) {
|
|
||||||
if(auto aim = $main_ui.play_rotate()) {
|
|
||||||
auto& player_pos = GameDB::player_position();
|
|
||||||
player_pos.aiming_at = *aim;
|
|
||||||
state(State::IN_COMBAT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FSM::LOOTING(Event ev, std::any data) {
|
void FSM::LOOTING(Event ev, std::any data) {
|
||||||
using enum Event;
|
using enum Event;
|
||||||
|
|
||||||
|
|
@ -165,12 +140,14 @@ namespace gui {
|
||||||
$map_open = !$map_open;
|
$map_open = !$map_open;
|
||||||
break;
|
break;
|
||||||
case ATTACK:
|
case ATTACK:
|
||||||
|
$main_ui.play_hands();
|
||||||
|
$main_ui.dirty();
|
||||||
|
sound::play("sword_hit_1");
|
||||||
|
$systems.runCombat(0);
|
||||||
|
run_systems();
|
||||||
|
$status_ui.update();
|
||||||
state(State::ATTACKING);
|
state(State::ATTACKING);
|
||||||
break;
|
break;
|
||||||
case COMBAT_START:
|
|
||||||
$map_open = false;
|
|
||||||
state(State::IN_COMBAT);
|
|
||||||
break;
|
|
||||||
case CLOSE:
|
case CLOSE:
|
||||||
dbc::log("Nothing to close.");
|
dbc::log("Nothing to close.");
|
||||||
break;
|
break;
|
||||||
|
|
@ -228,46 +205,6 @@ namespace gui {
|
||||||
dbc::log("this should not run, it's handled in handle_boss_fight_events");
|
dbc::log("this should not run, it's handled in handle_boss_fight_events");
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::IN_COMBAT(Event ev) {
|
|
||||||
using enum Event;
|
|
||||||
|
|
||||||
switch(ev) {
|
|
||||||
case MOUSE_CLICK:
|
|
||||||
mouse_action(guecs::NO_MODS);
|
|
||||||
break;
|
|
||||||
case MOUSE_MOVE: {
|
|
||||||
mouse_action({1 << guecs::ModBit::hover});
|
|
||||||
} break;
|
|
||||||
case TICK:
|
|
||||||
run_systems();
|
|
||||||
break;
|
|
||||||
case ATTACK:
|
|
||||||
$main_ui.play_hands();
|
|
||||||
$main_ui.dirty();
|
|
||||||
sound::play("Sword_Hit_1");
|
|
||||||
state(State::ATTACKING);
|
|
||||||
break;
|
|
||||||
case ROTATE_LEFT:
|
|
||||||
$main_ui.plan_rotate(-1, DEFAULT_ROTATE);
|
|
||||||
state(State::COMBAT_ROTATE);
|
|
||||||
break;
|
|
||||||
case ROTATE_RIGHT:
|
|
||||||
$main_ui.plan_rotate(1, DEFAULT_ROTATE);
|
|
||||||
state(State::COMBAT_ROTATE);
|
|
||||||
break;
|
|
||||||
case COMBAT_STOP:
|
|
||||||
$main_ui.$overlay_ui.close_sprite("top_right");
|
|
||||||
state(State::IDLE);
|
|
||||||
break;
|
|
||||||
case QUIT:
|
|
||||||
$window.close();
|
|
||||||
state(State::END);
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FSM::try_move(int dir, bool strafe) {
|
void FSM::try_move(int dir, bool strafe) {
|
||||||
auto& level = GameDB::current_level();
|
auto& level = GameDB::current_level();
|
||||||
using enum State;
|
using enum State;
|
||||||
|
|
@ -477,7 +414,7 @@ namespace gui {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case eGUI::COMBAT_START:
|
case eGUI::COMBAT_START:
|
||||||
event(Event::COMBAT_START);
|
// TODO: $main_ui.show_combat();
|
||||||
break;
|
break;
|
||||||
case eGUI::ENTITY_SPAWN: {
|
case eGUI::ENTITY_SPAWN: {
|
||||||
auto& sprite = world->get<components::Sprite>(entity);
|
auto& sprite = world->get<components::Sprite>(entity);
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,6 @@ namespace gui {
|
||||||
enum class State {
|
enum class State {
|
||||||
START=__LINE__,
|
START=__LINE__,
|
||||||
MOVING=__LINE__,
|
MOVING=__LINE__,
|
||||||
IN_COMBAT=__LINE__,
|
|
||||||
COMBAT_ROTATE=__LINE__,
|
|
||||||
ATTACKING=__LINE__,
|
ATTACKING=__LINE__,
|
||||||
ROTATING=__LINE__,
|
ROTATING=__LINE__,
|
||||||
BOSS_FIGHT=__LINE__,
|
BOSS_FIGHT=__LINE__,
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,7 @@ int main(int argc, char* argv[]) {
|
||||||
// BUG: need to sort out how to deal with this in the FSM
|
// BUG: need to sort out how to deal with this in the FSM
|
||||||
if(main.in_state(gui::State::IDLE)
|
if(main.in_state(gui::State::IDLE)
|
||||||
|| main.in_state(gui::State::LOOTING)
|
|| main.in_state(gui::State::LOOTING)
|
||||||
|| main.in_state(gui::State::CUT_SCENE_PLAYING)
|
|| main.in_state(gui::State::CUT_SCENE_PLAYING))
|
||||||
|| main.in_state(gui::State::IN_COMBAT))
|
|
||||||
{
|
{
|
||||||
if(main.autowalking) {
|
if(main.autowalking) {
|
||||||
walker.autowalk();
|
walker.autowalk();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue