Boss fight is now working. Turned out to be something really dumb.
This commit is contained in:
parent
4958f24c1d
commit
4b4f9b3916
8 changed files with 154 additions and 127 deletions
|
|
@ -4,8 +4,11 @@
|
|||
#include "game_level.hpp"
|
||||
#include <iostream>
|
||||
#include "rand.hpp"
|
||||
#include "events.hpp"
|
||||
|
||||
namespace boss {
|
||||
using namespace DinkyECS;
|
||||
|
||||
Fight::Fight(shared_ptr<World> world, Entity boss_id, Entity player_id) :
|
||||
$world(world),
|
||||
$boss_id(boss_id),
|
||||
|
|
@ -19,9 +22,10 @@ namespace boss {
|
|||
$ui.init();
|
||||
}
|
||||
|
||||
bool Fight::event(game::Event ev, std::any data) {
|
||||
void Fight::event(game::Event ev, std::any data) {
|
||||
|
||||
// if the mouse event is handled the done, this may be wrong later
|
||||
if(handle_mouse(ev)) return in_state(State::END);
|
||||
if(handle_mouse(ev)) return;
|
||||
|
||||
switch($state) {
|
||||
FSM_STATE(State, START, ev, data);
|
||||
|
|
@ -30,10 +34,6 @@ namespace boss {
|
|||
FSM_STATE(State, EXEC_PLAN, ev, data);
|
||||
FSM_STATE(State, END, ev, data);
|
||||
}
|
||||
|
||||
run_systems();
|
||||
|
||||
return in_state(State::END);
|
||||
}
|
||||
|
||||
void Fight::START(game::Event ev, std::any) {
|
||||
|
|
@ -41,10 +41,8 @@ namespace boss {
|
|||
|
||||
switch(ev) {
|
||||
// this is only if using the debug X key to skip it
|
||||
case BOSS_START:
|
||||
state(State::END);
|
||||
break;
|
||||
case TICK:
|
||||
case BOSS_START:
|
||||
$ui.status(L"PLAYER REQUESTS");
|
||||
$battle.ap_refresh();
|
||||
state(State::PLAYER_REQUESTS);
|
||||
|
|
@ -169,7 +167,6 @@ namespace boss {
|
|||
}
|
||||
|
||||
void Fight::render(sf::RenderWindow& window) {
|
||||
window.clear();
|
||||
$ui.play_animations();
|
||||
$ui.render(window);
|
||||
}
|
||||
|
|
@ -179,10 +176,10 @@ namespace boss {
|
|||
|
||||
switch(ev) {
|
||||
case MOUSE_CLICK: {
|
||||
$ui.mouse(mouse_pos.x, mouse_pos.y, guecs::NO_MODS);
|
||||
$ui.mouse($router.position.x, $router.position.y, guecs::NO_MODS);
|
||||
} break;
|
||||
case MOUSE_MOVE: {
|
||||
$ui.mouse(mouse_pos.x, mouse_pos.y, {1 << guecs::ModBit::hover});
|
||||
$ui.mouse($router.position.x, $router.position.y, {1 << guecs::ModBit::hover});
|
||||
} break;
|
||||
case MOUSE_DRAG:
|
||||
dbc::log("mouse drag");
|
||||
|
|
@ -210,33 +207,47 @@ namespace boss {
|
|||
run_systems();
|
||||
}
|
||||
|
||||
void Fight::handle_world_events() {
|
||||
fmt::println(">>>>>>>>>>>>>>>>> BOSS FIGHT EVENTS");
|
||||
dbc::check($world->has_event<game::Event>(), "World doesn't have GUI events.");
|
||||
void Fight::set_window(sf::RenderWindow* window) {
|
||||
$window = window;
|
||||
}
|
||||
|
||||
while($world->has_event<game::Event>()) {
|
||||
auto [evt, entity, data] = $world->recv<game::Event>();
|
||||
fmt::println("boss fight received event", int(evt));
|
||||
bool Fight::handle_keyboard_mouse() {
|
||||
dbc::check($window != nullptr, "you didn't set_window");
|
||||
|
||||
switch(evt) {
|
||||
case game::Event::ATTACK:
|
||||
fmt::println("sending attack");
|
||||
event(game::Event::ATTACK, data);
|
||||
break;
|
||||
case game::Event::COMBAT_START:
|
||||
fmt::println("sending combat start {}", data.type().name());
|
||||
event(game::Event::COMBAT_START, data);
|
||||
break;
|
||||
case game::Event::COMBAT:
|
||||
fmt::println("sending combat {}", data.type().name());
|
||||
event(game::Event::COMBAT, data);
|
||||
break;
|
||||
default:
|
||||
fmt::println("GUI EVENT: {} entity={}", int(evt), entity);
|
||||
while(const auto ev = $window->pollEvent()) {
|
||||
auto gui_ev = $router.process_event(ev);
|
||||
|
||||
if(gui_ev == game::Event::KEY_PRESS) {
|
||||
using KEY = sf::Keyboard::Scan;
|
||||
|
||||
switch($router.scancode) {
|
||||
// REALLY? just go to state end or use another event
|
||||
case KEY::X:
|
||||
event(game::Event::BOSS_START, {});
|
||||
break;
|
||||
default:
|
||||
fmt::println("key press!");
|
||||
}
|
||||
} else if(gui_ev == game::Event::QUIT) {
|
||||
return true;
|
||||
} else {
|
||||
event(gui_ev, {});
|
||||
}
|
||||
}
|
||||
|
||||
dbc::check(!$world->has_event<game::Event>(), "World still has events!");
|
||||
fmt::println("<<<<<<<<<<<<<<<< BOSS FIGHT EVENTS");
|
||||
return in_state(State::END);
|
||||
}
|
||||
|
||||
bool Fight::handle_world_events() {
|
||||
if($world->has_event<game::Event>()) {
|
||||
while($world->has_event<game::Event>()) {
|
||||
auto [evt, entity, data] = $world->recv<game::Event>();
|
||||
|
||||
event(game::Event(evt), data);
|
||||
run_systems();
|
||||
}
|
||||
}
|
||||
|
||||
return in_state(State::END);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,35 +5,39 @@
|
|||
#include "boss/ui.hpp"
|
||||
#include "events.hpp"
|
||||
#include "battle.hpp"
|
||||
#include "gui/event_router.hpp"
|
||||
#include <memory>
|
||||
#include <any>
|
||||
|
||||
namespace boss {
|
||||
using namespace DinkyECS;
|
||||
using std::shared_ptr;
|
||||
|
||||
enum class State {
|
||||
START=0,
|
||||
PLAYER_REQUESTS=1,
|
||||
PLAN_BATTLE=2,
|
||||
EXEC_PLAN=3,
|
||||
END=4
|
||||
START=__LINE__,
|
||||
PLAYER_REQUESTS=__LINE__,
|
||||
PLAN_BATTLE=__LINE__,
|
||||
EXEC_PLAN=__LINE__,
|
||||
END=__LINE__
|
||||
};
|
||||
|
||||
class Fight : public DeadSimpleFSM<State, game::Event> {
|
||||
public:
|
||||
shared_ptr<World> $world = nullptr;
|
||||
DinkyECS::Entity $boss_id = NONE;
|
||||
sf::RenderWindow* $window = nullptr;
|
||||
shared_ptr<DinkyECS::World> $world = nullptr;
|
||||
DinkyECS::Entity $boss_id = DinkyECS::NONE;
|
||||
combat::BattleEngine $battle;
|
||||
boss::UI $ui;
|
||||
sf::Vector2f mouse_pos{0,0};
|
||||
Entity $host = NONE;
|
||||
DinkyECS::Entity $host = DinkyECS::NONE;
|
||||
components::Combat* $host_combat = nullptr;
|
||||
gui::routing::Router $router;
|
||||
|
||||
Fight(shared_ptr<World> world, Entity boss_id, Entity player_id);
|
||||
Fight(shared_ptr<DinkyECS::World> world,
|
||||
DinkyECS::Entity boss_id,
|
||||
DinkyECS::Entity player_id);
|
||||
|
||||
void set_window(sf::RenderWindow* window);
|
||||
bool handle_mouse(game::Event ev);
|
||||
bool event(game::Event ev, std::any data);
|
||||
void event(game::Event ev, std::any data);
|
||||
|
||||
void START(game::Event ev, std::any data);
|
||||
void PLAYER_REQUESTS(game::Event ev, std::any data);
|
||||
|
|
@ -42,12 +46,14 @@ namespace boss {
|
|||
void END(game::Event ev, std::any data);
|
||||
void render(sf::RenderWindow& window);
|
||||
|
||||
void handle_world_events();
|
||||
bool handle_world_events();
|
||||
void run_systems();
|
||||
bool player_dead();
|
||||
void init_fight();
|
||||
|
||||
void do_combat(std::any data);
|
||||
void next_combat_dumb_name();
|
||||
sf::Vector2f mouse_position();
|
||||
bool handle_keyboard_mouse();
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue