Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #700 from waltervn/adl-engine
ADL: New engine
- Loading branch information
Showing
10 changed files
with
2,729 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,247 @@ | ||
/* 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 ADL_ADL_H | ||
#define ADL_ADL_H | ||
|
||
#include "common/array.h" | ||
#include "common/rect.h" | ||
#include "common/str.h" | ||
|
||
#include "engines/engine.h" | ||
|
||
namespace Common { | ||
class ReadStream; | ||
class SeekableReadStream; | ||
} | ||
|
||
namespace Adl { | ||
|
||
class Display; | ||
struct AdlGameDescription; | ||
|
||
// Conditional opcodes | ||
#define IDO_CND_ITEM_IN_ROOM 0x03 | ||
#define IDO_CND_MOVES_GE 0x05 | ||
#define IDO_CND_VAR_EQ 0x06 | ||
#define IDO_CND_CUR_PIC_EQ 0x09 | ||
#define IDO_CND_ITEM_PIC_EQ 0x0a | ||
|
||
// Action opcodes | ||
#define IDO_ACT_VAR_ADD 0x01 | ||
#define IDO_ACT_VAR_SUB 0x02 | ||
#define IDO_ACT_VAR_SET 0x03 | ||
#define IDO_ACT_LIST_ITEMS 0x04 | ||
#define IDO_ACT_MOVE_ITEM 0x05 | ||
#define IDO_ACT_SET_ROOM 0x06 | ||
#define IDO_ACT_SET_CUR_PIC 0x07 | ||
#define IDO_ACT_SET_PIC 0x08 | ||
#define IDO_ACT_PRINT_MSG 0x09 | ||
#define IDO_ACT_SET_LIGHT 0x0a | ||
#define IDO_ACT_SET_DARK 0x0b | ||
#define IDO_ACT_QUIT 0x0d | ||
#define IDO_ACT_SAVE 0x0f | ||
#define IDO_ACT_LOAD 0x10 | ||
#define IDO_ACT_RESTART 0x11 | ||
#define IDO_ACT_PLACE_ITEM 0x12 | ||
#define IDO_ACT_SET_ITEM_PIC 0x13 | ||
#define IDO_ACT_RESET_PIC 0x14 | ||
#define IDO_ACT_GO_NORTH 0x15 | ||
#define IDO_ACT_GO_SOUTH 0x16 | ||
#define IDO_ACT_GO_EAST 0x17 | ||
#define IDO_ACT_GO_WEST 0x18 | ||
#define IDO_ACT_GO_UP 0x19 | ||
#define IDO_ACT_GO_DOWN 0x1a | ||
#define IDO_ACT_TAKE_ITEM 0x1b | ||
#define IDO_ACT_DROP_ITEM 0x1c | ||
#define IDO_ACT_SET_ROOM_PIC 0x1d | ||
|
||
#define IDI_WORD_SIZE 8 | ||
|
||
struct Room { | ||
byte description; | ||
byte connections[6]; | ||
byte picture; | ||
byte curPicture; | ||
}; | ||
|
||
struct Picture { | ||
byte block; | ||
uint16 offset; | ||
}; | ||
|
||
struct Command { | ||
byte room; | ||
byte verb, noun; | ||
byte numCond, numAct; | ||
Common::Array<byte> script; | ||
}; | ||
|
||
enum { | ||
IDI_ITEM_NOT_MOVED, | ||
IDI_ITEM_MOVED, | ||
IDI_ITEM_DOESNT_MOVE | ||
}; | ||
|
||
#define IDI_NONE 0xfe | ||
|
||
struct Item { | ||
byte noun; | ||
byte room; | ||
byte picture; | ||
bool isLineArt; | ||
Common::Point position; | ||
int state; | ||
byte description; | ||
Common::Array<byte> roomPictures; | ||
}; | ||
|
||
struct State { | ||
Common::Array<Room> rooms; | ||
Common::Array<Item> items; | ||
Common::Array<byte> vars; | ||
|
||
byte room; | ||
uint16 moves; | ||
bool isDark; | ||
|
||
State() : room(1), moves(0), isDark(false) { } | ||
}; | ||
|
||
typedef Common::List<Command> Commands; | ||
typedef Common::HashMap<Common::String, uint> WordMap; | ||
|
||
class AdlEngine : public Engine { | ||
public: | ||
virtual ~AdlEngine(); | ||
|
||
protected: | ||
AdlEngine(OSystem *syst, const AdlGameDescription *gd); | ||
|
||
Common::String readString(Common::ReadStream &stream, byte until = 0) const; | ||
Common::String readStringAt(Common::SeekableReadStream &stream, uint offset, byte until = 0) const; | ||
|
||
virtual void printMessage(uint idx, bool wait = true) const; | ||
void delay(uint32 ms) const; | ||
|
||
Common::String inputString(byte prompt = 0) const; | ||
byte inputKey() const; | ||
|
||
void loadWords(Common::ReadStream &stream, WordMap &map) const; | ||
void readCommands(Common::ReadStream &stream, Commands &commands); | ||
|
||
Display *_display; | ||
|
||
// Message strings in data file | ||
Common::Array<Common::String> _messages; | ||
// Picture data | ||
Common::Array<Picture> _pictures; | ||
// Dropped item screen offsets | ||
Common::Array<Common::Point> _itemOffsets; | ||
// Drawings consisting of horizontal and vertical lines only, but | ||
// supporting scaling and rotation | ||
Common::Array<Common::Array<byte> > _lineArt; | ||
// <room, verb, noun, script> lists | ||
Commands _roomCommands; | ||
Commands _globalCommands; | ||
|
||
WordMap _verbs; | ||
WordMap _nouns; | ||
|
||
struct { | ||
Common::String enterCommand; | ||
Common::String dontHaveIt; | ||
Common::String gettingDark; | ||
Common::String verbError; | ||
Common::String nounError; | ||
Common::String playAgain; | ||
} _strings; | ||
|
||
struct { | ||
uint cantGoThere; | ||
uint dontUnderstand; | ||
uint itemDoesntMove; | ||
uint itemNotHere; | ||
uint thanksForPlaying; | ||
} _messageIds; | ||
|
||
// Game state | ||
State _state; | ||
|
||
private: | ||
virtual void runIntro() const { } | ||
virtual void loadData() = 0; | ||
virtual void initState() = 0; | ||
virtual void restartGame() = 0; | ||
virtual void drawPic(byte pic, Common::Point pos = Common::Point()) const = 0; | ||
|
||
// Engine | ||
Common::Error run(); | ||
bool hasFeature(EngineFeature f) const; | ||
Common::Error loadGameState(int slot); | ||
bool canLoadGameStateCurrently(); | ||
Common::Error saveGameState(int slot, const Common::String &desc); | ||
bool canSaveGameStateCurrently(); | ||
|
||
// Text output | ||
void wordWrap(Common::String &str) const; | ||
|
||
// Text input | ||
byte convertKey(uint16 ascii) const; | ||
Common::String getLine() const; | ||
Common::String getWord(const Common::String &line, uint &index) const; | ||
void getInput(uint &verb, uint &noun); | ||
|
||
// Graphics | ||
void showRoom() const; | ||
void clearScreen() const; | ||
void drawItems() const; | ||
void drawNextPixel(Common::Point &p, byte color, byte bits, byte quadrant) const; | ||
void drawLineArt(const Common::Array<byte> &lineArt, const Common::Point &pos, byte rotation = 0, byte scaling = 1, byte color = 0x7f) const; | ||
|
||
// Game state functions | ||
const Room &getRoom(uint i) const; | ||
Room &getRoom(uint i); | ||
const Room &getCurRoom() const; | ||
Room &getCurRoom(); | ||
const Item &getItem(uint i) const; | ||
Item &getItem(uint i); | ||
byte getVar(uint i) const; | ||
void setVar(uint i, byte value); | ||
void takeItem(byte noun); | ||
void dropItem(byte noun); | ||
bool matchCommand(const Command &command, byte verb, byte noun, uint *actions = nullptr) const; | ||
void doActions(const Command &command, byte noun, byte offset); | ||
bool doOneCommand(const Commands &commands, byte verb, byte noun); | ||
void doAllCommands(const Commands &commands, byte verb, byte noun); | ||
|
||
const AdlGameDescription *_gameDescription; | ||
bool _isRestarting, _isRestoring; | ||
byte _saveVerb, _saveNoun, _restoreVerb, _restoreNoun; | ||
bool _canSaveNow, _canRestoreNow; | ||
}; | ||
|
||
AdlEngine *HiRes1Engine__create(OSystem *syst, const AdlGameDescription *gd); | ||
|
||
} // End of namespace Adl | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# This file is included from the main "configure" script | ||
# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps] | ||
add_engine adl "ADL" no |
Oops, something went wrong.