Add German verbs and more work on input in C64 maniac

svn-id: r21089
This commit is contained in:
Travis Howell 2006-03-05 08:22:39 +00:00
parent 68bdc98e0b
commit 7a9ed5425b
6 changed files with 105 additions and 39 deletions

View File

@ -300,6 +300,8 @@ protected:
void initV2MouseOver();
void initNESMouseOver();
void runObject(int obj, int entry);
/* Version 2 script opcodes */
void o2_actorFromPos();
void o2_actorOps();
@ -397,7 +399,6 @@ protected:
const OpcodeEntryC64 *_opcodesC64;
int _activeVerb;
int _currentMode;
public:
ScummEngine_c64(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], SubstResFileNames subst);
@ -478,6 +479,7 @@ protected:
void o_notEqualZero();
void o_equalZero();
void o_jumpRelative();
void o_setOwnerOf();
};
class ScummEngine_v6 : public ScummEngine {

View File

@ -87,7 +87,7 @@ void ScummEngine_c64::setupOpcodes() {
OPCODE(o2_getActorY),
/* 28 */
OPCODE(o_equalZero),
OPCODE(o2_setOwnerOf),
OPCODE(o_setOwnerOf),
OPCODE(o2_delay),
OPCODE(o_setActorBitVar),
/* 2C */
@ -167,7 +167,7 @@ void ScummEngine_c64::setupOpcodes() {
OPCODE(o5_getActorFacing),
/* 68 */
OPCODE(o5_isScriptRunning),
OPCODE(o2_setOwnerOf),
OPCODE(o_setOwnerOf),
OPCODE(o_stopCurrentScript),
OPCODE(o_setActorBitVar),
/* 6C */
@ -247,7 +247,7 @@ void ScummEngine_c64::setupOpcodes() {
OPCODE(o2_getActorY),
/* A8 */
OPCODE(o_notEqualZero),
OPCODE(o2_setOwnerOf),
OPCODE(o_setOwnerOf),
OPCODE(o_stopCurrentScript),
OPCODE(o_setActorBitVar),
/* AC */
@ -327,7 +327,7 @@ void ScummEngine_c64::setupOpcodes() {
OPCODE(o5_getActorFacing),
/* E8 */
OPCODE(o5_isScriptRunning),
OPCODE(o2_setOwnerOf),
OPCODE(o_setOwnerOf),
OPCODE(o_stopCurrentScript),
OPCODE(o_setActorBitVar),
/* EC */
@ -984,10 +984,22 @@ void ScummEngine_c64::o_jumpRelative() {
_scriptPointer += offset;
}
void ScummEngine_c64::o_setOwnerOf() {
int obj, owner;
obj = getVarOrDirectWord(PARAM_1);
owner = getVarOrDirectByte(PARAM_2);
if (obj == 0)
obj = _activeInventory;
setOwnerOf(obj, owner);
}
void ScummEngine_c64::resetSentence() {
_activeVerb = 0;
_activeInventory = 0;
_activeObject = 0;
_activeVerb = 13;
}
#undef PARAM_1

View File

@ -572,6 +572,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS
_userState = 0;
_activeInventory = 0;
_activeObject = 0;
_activeVerb = 0;
_resourceHeaderSize = 8;
_saveLoadFlag = 0;
_saveLoadSlot = 0;
@ -1005,7 +1006,6 @@ ScummEngine_v2::ScummEngine_v2(GameDetector *detector, OSystem *syst, const Scum
ScummEngine_c64::ScummEngine_c64(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], SubstResFileNames subst)
: ScummEngine_v2(detector, syst, gs, md5sum, subst) {
_activeVerb = 0;
_currentMode = 0;
}

View File

@ -883,6 +883,7 @@ protected:
int _activeInventory;
int _activeObject;
int _activeVerb;
virtual void handleMouseOver(bool updateInventory);
virtual void redrawVerbs();

View File

@ -109,12 +109,14 @@ void ScummEngine::setupScummVars() {
}
void ScummEngine_c64::setupScummVars() {
// TODO
VAR_EGO = 0;
VAR_CAMERA_POS_X = 2;
VAR_HAVE_MSG = 3;
VAR_ROOM = 4;
//VAR_ACTIVE_ACTOR = 5;
VAR_OVERRIDE = 6;
//VAR_IS_SOUND_RUNNING = 8;
//VAR_ACTIVE_VERB = 9;
VAR_CHARCOUNT = 10;
// FIXME: Should be removed
@ -544,6 +546,8 @@ void ScummEngine_v8::setupScummVars() {
#endif
void ScummEngine_c64::initScummVars() {
_activeInventory = 0;
_activeObject = 0;
_activeVerb = 13;
VAR(VAR_EGO) = 3;

View File

@ -46,8 +46,7 @@ struct VerbSettings {
const char *name;
};
static const VerbSettings C64VerbTable[] =
{
static const VerbSettings C64VerbTable_English[] = {
{ 1, 8, 0, 0, "Open"},
{ 2, 8, 1, 0, "Close"},
{ 3, 0, 2, 4, "Give"},
@ -65,6 +64,24 @@ static const VerbSettings C64VerbTable[] =
{15, 15, 2, 0, "What Is"}
};
static const VerbSettings C64VerbTable_German[] = {
{ 1, 6, 0, 0, "Zieh"},
{ 2, 6, 1, 0, "Druck"},
{ 3, 0, 2, 4, "Lies"},
{ 4, 29, 0, 0, "Schliess au"},
{ 5, 29, 1, 0, "Schalt ein"},
{ 6, 29, 2, 2, "Schalt aus"},
{ 7, 20, 0, 0, "Person"},
{ 8, 20, 1, 2, "Schliess"},
{ 9, 0, 0, 0, "Nimm"},
{10, 0, 1, 0, "Gib"},
{11, 20, 2, 255, "Reparier"},
{12, 6, 2, 0, "Offne"},
{13, 12, 0, 0, "Gehe zu"},
{14, 12, 1, 0, "Was ist"},
{15, 12, 2, 0, "Benutz"}
};
void ScummEngine_c64::initC64Verbs() {
VirtScreen *virt = &virtscr[kVerbVirtScreen];
VerbSlot *vs;
@ -72,7 +89,7 @@ void ScummEngine_c64::initC64Verbs() {
for (i = 1; i < 16; i++) {
vs = &_verbs[i];
vs->verbid = C64VerbTable[i - 1].id;
vs->verbid = C64VerbTable_English[i - 1].id;
vs->color = 5;
vs->hicolor = 7;
vs->dimcolor = 11;
@ -83,12 +100,17 @@ void ScummEngine_c64::initC64Verbs() {
vs->key = 0;
vs->center = 0;
vs->imgindex = 0;
vs->prep = C64VerbTable[i - 1].prep;
vs->prep = C64VerbTable_English[i - 1].prep;
vs->curRect.left = C64VerbTable[i - 1].x_pos * 8;
vs->curRect.top = C64VerbTable[i - 1].y_pos * 8 + virt->topline + 8;
loadPtrToResource(rtVerb, i, (const byte*)C64VerbTable[i - 1].name);
if (_language == Common::DE_DEU) {
vs->curRect.left = C64VerbTable_German[i - 1].x_pos * 8;
vs->curRect.top = C64VerbTable_German[i - 1].y_pos * 8 + virt->topline + 8;
loadPtrToResource(rtVerb, i, (const byte*)C64VerbTable_German[i - 1].name);
} else {
vs->curRect.left = C64VerbTable_English[i - 1].x_pos * 8;
vs->curRect.top = C64VerbTable_English[i - 1].y_pos * 8 + virt->topline + 8;
loadPtrToResource(rtVerb, i, (const byte*)C64VerbTable_English[i - 1].name);
}
}
}
@ -308,10 +330,19 @@ void ScummEngine_v2::checkV2Inventory(int x, int y) {
object = findInventory(_scummVars[VAR_EGO], object + 1 + _inventoryOffset);
if (_game.platform == Common::kPlatformC64 && _game.id == GID_MANIAC) {
_activeInventory = object;
} else if (object > 0) {
runInputScript(3, object, 0);
if (object > 0) {
if (_game.platform == Common::kPlatformC64 && _game.id == GID_MANIAC) {
if (_activeInventory != object) {
_activeInventory = object;
} else if (_activeVerb != 3 && _activeVerb != 13) {
if (_activeObject)
runObject(_activeObject, _activeVerb);
else
runObject(_activeInventory, _activeVerb);
}
} else {
runInputScript(3, object, 0);
}
}
}
@ -503,6 +534,19 @@ void ScummEngine::checkExecVerbs() {
}
}
void ScummEngine_v2::runObject(int obj, int entry) {
if (getVerbEntrypoint(obj, entry) != 0) {
runObjectScript(obj, entry, false, false, NULL);
} else {
VAR(9) = entry;
runScript(3, 0, 0, 0);
}
_activeInventory = 0;
_activeObject = 0;
_activeVerb = 13;
}
void ScummEngine_c64::checkExecVerbs() {
Actor *a;
VirtScreen *zone = findVirtScreen(_mouse.y);
@ -526,32 +570,35 @@ void ScummEngine_c64::checkExecVerbs() {
return;
}
int object = findObject(_virtualMouse.x, _virtualMouse.y);
if (object) {
_activeObject = object;
int act = getActorFromPos(_virtualMouse.x, _virtualMouse.y);
int obj = findObject(_virtualMouse.x, _virtualMouse.y);
if (act != 0 && _activeVerb == 3 && _activeInventory != 0) {
VAR(5) = act;
runObject(_activeInventory, _activeVerb);
} else if (obj) {
if (_currentMode == 3 && _activeVerb != 13 && obj != _activeObject) {
_activeObject = obj;
return;
}
_activeObject = obj;
if (_currentMode == 3) {
int x, y, dir;
a = derefActor(VAR(VAR_EGO), "checkExecVerbs");
getObjectXYPos(object, x, y, dir);
getObjectXYPos(obj, x, y, dir);
a->startWalkActor(x, y, dir);
}
int tmp = (_currentMode == 3) ? _activeVerb : 15;
if (getVerbEntrypoint(object, tmp) != 0) {
runObjectScript(object, tmp, false, false, NULL);
} else if (_activeVerb != 13 && _activeVerb != 15) {
VAR(9) = _activeVerb;
runScript(3, 0, 0, 0);
}
} else {
_activeInventory = 0;
_activeObject = 0;
_activeVerb = 13;
if (zone->number == kMainVirtScreen) {
a = derefActor(VAR(VAR_EGO), "checkExecVerbs");
a->startWalkActor(_virtualMouse.x, _virtualMouse.y, -1);
}
int entry = (_currentMode == 3) ? _activeVerb : 15;
runObject(_activeObject, entry);
} else if (zone->number == kMainVirtScreen) {
a = derefActor(VAR(VAR_EGO), "checkExecVerbs");
a->startWalkActor(_virtualMouse.x, _virtualMouse.y, -1);
}
_activeInventory = 0;
_activeObject = 0;
_activeVerb = 13;
}
}
}