aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Hamm2002-02-13 17:33:52 +0000
committerVincent Hamm2002-02-13 17:33:52 +0000
commitd9ddef19aa64e925ac3096f9981808a906331c68 (patch)
tree668c325075fc8474d53ae784ce3ab37883b73226
parentbb52e5c73ed7c0dc419365f81ae58162686499c6 (diff)
downloadscummvm-rg350-d9ddef19aa64e925ac3096f9981808a906331c68.tar.gz
scummvm-rg350-d9ddef19aa64e925ac3096f9981808a906331c68.tar.bz2
scummvm-rg350-d9ddef19aa64e925ac3096f9981808a906331c68.zip
a few fix for Zak256
svn-id: r3575
-rw-r--r--actor.cpp2
-rw-r--r--gfx.cpp4
-rw-r--r--object.cpp2
-rw-r--r--resource.cpp8
-rw-r--r--script_v1.cpp52
-rw-r--r--scumm.h9
-rw-r--r--string.cpp3
7 files changed, 59 insertions, 21 deletions
diff --git a/actor.cpp b/actor.cpp
index a4031ca914..dd075b1eea 100644
--- a/actor.cpp
+++ b/actor.cpp
@@ -322,7 +322,7 @@ void Scumm::setupActorScale(Actor *a) {
}
if (scale>255)
- error("Actor %d at %d, scale %d out of range", a->number, a->y, scale);
+ warning("Actor %d at %d, scale %d out of range", a->number, a->y, scale);
a->scalex = (byte)scale;
a->scaley = (byte)scale;
diff --git a/gfx.cpp b/gfx.cpp
index b6d8ba4ca8..159086b21f 100644
--- a/gfx.cpp
+++ b/gfx.cpp
@@ -1305,7 +1305,7 @@ void Gdi::unkDecode9() { /* FIXME: This one doesn't work.. */
for (i=0; i<((c&3)+1); i++) {
color = 0;
for (z=0; z < 4; z++) {READ_256BIT; color+=bits<<i;}
- *dst = (run * 16 + color);
+ *dst = (run *16 + color);
NEXT_ROW // y++; if (y>=height) {y=0; x++;}}
}
break;
@@ -1337,7 +1337,7 @@ void Gdi::unkDecode10() {
*dst = local_palette[color];
NEXT_ROW
} else {
- uint run = color - numcolors + 1;
+ uint run = color - numcolors +1;
color = *src++;
do {
*dst = color;
diff --git a/object.cpp b/object.cpp
index 1c98b7d811..ba8553d164 100644
--- a/object.cpp
+++ b/object.cpp
@@ -32,7 +32,7 @@ bool Scumm::getClass(int obj, int cls) {
}
void Scumm::putClass(int obj, int cls, bool set) {
- checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in getClass");
+ checkRange(_numGlobalObjects-1, 0, obj, "Object %d out of range in putClass");
cls &= 0x7F;
checkRange(32,1,cls,"Class %d out of range in getClass");
diff --git a/resource.cpp b/resource.cpp
index 8f68a3822a..35d52f65b0 100644
--- a/resource.cpp
+++ b/resource.cpp
@@ -416,11 +416,11 @@ void Scumm::readIndexFileSmall() {
num = fileReadWordLE();
assert(num == _numGlobalObjects);
for (i=0; i<num; i++) { /* not too sure about all that */
- _classData[i] = fileReadWordLE(); //+ fileReadByte();
- fileReadByte();
+ _classData[i] = fileReadByte() + 256*fileReadByte()+ 256*256*fileReadByte();
+ // fileReadByte();
_objectOwnerTable[i] = fileReadByte();
- _objectStateTable[i] = _objectOwnerTable[i]>>OF_STATE_SHL;
- _objectOwnerTable[i] &= OF_OWNER_MASK;
+ // _objectStateTable[i] = _objectOwnerTable[i]>>OF_STATE_SHL;
+ // _objectOwnerTable[i] &= OF_OWNER_MASK;
}
#if defined(SCUMM_BIG_ENDIAN)
diff --git a/script_v1.cpp b/script_v1.cpp
index 9eb93231c9..748b2f7d0c 100644
--- a/script_v1.cpp
+++ b/script_v1.cpp
@@ -126,7 +126,7 @@ void Scumm::setupOpcodes() {
&Scumm::o5_putActorAtObject,
&Scumm::o5_badOpcode,
/* 50 */
- &Scumm::o5_badOpcode,
+ &Scumm::o5_pickupObjectOld,
&Scumm::o5_animateActor,
&Scumm::o5_actorFollowCamera,
&Scumm::o5_actorSet,
@@ -286,7 +286,7 @@ void Scumm::setupOpcodes() {
&Scumm::o5_putActorAtObject,
&Scumm::o5_badOpcode,
/* D0 */
- &Scumm::o5_badOpcode,
+ &Scumm::o5_pickupObjectOld,
&Scumm::o5_animateActor,
&Scumm::o5_actorFollowCamera,
&Scumm::o5_actorSet,
@@ -373,6 +373,9 @@ void Scumm::o5_actorSet() {
_opcode = (_opcode&0xE0) | convertTable[(_opcode&0x1F)-1];
switch(_opcode&0x1F) {
+ case 0: /* dummy case */
+ getVarOrDirectByte(0x80);
+ break;
case 1: /* costume */
setActorCostume(a, getVarOrDirectByte(0x80));
break;
@@ -439,6 +442,8 @@ void Scumm::o5_actorSet() {
case 17: /* scale */
a->scalex = getVarOrDirectByte(0x80);
a->scaley = getVarOrDirectByte(0x40);
+ if(a->scalex>255 || a->scaley>255)
+ error("Setting an bad actor scale!");
a->needRedraw = true;
a->needBgReset = true;
break;
@@ -475,18 +480,18 @@ FixRoom:
void Scumm::o5_actorSetClass() {
int act = getVarOrDirectWord(0x80);
- int i;
+ int newClass;
while ( (_opcode=fetchScriptByte()) != 0xFF) {
- i = getVarOrDirectWord(0x80);
- if (i==0) {
+ newClass = getVarOrDirectWord(0x80);
+ if (newClass==0) {
_classData[act] = 0;
continue;
}
- if (i&0x80)
- putClass(act, i, 1);
+ if (newClass&0x80)
+ putClass(act, newClass, 1);
else
- putClass(act, i, 0);
+ putClass(act, newClass, 0);
}
}
@@ -582,8 +587,8 @@ void Scumm::o5_cursorCommand() {
case 10: /* set cursor img */
i = getVarOrDirectByte(0x80);
j = getVarOrDirectByte(0x40);
- if (!(_gameId==GID_LOOM256))
- setCursorImg(i, j, 1);
+ if(_gameId != GID_LOOM256)
+ setCursorImg(i, j, 1);
break;
case 11: /* set cursor hotspot */
i = getVarOrDirectByte(0x80);
@@ -1403,9 +1408,8 @@ void Scumm::o5_roomOps() {
a = getVarOrDirectWord(0x80);
b = getVarOrDirectWord(0x40);
checkRange(256, 0, a, "o5_roomOps: 2: Illegal room color slot (%d)");
- _currentPalette[a]=b;
+ _currentPalette[a]=b; /*FIXME: should be shadow palette */
_fullRedraw = 1;
- setDirtyColors(a,a);
} else {
a = getVarOrDirectWord(0x80);
b = getVarOrDirectWord(0x40);
@@ -1421,6 +1425,15 @@ void Scumm::o5_roomOps() {
case 6: /* shake off */
setShake(0);
break;
+ case 7: /* room scale for old games */
+ a = getVarOrDirectByte(0x80);
+ b = getVarOrDirectByte(0x40);
+ _opcode=fetchScriptByte();
+ c = getVarOrDirectByte(0x80);
+ d = getVarOrDirectByte(0x40);
+ _opcode=fetchScriptByte();
+ e = getVarOrDirectByte(0x40);
+ setScaleItem(e-1,b,a,d,c);
case 8: /* room scale? */
a = getVarOrDirectByte(0x80);
b = getVarOrDirectByte(0x40);
@@ -2076,3 +2089,18 @@ void Scumm::o5_oldRoomEffect() {
}
warning("Unsupported oldRoomEffect");
}
+
+void Scumm::o5_pickupObjectOld() {
+
+ int obj;
+
+ obj = getVarOrDirectByte(0x80);
+
+ if(getObjectIndex(obj) != 1)
+ return;
+
+
+
+ warning("Unsupported pickupObjectOld");
+
+}
diff --git a/scumm.h b/scumm.h
index e7ba674491..6d934b9fce 100644
--- a/scumm.h
+++ b/scumm.h
@@ -302,11 +302,17 @@ enum ScummVars {
VAR_HAVE_MSG = 3,
VAR_ROOM = 4,
VAR_OVERRIDE = 5,
+ VAR_MACHINE_SPEED = 6,
+ VAR_ME = 7,
VAR_NUM_ACTOR = 8,
+ VAR_CURRENT_LIGHTS = 9,
VAR_CURRENTDRIVE = 10,
VAR_TMR_1 = 11,
VAR_TMR_2 = 12,
VAR_TMR_3 = 13,
+ VAR_MUSIC_FLAG = 14,
+ VAR_ACTOR_RANGE_MIN = 15,
+ VAR_ACTOR_RANGE_MAX = 16,
VAR_CAMERA_MIN_X = 17,
VAR_CAMERA_MAX_X = 18,
VAR_TIMER_NEXT = 19,
@@ -1503,7 +1509,8 @@ struct Scumm {
void o5_walkActorToActor();
void o5_walkActorToObject();
void o5_oldRoomEffect();
-
+ void o5_pickupObjectOld();
+
void o6_pushByte();
void o6_pushWord();
void o6_pushByteVar();
diff --git a/string.cpp b/string.cpp
index 99574cc054..8b622f1ba8 100644
--- a/string.cpp
+++ b/string.cpp
@@ -185,6 +185,9 @@ void Scumm::CHARSET_1() {
Actor *a;
byte *buffer;
+ if(_gameId==GID_ZAK256)
+ return;
+
#if !defined(FULL_THROTTLE)
if (!_haveMsg || (camera._dest.x>>3) != (camera._cur.x>>3) ||
camera._cur.x != camera._last.x