From a33a9ae2e85c7999e9234538a3979d61ca431626 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Mon, 29 Dec 2014 07:22:51 +0100 Subject: ACCESS: Split a bit more Player class, add some MM specific code --- engines/access/access.cpp | 1 + engines/access/access.h | 1 + engines/access/amazon/amazon_player.cpp | 2 +- engines/access/martian/martian_player.cpp | 62 ++++++++++++++++++++++++ engines/access/martian/martian_player.h | 48 +++++++++++++++++++ engines/access/martian/martian_resources.cpp | 5 ++ engines/access/martian/martian_resources.h | 5 ++ engines/access/martian/martian_room.cpp | 70 ++++++++++------------------ engines/access/martian/martian_room.h | 2 - engines/access/module.mk | 1 + engines/access/player.cpp | 35 +++++++++++--- engines/access/player.h | 18 ++++--- 12 files changed, 186 insertions(+), 64 deletions(-) create mode 100644 engines/access/martian/martian_player.cpp create mode 100644 engines/access/martian/martian_player.h (limited to 'engines/access') diff --git a/engines/access/access.cpp b/engines/access/access.cpp index 6ad1b22408..14aa68c9dc 100644 --- a/engines/access/access.cpp +++ b/engines/access/access.cpp @@ -51,6 +51,7 @@ AccessEngine::AccessEngine(OSystem *syst, const AccessGameDescription *gameDesc) _destIn = nullptr; _current = nullptr; _mouseMode = 0; + _playerDataCount = 0; _currentMan = 0; _currentManOld = -1; _converseMode = 0; diff --git a/engines/access/access.h b/engines/access/access.h index a082b969c4..8801c1b04f 100644 --- a/engines/access/access.h +++ b/engines/access/access.h @@ -173,6 +173,7 @@ public: ImageEntryList _images; int _mouseMode; + int _playerDataCount; int _currentManOld; int _converseMode; int _startAboutBox; diff --git a/engines/access/amazon/amazon_player.cpp b/engines/access/amazon/amazon_player.cpp index b1ed501fce..2f32db1a9b 100644 --- a/engines/access/amazon/amazon_player.cpp +++ b/engines/access/amazon/amazon_player.cpp @@ -48,7 +48,7 @@ void AmazonPlayer::load() { _downDelta = -2; _scrollConst = 2; - for (int i = 0; i < PLAYER_DATA_COUNT; ++i) { + for (int i = 0; i < _vm->_playerDataCount; ++i) { _walkOffRight[i] = OVEROFFR[i]; _walkOffLeft[i] = OVEROFFL[i]; _walkOffUp[i] = OVEROFFU[i]; diff --git a/engines/access/martian/martian_player.cpp b/engines/access/martian/martian_player.cpp new file mode 100644 index 0000000000..493776e411 --- /dev/null +++ b/engines/access/martian/martian_player.cpp @@ -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 "common/scummsys.h" +#include "access/access.h" +#include "access/room.h" +#include "access/martian/martian_game.h" +#include "access/martian/martian_player.h" +#include "access/martian/martian_resources.h" + +namespace Access { + +namespace Martian { + +MartianPlayer::MartianPlayer(AccessEngine *vm) : Player(vm) { + _game = (MartianEngine *)vm; +} + +void MartianPlayer::load() { + Player::load(); + + // Overwrite game-specific values + _playerOffset.x = _vm->_screen->_scaleTable1[20]; + _playerOffset.y = _vm->_screen->_scaleTable1[52]; + _leftDelta = -9; + _rightDelta = 33; + _upDelta = 5; + _downDelta = -5; + _scrollConst = 5; + + _sideWalkMin = 0; + _sideWalkMax = 7; + _upWalkMin = 8; + _upWalkMax = 14; + _downWalkMin = 15; + _downWalkMax = 23; + + warning("TODO: Copy texPal into manPal"); +} + +} // End of namespace Martian + +} // End of namespace Access diff --git a/engines/access/martian/martian_player.h b/engines/access/martian/martian_player.h new file mode 100644 index 0000000000..192f2540cc --- /dev/null +++ b/engines/access/martian/martian_player.h @@ -0,0 +1,48 @@ +/* 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 ACCESS_MARTIAN_PLAYER_H +#define ACCESS_MARTIAN_PLAYER_H + +#include "common/scummsys.h" +#include "access/player.h" + +namespace Access { + +namespace Martian { + +class MartianEngine; + +class MartianPlayer : public Player { +private: + MartianEngine *_game; +public: + MartianPlayer(AccessEngine *vm); + + virtual void load(); +}; + +} // End of namespace Martian + +} // End of namespace Access + +#endif /* ACCESS_MARTIAN_PLAYER_H */ diff --git a/engines/access/martian/martian_resources.cpp b/engines/access/martian/martian_resources.cpp index 9f98824de8..78d14b7c86 100644 --- a/engines/access/martian/martian_resources.cpp +++ b/engines/access/martian/martian_resources.cpp @@ -719,6 +719,11 @@ const int COMBO_TABLE[54][4] = { { -1, -1, -1, -1 } }; +const int SIDEOFFR[] = { 4, 0, 7, 10, 3, 1, 2, 13, 0, 0, 0, 0 }; +const int SIDEOFFL[] = { 11, 6, 1, 4, 10, 6, 1, 4, 0, 0, 0, 0 }; +const int SIDEOFFU[] = { 1, 2, 0, 2, 2, 1, 1, 0, 0, 0, 0, 0 }; +const int SIDEOFFD[] = { 2, 0, 1, 1, 0, 1, 1, 1, 2, 0, 0, 0 }; + } // End of namespace Martian } // End of namespace Access diff --git a/engines/access/martian/martian_resources.h b/engines/access/martian/martian_resources.h index ce8b62801c..36b4ce3d37 100644 --- a/engines/access/martian/martian_resources.h +++ b/engines/access/martian/martian_resources.h @@ -45,6 +45,11 @@ extern const byte *const CHARTBL_MM[]; extern const int COMBO_TABLE[54][4]; +extern const int SIDEOFFR[]; +extern const int SIDEOFFL[]; +extern const int SIDEOFFU[]; +extern const int SIDEOFFD[]; + } // End of namespace Martian } // End of namespace Access diff --git a/engines/access/martian/martian_room.cpp b/engines/access/martian/martian_room.cpp index e9d1b9d8cf..972aada5d6 100644 --- a/engines/access/martian/martian_room.cpp +++ b/engines/access/martian/martian_room.cpp @@ -43,72 +43,52 @@ void MartianRoom::loadRoom(int roomNumber) { } void MartianRoom::reloadRoom() { - loadRoom(_vm->_player->_roomNumber); - - if (_roomFlag != 1) { - _vm->_currentMan = _roomFlag; - _vm->_currentManOld = _roomFlag; - _vm->_manScaleOff = 0; - - switch (_vm->_currentMan) { - case 0: - _vm->_player->loadSprites("MAN.LZ"); - break; + warning("TODO: Load TEXPAL.COL"); +// _vm->_currentMan = _roomFlag; +// _vm->_currentManOld = _roomFlag; +// _vm->_manScaleOff = 0; - case 2: - _vm->_player->loadSprites("JMAN.LZ"); - break; + _vm->_player->loadSprites("TEX.LZ"); + warning("TODO: Load TEXPAL.COL"); - case 3: - _vm->_player->loadSprites("OVERHEAD.LZ"); - _vm->_manScaleOff = 1; - break; - - default: - break; - } - } + loadRoom(_vm->_player->_roomNumber); reloadRoom1(); } void MartianRoom::reloadRoom1() { - if (_vm->_player->_roomNumber == 29 || _vm->_player->_roomNumber == 31 - || _vm->_player->_roomNumber == 42 || _vm->_player->_roomNumber == 44) { - //Resource *spriteData = _vm->_files->loadFile("MAYA.LZ"); - //_vm->_inactive._spritesPtr = new SpriteResource(_vm, spriteData); - //delete spriteData; - _vm->_currentCharFlag = false; - } - _selectCommand = -1; - _vm->_events->setNormalCursor(CURSOR_CROSSHAIRS); - _vm->_mouseMode = 0; - _vm->_boxSelect = true; + +// CHECKME: Useful? +// _vm->_events->setNormalCursor(CURSOR_CROSSHAIRS); +// _vm->_mouseMode = 0; +// _vm->_boxSelect = true; + _vm->_player->_playerOff = false; - _vm->_screen->fadeOut(); + _vm->_screen->forceFadeOut(); + _vm->_events->hideCursor(); _vm->_screen->clearScreen(); + _vm->_events->showCursor(); roomSet(); + _vm->_player->load(); - // TODO: Refactor + if (_vm->_player->_roomNumber != 47) + _vm->_player->calcManScale(); + _vm->_events->hideCursor(); + roomMenu(); _vm->_screen->setBufferScan(); setupRoom(); setWallCodes(); buildScreen(); - - if (!_vm->_screen->_vesaMode) { - _vm->copyBF2Vid(); - } else if (_vm->_player->_roomNumber != 20 && _vm->_player->_roomNumber != 24 - && _vm->_player->_roomNumber != 33) { - _vm->_screen->setPalette(); - _vm->copyBF2Vid(); - } - + _vm->copyBF2Vid(); + warning("TODO: setManPalette"); + _vm->_events->showCursor(); _vm->_player->_frame = 0; _vm->_oldRects.clear(); _vm->_newRects.clear(); + _vm->_events->clearEvents(); } void MartianRoom::roomSet() { diff --git a/engines/access/martian/martian_room.h b/engines/access/martian/martian_room.h index 85529ce8f0..cb2a8c2229 100644 --- a/engines/access/martian/martian_room.h +++ b/engines/access/martian/martian_room.h @@ -52,8 +52,6 @@ public: virtual ~MartianRoom(); - virtual void loadRoomData(const byte *roomData) { warning("TODO - loadRoomData"); } - virtual void init4Quads() { } virtual void roomMenu(); diff --git a/engines/access/module.mk b/engines/access/module.mk index b6961aeca9..f7cf7f2261 100644 --- a/engines/access/module.mk +++ b/engines/access/module.mk @@ -28,6 +28,7 @@ MODULE_OBJS := \ amazon/amazon_room.o \ amazon/amazon_scripts.o \ martian/martian_game.o \ + martian/martian_player.o \ martian/martian_resources.o \ martian/martian_room.o \ martian/martian_scripts.o diff --git a/engines/access/player.cpp b/engines/access/player.cpp index d547aedc1d..1fe58c6a1c 100644 --- a/engines/access/player.cpp +++ b/engines/access/player.cpp @@ -26,24 +26,25 @@ #include "access/access.h" #include "access/resources.h" #include "access/amazon/amazon_player.h" +#include "access/martian/martian_player.h" namespace Access { Player *Player::init(AccessEngine *vm) { switch (vm->getGameID()) { case GType_Amazon: + vm->_playerDataCount = 8; return new Amazon::AmazonPlayer(vm); + case GType_MartianMemorandum: + vm->_playerDataCount = 10; + return new Martian::MartianPlayer(vm); default: + vm->_playerDataCount = 8; return new Player(vm); } } Player::Player(AccessEngine *vm) : Manager(vm), ImageEntry() { - Common::fill(&_walkOffRight[0], &_walkOffRight[PLAYER_DATA_COUNT], 0); - Common::fill(&_walkOffLeft[0], &_walkOffLeft[PLAYER_DATA_COUNT], 0); - Common::fill(&_walkOffUp[0], &_walkOffUp[PLAYER_DATA_COUNT], 0); - Common::fill(&_walkOffDown[0], &_walkOffDown[PLAYER_DATA_COUNT], 0); - _playerSprites = nullptr; _playerSprites1 = nullptr; _manPal1 = nullptr; @@ -73,14 +74,36 @@ Player::Player(AccessEngine *vm) : Manager(vm), ImageEntry() { _playerDirection = NONE; _xFlag = _yFlag = 0; _inactiveYOff = 0; + _walkOffRight = _walkOffLeft = nullptr; + _walkOffUp = _walkOffDown = nullptr; + _walkOffUR = _walkOffDR = nullptr; + _walkOffUL = _walkOffDL = nullptr; } Player::~Player() { delete _playerSprites; delete[] _manPal1; + delete[] _walkOffRight; + delete[] _walkOffLeft; + delete[] _walkOffUp; + delete[] _walkOffDown; + delete[] _walkOffUR; + delete[] _walkOffDR; + delete[] _walkOffUL; + delete[] _walkOffDL; } void Player::load() { + int dataCount = _vm->_playerDataCount; + _walkOffRight = new int[dataCount]; + _walkOffLeft = new int[dataCount]; + _walkOffUp = new int[dataCount]; + _walkOffDown = new int[dataCount]; + _walkOffUR = new Common::Point[dataCount]; + _walkOffDR = new Common::Point[dataCount]; + _walkOffUL = new Common::Point[dataCount]; + _walkOffDL = new Common::Point[dataCount]; + _playerOffset.x = _vm->_screen->_scaleTable1[25]; _playerOffset.y = _vm->_screen->_scaleTable1[67]; _leftDelta = -3; @@ -89,7 +112,7 @@ void Player::load() { _downDelta = -10; _scrollConst = 5; - for (int i = 0; i < PLAYER_DATA_COUNT; ++i) { + for (int i = 0; i < dataCount; ++i) { _walkOffRight[i] = SIDEOFFR[i]; _walkOffLeft[i] = SIDEOFFL[i]; _walkOffUp[i] = SIDEOFFU[i]; diff --git a/engines/access/player.h b/engines/access/player.h index 26caec681f..1b33ae63ec 100644 --- a/engines/access/player.h +++ b/engines/access/player.h @@ -31,8 +31,6 @@ namespace Access { -#define PLAYER_DATA_COUNT 8 - enum Direction { NONE = 0, UP = 1, @@ -85,14 +83,14 @@ public: SpriteResource *_playerSprites; // Fields in original Player structure byte *_monData; - int _walkOffRight[PLAYER_DATA_COUNT]; - int _walkOffLeft[PLAYER_DATA_COUNT]; - int _walkOffUp[PLAYER_DATA_COUNT]; - int _walkOffDown[PLAYER_DATA_COUNT]; - Common::Point _walkOffUR[PLAYER_DATA_COUNT]; - Common::Point _walkOffDR[PLAYER_DATA_COUNT]; - Common::Point _walkOffUL[PLAYER_DATA_COUNT]; - Common::Point _walkOffDL[PLAYER_DATA_COUNT]; + int *_walkOffRight; + int *_walkOffLeft; + int *_walkOffUp; + int *_walkOffDown; + Common::Point *_walkOffUR; + Common::Point *_walkOffDR; + Common::Point *_walkOffUL; + Common::Point *_walkOffDL; byte _rawTempL; int _rawXTemp; byte _rawYTempL; -- cgit v1.2.3