Skip to content

Commit

Permalink
PEGASUS: Add the WSC neighborhood
Browse files Browse the repository at this point in the history
Seems to be working fine, minus the molecule sprites (though the minigame is completable and the antidote can be found).
  • Loading branch information
Matthew Hoops committed Oct 14, 2011
1 parent 13fef21 commit 753006a
Show file tree
Hide file tree
Showing 14 changed files with 2,946 additions and 21 deletions.
1 change: 0 additions & 1 deletion engines/pegasus/constants.h
Expand Up @@ -745,7 +745,6 @@ const tRoomID kMars39 = 42;
const tRoomID kMars60 = 58;
const tRoomID kMarsMaze004 = 60;
const tRoomID kMarsMaze200 = 224;
static const tRoomID kWSC01 = 0;

} // End of namespace Pegasus

Expand Down
16 changes: 10 additions & 6 deletions engines/pegasus/input.cpp
Expand Up @@ -44,6 +44,7 @@ void InputDevice::getInput(Input &input, const tInputBits filter) {

tInputBits currentBits = 0;
bool consoleRequested = false;
bool altDown = false;

Common::Event event;
while (g_system->getEventManager()->pollEvent(event)) {
Expand Down Expand Up @@ -104,13 +105,13 @@ void InputDevice::getInput(Input &input, const tInputBits filter) {
break;
}

#if 0
// FIXME: This is disabled for now because it interferes with
// the ScummVM alt combinations. It's only used for one easter egg
// anyway, so I'll come up with something when I get around to that.
// WORKAROUND: The original had a specific key for this, but
// pressing alt would count as an event (and mess up someone
// trying to do alt+enter or something). Since it's only used
// as an easter egg, I'm just going to handle it as a separate
// bool value.
if (event.kbd.flags & Common::KBD_ALT)
currentBits |= (kRawButtonDown << kMod2ButtonShift);
#endif
altDown = true;
}
}

Expand All @@ -133,6 +134,9 @@ void InputDevice::getInput(Input &input, const tInputBits filter) {

// Set the console to be requested or not
input.setConsoleRequested(consoleRequested);

// Same for alt
input.setAltDown(altDown);
}

// Wait until the input device stops returning input allowed by filter...
Expand Down
6 changes: 5 additions & 1 deletion engines/pegasus/input.h
Expand Up @@ -358,23 +358,27 @@ friend class InputDevice;

bool anyInputBitSet(const tInputBits bits) const { return (_inputState & bits) != 0; }

bool isAltDown() const { return _altDown; }
bool isConsoleRequested() const { return _consoleRequested; }

void clearInput() {
_inputState = kAllUpBits;
_inputLocation.x = 0;
_inputLocation.y = 0;
_consoleRequested = false;
_altDown = false;
}

protected:
void setInputBits(const tInputBits state) { _inputState = state; }
void setInputLocation(const Common::Point &where) { _inputLocation = where; }
void setConsoleRequested(bool consoleRequested) { _consoleRequested = consoleRequested; }
void setAltDown(bool altDown) { _altDown = altDown; }

tInputBits _inputState;
Common::Point _inputLocation;
bool _consoleRequested;
bool _altDown;
};

class InputHandler {
Expand Down Expand Up @@ -476,7 +480,7 @@ class JMPPPInput {
static bool isToggleInfoInput(const Input &input) { return input.fourButtonDown(); }

// Hmmmmm....
static bool isEasterEggModifierInput(const Input &input) { return input.mod2ButtonAnyDown(); }
static bool isEasterEggModifierInput(const Input &input) { return input.isAltDown(); }

static bool isTogglePauseInput(const Input &input) { return input.mod3ButtonDown(); }
};
Expand Down
4 changes: 3 additions & 1 deletion engines/pegasus/module.mk
Expand Up @@ -59,7 +59,9 @@ MODULE_OBJS = \
neighborhood/caldoria/caldoriamirror.o \
neighborhood/prehistoric/prehistoric.o \
neighborhood/tsa/fulltsa.o \
neighborhood/tsa/tinytsa.o
neighborhood/tsa/tinytsa.o \
neighborhood/wsc/moleculebin.o \
neighborhood/wsc/wsc.o


# This module can be built as a plugin
Expand Down
1 change: 1 addition & 0 deletions engines/pegasus/neighborhood/tsa/fulltsa.cpp
Expand Up @@ -33,6 +33,7 @@
#include "pegasus/neighborhood/caldoria/caldoria.h"
#include "pegasus/neighborhood/prehistoric/prehistoric.h"
#include "pegasus/neighborhood/tsa/fulltsa.h"
#include "pegasus/neighborhood/wsc/wsc.h"

namespace Pegasus {

Expand Down
1 change: 1 addition & 0 deletions engines/pegasus/neighborhood/tsa/tinytsa.cpp
Expand Up @@ -30,6 +30,7 @@
#include "pegasus/items/biochips/aichip.h"
#include "pegasus/items/biochips/opticalchip.h"
#include "pegasus/neighborhood/tsa/tinytsa.h"
#include "pegasus/neighborhood/wsc/wsc.h"

namespace Pegasus {

Expand Down
127 changes: 127 additions & 0 deletions engines/pegasus/neighborhood/wsc/moleculebin.cpp
@@ -0,0 +1,127 @@
/* 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.
*
* Additional copyright for this file:
* Copyright (C) 1995-1997 Presto Studios, Inc.
*
* 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 "pegasus/graphics.h"
#include "pegasus/neighborhood/wsc/moleculebin.h"
#include "pegasus/neighborhood/wsc/wsc.h"

namespace Pegasus {

static const tCoordType kMoleculeBinWidth = 138;
static const tCoordType kMoleculeBinHeight = 128;

static const tCoordType kMoleculeWidth = 66;
static const tCoordType kMoleculeHeight = 40;

static const tCoordType kMoleculeBinLeft = kNavAreaLeft + 286;
static const tCoordType kMoleculeBinTop = kNavAreaLeft + 96;

// Layouts:

MoleculeBin::MoleculeBin() : DisplayElement(kNoDisplayElement) {
_highlightColor = g_system->getScreenFormat().RGBToColor(0xff, 0xff, 102);
_selectedMolecule = -1;
}

void MoleculeBin::initMoleculeBin() {
if (!isDisplaying()) {
for (int i = 0; i < 6; i++)
_binLayout[i] = i;

resetBin();
_binImages.getImageFromPICTFile("Images/World Science Center/Molecules");
setDisplayOrder(kWSCMoleculeBinOrder);
setBounds(kMoleculeBinLeft, kMoleculeBinTop, kMoleculeBinLeft + kMoleculeBinWidth,
kMoleculeBinTop + kMoleculeBinHeight);
startDisplaying();
show();
}
}

void MoleculeBin::cleanUpMoleculeBin() {
if (isDisplaying()) {
stopDisplaying();
_binImages.deallocateSurface();
}
}

void MoleculeBin::setBinLayout(const uint32 *layout) {
for (int i = 0; i < 6; i++)
_binLayout[i] = layout[i];
}

void MoleculeBin::highlightMolecule(const uint32 whichMolecule) {
if (!_moleculeFlags.getFlag(whichMolecule)) {
_moleculeFlags.setFlag(whichMolecule, true);
triggerRedraw();
}
}

bool MoleculeBin::isMoleculeHighlighted(uint32 whichMolecule) {
return _moleculeFlags.getFlag(whichMolecule);
}

void MoleculeBin::selectMolecule(const int whichMolecule) {
if (_selectedMolecule != whichMolecule) {
_selectedMolecule = whichMolecule;
triggerRedraw();
}
}

void MoleculeBin::resetBin() {
_moleculeFlags.clearAllFlags();
_selectedMolecule = -1;
triggerRedraw();
}

void MoleculeBin::draw(const Common::Rect &) {
Common::Rect r1(0, 0, kMoleculeWidth, kMoleculeHeight);
Common::Rect r2 = r1;

for (int i = 0; i < 6; i++) {
r1.moveTo(i * (kMoleculeWidth * 2), 0);

if (_moleculeFlags.getFlag(_binLayout[i]))
r1.translate(kMoleculeWidth, 0);

r1.moveTo((_binLayout[i] & 1) * (kMoleculeWidth + 2) + _bounds.left + 2,
(_binLayout[i] >> 1) * (kMoleculeHeight + 2) + _bounds.top + 2);

_binImages.copyToCurrentPort(r1, r2);
}

if (_selectedMolecule >= 0) {
r2.moveTo((_selectedMolecule & 1) * (kMoleculeWidth + 2) + _bounds.left + 2,
(_selectedMolecule >> 1) * (kMoleculeHeight + 2) + _bounds.top + 2);

Graphics::Surface *screen = ((PegasusEngine *)g_engine)->_gfx->getWorkArea();

screen->frameRect(r2, _highlightColor);
r2.grow(1);
screen->frameRect(r2, _highlightColor);
}
}

} // End of namespace Pegasus
72 changes: 72 additions & 0 deletions engines/pegasus/neighborhood/wsc/moleculebin.h
@@ -0,0 +1,72 @@
/* 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.
*
* Additional copyright for this file:
* Copyright (C) 1995-1997 Presto Studios, Inc.
*
* 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.
*
*/

#ifndef PEGASUS_NEIGHBORHOOD_WSC_MOLECULEBIN_H
#define PEGASUS_NEIGHBORHOOD_WSC_MOLECULEBIN_H

#include "pegasus/elements.h"
#include "pegasus/surface.h"
#include "pegasus/util.h"

namespace Pegasus {

enum {
kMolecule1,
kMolecule2,
kMolecule3,
kMolecule4,
kMolecule5,
kMolecule6
};

class MoleculeBin : public DisplayElement {
public:
MoleculeBin();
virtual ~MoleculeBin() {}

void initMoleculeBin();
void cleanUpMoleculeBin();

void setBinLayout(const uint32 *);

void highlightMolecule(const uint32 whichMolecule);
void selectMolecule(const int whichMolecule);
void resetBin();

bool isMoleculeHighlighted(uint32);

protected:
void draw(const Common::Rect &);

Surface _binImages;
FlagsArray<byte, kMolecule6 + 1> _moleculeFlags;
int _selectedMolecule;
uint32 _binLayout[6];
uint32 _highlightColor;
};

} // End of namespace Pegasus

#endif

0 comments on commit 753006a

Please sign in to comment.