Skip to content

Commit

Permalink
BLADERUNNER: Implement loading and drawing of mouse cursors.
Browse files Browse the repository at this point in the history
  • Loading branch information
madmoose authored and sev- committed Sep 29, 2016
1 parent da33169 commit 0fa2191
Show file tree
Hide file tree
Showing 7 changed files with 522 additions and 2 deletions.
17 changes: 16 additions & 1 deletion engines/bladerunner/bladerunner.cpp
Expand Up @@ -28,19 +28,22 @@
#include "bladerunner/audio_speech.h"
#include "bladerunner/chapters.h"
#include "bladerunner/clues.h"
#include "bladerunner/gameinfo.h"
#include "bladerunner/gameflags.h"
#include "bladerunner/gameinfo.h"
#include "bladerunner/image.h"
#include "bladerunner/mouse.h"
#include "bladerunner/outtake.h"
#include "bladerunner/scene.h"
#include "bladerunner/script/init.h"
#include "bladerunner/script/script.h"
#include "bladerunner/settings.h"
#include "bladerunner/shape.h"
#include "bladerunner/slice_animations.h"
#include "bladerunner/slice_renderer.h"
#include "bladerunner/text_resource.h"
#include "bladerunner/vqa_decoder.h"

#include "common/array.h"
#include "common/error.h"
#include "common/events.h"
#include "common/system.h"
Expand All @@ -66,6 +69,7 @@ BladeRunnerEngine::BladeRunnerEngine(OSystem *syst)
_gameInfo = nullptr;
_gameFlags = new GameFlags();
_gameVars = nullptr;
_mouse = new Mouse(this);
_scene = new Scene(this);
_script = new Script(this);
_settings = new Settings(this);
Expand Down Expand Up @@ -168,6 +172,13 @@ bool BladeRunnerEngine::startup() {
if (!r)
return false;

for (int i = 0; i != 43; ++i) {
Shape *shape = new Shape(this);
shape->readFromContainer("SHAPES.SHP", i);
_shapes.push_back(shape);
}
_mouse->setCursor(0);

r = _sliceAnimations->open("INDEX.DAT");
if (!r)
return false;
Expand Down Expand Up @@ -299,6 +310,10 @@ void BladeRunnerEngine::gameTick() {
// TODO: Draw item pickup (understood, drawing works in Replicant)
// TODO: Draw dialogue menu
// TODO: Draw mouse (understood)

Common::Point p = _eventMan->getMousePos();
_mouse->draw(_surface2, p.x, p.y);

// TODO: Process AUD (audio in Replicant)
// TODO: Footstep sound

Expand Down
6 changes: 5 additions & 1 deletion engines/bladerunner/bladerunner.h
Expand Up @@ -43,9 +43,11 @@ class Chapters;
class Clues;
class GameInfo;
class GameFlags;
class Mouse;
class Scene;
class Script;
class Settings;
class Shape;
class SliceAnimations;
class SliceRenderer;
class TextResource;
Expand All @@ -60,8 +62,9 @@ class BladeRunnerEngine : public Engine {
AudioSpeech *_audioSpeech;
Chapters *_chapters;
Clues *_clues;
GameInfo *_gameInfo;
GameFlags *_gameFlags;
GameInfo *_gameInfo;
Mouse *_mouse;
Scene *_scene;
Script *_script;
Settings *_settings;
Expand All @@ -70,6 +73,7 @@ class BladeRunnerEngine : public Engine {
int *_gameVars;

TextResource *_actorNames;
Common::Array<Shape*> _shapes;

int in_script_counter;

Expand Down
2 changes: 2 additions & 0 deletions engines/bladerunner/module.mk
Expand Up @@ -18,13 +18,15 @@ MODULE_OBJS = \
gameinfo.o \
image.o \
matrix.o \
mouse.o \
outtake.o \
scene.o \
script/init.o \
script/rc01.o \
script/script.o \
set.o \
settings.o \
shape.o \
slice_animations.o \
slice_renderer.o \
text_resource.o \
Expand Down
250 changes: 250 additions & 0 deletions engines/bladerunner/mouse.cpp
@@ -0,0 +1,250 @@
/* 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 "bladerunner/mouse.h"

#include "bladerunner/bladerunner.h"
#include "bladerunner/shape.h"

#include "graphics/surface.h"

namespace BladeRunner {

Mouse::Mouse(BladeRunnerEngine *vm)
: _vm(vm)
{
_cursor = 0;
_frame = 3;
_hotspotX = 0;
_hotspotY = 0;
_x = 0;
_y = 0;
_disabledCounter = 0;
_lastFrameTime = 0;
}

Mouse::~Mouse() {
}

void Mouse::setCursor(int cursor) {
assert(cursor >= 0 && cursor <= 16);
if (cursor == _cursor) {
return;
}

_cursor = cursor;

switch (_cursor) {
case 0:
_frame = 3;
_hotspotX = 0;
_hotspotY = 0;
break;
case 1:
_frame = 4;
_hotspotX = 0;
_hotspotY = 0;
break;
case 2:
_frame = 12;
_hotspotX = 12;
_hotspotY = 0;
break;
case 3:
_frame = 15;
_hotspotX = 23;
_hotspotY = 12;
break;
case 4:
_frame = 13;
_hotspotX = 12;
_hotspotY = 23;
break;
case 5:
_frame = 14;
_hotspotX = 0;
_hotspotY = 12;
break;
case 6:
_frame = 16;
_hotspotX = 19;
_hotspotY = 19;
break;
case 7:
_frame = 17;
_hotspotX = 19;
_hotspotY = 19;
break;
case 8:
_frame = 25;
_hotspotX = 19;
_hotspotY = 19;
break;
case 9:
_frame = 26;
_hotspotX = 19;
_hotspotY = 19;
break;
case 10:
_frame = 34;
_hotspotX = 19;
_hotspotY = 19;
break;
case 11:
_frame = 35;
_hotspotX = 19;
_hotspotY = 19;
break;
case 12:
_frame = 12;
_hotspotX = 12;
_hotspotY = 0;
_animCounter = 0;
break;
case 13:
_frame = 15;
_hotspotX = 23;
_hotspotY = 12;
_animCounter = 0;
break;
case 14:
_frame = 13;
_hotspotX = 12;
_hotspotY = 23;
_animCounter = 0;
break;
case 15:
_frame = 14;
_hotspotX = 0;
_hotspotY = 12;
_animCounter = 0;
break;
case 16:
_frame = 0;
_hotspotX = 11;
_hotspotY = 11;
}
}

void Mouse::disable() {
++_disabledCounter;
}

void Mouse::enable() {
if (--_disabledCounter <= 0) {
_disabledCounter = 0;
}
}

bool Mouse::isDisabled() {
return _disabledCounter > 0;
}

void Mouse::draw(Graphics::Surface &surface, int x, int y) {
if (_disabledCounter) {
return;
}

_x = CLIP(x, 0, surface.w - 1);
_y = CLIP(y, 0, surface.h - 1);


if (_cursor < 0 || (uint)_cursor >= _vm->_shapes.size()) {
return;
}

Shape *cursorShape = _vm->_shapes[_frame];

cursorShape->draw(surface, _x - _hotspotX, _y - _hotspotY);

updateCursorFrame();
}

void Mouse::updateCursorFrame() {
uint32 now = _vm->getTotalPlayTime();
const int offset[4] = { 0, 6, 12, 6 };

if (now - _lastFrameTime < 66) {
return;
}
_lastFrameTime = now;

switch (_cursor) {
case 0:
break;
case 1:
if (++_frame > 11)
_frame = 4;
break;
case 2:
case 3:
case 4:
case 5:
case 6:
break;
case 7:
if (++_frame > 24)
_frame = 17;
break;
case 8:
break;
case 9:
if (++_frame > 33)
_frame = 26;
break;
case 10:
break;
case 11:
if (++_frame > 42)
_frame = 35;
break;
case 12:
if (++_animCounter >= 4) {
_animCounter = 0;
}
_hotspotY = -offset[_animCounter];
break;
case 13:
if (++_animCounter >= 4) {
_animCounter = 0;
}
_hotspotX = 23 + offset[_animCounter];
break;
case 14:
if (++_animCounter >= 4) {
_animCounter = 0;
}
_hotspotY = 23 + offset[_animCounter];
break;
case 15:
if (++_animCounter >= 4) {
_animCounter = 0;
}
_hotspotX = -offset[_animCounter];
break;
case 16:
if (++_frame > 2)
_frame = 0;
}
}

} // End of namespace BladeRunner

0 comments on commit 0fa2191

Please sign in to comment.