2016-02-25 08:39:15 -05:00
|
|
|
/* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2016-03-05 15:44:39 -05:00
|
|
|
#include "titanic/star_control/star_control.h"
|
2017-02-27 08:55:56 -05:00
|
|
|
#include "titanic/core/dont_save_file_item.h"
|
|
|
|
#include "titanic/core/project_item.h"
|
2017-08-23 06:16:00 -07:00
|
|
|
#include "titanic/game_manager.h"
|
2017-08-18 04:57:14 -07:00
|
|
|
#include "titanic/pet_control/pet_control.h"
|
2017-08-23 06:16:00 -07:00
|
|
|
#include "titanic/star_control/camera_mover.h"
|
|
|
|
#include "titanic/star_control/error_code.h" // CErrorCode
|
2017-08-18 04:57:14 -07:00
|
|
|
#include "titanic/support/screen_manager.h"
|
2016-02-25 08:39:15 -05:00
|
|
|
|
|
|
|
namespace Titanic {
|
|
|
|
|
2016-07-02 18:46:54 -04:00
|
|
|
BEGIN_MESSAGE_MAP(CStarControl, CGameObject)
|
|
|
|
ON_MESSAGE(MouseMoveMsg)
|
|
|
|
ON_MESSAGE(MouseButtonDownMsg)
|
|
|
|
ON_MESSAGE(KeyCharMsg)
|
|
|
|
ON_MESSAGE(FrameMsg)
|
2017-08-06 15:25:28 -04:00
|
|
|
ON_MESSAGE(MovementMsg)
|
2016-07-02 18:46:54 -04:00
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
2017-03-30 22:32:44 -04:00
|
|
|
CStarControl::CStarControl() : _enabled(false), _petControl(nullptr),
|
2016-06-30 23:40:58 -04:00
|
|
|
_starRect(20, 10, 620, 350) {
|
2017-04-09 21:44:10 -04:00
|
|
|
CStarCamera::init();
|
2016-07-16 18:23:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
CStarControl::~CStarControl() {
|
2017-04-09 21:44:10 -04:00
|
|
|
CStarCamera::deinit();
|
2016-03-05 21:44:57 -05:00
|
|
|
}
|
|
|
|
|
2016-06-29 19:53:16 -04:00
|
|
|
void CStarControl::save(SimpleFile *file, int indent) {
|
2016-07-20 21:51:44 -04:00
|
|
|
file->writeNumberLine(0, indent);
|
2016-07-17 13:02:47 -04:00
|
|
|
_starField.save(file, indent);
|
2016-07-02 14:17:02 -04:00
|
|
|
_view.save(file, indent);
|
2016-02-25 08:39:15 -05:00
|
|
|
CGameObject::save(file, indent);
|
|
|
|
}
|
|
|
|
|
2016-02-28 21:42:13 -05:00
|
|
|
void CStarControl::load(SimpleFile *file) {
|
2016-03-05 15:44:39 -05:00
|
|
|
int val = file->readNumber();
|
2016-10-09 14:59:58 +02:00
|
|
|
|
2016-03-05 15:44:39 -05:00
|
|
|
if (!val) {
|
2016-07-31 18:08:57 -04:00
|
|
|
_starField.load(file);
|
2016-07-17 13:02:47 -04:00
|
|
|
if (!_starField.initDocument())
|
2016-03-05 21:44:57 -05:00
|
|
|
error("Couldn't initialise the StarField document");
|
|
|
|
|
2016-07-02 14:17:02 -04:00
|
|
|
_view.load(file, 0);
|
2016-03-05 21:44:57 -05:00
|
|
|
CScreenManager *screenManager = CScreenManager::setCurrent();
|
|
|
|
if (!screenManager)
|
2017-02-27 09:08:34 -05:00
|
|
|
error("There's no screen manager during loading");
|
2016-03-05 15:44:39 -05:00
|
|
|
|
2016-07-17 13:02:47 -04:00
|
|
|
_view.setup(screenManager, &_starField, this);
|
2016-07-02 18:04:37 -04:00
|
|
|
_view.reset();
|
|
|
|
|
2017-02-27 08:55:56 -05:00
|
|
|
_enabled = true;
|
2016-03-05 15:44:39 -05:00
|
|
|
}
|
2016-10-09 14:59:58 +02:00
|
|
|
|
2016-02-25 08:39:15 -05:00
|
|
|
CGameObject::load(file);
|
|
|
|
}
|
|
|
|
|
2016-07-02 14:17:02 -04:00
|
|
|
void CStarControl::draw(CScreenManager *screenManager) {
|
|
|
|
if (_visible)
|
|
|
|
_view.draw(screenManager);
|
|
|
|
}
|
|
|
|
|
2016-07-02 18:46:54 -04:00
|
|
|
bool CStarControl::MouseButtonDownMsg(CMouseButtonDownMsg *msg) {
|
|
|
|
if (_visible && _starRect.contains(msg->_mousePos)) {
|
|
|
|
_view.MouseButtonDownMsg(0, Point(msg->_mousePos.x - 20,
|
|
|
|
msg->_mousePos.y - 10));
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CStarControl::MouseMoveMsg(CMouseMoveMsg *msg) {
|
|
|
|
if (_visible && _starRect.contains(msg->_mousePos)) {
|
|
|
|
_view.MouseMoveMsg(0, Point(msg->_mousePos.x - 20,
|
|
|
|
msg->_mousePos.y - 10));
|
|
|
|
makeDirty();
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CStarControl::KeyCharMsg(CKeyCharMsg *msg) {
|
2017-03-02 21:07:28 -05:00
|
|
|
if (_visible) {
|
|
|
|
CErrorCode errorCode;
|
|
|
|
_view.KeyCharMsg(msg->_key, &errorCode);
|
|
|
|
return errorCode.get();
|
|
|
|
}
|
2016-07-02 18:46:54 -04:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CStarControl::FrameMsg(CFrameMsg *msg) {
|
|
|
|
if (_visible) {
|
|
|
|
Point pt = getMousePos();
|
|
|
|
if (_starRect.contains(pt))
|
|
|
|
_view.MouseMoveMsg(0, pt);
|
|
|
|
|
|
|
|
newFrame();
|
|
|
|
makeDirty();
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CStarControl::newFrame() {
|
2017-02-27 09:08:34 -05:00
|
|
|
if (!_petControl)
|
|
|
|
_petControl = getPetControl();
|
|
|
|
|
|
|
|
if (_petControl) {
|
2017-05-30 22:23:31 -04:00
|
|
|
int matchIndex = _starField.getMatchedIndex();
|
|
|
|
bool isClose = false;
|
2017-02-27 09:08:34 -05:00
|
|
|
|
2017-03-02 21:07:28 -05:00
|
|
|
if (_starField.getMode() == MODE_STARFIELD) {
|
2017-05-30 22:23:31 -04:00
|
|
|
isClose = _starField.isCloseToMarker();
|
|
|
|
if ((matchIndex + 2) != _starField.getMarkerCount())
|
|
|
|
isClose = false;
|
2017-02-27 09:08:34 -05:00
|
|
|
}
|
|
|
|
|
2017-05-30 22:23:31 -04:00
|
|
|
_petControl->starsSetButtons(matchIndex, isClose);
|
2017-02-27 09:08:34 -05:00
|
|
|
}
|
2016-07-02 18:46:54 -04:00
|
|
|
}
|
|
|
|
|
2017-09-09 08:40:33 -07:00
|
|
|
bool CStarControl::isStarFieldMode() {
|
|
|
|
if (!_petControl)
|
|
|
|
_petControl = getPetControl();
|
|
|
|
|
|
|
|
if (_petControl) {
|
|
|
|
|
|
|
|
if (_starField.getMode() == MODE_STARFIELD)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-02-27 08:55:56 -05:00
|
|
|
void CStarControl::doAction(StarControlAction action) {
|
|
|
|
if (!_enabled)
|
|
|
|
return;
|
|
|
|
|
|
|
|
switch (action) {
|
|
|
|
case STAR_SHOW: {
|
|
|
|
CGameManager *gameManager = getGameManager();
|
|
|
|
CViewItem *view = gameManager ? gameManager->getView() : nullptr;
|
|
|
|
if (view) {
|
|
|
|
detach();
|
|
|
|
addUnder(view);
|
|
|
|
_view.fn2();
|
|
|
|
_view.fn3(true);
|
|
|
|
_visible = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case STAR_HIDE: {
|
|
|
|
CProjectItem *root = getRoot();
|
|
|
|
CDontSaveFileItem *fileItem = root ? root->getDontSaveFileItem() : nullptr;
|
|
|
|
if (fileItem) {
|
|
|
|
detach();
|
|
|
|
addUnder(fileItem);
|
|
|
|
_visible = false;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case STAR_2:
|
|
|
|
_view.fn4();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_RESET_POS:
|
|
|
|
_view.resetPosition();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_4:
|
|
|
|
_view.fn5();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_5:
|
|
|
|
_view.fn6();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_6:
|
|
|
|
_view.fn7();
|
|
|
|
break;
|
|
|
|
|
2017-04-17 11:39:25 -04:00
|
|
|
case STAR_FULL_SPEED:
|
|
|
|
_view.fullSpeed();
|
2017-02-27 08:55:56 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_8:
|
|
|
|
_view.fn9();
|
|
|
|
break;
|
|
|
|
|
2017-03-02 21:07:28 -05:00
|
|
|
case STAR_TOGGLE_MODE:
|
|
|
|
_view.toggleMode();
|
2017-02-27 08:55:56 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_10:
|
|
|
|
_view.fn11();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_11:
|
2017-05-30 20:01:49 -04:00
|
|
|
_view.toggleBox();
|
2017-02-27 08:55:56 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_12:
|
|
|
|
_view.fn13();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_13:
|
|
|
|
_view.fn14();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_SET_REFERENCE: {
|
2017-03-02 21:07:28 -05:00
|
|
|
_view.setHasReference();
|
2017-02-27 08:55:56 -05:00
|
|
|
CPetControl *pet = getPetControl();
|
|
|
|
if (pet)
|
|
|
|
pet->starsSetReference();
|
|
|
|
break;
|
|
|
|
}
|
2018-05-22 16:03:56 +02:00
|
|
|
|
2017-02-27 08:55:56 -05:00
|
|
|
case STAR_FADE_IN:
|
|
|
|
_view.fn3(true);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_FADE_OUT:
|
|
|
|
_view.fn3(false);
|
|
|
|
break;
|
|
|
|
|
2017-05-31 19:00:17 -04:00
|
|
|
case LOCK_STAR:
|
|
|
|
_view.lockStar();
|
2017-02-27 08:55:56 -05:00
|
|
|
break;
|
|
|
|
|
2017-05-31 19:00:17 -04:00
|
|
|
case UNLOCK_STAR:
|
|
|
|
_view.unlockStar();
|
2017-02-27 08:55:56 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case STAR_19:
|
2017-03-02 23:04:02 -05:00
|
|
|
_view.starDestinationSet();
|
2017-02-27 08:55:56 -05:00
|
|
|
break;
|
|
|
|
}
|
2016-07-17 10:44:35 -04:00
|
|
|
}
|
2016-07-02 18:46:54 -04:00
|
|
|
|
2017-02-20 21:15:00 -05:00
|
|
|
bool CStarControl::isSolved() const {
|
|
|
|
return _starField.isSolved();
|
2016-06-26 17:20:33 -04:00
|
|
|
}
|
|
|
|
|
2017-07-15 15:48:43 -04:00
|
|
|
bool CStarControl::isSkipped() const {
|
|
|
|
return _starField.isSkipped();
|
|
|
|
}
|
|
|
|
|
2017-03-29 22:25:33 -04:00
|
|
|
void CStarControl::forceSolved() {
|
2017-07-15 15:48:43 -04:00
|
|
|
_starField.skipPuzzle();
|
2017-03-29 22:25:33 -04:00
|
|
|
}
|
|
|
|
|
2016-07-17 10:44:35 -04:00
|
|
|
bool CStarControl::canSetStarDestination() const {
|
|
|
|
return _view.canSetStarDestination();
|
2016-06-27 08:28:10 -04:00
|
|
|
}
|
|
|
|
|
2016-07-17 10:44:35 -04:00
|
|
|
void CStarControl::starDestinationSet() {
|
|
|
|
_view.starDestinationSet();
|
2016-06-27 08:28:10 -04:00
|
|
|
}
|
|
|
|
|
2017-08-06 15:25:28 -04:00
|
|
|
bool CStarControl::MovementMsg(CMovementMsg *msg) {
|
|
|
|
// The star control view has an unused turn right link hidden
|
|
|
|
// under the star view. For cleanliness, explicitly consume any
|
|
|
|
// movements in the star view so the link is never used
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-02-25 08:39:15 -05:00
|
|
|
} // End of namespace Titanic
|