Permalink
Browse files

STARTREK: Make Bitmap, Sprite, FileStream classes

  • Loading branch information...
Drenn1 authored and sev- committed Feb 22, 2018
1 parent 60d672d commit b84a3bb4f28eb4b9e0bcfc19d405c79867360032
@@ -0,0 +1,38 @@
#include "startrek/filestream.h"

namespace StarTrek {

FileStream::FileStream(Common::SeekableReadStream *stream, bool bigEndian) : Common::SeekableReadStreamEndian(bigEndian) {
_stream = stream;
_bigEndian = bigEndian;
}

FileStream::~FileStream() {
delete _stream;
}

// ReadStream functions

bool FileStream::eos() const {
return _stream->eos();
}

uint32 FileStream::read(void* dataPtr, uint32 dataSize) {
return _stream->read(dataPtr, dataSize);
}

// SeekableReadStream functions

int32 FileStream::pos() const {
return _stream->pos();
}

int32 FileStream::size() const {
return _stream->size();
}

bool FileStream::seek(int32 offset, int whence) {
return _stream->seek(offset, whence);
}

}
@@ -0,0 +1,52 @@
/* 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.
*/

#ifndef STARTREK_FILESTREAM_H
#define STARTREK_FILESTREAM_H

#include "common/stream.h"

namespace StarTrek {

class FileStream : public Common::SeekableReadStreamEndian {

public:
FileStream(Common::SeekableReadStream *stream, bool bigEndian);
~FileStream();

private:
Common::SeekableReadStream *_stream;
bool _bigEndian;

// ReadStream functions
virtual bool eos() const;
virtual uint32 read(void* dataPtr, uint32 dataSize);

// SeekableReadStream functions
virtual int32 pos() const;
virtual int32 size() const;
virtual bool seek(int32 offset, int whence);

};

}

#endif
@@ -31,6 +31,25 @@

namespace StarTrek {

// Bitmap class

Bitmap::Bitmap(Common::ReadStreamEndian *stream) {
xoffset = stream->readUint16();
yoffset = stream->readUint16();
width = stream->readUint16();
height = stream->readUint16();

pixels = (byte*)malloc(width*height);
stream->read(pixels, width*height);
}

Bitmap::~Bitmap() {
free(pixels);
}


// Graphics class

Graphics::Graphics(StarTrekEngine *vm) : _vm(vm), _egaMode(false) {
_font = 0;
_egaData = 0;
@@ -67,6 +86,19 @@ void Graphics::setPalette(const char *paletteFile) {
delete palStream;
}

void Graphics::drawBitmap(Bitmap *bitmap) {
int xoffset = bitmap->xoffset;
int yoffset = bitmap->yoffset;
if (xoffset >= 320)
xoffset = 0;
if (yoffset >= 200)
yoffset = 0;

_vm->_system->copyRectToScreen(bitmap->pixels, bitmap->width, xoffset, yoffset, bitmap->width, bitmap->height);
_vm->_system->updateScreen();
}


void Graphics::loadEGAData(const char *filename) {
// Load EGA palette data
if (!_egaMode)
@@ -80,34 +112,6 @@ void Graphics::loadEGAData(const char *filename) {
delete egaStream;
}

void Graphics::drawImage(const char *filename) {
// Draw a regular bitmap

Common::SeekableReadStream *imageStream = _vm->openFile(filename);
uint16 xoffset = (_vm->getPlatform() == Common::kPlatformAmiga) ? imageStream->readUint16BE() : imageStream->readUint16LE();
uint16 yoffset = (_vm->getPlatform() == Common::kPlatformAmiga) ? imageStream->readUint16BE() : imageStream->readUint16LE();
uint16 width = (_vm->getPlatform() == Common::kPlatformAmiga) ? imageStream->readUint16BE() : imageStream->readUint16LE();
uint16 height = (_vm->getPlatform() == Common::kPlatformAmiga) ? imageStream->readUint16BE() : imageStream->readUint16LE();

if (xoffset >= 320)
xoffset = 0;
if (yoffset >= 200)
yoffset = 0;

byte *pixels = (byte *)malloc(width * height);

if (_egaMode && _egaData) {
// FIXME: This doesn't work right
for (uint32 i = 0; i < (uint32)(width * height); i++)
pixels[i] = _egaData[imageStream->readByte()];
} else {
imageStream->read(pixels, width * height);
}

_vm->_system->copyRectToScreen(pixels, width, xoffset, yoffset, width, height);
_vm->_system->updateScreen();
}

void Graphics::drawBackgroundImage(const char *filename) {
// Draw an stjr BGD image (palette built-in)

@@ -29,19 +29,62 @@
#include "startrek/startrek.h"
#include "startrek/font.h"

#include "common/stream.h"

namespace StarTrek {

class Font;
class StarTrekEngine;


class Bitmap {
public:
uint16 xoffset;
uint16 yoffset;
uint16 width;
uint16 height;
byte *pixels;

public:
Bitmap(Common::ReadStreamEndian *stream);
~Bitmap();
};

class Rectangle {
uint16 left;
uint16 top;
uint16 right;
uint16 bottom;
};

class Sprite {
uint16 x,y;
uint16 drawPriority;
uint16 field6;
uint16 field8;
Bitmap *bitmap;
uint16 drawMode;
uint16 fieldE;
uint16 bitmapChanged;
uint16 redrawCondition2;
uint16 redrawCondition3;
uint16 field16;
Rectangle rectangle1;
Rectangle clickRectangle;
Rectangle rectangle2;
uint16 drawX,drawY;
};


class Graphics {
public:
Graphics(StarTrekEngine *vm);
~Graphics();

void setPalette(const char *paletteFile);
void drawBitmap(Bitmap *bitmap);

void loadEGAData(const char *egaFile);
void drawImage(const char *filename);
void drawBackgroundImage(const char *filename);


@@ -2,6 +2,7 @@ MODULE := engines/startrek

MODULE_OBJS = \
detection.o \
filestream.o \
font.o \
lzss.o \
graphics.o \
@@ -35,6 +35,7 @@
#include "engines/util.h"
#include "video/qt_decoder.h"

#include "startrek/filestream.h"
#include "startrek/lzss.h"
#include "startrek/startrek.h"

@@ -87,20 +88,10 @@ Common::Error StarTrekEngine::run() {
// EGA not supported
#if 1
if (getGameType() == GType_ST25) {
if (getPlatform() == Common::kPlatformMacintosh) {
if (getFeatures() & GF_DEMO) {
_gfx->setPalette("BRIDGE.PAL");
_gfx->drawImage("BRIDGE.BMP");
} else {
playMovie("Voice Data/Additional Audio/Intro Movie");
_gfx->setPalette("BRIDGES.PAL");
_gfx->drawImage("BRIDGE0.BMP");
}
} else {
_gfx->setPalette("BRIDGE.PAL");
//_gfx->loadEGAData("BRIDGE.EGA");
_gfx->drawImage("DEMON5.BMP");
}
_gfx->setPalette("PALETTE.PAL");
Bitmap *b = new Bitmap(openFile("DEMON5.BMP"));
_gfx->drawBitmap(b);
delete b;

if (getPlatform() == Common::kPlatformAmiga)
_sound->playSoundEffect("TREK2");
@@ -132,10 +123,12 @@ Common::Error StarTrekEngine::run() {
return Common::kNoError;
}

Common::SeekableReadStream *StarTrekEngine::openFile(Common::String filename, int fileIndex) {
Common::SeekableReadStreamEndian *StarTrekEngine::openFile(Common::String filename, int fileIndex) {
filename.toUppercase();
Common::String basename, extension;

bool bigEndian = getPlatform() == Common::kPlatformAmiga;

for (int i=filename.size()-1; ; i--) {
if (filename[i] == '.') {
basename = filename;
@@ -151,7 +144,7 @@ Common::SeekableReadStream *StarTrekEngine::openFile(Common::String filename, in
Common::File *file = new Common::File();
if (!file->open(filename.c_str()))
error ("Could not find file \'%s\'", filename.c_str());
return file;
return new FileStream(file, bigEndian);
}

Common::SeekableReadStream *indexFile = 0;
@@ -210,7 +203,7 @@ Common::SeekableReadStream *StarTrekEngine::openFile(Common::String filename, in
if (filename.matchString(testfile)) {
foundData = true;
break;
}
}
}

delete indexFile;
@@ -230,7 +223,7 @@ Common::SeekableReadStream *StarTrekEngine::openFile(Common::String filename, in
error("Tried to access file index %d for file '%s' which doesn't exist.", fileIndex, filename.c_str());

Common::SeekableReadStream *dataFile = 0;
Common::SeekableReadStream *dataRunFile = 0; // FIXME: Amiga & Mac code don't implement this
Common::SeekableReadStream *dataRunFile = 0; // FIXME: Amiga & Mac need this implemented

if (getPlatform() == Common::kPlatformAmiga) {
dataFile = SearchMan.createReadStreamForMember("data.000");
@@ -254,7 +247,7 @@ Common::SeekableReadStream *StarTrekEngine::openFile(Common::String filename, in
Common::SeekableReadStream *stream = dataFile->readStream(uncompressedSize);
delete dataFile;
delete dataRunFile;
return stream;
return new FileStream(stream, bigEndian);
} else {
if (fileCount != 1) {
dataRunFile->seek(indexOffset);
@@ -276,12 +269,12 @@ Common::SeekableReadStream *StarTrekEngine::openFile(Common::String filename, in

delete dataFile;
delete dataRunFile;
return stream;
return new FileStream(stream, bigEndian);
}

// We should not get to this point...
error("Could not find data for \'%s\'", filename.c_str());

return NULL;
}

@@ -74,7 +74,7 @@ class StarTrekEngine : public ::Engine {
Common::Language getLanguage();

// Resource related functions
Common::SeekableReadStream *openFile(Common::String filename, int fileIndex=0);
Common::SeekableReadStreamEndian *openFile(Common::String filename, int fileIndex=0);

// Movie related functions
void playMovie(Common::String filename);

0 comments on commit b84a3bb

Please sign in to comment.