mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
ADL: Implement a few hires2 opcodes
This commit is contained in:
committed by
Walter van Niftrik
parent
8a05a9cbca
commit
3f7d5608a9
+6
-3
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user