Further LFL additions. Zak256 plays bits of its intro, and LoomCD partially runs (may need

to hit escape a few times, after selecting your difficulty).

Still very incomplete and in progress.

svn-id: r3568
This commit is contained in:
James Brown 2002-02-12 21:28:07 +00:00
parent f620d138f6
commit 7ee034af88
10 changed files with 467 additions and 144 deletions

View file

@ -141,7 +141,7 @@ void Scumm::setupOpcodes() {
&Scumm::o5_add,
&Scumm::o5_divide,
/* 5C */
&Scumm::o5_badOpcode,
&Scumm::o5_oldRoomEffect,
&Scumm::o5_actorSetClass,
&Scumm::o5_walkActorTo,
&Scumm::o5_isActorInBox,
@ -363,11 +363,15 @@ void Scumm::o5_actorFromPos() {
}
void Scumm::o5_actorSet() {
byte convertTable[20] = {1,0,0,2,0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20};
int act = getVarOrDirectByte(0x80);
Actor *a = derefActorSafe(act, "actorSet");
int i,j;
while ( (_opcode = fetchScriptByte()) != 0xFF) {
if(_features & GF_SMALL_HEADER)
_opcode = (_opcode&0xE0) | convertTable[(_opcode&0x1F)-1];
switch(_opcode&0x1F) {
case 1: /* costume */
setActorCostume(a, getVarOrDirectByte(0x80));
@ -464,7 +468,7 @@ FixRoom:
a->shadow_mode = getVarOrDirectByte(0x80); /* shadow mode */
break;
default:
error("o5_actorSet: default case");
warning("o5_actorSet: default case");
}
}
}
@ -578,7 +582,8 @@ void Scumm::o5_cursorCommand() {
case 10: /* set cursor img */
i = getVarOrDirectByte(0x80);
j = getVarOrDirectByte(0x40);
setCursorImg(i, j, 1);
if (!(_gameId==GID_LOOM256))
setCursorImg(i, j, 1);
break;
case 11: /* set cursor hotspot */
i = getVarOrDirectByte(0x80);
@ -698,6 +703,38 @@ void Scumm::o5_drawObject() {
xpos = ypos = 255;
obj = getVarOrDirectWord(0x80);
if (_features & GF_SMALL_HEADER) {
int temp = getVarOrDirectWord(0x40);
int room = getVarOrDirectWord(0x20);
index = getObjectIndex(obj);
if(index==-1)
return;
od = &_objs[index];
xpos = ypos = 255;
if (temp!=0xFF) {
od->walk_x += (xpos<<3) - od->x_pos;
od->x_pos = xpos<<3;
od->walk_y += (ypos<<3) - od->y_pos;
od->y_pos = ypos<<3;
}
addObjectToDrawQue(index);
x = od->x_pos;
y = od->y_pos;
w = od->width;
h = od->height;
i = _numObjectsInRoom;
do {
if (_objs[i].x_pos == x && _objs[i].y_pos == y && _objs[i].width == w && _objs[i].height==h)
putState(_objs[i].obj_nr, 0);
} while (--i);
putState(obj, state);
return;
}
switch((_opcode = fetchScriptByte())&0x1F) {
case 1: /* draw at */
xpos = getVarOrDirectWord(0x80);
@ -1318,6 +1355,9 @@ void Scumm::o5_resourceRoutines() {
case 20:/* load fl object */
loadFlObject(getVarOrDirectWord(0x40), res);
break;
default:
warning("Unknown o5_resourcesroutine: %d", _opcode&0x1F);
break;
}
}
@ -1338,7 +1378,15 @@ void Scumm::o5_roomOps() {
_vars[VAR_CAMERA_MAX_X] = b;
break;
case 2: /* room color */
error("room-color is no longer a valid command");
if(_features & GF_SMALL_HEADER) {
a = getVarOrDirectWord(0x80);
b = getVarOrDirectWord(0x40);
checkRange(256, 0, a, "o5_roomOps: 2: Illegal room color slot (%d)");
_currentPalette[a]=b;
_fullRedraw = 1;
} else {
error("room-color is no longer a valid command");
}
break;
case 3: /* set screen */
@ -1347,13 +1395,22 @@ void Scumm::o5_roomOps() {
initScreens(0,a,320,b);
break;
case 4: /* set palette color */
a = getVarOrDirectWord(0x80);
b = getVarOrDirectWord(0x40);
c = getVarOrDirectWord(0x20);
_opcode = fetchScriptByte();
d = getVarOrDirectByte(0x80);
setPalColor(d, a, b, c); /* index, r, g, b */
break;
if(_features & GF_SMALL_HEADER) {
a = getVarOrDirectWord(0x80);
b = getVarOrDirectWord(0x40);
checkRange(256, 0, a, "o5_roomOps: 2: Illegal room color slot (%d)");
_currentPalette[a]=b;
_fullRedraw = 1;
setDirtyColors(a,a);
} else {
a = getVarOrDirectWord(0x80);
b = getVarOrDirectWord(0x40);
c = getVarOrDirectWord(0x20);
_opcode = fetchScriptByte();
d = getVarOrDirectByte(0x80);
setPalColor(d, a, b, c); /* index, r, g, b */
}
break;
case 5: /* shake on */
setShake(1);
break;
@ -1428,6 +1485,7 @@ void Scumm::o5_roomOps() {
case 16: /* ? */
a = getVarOrDirectByte(0x80);
b = getVarOrDirectByte(0x40);
if (a < 1) a = 1; /* FIXME: ZAK256 */
checkRange(16, 1, a, "o5_roomOps: 16: color cycle out of range (%d)");
_colorCycle[a-1].delay = (b!=0) ? 0x4000 / (b*0x4C) : 0;
break;
@ -1650,9 +1708,13 @@ void Scumm::o5_stringOps() {
a = getVarOrDirectByte(0x80);
b = getVarOrDirectByte(0x40);
ptr = getResourceAddress(rtString, a);
if (ptr==NULL) error("String %d does not exist", a);
c = getVarOrDirectByte(0x20);
ptr[b] = c;
if (!(_gameId == GID_LOOM256)) { /* FIXME - LOOM256 */
if (ptr==NULL) error("String %d does not exist", a);
c = getVarOrDirectByte(0x20);
ptr[b] = c;
} else
getVarOrDirectByte(0x20);
break;
case 4: /* get string char */
@ -2000,4 +2062,13 @@ void Scumm::decodeParseString() {
string[textSlot].t_charset = string[textSlot].charset;
}
void Scumm::o5_oldRoomEffect() {
int a;
_opcode=fetchScriptByte();
if((_opcode & 0x1F) == 3)
{
a = getVarOrDirectWord(0x80);
}
warning("Unsupported oldRoomEffect");
}