mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-13 15:40:57 +00:00
NANCY: Implement help screen and UI buttons
The menu and help buttons on the sides of the frame are now functional, and the help screen is now also accessible. Also replaced the Frame class with a more general FullScreenImage that will be used across different game states.
This commit is contained in:
parent
6ada1a6b90
commit
5f35b8abcb
@ -14,12 +14,14 @@ MODULE_OBJS = \
|
||||
action/sliderpuzzle.o \
|
||||
action/staticbitmapanim.o \
|
||||
action/telephone.o \
|
||||
ui/frame.o \
|
||||
ui/fullscreenimage.o \
|
||||
ui/button.o \
|
||||
ui/inventorybox.o \
|
||||
ui/scrollbar.o \
|
||||
ui/textbox.o \
|
||||
ui/viewport.o \
|
||||
state/logo.o \
|
||||
state/help.o \
|
||||
state/map.o \
|
||||
state/scene.o \
|
||||
cheat.o \
|
||||
|
@ -22,6 +22,8 @@
|
||||
|
||||
#include "engines/nancy/state/logo.h"
|
||||
#include "engines/nancy/state/scene.h"
|
||||
#include "engines/nancy/state/help.h"
|
||||
#include "engines/nancy/state/map.h"
|
||||
|
||||
#include "engines/nancy/nancy.h"
|
||||
#include "engines/nancy/resource.h"
|
||||
@ -29,7 +31,6 @@
|
||||
#include "engines/nancy/sound.h"
|
||||
#include "engines/nancy/input.h"
|
||||
#include "engines/nancy/sound.h"
|
||||
#include "engines/nancy/state/map.h"
|
||||
#include "engines/nancy/graphics.h"
|
||||
#include "engines/nancy/cursor.h"
|
||||
#include "engines/nancy/cheat.h"
|
||||
@ -73,6 +74,7 @@ NancyEngine::NancyEngine(OSystem *syst, const NancyGameDescription *gd) :
|
||||
logo = new State::Logo(this);
|
||||
scene = new State::Scene(this);
|
||||
map = new State::Map(this);
|
||||
help = new State::Help(this);
|
||||
input = new InputManager(this);
|
||||
sound = new SoundManager(this);
|
||||
graphicsManager = new GraphicsManager(this);
|
||||
@ -147,42 +149,51 @@ Common::Error NancyEngine::run() {
|
||||
while (!shouldQuit()) {
|
||||
cursorManager->setCursorType(CursorManager::kNormalArrow);
|
||||
input->processEvents();
|
||||
|
||||
switch (_gameFlow.minGameState) {
|
||||
case kBoot:
|
||||
bootGameEngine();
|
||||
graphicsManager->init();
|
||||
cursorManager->init();
|
||||
setGameState(kLogo);
|
||||
break;
|
||||
case kLogo:
|
||||
logo->process();
|
||||
break;
|
||||
case kMainMenu:
|
||||
// TODO
|
||||
break;
|
||||
case kScene:
|
||||
scene->process();
|
||||
break;
|
||||
case kMap:
|
||||
map->process();
|
||||
break;
|
||||
case kCheat: {
|
||||
if (_cheatTypeIsEventFlag) {
|
||||
EventFlagDialog *dialog = new EventFlagDialog(this);
|
||||
dialog->runModal();
|
||||
delete dialog;
|
||||
} else {
|
||||
CheatDialog *dialog = new CheatDialog(this);
|
||||
dialog->runModal();
|
||||
delete dialog;
|
||||
case kBoot:
|
||||
bootGameEngine();
|
||||
graphicsManager->init();
|
||||
cursorManager->init();
|
||||
setGameState(kLogo);
|
||||
break;
|
||||
case kLogo:
|
||||
logo->process();
|
||||
break;
|
||||
case kMainMenu: {
|
||||
GameState prevState = getPreviousGameState();
|
||||
// TODO until the game's own menus are implemented we simply open the GMM
|
||||
openMainMenuDialog();
|
||||
setGameState(prevState);
|
||||
break;
|
||||
}
|
||||
setGameState(getPreviousGameState());
|
||||
input->forceCleanInput();
|
||||
break;
|
||||
}
|
||||
case kIdle:
|
||||
default:
|
||||
break;
|
||||
case kHelp:
|
||||
help->process();
|
||||
break;
|
||||
case kScene:
|
||||
scene->process();
|
||||
break;
|
||||
case kMap:
|
||||
map->process();
|
||||
break;
|
||||
case kCheat: {
|
||||
if (_cheatTypeIsEventFlag) {
|
||||
EventFlagDialog *dialog = new EventFlagDialog(this);
|
||||
dialog->runModal();
|
||||
delete dialog;
|
||||
} else {
|
||||
CheatDialog *dialog = new CheatDialog(this);
|
||||
dialog->runModal();
|
||||
delete dialog;
|
||||
}
|
||||
setGameState(getPreviousGameState());
|
||||
input->forceCleanInput();
|
||||
break;
|
||||
}
|
||||
case kIdle:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
graphicsManager->draw();
|
||||
|
@ -68,6 +68,7 @@ namespace State {
|
||||
class Logo;
|
||||
class Scene;
|
||||
class Map;
|
||||
class Help;
|
||||
}
|
||||
|
||||
class NancyEngine : public Engine {
|
||||
@ -143,6 +144,7 @@ public:
|
||||
State::Logo *logo;
|
||||
State::Scene *scene;
|
||||
State::Map *map;
|
||||
State::Help *help;
|
||||
|
||||
OSystem *_system;
|
||||
Common::RandomSource *_rnd;
|
||||
|
106
engines/nancy/state/help.cpp
Normal file
106
engines/nancy/state/help.cpp
Normal file
@ -0,0 +1,106 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "engines/nancy/state/help.h"
|
||||
|
||||
#include "engines/nancy/nancy.h"
|
||||
#include "engines/nancy/commontypes.h"
|
||||
#include "engines/nancy/sound.h"
|
||||
#include "engines/nancy/input.h"
|
||||
#include "engines/nancy/cursor.h"
|
||||
|
||||
#include "common/stream.h"
|
||||
|
||||
namespace Nancy {
|
||||
namespace State {
|
||||
|
||||
void Help::process() {
|
||||
switch (_state) {
|
||||
case kInit:
|
||||
init();
|
||||
// fall through
|
||||
case kBegin:
|
||||
begin();
|
||||
// fall through
|
||||
case kRun:
|
||||
run();
|
||||
break;
|
||||
case kWaitForSound:
|
||||
waitForSound();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Help::init() {
|
||||
Common::SeekableReadStream *chunk = _engine->getBootChunkStream("HELP");
|
||||
|
||||
chunk->seek(0);
|
||||
char buf[10];
|
||||
chunk->read(buf, 10);
|
||||
_image.init(buf);
|
||||
|
||||
chunk->skip(20);
|
||||
_hotspot.left = chunk->readUint16LE();
|
||||
_hotspot.top = chunk->readUint16LE();
|
||||
_hotspot.right = chunk->readUint16LE();
|
||||
_hotspot.bottom = chunk->readUint16LE();
|
||||
|
||||
chunk = _engine->getBootChunkStream("MSND");
|
||||
chunk->seek(0);
|
||||
_sound.read(*chunk, SoundDescription::kMenu);
|
||||
|
||||
_state = kBegin;
|
||||
}
|
||||
|
||||
void Help::begin() {
|
||||
_engine->sound->loadSound(_sound);
|
||||
_engine->sound->playSound(_sound);
|
||||
|
||||
_image.registerGraphics();
|
||||
_image.setVisible(true);
|
||||
|
||||
_engine->cursorManager->setCursorType(CursorManager::kNormalArrow);
|
||||
_previousState = _engine->getPreviousGameState();
|
||||
|
||||
_state = kRun;
|
||||
}
|
||||
|
||||
void Help::run() {
|
||||
NancyInput input = _engine->input->getInput();
|
||||
|
||||
if (_hotspot.contains(input.mousePos) && input.input & NancyInput::kLeftMouseButtonUp) {
|
||||
_engine->sound->playSound(0x18); // Hardcoded by original engine
|
||||
_state = kWaitForSound;
|
||||
}
|
||||
}
|
||||
|
||||
void Help::waitForSound() {
|
||||
if (!_engine->sound->isSoundPlaying(18)) {
|
||||
_engine->setGameState((NancyEngine::GameState)_previousState);
|
||||
|
||||
_engine->sound->stopSound(_sound);
|
||||
_state = kBegin;
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace State
|
||||
} // End of namespace Nancy
|
62
engines/nancy/state/help.h
Normal file
62
engines/nancy/state/help.h
Normal file
@ -0,0 +1,62 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "engines/nancy/ui/fullscreenimage.h"
|
||||
|
||||
#include "engines/nancy/commontypes.h"
|
||||
|
||||
#include "common/rect.h"
|
||||
|
||||
#ifndef NANCY_STATE_HELP_H
|
||||
#define NANCY_STATE_HELP_H
|
||||
|
||||
namespace Nancy {
|
||||
|
||||
class NancyEngine;
|
||||
|
||||
namespace State {
|
||||
|
||||
class Help {
|
||||
public:
|
||||
enum State { kInit, kBegin, kRun, kWaitForSound };
|
||||
Help(NancyEngine *engine) : _engine(engine), _state(kInit), _image(engine) {}
|
||||
|
||||
void process();
|
||||
|
||||
private:
|
||||
void init();
|
||||
void begin();
|
||||
void run();
|
||||
void waitForSound();
|
||||
|
||||
NancyEngine *_engine;
|
||||
State _state;
|
||||
UI::FullScreenImage _image;
|
||||
Common::Rect _hotspot; // Can be an array, but isn't in nancy1
|
||||
SoundDescription _sound;
|
||||
uint _previousState;
|
||||
};
|
||||
|
||||
} // End of namespace State
|
||||
} // End of namespace Nancy
|
||||
|
||||
#endif // NANCY_STATE_HELP_H
|
@ -131,6 +131,9 @@ void Scene::registerGraphics() {
|
||||
_viewport.registerGraphics();
|
||||
_textbox.registerGraphics();
|
||||
_inventoryBox.registerGraphics();
|
||||
_menuButton.registerGraphics();
|
||||
|
||||
_engine->graphicsManager->redrawAll();
|
||||
|
||||
// Used to clear the map label
|
||||
_textbox.setVisible(false);
|
||||
@ -168,10 +171,12 @@ void Scene::init() {
|
||||
}
|
||||
_lastHint = -1;
|
||||
|
||||
_frame.init();
|
||||
_frame.init("FRAME"); // TODO should be extracted from BSUM
|
||||
_viewport.init();
|
||||
_textbox.init();
|
||||
_inventoryBox.init();
|
||||
_menuButton.init();
|
||||
_helpButton.init();
|
||||
_engine->cursorManager->showCursor(true);
|
||||
|
||||
_state = kLoad;
|
||||
@ -278,6 +283,8 @@ void Scene::run() {
|
||||
registerGraphics();
|
||||
}
|
||||
unpauseSceneSpecificSounds();
|
||||
_menuButton.setVisible(false);
|
||||
_menuButton.setVisible(false);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -314,6 +321,8 @@ void Scene::run() {
|
||||
// Update the UI elements and handle input
|
||||
NancyInput input = _engine->input->getInput();
|
||||
_viewport.handleInput(input);
|
||||
_menuButton.handleInput(input);
|
||||
_helpButton.handleInput(input);
|
||||
_textbox.handleInput(input);
|
||||
_inventoryBox.handleInput(input);
|
||||
_actionManager.handleInput(input);
|
||||
|
@ -25,10 +25,11 @@
|
||||
|
||||
#include "engines/nancy/action/actionmanager.h"
|
||||
|
||||
#include "engines/nancy/ui/frame.h"
|
||||
#include "engines/nancy/ui/fullscreenimage.h"
|
||||
#include "engines/nancy/ui/viewport.h"
|
||||
#include "engines/nancy/ui/textbox.h"
|
||||
#include "engines/nancy/ui/inventorybox.h"
|
||||
#include "engines/nancy/ui/button.h"
|
||||
|
||||
#include "engines/nancy/time.h"
|
||||
#include "engines/nancy/commontypes.h"
|
||||
@ -92,6 +93,8 @@ public:
|
||||
_viewport(engine),
|
||||
_textbox(_frame),
|
||||
_inventoryBox(_frame),
|
||||
_menuButton(_frame),
|
||||
_helpButton(_frame),
|
||||
_actionManager(engine) {}
|
||||
|
||||
void process();
|
||||
@ -134,7 +137,7 @@ public:
|
||||
|
||||
void registerGraphics();
|
||||
|
||||
UI::Frame &getFrame() { return _frame; }
|
||||
UI::FullScreenImage &getFrame() { return _frame; }
|
||||
UI::Viewport &getViewport() { return _viewport; }
|
||||
UI::Textbox &getTextbox() { return _textbox; }
|
||||
UI::InventoryBox &getInventoryBox() { return _inventoryBox; }
|
||||
@ -220,10 +223,12 @@ protected:
|
||||
Nancy::NancyEngine *_engine;
|
||||
|
||||
// RenderObjects
|
||||
UI::Frame _frame;
|
||||
UI::FullScreenImage _frame;
|
||||
UI::Viewport _viewport;
|
||||
UI::Textbox _textbox;
|
||||
UI::InventoryBox _inventoryBox;
|
||||
UI::MenuButton _menuButton;
|
||||
UI::HelpButton _helpButton;
|
||||
|
||||
// Data
|
||||
SceneState _sceneState;
|
||||
|
86
engines/nancy/ui/button.cpp
Normal file
86
engines/nancy/ui/button.cpp
Normal file
@ -0,0 +1,86 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "engines/nancy/ui/button.h"
|
||||
|
||||
#include "engines/nancy/input.h"
|
||||
#include "engines/nancy/cursor.h"
|
||||
#include "engines/nancy/nancy.h"
|
||||
#include "engines/nancy/util.h"
|
||||
#include "engines/nancy/graphics.h"
|
||||
#include "engines/nancy/state/scene.h"
|
||||
|
||||
#include "common/stream.h"
|
||||
|
||||
namespace Nancy {
|
||||
namespace UI {
|
||||
|
||||
void Button::handleInput(NancyInput &input) {
|
||||
if (_screenPosition.contains(input.mousePos)) {
|
||||
_engine->cursorManager->setCursorType(CursorManager::kHotspotArrow);
|
||||
|
||||
if (input.input & NancyInput::kLeftMouseButtonUp) {
|
||||
onClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MenuButton::init() {
|
||||
Common::SeekableReadStream *bsum = _engine->getBootChunkStream("BSUM");
|
||||
|
||||
bsum->seek(0x184, SEEK_SET);
|
||||
Common::Rect src;
|
||||
readRect(*bsum, src);
|
||||
_drawSurface.create(_engine->graphicsManager->object0, src);
|
||||
bsum->skip(16);
|
||||
readRect(*bsum, _screenPosition);
|
||||
setVisible(false);
|
||||
|
||||
RenderObject::init();
|
||||
}
|
||||
|
||||
void MenuButton::onClick() {
|
||||
_engine->scene->requestStateChange(NancyEngine::kMainMenu);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
void HelpButton::init() {
|
||||
Common::SeekableReadStream *bsum = _engine->getBootChunkStream("BSUM");
|
||||
|
||||
bsum->seek(0x194, SEEK_SET);
|
||||
Common::Rect src;
|
||||
readRect(*bsum, src);
|
||||
_drawSurface.create(_engine->graphicsManager->object0, src);
|
||||
bsum->skip(16);
|
||||
readRect(*bsum, _screenPosition);
|
||||
setVisible(false);
|
||||
|
||||
RenderObject::init();
|
||||
}
|
||||
|
||||
void HelpButton::onClick() {
|
||||
_engine->scene->requestStateChange(NancyEngine::kHelp);
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
} // End of namespace UI
|
||||
} // End of namespace Nancy
|
70
engines/nancy/ui/button.h
Normal file
70
engines/nancy/ui/button.h
Normal file
@ -0,0 +1,70 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NANCY_UI_BUTTON_H
|
||||
#define NANCY_UI_BUTTON_H
|
||||
|
||||
#include "engines/nancy/renderobject.h"
|
||||
|
||||
namespace Nancy {
|
||||
|
||||
struct NancyInput;
|
||||
|
||||
namespace UI {
|
||||
|
||||
class Button : public RenderObject {
|
||||
public:
|
||||
Button(RenderObject &redrawFrom) : RenderObject(redrawFrom) {}
|
||||
virtual ~Button() =default;
|
||||
|
||||
virtual void onClick() =0;
|
||||
|
||||
void handleInput(NancyInput &input);
|
||||
|
||||
protected:
|
||||
virtual uint16 getZOrder() const override { return 5; }
|
||||
virtual BlitType getBlitType() const override { return kNoTrans; }
|
||||
|
||||
};
|
||||
|
||||
class MenuButton : public Button {
|
||||
public:
|
||||
MenuButton(RenderObject &redrawFrom) : Button(redrawFrom) {}
|
||||
virtual ~MenuButton() =default;
|
||||
|
||||
virtual void init() override;
|
||||
virtual void onClick() override;
|
||||
};
|
||||
|
||||
class HelpButton : public Button {
|
||||
public:
|
||||
HelpButton(RenderObject &redrawFrom) : Button(redrawFrom) {}
|
||||
virtual ~HelpButton() =default;
|
||||
|
||||
virtual void init() override;
|
||||
virtual void onClick() override;
|
||||
};
|
||||
|
||||
} // End of namespace UI
|
||||
} // End of namespace Nancy
|
||||
|
||||
#endif // NANCY_UI_BUTTON_H
|
@ -20,7 +20,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "engines/nancy/ui/frame.h"
|
||||
#include "engines/nancy/ui/fullscreenimage.h"
|
||||
|
||||
#include "engines/nancy/nancy.h"
|
||||
#include "engines/nancy/resource.h"
|
||||
@ -29,10 +29,9 @@
|
||||
namespace Nancy {
|
||||
namespace UI {
|
||||
|
||||
void Frame::init() {
|
||||
// TODO
|
||||
void FullScreenImage::init(Common::String imageName) {
|
||||
Graphics::Surface surf;
|
||||
_engine->_res->loadImage("ciftree", "FRAME", surf);
|
||||
_engine->_res->loadImage("ciftree", imageName, surf);
|
||||
|
||||
Common::Rect srcBounds = Common::Rect(0,0, surf.w, surf.h);
|
||||
_screenPosition = srcBounds;
|
@ -20,22 +20,22 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NANCY_UI_FRAME_H
|
||||
#define NANCY_UI_FRAME_H
|
||||
#ifndef NANCY_UI_FULLSCREENIMAGE_H
|
||||
#define NANCY_UI_FULLSCREENIMAGE_H
|
||||
|
||||
#include "engines/nancy/renderobject.h"
|
||||
|
||||
namespace Nancy {
|
||||
namespace UI {
|
||||
|
||||
class Frame : public RenderObject {
|
||||
class FullScreenImage : public RenderObject {
|
||||
public:
|
||||
Frame(NancyEngine *engine) : RenderObject(engine) {}
|
||||
virtual ~Frame() =default;
|
||||
|
||||
virtual void init() override;
|
||||
FullScreenImage(NancyEngine *engine) : RenderObject(engine) {}
|
||||
virtual ~FullScreenImage() =default;
|
||||
|
||||
void init(Common::String imageName);
|
||||
protected:
|
||||
virtual void init() override {}
|
||||
virtual uint16 getZOrder() const override { return 0; }
|
||||
virtual BlitType getBlitType() const override { return kNoTrans; }
|
||||
};
|
||||
@ -43,4 +43,4 @@ protected:
|
||||
} // End of namespace UI
|
||||
} // End of namespace Nancy
|
||||
|
||||
#endif // NANCY_UI_FRAME_H
|
||||
#endif // NANCY_UI_FULLSCREENIMAGE_H
|
Loading…
x
Reference in New Issue
Block a user