Skip to content

Commit

Permalink
Merge pull request #700 from waltervn/adl-engine
Browse files Browse the repository at this point in the history
ADL: New engine
  • Loading branch information
sev- committed Mar 24, 2016
2 parents dfaf97d + ce3af91 commit f1b6542
Show file tree
Hide file tree
Showing 10 changed files with 2,729 additions and 0 deletions.
1,038 changes: 1,038 additions & 0 deletions engines/adl/adl.cpp

Large diffs are not rendered by default.

247 changes: 247 additions & 0 deletions engines/adl/adl.h
@@ -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
3 changes: 3 additions & 0 deletions engines/adl/configure.engine
@@ -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

0 comments on commit f1b6542

Please sign in to comment.