115 lines
4.5 KiB
C++
115 lines
4.5 KiB
C++
|
#include "game.h"
|
||
|
#include "features/gamefeatures.h"
|
||
|
#include "features/qw_levelbuilder.h"
|
||
|
#include "features/qw_statemachine.h"
|
||
|
|
||
|
Game::Game()
|
||
|
{
|
||
|
game_features = std::make_unique<GameFeatures>(this);
|
||
|
|
||
|
auto &[view, scene, sound_player, inventory, builder, text_dlg, widget_dlg] = *game_features;
|
||
|
|
||
|
builder->setGameFeatures(game_features);
|
||
|
|
||
|
// Connecting all the UI controls to their features
|
||
|
for (auto &widg : scene->inventoryWidgets())
|
||
|
widg->onConnect(game_features);
|
||
|
|
||
|
connect(scene, SIGNAL(signalClickInventory()), inventory, SLOT(onClicked()));
|
||
|
|
||
|
view->setFixedSize(static_cast<int>(scene->sceneRect().width() ),
|
||
|
static_cast<int>(scene->sceneRect().height()));
|
||
|
|
||
|
builder->initSaveProfile("test", "test");
|
||
|
builder->initLevel(QWLevelBuilder::strInitLevel());
|
||
|
buildStateMachine();
|
||
|
buildHotKeys();
|
||
|
}
|
||
|
|
||
|
Game::~Game() = default;
|
||
|
|
||
|
void Game::buildStateMachine()
|
||
|
{
|
||
|
auto *view = game_features->ptr_view;
|
||
|
auto *scene = game_features->ptr_scene;
|
||
|
|
||
|
QWStateMachine *state_machine = new QWStateMachine(view);
|
||
|
|
||
|
// Connecting UI elements to global state machine
|
||
|
for (auto &widg : scene->inventoryWidgets())
|
||
|
widg->onBuildingStateMachine(state_machine, game_features);
|
||
|
|
||
|
QState *state_menu = new QState;
|
||
|
state_machine->registerState("state_menu", state_menu);
|
||
|
connect(state_menu, SIGNAL(entered()), game_features->ptr_scene, SLOT(onEntryMenu()));
|
||
|
|
||
|
const auto &state_gameplay = state_machine->stateByKey("state_gameplay");
|
||
|
|
||
|
QSignalTransition *enter_gameplay_transition = new QSignalTransition(scene, SIGNAL(signalLeaveMenu()));
|
||
|
enter_gameplay_transition->setTargetState(state_gameplay);
|
||
|
state_menu->addTransition(enter_gameplay_transition);
|
||
|
|
||
|
QSignalTransition *leave_gameplay_transition = new QSignalTransition(scene, SIGNAL(signalEnterMenu()));
|
||
|
leave_gameplay_transition->setTargetState(state_menu);
|
||
|
state_gameplay->addTransition(leave_gameplay_transition);
|
||
|
|
||
|
QState *state_examination = new QState;
|
||
|
state_machine->registerState("state_examination", state_examination);
|
||
|
|
||
|
QSignalTransition *enter_examination_transition = new QSignalTransition(scene, SIGNAL(signalEnterExamination()));
|
||
|
enter_examination_transition->setTargetState(state_examination);
|
||
|
state_gameplay->addTransition(enter_examination_transition);
|
||
|
|
||
|
QSignalTransition *leave_examination_transition = new QSignalTransition(scene, SIGNAL(signalLeaveExamination()));
|
||
|
leave_examination_transition->setTargetState(state_gameplay);
|
||
|
state_examination->addTransition(leave_examination_transition);
|
||
|
|
||
|
QState *state_widget_dialogue = new QState;
|
||
|
state_machine->registerState("state_widget_dialogue", state_widget_dialogue);
|
||
|
connect(state_widget_dialogue, SIGNAL(entered()), game_features->ptr_scene, SLOT(onEntryDialogue()));
|
||
|
|
||
|
QSignalTransition *enter_widget_dialogue_transition = new QSignalTransition(game_features->ptr_widget_dlg, SIGNAL(onEntryDialogueTransition()));
|
||
|
enter_widget_dialogue_transition->setTargetState(state_widget_dialogue);
|
||
|
state_menu->addTransition(enter_widget_dialogue_transition);
|
||
|
state_gameplay->addTransition(enter_widget_dialogue_transition);
|
||
|
|
||
|
QSignalTransition *leave_widget_dialogue_transition = new QSignalTransition(game_features->ptr_widget_dlg, SIGNAL(onLeaveDialogueTransition()));
|
||
|
leave_widget_dialogue_transition->setTargetState(state_gameplay);
|
||
|
state_widget_dialogue->addTransition(leave_widget_dialogue_transition);
|
||
|
|
||
|
state_machine->addState(state_menu);
|
||
|
state_machine->addState(state_widget_dialogue);
|
||
|
state_machine->addState(state_examination);
|
||
|
state_machine->setInitialState(state_gameplay);
|
||
|
state_machine->start();
|
||
|
}
|
||
|
|
||
|
void Game::buildHotKeys()
|
||
|
{
|
||
|
auto *builder = game_features->ptr_builder;
|
||
|
auto *view = game_features->ptr_view;
|
||
|
|
||
|
/* For quick exit */
|
||
|
auto quit_action = new QAction(tr("E&xit"), this);
|
||
|
quit_action->setShortcut(tr("Ctrl+Q"));
|
||
|
connect(quit_action, SIGNAL(triggered()), qApp, SLOT(quit()));
|
||
|
view->addAction(quit_action);
|
||
|
|
||
|
/* For quick save */
|
||
|
auto save_action = new QAction(tr("S&ave"), this);
|
||
|
save_action->setShortcut(tr("Ctrl+S"));
|
||
|
connect(save_action, SIGNAL(triggered()), builder, SLOT(saveGame()));
|
||
|
view->addAction(save_action);
|
||
|
|
||
|
/* For quick load */
|
||
|
auto load_action = new QAction(tr("L&oad"), this);
|
||
|
load_action->setShortcut(tr("Ctrl+L"));
|
||
|
connect(load_action, SIGNAL(triggered()), builder, SLOT(loadGame()));
|
||
|
view->addAction(load_action);
|
||
|
}
|
||
|
|
||
|
void Game::start()
|
||
|
{
|
||
|
game_features->ptr_view->show();
|
||
|
}
|