Boss fight now reuses the combat_ui.cpp to do the combat panel, so next is making it work with the mechanics I want but no art.

This commit is contained in:
Zed A. Shaw 2025-09-24 14:22:24 -04:00
parent 6ec43026b6
commit 8a828fbd31
11 changed files with 107 additions and 91 deletions

View file

@ -20,6 +20,7 @@ namespace gui {
FSM::FSM() :
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
$main_ui($window),
$combat_ui(false),
$font{FONT_FILE_NAME},
$dnd_loot($status_ui, $loot_ui, $window, $router)
{
@ -35,7 +36,7 @@ namespace gui {
FSM_STATE(State, IDLE, ev, data);
FSM_STATE(State, IN_COMBAT, ev);
FSM_STATE(State, COMBAT_ROTATE, ev);
FSM_STATE(State, NEXT_LEVEL, ev);
FSM_STATE(State, BOSS_FIGHT, ev);
FSM_STATE(State, END, ev);
FSM_STATE(State, LOOTING, ev, data);
}
@ -50,12 +51,8 @@ namespace gui {
auto cell = $main_ui.overlay_cell("left");
$debug_ui.init(cell);
$combat_ui.init();
$combat_ui.init(COMBAT_UI_X, COMBAT_UI_Y, COMBAT_UI_WIDTH, COMBAT_UI_HEIGHT);
$status_ui.init();
$boss_fight_ui = GameDB::create_bossfight();
$boss_fight_ui->init();
$map_ui.init();
$map_ui.log(L"Welcome to the game!");
@ -169,9 +166,10 @@ namespace gui {
case CLOSE:
dbc::log("Nothing to close.");
break;
case STAIRS_DOWN:
case BOSS_START:
sound::stop("ambient");
state(State::NEXT_LEVEL);
next_level(true);
state(State::BOSS_FIGHT);
break;
case LOOT_ITEM:
$dnd_loot.event(Event::LOOT_ITEM);
@ -207,13 +205,16 @@ namespace gui {
}
}
void FSM::NEXT_LEVEL(Event ev) {
void FSM::BOSS_FIGHT(Event ev) {
dbc::check($boss_fight_ui != nullptr, "$boss_fight_ui not initialized");
using enum Event;
switch(ev) {
case STAIRS_DOWN:
// this is only if using the debug X key to skip it
case BOSS_START:
case BOSS_END:
sound::play("ambient");
next_level();
next_level(false);
state(State::IDLE);
break;
case MOUSE_CLICK: {
@ -221,7 +222,7 @@ namespace gui {
$boss_fight_ui->mouse(pos.x, pos.y, guecs::NO_MODS);
if($boss_fight_ui->boss_dead()) {
event(Event::STAIRS_DOWN);
event(Event::BOSS_END);
}
} break;
default:
@ -362,7 +363,7 @@ namespace gui {
$main_ui.toggle_mind_reading();
break;
case KEY::X:
event(Event::STAIRS_DOWN);
event(Event::BOSS_START);
break;
case KEY::F5:
take_screenshot();
@ -384,7 +385,7 @@ namespace gui {
}
void FSM::draw_gui() {
if(in_state(State::NEXT_LEVEL)) {
if(in_state(State::BOSS_FIGHT)) {
$boss_fight_ui->render($window);
} else {
if($debug_ui.active) {
@ -406,7 +407,7 @@ namespace gui {
}
void FSM::render() {
if(in_state(State::NEXT_LEVEL)) {
if(in_state(State::BOSS_FIGHT)) {
$window.clear();
$boss_fight_ui->render($window);
} else {
@ -502,14 +503,14 @@ namespace gui {
System::player_status();
break;
case eGUI::NEW_RITUAL:
$combat_ui.init();
$combat_ui.init(COMBAT_UI_X, COMBAT_UI_Y, COMBAT_UI_WIDTH, COMBAT_UI_HEIGHT);
break;
case eGUI::ATTACK:
$temp_attack_id = std::any_cast<int>(data);
event(Event::ATTACK);
break;
case eGUI::STAIRS_DOWN:
event(Event::STAIRS_DOWN);
event(Event::BOSS_START);
break;
case eGUI::DEATH: {
$status_ui.update();
@ -541,17 +542,17 @@ namespace gui {
dbc::check(worked, "Failed to write screenshot.png");
}
void FSM::next_level() {
dbc::log("current_level: Yep, next is called...");
GameDB::create_level();
$status_ui.update_level();
$combat_ui.update_level();
$main_ui.update_level();
$loot_ui.update_level();
$boss_fight_ui = GameDB::create_bossfight();
$boss_fight_ui->init();
void FSM::next_level(bool bossfight) {
if(bossfight) {
$boss_fight_ui = GameDB::create_bossfight();
$boss_fight_ui->init();
} else {
GameDB::create_level();
$status_ui.update_level();
$combat_ui.update_level();
$main_ui.update_level();
$loot_ui.update_level();
}
run_systems();
}