diff options
Diffstat (limited to 'engines/bladerunner/ui/scores.cpp')
-rw-r--r-- | engines/bladerunner/ui/scores.cpp | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/engines/bladerunner/ui/scores.cpp b/engines/bladerunner/ui/scores.cpp new file mode 100644 index 0000000000..c4a7df778c --- /dev/null +++ b/engines/bladerunner/ui/scores.cpp @@ -0,0 +1,218 @@ +/* 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/ui/scores.h" + +#include "bladerunner/bladerunner.h" +#include "bladerunner/font.h" +#include "bladerunner/savefile.h" +#include "bladerunner/scene.h" +#include "bladerunner/text_resource.h" +#include "bladerunner/vqa_player.h" + +#include "common/keyboard.h" + +namespace BladeRunner { + +Scores::Scores(BladeRunnerEngine *vm) { + _vm = vm; + + _font = nullptr; + _txtScorers = nullptr; + + reset(); +} + +Scores::~Scores() { +} + +void Scores::open() { + if (!_vm->openArchive("MODE.MIX")) { + return; + } + + _vqaPlayer = new VQAPlayer(_vm, &_vm->_surfaceBack); + + if (!_vqaPlayer->open("SCORE.VQA")) { + return; + } + + _vqaPlayer->setLoop(1, -1, 0, nullptr, nullptr); + + // TODO: Freeze game time + + _txtScorers = new TextResource(_vm); + _txtScorers->open("SCORERS"); + + _font = new Font(_vm); + _font->open("TAHOMA24.FON", 640, 480, -1, 0, 0); + _font->setSpacing(1, 0); + + fill(); + + _isOpen = true; + _isLoaded = false; +} + +bool Scores::isOpen() const { + return _isOpen; +} + +void Scores::close() { + _isOpen = false; + + delete _font; + _font = nullptr; + + delete _txtScorers; + _txtScorers = nullptr; + + if (_vqaPlayer) { + _vqaPlayer->close(); + delete _vqaPlayer; + _vqaPlayer = nullptr; + } + + _vm->closeArchive("MODE.MIX"); + + // TODO: Unfreeze game time + _vm->_scene->resume(); +} + +void Scores::set(int index, int value) { + if (value > _scores[index]) { + _scores[index] = value; + } + + _lastScoreId = index; + _lastScoreValue = value; +} + +void Scores::handleKeyDown(const Common::KeyState &kbd) { + close(); +} + +int Scores::handleMouseUp(int x, int y) { + if (_isLoaded) { + close(); + } + + _isLoaded = false; + + return false; +} + +int Scores::handleMouseDown(int x, int y) { + _isLoaded = true; + + return false; +} + +void Scores::tick() { + if (!_vm->_gameIsRunning) { + return; + } + + int frame = _vqaPlayer->update(); + assert(frame >= -1); + + // vqaPlayer renders to _surfaceBack + blit(_vm->_surfaceBack, _vm->_surfaceFront); + + _vm->_surfaceFront.hLine(200, 139, 400, 0x3e0); + _vm->_surfaceFront.hLine(200, 347, 400, 0x1f); + + _font->draw(_txtScorers->getText(7), _vm->_surfaceFront, 200, 114); + + int y = 140; + + for (int i = 0; i < 7; i++) { + _font->draw(_txtScorers->getText(_scorers[i]), _vm->_surfaceFront, 220, y); + _font->drawNumber(_scores[_scorers[i]], _vm->_surfaceFront, 360, y); + + y += 26; + } + + _font->draw(_txtScorers->getText(8), _vm->_surfaceFront, 200, 322); + _font->draw(_txtScorers->getText(_lastScoreId), _vm->_surfaceFront, 220, 348); + _font->drawNumber(_lastScoreValue, _vm->_surfaceFront, 360, 348); + + _vm->blitToScreen(_vm->_surfaceFront); +} + +void Scores::fill() { + for (int i = 0; i < 7; i++) { + _scorers[i] = i; + } + + // Network sorting using Bose-Nelson Algorithm + const byte network[32] = { // Bose-Nelson + 1,2, 3,4, 5,6, + 0,2, 3,5, 4,6, + 0,1, 4,5, 2,6, + 0,4, 1,5, + 0,3, 2,5, + 1,3, 2,4, + 2,3 + }; + + for (int i = 0; i < 32; i += 2) { + int i1 = network[i], i2 = network[i + 1]; + if (_scores[_scorers[i1]] < _scores[_scorers[i2]]) { + SWAP(_scorers[i1], _scorers[i2]); + } + } +} + +void Scores::reset() { + _isOpen = false; + _isLoaded = false; + _vqaPlayer = nullptr; + + for (int i = 0; i < 7; i++) { + _scores[i] = -80; + _scorers[i] = 0; + } + + _lastScoreId = 0; + _lastScoreValue = 0; +} + +void Scores::save(SaveFileWriteStream &f) { + for (int i = 0; i < 7; i++) { + f.writeInt(_scores[i]); + } + + f.writeInt(_lastScoreId); + f.writeInt(_lastScoreValue); +} + +void Scores::load(SaveFileReadStream &f) { + for (int i = 0; i < 7; i++) { + _scores[i] = f.readInt(); + } + + _lastScoreId = f.readInt(); + _lastScoreValue = f.readInt(); +} + +} // End of namespace BladeRunner |