ADL: Implement a few hires2 opcodes

This commit is contained in:
Walter van Niftrik
2016-06-06 20:35:49 +02:00
committed by Walter van Niftrik
parent 8a05a9cbca
commit 3f7d5608a9
4 changed files with 60 additions and 9 deletions
+6 -3
View File
@@ -343,6 +343,10 @@ void AdlEngine::setupOpcodeTables() {
Opcode(o1_setRoomPic);
}
bool AdlEngine::matchesCurrentPic(byte pic) const {
return pic == getCurRoom().curPicture;
}
void AdlEngine::clearScreen() const {
_display->setMode(DISPLAY_MODE_MIXED);
_display->clear(0x00);
@@ -369,8 +373,7 @@ void AdlEngine::drawItems() const {
Common::Array<byte>::const_iterator pic;
for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
// IDI_NONE check was added in hires2
if (*pic == getCurRoom().curPicture || *pic == IDI_NONE) {
if (matchesCurrentPic(*pic)) {
drawItem(*item, item->position);
continue;
}
@@ -451,7 +454,7 @@ void AdlEngine::takeItem(byte noun) {
Common::Array<byte>::const_iterator pic;
for (pic = item->roomPictures.begin(); pic != item->roomPictures.end(); ++pic) {
if (*pic == getCurRoom().curPicture) {
if (matchesCurrentPic(*pic)) {
item->room = IDI_NONE;
item->state = IDI_ITEM_DROPPED;
return;
+1
View File
@@ -175,6 +175,7 @@ protected:
virtual void checkInput(byte verb, byte noun);
virtual void setupOpcodeTables();
virtual bool matchesCurrentPic(byte pic) const;
// Opcodes
int o1_isItemInRoom(ScriptEnv &e);
+47 -6
View File
@@ -76,14 +76,14 @@ void AdlEngine_v2::setupOpcodeTables() {
Opcode(o1_setLight);
Opcode(o1_setDark);
// 0x0c
OpcodeUnImpl();
Opcode(o2_moveAllItems);
Opcode(o1_quit);
OpcodeUnImpl();
Opcode(o1_save);
Opcode(o1_save); // TODO
// 0x10
Opcode(o1_restore);
Opcode(o1_restore); // TODO
Opcode(o1_restart);
Opcode(o1_placeItem);
Opcode(o2_placeItem);
Opcode(o1_setItemPic);
// 0x14
Opcode(o1_resetPic);
@@ -100,6 +100,10 @@ void AdlEngine_v2::setupOpcodeTables() {
Opcode(o1_setRoomPic);
}
bool AdlEngine_v2::matchesCurrentPic(byte pic) const {
return pic == getCurRoom().curPicture || pic == IDI_NONE;
}
int AdlEngine_v2::o2_isFirstTime(ScriptEnv &e) {
bool oldFlag = getCurRoom().isFirstTime;
@@ -164,8 +168,6 @@ int AdlEngine_v2::o2_moveItem(ScriptEnv &e) {
Item &item = getItem(e.arg(1));
// Not implemented: set redraw flag if item room == displayed room
// Set items that move from inventory to a room to state "dropped"
if (item.room == IDI_NONE && room != IDI_VOID_ROOM)
item.state = IDI_ITEM_DROPPED;
@@ -174,4 +176,43 @@ int AdlEngine_v2::o2_moveItem(ScriptEnv &e) {
return 2;
}
int AdlEngine_v2::o2_moveAllItems(ScriptEnv &e) {
byte room1 = e.arg(1);
if (room1 == IDI_CUR_ROOM)
room1 = _state.room;
byte room2 = e.arg(2);
if (room2 == IDI_CUR_ROOM)
room2 = _state.room;
Common::Array<Item>::iterator item;
for (item = _state.items.begin(); item != _state.items.end(); ++item)
if (item->room == room1) {
item->room = room2;
if (room1 == IDI_NONE)
item->state = IDI_ITEM_DROPPED;
}
return 2;
}
int AdlEngine_v2::o2_placeItem(ScriptEnv &e) {
byte room = e.arg(2);
if (room == IDI_CUR_ROOM)
room = _state.room;
Item &item = getItem(e.arg(1));
item.room = room;
item.position.x = e.arg(3);
item.position.y = e.arg(4);
item.state = IDI_ITEM_NOT_MOVED;
return 4;
}
} // End of namespace Adl
+6
View File
@@ -25,6 +25,9 @@
#include "adl/adl.h"
// Note: this version of ADL redraws only when necessary, but
// this is not currently implemented.
#define IDI_CUR_ROOM 0xfc
#define IDI_VOID_ROOM 0xfd
@@ -42,12 +45,15 @@ protected:
AdlEngine_v2(OSystem *syst, const AdlGameDescription *gd);
virtual void setupOpcodeTables();
bool matchesCurrentPic(byte pic) const;
int o2_isFirstTime(ScriptEnv &e);
int o2_isRandomGT(ScriptEnv &e);
int o2_isItemInRoom(ScriptEnv &e);
int o2_isNounNotInRoom(ScriptEnv &e);
int o2_isCarryingSomething(ScriptEnv &e);
int o2_moveAllItems(ScriptEnv &e);
int o2_placeItem(ScriptEnv &e);
int o2_moveItem(ScriptEnv &e);