preliminary DOTT support
svn-id: r3433
This commit is contained in:
parent
862192dbeb
commit
794163c1a3
19 changed files with 6207 additions and 2811 deletions
2
Makefile
2
Makefile
|
@ -10,7 +10,7 @@ INCS = scumm.h scummsys.h stdafx.h
|
|||
|
||||
OBJS = actor.o boxes.o costume.o gfx.o object.o resource.o \
|
||||
saveload.o script.o scummvm.o sound.o string.o \
|
||||
sys.o verbs.o sdl.o
|
||||
sys.o verbs.o sdl.o script_v1.o script_v2.o
|
||||
|
||||
DISTFILES=actor.cpp boxes.cpp costume.cpp gfx.cpp object.cpp resource.cpp \
|
||||
saveload.cpp script.cpp scummvm.cpp sound.cpp string.cpp \
|
||||
|
|
56
actor.cpp
56
actor.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.5 2001/10/16 10:01:44 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.4 2001/10/10 17:18:33 strigeus
|
||||
* fixed swapped parameters in o_walkActorToActor
|
||||
*
|
||||
|
@ -38,26 +41,43 @@
|
|||
#include "scumm.h"
|
||||
|
||||
void Scumm::initActor(Actor *a, int mode) {
|
||||
if (mode) {
|
||||
a->facing = 2;
|
||||
if (mode==1) {
|
||||
a->costume = 0;
|
||||
a->room = 0;
|
||||
a->x = 0;
|
||||
a->y = 0;
|
||||
a->facing = 2;
|
||||
} else if (mode==2) {
|
||||
a->facing = 2;
|
||||
}
|
||||
|
||||
a->elevation = 0;
|
||||
a->width = 0x18;
|
||||
a->talkColor = 0xF;
|
||||
#if defined(DOTT)
|
||||
a->new_2 = 0;
|
||||
a->new_1 = -80;
|
||||
#endif
|
||||
a->scaley = a->scalex = 0xFF;
|
||||
a->charset = 0;
|
||||
a->sound = 0;
|
||||
a->sound[0] = 0;
|
||||
a->sound[1] = 0;
|
||||
a->sound[2] = 0;
|
||||
a->sound[3] = 0;
|
||||
a->sound[4] = 0;
|
||||
a->sound[5] = 0;
|
||||
a->sound[6] = 0;
|
||||
a->sound[7] = 0;
|
||||
a->newDirection = 0;
|
||||
a->moving = 0;
|
||||
|
||||
setActorWalkSpeed(a, 8, 2);
|
||||
|
||||
a->ignoreBoxes = 0;
|
||||
a->neverZClip = 0;
|
||||
#if defined(DOTT)
|
||||
a->new_3 = 0;
|
||||
#endif
|
||||
a->initFrame = 1;
|
||||
a->walkFrame = 2;
|
||||
a->standFrame = 3;
|
||||
|
@ -415,7 +435,7 @@ void Scumm::decodeCostData(Actor *a, int frame, uint usemask) {
|
|||
}
|
||||
|
||||
void Scumm::putActor(Actor *a, int x, int y, byte room) {
|
||||
if (a->visible && _currentRoom!=room && vm.vars[VAR_TALK_ACTOR]==a->number) {
|
||||
if (a->visible && _currentRoom!=room && _vars[VAR_TALK_ACTOR]==a->number) {
|
||||
clearMsgQueue();
|
||||
}
|
||||
|
||||
|
@ -425,7 +445,7 @@ void Scumm::putActor(Actor *a, int x, int y, byte room) {
|
|||
a->needRedraw = true;
|
||||
a->needBgReset = true;
|
||||
|
||||
if (vm.vars[VAR_UNK_ACTOR]==a->number) {
|
||||
if (_vars[VAR_UNK_ACTOR]==a->number) {
|
||||
dseg_3A76 = 1;
|
||||
}
|
||||
|
||||
|
@ -589,13 +609,13 @@ void Scumm::stopTalk() {
|
|||
_haveMsg = 0;
|
||||
_talkDelay = 0;
|
||||
|
||||
act = vm.vars[VAR_TALK_ACTOR];
|
||||
act = _vars[VAR_TALK_ACTOR];
|
||||
if (act && act<0x80) {
|
||||
Actor *a = derefActorSafe(act, "stopTalk");
|
||||
if (_currentRoom == a->room) {
|
||||
startAnimActor(a, a->talkFrame2, a->facing);
|
||||
}
|
||||
vm.vars[VAR_TALK_ACTOR] = 0xFF;
|
||||
_vars[VAR_TALK_ACTOR] = 0xFF;
|
||||
}
|
||||
_keepText = false;
|
||||
restoreCharsetBg();
|
||||
|
@ -616,6 +636,7 @@ void Scumm::walkActors() {
|
|||
}
|
||||
}
|
||||
|
||||
#if !defined(DOTT)
|
||||
void Scumm::playActorSounds() {
|
||||
int i;
|
||||
Actor *a;
|
||||
|
@ -624,7 +645,7 @@ void Scumm::playActorSounds() {
|
|||
a = derefActor(i);
|
||||
if (a->cost.animCounter2 && a->room==_currentRoom && a->sound) {
|
||||
_currentScript = 0xFF;
|
||||
addSoundToQueue(a->sound);
|
||||
addSoundToQueue(a->sound[0]);
|
||||
for (i=1; i<13; i++) {
|
||||
a = derefActor(i);
|
||||
a->cost.animCounter2 = 0;
|
||||
|
@ -633,6 +654,7 @@ void Scumm::playActorSounds() {
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void Scumm::walkActor(Actor *a) {
|
||||
int j;
|
||||
|
@ -741,9 +763,9 @@ void Scumm::processActors() {
|
|||
setupActorScale(a);
|
||||
setupCostumeRenderer(&cost, a);
|
||||
setActorCostPalette(a);
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
drawActorCostume(a);
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
actorAnimate(a);
|
||||
}
|
||||
} while (ac++,--cnt);
|
||||
|
@ -851,7 +873,7 @@ void Scumm::actorTalk() {
|
|||
if (_actorToPrintStrFor==0xFF) {
|
||||
if (!_keepText)
|
||||
stopTalk();
|
||||
vm.vars[VAR_TALK_ACTOR] = 0xFF;
|
||||
_vars[VAR_TALK_ACTOR] = 0xFF;
|
||||
oldact = 0;
|
||||
} else {
|
||||
a = derefActorSafe(_actorToPrintStrFor, "actorTalk");
|
||||
|
@ -860,24 +882,24 @@ void Scumm::actorTalk() {
|
|||
} else {
|
||||
if (!_keepText)
|
||||
stopTalk();
|
||||
vm.vars[VAR_TALK_ACTOR] = a->number;
|
||||
_vars[VAR_TALK_ACTOR] = a->number;
|
||||
startAnimActor(a,a->talkFrame1,a->facing);
|
||||
oldact = vm.vars[VAR_TALK_ACTOR];
|
||||
oldact = _vars[VAR_TALK_ACTOR];
|
||||
}
|
||||
}
|
||||
if (oldact>=0x80)
|
||||
return;
|
||||
|
||||
if (vm.vars[VAR_TALK_ACTOR]>0x7F) {
|
||||
_charsetColor = (byte)_stringColor[0];
|
||||
if (_vars[VAR_TALK_ACTOR]>0x7F) {
|
||||
_charsetColor = (byte)string[0].color;
|
||||
} else {
|
||||
a = derefActorSafe(vm.vars[VAR_TALK_ACTOR], "actorTalk(2)");
|
||||
a = derefActorSafe(_vars[VAR_TALK_ACTOR], "actorTalk(2)");
|
||||
_charsetColor = a->talkColor;
|
||||
}
|
||||
charset._bufPos = 0;
|
||||
_talkDelay = 0;
|
||||
_haveMsg = 0xFF;
|
||||
vm.vars[VAR_HAVE_MSG] = 0xFF;
|
||||
_vars[VAR_HAVE_MSG] = 0xFF;
|
||||
CHARSET_1();
|
||||
}
|
||||
|
||||
|
|
50
costume.cpp
50
costume.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.3 2001/10/16 10:01:45 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.2 2001/10/09 18:35:02 strigeus
|
||||
* fixed object parent bug
|
||||
* fixed some signed/unsigned comparisons
|
||||
|
@ -85,8 +88,9 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
|||
byte scaling;
|
||||
byte charsetmask, masking;
|
||||
byte unk19;
|
||||
int ex1,ex2;
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
_maskval = 0xF;
|
||||
_shrval = 4;
|
||||
|
@ -105,6 +109,19 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
|||
_ymove -= (int16)READ_LE_UINT16(_srcptr+10);
|
||||
_srcptr += 12;
|
||||
|
||||
#if defined(DOTT)
|
||||
switch(_ptr[7]&0x7F) {
|
||||
case 0x60: case 0x61:
|
||||
ex1 = _srcptr[0];
|
||||
ex2 = _srcptr[1];
|
||||
_srcptr += 2;
|
||||
if (ex1!=0xFF || ex2!=0xFF) {
|
||||
ex1=READ_LE_UINT16(_ptr + _numColors + 10 + ex1*2);
|
||||
_srcptr = _ptr + READ_LE_UINT16(_ptr + ex1 + ex2*2) + 14;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
_xpos = _actorX;
|
||||
_ypos = _actorY;
|
||||
|
||||
|
@ -200,10 +217,8 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
|||
_vscreenheight = _vm->virtscr[0].height;
|
||||
_vm->updateDirtyRect(0, _left, _right+1,_top,_bottom,1<<a->number);
|
||||
|
||||
if (_top >= (int)_vscreenheight || _bottom <= 0) {
|
||||
checkHeap();
|
||||
if (_top >= (int)_vscreenheight || _bottom <= 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
_ypitch = _height * 320;
|
||||
_docontinue = 0;
|
||||
|
@ -246,7 +261,10 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
|||
}
|
||||
}
|
||||
|
||||
if ((uint)_top > (uint)_vscreenheight || _top < 0)
|
||||
if (_width2==0)
|
||||
return 0;
|
||||
|
||||
if ((uint)_top > (uint)_vscreenheight)
|
||||
_top = 0;
|
||||
|
||||
if ((uint)_bottom > _vscreenheight)
|
||||
|
@ -259,7 +277,7 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
|||
a->bottom = _bottom;
|
||||
|
||||
if (_height2 + _top >= 256) {
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
@ -283,7 +301,7 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
|||
_mask_ptr_dest = _mask_ptr + _xpos / 8;
|
||||
}
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
switch ((scaling<<2)|(masking<<1)|charsetmask) {
|
||||
case 0:
|
||||
|
@ -306,7 +324,7 @@ byte CostumeRenderer::mainRoutine(Actor *a, int slot, int frame) {
|
|||
break;
|
||||
}
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
return b;
|
||||
}
|
||||
|
||||
|
@ -611,7 +629,12 @@ StartPos:;
|
|||
}
|
||||
|
||||
void CostumeRenderer::loadCostume(int id) {
|
||||
_ptr = _vm->getResourceAddress(3, id) + 2;
|
||||
_ptr = _vm->getResourceAddress(3, id)
|
||||
#if defined(DOTT)
|
||||
+ 8;
|
||||
#else
|
||||
+ 2;
|
||||
#endif
|
||||
switch(_ptr[7]&0x7F) {
|
||||
case 0x58:
|
||||
_numColors = 16;
|
||||
|
@ -619,6 +642,14 @@ void CostumeRenderer::loadCostume(int id) {
|
|||
case 0x59:
|
||||
_numColors = 32;
|
||||
break;
|
||||
#if defined(DOTT)
|
||||
case 0x60:
|
||||
_numColors = 16;
|
||||
break;
|
||||
case 0x61:
|
||||
_numColors = 32;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
error("Costume %d is invalid", id);
|
||||
}
|
||||
|
@ -649,6 +680,7 @@ byte CostumeRenderer::drawOneSlot(Actor *a, int slot) {
|
|||
byte CostumeRenderer::drawCostume(Actor *a) {
|
||||
int i;
|
||||
byte r = 0;
|
||||
|
||||
_xmove = _ymove = 0;
|
||||
for (i=0; i<16; i++)
|
||||
r|=drawOneSlot(a, i);
|
||||
|
|
314
gfx.cpp
314
gfx.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.4 2001/10/16 10:01:47 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.3 2001/10/10 12:52:21 strigeus
|
||||
* fixed bug in GDI_UnkDecode7()
|
||||
*
|
||||
|
@ -42,7 +45,7 @@ void Scumm::getGraphicsPerformance() {
|
|||
initScreens(0, 0, 320, 200);
|
||||
}
|
||||
|
||||
vm.vars[VAR_PERFORMANCE_1] = _scummTimer;
|
||||
_vars[VAR_PERFORMANCE_1] = _scummTimer;
|
||||
_scummTimer = 0;
|
||||
|
||||
for (i=10; i!=0; i--) {
|
||||
|
@ -50,7 +53,7 @@ void Scumm::getGraphicsPerformance() {
|
|||
unkVirtScreen2();
|
||||
}
|
||||
|
||||
vm.vars[VAR_PERFORMANCE_2] = _scummTimer;
|
||||
_vars[VAR_PERFORMANCE_2] = _scummTimer;
|
||||
|
||||
initScreens(0, 16, 320, 144);
|
||||
}
|
||||
|
@ -314,15 +317,15 @@ void Scumm::setCameraAt(int dest) {
|
|||
}
|
||||
cd->_destPos = dest;
|
||||
|
||||
t = vm.vars[VAR_CAMERA_MIN];
|
||||
t = _vars[VAR_CAMERA_MIN];
|
||||
if (cd->_curPos < t) cd->_curPos = t;
|
||||
|
||||
t = vm.vars[VAR_CAMERA_MAX];
|
||||
t = _vars[VAR_CAMERA_MAX];
|
||||
if (cd->_curPos > t) cd->_curPos = t;
|
||||
|
||||
if (vm.vars[VAR_SCROLL_SCRIPT]) {
|
||||
vm.vars[VAR_CAMERA_CUR_POS] = cd->_curPos;
|
||||
runScript(vm.vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
|
||||
if (_vars[VAR_SCROLL_SCRIPT]) {
|
||||
_vars[VAR_CAMERA_CUR_POS] = cd->_curPos;
|
||||
runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
|
||||
}
|
||||
|
||||
if (cd->_curPos != cd->_lastPos && charset._hasMask)
|
||||
|
@ -378,8 +381,7 @@ void Scumm::initBGBuffers() {
|
|||
_imgBufOffs[i] = i*itemsize;
|
||||
}
|
||||
|
||||
void Scumm::setPaletteFromRes() {
|
||||
byte *ptr = getResourceAddress(1, _roomResource) + _CLUT_offs;
|
||||
void Scumm::setPaletteFromPtr(byte *ptr) {
|
||||
uint32 size = READ_BE_UINT32_UNALIGNED(ptr+4);
|
||||
int i, r, g, b;
|
||||
byte *dest, *epal;
|
||||
|
@ -419,6 +421,12 @@ void Scumm::setPaletteFromRes() {
|
|||
setDirtyColors(0, numcolor-1);
|
||||
}
|
||||
|
||||
void Scumm::setPaletteFromRes() {
|
||||
byte *ptr;
|
||||
ptr = getResourceAddress(1, _roomResource) + _CLUT_offs;
|
||||
setPaletteFromPtr(ptr);
|
||||
}
|
||||
|
||||
|
||||
void Scumm::setDirtyColors(int min, int max) {
|
||||
if (_palDirtyMin > min)
|
||||
|
@ -465,9 +473,9 @@ void Scumm::cyclePalette() {
|
|||
if(_videoMode != 0x13)
|
||||
return;
|
||||
|
||||
valueToAdd = vm.vars[VAR_TIMER];
|
||||
if (valueToAdd < vm.vars[VAR_TIMER_NEXT])
|
||||
valueToAdd = vm.vars[VAR_TIMER_NEXT];
|
||||
valueToAdd = _vars[VAR_TIMER];
|
||||
if (valueToAdd < _vars[VAR_TIMER_NEXT])
|
||||
valueToAdd = _vars[VAR_TIMER_NEXT];
|
||||
|
||||
for (i=1; i<=16; i++) {
|
||||
if (_colorCycleDelays[i] &&
|
||||
|
@ -571,6 +579,8 @@ void Scumm::unkVirtScreen4(int a) {
|
|||
case 135:
|
||||
unkScreenEffect5(1);
|
||||
break;
|
||||
default:
|
||||
error("unkVirtScreen4: default case %d", a);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -615,7 +625,6 @@ const uint32 zplane_tags[] = {
|
|||
MKID('ZP03')
|
||||
};
|
||||
|
||||
|
||||
void Scumm::drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr) {
|
||||
byte *smap_ptr;
|
||||
int i;
|
||||
|
@ -626,14 +635,10 @@ void Scumm::drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr)
|
|||
int x;
|
||||
byte *where_draw_ptr;
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
smap_ptr = findResource(MKID('SMAP'), ptr);
|
||||
|
||||
if (objnr==209) {
|
||||
warning("tst");
|
||||
}
|
||||
|
||||
for(i=1; i<_numZBuffer; i++) {
|
||||
zplane_list[i] = findResource(zplane_tags[i], ptr);
|
||||
}
|
||||
|
@ -662,7 +667,7 @@ void Scumm::drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr)
|
|||
if (vs->fourlinesextra)
|
||||
x -= _screenStartStrip;
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
if (x >= 40)
|
||||
return;
|
||||
|
@ -683,11 +688,11 @@ void Scumm::drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr)
|
|||
where_draw_ptr = gdi.where_to_draw_ptr;
|
||||
decompressBitmap();
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
if (twobufs) {
|
||||
gdi.where_to_draw_ptr = where_draw_ptr;
|
||||
if (vm.vars[VAR_DRAWFLAGS]&2) {
|
||||
if (_vars[VAR_DRAWFLAGS]&2) {
|
||||
if (hasCharsetMask(x<<3, _drawBmpY, (x+1)<<3, t))
|
||||
draw8ColWithMasking();
|
||||
else {
|
||||
|
@ -700,7 +705,7 @@ void Scumm::drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr)
|
|||
clear8Col();
|
||||
}
|
||||
}
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
for (i=1; i<_numZBuffer; i++) {
|
||||
if (!zplane_list[i])
|
||||
|
@ -712,7 +717,7 @@ void Scumm::drawBmp(byte *ptr, int a, int b, int c, const char *str, int objnr)
|
|||
else
|
||||
decompressMaskImg();
|
||||
}
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
_drawBmpX++;
|
||||
a++;
|
||||
} while (--b);
|
||||
|
@ -728,6 +733,8 @@ void Scumm::decompressBitmap() {
|
|||
|
||||
byte code = *gdi.smap_ptr++;
|
||||
|
||||
assert(gdi.numLinesToProcess);
|
||||
|
||||
switch(code) {
|
||||
case 1:
|
||||
GDI_UnkDecode7();
|
||||
|
@ -770,12 +777,30 @@ void Scumm::decompressBitmap() {
|
|||
gdi.decomp_mask = decompress_table[code - 80];
|
||||
GDI_UnkDecode3();
|
||||
break;
|
||||
|
||||
#if defined(DOTT)
|
||||
case 104: case 105: case 106: case 107: case 108:
|
||||
gdi.decomp_shr = code - 100;
|
||||
gdi.decomp_mask = decompress_table[code - 100];
|
||||
GDI_UnkDecode1();
|
||||
break;
|
||||
|
||||
case 124: case 125: case 126: case 127: case 128:
|
||||
dseg_4E3B = 1;
|
||||
gdi.decomp_shr = code - 120;
|
||||
gdi.decomp_mask = decompress_table[code - 120];
|
||||
GDI_UnkDecode3();
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
error("decompressBitmap: default case %d", code);
|
||||
}
|
||||
}
|
||||
|
||||
int Scumm::hasCharsetMask(int x, int y, int x2, int y2) {
|
||||
if (!charset._hasMask || y > charset._mask_bottom || x > charset._mask_right ||
|
||||
y2 < charset._mask_top || x2 < charset._mask_left )
|
||||
if (!charset._hasMask || y > string[0].mask_bottom || x > string[0].mask_right ||
|
||||
y2 < string[0].mask_top || x2 < string[0].mask_left )
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
@ -928,6 +953,59 @@ void Scumm::redrawBGStrip(int start, int num) {
|
|||
#define READ_BIT (cl--,bit = bits&1, bits>>=1,bit)
|
||||
#define FILL_BITS if (cl <= 8) { bits |= (*src++ << cl); cl += 8;}
|
||||
|
||||
#if defined(DOTT)
|
||||
void Scumm::GDI_UnkDecode1() {
|
||||
byte *src = gdi.smap_ptr;
|
||||
byte *dst = gdi.where_to_draw_ptr;
|
||||
byte color = *src++;
|
||||
uint bits = *src++;
|
||||
byte cl = 8;
|
||||
byte bit;
|
||||
byte incm,reps;
|
||||
gdi.tempNumLines = gdi.numLinesToProcess;
|
||||
|
||||
do {
|
||||
gdi.currentX = 8;
|
||||
do {
|
||||
FILL_BITS
|
||||
*dst++=color;
|
||||
|
||||
againPos:;
|
||||
|
||||
if (!READ_BIT) {}
|
||||
else if (READ_BIT) {
|
||||
incm = (bits&7)-4;
|
||||
cl-=3;
|
||||
bits>>=3;
|
||||
if (!incm) {
|
||||
FILL_BITS
|
||||
reps = bits&0xFF;
|
||||
do {
|
||||
if (!--gdi.currentX) {
|
||||
gdi.currentX = 8;
|
||||
dst += 312;
|
||||
if (!--gdi.tempNumLines)
|
||||
return;
|
||||
}
|
||||
*dst++=color;
|
||||
} while (--reps);
|
||||
bits>>=8;
|
||||
bits |= (*src++)<<(cl-8);
|
||||
goto againPos;
|
||||
} else {
|
||||
color += incm;
|
||||
}
|
||||
} else {
|
||||
FILL_BITS
|
||||
color = bits&gdi.decomp_mask;
|
||||
cl -= gdi.decomp_shr;
|
||||
bits >>= gdi.decomp_shr;
|
||||
}
|
||||
} while (--gdi.currentX);
|
||||
dst += 312;
|
||||
} while (--gdi.tempNumLines);
|
||||
}
|
||||
#else
|
||||
void Scumm::GDI_UnkDecode1() {
|
||||
byte *src = gdi.smap_ptr;
|
||||
byte *dst = gdi.where_to_draw_ptr;
|
||||
|
@ -957,8 +1035,8 @@ void Scumm::GDI_UnkDecode1() {
|
|||
} while (--gdi.currentX);
|
||||
dst += 312;
|
||||
} while (--gdi.tempNumLines);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
void Scumm::GDI_UnkDecode2() {
|
||||
byte *src = gdi.smap_ptr;
|
||||
|
@ -996,6 +1074,74 @@ void Scumm::GDI_UnkDecode2() {
|
|||
} while (--gdi.tempNumLines);
|
||||
}
|
||||
|
||||
#if defined(DOTT)
|
||||
void Scumm::GDI_UnkDecode3() {
|
||||
byte *src = gdi.smap_ptr;
|
||||
byte *dst = gdi.where_to_draw_ptr;
|
||||
byte color = *src++;
|
||||
uint bits = *src++;
|
||||
byte cl = 8;
|
||||
byte bit;
|
||||
byte incm,reps;
|
||||
|
||||
gdi.tempNumLines = gdi.numLinesToProcess;
|
||||
|
||||
do {
|
||||
gdi.currentX = 8;
|
||||
do {
|
||||
FILL_BITS
|
||||
if (color!=gdi.transparency) *dst=color;
|
||||
dst++;
|
||||
|
||||
againPos:;
|
||||
if (!READ_BIT) {}
|
||||
else if (READ_BIT) {
|
||||
incm = (bits&7)-4;
|
||||
|
||||
cl-=3;
|
||||
bits>>=3;
|
||||
if (incm) {
|
||||
color += incm;
|
||||
} else {
|
||||
FILL_BITS
|
||||
reps = bits&0xFF;
|
||||
if (color==gdi.transparency) {
|
||||
do {
|
||||
if (!--gdi.currentX) {
|
||||
gdi.currentX = 8;
|
||||
dst += 312;
|
||||
if (!--gdi.tempNumLines)
|
||||
return;
|
||||
}
|
||||
dst++;
|
||||
} while (--reps);
|
||||
} else {
|
||||
do {
|
||||
if (!--gdi.currentX) {
|
||||
gdi.currentX = 8;
|
||||
dst += 312;
|
||||
if (!--gdi.tempNumLines)
|
||||
return;
|
||||
}
|
||||
*dst++=color;
|
||||
} while (--reps);
|
||||
}
|
||||
bits>>=8;
|
||||
bits |= (*src++)<<(cl-8);
|
||||
goto againPos;
|
||||
}
|
||||
} else {
|
||||
FILL_BITS
|
||||
color = bits&gdi.decomp_mask;
|
||||
cl -= gdi.decomp_shr;
|
||||
bits >>= gdi.decomp_shr;
|
||||
}
|
||||
} while (--gdi.currentX);
|
||||
dst += 312;
|
||||
} while (--gdi.tempNumLines);
|
||||
}
|
||||
|
||||
#else
|
||||
void Scumm::GDI_UnkDecode3() {
|
||||
byte *src = gdi.smap_ptr;
|
||||
byte *dst = gdi.where_to_draw_ptr;
|
||||
|
@ -1028,6 +1174,8 @@ void Scumm::GDI_UnkDecode3() {
|
|||
dst += 312;
|
||||
} while (--gdi.tempNumLines);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void Scumm::GDI_UnkDecode4() {
|
||||
byte *src = gdi.smap_ptr;
|
||||
|
@ -1154,13 +1302,18 @@ void Scumm::GDI_UnkDecode7() {
|
|||
|
||||
void Scumm::restoreCharsetBg() {
|
||||
dseg_4E3C = 0;
|
||||
if (charset._mask_left != -1) {
|
||||
restoreBG(charset._mask_left, charset._mask_top, charset._mask_right, charset._mask_bottom);
|
||||
if (string[0].mask_left != -1) {
|
||||
restoreBG(string[0].mask_left, string[0].mask_top, string[0].mask_right, string[0].mask_bottom);
|
||||
charset._hasMask = false;
|
||||
charset._mask_left = -1;
|
||||
string[0].mask_left = -1;
|
||||
#if defined(DOTT)
|
||||
charset._strLeft = -1;
|
||||
charset._left = -1;
|
||||
#endif
|
||||
}
|
||||
_stringXpos2[0] = _stringXPos[0];
|
||||
_stringYpos2[0] = _stringYPos[0];
|
||||
|
||||
string[0].xpos2 = string[0].xpos;
|
||||
string[0].ypos2 = string[0].ypos;
|
||||
}
|
||||
|
||||
void Scumm::restoreBG(int left, int top, int right, int bottom) {
|
||||
|
@ -1209,7 +1362,7 @@ void Scumm::restoreBG(int left, int top, int right, int bottom) {
|
|||
width = right - left;
|
||||
widthmod = (width >> 2) + 2;
|
||||
|
||||
if (vs->alloctwobuffers && _currentRoom!=0 && vm.vars[VAR_DRAWFLAGS]&2) {
|
||||
if (vs->alloctwobuffers && _currentRoom!=0 && _vars[VAR_DRAWFLAGS]&2) {
|
||||
blit(gdi.bg_ptr, gdi.where_to_draw_ptr, width, height);
|
||||
if (gdi.virtScreen==0 && charset._hasMask && height) {
|
||||
do {
|
||||
|
@ -1245,8 +1398,8 @@ void Scumm::updateDirtyRect(int virt, int left, int right, int top, int bottom,
|
|||
rp = (right >> 3) + _screenStartStrip;
|
||||
lp = (left >> 3) + _screenStartStrip;
|
||||
if (lp<0) lp=0;
|
||||
if (rp >= 160)
|
||||
rp = 159;
|
||||
if (rp >= 200)
|
||||
rp = 200;
|
||||
if (lp <= rp) {
|
||||
num = rp - lp + 1;
|
||||
sp = &actorDrawBits[lp];
|
||||
|
@ -1328,18 +1481,18 @@ void Scumm::moveCamera() {
|
|||
|
||||
cd->_curPos &= 0xFFF8;
|
||||
|
||||
if (cd->_curPos < vm.vars[VAR_CAMERA_MIN]) {
|
||||
if (vm.vars[VAR_CAMERA_FAST])
|
||||
cd->_curPos = vm.vars[VAR_CAMERA_MIN];
|
||||
if (cd->_curPos < _vars[VAR_CAMERA_MIN]) {
|
||||
if (_vars[VAR_CAMERA_FAST])
|
||||
cd->_curPos = _vars[VAR_CAMERA_MIN];
|
||||
else
|
||||
cd->_curPos += 8;
|
||||
cameraMoved();
|
||||
return;
|
||||
}
|
||||
|
||||
if (cd->_curPos > vm.vars[VAR_CAMERA_MAX]) {
|
||||
if (vm.vars[VAR_CAMERA_FAST])
|
||||
cd->_curPos = vm.vars[VAR_CAMERA_MAX];
|
||||
if (cd->_curPos > _vars[VAR_CAMERA_MAX]) {
|
||||
if (_vars[VAR_CAMERA_FAST])
|
||||
cd->_curPos = _vars[VAR_CAMERA_MAX];
|
||||
else
|
||||
cd->_curPos-=8;
|
||||
cameraMoved();
|
||||
|
@ -1353,7 +1506,7 @@ void Scumm::moveCamera() {
|
|||
t = (actorx>>3) - _screenStartStrip;
|
||||
|
||||
if (t < cd->_leftTrigger || t > cd->_rightTrigger) {
|
||||
if (vm.vars[VAR_CAMERA_FAST]) {
|
||||
if (_vars[VAR_CAMERA_FAST]) {
|
||||
if (t > 35)
|
||||
cd->_destPos = actorx + 80;
|
||||
if (t < 5)
|
||||
|
@ -1368,13 +1521,13 @@ void Scumm::moveCamera() {
|
|||
cd->_destPos = a->x;
|
||||
}
|
||||
|
||||
if (cd->_destPos < vm.vars[VAR_CAMERA_MIN])
|
||||
cd->_destPos = vm.vars[VAR_CAMERA_MIN];
|
||||
if (cd->_destPos < _vars[VAR_CAMERA_MIN])
|
||||
cd->_destPos = _vars[VAR_CAMERA_MIN];
|
||||
|
||||
if (cd->_destPos > vm.vars[VAR_CAMERA_MAX])
|
||||
cd->_destPos = vm.vars[VAR_CAMERA_MAX];
|
||||
if (cd->_destPos > _vars[VAR_CAMERA_MAX])
|
||||
cd->_destPos = _vars[VAR_CAMERA_MAX];
|
||||
|
||||
if (vm.vars[VAR_CAMERA_FAST]) {
|
||||
if (_vars[VAR_CAMERA_FAST]) {
|
||||
cd->_curPos = cd->_destPos;
|
||||
} else {
|
||||
if (cd->_curPos < cd->_destPos)
|
||||
|
@ -1390,9 +1543,9 @@ void Scumm::moveCamera() {
|
|||
|
||||
cameraMoved();
|
||||
|
||||
if (pos != cd->_curPos && vm.vars[VAR_SCROLL_SCRIPT]) {
|
||||
vm.vars[VAR_CAMERA_CUR_POS] = cd->_curPos;
|
||||
runScript(vm.vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
|
||||
if (pos != cd->_curPos && _vars[VAR_SCROLL_SCRIPT]) {
|
||||
_vars[VAR_CAMERA_CUR_POS] = cd->_curPos;
|
||||
runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1410,6 +1563,31 @@ void Scumm::cameraMoved() {
|
|||
virtscr[0].xstart = _screenStartStrip << 3;
|
||||
}
|
||||
|
||||
void Scumm::panCameraTo(int x) {
|
||||
CameraData *cd = &camera;
|
||||
cd->_destPos = x;
|
||||
cd->_mode = 3;
|
||||
cd->_movingToActor = 0;
|
||||
}
|
||||
|
||||
void Scumm::actorFollowCamera(int act) {
|
||||
int old = camera._follows;
|
||||
|
||||
setCameraFollows(derefActorSafe(act, "actorFollowCamera"));
|
||||
if (camera._follows != old)
|
||||
runHook(0);
|
||||
|
||||
camera._movingToActor = 0;
|
||||
}
|
||||
|
||||
void Scumm::setCameraAtEx(int at) {
|
||||
CameraData *cd = &camera;
|
||||
cd->_mode = 1;
|
||||
cd->_curPos = at;
|
||||
setCameraAt(at);
|
||||
cd->_movingToActor = 0;
|
||||
}
|
||||
|
||||
void Scumm::palManipulate() {
|
||||
byte *srcptr, *destptr;
|
||||
byte *pal;
|
||||
|
@ -1484,7 +1662,7 @@ void Scumm::resetActorBgs() {
|
|||
+ (top * 40 + _screenStartStrip + i);
|
||||
gdi.numLinesToProcess = bottom - top;
|
||||
if (gdi.numLinesToProcess) {
|
||||
if (vm.vars[VAR_DRAWFLAGS]&2) {
|
||||
if (_vars[VAR_DRAWFLAGS]&2) {
|
||||
if(hasCharsetMask(i<<3, top, (i+1)<<3, bottom))
|
||||
draw8ColWithMasking();
|
||||
else
|
||||
|
@ -1510,6 +1688,7 @@ void Scumm::setPalColor(int index, int r, int g, int b) {
|
|||
_currentPalette[index*3+0] = r>>2;
|
||||
_currentPalette[index*3+1] = g>>2;
|
||||
_currentPalette[index*3+2] = b>>2;
|
||||
setDirtyColors(index,index);
|
||||
}
|
||||
if (_videoMode==0xE) {
|
||||
/* TODO: implement this */
|
||||
|
@ -1567,6 +1746,41 @@ byte Scumm::isMaskActiveAt(int l, int t, int r, int b, byte *mem) {
|
|||
return false;
|
||||
}
|
||||
|
||||
byte *Scumm::findPalInPals(byte *pal, int index) {
|
||||
byte *offs;
|
||||
uint32 size;
|
||||
|
||||
pal = findResource(MKID('WRAP'), pal);
|
||||
if (pal==NULL)
|
||||
return NULL;
|
||||
|
||||
offs = findResource(MKID('OFFS'),pal);
|
||||
if (offs==NULL)
|
||||
return NULL;
|
||||
|
||||
size = (READ_BE_UINT32_UNALIGNED(offs+4)-8) >> 2;
|
||||
|
||||
if ((uint32)index >= (uint32)size)
|
||||
return NULL;
|
||||
|
||||
return offs + READ_LE_UINT32(offs + 8 + index * sizeof(uint32));
|
||||
}
|
||||
|
||||
void Scumm::setPalette(int palindex) {
|
||||
byte *pals;
|
||||
|
||||
_curPalIndex = palindex;
|
||||
|
||||
pals = getResourceAddress(1, _roomResource) + _PALS_offs;
|
||||
|
||||
pals = findPalInPals(pals, palindex);
|
||||
|
||||
if (pals==NULL)
|
||||
error("invalid palette %d", palindex);
|
||||
|
||||
setPaletteFromPtr(pals);
|
||||
}
|
||||
|
||||
#if 0
|
||||
void Scumm::GDI_drawMouse() {
|
||||
byte *dst,*src,*dstorg;
|
||||
|
|
310
object.cpp
310
object.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.3 2001/10/16 10:01:47 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.2 2001/10/09 18:35:02 strigeus
|
||||
* fixed object parent bug
|
||||
* fixed some signed/unsigned comparisons
|
||||
|
@ -32,7 +35,7 @@
|
|||
#include "scumm.h"
|
||||
|
||||
bool Scumm::getClass(int obj, int cls) {
|
||||
checkRange(_maxNrObjects-1, 0, obj, "Object %d out of range in getClass");
|
||||
checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in getClass");
|
||||
|
||||
cls &= 0x7F;
|
||||
checkRange(32,1,cls,"Class %d out of range in getClass");
|
||||
|
@ -41,7 +44,7 @@ bool Scumm::getClass(int obj, int cls) {
|
|||
}
|
||||
|
||||
void Scumm::putClass(int obj, int cls, bool set) {
|
||||
checkRange(_maxNrObjects-1, 0, obj, "Object %d out of range in getClass");
|
||||
checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in getClass");
|
||||
|
||||
cls &= 0x7F;
|
||||
checkRange(32,1,cls,"Class %d out of range in getClass");
|
||||
|
@ -53,23 +56,23 @@ void Scumm::putClass(int obj, int cls, bool set) {
|
|||
}
|
||||
|
||||
int Scumm::getOwner(int obj) {
|
||||
checkRange(_maxNrObjects-1, 0, obj, "Object %d out of range in getOwner");
|
||||
checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in getOwner");
|
||||
return _objectFlagTable[obj]&0xF;
|
||||
}
|
||||
|
||||
void Scumm::putOwner(int act, int owner) {
|
||||
checkRange(_maxNrObjects-1, 0, act, "Object %d out of range in putOwner");
|
||||
checkRange(_numGlobalObjects-1, 0, act, "Object %d out of range in putOwner");
|
||||
checkRange(15, 0, owner, "Owner %d out of range in putOwner");
|
||||
_objectFlagTable[act] = (_objectFlagTable[act]&0xF0) | owner;
|
||||
}
|
||||
|
||||
int Scumm::getState(int act) {
|
||||
checkRange(_maxNrObjects-1, 0, act, "Object %d out of range in getState");
|
||||
checkRange(_numGlobalObjects-1, 0, act, "Object %d out of range in getState");
|
||||
return _objectFlagTable[act]>>4;
|
||||
}
|
||||
|
||||
void Scumm::putState(int act, int state) {
|
||||
checkRange(_maxNrObjects-1, 0, act, "Object %d out of range in putState");
|
||||
checkRange(_numGlobalObjects-1, 0, act, "Object %d out of range in putState");
|
||||
checkRange(15, 0, state, "State %d out of range in putState");
|
||||
_objectFlagTable[act] = (_objectFlagTable[act]&0x0F) | (state<<4);
|
||||
}
|
||||
|
@ -84,7 +87,7 @@ int Scumm::getObjectIndex(int object) {
|
|||
return -1;
|
||||
} else {
|
||||
for (i=_numObjectsInRoom; i>0; i--) {
|
||||
if (objs[i].obj_nr==object)
|
||||
if (_objs[i].obj_nr==object)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
|
@ -102,8 +105,8 @@ int Scumm::whereIsObject(int object) {
|
|||
}
|
||||
|
||||
for (i=_numObjectsInRoom; i>0; i--)
|
||||
if (objs[i].obj_nr == object) {
|
||||
if (objs[i].fl_object_index)
|
||||
if (_objs[i].obj_nr == object) {
|
||||
if (_objs[i].fl_object_index)
|
||||
return 4;
|
||||
return 1;
|
||||
}
|
||||
|
@ -111,7 +114,7 @@ int Scumm::whereIsObject(int object) {
|
|||
}
|
||||
|
||||
int Scumm::getObjectOrActorXY(int object) {
|
||||
if (object <= vm.vars[VAR_NUM_ACTOR]) {
|
||||
if (object <= _vars[VAR_NUM_ACTOR]) {
|
||||
return getActorXYPos(derefActorSafe(object, "getObjectOrActorXY"));
|
||||
}
|
||||
switch(whereIsObject(object)) {
|
||||
|
@ -124,24 +127,56 @@ int Scumm::getObjectOrActorXY(int object) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(DOTT)
|
||||
void Scumm::getObjectXYPos(int object) {
|
||||
ObjectData *od = &objs[getObjectIndex(object)];
|
||||
ObjectData *od = &_objs[getObjectIndex(object)];
|
||||
int state;
|
||||
byte *ptr;
|
||||
ImageHeader *imhd;
|
||||
int x,y;
|
||||
AdjustBoxResult abr;
|
||||
|
||||
state = getState(object)-1;
|
||||
if (state<0)
|
||||
state = 0;
|
||||
|
||||
if (od->fl_object_index) {
|
||||
ptr = getResourceAddress(0xD, od->fl_object_index);
|
||||
ptr = findResource(MKID('OBIM'), ptr);
|
||||
} else {
|
||||
ptr = getResourceAddress(1, _roomResource);
|
||||
ptr += od->offs_obim_to_room;
|
||||
}
|
||||
|
||||
imhd = (ImageHeader*)findResource2(MKID('IMHD'), ptr);
|
||||
x = od->x_pos*8 + imhd->hotspot[state].x;
|
||||
y = od->y_pos*8 + imhd->hotspot[state].y;
|
||||
|
||||
abr = adjustXYToBeInBox(0, x, y);
|
||||
_xPos = abr.x;
|
||||
_yPos = abr.y;
|
||||
_dir = od->actordir&3;
|
||||
}
|
||||
#else
|
||||
void Scumm::getObjectXYPos(int object) {
|
||||
ObjectData *od = &_objs[getObjectIndex(object)];
|
||||
AdjustBoxResult abr;
|
||||
abr = adjustXYToBeInBox(0, od->cdhd_10, od->cdhd_12);
|
||||
_xPos = abr.x;
|
||||
_yPos = abr.y;
|
||||
_dir = od->actordir&3;
|
||||
}
|
||||
#endif
|
||||
|
||||
int Scumm::getObjActToObjActDist(int a, int b) {
|
||||
int x,y;
|
||||
Actor *acta = NULL;
|
||||
Actor *actb = NULL;
|
||||
|
||||
if (a<=vm.vars[VAR_NUM_ACTOR])
|
||||
if (a<=_vars[VAR_NUM_ACTOR])
|
||||
acta = derefActorSafe(a, "getObjActToObjActDist");
|
||||
|
||||
if (b<=vm.vars[VAR_NUM_ACTOR])
|
||||
if (b<=_vars[VAR_NUM_ACTOR])
|
||||
actb = derefActorSafe(b, "getObjActToObjActDist(2)");
|
||||
|
||||
if (acta && actb && acta->room==actb->room && acta->room &&
|
||||
|
@ -175,21 +210,21 @@ int Scumm::findObject(int x, int y) {
|
|||
int i,a,b;
|
||||
|
||||
for (i=1; i<=_numObjectsInRoom; i++) {
|
||||
if (!objs[i].obj_nr || getClass(objs[i].obj_nr, 32))
|
||||
if (!_objs[i].obj_nr || getClass(_objs[i].obj_nr, 32))
|
||||
continue;
|
||||
b = i;
|
||||
do {
|
||||
a = objs[b].parentstate;
|
||||
b = objs[b].parent;
|
||||
a = _objs[b].parentstate;
|
||||
b = _objs[b].parent;
|
||||
if (b==0) {
|
||||
if (objs[i].x_pos <= (x>>3) &&
|
||||
objs[i].numstrips + objs[i].x_pos > (x>>3) &&
|
||||
objs[i].y_pos <= (y>>3) &&
|
||||
objs[i].height + objs[i].y_pos > (y>>3))
|
||||
return objs[i].obj_nr;
|
||||
if (_objs[i].x_pos <= (x>>3) &&
|
||||
_objs[i].numstrips + _objs[i].x_pos > (x>>3) &&
|
||||
_objs[i].y_pos <= (y>>3) &&
|
||||
_objs[i].height + _objs[i].y_pos > (y>>3))
|
||||
return _objs[i].obj_nr;
|
||||
break;
|
||||
}
|
||||
} while ( (objs[b].ownerstate&0xF0) == a);
|
||||
} while ( (_objs[b].ownerstate&0xF0) == a);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -203,7 +238,7 @@ void Scumm::drawRoomObjects(int arg) {
|
|||
return;
|
||||
|
||||
do {
|
||||
od = &objs[num];
|
||||
od = &_objs[num];
|
||||
if (!od->obj_nr || !(od->ownerstate&0xF0))
|
||||
continue;
|
||||
|
||||
|
@ -213,7 +248,7 @@ void Scumm::drawRoomObjects(int arg) {
|
|||
drawObject(num, arg);
|
||||
break;
|
||||
}
|
||||
od = &objs[od->parent];
|
||||
od = &_objs[od->parent];
|
||||
} while ((od->ownerstate & 0xF0)==a);
|
||||
|
||||
} while (--num);
|
||||
|
@ -249,7 +284,7 @@ void Scumm::drawObject(int obj, int arg) {
|
|||
|
||||
gdi.virtScreen = 0;
|
||||
|
||||
od = &objs[obj];
|
||||
od = &_objs[obj];
|
||||
|
||||
xpos = od->x_pos;
|
||||
ypos = od->y_pos;
|
||||
|
@ -308,7 +343,7 @@ void Scumm::loadRoomObjects() {
|
|||
|
||||
CodeHeader *cdhd;
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
room = getResourceAddress(1, _roomResource);
|
||||
roomhdr = (RoomHeader*)findResource(MKID('RMHD'), room);
|
||||
|
@ -318,12 +353,12 @@ void Scumm::loadRoomObjects() {
|
|||
if (_numObjectsInRoom == 0)
|
||||
return;
|
||||
|
||||
if (_numObjectsInRoom > 200)
|
||||
error("More than %d objects in room %d", 200, _roomResource);
|
||||
if (_numObjectsInRoom > _numLocalObjects)
|
||||
error("More than %d objects in room %d", _numLocalObjects, _roomResource);
|
||||
|
||||
tmp_room = room;
|
||||
|
||||
od = &objs[1];
|
||||
od = &_objs[1];
|
||||
for (i=1; i<=_numObjectsInRoom; i++,od++) {
|
||||
ptr = findResource(MKID('OBCD'), tmp_room);
|
||||
if (ptr==NULL)
|
||||
|
@ -353,40 +388,49 @@ void Scumm::loadRoomObjects() {
|
|||
obim_id = READ_LE_UINT16(&imhd->obj_id);
|
||||
|
||||
for(j=1; j<=_numObjectsInRoom; j++) {
|
||||
if (objs[j].obj_nr==obim_id)
|
||||
objs[j].offs_obim_to_room = ptr - room;
|
||||
if (_objs[j].obj_nr==obim_id)
|
||||
_objs[j].offs_obim_to_room = ptr - room;
|
||||
}
|
||||
tmp_room = NULL;
|
||||
}
|
||||
|
||||
od = &objs[1];
|
||||
od = &_objs[1];
|
||||
for (i=1; i<=_numObjectsInRoom; i++,od++) {
|
||||
ptr = room + objs[i].offs_obcd_to_room;
|
||||
ptr = room + _objs[i].offs_obcd_to_room;
|
||||
cdhd = (CodeHeader*)findResource2(MKID('CDHD'), ptr);
|
||||
objs[i].obj_nr = READ_LE_UINT16(&cdhd->obj_id);
|
||||
objs[i].numstrips = cdhd->w;
|
||||
objs[i].height = cdhd->h;
|
||||
objs[i].x_pos = cdhd->x;
|
||||
objs[i].y_pos = cdhd->y;
|
||||
_objs[i].obj_nr = READ_LE_UINT16(&cdhd->obj_id);
|
||||
|
||||
#if defined(DOTT)
|
||||
_objs[i].numstrips = cdhd->w>>3;
|
||||
_objs[i].height = cdhd->h>>3;
|
||||
_objs[i].x_pos = cdhd->x>>3;
|
||||
_objs[i].y_pos = cdhd->y>>3;
|
||||
#else
|
||||
_objs[i].numstrips = cdhd->w;
|
||||
_objs[i].height = cdhd->h;
|
||||
_objs[i].x_pos = cdhd->x;
|
||||
_objs[i].y_pos = cdhd->y;
|
||||
#endif
|
||||
if (cdhd->flags == 0x80) {
|
||||
objs[i].parentstate = 1<<4;
|
||||
_objs[i].parentstate = 1<<4;
|
||||
} else {
|
||||
objs[i].parentstate = (cdhd->flags&0xF)<<4;
|
||||
_objs[i].parentstate = (cdhd->flags&0xF)<<4;
|
||||
}
|
||||
objs[i].parent = cdhd->unk1;
|
||||
objs[i].cdhd_10 = READ_LE_UINT16(&cdhd->unk2);
|
||||
objs[i].cdhd_12 = READ_LE_UINT16(&cdhd->unk3);
|
||||
objs[i].actordir = cdhd->unk4;
|
||||
objs[i].fl_object_index = 0;
|
||||
_objs[i].parent = cdhd->parent;
|
||||
#if !defined(DOTT)
|
||||
_objs[i].cdhd_10 = READ_LE_UINT16(&cdhd->unk2);
|
||||
_objs[i].cdhd_12 = READ_LE_UINT16(&cdhd->unk3);
|
||||
#endif
|
||||
_objs[i].actordir = cdhd->actordir;
|
||||
_objs[i].fl_object_index = 0;
|
||||
}
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
}
|
||||
|
||||
void Scumm::fixObjectFlags() {
|
||||
int i;
|
||||
ObjectData *od = &objs[1];
|
||||
ObjectData *od = &_objs[1];
|
||||
for (i=1; i<=_numObjectsInRoom; i++,od++) {
|
||||
od->ownerstate = _objectFlagTable[od->obj_nr];
|
||||
}
|
||||
|
@ -412,12 +456,12 @@ void Scumm::clearOwnerOf(int obj) {
|
|||
if (getOwner(obj)==0xF) {
|
||||
i = 0;
|
||||
do {
|
||||
if (objs[i].obj_nr==obj) {
|
||||
if (!objs[i].fl_object_index)
|
||||
if (_objs[i].obj_nr==obj) {
|
||||
if (!_objs[i].fl_object_index)
|
||||
return;
|
||||
nukeResource(0xD, objs[i].fl_object_index);
|
||||
objs[i].obj_nr = 0;
|
||||
objs[i].fl_object_index = 0;
|
||||
nukeResource(0xD, _objs[i].fl_object_index);
|
||||
_objs[i].obj_nr = 0;
|
||||
_objs[i].fl_object_index = 0;
|
||||
}
|
||||
} while(++i <= _numObjectsInRoom);
|
||||
return;
|
||||
|
@ -449,10 +493,10 @@ void Scumm::removeObjectFromRoom(int obj) {
|
|||
uint16 *ptr;
|
||||
|
||||
for(i=1; i<=_numObjectsInRoom; i++) {
|
||||
if (objs[i].obj_nr==obj) {
|
||||
if (objs[i].numstrips != 0) {
|
||||
ptr = &actorDrawBits[objs[i].x_pos];
|
||||
cnt = objs[i].numstrips;
|
||||
if (_objs[i].obj_nr==obj) {
|
||||
if (_objs[i].numstrips != 0) {
|
||||
ptr = &actorDrawBits[_objs[i].x_pos];
|
||||
cnt = _objs[i].numstrips;
|
||||
do {
|
||||
*ptr++ |= 0x8000;
|
||||
} while (--cnt);
|
||||
|
@ -476,7 +520,7 @@ void Scumm::clearDrawObjectQueue() {
|
|||
byte *Scumm::getObjOrActorName(int obj) {
|
||||
byte *objptr;
|
||||
|
||||
if (obj <= vm.vars[VAR_NUM_ACTOR])
|
||||
if (obj <= _vars[VAR_NUM_ACTOR])
|
||||
return getActorName(derefActorSafe(obj, "getObjOrActorName"));
|
||||
|
||||
objptr = getObjectAddress(obj);
|
||||
|
@ -492,10 +536,10 @@ uint32 Scumm::getOBCDOffs(int object) {
|
|||
if ((_objectFlagTable[object]&0xF)!=0xF)
|
||||
return 0;
|
||||
for (i=_numObjectsInRoom; i>0; i--) {
|
||||
if (objs[i].obj_nr == object) {
|
||||
if (objs[i].fl_object_index!=0)
|
||||
if (_objs[i].obj_nr == object) {
|
||||
if (_objs[i].fl_object_index!=0)
|
||||
return 8;
|
||||
return objs[i].offs_obcd_to_room;
|
||||
return _objs[i].offs_obcd_to_room;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
@ -511,10 +555,10 @@ byte *Scumm::getObjectAddress(int obj) {
|
|||
}
|
||||
} else {
|
||||
for(i=_numObjectsInRoom; i>0; --i) {
|
||||
if (objs[i].obj_nr==obj) {
|
||||
if (objs[i].fl_object_index)
|
||||
return getResourceAddress(0xD, objs[i].fl_object_index)+8;
|
||||
return getResourceAddress(1, _roomResource) + objs[i].offs_obcd_to_room;
|
||||
if (_objs[i].obj_nr==obj) {
|
||||
if (_objs[i].fl_object_index)
|
||||
return getResourceAddress(0xD, _objs[i].fl_object_index)+8;
|
||||
return getResourceAddress(1, _roomResource) + _objs[i].offs_obcd_to_room;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -532,18 +576,18 @@ void Scumm::addObjectToInventory(int obj, int room) {
|
|||
|
||||
debug(1,"Adding object %d from room %d into inventory", obj, room);
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
if (whereIsObject(obj)==4) {
|
||||
i = getObjectIndex(obj);
|
||||
ptr = getResourceAddress(0xD, objs[i].fl_object_index) + 64;
|
||||
ptr = getResourceAddress(0xD, _objs[i].fl_object_index) + 64;
|
||||
size = READ_BE_UINT32_UNALIGNED(ptr+4);
|
||||
slot = getInventorySlot();
|
||||
_inventory[slot] = obj;
|
||||
createResource(5, slot, size);
|
||||
ptr = getResourceAddress(0xD, objs[i].fl_object_index) + 64;
|
||||
ptr = getResourceAddress(0xD, _objs[i].fl_object_index) + 64;
|
||||
memcpy(getResourceAddress(5, slot), ptr, size);
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
return;
|
||||
}
|
||||
ensureResourceLoaded(1, room);
|
||||
|
@ -569,7 +613,7 @@ void Scumm::addObjectToInventory(int obj, int room) {
|
|||
createResource(5, slot, size);
|
||||
obcdptr = getResourceAddress(1, room) + cdoffs;
|
||||
memcpy(getResourceAddress(5,slot),obcdptr,size);
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
return;
|
||||
}
|
||||
tmp_roomptr = NULL;
|
||||
|
@ -587,3 +631,131 @@ int Scumm::getInventorySlot() {
|
|||
error("Inventory full, %d max items", _maxInventoryItems);
|
||||
}
|
||||
|
||||
void Scumm::setOwnerOf(int obj, int owner) {
|
||||
ScriptSlot *ss;
|
||||
if (owner==0) {
|
||||
clearOwnerOf(obj);
|
||||
ss = &vm.slot[_currentScript];
|
||||
if (ss->type==0 && _inventory[ss->number]==obj) {
|
||||
putOwner(obj, 0);
|
||||
runHook(0);
|
||||
stopObjectCode();
|
||||
return;
|
||||
}
|
||||
}
|
||||
putOwner(obj, owner);
|
||||
runHook(0);
|
||||
}
|
||||
|
||||
int Scumm::getObjX(int obj) {
|
||||
if (obj <= _vars[VAR_NUM_ACTOR]) {
|
||||
return derefActorSafe(obj,"getObjX")->x;
|
||||
} else {
|
||||
if (whereIsObject(obj)==-1)
|
||||
return -1;
|
||||
getObjectOrActorXY(obj);
|
||||
return _xPos;
|
||||
}
|
||||
}
|
||||
|
||||
int Scumm::getObjY(int obj) {
|
||||
if (obj <= _vars[VAR_NUM_ACTOR]) {
|
||||
return derefActorSafe(obj,"getObjY")->y;
|
||||
} else {
|
||||
if (whereIsObject(obj)==-1)
|
||||
return -1;
|
||||
getObjectOrActorXY(obj);
|
||||
return _yPos;
|
||||
}
|
||||
}
|
||||
|
||||
int Scumm::getObjDir(int obj) {
|
||||
if (obj <= _vars[VAR_NUM_ACTOR]) {
|
||||
return derefActorSafe(obj,"getObjDir")->facing;
|
||||
} else {
|
||||
getObjectXYPos(obj);
|
||||
return _dir;
|
||||
}
|
||||
}
|
||||
|
||||
int Scumm::findInventory(int owner, int index) {
|
||||
int count = 1, i, obj;
|
||||
for (i=0; i!=_maxInventoryItems; i++) {
|
||||
obj = _inventory[i];
|
||||
if (obj && getOwner(obj)==owner && count++ == index)
|
||||
return obj;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Scumm::getInventoryCount(int owner) {
|
||||
int i,obj;
|
||||
int count = 0;
|
||||
for (i=0; i!=_maxInventoryItems; i++) {
|
||||
obj = _inventory[i];
|
||||
if (obj && getOwner(obj) == owner)
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
#if defined(DOTT)
|
||||
void Scumm::setObjectState(int obj, int state, int x, int y) {
|
||||
int i;
|
||||
|
||||
i = getObjectIndex(obj);
|
||||
if (i==-1)
|
||||
return;
|
||||
|
||||
if (x != -1) {
|
||||
_objs[i].x_pos = x;
|
||||
_objs[i].x_pos = y;
|
||||
}
|
||||
|
||||
addObjectToDrawQue(i);
|
||||
putState(obj, state);
|
||||
}
|
||||
|
||||
static int getDist(int x, int y, int x2, int y2) {
|
||||
int a = abs(y-y2);
|
||||
int b = abs(x-x2);
|
||||
if (a>b)
|
||||
return a;
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
int Scumm::getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f) {
|
||||
int i,j;
|
||||
int x,y;
|
||||
int x2,y2;
|
||||
|
||||
j = i = 0xFF;
|
||||
|
||||
if (is_obj_1) {
|
||||
if (getObjectOrActorXY(b)==-1)
|
||||
return -1;
|
||||
if (b < _vars[VAR_NUM_ACTOR])
|
||||
i = derefActorSafe(b, "unkObjProc1")->scalex;
|
||||
x = _xPos;
|
||||
y = _yPos;
|
||||
} else {
|
||||
x = b;
|
||||
y = c;
|
||||
}
|
||||
|
||||
if (is_obj_2) {
|
||||
if (getObjectOrActorXY(e)==-1)
|
||||
return -1;
|
||||
if (e < _vars[VAR_NUM_ACTOR])
|
||||
j = derefActorSafe(e, "unkObjProc1(2)")->scalex;
|
||||
x2 = _xPos;
|
||||
y2 = _yPos;
|
||||
} else {
|
||||
x2 = e;
|
||||
y2 = f;
|
||||
}
|
||||
|
||||
return getDist(x,y,x2,y2) * 0xFF / ((i + j)>>1);
|
||||
}
|
||||
#endif
|
233
resource.cpp
233
resource.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.3 2001/10/16 10:01:47 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.2 2001/10/10 10:02:33 strigeus
|
||||
* alternative mouse cursor
|
||||
* basic save&load
|
||||
|
@ -164,6 +167,7 @@ void Scumm::askForDisk() {
|
|||
error("askForDisk: not yet implemented");
|
||||
}
|
||||
|
||||
#if !defined(DOTT)
|
||||
|
||||
void Scumm::readIndexFile(int mode) {
|
||||
uint32 blocktype,itemsize;
|
||||
|
@ -192,18 +196,18 @@ void Scumm::readIndexFile(int mode) {
|
|||
break;
|
||||
|
||||
case MKID('DOBJ'):
|
||||
_maxNrObjects = fileReadWordLE();
|
||||
_objectFlagTable = (byte*)alloc(_maxNrObjects);
|
||||
_numGlobalObjects = fileReadWordLE();
|
||||
_objectFlagTable = (byte*)alloc(_numGlobalObjects);
|
||||
if (mode==1) {
|
||||
fileSeek(_fileHandle, itemsize - 10, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
_classData = (uint32*)alloc(_maxNrObjects * sizeof(uint32));
|
||||
fileRead(_fileHandle, _objectFlagTable, _maxNrObjects);
|
||||
fileRead(_fileHandle, _classData, _maxNrObjects * sizeof(uint32));
|
||||
_classData = (uint32*)alloc(_numGlobalObjects * sizeof(uint32));
|
||||
fileRead(_fileHandle, _objectFlagTable, _numGlobalObjects);
|
||||
fileRead(_fileHandle, _classData, _numGlobalObjects * sizeof(uint32));
|
||||
#if defined(SCUMM_BIG_ENDIAN)
|
||||
for (i=0; i<_maxNrObjects; i++)
|
||||
for (i=0; i<_numGlobalObjects; i++)
|
||||
_classData[i] = FROM_LE_32(_classData[i]);
|
||||
#endif
|
||||
break;
|
||||
|
@ -253,27 +257,147 @@ void Scumm::readIndexFile(int mode) {
|
|||
|
||||
openRoom(-1);
|
||||
|
||||
_numGlobalScriptsUsed = _maxScripts;
|
||||
_numGlobalScripts = _maxScripts;
|
||||
_dynamicRoomOffsets = true;
|
||||
}
|
||||
#else
|
||||
|
||||
|
||||
void Scumm::readIndexFile() {
|
||||
uint32 blocktype,itemsize;
|
||||
int numblock = 0;
|
||||
int num;
|
||||
|
||||
debug(9, "readIndexFile()");
|
||||
|
||||
openRoom(-1);
|
||||
openRoom(0);
|
||||
|
||||
while (1) {
|
||||
blocktype = fileReadDword();
|
||||
|
||||
if (fileReadFailed(_fileHandle))
|
||||
break;
|
||||
itemsize = fileReadDwordBE();
|
||||
|
||||
numblock++;
|
||||
|
||||
switch(blocktype) {
|
||||
case MKID('DCHR'):
|
||||
readResTypeList(6,MKID('CHAR'),"charset");
|
||||
break;
|
||||
|
||||
case MKID('DOBJ'):
|
||||
num = fileReadWordLE();
|
||||
assert(num == _numGlobalObjects);
|
||||
fileRead(_fileHandle, _objectFlagTable, num);
|
||||
fileRead(_fileHandle, _classData, num * sizeof(uint32));
|
||||
#if defined(SCUMM_BIG_ENDIAN)
|
||||
for (i=0; i<_numGlobalObjects; i++)
|
||||
_classData[i] = FROM_LE_32(_classData[i]);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case MKID('RNAM'):
|
||||
fileSeek(_fileHandle, itemsize-8,1);
|
||||
break;
|
||||
|
||||
case MKID('DROO'):
|
||||
readResTypeList(1,MKID('ROOM'),"room");
|
||||
break;
|
||||
|
||||
case MKID('DSCR'):
|
||||
readResTypeList(2,MKID('SCRP'),"script");
|
||||
break;
|
||||
|
||||
case MKID('DCOS'):
|
||||
readResTypeList(3,MKID('COST'),"costume");
|
||||
break;
|
||||
|
||||
case MKID('MAXS'):
|
||||
readMAXS();
|
||||
break;
|
||||
|
||||
case MKID('DSOU'):
|
||||
readResTypeList(4,MKID('SOUN'),"sound");
|
||||
break;
|
||||
|
||||
case MKID('AARY'):
|
||||
readArrayFromIndexFile();
|
||||
break;
|
||||
|
||||
default:
|
||||
error("Bad ID %c%c%c%c found in directory!", blocktype&0xFF, blocktype>>8, blocktype>>16, blocktype>>24);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
clearFileReadFailed(_fileHandle);
|
||||
|
||||
if (numblock!=9)
|
||||
error("Not enough blocks read from directory");
|
||||
|
||||
openRoom(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(DOTT)
|
||||
void Scumm::readArrayFromIndexFile() {
|
||||
int num;
|
||||
int a,b,c;
|
||||
|
||||
while ((num = fileReadWordLE()) != 0) {
|
||||
a = fileReadWordLE();
|
||||
b = fileReadWordLE();
|
||||
c = fileReadWordLE();
|
||||
if (c==1)
|
||||
defineArray(num, 1, a, b);
|
||||
else
|
||||
defineArray(num, 5, a, b);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(DOTT)
|
||||
|
||||
void Scumm::readResTypeList(int id, uint32 tag, const char *name) {
|
||||
int num,i;
|
||||
|
||||
debug(9, "readResTypeList(%d,%x,%s)",id,FROM_LE_32(tag),name);
|
||||
|
||||
num = fileReadWordLE();
|
||||
assert(num == res.num[id]);
|
||||
|
||||
fileRead(_fileHandle, res.roomno[id], num*sizeof(uint8));
|
||||
fileRead(_fileHandle, res.roomoffs[id], num*sizeof(uint32));
|
||||
#if defined(SCUMM_BIG_ENDIAN)
|
||||
for (i=0; i<num; i++)
|
||||
res.roomoffs[id][i] = FROM_LE_32(res.roomoffs[id][i]);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#else
|
||||
|
||||
void Scumm::readResTypeList(int id, uint32 tag, const char *name) {
|
||||
int num;
|
||||
#if defined(SCUMM_BIG_ENDIAN)
|
||||
int i;
|
||||
#endif
|
||||
|
||||
debug(9, "readResTypeList(%d,%x,%s)",id,FROM_LE_32(tag),name);
|
||||
|
||||
num = fileReadWordLE();
|
||||
|
||||
if (num>0xFF) {
|
||||
if (num>=0xFF) {
|
||||
error("Too many %ss (%d) in directory", name, num);
|
||||
}
|
||||
|
||||
allocResTypeData(id, tag, num, name, 1);
|
||||
|
||||
fileRead(_fileHandle, res.roomno[id], num);
|
||||
fileRead(_fileHandle, res.roomno[id], num*sizeof(uint8));
|
||||
fileRead(_fileHandle, res.roomoffs[id], num*sizeof(uint32));
|
||||
|
||||
#if defined(SCUMM_BIG_ENDIAN)
|
||||
|
@ -282,8 +406,16 @@ void Scumm::readResTypeList(int id, uint32 tag, const char *name) {
|
|||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void Scumm::allocResTypeData(int id, uint32 tag, int num, const char *name, int mode) {
|
||||
debug(9, "allocResTypeData(%d,%x,%d,%s,%d)",id,FROM_LE_32(tag),num,name,mode);
|
||||
assert(id>=0 && id<sizeof(res.mode)/sizeof(res.mode[0]));
|
||||
|
||||
if (num>=512) {
|
||||
error("Too many %ss (%d) in directory", name, num);
|
||||
}
|
||||
|
||||
res.mode[id] = mode;
|
||||
res.num[id] = num;
|
||||
res.tags[id] = tag;
|
||||
|
@ -336,7 +468,7 @@ void Scumm::ensureResourceLoaded(int type, int i) {
|
|||
loadResource(type, i);
|
||||
|
||||
if (type==1 && i==_roomResource)
|
||||
vm.vars[VAR_ROOM_FLAG] = 1;
|
||||
_vars[VAR_ROOM_FLAG] = 1;
|
||||
}
|
||||
|
||||
int Scumm::loadResource(int type, int index) {
|
||||
|
@ -436,7 +568,6 @@ int Scumm::readSoundResource(int type, int index) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int Scumm::getResourceRoomNr(int type, int index) {
|
||||
if (type==1)
|
||||
return index;
|
||||
|
@ -448,7 +579,7 @@ byte *Scumm::getResourceAddress(int type, int index) {
|
|||
|
||||
debug(9, "getResourceAddress(%d,%d)", type, index);
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
validateResource("getResourceAddress", type, index);
|
||||
|
||||
|
@ -473,7 +604,7 @@ void Scumm::setResourceFlags(int type, int index, byte flag) {
|
|||
byte *Scumm::createResource(int type, int index, uint32 size) {
|
||||
byte *ptr;
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
debug(9, "createResource(%d,%d,%d)", type, index,size);
|
||||
|
||||
|
@ -483,7 +614,7 @@ byte *Scumm::createResource(int type, int index, uint32 size) {
|
|||
validateResource("allocating", type, index);
|
||||
nukeResource(type, index);
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
ptr = (byte*)alloc(size + sizeof(ResHeader));
|
||||
if (ptr==NULL) {
|
||||
|
@ -509,7 +640,7 @@ void Scumm::nukeResource(int type, int index) {
|
|||
|
||||
debug(9, "nukeResource(%d,%d)", type, index);
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
assert( res.address[type] );
|
||||
assert( index>=0 && index < res.num[type]);
|
||||
|
||||
|
@ -607,22 +738,10 @@ void Scumm::loadPtrToResource(int type, int resindex, byte *source) {
|
|||
int i,len;
|
||||
|
||||
nukeResource(type, resindex);
|
||||
if (!source) {
|
||||
ptr = _scriptPointer;
|
||||
} else {
|
||||
ptr = source;
|
||||
}
|
||||
|
||||
len = 0;
|
||||
do {
|
||||
i = *ptr++;
|
||||
if (!i) break;
|
||||
len++;
|
||||
if (i==0xFF)
|
||||
ptr += 3, len += 3;
|
||||
} while (1);
|
||||
len = getStringLen(source);
|
||||
|
||||
if (++len <= 1)
|
||||
if (len <= 1)
|
||||
return;
|
||||
|
||||
alloced = createResource(type, resindex, len);
|
||||
|
@ -648,7 +767,57 @@ void Scumm::unkHeapProc2(int a, int b) {
|
|||
}
|
||||
|
||||
void Scumm::unkResProc(int a, int b) {
|
||||
error("unkResProc:not implemented");
|
||||
warning("unkResProc:not implemented");
|
||||
}
|
||||
|
||||
|
||||
#if defined(DOTT)
|
||||
void Scumm::readMAXS() {
|
||||
_numVariables = fileReadWordLE();
|
||||
fileReadWordLE();
|
||||
_numBitVariables = fileReadWordLE();
|
||||
_numLocalObjects = fileReadWordLE();
|
||||
_numArray = fileReadWordLE();
|
||||
fileReadWordLE();
|
||||
_numVerbs = fileReadWordLE();
|
||||
_numFlObject = fileReadWordLE();
|
||||
_numInventory = fileReadWordLE();
|
||||
_numRooms = fileReadWordLE();
|
||||
_numScripts = fileReadWordLE();
|
||||
_numSounds = fileReadWordLE();
|
||||
_numCharsets = fileReadWordLE();
|
||||
_numCostumes = fileReadWordLE();
|
||||
_numGlobalObjects = fileReadWordLE();
|
||||
|
||||
allocResTypeData(3, MKID('COST'), _numCostumes, "costume", 1);
|
||||
allocResTypeData(1, MKID('ROOM'), _numRooms, "room", 1);
|
||||
allocResTypeData(4, MKID('SOUN'), _numSounds, "sound", 1);
|
||||
allocResTypeData(2, MKID('SCRP'), _numScripts, "script", 1);
|
||||
allocResTypeData(6, MKID('CHAR'), _numCharsets, "charset", 1);
|
||||
allocResTypeData(5, MKID('NONE'), _numInventory, "inventory", 0);
|
||||
allocResTypeData(8, MKID('NONE'), _numVerbs,"verb", 0);
|
||||
allocResTypeData(7, MKID('NONE'), _numArray,"array", 0);
|
||||
allocResTypeData(13, MKID('NONE'),_numFlObject,"flobject", 0);
|
||||
allocResTypeData(12,MKID('NONE'),10, "temp", 0);
|
||||
allocResTypeData(11,MKID('NONE'),5, "scale table", 0);
|
||||
allocResTypeData(9, MKID('NONE'),13,"actor name", 0);
|
||||
allocResTypeData(10, MKID('NONE'),10,"buffer", 0);
|
||||
allocResTypeData(14, MKID('NONE'),10,"boxes", 0);
|
||||
allocResTypeData(16, MKID('NONE'),50,"new name", 0);
|
||||
|
||||
_objectFlagTable = (byte*)alloc(_numGlobalObjects);
|
||||
_inventory = (uint16*)alloc(_numInventory * sizeof(uint16));
|
||||
_arrays = (byte*)alloc(_numArray);
|
||||
_verbs = (VerbSlot*)alloc(_numVerbs * sizeof(VerbSlot));
|
||||
_objs = (ObjectData*)alloc(_numLocalObjects * sizeof(ObjectData));
|
||||
_vars = (int16*)alloc(_numVariables * sizeof(int16));
|
||||
_bitVars = (byte*)alloc(_numBitVariables >> 3);
|
||||
_newNames = (uint16*)alloc(50 * sizeof(uint16));
|
||||
_classData = (uint32*)alloc(_numGlobalObjects * sizeof(uint32));
|
||||
|
||||
_numGlobalScripts = 200;
|
||||
_dynamicRoomOffsets = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
257
saveload.cpp
257
saveload.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.3 2001/10/16 10:01:47 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.2 2001/10/10 10:02:33 strigeus
|
||||
* alternative mouse cursor
|
||||
* basic save&load
|
||||
|
@ -31,10 +34,25 @@
|
|||
#include "stdafx.h"
|
||||
#include "scumm.h"
|
||||
|
||||
struct SaveGameHeader {
|
||||
uint32 type;
|
||||
uint32 size;
|
||||
uint32 ver;
|
||||
};
|
||||
|
||||
bool Scumm::saveState(const char *filename) {
|
||||
FILE *out = fopen(filename,"wb");
|
||||
SaveGameHeader hdr;
|
||||
|
||||
if (out==NULL)
|
||||
return false;
|
||||
|
||||
hdr.type = MKID('SCVM');
|
||||
hdr.size = 0;
|
||||
hdr.ver = 1;
|
||||
|
||||
fwrite(&hdr, sizeof(hdr), 1, out);
|
||||
|
||||
saveOrLoad(out,true);
|
||||
fclose(out);
|
||||
debug(1,"State saved as '%s'", filename);
|
||||
|
@ -44,11 +62,25 @@ bool Scumm::saveState(const char *filename) {
|
|||
bool Scumm::loadState(const char *filename) {
|
||||
FILE *out = fopen(filename,"rb");
|
||||
int i,j;
|
||||
SaveGameHeader hdr;
|
||||
|
||||
if (out==NULL)
|
||||
return false;
|
||||
|
||||
checkHeap();
|
||||
fread(&hdr, sizeof(hdr), 1, out);
|
||||
if (hdr.type != MKID('SCVM')) {
|
||||
warning("Invalid savegame '%s'", filename);
|
||||
fclose(out);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hdr.ver != 1) {
|
||||
warning("Invalid version of '%s'", filename);
|
||||
fclose(out);
|
||||
return false;
|
||||
}
|
||||
|
||||
CHECK_HEAP
|
||||
|
||||
openRoom(-1);
|
||||
memset(_inventory, 0, sizeof(_inventory));
|
||||
|
@ -74,7 +106,7 @@ bool Scumm::loadState(const char *filename) {
|
|||
|
||||
initBGBuffers();
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
debug(1,"State loaded from '%s'", filename);
|
||||
|
||||
|
@ -95,10 +127,10 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(ObjectData,cdhd_10,sleUint16),
|
||||
MKLINE(ObjectData,cdhd_12,sleUint16),
|
||||
MKLINE(ObjectData,obj_nr,sleUint16),
|
||||
MKLINE(ObjectData,x_pos,sleByte),
|
||||
MKLINE(ObjectData,y_pos,sleByte),
|
||||
MKLINE(ObjectData,numstrips,sleByte),
|
||||
MKLINE(ObjectData,height,sleByte),
|
||||
MKLINE(ObjectData,x_pos,sleInt16),
|
||||
MKLINE(ObjectData,y_pos,sleInt16),
|
||||
MKLINE(ObjectData,numstrips,sleUint16),
|
||||
MKLINE(ObjectData,height,sleUint16),
|
||||
MKLINE(ObjectData,actordir,sleByte),
|
||||
MKLINE(ObjectData,parentstate,sleByte),
|
||||
MKLINE(ObjectData,parent,sleByte),
|
||||
|
@ -116,13 +148,13 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(Actor,elevation,sleInt16),
|
||||
MKLINE(Actor,width,sleUint16),
|
||||
MKLINE(Actor,facing,sleByte),
|
||||
MKLINE(Actor,costume,sleByte),
|
||||
MKLINE(Actor,costume,sleUint16),
|
||||
MKLINE(Actor,room,sleByte),
|
||||
MKLINE(Actor,talkColor,sleByte),
|
||||
MKLINE(Actor,scalex,sleByte),
|
||||
MKLINE(Actor,scaley,sleByte),
|
||||
MKLINE(Actor,charset,sleByte),
|
||||
MKLINE(Actor,sound,sleByte),
|
||||
MKARRAY(Actor,sound[0],sleByte, 8),
|
||||
MKLINE(Actor,newDirection,sleByte),
|
||||
MKLINE(Actor,moving,sleByte),
|
||||
MKLINE(Actor,ignoreBoxes,sleByte),
|
||||
|
@ -147,6 +179,10 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(Actor,needBgReset,sleByte),
|
||||
MKLINE(Actor,costumeNeedsInit,sleByte),
|
||||
|
||||
MKLINE(Actor,new_1,sleInt16),
|
||||
MKLINE(Actor,new_2,sleInt16),
|
||||
MKLINE(Actor,new_3,sleByte),
|
||||
|
||||
MKLINE(Actor,walkdata.destx,sleInt16),
|
||||
MKLINE(Actor,walkdata.desty,sleInt16),
|
||||
MKLINE(Actor,walkdata.destbox,sleByte),
|
||||
|
@ -203,14 +239,14 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(Scumm,_IM00_offs,sleUint32),
|
||||
MKLINE(Scumm,_CLUT_offs,sleUint32),
|
||||
MKLINE(Scumm,_EPAL_offs,sleUint32),
|
||||
MKLINE(Scumm,_PALS_offs,sleUint32),
|
||||
MKLINE(Scumm,_curPalIndex,sleByte),
|
||||
MKLINE(Scumm,_currentRoom,sleByte),
|
||||
MKLINE(Scumm,_roomResource,sleByte),
|
||||
MKLINE(Scumm,_numObjectsInRoom,sleByte),
|
||||
MKLINE(Scumm,_currentScript,sleByte),
|
||||
MKARRAY(Scumm,_localScriptList[0],sleUint32,0x39),
|
||||
MKARRAY(Scumm,vm.vars[0],sleUint16,801),
|
||||
MKARRAY(Scumm,vm.localvar[0],sleUint16,20*17),
|
||||
MKARRAY(Scumm,vm.bitvars[0],sleByte,256),
|
||||
MKARRAY(Scumm,_resourceMapper[0],sleByte,128),
|
||||
MKARRAY(Scumm,charset._colorMap[0],sleByte,16),
|
||||
MKARRAY(Scumm,_charsetData[0][0],sleByte,10*16),
|
||||
|
@ -238,12 +274,6 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(Scumm,_numInMsgStack,sleInt16),
|
||||
MKLINE(Scumm,_sentenceIndex,sleByte),
|
||||
|
||||
MKARRAY(Scumm,_sentenceTab[0],sleByte,6),
|
||||
MKARRAY(Scumm,_sentenceTab2[0],sleByte,6),
|
||||
MKARRAY(Scumm,_sentenceTab3[0],sleUint16,6),
|
||||
MKARRAY(Scumm,_sentenceTab4[0],sleUint16,6),
|
||||
MKARRAY(Scumm,_sentenceTab5[0],sleByte,6),
|
||||
|
||||
MKLINE(Scumm,vm.cutSceneStackPointer,sleByte),
|
||||
MKARRAY(Scumm,vm.cutScenePtr[0],sleUint32,5),
|
||||
MKARRAY(Scumm,vm.cutSceneScript[0],sleByte,5),
|
||||
|
@ -256,7 +286,6 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(Scumm,_cursorState,sleByte),
|
||||
MKLINE(Scumm,gdi.unk4,sleByte),
|
||||
MKLINE(Scumm,gdi.currentCursor,sleByte),
|
||||
// MKLINE(Scumm,gdi.unk3,sleByte),
|
||||
|
||||
MKLINE(Scumm,dseg_4F8A,sleUint16),
|
||||
MKLINE(Scumm,_switchRoomEffect,sleByte),
|
||||
|
@ -264,37 +293,13 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(Scumm,_switchRoomEffect2,sleByte),
|
||||
MKLINE(Scumm,_BgNeedsRedraw,sleByte),
|
||||
|
||||
MKARRAY(Scumm,actorDrawBits[0],sleUint16,160),
|
||||
MKARRAY(Scumm,actorDrawBits[0],sleUint16,200),
|
||||
MKLINE(Scumm,gdi.transparency,sleByte),
|
||||
MKARRAY(Scumm,_currentPalette[0],sleByte,768),
|
||||
|
||||
/* virtscr */
|
||||
|
||||
MKARRAY(Scumm,charset._buffer[0],sleByte,256),
|
||||
|
||||
MKARRAY(Scumm,textslot.x[0],sleInt16,6),
|
||||
MKARRAY(Scumm,textslot.y[0],sleInt16,6),
|
||||
MKARRAY(Scumm,textslot.center[0],sleInt16,6),
|
||||
MKARRAY(Scumm,textslot.overhead[0],sleInt16,6),
|
||||
MKARRAY(Scumm,textslot.right[0],sleInt16,6),
|
||||
MKARRAY(Scumm,textslot.color[0],sleInt16,6),
|
||||
MKARRAY(Scumm,textslot.charset[0],sleInt16,6),
|
||||
|
||||
MKARRAY(Scumm,_stringXpos[0],sleInt16,6),
|
||||
MKARRAY(Scumm,_stringYpos[0],sleInt16,6),
|
||||
MKARRAY(Scumm,_stringXpos2[0],sleInt16,6),
|
||||
MKARRAY(Scumm,_stringYpos2[0],sleInt16,6),
|
||||
MKARRAY(Scumm,_stringCenter[0],sleInt16,6),
|
||||
MKARRAY(Scumm,_stringOverhead[0],sleUint16,6),
|
||||
MKARRAY(Scumm,_stringRight[0],sleUint16,6),
|
||||
MKARRAY(Scumm,_stringColor[0],sleUint16,6),
|
||||
MKARRAY(Scumm,_stringCharset[0],sleUint16,6),
|
||||
|
||||
MKLINE(Scumm,charset._mask_left,sleInt16),
|
||||
MKLINE(Scumm,charset._mask_top,sleInt16),
|
||||
MKLINE(Scumm,charset._mask_right,sleInt16),
|
||||
MKLINE(Scumm,charset._mask_bottom,sleInt16),
|
||||
|
||||
MKLINE(Scumm,dseg_3A76,sleUint16),
|
||||
|
||||
MKARRAY(Scumm,_imgBufOffs[0],sleUint16,4),
|
||||
|
@ -327,6 +332,7 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKLINE(ScriptSlot,offs,sleUint32),
|
||||
MKLINE(ScriptSlot,delay,sleInt32),
|
||||
MKLINE(ScriptSlot,number,sleUint16),
|
||||
MKLINE(ScriptSlot,newfield,sleUint16),
|
||||
MKLINE(ScriptSlot,status,sleByte),
|
||||
MKLINE(ScriptSlot,type,sleByte),
|
||||
MKLINE(ScriptSlot,unk1,sleByte),
|
||||
|
@ -345,6 +351,39 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
MKEND()
|
||||
};
|
||||
|
||||
const SaveLoadEntry sentenceTabEntries[] = {
|
||||
MKLINE(SentenceTab,unk5,sleUint8),
|
||||
MKLINE(SentenceTab,unk2,sleUint8),
|
||||
MKLINE(SentenceTab,unk4,sleUint16),
|
||||
MKLINE(SentenceTab,unk3,sleUint16),
|
||||
MKLINE(SentenceTab,unk,sleUint8),
|
||||
MKEND()
|
||||
};
|
||||
|
||||
const SaveLoadEntry stringTabEntries[] = {
|
||||
MKLINE(StringTab,t_xpos,sleInt16),
|
||||
MKLINE(StringTab,t_ypos,sleInt16),
|
||||
MKLINE(StringTab,t_center,sleInt16),
|
||||
MKLINE(StringTab,t_overhead,sleInt16),
|
||||
MKLINE(StringTab,t_new3,sleInt16),
|
||||
MKLINE(StringTab,t_right,sleInt16),
|
||||
MKLINE(StringTab,t_color,sleInt16),
|
||||
MKLINE(StringTab,t_charset,sleInt16),
|
||||
MKLINE(StringTab,xpos,sleInt16),
|
||||
MKLINE(StringTab,ypos,sleInt16),
|
||||
MKLINE(StringTab,xpos2,sleInt16),
|
||||
MKLINE(StringTab,ypos2,sleInt16),
|
||||
MKLINE(StringTab,center,sleInt16),
|
||||
MKLINE(StringTab,overhead,sleInt16),
|
||||
MKLINE(StringTab,new_3,sleInt16),
|
||||
MKLINE(StringTab,right,sleInt16),
|
||||
MKLINE(StringTab,mask_top,sleInt16),
|
||||
MKLINE(StringTab,mask_bottom,sleInt16),
|
||||
MKLINE(StringTab,mask_right,sleInt16),
|
||||
MKLINE(StringTab,mask_left,sleInt16),
|
||||
MKEND()
|
||||
};
|
||||
|
||||
int i,j;
|
||||
|
||||
_saveLoadStream = inout;
|
||||
|
@ -355,29 +394,26 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) {
|
|||
saveLoadEntries(&actor[i],actorEntries);
|
||||
for (i=0; i<20; i++)
|
||||
saveLoadEntries(&vm.slot[i],scriptSlotEntries);
|
||||
for (i=0; i<184; i++)
|
||||
saveLoadEntries(&objs[i],objectEntries);
|
||||
for (i=0; i<102; i++)
|
||||
saveLoadEntries(&verbs[i],verbEntries);
|
||||
for (i=0; i<_numLocalObjects; i++)
|
||||
saveLoadEntries(&_objs[i],objectEntries);
|
||||
for (i=0; i<_numVerbs; i++)
|
||||
saveLoadEntries(&_verbs[i],verbEntries);
|
||||
for (i=0; i<16; i++)
|
||||
saveLoadEntries(&vm.nest[i],nestedScriptEntries);
|
||||
for (i=0; i<6; i++)
|
||||
saveLoadEntries(&sentence[i],sentenceTabEntries);
|
||||
for (i=0; i<6; i++)
|
||||
saveLoadEntries(&string[i],stringTabEntries);
|
||||
|
||||
for (i=1; i<16; i++)
|
||||
if (res.mode[i]==0)
|
||||
for(j=1; j<res.num[i]; j++)
|
||||
saveLoadResource(i,j);
|
||||
|
||||
if (_saveOrLoad) {
|
||||
for (i=0; i<_maxNrObjects; i++) {
|
||||
saveByte(_objectFlagTable[i]);
|
||||
saveUint32(_classData[i]);
|
||||
}
|
||||
} else {
|
||||
for (i=0; i<_maxNrObjects; i++) {
|
||||
_objectFlagTable[i] = loadByte();
|
||||
_classData[i] = loadUint32();
|
||||
}
|
||||
}
|
||||
saveLoadArrayOf(_objectFlagTable, _numGlobalObjects, sizeof(_objectFlagTable[0]), sleByte);
|
||||
saveLoadArrayOf(_classData, _numGlobalObjects, sizeof(_classData[0]), sleUint32);
|
||||
saveLoadArrayOf(_vars, _numVariables, sizeof(_vars[0]), sleInt16);
|
||||
saveLoadArrayOf(_bitVars, _numBitVariables>>8, 1, sleByte);
|
||||
}
|
||||
|
||||
void Scumm::saveLoadResource(int type, int index) {
|
||||
|
@ -454,6 +490,61 @@ byte Scumm::loadByte() {
|
|||
return e;
|
||||
}
|
||||
|
||||
void Scumm::saveLoadArrayOf(void *b, int len, int datasize, byte filetype) {
|
||||
byte *at = (byte*)b;
|
||||
uint32 data;
|
||||
|
||||
while (--len>=0) {
|
||||
if (_saveOrLoad) {
|
||||
/* saving */
|
||||
if (datasize==1) {
|
||||
data = *(byte*)at;
|
||||
at += 1;
|
||||
} else if (datasize==2) {
|
||||
data = *(uint16*)at;
|
||||
at += 2;
|
||||
} else if (datasize==4) {
|
||||
data = *(uint32*)at;
|
||||
at += 4;
|
||||
} else {
|
||||
error("saveLoadArrayOf: invalid size %d", datasize);
|
||||
}
|
||||
switch(filetype) {
|
||||
case sleByte: saveByte(data); break;
|
||||
case sleUint16:
|
||||
case sleInt16:saveWord(data); break;
|
||||
case sleInt32:
|
||||
case sleUint32:saveUint32(data); break;
|
||||
default:
|
||||
error("saveLoadArrayOf: invalid filetype %d", filetype);
|
||||
}
|
||||
} else {
|
||||
/* loading */
|
||||
switch(filetype) {
|
||||
case sleByte: data = loadByte(); break;
|
||||
case sleUint16: data = loadWord(); break;
|
||||
case sleInt16: data = (int16)loadWord(); break;
|
||||
case sleUint32: data = loadUint32(); break;
|
||||
case sleInt32: data = (int32)loadUint32(); break;
|
||||
default:
|
||||
error("saveLoadArrayOf: invalid filetype %d", filetype);
|
||||
}
|
||||
if (datasize==1) {
|
||||
*(byte*)at = data;
|
||||
at += 1;
|
||||
} else if (datasize==2) {
|
||||
*(uint16*)at = data;
|
||||
at += 2;
|
||||
} else if (datasize==4) {
|
||||
*(uint32*)at = data;
|
||||
at += 4;
|
||||
} else {
|
||||
error("saveLoadArrayOf: invalid size %d", datasize);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Scumm::saveLoadEntries(void *d, const SaveLoadEntry *sle) {
|
||||
int replen;
|
||||
|
@ -461,7 +552,6 @@ void Scumm::saveLoadEntries(void *d, const SaveLoadEntry *sle) {
|
|||
byte *at;
|
||||
int size;
|
||||
int value;
|
||||
uint32 data;
|
||||
|
||||
while(sle->offs != 0xFFFF) {
|
||||
at = (byte*)d + sle->offs;
|
||||
|
@ -474,56 +564,7 @@ void Scumm::saveLoadEntries(void *d, const SaveLoadEntry *sle) {
|
|||
type&=~128;
|
||||
}
|
||||
sle++;
|
||||
|
||||
do {
|
||||
if (_saveOrLoad) {
|
||||
/* saving */
|
||||
if (size==1) {
|
||||
data = *(byte*)at;
|
||||
at += 1;
|
||||
} else if (size==2) {
|
||||
data = *(uint16*)at;
|
||||
at += 2;
|
||||
} else if (size==4) {
|
||||
data = *(uint32*)at;
|
||||
at += 4;
|
||||
} else {
|
||||
warning("invalid size %d", size);
|
||||
}
|
||||
switch(type) {
|
||||
case sleByte: saveByte(data); break;
|
||||
case sleUint16:
|
||||
case sleInt16:saveWord(data); break;
|
||||
case sleInt32:
|
||||
case sleUint32:saveUint32(data); break;
|
||||
default:
|
||||
warning("invalid type %d", type);
|
||||
}
|
||||
} else {
|
||||
/* loading */
|
||||
switch(type) {
|
||||
case sleByte: data = loadByte(); break;
|
||||
case sleUint16: data = loadWord(); break;
|
||||
case sleInt16: data = (int16)loadWord(); break;
|
||||
case sleUint32: data = loadUint32(); break;
|
||||
case sleInt32: data = (int32)loadUint32(); break;
|
||||
default:
|
||||
warning("invalid type %d", type);
|
||||
}
|
||||
if (size==1) {
|
||||
*(byte*)at = data;
|
||||
at += 1;
|
||||
} else if (size==2) {
|
||||
*(uint16*)at = data;
|
||||
at += 2;
|
||||
} else if (size==4) {
|
||||
*(uint32*)at = data;
|
||||
at += 4;
|
||||
} else {
|
||||
warning("invalid size %d", size);
|
||||
}
|
||||
}
|
||||
} while (--replen);
|
||||
saveLoadArrayOf(at, replen, size, type);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
2568
script.cpp
2568
script.cpp
File diff suppressed because it is too large
Load diff
1986
script_v1.cpp
Normal file
1986
script_v1.cpp
Normal file
File diff suppressed because it is too large
Load diff
2124
script_v2.cpp
Normal file
2124
script_v2.cpp
Normal file
File diff suppressed because it is too large
Load diff
403
scumm.h
403
scumm.h
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.8 2001/10/16 10:01:47 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.7 2001/10/11 12:07:35 strigeus
|
||||
* Determine caption from file name.
|
||||
*
|
||||
|
@ -129,6 +132,7 @@ struct ScriptSlot {
|
|||
uint32 offs;
|
||||
int32 delay;
|
||||
uint16 number;
|
||||
uint16 newfield;
|
||||
byte status;
|
||||
byte type;
|
||||
byte unk1,unk2,freezeCount,didexec;
|
||||
|
@ -146,6 +150,25 @@ struct ResHeader {
|
|||
uint32 size;
|
||||
};
|
||||
|
||||
#if defined(DOTT)
|
||||
class ObjectData {
|
||||
public:
|
||||
uint32 offs_obim_to_room;
|
||||
uint32 offs_obcd_to_room;
|
||||
uint16 cdhd_10, cdhd_12;
|
||||
uint16 obj_nr;
|
||||
int16 x_pos;
|
||||
int16 y_pos;
|
||||
uint16 numstrips;
|
||||
uint16 height;
|
||||
byte actordir;
|
||||
byte parent;
|
||||
byte parentstate;
|
||||
byte ownerstate;
|
||||
byte fl_object_index;
|
||||
byte unk_3;
|
||||
};
|
||||
#else
|
||||
class ObjectData {
|
||||
public:
|
||||
uint32 offs_obim_to_room;
|
||||
|
@ -154,15 +177,16 @@ public:
|
|||
uint16 obj_nr;
|
||||
byte x_pos;
|
||||
byte y_pos;
|
||||
byte numstrips;
|
||||
byte height;
|
||||
uint16 numstrips;
|
||||
uint16 height;
|
||||
byte actordir;
|
||||
byte parentstate;
|
||||
byte parent;
|
||||
byte parentstate;
|
||||
byte ownerstate;
|
||||
byte fl_object_index;
|
||||
byte unk_3;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct RoomHeader {
|
||||
uint32 tag, size;
|
||||
|
@ -170,22 +194,43 @@ struct RoomHeader {
|
|||
uint16 numObjects;
|
||||
};
|
||||
|
||||
#if !defined(DOTT)
|
||||
struct CodeHeader { /* file format */
|
||||
uint32 id;
|
||||
uint32 size;
|
||||
uint16 obj_id;
|
||||
byte x,y,w,h;
|
||||
byte flags;
|
||||
byte unk1;
|
||||
byte parent;
|
||||
uint16 unk2;
|
||||
uint16 unk3;
|
||||
byte unk4;
|
||||
byte actordir;
|
||||
};
|
||||
#else
|
||||
struct CodeHeader { /* file format */
|
||||
uint32 id;
|
||||
uint32 size;
|
||||
uint16 obj_id;
|
||||
int16 x, y;
|
||||
uint16 w,h;
|
||||
byte flags, parent;
|
||||
uint16 unk2;
|
||||
uint16 unk3;
|
||||
byte actordir;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct ImageHeader { /* file format */
|
||||
uint32 id;
|
||||
uint32 size;
|
||||
uint16 obj_id;
|
||||
uint16 unk[5];
|
||||
uint16 img_w;
|
||||
uint16 img_h;
|
||||
uint16 unk_2;
|
||||
struct {
|
||||
int16 x,y;
|
||||
} hotspot[15];
|
||||
};
|
||||
|
||||
#pragma END_PACK_STRUCTS
|
||||
|
@ -208,6 +253,7 @@ struct SaveLoadEntry {
|
|||
|
||||
enum {
|
||||
sleByte = 1,
|
||||
sleUint8 = 1,
|
||||
sleInt16 = 2,
|
||||
sleUint16 = 3,
|
||||
sleInt32 = 4,
|
||||
|
@ -287,6 +333,10 @@ enum ScummVars {
|
|||
VAR_CUTSCENEEXIT_KEY = 24,
|
||||
VAR_TALKSTOP_KEY = 57,
|
||||
VAR_SAVELOADDIALOG_KEY = 50,
|
||||
|
||||
#if defined(DOTT)
|
||||
VAR_RANDOM_NR = 118,
|
||||
#endif
|
||||
};
|
||||
|
||||
#define _maxRooms res.num[1]
|
||||
|
@ -308,6 +358,7 @@ enum ScummVars {
|
|||
#define _baseScripts res.address[2]
|
||||
#define _baseInventoryItems res.address[5]
|
||||
#define _baseFLObject res.address[13]
|
||||
#define _baseArrays res.address[7]
|
||||
|
||||
#define _roomFileOffsets res.roomoffs[1]
|
||||
|
||||
|
@ -322,7 +373,7 @@ struct CharsetRenderer {
|
|||
bool _hasMask;
|
||||
|
||||
int _strLeft, _strRight, _strTop, _strBottom;
|
||||
int _mask_bottom, _mask_right, _mask_top, _mask_left;
|
||||
// int _mask_bottom, _mask_right, _mask_top, _mask_left;
|
||||
byte _curId;
|
||||
|
||||
byte _bufPos;
|
||||
|
@ -413,11 +464,11 @@ struct Actor {
|
|||
uint width;
|
||||
byte number;
|
||||
byte facing;
|
||||
byte costume;
|
||||
uint16 costume;
|
||||
byte room;
|
||||
byte talkColor;
|
||||
byte scalex,scaley;
|
||||
byte charset,sound;
|
||||
byte charset;
|
||||
byte newDirection;
|
||||
byte moving;
|
||||
byte ignoreBoxes;
|
||||
|
@ -430,6 +481,9 @@ struct Actor {
|
|||
byte walkbox;
|
||||
byte mask;
|
||||
byte animProgress, animSpeed;
|
||||
int16 new_1,new_2;
|
||||
byte new_3;
|
||||
byte sound[8];
|
||||
ActorWalkData walkdata;
|
||||
CostumeData cost;
|
||||
byte palette[32];
|
||||
|
@ -442,6 +496,34 @@ struct CameraData {
|
|||
uint16 _movingToActor;
|
||||
};
|
||||
|
||||
#define ARRAY_HDR_SIZE 6
|
||||
struct ArrayHeader {
|
||||
int16 dim1_size;
|
||||
int16 type;
|
||||
int16 dim2_size;
|
||||
byte data[1];
|
||||
};
|
||||
|
||||
struct SentenceTab {
|
||||
byte unk5;
|
||||
byte unk2;
|
||||
uint16 unk4;
|
||||
uint16 unk3;
|
||||
byte unk;
|
||||
byte pad;
|
||||
};
|
||||
|
||||
struct StringTab {
|
||||
int16 t_xpos, t_ypos, t_center, t_overhead;
|
||||
int16 t_new3, t_right, t_color, t_charset;
|
||||
int16 xpos, ypos;
|
||||
int16 xpos2,ypos2;
|
||||
int16 center, overhead;
|
||||
int16 new_3, right;
|
||||
int16 color,charset;
|
||||
int16 mask_top, mask_bottom, mask_right, mask_left;
|
||||
};
|
||||
|
||||
struct Scumm {
|
||||
int _lastLoadedRoom;
|
||||
int _roomResource;
|
||||
|
@ -459,13 +541,41 @@ struct Scumm {
|
|||
|
||||
int _keyPressed;
|
||||
|
||||
uint16 *_inventory;
|
||||
byte *_arrays;
|
||||
VerbSlot *_verbs;
|
||||
ObjectData *_objs;
|
||||
uint16 *_newNames;
|
||||
int16 *_vars;
|
||||
byte *_bitVars;
|
||||
|
||||
const OpcodeProc *_opcodes;
|
||||
|
||||
byte _curActor;
|
||||
int _curVerb;
|
||||
int _curVerbSlot;
|
||||
|
||||
int _curPalIndex;
|
||||
|
||||
int _numVariables;
|
||||
int _numBitVariables;
|
||||
int _numLocalObjects;
|
||||
int _numGlobalObjects;
|
||||
int _numArray;
|
||||
int _numVerbs;
|
||||
int _numFlObject;
|
||||
int _numInventory;
|
||||
int _numRooms;
|
||||
int _numScripts;
|
||||
int _numSounds;
|
||||
int _numCharsets;
|
||||
int _numCostumes;
|
||||
|
||||
uint8 *_roomFileIndexes;
|
||||
byte *_objectFlagTable;
|
||||
uint32 *_classData;
|
||||
|
||||
byte _numGlobalScriptsUsed;
|
||||
|
||||
uint16 _maxNrObjects;
|
||||
byte _numGlobalScripts;
|
||||
|
||||
uint16 _numZBuffer;
|
||||
|
||||
|
@ -509,8 +619,6 @@ struct Scumm {
|
|||
|
||||
uint32 _localScriptList[0x39];
|
||||
|
||||
uint16 _inventory[0x50];
|
||||
|
||||
uint16 _debugMode;
|
||||
|
||||
byte *_messagePtr;
|
||||
|
@ -543,12 +651,13 @@ struct Scumm {
|
|||
|
||||
int _numInMsgStack;
|
||||
|
||||
VerbSlot verbs[102];
|
||||
// VerbSlot verbs[102];
|
||||
VirtScreen virtscr[4];
|
||||
|
||||
uint32 _ENCD_offs, _EXCD_offs;
|
||||
uint32 _CLUT_offs, _EPAL_offs;
|
||||
uint32 _IM00_offs;
|
||||
uint32 _PALS_offs;
|
||||
|
||||
int _drawObjectQueNr;
|
||||
byte _drawObjectQue[0xC8];
|
||||
|
@ -556,7 +665,6 @@ struct Scumm {
|
|||
uint16 _currentDrive;
|
||||
uint16 _soundCardType;
|
||||
uint16 _videoMode;
|
||||
uint16 _heapSpace;
|
||||
byte _mousePresent;
|
||||
|
||||
int16 _palManipStart;
|
||||
|
@ -564,19 +672,17 @@ struct Scumm {
|
|||
int16 _palManipCounter;
|
||||
|
||||
struct {
|
||||
byte mode[16];
|
||||
uint16 num[16];
|
||||
uint32 tags[16];
|
||||
const char *name[16];
|
||||
byte **address[16];
|
||||
byte *flags[16];
|
||||
byte *roomno[16];
|
||||
uint32 *roomoffs[16];
|
||||
byte mode[17];
|
||||
uint16 num[17];
|
||||
uint32 tags[17];
|
||||
const char *name[17];
|
||||
byte **address[17];
|
||||
byte *flags[17];
|
||||
byte *roomno[17];
|
||||
uint32 *roomoffs[17];
|
||||
} res;
|
||||
|
||||
struct {
|
||||
int16 vars[801];
|
||||
byte bitvars[256];
|
||||
uint32 cutScenePtr[5];
|
||||
byte cutSceneScript[5];
|
||||
int16 cutSceneData[5];
|
||||
|
@ -591,16 +697,6 @@ struct Scumm {
|
|||
int16 x,y;
|
||||
} mouse;
|
||||
|
||||
struct {
|
||||
int16 x[6];
|
||||
int16 y[6];
|
||||
int16 center[6];
|
||||
int16 overhead[6];
|
||||
int16 right[6];
|
||||
int16 color[6];
|
||||
int16 charset[6];
|
||||
} textslot;
|
||||
|
||||
struct {
|
||||
byte *readPtr;
|
||||
uint16 readOffs;
|
||||
|
@ -644,7 +740,7 @@ struct Scumm {
|
|||
|
||||
Actor actor[13];
|
||||
|
||||
uint16 actorDrawBits[160];
|
||||
uint16 actorDrawBits[200];
|
||||
|
||||
struct {
|
||||
int upperLeftX;
|
||||
|
@ -691,12 +787,21 @@ struct Scumm {
|
|||
uint16 _imgBufOffs[4];
|
||||
|
||||
byte _sentenceIndex;
|
||||
SentenceTab sentence[6];
|
||||
|
||||
|
||||
#if 0
|
||||
byte _sentenceTab[6];
|
||||
byte _sentenceTab2[6];
|
||||
uint16 _sentenceTab3[6];
|
||||
uint16 _sentenceTab4[6];
|
||||
byte _sentenceTab5[6];
|
||||
#endif
|
||||
|
||||
StringTab string[6];
|
||||
|
||||
#if 0
|
||||
// int _stringXPos[4], _stringYPos[4];
|
||||
uint16 _stringOverhead[6];
|
||||
uint16 _stringCenter[6];
|
||||
uint16 _stringRight[6];
|
||||
|
@ -708,10 +813,11 @@ struct Scumm {
|
|||
|
||||
int16 _stringXpos2[6];
|
||||
int16 _stringYpos2[6];
|
||||
#endif
|
||||
|
||||
CostumeRenderer cost;
|
||||
|
||||
ObjectData objs[184];
|
||||
// ObjectData objs[184];
|
||||
|
||||
int16 _soundQuePos;
|
||||
int16 _soundQue[0x100];
|
||||
|
@ -748,7 +854,7 @@ struct Scumm {
|
|||
|
||||
bool _BgNeedsRedraw;
|
||||
|
||||
int _stringXPos[4], _stringYPos[4];
|
||||
|
||||
|
||||
int16 _localParamList[16];
|
||||
|
||||
|
@ -760,7 +866,7 @@ struct Scumm {
|
|||
uint16 _lastKeyHit;
|
||||
|
||||
int _scummStackPos;
|
||||
int16 _scummStack[0x15];
|
||||
int16 _scummStack[100];
|
||||
|
||||
int _maxBoxVertexHeap;
|
||||
byte *_boxMatrixPtr4, *_boxMatrixPtr1, *_boxMatrixPtr3;
|
||||
|
@ -769,12 +875,14 @@ struct Scumm {
|
|||
|
||||
byte *_msgPtrToAdd;
|
||||
|
||||
OpcodeProc getOpcode(int i) { return _opcodes[i]; }
|
||||
|
||||
void openRoom(int room);
|
||||
void deleteRoomOffsets();
|
||||
void readRoomsOffsets();
|
||||
void askForDisk();
|
||||
|
||||
void readIndexFile(int i);
|
||||
|
||||
bool openResourceFile(const char *filename);
|
||||
|
||||
void fileClose(void *file);
|
||||
|
@ -897,6 +1005,7 @@ struct Scumm {
|
|||
int getVarOrDirectWord(byte mask);
|
||||
int getVarOrDirectByte(byte mask);
|
||||
int readVar(uint var);
|
||||
void writeVar(uint var, int value);
|
||||
void getResultPos();
|
||||
void setResult(int result);
|
||||
|
||||
|
@ -1004,6 +1113,150 @@ struct Scumm {
|
|||
void o_walkActorToActor();
|
||||
void o_walkActorToObject();
|
||||
|
||||
void o2_pushByte();
|
||||
void o2_pushWord();
|
||||
void o2_pushByteVar();
|
||||
void o2_pushWordVar();
|
||||
void o2_invalid();
|
||||
void o2_byteArrayRead();
|
||||
void o2_wordArrayRead();
|
||||
void o2_byteArrayIndexedRead();
|
||||
void o2_wordArrayIndexedRead();
|
||||
void o2_dup();
|
||||
void o2_zero();
|
||||
void o2_eq();
|
||||
void o2_neq();
|
||||
void o2_gt();
|
||||
void o2_lt();
|
||||
void o2_le();
|
||||
void o2_ge();
|
||||
void o2_add();
|
||||
void o2_sub();
|
||||
void o2_mul();
|
||||
void o2_div();
|
||||
void o2_land();
|
||||
void o2_lor();
|
||||
void o2_kill();
|
||||
void o2_writeByteVar();
|
||||
void o2_writeWordVar();
|
||||
void o2_byteArrayWrite();
|
||||
void o2_wordArrayWrite();
|
||||
void o2_byteArrayIndexedWrite();
|
||||
void o2_wordArrayIndexedWrite();
|
||||
void o2_byteVarInc();
|
||||
void o2_wordVarInc();
|
||||
void o2_byteArrayInc();
|
||||
void o2_wordArrayInc();
|
||||
void o2_byteVarDec();
|
||||
void o2_wordVarDec();
|
||||
void o2_byteArrayDec();
|
||||
void o2_wordArrayDec();
|
||||
void o2_jumpTrue();
|
||||
void o2_jumpFalse();
|
||||
void o2_jump();
|
||||
void o2_startScriptEx();
|
||||
void o2_startScript();
|
||||
void o2_startObject();
|
||||
void o2_setObjectState();
|
||||
void o2_setObjectXY();
|
||||
void o2_stopObjectCode();
|
||||
void o2_endCutscene();
|
||||
void o2_cutScene();
|
||||
void o2_stopMusic();
|
||||
void o2_freezeUnfreeze();
|
||||
void o2_cursorCommand();
|
||||
void o2_breakHere();
|
||||
void o2_ifClassOfIs();
|
||||
void o2_setClass();
|
||||
void o2_getState();
|
||||
void o2_setState();
|
||||
void o2_setOwner();
|
||||
void o2_getOwner();
|
||||
void o2_startSound();
|
||||
void o2_stopSound();
|
||||
void o2_startMusic();
|
||||
void o2_stopObjectScript();
|
||||
void o2_panCameraTo();
|
||||
void o2_actorFollowCamera();
|
||||
void o2_setCameraAt();
|
||||
void o2_loadRoom();
|
||||
void o2_stopScript();
|
||||
void o2_walkActorToObj();
|
||||
void o2_walkActorTo();
|
||||
void o2_putActorInRoom();
|
||||
void o2_putActorAtObject();
|
||||
void o2_faceActor();
|
||||
void o2_animateActor();
|
||||
void o2_doSentence();
|
||||
void o2_pickupObject();
|
||||
void o2_loadRoomWithEgo();
|
||||
void o2_getRandomNumber();
|
||||
void o2_getRandomNumberRange();
|
||||
void o2_getActorMoving();
|
||||
void o2_getScriptRunning();
|
||||
void o2_getActorRoom();
|
||||
void o2_getObjectX();
|
||||
void o2_getObjectY();
|
||||
void o2_getObjectDir();
|
||||
void o2_getActorWalkBox();
|
||||
void o2_getActorCostume();
|
||||
void o2_findInventory();
|
||||
void o2_getInventoryCount();
|
||||
void o2_getVerbFromXY();
|
||||
void o2_beginOverride();
|
||||
void o2_endOverride();
|
||||
void o2_setObjectName();
|
||||
void o2_isSoundRunning();
|
||||
void o2_setBoxFlags();
|
||||
void o2_createBoxMatrix();
|
||||
void o2_resourceRoutines();
|
||||
void o2_roomOps();
|
||||
void o2_actorSet();
|
||||
void o2_verbOps();
|
||||
void o2_getActorFromXY();
|
||||
void o2_findObject();
|
||||
void o2_pseudoRoom();
|
||||
void o2_getActorElevation();
|
||||
void o2_getVerbEntrypoint();
|
||||
void o2_arrayOps();
|
||||
void o2_saveRestoreVerbs();
|
||||
void o2_drawBox();
|
||||
void o2_getActorWidth();
|
||||
void o2_wait();
|
||||
void o2_getActorScaleX();
|
||||
void o2_getActorAnimCounter1();
|
||||
void o2_soundKludge();
|
||||
void o2_isAnyOf();
|
||||
void o2_quitPauseRestart();
|
||||
void o2_isActorInBox();
|
||||
void o2_delay();
|
||||
void o2_delayLonger();
|
||||
void o2_delayVeryLong();
|
||||
void o2_stopSentence();
|
||||
void o2_print_0();
|
||||
void o2_print_1();
|
||||
void o2_print_2();
|
||||
void o2_print_3();
|
||||
void o2_printActor();
|
||||
void o2_printEgo();
|
||||
void o2_talkActor();
|
||||
void o2_talkEgo();
|
||||
void o2_dim();
|
||||
void o2_runVerbCodeQuick();
|
||||
void o2_runScriptQuick();
|
||||
void o2_dim2();
|
||||
void o2_abs();
|
||||
void o2_distObjectObject();
|
||||
void o2_distObjectPt();
|
||||
void o2_distPtPt();
|
||||
void o2_dummy_stacklist();
|
||||
void o2_miscOps();
|
||||
void o2_breakMaybe();
|
||||
void o2_pickOneOf();
|
||||
void o2_pickOneOfDefault();
|
||||
|
||||
void soundKludge(int16 *list);
|
||||
|
||||
void stopObjectCode();
|
||||
void stopObjectScript(int script);
|
||||
void putActor(Actor *a, int x, int y, byte room);
|
||||
|
@ -1148,8 +1401,8 @@ struct Scumm {
|
|||
void setActorCostume(Actor *a, int c);
|
||||
void loadPtrToResource(int type, int i, byte *ptr);
|
||||
|
||||
void stackPush(int a);
|
||||
int stackPop();
|
||||
void push(int a);
|
||||
int pop();
|
||||
|
||||
void walkActorTo(Actor *a, int x, int y, int direction);
|
||||
|
||||
|
@ -1182,7 +1435,7 @@ struct Scumm {
|
|||
byte *getObjectAddress(int obj);
|
||||
byte *getObjOrActorName(int obj);
|
||||
void clearOwnerOf(int obj);
|
||||
void runVERBCode(int script, int entry, int a, int b, int16 *vars);
|
||||
void runVerbCode(int script, int entry, int a, int b, int16 *vars);
|
||||
void unkSoundProc1(int a);
|
||||
void setVerbObject(int room, int object, int verb);
|
||||
void unkMessage1();
|
||||
|
@ -1207,8 +1460,6 @@ struct Scumm {
|
|||
int getKeyInput(int a);
|
||||
void convertKeysToClicks();
|
||||
|
||||
OpcodeProc getOpcode(int i);
|
||||
|
||||
void drawBox(int x, int y, int x2, int y2, int color);
|
||||
|
||||
void drawMouse();
|
||||
|
@ -1226,6 +1477,7 @@ struct Scumm {
|
|||
void saveLoadBytes(void *b, int len);
|
||||
void saveLoadResource(int type, int index);
|
||||
bool isResourceLoaded(int type, int index);
|
||||
void saveLoadArrayOf(void *b, int len, int datasize, byte filetype);
|
||||
|
||||
void saveLoadEntries(void *d, const SaveLoadEntry *sle);
|
||||
|
||||
|
@ -1256,6 +1508,67 @@ struct Scumm {
|
|||
void showHelpAndExit();
|
||||
|
||||
char *getGameName();
|
||||
|
||||
void setupOpcodes();
|
||||
void setupOpcodes2();
|
||||
void endCutscene();
|
||||
void cutscene(int16 *args);
|
||||
|
||||
void setOwnerOf(int obj, int owner);
|
||||
void panCameraTo(int x);
|
||||
void actorFollowCamera(int act);
|
||||
void setCameraAtEx(int at);
|
||||
|
||||
void setCursorHotspot2(int x,int y);
|
||||
|
||||
void new_unk_1(int a);
|
||||
|
||||
void faceActorToObj(int act, int obj);
|
||||
void animateActor(int act, int anim);
|
||||
int getScriptRunning(int script);
|
||||
int getObjX(int obj);
|
||||
int getObjY(int obj);
|
||||
int getObjDir(int obj);
|
||||
int findInventory(int owner, int index);
|
||||
int getInventoryCount(int owner);
|
||||
|
||||
void beginOverride();
|
||||
void endOverride();
|
||||
|
||||
void setPalette(int pal);
|
||||
void setPaletteFromPtr(byte *ptr);
|
||||
byte *findPalInPals(byte *pal, int index);
|
||||
|
||||
int getStringLen(byte *ptr);
|
||||
|
||||
#if defined(DOTT)
|
||||
void readArrayFromIndexFile();
|
||||
void readMAXS();
|
||||
void readIndexFile();
|
||||
|
||||
int readArray(int array, int index, int base);
|
||||
void writeArray(int array, int index, int base, int value);
|
||||
|
||||
int getStackList(int16 *args, uint maxnum);
|
||||
void setObjectState(int obj, int state, int x, int y);
|
||||
|
||||
void setStringVars(int i);
|
||||
void decodeParseString2(int a, int b);
|
||||
|
||||
void arrayop_1(int a, byte *ptr);
|
||||
|
||||
void copyString(byte *dst, byte *src, int len);
|
||||
int getArrayId();
|
||||
|
||||
void nukeArray(int a);
|
||||
int defineArray(int a, int b, int c, int d);
|
||||
int getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f);
|
||||
void unkMiscOp4(int a, int b, int c, int d);
|
||||
void unkMiscOp9();
|
||||
void startManiac();
|
||||
#else
|
||||
void readIndexFile(int i);
|
||||
#endif
|
||||
};
|
||||
|
||||
void waitForTimer(Scumm *s);
|
||||
|
|
20
scummsys.h
20
scummsys.h
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.4 2001/10/16 10:01:47 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.3 2001/10/09 18:35:02 strigeus
|
||||
* fixed object parent bug
|
||||
* fixed some signed/unsigned comparisons
|
||||
|
@ -36,6 +39,13 @@
|
|||
#pragma warning (disable: 4101)
|
||||
|
||||
|
||||
#if defined(CHECK_HEAP)
|
||||
#undef CHECK_HEAP
|
||||
#define CHECK_HEAP checkHeap();
|
||||
#else
|
||||
#define CHECK_HEAP
|
||||
#endif
|
||||
|
||||
#define SCUMM_LITTLE_ENDIAN
|
||||
|
||||
#define FORCEINLINE __forceinline
|
||||
|
@ -55,8 +65,9 @@ typedef signed long int32;
|
|||
|
||||
#elif defined(UNIX)
|
||||
|
||||
/* need this for the SDL_BYTEORDER define */
|
||||
#define CHECK_HEAP
|
||||
|
||||
/* need this for the SDL_BYTEORDER define */
|
||||
#include <SDL_byteorder.h>
|
||||
|
||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||
|
@ -122,6 +133,9 @@ uint32 FORCEINLINE READ_BE_UINT32(void *ptr) {
|
|||
#define FROM_LE_32(__a__) __a__
|
||||
#define FROM_LE_16(__a__) __a__
|
||||
|
||||
#define TO_LE_32(__a__) __a__
|
||||
#define TO_LE_16(__a__) __a__
|
||||
|
||||
#define TO_BE_32(a) ((((a)>>24)&0xFF) | (((a)>>8)&0xFF00) | (((a)<<8)&0xFF0000) | (((a)<<24)&0xFF000000))
|
||||
|
||||
#elif defined(SCUMM_BIG_ENDIAN)
|
||||
|
@ -136,6 +150,9 @@ uint16 FORCEINLINE FROM_LE_16(uint16 a) {
|
|||
return ((a>>8)&0xFF) + ((a<<8)&0xFF00);
|
||||
}
|
||||
|
||||
#define TO_LE_32 FROM_LE_32
|
||||
#define TO_LE_16 FROM_LE_16
|
||||
|
||||
uint32 FORCEINLINE READ_LE_UINT32(void *ptr) {
|
||||
byte *b = (byte*)ptr;
|
||||
return (b[3]<<24)+(b[2]<<16)+(b[1]<<8)+(b[0]);
|
||||
|
@ -158,7 +175,6 @@ int FORCEINLINE READ_BE_UINT16_UNALIGNED(void *ptr) {
|
|||
return (((byte*)ptr)[0]<<8)|((byte*)ptr)[1];
|
||||
}
|
||||
|
||||
|
||||
uint32 FORCEINLINE READ_BE_UINT32_UNALIGNED(void *ptr) {
|
||||
byte *b = (byte*)ptr;
|
||||
return (b[0]<<24)+(b[1]<<16)+(b[2]<<8)+(b[3]);
|
||||
|
|
264
scummvm.cpp
264
scummvm.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.7 2001/10/16 10:01:48 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.6 2001/10/11 11:49:51 strigeus
|
||||
* Determine caption from file name.
|
||||
*
|
||||
|
@ -44,9 +47,20 @@
|
|||
#include "stdafx.h"
|
||||
#include "scumm.h"
|
||||
|
||||
#if !defined(DOTT)
|
||||
void Scumm::initThings() {
|
||||
readIndexFile(1);
|
||||
|
||||
_numVariables = 800;
|
||||
_numBitVariables = 2048;
|
||||
_numLocalObjects = 200;
|
||||
|
||||
_inventory = (uint16*)alloc(0x50 * sizeof(uint16));
|
||||
_verbs = (VerbSlot*)alloc(102 * sizeof(VerbSlot));
|
||||
_objs = (ObjectData*)alloc(200 * sizeof(ObjectData));
|
||||
_vars = (int16*)alloc(800 * sizeof(int16));
|
||||
_bitVars = (byte*)alloc(2048 >> 3);
|
||||
|
||||
allocResTypeData(5, MKID('NONE'), 0x50, "inventory", 0);
|
||||
allocResTypeData(12,MKID('NONE'),10, "temp", 0);
|
||||
allocResTypeData(11,MKID('NONE'),5, "scale table", 0);
|
||||
|
@ -56,11 +70,19 @@ void Scumm::initThings() {
|
|||
allocResTypeData(7, MKID('NONE'),0x32,"string", 0);
|
||||
allocResTypeData(13, MKID('NONE'),0x32,"flobject", 0);
|
||||
allocResTypeData(14, MKID('NONE'),10,"boxes", 0);
|
||||
|
||||
readIndexFile(2);
|
||||
initRandSeeds();
|
||||
|
||||
setupOpcodes();
|
||||
}
|
||||
#else
|
||||
|
||||
void Scumm::initThings() {
|
||||
setupOpcodes2();
|
||||
readIndexFile();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void Scumm::initRandSeeds() {
|
||||
_randSeed1 = 0xA943DE35;
|
||||
|
@ -71,7 +93,7 @@ uint Scumm::getRandomNumber(uint max) {
|
|||
/* TODO: my own random number generator */
|
||||
_randSeed1 = 0xDEADBEEF * (_randSeed1 + 1);
|
||||
_randSeed1 = (_randSeed1>>13) | (_randSeed1<<19);
|
||||
return _randSeed1%(max+1);
|
||||
return _randSeed1%max;
|
||||
}
|
||||
|
||||
void Scumm::scummInit() {
|
||||
|
@ -79,7 +101,7 @@ void Scumm::scummInit() {
|
|||
Actor *a;
|
||||
|
||||
debug(9, "scummInit");
|
||||
readIndexFile(3);
|
||||
// readIndexFile(3);
|
||||
loadCharset(1);
|
||||
initScreens(0, 16, 320, 144);
|
||||
|
||||
|
@ -91,11 +113,11 @@ void Scumm::scummInit() {
|
|||
initActor(a, 1);
|
||||
}
|
||||
|
||||
memset(vm.vars, 0, sizeof(vm.vars));
|
||||
memset(vm.bitvars, 0, sizeof(vm.bitvars));
|
||||
// memset(vm.vars, 0, sizeof(vm.vars));
|
||||
// memset(vm.bitvars, 0, sizeof(vm.bitvars));
|
||||
|
||||
_defaultTalkDelay = 60;
|
||||
vm.vars[37] = 4;
|
||||
_vars[VAR_CHARINC] = 4;
|
||||
|
||||
_numNestedScripts = 0;
|
||||
vm.cutSceneStackPointer = 0;
|
||||
|
@ -104,17 +126,17 @@ void Scumm::scummInit() {
|
|||
memset(vm.cutSceneData, 0, sizeof(vm.cutSceneData));
|
||||
|
||||
for (i=0; i<_maxVerbs; i++) {
|
||||
verbs[i].verbid = 0;
|
||||
verbs[i].right = 319;
|
||||
verbs[i].oldleft = -1;
|
||||
verbs[i].type = 0;
|
||||
verbs[i].color = 2;
|
||||
verbs[i].hicolor = 0;
|
||||
verbs[i].charset_nr = 1;
|
||||
verbs[i].curmode = 0;
|
||||
verbs[i].saveid = 0;
|
||||
verbs[i].center=0;
|
||||
verbs[i].key = 0;
|
||||
_verbs[i].verbid = 0;
|
||||
_verbs[i].right = 319;
|
||||
_verbs[i].oldleft = -1;
|
||||
_verbs[i].type = 0;
|
||||
_verbs[i].color = 2;
|
||||
_verbs[i].hicolor = 0;
|
||||
_verbs[i].charset_nr = 1;
|
||||
_verbs[i].curmode = 0;
|
||||
_verbs[i].saveid = 0;
|
||||
_verbs[i].center=0;
|
||||
_verbs[i].key = 0;
|
||||
}
|
||||
|
||||
camera._leftTrigger = 10;
|
||||
|
@ -122,14 +144,13 @@ void Scumm::scummInit() {
|
|||
camera._mode = 0;
|
||||
camera._follows = 0;
|
||||
|
||||
|
||||
virtscr[0].xstart = 0;
|
||||
|
||||
vm.vars[9] = 11;
|
||||
_vars[9] = 11;
|
||||
|
||||
_lightsValueA = _lightsValueB = 7;
|
||||
|
||||
vm.vars[59] = 3;
|
||||
_vars[59] = 3;
|
||||
|
||||
mouse.x = 104;
|
||||
mouse.y = 56;
|
||||
|
@ -149,7 +170,7 @@ void Scumm::scummInit() {
|
|||
|
||||
_screenStartStrip = 0;
|
||||
|
||||
vm.vars[25] = 0;
|
||||
_vars[25] = 0;
|
||||
|
||||
_talkDelay = 0;
|
||||
_keepText = false;
|
||||
|
@ -163,12 +184,12 @@ void Scumm::scummInit() {
|
|||
clearDrawObjectQueue();
|
||||
|
||||
for (i=0; i<6; i++) {
|
||||
textslot.x[i] = 2;
|
||||
textslot.y[i] = 5;
|
||||
textslot.right[i] = 319;
|
||||
textslot.color[i] = 0xF;
|
||||
textslot.center[i] = 0;
|
||||
textslot.charset[i] = 0;
|
||||
string[i].t_xpos = 2;
|
||||
string[i].t_ypos = 5;
|
||||
string[i].t_right = 319;
|
||||
string[i].t_color = 0xF;
|
||||
string[i].t_center = 0;
|
||||
string[i].t_charset = 0;
|
||||
}
|
||||
|
||||
_numInMsgStack = 0;
|
||||
|
@ -177,22 +198,22 @@ void Scumm::scummInit() {
|
|||
|
||||
initScummVars();
|
||||
|
||||
vm.vars[54] = -0x50;
|
||||
_vars[54] = -0x50;
|
||||
|
||||
getGraphicsPerformance();
|
||||
}
|
||||
|
||||
|
||||
void Scumm::initScummVars() {
|
||||
vm.vars[VAR_CURRENTDRIVE] = _currentDrive;
|
||||
vm.vars[VAR_FIXEDDISK] = checkFixedDisk();
|
||||
vm.vars[VAR_SOUNDCARD] = _soundCardType;
|
||||
vm.vars[VAR_VIDEOMODE] = _videoMode;
|
||||
vm.vars[VAR_HEAPSPACE] = _heapSpace;
|
||||
vm.vars[VAR_MOUSEPRESENT] = _mousePresent;
|
||||
vm.vars[VAR_SOUNDPARAM] = _soundParam;
|
||||
vm.vars[VAR_SOUNDPARAM2] = _soundParam2;
|
||||
vm.vars[VAR_SOUNDPARAM3] = _soundParam3;
|
||||
_vars[VAR_CURRENTDRIVE] = _currentDrive;
|
||||
_vars[VAR_FIXEDDISK] = checkFixedDisk();
|
||||
_vars[VAR_SOUNDCARD] = _soundCardType;
|
||||
_vars[VAR_VIDEOMODE] = _videoMode;
|
||||
_vars[VAR_HEAPSPACE] = 600;
|
||||
_vars[VAR_MOUSEPRESENT] = _mousePresent;
|
||||
_vars[VAR_SOUNDPARAM] = _soundParam;
|
||||
_vars[VAR_SOUNDPARAM2] = _soundParam2;
|
||||
_vars[VAR_SOUNDPARAM3] = _soundParam3;
|
||||
}
|
||||
|
||||
void Scumm::checkRange(int max, int min, int no, const char *str) {
|
||||
|
@ -220,33 +241,34 @@ void Scumm::scummMain(int argc, char **argv) {
|
|||
initThings();
|
||||
scummInit();
|
||||
|
||||
vm.vars[VAR_VERSION] = 21;
|
||||
vm.vars[VAR_DEBUGMODE] = _debugMode;
|
||||
_vars[VAR_VERSION] = 21;
|
||||
_vars[VAR_DEBUGMODE] = _debugMode;
|
||||
|
||||
runScript(1,0,0,&_bootParam);
|
||||
_scummTimer = 0;
|
||||
|
||||
do {
|
||||
if (_playBackFile) {
|
||||
while ((_scummTimer>>2) < vm.vars[VAR_PLAYBACKTIMER]) {}
|
||||
_scummTimer = vm.vars[VAR_PLAYBACKTIMER] << 2;
|
||||
while ((_scummTimer>>2) < _vars[VAR_PLAYBACKTIMER]) {}
|
||||
_scummTimer = _vars[VAR_PLAYBACKTIMER] << 2;
|
||||
}
|
||||
|
||||
CHECK_HEAP
|
||||
updateScreen(this);
|
||||
|
||||
vm.vars[VAR_TIMER] = _scummTimer >> 2;
|
||||
_vars[VAR_TIMER] = _scummTimer >> 2;
|
||||
do {
|
||||
waitForTimer(this);
|
||||
tmr = _scummTimer >> 2;
|
||||
if (_fastMode)
|
||||
tmr += 15;
|
||||
} while (tmr < vm.vars[VAR_TIMER_NEXT]);
|
||||
} while (tmr < _vars[VAR_TIMER_NEXT]);
|
||||
_scummTimer = 0;
|
||||
|
||||
vm.vars[VAR_TMR_1] += tmr;
|
||||
vm.vars[VAR_TMR_2] += tmr;
|
||||
vm.vars[VAR_TMR_3] += tmr;
|
||||
vm.vars[VAR_TMR_4] += tmr;
|
||||
_vars[VAR_TMR_1] += tmr;
|
||||
_vars[VAR_TMR_2] += tmr;
|
||||
_vars[VAR_TMR_3] += tmr;
|
||||
_vars[VAR_TMR_4] += tmr;
|
||||
|
||||
if (tmr > 15)
|
||||
tmr = 15;
|
||||
|
@ -259,13 +281,13 @@ void Scumm::scummMain(int argc, char **argv) {
|
|||
processKbd();
|
||||
|
||||
/* XXX: memory low check skipped */
|
||||
vm.vars[VAR_CAMERA_CUR_POS] = camera._curPos;
|
||||
vm.vars[VAR_HAVE_MSG] = _haveMsg;
|
||||
vm.vars[VAR_VIRT_MOUSE_X] = _virtual_mouse_x;
|
||||
vm.vars[VAR_VIRT_MOUSE_Y] = _virtual_mouse_y;
|
||||
vm.vars[VAR_MOUSE_X] = mouse.x;
|
||||
vm.vars[VAR_MOUSE_Y] = mouse.y;
|
||||
vm.vars[VAR_DEBUGMODE] = _debugMode;
|
||||
_vars[VAR_CAMERA_CUR_POS] = camera._curPos;
|
||||
_vars[VAR_HAVE_MSG] = _haveMsg;
|
||||
_vars[VAR_VIRT_MOUSE_X] = _virtual_mouse_x;
|
||||
_vars[VAR_VIRT_MOUSE_Y] = _virtual_mouse_y;
|
||||
_vars[VAR_MOUSE_X] = mouse.x;
|
||||
_vars[VAR_MOUSE_Y] = mouse.y;
|
||||
_vars[VAR_DEBUGMODE] = _debugMode;
|
||||
|
||||
if (_saveLoadFlag) {
|
||||
char buf[256];
|
||||
|
@ -288,13 +310,9 @@ void Scumm::scummMain(int argc, char **argv) {
|
|||
a->needRedraw = 1;
|
||||
}
|
||||
|
||||
checkHeap();
|
||||
runAllScripts();
|
||||
checkHeap();
|
||||
checkExecVerbs();
|
||||
checkHeap();
|
||||
checkAndRunVar33();
|
||||
checkHeap();
|
||||
|
||||
if (_currentRoom==0) {
|
||||
gdi.unk4 = 0;
|
||||
|
@ -305,38 +323,25 @@ void Scumm::scummMain(int argc, char **argv) {
|
|||
continue;
|
||||
}
|
||||
|
||||
checkHeap();
|
||||
walkActors();
|
||||
checkHeap();
|
||||
moveCamera();
|
||||
checkHeap();
|
||||
fixObjectFlags();
|
||||
checkHeap();
|
||||
CHARSET_1();
|
||||
checkHeap();
|
||||
if (camera._curPos != camera._lastPos || _BgNeedsRedraw || _fullRedraw) {
|
||||
redrawBGAreas();
|
||||
checkHeap();
|
||||
}
|
||||
processDrawQue();
|
||||
checkHeap();
|
||||
setActorRedrawFlags();
|
||||
checkHeap();
|
||||
resetActorBgs();
|
||||
checkHeap();
|
||||
|
||||
if (!(vm.vars[VAR_DRAWFLAGS]&2) && vm.vars[VAR_DRAWFLAGS]&4) {
|
||||
if (!(_vars[VAR_DRAWFLAGS]&2) && _vars[VAR_DRAWFLAGS]&4) {
|
||||
error("Flashlight not implemented in this version");
|
||||
}
|
||||
|
||||
processActors(); /* process actors makes the heap invalid */
|
||||
checkHeap();
|
||||
clear_fullRedraw();
|
||||
checkHeap();
|
||||
cyclePalette();
|
||||
checkHeap();
|
||||
palManipulate();
|
||||
checkHeap();
|
||||
|
||||
if (dseg_4F8A) {
|
||||
screenEffect(_newEffect);
|
||||
|
@ -352,7 +357,9 @@ void Scumm::scummMain(int argc, char **argv) {
|
|||
|
||||
unkVirtScreen2();
|
||||
|
||||
#if !defined(DOTT)
|
||||
playActorSounds();
|
||||
#endif
|
||||
unkSoundProc22();
|
||||
camera._lastPos = camera._curPos;
|
||||
} while (1);
|
||||
|
@ -420,7 +427,7 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
|||
int i;
|
||||
Actor *at;
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
|
||||
clearMsgQueue();
|
||||
|
||||
|
@ -439,7 +446,7 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
|||
}
|
||||
}
|
||||
|
||||
vm.vars[VAR_NEW_ROOM] = room;
|
||||
_vars[VAR_NEW_ROOM] = room;
|
||||
runExitScript();
|
||||
killScriptsAndResources();
|
||||
stopCycle(0);
|
||||
|
@ -454,7 +461,7 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
|||
|
||||
clearDrawObjectQueue();
|
||||
|
||||
vm.vars[VAR_ROOM] = room;
|
||||
_vars[VAR_ROOM] = room;
|
||||
_fullRedraw = 1;
|
||||
|
||||
_roomResource = _currentRoom = 0xFF;
|
||||
|
@ -462,14 +469,14 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
|||
unkResourceProc();
|
||||
|
||||
_currentRoom = room;
|
||||
vm.vars[VAR_ROOM] = room;
|
||||
_vars[VAR_ROOM] = room;
|
||||
|
||||
if (room >= 0x80)
|
||||
_roomResource = _resourceMapper[room&0x7F];
|
||||
else
|
||||
_roomResource = room;
|
||||
|
||||
vm.vars[VAR_ROOM_RESOURCE] = _roomResource;
|
||||
_vars[VAR_ROOM_RESOURCE] = _roomResource;
|
||||
|
||||
if (room!=0)
|
||||
ensureResourceLoaded(1, room);
|
||||
|
@ -490,8 +497,8 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
|||
if (_roomResource == 0)
|
||||
return;
|
||||
|
||||
vm.vars[VAR_CAMERA_MAX] = (_scrWidthIn8Unit<<3) - 160;
|
||||
vm.vars[VAR_CAMERA_MIN] = 160;
|
||||
_vars[VAR_CAMERA_MAX] = (_scrWidthIn8Unit<<3) - 160;
|
||||
_vars[VAR_CAMERA_MIN] = 160;
|
||||
|
||||
memset(actorDrawBits, 0, sizeof(actorDrawBits));
|
||||
|
||||
|
@ -518,7 +525,7 @@ void Scumm::startScene(int room, Actor *a, int objectNr) {
|
|||
|
||||
dseg_4F8A = 1;
|
||||
|
||||
checkHeap();
|
||||
CHECK_HEAP
|
||||
}
|
||||
|
||||
void Scumm::initRoomSubBlocks() {
|
||||
|
@ -528,6 +535,8 @@ void Scumm::initRoomSubBlocks() {
|
|||
|
||||
_ENCD_offs = 0;
|
||||
_EXCD_offs = 0;
|
||||
_CLUT_offs = 0;
|
||||
_PALS_offs = 0;
|
||||
|
||||
nukeResource(0xE, 1);
|
||||
nukeResource(0xE, 2);
|
||||
|
@ -592,12 +601,12 @@ void Scumm::initRoomSubBlocks() {
|
|||
}
|
||||
}
|
||||
}
|
||||
memset(_localScriptList, 0, (0x100 - _numGlobalScriptsUsed) * 4);
|
||||
memset(_localScriptList, 0, (0x100 - _numGlobalScripts) * 4);
|
||||
|
||||
roomptr = getResourceAddress(1, _roomResource);
|
||||
ptr = findResource(MKID('LSCR'), roomptr);
|
||||
while (ptr) {
|
||||
_localScriptList[ptr[8] - _numGlobalScriptsUsed] = ptr - roomptr;
|
||||
_localScriptList[ptr[8] - _numGlobalScripts] = ptr - roomptr;
|
||||
|
||||
#ifdef DUMP_SCRIPTS
|
||||
do {
|
||||
|
@ -610,12 +619,24 @@ void Scumm::initRoomSubBlocks() {
|
|||
ptr = findResource(MKID('LSCR'), NULL);
|
||||
}
|
||||
|
||||
_CLUT_offs = findResource(MKID('CLUT'), roomptr) - roomptr;
|
||||
ptr = findResource(MKID('EPAL'), roomptr);
|
||||
if (ptr)
|
||||
_EPAL_offs = ptr - roomptr;
|
||||
|
||||
ptr = findResource(MKID('CLUT'), roomptr);
|
||||
if (ptr) {
|
||||
_CLUT_offs = ptr - roomptr;
|
||||
setPaletteFromRes();
|
||||
}
|
||||
|
||||
#if defined(DOTT)
|
||||
ptr = findResource(MKID('PALS'), roomptr);
|
||||
if (ptr) {
|
||||
_PALS_offs = ptr - roomptr;
|
||||
setPalette(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
initCycl(findResource(MKID('CYCL'), roomptr) + 8);
|
||||
|
||||
ptr = findResource(MKID('TRNS'), roomptr);
|
||||
|
@ -652,10 +673,9 @@ void Scumm::dumpResource(char *tag, int index, byte *ptr) {
|
|||
char buf[256];
|
||||
FILE *out;
|
||||
|
||||
|
||||
uint32 size = READ_BE_UINT32_UNALIGNED(ptr+4);
|
||||
|
||||
sprintf(buf, "f:\\descumm\\%s%d.dmp", tag,index);
|
||||
sprintf(buf, "dumps\\%s%d.dmp", tag,index);
|
||||
|
||||
out = fopen(buf,"rb");
|
||||
if (!out) {
|
||||
|
@ -699,7 +719,13 @@ void Scumm::unkRoomFunc2(int a, int b, int c, int d, int e) {
|
|||
}
|
||||
|
||||
if (_videoMode==0x13) {
|
||||
cptr = getResourceAddress(1, _roomResource) + _CLUT_offs + 8 + a*3;
|
||||
cptr = getResourceAddress(1, _roomResource);
|
||||
if (_CLUT_offs) {
|
||||
cptr += _CLUT_offs;
|
||||
} else {
|
||||
cptr = findPalInPals(cptr + _PALS_offs, _curPalIndex);
|
||||
}
|
||||
cptr += 8 + a*3;
|
||||
cur = _currentPalette + a*3;
|
||||
if (a <= b) {
|
||||
num = b - a + 1;
|
||||
|
@ -764,19 +790,19 @@ void Scumm::processKbd() {
|
|||
if (!_lastKeyHit)
|
||||
return;
|
||||
|
||||
if (_lastKeyHit==vm.vars[VAR_RESTART_KEY]) {
|
||||
if (_lastKeyHit==_vars[VAR_RESTART_KEY]) {
|
||||
warning("Restart not implemented");
|
||||
pauseGame(1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_lastKeyHit==vm.vars[VAR_PAUSE_KEY]) {
|
||||
if (_lastKeyHit==_vars[VAR_PAUSE_KEY]) {
|
||||
warning("Pause not implemented");
|
||||
/* pause */
|
||||
return;
|
||||
}
|
||||
|
||||
if (_lastKeyHit==vm.vars[VAR_CUTSCENEEXIT_KEY]) {
|
||||
if (_lastKeyHit==_vars[VAR_CUTSCENEEXIT_KEY]) {
|
||||
uint32 offs = vm.cutScenePtr[vm.cutSceneStackPointer];
|
||||
if (offs) {
|
||||
ScriptSlot *ss = &vm.slot[vm.cutSceneScript[vm.cutSceneStackPointer]];
|
||||
|
@ -784,12 +810,12 @@ void Scumm::processKbd() {
|
|||
ss->status = 2;
|
||||
ss->freezeCount = 0;
|
||||
ss->cutsceneOverride--;
|
||||
vm.vars[VAR_OVERRIDE] = 1;
|
||||
_vars[VAR_OVERRIDE] = 1;
|
||||
vm.cutScenePtr[vm.cutSceneStackPointer] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (_lastKeyHit==vm.vars[VAR_TALKSTOP_KEY]) {
|
||||
if (_lastKeyHit==_vars[VAR_TALKSTOP_KEY]) {
|
||||
_talkDelay = 0;
|
||||
return;
|
||||
}
|
||||
|
@ -811,7 +837,7 @@ int Scumm::getKeyInput(int a) {
|
|||
|
||||
if (_leftBtnPressed&1 && _rightBtnPressed&1) {
|
||||
_mouseButStat = 0;
|
||||
_lastKeyHit = vm.vars[VAR_CUTSCENEEXIT_KEY];
|
||||
_lastKeyHit = _vars[VAR_CUTSCENEEXIT_KEY];
|
||||
} else if (_leftBtnPressed&1) {
|
||||
_mouseButStat = 0x8000;
|
||||
} else if (_rightBtnPressed&1) {
|
||||
|
@ -842,6 +868,51 @@ Actor *Scumm::derefActorSafe(int id, const char *errmsg) {
|
|||
return derefActor(id);
|
||||
}
|
||||
|
||||
#if defined(DOTT)
|
||||
void Scumm::new_unk_1(int a) {
|
||||
error("stub new_unk_1(%d)", a);
|
||||
}
|
||||
|
||||
void Scumm::setCursorHotspot2(int x,int y) {
|
||||
warning("stub setCursorHotspot2(%d,%d)", x,y);
|
||||
}
|
||||
|
||||
void Scumm::setStringVars(int slot) {
|
||||
string[slot].xpos = string[slot].t_xpos;
|
||||
string[slot].ypos = string[slot].t_ypos;
|
||||
string[slot].center = string[slot].t_center;
|
||||
string[slot].overhead = string[slot].t_overhead;
|
||||
string[slot].new_3 = string[slot].t_new3;
|
||||
string[slot].right = string[slot].t_right;
|
||||
string[slot].color = string[slot].t_color;
|
||||
string[slot].charset = string[slot].t_charset;
|
||||
}
|
||||
|
||||
void Scumm::arrayop_1(int a, byte *ptr) {
|
||||
ArrayHeader *ah;
|
||||
int r;
|
||||
int len = getStringLen(ptr);
|
||||
|
||||
r = defineArray(a, 4, 0, len);
|
||||
ah = (ArrayHeader*)getResourceAddress(7,r);
|
||||
copyString(ah->data,ptr,len);
|
||||
}
|
||||
|
||||
|
||||
void Scumm::unkMiscOp4(int a, int b, int c, int d) {
|
||||
warning("stub unkMiscOp4(%d,%d,%d,%d)", a,b,c,d);
|
||||
}
|
||||
|
||||
void Scumm::unkMiscOp9() {
|
||||
warning("stub unkMiscOp9()");
|
||||
}
|
||||
|
||||
void Scumm::startManiac() {
|
||||
warning("stub startManiac()");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
extern Scumm scumm;
|
||||
|
||||
void NORETURN CDECL error(const char *s, ...) {
|
||||
|
@ -886,11 +957,8 @@ void CDECL debug(int level, const char *s, ...) {
|
|||
}
|
||||
|
||||
void checkHeap() {
|
||||
#if 1
|
||||
|
||||
//if (_heapchk() != _HEAPOK) {
|
||||
// error("Heap is invalid!");
|
||||
// }
|
||||
#endif
|
||||
if (_heapchk() != _HEAPOK) {
|
||||
error("Heap is invalid!");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
10
scummvm.dsp
10
scummvm.dsp
|
@ -66,7 +66,7 @@ LINK32=link.exe
|
|||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "CHECK_HEAP" /Yu"stdafx.h" /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x41d /d "_DEBUG"
|
||||
# ADD RSC /l 0x41d /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
|
@ -119,6 +119,14 @@ SOURCE=.\script.cpp
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\script_v1.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\script_v2.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\scummvm.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
|
6
sdl.cpp
6
sdl.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.8 2001/10/16 10:01:48 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.7 2001/10/11 11:49:51 strigeus
|
||||
* Determine caption from file name.
|
||||
*
|
||||
|
@ -328,14 +331,13 @@ void initGraphics(Scumm *s) {
|
|||
screen = SDL_SetVideoMode(640, 400, 8, SDL_SWSURFACE);
|
||||
#endif
|
||||
|
||||
printf("%d %d, %d %d, %d %d %d, %d %d %d %d %d %d\n",
|
||||
printf("%d %d, %d %d, %d %d %d, %d %d %d %d %d\n",
|
||||
sizeof(int8), sizeof(uint8),
|
||||
sizeof(int16), sizeof(uint16),
|
||||
sizeof(int32), sizeof(uint32),
|
||||
sizeof(void*),
|
||||
sizeof(Box), sizeof(MouseCursor),sizeof(CodeHeader),
|
||||
sizeof(ImageHeader),
|
||||
&((CodeHeader*)0)->unk4,
|
||||
sizeof(Scumm)
|
||||
);
|
||||
|
||||
|
|
35
sound.cpp
35
sound.cpp
|
@ -17,8 +17,12 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.1 2001/10/09 14:30:13 strigeus
|
||||
* Initial revision
|
||||
* Revision 1.2 2001/10/16 10:01:48 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.1.1.1 2001/10/09 14:30:13 strigeus
|
||||
*
|
||||
* initial revision
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
@ -27,7 +31,7 @@
|
|||
#include "scumm.h"
|
||||
|
||||
void Scumm::addSoundToQueue(int sound) {
|
||||
vm.vars[VAR_LAST_SOUND] = sound;
|
||||
_vars[VAR_LAST_SOUND] = sound;
|
||||
ensureResourceLoaded(4, sound);
|
||||
addSoundToQueue2(sound);
|
||||
}
|
||||
|
@ -71,16 +75,35 @@ void Scumm::unkSoundProc22() {
|
|||
void Scumm::playSound(int sound) {
|
||||
getResourceAddress(4, sound);
|
||||
/* XXX: not implemented */
|
||||
warning("stub playSound(%d)", sound);
|
||||
// warning("stub playSound(%d)", sound);
|
||||
}
|
||||
|
||||
int Scumm::unkSoundProc23(int a) {
|
||||
/* TODO: implement this */
|
||||
warning("unkSoundProc23: not implemented");
|
||||
// warning("unkSoundProc23: not implemented");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Scumm::unkSoundProc1(int a) {
|
||||
/* TODO: implement this */
|
||||
warning("unkSoundProc: not implemented");
|
||||
// warning("unkSoundProc: not implemented");
|
||||
}
|
||||
|
||||
void Scumm::soundKludge(int16 *list) {
|
||||
int16 *ptr;
|
||||
int i;
|
||||
|
||||
if (list[0]==-1) {
|
||||
unkSoundProc22();
|
||||
return;
|
||||
}
|
||||
_soundQue[_soundQuePos++] = 8;
|
||||
|
||||
ptr = _soundQue + _soundQuePos;
|
||||
_soundQuePos += 8;
|
||||
|
||||
for (i=0; i<8; i++)
|
||||
*ptr++ = list[i];
|
||||
if (_soundQuePos > 0x100)
|
||||
error("Sound que buffer overflow");
|
||||
}
|
236
string.cpp
236
string.cpp
|
@ -17,8 +17,12 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.1 2001/10/09 14:30:13 strigeus
|
||||
* Initial revision
|
||||
* Revision 1.2 2001/10/16 10:01:48 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.1.1.1 2001/10/09 14:30:13 strigeus
|
||||
*
|
||||
* initial revision
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
@ -51,8 +55,18 @@ int CharsetRenderer::getStringWidth(int arg, byte *text, int pos) {
|
|||
text[pos++] = '@';
|
||||
continue;
|
||||
}
|
||||
if (chr==1 || chr==2)
|
||||
if (chr==10 || chr==21 || chr==12 || chr==13) {
|
||||
pos += 2;
|
||||
continue;
|
||||
}
|
||||
if (chr==9 || chr==1 || chr==2)
|
||||
break;
|
||||
if (chr==14) {
|
||||
int set = text[pos] | (text[pos+1]<<8);
|
||||
pos+=2;
|
||||
ptr = _vm->getResourceAddress(6, set) + 29;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
offs = READ_LE_UINT32(ptr + chr*4 + 4);
|
||||
|
@ -94,12 +108,22 @@ void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth) {
|
|||
}
|
||||
continue;
|
||||
}
|
||||
if (chr==10 || chr==21 || chr==12 || chr==13) {
|
||||
pos += 2;
|
||||
continue;
|
||||
}
|
||||
if (chr==1) {
|
||||
curw = 1;
|
||||
continue;
|
||||
}
|
||||
if (chr==2)
|
||||
break;
|
||||
if (chr==14) {
|
||||
int set = str[pos] | (str[pos+1]<<8);
|
||||
pos+=2;
|
||||
ptr = _vm->getResourceAddress(6, set) + 29;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (chr==' ')
|
||||
|
@ -137,11 +161,10 @@ void Scumm::unkMessage2() {
|
|||
_msgPtrToAdd = buf;
|
||||
tmp = _messagePtr = addMessageToStack(_messagePtr);
|
||||
|
||||
if (_stringColor[3]==0)
|
||||
_stringColor[3] = 4;
|
||||
if (string[3].color==0)
|
||||
string[3].color = 4;
|
||||
|
||||
error("unkMessage2: call to printScummMessage(%s)", buf);
|
||||
vm.vars[0] = 0;
|
||||
_messagePtr = tmp;
|
||||
}
|
||||
|
||||
|
@ -156,37 +179,52 @@ void Scumm::CHARSET_1() {
|
|||
) return;
|
||||
|
||||
a = NULL;
|
||||
if (vm.vars[VAR_TALK_ACTOR] != 0xFF)
|
||||
a = derefActorSafe(vm.vars[VAR_TALK_ACTOR], "CHARSET_1");
|
||||
if (_vars[VAR_TALK_ACTOR] != 0xFF)
|
||||
a = derefActorSafe(_vars[VAR_TALK_ACTOR], "CHARSET_1");
|
||||
|
||||
if (a && _stringOverhead[0]!=0) {
|
||||
_stringXpos[0] = a->x - camera._curPos + 160;
|
||||
#if !defined(DOTT)
|
||||
if (a && string[0].overhead!=0) {
|
||||
string[0].xpos = a->x - camera._curPos + 160;
|
||||
|
||||
if (vm.vars[VAR_TALK_STRING_Y] < 0) {
|
||||
s = (a->scaley * (int)vm.vars[VAR_TALK_STRING_Y]) / 0xFF;
|
||||
_stringYpos[0] = ((vm.vars[VAR_TALK_STRING_Y]-s)>>1) + s - a->elevation + a->y;
|
||||
if (_vars[VAR_TALK_STRING_Y] < 0) {
|
||||
s = (a->scaley * (int)_vars[VAR_TALK_STRING_Y]) / 0xFF;
|
||||
string[0].ypos = ((_vars[VAR_TALK_STRING_Y]-s)>>1) + s - a->elevation + a->y;
|
||||
} else {
|
||||
_stringYpos[0] = vm.vars[VAR_TALK_STRING_Y];
|
||||
string[0].ypos = _vars[VAR_TALK_STRING_Y];
|
||||
}
|
||||
if (_stringYpos[0] < 1)
|
||||
_stringYpos[0] = 1;
|
||||
if (string[0].ypos < 1)
|
||||
string[0].ypos = 1;
|
||||
|
||||
if (_stringXpos[0] < 80)
|
||||
_stringXpos[0] = 80;
|
||||
if (_stringXpos[0] > 240)
|
||||
_stringXpos[0] = 240;
|
||||
if (string[0].xpos < 80)
|
||||
string[0].xpos = 80;
|
||||
if (string[0].xpos > 240)
|
||||
string[0].xpos = 240;
|
||||
}
|
||||
#else
|
||||
if (a && string[0].overhead!=0) {
|
||||
s = a->scaley * a->new_1 / 0xFF;
|
||||
string[0].ypos = ((a->new_1 - s)>>1) + s - a->elevation + a->y;
|
||||
if (string[0].ypos<1)
|
||||
string[0].ypos = 1;
|
||||
|
||||
charset._top = _stringYpos[0];
|
||||
charset._left = _stringXpos[0];
|
||||
charset._left2 = _stringXpos[0];
|
||||
charset._curId = _stringCharset[0];
|
||||
s = a->scalex * a->new_2 / 0xFF;
|
||||
string[0].xpos = ((a->new_2 - s)>>1) + s + a->x - camera._curPos + 160;
|
||||
if (string[0].xpos < 80)
|
||||
string[0].xpos = 80;
|
||||
if (string[0].xpos > 240)
|
||||
string[0].xpos = 240;
|
||||
}
|
||||
#endif
|
||||
charset._top = string[0].ypos;
|
||||
charset._left = string[0].xpos;
|
||||
charset._left2 = string[0].xpos;
|
||||
charset._curId = string[0].charset;
|
||||
|
||||
if (a && a->charset)
|
||||
charset._curId = a->charset;
|
||||
|
||||
charset._center = _stringCenter[0];
|
||||
charset._right = _stringRight[0];
|
||||
charset._center = string[0].center;
|
||||
charset._right = string[0].right;
|
||||
charset._color = _charsetColor;
|
||||
dseg_4E3C = 0;
|
||||
|
||||
|
@ -194,10 +232,10 @@ void Scumm::CHARSET_1() {
|
|||
charset._colorMap[i] = _charsetData[charset._curId][i];
|
||||
|
||||
if (_keepText) {
|
||||
charset._strLeft = charset._mask_left;
|
||||
charset._strRight = charset._mask_right;
|
||||
charset._strTop = charset._mask_top;
|
||||
charset._strBottom = charset._mask_bottom;
|
||||
charset._strLeft = string[0].mask_left;
|
||||
charset._strRight = string[0].mask_right;
|
||||
charset._strTop = string[0].mask_top;
|
||||
charset._strBottom = string[0].mask_bottom;
|
||||
}
|
||||
|
||||
if (!_haveMsg || _talkDelay)
|
||||
|
@ -216,21 +254,21 @@ void Scumm::CHARSET_1() {
|
|||
|
||||
if (!_keepText) {
|
||||
restoreCharsetBg();
|
||||
_stringXpos2[0] = _stringXpos[0];
|
||||
_stringYpos2[0] = _stringYpos[0];
|
||||
string[0].xpos2 = string[0].xpos;
|
||||
string[0].ypos2 = string[0].ypos;
|
||||
}
|
||||
|
||||
t = charset._right - _stringXpos2[0] - 1;
|
||||
t = charset._right - string[0].xpos - 1;
|
||||
if (charset._center) {
|
||||
if (t > _stringXpos2[0])
|
||||
t = _stringXpos2[0];
|
||||
if (t > string[0].xpos2)
|
||||
t = string[0].xpos2;
|
||||
t <<= 1;
|
||||
}
|
||||
charset.addLinebreaks(0, charset._buffer, charset._bufPos, t);
|
||||
|
||||
_lastXstart = virtscr[0].xstart;
|
||||
if (charset._center) {
|
||||
_stringXpos2[0] -= charset.getStringWidth(0, charset._buffer, charset._bufPos) >> 1;
|
||||
string[0].xpos2 -= charset.getStringWidth(0, charset._buffer, charset._bufPos) >> 1;
|
||||
}
|
||||
|
||||
charset._disableOffsX = charset._unk12 = !_keepText;
|
||||
|
@ -242,22 +280,30 @@ void Scumm::CHARSET_1() {
|
|||
_keepText = false;
|
||||
break;
|
||||
}
|
||||
if (c != 13) {
|
||||
if (c==0xFE)
|
||||
c=0xFF;
|
||||
if (c == 13) {
|
||||
newLine:;
|
||||
string[0].xpos2 = string[0].xpos;
|
||||
if (charset._center) {
|
||||
string[0].xpos2 -= charset.getStringWidth(0, charset._buffer, charset._bufPos)>>1;
|
||||
}
|
||||
string[0].ypos2 += getResourceAddress(6,charset._curId)[30];
|
||||
charset._disableOffsX = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c==0xFE) c=0xFF;
|
||||
|
||||
if (c!=0xFF) {
|
||||
PrintChar:;
|
||||
charset._left = _stringXpos2[0];
|
||||
charset._top = _stringYpos2[0];
|
||||
charset._left = string[0].xpos2;
|
||||
charset._top = string[0].ypos2;
|
||||
|
||||
if (!vm.vars[VAR_CHARFLAG]) {
|
||||
if (!_vars[VAR_CHARFLAG]) {
|
||||
charset.printChar(c);
|
||||
}
|
||||
_stringXpos2[0] = charset._left;
|
||||
_stringYpos2[0] = charset._top;
|
||||
string[0].xpos2 = charset._left;
|
||||
string[0].ypos2 = charset._top;
|
||||
|
||||
_talkDelay += vm.vars[VAR_CHARINC];
|
||||
_talkDelay += _vars[VAR_CHARINC];
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -266,34 +312,47 @@ PrintChar:;
|
|||
_haveMsg = 0xFF;
|
||||
_keepText = false;
|
||||
break;
|
||||
}
|
||||
if (c!=1) {
|
||||
if (c==2) {
|
||||
} else if (c==1) {
|
||||
goto newLine;
|
||||
} else if (c==2) {
|
||||
_haveMsg = 0;
|
||||
_keepText = true;
|
||||
break;
|
||||
}
|
||||
if (c==9) {
|
||||
} else if (c==9) {
|
||||
frme = charset._buffer[charset._bufPos++];
|
||||
frme |= charset._buffer[charset._bufPos++]<<8;
|
||||
if (a)
|
||||
startAnimActor(a, frme, a->facing);
|
||||
} else if (c==10) {
|
||||
warning("CHARSET_1: code 10 unimplemented");
|
||||
charset._bufPos += 14;
|
||||
} else if (c==14) {
|
||||
int oldy = getResourceAddress(6,charset._curId)[30];
|
||||
|
||||
charset._curId = charset._buffer[charset._bufPos];
|
||||
charset._bufPos += 2;
|
||||
for (i=0; i<4; i++)
|
||||
charset._colorMap[i] = _charsetData[charset._curId][i];
|
||||
string[0].ypos2 -= getResourceAddress(6,charset._curId)[30] - oldy;
|
||||
} else if (c==12) {
|
||||
int color;
|
||||
color = charset._buffer[charset._bufPos++];
|
||||
color |= charset._buffer[charset._bufPos++]<<8;
|
||||
if (color==0xFF)
|
||||
charset._color = _charsetColor;
|
||||
else
|
||||
charset._color = color;
|
||||
} else if (c==13) {
|
||||
charset._bufPos += 2;
|
||||
} else {
|
||||
warning("CHARSET_1: invalid code %d", c);
|
||||
}
|
||||
goto PrintChar;
|
||||
}
|
||||
}
|
||||
_stringXpos2[0] = _stringXpos[0];
|
||||
if (charset._center) {
|
||||
_stringXpos2[0] -= charset.getStringWidth(0, charset._buffer, charset._bufPos)>>1;
|
||||
}
|
||||
_stringYpos2[0] += getResourceAddress(6,charset._curId)[30];
|
||||
charset._disableOffsX = 1;
|
||||
} while (1);
|
||||
|
||||
charset._mask_left = charset._strLeft;
|
||||
charset._mask_right = charset._strRight;
|
||||
charset._mask_top = charset._strTop;
|
||||
charset._mask_bottom = charset._strBottom;
|
||||
string[0].mask_left = charset._strLeft;
|
||||
string[0].mask_right = charset._strRight;
|
||||
string[0].mask_top = charset._strTop;
|
||||
string[0].mask_bottom = charset._strBottom;
|
||||
}
|
||||
|
||||
void Scumm::drawString(int a) {
|
||||
|
@ -305,12 +364,12 @@ void Scumm::drawString(int a) {
|
|||
_msgPtrToAdd = buf;
|
||||
_messagePtr = addMessageToStack(_messagePtr);
|
||||
|
||||
charset._left2 = charset._left = _stringXpos[a];
|
||||
charset._top = _stringYpos[a];
|
||||
charset._curId = _stringCharset[a];
|
||||
charset._center = _stringCenter[a];
|
||||
charset._right = _stringRight[a];
|
||||
charset._color = _stringColor[a];
|
||||
charset._left2 = charset._left = string[a].xpos;
|
||||
charset._top = string[a].ypos;
|
||||
charset._curId = string[a].charset;
|
||||
charset._center = string[a].center;
|
||||
charset._right = string[a].right;
|
||||
charset._color = string[a].color;
|
||||
dseg_4E3C = 0;
|
||||
charset._unk12 = 1;
|
||||
charset._disableOffsX = 1;
|
||||
|
@ -371,8 +430,8 @@ void Scumm::drawString(int a) {
|
|||
}
|
||||
|
||||
charset._ignoreCharsetMask = 0;
|
||||
_stringXpos2[a] = charset._left;
|
||||
_stringYpos2[a] = charset._top;
|
||||
string[a].xpos2 = charset._left;
|
||||
string[a].ypos2 = charset._top;
|
||||
}
|
||||
|
||||
byte *Scumm::addMessageToStack(byte *msg) {
|
||||
|
@ -394,7 +453,7 @@ byte *Scumm::addMessageToStack(byte *msg) {
|
|||
if (chr==255) {
|
||||
ptr[num++] = chr = *msg++;
|
||||
|
||||
if (chr==0 || chr!=2 && chr!=3 && chr!=8) {
|
||||
if (chr!=1 && chr!=2 && chr!=3 && chr!=8) {
|
||||
ptr[num++] = chr = *msg++;
|
||||
ptr[num++] = chr = *msg++;
|
||||
}
|
||||
|
@ -411,38 +470,32 @@ byte *Scumm::addMessageToStack(byte *msg) {
|
|||
if (chr == 0)
|
||||
break;
|
||||
if (chr == 0xFF) {
|
||||
ptr = getResourceAddress(0xC, 6);
|
||||
chr = ptr[num++];
|
||||
switch(chr) {
|
||||
case 4:
|
||||
unkAddMsgToStack2(
|
||||
READ_LE_UINT16(getResourceAddress(0xC, 6)+ num)
|
||||
);
|
||||
unkAddMsgToStack2(READ_LE_UINT16(ptr + num));
|
||||
num+=2;
|
||||
break;
|
||||
case 5:
|
||||
unkAddMsgToStack3(
|
||||
READ_LE_UINT16(getResourceAddress(0xC, 6)+ num)
|
||||
);
|
||||
unkAddMsgToStack3(READ_LE_UINT16(ptr + num));
|
||||
num+=2;
|
||||
break;
|
||||
case 6:
|
||||
unkAddMsgToStack4(
|
||||
READ_LE_UINT16(getResourceAddress(0xC, 6)+ num)
|
||||
);
|
||||
unkAddMsgToStack4(READ_LE_UINT16(ptr + num));
|
||||
num+=2;
|
||||
break;
|
||||
case 7:
|
||||
unkAddMsgToStack5(
|
||||
READ_LE_UINT16(getResourceAddress(0xC, 6)+num)
|
||||
);
|
||||
unkAddMsgToStack5(READ_LE_UINT16(ptr + num));
|
||||
num+=2;
|
||||
break;
|
||||
case 9:
|
||||
#if defined(DOTT)
|
||||
case 10: case 12: case 13: case 14:
|
||||
#endif
|
||||
*_msgPtrToAdd++ = 0xFF;
|
||||
*_msgPtrToAdd++ = chr;
|
||||
*_msgPtrToAdd++ = getResourceAddress(0xC, 6)[num++];
|
||||
*_msgPtrToAdd++ = getResourceAddress(0xC, 6)[num++];
|
||||
*_msgPtrToAdd++ = ptr[num++];
|
||||
*_msgPtrToAdd++ = ptr[num++];
|
||||
break;
|
||||
default:
|
||||
*_msgPtrToAdd++ = 0xFF;
|
||||
|
@ -489,7 +542,7 @@ void Scumm::unkAddMsgToStack3(int var) {
|
|||
num = readVar(var);
|
||||
if (num) {
|
||||
for (i=1; i<_maxVerbs; i++) {
|
||||
if (num==verbs[i].verbid && !verbs[i].type && !verbs[i].saveid) {
|
||||
if (num==_verbs[i].verbid && !_verbs[i].type && !_verbs[i].saveid) {
|
||||
addMessageToStack(getResourceAddress(8, i));
|
||||
break;
|
||||
}
|
||||
|
@ -528,8 +581,8 @@ void Scumm::initCharset(int charsetno) {
|
|||
if (!getResourceAddress(6, charsetno))
|
||||
loadCharset(charsetno);
|
||||
|
||||
textslot.charset[0] = charsetno;
|
||||
textslot.charset[1] = charsetno;
|
||||
string[0].t_charset = charsetno;
|
||||
string[1].t_charset = charsetno;
|
||||
|
||||
for (i=0; i<0x10; i++)
|
||||
charset._colorMap[i] = _charsetData[charsetno][i];
|
||||
|
@ -615,6 +668,7 @@ void CharsetRenderer::printChar(int chr) {
|
|||
_strTop = _top;
|
||||
|
||||
_drawTop = _top - vs->topline;
|
||||
|
||||
_bottom = _drawTop + _height + _offsY;
|
||||
|
||||
_vm->updateDirtyRect(_vm->gdi.virtScreen, _left, right, _drawTop, _bottom, 0);
|
||||
|
|
43
verbs.cpp
43
verbs.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.3 2001/10/16 10:01:48 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.2 2001/10/09 19:02:28 strigeus
|
||||
* command line parameter support
|
||||
*
|
||||
|
@ -46,7 +49,7 @@ void Scumm::checkExecVerbs() {
|
|||
|
||||
if (_mouseButStat < 0x200) {
|
||||
/* Check keypresses */
|
||||
vs = &verbs[1];
|
||||
vs = &_verbs[1];
|
||||
for (i=1; i<_maxVerbs; i++,vs++) {
|
||||
if (vs->verbid && vs->saveid && vs->curmode==1) {
|
||||
if (_mouseButStat == vs->key) {
|
||||
|
@ -61,13 +64,13 @@ void Scumm::checkExecVerbs() {
|
|||
if (mouse.y >= virtscr[0].topline && mouse.y < virtscr[0].topline + virtscr[0].height) {
|
||||
over = checkMouseOver(mouse.x, mouse.y);
|
||||
if (over != 0) {
|
||||
runInputScript(1,verbs[over].verbid,code);
|
||||
runInputScript(1,_verbs[over].verbid,code);
|
||||
return;
|
||||
}
|
||||
runInputScript(2, 0, code);
|
||||
} else {
|
||||
over=checkMouseOver(mouse.x, mouse.y);
|
||||
runInputScript(1, over!=0 ? verbs[over].verbid : 0, code);
|
||||
runInputScript(1, over!=0 ? _verbs[over].verbid : 0, code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -76,12 +79,12 @@ void Scumm::verbMouseOver(int verb) {
|
|||
if (_verbMouseOver==verb)
|
||||
return;
|
||||
|
||||
if (verbs[_verbMouseOver].type!=1) {
|
||||
if (_verbs[_verbMouseOver].type!=1) {
|
||||
drawVerb(_verbMouseOver, 0);
|
||||
_verbMouseOver = verb;
|
||||
}
|
||||
|
||||
if (verbs[verb].type!=1 && verbs[verb].hicolor) {
|
||||
if (_verbs[verb].type!=1 && _verbs[verb].hicolor) {
|
||||
drawVerb(verb, 1);
|
||||
_verbMouseOver = verb;
|
||||
}
|
||||
|
@ -89,9 +92,9 @@ void Scumm::verbMouseOver(int verb) {
|
|||
|
||||
int Scumm::checkMouseOver(int x, int y) {
|
||||
VerbSlot *vs;
|
||||
int i = _maxVerbs;
|
||||
int i = _maxVerbs-1;
|
||||
|
||||
vs = &verbs[i];
|
||||
vs = &_verbs[i];
|
||||
do {
|
||||
if (vs->curmode!=1 || !vs->verbid || vs->saveid ||
|
||||
y < vs->y || y >= vs->bottom)
|
||||
|
@ -104,7 +107,7 @@ int Scumm::checkMouseOver(int x, int y) {
|
|||
continue;
|
||||
}
|
||||
return i;
|
||||
} while (--vs, i--);
|
||||
} while (--vs,--i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -116,7 +119,7 @@ void Scumm::drawVerb(int vrb, int mode) {
|
|||
if (!vrb)
|
||||
return;
|
||||
|
||||
vs = &verbs[vrb];
|
||||
vs = &_verbs[vrb];
|
||||
|
||||
if (!vs->saveid && vs->curmode && vs->verbid) {
|
||||
if (vs->type==1) {
|
||||
|
@ -125,18 +128,18 @@ void Scumm::drawVerb(int vrb, int mode) {
|
|||
}
|
||||
restoreVerbBG(vrb);
|
||||
|
||||
_stringCharset[4] = vs->charset_nr;
|
||||
_stringXpos[4] = vs->x;
|
||||
_stringYpos[4] = vs->y;
|
||||
_stringRight[4] = 319;
|
||||
_stringCenter[4] = vs->center;
|
||||
string[4].charset = vs->charset_nr;
|
||||
string[4].xpos = vs->x;
|
||||
string[4].ypos = vs->y;
|
||||
string[4].right = 319;
|
||||
string[4].center = vs->center;
|
||||
if (mode && vs->hicolor)
|
||||
color = vs->hicolor;
|
||||
else
|
||||
color = vs->color;
|
||||
_stringColor[4] = color;
|
||||
string[4].color = color;
|
||||
if (vs->curmode==2)
|
||||
_stringColor[4] = vs->dimcolor;
|
||||
string[4].color = vs->dimcolor;
|
||||
_messagePtr = getResourceAddress(8, vrb);
|
||||
assert(_messagePtr);
|
||||
tmp = charset._center;
|
||||
|
@ -158,7 +161,7 @@ void Scumm::drawVerb(int vrb, int mode) {
|
|||
void Scumm::restoreVerbBG(int verb) {
|
||||
VerbSlot *vs;
|
||||
|
||||
vs = &verbs[verb];
|
||||
vs = &_verbs[verb];
|
||||
|
||||
if (vs->oldleft != -1) {
|
||||
dseg_4E3C = vs->bkcolor;
|
||||
|
@ -210,7 +213,7 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y) {
|
|||
}
|
||||
}
|
||||
|
||||
vst = &verbs[vrb];
|
||||
vst = &_verbs[vrb];
|
||||
vst->right = vst->x + imgw*8;
|
||||
vst->bottom = vst->y + imgh*8;
|
||||
vst->oldleft = vst->x;
|
||||
|
@ -225,7 +228,7 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y) {
|
|||
int Scumm::getVerbSlot(int id, int mode) {
|
||||
int i;
|
||||
for (i=1; i<_maxVerbs; i++) {
|
||||
if (verbs[i].verbid == id && verbs[i].saveid == mode) {
|
||||
if (_verbs[i].verbid == id && _verbs[i].saveid == mode) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
@ -238,7 +241,7 @@ void Scumm::killVerb(int slot) {
|
|||
if (slot==0)
|
||||
return;
|
||||
|
||||
vs = &verbs[slot];
|
||||
vs = &_verbs[slot];
|
||||
vs->verbid = 0;
|
||||
vs->curmode = 0;
|
||||
|
||||
|
|
37
windows.cpp
37
windows.cpp
|
@ -17,6 +17,9 @@
|
|||
*
|
||||
* Change Log:
|
||||
* $Log$
|
||||
* Revision 1.5 2001/10/16 10:01:48 strigeus
|
||||
* preliminary DOTT support
|
||||
*
|
||||
* Revision 1.4 2001/10/12 07:24:06 strigeus
|
||||
* fast mode support
|
||||
*
|
||||
|
@ -124,8 +127,7 @@ void Error(const char *msg) {
|
|||
int sel;
|
||||
Scumm scumm;
|
||||
WndMan wm[1];
|
||||
|
||||
|
||||
byte veryFastMode;
|
||||
|
||||
void modifyslot(int sel, int what);
|
||||
|
||||
|
@ -156,6 +158,10 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
|
|||
wm->_scumm->_fastMode ^= 1;
|
||||
}
|
||||
|
||||
if (wParam=='G') {
|
||||
veryFastMode ^= 1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
|
@ -711,7 +717,6 @@ int _declspec(naked) endpentiumtest() {
|
|||
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
void decompressMask(byte *d, byte *s) {
|
||||
int x,y;
|
||||
|
@ -732,12 +737,19 @@ void decompressMask(byte *d, byte *s) {
|
|||
|
||||
void outputdisplay2(Scumm *s, int disp) {
|
||||
byte *old = wm->_vgabuf;
|
||||
|
||||
byte buf[64000];
|
||||
|
||||
switch(disp) {
|
||||
case 0:
|
||||
wm->_vgabuf = s->getResourceAddress(0xA, 5);
|
||||
wm->_vgabuf = buf;
|
||||
memcpy(buf, wm->_vgabuf, 64000);
|
||||
memcpy(buf+320*144,s->getResourceAddress(0xA, 7),320*56);
|
||||
break;
|
||||
case 1:
|
||||
wm->_vgabuf = s->getResourceAddress(0xA, 1);
|
||||
wm->_vgabuf = buf;
|
||||
memcpy(buf, wm->_vgabuf, 64000);
|
||||
memcpy(buf+320*144,s->getResourceAddress(0xA, 3),320*56);
|
||||
break;
|
||||
case 2:
|
||||
wm->_vgabuf = NULL;
|
||||
|
@ -759,7 +771,7 @@ void outputdisplay2(Scumm *s, int disp) {
|
|||
wm->writeToScreen();
|
||||
wm->_vgabuf = old;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
void outputdisplay(Scumm *s) {
|
||||
|
@ -783,6 +795,8 @@ void blitToScreen(Scumm *s, byte *src,int x, int y, int w, int h) {
|
|||
|
||||
}
|
||||
|
||||
int clock;
|
||||
|
||||
void updateScreen(Scumm *s) {
|
||||
if (s->_palDirtyMax != -1) {
|
||||
wm->setPalette(s->_currentPalette, 0, 256);
|
||||
|
@ -792,8 +806,12 @@ void updateScreen(Scumm *s) {
|
|||
wm->writeToScreen();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void waitForTimer(Scumm *s) {
|
||||
Sleep(10);
|
||||
if (!veryFastMode) {
|
||||
Sleep(5);
|
||||
}
|
||||
s->_scummTimer+=2;
|
||||
wm->handleMessage();
|
||||
}
|
||||
|
@ -808,7 +826,12 @@ void drawMouse(Scumm *s, int, int, int, byte*, bool) {
|
|||
#undef main
|
||||
int main(int argc, char* argv[]) {
|
||||
scumm._videoMode = 0x13;
|
||||
|
||||
#if defined(DOTT)
|
||||
scumm._exe_name = "tentacle";
|
||||
#else
|
||||
scumm._exe_name = "monkey2";
|
||||
#endif
|
||||
|
||||
wm->init();
|
||||
wm->_vgabuf = (byte*)calloc(320,200);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue