mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 17:57:14 +00:00
Merge pull request #128 from fingolfin/dreamweb-segments
DREAMWEB: Refactor segment management
This commit is contained in:
commit
5b5a684c05
@ -250,6 +250,7 @@ generator = cpp(context, "DreamGen", blacklist = [
|
||||
'doblocks',
|
||||
'dochange',
|
||||
'dodoor',
|
||||
'dofade',
|
||||
'doload',
|
||||
'dolook',
|
||||
'domix',
|
||||
@ -772,7 +773,6 @@ generator = cpp(context, "DreamGen", blacklist = [
|
||||
'advisor' : 'advisor',
|
||||
'additionaltext' : 'additionalText',
|
||||
'othersmoker' : 'otherSmoker',
|
||||
'dofade' : 'doFade',
|
||||
'useelevator5' : 'useElevator5',
|
||||
'useelevator4' : 'useElevator4',
|
||||
'useelevator1' : 'useElevator1',
|
||||
|
@ -644,7 +644,7 @@ namespace %s {
|
||||
"""
|
||||
class %sContext : public DreamBase, public Context {
|
||||
public:
|
||||
DreamGenContext(DreamWeb::DreamWebEngine *en) : DreamBase(en), Context(data) {}
|
||||
DreamGenContext(DreamWeb::DreamWebEngine *en) : DreamBase(en), Context(this) {}
|
||||
|
||||
void __start();
|
||||
"""
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
#include "common/scummsys.h"
|
||||
|
||||
#include "dreamweb/runtime.h"
|
||||
#include "dreamweb/segment.h"
|
||||
|
||||
namespace DreamWeb {
|
||||
class DreamWebEngine;
|
||||
@ -43,21 +43,12 @@ namespace DreamGen {
|
||||
* together with class Context. When that happens, we can probably merge
|
||||
* DreamBase into DreamWebEngine.
|
||||
*/
|
||||
class DreamBase {
|
||||
class DreamBase : public SegmentManager {
|
||||
protected:
|
||||
DreamWeb::DreamWebEngine *engine;
|
||||
|
||||
public:
|
||||
enum { kDefaultDataSegment = 0x1000 };
|
||||
|
||||
SegmentPtr _realData; ///< the primary data segment, points to a huge blob of binary data
|
||||
SegmentRef data; ///< fake segment register always pointing to data segment
|
||||
|
||||
DreamBase(DreamWeb::DreamWebEngine *en) :
|
||||
engine(en),
|
||||
_realData(new Segment()),
|
||||
data(kDefaultDataSegment, _realData) {
|
||||
}
|
||||
DreamBase(DreamWeb::DreamWebEngine *en) : engine(en) { }
|
||||
|
||||
public:
|
||||
// from pathfind.cpp
|
||||
@ -66,6 +57,11 @@ public:
|
||||
|
||||
// from print.cpp
|
||||
uint8 getNextWord(const Frame *charSet, const uint8 *string, uint8 *totalWidth, uint8 *charCount);
|
||||
void printChar(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height);
|
||||
void printChar(const Frame* charSet, uint16 x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height);
|
||||
void printBoth(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar);
|
||||
uint8 printDirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered);
|
||||
uint8 printDirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered);
|
||||
uint8 getNumber(const Frame *charSet, const uint8 *string, uint16 maxWidth, bool centered, uint16 *offset);
|
||||
uint8 kernChars(uint8 firstChar, uint8 secondChar, uint8 width);
|
||||
|
||||
@ -82,11 +78,36 @@ public:
|
||||
void dumpPointer();
|
||||
void showRyanPage();
|
||||
|
||||
// from vgafades.cpp
|
||||
uint8 *mainPalette();
|
||||
uint8 *startPalette();
|
||||
uint8 *endPalette();
|
||||
void clearStartPal();
|
||||
void clearEndPal();
|
||||
void palToStartPal();
|
||||
void endPalToStart();
|
||||
void startPalToEnd();
|
||||
void palToEndPal();
|
||||
void doFade();
|
||||
void fadeCalculation();
|
||||
void fadeScreenUp();
|
||||
void fadeScreenUps();
|
||||
void fadeScreenUpHalf();
|
||||
void fadeScreenDown();
|
||||
void fadeScreenDowns();
|
||||
|
||||
// from vgagrafx.cpp
|
||||
uint8 _workspace[(0x1000 + 2) * 16];
|
||||
inline uint8 *workspace() { return _workspace; }
|
||||
void clearWork();
|
||||
|
||||
uint8 *mapStore();
|
||||
void panelToMap();
|
||||
void mapToPanel();
|
||||
void dumpMap();
|
||||
|
||||
void transferInv();
|
||||
|
||||
void multiGet(uint8 *dst, uint16 x, uint16 y, uint8 width, uint8 height);
|
||||
void multiPut(const uint8 *src, uint16 x, uint16 y, uint8 width, uint8 height);
|
||||
void multiDump(uint16 x, uint16 y, uint8 width, uint8 height);
|
||||
@ -98,9 +119,12 @@ public:
|
||||
void frameOutBh(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
|
||||
void frameOutFx(uint8 *dst, const uint8 *src, uint16 pitch, uint16 width, uint16 height, uint16 x, uint16 y);
|
||||
void doShake();
|
||||
void vSync();
|
||||
void setMode();
|
||||
void showPCX(const Common::String &name);
|
||||
void showFrame(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag, uint8 *width, uint8 *height);
|
||||
void showFrame(const Frame *frameData, uint16 x, uint16 y, uint16 frameNumber, uint8 effectsFlag);
|
||||
void loadPalFromIFF();
|
||||
void createPanel();
|
||||
void createPanel2();
|
||||
void showPanel();
|
||||
|
@ -1116,30 +1116,6 @@ void DreamGenContext::transferMap() {
|
||||
_add(data.word(kExframepos), cx);
|
||||
}
|
||||
|
||||
void DreamGenContext::doFade() {
|
||||
STACK_CHECK;
|
||||
_cmp(data.byte(kFadedirection), 0);
|
||||
if (flags.z())
|
||||
return /* (finishfade) */;
|
||||
cl = data.byte(kNumtofade);
|
||||
ch = 0;
|
||||
al = data.byte(kColourpos);
|
||||
ah = 0;
|
||||
ds = data.word(kBuffers);
|
||||
si = (0+(228*13)+32+60+(32*32)+(11*10*3));
|
||||
_add(si, ax);
|
||||
_add(si, ax);
|
||||
_add(si, ax);
|
||||
showGroup();
|
||||
al = data.byte(kNumtofade);
|
||||
_add(al, data.byte(kColourpos));
|
||||
data.byte(kColourpos) = al;
|
||||
_cmp(al, 0);
|
||||
if (!flags.z())
|
||||
return /* (finishfade) */;
|
||||
fadeCalculation();
|
||||
}
|
||||
|
||||
void DreamGenContext::fadeToWhite() {
|
||||
STACK_CHECK;
|
||||
es = data.word(kBuffers);
|
||||
|
@ -536,7 +536,7 @@ static const uint16 kLenofreelrouts = (983-526);
|
||||
|
||||
class DreamGenContext : public DreamBase, public Context {
|
||||
public:
|
||||
DreamGenContext(DreamWeb::DreamWebEngine *en) : DreamBase(en), Context(data) {}
|
||||
DreamGenContext(DreamWeb::DreamWebEngine *en) : DreamBase(en), Context(this) {}
|
||||
|
||||
void __start();
|
||||
#include "stubs.h" // Allow hand-reversed functions to have a signature different than void f()
|
||||
@ -665,7 +665,6 @@ public:
|
||||
void drawItAll();
|
||||
void useStereo();
|
||||
void showOpBox();
|
||||
void doFade();
|
||||
void dumpCurrent();
|
||||
void showDiaryKeys();
|
||||
void rollEndCredits2();
|
||||
|
@ -98,7 +98,7 @@ void DreamWebEngine::waitForVSync() {
|
||||
}
|
||||
|
||||
_base.doShake();
|
||||
_context.doFade();
|
||||
_base.doFade();
|
||||
_system->updateScreen();
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
namespace DreamGen {
|
||||
|
||||
void DreamGenContext::printBoth(const Frame *charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar) {
|
||||
void DreamBase::printBoth(const Frame *charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar) {
|
||||
uint16 newX = *x;
|
||||
uint8 width, height;
|
||||
printChar(charSet, &newX, y, c, nextChar, &width, &height);
|
||||
@ -57,7 +57,7 @@ uint8 DreamBase::getNextWord(const Frame *charSet, const uint8 *string, uint8 *t
|
||||
}
|
||||
}
|
||||
|
||||
void DreamGenContext::printChar(const Frame *charSet, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) {
|
||||
void DreamBase::printChar(const Frame *charSet, uint16* x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) {
|
||||
if (c == 255)
|
||||
return;
|
||||
|
||||
@ -75,7 +75,7 @@ void DreamGenContext::printChar(const Frame *charSet, uint16* x, uint16 y, uint8
|
||||
(*x) += *width;
|
||||
}
|
||||
|
||||
void DreamGenContext::printChar(const Frame *charSet, uint16 x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) {
|
||||
void DreamBase::printChar(const Frame *charSet, uint16 x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height) {
|
||||
printChar(charSet, &x, y, c, nextChar, width, height);
|
||||
}
|
||||
|
||||
@ -125,16 +125,16 @@ void DreamGenContext::printDirect() {
|
||||
uint16 initialSi = si;
|
||||
const uint8 *initialString = es.ptr(si, 0);
|
||||
const uint8 *string = initialString;
|
||||
al = printDirect(&string, di, &y, dl, (bool)(dl & 1));
|
||||
al = DreamBase::printDirect(&string, di, &y, dl, (bool)(dl & 1));
|
||||
si = initialSi + (string - initialString);
|
||||
bx = y;
|
||||
}
|
||||
|
||||
uint8 DreamGenContext::printDirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered) {
|
||||
uint8 DreamBase::printDirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered) {
|
||||
return printDirect(&string, x, &y, maxWidth, centered);
|
||||
}
|
||||
|
||||
uint8 DreamGenContext::printDirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered) {
|
||||
uint8 DreamBase::printDirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered) {
|
||||
data.word(kLastxpos) = x;
|
||||
const Frame *charSet = engine->currentCharset();
|
||||
while (true) {
|
||||
|
@ -20,16 +20,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DREAMGEN_RUNTIME_H__
|
||||
#define DREAMGEN_RUNTIME_H__
|
||||
#ifndef DREAMGEN_RUNTIME_H
|
||||
#define DREAMGEN_RUNTIME_H
|
||||
|
||||
#include <assert.h>
|
||||
#include "common/scummsys.h"
|
||||
#include "common/array.h"
|
||||
#include "common/debug.h"
|
||||
#include "common/hashmap.h"
|
||||
#include "common/list.h"
|
||||
#include "common/ptr.h"
|
||||
|
||||
#include "dreamweb/segment.h"
|
||||
|
||||
namespace DreamGen {
|
||||
|
||||
@ -78,134 +77,6 @@ struct RegisterPart {
|
||||
typedef RegisterPart<0> HighPartOfRegister;
|
||||
#endif
|
||||
|
||||
class WordRef {
|
||||
uint8 *_data;
|
||||
unsigned _index;
|
||||
uint16 _value;
|
||||
|
||||
public:
|
||||
inline WordRef(Common::Array<uint8> &data, unsigned index) : _data(data.begin() + index), _index(index) {
|
||||
assert(index + 1 < data.size());
|
||||
_value = _data[0] | (_data[1] << 8);
|
||||
}
|
||||
|
||||
inline WordRef& operator=(const WordRef &ref) {
|
||||
_value = ref._value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline WordRef& operator=(uint16 v) {
|
||||
_value = v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline operator uint16&() {
|
||||
return _value;
|
||||
}
|
||||
|
||||
inline ~WordRef() {
|
||||
_data[0] = _value & 0xff;
|
||||
_data[1] = _value >> 8;
|
||||
_value = _data[0] | (_data[1] << 8);
|
||||
}
|
||||
};
|
||||
|
||||
class Segment {
|
||||
Common::Array<uint8> data;
|
||||
|
||||
public:
|
||||
Segment(uint size = 0) {
|
||||
if (size > 0)
|
||||
data.resize(size);
|
||||
}
|
||||
|
||||
inline void assign(const uint8 *b, const uint8 *e) {
|
||||
data.assign(b, e);
|
||||
}
|
||||
|
||||
inline uint8 &byte(unsigned index) {
|
||||
assert(index < data.size());
|
||||
return data[index];
|
||||
}
|
||||
|
||||
inline WordRef word(unsigned index) {
|
||||
return WordRef(data, index);
|
||||
}
|
||||
|
||||
inline uint8 *ptr(unsigned index, unsigned size) {
|
||||
assert(index + size <= data.size());
|
||||
return data.begin() + index;
|
||||
}
|
||||
};
|
||||
|
||||
typedef Common::SharedPtr<Segment> SegmentPtr;
|
||||
|
||||
class Context;
|
||||
|
||||
class SegmentRef {
|
||||
uint16 _value;
|
||||
SegmentPtr _segment;
|
||||
|
||||
public:
|
||||
SegmentRef(uint16 value = 0, SegmentPtr segment = SegmentPtr())
|
||||
: _value(value), _segment(segment) {
|
||||
}
|
||||
|
||||
inline operator uint16() const {
|
||||
return _value;
|
||||
}
|
||||
|
||||
SegmentPtr getSegmentPtr() const {
|
||||
return _segment;
|
||||
}
|
||||
|
||||
inline uint8 &byte(unsigned index) {
|
||||
assert(_segment != 0);
|
||||
return _segment->byte(index);
|
||||
}
|
||||
|
||||
inline WordRef word(unsigned index) {
|
||||
//debug(1, "getting word ref for %04x:%d", _value, index);
|
||||
assert(_segment != 0);
|
||||
return _segment->word(index);
|
||||
}
|
||||
|
||||
inline void assign(const uint8 *b, const uint8 *e) {
|
||||
assert(_segment != 0);
|
||||
_segment->assign(b, e);
|
||||
}
|
||||
|
||||
inline uint8 *ptr(unsigned index, unsigned size) {
|
||||
assert(_segment != 0);
|
||||
return _segment->ptr(index, size);
|
||||
}
|
||||
|
||||
protected:
|
||||
SegmentRef &operator=(const SegmentRef &seg) {
|
||||
_value = seg._value;
|
||||
_segment = seg._segment;
|
||||
return *this;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class MutableSegmentRef : public SegmentRef {
|
||||
protected:
|
||||
Context *_context;
|
||||
|
||||
public:
|
||||
MutableSegmentRef(Context *ctx, uint16 value = 0, SegmentPtr segment = SegmentPtr())
|
||||
: _context(ctx), SegmentRef(value, segment) {
|
||||
}
|
||||
|
||||
MutableSegmentRef(Context *ctx, SegmentRef seg)
|
||||
: _context(ctx), SegmentRef(seg) {
|
||||
}
|
||||
|
||||
inline MutableSegmentRef& operator=(const uint16 id);
|
||||
|
||||
};
|
||||
|
||||
struct Flags {
|
||||
bool _z, _c, _s, _o;
|
||||
inline Flags(): _z(true), _c(false), _s(false), _o(false) {}
|
||||
@ -239,15 +110,7 @@ struct Flags {
|
||||
};
|
||||
|
||||
class Context {
|
||||
typedef Common::HashMap<uint16, SegmentPtr> SegmentMap;
|
||||
SegmentMap _segments;
|
||||
|
||||
typedef Common::List<uint16> FreeSegmentList;
|
||||
FreeSegmentList _freeSegments;
|
||||
|
||||
public:
|
||||
enum { kDefaultDataSegment = 0x1000 };
|
||||
|
||||
Register ax, dx, bx, cx, si, di;
|
||||
LowPartOfRegister al;
|
||||
HighPartOfRegister ah;
|
||||
@ -263,44 +126,11 @@ public:
|
||||
MutableSegmentRef es;
|
||||
Flags flags;
|
||||
|
||||
Context(SegmentRef data): al(ax), ah(ax), bl(bx), bh(bx), cl(cx), ch(cx), dl(dx), dh(dx),
|
||||
cs(data),
|
||||
ds(this, data),
|
||||
es(this, data) {
|
||||
Context(SegmentManager *segMan): al(ax), ah(ax), bl(bx), bh(bx), cl(cx), ch(cx), dl(dx), dh(dx),
|
||||
cs(segMan->data),
|
||||
ds(segMan, segMan->data),
|
||||
es(segMan, segMan->data) {
|
||||
|
||||
_segments[kDefaultDataSegment] = data.getSegmentPtr();
|
||||
}
|
||||
|
||||
SegmentRef getSegment(uint16 value) {
|
||||
SegmentMap::iterator i = _segments.find(value);
|
||||
if (i != _segments.end())
|
||||
return SegmentRef(value, i->_value);
|
||||
else
|
||||
return SegmentRef(value);
|
||||
}
|
||||
|
||||
SegmentRef allocateSegment(uint size) {
|
||||
unsigned id;
|
||||
if (_freeSegments.empty())
|
||||
id = kDefaultDataSegment + _segments.size();
|
||||
else {
|
||||
id = _freeSegments.front();
|
||||
_freeSegments.pop_front();
|
||||
}
|
||||
assert(!_segments.contains(id));
|
||||
SegmentPtr seg(new Segment(size));
|
||||
_segments[id] = seg;
|
||||
return SegmentRef(id, seg);
|
||||
}
|
||||
|
||||
void deallocateSegment(uint16 id) {
|
||||
SegmentMap::iterator i = _segments.find(id);
|
||||
if(i != _segments.end()) {
|
||||
_segments.erase(i);
|
||||
_freeSegments.push_back(id);
|
||||
} else {
|
||||
debug("Deallocating non existent segment! Client code should be fixed.");
|
||||
}
|
||||
}
|
||||
|
||||
inline void _cmp(uint8 a, uint8 b) {
|
||||
@ -574,11 +404,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
inline MutableSegmentRef& MutableSegmentRef::operator=(const uint16 id) {
|
||||
SegmentRef::operator=(_context->getSegment(id));
|
||||
return *this;
|
||||
}
|
||||
|
||||
class StackChecker {
|
||||
const Context &_context;
|
||||
const uint _stackDepth;
|
||||
@ -594,6 +419,6 @@ public:
|
||||
# define STACK_CHECK do {} while (0)
|
||||
#endif
|
||||
|
||||
} // End of namespace DreamWeb
|
||||
} // End of namespace DreamGen
|
||||
|
||||
#endif
|
||||
|
227
engines/dreamweb/segment.h
Normal file
227
engines/dreamweb/segment.h
Normal file
@ -0,0 +1,227 @@
|
||||
/* 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 DREAMGEN_SEGMENT_H
|
||||
#define DREAMGEN_SEGMENT_H
|
||||
|
||||
#include "common/array.h"
|
||||
#include "common/ptr.h"
|
||||
#include "common/hashmap.h"
|
||||
#include "common/list.h"
|
||||
|
||||
namespace DreamGen {
|
||||
|
||||
class WordRef {
|
||||
uint8 *_data;
|
||||
unsigned _index;
|
||||
uint16 _value;
|
||||
|
||||
public:
|
||||
inline WordRef(Common::Array<uint8> &data, unsigned index) : _data(data.begin() + index), _index(index) {
|
||||
assert(index + 1 < data.size());
|
||||
_value = _data[0] | (_data[1] << 8);
|
||||
}
|
||||
|
||||
inline WordRef& operator=(const WordRef &ref) {
|
||||
_value = ref._value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline WordRef& operator=(uint16 v) {
|
||||
_value = v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline operator uint16&() {
|
||||
return _value;
|
||||
}
|
||||
|
||||
inline ~WordRef() {
|
||||
_data[0] = _value & 0xff;
|
||||
_data[1] = _value >> 8;
|
||||
_value = _data[0] | (_data[1] << 8);
|
||||
}
|
||||
};
|
||||
|
||||
class Segment {
|
||||
Common::Array<uint8> data;
|
||||
|
||||
public:
|
||||
Segment(uint size = 0) {
|
||||
if (size > 0)
|
||||
data.resize(size);
|
||||
}
|
||||
|
||||
inline void assign(const uint8 *b, const uint8 *e) {
|
||||
data.assign(b, e);
|
||||
}
|
||||
|
||||
inline uint8 &byte(unsigned index) {
|
||||
assert(index < data.size());
|
||||
return data[index];
|
||||
}
|
||||
|
||||
inline WordRef word(unsigned index) {
|
||||
return WordRef(data, index);
|
||||
}
|
||||
|
||||
inline uint8 *ptr(unsigned index, unsigned size) {
|
||||
assert(index + size <= data.size());
|
||||
return data.begin() + index;
|
||||
}
|
||||
};
|
||||
|
||||
typedef Common::SharedPtr<Segment> SegmentPtr;
|
||||
|
||||
class SegmentRef {
|
||||
uint16 _value;
|
||||
SegmentPtr _segment;
|
||||
|
||||
public:
|
||||
SegmentRef(uint16 value = 0, SegmentPtr segment = SegmentPtr())
|
||||
: _value(value), _segment(segment) {
|
||||
}
|
||||
|
||||
inline operator uint16() const {
|
||||
return _value;
|
||||
}
|
||||
|
||||
SegmentPtr getSegmentPtr() const {
|
||||
return _segment;
|
||||
}
|
||||
|
||||
inline uint8 &byte(unsigned index) {
|
||||
assert(_segment != 0);
|
||||
return _segment->byte(index);
|
||||
}
|
||||
|
||||
inline WordRef word(unsigned index) {
|
||||
//debug(1, "getting word ref for %04x:%d", _value, index);
|
||||
assert(_segment != 0);
|
||||
return _segment->word(index);
|
||||
}
|
||||
|
||||
inline void assign(const uint8 *b, const uint8 *e) {
|
||||
assert(_segment != 0);
|
||||
_segment->assign(b, e);
|
||||
}
|
||||
|
||||
inline uint8 *ptr(unsigned index, unsigned size) {
|
||||
assert(_segment != 0);
|
||||
return _segment->ptr(index, size);
|
||||
}
|
||||
|
||||
protected:
|
||||
SegmentRef &operator=(const SegmentRef &seg) {
|
||||
_value = seg._value;
|
||||
_segment = seg._segment;
|
||||
return *this;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class SegmentManager;
|
||||
|
||||
class MutableSegmentRef : public SegmentRef {
|
||||
protected:
|
||||
SegmentManager *_segMan;
|
||||
|
||||
public:
|
||||
MutableSegmentRef(SegmentManager *segMan, uint16 value = 0, SegmentPtr segment = SegmentPtr())
|
||||
: _segMan(segMan), SegmentRef(value, segment) {
|
||||
}
|
||||
|
||||
MutableSegmentRef(SegmentManager *segMan, SegmentRef seg)
|
||||
: _segMan(segMan), SegmentRef(seg) {
|
||||
}
|
||||
|
||||
inline MutableSegmentRef& operator=(const uint16 id);
|
||||
|
||||
};
|
||||
|
||||
|
||||
class SegmentManager {
|
||||
private:
|
||||
typedef Common::HashMap<uint16, SegmentPtr> SegmentMap;
|
||||
SegmentMap _segments;
|
||||
|
||||
typedef Common::List<uint16> FreeSegmentList;
|
||||
FreeSegmentList _freeSegments;
|
||||
|
||||
enum { kDefaultDataSegment = 0x1000 };
|
||||
|
||||
public:
|
||||
|
||||
SegmentPtr _realData; ///< the primary data segment, points to a huge blob of binary data
|
||||
SegmentRef data; ///< fake segment register always pointing to data segment
|
||||
|
||||
public:
|
||||
SegmentManager() :
|
||||
_realData(new Segment()),
|
||||
data(kDefaultDataSegment, _realData) {
|
||||
|
||||
_segments[kDefaultDataSegment] = data.getSegmentPtr();
|
||||
}
|
||||
|
||||
SegmentRef getSegment(uint16 value) {
|
||||
SegmentMap::iterator i = _segments.find(value);
|
||||
if (i != _segments.end())
|
||||
return SegmentRef(value, i->_value);
|
||||
else
|
||||
return SegmentRef(value);
|
||||
}
|
||||
|
||||
SegmentRef allocateSegment(uint size) {
|
||||
unsigned id;
|
||||
if (_freeSegments.empty())
|
||||
id = kDefaultDataSegment + _segments.size();
|
||||
else {
|
||||
id = _freeSegments.front();
|
||||
_freeSegments.pop_front();
|
||||
}
|
||||
assert(!_segments.contains(id));
|
||||
SegmentPtr seg(new Segment(size));
|
||||
_segments[id] = seg;
|
||||
return SegmentRef(id, seg);
|
||||
}
|
||||
|
||||
void deallocateSegment(uint16 id) {
|
||||
SegmentMap::iterator i = _segments.find(id);
|
||||
if(i != _segments.end()) {
|
||||
_segments.erase(i);
|
||||
_freeSegments.push_back(id);
|
||||
} else {
|
||||
debug("Deallocating non existent segment! Client code should be fixed.");
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
inline MutableSegmentRef& MutableSegmentRef::operator=(const uint16 id) {
|
||||
SegmentRef::operator=(_segMan->getSegment(id));
|
||||
return *this;
|
||||
}
|
||||
|
||||
} // End of namespace DreamGen
|
||||
|
||||
#endif
|
@ -838,10 +838,6 @@ bool DreamGenContext::openForLoad(unsigned int slot) {
|
||||
return engine->openSaveFileForReading(filename);
|
||||
}
|
||||
|
||||
uint8 *DreamGenContext::mapStore() {
|
||||
return getSegment(data.word(kMapstore)).ptr(0, 0);
|
||||
}
|
||||
|
||||
void DreamGenContext::readMouse() {
|
||||
data.word(kOldbutton) = data.word(kMousebutton);
|
||||
uint16 state = readMouseState();
|
||||
|
@ -46,7 +46,6 @@
|
||||
void hangOnCurs(uint16 frameCount);
|
||||
void hangOnCurs();
|
||||
void workToScreen();
|
||||
uint8 *mapStore();
|
||||
void multiGet();
|
||||
void multiGet(uint8 *dst, uint16 x, uint16 y, uint8 width, uint8 height) {
|
||||
DreamBase::multiGet(dst, x, y, width, height);
|
||||
@ -67,12 +66,13 @@
|
||||
void seeCommandTail();
|
||||
void randomNumber();
|
||||
void quickQuit2();
|
||||
void printBoth(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar);
|
||||
void printChar(const Frame* charSet, uint16 *x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height);
|
||||
void printChar(const Frame* charSet, uint16 x, uint16 y, uint8 c, uint8 nextChar, uint8 *width, uint8 *height);
|
||||
void printDirect();
|
||||
uint8 printDirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered);
|
||||
uint8 printDirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered);
|
||||
uint8 printDirect(const uint8** string, uint16 x, uint16 *y, uint8 maxWidth, bool centered) {
|
||||
return DreamBase::printDirect(string, x, y, maxWidth, centered);
|
||||
}
|
||||
uint8 printDirect(const uint8* string, uint16 x, uint16 y, uint8 maxWidth, bool centered) {
|
||||
return DreamBase::printDirect(string, x, y, maxWidth, centered);
|
||||
}
|
||||
void printMessage(uint16 x, uint16 y, uint8 index, uint8 maxWidth, bool centered);
|
||||
void printMessage();
|
||||
void useTimedText();
|
||||
@ -84,7 +84,6 @@
|
||||
void dumpTextLine();
|
||||
void oldToNames();
|
||||
void namesToOld();
|
||||
void loadPalFromIFF();
|
||||
void startLoading(const Room &room);
|
||||
Sprite *spriteTable();
|
||||
void showFrame();
|
||||
@ -215,11 +214,7 @@
|
||||
void addToPeopleList();
|
||||
void addToPeopleList(ReelRoutine *routine);
|
||||
void getExPos();
|
||||
void panelToMap();
|
||||
void mapToPanel();
|
||||
void dumpMap();
|
||||
void obPicture();
|
||||
void transferInv();
|
||||
void obIcons();
|
||||
void compare();
|
||||
bool compare(uint8 index, uint8 flag, const char id[4]);
|
||||
@ -268,16 +263,6 @@
|
||||
void transferText();
|
||||
void initRain();
|
||||
Rain *splitIntoLines(uint8 x, uint8 y, Rain *rain);
|
||||
uint8 *mainPalette();
|
||||
uint8 *startPalette();
|
||||
uint8 *endPalette();
|
||||
void clearStartPal();
|
||||
void clearEndPal();
|
||||
void palToStartPal();
|
||||
void endPalToStart();
|
||||
void startPalToEnd();
|
||||
void palToEndPal();
|
||||
void fadeCalculation();
|
||||
void watchCount();
|
||||
void zoomIcon();
|
||||
void loadRoom();
|
||||
@ -494,20 +479,13 @@
|
||||
void readKey();
|
||||
void hangOne(uint16 delay);
|
||||
void hangOne();
|
||||
void showPCX(const Common::String &name);
|
||||
void bibleQuote();
|
||||
void realCredits();
|
||||
void runIntroSeq();
|
||||
void intro();
|
||||
void fadeScreenUp();
|
||||
void fadeScreenUps();
|
||||
void fadeScreenUpHalf();
|
||||
void fadeScreenDown();
|
||||
void fadeScreenDowns();
|
||||
void clearBeforeLoad();
|
||||
void clearReels();
|
||||
void getRidOfReels();
|
||||
void setMode();
|
||||
void liftNoise(uint8 index);
|
||||
void setTopLeft();
|
||||
void setTopRight();
|
||||
@ -574,7 +552,6 @@
|
||||
void dumpZoom();
|
||||
void fadeDOS();
|
||||
void selectLocation();
|
||||
void vSync();
|
||||
void showGroup();
|
||||
void loadSpeech();
|
||||
void closeFile();
|
||||
|
@ -24,43 +24,56 @@
|
||||
|
||||
namespace DreamGen {
|
||||
|
||||
uint8 *DreamGenContext::mainPalette() {
|
||||
uint8 *DreamBase::mainPalette() {
|
||||
return getSegment(data.word(kBuffers)).ptr(kMaingamepal, 256 * 3);
|
||||
}
|
||||
|
||||
uint8 *DreamGenContext::startPalette() {
|
||||
uint8 *DreamBase::startPalette() {
|
||||
return getSegment(data.word(kBuffers)).ptr(kStartpal, 256 * 3);
|
||||
}
|
||||
|
||||
uint8 *DreamGenContext::endPalette() {
|
||||
uint8 *DreamBase::endPalette() {
|
||||
return getSegment(data.word(kBuffers)).ptr(kEndpal, 256 * 3);
|
||||
}
|
||||
|
||||
void DreamGenContext::clearStartPal() {
|
||||
void DreamBase::clearStartPal() {
|
||||
memset(startPalette(), 0, 256 * 3);
|
||||
}
|
||||
|
||||
void DreamGenContext::clearEndPal() {
|
||||
void DreamBase::clearEndPal() {
|
||||
memset(endPalette(), 0, 256 * 3);
|
||||
}
|
||||
|
||||
void DreamGenContext::palToStartPal() {
|
||||
void DreamBase::palToStartPal() {
|
||||
memcpy(startPalette(), mainPalette(), 256 * 3);
|
||||
}
|
||||
|
||||
void DreamGenContext::endPalToStart() {
|
||||
void DreamBase::endPalToStart() {
|
||||
memcpy(startPalette(), endPalette(), 256 * 3);
|
||||
}
|
||||
|
||||
void DreamGenContext::startPalToEnd() {
|
||||
void DreamBase::startPalToEnd() {
|
||||
memcpy(endPalette(), startPalette(), 256 * 3);
|
||||
}
|
||||
|
||||
void DreamGenContext::palToEndPal() {
|
||||
void DreamBase::palToEndPal() {
|
||||
memcpy(endPalette(), mainPalette(), 256 * 3);
|
||||
}
|
||||
|
||||
void DreamGenContext::fadeCalculation() {
|
||||
void DreamBase::doFade() {
|
||||
if (data.byte(kFadedirection) == 0)
|
||||
return
|
||||
|
||||
engine->processEvents();
|
||||
uint8 *src = startPalette() + 3 * data.byte(kColourpos);
|
||||
engine->setPalette(src, data.byte(kColourpos), data.byte(kNumtofade));
|
||||
|
||||
data.byte(kColourpos) += data.byte(kNumtofade);
|
||||
if (data.byte(kColourpos) == 0)
|
||||
fadeCalculation();
|
||||
}
|
||||
|
||||
void DreamBase::fadeCalculation() {
|
||||
if (data.byte(kFadecount) == 0) {
|
||||
data.byte(kFadedirection) = 0;
|
||||
return;
|
||||
@ -68,7 +81,7 @@ void DreamGenContext::fadeCalculation() {
|
||||
|
||||
uint8 *startPal = startPalette();
|
||||
const uint8 *endPal = endPalette();
|
||||
for (size_t i = 0; i < 256 * 3; ++i, ++si, ++di) {
|
||||
for (size_t i = 0; i < 256 * 3; ++i) {
|
||||
uint8 s = startPal[i];
|
||||
uint8 e = endPal[i];
|
||||
if (s == e)
|
||||
@ -108,7 +121,7 @@ void DreamGenContext::fadeupMonFirst() {
|
||||
hangOn(64);
|
||||
}
|
||||
|
||||
void DreamGenContext::fadeScreenUp() {
|
||||
void DreamBase::fadeScreenUp() {
|
||||
clearStartPal();
|
||||
palToEndPal();
|
||||
data.byte(kFadedirection) = 1;
|
||||
@ -117,8 +130,7 @@ void DreamGenContext::fadeScreenUp() {
|
||||
data.byte(kNumtofade) = 128;
|
||||
}
|
||||
|
||||
|
||||
void DreamGenContext::fadeScreenUps() {
|
||||
void DreamBase::fadeScreenUps() {
|
||||
clearStartPal();
|
||||
palToEndPal();
|
||||
data.byte(kFadedirection) = 1;
|
||||
@ -127,7 +139,7 @@ void DreamGenContext::fadeScreenUps() {
|
||||
data.byte(kNumtofade) = 64;
|
||||
}
|
||||
|
||||
void DreamGenContext::fadeScreenUpHalf() {
|
||||
void DreamBase::fadeScreenUpHalf() {
|
||||
endPalToStart();
|
||||
palToEndPal();
|
||||
data.byte(kFadedirection) = 1;
|
||||
@ -136,7 +148,7 @@ void DreamGenContext::fadeScreenUpHalf() {
|
||||
data.byte(kNumtofade) = 32;
|
||||
}
|
||||
|
||||
void DreamGenContext::fadeScreenDown() {
|
||||
void DreamBase::fadeScreenDown() {
|
||||
palToStartPal();
|
||||
clearEndPal();
|
||||
data.byte(kFadedirection) = 1;
|
||||
@ -145,7 +157,7 @@ void DreamGenContext::fadeScreenDown() {
|
||||
data.byte(kNumtofade) = 128;
|
||||
}
|
||||
|
||||
void DreamGenContext::fadeScreenDowns() {
|
||||
void DreamBase::fadeScreenDowns() {
|
||||
palToStartPal();
|
||||
clearEndPal();
|
||||
data.byte(kFadedirection) = 1;
|
||||
|
@ -178,32 +178,16 @@ void DreamBase::doShake() {
|
||||
engine->setShakePos(offset >= 0 ? offset : -offset);
|
||||
}
|
||||
|
||||
void DreamGenContext::vSync() {
|
||||
push(ax);
|
||||
push(bx);
|
||||
push(cx);
|
||||
push(dx);
|
||||
push(si);
|
||||
push(di);
|
||||
push(es);
|
||||
push(ds);
|
||||
void DreamBase::vSync() {
|
||||
engine->waitForVSync();
|
||||
ds = pop();
|
||||
es = pop();
|
||||
di = pop();
|
||||
si = pop();
|
||||
dx = pop();
|
||||
cx = pop();
|
||||
bx = pop();
|
||||
ax = pop();
|
||||
}
|
||||
|
||||
void DreamGenContext::setMode() {
|
||||
void DreamBase::setMode() {
|
||||
vSync();
|
||||
initGraphics(320, 200, false);
|
||||
}
|
||||
|
||||
void DreamGenContext::showPCX(const Common::String &name) {
|
||||
void DreamBase::showPCX(const Common::String &name) {
|
||||
Common::File pcxFile;
|
||||
|
||||
if (!pcxFile.open(name)) {
|
||||
@ -415,19 +399,23 @@ void DreamGenContext::zoom() {
|
||||
data.byte(kDidzoom) = 1;
|
||||
}
|
||||
|
||||
void DreamGenContext::panelToMap() {
|
||||
uint8 *DreamBase::mapStore() {
|
||||
return getSegment(data.word(kMapstore)).ptr(0, 0);
|
||||
}
|
||||
|
||||
void DreamBase::panelToMap() {
|
||||
multiGet(mapStore(), data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
|
||||
}
|
||||
|
||||
void DreamGenContext::mapToPanel() {
|
||||
void DreamBase::mapToPanel() {
|
||||
multiPut(mapStore(), data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
|
||||
}
|
||||
|
||||
void DreamGenContext::dumpMap() {
|
||||
void DreamBase::dumpMap() {
|
||||
multiDump(data.word(kMapxstart) + data.word(kMapadx), data.word(kMapystart) + data.word(kMapady), data.byte(kMapxsize), data.byte(kMapysize));
|
||||
}
|
||||
|
||||
void DreamGenContext::transferInv() {
|
||||
void DreamBase::transferInv() {
|
||||
const Frame *freeFrames = (const Frame *)getSegment(data.word(kFreeframes)).ptr(kFrframedata, 0);
|
||||
const Frame *freeFrame = freeFrames + (3 * data.byte(kItemtotran) + 1);
|
||||
Frame *exFrames = (Frame *)getSegment(data.word(kExtras)).ptr(kExframedata, 0);
|
||||
@ -453,7 +441,7 @@ bool DreamGenContext::pixelCheckSet(const ObjPos *pos, uint8 x, uint8 y) {
|
||||
return *ptr != 0;
|
||||
}
|
||||
|
||||
void DreamGenContext::loadPalFromIFF() {
|
||||
void DreamBase::loadPalFromIFF() {
|
||||
engine->openFile("DREAMWEB.PAL");
|
||||
engine->readFromFile(mapStore(), 2000);
|
||||
engine->closeFile();
|
||||
|
Loading…
x
Reference in New Issue
Block a user