aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/ui/kia_section_clues.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/bladerunner/ui/kia_section_clues.cpp')
-rw-r--r--engines/bladerunner/ui/kia_section_clues.cpp422
1 files changed, 422 insertions, 0 deletions
diff --git a/engines/bladerunner/ui/kia_section_clues.cpp b/engines/bladerunner/ui/kia_section_clues.cpp
new file mode 100644
index 0000000000..1e80b57ed7
--- /dev/null
+++ b/engines/bladerunner/ui/kia_section_clues.cpp
@@ -0,0 +1,422 @@
+/* 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/kia_section_clues.h"
+
+#include "bladerunner/actor_clues.h"
+#include "bladerunner/audio_player.h"
+#include "bladerunner/bladerunner.h"
+#include "bladerunner/crimes_database.h"
+#include "bladerunner/game_constants.h"
+#include "bladerunner/game_flags.h"
+#include "bladerunner/game_info.h"
+#include "bladerunner/font.h"
+#include "bladerunner/script/kia.h"
+#include "bladerunner/text_resource.h"
+#include "bladerunner/ui/kia.h"
+#include "bladerunner/ui/kia_log.h"
+#include "bladerunner/ui/kia_shapes.h"
+#include "bladerunner/ui/ui_container.h"
+#include "bladerunner/ui/ui_image_picker.h"
+#include "bladerunner/ui/ui_scroll_box.h"
+
+#include "common/rect.h"
+
+namespace BladeRunner {
+
+KIASectionClues::KIASectionClues(BladeRunnerEngine *vm, ActorClues *clues) : KIASectionBase(vm) {
+ _uiContainer = new UIContainer(_vm);
+
+ _isVisible = false;
+
+ _debugIntangible = false;
+ _debugNop = 0;
+
+ _clues = clues;
+
+ _mouseX = 0;
+ _mouseY = 0;
+
+ _buttons = new UIImagePicker(_vm, 2);
+
+ _cluesScrollBox = new UIScrollBox(_vm, scrollBoxCallback, this, _vm->_gameInfo->getClueCount(), 1, false, Common::Rect(312, 172, 500, 376), Common::Rect(506, 160, 506, 394));
+ _uiContainer->add(_cluesScrollBox);
+
+ _filterScrollBox = new UIScrollBox(_vm, scrollBoxCallback, this, 128, 1, false, Common::Rect(142, 162, 291, 376), Common::Rect(120, 160, 120, 370));
+ _uiContainer->add(_filterScrollBox);
+
+ _assetTypeFilterCount = 4 + 1; // we have 4 asset types
+ _crimeFilterCount = _vm->_gameInfo->getCrimeCount() + 1;
+ _filterCount = _assetTypeFilterCount + _crimeFilterCount;
+ _filters.resize(_filterCount);
+ for (int i = 0; i < _filterCount; ++i) {
+ _filters[i] = true;
+ }
+}
+
+KIASectionClues::~KIASectionClues() {
+ _uiContainer->clear();
+ delete _filterScrollBox;
+ delete _cluesScrollBox;
+ delete _uiContainer;
+}
+
+void KIASectionClues::open() {
+ _isVisible = true;
+
+ _buttons->resetImages();
+ _buttons->defineImage(0, Common::Rect(142, 380, 191, 395), _vm->_kia->_shapes->get(79), _vm->_kia->_shapes->get(80), _vm->_kia->_shapes->get(81), _vm->_textKIA->getText(30));
+ _buttons->defineImage(1, Common::Rect(193, 380, 242, 395), _vm->_kia->_shapes->get(76), _vm->_kia->_shapes->get(77), _vm->_kia->_shapes->get(78), _vm->_textKIA->getText(31));
+
+ _buttons->activate(nullptr, nullptr, nullptr, mouseUpCallback, this);
+ _cluesScrollBox->show();
+ _filterScrollBox->show();
+
+ populateFilters();
+ populateClues();
+}
+
+void KIASectionClues::close() {
+ if (_isVisible) {
+ _isVisible = false;
+
+ _buttons->deactivate();
+ _cluesScrollBox->hide();
+ _filterScrollBox->hide();
+ }
+}
+
+void KIASectionClues::draw(Graphics::Surface &surface) {
+ _uiContainer->draw(surface);
+
+ _vm->_mainFont->drawColor(_vm->_textKIA->getText(0), surface, 300, 162, 0x77DF);
+ _vm->_mainFont->drawColor(_vm->_textKIA->getText(2), surface, 440, 426, 0x2991);
+ _vm->_mainFont->drawColor(_vm->_textKIA->getText(1), surface, 440, 442, 0x2991);
+ _vm->_mainFont->drawColor(_vm->_textKIA->getText(4), surface, 440, 458, 0x2991);
+
+ int clueId = _cluesScrollBox->getSelectedLineData();
+ if (clueId != -1) {
+ Common::String text;
+
+ int actorId = _clues->getFromActorId(clueId);
+ if (actorId != -1) {
+ text = _vm->_textActorNames->getText(actorId);
+ } else {
+ text.clear();
+ }
+ _vm->_mainFont->drawColor(text, surface, 490, 426, 0x46BF);
+
+ int crimeId = _vm->_crimesDatabase->getCrime(clueId);
+ if (crimeId != -1) {
+ text = _vm->_textCrimes->getText(crimeId);
+ } else {
+ text.clear();
+ }
+ _vm->_mainFont->drawColor(text, surface, 490, 442, 0x46BF);
+
+ int assetType = _vm->_crimesDatabase->getAssetType(clueId);
+ if (assetType != -1) {
+ text = _vm->_textClueTypes->getText(assetType);
+ } else {
+ text.clear();
+ }
+ _vm->_mainFont->drawColor(text, surface, 490, 458, 0x46BF);
+ }
+
+ _buttons->draw(surface);
+ _buttons->drawTooltip(surface, _mouseX, _mouseY);
+
+ if (_debugNop) {
+ _vm->_mainFont->drawColor(Common::String::format("Debug display: %s", _vm->_textActorNames->getText(_debugNop)), surface, 120, 132, 0x7FE0);
+ }
+ if (_debugIntangible) {
+ _vm->_mainFont->drawColor("Debug Mode: Showing intangible clues.", surface, 220, 105, 0x7FE0);
+ }
+}
+
+void KIASectionClues::handleMouseMove(int mouseX, int mouseY) {
+ _mouseX = mouseX;
+ _mouseY = mouseY;
+ _buttons->handleMouseAction(mouseX, mouseY, false, false, false);
+ _uiContainer->handleMouseMove(mouseX, mouseY);
+}
+
+void KIASectionClues::handleMouseDown(bool mainButton) {
+ _uiContainer->handleMouseDown(!mainButton);
+ if (mainButton) {
+ _buttons->handleMouseAction(_mouseX, _mouseY, true, false, false);
+ }
+}
+
+void KIASectionClues::handleMouseUp(bool mainButton) {
+ _uiContainer->handleMouseUp(!mainButton);
+ if (mainButton) {
+ _buttons->handleMouseAction(_mouseX, _mouseY, false, true, false);
+ }
+}
+
+void KIASectionClues::saveToLog() {
+ _vm->_kia->_log->add(0, sizeof(bool) * _filterCount, _filters.data());
+}
+
+void KIASectionClues::loadFromLog() {
+ memcpy(_filters.data(), _vm->_kia->_log->getCurrentData(), sizeof(bool) * _filterCount);
+ populateFilters();
+ populateClues();
+}
+
+void KIASectionClues::scrollBoxCallback(void *callbackData, void *source, int lineData, int mouseButton) {
+ KIASectionClues *self = (KIASectionClues *)callbackData;
+
+ if (source == self->_filterScrollBox && lineData >= 0) {
+ self->_filters[lineData] = !self->_filters[lineData];
+ self->_filterScrollBox->toggleCheckBox(lineData);
+ self->populateClues();
+ } else if (source == self->_cluesScrollBox && lineData >= 0) {
+ if (mouseButton) {
+ if (self->_vm->_gameFlags->query(kFlagKIAPrivacyAddon)) {
+ self->_vm->_audioPlayer->playAud(self->_vm->_gameInfo->getSfxTrack(511), 70, 0, 0, 50, 0);
+
+ if (self->_clues->isPrivate(lineData)) {
+ self->_clues->setPrivate(lineData, false);
+ self->_cluesScrollBox->resetFlags(lineData, 0x08);
+ } else {
+ self->_clues->setPrivate(lineData, true);
+ self->_cluesScrollBox->setFlags(lineData, 0x08);
+ }
+ }
+ } else {
+ self->_clues->setViewed(lineData, true);
+ self->_cluesScrollBox->resetHighlight(lineData);
+ self->_vm->_kia->_script->playClueAssetScript(0, lineData);
+ }
+ }
+}
+
+void KIASectionClues::mouseUpCallback(int buttonId, void *callbackData) {
+ KIASectionClues *self = (KIASectionClues *)callbackData;
+
+ if (buttonId <= 1) {
+ self->_vm->_audioPlayer->playAud(self->_vm->_gameInfo->getSfxTrack(510), 100, 0, 0, 50, 0);
+ }
+
+ self->onButtonPressed(buttonId);
+}
+
+void KIASectionClues::onButtonPressed(int buttonId) {
+ if (buttonId == 1) {
+ disableAllFilters();
+ }
+ if (buttonId == 0) {
+ enableAllFilters();
+ }
+}
+
+void KIASectionClues::enableAllFilters() {
+ for (int i = 0; i < _filterCount; ++i) {
+ if (_filterScrollBox->hasLine(i)) {
+ _filters[i] = true;
+ }
+ }
+ _filterScrollBox->checkAll();
+ populateClues();
+}
+
+void KIASectionClues::disableAllFilters() {
+ for (int i = 0; i < _filterCount; ++i) {
+ if (_filterScrollBox->hasLine(i)) {
+ _filters[i] = false;
+ }
+ }
+ _filterScrollBox->uncheckAll();
+ populateClues();
+}
+
+void KIASectionClues::populateFilters() {
+ _filterScrollBox->clearLines();
+
+ Common::Array<bool> availableFilters(_filterCount);
+ for (int i = 0; i < _filterCount; ++i) {
+ availableFilters[i] = false;
+ }
+
+ Common::String assetTypeNames[] = {
+ _vm->_textKIA->getText(6),
+ _vm->_textKIA->getText(7),
+ _vm->_textKIA->getText(8),
+ _vm->_textKIA->getText(9)
+ };
+
+ for (int i = 0; i < kClueCount; ++i) {
+ if (_clues->isAcquired(i)) {
+ int assetType = _vm->_crimesDatabase->getAssetType(i);
+ int crimeId = _vm->_crimesDatabase->getCrime(i);
+ if (_debugIntangible || assetType != -1) {
+ availableFilters[getLineIdForAssetType(assetType)] = true;
+ availableFilters[getLineIdForCrimeId(crimeId)] = true;
+ }
+ }
+ }
+
+ int assetTypeFiltersAvailable = 0;
+ for (int i = 0; i < _assetTypeFilterCount; ++i) {
+ if (availableFilters[i]) {
+ ++assetTypeFiltersAvailable;
+ }
+ }
+
+ int crimeFiltersAvailable = 0;
+ for (int i = _assetTypeFilterCount; i < _filterCount; ++i) {
+ if (availableFilters[i]) {
+ ++crimeFiltersAvailable;
+ }
+ }
+
+ if (assetTypeFiltersAvailable > 1) {
+ _filterScrollBox->addLine(_vm->_textKIA->getText(11), -1, 0x04);
+
+ for (int i = 0; i < _assetTypeFilterCount; ++i) {
+ if (availableFilters[i]) {
+ int flags = 0x01;
+ if (_filters[i]) {
+ flags |= 0x02;
+ }
+
+ Common::String text;
+ int typeTextId = getClueFilterTypeTextId(i);
+ if (typeTextId == -1) {
+ text = _vm->_textKIA->getText(10);
+ } else {
+ text = assetTypeNames[typeTextId];
+ }
+
+ _filterScrollBox->addLine(text, i, flags);
+ }
+ }
+ }
+
+ if (crimeFiltersAvailable > 1) {
+ if (assetTypeFiltersAvailable > 1) {
+ _filterScrollBox->addLine(" ", -1, 0);
+ }
+
+ _filterScrollBox->addLine(_vm->_textKIA->getText(12), -1, 0x04);
+
+ struct Line {
+ Common::String crimeName;
+ int lineData;
+ int flags;
+ };
+
+ Common::Array<Line> crimeLines;
+ crimeLines.reserve(crimeFiltersAvailable);
+
+ for (int i = _assetTypeFilterCount; i < _filterCount; ++i) {
+ if (availableFilters[i]) {
+ Line line;
+
+ line.lineData = i;
+
+ line.flags = 0x01;
+ if (_filters[i]) {
+ line.flags |= 0x02;
+ }
+
+ int crimeId = getClueFilterCrimeId(i);
+ if (crimeId == -1) {
+ line.crimeName = _vm->_textKIA->getText(5);
+ } else {
+ line.crimeName = _vm->_textCrimes->getText(crimeId);
+ }
+
+ crimeLines.push_back(line);
+ }
+ }
+
+ for (int i = 0; i < crimeFiltersAvailable - 1; ++i) {
+ for (int j = i + 1; j < crimeFiltersAvailable; ++j) {
+ if (crimeLines[i].lineData != _assetTypeFilterCount) {
+ if (crimeLines[i].crimeName.compareToIgnoreCase(crimeLines[j].crimeName) <= 0) {
+ continue;
+ }
+ }
+ SWAP(crimeLines[i], crimeLines[j]);
+ }
+ }
+
+ for (uint i = 0; i < crimeLines.size(); ++i) {
+ _filterScrollBox->addLine(crimeLines[i].crimeName, crimeLines[i].lineData, crimeLines[i].flags);
+ }
+ }
+}
+
+void KIASectionClues::populateClues() {
+ _cluesScrollBox->clearLines();
+ for (int i = 0; i < kClueCount; ++i) {
+ if (_clues->isAcquired(i)) {
+ int assetType = _vm->_crimesDatabase->getAssetType(i);
+ int crimeId = _vm->_crimesDatabase->getCrime(i);
+ if (assetType != -1 || _debugIntangible) {
+ if(_filters[getLineIdForAssetType(assetType)] && _filters[getLineIdForCrimeId(crimeId)]) {
+ int flags = 0x30;
+ if (_clues->isPrivate(i)) {
+ flags = 0x08;
+ } else if (_clues->isViewed(i)) {
+ flags = 0x10;
+ }
+ _cluesScrollBox->addLine(_vm->_crimesDatabase->getClueText(i), i, flags);
+ }
+ }
+ }
+ }
+ _cluesScrollBox->sortLines();
+}
+
+int KIASectionClues::getClueFilterTypeTextId(int i) {
+ if (i) {
+ return i - 1;
+ }
+ return -1;
+}
+
+int KIASectionClues::getClueFilterCrimeId(int filterId) {
+ if (filterId == _assetTypeFilterCount) {
+ return -1;
+ }
+ return filterId - (_assetTypeFilterCount + 1);
+}
+
+int KIASectionClues::getLineIdForAssetType(int assetType) {
+ if (assetType == -1) {
+ return 0;
+ }
+ return assetType + 1;
+}
+
+int KIASectionClues::getLineIdForCrimeId(int crimeId) {
+ if (crimeId == -1) {
+ return _assetTypeFilterCount;
+ }
+ return _assetTypeFilterCount + crimeId + 1;
+}
+
+} // End of namespace BladeRunner