aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/file.cpp75
-rw-r--r--common/file.h8
-rw-r--r--scumm/bundle.cpp8
-rw-r--r--scumm/bundle.h4
-rw-r--r--scumm/resource.cpp33
-rw-r--r--scumm/script_v2.cpp3
-rw-r--r--scumm/scummvm.cpp4
-rw-r--r--scumm/smush/chunk.cpp18
-rw-r--r--scumm/smush/chunk.h2
-rw-r--r--scumm/smush/player.cpp76
-rw-r--r--scumm/smush/player.h4
-rw-r--r--scumm/sound.cpp27
12 files changed, 105 insertions, 157 deletions
diff --git a/common/file.cpp b/common/file.cpp
index f7dfa2ae8f..bce682a9be 100644
--- a/common/file.cpp
+++ b/common/file.cpp
@@ -22,38 +22,59 @@
#include "file.h"
#include "engine.h" // For debug/warning/error
-FILE *fopen_nocase(const char *path, const char *mode)
-{
+FILE *File::fopenNoCase(const char *filename, const char * directory, const char *mode) {
FILE *file;
+ char buf[256];
+ char *ptr;
- file = fopen(path, mode);
+ strcpy(buf, directory);
+ if (directory[0] != 0) {
+ strcpy(buf, directory);
+ strcat(buf, "/");
+ }
+ strcat(buf, filename);
+
+ file = fopen(buf, mode);
if (file)
return file;
- char buf[256], *ptr;
- int32 i = 0, pos = 0;
-
- strcpy(buf, path);
- while (buf[i] != 0) {
- if ((buf[i] == '/') || (buf[i] == '\\')) {
- pos = i + 1;
+ char dirs[7][10];
+ dirs[0][0] = 0;
+ strcpy(dirs[1], "video/");
+ strcpy(dirs[2], "VIDEO/");
+ strcpy(dirs[3], "data/");
+ strcpy(dirs[4], "DATA/");
+ strcpy(dirs[5], "resource/");
+ strcpy(dirs[6], "RESOURCE/");
+
+ for (uint8 l = 0; l < 7; l++) {
+ strcpy(buf, directory);
+ if (directory[0] != 0) {
+ strcpy(buf, directory);
+ strcat(buf, "/");
}
- i++;
+ strcat(buf, dirs[l]);
+ int8 len = strlen(buf);
+ strcat(buf, filename);
+
+ ptr = buf + len;
+ do
+ *ptr++ = toupper(*ptr);
+ while (*ptr);
+ file = fopen(buf, mode);
+ if (file)
+ return file;
+
+ ptr = buf + len;
+ do
+ *ptr++ = tolower(*ptr);
+ while (*ptr);
+ file = fopen(buf, mode);
+ if (file)
+ return file;
}
-
- ptr = buf + pos;
- do
- *ptr++ = toupper(*ptr);
- while (*ptr);
- file = fopen(buf, mode);
- if (file)
- return file;
- ptr = buf + pos;
- do
- *ptr++ = tolower(*ptr);
- while (*ptr);
- return fopen(buf, mode);
+ return NULL;
}
File::File() {
@@ -66,7 +87,7 @@ File::~File() {
close();
}
-bool File::open(const char *filename, int mode, byte encbyte) {
+bool File::open(const char *filename, const char *directory, int mode, byte encbyte) {
if (_handle) {
debug(2, "File %s already opened", filename);
@@ -76,14 +97,14 @@ bool File::open(const char *filename, int mode, byte encbyte) {
clearIOFailed();
if (mode == kFileReadMode) {
- _handle = fopen_nocase(filename, "rb");
+ _handle = fopenNoCase(filename, directory, "rb");
if (_handle == NULL) {
debug(2, "File %s not found", filename);
return false;
}
}
else if (mode == kFileWriteMode) {
- _handle = fopen_nocase(filename, "wb");
+ _handle = fopenNoCase(filename, directory, "wb");
if (_handle == NULL) {
debug(2, "File %s not opened", filename);
return false;
diff --git a/common/file.h b/common/file.h
index b037b6cdc2..e6a7b1505d 100644
--- a/common/file.h
+++ b/common/file.h
@@ -26,10 +26,6 @@
#include "stdafx.h"
#include "scummsys.h"
-// fopen_nocase is like fopen only that it will try various variations
-// of the given filename (with different cases) if the initial one isn't found.
-FILE *fopen_nocase(const char *path, const char *mode);
-
class File {
private:
@@ -37,6 +33,8 @@ private:
bool _ioFailed;
byte _encbyte;
+FILE *fopenNoCase(const char *filename, const char *directory, const char *mode);
+
public:
enum {
kFileReadMode = 1,
@@ -45,7 +43,7 @@ public:
File();
~File();
- bool open(const char *filename, int mode = kFileReadMode, byte encbyte = 0);
+ bool open(const char *filename, const char *directory, int mode = kFileReadMode, byte encbyte = 0);
void close();
bool isOpen();
bool ioFailed();
diff --git a/scumm/bundle.cpp b/scumm/bundle.cpp
index 5edd66e98a..80ca8eb487 100644
--- a/scumm/bundle.cpp
+++ b/scumm/bundle.cpp
@@ -31,13 +31,13 @@ Bundle::Bundle() {
Bundle::~Bundle() {
}
-bool Bundle::openVoiceFile(char *filename) {
+bool Bundle::openVoiceFile(const char *filename, const char *directory) {
int32 tag, offset;
if (_voiceFile.isOpen() == true)
return true;
- if (_voiceFile.open(filename) == false) {
+ if (_voiceFile.open(filename, directory) == false) {
warning("Bundle: Can't open voice bundle file: %s", filename);
return false;
}
@@ -71,13 +71,13 @@ bool Bundle::openVoiceFile(char *filename) {
return true;
}
-bool Bundle::openMusicFile(char *filename) {
+bool Bundle::openMusicFile(const char *filename, const char *directory) {
int32 tag, offset;
if (_musicFile.isOpen() == true)
return true;
- if (_musicFile.open(filename) == false) {
+ if (_musicFile.open(filename, directory) == false) {
warning("Bundle: Can't open music bundle file: %s", filename);
return false;
}
diff --git a/scumm/bundle.h b/scumm/bundle.h
index ac1656678d..7d2e1744e2 100644
--- a/scumm/bundle.h
+++ b/scumm/bundle.h
@@ -56,8 +56,8 @@ public:
Bundle();
~Bundle();
- bool openVoiceFile(char *filename);
- bool openMusicFile(char *filename);
+ bool openVoiceFile(const char *filename, const char *directory);
+ bool openMusicFile(const char *filename, const char *directory);
int32 decompressVoiceSampleByName(char *name, byte *comp_final);
int32 decompressVoiceSampleByIndex(int32 index, byte *comp_final);
int32 decompressMusicSampleByName(char *name, int32 number, byte *comp_final);
diff --git a/scumm/resource.cpp b/scumm/resource.cpp
index 1792e90121..cfbf4e7283 100644
--- a/scumm/resource.cpp
+++ b/scumm/resource.cpp
@@ -73,16 +73,16 @@ void Scumm::openRoom(int room)
if (!(_features & GF_SMALL_HEADER)) {
if (_features & GF_AFTER_V7)
- sprintf(buf, "%s%s.la%d", _gameDataPath, _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
+ sprintf(buf, "%s.la%d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
else if (_features & GF_HUMONGOUS)
- sprintf(buf, "%s%s.he%.1d", _gameDataPath, _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
+ sprintf(buf, "%s.he%.1d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
else
- sprintf(buf, "%s%s.%.3d", _gameDataPath, _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
+ sprintf(buf, "%s.%.3d", _exe_name, room == 0 ? 0 : res.roomno[rtRoom][room]);
_encbyte = (_features & GF_USE_KEY) ? 0x69 : 0;
} else if (!(_features & GF_SMALL_NAMES)) {
if (room == 0 || room >= 900) {
- sprintf(buf, "%s%.3d.lfl", _gameDataPath, room);
+ sprintf(buf, "%.3d.lfl", room);
_encbyte = 0;
if (openResourceFile(buf)) {
return;
@@ -90,11 +90,11 @@ void Scumm::openRoom(int room)
askForDisk(buf);
} else {
- sprintf(buf, "%sdisk%.2d.lec", _gameDataPath, res.roomno[rtRoom][room]);
+ sprintf(buf, "disk%.2d.lec", res.roomno[rtRoom][room]);
_encbyte = 0x69;
}
} else {
- sprintf(buf, "%s%.2d.lfl", _gameDataPath, room);
+ sprintf(buf, "%.2d.lfl", room);
if (_features & GF_OLD_BUNDLE)
_encbyte = 0xFF;
else
@@ -186,26 +186,7 @@ bool Scumm::openResourceFile(const char *filename)
}
strcpy(buf, filename);
- _fileHandle.open(buf, 1, _encbyte);
- if (_fileHandle.isOpen() == false) {
- char *e = strrchr(buf, '/');
- if (!e)
- e = buf;
- do
- *e = tolower(*e);
- while (*e++);
- _fileHandle.open(buf, 1, _encbyte);
- }
-
- if (_fileHandle.isOpen() == false) {
- char *e = strrchr(buf, '/');
- if (!e)
- e = buf;
- do
- *e = toupper(*e);
- while (*e++);
- _fileHandle.open(buf, 1, _encbyte);
- }
+ _fileHandle.open(buf, getGameDataPath(), 1, _encbyte);
return _fileHandle.isOpen();
}
diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp
index 19315bce23..fc138ee274 100644
--- a/scumm/script_v2.cpp
+++ b/scumm/script_v2.cpp
@@ -2719,9 +2719,8 @@ void Scumm::o6_miscOps()
SmushPlayer sp(&sr);
char filename[512];
strcpy(filename, _gameDataPath);
- strcat(filename, "video/");
strcat(filename, (char*)getStringAddressVar(VAR_VIDEONAME));
- sp.play(filename);
+ sp.play(filename, getGameDataPath());
}
break;
case 7:
diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp
index d32a76c9cb..df7e268e56 100644
--- a/scumm/scummvm.cpp
+++ b/scumm/scummvm.cpp
@@ -871,9 +871,9 @@ void Scumm::dumpResource(char *tag, int idx, byte *ptr)
sprintf(buf, "dumps/%s%d.dmp", tag, idx);
#endif
- out.open(buf, 1);
+ out.open(buf, "", 1);
if (out.isOpen() == false) {
- out.open(buf, 2);
+ out.open(buf, "", 2);
if (out.isOpen() == false)
return;
out.write(ptr, size);
diff --git a/scumm/smush/chunk.cpp b/scumm/smush/chunk.cpp
index 1c70919c01..efc3d61953 100644
--- a/scumm/smush/chunk.cpp
+++ b/scumm/smush/chunk.cpp
@@ -34,33 +34,33 @@
*/
class FilePtr {
char * _filename;
- FILE * _ifs;
+ File _ifs;
int32 _refcount;
int32 _curPos;
public:
- FilePtr(const char * fname) : _refcount(1), _curPos(0) {
+ FilePtr(const char * fname, const char * directory) : _refcount(1), _curPos(0) {
debug(9, "FilePtr created for %s", fname);
_filename = strdup(fname);
- _ifs = fopen_nocase(fname, "rb");
- if(_ifs == NULL) error("FilePtr unable to read file \"%s\"", fname);
+ _ifs.open(fname, directory);
+ if(_ifs.isOpen() == false) error("FilePtr unable to read file %s", fname);
}
~FilePtr() {
debug(9, "FilePtr destroyed for %s", _filename);
free(_filename);
- fclose(_ifs);
+ _ifs.close();
}
int32 tell() {
return _curPos;
}
bool seek(int32 pos) {
if(pos != _curPos) {
- fseek(_ifs, pos, SEEK_SET);
+ _ifs.seek(pos, SEEK_SET);
_curPos = pos;
}
return true;
}
bool read(void * ptr, int32 size) {
- fread(ptr, size, 1, _ifs);
+ _ifs.read(ptr, size);
_curPos += size;
return true;
}
@@ -90,8 +90,8 @@ FileChunk::~FileChunk() {
if(_data) _data->decRef();
}
-FileChunk::FileChunk(const char * fname) {
- _data = new FilePtr(fname);
+FileChunk::FileChunk(const char * fname, const char * directory) {
+ _data = new FilePtr(fname, directory);
_data->read(&_type, 4);
_type = TO_BE_32(_type);
_data->read(&_size, 4);
diff --git a/scumm/smush/chunk.h b/scumm/smush/chunk.h
index 893ede35f8..b13da2d05d 100644
--- a/scumm/smush/chunk.h
+++ b/scumm/smush/chunk.h
@@ -76,7 +76,7 @@ private:
protected:
FileChunk();
public:
- FileChunk(const char * fname);
+ FileChunk(const char * fname, const char * directory);
virtual ~FileChunk();
type getType() const;
uint32 getSize() const;
diff --git a/scumm/smush/player.cpp b/scumm/smush/player.cpp
index 6e3091f5bf..b61a746e40 100644
--- a/scumm/smush/player.cpp
+++ b/scumm/smush/player.cpp
@@ -616,10 +616,10 @@ void SmushPlayer::handleAnimHeader(Chunk & b) {
}
#define NEW_FILE 1
-static StringResource * getStrings(const char * file, bool is_encoded) {
+static StringResource * getStrings(const char * file, const char * directory, bool is_encoded) {
debug(7, "trying to read text ressources from %s", file);
File theFile;
- theFile.open(file);
+ theFile.open(file, directory);
if (!theFile.isOpen())
return 0;
int32 length = theFile.size();
@@ -633,7 +633,7 @@ static StringResource * getStrings(const char * file, bool is_encoded) {
Chunk::type type = READ_BE_UINT32(filebuffer);
if(type != TYPE_ETRS) {
delete [] filebuffer;
- return getStrings(file, false);
+ return getStrings(file, directory, false);
}
char * old = filebuffer;
filebuffer = new char[length - ETRS_HEADER_LENGTH];
@@ -649,102 +649,58 @@ static StringResource * getStrings(const char * file, bool is_encoded) {
return sr;
}
-bool SmushPlayer::readString(const char * file, bool & ft) {
+bool SmushPlayer::readString(const char * file, const char * directory, bool & ft) {
const char * i = strrchr(file, '.');
if(i == NULL) error("invalid filename : %s", file);
char fname[260];
memcpy(fname, file, i - file);
strcpy(fname + (i - file), ".trs");
- if((_strings = getStrings(fname, false)) != 0) {
+ if((_strings = getStrings(fname, directory, false)) != 0) {
ft = true;
return true;
}
- i = strrchr(file, '\\');
- if(i == NULL) i = strrchr(file, '/');
- else {
- char * j = strrchr(file, '/');
- if(j > i) i = j;
- }
- if(i == NULL) error("invalid filename : %s", file);
- memcpy(fname, file, i - file + 1);
- strcpy(fname + (i - file + 1), "digtxt.trs");
- if((_strings = getStrings(fname, true)) != 0) {
+ if((_strings = getStrings("digtxt.trs", directory, true)) != 0) {
ft = false;
return true;
}
return false;
}
-static FontRenderer * loadFont(const char * file, bool original = false) {
+static FontRenderer * loadFont(const char * file, const char * directory, bool original = false) {
#ifdef DEBUG
debug(5, "loading font from \"%s\"", file);
#endif
FontRenderer * fr = new FontRenderer(original);
SmushPlayer p(fr, false, false);
- p.play(file);
+ p.play(file, directory);
return fr;
}
-bool SmushPlayer::play(const char * file) {
+bool SmushPlayer::play(const char * file, const char * directory) {
#ifdef DEBUG
debug(5, "start of animation : %s", file);
#endif
- char * i = strrchr(file, '\\');
- if(i == NULL)
- {
- i = strrchr(file, '/');
- } else {
- char * j = strrchr(i, '/');
- if(j != NULL)
- i = j;
- }
- char directory[260];
- if(i != NULL) {
- strcpy(directory, file);
- directory[i-file] = 0;
- //! @todo remove this...
- _fname = strdup(i);
- } else {
- directory[0] = 0;
- _fname = strdup(file);
- }
clean();
if(_wait) {
bool isFullthrottle;
- if(!readString(file, isFullthrottle))
+ if(!readString(file, directory, isFullthrottle))
warning("unable to read text information for \"%s\"", file);
if(_strings) {
if(isFullthrottle) {
- if(strcmp(directory, "") == 0) {
- strcpy(directory, "../data/");
- } else {
- char * i = strrchr(directory, '\\');
- char * j = strrchr(directory, '/');
- if(j > i) i = j;
- if(i == NULL) {
- strcpy(directory, "data/");
- } else {
- *i = 0;
- strcat(directory, "/data/");
- }
- }
- char file[260];
- strcpy(file, directory); strcat(file, "scummfnt.nut");
- _fr[0] = loadFont(file, true);
- strcpy(file, directory); strcat(file, "titlfnt.nut");
- _fr[2] = loadFont(file, true);
+ _fr[0] = loadFont("scummfnt.nut", directory, true);
+ _fr[2] = loadFont("titlfnt.nut", directory, true);
} else {
for(int32 i = 0; i < 4; i++) {
- char file[260];
- sprintf(file, "%s/font%d.nut",directory, i);
- _fr[i] = loadFont(file, i != 0);
+ char file_font[20];
+ sprintf((char*)&file_font, "font%d.nut", i);
+ _fr[i] = loadFont(file_font, directory, i != 0);
}
}
}
}
- FileChunk base = FileChunk(file);
+ FileChunk base = FileChunk(file, directory);
checkBlock(base, TYPE_ANIM);
diff --git a/scumm/smush/player.h b/scumm/smush/player.h
index f9decce7f0..4563261f59 100644
--- a/scumm/smush/player.h
+++ b/scumm/smush/player.h
@@ -73,12 +73,12 @@ private:
public:
SmushPlayer(Renderer *, bool wait = true, bool output_sound = true);
virtual ~SmushPlayer();
- bool play(const char *);
+ bool play(const char *, const char * directory);
void updatePalette(void);
void show(const char *);
void hide(const char *);
protected:
- bool readString(const char * file, bool &);
+ bool readString(const char * file, const char * directory, bool &);
void clean();
void checkBlock(const Chunk &, Chunk::type, uint32 = 0);
void handleAnimHeader(Chunk &);
diff --git a/scumm/sound.cpp b/scumm/sound.cpp
index 12032485ed..d9ff62ec12 100644
--- a/scumm/sound.cpp
+++ b/scumm/sound.cpp
@@ -751,10 +751,9 @@ File * Sound::openSfxFile() {
#ifdef COMPRESSED_SOUND_FILE
offset_table = NULL;
- sprintf(buf, "%s%s.so3", _scumm->getGameDataPath(), _scumm->_exe_name);
- if (!file->open(buf)) {
- sprintf(buf, "%smonster.so3", _scumm->getGameDataPath());
- file->open(buf);
+ sprintf(buf, "%s.so3", _scumm->_exe_name);
+ if (!file->open(buf, _scumm->getGameDataPath())) {
+ file->open("monster.so3", _scumm->getGameDataPath());
}
if (file->isOpen() == true) {
/* Now load the 'offset' index in memory to be able to find the MP3 data
@@ -791,10 +790,9 @@ File * Sound::openSfxFile() {
return file;
}
#endif
- sprintf(buf, "%s%s.sou", _scumm->getGameDataPath(), _scumm->_exe_name);
- if (!file->open(buf)) {
- sprintf(buf, "%smonster.sou", _scumm->getGameDataPath());
- file->open(buf);
+ sprintf(buf, "%s.sou", _scumm->_exe_name);
+ if (!file->open(buf, _scumm->getGameDataPath())) {
+ file->open("monster.sou", _scumm->getGameDataPath());
}
return file;
}
@@ -837,11 +835,8 @@ static void music_handler (Scumm * scumm) {
#define OUTPUT_SIZE 66150 // ((22050 * 2 * 2) / 4) * 3
void Sound::playBundleMusic(int32 song) {
- char buf[256];
-
if (_numberBundleMusic == -1) {
- sprintf(buf, "%s%smusic.bun", _scumm->getGameDataPath(), _scumm->_exe_name);
- if (_scumm->_bundle->openMusicFile((char*)&buf) == false) {
+ if (_scumm->_bundle->openMusicFile("digmusic.bun", _scumm->getGameDataPath()) == false) {
return;
}
@@ -958,11 +953,9 @@ void Sound::bundleMusicHandler(Scumm * scumm) {
}
void Sound::playBundleSound(char *sound) {
- char buf[256];
byte * ptr;
- sprintf(buf, "%s%svoice.bun", _scumm->getGameDataPath(), _scumm->_exe_name);
- if (_scumm->_bundle->openVoiceFile((char*)&buf) == false) {
+ if (_scumm->_bundle->openVoiceFile("digvoice.bun", _scumm->getGameDataPath()) == false) {
return;
}
@@ -1093,8 +1086,8 @@ int Sound::getCachedTrack(int track) {
_current_cache %= CACHE_TRACKS;
// Not found, see if it exists
- sprintf(track_name, "%strack%d.mp3", _scumm->getGameDataPath(), track);
- file->open(track_name);
+ sprintf(track_name, "track%d.mp3", track);
+ file->open(track_name, _scumm->getGameDataPath());
_cached_tracks[current_index] = track;
/* First, close the previous file */