Initial commit
This commit is contained in:
296
engines/titanic/star_control/star_control.cpp
Normal file
296
engines/titanic/star_control/star_control.cpp
Normal file
@@ -0,0 +1,296 @@
|
||||
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "titanic/star_control/star_control.h"
|
||||
#include "titanic/core/dont_save_file_item.h"
|
||||
#include "titanic/core/project_item.h"
|
||||
#include "titanic/game_manager.h"
|
||||
#include "titanic/pet_control/pet_control.h"
|
||||
#include "titanic/star_control/motion_control.h"
|
||||
#include "titanic/star_control/error_code.h"
|
||||
#include "titanic/support/screen_manager.h"
|
||||
|
||||
namespace Titanic {
|
||||
|
||||
BEGIN_MESSAGE_MAP(CStarControl, CGameObject)
|
||||
ON_MESSAGE(MouseMoveMsg)
|
||||
ON_MESSAGE(MouseButtonDownMsg)
|
||||
ON_MESSAGE(ActionMsg)
|
||||
ON_MESSAGE(FrameMsg)
|
||||
ON_MESSAGE(MovementMsg)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
CStarControl::CStarControl() : _enabled(false), _petControl(nullptr),
|
||||
_starRect(20, 10, 620, 350) {
|
||||
CCamera::init();
|
||||
}
|
||||
|
||||
CStarControl::~CStarControl() {
|
||||
CCamera::deinit();
|
||||
}
|
||||
|
||||
void CStarControl::save(SimpleFile *file, int indent) {
|
||||
file->writeNumberLine(0, indent);
|
||||
_starField.save(file, indent);
|
||||
_view.save(file, indent);
|
||||
CGameObject::save(file, indent);
|
||||
}
|
||||
|
||||
void CStarControl::load(SimpleFile *file) {
|
||||
int val = file->readNumber();
|
||||
|
||||
if (!val) {
|
||||
_starField.load(file);
|
||||
if (!_starField.initDocument())
|
||||
error("Couldn't initialise the StarField document");
|
||||
|
||||
_view.load(file, 0);
|
||||
CScreenManager *screenManager = CScreenManager::setCurrent();
|
||||
if (!screenManager)
|
||||
error("There's no screen manager during loading");
|
||||
|
||||
_view.setup(screenManager, &_starField, this);
|
||||
_view.takeCurrentHomePhoto();
|
||||
|
||||
_enabled = true;
|
||||
}
|
||||
|
||||
CGameObject::load(file);
|
||||
}
|
||||
|
||||
void CStarControl::draw(CScreenManager *screenManager) {
|
||||
if (_visible)
|
||||
_view.draw(screenManager);
|
||||
}
|
||||
|
||||
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::ActionMsg(CActionMsg *msg) {
|
||||
if (_visible) {
|
||||
CErrorCode errorCode;
|
||||
_view.ActionMsg(msg, &errorCode);
|
||||
return errorCode.get();
|
||||
}
|
||||
|
||||
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() {
|
||||
if (!_petControl)
|
||||
_petControl = getPetControl();
|
||||
|
||||
if (_petControl) {
|
||||
int matchIndex = _starField.getMatchedIndex();
|
||||
bool isClose = false;
|
||||
|
||||
if (_starField.getMode() == MODE_STARFIELD) {
|
||||
isClose = _starField.isCloseToMarker();
|
||||
if ((matchIndex + 2) != _starField.getMarkerCount())
|
||||
isClose = false;
|
||||
}
|
||||
|
||||
_petControl->starsSetButtons(matchIndex, isClose);
|
||||
}
|
||||
}
|
||||
|
||||
bool CStarControl::isStarFieldMode() {
|
||||
if (!_petControl)
|
||||
_petControl = getPetControl();
|
||||
|
||||
if (_petControl) {
|
||||
|
||||
if (_starField.getMode() == MODE_STARFIELD)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
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.resetView();
|
||||
_view.triggerFade(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_VIEW_EARTH:
|
||||
_view.viewEarth();
|
||||
break;
|
||||
|
||||
case STAR_VIEW_FROM_EARTH:
|
||||
_view.viewFromEarth();
|
||||
break;
|
||||
|
||||
case STAR_VIEW_BOUNDARIES:
|
||||
_view.viewBoundaries();
|
||||
break;
|
||||
|
||||
case STAR_VIEW_CONSTELLATIONS:
|
||||
_view.viewConstellations();
|
||||
break;
|
||||
|
||||
case STAR_VIEW_RANDOM_STAR:
|
||||
_view.viewRandomStar();
|
||||
break;
|
||||
|
||||
case STAR_FULL_SPEED:
|
||||
_view.fullSpeed();
|
||||
break;
|
||||
|
||||
case STAR_TOGGLE_STEREO_PAIR:
|
||||
_view.toggleSteroPair();
|
||||
break;
|
||||
|
||||
case STAR_TOGGLE_HOME_PHOTO:
|
||||
_view.toggleHomePhoto();
|
||||
break;
|
||||
|
||||
case STAR_TOGGLE_SOLAR_RENDERING:
|
||||
_view.toggleSolarRendering();
|
||||
break;
|
||||
|
||||
case STAR_TOGGLE_POS_FRAME:
|
||||
_view.TogglePosFrame();
|
||||
break;
|
||||
|
||||
case STAR_STEREO_PAIR_ON:
|
||||
_view.stereoPairOn();
|
||||
break;
|
||||
|
||||
case STAR_STEREO_PAIR_OFF:
|
||||
_view.stereoPairOff();
|
||||
break;
|
||||
|
||||
case STAR_SET_REFERENCE: {
|
||||
_view.takeHomePhoto();
|
||||
CPetControl *pet = getPetControl();
|
||||
if (pet)
|
||||
pet->starsSetReference();
|
||||
break;
|
||||
}
|
||||
|
||||
case STAR_FADE_IN:
|
||||
_view.triggerFade(true);
|
||||
break;
|
||||
|
||||
case STAR_FADE_OUT:
|
||||
_view.triggerFade(false);
|
||||
break;
|
||||
|
||||
case LOCK_STAR:
|
||||
_view.lockStar();
|
||||
break;
|
||||
|
||||
case UNLOCK_STAR:
|
||||
_view.unlockStar();
|
||||
break;
|
||||
|
||||
case STAR_CLEAR_MODIFIED:
|
||||
_view.starDestinationSet();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool CStarControl::isSolved() const {
|
||||
return _starField.isSolved();
|
||||
}
|
||||
|
||||
bool CStarControl::isSkipped() const {
|
||||
return _starField.isSkipped();
|
||||
}
|
||||
|
||||
void CStarControl::forceSolved() {
|
||||
_starField.skipPuzzle();
|
||||
}
|
||||
|
||||
bool CStarControl::canSetStarDestination() const {
|
||||
return _view.canSetStarDestination();
|
||||
}
|
||||
|
||||
void CStarControl::starDestinationSet() {
|
||||
_view.starDestinationSet();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
} // End of namespace Titanic
|
||||
Reference in New Issue
Block a user