diff options
Diffstat (limited to 'engines/bladerunner/ui/kia_section_clues.cpp')
-rw-r--r-- | engines/bladerunner/ui/kia_section_clues.cpp | 422 |
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 |