scummvm/engines/draci/game.h
Denis Kasak a2a71cb8fb * Added scaling support
* Made the dragon scale when it is in different parts of the room
* Added getters for relative coordinates (Animation::getRelativeX() and Animation::getRelativeY())
* Commented Game::loop() and Sprite::draw*() methods in more detail

svn-id: r42627
2009-07-20 17:25:57 +00:00

201 lines
4.0 KiB
C++

/* 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.
*
* $URL$
* $Id$
*
*/
#ifndef DRACI_GAME_H
#define DRACI_GAME_H
#include "common/str.h"
#include "draci/script.h"
#include "draci/animation.h"
#include "draci/sprite.h"
namespace Draci {
class DraciEngine;
enum {
kDragonObject
};
enum StructSizes {
personSize = sizeof(uint16) * 2 + sizeof(byte)
};
class WalkingMap {
public:
WalkingMap() {
_realWidth = 0;
_realHeight = 0;
_mapWidth = 0;
_mapHeight = 0;
_byteWidth = 0;
_data = NULL;
}
void load(byte *data, uint length) {
Common::MemoryReadStream mapReader(data, length);
_realWidth = mapReader.readUint16LE();
_realHeight = mapReader.readUint16LE();
_deltaX = mapReader.readUint16LE();
_deltaY = mapReader.readUint16LE();
_mapWidth = mapReader.readUint16LE();
_mapHeight = mapReader.readUint16LE();
_byteWidth = mapReader.readUint16LE();
// Set the data pointer to raw map data
_data = data + mapReader.pos();
}
bool isWalkable(int x, int y);
private:
int _realWidth, _realHeight;
int _deltaX, _deltaY;
int _mapWidth, _mapHeight;
int _byteWidth;
byte *_data;
};
struct GameObject {
GameObject() : _title(NULL) {}
uint _init, _look, _use, _canUse;
bool _imInit, _imLook, _imUse;
byte _walkDir;
byte _z;
uint16 _lookX, _lookY, _useX, _useY;
byte _lookDir, _useDir;
uint16 _absNum;
Common::Array<int> _anims;
GPL2Program _program;
byte *_title;
int _location;
bool _visible;
};
struct GameInfo {
byte _startRoom;
byte _mapRoom;
uint16 _numObjects;
uint16 _numIcons;
byte _numVariables;
byte _numPersons;
byte _numDialogs;
uint16 _maxIconWidth, _maxIconHeight;
uint16 _musicLength;
uint16 _crc[4];
uint16 _numDialogBlocks;
};
struct Person {
uint16 _x, _y;
byte _fontColour;
};
struct Room {
byte _roomNum;
byte _music;
WalkingMap _walkingMap;
byte _palette;
int _numOverlays;
int _init, _look, _use, _canUse;
bool _imInit, _imLook, _imUse;
bool _mouseOn, _heroOn;
double _pers0, _persStep;
byte _escRoom;
byte _numGates;
GPL2Program _program;
};
class Game {
// HACK: Remove this before committing; if anyone sees this, remind me :D
friend class Animation;
public:
Game(DraciEngine *vm);
~Game();
void init();
void loop();
void changeRoom(uint roomNum);
int getRoomNum();
// HACK: this is only for testing
int nextRoomNum() {
int n = _currentRoom._roomNum;
n = n < 37 ? n+1 : n;
// disable former distributor logo
if (n == 30)
++n;
return n;
}
// HACK: same as above
int prevRoomNum() {
int n = _currentRoom._roomNum;
n = n > 0 ? n-1 : n;
// disable former distributor logo
if (n == 30)
--n;
return n;
}
void loadRoom(int roomNum);
int loadAnimation(uint animNum, uint z);
void loadOverlays();
void loadObject(uint numObj);
GameObject *getObject(uint objNum);
int getVariable(int varNum);
void setVariable(int varNum, int value);
int getIconStatus(int iconID);
private:
DraciEngine *_vm;
int *_variables;
GameInfo _info;
Person *_persons;
uint *_dialogOffsets;
byte *_iconStatus;
GameObject *_objects;
Room _currentRoom;
};
} // End of namespace Draci
#endif // DRACI_GAME_H