Skip to content

Commit

Permalink
NEVERHOOD: Rework the car track scenes in Module2500 and Module2700
Browse files Browse the repository at this point in the history
- Move findClosestTrack code from several scenes to new Tracks::findTrackPoint
- Remove const kScene2706 arrays and use it from the dat instead
  • Loading branch information
johndoe123 authored and wjp committed May 8, 2013
1 parent 9ea07e0 commit 18ce1ac
Show file tree
Hide file tree
Showing 9 changed files with 166 additions and 184 deletions.
8 changes: 4 additions & 4 deletions engines/neverhood/gamemodule.cpp
Expand Up @@ -399,10 +399,10 @@ void GameModule::startup() {
setGlobalVar(V_SHRINK_LIGHTS_ON, 0);
// <<<DEBUG

#if 0
#if 1
_vm->gameState().which = 0;
_vm->gameState().sceneNum = 14;
createModule(2700, -1);
_vm->gameState().sceneNum = 0;
createModule(2500, -1);
#endif
#if 0
_vm->gameState().sceneNum = 5;
Expand All @@ -417,7 +417,7 @@ void GameModule::startup() {
_vm->gameState().sceneNum = 5;
createModule(2200, -1);
#endif
#if 1
#if 0
_vm->gameState().sceneNum = 7;
createModule(2200, -1);
#endif
Expand Down
20 changes: 19 additions & 1 deletion engines/neverhood/module1600.cpp
Expand Up @@ -988,6 +988,24 @@ void AsCommonCarConnector::update() {
AnimatedSprite::update();
}

void Tracks::findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance,
DataResource &dataResource) {
const uint trackCount = size();
minMatchTrackIndex = -1;
minMatchDistance = 640;
for (uint trackIndex = 0; trackIndex < trackCount; trackIndex++) {
NPointArray *pointList = dataResource.getPointArray((*this)[trackIndex]->trackPointsName);
for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
NPoint testPt = (*pointList)[pointIndex];
int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
if (distance < minMatchDistance) {
minMatchTrackIndex = trackIndex;
minMatchDistance = distance;
}
}
}
}

Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
: Scene(vm, parentModule), _asCar(NULL), _countdown1(0) {

Expand Down Expand Up @@ -1082,7 +1100,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)

// NOTE: Not in the else because 'which' is set to 1 in the true branch
if (which == 1) {
// Klaymen entering riding the car
// Klaymen riding the car
_vm->gameState().which = 1;
_dataResource.load(0x003C0492);
_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
Expand Down
6 changes: 6 additions & 0 deletions engines/neverhood/module1600.h
Expand Up @@ -121,6 +121,12 @@ class AsCommonCarConnector : public AnimatedSprite {
void update();
};

class Tracks : public Common::Array<SceneInfo2700*> {
public:
void findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance,
DataResource &dataResource);
};

class Scene1608 : public Scene {
public:
Scene1608(NeverhoodEngine *vm, Module *parentModule, int which);
Expand Down
82 changes: 34 additions & 48 deletions engines/neverhood/module2500.cpp
Expand Up @@ -220,9 +220,9 @@ void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, con
Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
: Scene(vm, parentModule) {

_sceneInfos[0] = _vm->_staticData->getSceneInfo2700(0x004B2628);
_sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C);
_sceneInfos[2] = _vm->_staticData->getSceneInfo2700(0x004B2670);
_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2628));
_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B264C));
_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2670));

setGlobalVar(V_CAR_DELTA_X, 1);
SetUpdateHandler(&Scene2501::update);
Expand Down Expand Up @@ -283,14 +283,13 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
insertSprite<AsCommonCarConnector>(_asCar);

_pointListsCount = 3;
_newTrackIndex = -1;
_dataResource.load(calcHash("Ashooded"));

_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
_asCar->setPathPoints(_trackPoints);

if (which >= 0 && _sceneInfos[_currTrackIndex]->which2 == which) {
if (which >= 0 && _tracks[_currTrackIndex]->which2 == which) {
NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
Expand Down Expand Up @@ -331,7 +330,7 @@ void Scene2501::update() {
_klayman = NULL;
_carStatus = 0;
}
updateKlaymanCliprect();
updateKlaymanClipRect();
}

void Scene2501::upCarAtHome() {
Expand All @@ -341,13 +340,13 @@ void Scene2501::upCarAtHome() {
sendMessage(_asCar, 0x200A, 0);
SetUpdateHandler(&Scene2501::upGettingOutOfCar);
} else {
findClosestTrack(_mouseClickPos);
moveCarToPoint(_mouseClickPos);
SetMessageHandler(&Scene2501::hmRidingCar);
SetUpdateHandler(&Scene2501::upRidingCar);
}
_mouseClicked = false;
}
updateKlaymanCliprect();
updateKlaymanClipRect();
}

void Scene2501::upGettingOutOfCar() {
Expand All @@ -368,13 +367,13 @@ void Scene2501::upGettingOutOfCar() {
_klayman->handleUpdate();
_carStatus = 0;
}
updateKlaymanCliprect();
updateKlaymanClipRect();
}

void Scene2501::upRidingCar() {
Scene::update();
if (_mouseClicked) {
findClosestTrack(_mouseClickPos);
moveCarToPoint(_mouseClickPos);
_mouseClicked = false;
}
}
Expand All @@ -397,24 +396,24 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity
uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x2005:
if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0)
if (_tracks[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0)
changeTrack();
else if (_sceneInfos[_currTrackIndex]->which1 == 0) {
else if (_tracks[_currTrackIndex]->which1 == 0) {
SetMessageHandler(&Scene2501::hmCarAtHome);
SetUpdateHandler(&Scene2501::upCarAtHome);
sendMessage(_asCar, 0x200F, 1);
} else if (_sceneInfos[_currTrackIndex]->which1 > 0)
leaveScene(_sceneInfos[_currTrackIndex]->which1);
} else if (_tracks[_currTrackIndex]->which1 > 0)
leaveScene(_tracks[_currTrackIndex]->which1);
break;
case 0x2006:
if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0)
if (_tracks[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0)
changeTrack();
else if (_sceneInfos[_currTrackIndex]->which2 == 0) {
else if (_tracks[_currTrackIndex]->which2 == 0) {
SetMessageHandler(&Scene2501::hmCarAtHome);
SetUpdateHandler(&Scene2501::upCarAtHome);
sendMessage(_asCar, 0x200F, 1);
} else if (_sceneInfos[_currTrackIndex]->which2 > 0)
leaveScene(_sceneInfos[_currTrackIndex]->which2);
} else if (_tracks[_currTrackIndex]->which2 > 0)
leaveScene(_tracks[_currTrackIndex]->which2);
break;
case 0x200D:
sendMessage(_parentModule, 0x200D, 0);
Expand All @@ -436,34 +435,9 @@ uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam &param, Entity
return messageResult;
}

void Scene2501::changeTrack() {
_currTrackIndex = _newTrackIndex;
_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
_asCar->setPathPoints(_trackPoints);
if (_currTrackIndex == 0)
sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
else
sendMessage(_asCar, 0x2002, 0);
sendPointMessage(_asCar, 0x2004, _clickPoint);
_newTrackIndex = -1;
}

void Scene2501::findClosestTrack(NPoint &pt) {
// TODO NOTE This is uses with minor variations in other scenes, maybe merge them?
int minMatchDistance = 640;
int minMatchTrackIndex = -1;
// Find the track which contains a point closest to pt
for (int infoIndex = 0; infoIndex < _pointListsCount; infoIndex++) {
NPointArray *pointList = _dataResource.getPointArray(_sceneInfos[infoIndex]->pointListName);
for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
NPoint testPt = (*pointList)[pointIndex];
int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
if (distance < minMatchDistance) {
minMatchTrackIndex = infoIndex;
minMatchDistance = distance;
}
}
}
void Scene2501::moveCarToPoint(NPoint &pt) {
int minMatchTrackIndex, minMatchDistance;
_tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource);
if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) {
_newTrackIndex = minMatchTrackIndex;
_clickPoint = pt;
Expand All @@ -477,7 +451,19 @@ void Scene2501::findClosestTrack(NPoint &pt) {
}
}

void Scene2501::updateKlaymanCliprect() {
void Scene2501::changeTrack() {
_currTrackIndex = _newTrackIndex;
_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
_asCar->setPathPoints(_trackPoints);
if (_currTrackIndex == 0)
sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
else
sendMessage(_asCar, 0x2002, 0);
sendPointMessage(_asCar, 0x2004, _clickPoint);
_newTrackIndex = -1;
}

void Scene2501::updateKlaymanClipRect() {
if (_kmScene2501->getX() <= 211)
_kmScene2501->setClipRect(0, 0, 640, 480);
else
Expand Down
7 changes: 3 additions & 4 deletions engines/neverhood/module2500.h
Expand Up @@ -60,11 +60,10 @@ class Scene2501 : public Scene {
Sprite *_asIdleCarLower;
Sprite *_asIdleCarFull;
Klayman *_kmScene2501;
Tracks _tracks;
NPointArray *_trackPoints;
SceneInfo2700 *_sceneInfos[3];
int _currTrackIndex;
NPoint _clickPoint;
int _pointListsCount;
int _newTrackIndex;
int _carStatus;
bool _klaymanInCar;
Expand All @@ -75,9 +74,9 @@ class Scene2501 : public Scene {
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmRidingCar(int messageNum, const MessageParam &param, Entity *sender);
uint32 hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender);
void findClosestTrack(NPoint &pt);
void moveCarToPoint(NPoint &pt);
void changeTrack();
void updateKlaymanCliprect();
void updateKlaymanClipRect();
};

class SsScene2504Button : public StaticSprite {
Expand Down

0 comments on commit 18ce1ac

Please sign in to comment.