/* 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. * */ /* * This code is based on Labyrinth of Time code with assistance of * * Copyright (c) 1993 Terra Nova Development * Copyright (c) 2004 The Wyrmkeep Entertainment Co. * */ #include "lab/stddefines.h" namespace Lab { bool IsHiRes = false; /*****************************************************************************/ /* Scales the x co-ordinates to that of the new display. In the room parser */ /* file, co-ordinates are set up on a 360x336 display. */ /*****************************************************************************/ uint16 scaleX(uint16 x) { if (IsHiRes) return (uint16)((x * 16) / 9); else return (uint16)((x * 8) / 9); } /*****************************************************************************/ /* Scales the y co-ordinates to that of the new display. In the room parser */ /* file, co-ordinates are set up on a 368x336 display. */ /*****************************************************************************/ uint16 scaleY(uint16 y) { if (IsHiRes) return (y + (y / 14)); else return ((y * 10) / 24); } /*****************************************************************************/ /* Scales the VGA cords to SVGA if necessary; otherwise, returns VGA cords. */ /*****************************************************************************/ uint16 VGAScaleX(uint16 x) { if (IsHiRes) return (x * 2); else return x; } /*****************************************************************************/ /* Scales the VGA cords to SVGA if necessary; otherwise, returns VGA cords. */ /*****************************************************************************/ uint16 VGAScaleY(uint16 y) { if (IsHiRes) return ((y * 12) / 5); else return y; } /*****************************************************************************/ /* Scales the VGA cords to SVGA if necessary; otherwise, returns VGA cords. */ /*****************************************************************************/ int16 VGAScaleXs(int16 x) { if (IsHiRes) return (x * 2); else return x; } /*****************************************************************************/ /* Scales the VGA cords to SVGA if necessary; otherwise, returns VGA cords. */ /*****************************************************************************/ int16 VGAScaleYs(int16 y) { if (IsHiRes) return ((y * 12) / 5); else return y; } uint16 SVGACord(uint16 cord) { if (IsHiRes) return cord; else return 0; } /*****************************************************************************/ /* Converts SVGA cords to VGA if necessary, otherwise returns VGA cords. */ /*****************************************************************************/ uint16 VGAUnScaleX(uint16 x) { if (IsHiRes) return (x / 2); else return x; } /*****************************************************************************/ /* Converts SVGA cords to VGA if necessary, otherwise returns VGA cords. */ /*****************************************************************************/ uint16 VGAUnScaleY(uint16 y) { if (IsHiRes) return ((y * 5) / 12); else return y; } /*****************************************************************************/ /* Checks to see if all the characters in the second string are at the start */ /* of the first. */ /*****************************************************************************/ static bool strstart(const char **Source, const char *Start) { uint16 len1, len2, counter; len1 = strlen(*Source); len2 = strlen(Start); if (len1 < len2) return false; for (counter = 0; counter < len2; counter++) if ((*Source)[counter] != Start[counter]) return false; (*Source) += len2; return true; } static char NewFileName[255]; /*****************************************************************************/ /* Modifes the filename so that paths and stuff are correct. Should mostly */ /* deal with assigns and the '/' instead of '\' on IBM systems. */ /* */ /* NOTE: Make a *copy* of the string, and modify that. It would be a real */ /* *bad* idea to modify the original. Since Labyrinth only focuses its */ /* attention to one file at a time, it would be fine to have one variable */ /* not on the stack which is used to store the new filename. */ /*****************************************************************************/ static void mystrupr(char *s) { char c; while ((c = *s) != 0) *s++ = toupper(c); } char *translateFileName(const char *filename) { char tempfilename[255]; char *dot; strcpy(tempfilename, filename); mystrupr(tempfilename); *NewFileName = 0; filename = tempfilename; if (strstart(&filename, "P:")) { if (IsHiRes) strcat(NewFileName, "GAME/SPICT/"); else strcat(NewFileName, "GAME/PICT/"); } else if (strstart(&filename, "LAB:")) strcat(NewFileName, "GAME/"); else if (strstart(&filename, "MUSIC:")) strcat(NewFileName, "GAME/MUSIC/"); strcat(NewFileName, filename); dot = strrchr(NewFileName, '.'); if (dot != NewFileName && dot != NULL && dot[4] != '/') { // Linux may start with '.' dot[4] = 0; // Back to the days of 8.3, even if your OS was never DOSish!! } return NewFileName; } #if defined(USE_SWAP) uint16 swapUShort(uint16 value) { char *b = (char *)&value; char t = b[0]; b[0] = b[1]; b[1] = t; return value; } uint16 *wapUShortPtsr(uint16 *ptr, int count) { while (count-- > 0) { char *b = (char *)ptr++; char t = b[0]; b[0] = b[1]; b[1] = t; } return ptr; } int16 swapShort(int16 value) { char *b = (char *)&value; char t = b[0]; b[0] = b[1]; b[1] = t; return value; } int16 *swapShortPtr(int16 *ptr, int count) { while (count-- > 0) { char *b = (char *)ptr++; char t = b[0]; b[0] = b[1]; b[1] = t; } return ptr; } unsigned int swapUInt(unsigned int value) { char *b = (char *)&value; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; return value; } unsigned int *swapUIntPtr(unsigned int *ptr, int count) { while (count-- > 0) { char *b = (char *)ptr++; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; } return ptr; } int swapInt(int value) { char *b = (char *)&value; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; return value; } int *swapIntPtr(int *ptr, int count) { while (count-- > 0) { char *b = (char *)ptr++; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; } return ptr; } uint32 swapULong(uint32 value) { char *b = (char *)&value; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; return value; } uint32 *swapULongPtr(uint32 *ptr, int count) { while (count-- > 0) { char *b = (char *)ptr++; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; } return ptr; } int32 swapLong(int32 value) { char *b = (char *)&value; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; return value; } int32 *swapLongPtr(int32 *ptr, int count) { while (count-- > 0) { char *b = (char *)ptr++; char t = b[0]; b[0] = b[3]; b[3] = t; t = b[1]; b[1] = b[2]; b[2] = t; } return ptr; } #endif } // End of namespace Lab