aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/agos/agos.cpp24
-rw-r--r--engines/agos/agos.h7
-rw-r--r--engines/agos/event.cpp5
-rw-r--r--engines/agos/items.cpp2
-rw-r--r--engines/agos/vga.cpp108
5 files changed, 133 insertions, 13 deletions
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp
index 323ecf1c80..d86b7e9a48 100644
--- a/engines/agos/agos.cpp
+++ b/engines/agos/agos.cpp
@@ -1201,6 +1201,8 @@ startOver:
if ((getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) && _keyPressed == 35)
displayBoxStars();
processSpecialKeys();
+ if (_keyPressed != 0)
+ break;
if (_lastHitArea3 == (HitArea *) -1)
goto startOver;
if (_lastHitArea3 != 0)
@@ -1731,8 +1733,10 @@ void AGOSEngine::skipSpeech() {
}
Item *AGOSEngine::derefItem(uint item) {
- if (item >= _itemArraySize)
- error("derefItem: invalid item %d", item);
+ if (item >= _itemArraySize) {
+ debug(1, "derefItem: invalid item %d", item);
+ return 0;
+ }
return _itemArrayPtr[item];
}
@@ -1762,6 +1766,22 @@ bool AGOSEngine::isSpriteLoaded(uint16 id, uint16 zoneNum) {
void AGOSEngine::processSpecialKeys() {
switch (_keyPressed) {
+ case 17: // Up
+ if (getGameType() == GType_PP)
+ _verbHitArea = 302;
+ break;
+ case 18: // Down
+ if (getGameType() == GType_PP)
+ _verbHitArea = 304;
+ break;
+ case 19: // Right
+ if (getGameType() == GType_PP)
+ _verbHitArea = 303;
+ break;
+ case 20: // Left
+ if (getGameType() == GType_PP)
+ _verbHitArea = 301;
+ break;
case 27: // escape
_exitCutscene = true;
break;
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index 1f11c69690..8e51c1615d 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -660,9 +660,9 @@ protected:
bool block1Supported(int i, int y);
void checkTiles();
void moveBlocks();
- void dropBlock(int a, int b, int c);
+ void dropBlock(int id, int priority, int num);
void droppingBlock();
- void stopBlock(int a, int b);
+ void stopBlock(int id, int num);
void remove0Block(int i);
void remove1Block(int i);
void pairCheck();
@@ -1127,7 +1127,8 @@ protected:
void startOverlayAnims();
void startAnOverlayAnim();
- void startBlock(uint windowNum, uint vga_res, uint vga_sprite_id, uint x, uint y, uint palette);
+ void startBlock(uint windowNum, uint vga_res, uint vga_sprite_id, uint x, uint y, uint priority);
+ void checkIfClickedOnBlock();
bool itemIsSiblingOf(uint16 val);
bool itemIsParentOf(uint16 a, uint16 b);
diff --git a/engines/agos/event.cpp b/engines/agos/event.cpp
index f0e949b645..fccecd7162 100644
--- a/engines/agos/event.cpp
+++ b/engines/agos/event.cpp
@@ -331,11 +331,12 @@ void AGOSEngine::timer_proc1() {
pairCheck();
gravityCheck();
}
- printf("CheckIfClickedOnBlock\n");
+ if (_leftButtonDown || _rightButtonDown)
+ checkIfClickedOnBlock();
if (getBitFlag(99)) {
moveBlocks();
- droppingBlock();
}
+ droppingBlock();
}
} else {
if (_scrollCount == 0) {
diff --git a/engines/agos/items.cpp b/engines/agos/items.cpp
index 5953abd45e..356b552c22 100644
--- a/engines/agos/items.cpp
+++ b/engines/agos/items.cpp
@@ -2479,8 +2479,8 @@ void AGOSEngine::o4_checkTiles() {
void AGOSEngine::o4_loadMouseImage() {
// 38: load mouse image
- getVarOrByte();
getNextItemPtr();
+ getVarOrByte();
loadMouseImage();
}
diff --git a/engines/agos/vga.cpp b/engines/agos/vga.cpp
index 83846ef556..1ecd4fd6c1 100644
--- a/engines/agos/vga.cpp
+++ b/engines/agos/vga.cpp
@@ -2930,9 +2930,11 @@ void AGOSEngine::startAnOverlayAnim() {
void AGOSEngine::startBlock(uint windowNum, uint zoneNum, uint vgaSpriteId, uint x, uint y, uint priority) {
VgaSprite *vsp = _vgaSprites;
const byte *vcPtrOrg;
- uint16 tmp;
+ uint16 sprite, tmp, zone;
uint i;
+ _lockWord |= 0x40;
+
while (vsp->id != 0)
vsp++;
@@ -2944,13 +2946,14 @@ void AGOSEngine::startBlock(uint windowNum, uint zoneNum, uint vgaSpriteId, uint
_droppingBlockY = _variableArray[203];
_droppingBlockZ = _variableArray[204];
_droppingBlockLength = windowNum;
- if (windowNum == 1) {
- priority += 9;
- y += 10;
+ _droppingBlockType = 0;
+ if (windowNum != 1) {
+ _droppingBlockType = 1;
x += 15;
+ y += 10;
+ priority += 9;
}
_droppingBlockCount = 4;
- _droppingBlockType = 4;
}
for (i = 0; i < windowNum; i++) {
@@ -2969,16 +2972,111 @@ void AGOSEngine::startBlock(uint windowNum, uint zoneNum, uint vgaSpriteId, uint
tmp = to16Wrapper(priority);
+ sprite = _vgaCurSpriteId;
+ zone = _vgaCurZoneNum;
vcPtrOrg = _vcPtr;
+
_vcPtr = (byte *)&tmp;
vc23_setSpritePriority();
+
_vcPtr = vcPtrOrg;
+ _vgaCurSpriteId = sprite;
+ _vgaCurZoneNum = zone;
vgaSpriteId++;
x += 15;
y += 10;
priority += 8;
+
+ vsp++;
}
+
+ _lockWord &= ~0x40;
+}
+
+void AGOSEngine::checkIfClickedOnBlock() {
+ printf("CheckIfClickedOnBlock\n");
+
+ VgaSprite *vsp = _vgaSprites;
+ uint16 items[2];
+ uint16 image, x, y, zone, priority;
+
+ if (_droppingBlockAnim == 0) {
+ goto get_out;
+ }
+
+ _vgaCurSpriteId = _droppingBlockAnim;
+ _vgaCurZoneNum = 60;
+
+ if (_droppingBlockType == 0) {
+ if (_mouseX >= vsp->x)
+ goto get_out;
+ if (_mouseX - 75 < vsp->x)
+ goto get_out;
+ if (_mouseY >= vsp->y)
+ goto get_out;
+ if (_mouseY - 30 < vsp->y)
+ goto get_out;
+
+ if (_leftButtonDown == 0) {
+ _droppingBlockLand = 1;
+ goto get_out;
+ }
+
+ image = (vsp->image - 2) / 3 + 20;
+ zone = _droppingBlockAnim + 1024;
+ x = vsp->x + 15;
+ y = vsp->y + 10;
+ priority = vsp->priority + 9;
+
+ items[0] = to16Wrapper(60);
+ items[1] = to16Wrapper(_droppingBlockAnim);
+
+ _vcPtr = (byte *)&items;
+ vc60_killSprite();
+
+ startBlock(3, image, zone, x, y, priority);
+
+ _droppingBlockAnim = _variableArray[201];
+ _droppingBlockType = 1;
+ _droppingBlockLength = 3;
+ } else {
+ if (_mouseX >= vsp->x)
+ goto get_out;
+ if (_mouseX - 75 < vsp->x)
+ goto get_out;
+ if (_mouseY - 20 >= vsp->y)
+ goto get_out;
+ if (_mouseY + 30 < vsp->y)
+ goto get_out;
+
+ if (_leftButtonDown == 0) {
+ _droppingBlockLand = 1;
+ goto get_out;
+ }
+
+ image = (vsp->image - 20) * 3 + 2;
+ zone = _droppingBlockAnim - 1024;
+ x = vsp->x - 15;
+ y = vsp->y - 10;
+ priority = vsp->priority - 9;
+
+ items[0] = to16Wrapper(60);
+ items[1] = to16Wrapper(_droppingBlockAnim);
+
+ _vcPtr = (byte *)&items;
+ vc60_killSprite();
+
+ startBlock(1, image, zone, x, y, priority);
+
+ _droppingBlockAnim = _variableArray[201];
+ _droppingBlockType = 0;
+ _droppingBlockLength = 1;
+ }
+
+get_out:;
+ _leftButtonDown = 0;
+ _rightButtonDown = 0;
}
} // End of namespace AGOS