chore: Init
This commit is contained in:
commit
716544321a
|
@ -0,0 +1,2 @@
|
|||
*.pro.user
|
||||
*.autosave
|
|
@ -0,0 +1,120 @@
|
|||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2018-02-10T20:30:04
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
VERSION = 0.0.1
|
||||
|
||||
CONFIG += c++17
|
||||
QMAKE_CXXFLAGS = -Wall -Werror -Wextra -Wpedantic -Wconversion -std=c++17 -O2 -g
|
||||
QT += core gui multimedia widgets quickwidgets
|
||||
|
||||
# Potato22 is the best vector artist, you can't change my mind.
|
||||
# The icon is precious!
|
||||
RC_FILE += add_ico.rc
|
||||
|
||||
TARGET = QuestWizard
|
||||
TEMPLATE = app
|
||||
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
SOURCES += main.cpp \
|
||||
game.cpp \
|
||||
features/qw_abstractdialoguemanager.cpp \
|
||||
features/qw_dialoguefactory.cpp \
|
||||
features/qw_textdialoguemanager.cpp \
|
||||
features/qw_widgetdialoguemanager.cpp \
|
||||
features/qw_eventfactory.cpp \
|
||||
features/qw_inventorymanager.cpp \
|
||||
features/qw_levelbuilder.cpp \
|
||||
features/qw_soundplayer.cpp \
|
||||
features/qw_statemachine.cpp \
|
||||
qw_globalmetadata.cpp \
|
||||
\
|
||||
models/events/qw_abstractevent.cpp \
|
||||
models/events/qw_abstractinventoryevent.cpp \
|
||||
models/events/qw_abstractlevelevent.cpp \
|
||||
models/events/qw_abstractsceneevent.cpp \
|
||||
models/events/qw_abstractsoundevent.cpp \
|
||||
models/events/qw_changelocationevent.cpp \
|
||||
models/events/qw_changetriggerpropertiesevent.cpp \
|
||||
models/events/qw_deletefrominventoryevent.cpp \
|
||||
models/events/qw_endlevelevent.cpp \
|
||||
models/events/qw_newgameevent.cpp \
|
||||
models/events/qw_pickupitemevent.cpp \
|
||||
models/events/qw_playmusicevent.cpp \
|
||||
models/events/qw_playsoundevent.cpp \
|
||||
models/events/qw_quitgameevent.cpp \
|
||||
models/events/qw_startdialogueevent.cpp \
|
||||
models/events/qw_addtriggerevent.cpp \
|
||||
models/events/qw_removetriggerevent.cpp \
|
||||
models/events/qw_switcheventsevent.cpp \
|
||||
models/dialogues/qw_abstractgamedialogue.cpp \
|
||||
models/dialogues/qw_textdialogue.cpp \
|
||||
models/dialogues/qw_widgetdialogue.cpp \
|
||||
models/qw_tagholder.cpp \
|
||||
models/qw_trigger.cpp \
|
||||
models/qw_location.cpp \
|
||||
\
|
||||
view/controls/pushbuttonsound.cpp \
|
||||
view/controls/qw_abstractscenecontrol.cpp \
|
||||
view/controls/scenedialoguepanel.cpp \
|
||||
view/controls/sceneinventorypanel.cpp \
|
||||
\
|
||||
view/qw_scene.cpp \
|
||||
view/qw_view.cpp
|
||||
|
||||
HEADERS += \
|
||||
game.h \
|
||||
features/qw_abstractdialoguemanager.h \
|
||||
features/gamefeatures.h \
|
||||
features/qw_dialoguefactory.h \
|
||||
features/qw_textdialoguemanager.h \
|
||||
features/qw_widgetdialoguemanager.h \
|
||||
features/qw_eventfactory.h \
|
||||
features/qw_inventorymanager.h \
|
||||
features/qw_levelbuilder.h \
|
||||
features/qw_soundplayer.h \
|
||||
features/qw_statemachine.h \
|
||||
qw_globalmetadata.h \
|
||||
\
|
||||
models/events/qw_abstractevent.h \
|
||||
models/events/qw_abstractinventoryevent.h \
|
||||
models/events/qw_abstractlevelevent.h \
|
||||
models/events/qw_abstractsceneevent.h \
|
||||
models/events/qw_abstractsoundevent.h \
|
||||
models/events/qw_changelocationevent.h \
|
||||
models/events/qw_changetriggerpropertiesevent.h \
|
||||
models/events/qw_deletefrominventoryevent.h \
|
||||
models/events/qw_endlevelevent.h \
|
||||
models/events/qw_newgameevent.h \
|
||||
models/events/qw_pickupitemevent.h \
|
||||
models/events/qw_playmusicevent.h \
|
||||
models/events/qw_playsoundevent.h \
|
||||
models/events/qw_quitgameevent.h \
|
||||
models/events/qw_startdialogueevent.h \
|
||||
models/events/qw_addtriggerevent.h \
|
||||
models/events/qw_removetriggerevent.h \
|
||||
models/events/qw_switcheventsevent.h \
|
||||
models/dialogues/qw_abstractgamedialogue.h \
|
||||
models/dialogues/qw_textdialogue.h \
|
||||
models/dialogues/qw_widgetdialogue.h \
|
||||
models/qw_tagholder.h \
|
||||
models/qw_trigger.h \
|
||||
models/qw_location.h \
|
||||
\
|
||||
view/controls/pushbuttonsound.h \
|
||||
view/controls/qw_abstractscenecontrol.h \
|
||||
view/controls/scenedialoguepanel.h \
|
||||
view/controls/sceneinventorypanel.h \
|
||||
\
|
||||
view/qw_scene.h \
|
||||
view/qw_view.h
|
||||
|
||||
|
||||
RESOURCES += \
|
||||
application.qrc
|
||||
|
||||
DISTFILES += \
|
||||
qml/test.qml
|
|
@ -0,0 +1,3 @@
|
|||
# QuestWizard
|
||||
I am not really sure what this thing is going to be but anyway here is trello where I try to manage stuff
|
||||
https://trello.com/b/M3kqOaDB/questwizard-functional-requirements?menu=filter&filter=label:master-merge%201.1
|
|
@ -0,0 +1 @@
|
|||
IDI_ICON1 ICON DISCARDABLE "icon.ico"
|
|
@ -0,0 +1,17 @@
|
|||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>res/levels/level1.json</file>
|
||||
<file>res/defaultsave.json</file>
|
||||
<file>res/menu.json</file>
|
||||
<file>res/final_background.jpg</file>
|
||||
<file>res/roomkey_background.jpg</file>
|
||||
<file>res/spawn_background.jpg</file>
|
||||
<file>res/cell.png</file>
|
||||
<file>res/door.png</file>
|
||||
<file>res/inv.jpg</file>
|
||||
<file>res/dialogue_panel.jpeg</file>
|
||||
<file>res/sound.wav</file>
|
||||
<file>res/osaka.png</file>
|
||||
<file>res/config.json</file>
|
||||
</qresource>
|
||||
</RCC>
|
|
@ -0,0 +1,41 @@
|
|||
#ifndef GAMEFEATURES_H
|
||||
#define GAMEFEATURES_H
|
||||
|
||||
#include "game.h"
|
||||
|
||||
#include "qw_levelbuilder.h"
|
||||
#include "qw_soundplayer.h"
|
||||
#include "qw_inventorymanager.h"
|
||||
#include "qw_textdialoguemanager.h"
|
||||
#include "qw_widgetdialoguemanager.h"
|
||||
#include "view/qw_view.h"
|
||||
|
||||
/* GameFeatures
|
||||
* The package of all key in-game managers. This way they are easy to transport. */
|
||||
|
||||
struct GameFeatures final
|
||||
{
|
||||
public:
|
||||
QWView *ptr_view;
|
||||
QWScene *ptr_scene;
|
||||
QWSoundPlayer *ptr_sound_player;
|
||||
QWInventoryManager *ptr_inventory;
|
||||
QWLevelBuilder *ptr_builder;
|
||||
QWTextDialogueManager *ptr_text_dlg;
|
||||
QWWidgetDialogueManager *ptr_widget_dlg;
|
||||
|
||||
explicit GameFeatures(Game *ptr_game)
|
||||
{
|
||||
ptr_scene = new QWScene(1280, 720);
|
||||
ptr_view = new QWView(ptr_scene);
|
||||
ptr_sound_player = new QWSoundPlayer(ptr_game);
|
||||
ptr_inventory = new QWInventoryManager(ptr_scene);
|
||||
ptr_builder = new QWLevelBuilder(ptr_game);
|
||||
ptr_text_dlg = new QWTextDialogueManager(ptr_scene);
|
||||
ptr_widget_dlg = new QWWidgetDialogueManager(ptr_scene);
|
||||
}
|
||||
|
||||
~GameFeatures() = default;
|
||||
};
|
||||
|
||||
#endif // GAMEFEATURES_H
|
|
@ -0,0 +1,9 @@
|
|||
#include "qw_abstractdialoguemanager.h"
|
||||
|
||||
QWAbstractDialogueManager:: QWAbstractDialogueManager(QWScene *scene) :
|
||||
QObject(scene),
|
||||
ptr_scene(scene)
|
||||
{}
|
||||
|
||||
QWAbstractDialogueManager::~QWAbstractDialogueManager()
|
||||
{}
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef QWABSTRACTDIALOGUEMANAGER_H
|
||||
#define QWABSTRACTDIALOGUEMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include "view/qw_scene.h"
|
||||
#include "models/dialogues/qw_abstractgamedialogue.h"
|
||||
|
||||
class QWAbstractDialogueManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWAbstractDialogueManager)
|
||||
protected:
|
||||
QWScene *ptr_scene;
|
||||
|
||||
public:
|
||||
explicit QWAbstractDialogueManager(QWScene *scene = nullptr);
|
||||
virtual ~QWAbstractDialogueManager() override = 0;
|
||||
|
||||
virtual void activateDialogue(const std::shared_ptr<QWAbstractGameDialogue> &dialogue) = 0;
|
||||
|
||||
public slots:
|
||||
virtual void onClicked(MouseButton mouse_button) = 0;
|
||||
|
||||
signals:
|
||||
void onEntryDialogueTransition();
|
||||
void onLeaveDialogueTransition();
|
||||
};
|
||||
|
||||
#endif // QWABSTRACTDIALOGUEMANAGER_H
|
|
@ -0,0 +1,39 @@
|
|||
#include "qw_dialoguefactory.h"
|
||||
#include "qw_levelbuilder.h"
|
||||
|
||||
QWDialogueFactory::QWDialogueFactory(QWLevelBuilder *b) :
|
||||
builder(b)
|
||||
{}
|
||||
|
||||
std::shared_ptr<QWTextDialogue> QWDialogueFactory::createTextDialogue(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWTextDialogue> new_dialogue;
|
||||
|
||||
qDebug() << " Found QWTextDialogue. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("text"));
|
||||
|
||||
QStringList text;
|
||||
const QJsonArray text_pages = json_object["text"].toArray();
|
||||
for (auto const &page : text_pages)
|
||||
text << page.toString();
|
||||
|
||||
// add events on leave or something
|
||||
|
||||
new_dialogue = std::make_unique<QWTextDialogue>(text);
|
||||
|
||||
return std::shared_ptr<QWTextDialogue>{std::move(new_dialogue)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWWidgetDialogue> QWDialogueFactory::createWidgetDialogue(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWWidgetDialogue> new_dialogue;
|
||||
|
||||
qDebug() << " Found QWWidgetDialogue. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("qml_filename"));
|
||||
|
||||
new_dialogue = std::make_unique<QWWidgetDialogue>(json_object["qml_filename"].toString());
|
||||
|
||||
return std::shared_ptr<QWWidgetDialogue>{std::move(new_dialogue)};
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
#ifndef QWDIALOGUEFACTORY_H
|
||||
#define QWDIALOGUEFACTORY_H
|
||||
|
||||
#include "models/dialogues/qw_textdialogue.h"
|
||||
#include "models/dialogues/qw_widgetdialogue.h"
|
||||
|
||||
/* QWDialogueFactory
|
||||
* Creates game dialogues of all kinds! */
|
||||
|
||||
class QWLevelBuilder;
|
||||
|
||||
class QWDialogueFactory final
|
||||
{
|
||||
private:
|
||||
QWLevelBuilder *builder;
|
||||
|
||||
public:
|
||||
explicit QWDialogueFactory(QWLevelBuilder *b);
|
||||
|
||||
std::shared_ptr<QWTextDialogue> createTextDialogue(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWWidgetDialogue> createWidgetDialogue(const QJsonObject &json_object);
|
||||
};
|
||||
|
||||
#endif // QWDIALOGUEFACTORY_H
|
|
@ -0,0 +1,221 @@
|
|||
#include "qw_eventfactory.h"
|
||||
#include "qw_levelbuilder.h"
|
||||
#include "qw_widgetdialoguemanager.h"
|
||||
#include "qw_textdialoguemanager.h"
|
||||
|
||||
QWEventFactory::QWEventFactory(QWLevelBuilder *b) :
|
||||
builder(b)
|
||||
{}
|
||||
|
||||
std::shared_ptr<QWDeleteFromInventoryEvent> QWEventFactory::createDeleteItEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWDeleteFromInventoryEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWDeleteFromInventoryEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("target"));
|
||||
Q_ASSERT(builder->hash_triggers.contains(json_object["target"].toString()));
|
||||
new_event = std::make_unique<QWDeleteFromInventoryEvent>(builder->hash_triggers[json_object["target"].toString()]);
|
||||
new_event->setInventoryManager(builder->ptr_inventory);
|
||||
|
||||
return std::shared_ptr<QWDeleteFromInventoryEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWChangeLocationEvent> QWEventFactory::createChangeLocEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWChangeLocationEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWChangeLocationEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("location"));
|
||||
Q_ASSERT(builder->hash_locations.contains(json_object["location"].toString()));
|
||||
new_event = std::make_unique<QWChangeLocationEvent>(builder->hash_locations[json_object["location"].toString()]);
|
||||
|
||||
new_event->setScene(builder->ptr_scene);
|
||||
|
||||
return std::shared_ptr<QWChangeLocationEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWChangeTriggerPropertiesEvent> QWEventFactory::createChangeTrProperts(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWChangeTriggerPropertiesEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWChangeTriggerPropertiesEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("target"));
|
||||
Q_ASSERT(builder->hash_triggers.contains(json_object["target"].toString()));
|
||||
new_event = std::make_unique<QWChangeTriggerPropertiesEvent>(builder->hash_triggers[json_object["target"].toString()]);
|
||||
|
||||
if (json_object.contains("x") && json_object.contains("y"))
|
||||
new_event->setParams(json_object["x"].toDouble(), json_object["y"].toDouble(),
|
||||
json_object.contains("path") ? json_object["path"].toString() : "$no_pic");
|
||||
else
|
||||
new_event->setParams(json_object.contains("path") ? json_object["path"].toString() : "$no_pic");
|
||||
|
||||
return std::shared_ptr<QWChangeTriggerPropertiesEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWSwitchEventsEvent> QWEventFactory::createSwitchEventsEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWSwitchEventsEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWSwitchEventsEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("target"));
|
||||
Q_ASSERT(builder->hash_triggers.contains(json_object["target"].toString()));
|
||||
new_event = std::make_unique<QWSwitchEventsEvent>(builder->hash_triggers[json_object["target"].toString()]);
|
||||
|
||||
Q_ASSERT(json_object.contains("enable_evs") && json_object.contains("disable_evs"));
|
||||
|
||||
// Linking events of enabled state
|
||||
QJsonArray evs = json_object["enable_evs"].toArray();
|
||||
QList<std::shared_ptr<QWAbstractEvent>> list_events;
|
||||
|
||||
for (const auto obj : evs) {
|
||||
Q_ASSERT(builder->hash_events.contains(obj.toString()));
|
||||
list_events.append(builder->hash_events[obj.toString()]);
|
||||
}
|
||||
|
||||
new_event->setEventsOnEnable(list_events);
|
||||
|
||||
list_events.clear();
|
||||
|
||||
// Linking events of disabled state
|
||||
evs = json_object["disable_evs"].toArray();
|
||||
|
||||
for (const auto obj : evs) {
|
||||
Q_ASSERT(builder->hash_events.contains(obj.toString()));
|
||||
list_events.append(builder->hash_events[obj.toString()]);
|
||||
}
|
||||
|
||||
new_event->setEventsOnDisable(list_events);
|
||||
new_event->init();
|
||||
|
||||
return std::shared_ptr<QWSwitchEventsEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWPickupItemEvent> QWEventFactory::createPickupItEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWPickupItemEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWPickupItemEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("target"));
|
||||
Q_ASSERT(builder->hash_triggers.contains(json_object["target"].toString()));
|
||||
new_event = std::make_unique<QWPickupItemEvent>(builder->hash_triggers[json_object["target"].toString()]);
|
||||
new_event->setInventoryManager(builder->ptr_inventory);
|
||||
|
||||
return std::shared_ptr<QWPickupItemEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWEndLevelEvent> QWEventFactory::createEndLevelEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWEndLevelEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWEndLevelEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("new_level"));
|
||||
new_event = std::make_unique<QWEndLevelEvent>(json_object["target"].toString());
|
||||
new_event->setLevelBuilder(builder);
|
||||
|
||||
return std::shared_ptr<QWEndLevelEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWPlaySoundEvent> QWEventFactory::createPlaySoundEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWPlaySoundEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWPlaySoundEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("sound"));
|
||||
new_event = std::make_unique<QWPlaySoundEvent>(json_object["sound"].toString());
|
||||
new_event->setSoundPlayer(builder->ptr_soundplayer);
|
||||
|
||||
return std::shared_ptr<QWPlaySoundEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWNewGameEvent> QWEventFactory::createNewGameEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWNewGameEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWNewGameEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("save_file"));
|
||||
new_event = std::make_unique<QWNewGameEvent>(json_object["save_file"].toString());
|
||||
new_event->setLevelBuilder(builder);
|
||||
|
||||
return std::shared_ptr<QWNewGameEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWQuitGameEvent> QWEventFactory::createQuitGameEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWQuitGameEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWQuitGameEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("save_game"));
|
||||
new_event = std::make_unique<QWQuitGameEvent>(json_object["save_game"].toBool());
|
||||
new_event->setLevelBuilder(builder);
|
||||
|
||||
return std::shared_ptr<QWQuitGameEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWStartDialogueEvent> QWEventFactory::createStartDlgEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWStartDialogueEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWStartTextDialogueEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("dialogue"));
|
||||
Q_ASSERT(json_object.contains("dialogue_type"));
|
||||
Q_ASSERT(builder->hash_dialogues.contains(json_object["dialogue"].toString()));
|
||||
new_event = std::make_unique<QWStartDialogueEvent>(builder->hash_dialogues[json_object["dialogue"].toString()]);
|
||||
|
||||
switch(json_object["dialogue_type"].toInt()) {
|
||||
case 1:
|
||||
new_event->setDialogueManager(builder->ptr_widget_dlg);
|
||||
break;
|
||||
case 0:
|
||||
new_event->setDialogueManager(builder->ptr_text_dlg);
|
||||
break;
|
||||
default:
|
||||
Q_ASSERT(false);
|
||||
}
|
||||
|
||||
return std::shared_ptr<QWStartDialogueEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWAddTriggerEvent> QWEventFactory::createAddTrEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWAddTriggerEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWAddTriggerEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("trigger"));
|
||||
Q_ASSERT(builder->hash_triggers.contains(json_object["trigger"].toString()));
|
||||
new_event = std::make_unique<QWAddTriggerEvent>(builder->hash_triggers[json_object["trigger"].toString()]);
|
||||
|
||||
Q_ASSERT(json_object.contains("location"));
|
||||
Q_ASSERT(builder->hash_locations.contains(json_object["location"].toString()));
|
||||
new_event->setLocation(builder->hash_locations[json_object["location"].toString()]);
|
||||
|
||||
return std::shared_ptr<QWAddTriggerEvent>{std::move(new_event)};
|
||||
}
|
||||
|
||||
std::shared_ptr<QWRemoveTriggerEvent> QWEventFactory::createRemoveTrEvent(const QJsonObject &json_object)
|
||||
{
|
||||
std::unique_ptr<QWRemoveTriggerEvent> new_event;
|
||||
|
||||
qDebug() << " Found QWRemoveTriggerEvent. " << json_object["id"].toString() << ".";
|
||||
|
||||
Q_ASSERT(json_object.contains("trigger"));
|
||||
Q_ASSERT(builder->hash_triggers.contains(json_object["trigger"].toString()));
|
||||
new_event = std::make_unique<QWRemoveTriggerEvent>(builder->hash_triggers[json_object["trigger"].toString()]);
|
||||
|
||||
Q_ASSERT(json_object.contains("location"));
|
||||
Q_ASSERT(builder->hash_locations.contains(json_object["location"].toString()));
|
||||
new_event->setLocation(builder->hash_locations[json_object["location"].toString()]);
|
||||
|
||||
return std::shared_ptr<QWRemoveTriggerEvent>{std::move(new_event)};
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef EVENTFACTORY_H
|
||||
#define EVENTFACTORY_H
|
||||
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
|
||||
#include "models/events/qw_abstractevent.h"
|
||||
#include "models/events/qw_changelocationevent.h"
|
||||
#include "models/events/qw_switcheventsevent.h"
|
||||
#include "models/events/qw_deletefrominventoryevent.h"
|
||||
#include "models/events/qw_pickupitemevent.h"
|
||||
#include "models/events/qw_endlevelevent.h"
|
||||
#include "models/events/qw_playsoundevent.h"
|
||||
#include "models/events/qw_changetriggerpropertiesevent.h"
|
||||
#include "models/events/qw_newgameevent.h"
|
||||
#include "models/events/qw_quitgameevent.h"
|
||||
#include "models/events/qw_startdialogueevent.h"
|
||||
#include "models/events/qw_addtriggerevent.h"
|
||||
#include "models/events/qw_removetriggerevent.h"
|
||||
|
||||
/* QWEventFactory
|
||||
* Creates game events of all kinds! */
|
||||
|
||||
class QWLevelBuilder;
|
||||
|
||||
class QWEventFactory final
|
||||
{
|
||||
private:
|
||||
QWLevelBuilder *builder;
|
||||
|
||||
public:
|
||||
explicit QWEventFactory(QWLevelBuilder *b);
|
||||
|
||||
std::shared_ptr<QWDeleteFromInventoryEvent> createDeleteItEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWChangeLocationEvent> createChangeLocEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWChangeTriggerPropertiesEvent> createChangeTrProperts(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWSwitchEventsEvent> createSwitchEventsEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWPickupItemEvent> createPickupItEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWEndLevelEvent> createEndLevelEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWPlaySoundEvent> createPlaySoundEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWNewGameEvent> createNewGameEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWQuitGameEvent> createQuitGameEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWStartDialogueEvent> createStartDlgEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWAddTriggerEvent> createAddTrEvent(const QJsonObject &json_object);
|
||||
std::shared_ptr<QWRemoveTriggerEvent> createRemoveTrEvent(const QJsonObject &json_object);
|
||||
};
|
||||
|
||||
#endif // EVENTFACTORY_H
|
|
@ -0,0 +1,94 @@
|
|||
#include "qw_inventorymanager.h"
|
||||
#include "qw_globalmetadata.h"
|
||||
#include "view/controls/sceneinventorypanel.h"
|
||||
#include "view/qw_scene.h"
|
||||
#include "models/qw_trigger.h"
|
||||
|
||||
QWInventoryManager::QWInventoryManager(QWScene *sc) :
|
||||
ptr_scene(sc),
|
||||
index_freepan(0)
|
||||
{
|
||||
// Loading metadata
|
||||
metadata.length_wall = QWGlobalMetadata::valueBy("InventoryManager:length_wall").toInt();
|
||||
metadata.length_cell = QWGlobalMetadata::valueBy("InventoryManager:length_cell").toInt();
|
||||
metadata.max_amount = QWGlobalMetadata::valueBy("InventoryManager:max_amount").toInt();
|
||||
metadata.first_wall = QWGlobalMetadata::valueBy("InventoryManager:first_wall").toInt();
|
||||
metadata.clr_sel = Qt::GlobalColor(QWGlobalMetadata::valueBy("InventoryManager:clr_sel").toInt());
|
||||
metadata.clr_sth = QWGlobalMetadata::valueBy("InventoryManager:clr_str").toReal();
|
||||
|
||||
item_selected_effect = new QGraphicsColorizeEffect();
|
||||
item_selected_effect->setColor(metadata.clr_sel);
|
||||
item_selected_effect->setStrength(metadata.clr_sth);
|
||||
|
||||
}
|
||||
|
||||
void QWInventoryManager::setInventoryPanel(const std::shared_ptr<QGraphicsWidget> &panel) noexcept
|
||||
{
|
||||
ptr_panel = panel;
|
||||
}
|
||||
|
||||
int QWInventoryManager::freePanel() const noexcept
|
||||
{
|
||||
return index_freepan;
|
||||
}
|
||||
|
||||
void QWInventoryManager::freePanelToRight()
|
||||
{
|
||||
++index_freepan;
|
||||
Q_ASSERT(index_freepan <= metadata.max_amount);
|
||||
}
|
||||
|
||||
void QWInventoryManager::freePanelToLeft()
|
||||
{
|
||||
--index_freepan;
|
||||
Q_ASSERT(index_freepan >= 0);
|
||||
}
|
||||
|
||||
void QWInventoryManager::addInventoryIcon(std::shared_ptr<QWTrigger> &inventory_icon)
|
||||
{
|
||||
inventory_icon->setParentItem(ptr_panel.get());
|
||||
list_inventory_icons.append(inventory_icon);
|
||||
inventory_icon->setPos(metadata.first_wall
|
||||
+ ((metadata.length_wall + metadata.length_cell)
|
||||
* freePanel())
|
||||
, 0);
|
||||
freePanelToRight();
|
||||
}
|
||||
|
||||
void QWInventoryManager::removeInventoryIcon(std::shared_ptr<QWTrigger> &inventory_icon)
|
||||
{
|
||||
Index panel = metadata.max_amount + 1;
|
||||
for (Index i = 0; i < list_inventory_icons.size(); ++i)
|
||||
if (inventory_icon == list_inventory_icons[i])
|
||||
panel = i;
|
||||
|
||||
Q_ASSERT(panel <= metadata.max_amount);
|
||||
ptr_scene->removeItem(inventory_icon.get());
|
||||
list_inventory_icons.removeAt(panel);
|
||||
freePanelToLeft();
|
||||
reorganizeItems(panel);
|
||||
}
|
||||
|
||||
void QWInventoryManager::reorganizeItems(Index free_panel)
|
||||
{
|
||||
// When we remove item from the center we also should carefully move all the right items to the left
|
||||
for (Index j = free_panel; j < list_inventory_icons.size(); ++j)
|
||||
{
|
||||
const std::shared_ptr<QWTrigger> &t = list_inventory_icons.at(j);
|
||||
t->moveBy(-(metadata.length_cell + metadata.length_wall), 0);
|
||||
|
||||
if (j > 0)
|
||||
list_inventory_icons[j-1] = list_inventory_icons[j];
|
||||
}
|
||||
}
|
||||
|
||||
void QWInventoryManager::onClicked()
|
||||
{
|
||||
for (auto &tr : list_inventory_icons)
|
||||
if (tr->isUnderMouse()) {
|
||||
tr->setGraphicsEffect(tr->graphicsEffect() ? nullptr : item_selected_effect);
|
||||
tr->activate();
|
||||
} else {
|
||||
tr->setGraphicsEffect(nullptr);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
#ifndef INVENTORYMANAGER_H
|
||||
#define INVENTORYMANAGER_H
|
||||
|
||||
#include <memory>
|
||||
#include <QGraphicsColorizeEffect>
|
||||
|
||||
/* QWInventoryManager
|
||||
* Controls everything related to inventory slots and their items. */
|
||||
|
||||
class QGraphicsWidget;
|
||||
class QWScene;
|
||||
class QWTrigger;
|
||||
|
||||
class QWInventoryManager final : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWInventoryManager)
|
||||
private:
|
||||
QList<std::shared_ptr<QWTrigger>> list_inventory_icons;
|
||||
std::shared_ptr<QGraphicsWidget> ptr_panel;
|
||||
|
||||
QWScene *ptr_scene;
|
||||
|
||||
QRect rect_hidden;
|
||||
QRect rect_visible;
|
||||
|
||||
using Index = QList<std::shared_ptr<QWTrigger>>::size_type;
|
||||
Index index_freepan;
|
||||
|
||||
QGraphicsColorizeEffect *item_selected_effect;
|
||||
|
||||
struct metadata
|
||||
{
|
||||
// the separator thinkness
|
||||
int length_wall;
|
||||
// the cell side
|
||||
int length_cell;
|
||||
// the maximum amount of items to hold
|
||||
int max_amount;
|
||||
// the left wall of first item slot
|
||||
int first_wall;
|
||||
// the color for selected items
|
||||
QColor clr_sel;
|
||||
// the color for selected items
|
||||
qreal clr_sth;
|
||||
} metadata;
|
||||
|
||||
void reorganizeItems(Index i);
|
||||
|
||||
public:
|
||||
|
||||
explicit QWInventoryManager(QWScene *sc);
|
||||
|
||||
void setInventoryPanel(const std::shared_ptr<QGraphicsWidget> &panel) noexcept;
|
||||
|
||||
inline int freePanel() const noexcept;
|
||||
inline void freePanelToRight();
|
||||
inline void freePanelToLeft();
|
||||
|
||||
void addInventoryIcon(std::shared_ptr<QWTrigger> &inventory_icon);
|
||||
void removeInventoryIcon(std::shared_ptr<QWTrigger> &inventory_icon);
|
||||
|
||||
public slots:
|
||||
void onClicked();
|
||||
};
|
||||
|
||||
#endif // INVENTORYMANAGER_H
|
|
@ -0,0 +1,470 @@
|
|||
#include <QDebug>
|
||||
#include "gamefeatures.h"
|
||||
#include "qw_levelbuilder.h"
|
||||
#include "qw_eventfactory.h"
|
||||
#include "qw_dialoguefactory.h"
|
||||
#include "qw_globalmetadata.h"
|
||||
#include "view/qw_scene.h"
|
||||
#include "models/qw_location.h"
|
||||
#include "models/qw_trigger.h"
|
||||
|
||||
QWLevelBuilder::QWLevelBuilder(QObject *parent) :
|
||||
QObject(parent),
|
||||
str_current_level(strInitLevel())
|
||||
{
|
||||
// Dir for local save files
|
||||
if (!QDir("save").exists()) {
|
||||
QDir().mkdir("save");
|
||||
}
|
||||
save_dir.setPath("save");
|
||||
}
|
||||
|
||||
template<typename MODEL>
|
||||
QJsonArray writeEntitesToJsonArray(const QHash<QString, std::shared_ptr<MODEL>> &hash_models)
|
||||
{
|
||||
// Writing in active save file all the game elements and their state
|
||||
QJsonArray json_array;
|
||||
for (const auto &model : hash_models)
|
||||
{
|
||||
QJsonObject model_data;
|
||||
model->writeToJson(model_data);
|
||||
|
||||
json_array.append(model_data);
|
||||
}
|
||||
return json_array;
|
||||
}
|
||||
|
||||
void QWLevelBuilder::initMenuLevel()
|
||||
{
|
||||
str_current_level = "menu";
|
||||
|
||||
QFile file(":/res/menu.json");
|
||||
|
||||
Q_ASSERT(file.open(QIODevice::ReadOnly));
|
||||
const QByteArray json_arr = file.readAll();
|
||||
file.close();
|
||||
|
||||
QJsonObject savefile = QJsonDocument::fromJson(json_arr).object();
|
||||
init(savefile);
|
||||
}
|
||||
|
||||
void QWLevelBuilder::initSaveProfile(const QString &filename, const QString &profilename)
|
||||
{
|
||||
Q_UNUSED(profilename)
|
||||
|
||||
// Creating inital save file after beginning the new game:
|
||||
str_profile_filename = filename;
|
||||
str_current_level = strInitLevel();
|
||||
|
||||
QFile file;
|
||||
|
||||
str_profile_filename.remove(".json");
|
||||
|
||||
// We move default game description to player's save file
|
||||
|
||||
file.setFileName(save_dir.path() + "/" + str_profile_filename + ".json");
|
||||
|
||||
qDebug() << save_dir.path() + "/" + str_profile_filename + ".json";
|
||||
|
||||
if (!file.exists()) {
|
||||
qDebug() << "copy file";
|
||||
QFile::copy(":/res/defaultsave.json", file.fileName());
|
||||
}
|
||||
|
||||
// Now we modify default json file to add the chosen profile name
|
||||
|
||||
/*Q_ASSERT(file.open(QIODevice::ReadOnly));
|
||||
const QByteArray json_arr = file.readAll();
|
||||
file.close();
|
||||
|
||||
QJsonObject savefile = QJsonDocument::fromJson(json_arr).object();
|
||||
|
||||
// Pull the saved string from new game dialogue
|
||||
str_current_profile = profilename;
|
||||
savefile.insert("save_profile", str_current_profile);
|
||||
|
||||
// Write it and resave
|
||||
Q_ASSERT(file.open(QIODevice::WriteOnly));
|
||||
file.write(QJsonDocument(savefile).toJson());
|
||||
file.close();*/
|
||||
}
|
||||
|
||||
void QWLevelBuilder::saveGame(/*QString filename*/)
|
||||
{
|
||||
qDebug() << "Save current game!";
|
||||
|
||||
QJsonObject savejson;
|
||||
QJsonArray json_entites;
|
||||
|
||||
/* The first Trigger which moves player into its
|
||||
* needed location where the game starts */
|
||||
savejson.insert("init", "spawn");
|
||||
savejson.insert("save_profile", str_current_profile);
|
||||
|
||||
qDebug() << "Save triggers!";
|
||||
json_entites = writeEntitesToJsonArray(hash_triggers);
|
||||
savejson.insert("triggers", json_entites);
|
||||
|
||||
qDebug() << "Save dialogues!";
|
||||
json_entites = writeEntitesToJsonArray(hash_dialogues);
|
||||
savejson.insert("dialogues", json_entites);
|
||||
|
||||
qDebug() << "Save locations!";
|
||||
json_entites = writeEntitesToJsonArray(hash_locations);
|
||||
savejson.insert("locations", json_entites);
|
||||
|
||||
qDebug() << "Save events!";
|
||||
json_entites = writeEntitesToJsonArray(hash_events);
|
||||
|
||||
// Creating the inital event where player must appear after game loading
|
||||
QJsonObject init_spawn_data;
|
||||
|
||||
QStringList trs;
|
||||
for (auto & tr : ptr_scene->currentLocation()->triggers())
|
||||
trs << tr->tag();
|
||||
|
||||
QList<std::shared_ptr<QWTrigger>> list_triggers;
|
||||
init_spawn_data.insert("id", "spawn");
|
||||
init_spawn_data.insert("type", 0);
|
||||
init_spawn_data.insert("trs", QJsonArray::fromStringList(trs));
|
||||
json_entites.append(init_spawn_data);
|
||||
|
||||
savejson.insert("events", json_entites);
|
||||
// - - - //
|
||||
|
||||
QFile file(save_dir.dirName() + "/" + str_profile_filename + ".json");
|
||||
Q_ASSERT(file.open(QIODevice::ReadOnly));
|
||||
const QByteArray json_arr = file.readAll();
|
||||
file.close();
|
||||
QJsonObject savefile = QJsonDocument::fromJson(json_arr).object();
|
||||
|
||||
savefile[str_current_level] = savejson;
|
||||
|
||||
Q_ASSERT(file.open(QIODevice::WriteOnly));
|
||||
file.write(QJsonDocument(savejson).toJson());
|
||||
file.close();
|
||||
}
|
||||
|
||||
void QWLevelBuilder::loadGame(/*QString filename*/)
|
||||
{
|
||||
QFile file;
|
||||
|
||||
hash_events.clear();
|
||||
hash_triggers.clear();
|
||||
hash_dialogues.clear();
|
||||
hash_locations.clear();
|
||||
init_trigger.reset();
|
||||
|
||||
file.setFileName(save_dir.dirName() + "/" + str_profile_filename + ".json");
|
||||
file.open(QIODevice::ReadOnly);
|
||||
const QByteArray json_arr = file.readAll();
|
||||
file.close();
|
||||
QJsonObject savefile = QJsonDocument::fromJson(json_arr).object();
|
||||
|
||||
str_current_level = savefile["init_level"].toString();
|
||||
|
||||
init(savefile);
|
||||
}
|
||||
|
||||
void QWLevelBuilder::initLevel(const QString &lvlname)
|
||||
{
|
||||
str_current_level = lvlname;
|
||||
|
||||
QFile file(save_dir.dirName() + "/" + str_profile_filename + ".json");
|
||||
|
||||
Q_ASSERT(file.open(QIODevice::ReadOnly));
|
||||
const QByteArray json_arr = file.readAll();
|
||||
file.close();
|
||||
|
||||
emit ptr_scene->signalLeaveMenu();
|
||||
|
||||
QJsonObject savefile = QJsonDocument::fromJson(json_arr).object();
|
||||
init(savefile);
|
||||
}
|
||||
|
||||
void QWLevelBuilder::init(const QJsonObject & savefile)
|
||||
{
|
||||
qDebug() << "Init " << str_current_level << " level!";
|
||||
|
||||
hash_events.clear();
|
||||
hash_triggers.clear();
|
||||
init_trigger.reset();
|
||||
|
||||
level = savefile[str_current_level].toObject();
|
||||
|
||||
Q_ASSERT(!level.isEmpty());
|
||||
|
||||
// Building level from current json
|
||||
|
||||
if (level.contains("triggers"))
|
||||
setupTriggers(level["triggers"].toArray());
|
||||
|
||||
if (level.contains("dialogues"))
|
||||
setupDialogues(level["dialogues"].toArray());
|
||||
|
||||
if (level.contains("locations"))
|
||||
setupLocations(level["locations"].toArray());
|
||||
|
||||
if (level.contains("events"))
|
||||
setupEvents(level["events"].toArray());
|
||||
|
||||
linkEvents(level["triggers"].toArray());
|
||||
|
||||
init_trigger = level.contains("init") ? hash_triggers[level["init"].toString()] : nullptr;
|
||||
|
||||
// Start the level
|
||||
Q_ASSERT(init_trigger);
|
||||
init_trigger->activate();
|
||||
}
|
||||
|
||||
QString QWLevelBuilder::strInitLevel() noexcept
|
||||
{
|
||||
return "start";
|
||||
}
|
||||
|
||||
void QWLevelBuilder::setGameFeatures(std::unique_ptr<GameFeatures> &features)
|
||||
{
|
||||
ptr_scene = features->ptr_scene;
|
||||
ptr_inventory = features->ptr_inventory;
|
||||
ptr_soundplayer = features->ptr_sound_player;
|
||||
ptr_text_dlg = features->ptr_text_dlg;
|
||||
ptr_widget_dlg = features->ptr_widget_dlg;
|
||||
}
|
||||
|
||||
void QWLevelBuilder::linkEvents(const QJsonArray &array)
|
||||
{
|
||||
qDebug() << "Link the events to triggers!";
|
||||
|
||||
for (const QJsonValue &json_value : array)
|
||||
{
|
||||
QJsonObject json_object(json_value.toObject());
|
||||
if (json_object.contains("evs"))
|
||||
{
|
||||
qDebug() << " Trigger " << json_object["id"].toString() << " contains events!";
|
||||
|
||||
QJsonArray evs = json_object["evs"].toArray();
|
||||
|
||||
for (const QJsonValue event : evs)
|
||||
{
|
||||
QString obj = event.toString();
|
||||
qDebug() << " Inserting " << obj << " to its trigger!";
|
||||
hash_triggers[json_object["id"].toString()]->addEvents(hash_events[obj]);
|
||||
qDebug() << " Success!";
|
||||
}
|
||||
}
|
||||
|
||||
if (json_object.contains("examine_dialogue"))
|
||||
{
|
||||
qDebug() << " Trigger " << json_object["id"].toString() << " contains examination dialogue!";
|
||||
|
||||
const QString dialogue_tag = json_object["examine_dialogue"].toString();
|
||||
hash_triggers[json_object["id"].toString()]->setExaminationDialogueEvent(hash_events[dialogue_tag]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * SETUP STUFF * * * * * * * * * * * * * *
|
||||
//
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
|
||||
void QWLevelBuilder::setupTriggers(const QJsonArray &array)
|
||||
{
|
||||
qDebug() << "Setup the triggers!";
|
||||
|
||||
QJsonObject json_object;
|
||||
|
||||
for (const QJsonValue &json_value : array)
|
||||
{
|
||||
json_object = json_value.toObject();
|
||||
|
||||
std::shared_ptr<QWTrigger> new_trigger;
|
||||
|
||||
// check if the picture exists!
|
||||
Q_ASSERT(json_object.contains("id"));
|
||||
QString mask = json_object.contains("mask") ? json_object["mask"].toString() : json_object["id"].toString();
|
||||
new_trigger = std::make_shared<QWTrigger>(mask);
|
||||
new_trigger->setTag(json_object["id"].toString());
|
||||
qDebug() << "! The trigger with id " << json_object["id"].toString() << " was created.";
|
||||
|
||||
// setup the position on the scene
|
||||
if (json_object.contains("x") && json_object.contains("y")) {
|
||||
new_trigger->setPos(json_object["x"].toDouble(), json_object["y"].toDouble());
|
||||
qDebug() << " The trigger was moved to "
|
||||
<< new_trigger->x() << " " << new_trigger->y();
|
||||
}
|
||||
|
||||
hash_triggers.insert(json_object["id"].toString(), new_trigger);
|
||||
qDebug() << " The trigger was inserted into its map.\n - - -";
|
||||
}
|
||||
}
|
||||
|
||||
void QWLevelBuilder::setupEvents(const QJsonArray &array)
|
||||
{
|
||||
qDebug() << "Setup the events!";
|
||||
|
||||
std::unique_ptr<QWEventFactory> factory = std::make_unique<QWEventFactory>(this);
|
||||
|
||||
QJsonObject json_object;
|
||||
QList<QJsonObject> list_later_events;
|
||||
|
||||
for (const QJsonValue &json_value : array)
|
||||
{
|
||||
json_object = json_value.toObject();
|
||||
|
||||
std::shared_ptr<QWAbstractEvent> new_event;
|
||||
|
||||
// check if the id exists!
|
||||
Q_ASSERT(json_object.contains("id"));
|
||||
qDebug() << "! The event with id " << json_object["id"].toString() << " is about to create.";
|
||||
|
||||
// independent events
|
||||
Q_ASSERT(json_object.contains("type"));
|
||||
int type = json_object["type"].toInt();
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case (EVENT_TYPE::CHANGE_LOCATION):
|
||||
new_event = factory->createChangeLocEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::DELETE_FROM_INVENTORY):
|
||||
new_event = factory->createDeleteItEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::PICKUP_ITEM):
|
||||
new_event = factory->createPickupItEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::END_LEVEL):
|
||||
new_event = factory->createEndLevelEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::CHANGE_TRIGGER_PROPERTIES):
|
||||
new_event = factory->createChangeTrProperts(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::NEW_GAME):
|
||||
new_event = factory->createNewGameEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::QUIT_GAME):
|
||||
new_event = factory->createQuitGameEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::START_DIALOGUE):
|
||||
new_event = factory->createStartDlgEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::ADD_TRIGGER):
|
||||
new_event = factory->createAddTrEvent(json_object);
|
||||
break;
|
||||
case (EVENT_TYPE::REMOVE_TRIGGER):
|
||||
new_event = factory->createRemoveTrEvent(json_object);
|
||||
break;
|
||||
default:
|
||||
list_later_events.append(json_object);
|
||||
continue;
|
||||
}
|
||||
|
||||
new_event->setTag(json_object["id"].toString());
|
||||
hash_events.insert(json_object["id"].toString(), new_event);
|
||||
}
|
||||
|
||||
// Some events work with other events, so we need to initialize all
|
||||
// independent events earlier than these
|
||||
for (const auto &later_event : list_later_events) {
|
||||
|
||||
int type = later_event["type"].toInt();
|
||||
std::shared_ptr<QWAbstractEvent> new_event;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case (EVENT_TYPE::SWITCH_EVENTS): // switch events
|
||||
new_event = factory->createSwitchEventsEvent(later_event);
|
||||
break;
|
||||
default:
|
||||
Q_ASSERT(false);
|
||||
continue;
|
||||
}
|
||||
|
||||
new_event->setTag(later_event["id"].toString());
|
||||
hash_events.insert(later_event["id"].toString(), new_event);
|
||||
}
|
||||
}
|
||||
|
||||
void QWLevelBuilder::setupDialogues(const QJsonArray &array)
|
||||
{
|
||||
qDebug() << "Setup the dialogues!";
|
||||
|
||||
std::unique_ptr<QWDialogueFactory> factory = std::make_unique<QWDialogueFactory>(this);
|
||||
|
||||
QJsonObject json_object;
|
||||
|
||||
for (const QJsonValue &json_value : array)
|
||||
{
|
||||
json_object = json_value.toObject();
|
||||
|
||||
std::shared_ptr<QWAbstractGameDialogue> new_dialogue;
|
||||
|
||||
// check if the id exists!
|
||||
Q_ASSERT(json_object.contains("id"));
|
||||
qDebug() << "! The dialogue with id " << json_object["id"].toString() << " is about to create.";
|
||||
|
||||
Q_ASSERT(json_object.contains("type"));
|
||||
int type = json_object["type"].toInt();
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case (DIALOGUE_TYPE::TEXT):
|
||||
new_dialogue = factory->createTextDialogue(json_object);
|
||||
break;
|
||||
case (DIALOGUE_TYPE::WIDGET):
|
||||
new_dialogue = factory->createWidgetDialogue(json_object);
|
||||
break;
|
||||
default:
|
||||
Q_ASSERT(false);
|
||||
}
|
||||
|
||||
new_dialogue->setTag(json_object["id"].toString());
|
||||
hash_dialogues.insert(json_object["id"].toString(), new_dialogue);
|
||||
}
|
||||
}
|
||||
|
||||
void QWLevelBuilder::setupLocations(const QJsonArray &array)
|
||||
{
|
||||
qDebug() << "Setup the locations!";
|
||||
|
||||
QJsonObject json_object;
|
||||
|
||||
for (const QJsonValue & json_value : array)
|
||||
{
|
||||
json_object = json_value.toObject();
|
||||
|
||||
std::shared_ptr<QWLocation> new_location;
|
||||
|
||||
Q_ASSERT(json_object.contains("id"));
|
||||
qDebug() << "! The level with id " << json_object["id"].toString() << " was created.";
|
||||
new_location = std::make_shared<QWLocation>();
|
||||
new_location->setTag(json_object["id"].toString());
|
||||
|
||||
// check and add the pixmap triggers
|
||||
Q_ASSERT(json_object.contains("triggers"));
|
||||
if (json_object.contains("triggers")) {
|
||||
|
||||
qDebug() << " Found triggers!";
|
||||
QJsonArray loc_triggers = json_value["triggers"].toArray();
|
||||
|
||||
for (const QJsonValue trg : loc_triggers)
|
||||
{
|
||||
qDebug() << " Added the trigger " << trg.toString();
|
||||
new_location->addTriggers( hash_triggers[trg.toString()] );
|
||||
}
|
||||
}
|
||||
|
||||
if (json_object.contains("triggers"))
|
||||
new_location->setDiscovered(json_object["discovered"].toBool());
|
||||
|
||||
// check if it has a background
|
||||
if (json_object.contains("background")) {
|
||||
qDebug() << " Here is a background.";
|
||||
QString b = json_value["background"].toString();
|
||||
new_location->addTriggers(hash_triggers[b]);
|
||||
qDebug() << " Background was added.";
|
||||
}
|
||||
|
||||
hash_locations.insert(json_object["id"].toString(), new_location);
|
||||
qDebug() << " The level was inserted into its map.\n - - -";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
#ifndef LEVELBUILDER_H
|
||||
#define LEVELBUILDER_H
|
||||
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonArray>
|
||||
|
||||
/* QWLevelBuilder
|
||||
* Saves and loads game sessions by managing dependent json files. */
|
||||
|
||||
struct GameFeatures;
|
||||
|
||||
class QWScene;
|
||||
class QWAbstractEvent;
|
||||
class QWAbstractGameDialogue;
|
||||
class QWInventoryManager;
|
||||
class QWTextDialogueManager;
|
||||
class QWWidgetDialogueManager;
|
||||
class QWSoundPlayer;
|
||||
class QWTrigger;
|
||||
class QWLocation;
|
||||
|
||||
class QWLevelBuilder final : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWLevelBuilder)
|
||||
friend class QWEventFactory;
|
||||
friend class QWDialogueFactory;
|
||||
private:
|
||||
QDir save_dir;
|
||||
|
||||
QString str_profile_filename;
|
||||
QString str_current_profile;
|
||||
QString str_current_level;
|
||||
|
||||
QJsonObject level;
|
||||
|
||||
QWInventoryManager *ptr_inventory;
|
||||
QWScene *ptr_scene;
|
||||
QWSoundPlayer *ptr_soundplayer;
|
||||
QWTextDialogueManager *ptr_text_dlg;
|
||||
QWWidgetDialogueManager *ptr_widget_dlg;
|
||||
|
||||
QHash<QString, std::shared_ptr<QWAbstractEvent>> hash_events;
|
||||
QHash<QString, std::shared_ptr<QWTrigger>> hash_triggers;
|
||||
QHash<QString, std::shared_ptr<QWAbstractGameDialogue>> hash_dialogues;
|
||||
QHash<QString, std::shared_ptr<QWLocation>> hash_locations;
|
||||
|
||||
std::shared_ptr<QWTrigger> init_trigger;
|
||||
|
||||
void setupTriggers(const QJsonArray &array);
|
||||
void setupEvents(const QJsonArray &array);
|
||||
void linkEvents(const QJsonArray &array);
|
||||
void setupDialogues(const QJsonArray &array);
|
||||
void setupLocations(const QJsonArray &array);
|
||||
|
||||
void init(const QJsonObject & savefile);
|
||||
|
||||
public:
|
||||
explicit QWLevelBuilder(QObject *parent = nullptr);
|
||||
|
||||
void setGameFeatures(std::unique_ptr<GameFeatures> &features);
|
||||
void initLevel(const QString &lvlname);
|
||||
void initSaveProfile(const QString &filename, const QString &profilename);
|
||||
void initMenuLevel();
|
||||
|
||||
static QString strInitLevel() noexcept;
|
||||
|
||||
public slots:
|
||||
void saveGame( );
|
||||
void loadGame(/*int on_id*/);
|
||||
};
|
||||
|
||||
#endif // LEVELBUILDER_H
|
|
@ -0,0 +1,121 @@
|
|||
#include "qw_soundplayer.h"
|
||||
|
||||
QWSoundPlayer::QWSoundPlayer(QObject *parent) :
|
||||
QObject(parent),
|
||||
i_volume(100),
|
||||
b_muted(false),
|
||||
player_loop(new QMediaPlayer(this)),
|
||||
playlist_loop(new QMediaPlaylist(this)),
|
||||
player_single(new QMediaPlayer(this)),
|
||||
player_music(new QMediaPlayer(this)),
|
||||
playlist_music(new QMediaPlaylist(this))
|
||||
{
|
||||
// Music
|
||||
playlist_music->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
|
||||
playlist_music->setCurrentIndex(0);
|
||||
|
||||
player_music->setAudioRole(QAudio::MusicRole);
|
||||
player_music->setPlaylist(playlist_music);
|
||||
QObject::connect(this,
|
||||
SIGNAL(transferSetMuteness(bool)),
|
||||
player_music,
|
||||
SLOT(setMuted(bool)));
|
||||
QObject::connect(this,
|
||||
SIGNAL(transferAdjustVolume(int)),
|
||||
player_music,
|
||||
SLOT(setVolume(int)));
|
||||
QObject::connect(this,
|
||||
SIGNAL(playMusic()),
|
||||
player_music,
|
||||
SLOT(play()));
|
||||
|
||||
// Loop sounds
|
||||
playlist_loop->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
|
||||
playlist_loop->setCurrentIndex(0);
|
||||
|
||||
player_loop->setAudioRole(QAudio::GameRole);
|
||||
player_loop->setPlaylist(playlist_loop);
|
||||
QObject::connect(this,
|
||||
SIGNAL(transferSetMuteness(bool)),
|
||||
player_loop,
|
||||
SLOT(setMuted(bool)));
|
||||
QObject::connect(this,
|
||||
SIGNAL(transferAdjustVolume(int)),
|
||||
player_loop,
|
||||
SLOT(setVolume(int)));
|
||||
QObject::connect(this,
|
||||
SIGNAL(playLoop()),
|
||||
player_loop,
|
||||
SLOT(play()));
|
||||
|
||||
// Single sounds
|
||||
player_single->setAudioRole(QAudio::GameRole);
|
||||
QObject::connect(this,
|
||||
SIGNAL(transferSetMuteness(bool)),
|
||||
player_single,
|
||||
SLOT(setMuted(bool)));
|
||||
QObject::connect(this,
|
||||
SIGNAL(transferAdjustVolume(int)),
|
||||
player_single,
|
||||
SLOT(setVolume(int)));
|
||||
QObject::connect(this,
|
||||
SIGNAL(playSingle()),
|
||||
player_single,
|
||||
SLOT(play()));
|
||||
}
|
||||
|
||||
int QWSoundPlayer::addMusic(const QString &path)
|
||||
{
|
||||
playlist_music->addMedia(QUrl::fromLocalFile(path));
|
||||
playlist_music->setCurrentIndex(playlist_music->currentIndex() + 1);
|
||||
|
||||
return playlist_music->currentIndex() - 1;
|
||||
}
|
||||
|
||||
bool QWSoundPlayer::isMuted() const noexcept
|
||||
{
|
||||
return b_muted;
|
||||
}
|
||||
|
||||
int QWSoundPlayer::volume() const noexcept
|
||||
{
|
||||
return i_volume;
|
||||
}
|
||||
|
||||
void QWSoundPlayer::playSound(QMediaContent *sound)
|
||||
{
|
||||
player_single->stop();
|
||||
player_single->setMedia(*sound);
|
||||
emit playSingle();
|
||||
}
|
||||
|
||||
void QWSoundPlayer::playMusic(const int index)
|
||||
{
|
||||
playlist_music->setCurrentIndex(index);
|
||||
emit playMusic();
|
||||
}
|
||||
|
||||
void QWSoundPlayer::stopMusic()
|
||||
{
|
||||
player_music->stop();
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWSoundPlayer::setMuteness(bool mute) noexcept
|
||||
{
|
||||
b_muted = mute;
|
||||
emit transferSetMuteness(b_muted);
|
||||
}
|
||||
|
||||
void QWSoundPlayer::adjustVolume(int vol) noexcept
|
||||
{
|
||||
i_volume = vol;
|
||||
emit transferAdjustVolume(i_volume);
|
||||
}
|
||||
|
||||
void QWSoundPlayer::onEndLevel() noexcept
|
||||
{
|
||||
playlist_music->clear();
|
||||
playlist_music->setCurrentIndex(0);
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
#ifndef SOUNDPLAYER_H
|
||||
#define SOUNDPLAYER_H
|
||||
|
||||
#include <memory>
|
||||
#include <QMediaPlayer>
|
||||
#include <QMediaPlaylist>
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
//// DOESN'T WORK! Has to be reworked in master-merge 1.2
|
||||
//// https://trello.com/c/KFUhEbYh/62-reimplement-sound-system
|
||||
|
||||
class QWSoundPlayer final : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWSoundPlayer)
|
||||
private:
|
||||
int i_volume;
|
||||
bool b_muted;
|
||||
|
||||
////////////////////////
|
||||
|
||||
////////
|
||||
//// Background sounds in loop.
|
||||
QMediaPlayer *player_loop;
|
||||
QMediaPlaylist *playlist_loop;
|
||||
////////
|
||||
//// Sounds which should play once per call.
|
||||
QMediaPlayer *player_single;
|
||||
////////
|
||||
//// Music is music.
|
||||
QMediaPlayer *player_music;
|
||||
QMediaPlaylist *playlist_music;
|
||||
|
||||
public:
|
||||
explicit QWSoundPlayer(QObject *parent = nullptr);
|
||||
|
||||
int addMusic(const QString &path);
|
||||
|
||||
inline bool isMuted() const noexcept;
|
||||
inline int volume() const noexcept;
|
||||
void playSound(QMediaContent *sound);
|
||||
void playMusic(const int index);
|
||||
void stopMusic();
|
||||
|
||||
////////////////////////
|
||||
|
||||
public slots:
|
||||
void setMuteness(bool mute) noexcept;
|
||||
void adjustVolume(int vol) noexcept;
|
||||
void onEndLevel() noexcept;
|
||||
|
||||
signals:
|
||||
void transferSetMuteness(bool);
|
||||
void transferAdjustVolume(int);
|
||||
void playLoop();
|
||||
void playSingle();
|
||||
void playMusic();
|
||||
|
||||
};
|
||||
|
||||
#endif // SOUNDPLAYER_H
|
|
@ -0,0 +1,15 @@
|
|||
#include "qw_statemachine.h"
|
||||
|
||||
QWStateMachine::QWStateMachine(QObject *parent) :
|
||||
QStateMachine(parent)
|
||||
{}
|
||||
|
||||
void QWStateMachine::registerState(QString &&str, QState *state) noexcept
|
||||
{
|
||||
hash_states.insert(str, state);
|
||||
}
|
||||
|
||||
QState *QWStateMachine::stateByKey(QString &&str) noexcept
|
||||
{
|
||||
return hash_states[str];
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef STATEMACHINE_H
|
||||
#define STATEMACHINE_H
|
||||
|
||||
#include <QStateMachine>
|
||||
|
||||
/* QWStateMachine
|
||||
* Inherited realization of qt state machine for simpler state managment. */
|
||||
|
||||
class QWStateMachine final : public QStateMachine
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWStateMachine)
|
||||
private:
|
||||
QHash<QString, QState*> hash_states;
|
||||
|
||||
public:
|
||||
explicit QWStateMachine(QObject *parent = nullptr);
|
||||
|
||||
void registerState(QString &&str, QState *state) noexcept;
|
||||
QState *stateByKey(QString &&str) noexcept;
|
||||
};
|
||||
|
||||
#endif // STATEMACHINE_H
|
|
@ -0,0 +1,60 @@
|
|||
#include "models/dialogues/qw_textdialogue.h"
|
||||
#include "qw_textdialoguemanager.h"
|
||||
|
||||
QWTextDialogueManager::QWTextDialogueManager(QWScene *scene) :
|
||||
QWAbstractDialogueManager(scene),
|
||||
p_frametext(new QGraphicsSimpleTextItem)
|
||||
{
|
||||
p_frametext->setFont(QFont("Arial", 25));
|
||||
p_frametext->setBrush(QBrush(Qt::white));
|
||||
p_frametext->setPos(12, 12);
|
||||
scene->addItem(p_frametext);
|
||||
}
|
||||
|
||||
QWTextDialogueManager::~QWTextDialogueManager()
|
||||
{
|
||||
delete p_frametext;
|
||||
}
|
||||
|
||||
void QWTextDialogueManager::activateDialogue(const std::shared_ptr<QWAbstractGameDialogue> &dialogue)
|
||||
{
|
||||
/* Moving to text dialogue state.
|
||||
* Make the panel with text visible.
|
||||
* Game freezes until when player reads all
|
||||
* the frames. */
|
||||
|
||||
ptr_text_dialogue = std::dynamic_pointer_cast<QWTextDialogue>(dialogue);
|
||||
|
||||
connect(ptr_scene, SIGNAL(signalClickDialogue(MouseButton)), this, SLOT(onClicked(MouseButton)));
|
||||
|
||||
emit onEntryDialogueTransition();
|
||||
|
||||
p_frametext->show();
|
||||
|
||||
// Show the first page of active dialogue.
|
||||
p_frametext->setText(ptr_text_dialogue->currentText());
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWTextDialogueManager::setDialoguePanel(const std::shared_ptr<QGraphicsWidget> &panel) noexcept
|
||||
{
|
||||
p_textbox = panel;
|
||||
}
|
||||
|
||||
void QWTextDialogueManager::onClicked(MouseButton mouse_button)
|
||||
{
|
||||
const bool has_next_pages = ptr_text_dialogue->toNextPage();
|
||||
|
||||
if (!has_next_pages || mouse_button == MouseButton::RIGHT) {
|
||||
p_frametext->hide();
|
||||
ptr_text_dialogue->resetPage();
|
||||
ptr_text_dialogue->onExit(static_cast<int>(mouse_button));
|
||||
|
||||
disconnect(ptr_scene, SIGNAL(signalClickDialogue(MouseButton)), this, SLOT(onClicked(MouseButton)));
|
||||
|
||||
emit onLeaveDialogueTransition();
|
||||
|
||||
} else
|
||||
p_frametext->setText(ptr_text_dialogue->currentText());
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
#ifndef DIALOGUEMANAGER_H
|
||||
#define DIALOGUEMANAGER_H
|
||||
|
||||
#include "qw_abstractdialoguemanager.h"
|
||||
#include <QGraphicsPixmapItem>
|
||||
#include <QLinkedList>
|
||||
#include <QObject>
|
||||
|
||||
/* QWTextDialogueManager
|
||||
* Controls text game-freezing dialogues. */
|
||||
|
||||
class QWTextDialogue;
|
||||
|
||||
class QWTextDialogueManager final : public QWAbstractDialogueManager
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWTextDialogueManager)
|
||||
private:
|
||||
std::shared_ptr<QWTextDialogue> ptr_text_dialogue;
|
||||
std::shared_ptr<QGraphicsWidget> p_textbox;
|
||||
QGraphicsSimpleTextItem *p_frametext;
|
||||
|
||||
public:
|
||||
explicit QWTextDialogueManager(QWScene *scene = nullptr);
|
||||
virtual ~QWTextDialogueManager() override;
|
||||
|
||||
virtual void activateDialogue(const std::shared_ptr<QWAbstractGameDialogue> &dialogue) override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setDialoguePanel(const std::shared_ptr<QGraphicsWidget> &panel) noexcept;
|
||||
|
||||
public slots:
|
||||
virtual void onClicked(MouseButton mouse_button) override;
|
||||
};
|
||||
|
||||
#endif // DIALOGUEMANAGER_H
|
|
@ -0,0 +1,50 @@
|
|||
#include "models/dialogues/qw_widgetdialogue.h"
|
||||
#include "qw_widgetdialoguemanager.h"
|
||||
#include "qw_globalmetadata.h"
|
||||
#include <QQuickWidget>
|
||||
#include <QQmlEngine>
|
||||
#include <QQmlContext>
|
||||
|
||||
QWWidgetDialogueManager::QWWidgetDialogueManager(QWScene *scene) :
|
||||
QWAbstractDialogueManager(scene)
|
||||
{}
|
||||
|
||||
QWWidgetDialogueManager::~QWWidgetDialogueManager()
|
||||
{}
|
||||
|
||||
void QWWidgetDialogueManager::activateDialogue(const std::shared_ptr<QWAbstractGameDialogue> &dialogue)
|
||||
{
|
||||
widget_dialogue = std::dynamic_pointer_cast<QWWidgetDialogue>(dialogue);
|
||||
|
||||
connect(ptr_scene, SIGNAL(signalClickDialogue(MouseButton)), this, SLOT(onClicked(MouseButton)));
|
||||
|
||||
emit onEntryDialogueTransition();
|
||||
|
||||
quick_view = new QQuickWidget;
|
||||
// Moving dialogue model into qml widget to handle the properties from inside
|
||||
quick_view->engine()->rootContext()->setContextProperty("dialogue", widget_dialogue.get());
|
||||
quick_view->setSource(QUrl::fromLocalFile(widget_dialogue->qmlPath()));
|
||||
|
||||
QObject::connect(quick_view, SIGNAL(destroyed()), this, SLOT(onDestroyingWidget()));
|
||||
}
|
||||
|
||||
void QWWidgetDialogueManager::onClicked(MouseButton mouse_button)
|
||||
{
|
||||
if (mouse_button == MouseButton::RIGHT)
|
||||
quick_view->close();
|
||||
}
|
||||
|
||||
void QWWidgetDialogueManager::onDestroyingWidget()
|
||||
{
|
||||
// Testing
|
||||
qDebug() << "Exit code:" << widget_dialogue->exitCode();
|
||||
|
||||
disconnect(ptr_scene, SIGNAL(signalClickDialogue(MouseButton)), this, SLOT(onClicked(MouseButton)));
|
||||
|
||||
if (widget_dialogue->isCustomStringToSave())
|
||||
QWGlobalMetadata::setValue(widget_dialogue->tag(), widget_dialogue->customString());
|
||||
|
||||
widget_dialogue->onExit(widget_dialogue->exitCode());
|
||||
|
||||
emit onLeaveDialogueTransition();
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
#ifndef QWWIDGETDIALOGUEMANAGER_H
|
||||
#define QWWIDGETDIALOGUEMANAGER_H
|
||||
|
||||
#include "qw_abstractdialoguemanager.h"
|
||||
|
||||
class QWWidgetDialogue;
|
||||
class QQuickWidget;
|
||||
|
||||
class QWWidgetDialogueManager final : public QWAbstractDialogueManager
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWWidgetDialogueManager)
|
||||
private:
|
||||
std::shared_ptr<QWWidgetDialogue> widget_dialogue;
|
||||
QQuickWidget *quick_view;
|
||||
|
||||
public:
|
||||
explicit QWWidgetDialogueManager(QWScene *scene = nullptr);
|
||||
virtual ~QWWidgetDialogueManager() override;
|
||||
|
||||
virtual void activateDialogue(const std::shared_ptr<QWAbstractGameDialogue> &dialogue) override;
|
||||
|
||||
public slots:
|
||||
virtual void onClicked(MouseButton mouse_button) override;
|
||||
void onDestroyingWidget();
|
||||
};
|
||||
|
||||
#endif // QWWIDGETDIALOGUEMANAGER_H
|
|
@ -0,0 +1,114 @@
|
|||
#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();
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
#ifndef QWABSTRACTGAMEDIALOGUE_H
|
||||
#define QWABSTRACTGAMEDIALOGUE_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "models/events/qw_abstractevent.h"
|
||||
|
||||
/* QWAbstractGameDialogue
|
||||
* Interface for all in-game dialogues. */
|
||||
|
||||
class QWAbstractGameDialogue : public QWTagHolder
|
||||
{
|
||||
protected:
|
||||
QList<QList<std::shared_ptr<QWAbstractEvent>>> list_events;
|
||||
|
||||
public:
|
||||
QWAbstractGameDialogue();
|
||||
virtual ~QWAbstractGameDialogue() override = 0;
|
||||
|
||||
virtual void onExit(int code);
|
||||
virtual void setAllEvents(const QList<QList<std::shared_ptr<QWAbstractEvent>>> &evs);
|
||||
virtual void addEventsList(const QList<std::shared_ptr<QWAbstractEvent>> &evs);
|
||||
|
||||
////////////////////////
|
||||
|
||||
virtual void writeToJson(QJsonObject &savejson) override = 0;
|
||||
};
|
||||
|
||||
enum DIALOGUE_TYPE
|
||||
{
|
||||
// Pure visual-novel-like text
|
||||
TEXT,
|
||||
|
||||
// External widget with inner logic described with qml
|
||||
WIDGET
|
||||
};
|
||||
|
||||
#endif // QWABSTRACTGAMEDIALOGUE_H
|
|
@ -0,0 +1,48 @@
|
|||
#include "qw_textdialogue.h"
|
||||
|
||||
QWTextDialogue::QWTextDialogue(const QStringList &pages)
|
||||
{
|
||||
setPages(pages);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
bool QWTextDialogue::toNextPage() noexcept
|
||||
{
|
||||
const bool has_next = ((it_current_page + 1) != list_pages.end());
|
||||
|
||||
if (has_next)
|
||||
++it_current_page;
|
||||
|
||||
return has_next;
|
||||
}
|
||||
|
||||
void QWTextDialogue::resetPage() noexcept
|
||||
{
|
||||
it_current_page = list_pages.begin();
|
||||
}
|
||||
|
||||
void QWTextDialogue::setPages(const QStringList &pages) noexcept
|
||||
{
|
||||
list_pages = pages;
|
||||
Q_ASSERT(!list_pages.empty());
|
||||
|
||||
it_current_page = list_pages.begin();
|
||||
}
|
||||
|
||||
QStringList QWTextDialogue::pages() const noexcept
|
||||
{
|
||||
return list_pages;
|
||||
}
|
||||
|
||||
QString QWTextDialogue::currentText() const noexcept
|
||||
{
|
||||
return *it_current_page;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWTextDialogue::writeToJson(QJsonObject &savejson)
|
||||
{
|
||||
Q_UNUSED(savejson)
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
#ifndef QWTEXTDIALOGUE_H
|
||||
#define QWTEXTDIALOGUE_H
|
||||
|
||||
#include <QStringList>
|
||||
#include "qw_abstractgamedialogue.h"
|
||||
|
||||
/* QWTextDialogue
|
||||
* Provides text visual-novel-lide dialogue. */
|
||||
|
||||
class QWTextDialogue : public QWAbstractGameDialogue
|
||||
{
|
||||
protected:
|
||||
QStringList list_pages;
|
||||
QStringList::iterator it_current_page;
|
||||
|
||||
public:
|
||||
QWTextDialogue(const QStringList &pages);
|
||||
virtual ~QWTextDialogue() override {}
|
||||
|
||||
////////////////////////
|
||||
|
||||
bool toNextPage() noexcept;
|
||||
void resetPage() noexcept;
|
||||
|
||||
void setPages(const QStringList &pages) noexcept;
|
||||
QStringList pages() const noexcept;
|
||||
|
||||
QString currentText() const noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
virtual void writeToJson(QJsonObject &savejson) override;
|
||||
};
|
||||
|
||||
#endif // QWTEXTDIALOGUE_H
|
|
@ -0,0 +1,63 @@
|
|||
#include "qw_widgetdialogue.h"
|
||||
|
||||
QWWidgetDialogue::QWWidgetDialogue(const QString &path) :
|
||||
qml_path(path)
|
||||
{
|
||||
Q_ASSERT(!qml_path.isNull());
|
||||
// Filepath fixes
|
||||
if (!qml_path.endsWith(".qml"))
|
||||
qml_path += ".qml";
|
||||
if (!qml_path.startsWith("qml/"))
|
||||
qml_path = "qml/" + qml_path;
|
||||
}
|
||||
|
||||
void QWWidgetDialogue::onExit(int code)
|
||||
{
|
||||
Q_UNUSED(code)
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
QString QWWidgetDialogue::qmlPath() const
|
||||
{
|
||||
return qml_path;
|
||||
}
|
||||
|
||||
QString QWWidgetDialogue::customString() const
|
||||
{
|
||||
return custom_string;
|
||||
}
|
||||
|
||||
void QWWidgetDialogue::setCustomString(const QString &str)
|
||||
{
|
||||
custom_string = str;
|
||||
}
|
||||
|
||||
int QWWidgetDialogue::exitCode() const
|
||||
{
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
void QWWidgetDialogue::setExitCode(int code)
|
||||
{
|
||||
if (code != exit_code)
|
||||
exit_code = code;
|
||||
}
|
||||
|
||||
bool QWWidgetDialogue::isCustomStringToSave() const
|
||||
{
|
||||
return to_save_string;
|
||||
}
|
||||
|
||||
void QWWidgetDialogue::setCustomStringToSave(bool to_save)
|
||||
{
|
||||
to_save_string = to_save;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWWidgetDialogue::writeToJson(QJsonObject &savejson)
|
||||
{
|
||||
Q_UNUSED(savejson)
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
#ifndef WIDGETDIALOGUE_H
|
||||
#define WIDGETDIALOGUE_H
|
||||
|
||||
#include "qw_abstractgamedialogue.h"
|
||||
#include <QObject>
|
||||
|
||||
class QWWidgetDialogue : public QObject, public QWAbstractGameDialogue
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWWidgetDialogue)
|
||||
Q_PROPERTY(int exit_code READ exitCode WRITE setExitCode)
|
||||
Q_PROPERTY(QString custom_string READ customString WRITE setCustomString)
|
||||
Q_PROPERTY(bool to_save_string READ isCustomStringToSave WRITE setCustomStringToSave)
|
||||
private:
|
||||
QString qml_path;
|
||||
|
||||
QString custom_string;
|
||||
int exit_code;
|
||||
bool to_save_string;
|
||||
|
||||
public:
|
||||
explicit QWWidgetDialogue(const QString &path);
|
||||
virtual ~QWWidgetDialogue() override {}
|
||||
|
||||
void onExit(int code) override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
QString qmlPath() const;
|
||||
|
||||
QString customString() const;
|
||||
void setCustomString(const QString &str);
|
||||
|
||||
int exitCode() const;
|
||||
void setExitCode(int code);
|
||||
|
||||
bool isCustomStringToSave() const;
|
||||
void setCustomStringToSave(bool to_save);
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &savejson) override;
|
||||
};
|
||||
|
||||
#endif // WIDGETDIALOGUE_H
|
|
@ -0,0 +1,43 @@
|
|||
#ifndef QUESTEVENT_H
|
||||
#define QUESTEVENT_H
|
||||
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
|
||||
#include <QDebug>
|
||||
#include "../qw_tagholder.h"
|
||||
|
||||
/* QWAbstractEvent
|
||||
* Interface for all in-game events. The core of game logic process. */
|
||||
|
||||
class QWAbstractEvent : public QWTagHolder
|
||||
{
|
||||
public:
|
||||
QWAbstractEvent();
|
||||
virtual ~QWAbstractEvent() override = 0;
|
||||
|
||||
virtual void execute() = 0;
|
||||
|
||||
////////////////////////
|
||||
|
||||
virtual void writeToJson(QJsonObject &savejson) override = 0;
|
||||
};
|
||||
|
||||
enum EVENT_TYPE
|
||||
{
|
||||
CHANGE_LOCATION,
|
||||
SWITCH_EVENTS, // <- requires other events to be initialized
|
||||
DELETE_FROM_INVENTORY,
|
||||
END_LEVEL,
|
||||
PICKUP_ITEM,
|
||||
PLAY_SOUND,
|
||||
PLAY_MUSIC,
|
||||
CHANGE_TRIGGER_PROPERTIES,
|
||||
NEW_GAME,
|
||||
QUIT_GAME,
|
||||
START_DIALOGUE,
|
||||
ADD_TRIGGER,
|
||||
REMOVE_TRIGGER
|
||||
};
|
||||
|
||||
#endif // QUESTEVENT_H
|
|
@ -0,0 +1,20 @@
|
|||
#include "qw_abstractinventoryevent.h"
|
||||
|
||||
QWAbstractInventoryEvent:: QWAbstractInventoryEvent()
|
||||
{}
|
||||
|
||||
QWAbstractInventoryEvent::~QWAbstractInventoryEvent()
|
||||
{}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWAbstractInventoryEvent::setInventoryManager(QWInventoryManager *const inv) noexcept
|
||||
{
|
||||
ptr_inventory = inv;
|
||||
}
|
||||
|
||||
QWInventoryManager *QWAbstractInventoryEvent::inventoryManager() const noexcept
|
||||
{
|
||||
return ptr_inventory;
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef QUESTABSTRACTINVENTORYEVENT_H
|
||||
#define QUESTABSTRACTINVENTORYEVENT_H
|
||||
|
||||
#include "features/qw_inventorymanager.h"
|
||||
#include "qw_abstractevent.h"
|
||||
|
||||
/* QWAbstractInventoryEvent
|
||||
* Interface for all in-game inventory events. */
|
||||
|
||||
class QWAbstractInventoryEvent : public QWAbstractEvent
|
||||
{
|
||||
protected:
|
||||
QWInventoryManager *ptr_inventory;
|
||||
|
||||
public:
|
||||
QWAbstractInventoryEvent();
|
||||
virtual ~QWAbstractInventoryEvent() override = 0;
|
||||
|
||||
virtual void execute() override = 0;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setInventoryManager(QWInventoryManager *const inv) noexcept;
|
||||
QWInventoryManager *inventoryManager() const noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
virtual void writeToJson(QJsonObject &savejson) override = 0;
|
||||
};
|
||||
|
||||
#endif // QUESTABSTRACTINVENTORYEVENT_H
|
|
@ -0,0 +1,20 @@
|
|||
#include "qw_abstractlevelevent.h"
|
||||
|
||||
QWAbstractLevelEvent:: QWAbstractLevelEvent()
|
||||
{}
|
||||
|
||||
QWAbstractLevelEvent::~QWAbstractLevelEvent()
|
||||
{}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWAbstractLevelEvent::setLevelBuilder(QWLevelBuilder *const buil) noexcept
|
||||
{
|
||||
ptr_builder = buil;
|
||||
}
|
||||
|
||||
QWLevelBuilder *QWAbstractLevelEvent::levelBuilder() const noexcept
|
||||
{
|
||||
return ptr_builder;
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef QUESTABSTRACTLEVELEVENT_H
|
||||
#define QUESTABSTRACTLEVELEVENT_H
|
||||
|
||||
#include "features/qw_levelbuilder.h"
|
||||
#include "qw_abstractevent.h"
|
||||
|
||||
/* QWAbstractLevelEvent
|
||||
* Interface for all in-game events which control save files and levels. */
|
||||
|
||||
class QWAbstractLevelEvent : public QWAbstractEvent
|
||||
{
|
||||
protected:
|
||||
QWLevelBuilder *ptr_builder;
|
||||
|
||||
public:
|
||||
QWAbstractLevelEvent();
|
||||
virtual ~QWAbstractLevelEvent() override = 0;
|
||||
|
||||
virtual void execute() override = 0;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setLevelBuilder(QWLevelBuilder *const buil) noexcept;
|
||||
QWLevelBuilder *levelBuilder() const noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
virtual void writeToJson(QJsonObject &savejson) override = 0;
|
||||
};
|
||||
|
||||
#endif // QUESTABSTRACTLEVELEVENT_H
|
|
@ -0,0 +1,19 @@
|
|||
#include "qw_abstractsceneevent.h"
|
||||
|
||||
QWAbstractSceneEvent:: QWAbstractSceneEvent()
|
||||
{}
|
||||
|
||||
QWAbstractSceneEvent::~QWAbstractSceneEvent()
|
||||
{}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWAbstractSceneEvent::setScene(QWScene *const scene) noexcept
|
||||
{
|
||||
ptr_scene = scene;
|
||||
}
|
||||
|
||||
QWScene *QWAbstractSceneEvent::scene() const noexcept
|
||||
{
|
||||
return ptr_scene;
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef QUESTABSTRACTSCENEEVENT_H
|
||||
#define QUESTABSTRACTSCENEEVENT_H
|
||||
|
||||
#include "qw_abstractevent.h"
|
||||
#include "view/qw_scene.h"
|
||||
|
||||
/* QWAbstractSceneEvent
|
||||
* Interface for all in-game scene events. */
|
||||
|
||||
class QWAbstractSceneEvent : public QWAbstractEvent
|
||||
{
|
||||
protected:
|
||||
QWScene *ptr_scene;
|
||||
|
||||
public:
|
||||
QWAbstractSceneEvent();
|
||||
virtual ~QWAbstractSceneEvent() override = 0;
|
||||
|
||||
virtual void execute() override = 0;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setScene(QWScene *const scene) noexcept;
|
||||
QWScene *scene() const noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
virtual void writeToJson(QJsonObject &savejson) override = 0;
|
||||
};
|
||||
|
||||
#endif // QUESTABSTRACTSCENEEVENT_H
|
|
@ -0,0 +1,19 @@
|
|||
#include "qw_abstractsoundevent.h"
|
||||
|
||||
QWAbstractSoundEvent:: QWAbstractSoundEvent()
|
||||
{}
|
||||
|
||||
QWAbstractSoundEvent::~QWAbstractSoundEvent()
|
||||
{}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWAbstractSoundEvent::setSoundPlayer(QWSoundPlayer *const soundplayer) noexcept
|
||||
{
|
||||
ptr_soundplayer = soundplayer;
|
||||
}
|
||||
|
||||
QWSoundPlayer *QWAbstractSoundEvent::soundPlayer() const noexcept
|
||||
{
|
||||
return ptr_soundplayer;
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef QUESTABSTRACTSOUNDEVENT_H
|
||||
#define QUESTABSTRACTSOUNDEVENT_H
|
||||
|
||||
#include "features/qw_soundplayer.h"
|
||||
#include "qw_abstractevent.h"
|
||||
|
||||
/* QWAbstractSoundEvent
|
||||
* Interface for all in-game audio events. */
|
||||
|
||||
class QWAbstractSoundEvent : public QWAbstractEvent
|
||||
{
|
||||
protected:
|
||||
QWSoundPlayer *ptr_soundplayer;
|
||||
|
||||
public:
|
||||
QWAbstractSoundEvent();
|
||||
virtual ~QWAbstractSoundEvent() override = 0;
|
||||
|
||||
virtual void execute() override = 0;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setSoundPlayer(QWSoundPlayer *const soundplayer) noexcept;
|
||||
QWSoundPlayer *soundPlayer() const noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
virtual void writeToJson(QJsonObject &savejson) override = 0;
|
||||
};
|
||||
|
||||
#endif // QUESTABSTRACTSOUNDEVENT_H
|
|
@ -0,0 +1,49 @@
|
|||
#include "qw_addtriggerevent.h"
|
||||
#include "models/qw_trigger.h"
|
||||
|
||||
QWAddTriggerEvent::QWAddTriggerEvent(const std::shared_ptr<QWTrigger> &tr) :
|
||||
trigger(tr)
|
||||
{
|
||||
Q_ASSERT(trigger);
|
||||
}
|
||||
|
||||
void QWAddTriggerEvent::execute()
|
||||
{
|
||||
Q_ASSERT(location);
|
||||
|
||||
if (location->triggers().contains(trigger))
|
||||
return;
|
||||
|
||||
location->addTriggers(trigger);
|
||||
|
||||
if (location == ptr_scene->currentLocation())
|
||||
ptr_scene->addItem(trigger.get());
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWAddTriggerEvent::setLocation(const std::shared_ptr<QWLocation> &loc) noexcept
|
||||
{
|
||||
location = loc;
|
||||
Q_ASSERT(location);
|
||||
}
|
||||
|
||||
void QWAddTriggerEvent::setTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept
|
||||
{
|
||||
trigger = tr;
|
||||
Q_ASSERT(trigger);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWAddTriggerEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::ADD_TRIGGER);
|
||||
event_data.insert("location", location->tag());
|
||||
event_data.insert("trigger", trigger->tag());
|
||||
|
||||
qDebug() << " The add_trigger event:\n" << " id " << tag()
|
||||
<< "\n location :" << location->tag()
|
||||
<< "\n trigger :" << trigger->tag();
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef QWADDTRIGGER_H
|
||||
#define QWADDTRIGGER_H
|
||||
|
||||
#include "qw_abstractsceneevent.h"
|
||||
|
||||
/* QWAddTriggerEvent
|
||||
* Adds a trigger to its location list. */
|
||||
|
||||
class QWAddTriggerEvent : public QWAbstractSceneEvent
|
||||
{
|
||||
private:
|
||||
std::shared_ptr<QWTrigger> trigger; // What to add.
|
||||
std::shared_ptr<QWLocation> location; // Where to add.
|
||||
|
||||
public:
|
||||
explicit QWAddTriggerEvent(const std::shared_ptr<QWTrigger> &tr);
|
||||
virtual ~QWAddTriggerEvent() override {}
|
||||
|
||||
void execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setLocation(const std::shared_ptr<QWLocation> &loc) noexcept;
|
||||
void setTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QWADDTRIGGER_H
|
|
@ -0,0 +1,52 @@
|
|||
#include "qw_changelocationevent.h"
|
||||
#include "../qw_location.h"
|
||||
#include "../qw_trigger.h"
|
||||
|
||||
QWChangeLocationEvent::QWChangeLocationEvent(const std::shared_ptr<QWLocation> &location) :
|
||||
target_location(location)
|
||||
{
|
||||
Q_ASSERT(target_location);
|
||||
}
|
||||
|
||||
void QWChangeLocationEvent::execute()
|
||||
{
|
||||
const QList<std::shared_ptr<QWTrigger>> &triggers = target_location->triggers();
|
||||
|
||||
// We clear all the triggers from previous location
|
||||
ptr_scene->clearLocation();
|
||||
ptr_scene->setCurrentLocation(target_location);
|
||||
|
||||
if (const auto & tr = target_location->firstVisitTrigger(); tr && !target_location->discovered())
|
||||
tr->activate();
|
||||
|
||||
target_location->setDiscovered(true);
|
||||
|
||||
int z = 0;
|
||||
|
||||
// The first item will be below the others. The last item - above.
|
||||
// Triggers[0] must be background.
|
||||
for (auto &trigger : triggers)
|
||||
{
|
||||
trigger->setZValue(-1 * ++z);
|
||||
ptr_scene->addItem(trigger.get());
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWChangeLocationEvent::setLocation(const std::shared_ptr<QWLocation> &location) noexcept
|
||||
{
|
||||
target_location = location;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWChangeLocationEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::CHANGE_LOCATION);
|
||||
event_data.insert("location", target_location->tag());
|
||||
|
||||
qDebug() << " The move_to_location event:\n" << " id " << tag()
|
||||
<< "\n location :" << target_location->tag();
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef QUESTCHANGELOCATIONEVENT_H
|
||||
#define QUESTCHANGELOCATIONEVENT_H
|
||||
|
||||
#include "qw_abstractsceneevent.h"
|
||||
|
||||
/* QWChangeLocationEvent
|
||||
* Moves player to new location by replacing scene triggers. */
|
||||
|
||||
class QWTrigger;
|
||||
class QWLocation;
|
||||
|
||||
class QWChangeLocationEvent : public QWAbstractSceneEvent
|
||||
{
|
||||
private:
|
||||
std::shared_ptr<QWLocation> target_location;
|
||||
|
||||
public:
|
||||
explicit QWChangeLocationEvent(const std::shared_ptr<QWLocation> &location);
|
||||
virtual ~QWChangeLocationEvent() override {}
|
||||
|
||||
void execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setLocation(const std::shared_ptr<QWLocation> &location) noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QUESTCHANGELOCATIONEVENT_H
|
|
@ -0,0 +1,25 @@
|
|||
#include "qw_endlevelevent.h"
|
||||
|
||||
QWEndLevelEvent::QWEndLevelEvent(const QString &level) :
|
||||
str_nlevel(level)
|
||||
{
|
||||
Q_ASSERT(!str_nlevel.isEmpty());
|
||||
}
|
||||
|
||||
void QWEndLevelEvent::execute()
|
||||
{
|
||||
ptr_builder->saveGame();
|
||||
ptr_builder->initLevel(str_nlevel);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWEndLevelEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::END_LEVEL);
|
||||
event_data.insert("new_level", str_nlevel);
|
||||
|
||||
qDebug() << " The end_level event:\n" << " id " << tag()
|
||||
<< "\n new_level " << str_nlevel;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef QUESTENDLEVELEVENT_H
|
||||
#define QUESTENDLEVELEVENT_H
|
||||
|
||||
#include "qw_abstractlevelevent.h"
|
||||
|
||||
/* QWEndLevelEvent
|
||||
* Sends its signal to QWLevelBuilder whenever it has to load next level. */
|
||||
|
||||
class QWEndLevelEvent : public QWAbstractLevelEvent
|
||||
{
|
||||
private:
|
||||
QString str_nlevel;
|
||||
|
||||
public:
|
||||
explicit QWEndLevelEvent(const QString &level);
|
||||
virtual ~QWEndLevelEvent() override {}
|
||||
|
||||
void virtual execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QUESTENDLEVELEVENT_H
|
|
@ -0,0 +1,45 @@
|
|||
#include <QRegExp>
|
||||
#include "qw_newgameevent.h"
|
||||
#include "qw_globalmetadata.h"
|
||||
|
||||
QWNewGameEvent::QWNewGameEvent(const QString &savefile) :
|
||||
str_savefile(savefile)
|
||||
{
|
||||
Q_ASSERT(!str_savefile.isEmpty());
|
||||
}
|
||||
|
||||
void QWNewGameEvent::execute()
|
||||
{
|
||||
const QString profile_name = QWGlobalMetadata::valueBy("new_game_dialogue").toString();
|
||||
str_savefile = composeFileName(profile_name);
|
||||
|
||||
Q_ASSERT(!profile_name.isEmpty());
|
||||
Q_ASSERT(!str_savefile.isEmpty());
|
||||
|
||||
ptr_builder->initSaveProfile(str_savefile, profile_name);
|
||||
ptr_builder->initLevel(QWLevelBuilder::strInitLevel());
|
||||
}
|
||||
////////////////////////
|
||||
|
||||
QString QWNewGameEvent::composeFileName(const QString &str)
|
||||
{
|
||||
//Turn the chosen by user savename into file name.
|
||||
QString file_name = str;
|
||||
const QRegExp regexp("[^0-9a-z]+");
|
||||
|
||||
file_name = file_name.toLower().remove(regexp);
|
||||
|
||||
return file_name;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWNewGameEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::NEW_GAME);
|
||||
event_data.insert("save_file", str_savefile);
|
||||
|
||||
qDebug() << " The new_game event:\n" << " id " << tag()
|
||||
<< "\n save_file " << str_savefile;
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#ifndef QUESTNEWGAMEEVENT_H
|
||||
#define QUESTNEWGAMEEVENT_H
|
||||
|
||||
#include "qw_abstractlevelevent.h"
|
||||
|
||||
/* QWNewGameEvent
|
||||
* Creates new savefile and begins the game from clear sheet. */
|
||||
|
||||
class QWNewGameEvent : public QWAbstractLevelEvent
|
||||
{
|
||||
private:
|
||||
QString str_savefile;
|
||||
|
||||
QString composeFileName(const QString &str);
|
||||
|
||||
public:
|
||||
explicit QWNewGameEvent(const QString &savefile);
|
||||
virtual ~QWNewGameEvent() override {}
|
||||
|
||||
void virtual execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QUESTNEWGAMEEVENT_H
|
|
@ -0,0 +1,37 @@
|
|||
#include "qw_pickupitemevent.h"
|
||||
#include "../qw_trigger.h"
|
||||
|
||||
QWPickupItemEvent::QWPickupItemEvent(const std::shared_ptr<QWTrigger> &tr) :
|
||||
ptr_inventory_trigger(tr)
|
||||
{
|
||||
Q_ASSERT(ptr_inventory_trigger);
|
||||
}
|
||||
|
||||
void QWPickupItemEvent::execute()
|
||||
{
|
||||
ptr_inventory->addInventoryIcon(ptr_inventory_trigger);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWPickupItemEvent::setInventoryTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept
|
||||
{
|
||||
ptr_inventory_trigger = tr;
|
||||
}
|
||||
|
||||
std::shared_ptr<QWTrigger> QWPickupItemEvent::inventoryTrigger() const noexcept
|
||||
{
|
||||
return ptr_inventory_trigger;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWPickupItemEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::PICKUP_ITEM);
|
||||
event_data.insert("target", ptr_inventory_trigger->tag());
|
||||
|
||||
qDebug() << " The pickup_item event:\n" << " id " << tag()
|
||||
<< "\n target " << ptr_inventory_trigger->tag();
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef QUESTPLAYMUSICEVENT_H
|
||||
#define QUESTPLAYMUSICEVENT_H
|
||||
|
||||
#include "qw_abstractsoundevent.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
//// DOESN'T WORK! Has to be reworked in master-merge 1.2
|
||||
//// https://trello.com/c/KFUhEbYh/62-reimplement-sound-system
|
||||
|
||||
class QWPlayMusicEvent : public QWAbstractSoundEvent
|
||||
{
|
||||
private:
|
||||
QString str_musicpath;
|
||||
int index;
|
||||
|
||||
public:
|
||||
explicit QWPlayMusicEvent(const QString &path);
|
||||
virtual ~QWPlayMusicEvent() override {}
|
||||
|
||||
void execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
inline void setMusicpath(const QString &path) noexcept;
|
||||
inline QString musicpath() const noexcept;
|
||||
|
||||
void attachMusic();
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QUESTPLAYMUSICEVENT_H
|
|
@ -0,0 +1,24 @@
|
|||
#include "qw_playsoundevent.h"
|
||||
|
||||
QWPlaySoundEvent::QWPlaySoundEvent(const QString &path) :
|
||||
media_sound(new QMediaContent(QUrl("qrc:/res/" + path + ".wav")))
|
||||
{
|
||||
Q_ASSERT(!media_sound->isNull());
|
||||
}
|
||||
|
||||
void QWPlaySoundEvent::execute()
|
||||
{
|
||||
ptr_soundplayer->playSound(media_sound);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWPlaySoundEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::PLAY_SOUND);
|
||||
//event_data.insert("sound", media_sound->canonicalUrl().toString());
|
||||
|
||||
//qDebug() << " The play_sound event:\n" << " id " << tag()
|
||||
//<< "\n sound " << media_sound->canonicalUrl().toString();
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#ifndef QUESTPLAYSOUNDEVENT_H
|
||||
#define QUESTPLAYSOUNDEVENT_H
|
||||
|
||||
#include <memory>
|
||||
#include <QFile>
|
||||
#include "qw_abstractsoundevent.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
//// DOESN'T WORK! Has to be reworked in master-merge 1.2
|
||||
//// https://trello.com/c/KFUhEbYh/62-reimplement-sound-system
|
||||
|
||||
class QSoundEffect;
|
||||
|
||||
class QWPlaySoundEvent : public QWAbstractSoundEvent
|
||||
{
|
||||
private:
|
||||
QMediaContent *media_sound;
|
||||
|
||||
public:
|
||||
explicit QWPlaySoundEvent(const QString &path);
|
||||
virtual ~QWPlaySoundEvent() override {}
|
||||
|
||||
void execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QUESTPLAYSOUNDEVENT_H
|
|
@ -0,0 +1,26 @@
|
|||
#include <QCoreApplication>
|
||||
#include "qw_quitgameevent.h"
|
||||
|
||||
QWQuitGameEvent::QWQuitGameEvent(bool savegame) :
|
||||
b_savegame(savegame)
|
||||
{}
|
||||
|
||||
void QWQuitGameEvent::execute()
|
||||
{
|
||||
if (b_savegame)
|
||||
ptr_builder->saveGame();
|
||||
|
||||
QCoreApplication::quit();
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWQuitGameEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::QUIT_GAME);
|
||||
event_data.insert("save_game", b_savegame);
|
||||
|
||||
qDebug() << " The quit_game event:\n" << " id " << tag()
|
||||
<< "\n save_game " << b_savegame;
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef QUESTQUITGAMEEVENT_H
|
||||
#define QUESTQUITGAMEEVENT_H
|
||||
|
||||
#include "qw_abstractlevelevent.h"
|
||||
|
||||
/* QWQuitGameEvent
|
||||
* Immediately terminates current session. */
|
||||
|
||||
class QWQuitGameEvent : public QWAbstractLevelEvent
|
||||
{
|
||||
private:
|
||||
bool b_savegame;
|
||||
|
||||
public:
|
||||
explicit QWQuitGameEvent(bool savegame = false);
|
||||
virtual ~QWQuitGameEvent() override {}
|
||||
|
||||
void virtual execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QUESTQUITGAMEEVENT_H
|
|
@ -0,0 +1,49 @@
|
|||
#include "qw_removetriggerevent.h"
|
||||
#include "models/qw_trigger.h"
|
||||
|
||||
QWRemoveTriggerEvent::QWRemoveTriggerEvent(const std::shared_ptr<QWTrigger> &tr) :
|
||||
trigger(tr)
|
||||
{
|
||||
Q_ASSERT(trigger);
|
||||
}
|
||||
|
||||
void QWRemoveTriggerEvent::execute()
|
||||
{
|
||||
Q_ASSERT(location);
|
||||
|
||||
if (!location->triggers().contains(trigger))
|
||||
return;
|
||||
|
||||
location->removeTrigger(trigger);
|
||||
|
||||
if (location == ptr_scene->currentLocation())
|
||||
ptr_scene->removeItem(trigger.get());
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWRemoveTriggerEvent::setLocation(const std::shared_ptr<QWLocation> &loc) noexcept
|
||||
{
|
||||
location = loc;
|
||||
Q_ASSERT(location);
|
||||
}
|
||||
|
||||
void QWRemoveTriggerEvent::setTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept
|
||||
{
|
||||
trigger = tr;
|
||||
Q_ASSERT(trigger);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWRemoveTriggerEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::REMOVE_TRIGGER);
|
||||
event_data.insert("location", location->tag());
|
||||
event_data.insert("trigger", trigger->tag());
|
||||
|
||||
qDebug() << " The remove_trigger event:\n" << " id " << tag()
|
||||
<< "\n location :" << location->tag()
|
||||
<< "\n trigger :" << trigger->tag();
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef QWREMOVETRIGGER_H
|
||||
#define QWREMOVETRIGGER_H
|
||||
|
||||
#include "qw_abstractsceneevent.h"
|
||||
|
||||
/* QWRemoveTriggerEvent
|
||||
* Removes a trigger from its location list. */
|
||||
|
||||
class QWRemoveTriggerEvent : public QWAbstractSceneEvent
|
||||
{
|
||||
private:
|
||||
std::shared_ptr<QWTrigger> trigger; // What to add.
|
||||
std::shared_ptr<QWLocation> location; // Where to add.
|
||||
|
||||
public:
|
||||
explicit QWRemoveTriggerEvent(const std::shared_ptr<QWTrigger> &tr);
|
||||
virtual ~QWRemoveTriggerEvent() override {}
|
||||
|
||||
void execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setLocation(const std::shared_ptr<QWLocation> &loc) noexcept;
|
||||
void setTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QWREMOVETRIGGER_H
|
|
@ -0,0 +1,36 @@
|
|||
#include "models/dialogues/qw_abstractgamedialogue.h"
|
||||
#include "features/qw_abstractdialoguemanager.h"
|
||||
#include "qw_startdialogueevent.h"
|
||||
|
||||
QWStartDialogueEvent::QWStartDialogueEvent(const std::shared_ptr<QWAbstractGameDialogue> &dialogue) :
|
||||
ptr_dialogue(dialogue)
|
||||
{}
|
||||
|
||||
void QWStartDialogueEvent::execute()
|
||||
{
|
||||
ptr_dialogue_manager->activateDialogue(ptr_dialogue);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWStartDialogueEvent::setDialogueManager(QWAbstractDialogueManager *dialogman) noexcept
|
||||
{
|
||||
ptr_dialogue_manager = dialogman;
|
||||
}
|
||||
|
||||
QWAbstractDialogueManager *QWStartDialogueEvent::dialogueManager() const noexcept
|
||||
{
|
||||
return ptr_dialogue_manager;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWStartDialogueEvent::writeToJson(QJsonObject &event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::START_DIALOGUE);
|
||||
event_data.insert("dialogue", ptr_dialogue->tag());
|
||||
|
||||
qDebug() << " The start_dialogue event:\n" << " id " << tag()
|
||||
<< "\n dialogue " << ptr_dialogue->tag();
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef QWSTARTDIALOGUEEVENT_H
|
||||
#define QWSTARTDIALOGUEEVENT_H
|
||||
|
||||
#include "qw_abstractevent.h"
|
||||
|
||||
/* QWStartDialogueEvent
|
||||
* Starts a game-freezing dialogue by moving QWScene from gameplay state. */
|
||||
|
||||
class QWAbstractDialogueManager;
|
||||
class QWAbstractGameDialogue;
|
||||
|
||||
class QWStartDialogueEvent : public QWAbstractEvent
|
||||
{
|
||||
private:
|
||||
QWAbstractDialogueManager *ptr_dialogue_manager;
|
||||
std::shared_ptr<QWAbstractGameDialogue> ptr_dialogue;
|
||||
|
||||
public:
|
||||
explicit QWStartDialogueEvent(const std::shared_ptr<QWAbstractGameDialogue> &dialogue);
|
||||
virtual ~QWStartDialogueEvent() override {}
|
||||
|
||||
void execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setDialogueManager(QWAbstractDialogueManager *dialogman) noexcept;
|
||||
QWAbstractDialogueManager *dialogueManager() const noexcept;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QWSTARTDIALOGUEEVENT_H
|
|
@ -0,0 +1,75 @@
|
|||
#include "../qw_trigger.h"
|
||||
#include "qw_switcheventsevent.h"
|
||||
|
||||
QWSwitchEventsEvent::QWSwitchEventsEvent(const std::shared_ptr<QWTrigger> &tr) :
|
||||
ptr_target(tr),
|
||||
b_active(false)
|
||||
{
|
||||
Q_ASSERT(ptr_target);
|
||||
}
|
||||
|
||||
void QWSwitchEventsEvent::execute()
|
||||
{
|
||||
/* QWActivateItemEvent changes its state,
|
||||
* Now we send other list of events for the linked trigger. */
|
||||
b_active = !b_active;
|
||||
ptr_target->setEvents(b_active ? list_enabled_events : list_disabled_events);
|
||||
}
|
||||
|
||||
void QWSwitchEventsEvent::init()
|
||||
{
|
||||
ptr_target->setEvents(list_disabled_events);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWSwitchEventsEvent::setTarget(const std::shared_ptr<QWTrigger> &tr) noexcept
|
||||
{
|
||||
ptr_target = tr;
|
||||
}
|
||||
|
||||
std::shared_ptr<QWTrigger> QWSwitchEventsEvent::target() const noexcept
|
||||
{
|
||||
return ptr_target;
|
||||
}
|
||||
|
||||
void QWSwitchEventsEvent::setEventsOnEnable(const QList<std::shared_ptr<QWAbstractEvent>> &evs) noexcept
|
||||
{
|
||||
list_enabled_events = evs;
|
||||
}
|
||||
|
||||
void QWSwitchEventsEvent::setEventsOnDisable(const QList<std::shared_ptr<QWAbstractEvent>> &evs) noexcept
|
||||
{
|
||||
list_disabled_events = evs;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWSwitchEventsEvent::writeToJson(QJsonObject & event_data)
|
||||
{
|
||||
event_data.insert("id", tag());
|
||||
event_data.insert("type", EVENT_TYPE::SWITCH_EVENTS);
|
||||
event_data.insert("target", ptr_target->tag());
|
||||
|
||||
QJsonArray trs_en, trs_dis;
|
||||
|
||||
for (const auto & ev : list_enabled_events) {
|
||||
trs_en.append(ev->tag());
|
||||
}
|
||||
|
||||
event_data.insert("enable_evs", trs_en);
|
||||
|
||||
for (const auto & ev : list_disabled_events) {
|
||||
trs_dis.append(ev->tag());
|
||||
}
|
||||
|
||||
event_data.insert("disable_evs", trs_dis);
|
||||
|
||||
qDebug() << " The switch_events event:\n" << " id " << tag()
|
||||
<< "\n trs_en :";
|
||||
for (const auto tr : trs_en)
|
||||
qDebug() << " " << tr.toString();
|
||||
qDebug() << "\n trs_dis :";
|
||||
for (const auto tr : trs_dis)
|
||||
qDebug() << " " << tr.toString();
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef QUESTACTIVATEITEMEVENT_H
|
||||
#define QUESTACTIVATEITEMEVENT_H
|
||||
|
||||
#include <memory>
|
||||
#include <QList>
|
||||
#include "qw_abstractevent.h"
|
||||
|
||||
/* QWSwitchEventsEvent
|
||||
* Changes events of its linked QWTrigger.
|
||||
* For example: a door is being closed until we pick up a key.
|
||||
* It's initial state "to print message "go find a key you punk".
|
||||
* When we activate its key, execute() changes door event to "go through". */
|
||||
|
||||
class QWTrigger;
|
||||
|
||||
class QWSwitchEventsEvent : public QWAbstractEvent
|
||||
{
|
||||
private:
|
||||
std::shared_ptr<QWTrigger> ptr_target;
|
||||
|
||||
bool b_active;
|
||||
|
||||
QList<std::shared_ptr<QWAbstractEvent>> list_disabled_events;
|
||||
QList<std::shared_ptr<QWAbstractEvent>> list_enabled_events;
|
||||
|
||||
public:
|
||||
explicit QWSwitchEventsEvent(const std::shared_ptr<QWTrigger> &tr);
|
||||
virtual ~QWSwitchEventsEvent() override {}
|
||||
|
||||
void execute() override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void setTarget(const std::shared_ptr<QWTrigger> &tr) noexcept;
|
||||
std::shared_ptr<QWTrigger> target() const noexcept;
|
||||
|
||||
void setEventsOnDisable(const QList<std::shared_ptr<QWAbstractEvent>> &evs) noexcept;
|
||||
void setEventsOnEnable(const QList<std::shared_ptr<QWAbstractEvent>> &evs) noexcept;
|
||||
|
||||
// init() sets an inital state of ptr_trigger.
|
||||
void init();
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &event_data) override;
|
||||
};
|
||||
|
||||
#endif // QUESTACTIVATEITEMEVENT_H
|
|
@ -0,0 +1,114 @@
|
|||
#include "qw_location.h"
|
||||
#include "qw_trigger.h"
|
||||
|
||||
QWLocation::QWLocation() :
|
||||
flag_discovered(false)
|
||||
{}
|
||||
|
||||
void QWLocation::clearTriggers() noexcept
|
||||
{
|
||||
list_triggers.clear();
|
||||
}
|
||||
|
||||
void QWLocation::setTriggers(std::initializer_list<std::shared_ptr<QWTrigger>> &&trs) noexcept
|
||||
{
|
||||
list_triggers.clear();
|
||||
|
||||
/* For some reason QList(::begin(), ::end())
|
||||
* doesn't work for MSVC */
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
list_triggers = QList<std::shared_ptr<QWTrigger>>::fromStdList(std::move(trs));
|
||||
#else
|
||||
list_triggers = QList(trs.begin(), trs.end());
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void QWLocation::setTriggers(const QList<std::shared_ptr<QWTrigger>> &trs) noexcept
|
||||
{
|
||||
list_triggers.clear();
|
||||
list_triggers = trs;
|
||||
}
|
||||
|
||||
void QWLocation::addTriggers(std::initializer_list<std::shared_ptr<QWTrigger>> &&trs) noexcept
|
||||
{
|
||||
list_triggers.append(std::move(QList<std::shared_ptr<QWTrigger>>(trs)));
|
||||
}
|
||||
|
||||
void QWLocation::addTriggers(const std::shared_ptr<QWTrigger> &tr) noexcept
|
||||
{
|
||||
list_triggers.append(tr);
|
||||
}
|
||||
|
||||
void QWLocation::removeTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept
|
||||
{
|
||||
list_triggers.removeOne(tr);
|
||||
}
|
||||
|
||||
QList<std::shared_ptr<QWTrigger>> QWLocation::triggers() const
|
||||
{
|
||||
return list_triggers;
|
||||
}
|
||||
|
||||
void QWLocation::setFirstVisitTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept
|
||||
{
|
||||
first_visit_trigger = tr;
|
||||
Q_ASSERT(first_visit_trigger);
|
||||
}
|
||||
|
||||
std::shared_ptr<QWTrigger> QWLocation::firstVisitTrigger() const noexcept
|
||||
{
|
||||
return first_visit_trigger;
|
||||
}
|
||||
|
||||
void QWLocation::setDiscovered(bool discovered) noexcept
|
||||
{
|
||||
flag_discovered = discovered;
|
||||
}
|
||||
|
||||
bool QWLocation::discovered() const noexcept
|
||||
{
|
||||
return flag_discovered;
|
||||
}
|
||||
|
||||
void QWLocation::setMusicPath(const QString &path) noexcept
|
||||
{
|
||||
music_path = path;
|
||||
Q_ASSERT(!music_path.isEmpty());
|
||||
}
|
||||
|
||||
void QWLocation::removeMusic() noexcept
|
||||
{
|
||||
music_path.clear();
|
||||
}
|
||||
|
||||
QString QWLocation::musicPath() const noexcept
|
||||
{
|
||||
return music_path;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWLocation::writeToJson(QJsonObject &location_data)
|
||||
{
|
||||
location_data.insert("id", tag());
|
||||
|
||||
if (flag_discovered)
|
||||
location_data.insert("discovered", flag_discovered);
|
||||
|
||||
if (!music_path.isEmpty())
|
||||
location_data.insert("music_path", music_path);
|
||||
|
||||
qDebug() << " The location:\n" << " id " << tag()
|
||||
<< "\n discovered " << flag_discovered
|
||||
<< "\n music_path " << music_path;
|
||||
|
||||
// - Location triggers - //
|
||||
QJsonArray json_triggers;
|
||||
for (const auto &trigger : triggers()) {
|
||||
json_triggers.append(trigger->tag());
|
||||
qDebug() << " trigger: " << trigger->tag();
|
||||
}
|
||||
location_data.insert("trs", json_triggers);
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
#ifndef QWLOCATION_H
|
||||
#define QWLOCATION_H
|
||||
|
||||
#include <memory>
|
||||
#include <QList>
|
||||
|
||||
#include "events/qw_abstractevent.h"
|
||||
|
||||
/* QWLocation
|
||||
* Represents any game location. */
|
||||
|
||||
class QWTrigger;
|
||||
|
||||
class QWLocation final : public QWTagHolder
|
||||
{
|
||||
private:
|
||||
QList<std::shared_ptr<QWTrigger>> list_triggers;
|
||||
std::shared_ptr<QWTrigger> first_visit_trigger;
|
||||
bool flag_discovered;
|
||||
|
||||
QString music_path;
|
||||
|
||||
public:
|
||||
explicit QWLocation();
|
||||
|
||||
void clearTriggers() noexcept;
|
||||
void setTriggers(std::initializer_list<std::shared_ptr<QWTrigger>> &&trs) noexcept;
|
||||
void setTriggers(const QList<std::shared_ptr<QWTrigger>> &trs) noexcept;
|
||||
void addTriggers(std::initializer_list<std::shared_ptr<QWTrigger>> &&trs) noexcept;
|
||||
void addTriggers(const std::shared_ptr<QWTrigger> &tr) noexcept;
|
||||
void removeTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept;
|
||||
QList<std::shared_ptr<QWTrigger>> triggers() const;
|
||||
|
||||
// Should be activated on first visit.
|
||||
void setFirstVisitTrigger(const std::shared_ptr<QWTrigger> &tr) noexcept;
|
||||
std::shared_ptr<QWTrigger> firstVisitTrigger() const noexcept;
|
||||
|
||||
void setDiscovered(bool discovered) noexcept;
|
||||
bool discovered() const noexcept;
|
||||
|
||||
void setMusicPath(const QString &path) noexcept;
|
||||
void removeMusic() noexcept;
|
||||
QString musicPath() const noexcept;
|
||||
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &location_data) override;
|
||||
};
|
||||
|
||||
#endif // QWLOCATION_H
|
|
@ -0,0 +1,113 @@
|
|||
#include "qw_trigger.h"
|
||||
#include <QJsonArray>
|
||||
#include <QJsonObject>
|
||||
#include <QDebug>
|
||||
|
||||
QWTrigger::QWTrigger(const QString &path)
|
||||
{
|
||||
setPos(0, 0);
|
||||
setPixmap(QPixmap(":/res/" + path));
|
||||
}
|
||||
|
||||
void QWTrigger::clearEvents() noexcept
|
||||
{
|
||||
list_events.clear();
|
||||
}
|
||||
|
||||
void QWTrigger::setEvents(std::initializer_list<std::shared_ptr<QWAbstractEvent>> &&evs) noexcept
|
||||
{
|
||||
list_events.clear();
|
||||
|
||||
/* For some reason QList(::begin(), ::end())
|
||||
* doesn't work for MSVC */
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
list_events = QList<std::shared_ptr<QWAbstractEvent>>::fromStdList(std::move(evs));
|
||||
#else
|
||||
list_events = QList(evs.begin(), evs.end());
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void QWTrigger::setEvents(const QList<std::shared_ptr<QWAbstractEvent>> &evs) noexcept
|
||||
{
|
||||
list_events.clear();
|
||||
list_events = evs;
|
||||
}
|
||||
|
||||
void QWTrigger::addEvents(std::initializer_list<std::shared_ptr<QWAbstractEvent>> &&evs) noexcept
|
||||
{
|
||||
list_events.append(std::move(QList<std::shared_ptr<QWAbstractEvent>>(evs)));
|
||||
}
|
||||
|
||||
void QWTrigger::addEvents(const std::shared_ptr<QWAbstractEvent> &ev) noexcept
|
||||
{
|
||||
list_events.append(ev);
|
||||
}
|
||||
|
||||
QList<std::shared_ptr<QWAbstractEvent>> QWTrigger::events() const
|
||||
{
|
||||
return list_events;
|
||||
}
|
||||
|
||||
void QWTrigger::setCover(qreal x, qreal y, const QString &path) noexcept
|
||||
{
|
||||
pix_path = path;
|
||||
setPixmap(QPixmap(":/res/" + path));
|
||||
setPos(x, y);
|
||||
}
|
||||
|
||||
void QWTrigger::setCover(const QString &path) noexcept
|
||||
{
|
||||
pix_path = path;
|
||||
setPixmap(QPixmap(":/res/" + path));
|
||||
}
|
||||
|
||||
QString QWTrigger::path() const noexcept
|
||||
{
|
||||
return pix_path;
|
||||
}
|
||||
|
||||
void QWTrigger::setExaminationDialogueEvent(const std::shared_ptr<QWAbstractEvent> &dialogue_event)
|
||||
{
|
||||
examination_event = dialogue_event;
|
||||
Q_ASSERT(examination_event);
|
||||
}
|
||||
|
||||
void QWTrigger::startExaminationDialogue() const
|
||||
{
|
||||
if (examination_event)
|
||||
examination_event->execute();
|
||||
}
|
||||
|
||||
void QWTrigger::activate() const
|
||||
{
|
||||
for (const auto &ev : list_events) {
|
||||
Q_ASSERT(ev);
|
||||
ev->execute();
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void QWTrigger::writeToJson(QJsonObject &trigger_data)
|
||||
{
|
||||
trigger_data.insert("id", tag());
|
||||
trigger_data.insert("mask", path());
|
||||
trigger_data.insert("x", x());
|
||||
trigger_data.insert("y", y());
|
||||
trigger_data.insert("examine_dialogue", examination_event->tag());
|
||||
|
||||
qDebug() << " The trigger:\n" << " id " << tag()
|
||||
<< "\n mask " << tag()
|
||||
<< "\n xy " << x() << " " << y()
|
||||
<< "\n examine_dialogue " << examination_event->tag();
|
||||
|
||||
// - Trigger events - //
|
||||
QJsonArray json_trevents;
|
||||
for (const auto &tr_event : events()) {
|
||||
json_trevents.append(tr_event->tag());
|
||||
qDebug() << " event: " << tr_event->tag();
|
||||
}
|
||||
trigger_data.insert("evs", json_trevents);
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
#ifndef TRIGGER_H
|
||||
#define TRIGGER_H
|
||||
|
||||
#include <memory>
|
||||
#include <QGraphicsPixmapItem>
|
||||
#include "events/qw_abstractevent.h"
|
||||
|
||||
/* QWTrigger
|
||||
* Represents an interactive in-game element. */
|
||||
|
||||
class QWStartDialogueEvent;
|
||||
|
||||
class QWTrigger : public QGraphicsPixmapItem, public QWTagHolder
|
||||
{
|
||||
private:
|
||||
QList<std::shared_ptr<QWAbstractEvent>> list_events;
|
||||
std::shared_ptr<QWAbstractEvent> examination_event;
|
||||
QString pix_path;
|
||||
|
||||
public:
|
||||
explicit QWTrigger(const QString &path);
|
||||
|
||||
void clearEvents() noexcept;
|
||||
void setEvents(std::initializer_list<std::shared_ptr<QWAbstractEvent>> &&evs) noexcept;
|
||||
void setEvents(const QList<std::shared_ptr<QWAbstractEvent>> &evs) noexcept;
|
||||
void addEvents(std::initializer_list<std::shared_ptr<QWAbstractEvent>> &&evs) noexcept;
|
||||
void addEvents(const std::shared_ptr<QWAbstractEvent> &ev) noexcept;
|
||||
QList<std::shared_ptr<QWAbstractEvent>> events() const;
|
||||
|
||||
void setCover(qreal x, qreal y, const QString &path) noexcept;
|
||||
void setCover(const QString &path) noexcept;
|
||||
inline QString path() const noexcept;
|
||||
|
||||
void setExaminationDialogueEvent(const std::shared_ptr<QWAbstractEvent> &dialogue_event);
|
||||
void startExaminationDialogue() const;
|
||||
|
||||
void activate() const;
|
||||
|
||||
////////////////////////
|
||||
|
||||
void writeToJson(QJsonObject &trigger_data) override;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // TRIGGER_H
|
|
@ -0,0 +1,21 @@
|
|||
import QtQuick 2.6
|
||||
import QtQuick.Controls 2.0
|
||||
|
||||
ApplicationWindow {
|
||||
id: root
|
||||
width: 300
|
||||
height: 480
|
||||
visible: true
|
||||
|
||||
/* This absolutely does not make any practical sense,
|
||||
* I just try to make it work and see what's
|
||||
* gonna happen */
|
||||
|
||||
TextField {
|
||||
text: dialogue.exit_code
|
||||
placeholderText: qsTr("exit code")
|
||||
anchors.centerIn: parent
|
||||
|
||||
onTextChanged: dialogue.exit_code = text
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
#include "qw_globalmetadata.h"
|
||||
#include <QString>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonDocument>
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
|
||||
QJsonObject QWGlobalMetadata::config = QJsonObject();
|
||||
|
||||
void QWGlobalMetadata::load()
|
||||
{
|
||||
QFile file("config.json");
|
||||
|
||||
if (!file.exists())
|
||||
QFile::copy(":/res/config.json", file.fileName());
|
||||
|
||||
Q_ASSERT(file.open(QIODevice::ReadOnly));
|
||||
const QByteArray json_arr = file.readAll();
|
||||
file.close();
|
||||
config = QJsonDocument::fromJson(json_arr).object();
|
||||
}
|
||||
|
||||
void QWGlobalMetadata::save()
|
||||
{
|
||||
QFile file("config.json");
|
||||
|
||||
Q_ASSERT(file.open(QIODevice::WriteOnly));
|
||||
file.write(QJsonDocument(config).toJson());
|
||||
file.close();
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
QVariant QWGlobalMetadata::valueBy(QString &&key)
|
||||
{
|
||||
return config[key].toVariant();
|
||||
}
|
||||
|
||||
void QWGlobalMetadata::setValue(QString &&key, const QVariant &val) noexcept
|
||||
{
|
||||
config.insert(key, val.toJsonValue());
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#ifndef GLOBALMETADATA_H
|
||||
#define GLOBALMETADATA_H
|
||||
|
||||
#include <QVariant>
|
||||
|
||||
/* QWGlobalMetadata
|
||||
* Provides config options and metadata for all application classes. */
|
||||
|
||||
class QJsonObject;
|
||||
class QString;
|
||||
|
||||
class QWGlobalMetadata final
|
||||
{
|
||||
private:
|
||||
static QJsonObject config;
|
||||
|
||||
public:
|
||||
explicit QWGlobalMetadata() = delete;
|
||||
~QWGlobalMetadata() = delete;
|
||||
|
||||
static void load();
|
||||
static void save();
|
||||
|
||||
////////////////////////
|
||||
|
||||
static QVariant valueBy(QString &&key);
|
||||
static void setValue(QString &&key, const QVariant &val) noexcept;
|
||||
};
|
||||
|
||||
#endif // GLOBALMETADATA_H
|
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"InventoryManager:length_wall": 15,
|
||||
"InventoryManager:length_cell": 120,
|
||||
"InventoryManager:max_amount": 7,
|
||||
"InventoryManager:first_wall": 0,
|
||||
"InventoryManager:clr_sel": 12,
|
||||
"InventoryManager:clr_str": 0.5,
|
||||
|
||||
"InventoryPanel:pixmap_path": ":/res/inv.jpg",
|
||||
"InventoryPanel:on_hid:bot_left_x": 220,
|
||||
"InventoryPanel:on_hid:bot_left_y": -130,
|
||||
"InventoryPanel:on_hid:top_right_x": 1060,
|
||||
"InventoryPanel:on_hid:top_right_y": 0,
|
||||
"InventoryPanel:on_shw:bot_left_x": 220,
|
||||
"InventoryPanel:on_shw:bot_left_y": 50,
|
||||
"InventoryPanel:on_shw:top_right_x": 1060,
|
||||
"InventoryPanel:on_shw:top_right_y": 170,
|
||||
|
||||
"DialoguePanel:pixmap_path": ":/res/dialogue_panel.jpeg",
|
||||
"DialoguePanel:on_hid:bot_left_x": 110,
|
||||
"DialoguePanel:on_hid:bot_left_y": -130,
|
||||
"DialoguePanel:on_hid:top_right_x": 1170,
|
||||
"DialoguePanel:on_hid:top_right_y": 0,
|
||||
"DialoguePanel:on_shw:bot_left_x": 110,
|
||||
"DialoguePanel:on_shw:bot_left_y": 51,
|
||||
"DialoguePanel:on_shw:top_right_x": 1070,
|
||||
"DialoguePanel:on_shw:top_right_y": 449
|
||||
}
|
|
@ -0,0 +1,260 @@
|
|||
{
|
||||
"init_level": "start",
|
||||
|
||||
"start": {
|
||||
|
||||
"init": "spawn",
|
||||
|
||||
"dialogues": [
|
||||
{
|
||||
"id": "on_spawn",
|
||||
"text": [
|
||||
"\"Мастер мертв. Он даже не подозревал, что я отравил его вино.\"",
|
||||
"\"Старый дурак.\"",
|
||||
"\"Все его секреты заперты внутри его мастерской.\"",
|
||||
"\"Он никогда не пускал меня внутрь, лишь давал свои глупые поручения.\"",
|
||||
"\"Мой час настал.\"",
|
||||
"\"Я заберу то, что теперь принадлежит мне, и никто не сможет меня остановить.\""
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "door_general_on_closed",
|
||||
"text": [
|
||||
"Путь преграждает дверь в виде массивного механизма.",
|
||||
"Силой вскрыть не получается."
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "door_general_on_look",
|
||||
"text": [
|
||||
"\"Чертов безумец!\"",
|
||||
"\"Кто же в собственную мастерскую делает такую дверь!\"",
|
||||
"\"Видимо, отмычки тут не помогут.\""
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "diary_on_taking",
|
||||
"text": [
|
||||
"Старый потрепанный дневник мастера.",
|
||||
"Страницы исписаны неровным подчерком,\nно кое-что полезное можно будет узнать."
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "diary_on_look",
|
||||
"text": [
|
||||
"\"Ого, это же записи мастера!\nМожет пригодиться!\""
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "portrait_on_click",
|
||||
"text": [
|
||||
"Картина покойного хозяина мастерской. Автопортрет."
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "portrait_on_look",
|
||||
"text": [
|
||||
"\"Он как будто насмехается надо мной.\nДаже после смерти...\""
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "table_on_look",
|
||||
"text": [
|
||||
"\"Обычный стол, на нём лежат какие-то бумаги.\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mechanism_on_pressed",
|
||||
"text": [
|
||||
"Слышан характерный механический звук где-то внутри двери."
|
||||
],
|
||||
"type": 0
|
||||
},
|
||||
{
|
||||
"id": "mechanism_on_failure",
|
||||
"text": [
|
||||
"После нажатия механизм издает резкий скрежет.",
|
||||
"Все механизмы вернулись на свои места."
|
||||
],
|
||||
"type": 0
|
||||
}
|
||||
],
|
||||
|
||||
"locations": [
|
||||
{
|
||||
"id": "location_room",
|
||||
"triggers": [ "location_room_background", "painting", "table", "global_door" ]
|
||||
},
|
||||
{
|
||||
"id": "location_table",
|
||||
"triggers": [ "location_table_background", "diary", "backwarder" ]
|
||||
},
|
||||
{
|
||||
"id": "location_nearby_door",
|
||||
"triggers": [ "location_nearby_door_background", "door", "backwarder" ]
|
||||
}
|
||||
],
|
||||
|
||||
"triggers": [
|
||||
{
|
||||
"id": "location_nearby_door_background"
|
||||
},
|
||||
{
|
||||
"id": "location_table_background"
|
||||
},
|
||||
{
|
||||
"id": "location_room_background"
|
||||
},
|
||||
{
|
||||
"id": "spawn",
|
||||
"evs": [
|
||||
"init",
|
||||
"dial_on_spawn"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "painting",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"evs": [
|
||||
"dial_portrait_on_click"
|
||||
],
|
||||
"examine_dialogue": "dial_portrait_on_look"
|
||||
},
|
||||
{
|
||||
"id": "table",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"evs": [
|
||||
"move_to_table"
|
||||
],
|
||||
"examine_dialogue": "dial_table_on_look"
|
||||
},
|
||||
{
|
||||
"id": "backwarder",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"evs": [
|
||||
"move_backward"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "global_door",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"evs": [
|
||||
"move_to_global_door"
|
||||
],
|
||||
"examine_dialogue": "dial_global_door_on_look"
|
||||
},
|
||||
{
|
||||
"id": "diary",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"evs": [
|
||||
"dial_diary_on_taking",
|
||||
"take_diary"
|
||||
],
|
||||
"examine_dialogue": "dial_diary_on_look"
|
||||
},
|
||||
{
|
||||
"id": "tr_inv_diary"
|
||||
},
|
||||
{
|
||||
"id": "door",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"evs": [
|
||||
"dial_door_general_on_closed"
|
||||
],
|
||||
"examine_dialogue": "dial_door_general_on_look"
|
||||
}
|
||||
],
|
||||
|
||||
"events": [
|
||||
{
|
||||
"id": "dial_on_spawn",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "on_spawn"
|
||||
},
|
||||
{
|
||||
"id": "dial_portrait_on_click",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "portrait_on_click"
|
||||
},
|
||||
{
|
||||
"id": "dial_door_general_on_closed",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "door_general_on_closed"
|
||||
},
|
||||
{
|
||||
"id": "dial_door_general_on_look",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "door_general_on_look"
|
||||
},
|
||||
{
|
||||
"id": "dial_diary_on_taking",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "diary_on_taking"
|
||||
},
|
||||
{
|
||||
"id": "dial_diary_on_look",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "diary_on_look"
|
||||
},
|
||||
{
|
||||
"id": "dial_portrait_on_look",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "portrait_on_look"
|
||||
},
|
||||
{
|
||||
"id": "dial_table_on_look",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "table_on_look"
|
||||
},
|
||||
{
|
||||
"id": "dial_global_door_on_look",
|
||||
"type": 10,
|
||||
"dialogue_type": 0,
|
||||
"dialogue": "door_general_on_look"
|
||||
},
|
||||
{
|
||||
"id": "move_to_table",
|
||||
"type": 0,
|
||||
"location": "location_table"
|
||||
},
|
||||
{
|
||||
"id": "move_to_global_door",
|
||||
"type": 0,
|
||||
"location": "location_nearby_door"
|
||||
},
|
||||
{
|
||||
"id": "move_backward",
|
||||
"type": 0,
|
||||
"location": "location_room"
|
||||
},
|
||||
{
|
||||
"id": "take_diary",
|
||||
"type": 4,
|
||||
"target": "tr_inv_diary"
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
After Width: | Height: | Size: 507 B |
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1,111 @@
|
|||
{
|
||||
"init": "spawn",
|
||||
|
||||
"triggers": [
|
||||
{
|
||||
"id": "spawn_background"
|
||||
},
|
||||
{
|
||||
"id": "roomkey_background"
|
||||
},
|
||||
{
|
||||
"id": "tr_door1",
|
||||
"mask": "door",
|
||||
"x": 55,
|
||||
"y": 67,
|
||||
"evs": [ "ev1", "sound_event1" ]
|
||||
},
|
||||
{
|
||||
"id": "tr_osaka1",
|
||||
"mask": "osaka",
|
||||
"x": 255,
|
||||
"y": 367,
|
||||
"evs": [ "sound_event2" ]
|
||||
},
|
||||
{
|
||||
"id": "tr_osaka2",
|
||||
"mask": "osaka",
|
||||
"x": 355,
|
||||
"y": 467,
|
||||
"evs": [ "sound_event3" ]
|
||||
},
|
||||
{
|
||||
"id": "tr_osaka3",
|
||||
"mask": "osaka",
|
||||
"x": 490,
|
||||
"y": 500,
|
||||
"evs": [ "sound_event4" ]
|
||||
},
|
||||
{
|
||||
"id": "tr_osaka4",
|
||||
"mask": "osaka",
|
||||
"x": 600,
|
||||
"y": 200,
|
||||
"evs": [ "sound_event5" ]
|
||||
},
|
||||
{
|
||||
"id": "tr_osaka5",
|
||||
"mask": "osaka",
|
||||
"x": 955,
|
||||
"y": 400,
|
||||
"evs": [ "sound_event6" ]
|
||||
},
|
||||
{
|
||||
"id": "spawn",
|
||||
"mask": "",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"evs": [ "init_ev" ]
|
||||
}
|
||||
],
|
||||
|
||||
"events": [
|
||||
{
|
||||
"id": "init_ev",
|
||||
"type": 0,
|
||||
"trs": [
|
||||
"tr_osaka1",
|
||||
"tr_osaka2",
|
||||
"tr_osaka3",
|
||||
"tr_osaka4",
|
||||
"tr_osaka5",
|
||||
"spawn_background"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ev1",
|
||||
"type": 0,
|
||||
"trs": ["roomkey_background"]
|
||||
},
|
||||
{
|
||||
"id": "sound_event1",
|
||||
"type": 5,
|
||||
"sound": "sound"
|
||||
},
|
||||
{
|
||||
"id": "sound_event2",
|
||||
"type": 5,
|
||||
"sound": "sound"
|
||||
},
|
||||
{
|
||||
"id": "sound_event3",
|
||||
"type": 5,
|
||||
"sound": "sound"
|
||||
},
|
||||
{
|
||||
"id": "sound_event4",
|
||||
"type": 5,
|
||||
"sound": "sound"
|
||||
},
|
||||
{
|
||||
"id": "sound_event5",
|
||||
"type": 5,
|
||||
"sound": "sound"
|
||||
},
|
||||
{
|
||||
"id": "sound_event6",
|
||||
"type": 5,
|
||||
"sound": "sound"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
{
|
||||
"init_level": "menu",
|
||||
|
||||
"menu":
|
||||
{
|
||||
"init": "spawn",
|
||||
|
||||
"triggers": [
|
||||
{
|
||||
"id": "spawn",
|
||||
"evs": [ "init_ev" ]
|
||||
},
|
||||
{
|
||||
"id": "menu_background",
|
||||
"mask": "menu_background"
|
||||
},
|
||||
{
|
||||
"id": "opt_start_new_game",
|
||||
"x": 40,
|
||||
"y": 216,
|
||||
"evs": [ "start_new_game" ]
|
||||
},
|
||||
{
|
||||
"id": "opt_quit_game",
|
||||
"x": 40,
|
||||
"y": 416,
|
||||
"evs": [ "quit_game" ]
|
||||
}
|
||||
],
|
||||
|
||||
"events": [
|
||||
{
|
||||
"id": "init_ev",
|
||||
"type": 0,
|
||||
"trs": [
|
||||
"opt_quit_game",
|
||||
"opt_start_new_game",
|
||||
"menu_background"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "start_new_game",
|
||||
"type": 8,
|
||||
"save_file": "wow_new_game_test"
|
||||
},
|
||||
{
|
||||
"id": "quit_game",
|
||||
"type": 9,
|
||||
"save_game": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 4.0 KiB |
|
@ -0,0 +1,37 @@
|
|||
#include "pushbuttonsound.h"
|
||||
#include "features/gamefeatures.h"
|
||||
|
||||
PushButtonSound::PushButtonSound(const QPixmap &pixmap_off, QGraphicsItem *parent) :
|
||||
b_on(false),
|
||||
pix_on(pixmap_off),
|
||||
pix_off(pixmap_off)
|
||||
{
|
||||
setParentItem(parent);
|
||||
Q_ASSERT(!pixmap_off.isNull());
|
||||
}
|
||||
|
||||
void PushButtonSound::onClick()
|
||||
{
|
||||
b_on = !b_on;
|
||||
emit signalChangeSound(b_on);
|
||||
}
|
||||
|
||||
void PushButtonSound::onConnect(std::unique_ptr<GameFeatures> &game_features)
|
||||
{
|
||||
QObject::connect(this, //sender
|
||||
SIGNAL(signalChangeSound(bool)),
|
||||
game_features->ptr_sound_player, //receiver
|
||||
SLOT(setMuteness(bool)));
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void PushButtonSound::setPixmapOn(const QPixmap &pixmap_on) noexcept
|
||||
{
|
||||
pix_on = pixmap_on;
|
||||
}
|
||||
|
||||
void PushButtonSound::setPixmapOff(const QPixmap &pixmap_off) noexcept
|
||||
{
|
||||
pix_off = pixmap_off;
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef PUSHBUTTONSOUND_H
|
||||
#define PUSHBUTTONSOUND_H
|
||||
|
||||
#include <QPainter>
|
||||
#include "qw_abstractscenecontrol.h"
|
||||
|
||||
/* PushButtonSound
|
||||
* Switches current sound state. */
|
||||
|
||||
class PushButtonSound : public QWAbstractSceneControl
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
bool b_on;
|
||||
QPixmap pix_on;
|
||||
QPixmap pix_off;
|
||||
|
||||
protected:
|
||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *,
|
||||
QWidget *) override
|
||||
{
|
||||
painter->fillRect(rect(), QBrush(b_on ? pix_on : pix_off));
|
||||
}
|
||||
|
||||
public:
|
||||
explicit PushButtonSound(const QPixmap &pixmap_off, QGraphicsItem *parent = nullptr);
|
||||
virtual ~PushButtonSound() override {}
|
||||
void onClick() override;
|
||||
void onConnect(std::unique_ptr<GameFeatures> &game_features) override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
inline void setPixmapOn(const QPixmap &pixmap_on) noexcept;
|
||||
inline void setPixmapOff(const QPixmap &pixmap_off) noexcept;
|
||||
|
||||
signals:
|
||||
void signalChangeSound(bool);
|
||||
};
|
||||
|
||||
#endif // PUSHBUTTONSOUND_H
|
|
@ -0,0 +1,13 @@
|
|||
#include "qw_abstractscenecontrol.h"
|
||||
|
||||
QWAbstractSceneControl:: QWAbstractSceneControl()
|
||||
{}
|
||||
|
||||
QWAbstractSceneControl::~QWAbstractSceneControl()
|
||||
{}
|
||||
|
||||
void QWAbstractSceneControl::onBuildingStateMachine(QWStateMachine *state_machine, std::unique_ptr<GameFeatures> &game_features)
|
||||
{
|
||||
Q_UNUSED(state_machine)
|
||||
Q_UNUSED(game_features)
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef ABSTRACTSCENECONTROL_H
|
||||
#define ABSTRACTSCENECONTROL_H
|
||||
|
||||
#include <memory>
|
||||
#include <QGraphicsWidget>
|
||||
|
||||
/* QWAbstractSceneControl
|
||||
* Interface for scene graphics elements which have
|
||||
* to manipulate non-logic game processes like sound, view, etc. */
|
||||
|
||||
struct GameFeatures;
|
||||
class QWStateMachine;
|
||||
|
||||
class QWAbstractSceneControl : public QGraphicsWidget
|
||||
{
|
||||
public:
|
||||
QWAbstractSceneControl();
|
||||
~QWAbstractSceneControl() = 0;
|
||||
|
||||
virtual void onClick() = 0;
|
||||
virtual void onConnect(std::unique_ptr<GameFeatures> &game_features) = 0;
|
||||
virtual void onBuildingStateMachine(QWStateMachine *state_machine, std::unique_ptr<GameFeatures> &game_features);
|
||||
};
|
||||
|
||||
#endif // ABSTRACTSCENECONTROL_H
|
|
@ -0,0 +1,71 @@
|
|||
#include "scenedialoguepanel.h"
|
||||
#include "features/gamefeatures.h"
|
||||
#include "features/qw_statemachine.h"
|
||||
#include "qw_globalmetadata.h"
|
||||
|
||||
SceneDialoguePanel::SceneDialoguePanel()
|
||||
{
|
||||
metadata.pixmap_path = QWGlobalMetadata::valueBy("DialoguePanel:pixmap_path").toString();
|
||||
|
||||
metadata.on_hid = QRect(QPoint(QWGlobalMetadata::valueBy("DialoguePanel:on_hid:bot_left_x" ).toInt(), // x1
|
||||
QWGlobalMetadata::valueBy("DialoguePanel:on_hid:bot_left_x" ).toInt()), // y1
|
||||
QPoint(QWGlobalMetadata::valueBy("DialoguePanel:on_hid:top_right_x").toInt(), // x4
|
||||
QWGlobalMetadata::valueBy("DialoguePanel:on_hid:top_right_y").toInt())); // y4
|
||||
|
||||
metadata.on_shw = QRect(QPoint(QWGlobalMetadata::valueBy("DialoguePanel:on_shw:bot_left_x" ).toInt(), // x1
|
||||
QWGlobalMetadata::valueBy("DialoguePanel:on_shw:bot_left_x" ).toInt()), // y1
|
||||
QPoint(QWGlobalMetadata::valueBy("DialoguePanel:on_shw:top_right_x").toInt(), // x4
|
||||
QWGlobalMetadata::valueBy("DialoguePanel:on_shw:top_right_y").toInt())); // y4
|
||||
/* /
|
||||
* 2-------4 /
|
||||
* | | <-
|
||||
* 1-------3
|
||||
*/
|
||||
setPixmap(QPixmap(metadata.pixmap_path));
|
||||
Q_ASSERT(!pix_rect.isNull());
|
||||
}
|
||||
|
||||
void SceneDialoguePanel::onClick()
|
||||
{}
|
||||
|
||||
void SceneDialoguePanel::onConnect(std::unique_ptr<GameFeatures> &game_features)
|
||||
{
|
||||
game_features->ptr_text_dlg->setDialoguePanel(shared_from_this());
|
||||
}
|
||||
|
||||
void SceneDialoguePanel::onBuildingStateMachine(QWStateMachine *state_machine, std::unique_ptr<GameFeatures> &game_features)
|
||||
{
|
||||
// Establisihing animation for dialogue panel
|
||||
|
||||
const auto &state_gameplay = state_machine->stateByKey("state_gameplay");
|
||||
|
||||
QState *state_dialogue = new QState;
|
||||
state_machine->registerState("state_dialogue", state_dialogue);
|
||||
connect(state_dialogue, SIGNAL(entered()), game_features->ptr_scene, SLOT(onEntryDialogue()));
|
||||
|
||||
QSignalTransition *enter_dialogue_transition = new QSignalTransition(game_features->ptr_text_dlg, SIGNAL(onEntryDialogueTransition()));
|
||||
enter_dialogue_transition->setTargetState(state_dialogue);
|
||||
state_gameplay->addTransition(enter_dialogue_transition);
|
||||
|
||||
QSignalTransition *leave_dialogue_transition = new QSignalTransition(game_features->ptr_text_dlg, SIGNAL(onLeaveDialogueTransition()));
|
||||
leave_dialogue_transition->setTargetState(state_gameplay);
|
||||
state_dialogue->addTransition(leave_dialogue_transition);
|
||||
|
||||
state_gameplay->assignProperty(this, "geometry", metadata.on_hid);
|
||||
state_dialogue->assignProperty(this, "geometry", metadata.on_shw);
|
||||
|
||||
state_machine->addState(state_dialogue);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void SceneDialoguePanel::setPixmap(const QPixmap &pix) noexcept
|
||||
{
|
||||
pix_rect = pix;
|
||||
Q_ASSERT(!pix_rect.isNull());
|
||||
}
|
||||
|
||||
QPixmap SceneDialoguePanel::pixmap() const noexcept
|
||||
{
|
||||
return pix_rect;
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
#ifndef SCENEDIALOGUEPANEL_H
|
||||
#define SCENEDIALOGUEPANEL_H
|
||||
|
||||
#include <QPainter>
|
||||
#include "qw_abstractscenecontrol.h"
|
||||
|
||||
/* SceneDialoguePanel
|
||||
* The view for dialogue processes like text, thoughts, etc. */
|
||||
|
||||
class SceneDialoguePanel : public QWAbstractSceneControl, public std::enable_shared_from_this<SceneDialoguePanel>
|
||||
{
|
||||
private:
|
||||
QPixmap pix_rect;
|
||||
|
||||
struct metadata
|
||||
{
|
||||
// path to panel pixmap
|
||||
QString pixmap_path;
|
||||
// rect when panel is hidden
|
||||
QRect on_hid;
|
||||
// rect when panel is shown
|
||||
QRect on_shw;
|
||||
} metadata;
|
||||
|
||||
protected:
|
||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *,
|
||||
QWidget *) override
|
||||
{
|
||||
painter->fillRect(rect(), QBrush(pix_rect));
|
||||
}
|
||||
|
||||
public:
|
||||
explicit SceneDialoguePanel();
|
||||
virtual ~SceneDialoguePanel() override {}
|
||||
void onClick() override;
|
||||
void onConnect(std::unique_ptr<GameFeatures> &game_features) override;
|
||||
void onBuildingStateMachine(QWStateMachine *state_machine, std::unique_ptr<GameFeatures> &game_features) override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
inline void setPixmap(const QPixmap &pix) noexcept;
|
||||
inline QPixmap pixmap() const noexcept;
|
||||
};
|
||||
|
||||
#endif // SCENEDIALOGUEPANEL_H
|
|
@ -0,0 +1,85 @@
|
|||
#include "sceneinventorypanel.h"
|
||||
#include "features/gamefeatures.h"
|
||||
#include "features/qw_statemachine.h"
|
||||
#include "qw_globalmetadata.h"
|
||||
|
||||
SceneInventoryPanel::SceneInventoryPanel()
|
||||
{
|
||||
metadata.pixmap_path = QWGlobalMetadata::valueBy("InventoryPanel:pixmap_path").toString();
|
||||
|
||||
metadata.on_hid = QRect(QPoint(QWGlobalMetadata::valueBy("InventoryPanel:on_hid:bot_left_x" ).toInt(), // x1
|
||||
QWGlobalMetadata::valueBy("InventoryPanel:on_hid:bot_left_y" ).toInt()), // y1
|
||||
QPoint(QWGlobalMetadata::valueBy("InventoryPanel:on_hid:top_right_x").toInt(), // x4
|
||||
QWGlobalMetadata::valueBy("InventoryPanel:on_hid:top_right_y").toInt())); // y4
|
||||
|
||||
metadata.on_shw = QRect(QPoint(QWGlobalMetadata::valueBy("InventoryPanel:on_shw:bot_left_x" ).toInt(), // x1
|
||||
QWGlobalMetadata::valueBy("InventoryPanel:on_shw:bot_left_y" ).toInt()), // y1
|
||||
QPoint(QWGlobalMetadata::valueBy("InventoryPanel:on_shw:top_right_x").toInt(), // x4
|
||||
QWGlobalMetadata::valueBy("InventoryPanel:on_shw:top_right_y").toInt())); // y4
|
||||
/* /
|
||||
* 2-------4 /
|
||||
* | | <-
|
||||
* 1-------3
|
||||
*/
|
||||
setPixmap(QPixmap(metadata.pixmap_path));
|
||||
}
|
||||
|
||||
void SceneInventoryPanel::onClick()
|
||||
{
|
||||
emit signalOnInventory();
|
||||
}
|
||||
|
||||
void SceneInventoryPanel::onConnect(std::unique_ptr<GameFeatures> &game_features)
|
||||
{
|
||||
game_features->ptr_inventory->setInventoryPanel(shared_from_this());
|
||||
QObject::connect(this, //sender
|
||||
SIGNAL(signalOnInventory()),
|
||||
game_features->ptr_inventory, // receiver
|
||||
SLOT(onClicked()));
|
||||
}
|
||||
|
||||
void SceneInventoryPanel::onBuildingStateMachine(QWStateMachine *state_machine, std::unique_ptr<GameFeatures> &game_features)
|
||||
{
|
||||
// Establisihing animation for inventory panel
|
||||
|
||||
QPropertyAnimation *anim = new QPropertyAnimation(shared_from_this().get(), "geometry");
|
||||
anim->setDuration(200);
|
||||
anim->setEasingCurve(QEasingCurve::InBack);
|
||||
|
||||
QState *state_gameplay = new QState;
|
||||
state_machine->registerState("state_gameplay", state_gameplay);
|
||||
connect(state_gameplay, SIGNAL(entered()), game_features->ptr_scene, SLOT(onEntryGameplay()));
|
||||
|
||||
QState *state_inventory = new QState;
|
||||
state_machine->registerState("state_inventory", state_inventory);
|
||||
connect(state_inventory, SIGNAL(entered()), game_features->ptr_scene, SLOT(onEntryInventory()));
|
||||
|
||||
QEventTransition *enter_inventory_transition = new QEventTransition(game_features->ptr_view, QEvent::Wheel);
|
||||
enter_inventory_transition->setTargetState(state_inventory);
|
||||
enter_inventory_transition->addAnimation(anim);
|
||||
state_gameplay->addTransition(enter_inventory_transition);
|
||||
|
||||
QEventTransition *leave_inventory_transition = new QEventTransition(game_features->ptr_view, QEvent::Wheel);
|
||||
leave_inventory_transition->setTargetState(state_gameplay);
|
||||
leave_inventory_transition->addAnimation(anim);
|
||||
state_inventory->addTransition(leave_inventory_transition);
|
||||
|
||||
state_gameplay->assignProperty(this, "geometry", metadata.on_hid);
|
||||
state_inventory->assignProperty(this, "geometry", metadata.on_shw);
|
||||
|
||||
state_machine->addState(state_gameplay);
|
||||
state_machine->addState(state_inventory);
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
|
||||
void SceneInventoryPanel::setPixmap(const QPixmap &pix) noexcept
|
||||
{
|
||||
pix_rect = pix;
|
||||
Q_ASSERT(!pix_rect.isNull());
|
||||
}
|
||||
|
||||
QPixmap SceneInventoryPanel::pixmap() const noexcept
|
||||
{
|
||||
return pix_rect;
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
#ifndef SCENEINVENTORYPANEL_H
|
||||
#define SCENEINVENTORYPANEL_H
|
||||
|
||||
#include <QPainter>
|
||||
#include "qw_abstractscenecontrol.h"
|
||||
|
||||
/* SceneInventoryPanel
|
||||
* The view for inventory and all its items on the scene. */
|
||||
|
||||
class SceneInventoryPanel : public QWAbstractSceneControl, public std::enable_shared_from_this<SceneInventoryPanel>
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
QPixmap pix_rect;
|
||||
|
||||
struct metadata
|
||||
{
|
||||
// path to panel pixmap
|
||||
QString pixmap_path;
|
||||
// rect when panel is hidden
|
||||
QRect on_hid;
|
||||
// rect when panel is shown
|
||||
QRect on_shw;
|
||||
} metadata;
|
||||
|
||||
protected:
|
||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *,
|
||||
QWidget *) override
|
||||
{
|
||||
painter->fillRect(rect(), QBrush(pix_rect));
|
||||
}
|
||||
|
||||
public:
|
||||
explicit SceneInventoryPanel();
|
||||
virtual ~SceneInventoryPanel() override {}
|
||||
void onClick() override;
|
||||
void onConnect(std::unique_ptr<GameFeatures> &game_features) override;
|
||||
void onBuildingStateMachine(QWStateMachine *state_machine, std::unique_ptr<GameFeatures> &game_features) override;
|
||||
|
||||
////////////////////////
|
||||
|
||||
inline void setPixmap(const QPixmap &pix) noexcept;
|
||||
inline QPixmap pixmap() const noexcept;
|
||||
|
||||
signals:
|
||||
void signalOnInventory();
|
||||
};
|
||||
|
||||
#endif // SCENEINVENTORYPANEL_H
|
|
@ -0,0 +1,128 @@
|
|||
#include "qw_scene.h"
|
||||
#include "models/qw_trigger.h"
|
||||
#include "controls/sceneinventorypanel.h"
|
||||
#include "controls/pushbuttonsound.h"
|
||||
#include "controls/scenedialoguepanel.h"
|
||||
|
||||
QWScene::QWScene(int x, int y) :
|
||||
QGraphicsScene(0, 0, x, y)
|
||||
{
|
||||
QLinkedList<std::shared_ptr<QWAbstractSceneControl>> widgt_list =
|
||||
{ std::make_shared<SceneInventoryPanel>(),
|
||||
std::make_shared<SceneDialoguePanel>()
|
||||
//std::make_shared<PushButtonSound>(QPixmap(":/res/cell.png")/*, ptr_inventory_panel.get()*/),
|
||||
};
|
||||
|
||||
foreach (std::shared_ptr<QWAbstractSceneControl> widgt, widgt_list) {
|
||||
addItem(widgt.get());
|
||||
list_on_inventory_widgets.append(std::move(widgt));
|
||||
}
|
||||
}
|
||||
|
||||
QLinkedList<std::shared_ptr<QWAbstractSceneControl>> QWScene::inventoryWidgets() const noexcept
|
||||
{
|
||||
return list_on_inventory_widgets;
|
||||
}
|
||||
|
||||
void QWScene::onEntryGameplay() noexcept
|
||||
{
|
||||
status = GAMEPLAY;
|
||||
}
|
||||
|
||||
void QWScene::onEntryInventory() noexcept
|
||||
{
|
||||
status = INVENTORY;
|
||||
}
|
||||
|
||||
void QWScene::onEntryMenu() noexcept
|
||||
{
|
||||
status = MENU;
|
||||
emit signalEnterMenu();
|
||||
}
|
||||
|
||||
void QWScene::onEntryDialogue() noexcept
|
||||
{
|
||||
status = DIALOGUE;
|
||||
}
|
||||
|
||||
void QWScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case MENU:
|
||||
case GAMEPLAY:
|
||||
// On GAMEPLAY and MENU state we check all the in-game entities.
|
||||
foreach (std::shared_ptr<QWTrigger> tr, location->triggers()) {
|
||||
if (tr->isUnderMouse() && event->button() == Qt::LeftButton)
|
||||
tr->activate();
|
||||
}
|
||||
break;
|
||||
|
||||
case INVENTORY:
|
||||
// On INVENTORY state we check all the system controls like buttons for sound, etc.
|
||||
foreach (std::shared_ptr<QWAbstractSceneControl> tr, list_on_inventory_widgets) {
|
||||
if (tr->isUnderMouse() && event->button() == Qt::LeftButton)
|
||||
tr->onClick();
|
||||
}
|
||||
break;
|
||||
|
||||
case DIALOGUE:
|
||||
// On DIALOGUE state we interact with current dialogue only.
|
||||
switch (event->button()) {
|
||||
case Qt::LeftButton:
|
||||
emit signalClickDialogue(MouseButton::LEFT);
|
||||
break;
|
||||
case Qt::RightButton:
|
||||
emit signalClickDialogue(MouseButton::RIGHT);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case EXAMINATION:
|
||||
// On EXAMINATION state we activate examination events of triggers
|
||||
foreach (std::shared_ptr<QWTrigger> tr, location->triggers()) {
|
||||
if (tr->isUnderMouse() && event->button() == Qt::LeftButton)
|
||||
emit signalLeaveExamination();
|
||||
tr->startExaminationDialogue();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void QWScene::keyReleaseEvent(QKeyEvent *event)
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case GAMEPLAY:
|
||||
if (event->key() == Qt::Key_E)
|
||||
emit signalEnterExamination();
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void QWScene::clearLocation()
|
||||
{
|
||||
if (!location)
|
||||
return;
|
||||
|
||||
// Moving to another location by erasing current
|
||||
foreach (const std::shared_ptr<QWTrigger> trigger, location->triggers())
|
||||
removeItem(trigger.get());
|
||||
|
||||
location = nullptr;
|
||||
}
|
||||
|
||||
void QWScene::setCurrentLocation(const std::shared_ptr<QWLocation> &loc) noexcept
|
||||
{
|
||||
location = loc;
|
||||
}
|
||||
|
||||
std::shared_ptr<QWLocation> QWScene::currentLocation() const noexcept
|
||||
{
|
||||
return location;
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
#ifndef QUESTSCENE_H
|
||||
#define QUESTSCENE_H
|
||||
|
||||
#include <memory>
|
||||
#include <QGraphicsScene>
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QGraphicsEffect>
|
||||
#include <QLinkedList>
|
||||
|
||||
#include "models/qw_location.h"
|
||||
#include "controls/qw_abstractscenecontrol.h"
|
||||
|
||||
/* QWScene
|
||||
* The game scene itself. */
|
||||
|
||||
enum class MouseButton { LEFT, RIGHT };
|
||||
|
||||
class QWDialogueFrame;
|
||||
|
||||
class QWScene final : public QGraphicsScene
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWScene)
|
||||
private:
|
||||
std::shared_ptr<QWLocation> location;
|
||||
QLinkedList<std::shared_ptr<QWAbstractSceneControl>> list_on_inventory_widgets;
|
||||
|
||||
enum SceneStatus { GAMEPLAY, INVENTORY, MENU, DIALOGUE, EXAMINATION };
|
||||
SceneStatus status;
|
||||
|
||||
protected:
|
||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
||||
void keyReleaseEvent(QKeyEvent *event) override;
|
||||
|
||||
public:
|
||||
explicit QWScene(int x, int y);
|
||||
|
||||
QLinkedList<std::shared_ptr<QWAbstractSceneControl>> inventoryWidgets() const noexcept;
|
||||
|
||||
void setCurrentLocation(const std::shared_ptr<QWLocation> &loc) noexcept;
|
||||
std::shared_ptr<QWLocation> currentLocation() const noexcept;
|
||||
void clearLocation();
|
||||
|
||||
void onEndLevel(const QString &str) noexcept;
|
||||
|
||||
signals:
|
||||
void signalClickInventory();
|
||||
void signalClickDialogue(MouseButton);
|
||||
void signalEnterMenu();
|
||||
void signalLeaveMenu();
|
||||
void signalEnterExamination();
|
||||
void signalLeaveExamination();
|
||||
|
||||
public slots:
|
||||
void onEntryGameplay() noexcept;
|
||||
void onEntryInventory() noexcept;
|
||||
void onEntryMenu() noexcept;
|
||||
void onEntryDialogue() noexcept;
|
||||
};
|
||||
|
||||
#endif // QUESTSCENE_H
|
|
@ -0,0 +1,9 @@
|
|||
#include "qw_view.h"
|
||||
|
||||
QWView::QWView(QWScene *sc) :
|
||||
scene(sc)
|
||||
{
|
||||
setScene(sc);
|
||||
//setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
//setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef QUESTVIEW_H
|
||||
#define QUESTVIEW_H
|
||||
|
||||
#include <QGraphicsView>
|
||||
#include "qw_scene.h"
|
||||
|
||||
/* QWView
|
||||
* The same QGraphicsView but this one ignores wheel events,
|
||||
* because wheels are for loosers. */
|
||||
|
||||
class QWView final : public QGraphicsView
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(QWView)
|
||||
private:
|
||||
QWScene *scene;
|
||||
|
||||
protected:
|
||||
|
||||
void wheelEvent(QWheelEvent *ev) override
|
||||
{
|
||||
ev->ignore();
|
||||
}
|
||||
|
||||
public:
|
||||
explicit QWView(QWScene *sc);
|
||||
};
|
||||
|
||||
#endif // QUESTVIEW_H
|
Loading…
Reference in New Issue