mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-21 01:08:25 +00:00
XEEN: Simplified SpriteResource class, char faces loading in main engine
This commit is contained in:
parent
21d981f8e8
commit
e1404f127d
@ -41,7 +41,7 @@ private:
|
||||
uint32 _gameCounter;
|
||||
uint32 _priorGameCounterTime;
|
||||
Common::KeyCode _keyCode;
|
||||
FramesResource _sprites;
|
||||
SpriteResource _sprites;
|
||||
|
||||
void nextFrame();
|
||||
public:
|
||||
|
@ -29,26 +29,46 @@
|
||||
|
||||
namespace Xeen {
|
||||
|
||||
GraphicResource::GraphicResource(const Common::String &filename) {
|
||||
SpriteResource::SpriteResource() {
|
||||
_filesize = 0;
|
||||
_data = nullptr;
|
||||
}
|
||||
|
||||
SpriteResource::SpriteResource(const Common::String &filename) {
|
||||
_data = nullptr;
|
||||
load(filename);
|
||||
}
|
||||
|
||||
void SpriteResource::load(const Common::String &filename) {
|
||||
// Open the resource
|
||||
File f(filename);
|
||||
|
||||
// Read in a copy of the file
|
||||
_filesize = f.size();
|
||||
delete[] _data;
|
||||
_data = new byte[_filesize];
|
||||
f.seek(0);
|
||||
f.read(_data, _filesize);
|
||||
|
||||
// Read in the index
|
||||
f.seek(0);
|
||||
int count = f.readUint16LE();
|
||||
_index.resize(count);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
_index[i]._offset1 = f.readUint16LE();
|
||||
_index[i]._offset2 = f.readUint16LE();
|
||||
}
|
||||
}
|
||||
|
||||
GraphicResource::~GraphicResource() {
|
||||
SpriteResource::~SpriteResource() {
|
||||
delete[] _data;
|
||||
}
|
||||
|
||||
int GraphicResource::size() const {
|
||||
return READ_LE_UINT16(_data);
|
||||
int SpriteResource::size() const {
|
||||
return _index.size();
|
||||
}
|
||||
|
||||
void GraphicResource::drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const {
|
||||
void SpriteResource::drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const {
|
||||
// Get cell header
|
||||
Common::MemoryReadStream f(_data, _filesize);
|
||||
f.seek(offset);
|
||||
@ -151,43 +171,6 @@ void GraphicResource::drawOffset(XSurface &dest, uint16 offset, const Common::Po
|
||||
destPos.x + xOffset + width, destPos.y + yOffset + height));
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
|
||||
FramesResource::FramesResource(const Common::String &filename) :
|
||||
GraphicResource(filename) {
|
||||
// Read in the index
|
||||
Common::MemoryReadStream f(_data, _filesize);
|
||||
int count = f.readUint16LE();
|
||||
_index.resize(count);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
_index[i] = f.readUint32LE();
|
||||
}
|
||||
}
|
||||
|
||||
void FramesResource::draw(XSurface &dest, int frame, const Common::Point &destPos) const {
|
||||
drawOffset(dest, _index[frame], destPos);
|
||||
}
|
||||
|
||||
void FramesResource::draw(XSurface &dest, int frame) const {
|
||||
draw(dest, frame, Common::Point());
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
|
||||
SpriteResource::SpriteResource(const Common::String &filename) :
|
||||
GraphicResource(filename) {
|
||||
// Read in the index
|
||||
Common::MemoryReadStream f(_data, _filesize);
|
||||
int count = f.readUint16LE();
|
||||
_index.resize(count);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
_index[i]._offset1 = f.readUint16LE();
|
||||
_index[i]._offset2 = f.readUint16LE();
|
||||
}
|
||||
}
|
||||
|
||||
void SpriteResource::draw(XSurface &dest, int frame, const Common::Point &destPos) const {
|
||||
drawOffset(dest, _index[frame]._offset1, destPos);
|
||||
if (_index[frame]._offset2)
|
||||
|
@ -33,53 +33,29 @@ namespace Xeen {
|
||||
|
||||
class XeenEngine;
|
||||
|
||||
class GraphicResource {
|
||||
protected:
|
||||
int32 _filesize;
|
||||
byte *_data;
|
||||
|
||||
void drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const;
|
||||
public:
|
||||
GraphicResource(const Common::String &filename);
|
||||
|
||||
virtual ~GraphicResource();
|
||||
|
||||
int size() const;
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines a resource that Contains a list of singular sprite frames
|
||||
*/
|
||||
class FramesResource : public GraphicResource {
|
||||
private:
|
||||
Common::Array<uint32> _index;
|
||||
public:
|
||||
FramesResource(const Common::String &filename);
|
||||
virtual ~FramesResource() {}
|
||||
|
||||
void draw(XSurface &dest, int frame, const Common::Point &destPos) const;
|
||||
|
||||
void draw(XSurface &dest, int frame) const;
|
||||
};
|
||||
|
||||
/**
|
||||
* Defines a resource that contains sets of two layered sprites per frame
|
||||
*/
|
||||
class SpriteResource : public GraphicResource {
|
||||
class SpriteResource {
|
||||
private:
|
||||
struct IndexEntry {
|
||||
uint16 _offset1, _offset2;
|
||||
};
|
||||
Common::Array<IndexEntry> _index;
|
||||
int32 _filesize;
|
||||
byte *_data;
|
||||
|
||||
void drawOffset(XSurface &dest, uint16 offset, const Common::Point &destPos) const;
|
||||
public:
|
||||
SpriteResource();
|
||||
SpriteResource(const Common::String &filename);
|
||||
|
||||
virtual ~SpriteResource() {}
|
||||
virtual ~SpriteResource();
|
||||
|
||||
void load(const Common::String &filename);
|
||||
|
||||
void draw(XSurface &dest, int frame, const Common::Point &destPos) const;
|
||||
|
||||
void draw(XSurface &dest, int frame) const;
|
||||
|
||||
int size() const;
|
||||
};
|
||||
|
||||
} // End of namespace Xeen
|
||||
|
@ -42,7 +42,10 @@ XeenEngine::XeenEngine(OSystem *syst, const XeenGameDescription *gameDesc)
|
||||
_sound = nullptr;
|
||||
_eventData = nullptr;
|
||||
Common::fill(&_activeRoster[0], &_activeRoster[MAX_ACTIVE_PARTY], nullptr);
|
||||
Common::fill(&_partyFaces[0], &_partyFaces[MAX_ACTIVE_PARTY], nullptr);
|
||||
|
||||
_isEarlyGame = false;
|
||||
|
||||
}
|
||||
|
||||
XeenEngine::~XeenEngine() {
|
||||
@ -243,14 +246,14 @@ void XeenEngine::showMainMenu() {
|
||||
|
||||
void XeenEngine::playGame() {
|
||||
_saves->reset();
|
||||
drawUI();
|
||||
drawUI(true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Lots of stuff in this method.
|
||||
* TODO: Consider renaming method when better understood
|
||||
*/
|
||||
void XeenEngine::drawUI() {
|
||||
void XeenEngine::drawUI(bool soundPlayed) {
|
||||
SpriteResource sprites1("global.icn"), borderSprites("border.icn");
|
||||
|
||||
// Get mappings to the active characters in the party
|
||||
@ -260,6 +263,30 @@ void XeenEngine::drawUI() {
|
||||
}
|
||||
|
||||
_isEarlyGame = _party._minutes >= 300;
|
||||
|
||||
if (_party._mazeId == 0) {
|
||||
if (!soundPlayed) {
|
||||
warning("TODO: loadSound?");
|
||||
}
|
||||
|
||||
if (!_partyFaces[0]) {
|
||||
// Xeen only uses 24 of possible 30 character slots
|
||||
loadCharIcons(24);
|
||||
|
||||
for (int i = 0; i < _party._partyCount; ++i)
|
||||
_partyFaces[i] = &_charFaces[_party._partyMembers[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void XeenEngine::loadCharIcons(int numChars) {
|
||||
for (int i = 0; i < numChars; ++i) {
|
||||
// Load new character resource
|
||||
Common::String name = Common::String::format("char%02d.fac", i);
|
||||
_charFaces[i].load(name);
|
||||
}
|
||||
|
||||
_dseFace.load("dse.fac");
|
||||
}
|
||||
|
||||
} // End of namespace Xeen
|
||||
|
@ -81,12 +81,17 @@ private:
|
||||
Common::RandomSource _randomSource;
|
||||
int _loadSaveSlot;
|
||||
bool _isEarlyGame;
|
||||
SpriteResource _charFaces[TOTAL_CHARACTERS];
|
||||
SpriteResource *_partyFaces[MAX_ACTIVE_PARTY];
|
||||
SpriteResource _dseFace;
|
||||
|
||||
void showIntro();
|
||||
|
||||
void showMainMenu();
|
||||
|
||||
void drawUI();
|
||||
void drawUI(bool soundPlayed);
|
||||
|
||||
void loadCharIcons(int numChars);
|
||||
protected:
|
||||
/**
|
||||
* Play the game
|
||||
|
Loading…
Reference in New Issue
Block a user