2011-06-28 22:54:51 -04:00

143 lines
4.2 KiB
C++

/* 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 "lastexpress/menu/trainline.h"
#include "lastexpress/data/sequence.h"
#include "lastexpress/game/scenes.h"
#include "lastexpress/helpers.h"
#include "lastexpress/lastexpress.h"
#include "lastexpress/resource.h"
namespace LastExpress {
// Information about the cities on the train line
static const struct {
uint8 frame;
TimeValue time;
} _trainCities[31] = {
{0, kTimeCityParis},
{9, kTimeCityEpernay},
{11, kTimeCityChalons},
{16, kTimeCityBarLeDuc},
{21, kTimeCityNancy},
{25, kTimeCityLuneville},
{35, kTimeCityAvricourt},
{37, kTimeCityDeutschAvricourt},
{40, kTimeCityStrasbourg},
{53, kTimeCityBadenOos},
{56, kTimeCityKarlsruhe},
{60, kTimeCityStuttgart},
{63, kTimeCityGeislingen},
{66, kTimeCityUlm},
{68, kTimeCityAugsburg},
{73, kTimeCityMunich},
{84, kTimeCitySalzbourg},
{89, kTimeCityAttnangPuchheim},
{97, kTimeCityWels},
{100, kTimeCityLinz},
{104, kTimeCityAmstetten},
{111, kTimeCityVienna},
{120, kTimeCityPoszony},
{124, kTimeCityGalanta},
{132, kTimeCityBudapest},
{148, kTimeCityBelgrade},
/* Line 1 ends at 150 - line 2 begins at 0 */
{157, kTimeCityNish},
{165, kTimeCityTzaribrod},
{174, kTimeCitySofia},
{198, kTimeCityAdrianople},
{210, kTimeCityConstantinople}
};
TrainLine::TrainLine(LastExpressEngine *engine) : _engine(engine), _frameLine1(NULL), _frameLine2(NULL) {
_frameLine1 = new SequenceFrame(loadSequence("line1.seq"), 0, true);
_frameLine2 = new SequenceFrame(loadSequence("line2.seq"), 0, true);
}
TrainLine::~TrainLine() {
SAFE_DELETE(_frameLine1);
SAFE_DELETE(_frameLine2);
// Zero passed pointers
_engine = NULL;
}
void TrainLine::clear() {
getScenes()->removeFromQueue(_frameLine1);
getScenes()->removeFromQueue(_frameLine2);
}
// Draw the train line at the time
// line1: 150 frames (=> Belgrade)
// line2: 61 frames (=> Constantinople)
void TrainLine::draw(uint32 time) {
assert(time >= kTimeCityParis && time <= kTimeCityConstantinople);
// Check that sequences have been loaded
if (!_frameLine1 || !_frameLine2)
error("[TrainLine::draw] Line sequences have not been loaded correctly");
// Clear existing frames
clear();
// Get the index of the last city the train has visited
uint index = 0;
for (uint i = 0; i < ARRAYSIZE(_trainCities); i++)
if ((uint32)_trainCities[i].time <= time)
index = i;
uint16 frame;
if (time > (uint32)_trainCities[index].time) {
// Interpolate linearly to use a frame between the cities
uint8 diffFrames = _trainCities[index + 1].frame - _trainCities[index].frame;
uint diffTimeCities = (uint)(_trainCities[index + 1].time - _trainCities[index].time);
uint traveledTime = (time - (uint)_trainCities[index].time);
frame = (uint16)(_trainCities[index].frame + (traveledTime * diffFrames) / diffTimeCities);
} else {
// Exactly on the city
frame = _trainCities[index].frame;
}
// Set frame, z-order and queue
if (frame < 150) {
_frameLine1->setFrame(frame);
_frameLine1->getInfo()->location = 1;
getScenes()->addToQueue(_frameLine1);
} else {
// We passed Belgrade
_frameLine1->setFrame(149);
_frameLine2->setFrame(frame - 150);
_frameLine1->getInfo()->location = 1;
_frameLine2->getInfo()->location = 1;
getScenes()->addToQueue(_frameLine1);
getScenes()->addToQueue(_frameLine2);
}
}
} // End of namespace LastExpress