DM: Add mouse input processing and display for movement arrows

This commit is contained in:
Bendegúz Nagy 2016-06-17 14:29:05 +02:00
parent bcfe176df5
commit 98c79f89bf
9 changed files with 158 additions and 14 deletions

View file

@ -15,6 +15,7 @@
#include "gfx.h" #include "gfx.h"
#include "dungeonman.h" #include "dungeonman.h"
#include "eventman.h" #include "eventman.h"
#include "menus.h"
namespace DM { namespace DM {
@ -52,6 +53,7 @@ DMEngine::~DMEngine() {
delete _displayMan; delete _displayMan;
delete _dungeonMan; delete _dungeonMan;
delete _eventMan; delete _eventMan;
delete _menuMan;
// clear debug channels // clear debug channels
DebugMan.clearAllDebugChannels(); DebugMan.clearAllDebugChannels();
@ -64,6 +66,7 @@ Common::Error DMEngine::run() {
_displayMan = new DisplayMan(this); _displayMan = new DisplayMan(this);
_dungeonMan = new DungeonMan(this); _dungeonMan = new DungeonMan(this);
_eventMan = new EventManager(this); _eventMan = new EventManager(this);
_menuMan = new MenuMan(this);
_displayMan->setUpScreens(320, 200); _displayMan->setUpScreens(320, 200);
@ -84,9 +87,16 @@ Common::Error DMEngine::run() {
while (true) { while (true) {
_eventMan->processInput(); _stopWaitingForPlayerInput = false;
//do {
_eventMan->processInput();
_eventMan->processCommandQueue();
//} while (!_stopWaitingForPlayerInput || !_gameTimeTicking);
_displayMan->clearScreen(kColorBlack); _displayMan->clearScreen(kColorBlack);
_displayMan->drawDungeon(_dungeonMan->_currMap.partyDir, _dungeonMan->_currMap.partyPosX, _dungeonMan->_currMap.partyPosY); _displayMan->drawDungeon(_dungeonMan->_currMap.partyDir, _dungeonMan->_currMap.partyPosX, _dungeonMan->_currMap.partyPosY);
// DUMMY CODE:
_menuMan->drawMovementArrows();
_displayMan->updateScreen(); _displayMan->updateScreen();
_system->delayMillis(10); _system->delayMillis(10);
} }
@ -99,6 +109,9 @@ Common::Error DMEngine::run() {
void DMEngine::startGame() { void DMEngine::startGame() {
_eventMan->_primaryMouseInput = gPrimaryMouseInput_Interface; _eventMan->_primaryMouseInput = gPrimaryMouseInput_Interface;
_eventMan->_secondaryMouseInput = gSecondaryMouseInput_Movement; _eventMan->_secondaryMouseInput = gSecondaryMouseInput_Movement;
_menuMan->drawMovementArrows();
_gameTimeTicking = true;
} }
} // End of namespace DM } // End of namespace DM

View file

@ -12,6 +12,7 @@ class Console;
class DisplayMan; class DisplayMan;
class DungeonMan; class DungeonMan;
class EventManager; class EventManager;
class MenuMan;
enum direction { enum direction {
@ -90,6 +91,9 @@ public:
DisplayMan *_displayMan; DisplayMan *_displayMan;
DungeonMan *_dungeonMan; DungeonMan *_dungeonMan;
EventManager *_eventMan; EventManager *_eventMan;
MenuMan *_menuMan;
bool _stopWaitingForPlayerInput; // G0321_B_StopWaitingForPlayerInput
bool _gameTimeTicking; // @ G0301_B_GameTimeTicking
}; };
class Console : public GUI::Debugger { class Console : public GUI::Debugger {

View file

@ -268,6 +268,7 @@ void EventManager::processInput() {
Common::Event event; Common::Event event;
while (_vm->_system->getEventManager()->pollEvent(event)) { while (_vm->_system->getEventManager()->pollEvent(event)) {
switch (event.type) { switch (event.type) {
// DUMMY CODE: EVENT_KEYDOWN, only for testing
case Common::EVENT_KEYDOWN: case Common::EVENT_KEYDOWN:
if (event.synthetic) if (event.synthetic)
break; break;
@ -303,11 +304,11 @@ void EventManager::processInput() {
case Common::EVENT_MOUSEMOVE: case Common::EVENT_MOUSEMOVE:
_mousePos = event.mouse; _mousePos = event.mouse;
break; break;
case Common::EVENT_LBUTTONUP: case Common::EVENT_LBUTTONDOWN:
case Common::EVENT_RBUTTONUP: case Common::EVENT_RBUTTONDOWN:
_pendingClickPresent = true; _pendingClickPresent = true;
_pendingClickPos = _mousePos; _pendingClickPos = _mousePos;
_pendingClickButton = (event.type == Common::EVENT_LBUTTONUP) ? kLeftMouseButton : kRightMouseButton; _pendingClickButton = (event.type == Common::EVENT_LBUTTONDOWN) ? kLeftMouseButton : kRightMouseButton;
break; break;
} }
} }
@ -347,4 +348,76 @@ CommandType EventManager::getCommandTypeFromMouseInput(MouseInput *input, Common
} }
void EventManager::processCommandQueue() {
_isCommandQueueLocked = true;
if (_commandQueue.empty()) {
_isCommandQueueLocked = false;
processPendingClick();
return;
}
Command cmd = _commandQueue.pop();
// MISSING CODE: for when movement is disabled
_isCommandQueueLocked = false;
processPendingClick();
if ((cmd.type == kCommandTurnRight) || (cmd.type == kCommandTurnLeft)) {
commandTurnParty(cmd.type);
return;
}
if ((cmd.type >= kCommandMoveForward) && (cmd.type <= kCommandMoveLeft)) {
commandMoveParty(cmd.type);
return;
}
// MISSING CODE: the rest of the function
}
void EventManager::commandTurnParty(CommandType cmdType) {
_vm->_stopWaitingForPlayerInput = true;
// MISSING CODE: highlight turn left/right buttons
// MISSING CODE: processing stairs
// MISSING CODE: process sensors
// DUMMY CODE: should call F0284_CHAMPION_SetPartyDirection instead
direction &partyDir = _vm->_dungeonMan->_currMap.partyDir;
(cmdType == kCommandTurnLeft) ? turnDirLeft(partyDir) : turnDirRight(partyDir);
// MISSING CODE: process sensors
}
void EventManager::commandMoveParty(CommandType cmdType) {
_vm->_stopWaitingForPlayerInput = true;
// MISSING CODE: Lots of code
// DUMMY CODE:
DungeonMan &dungeonMan = *_vm->_dungeonMan;
CurrMapData &currMap = dungeonMan._currMap;
switch (cmdType) {
case kCommandMoveForward:
dungeonMan.mapCoordsAfterRelMovement(dungeonMan._currMap.partyDir, 1, 0, currMap.partyPosX, currMap.partyPosY);
break;
case kCommandMoveLeft:
dungeonMan.mapCoordsAfterRelMovement(dungeonMan._currMap.partyDir, 0, -1, currMap.partyPosX, currMap.partyPosY);
break;
case kCommandMoveBackward:
dungeonMan.mapCoordsAfterRelMovement(dungeonMan._currMap.partyDir, -1, 0, currMap.partyPosX, currMap.partyPosY);
break;
case kCommandMoveRight:
dungeonMan.mapCoordsAfterRelMovement(dungeonMan._currMap.partyDir, 0, 1, currMap.partyPosX, currMap.partyPosY);
break;
}
// MISSING CODE: Lots of code
}
}; // end of namespace DM }; // end of namespace DM

View file

@ -131,7 +131,7 @@ public:
Common::Point pos; Common::Point pos;
CommandType type; CommandType type;
Command(Common::Point position, CommandType commandType): pos(position), type(type) {} Command(Common::Point position, CommandType commandType): pos(position), type(commandType) {}
}; // @ COMMAND }; // @ COMMAND
@ -189,8 +189,11 @@ class EventManager {
Common::Point _pendingClickPos; // @ G0437_i_PendingClickX, G0438_i_PendingClickY Common::Point _pendingClickPos; // @ G0437_i_PendingClickX, G0438_i_PendingClickY
MouseButton _pendingClickButton; // @ G0439_i_PendingClickButtonsStatus MouseButton _pendingClickButton; // @ G0439_i_PendingClickButtonsStatus
bool _isCommandQueueLocked; bool _isCommandQueueLocked; // this doesn't seem to be used anywhere at all
Common::Queue<Command> _commandQueue; Common::Queue<Command> _commandQueue;
void commandTurnParty(CommandType cmdType); // @ F0365_COMMAND_ProcessTypes1To2_TurnParty
void commandMoveParty(CommandType cmdType); // @ F0366_COMMAND_ProcessTypes3To6_MoveParty
public: public:
MouseInput* _primaryMouseInput;// @ G0441_ps_PrimaryMouseInput MouseInput* _primaryMouseInput;// @ G0441_ps_PrimaryMouseInput
MouseInput* _secondaryMouseInput;// @ G0442_ps_SecondaryMouseInput MouseInput* _secondaryMouseInput;// @ G0442_ps_SecondaryMouseInput
@ -200,10 +203,11 @@ public:
void showMouse(bool visibility); void showMouse(bool visibility);
void setMousePos(Common::Point pos); void setMousePos(Common::Point pos);
void processInput(); void processInput(); // acknowledges mouse and keyboard input
void processPendingClick(); // @ F0360_COMMAND_ProcessPendingClick void processPendingClick(); // @ F0360_COMMAND_ProcessPendingClick
void processClick(Common::Point mousePos, MouseButton button); // @ F0359_COMMAND_ProcessClick_CPSC void processClick(Common::Point mousePos, MouseButton button); // @ F0359_COMMAND_ProcessClick_CPSC
CommandType getCommandTypeFromMouseInput(MouseInput *input, Common::Point mousePos, MouseButton button); // @ F0358_COMMAND_GetCommandFromMouseInput_CPSC CommandType getCommandTypeFromMouseInput(MouseInput *input, Common::Point mousePos, MouseButton button); // @ F0358_COMMAND_GetCommandFromMouseInput_CPSC
void processCommandQueue(); // @ F0380_COMMAND_ProcessQueue_CPSC
}; };
} }

View file

@ -10,6 +10,8 @@
namespace DM { namespace DM {
Box gBoxMovementArrows = {224, 319, 124, 168};
enum ViewCell { enum ViewCell {
kViewCellFronLeft = 0, // @ C00_VIEW_CELL_FRONT_LEFT kViewCellFronLeft = 0, // @ C00_VIEW_CELL_FRONT_LEFT
kViewCellFrontRight = 1, // @ C01_VIEW_CELL_FRONT_RIGHT kViewCellFrontRight = 1, // @ C01_VIEW_CELL_FRONT_RIGHT
@ -548,11 +550,7 @@ CreatureReplColorSet gCreatureReplColorSets[13] = { // @ G0220_as_Graphic558_Cre
byte gPalChangesCreature_D3[16] = {0, 120, 10, 30, 40, 30, 0, 60, 30, 0, 0, 110, 0, 20, 0, 130}; // @ G0221_auc_Graphic558_PaletteChanges_Creature_D3 byte gPalChangesCreature_D3[16] = {0, 120, 10, 30, 40, 30, 0, 60, 30, 0, 0, 110, 0, 20, 0, 130}; // @ G0221_auc_Graphic558_PaletteChanges_Creature_D3
byte gPalChangesCreature_D2[16] = {0, 10, 20, 30, 40, 30, 60, 70, 50, 0, 0, 110, 120, 130, 140, 150}; // @ G0222_auc_Graphic558_PaletteChanges_Creature_D2 byte gPalChangesCreature_D2[16] = {0, 10, 20, 30, 40, 30, 60, 70, 50, 0, 0, 110, 120, 130, 140, 150}; // @ G0222_auc_Graphic558_PaletteChanges_Creature_D2
enum GraphicIndice {
kInscriptionFontIndice = 120, // @ C120_GRAPHIC_INSCRIPTION_FONT
kDoorMaskDestroyedIndice = 301, // @ C301_GRAPHIC_DOOR_MASK_DESTROYED
kChampionPortraitsIndice = 26 // @ C026_GRAPHIC_CHAMPION_PORTRAITS
};
Viewport gDefultViewPort = {0, 0}; Viewport gDefultViewPort = {0, 0};
@ -1505,3 +1503,7 @@ void DisplayMan::blitToBitmapShrinkWithPalChange(byte *srcBitmap, int16 srcWidth
} }
} }
byte* DisplayMan::getBitmap(uint16 index) {
return _bitmaps[index];
}

View file

@ -7,6 +7,14 @@
namespace DM { namespace DM {
enum GraphicIndice {
kInscriptionFontIndice = 120, // @ C120_GRAPHIC_INSCRIPTION_FONT
kDoorMaskDestroyedIndice = 301, // @ C301_GRAPHIC_DOOR_MASK_DESTROYED
kChampionPortraitsIndice = 26, // @ C026_GRAPHIC_CHAMPION_PORTRAITS
kMovementArrowsIndice = 13 // @ C013_GRAPHIC_MOVEMENT_ARROWS
};
extern uint16 gPalSwoosh[16]; extern uint16 gPalSwoosh[16];
extern uint16 gPalMousePointer[16]; extern uint16 gPalMousePointer[16];
extern uint16 gPalCredits[16]; extern uint16 gPalCredits[16];
@ -20,12 +28,14 @@ public:
uint16 Y1; uint16 Y1;
uint16 Y2; uint16 Y2;
Box(uint16 x1, uint16 x2, uint16 y1, uint16 y2): X1(x1), X2(x2), Y1(y1), Y2(y2) {} Box(uint16 x1, uint16 x2, uint16 y1, uint16 y2): X1(x1), X2(x2 + 1), Y1(y1), Y2(y2 + 1) {}
bool isPointInside(Common::Point point) { bool isPointInside(Common::Point point) {
return (X1 <= point.x) && (point.x < X2) && (Y1 <= point.y) && (point.y < Y2); return (X1 <= point.x) && (point.x < X2) && (Y1 <= point.y) && (point.y < Y2);
} }
}; // @ BOX_BYTE, BOX_WORD }; // @ BOX_BYTE, BOX_WORD
extern Box gBoxMovementArrows; // G0002_s_Graphic562_Box_MovementArrows
// The frames in the original sources contain inclusive boundaries and byte widths, not pixel widths // The frames in the original sources contain inclusive boundaries and byte widths, not pixel widths
struct Frame { struct Frame {
uint16 destFromX, destToX, destFromY, destToY; uint16 destFromX, destToX, destFromY, destToY;
@ -269,6 +279,7 @@ public:
void clearScreen(Color color); void clearScreen(Color color);
void drawDungeon(direction dir, int16 posX, int16 posY); // @ F0128_DUNGEONVIEW_Draw_CPSF void drawDungeon(direction dir, int16 posX, int16 posY); // @ F0128_DUNGEONVIEW_Draw_CPSF
void updateScreen(); void updateScreen();
byte* getBitmap(uint16 index);
int16 _championPortraitOrdinal; // @ G0289_i_DungeonView_ChampionPortraitOrdinal int16 _championPortraitOrdinal; // @ G0289_i_DungeonView_ChampionPortraitOrdinal
int16 _currMapAlcoveOrnIndices[kAlcoveOrnCount]; // @ G0267_ai_CurrentMapAlcoveOrnamentIndices int16 _currMapAlcoveOrnIndices[kAlcoveOrnCount]; // @ G0267_ai_CurrentMapAlcoveOrnamentIndices

18
engines/dm/menus.cpp Normal file
View file

@ -0,0 +1,18 @@
#include "menus.h"
#include "gfx.h"
namespace DM {
MenuMan::MenuMan(DMEngine *vm): _vm(vm) {}
void MenuMan::drawMovementArrows() {
DisplayMan &disp = *_vm->_displayMan;
byte *arrowsBitmap = disp.getBitmap(kMovementArrowsIndice);
Box &dest = gBoxMovementArrows;
uint16 w = disp.width(kMovementArrowsIndice);
disp.blitToScreen(arrowsBitmap, w, 0, 0, dest.X1, dest.X2, dest.Y1, dest.Y2, kColorNoTransparency);
}
}

18
engines/dm/menus.h Normal file
View file

@ -0,0 +1,18 @@
#ifndef DM_MENUS_H
#define DM_MENUS_H
#include "dm.h"
namespace DM {
class MenuMan {
DMEngine *_vm;
public:
MenuMan(DMEngine *vm);
void drawMovementArrows();
};
}
#endif // !DM_MENUS_H

View file

@ -5,7 +5,8 @@ MODULE_OBJS := \
dm.o \ dm.o \
gfx.o \ gfx.o \
dungeonman.o \ dungeonman.o \
eventman.o eventman.o \
menus.o
MODULE_DIRS += \ MODULE_DIRS += \
engines/dm engines/dm