scummvm/engines/dreamweb/use.cpp
2011-09-07 04:00:56 +02:00

179 lines
5.9 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "dreamweb/dreamweb.h"
namespace DreamGen {
typedef void (DreamGenContext::*UseCallback)(void);
struct UseListEntry {
uint8 id[5]; // 0-terminal because it is easier syntatically to initialize the array
UseCallback callback;
};
void DreamGenContext::useroutine() {
static const UseListEntry kUseList[] = {
{ "NETW", &DreamGenContext::usemon },
{ "ELVA", &DreamGenContext::useelevator1 },
{ "ELVB", &DreamGenContext::useelevator2 },
{ "ELVC", &DreamGenContext::useelevator3 },
{ "ELVE", &DreamGenContext::useelevator4 },
{ "ELVF", &DreamGenContext::useelevator5 },
{ "CGAT", &DreamGenContext::usechurchgate },
{ "REMO", &DreamGenContext::usestereo },
{ "BUTA", &DreamGenContext::usebuttona },
{ "CBOX", &DreamGenContext::usewinch },
{ "LITE", &DreamGenContext::uselighter },
{ "PLAT", &DreamGenContext::useplate },
{ "LIFT", &DreamGenContext::usecontrol },
{ "WIRE", &DreamGenContext::usewire },
{ "HNDL", &DreamGenContext::usehandle },
{ "HACH", &DreamGenContext::usehatch },
{ "DOOR", &DreamGenContext::useelvdoor },
{ "CSHR", &DreamGenContext::usecashcard },
{ "GUNA", &DreamGenContext::usegun },
{ "CRAA", &DreamGenContext::usecardreader1 },
{ "CRBB", &DreamGenContext::usecardreader2 },
{ "CRCC", &DreamGenContext::usecardreader3 },
{ "SEAT", &DreamGenContext::sitdowninbar },
{ "MENU", &DreamGenContext::usemenu },
{ "COOK", &DreamGenContext::usecooker },
{ "ELCA", &DreamGenContext::callhotellift },
{ "EDCA", &DreamGenContext::calledenslift },
{ "DDCA", &DreamGenContext::calledensdlift },
{ "ALTR", &DreamGenContext::usealtar },
{ "LOKA", &DreamGenContext::openhoteldoor },
{ "LOKB", &DreamGenContext::openhoteldoor2 },
{ "ENTA", &DreamGenContext::openlouis },
{ "ENTB", &DreamGenContext::openryan },
{ "ENTE", &DreamGenContext::openpoolboss },
{ "ENTC", &DreamGenContext::openyourneighbour },
{ "ENTD", &DreamGenContext::openeden },
{ "ENTH", &DreamGenContext::opensarters },
{ "WWAT", &DreamGenContext::wearwatch },
{ "POOL", &DreamGenContext::usepoolreader },
{ "WSHD", &DreamGenContext::wearshades },
{ "GRAF", &DreamGenContext::grafittidoor },
{ "TRAP", &DreamGenContext::trapdoor },
{ "CDPE", &DreamGenContext::edenscdplayer },
{ "DLOK", &DreamGenContext::opentvdoor },
{ "HOLE", &DreamGenContext::usehole },
{ "DRYR", &DreamGenContext::usedryer },
{ "HOLY", &DreamGenContext::usechurchhole },
{ "WALL", &DreamGenContext::usewall },
{ "BOOK", &DreamGenContext::usediary },
{ "AXED", &DreamGenContext::useaxe },
{ "SHLD", &DreamGenContext::useshield },
{ "BCNY", &DreamGenContext::userailing },
{ "LIDC", &DreamGenContext::usecoveredbox },
{ "LIDU", &DreamGenContext::useclearbox },
{ "LIDO", &DreamGenContext::useopenbox },
{ "PIPE", &DreamGenContext::usepipe },
{ "BALC", &DreamGenContext::usebalcony },
{ "WIND", &DreamGenContext::usewindow },
{ "PAPR", &DreamGenContext::viewfolder },
{ "UWTA", &DreamGenContext::usetrainer },
{ "UWTB", &DreamGenContext::usetrainer },
{ "STAT", &DreamGenContext::entersymbol },
{ "TLID", &DreamGenContext::opentomb },
{ "SLAB", &DreamGenContext::useslab },
{ "CART", &DreamGenContext::usecart },
{ "FCAR", &DreamGenContext::usefullcart },
{ "SLBA", &DreamGenContext::slabdoora },
{ "SLBB", &DreamGenContext::slabdoorb },
{ "SLBC", &DreamGenContext::slabdoorc },
{ "SLBD", &DreamGenContext::slabdoord },
{ "SLBE", &DreamGenContext::slabdoore },
{ "SLBF", &DreamGenContext::slabdoorf },
{ "PLIN", &DreamGenContext::useplinth },
{ "LADD", &DreamGenContext::useladder },
{ "LADB", &DreamGenContext::useladderb },
{ "GUMA", &DreamGenContext::chewy },
{ "SQEE", &DreamGenContext::wheelsound },
{ "TAPP", &DreamGenContext::runtap },
{ "GUIT", &DreamGenContext::playguitar },
{ "CONT", &DreamGenContext::hotelcontrol },
{ "BELL", &DreamGenContext::hotelbell },
};
if (data.byte(kReallocation) >= 50) {
if (data.byte(kPointerpower) == 0)
return;
data.byte(kPointerpower) = 0;
}
getanyad();
const uint8 *id = es.ptr(bx + 12, 4);
for (size_t i = 0; i < sizeof(kUseList)/sizeof(UseListEntry); ++i) {
const UseListEntry &entry = kUseList[i];
if (('A' + id[0] == entry.id[0]) && ('A' + id[1] == entry.id[1]) && ('A' + id[2] == entry.id[2]) && ('A' + id[3] == entry.id[3])) {
(this->*entry.callback)();
return;
}
}
delpointer();
uint8 *obText = getobtextstartCPP();
if (findnextcolon(&obText) != 0) {
if (findnextcolon(&obText) != 0) {
if (*obText != 0) {
usetext(obText);
hangonp(400);
putbackobstuff();
return;
}
}
}
createpanel();
showpanel();
showman();
showexit();
obicons();
printmessage(33, 100, 63, 241, true);
worktoscreenm();
hangonp(50);
putbackobstuff();
data.byte(kCommandtype) = 255;
}
void DreamGenContext::usetext() {
usetext(es.ptr(si, 0));
}
void DreamGenContext::usetext(const uint8 *string) {
createpanel();
showpanel();
showman();
showexit();
obicons();
printdirect(string, 36, 104, 241, true);
worktoscreenm();
}
} /*namespace dreamgen */