aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Hamm2002-03-05 23:05:55 +0000
committerVincent Hamm2002-03-05 23:05:55 +0000
commit6600b48be93a44a97f85de7d223c52ffa1225bf2 (patch)
treead757ab0fd7be24f1addbc472fef7aa1cbb5f2b6
parent720c41a25f8a302985898846f23dff441197c782 (diff)
downloadscummvm-rg350-6600b48be93a44a97f85de7d223c52ffa1225bf2.tar.gz
scummvm-rg350-6600b48be93a44a97f85de7d223c52ffa1225bf2.tar.bz2
scummvm-rg350-6600b48be93a44a97f85de7d223c52ffa1225bf2.zip
More v7 implementation
svn-id: r3656
-rw-r--r--actor.cpp162
-rw-r--r--costume.cpp33
-rw-r--r--gfx.cpp470
-rw-r--r--object.cpp74
-rw-r--r--resource.cpp7
5 files changed, 365 insertions, 381 deletions
diff --git a/actor.cpp b/actor.cpp
index d7baa4b883..3d858d8991 100644
--- a/actor.cpp
+++ b/actor.cpp
@@ -815,99 +815,94 @@ void Scumm::processActors() {
} while (ac++,--cnt);
}
-#if !defined(FULL_THROTTLE)
void Scumm::drawActorCostume(Actor *a) {
- CostumeRenderer cr;
-
- if (a==NULL || !a->needRedraw)
- return;
+ if(!(_features & GF_AFTER_V7)) {
+ CostumeRenderer cr;
+
+ if (a==NULL || !a->needRedraw)
+ return;
- a->needRedraw = false;
+ a->needRedraw = false;
- setupActorScale(a);
+ setupActorScale(a);
- cr._actorX = a->x - virtscr->xstart;
- cr._actorY = a->y - a->elevation;
- cr._scaleX = a->scalex;
- cr._scaleY = a->scaley;
+ cr._actorX = a->x - virtscr->xstart;
+ cr._actorY = a->y - a->elevation;
+ cr._scaleX = a->scalex;
+ cr._scaleY = a->scaley;
- cr._outheight = virtscr->height;
- cr._vm = this;
+ cr._outheight = virtscr->height;
+ cr._vm = this;
- cr._zbuf = a->mask;
- if (cr._zbuf > gdi._numZBuffer)
- cr._zbuf = (byte)gdi._numZBuffer;
- if (a->forceClip)
- cr._zbuf = a->forceClip;
+ cr._zbuf = a->mask;
+ if (cr._zbuf > gdi._numZBuffer)
+ cr._zbuf = (byte)gdi._numZBuffer;
+ if (a->forceClip)
+ cr._zbuf = a->forceClip;
- cr._shadow_table = _shadowPalette;
+ cr._shadow_table = _shadowPalette;
- cost_setCostume(&cr, a->costume);
- cost_setPalette(&cr, a->palette);
- cost_setFacing(&cr, a);
+ cost_setCostume(&cr, a->costume);
+ cost_setPalette(&cr, a->palette);
+ cost_setFacing(&cr, a);
- a->top = 0xFF;
+ a->top = 0xFF;
- a->bottom = 0;
-
- /* if the actor is partially hidden, redraw it next frame */
- if(cr.drawCostume(a)&1) {
- a->needBgReset = true;
- a->needRedraw = true;
- }
-}
-#else
-void Scumm::drawActorCostume(Actor *a) {
- AkosRenderer ar;
-
- if (a==NULL || !a->needRedraw)
- return;
-
- a->needRedraw = false;
+ a->bottom = 0;
- setupActorScale(a);
-
- ar.x = a->x - virtscr->xstart;
- ar.y = a->y - a->elevation;
- ar.scale_x = a->scalex;
- ar.scale_y = a->scaley;
- ar.clipping = a->forceClip;
- if (ar.clipping == 100) {
- ar.clipping = a->mask;
- if (ar.clipping > (byte)gdi._numZBuffer)
- ar.clipping = gdi._numZBuffer;
- }
- ar.charsetmask = _vars[VAR_CHARSET_MASK]!=0;
-
- ar.outptr = getResourceAddress(rtBuffer, 1) + virtscr->xstart;
- ar.outwidth = virtscr->width;
- ar.outheight = virtscr->height;
+ /* if the actor is partially hidden, redraw it next frame */
+ if(cr.drawCostume(a)&1) {
+ a->needBgReset = true;
+ a->needRedraw = true;
+ }
+ } else {
+ AkosRenderer ar;
- ar.shadow_mode = a->shadow_mode;
- ar.shadow_table = _shadowPalette;
+ if (a==NULL || !a->needRedraw)
+ return;
- akos_setCostume(&ar, a->costume);
- akos_setPalette(&ar, a->palette);
- akos_setFacing(&ar, a);
+ a->needRedraw = false;
- ar.dirty_id = a->number;
+ setupActorScale(a);
- ar.cd = &a->cost;
+ ar.x = a->x - virtscr->xstart;
+ ar.y = a->y - a->elevation;
+ ar.scale_x = a->scalex;
+ ar.scale_y = a->scaley;
+ ar.clipping = a->forceClip;
+ if (ar.clipping == 100) {
+ ar.clipping = a->mask;
+ if (ar.clipping > (byte)gdi._numZBuffer)
+ ar.clipping = gdi._numZBuffer;
+ }
+ ar.charsetmask = _vars[VAR_CHARSET_MASK]!=0;
+
+ ar.outptr = getResourceAddress(rtBuffer, 1) + virtscr->xstart;
+ ar.outwidth = virtscr->width;
+ ar.outheight = virtscr->height;
+
+ ar.shadow_mode = a->shadow_mode;
+ ar.shadow_table = _shadowPalette;
+
+ akos_setCostume(&ar, a->costume);
+ akos_setPalette(&ar, a->palette);
+ akos_setFacing(&ar, a);
+
+ ar.dirty_id = a->number;
+
+ ar.cd = &a->cost;
- ar.draw_top = a->top = 0x7fffffff;
- ar.draw_bottom = a->bottom = 0;
- akos_drawCostume(&ar);
- a->top = ar.draw_top;
- a->bottom = ar.draw_bottom;
+ ar.draw_top = a->top = 0x7fffffff;
+ ar.draw_bottom = a->bottom = 0;
+ akos_drawCostume(&ar);
+ a->top = ar.draw_top;
+ a->bottom = ar.draw_bottom;
+ }
}
-#endif
void Scumm::actorAnimate(Actor *a) {
-#if defined(FULL_THROTTLE)
byte *akos;
-#else
LoadedCostume lc;
-#endif
if (a==NULL || a->costume == 0)
return;
@@ -916,16 +911,19 @@ void Scumm::actorAnimate(Actor *a) {
if (a->animProgress >= a->animSpeed) {
a->animProgress = 0;
-#if defined(FULL_THROTTLE)
- akos = getResourceAddress(rtCostume, a->costume);
- assert(akos);
- if (akos_increaseAnims(akos, a)) {
-#else
- loadCostume(&lc, a->costume);
- if (cost_increaseAnims(&lc, a)) {
-#endif
- a->needRedraw = true;
- a->needBgReset = true;
+ if (_features & GF_AFTER_V7) {
+ akos = getResourceAddress(rtCostume, a->costume);
+ assert(akos);
+ if (akos_increaseAnims(akos, a)) {
+ a->needRedraw = true;
+ a->needBgReset = true;
+ }
+ } else {
+ loadCostume(&lc, a->costume);
+ if (cost_increaseAnims(&lc, a)) {
+ a->needRedraw = true;
+ a->needBgReset = true;
+ }
}
}
}
diff --git a/costume.cpp b/costume.cpp
index ae88294950..ebd32a499c 100644
--- a/costume.cpp
+++ b/costume.cpp
@@ -674,7 +674,7 @@ void CostumeRenderer::loadCostume(int id) {
if (_vm->_features&GF_AFTER_V6) {
_ptr += 8;
- } else if(!(_features&GF_SMALL_HEADER)) {
+ } else if(!(_vm->_features&GF_SMALL_HEADER)) {
_ptr += 2;
}
@@ -711,25 +711,26 @@ void Scumm::initActorCostumeData(Actor *a) {
}
byte CostumeRenderer::drawOneSlot(Actor *a, int slot) {
-#if !defined(FULL_THROTTLE)
- int i;
- int code;
- CostumeData *cd = &a->cost;
-
- if (cd->curpos[slot]==0xFFFF || cd->stopped & (1<<slot))
- return 0;
- i = cd->curpos[slot]&0x7FFF;
- _frameptr = _loaded._ptr + READ_LE_UINT16(_loaded._ptr + _loaded._numColors + slot*2 + 10);
- code = _loaded._dataptr[i]&0x7F;
+ if(!(_vm->_features & GF_AFTER_V7)) {
+ int i;
+ int code;
+ CostumeData *cd = &a->cost;
+
+ if (cd->curpos[slot]==0xFFFF || cd->stopped & (1<<slot))
+ return 0;
+
+ i = cd->curpos[slot]&0x7FFF;
+ _frameptr = _loaded._ptr + READ_LE_UINT16(_loaded._ptr + _loaded._numColors + slot*2 + 10);
+ code = _loaded._dataptr[i]&0x7F;
- _srcptr = _loaded._ptr + READ_LE_UINT16(_frameptr + code*2);
+ _srcptr = _loaded._ptr + READ_LE_UINT16(_frameptr + code*2);
- if (code != 0x7B) {
- if ( !(_vm->_features & GF_OLD256) || code <0x79)
- return mainRoutine(a, slot, code);
+ if (code != 0x7B) {
+ if ( !(_vm->_features & GF_OLD256) || code <0x79)
+ return mainRoutine(a, slot, code);
+ }
}
-#endif
return 0;
diff --git a/gfx.cpp b/gfx.cpp
index d2ea946f86..8cc886675a 100644
--- a/gfx.cpp
+++ b/gfx.cpp
@@ -116,12 +116,8 @@ void Scumm::drawDirtyScreenParts() {
if (_features & GF_OLD256)
updateDirtyScreen(1);
-#if defined(FULL_THROTTLE)
- if (camera._last.x==camera._cur.x &&
- camera._last.y==camera._cur.y) {
-#else
- if (camera._last.x == camera._cur.x) {
-#endif
+ if ((camera._last.x==camera._cur.x &&
+ camera._last.y==camera._cur.y && (_features & GF_AFTER_V7)) || (camera._last.x == camera._cur.x)) {
updateDirtyScreen(0);
} else {
vs = &virtscr[0];
@@ -228,109 +224,104 @@ void Scumm::setCursor(int cursor) {
warning("setCursor(%d)", cursor);
}
-#if defined(FULL_THROTTLE)
-
void Scumm::setCameraAt(int pos_x, int pos_y) {
- CameraData *cd = &camera;
- Point old;
- old = cd->_cur;
+ if(_features & GF_AFTER_V7) {
+ CameraData *cd = &camera;
+ Point old;
- cd->_cur.x = pos_x;
- cd->_cur.y = pos_y;
+ old = cd->_cur;
- clampCameraPos(&cd->_cur);
+ cd->_cur.x = pos_x;
+ cd->_cur.y = pos_y;
- cd->_dest = cd->_cur;
+ clampCameraPos(&cd->_cur);
- assert(cd->_cur.x>=160 && cd->_cur.y>=100);
+ cd->_dest = cd->_cur;
- if ((cd->_cur.x != old.x || cd->_cur.y != old.y) && _vars[VAR_SCROLL_SCRIPT]) {
- _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
- _vars[VAR_CAMERA_POS_Y] = cd->_cur.y;
- runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
- }
-}
-#else
-void Scumm::setCameraAt(int pos_x, int pos_y) {
- int t;
- CameraData *cd = &camera;
+ assert(cd->_cur.x>=160 && cd->_cur.y>=100);
- if (cd->_mode!=CM_FOLLOW_ACTOR || abs(pos_x - cd->_cur.x) > 160) {
- cd->_cur.x = pos_x;
- }
- cd->_dest.x = pos_x;
+ if ((cd->_cur.x != old.x || cd->_cur.y != old.y) && _vars[VAR_SCROLL_SCRIPT]) {
+ _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
+ _vars[VAR_CAMERA_POS_Y] = cd->_cur.y;
+ runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
+ }
+ } else {
+ int t;
+ CameraData *cd = &camera;
- t = _vars[VAR_CAMERA_MIN_X];
- if (cd->_cur.x < t) cd->_cur.x = t;
+ if (cd->_mode!=CM_FOLLOW_ACTOR || abs(pos_x - cd->_cur.x) > 160) {
+ cd->_cur.x = pos_x;
+ }
+ cd->_dest.x = pos_x;
- t = _vars[VAR_CAMERA_MAX_X];
- if (cd->_cur.x > t) cd->_cur.x = t;
+ t = _vars[VAR_CAMERA_MIN_X];
+ if (cd->_cur.x < t) cd->_cur.x = t;
- if (_vars[VAR_SCROLL_SCRIPT]) {
- _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
- runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
- }
+ t = _vars[VAR_CAMERA_MAX_X];
+ if (cd->_cur.x > t) cd->_cur.x = t;
- if (cd->_cur.x != cd->_last.x && charset._hasMask)
- stopTalk();
-}
-#endif
-
-#if defined(FULL_THROTTLE)
-void Scumm::setCameraFollows(Actor *a) {
- CameraData *cd = &camera;
- byte oldfollow = cd->_follows;
- int ax,ay;
-
- cd->_follows = a->number;
+ if (_vars[VAR_SCROLL_SCRIPT]) {
+ _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
+ runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
+ }
- if (a->room != _currentRoom) {
- startScene(a->room, 0, 0);
+ if (cd->_cur.x != cd->_last.x && charset._hasMask)
+ stopTalk();
}
-
- ax = abs(a->x - cd->_cur.x);
- ay = abs(a->y - cd->_cur.y);
-
- if ( ax > _vars[VAR_CAMERA_THRESHOLD_X] ||
- ay > _vars[VAR_CAMERA_THRESHOLD_Y] ||
- ax > 160 ||
- ay > 100) {
- setCameraAt(a->x, a->y);
- }
-
- if (a->number != oldfollow)
- runHook(0);
}
-#else
void Scumm::setCameraFollows(Actor *a) {
- int t,i;
- CameraData *cd = &camera;
-
- cd->_mode = CM_FOLLOW_ACTOR;
- cd->_follows = a->number;
-
- if (a->room != _currentRoom) {
- startScene(a->room, 0, 0);
- cd->_mode = CM_FOLLOW_ACTOR;
- cd->_cur.x = a->x;
- setCameraAt(cd->_cur.x, 0);
- }
+ if(_features & GF_AFTER_V7) {
+ CameraData *cd = &camera;
+ byte oldfollow = cd->_follows;
+ int ax,ay;
+
+ cd->_follows = a->number;
- t = (a->x >> 3);
+ if (a->room != _currentRoom) {
+ startScene(a->room, 0, 0);
+ }
+
+ ax = abs(a->x - cd->_cur.x);
+ ay = abs(a->y - cd->_cur.y);
+
+ if ( ax > _vars[VAR_CAMERA_THRESHOLD_X] ||
+ ay > _vars[VAR_CAMERA_THRESHOLD_Y] ||
+ ax > 160 ||
+ ay > 100) {
+ setCameraAt(a->x, a->y);
+ }
- if (t-_screenStartStrip < cd->_leftTrigger ||
- t-_screenStartStrip > cd->_rightTrigger)
- setCameraAt(a->x, 0);
+ if (a->number != oldfollow)
+ runHook(0);
+ } else {
+ int t,i;
+ CameraData *cd = &camera;
- for (i=1,a=getFirstActor(); ++a,i<NUM_ACTORS; i++) {
- if (a->room==_currentRoom)
- a->needRedraw = true;
+ cd->_mode = CM_FOLLOW_ACTOR;
+ cd->_follows = a->number;
+
+ if (a->room != _currentRoom) {
+ startScene(a->room, 0, 0);
+ cd->_mode = CM_FOLLOW_ACTOR;
+ cd->_cur.x = a->x;
+ setCameraAt(cd->_cur.x, 0);
+ }
+
+ t = (a->x >> 3);
+
+ if (t-_screenStartStrip < cd->_leftTrigger ||
+ t-_screenStartStrip > cd->_rightTrigger)
+ setCameraAt(a->x, 0);
+
+ for (i=1,a=getFirstActor(); ++a,i<NUM_ACTORS; i++) {
+ if (a->room==_currentRoom)
+ a->needRedraw = true;
+ }
+ runHook(0);
}
- runHook(0);
}
-#endif
void Scumm::initBGBuffers() {
byte *ptr;
@@ -518,9 +509,8 @@ void Scumm::unkVirtScreen4(int a) {
VirtScreen *vs;
setDirtyRange(0, 0, 0);
-#if !defined(FULL_THROTTLE)
- camera._last.x = camera._cur.x;
-#endif
+ if(!(_features & GF_AFTER_V7))
+ camera._last.x = camera._cur.x;
if (!_screenEffectFlag)
return;
_screenEffectFlag = false;
@@ -1650,8 +1640,6 @@ void Gdi::clearUpperMask() {
);
}
-#if defined(FULL_THROTTLE)
-
void Scumm::clampCameraPos(Point *pt) {
if (pt->x < _vars[VAR_CAMERA_MIN_X])
pt->x = _vars[VAR_CAMERA_MIN_X];
@@ -1668,166 +1656,164 @@ void Scumm::clampCameraPos(Point *pt) {
void Scumm::moveCamera() {
- CameraData *cd = &camera;
- Point old = cd->_cur;
- Actor *a;
-
- if (cd->_follows) {
- a = derefActorSafe(cd->_follows, "moveCamera");
- if (abs(cd->_cur.x - a->x) > _vars[VAR_CAMERA_THRESHOLD_X] ||
- abs(cd->_cur.y - a->y) > _vars[VAR_CAMERA_THRESHOLD_Y]) {
- cd->_movingToActor = true;
- if (_vars[VAR_CAMERA_THRESHOLD_X] == 0)
- cd->_cur.x = a->x;
- if (_vars[VAR_CAMERA_THRESHOLD_Y] == 0)
- cd->_cur.y = a->y;
- clampCameraPos(&cd->_cur);
+ if(_features & GF_AFTER_V7) {
+ CameraData *cd = &camera;
+ Point old = cd->_cur;
+ Actor *a;
+
+ if (cd->_follows) {
+ a = derefActorSafe(cd->_follows, "moveCamera");
+ if (abs(cd->_cur.x - a->x) > _vars[VAR_CAMERA_THRESHOLD_X] ||
+ abs(cd->_cur.y - a->y) > _vars[VAR_CAMERA_THRESHOLD_Y]) {
+ cd->_movingToActor = true;
+ if (_vars[VAR_CAMERA_THRESHOLD_X] == 0)
+ cd->_cur.x = a->x;
+ if (_vars[VAR_CAMERA_THRESHOLD_Y] == 0)
+ cd->_cur.y = a->y;
+ clampCameraPos(&cd->_cur);
+ }
+ } else {
+ cd->_movingToActor = false;
}
- } else {
- cd->_movingToActor = false;
- }
-
- if (cd->_movingToActor) {
- cd->_dest.x = a->x;
- cd->_dest.y = a->y;
- }
-
- assert(cd->_cur.x>=160 && cd->_cur.y>=100);
-
- clampCameraPos(&cd->_dest);
-
- if (cd->_cur.x < cd->_dest.x) {
- cd->_cur.x += _vars[VAR_CAMERA_SPEED_X];
- if (cd->_cur.x > cd->_dest.x)
- cd->_cur.x = cd->_dest.x;
- }
-
- if (cd->_cur.x > cd->_dest.x) {
- cd->_cur.x -= _vars[VAR_CAMERA_SPEED_X];
- if (cd->_cur.x < cd->_dest.x)
- cd->_cur.x = cd->_dest.x;
- }
-
- if (cd->_cur.y < cd->_dest.y) {
- cd->_cur.y += _vars[VAR_CAMERA_SPEED_Y];
- if (cd->_cur.y > cd->_dest.y)
- cd->_cur.y = cd->_dest.y;
- }
-
- if (cd->_cur.y > cd->_dest.y) {
- cd->_cur.y -= _vars[VAR_CAMERA_SPEED_Y];
- if (cd->_cur.y < cd->_dest.y)
- cd->_cur.y = cd->_dest.y;
- }
- if (cd->_cur.x == cd->_dest.x &&
- cd->_cur.y == cd->_dest.y) {
-
- cd->_movingToActor = false;
- cd->_accel.x = cd->_accel.y = 0;
- _vars[VAR_CAMERA_SPEED_X] = _vars[VAR_CAMERA_SPEED_Y] = 0;
- } else {
-
- cd->_accel.x += _vars[VAR_CAMERA_ACCEL_X];
- cd->_accel.y += _vars[VAR_CAMERA_ACCEL_Y];
+ if (cd->_movingToActor) {
+ cd->_dest.x = a->x;
+ cd->_dest.y = a->y;
+ }
+
+ assert(cd->_cur.x>=160 && cd->_cur.y>=100);
+
+ clampCameraPos(&cd->_dest);
+
+ if (cd->_cur.x < cd->_dest.x) {
+ cd->_cur.x += _vars[VAR_CAMERA_SPEED_X];
+ if (cd->_cur.x > cd->_dest.x)
+ cd->_cur.x = cd->_dest.x;
+ }
+
+ if (cd->_cur.x > cd->_dest.x) {
+ cd->_cur.x -= _vars[VAR_CAMERA_SPEED_X];
+ if (cd->_cur.x < cd->_dest.x)
+ cd->_cur.x = cd->_dest.x;
+ }
+
+ if (cd->_cur.y < cd->_dest.y) {
+ cd->_cur.y += _vars[VAR_CAMERA_SPEED_Y];
+ if (cd->_cur.y > cd->_dest.y)
+ cd->_cur.y = cd->_dest.y;
+ }
+
+ if (cd->_cur.y > cd->_dest.y) {
+ cd->_cur.y -= _vars[VAR_CAMERA_SPEED_Y];
+ if (cd->_cur.y < cd->_dest.y)
+ cd->_cur.y = cd->_dest.y;
+ }
- _vars[VAR_CAMERA_SPEED_X] += cd->_accel.x / 100;
- _vars[VAR_CAMERA_SPEED_Y] += cd->_accel.y / 100;
-
- if (_vars[VAR_CAMERA_SPEED_X] < 8)
- _vars[VAR_CAMERA_SPEED_X] = 8;
-
- if (_vars[VAR_CAMERA_SPEED_Y] < 8)
- _vars[VAR_CAMERA_SPEED_Y] = 8;
-
- }
+ if (cd->_cur.x == cd->_dest.x &&
+ cd->_cur.y == cd->_dest.y) {
+
+ cd->_movingToActor = false;
+ cd->_accel.x = cd->_accel.y = 0;
+ _vars[VAR_CAMERA_SPEED_X] = _vars[VAR_CAMERA_SPEED_Y] = 0;
+ } else {
+
+ cd->_accel.x += _vars[VAR_CAMERA_ACCEL_X];
+ cd->_accel.y += _vars[VAR_CAMERA_ACCEL_Y];
+
+ _vars[VAR_CAMERA_SPEED_X] += cd->_accel.x / 100;
+ _vars[VAR_CAMERA_SPEED_Y] += cd->_accel.y / 100;
- cameraMoved();
-
- if (cd->_cur.x != old.x || cd->_cur.y != old.y) {
- _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
- _vars[VAR_CAMERA_POS_Y] = cd->_cur.y;
- runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
- }
-}
-
-#else
-void Scumm::moveCamera() {
- CameraData *cd = &camera;
- int pos = cd->_cur.x;
- int actorx, t;
- Actor *a;
-
- cd->_cur.x &= 0xFFF8;
-
- if (cd->_cur.x < _vars[VAR_CAMERA_MIN_X]) {
- if (_vars[VAR_CAMERA_FAST_X])
- cd->_cur.x = _vars[VAR_CAMERA_MIN_X];
- else
- cd->_cur.x += 8;
+ if (_vars[VAR_CAMERA_SPEED_X] < 8)
+ _vars[VAR_CAMERA_SPEED_X] = 8;
+
+ if (_vars[VAR_CAMERA_SPEED_Y] < 8)
+ _vars[VAR_CAMERA_SPEED_Y] = 8;
+
+ }
+
cameraMoved();
+
+ if (cd->_cur.x != old.x || cd->_cur.y != old.y) {
+ _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
+ _vars[VAR_CAMERA_POS_Y] = cd->_cur.y;
+ runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
+ }
+ } else {
+ CameraData *cd = &camera;
+ int pos = cd->_cur.x;
+ int actorx, t;
+ Actor *a;
+
+ cd->_cur.x &= 0xFFF8;
+
+ if (cd->_cur.x < _vars[VAR_CAMERA_MIN_X]) {
+ if (_vars[VAR_CAMERA_FAST_X])
+ cd->_cur.x = _vars[VAR_CAMERA_MIN_X];
+ else
+ cd->_cur.x += 8;
+ cameraMoved();
return;
- }
-
- if (cd->_cur.x > _vars[VAR_CAMERA_MAX_X]) {
- if (_vars[VAR_CAMERA_FAST_X])
- cd->_cur.x = _vars[VAR_CAMERA_MAX_X];
- else
- cd->_cur.x-=8;
+ }
+
+ if (cd->_cur.x > _vars[VAR_CAMERA_MAX_X]) {
+ if (_vars[VAR_CAMERA_FAST_X])
+ cd->_cur.x = _vars[VAR_CAMERA_MAX_X];
+ else
+ cd->_cur.x-=8;
+ cameraMoved();
+ return;
+ }
+
+ if (cd->_mode==CM_FOLLOW_ACTOR) {
+ a = derefActorSafe(cd->_follows, "moveCamera");
+
+ actorx = a->x;
+ t = (actorx>>3) - _screenStartStrip;
+
+ if (t < cd->_leftTrigger || t > cd->_rightTrigger) {
+ if (_vars[VAR_CAMERA_FAST_X]) {
+ if (t > 35)
+ cd->_dest.x = actorx + 80;
+ if (t < 5)
+ cd->_dest.x = actorx - 80;
+ } else
+ cd->_movingToActor = 1;
+ }
+ }
+
+ if (cd->_movingToActor) {
+ a = derefActorSafe(cd->_follows, "moveCamera(2)");
+ cd->_dest.x = a->x;
+ }
+
+ if (cd->_dest.x < _vars[VAR_CAMERA_MIN_X])
+ cd->_dest.x = _vars[VAR_CAMERA_MIN_X];
+
+ if (cd->_dest.x > _vars[VAR_CAMERA_MAX_X])
+ cd->_dest.x = _vars[VAR_CAMERA_MAX_X];
+
+ if (_vars[VAR_CAMERA_FAST_X]) {
+ cd->_cur.x = cd->_dest.x;
+ } else {
+ if (cd->_cur.x < cd->_dest.x)
+ cd->_cur.x+=8;
+ if (cd->_cur.x > cd->_dest.x)
+ cd->_cur.x-=8;
+ }
+
+ /* a is set a bit above */
+ if (cd->_movingToActor && cd->_cur.x>>3 == a->x>>3) {
+ cd->_movingToActor = 0;
+ }
+
cameraMoved();
- return;
- }
-
- if (cd->_mode==CM_FOLLOW_ACTOR) {
- a = derefActorSafe(cd->_follows, "moveCamera");
-
- actorx = a->x;
- t = (actorx>>3) - _screenStartStrip;
-
- if (t < cd->_leftTrigger || t > cd->_rightTrigger) {
- if (_vars[VAR_CAMERA_FAST_X]) {
- if (t > 35)
- cd->_dest.x = actorx + 80;
- if (t < 5)
- cd->_dest.x = actorx - 80;
- } else
- cd->_movingToActor = 1;
+
+ if (pos != cd->_cur.x && _vars[VAR_SCROLL_SCRIPT]) {
+ _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
+ runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
}
}
-
- if (cd->_movingToActor) {
- a = derefActorSafe(cd->_follows, "moveCamera(2)");
- cd->_dest.x = a->x;
- }
-
- if (cd->_dest.x < _vars[VAR_CAMERA_MIN_X])
- cd->_dest.x = _vars[VAR_CAMERA_MIN_X];
-
- if (cd->_dest.x > _vars[VAR_CAMERA_MAX_X])
- cd->_dest.x = _vars[VAR_CAMERA_MAX_X];
-
- if (_vars[VAR_CAMERA_FAST_X]) {
- cd->_cur.x = cd->_dest.x;
- } else {
- if (cd->_cur.x < cd->_dest.x)
- cd->_cur.x+=8;
- if (cd->_cur.x > cd->_dest.x)
- cd->_cur.x-=8;
- }
-
- /* a is set a bit above */
- if (cd->_movingToActor && cd->_cur.x>>3 == a->x>>3) {
- cd->_movingToActor = 0;
- }
-
- cameraMoved();
-
- if (pos != cd->_cur.x && _vars[VAR_SCROLL_SCRIPT]) {
- _vars[VAR_CAMERA_POS_X] = cd->_cur.x;
- runScript(_vars[VAR_SCROLL_SCRIPT], 0, 0, 0);
- }
}
-#endif
#if defined(FULL_THROTTLE)
void Scumm::cameraMoved() {
diff --git a/object.cpp b/object.cpp
index 2cb64af9a3..cbbbc71d07 100644
--- a/object.cpp
+++ b/object.cpp
@@ -532,46 +532,46 @@ void Scumm::setupRoomObject(ObjectData *od, byte *room) {
else
od->obj_nr = READ_LE_UINT16(&(cdhd->v5.obj_id));
-#if !defined(FULL_THROTTLE)
- if (_features & GF_AFTER_V6) {
- od->width = READ_LE_UINT16(&cdhd->v6.w);
- od->height = READ_LE_UINT16(&cdhd->v6.h);
- od->x_pos = ((int16)READ_LE_UINT16(&cdhd->v6.x));
- od->y_pos = ((int16)READ_LE_UINT16(&cdhd->v6.y));
- if (cdhd->v6.flags == 0x80) {
- od->parentstate = 1;
+ if(!(_features & GF_AFTER_V7)) {
+ if (_features & GF_AFTER_V6) {
+ od->width = READ_LE_UINT16(&cdhd->v6.w);
+ od->height = READ_LE_UINT16(&cdhd->v6.h);
+ od->x_pos = ((int16)READ_LE_UINT16(&cdhd->v6.x));
+ od->y_pos = ((int16)READ_LE_UINT16(&cdhd->v6.y));
+ if (cdhd->v6.flags == 0x80) {
+ od->parentstate = 1;
+ } else {
+ od->parentstate = (cdhd->v6.flags&0xF);
+ }
+ od->parent = cdhd->v6.parent;
+ od->actordir = cdhd->v6.actordir;
} else {
- od->parentstate = (cdhd->v6.flags&0xF);
+ od->width = cdhd->v5.w<<3;
+ od->height = cdhd->v5.h<<3;
+ od->x_pos = cdhd->v5.x<<3;
+ od->y_pos = cdhd->v5.y<<3;
+ if (cdhd->v5.flags == 0x80) {
+ od->parentstate = 1;
+ } else {
+ od->parentstate = (cdhd->v5.flags&0xF);
+ }
+ od->parent = cdhd->v5.parent;
+ od->walk_x = READ_LE_UINT16(&cdhd->v5.walk_x);
+ od->walk_y = READ_LE_UINT16(&cdhd->v5.walk_y);
+ od->actordir = cdhd->v5.actordir;
}
- od->parent = cdhd->v6.parent;
- od->actordir = cdhd->v6.actordir;
} else {
- od->width = cdhd->v5.w<<3;
- od->height = cdhd->v5.h<<3;
- od->x_pos = cdhd->v5.x<<3;
- od->y_pos = cdhd->v5.y<<3;
- if (cdhd->v5.flags == 0x80) {
- od->parentstate = 1;
- } else {
- od->parentstate = (cdhd->v5.flags&0xF);
- }
- od->parent = cdhd->v5.parent;
- od->walk_x = READ_LE_UINT16(&cdhd->v5.walk_x);
- od->walk_y = READ_LE_UINT16(&cdhd->v5.walk_y);
- od->actordir = cdhd->v5.actordir;
- }
-#else
- od->parent = cdhd->parent;
- od->parentstate = cdhd->parentstate;
+ od->parent = cdhd->v7.parent;
+ od->parentstate = cdhd->v7.parentstate;
- imhd = (ImageHeader*)findResourceData(MKID('IMHD'), room + od->offs_obim_to_room);
- od->x_pos = imhd->x_pos;
- od->y_pos = imhd->y_pos;
- od->width = imhd->width;
- od->height = imhd->height;
- od->actordir = imhd->actordir;
+ imhd = (ImageHeader*)findResourceData(MKID('IMHD'), room + od->offs_obim_to_room);
+ od->x_pos = imhd->v7.x_pos;
+ od->y_pos = imhd->v7.y_pos;
+ od->width = imhd->v7.width;
+ od->height = imhd->v7.height;
+ od->actordir = imhd->v7.actordir;
-#endif
+ }
od->fl_object_index = 0;
}
@@ -1049,8 +1049,8 @@ void Scumm::setCursorImg(uint img, uint room, uint imgindex) {
w = READ_LE_UINT16(&foir.cdhd->v6.w)>>3;
h = READ_LE_UINT16(&foir.cdhd->v6.h)>>3;
#else
- w = READ_LE_UINT16(&foir.imhd->width)>>3;
- h = READ_LE_UINT16(&foir.imhd->height)>>3;
+ w = READ_LE_UINT16(&foir.imhd->v7.width)>>3;
+ h = READ_LE_UINT16(&foir.imhd->v7.height)>>3;
#endif
dataptr = findResource(IMxx_tags[imgindex],foir.obim);
diff --git a/resource.cpp b/resource.cpp
index c26b7bebcf..38e1363474 100644
--- a/resource.cpp
+++ b/resource.cpp
@@ -564,10 +564,9 @@ void Scumm::ensureResourceLoaded(int type, int i) {
loadResource(type, i);
-#if !defined(FULL_THROTTLE)
- if (type==rtRoom && i==_roomResource)
- _vars[VAR_ROOM_FLAG] = 1;
-#endif
+ if(!(_features & GF_AFTER_V7))
+ if (type==rtRoom && i==_roomResource)
+ _vars[VAR_ROOM_FLAG] = 1;
}
int Scumm::loadResource(int type, int index) {