diff options
Diffstat (limited to 'engines/sludge/objtypes.cpp')
-rw-r--r-- | engines/sludge/objtypes.cpp | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/engines/sludge/objtypes.cpp b/engines/sludge/objtypes.cpp new file mode 100644 index 0000000000..7f19ee74d3 --- /dev/null +++ b/engines/sludge/objtypes.cpp @@ -0,0 +1,177 @@ +/* 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 "allfiles.h" +#include "objtypes.h" +#include "variable.h" +#include "newfatal.h" +#include "moreio.h" +#include "fileset.h" +#include "CommonCode/version.h" + +objectType *allObjectTypes = NULL; +extern char *outputDir; + +#define DEBUG_COMBINATIONS 0 + +bool initObjectTypes() { + return true; +} + +objectType *findObjectType(int i) { + objectType *huntType = allObjectTypes; + + while (huntType) { + if (huntType -> objectNum == i) return huntType; + huntType = huntType -> next; + } + + return loadObjectType(i); +} + +objectType *loadObjectType(int i) { +#if ALLOW_FILE + int a, nameNum; + objectType *newType = new objectType; + + if (checkNew(newType)) { + if (openObjectSlice(i)) { + nameNum = get2bytes(bigDataFile); + newType -> r = (byte) fgetc(bigDataFile); + newType -> g = (byte) fgetc(bigDataFile); + newType -> b = (byte) fgetc(bigDataFile); + newType -> speechGap = fgetc(bigDataFile); + newType -> walkSpeed = fgetc(bigDataFile); + newType -> wrapSpeech = get4bytes(bigDataFile); + newType -> spinSpeed = get2bytes(bigDataFile); + + if (gameVersion >= VERSION(1, 6)) { + // aaLoad + fgetc(bigDataFile); + getFloat(bigDataFile); + getFloat(bigDataFile); + } + + if (gameVersion >= VERSION(1, 4)) { + newType -> flags = get2bytes(bigDataFile); + } else { + newType -> flags = 0; + } + + newType -> numCom = get2bytes(bigDataFile); + newType -> allCombis = (newType -> numCom) ? new combination[newType -> numCom] : NULL; + +#if DEBUG_COMBINATIONS + FILE *callEventLog = fopen("callEventLog.txt", "at"); + if (callEventLog) { + fprintf(callEventLog, "Object type %d has %d combinations... ", i, newType -> numCom); + } +#endif + + for (a = 0; a < newType -> numCom; a ++) { + newType -> allCombis[a].withObj = get2bytes(bigDataFile); + newType -> allCombis[a].funcNum = get2bytes(bigDataFile); +#if DEBUG_COMBINATIONS + if (callEventLog) { + fprintf(callEventLog, "%d(%d) ", newType -> allCombis[a].withObj, newType -> allCombis[a].funcNum); + } +#endif + } +#if DEBUG_COMBINATIONS + if (callEventLog) { + fprintf(callEventLog, "\n"); + fclose(callEventLog); + } +#endif + finishAccess(); + newType -> screenName = getNumberedString(nameNum); + newType -> objectNum = i; + newType -> next = allObjectTypes; + allObjectTypes = newType; + return newType; + } + } +#endif + return NULL; +} + +#if ALLOW_FILE +objectType *loadObjectRef(FILE *fp) { + objectType *r = loadObjectType(get2bytes(fp)); + delete r -> screenName; + r -> screenName = readString(fp); + return r; +} + +void saveObjectRef(objectType *r, FILE *fp) { + put2bytes(r -> objectNum, fp); + writeString(r -> screenName, fp); +} +#endif + +int getCombinationFunction(int withThis, int thisObject) { + int i, num = 0; + objectType *obj = findObjectType(thisObject); + +#if DEBUG_COMBINATIONS + FILE *callEventLog = fopen("callEventLog.txt", "at"); + if (callEventLog) { + fprintf(callEventLog, "Combining %d and %d - ", thisObject, withThis); + } +#endif + + for (i = 0; i < obj -> numCom; i ++) { + if (obj -> allCombis[i].withObj == withThis) { + num = obj -> allCombis[i].funcNum; + break; + } + } + +#if DEBUG_COMBINATIONS + if (callEventLog) { + fprintf(callEventLog, "got function number %d\n", num); + fclose(callEventLog); + } +#endif + + return num; +} + +void removeObjectType(objectType *oT) { + objectType * * huntRegion = & allObjectTypes; + + while (* huntRegion) { + if ((* huntRegion) == oT) { +// FILE * debuggy2 = fopen ("debug.txt", "at"); +// fprintf (debuggy2, "DELETING OBJECT TYPE: %p %s\n", oT, oT -> screenName); +// fclose (debuggy2); + + * huntRegion = oT -> next; + delete oT -> allCombis; + delete oT -> screenName; + delete oT; + return; + } else { + huntRegion = & ((* huntRegion) -> next); + } + } + fatal("Can't delete object type: bad pointer"); +} |