ULTIMA8: Remove dependency on Shared::EventsManager

This commit is contained in:
Cameron Cawley 2022-12-31 22:21:00 +00:00 committed by Matthew Jimenez
parent 8d8f839253
commit d280efb7e4
20 changed files with 92 additions and 61 deletions

View File

@ -22,6 +22,7 @@
#ifndef NUVIE_NUVIE_H
#define NUVIE_NUVIE_H
#include "ultima/shared/engine/events.h"
#include "ultima/shared/engine/ultima.h"
#include "ultima/shared/std/string.h"
#include "ultima/nuvie/conf/configuration.h"
@ -39,7 +40,7 @@ class Screen;
class Script;
class SoundManager;
class NuvieEngine : public Ultima::Shared::UltimaEngine {
class NuvieEngine : public Ultima::Shared::UltimaEngine, public Ultima::Shared::EventsCallback {
private:
Configuration *_config;
Screen *_screen;
@ -48,6 +49,7 @@ private:
SaveGame *_savegame;
SoundManager *_soundManager;
Ultima::Shared::EventsManager *_events;
private:
void initConfig();
void assignGameConfigValues(uint8 game_type);

View File

@ -34,6 +34,7 @@
#include "engines/engine.h"
#include "ultima/detection.h"
#include "ultima/shared/engine/events.h"
#include "ultima/shared/engine/ultima.h"
namespace Ultima {
@ -65,7 +66,7 @@ namespace Gfx {
class Screen;
}
class UltimaEarlyEngine : public UltimaEngine {
class UltimaEarlyEngine : public UltimaEngine, public EventsCallback {
private:
/**
* Initialize the engine
@ -86,6 +87,7 @@ public:
GameBase *_game;
MouseCursor *_mouseCursor;
Gfx::Screen *_screen;
EventsManager *_events;
public:
UltimaEarlyEngine(OSystem *syst, const UltimaGameDescription *gameDesc);
~UltimaEarlyEngine() override;

View File

@ -36,7 +36,7 @@ UltimaEngine * g_ultima;
UltimaEngine::UltimaEngine(OSystem *syst, const Ultima::UltimaGameDescription *gameDesc) :
Engine(syst), _gameDescription(gameDesc), _randomSource("Ultima"),
_dataArchive(nullptr), _events(nullptr) {
_dataArchive(nullptr) {
g_ultima = this;
}

View File

@ -23,8 +23,6 @@
#define ULTIMA_SHARED_ENGINE_ULTIMA_H
#include "ultima/detection.h"
#include "ultima/shared/engine/debugger.h"
#include "ultima/shared/engine/events.h"
#include "common/archive.h"
#include "common/random.h"
#include "engines/engine.h"
@ -32,7 +30,7 @@
namespace Ultima {
namespace Shared {
class UltimaEngine : public Engine, public EventsCallback {
class UltimaEngine : public Engine {
private:
Common::RandomSource _randomSource;
protected:
@ -56,8 +54,6 @@ protected:
return false;
}
public:
EventsManager *_events;
public:
UltimaEngine(OSystem *syst, const Ultima::UltimaGameDescription *gameDesc);
~UltimaEngine() override;

View File

@ -302,14 +302,14 @@ Gump *ContainerGump::onMouseDown(int button, int32 mx, int32 my) {
if (handled) return handled;
// only interested in left clicks
if (button == Shared::BUTTON_LEFT)
if (button == Mouse::BUTTON_LEFT)
return this;
return nullptr;
}
void ContainerGump::onMouseClick(int button, int32 mx, int32 my) {
if (button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_LEFT) {
uint16 objID = TraceObjId(mx, my);
Item *item = getItem(objID);
@ -326,7 +326,7 @@ void ContainerGump::onMouseClick(int button, int32 mx, int32 my) {
}
void ContainerGump::onMouseDouble(int button, int32 mx, int32 my) {
if (button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_LEFT) {
uint16 objID = TraceObjId(mx, my);
if (objID == getObjId()) {

View File

@ -20,6 +20,7 @@
*/
#include "common/config-manager.h"
#include "common/events.h"
#include "ultima/ultima8/gumps/credits_gump.h"

View File

@ -141,7 +141,7 @@ void DifficultyGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scal
}
void DifficultyGump::onMouseClick(int button, int32 mx, int32 my) {
if (button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_LEFT) {
Gump *gump = FindGump(mx, my);
if (gump && gump->GetIndex() > 0) {
int idx = gump->GetIndex();

View File

@ -271,12 +271,12 @@ Gump *GameMapGump::onMouseDown(int button, int32 mx, int32 my) {
GumpToScreenSpace(sx, sy);
AvatarMoverProcess *amp = Ultima8Engine::get_instance()->getAvatarMoverProcess();
if (button == Shared::BUTTON_RIGHT || button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_RIGHT || button == Mouse::BUTTON_LEFT) {
amp->onMouseDown(button, sx, sy);
}
if (button == Shared::BUTTON_LEFT || button == Shared::BUTTON_RIGHT ||
button == Shared::BUTTON_MIDDLE) {
if (button == Mouse::BUTTON_LEFT || button == Mouse::BUTTON_RIGHT ||
button == Mouse::BUTTON_MIDDLE) {
// we take all clicks
return this;
}
@ -286,7 +286,7 @@ Gump *GameMapGump::onMouseDown(int button, int32 mx, int32 my) {
void GameMapGump::onMouseUp(int button, int32 mx, int32 my) {
AvatarMoverProcess *amp = Ultima8Engine::get_instance()->getAvatarMoverProcess();
if (button == Shared::BUTTON_RIGHT || button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_RIGHT || button == Mouse::BUTTON_LEFT) {
amp->onMouseUp(button);
}
}
@ -294,10 +294,10 @@ void GameMapGump::onMouseUp(int button, int32 mx, int32 my) {
void GameMapGump::onMouseClick(int button, int32 mx, int32 my) {
MainActor *avatar = getMainActor();
switch (button) {
case Shared::BUTTON_LEFT: {
case Mouse::BUTTON_LEFT: {
if (avatar->isInCombat()) break;
if (Mouse::get_instance()->isMouseDownEvent(Shared::BUTTON_RIGHT)) break;
if (Mouse::get_instance()->isMouseDownEvent(Mouse::BUTTON_RIGHT)) break;
uint16 objID = TraceObjId(mx, my);
Item *item = getItem(objID);
@ -314,7 +314,7 @@ void GameMapGump::onMouseClick(int button, int32 mx, int32 my) {
}
break;
}
case Shared::BUTTON_MIDDLE: {
case Mouse::BUTTON_MIDDLE: {
uint16 objID = TraceObjId(mx, my);
Item *item = getItem(objID);
if (item) {
@ -359,10 +359,10 @@ void GameMapGump::onMouseClick(int button, int32 mx, int32 my) {
void GameMapGump::onMouseDouble(int button, int32 mx, int32 my) {
MainActor *avatar = getMainActor();
switch (button) {
case Shared::BUTTON_LEFT: {
case Mouse::BUTTON_LEFT: {
if (avatar->isInCombat()) break;
if (Mouse::get_instance()->isMouseDownEvent(Shared::BUTTON_RIGHT)) break;
if (Mouse::get_instance()->isMouseDownEvent(Mouse::BUTTON_RIGHT)) break;
uint16 objID = TraceObjId(mx, my);
Item *item = getItem(objID);

View File

@ -19,6 +19,8 @@
*
*/
#include "common/events.h"
#include "ultima/ultima8/audio/audio_process.h"
#include "ultima/ultima8/gumps/keypad_gump.h"
#include "ultima/ultima8/games/game_data.h"

View File

@ -102,7 +102,7 @@ uint16 MiniStatsGump::TraceObjId(int32 mx, int32 my) {
}
Gump *MiniStatsGump::onMouseDown(int button, int32 mx, int32 my) {
if (button == Shared::BUTTON_LEFT)
if (button == Mouse::BUTTON_LEFT)
return this;
return nullptr;

View File

@ -177,14 +177,14 @@ Gump *MiniMapGump::onMouseDown(int button, int32 mx, int32 my) {
return handled;
// only interested in left clicks
if (button == Shared::BUTTON_LEFT)
if (button == Mouse::BUTTON_LEFT)
return this;
return nullptr;
}
void MiniMapGump::onMouseDouble(int button, int32 mx, int32 my) {
if (button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_LEFT) {
HideGump();
}
}

View File

@ -19,6 +19,8 @@
*
*/
#include "common/events.h"
#include "ultima/ultima8/gumps/paged_gump.h"
#include "ultima/ultima8/games/game_data.h"
#include "ultima/ultima8/graphics/gump_shape_archive.h"

View File

@ -171,7 +171,7 @@ Gump *U8SaveGump::onMouseDown(int button, int32 mx, int32 my) {
void U8SaveGump::onMouseClick(int button, int32 mx, int32 my) {
if (button != Shared::BUTTON_LEFT) return;
if (button != Mouse::BUTTON_LEFT) return;
ParentToGump(mx, my);

View File

@ -110,7 +110,7 @@ Gump *ButtonWidget::onMouseDown(int button, int32 mx, int32 my) {
Gump *ret = Gump::onMouseDown(button, mx, my);
if (ret)
return ret;
if (button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_LEFT) {
// CHECKME: change dimensions or not?
if (!_mouseOver) {
_shape = _shapeDown;
@ -130,7 +130,7 @@ uint16 ButtonWidget::TraceObjId(int32 mx, int32 my) {
void ButtonWidget::onMouseUp(int button, int32 mx, int32 my) {
if (button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_LEFT) {
if (!_mouseOver) {
_shape = _shapeUp;
_frameNum = _frameNumUp;

View File

@ -52,8 +52,8 @@ Mouse::~Mouse() {
_instance = nullptr;
}
bool Mouse::buttonDown(Shared::MouseButton button) {
assert(button != Shared::MOUSE_LAST);
bool Mouse::buttonDown(MouseButton button) {
assert(button != MOUSE_LAST);
bool handled = false;
uint32 now = g_system->getMillis();
@ -91,8 +91,8 @@ bool Mouse::buttonDown(Shared::MouseButton button) {
return handled;
}
bool Mouse::buttonUp(Shared::MouseButton button) {
assert(button != Shared::MOUSE_LAST);
bool Mouse::buttonUp(MouseButton button) {
assert(button != MOUSE_LAST);
bool handled = false;
_mouseButton[button].clearState(MBS_DOWN);
@ -112,7 +112,7 @@ bool Mouse::buttonUp(Shared::MouseButton button) {
handled = true;
}
if (button == Shared::BUTTON_LEFT && _dragging != Mouse::DRAG_NOT) {
if (button == BUTTON_LEFT && _dragging != Mouse::DRAG_NOT) {
stopDragging(_mousePos.x, _mousePos.y);
handled = true;
}
@ -126,7 +126,7 @@ void Mouse::popAllCursors() {
update();
}
bool Mouse::isMouseDownEvent(Shared::MouseButton button) const {
bool Mouse::isMouseDownEvent(MouseButton button) const {
return _mouseButton[button].isState(MBS_DOWN);
}
@ -329,9 +329,9 @@ void Mouse::setMouseCoords(int mx, int my) {
}
if (_dragging == DRAG_NOT) {
if (_mouseButton[Shared::BUTTON_LEFT].isState(MBS_DOWN)) {
int startx = _mouseButton[Shared::BUTTON_LEFT]._downPoint.x;
int starty = _mouseButton[Shared::BUTTON_LEFT]._downPoint.y;
if (_mouseButton[BUTTON_LEFT].isState(MBS_DOWN)) {
int startx = _mouseButton[BUTTON_LEFT]._downPoint.x;
int starty = _mouseButton[BUTTON_LEFT]._downPoint.y;
if (ABS(startx - mx) > 2 ||
ABS(starty - my) > 2) {
startDragging(startx, starty);
@ -417,7 +417,7 @@ void Mouse::startDragging(int startx, int starty) {
// pause the kernel
Kernel::get_instance()->pause();
_mouseButton[Shared::BUTTON_LEFT].setState(MBS_HANDLED);
_mouseButton[BUTTON_LEFT].setState(MBS_HANDLED);
if (_dragging == DRAG_INVALID) {
setMouseCursor(MOUSE_CROSS);
@ -518,7 +518,7 @@ void Mouse::stopDragging(int mx, int my) {
}
void Mouse::handleDelayedEvents() {
for (int button = 0; button < Shared::MOUSE_LAST; ++button) {
for (int button = 0; button < MOUSE_LAST; ++button) {
if (!(_mouseButton[button]._state & (MBS_HANDLED | MBS_DOWN)) &&
!_mouseButton[button].lastWithinDblClkTimeout()) {
Gump *gump = getGump(_mouseButton[button]._downGump);

View File

@ -24,7 +24,6 @@
#include "common/system.h"
#include "common/rect.h"
#include "ultima/shared/engine/events.h"
#include "ultima/ultima8/misc/common_types.h"
#include "ultima/ultima8/misc/direction.h"
@ -81,6 +80,14 @@ class Gump;
class Mouse {
public:
enum MouseButton {
BUTTON_NONE = 0,
BUTTON_LEFT = 1,
BUTTON_RIGHT = 2,
BUTTON_MIDDLE = 3,
MOUSE_LAST
};
enum MouseCursor {
MOUSE_NORMAL = 0,
MOUSE_NONE = 1,
@ -109,7 +116,7 @@ private:
uint32 _flashingCursorTime;
// mouse input state
MButton _mouseButton[Shared::MOUSE_LAST];
MButton _mouseButton[MOUSE_LAST];
uint16 _mouseOverGump;
Common::Point _mousePos;
@ -134,12 +141,12 @@ public:
/**
* Called when a mouse button is pressed down
*/
bool buttonDown(Shared::MouseButton button);
bool buttonDown(MouseButton button);
/**
* Called when a mouse ubtton is released
*/
bool buttonUp(Shared::MouseButton button);
bool buttonUp(MouseButton button);
//! get mouse cursor length. 0 = short, 1 = medium, 2 = long
int getMouseLength(int mx, int my) const;
@ -174,7 +181,7 @@ public:
//! set current mouse cursor location
void setMouseCoords(int mx, int my);
bool isMouseDownEvent(Shared::MouseButton button) const;
bool isMouseDownEvent(MouseButton button) const;
//! remove all existing cursors
void popAllCursors();

View File

@ -97,6 +97,8 @@
//#define PAINT_TIMING 1
#define GAME_FRAME_TIME 50
namespace Ultima {
namespace Ultima8 {
@ -138,7 +140,6 @@ Ultima8Engine::Ultima8Engine(OSystem *syst, const Ultima::UltimaGameDescription
}
Ultima8Engine::~Ultima8Engine() {
FORGET_OBJECT(_events);
FORGET_OBJECT(_kernel);
FORGET_OBJECT(_objectManager);
FORGET_OBJECT(_audioMixer);
@ -176,9 +177,6 @@ bool Ultima8Engine::initialize() {
if (!Shared::UltimaEngine::initialize())
return false;
// Set up the events manager
_events = new Shared::EventsManager(this);
return true;
}
@ -574,7 +572,7 @@ Common::Error Ultima8Engine::runGame() {
}
// get & handle all events in queue
while (_isRunning && _events->pollEvent(event)) {
while (_isRunning && pollEvent(event)) {
handleEvent(event);
}
handleDelayedEvents();
@ -781,11 +779,11 @@ void Ultima8Engine::handleEvent(const Common::Event &event) {
case Common::EVENT_LBUTTONDOWN:
case Common::EVENT_MBUTTONDOWN:
case Common::EVENT_RBUTTONDOWN: {
Shared::MouseButton button = Shared::BUTTON_LEFT;
Mouse::MouseButton button = Mouse::BUTTON_LEFT;
if (event.type == Common::EVENT_RBUTTONDOWN)
button = Shared::BUTTON_RIGHT;
button = Mouse::BUTTON_RIGHT;
else if (event.type == Common::EVENT_MBUTTONDOWN)
button = Shared::BUTTON_MIDDLE;
button = Mouse::BUTTON_MIDDLE;
_mouse->setMouseCoords(event.mouse.x, event.mouse.y);
_mouse->buttonDown(button);
@ -795,11 +793,11 @@ void Ultima8Engine::handleEvent(const Common::Event &event) {
case Common::EVENT_LBUTTONUP:
case Common::EVENT_MBUTTONUP:
case Common::EVENT_RBUTTONUP: {
Shared::MouseButton button = Shared::BUTTON_LEFT;
Mouse::MouseButton button = Mouse::BUTTON_LEFT;
if (event.type == Common::EVENT_RBUTTONUP)
button = Shared::BUTTON_RIGHT;
button = Mouse::BUTTON_RIGHT;
else if (event.type == Common::EVENT_MBUTTONUP)
button = Shared::BUTTON_MIDDLE;
button = Mouse::BUTTON_MIDDLE;
_mouse->setMouseCoords(event.mouse.x, event.mouse.y);
_mouse->buttonUp(button);
@ -1662,7 +1660,24 @@ void Ultima8Engine::showSplashScreen() {
scr->update();
// Handle a single event to get the splash screen shown
Common::Event event;
_events->pollEvent(event);
pollEvent(event);
}
bool Ultima8Engine::pollEvent(Common::Event &event) {
uint32 timer = g_system->getMillis();
if (timer >= (_priorFrameCounterTime + GAME_FRAME_TIME)) {
// Time to build up next game frame
_priorFrameCounterTime = timer;
// Render anything pending for the screen
Graphics::Screen *screen = getScreen();
if (screen)
screen->update();
}
// Event handling
return g_system->getEventManager()->pollEvent(event);
}
} // End of namespace Ultima8

View File

@ -23,7 +23,9 @@
#ifndef ULTIMA8_ULTIMA8
#define ULTIMA8_ULTIMA8
#include "common/events.h"
#include "common/stream.h"
#include "graphics/screen.h"
#include "ultima/shared/std/containers.h"
#include "ultima/shared/engine/ultima.h"
#include "ultima/ultima8/usecode/intrinsics.h"
@ -104,6 +106,7 @@ private:
// Timing stuff
int32 _lerpFactor; //!< Interpolation factor for this frame (0-256)
bool _inBetweenFrame; //!< Set true if we are doing an inbetween frame
uint32 _priorFrameCounterTime;
bool _highRes; //!< Set to true to enable larger screen size
bool _frameSkip; //!< Set to true to enable frame skipping (default false)
@ -165,6 +168,7 @@ private:
//! \return true if detected all the fields, false if detection failed
bool getGameInfo(const istring &game, GameInfo *gameinfo);
bool pollEvent(Common::Event &event);
protected:
// Engine APIs
Common::Error run() override;
@ -206,7 +210,7 @@ public:
return _screen;
}
Graphics::Screen *getScreen() const override;
Graphics::Screen *getScreen() const;
Common::Error runGame();
virtual void handleEvent(const Common::Event &event);

View File

@ -41,7 +41,7 @@ AvatarGravityProcess::AvatarGravityProcess(MainActor *avatar, int gravity)
}
void AvatarGravityProcess::run() {
if (!Mouse::get_instance()->isMouseDownEvent(Shared::BUTTON_RIGHT)) {
if (!Mouse::get_instance()->isMouseDownEvent(Mouse::BUTTON_RIGHT)) {
// right mouse button not down, so fall normally
GravityProcess::run();

View File

@ -182,11 +182,11 @@ void AvatarMoverProcess::onMouseDown(int button, int32 mx, int32 my) {
int bid = 0;
switch (button) {
case Shared::BUTTON_LEFT: {
case Mouse::BUTTON_LEFT: {
bid = 0;
break;
}
case Shared::BUTTON_RIGHT: {
case Mouse::BUTTON_RIGHT: {
bid = 1;
break;
}
@ -204,9 +204,9 @@ void AvatarMoverProcess::onMouseDown(int button, int32 mx, int32 my) {
void AvatarMoverProcess::onMouseUp(int button) {
int bid = 0;
if (button == Shared::BUTTON_LEFT) {
if (button == Mouse::BUTTON_LEFT) {
bid = 0;
} else if (button == Shared::BUTTON_RIGHT) {
} else if (button == Mouse::BUTTON_RIGHT) {
bid = 1;
} else {
CANT_HAPPEN_MSG("invalid MouseUp passed to AvatarMoverProcess");