From 2a827a98bb8bbb994c395d405c8fb94736e28f4a Mon Sep 17 00:00:00 2001 From: Ronald Kinard <furyhunter600@gmail.com> Date: Wed, 19 Mar 2014 02:31:50 -0500 Subject: [PATCH] Initial SDL2 renderer impmlementation work. --- comptime.sh | 3 +- src/Makefile | 2 +- src/Makefile.cfg | 3 +- src/m_misc.c | 1 + src/sdl2/IMG_xpm.c | 506 ++ src/sdl2/MakeCYG.cfg | 17 + src/sdl2/MakeNIX.cfg | 92 + src/sdl2/Makefile.cfg | 163 + src/sdl2/SDL_icon.xpm | 80 + src/sdl2/SDL_main/SDL_dummy_main.c | 12 + src/sdl2/SDL_main/SDL_macosx_main.h | 11 + src/sdl2/SDL_main/SDL_macosx_main.m | 374 ++ src/sdl2/SDL_main/SDL_openxdk_main.c | 7 + src/sdl2/SDL_main/SDL_win32_main.c | 406 ++ src/sdl2/SRB2CE/Makefile.cfg | 12 + src/sdl2/SRB2CE/SRB2CE.zip | Bin 0 -> 34234 bytes src/sdl2/SRB2CE/cehelp.c | 447 ++ src/sdl2/SRB2CE/cehelp.h | 63 + src/sdl2/SRB2DC/.gitignore | 1 + src/sdl2/SRB2DC/IP.BIN | Bin 0 -> 32768 bytes src/sdl2/SRB2DC/Makefile.cfg | 53 + src/sdl2/SRB2DC/SELFBOOT.BIN | Bin 0 -> 1408808 bytes src/sdl2/SRB2DC/VMU.xbm | 19 + src/sdl2/SRB2DC/dchelp.c | 134 + src/sdl2/SRB2DC/dchelp.h | 51 + src/sdl2/SRB2DC/i_udp.c | 455 ++ src/sdl2/SRB2DC/scramble.c | 259 + src/sdl2/SRB2PS3/ICON0.png | Bin 0 -> 3678 bytes src/sdl2/SRB2PS3/Makefile.cfg | 139 + src/sdl2/SRB2PS3/sfo.xml | 39 + src/sdl2/SRB2PSP/ICON0.png | Bin 0 -> 3678 bytes src/sdl2/SRB2PSP/Makefile.cfg | 126 + src/sdl2/SRB2PSP/PIC1.png | Bin 0 -> 20300 bytes src/sdl2/SRB2PSP/psp-prxsign/.gitignore | 2 + src/sdl2/SRB2PSP/psp-prxsign/Makefile | 22 + src/sdl2/SRB2PSP/psp-prxsign/cmac.c | 130 + src/sdl2/SRB2PSP/psp-prxsign/cmac.h | 38 + src/sdl2/SRB2PSP/psp-prxsign/kirk_header.h | 25 + src/sdl2/SRB2PSP/psp-prxsign/main.c | 190 + src/sdl2/SRB2PSP/psp-prxsign/psp_header.h | 29 + src/sdl2/SRB2Pandora/Makefile.cfg | 39 + src/sdl2/SRB2Pandora/PXML.xml | 17 + src/sdl2/SRB2Pandora/icon.png | Bin 0 -> 1690 bytes src/sdl2/SRB2WII/Makefile.cfg | 124 + src/sdl2/SRB2WII/icon.png | Bin 0 -> 11247 bytes src/sdl2/SRB2WII/meta.xml | 18 + src/sdl2/SRB2XBOX/Makefile.cfg | 44 + src/sdl2/SRB2XBOX/xboxhelp.c | 91 + src/sdl2/SRB2XBOX/xboxhelp.h | 6 + src/sdl2/Srb2SDL-vc10.vcxproj | 1464 +++++ src/sdl2/Srb2SDL-vc9.vcproj | 5845 +++++++++++++++++ src/sdl2/Srb2SDL.dsp | 1057 +++ src/sdl2/Srb2SDL.dsw | 74 + src/sdl2/Srb2SDL.ico | Bin 0 -> 2238 bytes src/sdl2/dosstr.c | 38 + src/sdl2/endtxt.c | 236 + src/sdl2/endtxt.h | 24 + src/sdl2/filter/filters.c | 1000 +++ src/sdl2/filter/filters.h | 212 + src/sdl2/filter/hq2x.c | 3125 +++++++++ src/sdl2/filter/hq2x.h | 1824 +++++ src/sdl2/filter/interp.h | 306 + src/sdl2/filter/lq2x.c | 564 ++ src/sdl2/filter/lq2x.h | 1284 ++++ src/sdl2/filter/main.c | 15 + src/sdl2/hwsym_sdl.c | 183 + src/sdl2/hwsym_sdl.h | 23 + src/sdl2/i_cdmus.c | 38 + src/sdl2/i_main.c | 247 + src/sdl2/i_net.c | 442 ++ src/sdl2/i_system.c | 3115 +++++++++ src/sdl2/i_ttf.c | 340 + src/sdl2/i_ttf.h | 88 + src/sdl2/i_video.c | 186 + .../macosx/English.lproj/InfoPlist.strings | 0 src/sdl2/macosx/Info.plist | 28 + src/sdl2/macosx/Srb2mac.icns | Bin 0 -> 79787 bytes .../macosx/Srb2mac.pbproj/project.pbxproj | 3546 ++++++++++ .../macosx/Srb2mac.xcodeproj/project.pbxproj | 1508 +++++ src/sdl2/macosx/mac_alert.c | 45 + src/sdl2/macosx/mac_alert.h | 27 + src/sdl2/mixer_sound.c | 824 +++ src/sdl2/ogl_sdl.c | 315 + src/sdl2/ogl_sdl.h | 30 + src/sdl2/sdl_sound.c | 2030 ++++++ src/sdl2/sdlmain.h | 65 + src/sdl2/srb2.ttf | Bin 0 -> 318280 bytes 87 files changed, 34394 insertions(+), 4 deletions(-) create mode 100644 src/sdl2/IMG_xpm.c create mode 100644 src/sdl2/MakeCYG.cfg create mode 100644 src/sdl2/MakeNIX.cfg create mode 100644 src/sdl2/Makefile.cfg create mode 100644 src/sdl2/SDL_icon.xpm create mode 100644 src/sdl2/SDL_main/SDL_dummy_main.c create mode 100644 src/sdl2/SDL_main/SDL_macosx_main.h create mode 100644 src/sdl2/SDL_main/SDL_macosx_main.m create mode 100644 src/sdl2/SDL_main/SDL_openxdk_main.c create mode 100644 src/sdl2/SDL_main/SDL_win32_main.c create mode 100644 src/sdl2/SRB2CE/Makefile.cfg create mode 100644 src/sdl2/SRB2CE/SRB2CE.zip create mode 100644 src/sdl2/SRB2CE/cehelp.c create mode 100644 src/sdl2/SRB2CE/cehelp.h create mode 100644 src/sdl2/SRB2DC/.gitignore create mode 100644 src/sdl2/SRB2DC/IP.BIN create mode 100644 src/sdl2/SRB2DC/Makefile.cfg create mode 100644 src/sdl2/SRB2DC/SELFBOOT.BIN create mode 100644 src/sdl2/SRB2DC/VMU.xbm create mode 100644 src/sdl2/SRB2DC/dchelp.c create mode 100644 src/sdl2/SRB2DC/dchelp.h create mode 100644 src/sdl2/SRB2DC/i_udp.c create mode 100644 src/sdl2/SRB2DC/scramble.c create mode 100644 src/sdl2/SRB2PS3/ICON0.png create mode 100644 src/sdl2/SRB2PS3/Makefile.cfg create mode 100644 src/sdl2/SRB2PS3/sfo.xml create mode 100644 src/sdl2/SRB2PSP/ICON0.png create mode 100644 src/sdl2/SRB2PSP/Makefile.cfg create mode 100644 src/sdl2/SRB2PSP/PIC1.png create mode 100644 src/sdl2/SRB2PSP/psp-prxsign/.gitignore create mode 100644 src/sdl2/SRB2PSP/psp-prxsign/Makefile create mode 100644 src/sdl2/SRB2PSP/psp-prxsign/cmac.c create mode 100644 src/sdl2/SRB2PSP/psp-prxsign/cmac.h create mode 100644 src/sdl2/SRB2PSP/psp-prxsign/kirk_header.h create mode 100644 src/sdl2/SRB2PSP/psp-prxsign/main.c create mode 100644 src/sdl2/SRB2PSP/psp-prxsign/psp_header.h create mode 100644 src/sdl2/SRB2Pandora/Makefile.cfg create mode 100644 src/sdl2/SRB2Pandora/PXML.xml create mode 100644 src/sdl2/SRB2Pandora/icon.png create mode 100644 src/sdl2/SRB2WII/Makefile.cfg create mode 100644 src/sdl2/SRB2WII/icon.png create mode 100644 src/sdl2/SRB2WII/meta.xml create mode 100644 src/sdl2/SRB2XBOX/Makefile.cfg create mode 100644 src/sdl2/SRB2XBOX/xboxhelp.c create mode 100644 src/sdl2/SRB2XBOX/xboxhelp.h create mode 100644 src/sdl2/Srb2SDL-vc10.vcxproj create mode 100644 src/sdl2/Srb2SDL-vc9.vcproj create mode 100644 src/sdl2/Srb2SDL.dsp create mode 100644 src/sdl2/Srb2SDL.dsw create mode 100644 src/sdl2/Srb2SDL.ico create mode 100644 src/sdl2/dosstr.c create mode 100644 src/sdl2/endtxt.c create mode 100644 src/sdl2/endtxt.h create mode 100644 src/sdl2/filter/filters.c create mode 100644 src/sdl2/filter/filters.h create mode 100644 src/sdl2/filter/hq2x.c create mode 100644 src/sdl2/filter/hq2x.h create mode 100644 src/sdl2/filter/interp.h create mode 100644 src/sdl2/filter/lq2x.c create mode 100644 src/sdl2/filter/lq2x.h create mode 100644 src/sdl2/filter/main.c create mode 100644 src/sdl2/hwsym_sdl.c create mode 100644 src/sdl2/hwsym_sdl.h create mode 100644 src/sdl2/i_cdmus.c create mode 100644 src/sdl2/i_main.c create mode 100644 src/sdl2/i_net.c create mode 100644 src/sdl2/i_system.c create mode 100644 src/sdl2/i_ttf.c create mode 100644 src/sdl2/i_ttf.h create mode 100644 src/sdl2/i_video.c create mode 100644 src/sdl2/macosx/English.lproj/InfoPlist.strings create mode 100644 src/sdl2/macosx/Info.plist create mode 100644 src/sdl2/macosx/Srb2mac.icns create mode 100644 src/sdl2/macosx/Srb2mac.pbproj/project.pbxproj create mode 100644 src/sdl2/macosx/Srb2mac.xcodeproj/project.pbxproj create mode 100644 src/sdl2/macosx/mac_alert.c create mode 100644 src/sdl2/macosx/mac_alert.h create mode 100644 src/sdl2/mixer_sound.c create mode 100644 src/sdl2/ogl_sdl.c create mode 100644 src/sdl2/ogl_sdl.h create mode 100644 src/sdl2/sdl_sound.c create mode 100644 src/sdl2/sdlmain.h create mode 100644 src/sdl2/srb2.ttf diff --git a/comptime.sh b/comptime.sh index 1bd35b629..a03ad33ba 100755 --- a/comptime.sh +++ b/comptime.sh @@ -5,7 +5,8 @@ if [ x"$1" != x ]; then fi versiongit() { - gitversion=`git svn log HEAD --limit=1 --oneline | cut -f 1 -d " "` + #gitversion=`git svn log HEAD --limit=1 --oneline | cut -f 1 -d " "` + gitversion=`git log HEAD -n1 --oneline | cut -f 1 -d " "` cat <<EOF > $path/comptime.h // Do not edit! This file was autogenerated diff --git a/src/Makefile b/src/Makefile index a5d5dc191..2e3f5406e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -202,7 +202,7 @@ LIBS+=-lm endif ifdef SDL -include sdl/Makefile.cfg +include sdl2/Makefile.cfg endif #ifdef SDL ifdef DISTCC diff --git a/src/Makefile.cfg b/src/Makefile.cfg index ccf84165f..e4f9290c6 100644 --- a/src/Makefile.cfg +++ b/src/Makefile.cfg @@ -230,7 +230,6 @@ ifdef DUMMY BIN:=$(BIN)/dummy else ifdef LINUX - INTERFACE=sdl NASMFORMAT=elf -DLINUX SDL=1 ifndef NOGETTEXT @@ -387,7 +386,7 @@ OBJDUMP_OPTS?=--wide --source --line-numbers LD=$(CC) ifdef SDL - INTERFACE=sdl + INTERFACE=sdl2 OBJDIR:=$(OBJDIR)/SDL endif diff --git a/src/m_misc.c b/src/m_misc.c index acf6a5982..6e34f02b7 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -49,6 +49,7 @@ #ifdef SDL #include "sdl/hwsym_sdl.h" +typedef off_t off64_t; #endif #if defined (_WIN32) diff --git a/src/sdl2/IMG_xpm.c b/src/sdl2/IMG_xpm.c new file mode 100644 index 000000000..e08736d66 --- /dev/null +++ b/src/sdl2/IMG_xpm.c @@ -0,0 +1,506 @@ +/* + SDL_image: An example image loading library for use with SDL + Copyright (C) 1999-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* $Id: IMG_xpm.c,v 1.10 2004/01/04 22:04:38 slouken Exp $ */ + +/* + * XPM (X PixMap) image loader: + * + * Supports the XPMv3 format, EXCEPT: + * - hotspot coordinates are ignored + * - only colour ('c') colour symbols are used + * - rgb.txt is not used (for portability), so only RGB colours + * are recognized (#rrggbb etc) - only a few basic colour names are + * handled + * + * The result is an 8bpp indexed surface if possible, otherwise 32bpp. + * The colourkey is correctly set if transparency is used. + * + * Besides the standard API, also provides + * + * SDL_Surface *IMG_ReadXPMFromArray(char **xpm) + * + * that reads the image data from an XPM file included in the C source. + * + * TODO: include rgb.txt here. The full table (from solaris 2.6) only + * requires about 13K in binary form. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> + +//#include "SDL_image.h" + + +#ifdef LOAD_XPM + +/* See if an image is contained in a data source */ +#if 0 +int IMG_isXPM(SDL_RWops *src) +{ + char magic[9]; + + return (SDL_RWread(src, magic, sizeof (magic), 1) + && memcmp(magic, "/* XPM */", 9) == 0); +} +#endif + +/* Hash table to look up colors from pixel strings */ +#define STARTING_HASH_SIZE 256 + +struct hash_entry { + char *key; + Uint32 color; + struct hash_entry *next; +}; + +struct color_hash { + struct hash_entry **table; + struct hash_entry *entries; /* array of all entries */ + struct hash_entry *next_free; + size_t size; + int maxnum; +}; + +static int hash_key(const char *key, int cpp, size_t size) +{ + int hash; + + hash = 0; + while ( cpp-- > 0 ) { + hash = hash * 33 + *key++; + } + return (int)(hash & (size - 1)); +} + +static struct color_hash *create_colorhash(int maxnum) +{ + size_t bytes; + int s; + struct color_hash *hash; + + /* we know how many entries we need, so we can allocate + everything here */ + hash = malloc(sizeof *hash); + if (!hash) + return NULL; + + /* use power-of-2 sized hash table for decoding speed */ + for (s = STARTING_HASH_SIZE; s < maxnum; s <<= 1) + ; + hash->size = s; + hash->maxnum = maxnum; + bytes = hash->size * sizeof (struct hash_entry **); + hash->entries = NULL; /* in case malloc fails */ + hash->table = malloc(bytes); + if (!hash->table) + return NULL; + memset(hash->table, 0, bytes); + hash->entries = malloc(maxnum * sizeof (struct hash_entry)); + if (!hash->entries) + { + free(hash->table); + return NULL; + } + hash->next_free = hash->entries; + return hash; +} + +static int add_colorhash(struct color_hash *hash, + char *key, int cpp, Uint32 color) +{ + const int indexkey = hash_key(key, cpp, hash->size); + struct hash_entry *e = hash->next_free++; + e->color = color; + e->key = key; + e->next = hash->table[indexkey]; + hash->table[indexkey] = e; + return 1; +} + +/* fast lookup that works if cpp == 1 */ +#define QUICK_COLORHASH(hash, key) ((hash)->table[*(const Uint8 *)(key)]->color) + +static Uint32 get_colorhash(struct color_hash *hash, const char *key, int cpp) +{ + struct hash_entry *entry = hash->table[hash_key(key, cpp, hash->size)]; + while (entry) { + if (memcmp(key, entry->key, cpp) == 0) + return entry->color; + entry = entry->next; + } + return 0; /* garbage in - garbage out */ +} + +static void free_colorhash(struct color_hash *hash) +{ + if (hash && hash->table) { + free(hash->table); + free(hash->entries); + free(hash); + } +} + +/* portable case-insensitive string comparison */ +static int string_equal(const char *a, const char *b, size_t n) +{ + while (*a && *b && n) { + if (toupper((unsigned char)*a) != toupper((unsigned char)*b)) + return 0; + a++; + b++; + n--; + } + return *a == *b; +} + +#undef ARRAYSIZE +#define ARRAYSIZE(a) (int)(sizeof (a) / sizeof ((a)[0])) + +/* + * convert colour spec to RGB (in 0xrrggbb format). + * return 1 if successful. + */ +static int color_to_rgb(const char *spec, size_t speclen, Uint32 *rgb) +{ + /* poor man's rgb.txt */ + static struct { const char *name; Uint32 rgb; } known[] = { + {"none", 0xffffffff}, + {"black", 0x00000000}, + {"white", 0x00ffffff}, + {"red", 0x00ff0000}, + {"green", 0x0000ff00}, + {"blue", 0x000000ff} + }; + + if (spec[0] == '#') { + char buf[7]; + switch (speclen) { + case 4: + buf[0] = buf[1] = spec[1]; + buf[2] = buf[3] = spec[2]; + buf[4] = buf[5] = spec[3]; + break; + case 7: + memcpy(buf, spec + 1, 6); + break; + case 13: + buf[0] = spec[1]; + buf[1] = spec[2]; + buf[2] = spec[5]; + buf[3] = spec[6]; + buf[4] = spec[9]; + buf[5] = spec[10]; + break; + } + buf[6] = '\0'; + *rgb = (Uint32)strtol(buf, NULL, 16); + return 1; + } else { + int i; + for (i = 0; i < ARRAYSIZE(known); i++) + if (string_equal(known[i].name, spec, speclen)) { + *rgb = known[i].rgb; + return 1; + } + return 0; + } +} + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +static char *linebuf; +static int buflen; +static const char *error; + +/* + * Read next line from the source. + * If len > 0, it's assumed to be at least len chars (for efficiency). + * Return NULL and set error upon EOF or parse error. + */ +static const char *get_next_line(const char ***lines, SDL_RWops *src, int len) +{ + char *linebufnew; + if (lines) { + return *(*lines)++; + } else { + char c; + int n; + do { + if (SDL_RWread(src, &c, 1, 1) <= 0) { + error = "Premature end of data"; + return NULL; + } + } while (c != '"'); + if (len) { + len += 4; /* "\",\n\0" */ + if (len > buflen){ + buflen = len; + linebufnew = realloc(linebuf, buflen); + if(!linebufnew) { + free(linebuf); + error = "Out of memory"; + return NULL; + } + linebuf = linebufnew; + } + if (SDL_RWread(src, linebuf, len - 1, 1) <= 0) { + error = "Premature end of data"; + return NULL; + } + n = len - 2; + } else { + n = 0; + do { + if (n >= buflen - 1) { + if (buflen == 0) + buflen = 16; + buflen *= 2; + linebufnew = realloc(linebuf, buflen); + if(!linebufnew) { + free(linebuf); + error = "Out of memory"; + return NULL; + } + linebuf = linebufnew; + } + if (SDL_RWread(src, linebuf + n, 1, 1) <= 0) { + error = "Premature end of data"; + return NULL; + } + } while (linebuf[n++] != '"'); + n--; + } + linebuf[n] = '\0'; + return linebuf; + } +} + +#define SKIPSPACE(p) \ +do { \ + while (isspace((unsigned char)*(p))) \ + ++(p); \ +} while (0) + +#define SKIPNONSPACE(p) \ +do { \ + while (!isspace((unsigned char)*(p)) && *p) \ + ++(p); \ +} while (0) + +/* read XPM from either array or RWops */ +static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src) +{ + SDL_Surface *image = NULL; + int indexc; + int x, y; + int w, h, ncolors, cpp; + int indexed; + Uint8 *dst; + struct color_hash *colors = NULL; + SDL_Color *im_colors = NULL; + char *keystrings = NULL, *nextkey; + const char *line; + const char ***xpmlines = NULL; + int pixels_len; + + error = NULL; + linebuf = NULL; + buflen = 0; + + if (xpm) + xpmlines = &xpm; + + line = get_next_line(xpmlines, src, 0); + if (!line) + goto done; + /* + * The header string of an XPMv3 image has the format + * + * <width> <height> <ncolors> <cpp> [ <hotspot_x> <hotspot_y> ] + * + * where the hotspot coords are intended for mouse cursors. + * Right now we don't use the hotspots but it should be handled + * one day. + */ + if (sscanf(line, "%d %d %d %d", &w, &h, &ncolors, &cpp) != 4 + || w <= 0 || h <= 0 || ncolors <= 0 || cpp <= 0) { + error = "Invalid format description"; + goto done; + } + + keystrings = malloc(ncolors * cpp); + if (!keystrings) { + error = "Out of memory"; + goto done; + } + nextkey = keystrings; + + /* Create the new surface */ + if (ncolors <= 256) { + indexed = 1; + image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8, + 0, 0, 0, 0); + im_colors = image->format->palette->colors; + image->format->palette->ncolors = ncolors; + } else { + indexed = 0; + image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, + 0xff0000, 0x00ff00, 0x0000ff, 0); + } + if (!image) { + /* Hmm, some SDL error (out of memory?) */ + goto done; + } + + /* Read the colors */ + colors = create_colorhash(ncolors); + if (!colors) { + error = "Out of memory"; + goto done; + } + for (indexc = 0; indexc < ncolors; ++indexc ) { + const char *p; + line = get_next_line(xpmlines, src, 0); + if (!line) + goto done; + + p = line + cpp + 1; + + /* parse a colour definition */ + for (;;) { + char nametype; + const char *colname; + Uint32 rgb, pixel; + + SKIPSPACE(p); + if (!*p) { + error = "colour parse error"; + goto done; + } + nametype = *p; + SKIPNONSPACE(p); + SKIPSPACE(p); + colname = p; + SKIPNONSPACE(p); + if (nametype == 's') + continue; /* skip symbolic colour names */ + + if (!color_to_rgb(colname, p - colname, &rgb)) + continue; + + memcpy(nextkey, line, cpp); + if (indexed) { + SDL_Color *c = im_colors + indexc; + c->r = (Uint8)(rgb >> 16); + c->g = (Uint8)(rgb >> 8); + c->b = (Uint8)(rgb); + pixel = indexc; + } else + pixel = rgb; + add_colorhash(colors, nextkey, cpp, pixel); + nextkey += cpp; + if (rgb == 0xffffffff) + SDL_SetColorKey(image, SDL_SRCCOLORKEY, pixel); + break; + } + } + + /* Read the pixels */ + pixels_len = w * cpp; + dst = image->pixels; + for (y = 0; y < h; y++) { + line = get_next_line(xpmlines, src, pixels_len); + if (indexed) { + /* optimization for some common cases */ + if (cpp == 1) + for (x = 0; x < w; x++) + dst[x] = (Uint8)QUICK_COLORHASH(colors, + line + x); + else + for (x = 0; x < w; x++) + dst[x] = (Uint8)get_colorhash(colors, + line + x * cpp, + cpp); + } else { + for (x = 0; x < w; x++) + ((Uint32*)dst)[x] = get_colorhash(colors, + line + x * cpp, + cpp); + } + dst += image->pitch; + } + +done: + if (error) { + SDL_FreeSurface(image); + image = NULL; + SDL_SetError(error); + } + free(keystrings); + free_colorhash(colors); + free(linebuf); + return(image); +} + +/* Load a XPM type image from an RWops datasource */ +#if 0 +SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src) +{ + if ( !src ) { + /* The error message has been set in SDL_RWFromFile */ + return NULL; + } + return load_xpm(NULL, src); +} +#endif + +static inline SDL_Surface *IMG_ReadXPMFromArray(const char **xpm) +{ + return load_xpm(xpm, NULL); +} + +#else /* not LOAD_XPM */ + +/* See if an image is contained in a data source */ +#if 0 +int IMG_isXPM(SDL_RWops *src) +{ + return(0); +} + +/* Load a XPM type image from an SDL datasource */ +SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src) +{ + return(NULL); +} +#endif + +static inline SDL_Surface *IMG_ReadXPMFromArray(const char **xpm) +{ + return NULL; +} +#endif /* not LOAD_XPM */ diff --git a/src/sdl2/MakeCYG.cfg b/src/sdl2/MakeCYG.cfg new file mode 100644 index 000000000..5907579c1 --- /dev/null +++ b/src/sdl2/MakeCYG.cfg @@ -0,0 +1,17 @@ +# +# sdl/makeCYG.cfg for SRB2/Cygwin +# + +# +#Cygwin, for debugging + + NOHW=1 + NOHS=1 + NOASM=1 + + OPTS+=-DLINUX + + i_system_o+=$(OBJDIR)/SRB2.res + + # name of the exefile + EXENAME?=lsdlsrb2.exe diff --git a/src/sdl2/MakeNIX.cfg b/src/sdl2/MakeNIX.cfg new file mode 100644 index 000000000..863bbb076 --- /dev/null +++ b/src/sdl2/MakeNIX.cfg @@ -0,0 +1,92 @@ +# +# sdl/makeNIX.cfg for SRB2/?nix +# + +#Valgrind support +ifdef VALGRIND +VALGRIND_PKGCONFIG?=valgrind +VALGRIND_CFLAGS?=$(shell $(PKG_CONFIG) $(VALGRIND_PKGCONFIG) --cflags) +VALGRIND_LDFLAGS?=$(shell $(PKG_CONFIG) $(VALGRIND_PKGCONFIG) --libs) +ZDEBUG=1 +LIBS+=$(VALGRIND_LDFLAGS) +ifdef GCC46 +WFLAGS+=-Wno-error=unused-but-set-variable +WFLAGS+=-Wno-unused-but-set-variable +endif +endif + +# +#here is GNU/Linux and other +# + + OPTS=-DUNIXCOMMON + + #LDFLAGS = -L/usr/local/lib + LIBS=-lm +ifdef LINUX + LIBS+=-lrt +ifdef NOTERMIOS + OPTS+=-DNOTERMIOS +endif +endif + +# +#here is Solaris +# +ifdef SOLARIS + NOIPX=1 + NOASM=1 + OPTS+=-DSOLARIS -DINADDR_NONE=INADDR_ANY -DBSD_COMP + OPTS+=-I/usr/local/include -I/opt/sfw/include + LDFLAGS+=-L/opt/sfw/lib + LIBS+=-lsocket -lnsl +endif + +# +#here is FreeBSD +# +ifdef FREEBSD + OPTS+=-DLINUX -DFREEBSD -I/usr/X11R6/include + SDL_CONFIG?=sdl11-config + LDFLAGS+=-L/usr/X11R6/lib + LIBS+=-lipx -lkvm +endif + +# +#here is GP2x (arm-gp2x-linux) +# +ifdef GP2X + PNG_CONFIG?=$(PREFIX)-libpng12-config +ifdef STATIC #need a better setting name + CFLAGS+=-I$(OPEN2X)/include +ifndef NOMIXER + LIBS+=-lvorbisidec +ifdef MIKMOD + LIBS+=-lmikmod +endif +ifdef SMPEGLIB + LIBS+=-lsmpeg + LD=$(CXX) +endif +endif + NONET=1 +endif +ifndef ARCHNAME +"error" +endif + NONX86=1 + NOHW=1 + NOHS=1 + NOMD5=1 + WFLAGS+=-O0 + OPTS+=-DGP2X -ffast-math -mcpu=arm920t + EXENAME?=SRB2GP2X.gpe +endif + +ifndef NOHW + OPTS+=-I/usr/X11R6/include + LDFLAGS+=-L/usr/X11R6/lib +endif + + # name of the exefile + EXENAME?=lsdl2srb2 diff --git a/src/sdl2/Makefile.cfg b/src/sdl2/Makefile.cfg new file mode 100644 index 000000000..68b80ac8f --- /dev/null +++ b/src/sdl2/Makefile.cfg @@ -0,0 +1,163 @@ +# +# sdl/makefile.cfg for SRB2/SDL +# + +# +#SDL...., *looks at Alam*, THIS IS A MESS! +# + +ifdef UNIXCOMMON +include sdl2/MakeNIX.cfg +endif + +ifdef PANDORA +include sdl/SRB2Pandora/Makefile.cfg +endif #ifdef PANDORA + +ifdef DC +include sdl/SRB2DC/Makefile.cfg +endif #ifdef DC + +ifdef PS3N +include sdl/SRB2PS3/Makefile.cfg +endif #ifdef PS3N + +ifdef PSP +include sdl/SRB2PSP/Makefile.cfg +endif #ifdef PSP + +ifdef XBOX +include sdl/SRB2XBOX/Makefile.cfg +endif #ifdef XBOX + +ifdef WINCE +include sdl/SRB2CE/Makefile.cfg +endif #ifef WINCE + +ifdef CYGWIN32 +include sdl2/MakeCYG.cfg +endif #ifdef CYGWIN32 + +ifdef SDL_PKGCONFIG +SDL_CFLAGS?=$(shell $(PKG_CONFIG) $(SDL_PKGCONFIG) --cflags) +SDL_LDFLAGS?=$(shell $(PKG_CONFIG) $(SDL_PKGCONFIG) --libs) +else +ifdef PREFIX + SDL_CONFIG?=$(PREFIX)-sdl2-config +else + SDL_CONFIG?=sdl2-config +endif + +ifdef STATIC + SDL_CFLAGS?=$(shell $(SDL_CONFIG) --cflags) + SDL_LDFLAGS?=$(shell $(SDL_CONFIG) --static-libs) +else + SDL_CFLAGS?=$(shell $(SDL_CONFIG) --cflags) + SDL_LDFLAGS?=$(shell $(SDL_CONFIG) --libs) +endif +endif + + + #use the x86 asm code +ifndef CYGWIN32 +ifndef NOASM + USEASM=1 +endif +endif + + OBJS+=$(OBJDIR)/i_video.o $(OBJDIR)/dosstr.o $(OBJDIR)/endtxt.o $(OBJDIR)/hwsym_sdl.o + + OPTS+=-DDIRECTFULLSCREEN -DSDL + +ifndef NOHW + OBJS+=$(OBJDIR)/r_opengl.o $(OBJDIR)/ogl_sdl.o +endif + +ifndef NOHS +ifdef OPENAL + OBJS+=$(OBJDIR)/s_openal.o + OPTS+=-DSTATIC3DS + STATICHS=1 +else +ifdef FMOD + OBJS+=$(OBJDIR)/s_fmod.o + OPTS+=-DSTATIC3DS + STATICHS=1 +else +ifdef MINGW +ifdef DS3D + OBJS+=$(OBJDIR)/s_ds3d.o + OPTS+=-DSTATIC3DS + STATICHS=1 +endif +endif +endif +endif +endif + +ifdef FILTERS + OBJS+=$(OBJDIR)/filters.o $(OBJDIR)/hq2x.o $(OBJDIR)/lq2x.o + OPTS+=-DHAVE_FILTER +endif + +ifdef NOMIXER + i_sound_o=$(OBJDIR)/sdl_sound.o +else + i_sound_o=$(OBJDIR)/mixer_sound.o + OPTS+=-DHAVE_MIXER + SDL_LDFLAGS+=-lSDL_mixer +endif + +ifdef SDL_TTF + OPTS+=-DHAVE_TTF + SDL_LDFLAGS+=-lSDL_ttf -lfreetype -lz + OBJS+=$(OBJDIR)/i_ttf.o +endif + +#ifdef SDL_IMAGE +# OPTS+=-DHAVE_IMAGE +# SDL_LDFLAGS+=-lSDL_image +#endif + +ifdef SDL_NET + OPTS+=-DHAVE_SDLNET + SDL_LDFLAGS+=-lSDL_net +endif + +ifdef SDLMAIN + OPTS+=-DSDLMAIN +else +ifdef MINGW + SDL_CFLAGS+=-Umain + SDL_LDFLAGS+=-mconsole +endif +endif + +ifndef NOHW +ifdef OPENAL +ifdef MINGW + LIBS:=-lopenal32 $(LIBS) +else + LIBS:=-lopenal $(LIBS) +endif +else +ifdef MINGW +ifdef DS3D + LIBS:=-ldsound -luuid $(LIBS) +endif +endif +endif +endif + +# FIXME: DevkitPPC and ready-compiled SDL Wii require these things to be in a silly order +ifdef WII +include sdl/SRB2WII/Makefile.cfg +endif #ifdef WII + +CFLAGS+=$(SDL_CFLAGS) +LIBS:=$(SDL_LDFLAGS) $(LIBS) +ifndef WII +ifdef STATIC + LIBS+=$(shell $(SDL_CONFIG) --static-libs) +endif +endif diff --git a/src/sdl2/SDL_icon.xpm b/src/sdl2/SDL_icon.xpm new file mode 100644 index 000000000..70bb02d3c --- /dev/null +++ b/src/sdl2/SDL_icon.xpm @@ -0,0 +1,80 @@ +/* XPM */ +static const char * SDL_icon_xpm[] = { +"32 32 45 1", +" c None", +". c #6B6BFF", +"+ c #3D00B9", +"@ c #4848FF", +"# c #2525FF", +"$ c #310096", +"% c #003196", +"& c #003DB9", +"* c #620096", +"= c #6E6E6E", +"- c #966200", +"; c #250073", +"> c #626262", +", c #FF8F6B", +"' c #FFC66B", +") c #FFAB8E", +"! c #000080", +"~ c #B6B6B6", +"{ c #929292", +"] c #FFD48E", +"^ c #0000B9", +"/ c #565656", +"( c #868686", +"_ c #808080", +": c #C0C0C0", +"< c #DADADA", +"[ c #F2F2F2", +"} c #FFFFFF", +"| c #CECECE", +"1 c #AAAAAA", +"2 c #E6E6E6", +"3 c #000096", +"4 c #AB8EFF", +"5 c #190050", +"6 c #000000", +"7 c #8E8EFF", +"8 c #3E3E3E", +"9 c #7A7A7A", +"0 c #0E0E0E", +"a c #9E9E9E", +"b c #001950", +"c c #C2C2C2", +"d c #323232", +"e c #002573", +"f c #A0A0A4", +" ", +" ", +" ", +" .+@##@. ", +" @@.@#######@ ", +" @@....######### ", +" .. .@.....@+##$%%%&&% ", +" ..@# @@....@+#*=-;%%%%% ", +" ..@#@......@>,')!%%%$ ", +" ~..$#.........{])^#+%/ ", +" +##@.........()^@@@@@_ ", +" $####@........#=#######+ ", +" +######....@@##^#########_ ", +" +#####=:<<:+##############/ ", +"[<=####{<}}}}|###############= ", +" }1###=2}}}}}}.############### ", +" }<3#3~}}}}}}}4################ ", +" }<5#6:}}}}}}}7################/", +" }:6861}}}}}}}.########$$ 9 .@$", +" }:0a6~}}}}}}}@######5b ", +"22cd262}}}}}}2######5b$ ", +" 2>1a}}}}}}}{(*###%be## ", +" 860)1<[22c1)]]+##be### ", +" ~)]]]))))]]]]]=#bb#### ", +" )]]]]]]]]](]]=eb$#### ", +" :]]]]]]]]]'9bbb$##### ", +" ),'''''( >db+### ", +" =##f ", +" { ", +" ", +" ", +" "}; diff --git a/src/sdl2/SDL_main/SDL_dummy_main.c b/src/sdl2/SDL_main/SDL_dummy_main.c new file mode 100644 index 000000000..d8cfdd5bb --- /dev/null +++ b/src/sdl2/SDL_main/SDL_dummy_main.c @@ -0,0 +1,12 @@ +/* Include the SDL main definition header */ +#include "SDL_main.h" + +#ifdef main +#undef main +int main(int argc, char *argv[]) +{ + return(SDL_main(argc, argv)); +} +#else +/* Nothing to do on this platform */; +#endif diff --git a/src/sdl2/SDL_main/SDL_macosx_main.h b/src/sdl2/SDL_main/SDL_macosx_main.h new file mode 100644 index 000000000..4683df57a --- /dev/null +++ b/src/sdl2/SDL_main/SDL_macosx_main.h @@ -0,0 +1,11 @@ +/* SDLMain.m - main entry point for our Cocoa-ized SDL app + Initial Version: Darrell Walisser <dwaliss1@purdue.edu> + Non-NIB-Code & other changes: Max Horn <max@quendi.de> + + Feel free to customize this file to suit your needs +*/ + +#import <Cocoa/Cocoa.h> + +@interface SDLMain : NSObject +@end diff --git a/src/sdl2/SDL_main/SDL_macosx_main.m b/src/sdl2/SDL_main/SDL_macosx_main.m new file mode 100644 index 000000000..226afe13d --- /dev/null +++ b/src/sdl2/SDL_main/SDL_macosx_main.m @@ -0,0 +1,374 @@ +/* SDLMain.m - main entry point for our Cocoa-ized SDL app + Initial Version: Darrell Walisser <dwaliss1@purdue.edu> + Non-NIB-Code & other changes: Max Horn <max@quendi.de> + + Feel free to customize this file to suit your needs +*/ + +#import "SDL.h" +#import "SDL_macosx_main.h" +#import <sys/param.h> /* for MAXPATHLEN */ +#import <unistd.h> + +/* For some reaon, Apple removed setAppleMenu from the headers in 10.4, + but the method still is there and works. To avoid warnings, we declare + it ourselves here. */ +@interface NSApplication(SDL_Missing_Methods) +- (void)setAppleMenu:(NSMenu *)menu; +@end + +/* Use this flag to determine whether we use SDLMain.nib or not */ +#define SDL_USE_NIB_FILE 0 + +/* Use this flag to determine whether we use CPS (docking) or not */ +#define SDL_USE_CPS 1 +#if SDL_USE_CPS +/* Portions of CPS.h */ +typedef struct CPSProcessSerNum +{ + UInt32 lo; + UInt32 hi; +} CPSProcessSerNum; + +extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); +extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); +extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); + +#endif /* SDL_USE_CPS */ + +static int gArgc; +static char **gArgv; +static BOOL gFinderLaunch; + +static void addArgument(const char *value) +{ + if(!gArgc) + gArgv = (char **)malloc(sizeof(*gArgv)); + else + { + char **newgArgv = (char **)realloc(gArgv, sizeof(*gArgv) * (gArgc + 1)); + if (!newgArgv) + { + newgArgv = malloc(sizeof(*gArgv) * (gArgc + 1)); + memcpy(newgArgv, gArgv, sizeof(*gArgv) * gArgc); + free(gArgv); + } + gArgv = newgArgv; + } + gArgc++; + gArgv[gArgc - 1] = (char *)malloc(sizeof(char) * (strlen(value) + 1)); + strcpy(gArgv[gArgc - 1], value); +} + +static NSString *getApplicationName(void) +{ + NSDictionary *dict; + NSString *appName = NULL; + + /* Determine the application name */ + dict = ( NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); + if (dict) + appName = [dict objectForKey: @"CFBundleName"]; + + if (![appName length]) + appName = [[NSProcessInfo processInfo] processName]; + + return appName; +} + +#if SDL_USE_NIB_FILE +/* A helper category for NSString */ +@interface NSString (ReplaceSubString) +- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; +@end +#endif + +@interface SDLApplication : NSApplication +@end + +@implementation SDLApplication +/* Invoked from the Quit menu item */ +- (void)terminate:(id)sender +{ +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) + (void)sender; +#endif + /* Post a SDL_QUIT event */ + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); +} +@end + +/* The main class of the application, the application's delegate */ +@implementation SDLMain + +/* Set the working directory to the .app's parent directory */ +- (void) setupWorkingDirectory:(BOOL)shouldChdir +{ + if (shouldChdir) + { + char parentdir[MAXPATHLEN]; + CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); + CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); + if (CFURLGetFileSystemRepresentation(url2, true, (UInt8 *)parentdir, MAXPATHLEN)) + { + assert ( chdir (parentdir) == 0 ); /* chdir to the binary app's parent */ + } + CFRelease(url); + CFRelease(url2); + } + +} + +#if SDL_USE_NIB_FILE + +/* Fix menu to contain the real app name instead of "SDL App" */ +- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName +{ + NSRange aRange; + NSEnumerator *enumerator; + NSMenuItem *menuItem; + + aRange = [[aMenu title] rangeOfString:@"SDL App"]; + if (aRange.length != 0) + [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; + + enumerator = [[aMenu itemArray] objectEnumerator]; + while ((menuItem = [enumerator nextObject])) + { + aRange = [[menuItem title] rangeOfString:@"SDL App"]; + if (aRange.length != 0) + [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; + if ([menuItem hasSubmenu]) + [self fixMenu:[menuItem submenu] withAppName:appName]; + } + [ aMenu sizeToFit ]; +} + +#else + +static void setApplicationMenu(void) +{ + /* warning: this code is very odd */ + NSMenu *appleMenu; + NSMenuItem *menuItem; + NSString *title; + NSString *appName; + + appName = getApplicationName(); + appleMenu = [[NSMenu alloc] initWithTitle:@""]; + + /* Add menu items */ + title = [@"About " stringByAppendingString:appName]; + [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; + + [appleMenu addItem:[NSMenuItem separatorItem]]; + + title = [@"Hide " stringByAppendingString:appName]; + [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; + + menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; + [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; + + [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; + + [appleMenu addItem:[NSMenuItem separatorItem]]; + + title = [@"Quit " stringByAppendingString:appName]; + [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; + + + /* Put menu into the menubar */ + menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + [menuItem setSubmenu:appleMenu]; + [[NSApp mainMenu] addItem:menuItem]; + + /* Tell the application object that this is now the application menu */ + [NSApp setAppleMenu:appleMenu]; + + /* Finally give up our references to the objects */ + [appleMenu release]; + [menuItem release]; +} + +/* Create a window menu */ +static void setupWindowMenu(void) +{ + NSMenu *windowMenu; + NSMenuItem *windowMenuItem; + NSMenuItem *menuItem; + + windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; + + /* "Minimize" item */ + menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; + [windowMenu addItem:menuItem]; + [menuItem release]; + + /* Put menu into the menubar */ + windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; + [windowMenuItem setSubmenu:windowMenu]; + [[NSApp mainMenu] addItem:windowMenuItem]; + + /* Tell the application object that this is now the window menu */ + [NSApp setWindowsMenu:windowMenu]; + + /* Finally give up our references to the objects */ + [windowMenu release]; + [windowMenuItem release]; +} + +/* Replacement for NSApplicationMain */ +static void CustomApplicationMain (int argc, char **argv) +{ +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) + (void)argc; + (void)argv; +#endif + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + SDLMain *sdlMain; + + /* Ensure the application object is initialised */ + [SDLApplication sharedApplication]; + +#if SDL_USE_CPS + { + CPSProcessSerNum PSN; + /* Tell the dock about us */ + if (!CPSGetCurrentProcess(&PSN)) + if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) + if (!CPSSetFrontProcess(&PSN)) + [SDLApplication sharedApplication]; + } +#endif /* SDL_USE_CPS */ + + /* Set up the menubar */ + [NSApp setMainMenu:[[NSMenu alloc] init]]; + setApplicationMenu(); + setupWindowMenu(); + + /* Create SDLMain and make it the app delegate */ + sdlMain = [[SDLMain alloc] init]; + [NSApp setDelegate:sdlMain]; + + /* Start the main event loop */ + [NSApp run]; + + [sdlMain release]; + [pool release]; +} + +#endif + +- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename +{ +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) + (void)theApplication; +#endif + addArgument("-iwad"); + addArgument([filename UTF8String]); + return YES; +} + +/* Called when the internal event loop has just started running */ +- (void) applicationDidFinishLaunching: (NSNotification *) note +{ +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) + (void)note; +#endif + int status; + + /* Set the working directory to the .app's parent directory */ + [self setupWorkingDirectory:gFinderLaunch]; + +#if SDL_USE_NIB_FILE + /* Set the main menu to contain the real app name instead of "SDL App" */ + [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; +#endif + + if (!getenv("SRB2WADDIR")) + setenv("SRB2WADDIR", [[[NSBundle mainBundle] resourcePath] UTF8String], 1); + + /* Hand off to main application code */ + status = SDL_main (gArgc, gArgv); + + /* We're done, thank you for playing */ + exit(status); +} +@end + + +@implementation NSString (ReplaceSubString) + +- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString +{ + size_t bufferSize; + size_t selfLen = [self length]; + size_t aStringLen = [aString length]; + unichar *buffer; + NSRange localRange; + NSString *result; + + bufferSize = selfLen + aStringLen - aRange.length; + buffer = NSAllocateMemoryPages(bufferSize*sizeof(unichar)); + + /* Get first part into buffer */ + localRange.location = 0; + localRange.length = aRange.location; + [self getCharacters:buffer range:localRange]; + + /* Get middle part into buffer */ + localRange.location = 0; + localRange.length = aStringLen; + [aString getCharacters:(buffer+aRange.location) range:localRange]; + + /* Get last part into buffer */ + localRange.location = aRange.location + aRange.length; + localRange.length = selfLen - localRange.location; + [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; + + /* Build output string */ + result = [NSString stringWithCharacters:buffer length:bufferSize]; + + NSDeallocateMemoryPages(buffer, bufferSize); + + return result; +} + +@end + + + +#ifdef main +# undef main +#endif + + +/* Main entry point to executable - should *not* be SDL_main! */ +int main (int argc, char **argv) +{ + + /* Copy the arguments into a global variable */ + + /* This is passed if we are launched by double-clicking */ + if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { + gArgc = 1; + gFinderLaunch = YES; + } else { + gArgc = argc; + gFinderLaunch = NO; + } + gArgv = argv; + + /* Some additional arguments we always want to run with. */ + //addArgument("-opengl"); + +#if SDL_USE_NIB_FILE + [SDLApplication poseAsClass:[NSApplication class]]; + NSApplicationMain (argc, argv); +#else + CustomApplicationMain (argc, argv); +#endif + return 0; +} diff --git a/src/sdl2/SDL_main/SDL_openxdk_main.c b/src/sdl2/SDL_main/SDL_openxdk_main.c new file mode 100644 index 000000000..63db8da2d --- /dev/null +++ b/src/sdl2/SDL_main/SDL_openxdk_main.c @@ -0,0 +1,7 @@ +/* Include the SDL main definition header */ +#include "SDL_main.h" + +void XBoxStartup() +{ + SDL_main(0, NULL); /// \todo ? +} diff --git a/src/sdl2/SDL_main/SDL_win32_main.c b/src/sdl2/SDL_main/SDL_win32_main.c new file mode 100644 index 000000000..46b20d0bd --- /dev/null +++ b/src/sdl2/SDL_main/SDL_win32_main.c @@ -0,0 +1,406 @@ +/* + SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98 + + The WinMain function -- calls your program's main() function +*/ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <stdlib.h> +#define RPC_NO_WINDOWS_H +#include <windows.h> +#include <malloc.h> /* For _alloca() */ + +#include <tchar.h> + +#ifdef _WIN32_WCE +# define DIR_SEPERATOR TEXT("\\") +# define _tgetcwd(str,len) wcscpy(str,TEXT("")) +# define setbuf(f,b) +# define setvbuf(w,x,y,z) +# define _tremove(x) DeleteFile(x) +#else +# define DIR_SEPERATOR TEXT("/") +# include <direct.h> +#endif + +/* Include the SDL main definition header */ +#ifdef _MSC_VER +#pragma warning(disable : 4214 4244) +#endif +#include "SDL.h" +#include "SDL_main.h" +#ifdef _MSC_VER +#pragma warning(default : 4214 4244) +#endif +#include "../../win32/win_dbg.h" +#define USE_MESSAGEBOX + +#ifdef main +# ifndef _WIN32_WCE_EMULATION +# undef main +# endif /* _WIN32_WCE_EMULATION */ +#endif /* main */ + +/* The standard output files */ +//#ifdef _WIN32_WCE +//#define STDOUT_FILE TEXT("/Storage Card/SRB2DEMO/stdout.txt") +//#define STDERR_FILE TEXT("/Storage Card/SRB2DEMO/stderr.txt") +//#else +#define STDOUT_FILE TEXT("stdout.txt") +#define STDERR_FILE TEXT("stderr.txt") +//#endif + +#ifndef NO_STDIO_REDIRECT + static TCHAR stdoutPath[MAX_PATH]; + static TCHAR stderrPath[MAX_PATH]; +#endif + +#if defined(_WIN32_WCE) && _WIN32_WCE < 300 +/* seems to be undefined in Win CE although in online help */ +#define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t')) + +/* seems to be undefined in Win CE although in online help */ +char *strrchr(char *str, int c) +{ + char *p; + + /* Skip to the end of the string */ + p=str; + while (*p) + p++; + + /* Look for the given character */ + while ( (p >= str) && (*p != (CHAR)c) ) + p--; + + /* Return NULL if character not found */ + if ( p < str ) { + p = NULL; + } + return p; +} +#endif /* _WIN32_WCE < 300 */ + +/* Parse a command line buffer into arguments */ +static int ParseCommandLine(char *cmdline, char **argv) +{ + char *bufp; + int argc; + + argc = 0; + for ( bufp = cmdline; *bufp; ) { + /* Skip leading whitespace */ + while ( isspace(*bufp) ) { + ++bufp; + } + /* Skip over argument */ + if ( *bufp == '"' ) { + ++bufp; + if ( *bufp ) { + if ( argv ) { + argv[argc] = bufp; + } + ++argc; + } + /* Skip over word */ + while ( *bufp && (*bufp != '"') ) { + ++bufp; + } + } else { + if ( *bufp ) { + if ( argv ) { + argv[argc] = bufp; + } + ++argc; + } + /* Skip over word */ + while ( *bufp && ! isspace(*bufp) ) { + ++bufp; + } + } + if ( *bufp ) { + if ( argv ) { + *bufp = '\0'; + } + ++bufp; + } + } + if ( argv ) { + argv[argc] = NULL; + } + return(argc); +} + +/* Show an error message */ +static void ShowError(const char *title, const char *message) +{ +/* If USE_MESSAGEBOX is defined, you need to link with user32.lib */ +#ifdef USE_MESSAGEBOX + MessageBoxA(NULL, + message, + title, + MB_ICONEXCLAMATION|MB_OK); +#else + fprintf(stderr, "%s: %s\n", title, message); +#endif +} + +/* Pop up an out of memory message, returns to Windows */ +static BOOL OutOfMemory(void) +{ + ShowError("Fatal Error", "Out of memory - aborting"); + return FALSE; +} + +/* Remove the output files if there was no output written */ +static void __cdecl cleanup_output(void) +{ +#ifndef NO_STDIO_REDIRECT + FILE *file; + int empty; +#endif + + /* Flush the output in case anything is queued */ + fclose(stdout); + fclose(stderr); + +#ifndef NO_STDIO_REDIRECT + /* See if the files have any output in them */ + if ( stdoutPath[0] ) { + file = _tfopen(stdoutPath, TEXT("rb")); + if ( file ) { + empty = (fgetc(file) == EOF) ? 1 : 0; + fclose(file); + if ( empty ) { + _tremove(stdoutPath); + } + } + } + if ( stderrPath[0] ) { + file = _tfopen(stderrPath, TEXT("rb")); + if ( file ) { + empty = (fgetc(file) == EOF) ? 1 : 0; + fclose(file); + if ( empty ) { + _tremove(stderrPath); + } + } + } +#endif +} + +#if defined(_MSC_VER) && !defined(_WIN32_WCE) +/* The VC++ compiler needs main defined */ +#define console_main main +#endif + +/* This is where execution begins [console apps] */ +int console_main(int argc, char *argv[]) +{ + size_t n; + int st; + char *bufp, *appname; + + /* Get the class name from argv[0] */ + appname = argv[0]; + if ( (bufp=strrchr(argv[0], '\\')) != NULL ) { + appname = bufp+1; + } else + if ( (bufp=strrchr(argv[0], '/')) != NULL ) { + appname = bufp+1; + } + + if ( (bufp=strrchr(appname, '.')) == NULL ) + n = strlen(appname); + else + n = (bufp-appname); + + bufp = (char *)alloca(n+1); + if ( bufp == NULL ) { + return OutOfMemory(); + } + strncpy(bufp, appname, n); + bufp[n] = '\0'; + appname = bufp; + + /* Load SDL dynamic link library */ + if ( SDL_Init(SDL_INIT_NOPARACHUTE) < 0 ) { + ShowError("WinMain() error", SDL_GetError()); + return(FALSE); + } + atexit(cleanup_output); + atexit(SDL_Quit); + +#ifndef DISABLE_VIDEO +#if 0 + /* Create and register our class * + DJM: If we do this here, the user nevers gets a chance to + putenv(SDL_WINDOWID). This is already called later by + the (DIB|DX5)_CreateWindow function, so it should be + safe to comment it out here. + if ( SDL_RegisterApp(appname, CS_BYTEALIGNCLIENT, + GetModuleHandle(NULL)) < 0 ) { + ShowError("WinMain() error", SDL_GetError()); + exit(1); + }*/ +#else + /* Sam: + We still need to pass in the application handle so that + DirectInput will initialize properly when SDL_RegisterApp() + is called later in the video initialization. + */ + SDL_SetModuleHandle(GetModuleHandle(NULL)); +#endif /* 0 */ +#endif /* !DISABLE_VIDEO */ + + /* Run the application main() code */ + st = SDL_main(argc, argv); + + /* Exit cleanly, calling atexit() functions */ + //exit(0); + cleanup_output(); + SDL_Quit(); + + /* Hush little compiler, don't you cry... */ + return st; +} + +/* This is where execution begins [windowed apps] */ +#ifdef _WIN32_WCE +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR szCmdLine, int sw) +#else +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) +#endif +{ + HINSTANCE handle; + int Result = -1; + char **argv; + int argc; + LPSTR cmdline; +#ifdef _WIN32_WCE + size_t nLen; + LPTSTR bufp; +#else + LPSTR bufp; +#endif +#ifndef NO_STDIO_REDIRECT + FILE *newfp; +#endif + + /* Start up DDHELP.EXE before opening any files, so DDHELP doesn't + keep them open. This is a hack.. hopefully it will be fixed + someday. DDHELP.EXE starts up the first time DDRAW.DLL is loaded. + */ + hPrev = hInst = NULL; + sw = 0; + handle = LoadLibrary(TEXT("DDRAW.DLL")); + if ( handle != NULL ) { + FreeLibrary(handle); + } + +#ifndef NO_STDIO_REDIRECT + _tgetcwd( stdoutPath, sizeof( stdoutPath ) ); + _tcscat( stdoutPath, DIR_SEPERATOR STDOUT_FILE ); + + /* Redirect standard input and standard output */ + newfp = _tfreopen(stdoutPath, TEXT("w"), stdout); + +#ifndef _WIN32_WCE + if ( newfp == NULL ) { /* This happens on NT */ +#if !defined(stdout) + stdout = _tfopen(stdoutPath, TEXT("w")); +#else + newfp = _tfopen(stdoutPath, TEXT("w")); + if ( newfp ) { + *stdout = *newfp; + } +#endif + } +#endif /* _WIN32_WCE */ + + _tgetcwd( stderrPath, sizeof( stderrPath ) ); + _tcscat( stderrPath, DIR_SEPERATOR STDERR_FILE ); + + newfp = _tfreopen(stderrPath, TEXT("w"), stderr); +#ifndef _WIN32_WCE + if ( newfp == NULL ) { /* This happens on NT */ +#if !defined(stderr) + stderr = _tfopen(stderrPath, TEXT("w")); +#else + newfp = _tfopen(stderrPath, TEXT("w")); + if ( newfp ) { + *stderr = *newfp; + } +#endif + } +#endif /* _WIN32_WCE */ + + setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* Line buffered */ + setbuf(stderr, NULL); /* No buffering */ +#endif /* !NO_STDIO_REDIRECT */ + +#ifdef _WIN32_WCE + nLen = wcslen(szCmdLine)+128+1; + bufp = (wchar_t *)alloca(nLen*2); + wcscpy (bufp, TEXT("\"")); + GetModuleFileName(NULL, bufp+1, 128-3); + wcscpy (bufp+wcslen(bufp), TEXT("\" ")); + wcsncpy(bufp+wcslen(bufp), szCmdLine,nLen-wcslen(bufp)); + nLen = wcslen(bufp)+1; + cmdline = (char *)alloca(nLen); + if ( cmdline == NULL ) { + return OutOfMemory(); + } + WideCharToMultiByte(CP_ACP, 0, bufp, -1, cmdline, nLen, NULL, NULL); +#else + szCmdLine = NULL; + /* Grab the command line (use alloca() on Windows) */ + bufp = GetCommandLineA(); + cmdline = (LPSTR)alloca(strlen(bufp)+1); + if ( cmdline == NULL ) { + return OutOfMemory(); + } + strcpy(cmdline, bufp); +#endif + + /* Parse it into argv and argc */ + argc = ParseCommandLine(cmdline, NULL); + argv = (char **)alloca((argc+1)*(sizeof *argv)); + if ( argv == NULL ) { + return OutOfMemory(); + } + ParseCommandLine(cmdline, argv); + +#ifdef BUGTRAP + /* Try BugTrap. */ + if(InitBugTrap()) + Result = console_main(argc, argv); + else + { +#endif + + /* Run the main program (after a little SDL initialization) */ +#ifndef _WIN32_WCE + __try +#endif + { + Result = console_main(argc, argv); + } +#ifndef _WIN32_WCE + __except ( RecordExceptionInfo(GetExceptionInformation())) + { + SetUnhandledExceptionFilter(EXCEPTION_CONTINUE_SEARCH); //Do nothing here. + } +#endif + +#ifdef BUGTRAP + } /* BT failure clause. */ + + /* This is safe even if BT didn't start. */ + ShutdownBugTrap(); +#endif + + return Result; +} diff --git a/src/sdl2/SRB2CE/Makefile.cfg b/src/sdl2/SRB2CE/Makefile.cfg new file mode 100644 index 000000000..8d4ae3e48 --- /dev/null +++ b/src/sdl2/SRB2CE/Makefile.cfg @@ -0,0 +1,12 @@ +# +# Makefile.cfg for WinCE with GCC +# + +OPTS+=-D_WIN32_WCE -D_UNICODE +SDL_CFLAGS?= +SDL_LDFLAGS?= +NOHS=1 +NOHW=1 +NONET=1 +NOMIXER=1 +NOPNG=1 diff --git a/src/sdl2/SRB2CE/SRB2CE.zip b/src/sdl2/SRB2CE/SRB2CE.zip new file mode 100644 index 0000000000000000000000000000000000000000..3ac8530dcb124cbda512a7d469da933c3fc974bf GIT binary patch literal 34234 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 CQd6)1 literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2CE/cehelp.c b/src/sdl2/SRB2CE/cehelp.c new file mode 100644 index 000000000..b9fafd040 --- /dev/null +++ b/src/sdl2/SRB2CE/cehelp.c @@ -0,0 +1,447 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2004 by Sonic Team Jr. +// +// 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. +// +// DESCRIPTION: +// stub and replacement "ANSI" C functions for use under Windows CE +// +//----------------------------------------------------------------------------- + +#include "../../doomdef.h" +#include "cehelp.h" + +#define _SEC_IN_MINUTE 60 +#define _SEC_IN_HOUR 3600 +#define _SEC_IN_DAY 86400 + +static const int DAYS_IN_MONTH[12] = +{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + +#define _DAYS_IN_MONTH(x) ((x == 1) ? days_in_feb : DAYS_IN_MONTH[x]) + +static const int _DAYS_BEFORE_MONTH[12] = +{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + +#define _ISLEAP(y) (((y) % 4) == 0 && (((y) % 100) != 0 || (((y)+1900) % 400) == 0)) +#define _DAYS_IN_YEAR(year) (_ISLEAP(year) ? 366 : 365) + +char *strerror(int ecode) +{ + static char buff[1024 + 1]; + DWORD dwMsgLen = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, + ecode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &buff[0], 1024, NULL); + return buff; +} + +int unlink( const char *filename ) +{ + return remove(filename); +} + +int remove( const char *path ) +{ + return DeleteFileA(path)-1; +} + +int rename( const char *oldname, const char *newname ) +{ + return MoveFileA(oldname, newname)!=0; +} + +static inline void STToTM(const SYSTEMTIME *st, struct tm *tm) +{ + if (!st || !tm) return; + tm->tm_sec = st->wSecond; + tm->tm_min = st->wMinute; + tm->tm_hour = st->wHour; + tm->tm_mday = st->wDay; + tm->tm_mon = st->wMonth - 1; + tm->tm_year = st->wYear - 1900; + tm->tm_wday = st->wDayOfWeek; + tm->tm_yday = 0; + tm->tm_isdst = 0; +} + +time_t time(time_t *T) +{ + time_t returntime; + SYSTEMTIME st; + struct tm stft; + GetSystemTime(&st); + STToTM(&st,&stft); + returntime = mktime(&stft); + if (T) *T = returntime; + return returntime; +} + +static inline UINT64 TTtoFT(const time_t wt, FILETIME *ft) +{ + UINT64 temptime = wt; // FILETIME: 1/(10^7) secs since January 1, 1601 + temptime *= 10000000; // time_t : 1 secs since January 1, 1970 + // 369 years * 365 days * 24 hours * 60 mins * 60 secs * 10 + // 123 leaps days * 24 hours * 60 mins * 60 secs * 10 + temptime += 116444736000000000; + if (ft) CopyMemory(ft,&temptime,sizeof (ULARGE_INTEGER)); + return temptime; +} + +static struct tm cehelptm; + +struct tm * localtime(const time_t *CLOCK) +{ + SYSTEMTIME st; + FILETIME stft; + UINT64 ftli = 0; + if (CLOCK) ftli = TTtoFT(*CLOCK, &stft); + if (ftli) + FileTimeToSystemTime(&stft,&st); + else + GetSystemTime(&st); + STToTM(&st,&cehelptm); + if (st.wYear >= 1970) + return &cehelptm; + else + return NULL; +} + +static void validate_structure (struct tm *tim_p) // from newlib +{ + div_t res; + int days_in_feb = 28; + + /* calculate time & date to account for out of range values */ + if (tim_p->tm_sec < 0 || tim_p->tm_sec > 59) + { + res = div (tim_p->tm_sec, 60); + tim_p->tm_min += res.quot; + if ((tim_p->tm_sec = res.rem) < 0) + { + tim_p->tm_sec += 60; + --tim_p->tm_min; + } + } + + if (tim_p->tm_min < 0 || tim_p->tm_min > 59) + { + res = div (tim_p->tm_min, 60); + tim_p->tm_hour += res.quot; + if ((tim_p->tm_min = res.rem) < 0) + { + tim_p->tm_min += 60; + --tim_p->tm_hour; + } + } + + if (tim_p->tm_hour < 0 || tim_p->tm_hour > 23) + { + res = div (tim_p->tm_hour, 24); + tim_p->tm_mday += res.quot; + if ((tim_p->tm_hour = res.rem) < 0) + { + tim_p->tm_hour += 24; + --tim_p->tm_mday; + } + } + + if (tim_p->tm_mon > 11) + { + res = div (tim_p->tm_mon, 12); + tim_p->tm_year += res.quot; + if ((tim_p->tm_mon = res.rem) < 0) + { + tim_p->tm_mon += 12; + --tim_p->tm_year; + } + } + + if (_DAYS_IN_YEAR (tim_p->tm_year) == 366) + days_in_feb = 29; + + if (tim_p->tm_mday <= 0) + { + while (tim_p->tm_mday <= 0) + { + if (--tim_p->tm_mon == -1) + { + tim_p->tm_year--; + tim_p->tm_mon = 11; + days_in_feb = + ((_DAYS_IN_YEAR (tim_p->tm_year) == 366) ? + 29 : 28); + } + tim_p->tm_mday += _DAYS_IN_MONTH (tim_p->tm_mon); + } + } + else + { + while (tim_p->tm_mday > _DAYS_IN_MONTH (tim_p->tm_mon)) + { + tim_p->tm_mday -= _DAYS_IN_MONTH (tim_p->tm_mon); + if (++tim_p->tm_mon == 12) + { + tim_p->tm_year++; + tim_p->tm_mon = 0; + days_in_feb = + ((_DAYS_IN_YEAR (tim_p->tm_year) == 366) ? + 29 : 28); + } + } + } +} + +time_t mktime (struct tm *tim_p) // from newlib +{ + time_t tim = 0; + long days = 0; + int year; + + /* validate structure */ + validate_structure (tim_p); + + /* compute hours, minutes, seconds */ + tim += tim_p->tm_sec + (tim_p->tm_min * _SEC_IN_MINUTE) + + (tim_p->tm_hour * _SEC_IN_HOUR); + + /* compute days in year */ + days += tim_p->tm_mday - 1; + days += _DAYS_BEFORE_MONTH[tim_p->tm_mon]; + if (tim_p->tm_mon > 1 && _DAYS_IN_YEAR (tim_p->tm_year) == 366) + days++; + + /* compute day of the year */ + tim_p->tm_yday = days; + + if (tim_p->tm_year > 10000 + || tim_p->tm_year < -10000) + { + return (time_t) -1; + } + + /* compute days in other years */ + if (tim_p->tm_year > 70) + { + for (year = 70; year < tim_p->tm_year; year++) + days += _DAYS_IN_YEAR (year); + } + else if (tim_p->tm_year < 70) + { + for (year = 69; year > tim_p->tm_year; year--) + days -= _DAYS_IN_YEAR (year); + days -= _DAYS_IN_YEAR (year); + } + + /* compute day of the week */ + if ((tim_p->tm_wday = (days + 4) % 7) < 0) + tim_p->tm_wday += 7; + + /* compute total seconds */ + tim += (days * _SEC_IN_DAY); + + return tim; +} + +#undef WINAPI +#define WINAPI __stdcall //__delcspec(dllexport) + +#ifdef _MSC_VER +//#pragma warning(disable : 4273) +#endif + + +static __forceinline int STRtoWSTR(LPCSTR lpMultiByteStr, int cchMultiByte, + LPWSTR lpWideCharStr, int cchWideChar) +{ + return MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,lpMultiByteStr, + cchMultiByte,lpWideCharStr,cchWideChar); +} + +static __forceinline int WSTRtoSTR(LPCWSTR lpWideCharStr, int cchWideChar, + LPSTR lpMultiByteStr, int cbMultiByte) +{ + return WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK|WC_SEPCHARS, + lpWideCharStr,cchWideChar,lpMultiByteStr,cbMultiByte,NULL,NULL); +} + +DWORD WINAPI FormatMessageA( + DWORD dwFlags, + LPCVOID lpSource, + DWORD dwMessageId, + DWORD dwLanguageId, + LPSTR lpBuffer, + DWORD nSize, + va_list *Arguments) +{ + const int nSizeW = STRtoWSTR(lpBuffer,nSize,NULL,0); + int nSizeF = 0; + LPWSTR lpBufferW = alloca(sizeof (wchar_t)*nSizeW); + LPWSTR lpSourceW = NULL; + + if (!lpBufferW) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + ZeroMemory(lpBuffer,nSize); + return nSizeF; + } + + if (dwFlags & FORMAT_MESSAGE_FROM_STRING) + { + const int sLen = STRtoWSTR(lpSource, -1, NULL, 0); + lpSourceW = alloca(sizeof (wchar_t)*sLen); + + if (lpSourceW) + STRtoWSTR(lpSource, -1, lpSourceW, sLen); + else + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return nSizeF; + } + } + + if (lpSourceW) + nSizeF = FormatMessageW(dwFlags, lpSourceW, dwMessageId, dwLanguageId, + lpBufferW, nSizeW, Arguments); + else + nSizeF = FormatMessageW(dwFlags, lpSource, dwMessageId, dwLanguageId, + lpBufferW, nSizeW, Arguments); + + return WSTRtoSTR(lpBufferW, nSizeF, lpBuffer, nSize); +} + +BOOL WINAPI DeleteFileA( + LPCSTR lpFileName) +{ + const int sLen = STRtoWSTR(lpFileName, -1, NULL, 0); + LPWSTR lpFileNameW = alloca(sizeof (wchar_t)*sLen); + + if (lpFileNameW) + STRtoWSTR(lpFileName, -1, lpFileNameW, sLen); + else + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + return DeleteFileW(lpFileNameW); +} + +BOOL WINAPI MoveFileA( + LPCSTR lpExistingFileName, + LPCSTR lpNewFileName +) +{ + const int sLen1 = STRtoWSTR(lpExistingFileName, -1, NULL, 0); + LPWSTR lpExistingFileNameW = alloca(sizeof (wchar_t)*sLen1); + + const int sLen2 = STRtoWSTR(lpNewFileName, -1, NULL, 0); + LPWSTR lpNewFileNameW = alloca(sizeof (wchar_t)*sLen2); + + + if (!lpExistingFileNameW || !lpNewFileNameW) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + STRtoWSTR(lpExistingFileName, -1, lpExistingFileNameW, sLen1); + STRtoWSTR(lpNewFileName, -1, lpNewFileNameW, sLen2); + + return MoveFileW(lpExistingFileNameW, lpNewFileNameW); +} + + +HANDLE WINAPI CreateFileA( + LPCSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile) +{ + const int sLen = STRtoWSTR(lpFileName, -1, NULL, 0); + LPWSTR lpFileNameW = alloca(sizeof (wchar_t)*sLen); + + if (lpFileNameW) + STRtoWSTR(lpFileName, -1, lpFileNameW, sLen); + else + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return INVALID_HANDLE_VALUE; + } + + return CreateFileW(lpFileNameW, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, + hTemplateFile); +} + +BOOL WINAPI CreateDirectoryA( + LPCSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes) +{ + const int sLen = STRtoWSTR(lpPathName, -1, NULL, 0); + LPWSTR lpPathNameW = alloca(sizeof (wchar_t)*sLen); + + if (lpPathNameW) + STRtoWSTR(lpPathName, -1, lpPathNameW, sLen); + else + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + return CreateDirectoryW(lpPathNameW, lpSecurityAttributes); +} + +int WINAPI MessageBoxA( + HWND hWnd , + LPCSTR lpText, + LPCSTR lpCaption, + UINT uType) +{ + const int sLen1 = STRtoWSTR(lpText, -1, NULL, 0); + LPWSTR lpTextW = alloca(sizeof (wchar_t)*sLen1); + + const int sLen2 = STRtoWSTR(lpCaption, -1, NULL, 0); + LPWSTR lpCaptionW = alloca(sizeof (wchar_t)*sLen2); + + + if (!lpTextW || !lpCaptionW) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + STRtoWSTR(lpText, -1, lpTextW, sLen1); + STRtoWSTR(lpCaption, -1, lpCaptionW, sLen2); + + return MessageBoxW(hWnd, lpTextW, lpCaptionW, uType); +} + +VOID WINAPI OutputDebugStringA( + LPCSTR lpOutputString) +{ + const int sLen = STRtoWSTR(lpOutputString, -1, NULL, 0); + LPWSTR lpOutputStringW = alloca(sizeof (wchar_t)*sLen); + + if (lpOutputStringW) + STRtoWSTR(lpOutputString, -1, lpOutputStringW, sLen); + else + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return; + } + + OutputDebugStringW(lpOutputStringW); +} + diff --git a/src/sdl2/SRB2CE/cehelp.h b/src/sdl2/SRB2CE/cehelp.h new file mode 100644 index 000000000..bc265b058 --- /dev/null +++ b/src/sdl2/SRB2CE/cehelp.h @@ -0,0 +1,63 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2004 by Sonic Team Jr. +// +// 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. +// +// DESCRIPTION: +// stub and replacement "ANSI" C functions for use under Windows CE +// +//----------------------------------------------------------------------------- + +#ifndef __I_WINCE__ +#define __I_WINCE__ + +#ifdef USEASMCE +#define USEASM // Remline if NASM doesn't work on x86 targets +#endif + +char *strerror(int ecode); +int access(const char *path, int amode); +int unlink( const char *filename ); +int remove( const char *path ); +int rename( const char *oldname, const char *newname ); +//CreateDirectoryEx( const char *currectpath, const char *path,SECURITY_ATTRIBUTES) + +#ifndef _TIME_T_DEFINED +typedef long time_t; /* time value */ +#define _TIME_T_DEFINED /* avoid multiple def's of time_t */ +#endif + +time_t time(time_t *T); + +#ifndef __GNUC__ +#ifndef _TM_DEFINED +struct tm { + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years since 1900 */ + int tm_wday; /* days since Sunday - [0,6] */ + int tm_yday; /* days since January 1 - [0,365] */ + int tm_isdst; /* daylight savings time flag */ + }; +#define _TM_DEFINED +#endif + +struct tm * localtime(const time_t *CLOCK); + +time_t mktime (struct tm *tim_p); +#endif + +#endif diff --git a/src/sdl2/SRB2DC/.gitignore b/src/sdl2/SRB2DC/.gitignore new file mode 100644 index 000000000..a966585d4 --- /dev/null +++ b/src/sdl2/SRB2DC/.gitignore @@ -0,0 +1 @@ +/scramble diff --git a/src/sdl2/SRB2DC/IP.BIN b/src/sdl2/SRB2DC/IP.BIN new file mode 100644 index 0000000000000000000000000000000000000000..c3366213bde1c6b5dc03db4cfdab85c1c74ef5fc GIT binary patch literal 32768 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 W8UmvsFd71*Aut*OqaiS4LI42zdCRi^ literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2DC/Makefile.cfg b/src/sdl2/SRB2DC/Makefile.cfg new file mode 100644 index 000000000..3edaf8a16 --- /dev/null +++ b/src/sdl2/SRB2DC/Makefile.cfg @@ -0,0 +1,53 @@ +# +# Makefile.cfg for SRB2/Dreamcast +# + +#include $(KOS_BASE)/Makefile.rules + +# +#hmmm, the Dreamcast +# + + HOSTCC:=$(CC) + CC=$(KOS_CC) + PREFIX=$(KOS_CC_BASE)/bin/$(KOS_CC_PREFIX) + OBJDUMP=$(PREFIX)-objdump + OBJCOPY=$(PREFIX)-objcopy + + #NOHW=1 #No working MiniGL right now + NOHS=1 #No HWSound right now +ifndef LWIP + NONET=1 #No LWIP +endif + #i_net_o=$(OBJDIR)/i_udp.o #use KOS's UDP + #NOMIXER=1 #Basic sound only + NOIPX=1 #No IPX network code + NOPNG=1 #No Screenshot + + OPTS=$(KOS_CFLAGS) -DUNIXCOMMON -DDC +ifndef NOHW + OPTS+=-DSTATIC_OPENGL -DMINI_GL_COMPATIBILITY -DKOS_GL_COMPATIBILITY +endif + SDL_CFLAGS?=-I$(KOS_BASE)/addons/include/SDL + SDL_LDFLAGS?=-lSDL + LDFLAGS=$(KOS_LDFLAGS) + LIBS:=$(KOS_LIBS) -lconio -lm +ifndef NOMIXER + LIBS:=-loggvorbisplay -lSDL $(LIBS) +endif + +ifdef LWIP + OPTS+=-I$(KOS_BASE)/../kos-ports/lwip/kos/include -I$(KOS_BASE)/../kos-ports/lwip/lwip/src/include/ipv4 -I$(KOS_BASE)/../kos-ports/lwip/lwip/src/include -DIPv4 + LIBS:=-llwip4 -lkosutils $(LIBS) + OPTS+=-DHAVE_LWIP +endif +ifndef NOHW + LIBS+=-lgl +endif + + i_system_o+=$(OBJDIR)/dchelp.o + i_main_o=$(KOS_START) $(OBJDIR)/i_main.o $(OBJEXTRA) + + # name of the exefile + EXENAME?=SRB2.elf + BINNAME?=SRB2.BIN diff --git a/src/sdl2/SRB2DC/SELFBOOT.BIN b/src/sdl2/SRB2DC/SELFBOOT.BIN new file mode 100644 index 0000000000000000000000000000000000000000..a87ee386927e4dd72d947aa08faecd1b94677c93 GIT binary patch literal 1408808 zcmZP=1*0J_8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*U^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON 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 N)jr~2U|`^20063ZYBB%- literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2DC/VMU.xbm b/src/sdl2/SRB2DC/VMU.xbm new file mode 100644 index 000000000..0d56985f3 --- /dev/null +++ b/src/sdl2/SRB2DC/VMU.xbm @@ -0,0 +1,19 @@ +#define VMU_width 48 +#define VMU_height 32 +static unsigned char VMU_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x75, 0x00, 0x00, 0x00, 0x00, 0xee, 0xaa, 0x00, 0x00, + 0x00, 0x86, 0x55, 0x55, 0x01, 0x00, 0x00, 0xda, 0xc8, 0xaf, 0x00, 0x00, + 0x00, 0x62, 0x55, 0x54, 0x00, 0x00, 0x00, 0x32, 0xa2, 0x6c, 0x00, 0x00, + 0x00, 0x5c, 0x55, 0xfd, 0x01, 0x00, 0x00, 0xac, 0x88, 0xaa, 0x02, 0x00, + 0x00, 0x54, 0x75, 0x55, 0x05, 0x00, 0x00, 0xac, 0xbf, 0xaa, 0x0a, 0x00, + 0x00, 0xd6, 0x61, 0x55, 0x15, 0x00, 0x00, 0xe9, 0xc0, 0xaa, 0x2a, 0x00, + 0x00, 0x39, 0x40, 0x55, 0x55, 0x00, 0x00, 0x6d, 0xc0, 0xaa, 0xbe, 0x00, + 0x00, 0x6d, 0x40, 0xd5, 0xc3, 0x00, 0x00, 0x6d, 0xc0, 0xea, 0x00, 0x00, + 0x00, 0x29, 0x60, 0xf5, 0x00, 0x00, 0x00, 0x26, 0xe0, 0xfa, 0x00, 0x00, + 0x00, 0x58, 0xb8, 0xbd, 0x00, 0x00, 0x00, 0x84, 0x07, 0xdf, 0x00, 0x00, + 0x00, 0x08, 0x20, 0xae, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x5f, 0x01, 0x00, + 0x00, 0xc0, 0x3f, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/src/sdl2/SRB2DC/dchelp.c b/src/sdl2/SRB2DC/dchelp.c new file mode 100644 index 000000000..5fdf04bc2 --- /dev/null +++ b/src/sdl2/SRB2DC/dchelp.c @@ -0,0 +1,134 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2006 by Sonic Team Jr. +// +// 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. +// +// DESCRIPTION: +// stub and replacement "ANSI" C functions for use on Dreamcast/KOS +// +//----------------------------------------------------------------------------- +#include <kos/fs.h> +#include <errno.h> +#ifndef HAVE_LWIP +#include <sys/socket.h> +#endif +#include "../../doomdef.h" +#include "dchelp.h" + +int access(const char *path, int amode) +{ + file_t handle = FILEHND_INVALID; + + if (amode == F_OK || amode == R_OK) + handle=fs_open(path,O_RDONLY); + else if (amode == (R_OK|W_OK)) + handle=fs_open(path,O_RDWR); + else if (amode == W_OK) + handle=fs_open(path,O_WRONLY); + + if (handle != FILEHND_INVALID) + { + fs_close(handle); + return 0; + } + + return -1; +} + +double hypot(double x, double y) +{ + double ax, yx, yx2, yx1; + if (abs(y) > abs(x)) // |y|>|x| + { + ax = abs(y); // |y| => ax + yx = (x/y); + } + else // |x|>|y| + { + ax = abs(x); // |x| => ax + yx = (x/y); + } + yx2 = yx*yx; // (x/y)^2 + yx1 = sqrt(1+yx2); // (1 + (x/y)^2)^1/2 + return ax*yx1; // |x|*((1 + (x/y)^2)^1/2) +} + +#if !(defined (NONET) || defined (NOMD5)) +#ifdef HAVE_LWIP + +#include <lwip/lwip.h> + +static uint8 ip[4]; +static char *h_addr_listtmp[2] = {ip, NULL}; +static struct hostent hostenttmp = {NULL, NULL, 0, 1, h_addr_listtmp}; + +struct hostent *gethostbyname(const char *name) +{ + struct sockaddr_in dnssrv; + dnssrv.sin_family = AF_INET; + dnssrv.sin_port = htons(53); + dnssrv.sin_addr.s_addr = htonl(0x0a030202); ///< what? + if (lwip_gethostbyname(&dnssrv, name, ip) < 0) + return NULL; + else + return &hostenttmp; +} +#else + +struct hostent *gethostbyname(const char *name) +{ + (void)name; + return NULL; +} + +int ioctl(int s, long cmd, void *argp) +{ + return fs_ioctl(s, argp, cmd); //FIONBIO? +} + +int select(int maxfdp1, void *readset, void *writeset, void *exceptset, + void *timeout) +{ + (void)maxfdp1; + (void)readset; + (void)writeset; + (void)exceptset; + (void)timeout; + errno = EAFNOSUPPORT; + return -1; +} + +int getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen) +{ + (void)s; + (void)level; //SOL_SOCKET + (void)optname; //SO_RCVBUF, SO_ERROR + (void)optval; + (void)optlen; + errno = EAFNOSUPPORT; + return -1; +} + +int setsockopt (int s, int level, int optname, void *optval, socklen_t optlen) +{ + (void)s; + (void)level; //SOL_SOCKET + (void)optname; //SO_REUSEADDR, SO_BROADCAST, SO_RCVBUF + (void)optval; + (void)optlen; + errno = EAFNOSUPPORT; + return -1; +} + +#endif +#endif diff --git a/src/sdl2/SRB2DC/dchelp.h b/src/sdl2/SRB2DC/dchelp.h new file mode 100644 index 000000000..236f31110 --- /dev/null +++ b/src/sdl2/SRB2DC/dchelp.h @@ -0,0 +1,51 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2006 by Sonic Team Jr. +// +// 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. +// +// DESCRIPTION: +// stub and replacement "ANSI" C functions for use on Dreamcast/KOS +// +//----------------------------------------------------------------------------- + +#ifndef __I_DREAMCAST__ +#define __I_DREAMCAST__ + +struct hostent +{ + char *h_name; /* Official name of host. */ + char **h_aliases; /* Alias list. */ + int h_addrtype; /* Host address type. */ + int h_length; /* Length of address. */ + char **h_addr_list; /* List of addresses from name server. */ +#define h_addr h_addr_list[0] /* Address, for backward compatibility. */ +}; + +struct hostent *gethostbyname(const char *name); + +#ifndef HAVE_LWIP +#define INADDR_NONE ((uint32) 0xffffffff) +#define INADDR_LOOPBACK ((uint32) 0x7f000001) +#define SOCK_STREAM 1 +#define FIONBIO 0 +#define SOL_SOCKET 0 +#define SO_ERROR 0 +#define SO_REUSEADDR 0 +#define SO_BROADCAST 0 +#define SO_RCVBUF 0 +int ioctl(int s, long cmd, void *argp); +int select(int maxfdp1, void *readset, void *writeset, void *exceptset, void *timeout); +int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); +int setsockopt(int s, int level, int optname, void *optval, socklen_t optlen); +#endif +#endif diff --git a/src/sdl2/SRB2DC/i_udp.c b/src/sdl2/SRB2DC/i_udp.c new file mode 100644 index 000000000..ec5e305fc --- /dev/null +++ b/src/sdl2/SRB2DC/i_udp.c @@ -0,0 +1,455 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// Copyright (C) 1993-1996 by id Software, Inc. +// Portions Copyright (C) 2005 by Sonic Team Jr. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief KOS UDP network interface + +#include "../../doomdef.h" + +#include "../../i_system.h" +#include "../../d_event.h" +#include "../../d_net.h" +#include "../../m_argv.h" + +#include "../../doomstat.h" + +#include "../../i_net.h" + +#include "../../z_zone.h" + +#include "../../i_tcp.h" + +#include <kos/net.h> +//#include <net/net_ipv4.h> +#define NET_NONE 0x00000000 +#define NET_LOCAL 0x0100007F +#define NET_ANY 0xFFFFFFFF + +#define MAXBANS 20 + +typedef struct +{ + uint32 host; + uint16 port; +} IPaddress; + +static IPaddress clientaddress[MAXNETNODES+1]; +static boolean nodeconnected[MAXNETNODES+1]; + +static int mysocket = 0; +static boolean init_KOSUDP_driver = false; + +static size_t numbans = 0; +static IPaddress banned[MAXBANS]; +static boolean KOSUDP_bannednode[MAXNETNODES+1]; /// \note do we really need the +1? + +static inline int net_udp_sendto(int sock, const uint8 *data, int size, uint16 rem_port, uint32 rem_addr) +{ + uint8 dst_ip[4] = {((uint8*)(&(rem_addr)))[0], + ((uint8*)(&(rem_addr)))[1], + ((uint8*)(&(rem_addr)))[2], + ((uint8*)(&(rem_addr)))[3]}; + return net_udp_send_raw(net_default_dev, clientaddress[0].port, rem_port, dst_ip, data, size); + (void)sock; +} + +static inline int net_udp_recvfrom(int sock, uint8 *buf, int size, uint16 *rem_port, uint32 *rem_addr) +{ + return net_udp_recv(sock, buf, size); + (void)rem_port; + (void)rem_addr; +} + +static const char *KOSUDP_AddrToStr(IPaddress* sk) +{ + static char s[22]; // 255.255.255.255:65535 + sprintf(s,"%d.%d.%d.%d:%d", + ((uint8*)(&(sk->host)))[3], + ((uint8*)(&(sk->host)))[2], + ((uint8*)(&(sk->host)))[1], + ((uint8*)(&(sk->host)))[0], + net_ntohs(sk->port)); + return s; +} + +static const char *KOSUDP_GetNodeAddress(int node) +{ + if (!nodeconnected[node]) + return NULL; + return KOSUDP_AddrToStr(&clientaddress[node]); +} + +static const char *KOSUDP_GetBanAddress(size_t ban) +{ + if (ban > numbans) + return NULL; + return KOSUDP_AddrToStr(&banned[ban]); +} + +static boolean KOSUDP_cmpaddr(IPaddress* a, IPaddress* b) +{ + return (a->host == b->host && (b->port == 0 || a->port == b->port)); +} + +static SINT8 getfreenode(void) +{ + SINT8 j; + + for (j = 0; j < MAXNETNODES; j++) + if (!nodeconnected[j]) + { + nodeconnected[j] = true; + return j; + } + return -1; +} + +static void KOSUDP_Get(void) +{ + int size; + size_t i; + SINT8 j; + IPaddress temp = {clientaddress[BROADCASTADDR].host,clientaddress[BROADCASTADDR].port}; + + size = net_udp_recvfrom(mysocket,(char *)&doomcom->data, MAXPACKETLENGTH, &temp.port, &temp.host); + if (size == 0) + { + doomcom->remotenode = -1; // no packet + return; + } + + // find remote node number + for (i = 0; i < MAXNETNODES; i++) + if (KOSUDP_cmpaddr(&temp, &(clientaddress[i]))) + { + doomcom->remotenode = (INT16)i; // good packet from a game player + doomcom->datalength = (INT16)size; + return; + } + + // not found + + // find a free slot + j = getfreenode(); + if (j > 0) + { + M_Memcpy(&clientaddress[j], &temp, sizeof (temp)); + DEBFILE(va("New node detected: node:%d address:%s\n", j, + KOSUDP_GetNodeAddress(j))); + doomcom->remotenode = (INT16)j; // good packet from a game player + doomcom->datalength = (INT16)size; + // check if it's a banned dude so we can send a refusal later + for (i = 0; i < numbans; i++) + if (KOSUDP_cmpaddr(&temp, &banned[i])) + { + KOSUDP_bannednode[j] = true; + DEBFILE("This dude has been banned\n"); + break; + } + if (i == numbans) + KOSUDP_bannednode[j] = false; + return; + } + + DEBFILE("New node detected: No more free slots\n"); + doomcom->remotenode = -1; // no packet +} + +#if 0 +static boolean KOSUDP_CanSend(void) +{ + return true; +} +#endif + +static void KOSUDP_Send(void) +{ + const IPaddress *nodeinfo; + + if (!doomcom->remotenode || !nodeconnected[doomcom->remotenode]) + return; + + nodeinfo = clientaddress + doomcom->remotenode; + + if (net_udp_sendto(mysocket, (char *)&doomcom->data, doomcom->datalength, nodeinfo->port, nodeinfo->host) == -1) + { + CONS_Printf("KOSUDP: error sending data\n"); + } +} + +static void KOSUDP_FreeNodenum(int numnode) +{ + // can't disconnect from self :) + if (!numnode) + return; + + DEBFILE(va("Free node %d (%s)\n", numnode, KOSUDP_GetNodeAddress(numnode))); + + nodeconnected[numnode] = false; + + memset(&clientaddress[numnode], 0, sizeof (IPaddress)); +} + +static int KOSUDP_Socket(void) +{ + int temp = 0; + uint16 portnum = 0; + const uint32 hostip = net_default_dev?net_ntohl(net_ipv4_address(net_default_dev->ip_addr)):NET_LOCAL; + //Hurdler: I'd like to put a server and a client on the same computer + //Logan: Me too + //BP: in fact for client we can use any free port we want i have read + // in some doc that connect in udp can do it for us... + //Alam: where? + if (M_CheckParm("-clientport")) + { + if (!M_IsNextParm()) + I_Error("syntax: -clientport <portnum>"); + portnum = net_ntohs(atoi(M_GetNextParm())); + } + else + portnum = net_ntohs(sock_port); + + temp = net_udp_sock_open(portnum, hostip, portnum, NET_NONE); + if (temp) + { + int btemp = net_udp_sock_open(portnum, hostip, portnum, NET_ANY); + clientaddress[0].port = portnum; + clientaddress[0].host = NET_NONE; + if (btemp) + { + clientaddress[BROADCASTADDR].port = net_ntohs(sock_port); + clientaddress[BROADCASTADDR].host = NET_ANY; + } + else + { + CONS_Printf("KOSUDP: can't setup broadcast sock\n"); + net_udp_sock_close(temp); + return 0; + } + } + else + { + CONS_Printf("KOSUDP: can't setup main sock\n"); + return 0; + } + + doomcom->extratics = 1; // internet is very high ping + + return temp; +} + +static void I_ShutdownKOSUDPDriver(void) +{ + //net_shutdown(); + init_KOSUDP_driver = false; +} + +static void I_InitKOSUDPDriver(void) +{ + if (init_KOSUDP_driver) + I_ShutdownKOSUDPDriver(); + else + net_init(); + D_SetDoomcom(); + memset(&clientaddress,0,sizeof (clientaddress)); + init_KOSUDP_driver = true; +} + +static void KOSUDP_CloseSocket(void) +{ + if (mysocket) + net_udp_sock_close(mysocket); + mysocket = 0; +} + +static SINT8 KOSUDP_NetMakeNodewPort(const char *hostname, const char* port) +{ + SINT8 newnode; + uint16 portnum = net_ntohs(sock_port); + + if (port && !port[0]) + portnum = net_ntohs((UINT16)atoi(port)); + + newnode = getfreenode(); + if (newnode == -1) + return -1; + // find ip of the server + clientaddress[newnode].port = portnum; + clientaddress[newnode].host = inet_addr(hostname); + + if (clientaddress[newnode].host == NET_NONE) + { + free(hostname); + return -1; + } + return newnode; +} + +static boolean KOSUDP_OpenSocket(void) +{ + size_t i; + + memset(clientaddress, 0, sizeof (clientaddress)); + + for (i = 0; i < MAXNETNODES; i++) + nodeconnected[i] = false; + + //CONS_Printf("KOSUDP Code starting up\n"); + + nodeconnected[0] = true; // always connected to self + nodeconnected[BROADCASTADDR] = true; + I_NetSend = KOSUDP_Send; + I_NetGet = KOSUDP_Get; + I_NetCloseSocket = KOSUDP_CloseSocket; + I_NetFreeNodenum = KOSUDP_FreeNodenum; + I_NetMakeNodewPort = KOSUDP_NetMakeNodewPort; + + //I_NetCanSend = KOSUDP_CanSend; + + // build the socket but close it first + KOSUDP_CloseSocket(); + mysocket = KOSUDP_Socket(); + + if (mysocket) + { +#if 0 + // for select + myset = SDLNet_AllocSocketSet(1); + if (!myset) + { + CONS_Printf("SDL_Net: %s",SDLNet_GetError()); + return false; + } + if (SDLNet_UDP_AddSocket(myset,mysocket) == -1) + { + CONS_Printf("SDL_Net: %s",SDLNet_GetError()); + return false; + } +#endif + return true; + } + return false; +} + +static boolean KOSUDP_Ban(int node) +{ + if (numbans == MAXBANS) + return false; + + M_Memcpy(&banned[numbans], &clientaddress[node], sizeof (IPaddress)); + banned[numbans].port = 0' + numbans++; + return true; +} + +static void KOSUDP_ClearBans(void) +{ + numbans = 0; +} + +// +// I_InitNetwork +// Only required for DOS, so this is more a dummy +// +boolean I_InitNetwork(void) +{ + char serverhostname[255]; + boolean ret = false; + //if (!M_CheckParm ("-kosnet")) + // return false; + // initilize the driver + I_InitKOSUDPDriver(); + I_AddExitFunc(I_ShutdownKOSUDPDriver); + if (!init_KOSUDP_driver) + return false; + + if (M_CheckParm("-udpport")) + { + if (M_IsNextParm()) + sock_port = (UINT16)atoi(M_GetNextParm()); + else + sock_port = 0; + } + + // parse network game options, + if (M_CheckParm("-server") || dedicated) + { + server = true; + + // If a number of clients (i.e. nodes) is specified, the server will wait for the clients + // to connect before starting. + // If no number is specified here, the server starts with 1 client, and others can join + // in-game. + // Since Boris has implemented join in-game, there is no actual need for specifying a + // particular number here. + // FIXME: for dedicated server, numnodes needs to be set to 0 upon start +/* if (M_IsNextParm()) + doomcom->numnodes = (INT16)atoi(M_GetNextParm()); + else */if (dedicated) + doomcom->numnodes = 0; + else + doomcom->numnodes = 1; + + if (doomcom->numnodes < 0) + doomcom->numnodes = 0; + if (doomcom->numnodes > MAXNETNODES) + doomcom->numnodes = MAXNETNODES; + + // server + servernode = 0; + // FIXME: + // ??? and now ? + // server on a big modem ??? 4*isdn + net_bandwidth = 16000; + hardware_MAXPACKETLENGTH = INETPACKETLENGTH; + + ret = true; + } + else if (M_CheckParm("-connect")) + { + if (M_IsNextParm()) + strcpy(serverhostname, M_GetNextParm()); + else + serverhostname[0] = 0; // assuming server in the LAN, use broadcast to detect it + + // server address only in ip + if (serverhostname[0]) + { + COM_BufAddText("connect \""); + COM_BufAddText(serverhostname); + COM_BufAddText("\"\n"); + + // probably modem + hardware_MAXPACKETLENGTH = INETPACKETLENGTH; + } + else + { + // so we're on a LAN + COM_BufAddText("connect any\n"); + + net_bandwidth = 800000; + hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; + } + } + + I_NetOpenSocket = KOSUDP_OpenSocket; + I_Ban = KOSUDP_Ban; + I_ClearBans = KOSUDP_ClearBans; + I_GetNodeAddress = KOSUDP_GetNodeAddress; + I_GetBanAddress = KOSUDP_GetBanAddress; + bannednode = KOSUDP_bannednode; + + return ret; +} diff --git a/src/sdl2/SRB2DC/scramble.c b/src/sdl2/SRB2DC/scramble.c new file mode 100644 index 000000000..a3483b00d --- /dev/null +++ b/src/sdl2/SRB2DC/scramble.c @@ -0,0 +1,259 @@ +#include <stdio.h> +#include <stdlib.h> + +#define MAXCHUNK (2048*1024) + +static unsigned int seed; + +void my_srand(unsigned int n) +{ + seed = n & 0xffff; +} + +unsigned int my_rand() +{ + seed = (seed * 2109 + 9273) & 0x7fff; + return (seed + 0xc000) & 0xffff; +} + +void load(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + if (fread(ptr, 1, sz, fh) != sz) + { + fprintf(stderr, "Read error!\n"); + exit(1); + } +} + +void load_chunk(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + static int idx[MAXCHUNK/32]; + int i; + + /* Convert chunk size to number of slices */ + sz /= 32; + + /* Initialize index table with unity, + so that each slice gets loaded exactly once */ + for (i = 0; i < sz; i++) + idx[i] = i; + + for (i = sz-1; i >= 0; --i) + { + /* Select a replacement index */ + int x = (my_rand() * i) >> 16; + + /* Swap */ + int tmp = idx[i]; + idx[i] = idx[x]; + idx[x] = tmp; + + /* Load resulting slice */ + load(fh, ptr+32*idx[i], 32); + } +} + +void load_file(FILE *fh, unsigned char *ptr, unsigned long filesz) +{ + unsigned long chunksz; + + my_srand(filesz); + + /* Descramble 2 meg blocks for as long as possible, then + gradually reduce the window down to 32 bytes (1 slice) */ + for (chunksz = MAXCHUNK; chunksz >= 32; chunksz >>= 1) + while (filesz >= chunksz) + { + load_chunk(fh, ptr, chunksz); + filesz -= chunksz; + ptr += chunksz; + } + + /* Load final incomplete slice */ + if (filesz) + load(fh, ptr, filesz); +} + +void read_file(char *filename, unsigned char **ptr, unsigned long *sz) +{ + FILE *fh = fopen(filename, "rb"); + if (fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", filename); + exit(1); + } + if (fseek(fh, 0, SEEK_END)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + *sz = ftell(fh); + *ptr = malloc(*sz); + if ( *ptr == NULL ) + { + fprintf(stderr, "Out of memory.\n"); + exit(1); + } + if (fseek(fh, 0, SEEK_SET)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + load_file(fh, *ptr, *sz); + fclose(fh); +} + +void save(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + if (fwrite(ptr, 1, sz, fh) != sz) + { + fprintf(stderr, "Write error!\n"); + exit(1); + } +} + +void save_chunk(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + static int idx[MAXCHUNK/32]; + int i; + + /* Convert chunk size to number of slices */ + sz /= 32; + + /* Initialize index table with unity, + so that each slice gets saved exactly once */ + for (i = 0; i < sz; i++) + idx[i] = i; + + for (i = sz-1; i >= 0; --i) + { + /* Select a replacement index */ + int x = (my_rand() * i) >> 16; + + /* Swap */ + int tmp = idx[i]; + idx[i] = idx[x]; + idx[x] = tmp; + + /* Save resulting slice */ + save(fh, ptr+32*idx[i], 32); + } +} + +void save_file(FILE *fh, unsigned char *ptr, unsigned long filesz) +{ + unsigned long chunksz; + + my_srand(filesz); + + /* Descramble 2 meg blocks for as long as possible, then + gradually reduce the window down to 32 bytes (1 slice) */ + for (chunksz = MAXCHUNK; chunksz >= 32; chunksz >>= 1) + while (filesz >= chunksz) + { + save_chunk(fh, ptr, chunksz); + filesz -= chunksz; + ptr += chunksz; + } + + /* Save final incomplete slice */ + if (filesz) + save(fh, ptr, filesz); +} + +void write_file(char *filename, unsigned char *ptr, unsigned long sz) +{ + FILE *fh = fopen(filename, "wb"); + if (fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", filename); + exit(1); + } + save_file(fh, ptr, sz); + fclose(fh); +} + +void descramble(char *src, char *dst) +{ + unsigned char *ptr = NULL; + unsigned long sz = 0; + FILE *fh; + + read_file(src, &ptr, &sz); + + fh = fopen(dst, "wb"); + if (fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", dst); + exit(1); + } + if ( fwrite(ptr, 1, sz, fh) != sz ) + { + fprintf(stderr, "Write error.\n"); + exit(1); + } + fclose(fh); + free(ptr); +} + +void scramble(char *src, char *dst) +{ + unsigned char *ptr = NULL; + unsigned long sz = 0; + FILE *fh; + + fh = fopen(src, "rb"); + if (fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", src); + exit(1); + } + if (fseek(fh, 0, SEEK_END)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + sz = ftell(fh); + ptr = malloc(sz); + if ( ptr == NULL ) + { + fprintf(stderr, "Out of memory.\n"); + exit(1); + } + if (fseek(fh, 0, SEEK_SET)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + if ( fread(ptr, 1, sz, fh) != sz ) + { + fprintf(stderr, "Read error.\n"); + exit(1); + } + fclose(fh); + + write_file(dst, ptr, sz); + + free(ptr); +} + +int main(int argc, char *argv[]) +{ + int opt = 0; + + if (argc > 1 && !strcmp(argv[1], "-d")) + opt ++; + + if (argc != 3+opt) + { + fprintf(stderr, "Usage: %s [-d] from to\n", argv[0]); + exit(1); + } + + if (opt) + descramble(argv[2], argv[3]); + else + scramble(argv[1], argv[2]); + + return 0; +} diff --git a/src/sdl2/SRB2PS3/ICON0.png b/src/sdl2/SRB2PS3/ICON0.png new file mode 100644 index 0000000000000000000000000000000000000000..140230c1e17bcf341498374ede7feea16ac5b54c GIT binary patch literal 3678 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 XZL<1$ZvW%AK@De5S3j3^P6<r_Z<|=? literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2PS3/Makefile.cfg b/src/sdl2/SRB2PS3/Makefile.cfg new file mode 100644 index 000000000..a4a01714a --- /dev/null +++ b/src/sdl2/SRB2PS3/Makefile.cfg @@ -0,0 +1,139 @@ +# +# Makefile.cfg for SRB2 for the PlayStation 3 using PSL1GHT +# + +# Check if PS3DEV and PSL1GHT is set in the environment. If so, continue with compilation. +.SUFFIXES: + +ifeq ($(strip $(PS3DEV)),) +$(error "Please set PS3DEV in your environment. export PS3DEV=<path to>ps3dev-toolchain") +endif + +ifeq ($(strip $(PSL1GHT)),) +$(error "Please set PSL1GHT in your environment. export PSL1GHT=<path to>PSL1GHT") +endif + +# Set compiler flags + +# Disable same warning flags +WFLAGS+=-Wno-shadow -Wno-char-subscripts -Wno-format + +ifdef JAILBREAK +EXENAME?=SRB2PS3-jb.elf +PKGNAME?=SRB2PS3-jb.pkg +else +EXENAME?=SRB2PS3.elf +PKGNAME?=SRB2PS3.pkg +endif +DGBNAME?=$(EXENAME).debug + +SRB2PS3DIR=sdl/SRB2PS3 +ICON0?=$(SRB2PS3DIR)/ICON0.png +SFOXML?=sfo.xml +SRB2TTF?=sdl/srb2.ttf + +TITLE=Sonic Robo Blast 2 v2.0.6 +APPID=SRB2-PS3 +CONTENTID=UP0001-$(APPID)_00-0000000000000000 + +FSELF=$(PS3DEV)/bin/fself.py +MAKE_SELF_NPDRM=$(PS3DEV)/ps3publictools/make_self_npdrm +FINALIZE=$(PS3DEV)/ps3publictools/package_finalize +SFO=$(PS3DEV)/bin/sfo.py +PKG=$(PS3DEV)/bin/pkg.py +PS3LOADEXE=$(PS3DEV)/ps3tools/ps3load +SED=sed +MV=mv +XARGS=xargs +FOR=for +SHXARGS:=$(XARGS) +SHSED:=$(SED) +SPRXLINKER=$(PS3DEV)/bin/sprxlinker + +ifdef JAILBREAK +PKGDIR=$(BIN)/pkg-jb +else +PKGDIR=$(BIN)/pkg +endif +USRDIR=$(PKGDIR)/USRDIR +ETCDIR=$(USRDIR)/etc +WGET=wget -P $(ETCDIR) -c -nc + +ifndef ECHO + FSELF:=@$(FSELF) + MAKE_SELF_NPDRM:=@$(MAKE_SELF_NPDRM) + FINALIZE:=@$(FINALIZE) + SFO:=@$(SFO) + PKG:=@$(PKG) + PS3LOADEXE:=@$(PS3LOADEXE) + SED:=@$(SED) + MV:=@$(MV) + SPRXLINKER:=@$(SPRXLINKER) + XARGS:=@$(XARGS) + FOR:=@(FOR) +endif + +# SRB2PS3 needs SDL_ttf to display any console text +SDL_TTF=1 + +# newlib has no support for networking +#NONET=1 + +# use absolute paths because changing PATH variable breaks distcc +PREFIX := $(PS3DEV)/ppu/bin/$(PREFIX) + +# PS3DEV toolchain libdir and includedir +PS3DEV_INC := $(PS3DEV)/ppu/include +PS3DEV_LIB := $(PS3DEV)/ppu/lib + +# PSL1GHT libdir and includedir +PSL1GHT_INC := $(PSL1GHT)/ppu/include +PSL1GHT_LIB := $(PSL1GHT)/ppu/lib + +PS3PORTS := $(PS3DEV)/portlibs +PS3PORTS_BIN := $(PS3PORTS)/ppu/bin +PS3PORTS_INC := $(PS3PORTS)/ppu/include + +PNG_CONFIG := $(PS3PORTS_BIN)/libpng-config +# static compilation +PNG_STATIC=1 + +SDL_CONFIG := $(PS3PORTS_BIN)/sdl-config + +INCLUDE := -I$(PSL1GHT_INC) -I$(PS3DEV_INC) -I$(PS3PORTS_INC) + +OPTS+=-D_PS3 -DUNIXCOMMON +CFLAGS+= -g $(INCLUDE) -L$(PSL1GHT_LIB) -L$(PS3DEV_LIB) -L$(PS3DEV)/lib +CXXFLAGS+=$(CFLAGS) +LDFLAGS+= -B$(PSL1GHT_LIB) -B$(PS3DEV_LIB) -B$(PS3DEV)/lib +LIBS+=-lrsx +ifndef NONET +LIBS+=-lnet -lsysmodule +endif + +$(BIN)/$(PKGNAME): $(OBJS) $(BIN)/$(EXENAME) + @echo Linking $(PKGNAME)... + -$(MKDIR) $(ETCDIR) + $(CP) $(ICON0) $(PKGDIR) + $(CP) $(SRB2TTF) $(ETCDIR) +ifdef WITHDATA + $(FOR) datafile in $(shell echo $(D_FILES) | $(SHSED) 's/\.srb/\.wad/' | $(SHXARGS) -n 1 basename); do \ + $(WGET) http://alam.srb2.org/SRB2/2.0.6-Final/Resources/$$datafile; \ + done +endif + $(SPRXLINKER) $(BIN)/$(EXENAME) +ifdef JAILBREAK + $(SED) 's/@@PS3_SYSTEM_VER@@/3.41/' $(SRB2PS3DIR)/$(SFOXML) > $(BIN)/$(SFOXML) + $(FSELF) -n $(BIN)/$(EXENAME) $(USRDIR)/EBOOT.BIN +else + $(SED) 's/@@PS3_SYSTEM_VER@@/3.55/' $(SRB2PS3DIR)/$(SFOXML) > $(BIN)/$(SFOXML) + $(MAKE_SELF_NPDRM) $(BIN)/$(EXENAME) $(USRDIR)/EBOOT.BIN $(CONTENTID) +endif + $(SFO) --title "$(TITLE)" --appid "$(APPID)" -f $(BIN)/$(SFOXML) $(PKGDIR)/PARAM.SFO + $(PKG) --contentid $(CONTENTID) $(PKGDIR)/ $(BIN)/$(PKGNAME) +ifndef JAILBREAK + $(FINALIZE) $(BIN)/$(PKGNAME) +endif + +run: $(BIN)/$(EXENAME) + $(PS3LOADEXE) $(USRDIR)/EBOOT.BIN diff --git a/src/sdl2/SRB2PS3/sfo.xml b/src/sdl2/SRB2PS3/sfo.xml new file mode 100644 index 000000000..d7719b540 --- /dev/null +++ b/src/sdl2/SRB2PS3/sfo.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" ?> +<sfo> + <value name="APP_VER" type="string"> + 02.06 + </value> + <value name="ATTRIBUTE" type="integer"> + 0 + </value> + <value name="BOOTABLE" type="integer"> + 1 + </value> + <value name="CATEGORY" type="string"> + HG + </value> + <value name="LICENSE" type="string"> + This application was created with the official non-official SDK called PSL1GHT, for more information visit http://www.psl1ght.com/ . This is in no way associated with Sony Computer Entertainment Inc., please do not contact them for help, they will not be able to provide it. + </value> + <value name="PARENTAL_LEVEL" type="integer"> + 0 + </value> + <value name="PS3_SYSTEM_VER" type="string"> + 0@@PS3_SYSTEM_VER@@00 + </value> + <value name="RESOLUTION" type="integer"> + 63 + </value> + <value name="SOUND_FORMAT" type="integer"> + 279 + </value> + <value name="TITLE" type="string"> + Sonic Robo Blast 2 + </value> + <value name="TITLE_ID" type="string"> + SRB200000 + </value> + <value name="VERSION" type="string"> + 02.06 + </value> +</sfo> diff --git a/src/sdl2/SRB2PSP/ICON0.png b/src/sdl2/SRB2PSP/ICON0.png new file mode 100644 index 0000000000000000000000000000000000000000..140230c1e17bcf341498374ede7feea16ac5b54c GIT binary patch literal 3678 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 XZL<1$ZvW%AK@De5S3j3^P6<r_Z<|=? literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2PSP/Makefile.cfg b/src/sdl2/SRB2PSP/Makefile.cfg new file mode 100644 index 000000000..f9ec6416b --- /dev/null +++ b/src/sdl2/SRB2PSP/Makefile.cfg @@ -0,0 +1,126 @@ +# +# Makefile.cfg for SRB2/PSP +# + +# +#hmmm, the PSP +# + + PSPSDK=$(shell psp-config -p) + PSPDEV=$(shell psp-config -d) + PSPPREFIX=$(shell psp-config -P) + STRIP=psp-strip + MKSFO?=mksfoex -d MEMSIZE=1 + #MKSFO=mksfo + PACK_PBP=pack-pbp + FIXUP=psp-fixup-imports + HOSTCC:=$(CC) + CC=$(PSPDEV)/bin/psp-gcc + OBJCOPY=psp-objcopy + OBJDUMP=psp-objdump +ifdef FIXEDPRX + PRXGEN=psp-prxgen +else + PRXGEN=$(OBJCOPY) +endif +ifndef PRXSIGN + SIGNER:=$(PSPDEV)/bin/$(OBJCOPY) +endif + +ifndef ECHO + MKSFO:=@$(MKSFO) + PACK_PBP:=@$(PACK_PBP) + FIXUP:=@$(FIXUP) + PRXGEN:=@$(PRXGEN) +endif + + PSP_EBOOT_TITLE=SRB2-PSP vME + PSP_EBOOT_SFO=$(BIN)/PARAM.SFO + PSP_EBOOT_ICON=sdl/SRB2PSP/ICON0.png + PSP_EBOOT_ICON1=NULL + PSP_EBOOT_UNKPNG=NULL + PSP_EBOOT_PIC1=sdl/SRB2PSP/PIC1.png + PSP_EBOOT_SND0=NULL + PSP_EBOOT_PSAR=NULL + + SIGNER?=sdl/SRB2PSP/psp-prxsign/psp-prxsign + + SDL=1 + PREFIX=psp + NONX86=1 + #NOHW=1 + NOHS=1 + NOMD5=1 + NONET=1 #No TCPIP code + NOPNG=1 #No Screenshot + + OPTS=-I$(PSPPREFIX)/include -I$(PSPSDK)/include + OPTS+=-DUNIXCOMMON -DFORCESDLMAIN -G0 + WFLAGS+=-Wno-undef + WFLAGS+=-O1 + LIBS=-lm + SDL_CONFIG?=$(PSPPREFIX)/bin/sdl-config + #SDL_CFLAGS?=-I$(PSPDEV)/psp/include/SDL + #SDL_LDFLAGS?=-lSDLmain -lSDL -lglut -lGLU -lGL -lpspgu -lpspaudiolib -lpspaudio -lpsphprm -lpspvfpu -lpsprtc +ifndef NOMIXER + LIBS:=-liberty -lvorbisfile -lvorbis -logg -lSDL $(LIBS) +endif +ifndef NOHW + OPTS+=-DSTATIC_OPENGL -DMINI_GL_COMPATIBILITY + LIBS+=-lGLU -lGL -lm +endif + #PSPSDK_LIBS=-L$(PSPSDK)/lib -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk + #LIBS+=$(PSPSDK_LIBS) -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel +ifdef FIXEDPRX + LDFLAGS := -specs=$(PSPSDK)/lib/prxspecs -Wl,-q,-T$(PSPSDK)/lib/linkfile.prx $(LDFLAGS) + LIBS+=$(PSPSDK)/lib/prxexports.o +endif + +ifeq ($(PSP_FW_VERSION),) +PSP_FW_VERSION=150 +endif + + CPPFLAGS:=-D_PSP_FW_VERSION=$(PSP_FW_VERSION) $(CPPFLAGS) + + + # name of the exefile + EXENAME?=SRB2PSP.elf + PRXNAME?=SRB2PSP.prx + DBGNAME?=SRB2PSP.debug + +post-build: $(BIN)/EBOOT.PBP + +kxploit: $(BIN)/$(EXENAME) $(PSP_EBOOT_SFO) + -$(MKDIR) "$(BIN)/kxploit/srb2" + @echo emitting kxploit/srb2/ + $(STRIP) $(BIN)/$(EXENAME) -o $(BIN)/kxploit/srb2/EBOOT.PBP + @echo emitting kxploit/srb2% + -$(MKDIR) "$(BIN)/kxploit/srb2%/" + $(PACK_PBP) "$(BIN)/kxploit/srb2%/EBOOT.PBP" $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \ + $(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \ + $(PSP_EBOOT_SND0) NULL $(PSP_EBOOT_PSAR) + +sdl/SRB2PSP/psp-prxsign/psp-prxsign: + -$(MAKE) -C sdl/SRB2PSP/psp-prxsign CFLAGS=-pipe CC="$(HOSTCC)" + +fix-up: $(BIN)/$(EXENAME) + @echo Running psp-fixup-imports on $(EXENAME) + $(FIXUP) $(BIN)/$(EXENAME) + +$(BIN)/$(PRXNAME): $(BIN)/$(EXENAME) fix-up + @echo Building $(PRXNAME) out of $(EXENAME) + $(PRXGEN) $(BIN)/$(EXENAME) $@ + +$(BIN)/EBOOT.PBP: $(BIN)/$(PRXNAME) $(SIGNER) $(PSP_EBOOT_SFO) + @echo Signing and running pack-pbp to make PBP + $(SIGNER) $(BIN)/$(PRXNAME) $(BIN)/$(PRXNAME).sign + $(PACK_PBP) $@ $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \ + $(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \ + $(PSP_EBOOT_SND0) $(BIN)/$(PRXNAME).sign $(PSP_EBOOT_PSAR) + $(REMOVE) $(BIN)/$(PRXNAME).sign + +$(PSP_EBOOT_SFO): + -$(MKDIR) $(BIN) + $(MKSFO) '$(PSP_EBOOT_TITLE)' $@ + +#include $(PSPSDK)/lib/build.mak diff --git a/src/sdl2/SRB2PSP/PIC1.png b/src/sdl2/SRB2PSP/PIC1.png new file mode 100644 index 0000000000000000000000000000000000000000..0722a96bc78ce4c82edaed348bc6f86826e5690a GIT binary patch literal 20300 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 Qz`(%Z>FVdQ&MBb@046C+&j0`b literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2PSP/psp-prxsign/.gitignore b/src/sdl2/SRB2PSP/psp-prxsign/.gitignore new file mode 100644 index 000000000..6a07f1a5a --- /dev/null +++ b/src/sdl2/SRB2PSP/psp-prxsign/.gitignore @@ -0,0 +1,2 @@ +/psp-prxsign +/psp-prxsign.exe diff --git a/src/sdl2/SRB2PSP/psp-prxsign/Makefile b/src/sdl2/SRB2PSP/psp-prxsign/Makefile new file mode 100644 index 000000000..4a9b7da0f --- /dev/null +++ b/src/sdl2/SRB2PSP/psp-prxsign/Makefile @@ -0,0 +1,22 @@ +EXE=psp-prxsign +SRC=main.c cmac.c +OBJ=$(SRC:.c=.o)# replaces the .c from SRC with .o + +OPENSSL_PKGCONFIG?=openssl +OPENSSL_CFLAGS?=$(shell pkg-config $(OPENSSL_PKGCONFIG) --cflags) +OPENSSL_LDFLAGS?=$(shell pkg-config $(OPENSSL_PKGCONFIG) --libs) + +CFLAGS+=$(OPENSSL_CFLAGS) +LDFLAGS+=$(OPENSSL_LDFLAGS) + +.PHONY : all # .PHONY ignores files named all + +all: $(EXE) # all is dependent on $(BIN) to be complete + + +$(EXE): $(OBJ) # $(EXE) is dependent on all of the files in $(OBJ) to exist + $(CC) $^ $(LDFLAGS) -o $@ + +.PHONY : clean # .PHONY ignores files named clean +clean: + -$(RM) $(OBJ) $(EXE) diff --git a/src/sdl2/SRB2PSP/psp-prxsign/cmac.c b/src/sdl2/SRB2PSP/psp-prxsign/cmac.c new file mode 100644 index 000000000..f527f7a71 --- /dev/null +++ b/src/sdl2/SRB2PSP/psp-prxsign/cmac.c @@ -0,0 +1,130 @@ +#include "cmac.h" + +#define AES_128 0 +unsigned char const_Rb[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87 +}; +unsigned char const_Zero[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +void xor_128(unsigned char *a, unsigned char *b, unsigned char *out) +{ + int i; + for (i=0;i<16; i++) + { + out[i] = a[i] ^ b[i]; + } +} + +/* AES-CMAC Generation Function */ + +static inline void leftshift_onebit(unsigned char *input,unsigned char *output) +{ + int i; + unsigned char overflow = 0; + + for ( i=15; i>=0; i-- ) + { + output[i] = input[i] << 1; + output[i] |= overflow; + overflow = (input[i] & 0x80)?1:0; + } +} + +void generate_subkey(unsigned char *key, unsigned char *K1, unsigned char *K2) +{ + unsigned char L[16]; + unsigned char Z[16]; + unsigned char tmp[16]; + int i; + + for ( i=0; i<16; i++ ) Z[i] = 0; + + AES_KEY aes; + AES_set_encrypt_key(key, 128, &aes); + + AES_encrypt(Z, L, &aes); + + if ( (L[0] & 0x80) == 0 ) /* If MSB(L) = 0, then K1 = L << 1 */ + { + leftshift_onebit(L,K1); + } else { /* Else K1 = ( L << 1 ) (+) Rb */ + leftshift_onebit(L,tmp); + xor_128(tmp,const_Rb,K1); + } + + if ( (K1[0] & 0x80) == 0 ) + { + leftshift_onebit(K1,K2); + } else { + leftshift_onebit(K1,tmp); + xor_128(tmp,const_Rb,K2); + } +} + +static inline void padding ( unsigned char *lastb, unsigned char *pad, int length ) +{ + int j; + + /* original last block */ + for ( j=0; j<16; j++ ) + { + if ( j < length ) + { + pad[j] = lastb[j]; + } else if ( j == length ) { + pad[j] = 0x80; + } else { + pad[j] = 0x00; + } + } +} + +void AES_CMAC ( unsigned char *key, unsigned char *input, int length, unsigned char *mac ) +{ + unsigned char X[16],Y[16], M_last[16], padded[16]; + unsigned char K1[16], K2[16]; + int n, i, flag; + generate_subkey(key,K1,K2); + + n = (length+15) / 16; /* n is number of rounds */ + + if ( n == 0 ) + { + n = 1; + flag = 0; + } else { + if ( (length%16) == 0 ) { /* last block is a complete block */ + flag = 1; + } else { /* last block is not complete block */ + flag = 0; + } + + } + + if ( flag ) { /* last block is complete block */ + xor_128(&input[16*(n-1)],K1,M_last); + } else { + padding(&input[16*(n-1)],padded,length%16); + xor_128(padded,K2,M_last); + } + AES_KEY aes; + AES_set_encrypt_key(key, 128, &aes); + + for ( i=0; i<16; i++ ) X[i] = 0; + for ( i=0; i<n-1; i++ ) + { + xor_128(X,&input[16*i],Y); /* Y := Mi (+) X */ + AES_encrypt(Y, X, &aes); /* X := AES-128(KEY, Y); */ + } + + xor_128(X,M_last,Y); + AES_encrypt(Y, X, &aes); + + for ( i=0; i<16; i++ ) { + mac[i] = X[i]; + } +} diff --git a/src/sdl2/SRB2PSP/psp-prxsign/cmac.h b/src/sdl2/SRB2PSP/psp-prxsign/cmac.h new file mode 100644 index 000000000..563045841 --- /dev/null +++ b/src/sdl2/SRB2PSP/psp-prxsign/cmac.h @@ -0,0 +1,38 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 6/10/2008 +*/ + +#ifndef CMAC_AES_H +#define CMAC_AES_H + +#include <string.h> +#include <openssl/aes.h> + +void xor_128(unsigned char *a, unsigned char *b, unsigned char *out); +void generate_subkey(unsigned char *key, unsigned char *K1, unsigned char *K2); +void AES_CMAC(unsigned char *key, unsigned char *input, int length, unsigned char *mac); + +#endif diff --git a/src/sdl2/SRB2PSP/psp-prxsign/kirk_header.h b/src/sdl2/SRB2PSP/psp-prxsign/kirk_header.h new file mode 100644 index 000000000..76c921ef0 --- /dev/null +++ b/src/sdl2/SRB2PSP/psp-prxsign/kirk_header.h @@ -0,0 +1,25 @@ +#ifndef __kirk_header__ +#define __kirk_header__ + +static unsigned int size_kirk_header = 272; +static unsigned char kirk_header[] __attribute__((aligned(16))) = { + 0x2a, 0x4f, 0x3c, 0x49, 0x8a, 0x73, 0x4e, 0xd1, 0xf4, 0x55, 0x93, 0x0b, 0x9b, 0x69, 0xdc, 0x65, + 0x73, 0x22, 0x69, 0xd3, 0x73, 0x96, 0x7a, 0x60, 0x66, 0x8c, 0x88, 0xcf, 0x2f, 0x83, 0x58, 0xbc, + 0xb2, 0x00, 0x0a, 0x11, 0x72, 0x43, 0xc5, 0xde, 0xef, 0xbb, 0x2c, 0xbf, 0x97, 0x79, 0x6b, 0x9c, + 0x10, 0x1e, 0x7c, 0x57, 0x0e, 0xdb, 0x1d, 0x61, 0x6e, 0xb5, 0xf9, 0x3d, 0x35, 0xe9, 0x5c, 0xd8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x33, 0x55, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7e, 0x50, 0x53, 0x50, 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x22, 0x74, 0x69, 0x66, 0x70, 0x73, + 0x70, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x33, 0x55, 0x00, 0x50, 0x34, 0x55, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x67, 0x3d, 0x00, 0x50, 0x55, 0x0a, 0x01, 0x10, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x6b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6b, 0x3d, 0x00, 0xcc, 0xbb, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, +}; + +#endif diff --git a/src/sdl2/SRB2PSP/psp-prxsign/main.c b/src/sdl2/SRB2PSP/psp-prxsign/main.c new file mode 100644 index 000000000..a970ae6c1 --- /dev/null +++ b/src/sdl2/SRB2PSP/psp-prxsign/main.c @@ -0,0 +1,190 @@ +#include <stdio.h> +#include <stdlib.h> +#include <openssl/aes.h> +#include <openssl/sha.h> +#include <elf.h> +#include "cmac.h" +#include "kirk_header.h" +#include "psp_header.h" + +typedef unsigned char byte; + +typedef struct { + byte key[16]; + byte ckey[16]; + byte head_hash[16]; + byte data_hash[16]; + byte unused[32]; + int unk1; // 1 + int unk2; // 0 + int unk3[2]; + int datasize; + int dataoffset; + int unk4[6]; +} kirk1head_t; + +// secret kirk command 1 key +byte kirk_key[] = { + 0x98, 0xc9, 0x40, 0x97, 0x5c, 0x1d, 0x10, 0xe8, 0x7f, 0xe6, 0x0e, 0xa3, 0xfd, 0x03, 0xa8, 0xba +}; + +int main(int argc, char **argv) +{ + int i, relrem, size, fullsize, blocks, datasize; + size_t j; + kirk1head_t kirk; + byte iv[16]; + byte cmac[32]; + byte subk[32]; + byte psph[0x150]; + byte *datablob; + byte *filebuff; + FILE *f; + AES_KEY aesKey; + Elf32_Ehdr *ehdr; + Elf32_Shdr *shdr; + Elf32_Rel *relo; + + if(argc < 3) { + printf("Usage: %s unsigned.prx signed.prx\n", argv[0]); + return 1; + } + + // clean kirk header, use modified PRXdecrypter to get it + /*f = fopen(argv[1], "rb"); + if(!f) { + printf("failed to open %s\n", argv[1]); + return 1; + } + fread(&kirk, 1, sizeof(kirk1head_t), f); + fclose(f);*/ + //memcpy(&kirk, kirk_header, size_kirk_header); + memcpy(&kirk, kirk_header, sizeof(kirk1head_t)); + + datasize = kirk.datasize; + if(datasize % 16) datasize += 16 - (datasize % 16); + + // original ~PSP header + /*f = fopen(argv[2], "rb"); + if(!f) { + free(datablob); + printf("failed to open %s\n", argv[2]); + return 1; + } + fread(psph, 1, 0x150, f); + fclose(f);*/ + memcpy(&psph, psp_header, size_psp_header); + + // file to encrypt + f = fopen(argv[1], "rb"); + if(!f) { + printf("psp-prxsign: Unable to open PRX\n"); + return 1; + } + fseek(f, 0, SEEK_END); + size = ftell(f); + if(size > datasize - 16) { + fclose(f); + printf("psp-prxsign: PRX is too large\n"); + return 1; + } + printf("%s : %i\n", argv[1], size); + fseek(f, 0, SEEK_SET); + + fullsize = datasize + 0x30 + kirk.dataoffset; + + // datablob holds everything needed to calculate data HASH + datablob = malloc(fullsize); + if(!datablob) { + fclose(f); + printf("psp-prxsign: Failed to allocate memory for blob\n"); + return 1; + } + memset(datablob, 0, fullsize); + memcpy(datablob, &kirk.unk1, 0x30); + memcpy(datablob + 0x30, psph, kirk.dataoffset); + filebuff = datablob + 0x30 + kirk.dataoffset; + + int whocares = fread(filebuff, 1, size, f); + (void)whocares; + fclose(f); + + // remove relocations type 7 + relrem = 0; + ehdr = (void *)filebuff; + if(!memcmp(ehdr->e_ident, ELFMAG, 4) && ehdr->e_shnum) { + shdr = (void *)(filebuff + ehdr->e_shoff); + for(i = 0; i < ehdr->e_shnum; i++) { + if(shdr[i].sh_type == 0x700000A0) { + relo = (void *)(filebuff + shdr[i].sh_offset); + for(j = 0; j < shdr[i].sh_size / sizeof(Elf32_Rel); j++) { + if((relo[j].r_info & 0xFF) == 7) { + relo[j].r_info = 0; + relrem++; + } + } + } + } + } + //printf("%i relocations type 7 removed\ncalculating ...\n", relrem); + + // get AES/CMAC key + AES_set_decrypt_key(kirk_key, 128, &aesKey); + memset(iv, 0, 16); + AES_cbc_encrypt(kirk.key, kirk.key, 32, &aesKey, iv, AES_DECRYPT); + + // check header hash, optional + // if you take correct kirk header, hash is always correct +/* AES_CMAC(kirk.ckey, datablob, 0x30, cmac); + if(memcmp(cmac, kirk.head_hash, 16)) { + free(datablob); + printf("header hash invalid\n"); + return 1; + } +*/ + + // encrypt input file + AES_set_encrypt_key(kirk.key, 128, &aesKey); + memset(iv, 0, 16); + AES_cbc_encrypt(filebuff, filebuff, datasize, &aesKey, iv, AES_ENCRYPT); + + // make CMAC correct + generate_subkey(kirk.ckey, subk, subk + 16); + AES_set_encrypt_key(kirk.ckey, 128, &aesKey); + blocks = fullsize / 16; + memset(cmac, 0, 16); + for(i = 0; i < blocks - 1; i++) { + xor_128(cmac, &datablob[16 * i], cmac + 16); + AES_encrypt(cmac + 16, cmac, &aesKey); + } + + AES_set_decrypt_key(kirk.ckey, 128, &aesKey); + AES_decrypt(kirk.data_hash, iv, &aesKey); + xor_128(cmac, iv, iv); + xor_128(iv, subk, &datablob[16 * (blocks-1)]); + // check it, optional + // it works, this is only if you want to change something +/* AES_CMAC(kirk.ckey, datablob, fullsize, cmac); + if(memcmp(cmac, kirk.data_hash, 16)) { + fclose(f); + free(datablob); + printf("data hash calculation error\n"); + return 1; + } +*/ + f = fopen(argv[2], "wb"); + if(!f) { + free(datablob); + printf("psp-prxsign: Failed to write signed PRX\n"); + return 1; + } + //printf("saving ...\n"); + // save ~PSP header + fwrite(psph, 1, 0x150, f); + // save encrypted file + fwrite(filebuff, 1, fullsize - 0x30 - kirk.dataoffset, f); + fclose(f); + free(datablob); + //printf("everything done\n"); + return 0; +} diff --git a/src/sdl2/SRB2PSP/psp-prxsign/psp_header.h b/src/sdl2/SRB2PSP/psp-prxsign/psp_header.h new file mode 100644 index 000000000..7faef832c --- /dev/null +++ b/src/sdl2/SRB2PSP/psp-prxsign/psp_header.h @@ -0,0 +1,29 @@ +#ifndef __psp_header__ +#define __psp_header__ + +static unsigned int size_psp_header = 336; +static unsigned char psp_header[] __attribute__((aligned(16))) = { + 0x7e, 0x50, 0x53, 0x50, 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x22, 0x74, 0x69, 0x66, 0x70, 0x73, + 0x70, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x33, 0x55, 0x00, 0x50, 0x34, 0x55, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x67, 0x3d, 0x00, 0x50, 0x55, 0x0a, 0x01, 0x10, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x6b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6b, 0x3d, 0x00, 0xcc, 0xbb, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x90, 0x82, 0x4c, 0x48, 0xa3, 0x53, 0xb2, 0x1b, 0x13, 0x95, 0x2f, 0xf1, 0x0b, 0x90, 0x9c, 0x11, + 0x61, 0x40, 0x20, 0x67, 0xf8, 0xdb, 0xfc, 0x95, 0x5c, 0xbe, 0x8c, 0x80, 0xf3, 0x92, 0x03, 0x01, + 0xb0, 0xbe, 0xf5, 0xf8, 0xa1, 0xaf, 0xaf, 0xa8, 0x38, 0x26, 0x63, 0x09, 0x26, 0x0e, 0xb7, 0xd5, + 0x00, 0x33, 0x55, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5c, 0x3e, 0x03, 0x22, 0xe5, 0x7d, 0xb9, 0xd1, 0x13, 0x67, 0x97, 0xa3, 0x5b, 0xd8, 0x77, 0x1f, + 0xf0, 0x05, 0xf3, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x4a, 0xd7, 0x37, + 0xc2, 0x8f, 0x15, 0x43, 0x33, 0x93, 0x4d, 0x5b, 0xc0, 0x6e, 0xe4, 0x00, 0xc6, 0x0a, 0x71, 0x11, + 0x98, 0xb6, 0xc3, 0xb7, 0x59, 0x66, 0x21, 0xa8, 0x65, 0xf6, 0x53, 0xa9, 0x7a, 0x48, 0x17, 0xb6, +}; + +#endif diff --git a/src/sdl2/SRB2Pandora/Makefile.cfg b/src/sdl2/SRB2Pandora/Makefile.cfg new file mode 100644 index 000000000..c7f0f8449 --- /dev/null +++ b/src/sdl2/SRB2Pandora/Makefile.cfg @@ -0,0 +1,39 @@ +# Quick Pandora target to make a compliant SRB2 PND file. + +PNDNAME=SRB2.pnd +PNDDIR=$(BIN)/pnd +ICON=sdl/SRB2Pandora/icon.png +PXML=sdl/SRB2Pandora/PXML.xml + +SED=sed +CAT=cat +CP=cp +XARGS=xargs +FOR=for +WGET=wget -P $(PNDDIR) -c -nc + +SHXARGS:=$(XARGS) +SHSED:=$(SED) + +ifndef ECHO + CP:=@$(CP) + CAT:=@$(CAT) + SED:=@$(SED) + XARGS:=@$(XARGS) + FOR:=@(FOR) +endif + +$(BIN)/$(PNDNAME): $(BIN)/$(EXENAME) + @echo Linking $(PNDNAME)... + $(MKDIR) $(PNDDIR) + $(CP) $(BIN)/$(EXENAME) $(PNDDIR) + $(CP) $(ICON) $(PNDDIR) + $(CP) $(PXML) $(PNDDIR) +ifdef WITHDATA + $(FOR) datafile in $(shell echo $(D_FILES) | $(SHSED) 's/\.srb/\.wad/' | $(SHXARGS) -n 1 basename); do \ + $(WGET) http://alam.srb2.org/SRB2/2.0.6-Final/Resources/$$datafile; \ + done +endif + $(MKISOFS) -l -r -o $@ $(PNDDIR) + $(CAT) $(PXML) >> $@ + $(REMOVE) -r $(PNDDIR) diff --git a/src/sdl2/SRB2Pandora/PXML.xml b/src/sdl2/SRB2Pandora/PXML.xml new file mode 100644 index 000000000..33a9587db --- /dev/null +++ b/src/sdl2/SRB2Pandora/PXML.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<PXML xmlns="http://openpandora.org/namespaces/PXML"> + <application id="srb2.pandora.v20" appdata="srb2"> + <title lang="en_US">Sonic Robo Blast 2</title> + <title lang="ja_JA">ソニック・ãƒãƒœãƒ»ãƒ–ラスト・2</title> + <description lang="en_US">A 3D Sonic fangame with a huge fanbase developing custom content, including characters, levels, and even large-scale modifications</description> + <version major="2" minor="0" release="6" build="1" /> + <exec command="lsdlsrb2" background="true" standalone="true" x11="ignore"/> + <author name="Sonic Team Junior" website="http://www.srb2.org/" email="stjr@srb2.org"/> + <icon src="icon.png"/> + <categories> + <category name="Game"> + <subcategory name="ActionGame" /> + </category> + </categories> + </application> +</PXML> diff --git a/src/sdl2/SRB2Pandora/icon.png b/src/sdl2/SRB2Pandora/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..63af73ac3a4e3046783312465aec2d985172f726 GIT binary patch literal 1690 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 Ib4q9e07=*pUjP6A literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2WII/Makefile.cfg b/src/sdl2/SRB2WII/Makefile.cfg new file mode 100644 index 000000000..1b1863042 --- /dev/null +++ b/src/sdl2/SRB2WII/Makefile.cfg @@ -0,0 +1,124 @@ +# +# Makefile.cfg for SRB2Wii native using libogc +# + +# Check if DEVKITPPC is set in the environment. If so, continue with compilation. +.SUFFIXES: + +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC") +endif + +# Set compiler flags + +SRB2NAME?=srb2wii +EXENAME?=$(SRB2NAME).elf +DBGNAME?=$(SRB2NAME).elf.debug +DOLNAME?=$(SRB2NAME).dol + +ICONPNG?=sdl/SRB2WII/icon.png +METAXML?=sdl/SRB2WII/meta.xml + +APPDIR=apps/$(SRB2NAME) +ZIPNAME=$(SRB2NAME).zip + +ELF2DOL=$(DEVKITPPC)/bin/elf2dol +WIILOADEXE=$(DEVKITPPC)/bin/wiiload +ZIP=zip -r -9 +WGET=wget -P srb2wii -c -nc +SED=sed +XARGS=xargs +SHXARGS:=$(XARGS) +SHSED:=$(SED) +FOR=for + +ifndef ECHO + ELF2DOL:=@$(ELF2DOL) + WIILOADEXE:=@$(WIILOADEXE) + ZIP:=@$(ZIP) + SED:=@$(SED) + XARGS:=@$(XARGS) + FOR:=@$(FOR) +endif + +# Disable same warning flags +WFLAGS+=-Wno-shadow -Wno-char-subscripts -Wno-old-style-definition -Wno-unsuffixed-float-constants + +# newlib has no support for networking +NONET=1 + +# use pkgconfig for PKG +PNG_PKGCONFIG=libpng + +# use absolute paths because changing PATH variable breaks distcc +PREFIX := $(DEVKITPPC)/bin/$(PREFIX) + +# FIXME: DevkitPPC and ready-compiled SDL Wii require these things to be in a silly order +# libogc/DevkitPro required stuff +LIBOGC := $(DEVKITPRO)/libogc +LIBOGC_INC := $(LIBOGC)/include +LIBOGC_LIB := $(LIBOGC)/lib + +PORTLIBS := $(DEVKITPRO)/portlibs/ppc +PORTLIBS_INC := $(PORTLIBS)/include +PORTLIBS_LIB := $(PORTLIBS)/lib + +SDL_CPPFLAGS := -I$(LIBOGC_INC)/SDL +SDL_LIB := $(DEVKITPRO)/libogc/lib/wii +INCLUDE := -I$(LIBOGC_INC) $(SDL_CPPFLAGS) -I$(PORTLIBS_INC) + +PKG_CONFIG_PATH := $(PORTLIBS)/lib/pkgconfig +PKG_BROKEN_SWTICH := --static --define-variable=DEVKITPRO=$(DEVKITPRO) +PNG_PKGCONFIG := $(PKG_CONFIG_PATH)/libpng.pc $(PKG_BROKEN_SWTICH) +ZLIB_PKGCONFIG := $(PKG_CONFIG_PATH)/zlib.pc $(PKG_BROKEN_SWTICH) + +ZLIB_CFLAGS?=$(shell $(PKG_CONFIG) $(ZLIB_PKGCONFIG) --cflags) +ZLIB_LDFLAGS?=$(shell $(PKG_CONFIG) $(ZLIB_PKGCONFIG) --libs) + +ifdef RDB + LIBS+=-ldb + OPTS+=-DREMOTE_DEBUGGING=$(RDB) +endif + +LIBS+= -L$(SDL_LIB) +ifndef NOMIXER + LD=$(CXX) + LIBS+=-lSDL_mixer -lvorbisidec -lsmpeg +endif +LIBS+=-lSDL + +LIBS+=$(ZLIB_LDFLAGS) -lfat -lwiiuse -lbte -logc -lm -lwiikeyboard -L$(LIBOGC_LIB) + +MACHDEP = -DGEKKO -mrvl -mcpu=750 -meabi -mhard-float +OPTS+=-DWII -D_WII -DUNIXCOMMON +CFLAGS+=-D__BIG_ENDIAN__ -g -O3 -fsigned-char $(MACHDEP) $(INCLUDE) +CXXFLAGS+=$(CFLAGS) +LDFLAGS+=-g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +SDL_CONFIG=/bin/true +SDL_CFLAGS= +SDL_LDFLAGS= + +$(BIN)/$(DOLNAME): $(BIN)/$(EXENAME) + @echo Linking $(DOLNAME)... + $(ELF2DOL) $(BIN)/$(EXENAME) $(BIN)/$(DOLNAME) + @echo Creating /apps/$(SRB2NAME)... + $(MKDIR) $(APPDIR) + $(CP) $(BIN)/$(DOLNAME) $(APPDIR)/boot.dol + $(CP) $(ICONPNG) $(APPDIR) + $(CP) $(METAXML) $(APPDIR) +ifdef WITHDATA + $(MKDIR) srb2wii + $(FOR) datafile in $(shell echo $(D_FILES) | $(SHSED) -e 's/\.srb/\.wad/' -e 's/music.dta//' | $(SHXARGS) -n 1 basename); do \ + $(WGET) http://alam.srb2.org/SRB2/2.0.6-Final/Resources/$$datafile; \ + done + # downsampled music.dta specially for SRB2Wii + $(WGET) http://repos.srb2.org/srb2ports/music.dta + $(ZIP) $(BIN)/$(ZIPNAME) $(APPDIR) srb2wii +else + $(ZIP) $(BIN)/$(ZIPNAME) $(APPDIR) +endif + $(REMOVE) -r $(APPDIR) + +run: $(BIN)/$(EXENAME) + $(WIILOADEXE) $(BIN)/$(DBGNAME) diff --git a/src/sdl2/SRB2WII/icon.png b/src/sdl2/SRB2WII/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d22324bc6a9e51dac5c2e82cb2d78ca73d277c23 GIT binary patch literal 11247 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 literal 0 HcmV?d00001 diff --git a/src/sdl2/SRB2WII/meta.xml b/src/sdl2/SRB2WII/meta.xml new file mode 100644 index 000000000..843176d3a --- /dev/null +++ b/src/sdl2/SRB2WII/meta.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<app version="1"> + <name>SRB2Wii</name> + <coder>Callum</coder> + <version>2.0.6</version> + <release_date>20101207</release_date> + <short_description>A 3D Sonic fangame</short_description> + <long_description>Sonic Robo Blast 2 is a 3D fangame by a small group called +Sonic Team Junior, using the Doom engine as a base. +The game has been worked on for almost 11 years so far, and +it is still being very much developed today, with a huge +fanbase developing custom content, including characters, +levels, and even large-scale modifications that play out +a brand new adventure. +Based on the Doom II engine, SRB2's system requirements +are very low, even the oldest computers can play it at a +decent speed.</long_description> +</app> diff --git a/src/sdl2/SRB2XBOX/Makefile.cfg b/src/sdl2/SRB2XBOX/Makefile.cfg new file mode 100644 index 000000000..56966d438 --- /dev/null +++ b/src/sdl2/SRB2XBOX/Makefile.cfg @@ -0,0 +1,44 @@ +# +# Makefile.cfg for SRB2/XBOX +# + +# +#hmmm, the XBOX +# + + NOHW=1 #No working OpenGL right now + NOHS=1 #No HWSound right now + NOASM=1 #No Fast code + NONET=1 #No network code + NOMD5=1 #No Slow MD5 + NOPNG=1 #No Screenshot + #SDLMAIN=1 #SDLMain! + +ifndef OPENXDK + OPENXDK=/usr/local/openxdk +endif + + CXBE=$(OPENXDK)/bin/cxbe + +ifdef ECHO + CXBE:=@$(CXBE) +endif + +ifndef NOHW + OPTS+=-DMINI_GL_COMPATIBILITY +endif + + BUILTLM=-fno-builtin + CFLAGS+=-D_XBOX -std=gnu99 -ffreestanding $(BUILTLM) -fno-exceptions + CFLAGS+=-I$(OPENXDK)/i386-pc-xbox/include -I$(OPENXDK)/include + OPTS+=-nostdlib -mno-cygwin -march=i386 + LDFLAGS+=-nostdlib -Wl,--file-alignment,0x20 -Wl,--section-alignment,0x20 -shared -Wl,--entry,_WinMainCRTStartup -Wl,--strip-all -L$(OPENXDK)/i386-pc-xbox/lib -L$(OPENXDK)/lib + LIBS=-lg -lc -lm + SDL_CFLAGS?=-I$(OPENXDK)/include/SDL + SDL_LDFLAGS?=-lSDL -lopenxdk -lhal -lc -lhal -lusb -lhal -lc -lxboxkrnl + + i_system_o+=$(OBJDIR)/xboxhelp.o + + # name of the exefile + EXENAME?=SRB2XBOX.EXE + BINNAME?=default.xbe diff --git a/src/sdl2/SRB2XBOX/xboxhelp.c b/src/sdl2/SRB2XBOX/xboxhelp.c new file mode 100644 index 000000000..9de01712f --- /dev/null +++ b/src/sdl2/SRB2XBOX/xboxhelp.c @@ -0,0 +1,91 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2004 by Sonic Team Jr. +// +// 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. +// +// DESCRIPTION: +// stub and replacement "ANSI" C functions for use under OpenXDK +// +//----------------------------------------------------------------------------- + +#include "../../doomdef.h" +#include "xboxhelp.h" +#ifdef __GNUC__ +#include <unistd.h> +#else +#include <stdlib.h> +#endif + +char *getcwd(char *_buf, size_t _size ) +{ + (void)_buf; + (void)_size; + return _buf; +} + +#ifdef _MSC_VER +int mkdir(const char *path) +{ + (void)path; + return 0; +} +#elif 0 //__GNUC__? +int mkdir(const char *path, mode_t _mode) +{ + (void)path; + (void)_mode; + return 0; +} +#endif + +int chdir (const char *__path ) +{ + (void)__path; + return 0; +} + +time_t time(time_t *T) +{ + long returntime = 0; + (void)T; +/* + SYSTEMTIME st; + FILETIME stft; + INT64 ftli; + if (!T) return returntime; + GetSystemTime(&st); + SystemTimeToFileTime(&st,&stft); + CopyMemory(&ftli,&stft,sizeof (LARGE_INTEGER)); + returntime = (long)ftli; + *T = returntime; +*/ + return returntime; +} + +#ifdef _MSC_VER +#include <RtcApi.h> +void __cdecl _RTC_Initialize(void) +{ +} +char *getenv(const char *__env) +{ + __env = NULL; + return NULL; +} + +int putenv(const char *__env) +{ + __env = NULL; + return 0; +} +#endif diff --git a/src/sdl2/SRB2XBOX/xboxhelp.h b/src/sdl2/SRB2XBOX/xboxhelp.h new file mode 100644 index 000000000..97ef0a3be --- /dev/null +++ b/src/sdl2/SRB2XBOX/xboxhelp.h @@ -0,0 +1,6 @@ +#if defined (_MSC_VER) +int access(const char *path, int amode); +char *getcwd(char *_buf, size_t _size ); +int mkdir(const char *path); +int chdir (const char *__path ); +#endif diff --git a/src/sdl2/Srb2SDL-vc10.vcxproj b/src/sdl2/Srb2SDL-vc10.vcxproj new file mode 100644 index 000000000..192f19156 --- /dev/null +++ b/src/sdl2/Srb2SDL-vc10.vcxproj @@ -0,0 +1,1464 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>Srb2SDL</ProjectName> + <ProjectGuid>{61BA7D3C-F77D-4D31-B718-1177FE482CF2}</ProjectGuid> + <RootNamespace>Srb2SDL</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\bin\VC10\$(Platform)\$(Configuration)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\objs\VC10\$(Platform)\$(Configuration)\SDL\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\..\..\bin\VC10\$(Platform)\$(Configuration)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\..\..\objs\VC10\$(Platform)\$(Configuration)\SDL\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\bin\VC10\$(Platform)\$(Configuration)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\objs\VC10\$(Platform)\$(Configuration)\SDL\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\..\..\bin\VC10\$(Platform)\$(Configuration)\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\..\..\objs\VC10\$(Platform)\$(Configuration)\SDL\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SDL12_PREFIX)\include;$(SDL12_MIXER_PREFIX)\include;$(FMOD3_PREFIX)api\inc;$(IncludePath)</IncludePath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SDL12_PREFIX)\include;$(SDL12_MIXER_PREFIX)\include;$(FMOD3_PREFIX)api\inc;$(IncludePath)</IncludePath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SDL12_PREFIX)\include;$(SDL12_MIXER_PREFIX)\include;$(FMOD3_PREFIX)api\inc;$(IncludePath)</IncludePath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SDL12_PREFIX)\include;$(SDL12_MIXER_PREFIX)\include;$(FMOD3_PREFIX)api\inc;$(IncludePath)</IncludePath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SDL12_PREFIX)\lib;$(SDL12_MIXER_PREFIX)\lib;$(LibraryPath)</LibraryPath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SDL12_PREFIX)\lib;$(SDL12_MIXER_PREFIX)\lib;$(LibraryPath)</LibraryPath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SDL12_PREFIX)\lib\x64;$(SDL12_MIXER_PREFIX)\lib\x64;$(LibraryPath)</LibraryPath> + <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SDL12_PREFIX)\lib\x64;$(SDL12_MIXER_PREFIX)\lib\x64;$(LibraryPath)</LibraryPath> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <PreBuildEvent> + <Message>Getting revision number from the SCM system</Message> + <Command>"$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."</Command> + </PreBuildEvent> + <Midl> + <TypeLibraryName>.\..\..\bin\VC10\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>$(ProjectDir)..\..\libs\libpng-src;$(ProjectDir)..\..\libs\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_DEBUG;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;USEASM;HAVE_PNG;COMPVERSION;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ProgramDataBaseFileName>$(IntDir)Srb2SDL.pdb</ProgramDataBaseFileName> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level4</WarningLevel> + <TreatWarningAsError>true</TreatWarningAsError> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <CompileAs>CompileAsC</CompileAs> + <DisableSpecificWarnings>4121;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>SDL.lib;SDL_mixer.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)srb2sdl.exe</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(OutDir)srb2sdl.pdb</ProgramDatabaseFile> + <SubSystem>Console</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + <OutputFile>$(OutDir)Srb2sdl.bsc</OutputFile> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <PreBuildEvent> + <Message>Getting revision number from the SCM system</Message> + <Command>"$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."</Command> + </PreBuildEvent> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + <TypeLibraryName>.\..\..\bin\VC10\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>$(ProjectDir)..\..\libs\libpng-src;$(ProjectDir)..\..\libs\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_DEBUG;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;HAVE_PNG;COMPVERSION;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ProgramDataBaseFileName>$(IntDir)Srb2SDL.pdb</ProgramDataBaseFileName> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level4</WarningLevel> + <TreatWarningAsError>true</TreatWarningAsError> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>CompileAsC</CompileAs> + <DisableSpecificWarnings>4121;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>SDL.lib;SDL_mixer.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)srb2sdl.exe</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(OutDir)srb2sdl.pdb</ProgramDatabaseFile> + <SubSystem>Console</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX64</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + <OutputFile>$(OutDir)Srb2sdl.bsc</OutputFile> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <PreBuildEvent> + <Message>Getting revision number from the SCM system</Message> + <Command>"$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."</Command> + </PreBuildEvent> + <Midl> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>Win32</TargetEnvironment> + <TypeLibraryName>.\..\..\bin\VC10\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions> + <Optimization>Disabled</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <IntrinsicFunctions>true</IntrinsicFunctions> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <OmitFramePointers>true</OmitFramePointers> + <AdditionalIncludeDirectories>$(ProjectDir)..\..\libs\libpng-src;$(ProjectDir)..\..\libs\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>NDEBUG;SDLMAIN;NO_STDIO_REDIRECT;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;USEASM;HAVE_PNG;COMPVERSION;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <PrecompiledHeaderOutputFile>.\..\..\objs\VC10\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.pch</PrecompiledHeaderOutputFile> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ProgramDataBaseFileName>$(IntDir)Srb2SDL.pdb</ProgramDataBaseFileName> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>CompileAsC</CompileAs> + <DisableSpecificWarnings>4121;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>SDL.lib;SDL_mixer.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)srb2sdl.exe</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(OutDir)srb2sdl.pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX86</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + <OutputFile>$(OutDir)Srb2sdl.bsc</OutputFile> + </Bscmake> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <PreBuildEvent> + <Message>Getting revision number from the SCM system</Message> + <Command>"$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."</Command> + </PreBuildEvent> + <Midl> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>X64</TargetEnvironment> + <TypeLibraryName>.\..\..\bin\VC10\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb</TypeLibraryName> + <HeaderFileName> + </HeaderFileName> + </Midl> + <ClCompile> + <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions> + <Optimization>Disabled</Optimization> + <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> + <IntrinsicFunctions>true</IntrinsicFunctions> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <OmitFramePointers>true</OmitFramePointers> + <AdditionalIncludeDirectories>$(ProjectDir)..\..\libs\libpng-src;$(ProjectDir)..\..\libs\zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>NDEBUG;SDLMAIN;NO_STDIO_REDIRECT;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;HAVE_PNG;COMPVERSION;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <PrecompiledHeaderOutputFile>.\..\..\objs\VC10\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.pch</PrecompiledHeaderOutputFile> + <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation> + <ProgramDataBaseFileName>$(IntDir)Srb2SDL.pdb</ProgramDataBaseFileName> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>CompileAsC</CompileAs> + <DisableSpecificWarnings>4121;%(DisableSpecificWarnings)</DisableSpecificWarnings> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + </ResourceCompile> + <Link> + <AdditionalDependencies>SDL.lib;SDL_mixer.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <OutputFile>$(OutDir)srb2sdl.exe</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(OutDir)srb2sdl.pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <TargetMachine>MachineX64</TargetMachine> + </Link> + <Bscmake> + <SuppressStartupBanner>true</SuppressStartupBanner> + <OutputFile>$(OutDir)Srb2sdl.bsc</OutputFile> + </Bscmake> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\blua\lapi.c" /> + <ClCompile Include="..\blua\lauxlib.c" /> + <ClCompile Include="..\blua\lbaselib.c" /> + <ClCompile Include="..\blua\lcode.c" /> + <ClCompile Include="..\blua\ldebug.c" /> + <ClCompile Include="..\blua\ldo.c" /> + <ClCompile Include="..\blua\ldump.c" /> + <ClCompile Include="..\blua\lfunc.c" /> + <ClCompile Include="..\blua\lgc.c" /> + <ClCompile Include="..\blua\linit.c" /> + <ClCompile Include="..\blua\llex.c" /> + <ClCompile Include="..\blua\lmem.c" /> + <ClCompile Include="..\blua\lobject.c" /> + <ClCompile Include="..\blua\lopcodes.c" /> + <ClCompile Include="..\blua\lparser.c" /> + <ClCompile Include="..\blua\lstate.c" /> + <ClCompile Include="..\blua\lstring.c" /> + <ClCompile Include="..\blua\lstrlib.c" /> + <ClCompile Include="..\blua\ltable.c" /> + <ClCompile Include="..\blua\ltablib.c" /> + <ClCompile Include="..\blua\ltm.c" /> + <ClCompile Include="..\blua\lundump.c" /> + <ClCompile Include="..\blua\lvm.c" /> + <ClCompile Include="..\blua\lzio.c" /> + <ClCompile Include="..\b_bot.c" /> + <ClCompile Include="..\m_cond.c" /> + <ClCompile Include="dosstr.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="endtxt.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\filesrch.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="hwsym_sdl.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="i_cdmus.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="i_main.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="i_net.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="i_sound.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="i_system.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="i_video.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="IMG_xpm.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="ogl_sdl.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\r_opengl\r_opengl.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="SDL_main\SDL_win32_main.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\win32\win_dbg.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="filter\filters.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="filter\hq2x.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="filter\lq2x.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\comptime.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\d_clisrv.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\d_main.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\d_net.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\d_netcmd.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\d_netfil.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\dehacked.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\z_zone.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\f_finale.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\f_wipe.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\g_game.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\g_input.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\am_map.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\command.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\console.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hu_stuff.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\st_stuff.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\y_inter.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw3sound.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw_bsp.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw_cache.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw_draw.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw_light.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw_main.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw_md2.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\hardware\hw_trick.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\i_tcp.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\mserv.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_argv.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_bbox.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_cheat.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_fixed.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_menu.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_misc.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_queue.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\m_random.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\string.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\info.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_ceilng.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_enemy.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_fab.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_floor.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_inter.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_lights.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_map.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_maputl.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_mobj.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_polyobj.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_saveg.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_setup.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_sight.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_spec.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_telept.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_tick.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\p_user.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\tables.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_bsp.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_data.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_draw.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_draw16.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_draw8.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_main.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_plane.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_segs.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_sky.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_splats.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\r_things.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\screen.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\v_video.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\s_sound.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\sounds.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\lzf.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\md5.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <ClCompile Include="..\w_wad.c"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\blua\lapi.h" /> + <ClInclude Include="..\blua\lauxlib.h" /> + <ClInclude Include="..\blua\lcode.h" /> + <ClInclude Include="..\blua\ldebug.h" /> + <ClInclude Include="..\blua\ldo.h" /> + <ClInclude Include="..\blua\lfunc.h" /> + <ClInclude Include="..\blua\lgc.h" /> + <ClInclude Include="..\blua\llex.h" /> + <ClInclude Include="..\blua\llimits.h" /> + <ClInclude Include="..\blua\lmem.h" /> + <ClInclude Include="..\blua\lobject.h" /> + <ClInclude Include="..\blua\lopcodes.h" /> + <ClInclude Include="..\blua\lparser.h" /> + <ClInclude Include="..\blua\lstate.h" /> + <ClInclude Include="..\blua\lstring.h" /> + <ClInclude Include="..\blua\ltable.h" /> + <ClInclude Include="..\blua\ltm.h" /> + <ClInclude Include="..\blua\lua.h" /> + <ClInclude Include="..\blua\luaconf.h" /> + <ClInclude Include="..\blua\lualib.h" /> + <ClInclude Include="..\blua\lundump.h" /> + <ClInclude Include="..\blua\lvm.h" /> + <ClInclude Include="..\blua\lzio.h" /> + <ClInclude Include="..\b_bot.h" /> + <ClInclude Include="..\m_cond.h" /> + <ClInclude Include="endtxt.h" /> + <ClInclude Include="..\filesrch.h" /> + <ClInclude Include="hwsym_sdl.h" /> + <ClInclude Include="ogl_sdl.h" /> + <ClInclude Include="..\hardware\r_opengl\r_opengl.h" /> + <ClInclude Include="sdlmain.h" /> + <ClInclude Include="..\win32\win_dbg.h" /> + <ClInclude Include="..\win32\win_main.h" /> + <ClInclude Include="filter\filters.h" /> + <ClInclude Include="filter\hq2x.h" /> + <ClInclude Include="filter\interp.h" /> + <ClInclude Include="filter\lq2x.h" /> + <ClInclude Include="..\p5prof.h" /> + <ClInclude Include="..\d_clisrv.h" /> + <ClInclude Include="..\d_event.h" /> + <ClInclude Include="..\d_main.h" /> + <ClInclude Include="..\d_net.h" /> + <ClInclude Include="..\d_netcmd.h" /> + <ClInclude Include="..\d_netfil.h" /> + <ClInclude Include="..\d_player.h" /> + <ClInclude Include="..\d_think.h" /> + <ClInclude Include="..\d_ticcmd.h" /> + <ClInclude Include="..\dehacked.h" /> + <ClInclude Include="..\doomdata.h" /> + <ClInclude Include="..\doomdef.h" /> + <ClInclude Include="..\doomstat.h" /> + <ClInclude Include="..\doomtype.h" /> + <ClInclude Include="..\z_zone.h" /> + <ClInclude Include="..\f_finale.h" /> + <ClInclude Include="..\g_game.h" /> + <ClInclude Include="..\g_input.h" /> + <ClInclude Include="..\g_state.h" /> + <ClInclude Include="..\am_map.h" /> + <ClInclude Include="..\command.h" /> + <ClInclude Include="..\console.h" /> + <ClInclude Include="..\hu_stuff.h" /> + <ClInclude Include="..\st_stuff.h" /> + <ClInclude Include="..\y_inter.h" /> + <ClInclude Include="..\hardware\hw3dsdrv.h" /> + <ClInclude Include="..\hardware\hw3sound.h" /> + <ClInclude Include="..\hardware\hw_data.h" /> + <ClInclude Include="..\hardware\hw_defs.h" /> + <ClInclude Include="..\hardware\hw_dll.h" /> + <ClInclude Include="..\hardware\hw_drv.h" /> + <ClInclude Include="..\hardware\hw_glide.h" /> + <ClInclude Include="..\hardware\hw_glob.h" /> + <ClInclude Include="..\hardware\hw_light.h" /> + <ClInclude Include="..\hardware\hw_main.h" /> + <ClInclude Include="..\hardware\hw_md2.h" /> + <ClInclude Include="..\hardware\hws_data.h" /> + <ClInclude Include="..\byteptr.h" /> + <ClInclude Include="..\i_joy.h" /> + <ClInclude Include="..\i_net.h" /> + <ClInclude Include="..\i_sound.h" /> + <ClInclude Include="..\i_system.h" /> + <ClInclude Include="..\i_tcp.h" /> + <ClInclude Include="..\i_video.h" /> + <ClInclude Include="..\keys.h" /> + <ClInclude Include="..\mserv.h" /> + <ClInclude Include="..\m_argv.h" /> + <ClInclude Include="..\m_bbox.h" /> + <ClInclude Include="..\m_cheat.h" /> + <ClInclude Include="..\m_dllist.h" /> + <ClInclude Include="..\m_fixed.h" /> + <ClInclude Include="..\m_menu.h" /> + <ClInclude Include="..\m_misc.h" /> + <ClInclude Include="..\m_queue.h" /> + <ClInclude Include="..\m_random.h" /> + <ClInclude Include="..\m_swap.h" /> + <ClInclude Include="..\info.h" /> + <ClInclude Include="..\p_local.h" /> + <ClInclude Include="..\p_maputl.h" /> + <ClInclude Include="..\p_mobj.h" /> + <ClInclude Include="..\p_polyobj.h" /> + <ClInclude Include="..\p_pspr.h" /> + <ClInclude Include="..\p_saveg.h" /> + <ClInclude Include="..\p_setup.h" /> + <ClInclude Include="..\p_spec.h" /> + <ClInclude Include="..\p_tick.h" /> + <ClInclude Include="..\tables.h" /> + <ClInclude Include="..\r_bsp.h" /> + <ClInclude Include="..\r_data.h" /> + <ClInclude Include="..\r_defs.h" /> + <ClInclude Include="..\r_draw.h" /> + <ClInclude Include="..\r_local.h" /> + <ClInclude Include="..\r_main.h" /> + <ClInclude Include="..\r_plane.h" /> + <ClInclude Include="..\r_segs.h" /> + <ClInclude Include="..\r_sky.h" /> + <ClInclude Include="..\r_splats.h" /> + <ClInclude Include="..\r_state.h" /> + <ClInclude Include="..\r_things.h" /> + <ClInclude Include="..\screen.h" /> + <ClInclude Include="..\v_video.h" /> + <ClInclude Include="..\s_sound.h" /> + <ClInclude Include="..\sounds.h" /> + <ClInclude Include="..\lzf.h" /> + <ClInclude Include="..\md5.h" /> + <ClInclude Include="..\w_wad.h" /> + </ItemGroup> + <ItemGroup> + <None Include="SDL_icon.xpm" /> + <CustomBuild Include="..\tmap.nas"> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="..\tmap_mmx.nas"> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="..\tmap_vc.nas"> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling %(Filename).nas with NASM...</Message> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">nasm -g -o $(IntDir)%(Filename).obj -f win32 "%(FullPath)"</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename).obj;%(Outputs)</Outputs> + </CustomBuild> + <None Include="..\..\doc\copying" /> + <None Include="..\..\doc\faq.txt" /> + <None Include="..\..\readme.txt" /> + <None Include="..\..\doc\source.txt" /> + <None Include="..\win32\Srb2win.ico" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\win32\Srb2win.rc"> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\libs\libpng-src\projects\visualc10\libpng.vcxproj"> + <Project>{72b01aca-7a1a-4f7b-acef-2607299cf052}</Project> + <ReferenceOutputAssembly>false</ReferenceOutputAssembly> + </ProjectReference> + <ProjectReference Include="..\..\libs\zlib\projects\visualc10\zlib.vcxproj"> + <Project>{73a5729c-7323-41d4-ab48-8a03c9f81603}</Project> + <ReferenceOutputAssembly>false</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/src/sdl2/Srb2SDL-vc9.vcproj b/src/sdl2/Srb2SDL-vc9.vcproj new file mode 100644 index 000000000..620202bdf --- /dev/null +++ b/src/sdl2/Srb2SDL-vc9.vcproj @@ -0,0 +1,5845 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="Srb2SDL" + ProjectGUID="{61BA7D3C-F77D-4D31-B718-1177FE482CF2}" + RootNamespace="Srb2SDL" + TargetFrameworkVersion="0" + > + <Platforms> + <Platform + Name="Win32" + /> + <Platform + Name="x64" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory=".\..\..\bin\VC9\$(PlatformName)\$(ConfigurationName)" + IntermediateDirectory=".\..\..\objs\VC9\$(PlatformName)\$(ConfigurationName)\SDL" + ConfigurationType="1" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + Description="Getting revision number from the SCM system" + CommandLine=""$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TypeLibraryName=".\..\..\bin\VC9\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories=""$(ProjectDir)..\..\libs\libpng-src";"$(ProjectDir)..\..\libs\zlib"" + PreprocessorDefinitions="_DEBUG;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;USEASM;HAVE_PNG;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + AssemblerListingLocation="$(IntDir)\" + ProgramDataBaseFileName="$(IntDir)\Srb2SDL.pdb" + BrowseInformation="1" + WarningLevel="4" + WarnAsError="true" + SuppressStartupBanner="true" + DebugInformationFormat="4" + CompileAs="1" + DisableSpecificWarnings="4121" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="SDL.lib SDL_mixer.lib ws2_32.lib" + OutputFile="$(OutDir)\srb2sdl.exe" + LinkIncremental="2" + SuppressStartupBanner="true" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)\srb2sdl.pdb" + SubSystem="1" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile="$(OutDir)\Srb2sdl.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Debug|x64" + OutputDirectory=".\..\..\bin\VC9\$(PlatformName)\$(ConfigurationName)" + IntermediateDirectory=".\..\..\objs\VC9\$(PlatformName)\$(ConfigurationName)\SDL" + ConfigurationType="1" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + Description="Getting revision number from the SCM system" + CommandLine=""$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + TargetEnvironment="3" + TypeLibraryName=".\..\..\bin\VC9\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories=""$(ProjectDir)..\..\libs\libpng-src";"$(ProjectDir)..\..\libs\zlib"" + PreprocessorDefinitions="_DEBUG;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;HAVE_PNG;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + AssemblerListingLocation="$(IntDir)\" + ProgramDataBaseFileName="$(IntDir)\Srb2SDL.pdb" + BrowseInformation="1" + WarningLevel="4" + WarnAsError="true" + SuppressStartupBanner="true" + DebugInformationFormat="3" + CompileAs="1" + DisableSpecificWarnings="4121" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="_DEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="SDL.lib SDL_mixer.lib ws2_32.lib" + OutputFile="$(OutDir)\srb2sdl.exe" + LinkIncremental="2" + SuppressStartupBanner="true" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)\srb2sdl.pdb" + SubSystem="1" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="17" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile="$(OutDir)\Srb2sdl.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory=".\..\..\bin\VC9\$(PlatformName)\$(ConfigurationName)" + IntermediateDirectory=".\..\..\objs\VC9\$(PlatformName)\$(ConfigurationName)\SDL" + ConfigurationType="1" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + Description="Getting revision number from the SCM system" + CommandLine=""$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="1" + TypeLibraryName=".\..\..\bin\VC9\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/MP" + Optimization="4" + InlineFunctionExpansion="1" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + OmitFramePointers="true" + AdditionalIncludeDirectories=""$(ProjectDir)..\..\libs\libpng-src";"$(ProjectDir)..\..\libs\zlib"" + PreprocessorDefinitions="NDEBUG;SDLMAIN;NO_STDIO_REDIRECT;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;USEASM;HAVE_PNG;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE" + StringPooling="true" + RuntimeLibrary="0" + PrecompiledHeaderFile=".\..\..\objs\VC9\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.pch" + AssemblerListingLocation="$(IntDir)\" + ProgramDataBaseFileName="$(IntDir)\Srb2SDL.pdb" + BrowseInformation="1" + WarningLevel="3" + SuppressStartupBanner="true" + DebugInformationFormat="3" + CompileAs="1" + DisableSpecificWarnings="4121" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="SDL.lib SDL_mixer.lib ws2_32.lib" + OutputFile="$(OutDir)\srb2sdl.exe" + LinkIncremental="1" + SuppressStartupBanner="true" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)\srb2sdl.pdb" + SubSystem="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile="$(OutDir)\Srb2sdl.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|x64" + OutputDirectory=".\..\..\bin\VC9\$(PlatformName)\$(ConfigurationName)" + IntermediateDirectory=".\..\..\objs\VC9\$(PlatformName)\$(ConfigurationName)\SDL" + ConfigurationType="1" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops" + UseOfMFC="0" + ATLMinimizesCRunTimeLibraryUsage="false" + > + <Tool + Name="VCPreBuildEventTool" + Description="Getting revision number from the SCM system" + CommandLine=""$(ProjectDir)..\..\comptime.bat" "$(ProjectDir).."" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + PreprocessorDefinitions="NDEBUG" + MkTypLibCompatible="true" + SuppressStartupBanner="true" + TargetEnvironment="3" + TypeLibraryName=".\..\..\bin\VC9\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.tlb" + HeaderFileName="" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/MP" + Optimization="4" + InlineFunctionExpansion="1" + EnableIntrinsicFunctions="true" + FavorSizeOrSpeed="1" + OmitFramePointers="true" + AdditionalIncludeDirectories=""$(ProjectDir)..\..\libs\libpng-src";"$(ProjectDir)..\..\libs\zlib"" + PreprocessorDefinitions="NDEBUG;SDLMAIN;NO_STDIO_REDIRECT;USE_WGL_SWAP;DIRECTFULLSCREEN;SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;HAVE_PNG;HAVE_BLUA;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE" + StringPooling="true" + RuntimeLibrary="0" + PrecompiledHeaderFile=".\..\..\objs\VC9\$(Platform)\$(Configuration)\SDL\Srb2SDL-vc9.pch" + AssemblerListingLocation="$(IntDir)\" + ProgramDataBaseFileName="$(IntDir)\Srb2SDL.pdb" + BrowseInformation="1" + WarningLevel="3" + SuppressStartupBanner="true" + DebugInformationFormat="3" + CompileAs="1" + DisableSpecificWarnings="4121" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="NDEBUG" + Culture="1033" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="SDL.lib SDL_mixer.lib ws2_32.lib" + OutputFile="$(OutDir)\srb2sdl.exe" + LinkIncremental="1" + SuppressStartupBanner="true" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)\srb2sdl.pdb" + SubSystem="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="17" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + SuppressStartupBanner="true" + OutputFile="$(OutDir)\Srb2sdl.bsc" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="SDLapp" + > + <File + RelativePath="dosstr.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="endtxt.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="endtxt.h" + > + </File> + <File + RelativePath="..\filesrch.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\filesrch.h" + > + </File> + <File + RelativePath="hwsym_sdl.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="hwsym_sdl.h" + > + </File> + <File + RelativePath="i_cdmus.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="i_main.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="i_net.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="i_sound.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="i_system.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="i_video.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="IMG_xpm.c" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="ogl_sdl.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="ogl_sdl.h" + > + </File> + <File + RelativePath="..\hardware\r_opengl\r_opengl.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\r_opengl\r_opengl.h" + > + </File> + <File + RelativePath="SDL_icon.xpm" + > + </File> + <File + RelativePath="SDL_main\SDL_win32_main.c" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="sdlmain.h" + > + </File> + <File + RelativePath="..\win32\Srb2win.rc" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + AdditionalIncludeDirectories="\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + AdditionalIncludeDirectories="\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + AdditionalIncludeDirectories="\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCResourceCompilerTool" + PreprocessorDefinitions="" + AdditionalIncludeDirectories="\Users\alam\svn\srb2mods\SRB2\branches\ALAM\src\win32" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\win32\win_dbg.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\win32\win_dbg.h" + > + </File> + <File + RelativePath="..\win32\win_main.h" + > + </File> + <Filter + Name="filter" + > + <File + RelativePath="filter\filters.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="filter\filters.h" + > + </File> + <File + RelativePath="filter\hq2x.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="filter\hq2x.h" + > + </File> + <File + RelativePath="filter\interp.h" + > + </File> + <File + RelativePath="filter\lq2x.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="filter\lq2x.h" + > + </File> + </Filter> + </Filter> + <Filter + Name="A_Asm" + > + <File + RelativePath="..\p5prof.h" + > + </File> + <File + RelativePath="..\tmap.nas" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\tmap_mmx.nas" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\tmap_vc.nas" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + Description="Compiling $(InputName).nas with NASM..." + CommandLine="nasm -g -o $(IntDir)/$(InputName).obj -f win32 "$(InputPath)"
" + Outputs="$(IntDir)/$(InputName).obj" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="D_Doom" + > + <File + RelativePath="..\comptime.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\d_clisrv.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\d_clisrv.h" + > + </File> + <File + RelativePath="..\d_event.h" + > + </File> + <File + RelativePath="..\d_main.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\d_main.h" + > + </File> + <File + RelativePath="..\d_net.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\d_net.h" + > + </File> + <File + RelativePath="..\d_netcmd.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\d_netcmd.h" + > + </File> + <File + RelativePath="..\d_netfil.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\d_netfil.h" + > + </File> + <File + RelativePath="..\d_player.h" + > + </File> + <File + RelativePath="..\d_think.h" + > + </File> + <File + RelativePath="..\d_ticcmd.h" + > + </File> + <File + RelativePath="..\dehacked.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\dehacked.h" + > + </File> + <File + RelativePath="..\doomdata.h" + > + </File> + <File + RelativePath="..\doomdef.h" + > + </File> + <File + RelativePath="..\doomstat.h" + > + </File> + <File + RelativePath="..\doomtype.h" + > + </File> + <File + RelativePath="..\z_zone.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\z_zone.h" + > + </File> + </Filter> + <Filter + Name="F_Frame" + > + <File + RelativePath="..\f_finale.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\f_finale.h" + > + </File> + <File + RelativePath="..\f_wipe.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="G_Game" + > + <File + RelativePath="..\g_game.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\g_game.h" + > + </File> + <File + RelativePath="..\g_input.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\g_input.h" + > + </File> + <File + RelativePath="..\g_state.h" + > + </File> + </Filter> + <Filter + Name="H_Hud" + > + <File + RelativePath="..\am_map.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\am_map.h" + > + </File> + <File + RelativePath="..\command.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\command.h" + > + </File> + <File + RelativePath="..\console.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\console.h" + > + </File> + <File + RelativePath="..\hu_stuff.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hu_stuff.h" + > + </File> + <File + RelativePath="..\st_stuff.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\st_stuff.h" + > + </File> + <File + RelativePath="..\y_inter.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\y_inter.h" + > + </File> + </Filter> + <Filter + Name="Hw_Hardware" + > + <File + RelativePath="..\hardware\hw3dsdrv.h" + > + </File> + <File + RelativePath="..\hardware\hw3sound.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hw3sound.h" + > + </File> + <File + RelativePath="..\hardware\hw_bsp.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hw_cache.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hw_data.h" + > + </File> + <File + RelativePath="..\hardware\hw_defs.h" + > + </File> + <File + RelativePath="..\hardware\hw_dll.h" + > + </File> + <File + RelativePath="..\hardware\hw_draw.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hw_drv.h" + > + </File> + <File + RelativePath="..\hardware\hw_glide.h" + > + </File> + <File + RelativePath="..\hardware\hw_glob.h" + > + </File> + <File + RelativePath="..\hardware\hw_light.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hw_light.h" + > + </File> + <File + RelativePath="..\hardware\hw_main.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hw_main.h" + > + </File> + <File + RelativePath="..\hardware\hw_md2.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hw_md2.h" + > + </File> + <File + RelativePath="..\hardware\hw_trick.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\hardware\hws_data.h" + > + </File> + </Filter> + <Filter + Name="I_Interface" + > + <File + RelativePath="..\byteptr.h" + > + </File> + <File + RelativePath="..\i_addrinfo.c" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\i_addrinfo.h" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\i_joy.h" + > + </File> + <File + RelativePath="..\i_net.h" + > + </File> + <File + RelativePath="..\i_sound.h" + > + </File> + <File + RelativePath="..\i_system.h" + > + </File> + <File + RelativePath="..\i_tcp.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\i_tcp.h" + > + </File> + <File + RelativePath="..\i_video.h" + > + </File> + <File + RelativePath="..\keys.h" + > + </File> + <File + RelativePath="..\mserv.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\mserv.h" + > + </File> + </Filter> + <Filter + Name="M_Misc" + > + <File + RelativePath="..\m_argv.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_argv.h" + > + </File> + <File + RelativePath="..\m_bbox.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_bbox.h" + > + </File> + <File + RelativePath="..\m_cheat.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_cheat.h" + > + </File> + <File + RelativePath="..\m_cond.c" + > + </File> + <File + RelativePath="..\m_cond.h" + > + </File> + <File + RelativePath="..\m_dllist.h" + > + </File> + <File + RelativePath="..\m_fixed.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_fixed.h" + > + </File> + <File + RelativePath="..\m_menu.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_menu.h" + > + </File> + <File + RelativePath="..\m_misc.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_misc.h" + > + </File> + <File + RelativePath="..\m_queue.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_queue.h" + > + </File> + <File + RelativePath="..\m_random.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\m_random.h" + > + </File> + <File + RelativePath="..\m_swap.h" + > + </File> + <File + RelativePath="..\string.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="P_Play" + > + <File + RelativePath="..\info.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\info.h" + > + </File> + <File + RelativePath="..\p_ceilng.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_enemy.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_fab.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_floor.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_inter.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_lights.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_local.h" + > + </File> + <File + RelativePath="..\p_map.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_maputl.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_maputl.h" + > + </File> + <File + RelativePath="..\p_mobj.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_mobj.h" + > + </File> + <File + RelativePath="..\p_polyobj.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_polyobj.h" + > + </File> + <File + RelativePath="..\p_pspr.h" + > + </File> + <File + RelativePath="..\p_saveg.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_saveg.h" + > + </File> + <File + RelativePath="..\p_setup.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_setup.h" + > + </File> + <File + RelativePath="..\p_sight.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_spec.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_spec.h" + > + </File> + <File + RelativePath="..\p_telept.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_tick.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\p_tick.h" + > + </File> + <File + RelativePath="..\p_user.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\tables.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\tables.h" + > + </File> + </Filter> + <Filter + Name="R_Rend" + > + <File + RelativePath="..\r_bsp.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_bsp.h" + > + </File> + <File + RelativePath="..\r_data.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_data.h" + > + </File> + <File + RelativePath="..\r_defs.h" + > + </File> + <File + RelativePath="..\r_draw.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_draw.h" + > + </File> + <File + RelativePath="..\r_draw16.c" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_draw8.c" + > + <FileConfiguration + Name="Debug|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + ExcludedFromBuild="true" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_local.h" + > + </File> + <File + RelativePath="..\r_main.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_main.h" + > + </File> + <File + RelativePath="..\r_plane.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_plane.h" + > + </File> + <File + RelativePath="..\r_segs.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_segs.h" + > + </File> + <File + RelativePath="..\r_sky.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_sky.h" + > + </File> + <File + RelativePath="..\r_splats.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_splats.h" + > + </File> + <File + RelativePath="..\r_state.h" + > + </File> + <File + RelativePath="..\r_things.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\r_things.h" + > + </File> + <File + RelativePath="..\screen.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\screen.h" + > + </File> + <File + RelativePath="..\v_video.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\v_video.h" + > + </File> + </Filter> + <Filter + Name="S_Sounds" + > + <File + RelativePath="..\s_sound.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\s_sound.h" + > + </File> + <File + RelativePath="..\sounds.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\sounds.h" + > + </File> + </Filter> + <Filter + Name="W_Wad" + > + <File + RelativePath="..\lzf.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\lzf.h" + > + </File> + <File + RelativePath="..\md5.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\md5.h" + > + </File> + <File + RelativePath="..\w_wad.c" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\w_wad.h" + > + </File> + </Filter> + <Filter + Name="Docs" + > + <File + RelativePath="..\..\doc\copying" + > + </File> + <File + RelativePath="..\..\doc\faq.txt" + > + </File> + <File + RelativePath="..\..\readme.txt" + > + </File> + <File + RelativePath="..\..\doc\source.txt" + > + </File> + </Filter> + <Filter + Name="B_Bot" + > + <File + RelativePath="..\b_bot.c" + > + </File> + <File + RelativePath="..\b_bot.h" + > + </File> + </Filter> + <Filter + Name="LUA" + > + <File + RelativePath="..\fastcmp.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\lua_baselib.c" + > + </File> + <File + RelativePath="..\lua_consolelib.c" + > + </File> + <File + RelativePath="..\lua_hook.h" + > + </File> + <File + RelativePath="..\lua_hooklib.c" + > + </File> + <File + RelativePath="..\lua_infolib.c" + > + </File> + <File + RelativePath="..\lua_libs.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\lua_maplib.c" + > + </File> + <File + RelativePath="..\lua_mathlib.c" + > + </File> + <File + RelativePath="..\lua_mobjlib.c" + > + </File> + <File + RelativePath="..\lua_playerlib.c" + > + </File> + <File + RelativePath="..\lua_script.c" + > + </File> + <File + RelativePath="..\lua_script.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\lua_thinkerlib.c" + > + </File> + </Filter> + <Filter + Name="BLUA" + > + <File + RelativePath="..\blua\lapi.c" + > + </File> + <File + RelativePath="..\blua\lapi.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lauxlib.c" + > + </File> + <File + RelativePath="..\blua\lauxlib.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lbaselib.c" + > + </File> + <File + RelativePath="..\blua\lcode.c" + > + </File> + <File + RelativePath="..\blua\lcode.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\ldebug.c" + > + </File> + <File + RelativePath="..\blua\ldebug.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\ldo.c" + > + </File> + <File + RelativePath="..\blua\ldo.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\ldump.c" + > + </File> + <File + RelativePath="..\blua\lfunc.c" + > + </File> + <File + RelativePath="..\blua\lfunc.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lgc.c" + > + </File> + <File + RelativePath="..\blua\lgc.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\linit.c" + > + </File> + <File + RelativePath="..\blua\llex.c" + > + </File> + <File + RelativePath="..\blua\llex.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\llimits.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lmem.c" + > + </File> + <File + RelativePath="..\blua\lmem.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lobject.c" + > + </File> + <File + RelativePath="..\blua\lobject.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lopcodes.c" + > + </File> + <File + RelativePath="..\blua\lopcodes.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lparser.c" + > + </File> + <File + RelativePath="..\blua\lparser.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lstate.c" + > + </File> + <File + RelativePath="..\blua\lstate.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lstring.c" + > + </File> + <File + RelativePath="..\blua\lstring.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lstrlib.c" + > + </File> + <File + RelativePath="..\blua\ltable.c" + > + </File> + <File + RelativePath="..\blua\ltable.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\ltablib.c" + > + </File> + <File + RelativePath="..\blua\ltm.c" + > + </File> + <File + RelativePath="..\blua\ltm.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lua.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\luaconf.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lualib.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lundump.c" + > + </File> + <File + RelativePath="..\blua\lundump.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lvm.c" + > + </File> + <File + RelativePath="..\blua\lvm.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + <File + RelativePath="..\blua\lzio.c" + > + </File> + <File + RelativePath="..\blua\lzio.h" + > + <FileConfiguration + Name="Debug|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Debug|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + <FileConfiguration + Name="Release|x64" + > + <Tool + Name="VCCustomBuildTool" + /> + </FileConfiguration> + </File> + </Filter> + <File + RelativePath="..\win32\Srb2win.ico" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/src/sdl2/Srb2SDL.dsp b/src/sdl2/Srb2SDL.dsp new file mode 100644 index 000000000..02c3b2701 --- /dev/null +++ b/src/sdl2/Srb2SDL.dsp @@ -0,0 +1,1057 @@ +# Microsoft Developer Studio Project File - Name="Srb2SDL" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Srb2SDL - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Srb2SDL.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Srb2SDL.mak" CFG="Srb2SDL - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Srb2SDL - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Srb2SDL - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Srb2SDL - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\bin\VC\Release\SDL" +# PROP Intermediate_Dir "..\..\objs\VC\Release\SDL" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /G5 /W3 /GX /Zi /Ot /Og /Oi /Op /Oy /Ob1 /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "NDEBUG" /D "SDLMAIN" /D "NO_STDIO_REDIRECT" /D "USE_WGL_SWAP" /D "DIRECTFULLSCREEN" /D "SDL" /D "HWRENDER" /D "HW3SOUND" /D "HAVE_FILTER" /D "HAVE_MIXER" /D "USEASM" /D "HAVE_PNG" /FR /FD /GF /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +# SUBTRACT RSC /x +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo /o"..\..\objs\SDL\Release\SRB2.bsc" +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 SDL.lib SDL_mixer.lib user32.lib advapi32.lib ws2_32.lib /nologo /subsystem:windows /pdb:"C:\srb2demo2\srb2sdl.pdb" /debug /machine:I386 /out:"C:\srb2demo2\srb2sdl.exe" +# SUBTRACT LINK32 /profile /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "Srb2SDL - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\bin\VC\Debug\SDL" +# PROP Intermediate_Dir "..\..\objs\VC\Debug\SDL" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +MTL=midl.exe +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /G6 /W4 /WX /Gm /GX /ZI /Od /Op /I "..\..\libs\libpng-src" /I "..\..\libs\zlib" /D "_DEBUG" /D "USE_WGL_SWAP" /D "DIRECTFULLSCREEN" /D "SDL" /D "HWRENDER" /D "HW3SOUND" /D "HAVE_FILTER" /D "HAVE_MIXER" /D "USEASM" /D "HAVE_PNG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +# SUBTRACT RSC /x +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo /o"..\..\objs\SDL\Debug\SRB2.bsc" +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 SDL.lib SDL_mixer.lib user32.lib advapi32.lib ws2_32.lib /nologo /subsystem:console /pdb:"C:\srb2demo2\srb2sdldebug.pdb" /debug /machine:I386 /out:"C:\srb2demo2\srb2sdldebug.exe" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "Srb2SDL - Win32 Release" +# Name "Srb2SDL - Win32 Debug" +# Begin Group "SDLapp" + +# PROP Default_Filter "" +# Begin Group "filter" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\filter\filters.c +# End Source File +# Begin Source File + +SOURCE=.\filter\filters.h +# End Source File +# Begin Source File + +SOURCE=.\filter\hq2x.c +# End Source File +# Begin Source File + +SOURCE=.\filter\hq2x.h +# End Source File +# Begin Source File + +SOURCE=.\filter\interp.h +# End Source File +# Begin Source File + +SOURCE=.\filter\lq2x.c +# End Source File +# Begin Source File + +SOURCE=.\filter\lq2x.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\dosstr.c +# End Source File +# Begin Source File + +SOURCE=.\endtxt.c +# End Source File +# Begin Source File + +SOURCE=.\endtxt.h +# End Source File +# Begin Source File + +SOURCE=..\filesrch.c +# End Source File +# Begin Source File + +SOURCE=..\filesrch.h +# End Source File +# Begin Source File + +SOURCE=.\hwsym_sdl.c +# End Source File +# Begin Source File + +SOURCE=.\hwsym_sdl.h +# End Source File +# Begin Source File + +SOURCE=.\i_cdmus.c +# End Source File +# Begin Source File + +SOURCE=.\i_main.c +# End Source File +# Begin Source File + +SOURCE=.\i_net.c +# End Source File +# Begin Source File + +SOURCE=.\i_sound.c +# End Source File +# Begin Source File + +SOURCE=.\i_system.c +# End Source File +# Begin Source File + +SOURCE=.\i_video.c +# End Source File +# Begin Source File + +SOURCE=.\IMG_xpm.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\ogl_sdl.c +# End Source File +# Begin Source File + +SOURCE=.\ogl_sdl.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\r_opengl\r_opengl.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\r_opengl\r_opengl.h +# End Source File +# Begin Source File + +SOURCE=.\SDL_icon.xpm +# End Source File +# Begin Source File + +SOURCE=.\SDL_main\SDL_win32_main.c + +!IF "$(CFG)" == "Srb2SDL - Win32 Release" + +!ELSEIF "$(CFG)" == "Srb2SDL - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\sdlmain.h +# End Source File +# Begin Source File + +SOURCE=..\win32\Srb2win.rc +# End Source File +# Begin Source File + +SOURCE=..\win32\win_dbg.c +# End Source File +# Begin Source File + +SOURCE=..\win32\win_dbg.h +# End Source File +# Begin Source File + +SOURCE=..\win32\win_main.h +# End Source File +# End Group +# Begin Group "A_Asm" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\p5prof.h +# End Source File +# Begin Source File + +SOURCE=..\tmap.nas + +!IF "$(CFG)" == "Srb2SDL - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Compiling $(InputName).nas with NASM... +IntDir=.\..\..\objs\VC\Release\SDL +InputPath=..\tmap.nas +InputName=tmap + +"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "Srb2SDL - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Compiling $(InputName).nas with NASM... +IntDir=.\..\..\objs\VC\Debug\SDL +InputPath=..\tmap.nas +InputName=tmap + +"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\tmap_mmx.nas + +!IF "$(CFG)" == "Srb2SDL - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Compiling $(InputName).nas with NASM... +IntDir=.\..\..\objs\VC\Release\SDL +InputPath=..\tmap_mmx.nas +InputName=tmap_mmx + +"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "Srb2SDL - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Compiling $(InputName).nas with NASM... + +IntDir=.\..\..\objs\VC\Debug\SDL +InputPath=..\tmap_mmx.nas +InputName=tmap_mmx + +"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\tmap_vc.nas + +!IF "$(CFG)" == "Srb2SDL - Win32 Release" + +# Begin Custom Build - Compiling $(InputName).nas with NASM... +IntDir=.\..\..\objs\VC\Release\SDL +InputPath=..\tmap_vc.nas +InputName=tmap_vc + +"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) + +# End Custom Build + +!ELSEIF "$(CFG)" == "Srb2SDL - Win32 Debug" + +# Begin Custom Build - Compiling $(InputName).nas with NASM... +IntDir=.\..\..\objs\VC\Debug\SDL +InputPath=..\tmap_vc.nas +InputName=tmap_vc + +"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + nasm -g -o $(IntDir)/$(InputName).obj -f win32 $(InputPath) + +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# Begin Group "D_Doom" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\comptime.c +# End Source File +# Begin Source File + +SOURCE=..\d_clisrv.c +# End Source File +# Begin Source File + +SOURCE=..\d_clisrv.h +# End Source File +# Begin Source File + +SOURCE=..\d_event.h +# End Source File +# Begin Source File + +SOURCE=..\d_main.c +# End Source File +# Begin Source File + +SOURCE=..\d_main.h +# End Source File +# Begin Source File + +SOURCE=..\d_net.c +# End Source File +# Begin Source File + +SOURCE=..\d_net.h +# End Source File +# Begin Source File + +SOURCE=..\d_netcmd.c +# End Source File +# Begin Source File + +SOURCE=..\d_netcmd.h +# End Source File +# Begin Source File + +SOURCE=..\d_netfil.c +# End Source File +# Begin Source File + +SOURCE=..\d_netfil.h +# End Source File +# Begin Source File + +SOURCE=..\d_player.h +# End Source File +# Begin Source File + +SOURCE=..\d_think.h +# End Source File +# Begin Source File + +SOURCE=..\d_ticcmd.h +# End Source File +# Begin Source File + +SOURCE=..\dehacked.c +# End Source File +# Begin Source File + +SOURCE=..\dehacked.h +# End Source File +# Begin Source File + +SOURCE=..\doomdata.h +# End Source File +# Begin Source File + +SOURCE=..\doomdef.h +# End Source File +# Begin Source File + +SOURCE=..\doomstat.h +# End Source File +# Begin Source File + +SOURCE=..\doomtype.h +# End Source File +# Begin Source File + +SOURCE=..\z_zone.c +# End Source File +# Begin Source File + +SOURCE=..\z_zone.h +# End Source File +# End Group +# Begin Group "F_Frame" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\f_finale.c +# End Source File +# Begin Source File + +SOURCE=..\f_finale.h +# End Source File +# Begin Source File + +SOURCE=..\f_wipe.c +# End Source File +# End Group +# Begin Group "G_Game" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\g_game.c +# End Source File +# Begin Source File + +SOURCE=..\g_game.h +# End Source File +# Begin Source File + +SOURCE=..\g_input.c +# End Source File +# Begin Source File + +SOURCE=..\g_input.h +# End Source File +# Begin Source File + +SOURCE=..\g_state.h +# End Source File +# End Group +# Begin Group "H_Hud" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\am_map.c +# End Source File +# Begin Source File + +SOURCE=..\am_map.h +# End Source File +# Begin Source File + +SOURCE=..\command.c +# End Source File +# Begin Source File + +SOURCE=..\command.h +# End Source File +# Begin Source File + +SOURCE=..\console.c +# End Source File +# Begin Source File + +SOURCE=..\console.h +# End Source File +# Begin Source File + +SOURCE=..\hu_stuff.c +# End Source File +# Begin Source File + +SOURCE=..\hu_stuff.h +# End Source File +# Begin Source File + +SOURCE=..\st_stuff.c +# End Source File +# Begin Source File + +SOURCE=..\st_stuff.h +# End Source File +# Begin Source File + +SOURCE=..\y_inter.c +# End Source File +# Begin Source File + +SOURCE=..\y_inter.h +# End Source File +# End Group +# Begin Group "Hw_Hardware" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\hardware\hw3dsdrv.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw3sound.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw3sound.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_bsp.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_cache.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_data.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_defs.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_dll.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_draw.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_drv.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_glide.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_glob.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_light.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_light.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_main.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_main.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_md2.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_md2.h +# End Source File +# Begin Source File + +SOURCE=..\hardware\hw_trick.c +# End Source File +# Begin Source File + +SOURCE=..\hardware\hws_data.h +# End Source File +# End Group +# Begin Group "I_Interface" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\byteptr.h +# End Source File +# Begin Source File + +SOURCE=..\i_joy.h +# End Source File +# Begin Source File + +SOURCE=..\i_net.h +# End Source File +# Begin Source File + +SOURCE=..\i_sound.h +# End Source File +# Begin Source File + +SOURCE=..\i_system.h +# End Source File +# Begin Source File + +SOURCE=..\i_tcp.c +# End Source File +# Begin Source File + +SOURCE=..\i_tcp.h +# End Source File +# Begin Source File + +SOURCE=..\i_video.h +# End Source File +# Begin Source File + +SOURCE=..\keys.h +# End Source File +# Begin Source File + +SOURCE=..\mserv.c +# End Source File +# Begin Source File + +SOURCE=..\mserv.h +# End Source File +# End Group +# Begin Group "M_Misc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\m_argv.c +# End Source File +# Begin Source File + +SOURCE=..\m_argv.h +# End Source File +# Begin Source File + +SOURCE=..\m_bbox.c +# End Source File +# Begin Source File + +SOURCE=..\m_bbox.h +# End Source File +# Begin Source File + +SOURCE=..\m_cheat.c +# End Source File +# Begin Source File + +SOURCE=..\m_cheat.h +# End Source File +# Begin Source File + +SOURCE=..\m_dllist.h +# End Source File +# Begin Source File + +SOURCE=..\m_fixed.c +# End Source File +# Begin Source File + +SOURCE=..\m_fixed.h +# End Source File +# Begin Source File + +SOURCE=..\m_menu.c +# End Source File +# Begin Source File + +SOURCE=..\m_menu.h +# End Source File +# Begin Source File + +SOURCE=..\m_misc.c +# End Source File +# Begin Source File + +SOURCE=..\m_misc.h +# End Source File +# Begin Source File + +SOURCE=..\m_queue.c +# End Source File +# Begin Source File + +SOURCE=..\m_queue.h +# End Source File +# Begin Source File + +SOURCE=..\m_random.c +# End Source File +# Begin Source File + +SOURCE=..\m_random.h +# End Source File +# Begin Source File + +SOURCE=..\m_swap.h +# End Source File +# Begin Source File + +SOURCE=..\string.c +# End Source File +# End Group +# Begin Group "P_Play" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\info.c +# End Source File +# Begin Source File + +SOURCE=..\info.h +# End Source File +# Begin Source File + +SOURCE=..\p_ceilng.c +# End Source File +# Begin Source File + +SOURCE=..\p_enemy.c +# End Source File +# Begin Source File + +SOURCE=..\p_fab.c +# End Source File +# Begin Source File + +SOURCE=..\p_floor.c +# End Source File +# Begin Source File + +SOURCE=..\p_inter.c +# End Source File +# Begin Source File + +SOURCE=..\p_lights.c +# End Source File +# Begin Source File + +SOURCE=..\p_local.h +# End Source File +# Begin Source File + +SOURCE=..\p_map.c +# End Source File +# Begin Source File + +SOURCE=..\p_maputl.c +# End Source File +# Begin Source File + +SOURCE=..\p_maputl.h +# End Source File +# Begin Source File + +SOURCE=..\p_mobj.c +# End Source File +# Begin Source File + +SOURCE=..\p_mobj.h +# End Source File +# Begin Source File + +SOURCE=..\p_polyobj.c +# End Source File +# Begin Source File + +SOURCE=..\p_polyobj.h +# End Source File +# Begin Source File + +SOURCE=..\p_pspr.h +# End Source File +# Begin Source File + +SOURCE=..\p_saveg.c +# End Source File +# Begin Source File + +SOURCE=..\p_saveg.h +# End Source File +# Begin Source File + +SOURCE=..\p_setup.c +# End Source File +# Begin Source File + +SOURCE=..\p_setup.h +# End Source File +# Begin Source File + +SOURCE=..\p_sight.c +# End Source File +# Begin Source File + +SOURCE=..\p_spec.c +# End Source File +# Begin Source File + +SOURCE=..\p_spec.h +# End Source File +# Begin Source File + +SOURCE=..\p_telept.c +# End Source File +# Begin Source File + +SOURCE=..\p_tick.c +# End Source File +# Begin Source File + +SOURCE=..\p_tick.h +# End Source File +# Begin Source File + +SOURCE=..\p_user.c +# End Source File +# Begin Source File + +SOURCE=..\tables.c +# End Source File +# Begin Source File + +SOURCE=..\tables.h +# End Source File +# End Group +# Begin Group "R_Rend" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\r_bsp.c +# End Source File +# Begin Source File + +SOURCE=..\r_bsp.h +# End Source File +# Begin Source File + +SOURCE=..\r_data.c +# End Source File +# Begin Source File + +SOURCE=..\r_data.h +# End Source File +# Begin Source File + +SOURCE=..\r_defs.h +# End Source File +# Begin Source File + +SOURCE=..\r_draw.c +# End Source File +# Begin Source File + +SOURCE=..\r_draw.h +# End Source File +# Begin Source File + +SOURCE=..\r_draw16.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\r_draw8.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=..\r_local.h +# End Source File +# Begin Source File + +SOURCE=..\r_main.c +# End Source File +# Begin Source File + +SOURCE=..\r_main.h +# End Source File +# Begin Source File + +SOURCE=..\r_plane.c +# End Source File +# Begin Source File + +SOURCE=..\r_plane.h +# End Source File +# Begin Source File + +SOURCE=..\r_segs.c +# End Source File +# Begin Source File + +SOURCE=..\r_segs.h +# End Source File +# Begin Source File + +SOURCE=..\r_sky.c +# End Source File +# Begin Source File + +SOURCE=..\r_sky.h +# End Source File +# Begin Source File + +SOURCE=..\r_splats.c +# End Source File +# Begin Source File + +SOURCE=..\r_splats.h +# End Source File +# Begin Source File + +SOURCE=..\r_state.h +# End Source File +# Begin Source File + +SOURCE=..\r_things.c +# End Source File +# Begin Source File + +SOURCE=..\r_things.h +# End Source File +# Begin Source File + +SOURCE=..\screen.c +# End Source File +# Begin Source File + +SOURCE=..\screen.h +# End Source File +# Begin Source File + +SOURCE=..\v_video.c +# End Source File +# Begin Source File + +SOURCE=..\v_video.h +# End Source File +# End Group +# Begin Group "S_Sounds" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\s_sound.c +# End Source File +# Begin Source File + +SOURCE=..\s_sound.h +# End Source File +# Begin Source File + +SOURCE=..\sounds.c +# End Source File +# Begin Source File + +SOURCE=..\sounds.h +# End Source File +# End Group +# Begin Group "W_Wad" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\lzf.c +# End Source File +# Begin Source File + +SOURCE=..\lzf.h +# End Source File +# Begin Source File + +SOURCE=..\md5.c +# End Source File +# Begin Source File + +SOURCE=..\md5.h +# End Source File +# Begin Source File + +SOURCE=..\w_wad.c +# End Source File +# Begin Source File + +SOURCE=..\w_wad.h +# End Source File +# End Group +# Begin Group "Docs" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\doc\copying +# End Source File +# Begin Source File + +SOURCE=..\..\doc\faq.txt +# End Source File +# Begin Source File + +SOURCE=..\..\readme.txt +# End Source File +# Begin Source File + +SOURCE=..\..\doc\source.txt +# End Source File +# End Group +# Begin Source File + +SOURCE=..\win32\Srb2win.ico +# End Source File +# End Target +# End Project diff --git a/src/sdl2/Srb2SDL.dsw b/src/sdl2/Srb2SDL.dsw new file mode 100644 index 000000000..4f8f7bdce --- /dev/null +++ b/src/sdl2/Srb2SDL.dsw @@ -0,0 +1,74 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Srb2SDL"=.\Srb2SDL.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "libpng"="..\..\libs\libpng-src\projects\visualc6\libpng.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "s_openal"=..\hardware\s_openal\s_openal.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "zlib"=..\..\libs\zlib\projects\visualc6\zlib.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/sdl2/Srb2SDL.ico b/src/sdl2/Srb2SDL.ico new file mode 100644 index 0000000000000000000000000000000000000000..5ab791af37f815c0164e6053c34879ecf0c3fff0 GIT binary patch literal 2238 zcmZQzU}RuqP*7k1gB2VM3}Orn3>pj!3?Lx~29P`lSgwHuOhE`n2n8Y=7(kGLp`n3+ zfdP!c1jB&?2N(|AIl%DY)G~&Kh6aZJV93Dm|33o*0~mt|hX4QnGko~{pJB;@1q@d{ z{Abws=s!c>mH!Oc$Nn>T?D)^1y6Qgz0|-yL!@y9rlYt>=8Uuq@F$0590K=8X{~0zO z|Ig63`aeT<|9=LL;{Ob);r|&JLjN-`c-~=Pu-(bPU^tC|LA98HK{9~h%9Z~N8#n%E z=<EB>ke&UX!NcP}gQ_aT9SjV27#J9KGB7YqV_;w?W?*0lV0e7xKg02j{~1>I{b%UU z{?AbC@t+}F^*=)>!+!=(hC2+l3_BSN8KyC)G88jNG6XPuxbmOj(Z>G_SNi@l9LxUC zu*2g&!z$JP467LaGfZN*!%)SrlOc&=8iN-@F@q690K@+){~7*o{Lk>e??1!;?Eeh^ zJ^nNNSA~Ss9fms$I~jH|Ok<eFP|Q%w5CB&Hf#LtgM-2b_t}y)1KF09hV+X^3Rgmec z8167kV%W)0#W0N_iJ_Rmiy?r)h~fX0#|-~B9%uO9x0>O9c0a>^k79=Zs^JVEAKYQ^ zWZ21I%P@_>kfE4Cl_7vZlHvcAD-8cPZe;l1*T?WbJDcIZhX=!dRaJ0wVTKL^!~e%u z82%sM$nbx4AH)CtY=-~E9t{7(RT=(=GBDinWMJ57%fK+rkb$9Cm4P8Zl7Zp>hbs*K zA8lm#f2EJ%|FLX_|2sSw{;yJH_`iyQ;m#xmhMiRm4AYVr7>d0Z7y^tyY2^yT|Nk2q z{{Qb|`2Rnf;s1XRhX4On!D;Bu9R`M-I~f?JO=DmvE@of|2w-6N@c#<KqyHNjuKe#~ zIQBoAVaI<DhE@MnaU~yy$N#S|9RI(OVfFt$hW`KA48{LF7{dRn;z~XYSN>mN*!X`V zL*M^ChV1{@3?BbI7*zkOLeevq0J`%3F~i3H#~J$muV%>p-_PLjznDSwe>elK0J`%3 z1H;Duj~M#?Ut!4pe~iK7{|*LKP~d<tmH@i)|3AaV|Nj~K{{Lsl{{NrB<NtpKRZs>4 zVJrdk>C-2MXV0E7+`4s(;oP}%42KRKV%WBA8^fwqs~G0Zo5wI|(j<nqwl;>Usw#%O zygY`aq$Gy0urLNMFE0i=J39s=BO?YiH8ln)DJcd%K0Z+P9}xUS7}eVMA3w6chY5ZB zURjAEucRyv0$)FW7XI?%Pj^9OW#vbhVg?3wF&Gg4*4^D*SP23MX(gDf*jF*J?_Ci2 z0=WD~ki3$T5{MEL`(D}I4bol?lmGae;lI+ScW>Ul{qRXiOst@?vb(FYvhov5{{7n@ zpFRshz?ZM7m6es9AO$e#w{JiEdCTw?BL5a-a%E+4ci}gf{Ch$6|DPE?LgWQ2U<zQ; z4D5pJ48IvZLFLOK@|Bf^h2Ot@`CeX8_)+j(aU}ygRK5%*52Js65PVl#Sqn2i3nmVu z8Q29sRaRDhhdK~$K2-h_!<%>CLF_N@KsLMwF_G|h1_p*tpvb7K{LcRF9Xo^xSMU?$ zi}z5$Z^B>8D=I20Yv9scAZZ2$aCB9amwhZPFE1~z1Y1{GSqYDz@`B3B3Xl{Se^sif z00F3G28NI2<%N}CDG>2ROsS@_pc8B}#Q1OJ<rOgf6+e{4m6$p^I}0Il3}EdQmESAC z7E}~erhb<#>I4Cpf*<AOpr|efD=4ohsH`mP?Ck95=!7YN(GVlxo-2ciBj}2Xa%lWk zRv<)?S>**4AirYKi>!*O?Ek31{y+N<`#%f}_8%A+>K`yL)E{7AsBeH^XeG-CqG4_T wwIV>6xq*R!y@7#&{{RDnJwy-V{{{xI+W&kE4E6sT80!B&VEq682Rn+501#2s+5i9m literal 0 HcmV?d00001 diff --git a/src/sdl2/dosstr.c b/src/sdl2/dosstr.c new file mode 100644 index 000000000..f9bbee9b4 --- /dev/null +++ b/src/sdl2/dosstr.c @@ -0,0 +1,38 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// This file is in the public domain. +// (Re)written by Graue in 2006. +// +//----------------------------------------------------------------------------- +/// \file +/// \brief String uppercasing/lowercasing functions for non-DOS non-Win32 +/// systems + +#include "../doomtype.h" + +#ifndef HAVE_DOSSTR_FUNCS + +#include <ctype.h> + +int strupr(char *n) +{ + while (*n != '\0') + { + *n = toupper(*n); + n++; + } + return 1; +} + +int strlwr(char *n) +{ + while (*n != '\0') + { + *n = tolower(*n); + n++; + } + return 1; +} + +#endif diff --git a/src/sdl2/endtxt.c b/src/sdl2/endtxt.c new file mode 100644 index 000000000..1d7756b4d --- /dev/null +++ b/src/sdl2/endtxt.c @@ -0,0 +1,236 @@ +/* + * Function to write the SRB2 end message text + * + * Copyright (C) 1998 by Udo Munk <udo@umserver.umnet.de> + * + * This code is provided AS IS and there are no guarantees, none. + * Feel free to share and modify. + */ +//----------------------------------------------------------------------------- +/// \file +/// \brief Support to show ENDOOM text +/// +/// Loads the lump ENDOOM, set up the console to print +/// out the colors and text + +#include <stdio.h> +#include <stdlib.h> + +// need this 19990118 by Kin +#include "../doomdef.h" +#include "../w_wad.h" +#include "../z_zone.h" +#include "endtxt.h" +/** \brief The ShowEndTxt function + + + Prints out the ENDOOM the way DOOM.EXE/DOOM2.EXE did for Win32 or Linux/GNU + + \return void + + +*/ + +void ShowEndTxt(void) +{ +#if !(defined (_WIN32_WCE) || defined (_XBOX) || defined (_arch_dreamcast)) + INT32 i; + UINT16 j, att = 0; + INT32 nlflag = 1; +#ifdef _WIN32 + HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD mode, bytesWritten; + CONSOLE_SCREEN_BUFFER_INFO backupcon; + COORD resizewin = {80,-1}; + CHAR let = 0; +#endif + UINT16 *ptext; + void *data; + lumpnum_t endoomnum = W_GetNumForName("ENDOOM"); + //char *col; + + /* if the xterm has more then 80 columns we need to add nl's */ + /* doesn't work, COLUMNS is not in the environment at this time ??? + col = I_getenv("COLUMNS"); + if (col) { + if (atoi(col) > 80) + nlflag++; + } + */ + + /* get the lump with the text */ + data = ptext = W_CacheLumpNum(endoomnum, PU_CACHE); + +#ifdef _WIN32 + if (co == INVALID_HANDLE_VALUE || GetFileType(co) != FILE_TYPE_CHAR || !GetConsoleMode(co, &mode)) // test if it a good handle + { + Z_Free(data); + return; + } + + backupcon.wAttributes = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE; // Just in case + GetConsoleScreenBufferInfo(co, &backupcon); //Store old state + resizewin.Y = backupcon.dwSize.Y; + if (backupcon.dwSize.X < resizewin.X) + SetConsoleScreenBufferSize(co, resizewin); + + for (i=1; i<=80*25; i++) // print 80x25 text and deal with the attributes too + { + j = (UINT16)(*ptext >> 8); // attribute first + let = (char)(*ptext & 0xff); // text second + if (j != att) // attribute changed? + { + att = j; // save current attribute + SetConsoleTextAttribute(co, j); //set fg and bg color for buffer + } + + WriteConsoleA(co, &let, 1, &bytesWritten, NULL); // now the text + + if (nlflag && !(i % 80) && backupcon.dwSize.X > resizewin.X) // do we need a nl? + { + att = backupcon.wAttributes; + SetConsoleTextAttribute(co, att); // all attributes off + WriteConsoleA(co, "\n", 1, &bytesWritten, NULL); // newline to console + } + ptext++; + } + SetConsoleTextAttribute(co, backupcon.wAttributes); // all attributes off +#else + /* print 80x25 text and deal with the attributes too */ + for (i=1; i<=80*25; i++) { + /* attribute first */ + /* attribute changed? */ + if ((j = *ptext >> 8) != att) { + /* save current attribute */ + att = j; + /* set new attribute, forground color first */ + printf("\033["); + switch (j & 0x0f) { + case 0: /* black */ + printf("30"); + break; + case 1: /* blue */ + printf("34"); + break; + case 2: /* green */ + printf("32"); + break; + case 3: /* cyan */ + printf("36"); + break; + case 4: /* red */ + printf("31"); + break; + case 5: /* magenta */ + printf("35"); + break; + case 6: /* brown */ + printf("33"); + break; + case 7: /* bright grey */ + printf("37"); + break; + case 8: /* dark grey */ + printf("1;30"); + break; + case 9: /* bright blue */ + printf("1;34"); + break; + case 10: /* bright green */ + printf("1;32"); + break; + case 11: /* bright cyan */ + printf("1;36"); + break; + case 12: /* bright red */ + printf("1;31"); + break; + case 13: /* bright magenta */ + printf("1;35"); + break; + case 14: /* yellow */ + printf("1;33"); + break; + case 15: /* white */ + printf("1;37"); + break; + } + printf("m"); + /* now background color */ + printf("\033["); + switch ((j >> 4) & 0x0f) { + case 0: /* black */ + printf("40"); + break; + case 1: /* blue */ + printf("44"); + break; + case 2: /* green */ + printf("42"); + break; + case 3: /* cyan */ + printf("46"); + break; + case 4: /* red */ + printf("41"); + break; + case 5: /* magenta */ + printf("45"); + break; + case 6: /* brown */ + printf("43"); + break; + case 7: /* bright grey */ + printf("47"); + break; + case 8: /* dark grey */ + printf("1;40"); + break; + case 9: /* bright blue */ + printf("1;44"); + break; + case 10: /* bright green */ + printf("1;42"); + break; + case 11: /* bright cyan */ + printf("1;46"); + break; + case 12: /* bright red */ + printf("1;41"); + break; + case 13: /* bright magenta */ + printf("1;45"); + break; + case 14: /* yellow */ + printf("1;43"); + break; + case 15: /* white */ + printf("1;47"); + break; + } + printf("m"); + } + + /* now the text */ + printf("%c",*ptext++ & 0xff); + + /* do we need a nl? */ + if (nlflag) + { + if (!(i % 80)) + { + printf("\033[0m"); + att = 0; + printf("\n"); + } + } + } + /* all attributes off */ + printf("\033[0m"); +#endif + if (nlflag) + printf("\n"); + + Z_Free(data); +#endif +} diff --git a/src/sdl2/endtxt.h b/src/sdl2/endtxt.h new file mode 100644 index 000000000..41f8e51ad --- /dev/null +++ b/src/sdl2/endtxt.h @@ -0,0 +1,24 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief Support to show ENDOOM text + +#ifndef __ENDTXT__ +#define __ENDTXT__ + +void ShowEndTxt (void); + +#endif diff --git a/src/sdl2/filter/filters.c b/src/sdl2/filter/filters.c new file mode 100644 index 000000000..1b2346e8e --- /dev/null +++ b/src/sdl2/filter/filters.c @@ -0,0 +1,1000 @@ +#include <math.h> +#include "filters.h" + +//Alam_GBC: C file based on sms_sdl's filter.c + +/* 2X SAI Filter */ +static Uint32 colorMask = 0xF7DEF7DE; +static Uint32 lowPixelMask = 0x08210821; +static Uint32 qcolorMask = 0xE79CE79C; +static Uint32 qlowpixelMask = 0x18631863; +static Uint32 redblueMask = 0xF81F; +static Uint32 greenMask = 0x7E0; + +SDL_Surface *filter_2x(SDL_Surface *src, SDL_Rect *srcclp, filter_2 filter) +{ + return filter_2xe(src,srcclp,filter,0,0,0); +} + +SDL_Surface *filter_2xe(SDL_Surface *src, SDL_Rect *srcclp, filter_2 filter,Uint8 R, Uint8 G, Uint8 B) +{ + SDL_Surface *srcfilter = NULL; + SDL_Rect dstclp = {0,3,0,0}; + SDL_Surface *dstfilter = NULL; + Uint32 Fillcolor = 0; + if(!src || !filter) return NULL; // Need src and filter + if(srcclp) // size by clp + { + dstclp.w = srcclp->w; //clp's width + dstclp.h = srcclp->h; //clp's height + } + else // size by src + { + dstclp.w = (Uint16)src->w; //src's width + dstclp.h = (Uint16)src->h; //src's height + } + if(filter == hq2x32 || filter == lq2x32) // src 0888 surface + srcfilter = SDL_CreateRGBSurface(SDL_SWSURFACE,dstclp.w,dstclp.h+6,32,0x00FF0000,0x0000FF00,0x000000FF,0x00); + else // src 565 surface + srcfilter = SDL_CreateRGBSurface(SDL_SWSURFACE,dstclp.w,dstclp.h+6,16,0x0000F800,0x000007E0,0x0000001F,0x00); + if(!srcfilter) return NULL; //No Memory? + Fillcolor = SDL_MapRGB(srcfilter->format,R,G,B); //Choose color + SDL_FillRect(srcfilter,NULL,Fillcolor); //fill it + if(filter == filter_hq2x || filter == hq2x32 || filter == lq2x32) // dst 0888 surface + dstfilter = SDL_CreateRGBSurface(SDL_SWSURFACE,dstclp.w*2,dstclp.h*2,32,0x00FF0000,0x0000FF00,0x000000FF,0x00); + else // dst 565 surface + dstfilter = SDL_CreateRGBSurface(SDL_SWSURFACE,dstclp.w*2,dstclp.h*2,16,0x0000F800,0x000007E0,0x0000001F,0x00); + if(!dstfilter || SDL_BlitSurface(src,srcclp,srcfilter,&dstclp) == -1) // No dstfilter or Blit failed + { + SDL_FreeSurface(srcfilter); // Free memory + return NULL; //No Memory? + } + else // have dstfilter ready and srcfilter done + { + SDL_FillRect(dstfilter,NULL,Fillcolor); //fill it too + filter(FILTER(srcfilter,dstfilter)); //filtering + SDL_FreeSurface(srcfilter); //almost + } + return dstfilter; //done +} + + +int filter_init_2xsai(SDL_PixelFormat *BitFormat) +{ + if (!BitFormat || BitFormat->BytesPerPixel != 2 ||BitFormat->Amask != 0x0) + { + return 0; + } + else if (BitFormat->Rmask == 0xF800 && BitFormat->Gmask == 0x7E0 + && BitFormat->Bmask == 0x1F && BitFormat->BitsPerPixel == 16) //565 + { + colorMask = 0xF7DEF7DE; + lowPixelMask = 0x08210821; + qcolorMask = 0xE79CE79C; + qlowpixelMask = 0x18631863; + redblueMask = 0xF81F; + greenMask = 0x7E0; + } + else if (BitFormat->Rmask == 0x7C00 && BitFormat->Gmask == 0x3E0 + && BitFormat->Bmask == 0x1F && BitFormat->BitsPerPixel == 15) //555 + { + colorMask = 0x7BDE7BDE; + lowPixelMask = 0x04210421; + qcolorMask = 0x739C739C; + qlowpixelMask = 0x0C630C63; + redblueMask = 0x7C1F; + greenMask = 0x3E0; + } + else + { + return 0; + } +#ifdef MMX + if(BitFormat->Gmask == 0x7E0) Init_2xSaIMMX(565); + else Init_2xSaIMMX(555); +#endif + return 1; +} + + +FUNCINLINE static ATTRINLINE int GetResult1 (Uint32 A, Uint32 B, Uint32 C, Uint32 D, Uint32 E) +{ + int x = 0; + int y = 0; + int r = 0; + (void)E; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r += 1; + if (y <= 1) + r -= 1; + return r; +} + +FUNCINLINE static ATTRINLINE int GetResult2 (Uint32 A, Uint32 B, Uint32 C, Uint32 D, Uint32 E) +{ + int x = 0; + int y = 0; + int r = 0; + (void)E; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r -= 1; + if (y <= 1) + r += 1; + return r; +} + +FUNCINLINE static ATTRINLINE int GetResult (Uint32 A, Uint32 B, Uint32 C, Uint32 D) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r += 1; + if (y <= 1) + r -= 1; + return r; +} + +FUNCINLINE static ATTRINLINE Uint32 INTERPOLATE (Uint32 A, Uint32 B) +{ + if (A != B) + { + return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + + (A & B & lowPixelMask)); + } + else + return A; +} + +FUNCINLINE static ATTRINLINE Uint32 Q_INTERPOLATE (Uint32 A, Uint32 B, Uint32 C, Uint32 D) +{ + register Uint32 x = ((A & qcolorMask) >> 2) + + ((B & qcolorMask) >> 2) + + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); + register Uint32 y = (A & qlowpixelMask) + + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); + y = (y >> 2) & qlowpixelMask; + return x + y; +} + +#define BLUE_MASK565 0x001F001F +#define RED_MASK565 0xF800F800 +#define GREEN_MASK565 0x07E007E0 + +#define BLUE_MASK555 0x001F001F +#define RED_MASK555 0x7C007C00 +#define GREEN_MASK555 0x03E003E0 + +void filter_super2xsai(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + Uint16 *bP; + Uint8 *dP; + Uint32 inc_bP; + Uint32 Nextline = srcPitch >> 1; + + Uint32 finish; + inc_bP = 1; + + for (; height; height--) + { + bP = (Uint16 *) srcPtr; + dP = (Uint8 *) dstPtr; + + for (finish = width; finish; finish -= inc_bP) + { + Uint32 color4, color5, color6; + Uint32 color1, color2, color3; + Uint32 colorA0, colorA1, colorA2, colorA3, + colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; + Uint32 product1a, product1b, product2a, product2b; + +//--------------------------------------- B1 B2 +// 4 5 6 S2 +// 1 2 3 S1 +// A1 A2 + + colorB0 = *(bP - Nextline - 1); + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + colorB3 = *(bP - Nextline + 2); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA0 = *(bP + Nextline + Nextline - 1); + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + colorA3 = *(bP + Nextline + Nextline + 2); + +//-------------------------------------- + if (color2 == color6 && color5 != color3) + { + product2b = product1b = color2; + } + else if (color5 == color3 && color2 != color6) + { + product2b = product1b = color5; + } + else if (color5 == color3 && color2 == color6) + { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) + product2b = product1b = color6; + else if (r < 0) + product2b = product1b = color5; + else + { + product2b = product1b = INTERPOLATE (color5, color6); + } + } + else + { + if (color6 == color3 && color3 == colorA1 + && color2 != colorA2 && color3 != colorA0) + product2b = + Q_INTERPOLATE (color3, color3, color3, color2); + else if (color5 == color2 && color2 == colorA2 + && colorA1 != color3 && color2 != colorA3) + product2b = + Q_INTERPOLATE (color2, color2, color2, color3); + else + product2b = INTERPOLATE (color2, color3); + + if (color6 == color3 && color6 == colorB1 + && color5 != colorB2 && color6 != colorB0) + product1b = + Q_INTERPOLATE (color6, color6, color6, color5); + else if (color5 == color2 && color5 == colorB2 + && colorB1 != color6 && color5 != colorB3) + product1b = + Q_INTERPOLATE (color6, color5, color5, color5); + else + product1b = INTERPOLATE (color5, color6); + } + + if (color5 == color3 && color2 != color6 && color4 == color5 + && color5 != colorA2) + product2a = INTERPOLATE (color2, color5); + else + if (color5 == color1 && color6 == color5 + && color4 != color2 && color5 != colorA0) + product2a = INTERPOLATE (color2, color5); + else + product2a = color2; + + if (color2 == color6 && color5 != color3 && color1 == color2 + && color2 != colorB2) + product1a = INTERPOLATE (color2, color5); + else + if (color4 == color2 && color3 == color2 + && color1 != color5 && color2 != colorB0) + product1a = INTERPOLATE (color2, color5); + else + product1a = color5; + +#ifdef LSB_FIRST + product1a = product1a | (product1b << 16); + product2a = product2a | (product2b << 16); +#else + product1a = (product1a << 16) | product1b; + product2a = (product2a << 16) | product2b; +#endif + *((Uint32 *) dP) = product1a; + *((Uint32 *) (dP + dstPitch)) = product2a; + + bP += inc_bP; + dP += sizeof (Uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + } // endof: for (; height; height--) +} + +void filter_supereagle(Uint8 *srcPtr, Uint32 srcPitch, /* Uint8 *deltaPtr, */ + Uint8 *dstPtr, Uint32 dstPitch, int width, int height) +{ + Uint8 *dP; + Uint16 *bP; + Uint32 inc_bP; + + + + Uint32 finish; + Uint32 Nextline = srcPitch >> 1; + + inc_bP = 1; + + for (; height ; height--) + { + bP = (Uint16 *) srcPtr; + dP = dstPtr; + for (finish = width; finish; finish -= inc_bP) + { + Uint32 color4, color5, color6; + Uint32 color1, color2, color3; + Uint32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; + Uint32 product1a, product1b, product2a, product2b; + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + // -------------------------------------- + if (color2 == color6 && color5 != color3) + { + product1b = product2a = color2; + if ((color1 == color2) || (color6 == colorB2)) + { + product1a = INTERPOLATE (color2, color5); + product1a = INTERPOLATE (color2, product1a); +// product1a = color2; + } + else + { + product1a = INTERPOLATE (color5, color6); + } + + if ((color6 == colorS2) || (color2 == colorA1)) + { + product2b = INTERPOLATE (color2, color3); + product2b = INTERPOLATE (color2, product2b); +// product2b = color2; + } + else + { + product2b = INTERPOLATE (color2, color3); + } + } + else if (color5 == color3 && color2 != color6) + { + product2b = product1a = color5; + + if ((colorB1 == color5) || (color3 == colorS1)) + { + product1b = INTERPOLATE (color5, color6); + product1b = INTERPOLATE (color5, product1b); +// product1b = color5; + } + else + { + product1b = INTERPOLATE (color5, color6); + } + + if ((color3 == colorA2) || (color4 == color5)) + { + product2a = INTERPOLATE (color5, color2); + product2a = INTERPOLATE (color5, product2a); +// product2a = color5; + } + else + { + product2a = INTERPOLATE (color2, color3); + } + + } + else if (color5 == color3 && color2 == color6) + { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) + { + product1b = product2a = color2; + product1a = product2b = INTERPOLATE (color5, color6); + } + else if (r < 0) + { + product2b = product1a = color5; + product1b = product2a = INTERPOLATE (color5, color6); + } + else + { + product2b = product1a = color5; + product1b = product2a = color2; + } + } + else + { + product2b = product1a = INTERPOLATE (color2, color6); + product2b = + Q_INTERPOLATE (color3, color3, color3, product2b); + product1a = + Q_INTERPOLATE (color5, color5, color5, product1a); + + product2a = product1b = INTERPOLATE (color5, color3); + product2a = + Q_INTERPOLATE (color2, color2, color2, product2a); + product1b = + Q_INTERPOLATE (color6, color6, color6, product1b); + +// product1a = color5; +// product1b = color6; +// product2a = color2; +// product2b = color3; + } +#ifdef LSB_FIRST + product1a = product1a | (product1b << 16); + product2a = product2a | (product2b << 16); +#else + product1a = (product1a << 16) | product1b; + product2a = (product2a << 16) | product2b; +#endif + + *((Uint32 *) dP) = product1a; + *((Uint32 *) (dP + dstPitch)) = product2a; + + bP += inc_bP; + dP += sizeof (Uint32); + } // end of for ( finish= width etc..) + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + } // endof: for (height; height; height--) +} + +void filter_2xsai (Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, int width, int height) +{ + Uint8 *dP; + Uint16 *bP; + Uint32 inc_bP; + + + Uint32 finish; + Uint32 Nextline = srcPitch >> 1; + inc_bP = 1; + + + for (; height; height--) + { + bP = (Uint16 *) srcPtr; + dP = dstPtr; + + for (finish = width; finish; finish -= inc_bP) + { + + register Uint32 colorA, colorB; + Uint32 colorC, colorD, + colorE, colorF, colorG, colorH, + colorI, colorJ, colorK, colorL, + + colorM, colorN, colorO, colorP; + Uint32 product, product1, product2; + +//--------------------------------------- +// Map of the pixels: I|E F|J +// G|A B|K +// H|C D|L +// M|N O|P + colorI = *(bP - Nextline - 1); + colorE = *(bP - Nextline); + colorF = *(bP - Nextline + 1); + colorJ = *(bP - Nextline + 2); + + colorG = *(bP - 1); + colorA = *(bP); + colorB = *(bP + 1); + colorK = *(bP + 2); + + colorH = *(bP + Nextline - 1); + colorC = *(bP + Nextline); + colorD = *(bP + Nextline + 1); + colorL = *(bP + Nextline + 2); + + colorM = *(bP + Nextline + Nextline - 1); + colorN = *(bP + Nextline + Nextline); + colorO = *(bP + Nextline + Nextline + 1); + colorP = *(bP + Nextline + Nextline + 2); + + if ((colorA == colorD) && (colorB != colorC)) + { + if (((colorA == colorE) && (colorB == colorL)) || + ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ))) + { + product = colorA; + } + else + { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorA == colorG) && (colorC == colorO)) || + ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM))) + { + product1 = colorA; + } + else + { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorA; + } + else if ((colorB == colorC) && (colorA != colorD)) + { + if (((colorB == colorF) && (colorA == colorH)) || + ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI))) + { + product = colorB; + } + else + { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorC == colorH) && (colorA == colorF)) || + ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI))) + { + product1 = colorC; + } + else + { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorB; + } + else if ((colorA == colorD) && (colorB == colorC)) + { + if (colorA == colorB) + { + product = colorA; + product1 = colorA; + product2 = colorA; + } + else + { + register int r = 0; + + product1 = INTERPOLATE (colorA, colorC); + product = INTERPOLATE (colorA, colorB); + + r += + GetResult1 (colorA, colorB, colorG, colorE, + colorI); + r += + GetResult2 (colorB, colorA, colorK, colorF, + colorJ); + r += + GetResult2 (colorB, colorA, colorH, colorN, + colorM); + r += + GetResult1 (colorA, colorB, colorL, colorO, + colorP); + + if (r > 0) + product2 = colorA; + else if (r < 0) + product2 = colorB; + else + { + product2 = + Q_INTERPOLATE (colorA, colorB, colorC, + colorD); + } + } + } + else + { + product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); + + if ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ)) + { + product = colorA; + } + else + if ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI)) + { + product = colorB; + } + else + { + product = INTERPOLATE (colorA, colorB); + } + + if ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM)) + { + product1 = colorA; + } + else + if ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI)) + { + product1 = colorC; + } + else + { + product1 = INTERPOLATE (colorA, colorC); + } + } +#ifdef LSB_FIRST + product = colorA | (product << 16); + product1 = product1 | (product2 << 16); +#else + product = (colorA << 16) | product; + product1 = (product1 << 16) | product2; +#endif + *((Uint32 *) dP) = product; + *((Uint32 *) (dP + dstPitch)) = product1; + + bP += inc_bP; + dP += sizeof (Uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + } // endof: for (height; height; height--) +} + +#if 0 +static inline Uint32 Bilinear(Uint32 A, Uint32 B, Uint32 x) +{ + unsigned long areaA, areaB; + unsigned long result; + + if (A == B) + return A; + + areaB = (x >> 11) & 0x1f; // reduce 16 bit fraction to 5 bits + areaA = 0x20 - areaB; + + A = (A & redblueMask) | ((A & greenMask) << 16); + B = (B & redblueMask) | ((B & greenMask) << 16); + + result = ((areaA * A) + (areaB * B)) >> 5; + + return (result & redblueMask) | ((result >> 16) & greenMask); + +} + +static inline Uint32 Bilinear4 (Uint32 A, Uint32 B, Uint32 C, Uint32 D, Uint32 x, + Uint32 y) +{ + unsigned long areaA, areaB, areaC, areaD; + unsigned long result, xy; + + x = (x >> 11) & 0x1f; + y = (y >> 11) & 0x1f; + xy = (x * y) >> 5; + + A = (A & redblueMask) | ((A & greenMask) << 16); + B = (B & redblueMask) | ((B & greenMask) << 16); + C = (C & redblueMask) | ((C & greenMask) << 16); + D = (D & redblueMask) | ((D & greenMask) << 16); + + areaA = 0x20 + xy - x - y; + areaB = x - xy; + areaC = y - xy; + areaD = xy; + + result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5; + + return (result & redblueMask) | ((result >> 16) & greenMask); +} +#endif + + +void filter_advmame2x(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + unsigned int nextlineSrc = srcPitch / sizeof(short); + short *p = (short *)srcPtr; + + unsigned int nextlineDst = dstPitch / sizeof(short); + short *q = (short *)dstPtr; + + while(height--) { + int i = 0, j = 0; + for(i = 0; i < width; ++i, j += 2) { + short B = *(p + i - nextlineSrc); + short D = *(p + i - 1); + short E = *(p + i); + short F = *(p + i + 1); + short H = *(p + i + nextlineSrc); + + *(q + j) = (short)(D == B && B != F && D != H ? D : E); + *(q + j + 1) = (short)(B == F && B != D && F != H ? F : E); + *(q + j + nextlineDst) = (short)(D == H && D != B && H != F ? D : E); + *(q + j + nextlineDst + 1) = (short)(H == F && D != H && B != F ? F : E); + } + p += nextlineSrc; + q += nextlineDst << 1; + } +} + + +void filter_tv2x(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + unsigned int nextlineSrc = srcPitch / sizeof(Uint16); + Uint16 *p = (Uint16 *)srcPtr; + + unsigned int nextlineDst = dstPitch / sizeof(Uint16); + Uint16 *q = (Uint16 *)dstPtr; + + while(height--) { + int i = 0, j = 0; + for(; i < width; ++i, j += 2) { + Uint16 p1 = *(p + i); + Uint32 pi; + + pi = (((p1 & redblueMask) * 7) >> 3) & redblueMask; + pi |= (((p1 & greenMask) * 7) >> 3) & greenMask; + + *(q + j) = (Uint16)p1; + *(q + j + 1) = (Uint16)p1; + *(q + j + nextlineDst) = (Uint16)pi; + *(q + j + nextlineDst + 1) = (Uint16)pi; + } + p += nextlineSrc; + q += nextlineDst << 1; + } +} + +void filter_normal2x(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + unsigned int nextlineSrc = srcPitch / sizeof(Uint16); + Uint16 *p = (Uint16 *)srcPtr; + + unsigned int nextlineDst = dstPitch / sizeof(Uint16); + Uint16 *q = (Uint16 *)dstPtr; + + while(height--) { + int i = 0, j = 0; + for(; i < width; ++i, j += 2) { + Uint16 color = *(p + i); + + *(q + j) = color; + *(q + j + 1) = color; + *(q + j + nextlineDst) = color; + *(q + j + nextlineDst + 1) = color; + } + p += nextlineSrc; + q += nextlineDst << 1; + } +} + +void filter_scan50(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + + unsigned int nextlineSrc = srcPitch / sizeof(Uint16); + Uint16 *p = (Uint16 *)srcPtr; + + unsigned int nextlineDst = dstPitch / sizeof(Uint16); + Uint16 *q = (Uint16 *)dstPtr; + + while(height--) { + int i = 0, j = 0; + for(; i < width; ++i, j += 2) { + Uint16 p1 = *(p + i); + Uint16 p2 = *(p + i + nextlineSrc); + // 0111 1011 1110 1111 == 0x7BEF + Uint16 pm = (Uint16)(((p1 + p2) >> 2) & 0x7BEF); + + *(q + j) = p1; + *(q + j + 1) = p1; + *(q + j + nextlineDst) = pm; + *(q + j + nextlineDst + 1) = pm; + + } + p += nextlineSrc; + q += nextlineDst << 1; + } +} + + +void filter_scan100(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + unsigned int nextlineSrc = srcPitch / sizeof(Uint16); + Uint16 *p = (Uint16 *)srcPtr; + + unsigned int nextlineDst = dstPitch / sizeof(Uint16); + Uint16 *q = (Uint16 *)dstPtr; + + while(height--) { + int i = 0, j = 0; + for(; i < width; ++i, j += 2) { + *(q + j) = *(q + j + 1) = *(p + i); + } + p += nextlineSrc; + q += nextlineDst << 1; + } +} + + +FUNCINLINE static ATTRINLINE Uint16 DOT_16(Uint16 c, int j, int i) { + static const Uint16 dotmatrix[16] = { + 0x01E0, 0x0007, 0x3800, 0x0000, + 0x39E7, 0x0000, 0x39E7, 0x0000, + 0x3800, 0x0000, 0x01E0, 0x0007, + 0x39E7, 0x0000, 0x39E7, 0x0000 + }; + return (Uint16)(c - ((c >> 2) & *(dotmatrix + ((j & 3) << 2) + (i & 3)))); +} + +void filter_dotmatrix(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + unsigned int nextlineSrc = srcPitch / sizeof(Uint16); + Uint16 *p = (Uint16 *)srcPtr; + + unsigned int nextlineDst = dstPitch / sizeof(Uint16); + Uint16 *q = (Uint16 *)dstPtr; + + int i, ii, j, jj; + for(j = 0, jj = 0; j < height; ++j, jj += 2) { + for(i = 0, ii = 0; i < width; ++i, ii += 2) { + Uint16 c = *(p + i); + *(q + ii) = DOT_16(c, jj, ii); + *(q + ii + 1) = DOT_16(c, jj, ii + 1); + *(q + ii + nextlineDst) = DOT_16(c, jj + 1, ii); + *(q + ii + nextlineDst + 1) = DOT_16(c, jj + 1, ii + 1); + } + p += nextlineSrc; + q += nextlineDst << 1; + } +} + + +void filter_bilinear(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + unsigned int nextlineSrc = srcPitch / sizeof(Uint16); + Uint16 *p = (Uint16 *)srcPtr; + unsigned int nextlineDst = dstPitch / sizeof(Uint16); + Uint16 *q = (Uint16 *)dstPtr; + + while(height--) { + int i, ii; + for(i = 0, ii = 0; i < width; ++i, ii += 2) { + Uint16 A = *(p + i); + Uint16 B = *(p + i + 1); + Uint16 C = *(p + i + nextlineSrc); + Uint16 D = *(p + i + nextlineSrc + 1); + *(q + ii) = A; + *(q + ii + 1) = (Uint16)INTERPOLATE(A, B); + *(q + ii + nextlineDst) = (Uint16)INTERPOLATE(A, C); + *(q + ii + nextlineDst + 1) = (Uint16)Q_INTERPOLATE(A, B, C, D); + } + p += nextlineSrc; + q += nextlineDst << 1; + } +} + + +// NEED_OPTIMIZE +static void MULT(Uint16 c, float* r, float* g, float* b, float alpha) { + *r += alpha * ((c & RED_MASK565 ) >> 11); + *g += alpha * ((c & GREEN_MASK565) >> 5); + *b += alpha * ((c & BLUE_MASK565 ) >> 0); +} + +static Uint16 MAKE_RGB565(float r, float g, float b) { + return (Uint16) + (((((Uint8)r) << 11) & RED_MASK565 ) | + ((((Uint8)g) << 5) & GREEN_MASK565) | + ((((Uint8)b) << 0) & BLUE_MASK565 )); +} + +FUNCINLINE static ATTRINLINE float CUBIC_WEIGHT(float x) { + // P(x) = { x, x>0 | 0, x<=0 } + // P(x + 2) ^ 3 - 4 * P(x + 1) ^ 3 + 6 * P(x) ^ 3 - 4 * P(x - 1) ^ 3 + double r = 0.; + if(x + 2 > 0) r += pow(x + 2, 3); + if(x + 1 > 0) r += -4 * pow(x + 1, 3); + if(x > 0) r += 6 * pow(x , 3); + if(x - 1 > 0) r += -4 * pow(x - 1, 3); + return (float)r / 6; +} + +void filter_bicubic(Uint8 *srcPtr, Uint32 srcPitch, + Uint8 *dstPtr, Uint32 dstPitch, + int width, int height) +{ + unsigned int nextlineSrc = srcPitch / sizeof(Uint16); + Uint16 *p = (Uint16 *)srcPtr; + unsigned int nextlineDst = dstPitch / sizeof(Uint16); + Uint16 *q = (Uint16 *)dstPtr; + int dx = width << 1, dy = height << 1; + float fsx = (float)width / dx; + float fsy = (float)height / dy; + float v = 0.0f; + int j = 0; + for(; j < dy; ++j) { + float u = 0.0f; + int iv = (int)v; + float decy = v - iv; + int i = 0; + for(; i < dx; ++i) { + int iu = (int)u; + float decx = u - iu; + float r, g, b; + int m; + r = g = b = 0.; + for(m = -1; m <= 2; ++m) { + float r1 = CUBIC_WEIGHT(decy - m); + int n; + for(n = -1; n <= 2; ++n) { + float r2 = CUBIC_WEIGHT(n - decx); + Uint16* pIn = p + (iu + n) + (iv + m) * nextlineSrc; + MULT(*pIn, &r, &g, &b, r1 * r2); + } + } + *(q + i) = MAKE_RGB565(r, g, b); + u += fsx; + } + q += nextlineDst; + v += fsy; + } +} diff --git a/src/sdl2/filter/filters.h b/src/sdl2/filter/filters.h new file mode 100644 index 000000000..c4a84b4c9 --- /dev/null +++ b/src/sdl2/filter/filters.h @@ -0,0 +1,212 @@ +#ifndef __FILTERS_H__ +#define __FILTERS_H__ + +#ifdef _MSC_VER +#pragma warning(disable : 4514 4214 4244) +#endif + +#include "SDL.h" + +#ifdef _MSC_VER +#pragma warning(default : 4214 4244) +#endif + +typedef enum { + FILTER_2XSAI = 0, + FILTER_SUPER2XSAI, + FILTER_SUPEREAGLE, + FILTER_ADVMAME2X , + FILTER_TV2X , + FILTER_NORMAL2X , + FILTER_BILINEAR , + FILTER_DOTMATRIX , + FILTER_NUM , +} t_filter; + +typedef void (*filter_2)(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +SDL_Surface *filter_2x(SDL_Surface *src, SDL_Rect *srcclp, filter_2 filter); +SDL_Surface *filter_2xe(SDL_Surface *src, SDL_Rect *srcclp, filter_2 filter,Uint8 R, Uint8 G, Uint8 B); +//Alam_GBC: Header file based on sms_sdl's filter.h +//Note: need 3 lines at the bottom and top? + +//int filter_init_2xsai(SDL_PixelFormat *BitFormat); +#define FILTER(src,dst) (Uint8 *)(src->pixels)+src->pitch*3, (Uint32)src->pitch, (Uint8 *)dst->pixels, (Uint32)dst->pitch, src->w, src->h-6 +#define SDLFILTER(src,dst) (Uint8 *)src->pixels, (Uint32)src->pitch, (Uint8 *)dst->pixels, (Uint32)dst->pitch, src->w, src->h +int filter_init_2xsai(SDL_PixelFormat *BitFormat); //unless? +void filter_scan50(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_scan100(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); + +void filter_2xsai(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_super2xsai(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_supereagle(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_advmame2x(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_tv2x(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_normal2x(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_bilinear(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_dotmatrix(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void filter_bicubic(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void lq2x16(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void hq2x16(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); + +void filter_hq2x(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void lq2x32(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); +void hq2x32(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height); + +#ifdef FILTERS +typedef struct filter_s { filter_2 filter; int bpp; } filter_t; +#define NUMFILTERS 13 +static filter_t filtermode[NUMFILTERS+1] = { + {NULL , 0}, //None + {filter_normal2x , 16}, //2xNormal + {filter_advmame2x , 16}, //AdvMAME2x + {filter_tv2x , 16}, //TV2x + {filter_bilinear , 16}, //Bilinear + {filter_dotmatrix , 16}, //DotMatrix + {lq2x16 , 16}, //16LQ2x + {hq2x16 , 16}, //16HQ2x + {lq2x32 , 32}, //32LQ2x + {hq2x32 , 32}, //32HQ2x +// {filter_bicubic , 16}, //Slow Bicubic + // BAD + {filter_2xsai , 16}, //2xSAI + {filter_super2xsai, 16}, //Super2xSAI + {filter_supereagle, 16}, //SuperEagle +}; +CV_PossibleValue_t CV_Filters[] = {{ 0, "None"}, { 1, "2xNormal"}, + { 2, "AdvMAME2x"}, { 3, "TV2x"}, { 4, "Bilinear"} , { 5, "DotMatrix"}, + { 6, "16LQ2x"}, { 7, "16HQ2x"}, { 8, "32LQ2x"} , { 9, "32HQ2x"}, + {10, "2xSAI"}, {11, "Super2xSAI"}, {12, "SuperEagle"}, {0, NULL},}; +static void Filterchange(void); +consvar_t cv_filter = {"filter", "None", CV_CALL|CV_NOINIT, CV_Filters,Filterchange,0,NULL,NULL,0,0,NULL}; +static filter_2 blitfilter = NULL; +static SDL_Surface *preSurface = NULL; +static SDL_Surface *f2xSurface = NULL; + +static void Filterchange(void) +{ + if(blitfilter) // only filtering? + { + int i=0; + for(;i < NUMFILTERS; i++)//find old filter + { + if(filtermode[i].filter == blitfilter) //Found it + break; //Stop + } + if(i < NUMFILTERS && filtermode[i].bpp == filtermode[cv_filter.value].bpp) //Easy to swap? + blitfilter = filtermode[cv_filter.value].filter; // Swap with new filter + } +} + +FUNCINLINE static ATTRINLINE void FilterBlit(SDL_Surface *froSurface) +{ + if(froSurface && blitfilter && preSurface && f2xSurface) + { + SDL_Rect dstclp = {0,3,0,0}; + int lockedpre = 0, lockedf2x = 0, blitpre = 0; + blitpre = SDL_BlitSurface(froSurface,NULL,preSurface,&dstclp); + if(SDL_MUSTLOCK(preSurface)) lockedpre = SDL_LockSurface(preSurface); + if(SDL_MUSTLOCK(f2xSurface)) lockedf2x = SDL_LockSurface(f2xSurface); + if(lockedpre == 0 && preSurface->pixels && lockedf2x == 0 && f2xSurface->pixels && blitpre == 0) + { + blitfilter(FILTER(preSurface,f2xSurface)); + if(SDL_MUSTLOCK(preSurface)) SDL_UnlockSurface(preSurface); + if(SDL_MUSTLOCK(f2xSurface)) SDL_UnlockSurface(f2xSurface); + } + } + else + { + blitfilter = NULL; + if(preSurface) SDL_FreeSurface(preSurface); + preSurface = NULL; + if(f2xSurface) SDL_FreeSurface(f2xSurface); + f2xSurface = NULL; + } +} + +FUNCINLINE static ATTRINLINE int Setupf2x(int width, int height, int bpp) +{ + blitfilter = NULL; + if(preSurface) SDL_FreeSurface(preSurface); + preSurface = NULL; + if(f2xSurface) SDL_FreeSurface(f2xSurface); + f2xSurface = NULL; + if( !(width%2) && !(height%2) && width >= BASEVIDWIDTH*2 && height >= BASEVIDHEIGHT*2 && cv_filter.value + && cv_filter.value <= NUMFILTERS && filtermode[cv_filter.value].filter && filtermode[cv_filter.value].bpp) + { + int hwidth = width/2 + 6; + int heighth = height/2 + 6; + int hbpp = filtermode[cv_filter.value].bpp; + switch(hbpp) + { + case 8: + preSurface = SDL_CreateRGBSurface(SDL_SWSURFACE,hwidth,heighth, 8,0x00000000,0x00000000,0x00000000,0x00); + f2xSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, width,height , 8,0x00000000,0x00000000,0x00000000,0x00); + case 15: + preSurface = SDL_CreateRGBSurface(SDL_SWSURFACE,hwidth,heighth,15,0x00007C00,0x000003E0,0x0000001F,0x00); + f2xSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, width,height ,15,0x00007C00,0x000003E0,0x0000001F,0x00); + break; + case 16: + preSurface = SDL_CreateRGBSurface(SDL_SWSURFACE,hwidth,heighth,16,0x0000F800,0x000007E0,0x0000001F,0x00); + f2xSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, width,height ,16,0x0000F800,0x000007E0,0x0000001F,0x00); + break; + case 24: + preSurface = SDL_CreateRGBSurface(SDL_SWSURFACE,hwidth,heighth,24,0x00FF0000,0x0000FF00,0x000000FF,0x00); + f2xSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, width,height ,24,0x00FF0000,0x0000FF00,0x000000FF,0x00); + break; + case 32: + preSurface = SDL_CreateRGBSurface(SDL_SWSURFACE,hwidth,heighth,32,0x00FF0000,0x0000FF00,0x000000FF,0x00); + f2xSurface = SDL_CreateRGBSurface(SDL_HWSURFACE, width,height ,32,0x00FF0000,0x0000FF00,0x000000FF,0x00); + break; + default: + //I_Error("Filter help"); + break; + } + if(preSurface && f2xSurface) + { + blitfilter = filtermode[cv_filter.value].filter; + if(bpp < hbpp) bpp = hbpp; + } + else + { + if(preSurface) SDL_FreeSurface(preSurface); + preSurface = NULL; + if(f2xSurface) SDL_FreeSurface(f2xSurface); + f2xSurface = NULL; + } + } + return bpp; +} +#else + +#ifdef __GNUC__ // __attribute__ ((X)) +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) +#define FUNCINLINE __attribute__((always_inline)) +#endif +#define FUNCNOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) +#define inline __inline +#define ATTRNORETURN __declspec(noreturn) +#define ATTRINLINE __forceinline +#if _MSC_VER > 1200 +#define ATTRNOINLINE __declspec(noinline) +#endif +#endif + + + +#ifndef FUNCINLINE +#define FUNCINLINE +#endif +#ifndef FUNCNOINLINE +#define FUNCNOINLINE +#endif +#ifndef ATTRINLINE +#define ATTRINLINE inline +#endif +#ifndef ATTRNOINLINE +#define ATTRNOINLINE +#endif + +#endif + +#endif diff --git a/src/sdl2/filter/hq2x.c b/src/sdl2/filter/hq2x.c new file mode 100644 index 000000000..acdbcb168 --- /dev/null +++ b/src/sdl2/filter/hq2x.c @@ -0,0 +1,3125 @@ +//hq2x filter demo program +//---------------------------------------------------------- +//Copyright (C) 2003 MaxSt ( maxst@hiend3d.com ) + +//This program is free software; you can redistribute it and/or +//modify it under the terms of the GNU Lesser General Public +//License as published by the Free Software Foundation; either +//version 2.1 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 +//Lesser General Public License for more details. +// +//You should have received a copy of the GNU Lesser General Public +//License along with this program; if not, write to the Free Software +//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +#include "filters.h" +#include <math.h> +#ifdef __GNUC__ +#include <stdlib.h> +#endif + + +#if (defined(__GNUC__) && defined(__i386__)) || (defined(_MSC_VER) && defined(_X86_)) +#define HQ2XASM +#endif + +#ifdef _MSC_VER +//#define HQ2XMMXASM +#endif + +static int LUT16to32[65536]; +static int RGBtoYUV[65536]; +#ifdef HQ2XMMXASM +#include "SDL_cpuinfo.h" +static SDL_bool hasMMX = 0; +const Sint64 reg_blank = 0; +const Sint64 const3 = 0x0000000300030003; +const Sint64 const5 = 0x0000000500050005; +const Sint64 const6 = 0x0000000600060006; +const Sint64 const14 = 0x0000000E000E000E; +const Sint64 tr3eshold = 0x0000000000300706; +#endif +static int YUV1, YUV2; +const int Ymask = 0x00FF0000; +const int Umask = 0x0000FF00; +const int Vmask = 0x000000FF; +const int trY = 0x00300000; +const int trU = 0x00000700; +const int trV = 0x00000006; + +FUNCINLINE static ATTRINLINE void Interp1(Uint8 * pc, int c1, int c2) +{ +#ifdef HQ2XASM + //*((int*)pc) = (c1*3+c2)/4; +#ifdef __GNUC__ + int c3 = c1; + __asm__("shl $2, %1; add %2, %1; sub %3, %1; shr $2, %1":"=d"(*((int*)pc)):"d"(c1),"r"(c2),"r"(c3):"memory"); +#else + __asm + { + mov eax, pc + mov edx, c1 + shl edx, 2 + add edx, c2 + sub edx, c1 + shr edx, 2 + mov [eax], edx + } +#endif +#else + *((int*)pc) = (c1*3+c2) >> 2; +#endif +} + +FUNCINLINE static ATTRINLINE void Interp2(Uint8 * pc, int c1, int c2, int c3) +{ +#ifdef HQ2XASM +// *((int*)pc) = (c1*2+c2+c3) >> 2; +#ifdef __GNUC__ + __asm__("shl $1, %1; add %2, %1; add %3, %1; shr $2, %1":"=d"(*((int*)pc)):"d"(c1),"r"(c2),"r"(c3):"memory"); +#else + __asm + { + mov eax, pc + mov edx, c1 + shl edx, 1 + add edx, c2 + add edx, c3 + shr edx, 2 + mov [eax], edx + } +#endif +#else + *((int*)pc) = (c1*2+c2+c3) >> 2; +#endif +} + +#if 0 +static inline void Interp5(Uint8 * pc, int c1, int c2) +{ +#ifdef HQ2XASM + //*((int*)pc) = (c1+c2)/2; +#ifdef __GNUC__ + __asm__("add %2, %1; shr $1, %1":"=d"(*((int*)pc)):"d"(c1),"r"(c2):"memory"); +#else + __asm + { + mov eax, pc + mov edx, c1 + add edx, c2 + shr edx, 1 + mov [eax], edx + } +#endif +#else + *((int*)pc) = (c1+c2) >> 1; +#endif +} +#endif + +FUNCINLINE static ATTRINLINE void Interp6(Uint8 * pc, int c1, int c2, int c3) +{ +#ifdef HQ2XMMXASM + //*((int*)pc) = (c1*5+c2*2+c3)/8; + if(hasMMX) +#ifdef __GNUC__ + __asm__("movd %1, %%mm1; movd %2, %%mm2, movd %3, %%mm3; punpcklbw $_reg_blank, %%mm1; punpcklbw $_reg_blank, %%mm2; punpcklbw $_reg_blank, %%mm3; pmullw $_const5, %%mm1; psllw $1, %%mm2; paddw %%mm3, %%mm1; paddw %%mm2, %%mm1; psrlw $3, %%mm1; packuswb $_reg_blank, %%mm1; movd %%mm1, %0" : "=r"(*((int*)pc)) : "r" (c1),"r" (c2),"r" (c3) : "memory"); +#else + __asm + { + mov eax, pc + movd mm1, c1 + movd mm2, c2 + movd mm3, c3 + punpcklbw mm1, reg_blank + punpcklbw mm2, reg_blank + punpcklbw mm3, reg_blank + pmullw mm1, const5 + psllw mm2, 1 + paddw mm1, mm3 + paddw mm1, mm2 + psrlw mm1, 3 + packuswb mm1, reg_blank + movd [eax], mm1 + } +#endif + else +#endif + *((int*)pc) = ((((c1 & 0x00FF00)*5 + (c2 & 0x00FF00)*2 + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*5 + (c2 & 0xFF00FF)*2 + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +FUNCINLINE static ATTRINLINE void Interp7(Uint8 * pc, int c1, int c2, int c3) +{ +#ifdef HQ2XMMXASM + //*((int*)pc) = (c1*6+c2+c3)/8; + if(hasMMX) +#ifdef __GNUC__ + __asm__("movd %1, %%mm1; movd %2, %%mm2, movd %3, %%mm3; punpcklbw $_reg_blank, %%mm1; punpcklbw $_reg_blank, %%mm2; punpcklbw $_reg_blank, %%mm3; pmull2 $_const6, %%mm1; padw %%mm3, %%mm2; paddw %%mm2, %%mm1; psrlw $3, %%mm1; packuswb $_reg_blank, %%mm1; movd %%mm1, %0 " : "=r" (*((int*)pc)): "r"(c1), "r"(c2), "r"(c3) : "memory"); +#else + __asm + { + mov eax, pc + movd mm1, c1 + movd mm2, c2 + movd mm3, c3 + punpcklbw mm1, reg_blank + punpcklbw mm2, reg_blank + punpcklbw mm3, reg_blank + pmullw mm1, const6 + paddw mm2, mm3 + paddw mm1, mm2 + psrlw mm1, 3 + packuswb mm1, reg_blank + movd [eax], mm1 + } +#endif + else +#endif + *((int*)pc) = ((((c1 & 0x00FF00)*6 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*6 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +FUNCINLINE static ATTRINLINE void Interp9(Uint8 * pc, int c1, int c2, int c3) +{ +#ifdef HQ2XMMXASM + //*((int*)pc) = (c1*2+(c2+c3)*3)/8; + if(hasMMX) +#ifdef __GNUC__ + __asm__("movd %1, %%mm1; movd %2, %%mm2, movd %3, %%mm3; punpcklbw $_reg_blank, %%mm1; punpcklbw $_reg_blank, %%mm2; punpcklbw $_reg_blank, %%mm3; psllw $1, %%mm1; paddw %%mm3, %%mm2; pmullw $_const3, %%mm2; padw %%mm2, %%mm1; psrlw $3, %%mm1; packuswb $_reg_blank, %%mm1; movd %%mm1, %0;" : "=r"(*((int*)pc)) : "r" (c1),"r" (c2),"r" (c3) : "memory"); +#else + __asm + { + mov eax, pc + movd mm1, c1 + movd mm2, c2 + movd mm3, c3 + punpcklbw mm1, reg_blank + punpcklbw mm2, reg_blank + punpcklbw mm3, reg_blank + psllw mm1, 1 + paddw mm2, mm3 + pmullw mm2, const3 + paddw mm1, mm2 + psrlw mm1, 3 + packuswb mm1, reg_blank + movd [eax], mm1 + } +#endif + else +#endif + *((int*)pc) = ((((c1 & 0x00FF00)*2 + ((c2 & 0x00FF00) + (c3 & 0x00FF00))*3 ) & 0x0007F800) + + (((c1 & 0xFF00FF)*2 + ((c2 & 0xFF00FF) + (c3 & 0xFF00FF))*3 ) & 0x07F807F8)) >> 3; +} + +FUNCINLINE static ATTRINLINE void Interp10(Uint8 * pc, int c1, int c2, int c3) +{ +#ifdef HQ2XMMXASM + //*((int*)pc) = (c1*14+c2+c3)/16; + if(hasMMX) +#ifdef __GNUC__ + __asm__("movd %1, %%mm1; movd %2, %%mm2, movd %3, %%mm3; punpcklbw $_reg_blank, %%mm1; punpcklbw $_reg_blank, %%mm2; punpcklbw $_reg_blank, %%mm3; pmullw $_const14, %%mm1; paddw %%mm3, %%mm2; paddw %%mm2, %%mm1; psrlw $4, %%mm1; packuswb $_req_blank, %%mm1; movd %%mm1, %0;" : "=r"(*((int*)pc)) : "r" (c1),"r" (c2),"r" (c3) : "memory"); +#else + __asm + { + mov eax, pc + movd mm1, c1 + movd mm2, c2 + movd mm3, c3 + punpcklbw mm1, reg_blank + punpcklbw mm2, reg_blank + punpcklbw mm3, reg_blank + pmullw mm1, const14 + paddw mm2, mm3 + paddw mm1, mm2 + psrlw mm1, 4 + packuswb mm1, reg_blank + movd [eax], mm1 + } +#endif + else +#endif + *((int*)pc) = ((((c1 & 0x00FF00)*14 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x000FF000) + + (((c1 & 0xFF00FF)*14 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x0FF00FF0)) >> 4; +} +#define PIXEL00_0 *((int*)(pOut)) = c[5]; +#define PIXEL00_10 Interp1(pOut, c[5], c[1]); +#define PIXEL00_11 Interp1(pOut, c[5], c[4]); +#define PIXEL00_12 Interp1(pOut, c[5], c[2]); +#define PIXEL00_20 Interp2(pOut, c[5], c[4], c[2]); +#define PIXEL00_21 Interp2(pOut, c[5], c[1], c[2]); +#define PIXEL00_22 Interp2(pOut, c[5], c[1], c[4]); +#define PIXEL00_60 Interp6(pOut, c[5], c[2], c[4]); +#define PIXEL00_61 Interp6(pOut, c[5], c[4], c[2]); +#define PIXEL00_70 Interp7(pOut, c[5], c[4], c[2]); +#define PIXEL00_90 Interp9(pOut, c[5], c[4], c[2]); +#define PIXEL00_100 Interp10(pOut, c[5], c[4], c[2]); +#define PIXEL01_0 *((int*)(pOut+4)) = c[5]; +#define PIXEL01_10 Interp1(pOut+4, c[5], c[3]); +#define PIXEL01_11 Interp1(pOut+4, c[5], c[2]); +#define PIXEL01_12 Interp1(pOut+4, c[5], c[6]); +#define PIXEL01_20 Interp2(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_21 Interp2(pOut+4, c[5], c[3], c[6]); +#define PIXEL01_22 Interp2(pOut+4, c[5], c[3], c[2]); +#define PIXEL01_60 Interp6(pOut+4, c[5], c[6], c[2]); +#define PIXEL01_61 Interp6(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_70 Interp7(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_90 Interp9(pOut+4, c[5], c[2], c[6]); +#define PIXEL01_100 Interp10(pOut+4, c[5], c[2], c[6]); +#define PIXEL10_0 *((int*)(pOut+BpL)) = c[5]; +#define PIXEL10_10 Interp1(pOut+BpL, c[5], c[7]); +#define PIXEL10_11 Interp1(pOut+BpL, c[5], c[8]); +#define PIXEL10_12 Interp1(pOut+BpL, c[5], c[4]); +#define PIXEL10_20 Interp2(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_21 Interp2(pOut+BpL, c[5], c[7], c[4]); +#define PIXEL10_22 Interp2(pOut+BpL, c[5], c[7], c[8]); +#define PIXEL10_60 Interp6(pOut+BpL, c[5], c[4], c[8]); +#define PIXEL10_61 Interp6(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_70 Interp7(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_90 Interp9(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL10_100 Interp10(pOut+BpL, c[5], c[8], c[4]); +#define PIXEL11_0 *((int*)(pOut+BpL+4)) = c[5]; +#define PIXEL11_10 Interp1(pOut+BpL+4, c[5], c[9]); +#define PIXEL11_11 Interp1(pOut+BpL+4, c[5], c[6]); +#define PIXEL11_12 Interp1(pOut+BpL+4, c[5], c[8]); +#define PIXEL11_20 Interp2(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_21 Interp2(pOut+BpL+4, c[5], c[9], c[8]); +#define PIXEL11_22 Interp2(pOut+BpL+4, c[5], c[9], c[6]); +#define PIXEL11_60 Interp6(pOut+BpL+4, c[5], c[8], c[6]); +#define PIXEL11_61 Interp6(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_70 Interp7(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_90 Interp9(pOut+BpL+4, c[5], c[6], c[8]); +#define PIXEL11_100 Interp10(pOut+BpL+4, c[5], c[6], c[8]); + +#ifdef _MSC_VER +#pragma warning(disable: 4035) +#endif + +FUNCINLINE static ATTRINLINE int Diff(Uint32 w1, Uint32 w2) +{ +#ifdef HQ2XMMXASM + if(hasMMX) + { +#ifdef __GNUC__ + int diffresult = 0; + if(w1 != w2) + __asm__("movd %3+%1*4, %%mm1; movq %%mm1, %%mm5; movd %3+%2*4, %%mm2; psubusb %%mm2, %%mm1; psubusb %%mm5, %%mm2; por %%mm2, %%mm1; psubusb $_treshold, %%mm1; movd %%mm1, %0" : "=c" (diffresult):"d" (w1),"q" (w2),"c" (RGBtoYUV) : "memory"); + return diffresult; +#else + __asm + { + xor eax,eax + mov ebx,w1 + mov edx,w2 + cmp ebx,edx + je FIN + mov ecx,offset RGBtoYUV + movd mm1,[ecx + ebx*4] + movq mm5,mm1 + movd mm2,[ecx + edx*4] + psubusb mm1,mm2 + psubusb mm2,mm5 + por mm1,mm2 + psubusb mm1,treshold + movd eax,mm1 +FIN: + }// returns result in eax register +#endif + } + else +#endif + { + YUV1 = RGBtoYUV[w1]; + YUV2 = RGBtoYUV[w2]; + return ( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ); + } +} + + +#ifdef _MSC_VER +#pragma warning(default: 4035) +#endif + + +static void hq2x_32( Uint8 * pIn, Uint8 * pOut, int Xres, int Yres, int BpL ) +{ + int i, j, k; + int prevline, nextline; + int w[10]; + int c[10]; + + // +----+----+----+ + // | | | | + // | w1 | w2 | w3 | + // +----+----+----+ + // | | | | + // | w4 | w5 | w6 | + // +----+----+----+ + // | | | | + // | w7 | w8 | w9 | + // +----+----+----+ + + for (j=0; j<Yres; j++) + { + if (j>0) prevline = -Xres*2; else prevline = 0; + if (j<Yres-1) nextline = Xres*2; else nextline = 0; + + for (i=0; i<Xres; i++) + { + int pattern = 0; + int flag = 1; + + w[2] = *((Uint16*)(pIn + prevline)); + w[5] = *((Uint16*)pIn); + w[8] = *((Uint16*)(pIn + nextline)); + + if (i>0) + { + w[1] = *((Uint16*)(pIn + prevline - 2)); + w[4] = *((Uint16*)(pIn - 2)); + w[7] = *((Uint16*)(pIn + nextline - 2)); + } + else + { + w[1] = w[2]; + w[4] = w[5]; + w[7] = w[8]; + } + + if (i<Xres-1) + { + w[3] = *((Uint16*)(pIn + prevline + 2)); + w[6] = *((Uint16*)(pIn + 2)); + w[9] = *((Uint16*)(pIn + nextline + 2)); + } + else + { + w[3] = w[2]; + w[6] = w[5]; + w[9] = w[8]; + } + +#ifdef HQ2XMMXASM + if(hasMMX) + { + if ( Diff(w[5],w[1]) ) pattern |= 0x0001; + if ( Diff(w[5],w[2]) ) pattern |= 0x0002; + if ( Diff(w[5],w[3]) ) pattern |= 0x0004; + if ( Diff(w[5],w[4]) ) pattern |= 0x0008; + if ( Diff(w[5],w[6]) ) pattern |= 0x0010; + if ( Diff(w[5],w[7]) ) pattern |= 0x0020; + if ( Diff(w[5],w[8]) ) pattern |= 0x0040; + if ( Diff(w[5],w[9]) ) pattern |= 0x0080; + } + else +#endif + { + YUV1 = RGBtoYUV[w[5]]; + + for (k=1; k<=9; k++) + { + if (k==5) continue; + + if ( w[k] != w[5] ) + { + YUV2 = RGBtoYUV[w[k]]; + if ( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ) + pattern |= flag; + } + flag <<= 1; + } + } + + for (k=1; k<=9; k++) + c[k] = LUT16to32[w[k]]; + + switch (pattern) + { + case 0: + case 1: + case 4: + case 32: + case 128: + case 5: + case 132: + case 160: + case 33: + case 129: + case 36: + case 133: + case 164: + case 161: + case 37: + case 165: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_20 + PIXEL11_20 + break; + } + case 2: + case 34: + case 130: + case 162: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + } + case 16: + case 17: + case 48: + case 49: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_21 + break; + } + case 64: + case 65: + case 68: + case 69: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_22 + break; + } + case 8: + case 12: + case 136: + case 140: + { + PIXEL00_21 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + } + case 3: + case 35: + case 131: + case 163: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + } + case 6: + case 38: + case 134: + case 166: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 20: + case 21: + case 52: + case 53: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_21 + break; + } + case 144: + case 145: + case 176: + case 177: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_12 + break; + } + case 192: + case 193: + case 196: + case 197: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_11 + break; + } + case 96: + case 97: + case 100: + case 101: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_22 + break; + } + case 40: + case 44: + case 168: + case 172: + { + PIXEL00_21 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 9: + case 13: + case 137: + case 141: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + } + case 18: + case 50: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 80: + case 81: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_20 + } + break; + } + case 72: + case 76: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 10: + case 138: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + } + case 66: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + } + case 24: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + break; + } + case 7: + case 39: + case 135: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 148: + case 149: + case 180: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_12 + break; + } + case 224: + case 228: + case 225: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_11 + break; + } + case 41: + case 169: + case 45: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 22: + case 54: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 208: + case 209: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 104: + case 108: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 11: + case 139: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + } + case 19: + case 51: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_10 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 146: + case 178: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + } + case 84: + case 85: + { + PIXEL00_20 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_10 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + } + case 112: + case 113: + { + PIXEL00_20 + PIXEL01_22 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_10 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 200: + case 204: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 73: + case 77: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_10 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + } + case 42: + case 170: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + } + case 14: + case 142: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + } + case 67: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + } + case 70: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + } + case 28: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + } + case 152: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + } + case 194: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + } + case 98: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + } + case 56: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + } + case 25: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + break; + } + case 26: + case 31: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + } + case 82: + case 214: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 88: + case 248: + { + PIXEL00_21 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 74: + case 107: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 27: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_21 + break; + } + case 86: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + PIXEL11_10 + break; + } + case 216: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 106: + { + PIXEL00_10 + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 30: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + } + case 210: + { + PIXEL00_22 + PIXEL01_10 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 120: + { + PIXEL00_21 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 75: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_22 + break; + } + case 29: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + } + case 198: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + } + case 184: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + } + case 99: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + } + case 57: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + } + case 71: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + } + case 156: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + } + case 226: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + } + case 60: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + } + case 195: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + } + case 102: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + } + case 153: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + } + case 58: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 83: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 92: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 202: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 78: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_22 + break; + } + case 154: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 114: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 89: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 90: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 55: + case 23: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_0 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 182: + case 150: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + } + case 213: + case 212: + { + PIXEL00_20 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_0 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + } + case 241: + case 240: + { + PIXEL00_20 + PIXEL01_22 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_0 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 236: + case 232: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 109: + case 105: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_0 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + } + case 171: + case 43: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + } + case 143: + case 15: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + } + case 124: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 203: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_11 + break; + } + case 62: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 211: + { + PIXEL00_11 + PIXEL01_10 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 118: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_12 + PIXEL11_10 + break; + } + case 217: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 110: + { + PIXEL00_10 + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 155: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_12 + break; + } + case 188: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_12 + break; + } + case 185: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + } + case 61: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + } + case 157: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + } + case 103: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + } + case 227: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + } + case 230: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_11 + break; + } + case 199: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + } + case 220: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 158: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 234: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_11 + break; + } + case 242: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 59: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 121: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 87: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 79: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_22 + break; + } + case 122: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 94: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 218: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 91: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 229: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_11 + break; + } + case 167: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 173: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 181: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_12 + break; + } + case 186: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_12 + break; + } + case 115: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 93: + { + PIXEL00_12 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 206: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 205: + case 201: + { + PIXEL00_12 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 174: + case 46: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + } + case 179: + case 147: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_20 + PIXEL11_12 + break; + } + case 117: + case 116: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 189: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_11 + PIXEL11_12 + break; + } + case 231: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_12 + PIXEL11_11 + break; + } + case 126: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 219: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 125: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_0 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_11 + PIXEL11_10 + break; + } + case 221: + { + PIXEL00_12 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_0 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_10 + break; + } + case 207: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_10 + PIXEL11_11 + break; + } + case 238: + { + PIXEL00_10 + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 190: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_11 + break; + } + case 187: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_10 + PIXEL11_12 + break; + } + case 243: + { + PIXEL00_11 + PIXEL01_10 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_0 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 119: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_0 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_12 + PIXEL11_10 + break; + } + case 237: + case 233: + { + PIXEL00_12 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 175: + case 47: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + } + case 183: + case 151: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_20 + PIXEL11_12 + break; + } + case 245: + case 244: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 250: + { + PIXEL00_10 + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 123: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 95: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_10 + PIXEL11_10 + break; + } + case 222: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 252: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 249: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 235: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 111: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 63: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 159: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 215: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 246: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 254: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 253: + { + PIXEL00_12 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 251: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 239: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 127: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 191: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_11 + PIXEL11_12 + break; + } + case 223: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 247: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 255: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + } + pIn+=2; + pOut+=8; + } + pOut+=BpL; + } +} + +FUNCINLINE static ATTRINLINE void InitLUTs(void) +{ + int i, j, k, r, g, b, Y, u, v; + +#ifdef HQ2XMMXASM + hasMMX = SDL_HasMMX(); +#endif + + for (i=0; i<65536; i++) + LUT16to32[i] = ((i & 0xF800) << 8) + ((i & 0x07E0) << 5) + ((i & 0x001F) << 3); + + for (i=0; i<32; i++) + for (j=0; j<64; j++) + for (k=0; k<32; k++) + { + r = i << 3; + g = j << 2; + b = k << 3; + Y = (r + g + b) >> 2; + u = 128 + ((r - b) >> 2); + v = 128 + ((-r + 2*g -b)>>3); + RGBtoYUV[ (i << 11) + (j << 5) + k ] = (Y<<16) + (u<<8) + v; + } +} + +void filter_hq2x(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, Uint32 dstPitch, int width, int height) +{ + static Uint8 doneLUT = 1; + (void)srcPitch; + if(doneLUT) InitLUTs(); + else doneLUT = 0; + hq2x_32( srcPtr, dstPtr, width, height, dstPitch ); +} diff --git a/src/sdl2/filter/hq2x.h b/src/sdl2/filter/hq2x.h new file mode 100644 index 000000000..49c0b2687 --- /dev/null +++ b/src/sdl2/filter/hq2x.h @@ -0,0 +1,1824 @@ +case 0 : +case 1 : +case 4 : +case 5 : +case 32 : +case 33 : +case 36 : +case 37 : +case 128 : +case 129 : +case 132 : +case 133 : +case 160 : +case 161 : +case 164 : +case 165 : +{ + P0 = I211(4, 1, 3); + P1 = I211(4, 1, 5); + P2 = I211(4, 3, 7); + P3 = I211(4, 5, 7); +} break; +case 2 : +case 34 : +case 130 : +case 162 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I211(4, 3, 7); + P3 = I211(4, 5, 7); +} break; +case 3 : +case 35 : +case 131 : +case 163 : +{ + P0 = I31(4, 3); + P1 = I31(4, 2); + P2 = I211(4, 3, 7); + P3 = I211(4, 5, 7); +} break; +case 6 : +case 38 : +case 134 : +case 166 : +{ + P0 = I31(4, 0); + P1 = I31(4, 5); + P2 = I211(4, 3, 7); + P3 = I211(4, 5, 7); +} break; +case 7 : +case 39 : +case 135 : +case 167 : +{ + P0 = I31(4, 3); + P1 = I31(4, 5); + P2 = I211(4, 3, 7); + P3 = I211(4, 5, 7); +} break; +case 8 : +case 12 : +case 136 : +case 140 : +{ + P0 = I31(4, 0); + P1 = I211(4, 1, 5); + P2 = I31(4, 6); + P3 = I211(4, 5, 7); +} break; +case 9 : +case 13 : +case 137 : +case 141 : +{ + P0 = I31(4, 1); + P1 = I211(4, 1, 5); + P2 = I31(4, 6); + P3 = I211(4, 5, 7); +} break; +case 10 : +case 138 : +{ + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 11 : +case 139 : +{ + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 14 : +case 142 : +{ + P2 = I31(4, 6); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = I31(4, 0); + P1 = I31(4, 5); + } else { + P0 = I332(1, 3, 4); + P1 = I521(4, 1, 5); + } +} break; +case 15 : +case 143 : +{ + P2 = I31(4, 6); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = IC(4); + P1 = I31(4, 5); + } else { + P0 = I332(1, 3, 4); + P1 = I521(4, 1, 5); + } +} break; +case 16 : +case 17 : +case 48 : +case 49 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 2); + P2 = I211(4, 3, 7); + P3 = I31(4, 8); +} break; +case 18 : +case 50 : +{ + P0 = I31(4, 0); + P2 = I211(4, 3, 7); + P3 = I31(4, 8); + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 19 : +case 51 : +{ + P2 = I211(4, 3, 7); + P3 = I31(4, 8); + if (MUR) { + P0 = I31(4, 3); + P1 = I31(4, 2); + } else { + P0 = I521(4, 1, 3); + P1 = I332(1, 5, 4); + } +} break; +case 20 : +case 21 : +case 52 : +case 53 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 1); + P2 = I211(4, 3, 7); + P3 = I31(4, 8); +} break; +case 22 : +case 54 : +{ + P0 = I31(4, 0); + P2 = I211(4, 3, 7); + P3 = I31(4, 8); + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 23 : +case 55 : +{ + P2 = I211(4, 3, 7); + P3 = I31(4, 8); + if (MUR) { + P0 = I31(4, 3); + P1 = IC(4); + } else { + P0 = I521(4, 1, 3); + P1 = I332(1, 5, 4); + } +} break; +case 24 : +case 66 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 25 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 26 : +case 31 : +case 95 : +{ + P2 = I31(4, 6); + P3 = I31(4, 8); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 27 : +case 75 : +{ + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 8); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 28 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 29 : +{ + P0 = I31(4, 1); + P1 = I31(4, 1); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 30 : +case 86 : +{ + P0 = I31(4, 0); + P2 = I31(4, 6); + P3 = I31(4, 8); + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 40 : +case 44 : +case 168 : +case 172 : +{ + P0 = I31(4, 0); + P1 = I211(4, 1, 5); + P2 = I31(4, 7); + P3 = I211(4, 5, 7); +} break; +case 41 : +case 45 : +case 169 : +case 173 : +{ + P0 = I31(4, 1); + P1 = I211(4, 1, 5); + P2 = I31(4, 7); + P3 = I211(4, 5, 7); +} break; +case 42 : +case 170 : +{ + P1 = I31(4, 2); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = I31(4, 0); + P2 = I31(4, 7); + } else { + P0 = I332(1, 3, 4); + P2 = I521(4, 3, 7); + } +} break; +case 43 : +case 171 : +{ + P1 = I31(4, 2); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = IC(4); + P2 = I31(4, 7); + } else { + P0 = I332(1, 3, 4); + P2 = I521(4, 3, 7); + } +} break; +case 46 : +case 174 : +{ + P1 = I31(4, 5); + P2 = I31(4, 7); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } +} break; +case 47 : +case 175 : +{ + P1 = I31(4, 5); + P2 = I31(4, 7); + P3 = I211(4, 5, 7); + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } +} break; +case 56 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 7); + P3 = I31(4, 8); +} break; +case 57 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + P2 = I31(4, 7); + P3 = I31(4, 8); +} break; +case 58 : +{ + P2 = I31(4, 7); + P3 = I31(4, 8); + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 59 : +{ + P2 = I31(4, 7); + P3 = I31(4, 8); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 60 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + P2 = I31(4, 7); + P3 = I31(4, 8); +} break; +case 61 : +{ + P0 = I31(4, 1); + P1 = I31(4, 1); + P2 = I31(4, 7); + P3 = I31(4, 8); +} break; +case 62 : +{ + P0 = I31(4, 0); + P2 = I31(4, 7); + P3 = I31(4, 8); + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 63 : +{ + P2 = I31(4, 7); + P3 = I31(4, 8); + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 64 : +case 65 : +case 68 : +case 69 : +{ + P0 = I211(4, 1, 3); + P1 = I211(4, 1, 5); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 67 : +{ + P0 = I31(4, 3); + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 70 : +{ + P0 = I31(4, 0); + P1 = I31(4, 5); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 71 : +{ + P0 = I31(4, 3); + P1 = I31(4, 5); + P2 = I31(4, 6); + P3 = I31(4, 8); +} break; +case 72 : +case 76 : +{ + P0 = I31(4, 0); + P1 = I211(4, 1, 5); + P3 = I31(4, 8); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I211(4, 3, 7); + } +} break; +case 73 : +case 77 : +{ + P1 = I211(4, 1, 5); + P3 = I31(4, 8); + if (MDL) { + P0 = I31(4, 1); + P2 = I31(4, 6); + } else { + P0 = I521(4, 3, 1); + P2 = I332(3, 7, 4); + } +} break; +case 74 : +case 107 : +case 123 : +{ + P1 = I31(4, 2); + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 78 : +{ + P1 = I31(4, 5); + P3 = I31(4, 8); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } +} break; +case 79 : +{ + P1 = I31(4, 5); + P3 = I31(4, 8); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 80 : +case 81 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 2); + P2 = I31(4, 6); + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 82 : +case 214 : +case 222 : +{ + P0 = I31(4, 0); + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 83 : +{ + P0 = I31(4, 3); + P2 = I31(4, 6); + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 84 : +case 85 : +{ + P0 = I211(4, 1, 3); + P2 = I31(4, 6); + if (MDR) { + P1 = I31(4, 1); + P3 = I31(4, 8); + } else { + P1 = I521(4, 5, 1); + P3 = I332(5, 7, 4); + } +} break; +case 87 : +{ + P0 = I31(4, 3); + P2 = I31(4, 6); + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 88 : +case 248 : +case 250 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 89 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } +} break; +case 90 : +{ + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 91 : +{ + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 92 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } +} break; +case 93 : +{ + P0 = I31(4, 1); + P1 = I31(4, 1); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } +} break; +case 94 : +{ + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 96 : +case 97 : +case 100 : +case 101 : +{ + P0 = I211(4, 1, 3); + P1 = I211(4, 1, 5); + P2 = I31(4, 3); + P3 = I31(4, 8); +} break; +case 98 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 3); + P3 = I31(4, 8); +} break; +case 99 : +{ + P0 = I31(4, 3); + P1 = I31(4, 2); + P2 = I31(4, 3); + P3 = I31(4, 8); +} break; +case 102 : +{ + P0 = I31(4, 0); + P1 = I31(4, 5); + P2 = I31(4, 3); + P3 = I31(4, 8); +} break; +case 103 : +{ + P0 = I31(4, 3); + P1 = I31(4, 5); + P2 = I31(4, 3); + P3 = I31(4, 8); +} break; +case 104 : +case 108 : +{ + P0 = I31(4, 0); + P1 = I211(4, 1, 5); + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } +} break; +case 105 : +case 109 : +{ + P1 = I211(4, 1, 5); + P3 = I31(4, 8); + if (MDL) { + P0 = I31(4, 1); + P2 = IC(4); + } else { + P0 = I521(4, 3, 1); + P2 = I332(3, 7, 4); + } +} break; +case 106 : +case 120 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } +} break; +case 110 : +{ + P0 = I31(4, 0); + P1 = I31(4, 5); + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } +} break; +case 111 : +{ + P1 = I31(4, 5); + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } +} break; +case 112 : +case 113 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 2); + if (MDR) { + P2 = I31(4, 3); + P3 = I31(4, 8); + } else { + P2 = I521(4, 7, 3); + P3 = I332(5, 7, 4); + } +} break; +case 114 : +{ + P0 = I31(4, 0); + P2 = I31(4, 3); + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 115 : +{ + P0 = I31(4, 3); + P2 = I31(4, 3); + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 116 : +case 117 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 1); + P2 = I31(4, 3); + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } +} break; +case 118 : +{ + P0 = I31(4, 0); + P2 = I31(4, 3); + P3 = I31(4, 8); + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 119 : +{ + P2 = I31(4, 3); + P3 = I31(4, 8); + if (MUR) { + P0 = I31(4, 3); + P1 = IC(4); + } else { + P0 = I521(4, 1, 3); + P1 = I332(1, 5, 4); + } +} break; +case 121 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } +} break; +case 122 : +{ + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MDR) { + P3 = I31(4, 8); + } else { + P3 = I611(4, 5, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 124 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } +} break; +case 125 : +{ + P1 = I31(4, 1); + P3 = I31(4, 8); + if (MDL) { + P0 = I31(4, 1); + P2 = IC(4); + } else { + P0 = I521(4, 3, 1); + P2 = I332(3, 7, 4); + } +} break; +case 126 : +{ + P0 = I31(4, 0); + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 127 : +{ + P3 = I31(4, 8); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 144 : +case 145 : +case 176 : +case 177 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 2); + P2 = I211(4, 3, 7); + P3 = I31(4, 7); +} break; +case 146 : +case 178 : +{ + P0 = I31(4, 0); + P2 = I211(4, 3, 7); + if (MUR) { + P1 = I31(4, 2); + P3 = I31(4, 7); + } else { + P1 = I332(1, 5, 4); + P3 = I521(4, 5, 7); + } +} break; +case 147 : +case 179 : +{ + P0 = I31(4, 3); + P2 = I211(4, 3, 7); + P3 = I31(4, 7); + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 148 : +case 149 : +case 180 : +case 181 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 1); + P2 = I211(4, 3, 7); + P3 = I31(4, 7); +} break; +case 150 : +case 182 : +{ + P0 = I31(4, 0); + P2 = I211(4, 3, 7); + if (MUR) { + P1 = IC(4); + P3 = I31(4, 7); + } else { + P1 = I332(1, 5, 4); + P3 = I521(4, 5, 7); + } +} break; +case 151 : +case 183 : +{ + P0 = I31(4, 3); + P2 = I211(4, 3, 7); + P3 = I31(4, 7); + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 152 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 7); +} break; +case 153 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 7); +} break; +case 154 : +{ + P2 = I31(4, 6); + P3 = I31(4, 7); + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 155 : +{ + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 7); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 156 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + P2 = I31(4, 6); + P3 = I31(4, 7); +} break; +case 157 : +{ + P0 = I31(4, 1); + P1 = I31(4, 1); + P2 = I31(4, 6); + P3 = I31(4, 7); +} break; +case 158 : +{ + P2 = I31(4, 6); + P3 = I31(4, 7); + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 159 : +{ + P2 = I31(4, 6); + P3 = I31(4, 7); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 184 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 7); + P3 = I31(4, 7); +} break; +case 185 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + P2 = I31(4, 7); + P3 = I31(4, 7); +} break; +case 186 : +{ + P2 = I31(4, 7); + P3 = I31(4, 7); + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 187 : +{ + P1 = I31(4, 2); + P3 = I31(4, 7); + if (MUL) { + P0 = IC(4); + P2 = I31(4, 7); + } else { + P0 = I332(1, 3, 4); + P2 = I521(4, 3, 7); + } +} break; +case 188 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + P2 = I31(4, 7); + P3 = I31(4, 7); +} break; +case 189 : +{ + P0 = I31(4, 1); + P1 = I31(4, 1); + P2 = I31(4, 7); + P3 = I31(4, 7); +} break; +case 190 : +{ + P0 = I31(4, 0); + P2 = I31(4, 7); + if (MUR) { + P1 = IC(4); + P3 = I31(4, 7); + } else { + P1 = I332(1, 5, 4); + P3 = I521(4, 5, 7); + } +} break; +case 191 : +{ + P2 = I31(4, 7); + P3 = I31(4, 7); + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 192 : +case 193 : +case 196 : +case 197 : +{ + P0 = I211(4, 1, 3); + P1 = I211(4, 1, 5); + P2 = I31(4, 6); + P3 = I31(4, 5); +} break; +case 194 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 5); +} break; +case 195 : +{ + P0 = I31(4, 3); + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 5); +} break; +case 198 : +{ + P0 = I31(4, 0); + P1 = I31(4, 5); + P2 = I31(4, 6); + P3 = I31(4, 5); +} break; +case 199 : +{ + P0 = I31(4, 3); + P1 = I31(4, 5); + P2 = I31(4, 6); + P3 = I31(4, 5); +} break; +case 200 : +case 204 : +{ + P0 = I31(4, 0); + P1 = I211(4, 1, 5); + if (MDL) { + P2 = I31(4, 6); + P3 = I31(4, 5); + } else { + P2 = I332(3, 7, 4); + P3 = I521(4, 7, 5); + } +} break; +case 201 : +case 205 : +{ + P0 = I31(4, 1); + P1 = I211(4, 1, 5); + P3 = I31(4, 5); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } +} break; +case 202 : +{ + P1 = I31(4, 2); + P3 = I31(4, 5); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } +} break; +case 203 : +{ + P1 = I31(4, 2); + P2 = I31(4, 6); + P3 = I31(4, 5); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 206 : +{ + P1 = I31(4, 5); + P3 = I31(4, 5); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } +} break; +case 207 : +{ + P2 = I31(4, 6); + P3 = I31(4, 5); + if (MUL) { + P0 = IC(4); + P1 = I31(4, 5); + } else { + P0 = I332(1, 3, 4); + P1 = I521(4, 1, 5); + } +} break; +case 208 : +case 209 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 2); + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 210 : +case 216 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 211 : +{ + P0 = I31(4, 3); + P1 = I31(4, 2); + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 212 : +case 213 : +{ + P0 = I211(4, 1, 3); + P2 = I31(4, 6); + if (MDR) { + P1 = I31(4, 1); + P3 = IC(4); + } else { + P1 = I521(4, 5, 1); + P3 = I332(5, 7, 4); + } +} break; +case 215 : +{ + P0 = I31(4, 3); + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 217 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 218 : +{ + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 219 : +{ + P1 = I31(4, 2); + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 220 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + if (MDL) { + P2 = I31(4, 6); + } else { + P2 = I611(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 221 : +{ + P0 = I31(4, 1); + P2 = I31(4, 6); + if (MDR) { + P1 = I31(4, 1); + P3 = IC(4); + } else { + P1 = I521(4, 5, 1); + P3 = I332(5, 7, 4); + } +} break; +case 223 : +{ + P2 = I31(4, 6); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 224 : +case 225 : +case 228 : +case 229 : +{ + P0 = I211(4, 1, 3); + P1 = I211(4, 1, 5); + P2 = I31(4, 3); + P3 = I31(4, 5); +} break; +case 226 : +{ + P0 = I31(4, 0); + P1 = I31(4, 2); + P2 = I31(4, 3); + P3 = I31(4, 5); +} break; +case 227 : +{ + P0 = I31(4, 3); + P1 = I31(4, 2); + P2 = I31(4, 3); + P3 = I31(4, 5); +} break; +case 230 : +{ + P0 = I31(4, 0); + P1 = I31(4, 5); + P2 = I31(4, 3); + P3 = I31(4, 5); +} break; +case 231 : +{ + P0 = I31(4, 3); + P1 = I31(4, 5); + P2 = I31(4, 3); + P3 = I31(4, 5); +} break; +case 232 : +case 236 : +{ + P0 = I31(4, 0); + P1 = I211(4, 1, 5); + if (MDL) { + P2 = IC(4); + P3 = I31(4, 5); + } else { + P2 = I332(3, 7, 4); + P3 = I521(4, 7, 5); + } +} break; +case 233 : +case 237 : +{ + P0 = I31(4, 1); + P1 = I211(4, 1, 5); + P3 = I31(4, 5); + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } +} break; +case 234 : +{ + P1 = I31(4, 2); + P3 = I31(4, 5); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MUL) { + P0 = I31(4, 0); + } else { + P0 = I611(4, 1, 3); + } +} break; +case 235 : +{ + P1 = I31(4, 2); + P3 = I31(4, 5); + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 238 : +{ + P0 = I31(4, 0); + P1 = I31(4, 5); + if (MDL) { + P2 = IC(4); + P3 = I31(4, 5); + } else { + P2 = I332(3, 7, 4); + P3 = I521(4, 7, 5); + } +} break; +case 239 : +{ + P1 = I31(4, 5); + P3 = I31(4, 5); + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } +} break; +case 240 : +case 241 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 2); + if (MDR) { + P2 = I31(4, 3); + P3 = IC(4); + } else { + P2 = I521(4, 7, 3); + P3 = I332(5, 7, 4); + } +} break; +case 242 : +{ + P0 = I31(4, 0); + P2 = I31(4, 3); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUR) { + P1 = I31(4, 2); + } else { + P1 = I611(4, 1, 5); + } +} break; +case 243 : +{ + P0 = I31(4, 3); + P1 = I31(4, 2); + if (MDR) { + P2 = I31(4, 3); + P3 = IC(4); + } else { + P2 = I521(4, 7, 3); + P3 = I332(5, 7, 4); + } +} break; +case 244 : +case 245 : +{ + P0 = I211(4, 1, 3); + P1 = I31(4, 1); + P2 = I31(4, 3); + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } +} break; +case 246 : +{ + P0 = I31(4, 0); + P2 = I31(4, 3); + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 247 : +{ + P0 = I31(4, 3); + P2 = I31(4, 3); + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 249 : +{ + P0 = I31(4, 1); + P1 = I31(4, 2); + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } +} break; +case 251 : +{ + P1 = I31(4, 2); + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 252 : +{ + P0 = I31(4, 0); + P1 = I31(4, 1); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } +} break; +case 253 : +{ + P0 = I31(4, 1); + P1 = I31(4, 1); + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } +} break; +case 254 : +{ + P0 = I31(4, 0); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 255 : +{ + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; diff --git a/src/sdl2/filter/interp.h b/src/sdl2/filter/interp.h new file mode 100644 index 000000000..e994387fb --- /dev/null +++ b/src/sdl2/filter/interp.h @@ -0,0 +1,306 @@ +/* + * This file is part of the Advance project. + * + * Copyright (C) 2003 Andrea Mazzoleni + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * In addition, as a special exception, Andrea Mazzoleni + * gives permission to link the code of this program with + * the MAME library (or with modified versions of MAME that use the + * same license as MAME), and distribute linked combinations including + * the two. You must obey the GNU General Public License in all + * respects for all of the code used other than MAME. If you modify + * this file, you may extend this exception to your version of the + * file, but you are not obligated to do so. If you do not wish to + * do so, delete this exception statement from your version. + */ + +#ifndef __INTERP_H +#define __INTERP_H + +/***************************************************************************/ +/* Basic types */ + +/***************************************************************************/ +/* interpolation */ + +static Uint32 interp_mask[2] = {0xF81F,0x07E0}; +static Uint32 interp_bits_per_pixel = 16; + +#define INTERP_16_MASK_1(v) (v & interp_mask[0]) +#define INTERP_16_MASK_2(v) (v & interp_mask[1]) + +FUNCINLINE static ATTRINLINE Uint16 interp_16_521(Uint16 p1, Uint16 p2, Uint16 p3) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*2 + INTERP_16_MASK_1(p3)*1) / 8) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*2 + INTERP_16_MASK_2(p3)*1) / 8)); +} + +FUNCINLINE static ATTRINLINE Uint16 interp_16_332(Uint16 p1, Uint16 p2, Uint16 p3) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)*2) / 8) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)*2) / 8)); +} + +FUNCINLINE static ATTRINLINE Uint16 interp_16_611(Uint16 p1, Uint16 p2, Uint16 p3) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*6 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 8) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*6 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 8)); +} + +/* +FUNCINLINE static ATTRINLINE Uint16 interp_16_71(Uint16 p1, Uint16 p2) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*7 + INTERP_16_MASK_1(p2)) / 8) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*7 + INTERP_16_MASK_2(p2)) / 8)); +} +*/ + +FUNCINLINE static ATTRINLINE Uint16 interp_16_211(Uint16 p1, Uint16 p2, Uint16 p3) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*2 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 4) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*2 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 4)); +} + +/* +FUNCINLINE static ATTRINLINE Uint16 interp_16_772(Uint16 p1, Uint16 p2, Uint16 p3) +{ + return (Uint16)(INTERP_16_MASK_1(((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2))*7 + INTERP_16_MASK_1(p3)*2) / 16) + | INTERP_16_MASK_2(((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2))*7 + INTERP_16_MASK_2(p3)*2) / 16)); +} + +FUNCINLINE static ATTRINLINE Uint16 interp_16_11(Uint16 p1, Uint16 p2) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1) + INTERP_16_MASK_1(p2)) / 2) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1) + INTERP_16_MASK_2(p2)) / 2)); +} +*/ + +FUNCINLINE static ATTRINLINE Uint16 interp_16_31(Uint16 p1, Uint16 p2) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*3 + INTERP_16_MASK_1(p2)) / 4) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*3 + INTERP_16_MASK_2(p2)) / 4)); +} + +FUNCINLINE static ATTRINLINE Uint16 interp_16_1411(Uint16 p1, Uint16 p2, Uint16 p3) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*14 + INTERP_16_MASK_1(p2) + INTERP_16_MASK_1(p3)) / 16) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*14 + INTERP_16_MASK_2(p2) + INTERP_16_MASK_2(p3)) / 16)); +} + +/* +FUNCINLINE static ATTRINLINE Uint16 interp_16_431(Uint16 p1, Uint16 p2, Uint16 p3) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*4 + INTERP_16_MASK_1(p2)*3 + INTERP_16_MASK_1(p3)) / 8) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*4 + INTERP_16_MASK_2(p2)*3 + INTERP_16_MASK_2(p3)) / 8)); +} + +FUNCINLINE static ATTRINLINE Uint16 interp_16_53(Uint16 p1, Uint16 p2) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*5 + INTERP_16_MASK_1(p2)*3) / 8) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*5 + INTERP_16_MASK_2(p2)*3) / 8)); +} + +FUNCINLINE static ATTRINLINE Uint16 interp_16_151(Uint16 p1, Uint16 p2) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*15 + INTERP_16_MASK_1(p2)) / 16) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*15 + INTERP_16_MASK_2(p2)) / 16)); +} + +FUNCINLINE static ATTRINLINE Uint16 interp_16_97(Uint16 p1, Uint16 p2) +{ + return (Uint16)(INTERP_16_MASK_1((INTERP_16_MASK_1(p1)*9 + INTERP_16_MASK_1(p2)*7) / 16) + | INTERP_16_MASK_2((INTERP_16_MASK_2(p1)*9 + INTERP_16_MASK_2(p2)*7) / 16)); +} +*/ + +#define INTERP_32_MASK_1(v) (v & 0xFF00FF) +#define INTERP_32_MASK_2(v) (v & 0x00FF00) + +FUNCINLINE static ATTRINLINE Uint32 interp_32_521(Uint32 p1, Uint32 p2, Uint32 p3) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*2 + INTERP_32_MASK_1(p3)*1) / 8) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*2 + INTERP_32_MASK_2(p3)*1) / 8); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_332(Uint32 p1, Uint32 p2, Uint32 p3) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)*2) / 8) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)*2) / 8); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_211(Uint32 p1, Uint32 p2, Uint32 p3) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*2 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 4) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*2 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 4); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_611(Uint32 p1, Uint32 p2, Uint32 p3) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*6 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 8) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*6 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 8); +} + +/* +FUNCINLINE static ATTRINLINE Uint32 interp_32_71(Uint32 p1, Uint32 p2) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*7 + INTERP_32_MASK_1(p2)) / 8) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*7 + INTERP_32_MASK_2(p2)) / 8); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_772(Uint32 p1, Uint32 p2, Uint32 p3) +{ + return INTERP_32_MASK_1(((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2))*7 + INTERP_32_MASK_1(p3)*2) / 16) + | INTERP_32_MASK_2(((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2))*7 + INTERP_32_MASK_2(p3)*2) / 16); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_11(Uint32 p1, Uint32 p2) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1) + INTERP_32_MASK_1(p2)) / 2) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1) + INTERP_32_MASK_2(p2)) / 2); +} +*/ + +FUNCINLINE static ATTRINLINE Uint32 interp_32_31(Uint32 p1, Uint32 p2) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*3 + INTERP_32_MASK_1(p2)) / 4) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*3 + INTERP_32_MASK_2(p2)) / 4); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_1411(Uint32 p1, Uint32 p2, Uint32 p3) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*14 + INTERP_32_MASK_1(p2) + INTERP_32_MASK_1(p3)) / 16) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*14 + INTERP_32_MASK_2(p2) + INTERP_32_MASK_2(p3)) / 16); +} + +/* +FUNCINLINE static ATTRINLINE Uint32 interp_32_431(Uint32 p1, Uint32 p2, Uint32 p3) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*4 + INTERP_32_MASK_1(p2)*3 + INTERP_32_MASK_1(p3)) / 8) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*4 + INTERP_32_MASK_2(p2)*3 + INTERP_32_MASK_2(p3)) / 8); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_53(Uint32 p1, Uint32 p2) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*5 + INTERP_32_MASK_1(p2)*3) / 8) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*5 + INTERP_32_MASK_2(p2)*3) / 8); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_151(Uint32 p1, Uint32 p2) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*15 + INTERP_32_MASK_1(p2)) / 16) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*15 + INTERP_32_MASK_2(p2)) / 16); +} + +FUNCINLINE static ATTRINLINE Uint32 interp_32_97(Uint32 p1, Uint32 p2) +{ + return INTERP_32_MASK_1((INTERP_32_MASK_1(p1)*9 + INTERP_32_MASK_1(p2)*7) / 16) + | INTERP_32_MASK_2((INTERP_32_MASK_2(p1)*9 + INTERP_32_MASK_2(p2)*7) / 16); +} +*/ + +/***************************************************************************/ +/* diff */ + +#define INTERP_Y_LIMIT (0x30*4) +#define INTERP_U_LIMIT (0x07*4) +#define INTERP_V_LIMIT (0x06*8) + +static int interp_16_diff(Uint16 p1, Uint16 p2) +{ + int r, g, b; + int y, u, v; + + if (p1 == p2) + return 0; + + if (interp_bits_per_pixel == 16) { + b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; + g = (int)((p1 & 0x7E0) - (p2 & 0x7E0)) >> 3; + r = (int)((p1 & 0xF800) - (p2 & 0xF800)) >> 8; + } else { + b = (int)((p1 & 0x1F) - (p2 & 0x1F)) << 3; + g = (int)((p1 & 0x3E0) - (p2 & 0x3E0)) >> 2; + r = (int)((p1 & 0x7C00) - (p2 & 0x7C00)) >> 7; + } + + y = r + g + b; + u = r - b; + v = -r + 2*g - b; + + if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT) + return 1; + + if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT) + return 1; + + if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT) + return 1; + + return 0; +} + +static int interp_32_diff(Uint32 p1, Uint32 p2) +{ + int r, g, b; + int y, u, v; + + if ((p1 & 0xF8F8F8) == (p2 & 0xF8F8F8)) + return 0; + + b = (int)((p1 & 0xFF) - (p2 & 0xFF)); + g = (int)((p1 & 0xFF00) - (p2 & 0xFF00)) >> 8; + r = (int)((p1 & 0xFF0000) - (p2 & 0xFF0000)) >> 16; + + y = r + g + b; + u = r - b; + v = -r + 2*g - b; + + if (y < -INTERP_Y_LIMIT || y > INTERP_Y_LIMIT) + return 1; + + if (u < -INTERP_U_LIMIT || u > INTERP_U_LIMIT) + return 1; + + if (v < -INTERP_V_LIMIT || v > INTERP_V_LIMIT) + return 1; + + return 0; +} + +/* +static void interp_set(Uint32 bits_per_pixel) +{ + interp_bits_per_pixel = bits_per_pixel; + + switch (bits_per_pixel) { + case 15 : + interp_mask[0] = 0x7C1F; + interp_mask[1] = 0x03E0; + break; + case 16 : + interp_mask[0] = 0xF81F; + interp_mask[1] = 0x07E0; + break; + case 32 : + interp_mask[0] = 0xFF00FF; + interp_mask[1] = 0x00FF00; + break; + } +} +*/ + +#endif diff --git a/src/sdl2/filter/lq2x.c b/src/sdl2/filter/lq2x.c new file mode 100644 index 000000000..8d06fa8cc --- /dev/null +++ b/src/sdl2/filter/lq2x.c @@ -0,0 +1,564 @@ +#include "filters.h" +#include "interp.h" + +static void hq2x_16_def(Uint16* dst0, Uint16* dst1, const Uint16* src0, const Uint16* src1, const Uint16* src2, Uint32 count) +{ + Uint32 i; + + for(i=0;i<count;++i) { + Uint8 mask; + + Uint16 c[9]; + + c[1] = src0[0]; + c[4] = src1[0]; + c[7] = src2[0]; + + if (i>0) { + c[0] = src0[-1]; + c[3] = src1[-1]; + c[6] = src2[-1]; + } else { + c[0] = c[1]; + c[3] = c[4]; + c[6] = c[7]; + } + + if (i<count-1) { + c[2] = src0[1]; + c[5] = src1[1]; + c[8] = src2[1]; + } else { + c[2] = c[1]; + c[5] = c[4]; + c[8] = c[7]; + } + + mask = 0; + + if (interp_16_diff(c[0], c[4])) + mask |= 1 << 0; + if (interp_16_diff(c[1], c[4])) + mask |= 1 << 1; + if (interp_16_diff(c[2], c[4])) + mask |= 1 << 2; + if (interp_16_diff(c[3], c[4])) + mask |= 1 << 3; + if (interp_16_diff(c[5], c[4])) + mask |= 1 << 4; + if (interp_16_diff(c[6], c[4])) + mask |= 1 << 5; + if (interp_16_diff(c[7], c[4])) + mask |= 1 << 6; + if (interp_16_diff(c[8], c[4])) + mask |= 1 << 7; + +#define P0 dst0[0] +#define P1 dst0[1] +#define P2 dst1[0] +#define P3 dst1[1] +#define MUR interp_16_diff(c[1], c[5]) +#define MDR interp_16_diff(c[5], c[7]) +#define MDL interp_16_diff(c[7], c[3]) +#define MUL interp_16_diff(c[3], c[1]) +#define IC(p0) c[p0] +#define I11(p0,p1) interp_16_11(c[p0], c[p1]) +#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2]) +#define I31(p0,p1) interp_16_31(c[p0], c[p1]) +#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2]) +#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2]) +#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2]) +#define I53(p0,p1) interp_16_53(c[p0], c[p1]) +#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2]) +#define I71(p0,p1) interp_16_71(c[p0], c[p1]) +#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2]) +#define I97(p0,p1) interp_16_97(c[p0], c[p1]) +#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2]) +#define I151(p0,p1) interp_16_151(c[p0], c[p1]) + + switch (mask) { +#include "hq2x.h" + } + +#undef P0 +#undef P1 +#undef P2 +#undef P3 +#undef MUR +#undef MDR +#undef MDL +#undef MUL +#undef IC +#undef I11 +#undef I211 +#undef I31 +#undef I332 +#undef I431 +#undef I521 +#undef I53 +#undef I611 +#undef I71 +#undef I772 +#undef I97 +#undef I1411 +#undef I151 + + src0 += 1; + src1 += 1; + src2 += 1; + dst0 += 2; + dst1 += 2; + } +} + +static void hq2x_32_def(Uint32* dst0, Uint32* dst1, const Uint32* src0, const Uint32* src1, const Uint32* src2, Uint32 count) +{ + Uint32 i; + + for(i=0;i<count;++i) { + Uint8 mask; + + Uint32 c[9]; + + c[1] = src0[0]; + c[4] = src1[0]; + c[7] = src2[0]; + + if (i>0) { + c[0] = src0[-1]; + c[3] = src1[-1]; + c[6] = src2[-1]; + } else { + c[0] = c[1]; + c[3] = c[4]; + c[6] = c[7]; + } + + if (i<count-1) { + c[2] = src0[1]; + c[5] = src1[1]; + c[8] = src2[1]; + } else { + c[2] = c[1]; + c[5] = c[4]; + c[8] = c[7]; + } + + mask = 0; + + if (interp_32_diff(c[0], c[4])) + mask |= 1 << 0; + if (interp_32_diff(c[1], c[4])) + mask |= 1 << 1; + if (interp_32_diff(c[2], c[4])) + mask |= 1 << 2; + if (interp_32_diff(c[3], c[4])) + mask |= 1 << 3; + if (interp_32_diff(c[5], c[4])) + mask |= 1 << 4; + if (interp_32_diff(c[6], c[4])) + mask |= 1 << 5; + if (interp_32_diff(c[7], c[4])) + mask |= 1 << 6; + if (interp_32_diff(c[8], c[4])) + mask |= 1 << 7; + +#define P0 dst0[0] +#define P1 dst0[1] +#define P2 dst1[0] +#define P3 dst1[1] +#define MUR interp_32_diff(c[1], c[5]) +#define MDR interp_32_diff(c[5], c[7]) +#define MDL interp_32_diff(c[7], c[3]) +#define MUL interp_32_diff(c[3], c[1]) +#define IC(p0) c[p0] +#define I11(p0,p1) interp_32_11(c[p0], c[p1]) +#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2]) +#define I31(p0,p1) interp_32_31(c[p0], c[p1]) +#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2]) +#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2]) +#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2]) +#define I53(p0,p1) interp_32_53(c[p0], c[p1]) +#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2]) +#define I71(p0,p1) interp_32_71(c[p0], c[p1]) +#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2]) +#define I97(p0,p1) interp_32_97(c[p0], c[p1]) +#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2]) +#define I151(p0,p1) interp_32_151(c[p0], c[p1]) + + switch (mask) { +#include "hq2x.h" + } + +#undef P0 +#undef P1 +#undef P2 +#undef P3 +#undef MUR +#undef MDR +#undef MDL +#undef MUL +#undef IC +#undef I11 +#undef I211 +#undef I31 +#undef I332 +#undef I431 +#undef I521 +#undef I53 +#undef I611 +#undef I71 +#undef I772 +#undef I97 +#undef I1411 +#undef I151 + + src0 += 1; + src1 += 1; + src2 += 1; + dst0 += 2; + dst1 += 2; + } +} + +/***************************************************************************/ +/* LQ2x C implementation */ + +/* + * This effect is derived from the hq2x effect made by Maxim Stepin + */ + +static void lq2x_16_def(Uint16* dst0, Uint16* dst1, const Uint16* src0, const Uint16* src1, const Uint16* src2, Uint32 count) +{ + Uint32 i; + + for(i=0;i<count;++i) { + Uint8 mask; + + Uint16 c[9]; + + c[1] = src0[0]; + c[4] = src1[0]; + c[7] = src2[0]; + + if (i>0) { + c[0] = src0[-1]; + c[3] = src1[-1]; + c[6] = src2[-1]; + } else { + c[0] = c[1]; + c[3] = c[4]; + c[6] = c[7]; + } + + if (i<count-1) { + c[2] = src0[1]; + c[5] = src1[1]; + c[8] = src2[1]; + } else { + c[2] = c[1]; + c[5] = c[4]; + c[8] = c[7]; + } + + mask = 0; + + if (c[0] != c[4]) + mask |= 1 << 0; + if (c[1] != c[4]) + mask |= 1 << 1; + if (c[2] != c[4]) + mask |= 1 << 2; + if (c[3] != c[4]) + mask |= 1 << 3; + if (c[5] != c[4]) + mask |= 1 << 4; + if (c[6] != c[4]) + mask |= 1 << 5; + if (c[7] != c[4]) + mask |= 1 << 6; + if (c[8] != c[4]) + mask |= 1 << 7; + +#define P0 dst0[0] +#define P1 dst0[1] +#define P2 dst1[0] +#define P3 dst1[1] +#define MUR (c[1] != c[5]) +#define MDR (c[5] != c[7]) +#define MDL (c[7] != c[3]) +#define MUL (c[3] != c[1]) +#define IC(p0) c[p0] +#define I11(p0,p1) interp_16_11(c[p0], c[p1]) +#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2]) +#define I31(p0,p1) interp_16_31(c[p0], c[p1]) +#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2]) +#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2]) +#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2]) +#define I53(p0,p1) interp_16_53(c[p0], c[p1]) +#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2]) +#define I71(p0,p1) interp_16_71(c[p0], c[p1]) +#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2]) +#define I97(p0,p1) interp_16_97(c[p0], c[p1]) +#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2]) +#define I151(p0,p1) interp_16_151(c[p0], c[p1]) + + switch (mask) { +#include "lq2x.h" + } + +#undef P0 +#undef P1 +#undef P2 +#undef P3 +#undef MUR +#undef MDR +#undef MDL +#undef MUL +#undef IC +#undef I11 +#undef I211 +#undef I31 +#undef I332 +#undef I431 +#undef I521 +#undef I53 +#undef I611 +#undef I71 +#undef I772 +#undef I97 +#undef I1411 +#undef I151 + + src0 += 1; + src1 += 1; + src2 += 1; + dst0 += 2; + dst1 += 2; + } +} + +static void lq2x_32_def(Uint32* dst0, Uint32* dst1, const Uint32* src0, const Uint32* src1, const Uint32* src2, Uint32 count) +{ + Uint32 i; + + for(i=0;i<count;++i) { + Uint8 mask; + + Uint32 c[9]; + + c[1] = src0[0]; + c[4] = src1[0]; + c[7] = src2[0]; + + if (i>0) { + c[0] = src0[-1]; + c[3] = src1[-1]; + c[6] = src2[-1]; + } else { + c[0] = c[1]; + c[3] = c[4]; + c[6] = c[7]; + } + + if (i<count-1) { + c[2] = src0[1]; + c[5] = src1[1]; + c[8] = src2[1]; + } else { + c[2] = c[1]; + c[5] = c[4]; + c[8] = c[7]; + } + + mask = 0; + + if (c[0] != c[4]) + mask |= 1 << 0; + if (c[1] != c[4]) + mask |= 1 << 1; + if (c[2] != c[4]) + mask |= 1 << 2; + if (c[3] != c[4]) + mask |= 1 << 3; + if (c[5] != c[4]) + mask |= 1 << 4; + if (c[6] != c[4]) + mask |= 1 << 5; + if (c[7] != c[4]) + mask |= 1 << 6; + if (c[8] != c[4]) + mask |= 1 << 7; + +#define P0 dst0[0] +#define P1 dst0[1] +#define P2 dst1[0] +#define P3 dst1[1] +#define MUR (c[1] != c[5]) +#define MDR (c[5] != c[7]) +#define MDL (c[7] != c[3]) +#define MUL (c[3] != c[1]) +#define IC(p0) c[p0] +#define I11(p0,p1) interp_32_11(c[p0], c[p1]) +#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2]) +#define I31(p0,p1) interp_32_31(c[p0], c[p1]) +#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2]) +#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2]) +#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2]) +#define I53(p0,p1) interp_32_53(c[p0], c[p1]) +#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2]) +#define I71(p0,p1) interp_32_71(c[p0], c[p1]) +#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2]) +#define I97(p0,p1) interp_32_97(c[p0], c[p1]) +#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2]) +#define I151(p0,p1) interp_32_151(c[p0], c[p1]) + + switch (mask) { +#include "lq2x.h" + } + +#undef P0 +#undef P1 +#undef P2 +#undef P3 +#undef MUR +#undef MDR +#undef MDL +#undef MUL +#undef IC +#undef I11 +#undef I211 +#undef I31 +#undef I332 +#undef I431 +#undef I521 +#undef I53 +#undef I611 +#undef I71 +#undef I772 +#undef I97 +#undef I1411 +#undef I151 + + src0 += 1; + src1 += 1; + src2 += 1; + dst0 += 2; + dst1 += 2; + } +} + +void hq2x16(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, + Uint32 dstPitch, int width, int height) +{ + Uint16 *dst0 = (Uint16 *)dstPtr; + Uint16 *dst1 = dst0 + (dstPitch >> 1); + + Uint16 *src0 = (Uint16 *)srcPtr; + Uint16 *src1 = src0 + (srcPitch >> 1); + Uint16 *src2 = src1 + (srcPitch >> 1); + int count = height-2; + + hq2x_16_def(dst0, dst1, src0, src0, src1, width); + + while(count) { + dst0 += dstPitch; + dst1 += dstPitch; + hq2x_16_def(dst0, dst1, src0, src1, src2, width); + src0 = src1; + src1 = src2; + src2 += srcPitch >> 1; + --count; + } + dst0 += dstPitch; + dst1 += dstPitch; + hq2x_16_def(dst0, dst1, src0, src1, src1, width); +} + +void hq2x32(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, + Uint32 dstPitch, int width, int height) +{ + Uint32 *dst0 = (Uint32 *)dstPtr; + Uint32 *dst1 = dst0 + (dstPitch >> 2); + + Uint32 *src0 = (Uint32 *)srcPtr; + Uint32 *src1 = src0 + (srcPitch >> 2); + Uint32 *src2 = src1 + (srcPitch >> 2); + int count = height-2; + + hq2x_32_def(dst0, dst1, src0, src0, src1, width); + + while(count) { + dst0 += dstPitch >> 1; + dst1 += dstPitch >> 1; + hq2x_32_def(dst0, dst1, src0, src1, src2, width); + src0 = src1; + src1 = src2; + src2 += srcPitch >> 2; + --count; + } + dst0 += dstPitch >> 1; + dst1 += dstPitch >> 1; + hq2x_32_def(dst0, dst1, src0, src1, src1, width); +} + +void lq2x16(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, + Uint32 dstPitch, int width, int height) +{ + Uint16 *dst0 = (Uint16 *)dstPtr; + Uint16 *dst1 = dst0 + (dstPitch >> 1); + + Uint16 *src0 = (Uint16 *)srcPtr; + Uint16 *src1 = src0 + (srcPitch >> 1); + Uint16 *src2 = src1 + (srcPitch >> 1); + int count = height-2; + + lq2x_16_def(dst0, dst1, src0, src0, src1, width); + + while(count) { + dst0 += dstPitch; + dst1 += dstPitch; + lq2x_16_def(dst0, dst1, src0, src1, src2, width); + src0 = src1; + src1 = src2; + src2 += srcPitch >> 1; + --count; + } + dst0 += dstPitch; + dst1 += dstPitch; + lq2x_16_def(dst0, dst1, src0, src1, src1, width); +} + +void lq2x32(Uint8 *srcPtr, Uint32 srcPitch, Uint8 *dstPtr, + Uint32 dstPitch, int width, int height) +{ + Uint32 *dst0 = (Uint32 *)dstPtr; + Uint32 *dst1 = dst0 + (dstPitch >> 2); + + Uint32 *src0 = (Uint32 *)srcPtr; + Uint32 *src1 = src0 + (srcPitch >> 2); + Uint32 *src2 = src1 + (srcPitch >> 2); + int count = height-2; + + lq2x_32_def(dst0, dst1, src0, src0, src1, width); + + while(count) { + dst0 += dstPitch >> 1; + dst1 += dstPitch >> 1; + lq2x_32_def(dst0, dst1, src0, src1, src2, width); + src0 = src1; + src1 = src2; + src2 += srcPitch >> 2; + --count; + } + dst0 += dstPitch >> 1; + dst1 += dstPitch >> 1; + lq2x_32_def(dst0, dst1, src0, src1, src1, width); +} + +/* +static inline void hq2x_init(Uint32 bits_per_pixel) +{ + interp_set(bits_per_pixel); +} +*/ diff --git a/src/sdl2/filter/lq2x.h b/src/sdl2/filter/lq2x.h new file mode 100644 index 000000000..094c2b5ae --- /dev/null +++ b/src/sdl2/filter/lq2x.h @@ -0,0 +1,1284 @@ +case 0 : +case 2 : +case 4 : +case 6 : +case 8 : +case 12 : +case 16 : +case 20 : +case 24 : +case 28 : +case 32 : +case 34 : +case 36 : +case 38 : +case 40 : +case 44 : +case 48 : +case 52 : +case 56 : +case 60 : +case 64 : +case 66 : +case 68 : +case 70 : +case 96 : +case 98 : +case 100 : +case 102 : +case 128 : +case 130 : +case 132 : +case 134 : +case 136 : +case 140 : +case 144 : +case 148 : +case 152 : +case 156 : +case 160 : +case 162 : +case 164 : +case 166 : +case 168 : +case 172 : +case 176 : +case 180 : +case 184 : +case 188 : +case 192 : +case 194 : +case 196 : +case 198 : +case 224 : +case 226 : +case 228 : +case 230 : +{ + P0 = IC(0); + P1 = IC(0); + P2 = IC(0); + P3 = IC(0); +} break; +case 1 : +case 5 : +case 9 : +case 13 : +case 17 : +case 21 : +case 25 : +case 29 : +case 33 : +case 37 : +case 41 : +case 45 : +case 49 : +case 53 : +case 57 : +case 61 : +case 65 : +case 69 : +case 97 : +case 101 : +case 129 : +case 133 : +case 137 : +case 141 : +case 145 : +case 149 : +case 153 : +case 157 : +case 161 : +case 165 : +case 169 : +case 173 : +case 177 : +case 181 : +case 185 : +case 189 : +case 193 : +case 197 : +case 225 : +case 229 : +{ + P0 = IC(1); + P1 = IC(1); + P2 = IC(1); + P3 = IC(1); +} break; +case 3 : +case 35 : +case 67 : +case 99 : +case 131 : +case 163 : +case 195 : +case 227 : +{ + P0 = IC(2); + P1 = IC(2); + P2 = IC(2); + P3 = IC(2); +} break; +case 7 : +case 39 : +case 71 : +case 103 : +case 135 : +case 167 : +case 199 : +case 231 : +{ + P0 = IC(3); + P1 = IC(3); + P2 = IC(3); + P3 = IC(3); +} break; +case 10 : +case 138 : +{ + P1 = IC(0); + P2 = IC(0); + P3 = IC(0); + if (MUL) { + P0 = IC(0); + } else { + P0 = I211(0, 1, 3); + } +} break; +case 11 : +case 27 : +case 75 : +case 139 : +case 155 : +case 203 : +{ + P1 = IC(2); + P2 = IC(2); + P3 = IC(2); + if (MUL) { + P0 = IC(2); + } else { + P0 = I211(2, 1, 3); + } +} break; +case 14 : +case 142 : +{ + P2 = IC(0); + P3 = IC(0); + if (MUL) { + P0 = IC(0); + P1 = IC(0); + } else { + P0 = I332(1, 3, 0); + P1 = I31(0, 1); + } +} break; +case 15 : +case 143 : +case 207 : +{ + P2 = IC(4); + P3 = IC(4); + if (MUL) { + P0 = IC(4); + P1 = IC(4); + } else { + P0 = I332(1, 3, 4); + P1 = I31(4, 1); + } +} break; +case 18 : +case 22 : +case 30 : +case 50 : +case 54 : +case 62 : +case 86 : +case 118 : +{ + P0 = IC(0); + P2 = IC(0); + P3 = IC(0); + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 19 : +case 51 : +{ + P2 = IC(2); + P3 = IC(2); + if (MUR) { + P0 = IC(2); + P1 = IC(2); + } else { + P0 = I31(2, 1); + P1 = I332(1, 5, 2); + } +} break; +case 23 : +case 55 : +case 119 : +{ + P2 = IC(3); + P3 = IC(3); + if (MUR) { + P0 = IC(3); + P1 = IC(3); + } else { + P0 = I31(3, 1); + P1 = I332(1, 5, 3); + } +} break; +case 26 : +{ + P2 = IC(0); + P3 = IC(0); + if (MUL) { + P0 = IC(0); + } else { + P0 = I211(0, 1, 3); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 31 : +case 95 : +{ + P2 = IC(4); + P3 = IC(4); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 42 : +case 170 : +{ + P1 = IC(0); + P3 = IC(0); + if (MUL) { + P0 = IC(0); + P2 = IC(0); + } else { + P0 = I332(1, 3, 0); + P2 = I31(0, 3); + } +} break; +case 43 : +case 171 : +case 187 : +{ + P1 = IC(2); + P3 = IC(2); + if (MUL) { + P0 = IC(2); + P2 = IC(2); + } else { + P0 = I332(1, 3, 2); + P2 = I31(2, 3); + } +} break; +case 46 : +case 174 : +{ + P1 = IC(0); + P2 = IC(0); + P3 = IC(0); + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } +} break; +case 47 : +case 175 : +{ + P1 = IC(4); + P2 = IC(4); + P3 = IC(4); + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } +} break; +case 58 : +case 154 : +case 186 : +{ + P2 = IC(0); + P3 = IC(0); + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I611(0, 1, 5); + } +} break; +case 59 : +{ + P2 = IC(2); + P3 = IC(2); + if (MUL) { + P0 = IC(2); + } else { + P0 = I211(2, 1, 3); + } + if (MUR) { + P1 = IC(2); + } else { + P1 = I611(2, 1, 5); + } +} break; +case 63 : +{ + P2 = IC(4); + P3 = IC(4); + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 72 : +case 76 : +case 104 : +case 106 : +case 108 : +case 110 : +case 120 : +case 124 : +{ + P0 = IC(0); + P1 = IC(0); + P3 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } +} break; +case 73 : +case 77 : +case 105 : +case 109 : +case 125 : +{ + P1 = IC(1); + P3 = IC(1); + if (MDL) { + P0 = IC(1); + P2 = IC(1); + } else { + P0 = I31(1, 3); + P2 = I332(3, 7, 1); + } +} break; +case 74 : +{ + P1 = IC(0); + P3 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } + if (MUL) { + P0 = IC(0); + } else { + P0 = I211(0, 1, 3); + } +} break; +case 78 : +case 202 : +case 206 : +{ + P1 = IC(0); + P3 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I611(0, 3, 7); + } + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } +} break; +case 79 : +{ + P1 = IC(4); + P3 = IC(4); + if (MDL) { + P2 = IC(4); + } else { + P2 = I611(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } +} break; +case 80 : +case 208 : +case 210 : +case 216 : +{ + P0 = IC(0); + P1 = IC(0); + P2 = IC(0); + if (MDR) { + P3 = IC(0); + } else { + P3 = I211(0, 5, 7); + } +} break; +case 81 : +case 209 : +case 217 : +{ + P0 = IC(1); + P1 = IC(1); + P2 = IC(1); + if (MDR) { + P3 = IC(1); + } else { + P3 = I211(1, 5, 7); + } +} break; +case 82 : +case 214 : +case 222 : +{ + P0 = IC(0); + P2 = IC(0); + if (MDR) { + P3 = IC(0); + } else { + P3 = I211(0, 5, 7); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 83 : +case 115 : +{ + P0 = IC(2); + P2 = IC(2); + if (MDR) { + P3 = IC(2); + } else { + P3 = I611(2, 5, 7); + } + if (MUR) { + P1 = IC(2); + } else { + P1 = I611(2, 1, 5); + } +} break; +case 84 : +case 212 : +{ + P0 = IC(0); + P2 = IC(0); + if (MDR) { + P1 = IC(0); + P3 = IC(0); + } else { + P1 = I31(0, 5); + P3 = I332(5, 7, 0); + } +} break; +case 85 : +case 213 : +case 221 : +{ + P0 = IC(1); + P2 = IC(1); + if (MDR) { + P1 = IC(1); + P3 = IC(1); + } else { + P1 = I31(1, 5); + P3 = I332(5, 7, 1); + } +} break; +case 87 : +{ + P0 = IC(3); + P2 = IC(3); + if (MDR) { + P3 = IC(3); + } else { + P3 = I611(3, 5, 7); + } + if (MUR) { + P1 = IC(3); + } else { + P1 = I211(3, 1, 5); + } +} break; +case 88 : +case 248 : +case 250 : +{ + P0 = IC(0); + P1 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I211(0, 5, 7); + } +} break; +case 89 : +case 93 : +{ + P0 = IC(1); + P1 = IC(1); + if (MDL) { + P2 = IC(1); + } else { + P2 = I611(1, 3, 7); + } + if (MDR) { + P3 = IC(1); + } else { + P3 = I611(1, 5, 7); + } +} break; +case 90 : +{ + if (MDL) { + P2 = IC(0); + } else { + P2 = I611(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I611(0, 5, 7); + } + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I611(0, 1, 5); + } +} break; +case 91 : +{ + if (MDL) { + P2 = IC(2); + } else { + P2 = I611(2, 3, 7); + } + if (MDR) { + P3 = IC(2); + } else { + P3 = I611(2, 5, 7); + } + if (MUL) { + P0 = IC(2); + } else { + P0 = I211(2, 1, 3); + } + if (MUR) { + P1 = IC(2); + } else { + P1 = I611(2, 1, 5); + } +} break; +case 92 : +{ + P0 = IC(0); + P1 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I611(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I611(0, 5, 7); + } +} break; +case 94 : +{ + if (MDL) { + P2 = IC(0); + } else { + P2 = I611(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I611(0, 5, 7); + } + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 107 : +case 123 : +{ + P1 = IC(2); + P3 = IC(2); + if (MDL) { + P2 = IC(2); + } else { + P2 = I211(2, 3, 7); + } + if (MUL) { + P0 = IC(2); + } else { + P0 = I211(2, 1, 3); + } +} break; +case 111 : +{ + P1 = IC(4); + P3 = IC(4); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } +} break; +case 112 : +case 240 : +{ + P0 = IC(0); + P1 = IC(0); + if (MDR) { + P2 = IC(0); + P3 = IC(0); + } else { + P2 = I31(0, 7); + P3 = I332(5, 7, 0); + } +} break; +case 113 : +case 241 : +{ + P0 = IC(1); + P1 = IC(1); + if (MDR) { + P2 = IC(1); + P3 = IC(1); + } else { + P2 = I31(1, 7); + P3 = I332(5, 7, 1); + } +} break; +case 114 : +{ + P0 = IC(0); + P2 = IC(0); + if (MDR) { + P3 = IC(0); + } else { + P3 = I611(0, 5, 7); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I611(0, 1, 5); + } +} break; +case 116 : +{ + P0 = IC(0); + P1 = IC(0); + P2 = IC(0); + if (MDR) { + P3 = IC(0); + } else { + P3 = I611(0, 5, 7); + } +} break; +case 117 : +{ + P0 = IC(1); + P1 = IC(1); + P2 = IC(1); + if (MDR) { + P3 = IC(1); + } else { + P3 = I611(1, 5, 7); + } +} break; +case 121 : +{ + P0 = IC(1); + P1 = IC(1); + if (MDL) { + P2 = IC(1); + } else { + P2 = I211(1, 3, 7); + } + if (MDR) { + P3 = IC(1); + } else { + P3 = I611(1, 5, 7); + } +} break; +case 122 : +{ + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I611(0, 5, 7); + } + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I611(0, 1, 5); + } +} break; +case 126 : +{ + P0 = IC(0); + P3 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 127 : +{ + P3 = IC(4); + if (MDL) { + P2 = IC(4); + } else { + P2 = I211(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I211(4, 1, 5); + } +} break; +case 146 : +case 150 : +case 178 : +case 182 : +case 190 : +{ + P0 = IC(0); + P2 = IC(0); + if (MUR) { + P1 = IC(0); + P3 = IC(0); + } else { + P1 = I332(1, 5, 0); + P3 = I31(0, 5); + } +} break; +case 147 : +case 179 : +{ + P0 = IC(2); + P2 = IC(2); + P3 = IC(2); + if (MUR) { + P1 = IC(2); + } else { + P1 = I611(2, 1, 5); + } +} break; +case 151 : +case 183 : +{ + P0 = IC(3); + P2 = IC(3); + P3 = IC(3); + if (MUR) { + P1 = IC(3); + } else { + P1 = I1411(3, 1, 5); + } +} break; +case 158 : +{ + P2 = IC(0); + P3 = IC(0); + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 159 : +{ + P2 = IC(4); + P3 = IC(4); + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 191 : +{ + P2 = IC(4); + P3 = IC(4); + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 200 : +case 204 : +case 232 : +case 236 : +case 238 : +{ + P0 = IC(0); + P1 = IC(0); + if (MDL) { + P2 = IC(0); + P3 = IC(0); + } else { + P2 = I332(3, 7, 0); + P3 = I31(0, 7); + } +} break; +case 201 : +case 205 : +{ + P0 = IC(1); + P1 = IC(1); + P3 = IC(1); + if (MDL) { + P2 = IC(1); + } else { + P2 = I611(1, 3, 7); + } +} break; +case 211 : +{ + P0 = IC(2); + P1 = IC(2); + P2 = IC(2); + if (MDR) { + P3 = IC(2); + } else { + P3 = I211(2, 5, 7); + } +} break; +case 215 : +{ + P0 = IC(3); + P2 = IC(3); + if (MDR) { + P3 = IC(3); + } else { + P3 = I211(3, 5, 7); + } + if (MUR) { + P1 = IC(3); + } else { + P1 = I1411(3, 1, 5); + } +} break; +case 218 : +{ + if (MDL) { + P2 = IC(0); + } else { + P2 = I611(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I211(0, 5, 7); + } + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I611(0, 1, 5); + } +} break; +case 219 : +{ + P1 = IC(2); + P2 = IC(2); + if (MDR) { + P3 = IC(2); + } else { + P3 = I211(2, 5, 7); + } + if (MUL) { + P0 = IC(2); + } else { + P0 = I211(2, 1, 3); + } +} break; +case 220 : +{ + P0 = IC(0); + P1 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I611(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I211(0, 5, 7); + } +} break; +case 223 : +{ + P2 = IC(4); + if (MDR) { + P3 = IC(4); + } else { + P3 = I211(4, 5, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I211(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; +case 233 : +case 237 : +{ + P0 = IC(1); + P1 = IC(1); + P3 = IC(1); + if (MDL) { + P2 = IC(1); + } else { + P2 = I1411(1, 3, 7); + } +} break; +case 234 : +{ + P1 = IC(0); + P3 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } + if (MUL) { + P0 = IC(0); + } else { + P0 = I611(0, 1, 3); + } +} break; +case 235 : +{ + P1 = IC(2); + P3 = IC(2); + if (MDL) { + P2 = IC(2); + } else { + P2 = I1411(2, 3, 7); + } + if (MUL) { + P0 = IC(2); + } else { + P0 = I211(2, 1, 3); + } +} break; +case 239 : +{ + P1 = IC(4); + P3 = IC(4); + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } +} break; +case 242 : +{ + P0 = IC(0); + P2 = IC(0); + if (MDR) { + P3 = IC(0); + } else { + P3 = I211(0, 5, 7); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I611(0, 1, 5); + } +} break; +case 243 : +{ + P0 = IC(2); + P1 = IC(2); + if (MDR) { + P2 = IC(2); + P3 = IC(2); + } else { + P2 = I31(2, 7); + P3 = I332(5, 7, 2); + } +} break; +case 244 : +{ + P0 = IC(0); + P1 = IC(0); + P2 = IC(0); + if (MDR) { + P3 = IC(0); + } else { + P3 = I1411(0, 5, 7); + } +} break; +case 245 : +{ + P0 = IC(1); + P1 = IC(1); + P2 = IC(1); + if (MDR) { + P3 = IC(1); + } else { + P3 = I1411(1, 5, 7); + } +} break; +case 246 : +{ + P0 = IC(0); + P2 = IC(0); + if (MDR) { + P3 = IC(0); + } else { + P3 = I1411(0, 5, 7); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 247 : +{ + P0 = IC(3); + P2 = IC(3); + if (MDR) { + P3 = IC(3); + } else { + P3 = I1411(3, 5, 7); + } + if (MUR) { + P1 = IC(3); + } else { + P1 = I1411(3, 1, 5); + } +} break; +case 249 : +{ + P0 = IC(1); + P1 = IC(1); + if (MDL) { + P2 = IC(1); + } else { + P2 = I1411(1, 3, 7); + } + if (MDR) { + P3 = IC(1); + } else { + P3 = I211(1, 5, 7); + } +} break; +case 251 : +{ + P1 = IC(2); + if (MDL) { + P2 = IC(2); + } else { + P2 = I1411(2, 3, 7); + } + if (MDR) { + P3 = IC(2); + } else { + P3 = I211(2, 5, 7); + } + if (MUL) { + P0 = IC(2); + } else { + P0 = I211(2, 1, 3); + } +} break; +case 252 : +{ + P0 = IC(0); + P1 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I1411(0, 5, 7); + } +} break; +case 253 : +{ + P0 = IC(1); + P1 = IC(1); + if (MDL) { + P2 = IC(1); + } else { + P2 = I1411(1, 3, 7); + } + if (MDR) { + P3 = IC(1); + } else { + P3 = I1411(1, 5, 7); + } +} break; +case 254 : +{ + P0 = IC(0); + if (MDL) { + P2 = IC(0); + } else { + P2 = I211(0, 3, 7); + } + if (MDR) { + P3 = IC(0); + } else { + P3 = I1411(0, 5, 7); + } + if (MUR) { + P1 = IC(0); + } else { + P1 = I211(0, 1, 5); + } +} break; +case 255 : +{ + if (MDL) { + P2 = IC(4); + } else { + P2 = I1411(4, 3, 7); + } + if (MDR) { + P3 = IC(4); + } else { + P3 = I1411(4, 5, 7); + } + if (MUL) { + P0 = IC(4); + } else { + P0 = I1411(4, 1, 3); + } + if (MUR) { + P1 = IC(4); + } else { + P1 = I1411(4, 1, 5); + } +} break; diff --git a/src/sdl2/filter/main.c b/src/sdl2/filter/main.c new file mode 100644 index 000000000..98ab1541c --- /dev/null +++ b/src/sdl2/filter/main.c @@ -0,0 +1,15 @@ +#include "filters.h" + +int main(int argc, char *argv[]) +{ + SDL_Surface *src = NULL; + SDL_Surface *dst = NULL; + src = SDL_LoadBMP("src.bmp"); //load + if(!src) return -1; //check + dst = filter_2x(src, NULL, hq2x32); //prcoess + SDL_FreeSurface(src); //free + if(!dst) return 0; //error + SDL_SaveBMP(dst, "dst.bmp"); //save + SDL_FreeSurface(dst); //free + return 1; //good +} diff --git a/src/sdl2/hwsym_sdl.c b/src/sdl2/hwsym_sdl.c new file mode 100644 index 000000000..43c71f7bf --- /dev/null +++ b/src/sdl2/hwsym_sdl.c @@ -0,0 +1,183 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. + +/// \file +/// \brief Tool for dynamic referencing of hardware rendering functions +/// +/// Declaration and definition of the HW rendering +/// functions do have the same name. Originally, the +/// implementation was stored in a separate library. +/// For SDL, we need some function to return the addresses, +/// otherwise we have a conflict with the compiler. + +#include "hwsym_sdl.h" +#include "../doomdef.h" + +#ifdef _MSC_VER +#pragma warning(disable : 4214 4244) +#endif + +#ifdef SDL + +#include "SDL.h" + +#ifdef _MSC_VER +#pragma warning(default : 4214 4244) +#endif + +#if defined (_XBOX) || defined (_arch_dreamcast) || defined(GP2X) +#define NOLOADSO +#endif + +#if SDL_VERSION_ATLEAST(1,2,6) && !defined (NOLOADSO) +#include "SDL_loadso.h" // 1.2.6+ +#elif !defined (NOLOADSO) +#define NOLOADSO +#endif + +#define _CREATE_DLL_ // necessary for Unix AND Windows + +#ifdef HWRENDER +#include "../hardware/hw_drv.h" +#include "ogl_sdl.h" +#ifdef STATIC_OPENGL +#include "../hardware/r_opengl/r_opengl.h" +#endif +#endif + +#ifdef HW3SOUND +#include "../hardware/hw3dsdrv.h" +#endif + +#define GETFUNC(func) \ + else if (0 == strcmp(#func, funcName)) \ + funcPointer = &func \ +// +// +/** \brief The *hwSym function + + Stupid function to return function addresses + + \param funcName the name of the function + \param handle an object to look in(NULL for self) + + \return void +*/ +// +void *hwSym(const char *funcName,void *handle) +{ + void *funcPointer = NULL; +#ifdef HWRENDER + if (0 == strcmp("SetPalette", funcName)) + funcPointer = &OglSdlSetPalette; + GETFUNC(Init); + GETFUNC(Draw2DLine); + GETFUNC(DrawPolygon); + GETFUNC(SetBlend); + GETFUNC(ClearBuffer); + GETFUNC(SetTexture); + GETFUNC(ReadRect); + GETFUNC(GClipRect); + GETFUNC(ClearMipMapCache); + GETFUNC(SetSpecialState); + GETFUNC(GetTextureUsed); + GETFUNC(DrawMD2); + GETFUNC(DrawMD2i); + GETFUNC(SetTransform); + GETFUNC(GetRenderVersion); +#ifdef SHUFFLE + GETFUNC(PostImgRedraw); +#endif //SHUFFLE + GETFUNC(StartScreenWipe); + GETFUNC(EndScreenWipe); + GETFUNC(DoScreenWipe); + GETFUNC(DrawIntermissionBG); + GETFUNC(MakeScreenTexture); +#else //HWRENDER + if (0 == strcmp("FinishUpdate", funcName)) + return funcPointer; //&FinishUpdate; +#endif //!HWRENDER +#ifdef STATIC3DS + GETFUNC(Startup); + GETFUNC(AddSfx); + GETFUNC(AddSource); + GETFUNC(StartSource); + GETFUNC(StopSource); + GETFUNC(GetHW3DSVersion); + GETFUNC(BeginFrameUpdate); + GETFUNC(EndFrameUpdate); + GETFUNC(IsPlaying); + GETFUNC(UpdateListener); + GETFUNC(UpdateSourceParms); + GETFUNC(SetGlobalSfxVolume); + GETFUNC(SetCone); + GETFUNC(Update3DSource); + GETFUNC(ReloadSource); + GETFUNC(KillSource); + GETFUNC(Shutdown); + GETFUNC(GetHW3DSTitle); +#endif +#ifdef NOLOADSO + else + funcPointer = handle; +#else + else if (handle) + funcPointer = SDL_LoadFunction(handle,funcName); +#endif + if (!funcPointer) + I_OutputMsg("hwSym for %s: %s\n", funcName, SDL_GetError()); + return funcPointer; +} + +/** \brief The *hwOpen function + + \param hwfile Open a handle to the SO + + \return Handle to SO + + +*/ + +void *hwOpen(const char *hwfile) +{ +#ifdef NOLOADSO + (void)hwfile; + return NULL; +#else + void *tempso = NULL; + tempso = SDL_LoadObject(hwfile); + if (!tempso) I_OutputMsg("hwOpen of %s: %s\n", hwfile, SDL_GetError()); + return tempso; +#endif +} + +/** \brief The hwClose function + + \param handle Close the handle of the SO + + \return void + + +*/ + +void hwClose(void *handle) +{ +#ifdef NOLOADSO + (void)handle; +#else + SDL_UnloadObject(handle); +#endif +} +#endif diff --git a/src/sdl2/hwsym_sdl.h b/src/sdl2/hwsym_sdl.h new file mode 100644 index 000000000..7297587bf --- /dev/null +++ b/src/sdl2/hwsym_sdl.h @@ -0,0 +1,23 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief Tool for dynamic referencing of hardware rendering/3D sound functions + +void *hwSym(const char *funcName,void *handle); + +void *hwOpen(const char *hwfile); + +void hwClose(void *handle); diff --git a/src/sdl2/i_cdmus.c b/src/sdl2/i_cdmus.c new file mode 100644 index 000000000..fc35eb9cf --- /dev/null +++ b/src/sdl2/i_cdmus.c @@ -0,0 +1,38 @@ +#include "../command.h" +#include "../s_sound.h" +#include "../i_sound.h" + +// +// CD MUSIC I/O +// + +UINT8 cdaudio_started = 0; + +consvar_t cd_volume = {"cd_volume","31",CV_SAVE,soundvolume_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cdUpdate = {"cd_update","1",CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; + + +void I_InitCD(void){} + +void I_StopCD(void){} + +void I_PauseCD(void){} + +void I_ResumeCD(void){} + +void I_ShutdownCD(void){} + +void I_UpdateCD(void){} + +void I_PlayCD(UINT8 track, UINT8 looping) +{ + (void)track; + (void)looping; +} + +boolean I_SetVolumeCD(int volume) +{ + (void)volume; + return false; +} + diff --git a/src/sdl2/i_main.c b/src/sdl2/i_main.c new file mode 100644 index 000000000..85abb7041 --- /dev/null +++ b/src/sdl2/i_main.c @@ -0,0 +1,247 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1993-1996 by id Software, Inc. +// Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief Main program, simply calls D_SRB2Main and D_SRB2Loop, the high level loop. + +#include "../doomdef.h" +#include "../m_argv.h" +#include "../d_main.h" +#include "../i_system.h" + +#ifdef __GNUC__ +#include <unistd.h> +#endif + +#ifdef _WII +#include <limits.h> +#include <network.h> +#include <fat.h> +#ifdef REMOTE_DEBUGGING +#include <debug.h> +#endif +static char wiicwd[PATH_MAX] = "sd:/"; +static char localip[16] = {0}; +static char gateway[16] = {0}; +static char netmask[16] = {0}; +#endif + +#ifdef _PSP +#include <pspmoduleinfo.h> +#include <pspthreadman.h> +PSP_HEAP_SIZE_KB(24*1024); +PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER | PSP_THREAD_ATTR_VFPU); +PSP_MAIN_THREAD_NAME("SRB2"); +PSP_MAIN_THREAD_STACK_SIZE_KB(256); +#endif + +#ifdef SDL + +#ifdef HAVE_TTF +#include "SDL.h" +#include "i_ttf.h" +#endif + +#ifdef SDLMAIN +#include "SDL_main.h" +#elif defined(FORCESDLMAIN) +extern int SDL_main(int argc, char *argv[]); +#endif + +#ifdef LOGMESSAGES +FILE *logstream = NULL; +#endif + +#ifndef DOXYGEN +#ifndef O_TEXT +#define O_TEXT 0 +#endif + +#ifndef O_SEQUENTIAL +#define O_SEQUENTIAL 0 +#endif +#endif + +#if defined (_WIN32) && !defined (_XBOX) +#include "../win32/win_dbg.h" +typedef BOOL (WINAPI *p_IsDebuggerPresent)(VOID); +#endif + +#ifdef _arch_dreamcast +#include <arch/arch.h> +KOS_INIT_FLAGS(INIT_DEFAULT +//| INIT_NET +//| INIT_MALLOCSTATS +//| INIT_QUIET +//| INIT_OCRAM +//| INIT_NO_DCLOAD +); +#endif + +#if defined (_WIN32) && !defined (_XBOX) && !defined (_WIN32_WCE) +static inline VOID MakeCodeWritable(VOID) +{ +#ifdef USEASM // Disable write-protection of code segment + DWORD OldRights; + const DWORD NewRights = PAGE_EXECUTE_READWRITE; + PBYTE pBaseOfImage = (PBYTE)GetModuleHandle(NULL); + PIMAGE_DOS_HEADER dosH =(PIMAGE_DOS_HEADER)pBaseOfImage; + PIMAGE_NT_HEADERS ntH = (PIMAGE_NT_HEADERS)(pBaseOfImage + dosH->e_lfanew); + PIMAGE_OPTIONAL_HEADER oH = (PIMAGE_OPTIONAL_HEADER) + ((PBYTE)ntH + sizeof (IMAGE_NT_SIGNATURE) + sizeof (IMAGE_FILE_HEADER)); + LPVOID pA = pBaseOfImage+oH->BaseOfCode; + SIZE_T pS = oH->SizeOfCode; +#if 1 // try to find the text section + PIMAGE_SECTION_HEADER ntS = IMAGE_FIRST_SECTION (ntH); + WORD s; + for (s = 0; s < ntH->FileHeader.NumberOfSections; s++) + { + if (memcmp (ntS[s].Name, ".text\0\0", 8) == 0) + { + pA = pBaseOfImage+ntS[s].VirtualAddress; + pS = ntS[s].Misc.VirtualSize; + break; + } + } +#endif + + if (!VirtualProtect(pA,pS,NewRights,&OldRights)) + I_Error("Could not make code writable\n"); +#endif +} +#endif + + +/** \brief The main function + + \param argc number of arg + \param *argv string table + + \return int +*/ +FUNCNORETURN +#if defined (_XBOX) && defined (__GNUC__) +void XBoxStartup() +{ + const char *logdir = NULL; + myargc = -1; + myargv = NULL; +#else +#ifdef FORCESDLMAIN +int SDL_main(int argc, char **argv) +#else +int main(int argc, char **argv) +#endif +{ + const char *logdir = NULL; + myargc = argc; + myargv = argv; /// \todo pull out path to exe from this string +#endif + +#ifdef HAVE_TTF +#ifdef _PS3 + // apparently there is a bug in SDL_PSL1GHT which needs this to be set to work around + SDL_setenv("SDL_VIDEODRIVER", "psl1ght", 1); + I_StartupTTF(FONTPOINTSIZE, SDL_INIT_VIDEO, SDL_SWSURFACE|SDL_DOUBLEBUF); +#elif defined(_WIN32) + I_StartupTTF(FONTPOINTSIZE, SDL_INIT_VIDEO|SDL_INIT_AUDIO, SDL_SWSURFACE); +#else + I_StartupTTF(FONTPOINTSIZE, SDL_INIT_VIDEO, SDL_SWSURFACE); +#endif +#endif + +#ifdef _PS3 + // initialise controllers. + //ioPadInit(7); +#endif + +// init Wii-specific stuff +#ifdef _WII + // Start network + if_config(localip, netmask, gateway, TRUE); + +#ifdef REMOTE_DEBUGGING +#if REMOTE_DEBUGGING == 0 + DEBUG_Init(GDBSTUB_DEVICE_TCP, GDBSTUB_DEF_TCPPORT); // Port 2828 +#elif REMOTE_DEBUGGING > 2 + DEBUG_Init(GDBSTUB_DEVICE_TCP, REMOTE_DEBUGGING); // Custom Port +#elif REMOTE_DEBUGGING < 0 + DEBUG_Init(GDBSTUB_DEVICE_USB, GDBSTUB_DEF_CHANNEL); // Slot 1 +#else + DEBUG_Init(GDBSTUB_DEVICE_USB, REMOTE_DEBUGGING-1); // Custom Slot +#endif +#endif + // Start FAT filesystem + fatInitDefault(); + + if (getcwd(wiicwd, PATH_MAX)) + I_PutEnv(va("HOME=%ssrb2wii", wiicwd)); +#endif + + logdir = D_Home(); + +#ifdef LOGMESSAGES +#if defined(_WIN32_WCE) || defined(GP2X) + logstream = fopen(va("%s.log",argv[0]), "a"); +#elif defined (_WII) + logstream = fopen(va("%s/srb2log.txt",logdir), "a"); +#elif defined (DEFAULTDIR) + if (logdir) + logstream = fopen(va("%s/"DEFAULTDIR"/srb2log.txt",logdir), "a"); + else +#endif + logstream = fopen("./srb2log.txt", "a"); +#endif + + //I_OutputMsg("I_StartupSystem() ...\n"); + I_StartupSystem(); +#if defined (_WIN32) && !defined (_XBOX) +#ifndef _WIN32_WCE + { + p_IsDebuggerPresent pfnIsDebuggerPresent = (p_IsDebuggerPresent)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsDebuggerPresent"); + if ((!pfnIsDebuggerPresent || !pfnIsDebuggerPresent()) +#ifdef BUGTRAP + && !InitBugTrap() +#endif + ) + { + LoadLibraryA("exchndl.dll"); + } + } +#endif + prevExceptionFilter = SetUnhandledExceptionFilter(RecordExceptionInfo); +#ifndef _WIN32_WCE + MakeCodeWritable(); +#endif +#endif + // startup SRB2 + CONS_Printf("%s", M_GetText("Setting up SRB2...\n")); + D_SRB2Main(); + CONS_Printf("%s", M_GetText("Entering main game loop...\n")); + // never return + D_SRB2Loop(); + +#ifdef BUGTRAP + // This is safe even if BT didn't start. + ShutdownBugTrap(); +#endif + + // return to OS +#ifndef __GNUC__ + return 0; +#endif +} +#endif diff --git a/src/sdl2/i_net.c b/src/sdl2/i_net.c new file mode 100644 index 000000000..c31935acf --- /dev/null +++ b/src/sdl2/i_net.c @@ -0,0 +1,442 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1993-1996 by id Software, Inc. +// Portions Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief SDL network interface + +#include "../doomdef.h" + +#include "../i_system.h" +#include "../d_event.h" +#include "../d_net.h" +#include "../m_argv.h" + +#include "../doomstat.h" + +#include "../i_net.h" + +#include "../z_zone.h" + +#include "../i_tcp.h" + +#ifdef SDL + +#ifdef HAVE_SDLNET + +#include "SDL_net.h" + +#define MAXBANS 20 + +static IPaddress clientaddress[MAXNETNODES+1]; +static IPaddress banned[MAXBANS]; + +static UDPpacket mypacket; +static UDPsocket mysocket = NULL; +static SDLNet_SocketSet myset = NULL; + +static size_t numbans = 0; +static boolean NET_bannednode[MAXNETNODES+1]; /// \note do we really need the +1? +static boolean init_SDLNet_driver = false; + +static const char *NET_AddrToStr(IPaddress* sk) +{ + static char s[22]; // 255.255.255.255:65535 + strcpy(s, SDLNet_ResolveIP(sk)); + if (sk->port != 0) strcat(s, va(":%d", sk->port)); + return s; +} + +static const char *NET_GetNodeAddress(INT32 node) +{ + if (!nodeconnected[node]) + return NULL; + return NET_AddrToStr(&clientaddress[node]); +} + +static const char *NET_GetBanAddress(size_t ban) +{ + if (ban > numbans) + return NULL; + return NET_AddrToStr(&banned[ban]); +} + +static boolean NET_cmpaddr(IPaddress* a, IPaddress* b) +{ + return (a->host == b->host && (b->port == 0 || a->port == b->port)); +} + +static boolean NET_CanGet(void) +{ + return myset?(SDLNet_CheckSockets(myset,0) == 1):false; +} + +static void NET_Get(void) +{ + INT32 mystatus; + INT32 newnode; + mypacket.len = MAXPACKETLENGTH; + if (!NET_CanGet()) + { + doomcom->remotenode = -1; // no packet + return; + } + mystatus = SDLNet_UDP_Recv(mysocket,&mypacket); + if (mystatus != -1) + { + if (mypacket.channel != -1) + { + doomcom->remotenode = mypacket.channel+1; // good packet from a game player + doomcom->datalength = mypacket.len; + return; + } + newnode = SDLNet_UDP_Bind(mysocket,-1,&mypacket.address); + if (newnode != -1) + { + size_t i; + newnode++; + M_Memcpy(&clientaddress[newnode], &mypacket.address, sizeof (IPaddress)); + DEBFILE(va("New node detected: node:%d address:%s\n", newnode, + NET_GetNodeAddress(newnode))); + doomcom->remotenode = newnode; // good packet from a game player + doomcom->datalength = mypacket.len; + for (i = 0; i < numbans; i++) + { + if (NET_cmpaddr(&mypacket.address, &banned[i])) + { + DEBFILE("This dude has been banned\n"); + NET_bannednode[newnode] = true; + break; + } + } + if (i == numbans) + NET_bannednode[newnode] = false; + return; + } + else + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + } + else if (mystatus == -1) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + } + + DEBFILE("New node detected: No more free slots\n"); + doomcom->remotenode = -1; // no packet +} + +#if 0 +static boolean NET_CanSend(void) +{ + return true; +} +#endif + +static void NET_Send(void) +{ + if (!doomcom->remotenode) + return; + mypacket.len = doomcom->datalength; + if (SDLNet_UDP_Send(mysocket,doomcom->remotenode-1,&mypacket) == 0) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + } +} + +static void NET_FreeNodenum(INT32 numnode) +{ + // can't disconnect from self :) + if (!numnode) + return; + + DEBFILE(va("Free node %d (%s)\n", numnode, NET_GetNodeAddress(numnode))); + + SDLNet_UDP_Unbind(mysocket,numnode-1); + + memset(&clientaddress[numnode], 0, sizeof (IPaddress)); +} + +static UDPsocket NET_Socket(void) +{ + UDPsocket temp = NULL; + Uint16 portnum = 0; + IPaddress tempip = {INADDR_BROADCAST,0}; + //Hurdler: I'd like to put a server and a client on the same computer + //Logan: Me too + //BP: in fact for client we can use any free port we want i have read + // in some doc that connect in udp can do it for us... + //Alam: where? + if (M_CheckParm("-clientport")) + { + if (!M_IsNextParm()) + I_Error("syntax: -clientport <portnum>"); + portnum = atoi(M_GetNextParm()); + } + else + portnum = sock_port; + temp = SDLNet_UDP_Open(portnum); + if (!temp) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + return NULL; + } + if (SDLNet_UDP_Bind(temp,BROADCASTADDR-1,&tempip) == -1) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + SDLNet_UDP_Close(temp); + return NULL; + } + clientaddress[BROADCASTADDR].port = sock_port; + clientaddress[BROADCASTADDR].host = INADDR_BROADCAST; + + doomcom->extratics = 1; // internet is very high ping + + return temp; +} + +static void I_ShutdownSDLNetDriver(void) +{ + if (myset) SDLNet_FreeSocketSet(myset); + myset = NULL; + SDLNet_Quit(); + init_SDLNet_driver = false; +} + +static void I_InitSDLNetDriver(void) +{ + if (init_SDLNet_driver) + I_ShutdownSDLNetDriver(); + if (SDLNet_Init() == -1) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + return; // No good! + } + D_SetDoomcom(); + mypacket.data = doomcom->data; + init_SDLNet_driver = true; +} + +static void NET_CloseSocket(void) +{ + if (mysocket) + SDLNet_UDP_Close(mysocket); + mysocket = NULL; +} + +static SINT8 NET_NetMakeNodewPort(const char *hostname, const char *port) +{ + INT32 newnode; + UINT16 portnum = sock_port; + IPaddress hostnameIP; + + // retrieve portnum from address! + if (port && !port[0]) + portnum = atoi(port); + + if (SDLNet_ResolveHost(&hostnameIP,hostname,portnum) == -1) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + return -1; + } + newnode = SDLNet_UDP_Bind(mysocket,-1,&hostnameIP); + if (newnode == -1) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + return newnode; + } + newnode++; + M_Memcpy(&clientaddress[newnode],&hostnameIP,sizeof (IPaddress)); + return (SINT8)newnode; +} + + +static boolean NET_OpenSocket(void) +{ + memset(clientaddress, 0, sizeof (clientaddress)); + + //I_OutputMsg("SDL_Net Code starting up\n"); + + I_NetSend = NET_Send; + I_NetGet = NET_Get; + I_NetCloseSocket = NET_CloseSocket; + I_NetFreeNodenum = NET_FreeNodenum; + I_NetMakeNodewPort = NET_NetMakeNodewPort; + + //I_NetCanSend = NET_CanSend; + + // build the socket but close it first + NET_CloseSocket(); + mysocket = NET_Socket(); + + if (!mysocket) + return false; + + // for select + myset = SDLNet_AllocSocketSet(1); + if (!myset) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + return false; + } + if (SDLNet_UDP_AddSocket(myset,mysocket) == -1) + { + I_OutputMsg("SDL_Net: %s",SDLNet_GetError()); + return false; + } + return true; +} + +static boolean NET_Ban(INT32 node) +{ + if (numbans == MAXBANS) + return false; + + M_Memcpy(&banned[numbans], &clientaddress[node], sizeof (IPaddress)); + banned[numbans].port = 0; + numbans++; + return true; +} + +static boolean NET_SetBanAddress(const char *address, const char *mask) +{ + (void)mask; + if (bans == MAXBANS) + return false; + + if (SDLNet_ResolveHost(&banned[numbans], address, 0) == -1) + return false; + numbans++; + return true; +} + +static void NET_ClearBans(void) +{ + numbans = 0; +} +#endif + +// +// I_InitNetwork +// Only required for DOS, so this is more a dummy +// +boolean I_InitNetwork(void) +{ +#ifdef HAVE_SDLNET + char serverhostname[255]; + boolean ret = false; + SDL_version SDLcompiled; + const SDL_version *SDLlinked = SDLNet_Linked_Version(); + SDL_NET_VERSION(&SDLcompiled) + I_OutputMsg("Compiled for SDL_Net version: %d.%d.%d\n", + SDLcompiled.major, SDLcompiled.minor, SDLcompiled.patch); + I_OutputMsg("Linked with SDL_Net version: %d.%d.%d\n", + SDLlinked->major, SDLlinked->minor, SDLlinked->patch); + //if (!M_CheckParm ("-sdlnet")) + // return false; + // initilize the driver + I_InitSDLNetDriver(); + I_AddExitFunc(I_ShutdownSDLNetDriver); + if (!init_SDLNet_driver) + return false; + + if (M_CheckParm("-udpport")) + { + if (M_IsNextParm()) + sock_port = (UINT16)atoi(M_GetNextParm()); + else + sock_port = 0; + } + + // parse network game options, + if (M_CheckParm("-server") || dedicated) + { + server = true; + + // If a number of clients (i.e. nodes) is specified, the server will wait for the clients + // to connect before starting. + // If no number is specified here, the server starts with 1 client, and others can join + // in-game. + // Since Boris has implemented join in-game, there is no actual need for specifying a + // particular number here. + // FIXME: for dedicated server, numnodes needs to be set to 0 upon start +/* if (M_IsNextParm()) + doomcom->numnodes = (INT16)atoi(M_GetNextParm()); + else */if (dedicated) + doomcom->numnodes = 0; + else + doomcom->numnodes = 1; + + if (doomcom->numnodes < 0) + doomcom->numnodes = 0; + if (doomcom->numnodes > MAXNETNODES) + doomcom->numnodes = MAXNETNODES; + + // server + servernode = 0; + // FIXME: + // ??? and now ? + // server on a big modem ??? 4*isdn + net_bandwidth = 16000; + hardware_MAXPACKETLENGTH = INETPACKETLENGTH; + + ret = true; + } + else if (M_CheckParm("-connect")) + { + if (M_IsNextParm()) + strcpy(serverhostname, M_GetNextParm()); + else + serverhostname[0] = 0; // assuming server in the LAN, use broadcast to detect it + + // server address only in ip + if (serverhostname[0]) + { + COM_BufAddText("connect \""); + COM_BufAddText(serverhostname); + COM_BufAddText("\"\n"); + + // probably modem + hardware_MAXPACKETLENGTH = INETPACKETLENGTH; + } + else + { + // so we're on a LAN + COM_BufAddText("connect any\n"); + + net_bandwidth = 800000; + hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; + } + } + + mypacket.maxlen = hardware_MAXPACKETLENGTH; + I_NetOpenSocket = NET_OpenSocket; + I_Ban = NET_Ban; + I_ClearBans = NET_ClearBans; + I_GetNodeAddress = NET_GetNodeAddress; + I_GetBenAddress = NET_GetBenAddress; + I_SetBanAddress = NET_SetBanAddress; + bannednode = NET_bannednode; + + return ret; +#else + if ( M_CheckParm ("-net") ) + { + I_Error("-net not supported, use -server and -connect\n" + "see docs for more\n"); + } + return false; +#endif +} +#endif diff --git a/src/sdl2/i_system.c b/src/sdl2/i_system.c new file mode 100644 index 000000000..c9d324f0a --- /dev/null +++ b/src/sdl2/i_system.c @@ -0,0 +1,3115 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1993-1996 by id Software, Inc. +// Portions Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +// +// Changes by Graue <graue@oceanbase.org> are in the public domain. +// +//----------------------------------------------------------------------------- +/// \file +/// \brief SRB2 system stuff for SDL + +#ifndef _WIN32_WCE +#include <signal.h> +#endif + +#ifdef _XBOX +#include "SRB2XBOX/xboxhelp.h" +#endif + +#if defined (_WIN32) && !defined (_XBOX) +#define RPC_NO_WINDOWS_H +#include <windows.h> +#include "../doomtype.h" +#ifndef _WIN32_WCE +typedef BOOL (WINAPI *p_GetDiskFreeSpaceExA)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); +typedef BOOL (WINAPI *p_IsProcessorFeaturePresent) (DWORD); +typedef DWORD (WINAPI *p_timeGetTime) (void); +typedef UINT (WINAPI *p_timeEndPeriod) (UINT); +typedef HANDLE (WINAPI *p_OpenFileMappingA) (DWORD, BOOL, LPCSTR); +typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); +typedef HANDLE (WINAPI *p_GetCurrentProcess) (VOID); +typedef BOOL (WINAPI *p_GetProcessAffinityMask) (HANDLE, PDWORD_PTR, PDWORD_PTR); +typedef BOOL (WINAPI *p_SetProcessAffinityMask) (HANDLE, DWORD_PTR); +#endif +#endif +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifdef __GNUC__ +#include <unistd.h> +#elif defined (_MSC_VER) +#include <direct.h> +#endif +#if defined (__unix__) || defined (UNIXCOMMON) +#include <fcntl.h> +#endif + +#ifdef _arch_dreamcast +#include <arch/gdb.h> +#include <arch/timer.h> +#include <conio/conio.h> +#include <dc/pvr.h> +void __set_fpscr(long); // in libgcc / kernel's startup.s? +#else +#include <stdio.h> +#if defined (_WIN32) && !defined (_WIN32_WCE) && !defined (_XBOX) +#include <conio.h> +#endif +#endif + +#ifdef _MSC_VER +#pragma warning(disable : 4214 4244) +#endif + +#ifdef SDL + +#include "SDL.h" + +#ifdef HAVE_TTF +#include "i_ttf.h" +#endif + +#ifdef _MSC_VER +#pragma warning(default : 4214 4244) +#endif + +#if SDL_VERSION_ATLEAST(1,2,7) && !defined (DC) +#include "SDL_cpuinfo.h" // 1.2.7 or greater +#define HAVE_SDLCPUINFO +#endif + +#ifdef _PSP +//#include <pspiofilemgr.h> +#elif !defined(_PS3) +#if defined (__unix__) || defined(__APPLE__) || (defined (UNIXCOMMON) && !defined (_arch_dreamcast) && !defined (__HAIKU__) && !defined (_WII)) +#if defined (__linux__) +#include <sys/vfs.h> +#else +#include <sys/param.h> +#include <sys/mount.h> +/*For meminfo*/ +#include <sys/types.h> +#ifdef FREEBSD +#include <kvm.h> +#endif +#include <nlist.h> +#include <sys/vmmeter.h> +#endif +#endif +#endif + +#ifndef _PS3 +#if defined (__linux__) || (defined (UNIXCOMMON) && !defined (_arch_dreamcast) && !defined (_PSP) && !defined (__HAIKU__) && !defined (_WII)) +#ifndef NOTERMIOS +#include <termios.h> +#include <sys/ioctl.h> // ioctl +#define HAVE_TERMIOS +#endif +#endif +#endif + +#ifndef NOMUMBLE +#if defined (__linux__) && !defined(_PS3) // need -lrt +#include <sys/mman.h> +#ifdef MAP_FAILED +#define HAVE_SHM +#endif +#include <wchar.h> +#endif + +#if defined (_WIN32) && !defined (_WIN32_WCE) && !defined (_XBOX) +#define HAVE_MUMBLE +#define WINMUMBLE +#elif defined (HAVE_SHM) +#define HAVE_MUMBLE +#endif +#endif // NOMUMBLE + +#ifdef _WIN32_WCE +#include "SRB2CE/cehelp.h" +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +// Locations for searching the srb2.srb +#ifdef _arch_dreamcast +#define DEFAULTWADLOCATION1 "/cd" +#define DEFAULTWADLOCATION2 "/pc" +#define DEFAULTWADLOCATION3 "/pc/home/alam/srb2code/data" +#define DEFAULTSEARCHPATH1 "/cd" +#define DEFAULTSEARCHPATH2 "/pc" +//#define DEFAULTSEARCHPATH3 "/pc/home/alam/srb2code/data" +#elif defined (GP2X) +#define DEFAULTWADLOCATION1 "/mnt/sd" +#define DEFAULTWADLOCATION2 "/mnt/sd/SRB2" +#define DEFAULTWADLOCATION3 "/tmp/mnt/sd" +#define DEFAULTWADLOCATION4 "/tmp/mnt/sd/SRB2" +#define DEFAULTSEARCHPATH1 "/mnt/sd" +#define DEFAULTSEARCHPATH2 "/tmp/mnt/sd" +#elif defined (_WII) +#define NOCWD +#define NOHOME +#define NEED_SDL_GETENV +#define DEFAULTWADLOCATION1 "sd:/srb2wii" +#define DEFAULTWADLOCATION2 "usb:/srb2wii" +#define DEFAULTSEARCHPATH1 "sd:/srb2wii" +#define DEFAULTSEARCHPATH2 "usb:/srb2wii" +// PS3: TODO: this will need modification most likely +#elif defined (_PS3) +#define NOCWD +#define NOHOME +#define DEFAULTWADLOCATION1 "/dev_hdd0/game/SRB2-PS3_/USRDIR/etc" +#define DEFAULTWADLOCATION2 "/dev_usb/SRB2PS3" +#define DEFAULTSEARCHPATH1 "/dev_hdd0/game/SRB2-PS3_/USRDIR/etc" +#define DEFAULTSEARCHPATH2 "/dev_usb/SRB2PS3" +#elif defined (_PSP) +#define NOCWD +#define NOHOME +#define DEFAULTWADLOCATION1 "host0:/bin/Resources" +#define DEFAULTWADLOCATION2 "ms0:/PSP/GAME/SRB2PSP" +#define DEFAULTSEARCHPATH1 "host0:/" +#define DEFAULTSEARCHPATH2 "ms0:/PSP/GAME/SRB2PSP" +#elif defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) +#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2" +#define DEFAULTWADLOCATION2 "/usr/local/games/SRB2" +#define DEFAULTWADLOCATION3 "/usr/share/games/SRB2" +#define DEFAULTWADLOCATION4 "/usr/games/SRB2" +#define DEFAULTSEARCHPATH1 "/usr/local/games" +#define DEFAULTSEARCHPATH2 "/usr/games" +#define DEFAULTSEARCHPATH3 "/usr/local" +#elif defined (_XBOX) +#define NOCWD +#ifdef __GNUC__ +#include <openxdk/debug.h> +#endif +#define DEFAULTWADLOCATION1 "c:\\srb2" +#define DEFAULTWADLOCATION2 "d:\\srb2" +#define DEFAULTWADLOCATION3 "e:\\srb2" +#define DEFAULTWADLOCATION4 "f:\\srb2" +#define DEFAULTWADLOCATION5 "g:\\srb2" +#define DEFAULTWADLOCATION6 "h:\\srb2" +#define DEFAULTWADLOCATION7 "i:\\srb2" +#elif defined (_WIN32_WCE) +#define NOCWD +#define NOHOME +#define DEFAULTWADLOCATION1 "\\Storage Card\\SRB2DEMO" +#define DEFAULTSEARCHPATH1 "\\Storage Card" +#elif defined (_WIN32) +#define DEFAULTWADLOCATION1 "c:\\games\\srb2" +#define DEFAULTWADLOCATION2 "\\games\\srb2" +#define DEFAULTSEARCHPATH1 "c:\\games" +#define DEFAULTSEARCHPATH2 "\\games" +#endif + +/** \brief WAD file to look for +*/ +#define WADKEYWORD1 "srb2.srb" +#define WADKEYWORD2 "srb2.wad" +/** \brief holds wad path +*/ +static char returnWadPath[256]; + +//Alam_GBC: SDL + +#include "../doomdef.h" +#include "../m_misc.h" +#include "../i_video.h" +#include "../i_sound.h" +#include "../i_system.h" +#include "../screen.h" //vid.WndParent +#include "../d_net.h" +#include "../g_game.h" +#include "../filesrch.h" +#include "endtxt.h" +#include "sdlmain.h" + +#include "../i_joy.h" + +#include "../m_argv.h" + +#ifdef MAC_ALERT +#include "macosx/mac_alert.h" +#endif + +#include "../d_main.h" + +#if !defined(NOMUMBLE) && defined(HAVE_MUMBLE) +// Mumble context string +#include "../d_clisrv.h" +#include "../byteptr.h" +#endif + +/** \brief The JoyReset function + + \param JoySet Joystick info to reset + + \return void +*/ +static void JoyReset(SDLJoyInfo_t *JoySet) +{ + if (JoySet->dev) + { +#ifdef GP2X //GP2X's SDL does an illegal free on the 1st joystick... + if (SDL_JoystickIndex(JoySet->dev) != 0) +#endif + SDL_JoystickClose(JoySet->dev); + } + JoySet->dev = NULL; + JoySet->oldjoy = -1; + JoySet->axises = JoySet->buttons = JoySet->hats = JoySet->balls = 0; + //JoySet->scale +} + +/** \brief First joystick up and running +*/ +static INT32 joystick_started = 0; + +/** \brief SDL info about joystick 1 +*/ +SDLJoyInfo_t JoyInfo; + + +/** \brief Second joystick up and running +*/ +static INT32 joystick2_started = 0; + +/** \brief SDL inof about joystick 2 +*/ +SDLJoyInfo_t JoyInfo2; + +#ifdef HAVE_TERMIOS +static INT32 fdmouse2 = -1; +static INT32 mouse2_started = 0; +#endif + +SDL_bool consolevent = SDL_FALSE; +SDL_bool framebuffer = SDL_FALSE; + +UINT8 keyboard_started = false; + +#if 0 +static void signal_handler(INT32 num) +{ + //static char msg[] = "oh no! back to reality!\r\n"; + char * sigmsg; + char sigdef[32]; + + switch (num) + { + case SIGINT: + sigmsg = "interrupt"; + break; + case SIGILL: + sigmsg = "illegal instruction - invalid function image"; + break; + case SIGFPE: + sigmsg = "floating point exception"; + break; + case SIGSEGV: + sigmsg = "segment violation"; + break; + case SIGTERM: + sigmsg = "Software termination signal from kill"; + break; +#if !(defined (__unix_) || defined (UNIXCOMMON)) + case SIGBREAK: + sigmsg = "Ctrl-Break sequence"; + break; +#endif + case SIGABRT: + sigmsg = "abnormal termination triggered by abort call"; + break; + default: + sprintf(sigdef,"signal number %d", num); + sigmsg = sigdef; + } + + I_OutputMsg("signal_handler() error: %s\n", sigmsg); + signal(num, SIG_DFL); //default signal action + raise(num); + I_Quit(); +} +#endif + +#if defined (NDEBUG) && !defined (DC) && !defined (_WIN32_WCE) +FUNCNORETURN static ATTRNORETURN void quit_handler(int num) +{ + signal(num, SIG_DFL); //default signal action + raise(num); + I_Quit(); +} +#endif + +#ifdef HAVE_TERMIOS +// TERMIOS console code from Quake3: thank you! +SDL_bool stdin_active = SDL_TRUE; + +typedef struct +{ + size_t cursor; + char buffer[256]; +} feild_t; + +feild_t tty_con; + +// when printing general stuff to stdout stderr (Sys_Printf) +// we need to disable the tty console stuff +// this increments so we can recursively disable +static INT32 ttycon_hide = 0; +// some key codes that the terminal may be using +// TTimo NOTE: I'm not sure how relevant this is +static INT32 tty_erase; +static INT32 tty_eof; + +static struct termios tty_tc; + +// ============================================================= +// tty console routines +// NOTE: if the user is editing a line when something gets printed to the early console then it won't look good +// so we provide tty_Clear and tty_Show to be called before and after a stdout or stderr output +// ============================================================= + +// flush stdin, I suspect some terminals are sending a LOT of garbage +// FIXME TTimo relevant? +#if 0 +static inline void tty_FlushIn(void) +{ + char key; + while (read(STDIN_FILENO, &key, 1)!=-1); +} +#endif + +// do a backspace +// TTimo NOTE: it seems on some terminals just sending '\b' is not enough +// so for now, in any case we send "\b \b" .. yeah well .. +// (there may be a way to find out if '\b' alone would work though) +static void tty_Back(void) +{ + char key; + ssize_t d; + key = '\b'; + d = write(STDOUT_FILENO, &key, 1); + key = ' '; + d = write(STDOUT_FILENO, &key, 1); + key = '\b'; + d = write(STDOUT_FILENO, &key, 1); + (void)d; +} + +static void tty_Clear(void) +{ + size_t i; + if (tty_con.cursor>0) + { + for (i=0; i<tty_con.cursor; i++) + { + tty_Back(); + } + } + +} + +// clear the display of the line currently edited +// bring cursor back to beginning of line +static inline void tty_Hide(void) +{ + //I_Assert(consolevent); + if (ttycon_hide) + { + ttycon_hide++; + return; + } + tty_Clear(); + ttycon_hide++; +} + +// show the current line +// FIXME TTimo need to position the cursor if needed?? +static inline void tty_Show(void) +{ + size_t i; + ssize_t d; + //I_Assert(consolevent); + I_Assert(ttycon_hide>0); + ttycon_hide--; + if (ttycon_hide == 0 && tty_con.cursor) + { + for (i=0; i<tty_con.cursor; i++) + { + d = write(STDOUT_FILENO, tty_con.buffer+i, 1); + } + } + (void)d; +} + +// never exit without calling this, or your terminal will be left in a pretty bad state +static void I_ShutdownConsole(void) +{ + if (consolevent) + { + I_OutputMsg("Shutdown tty console\n"); + consolevent = SDL_FALSE; + tcsetattr (STDIN_FILENO, TCSADRAIN, &tty_tc); + } +} + +static void I_StartupConsole(void) +{ + struct termios tc; + + // TTimo + // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=390 (404) + // then SIGTTIN or SIGTOU is emitted, if not catched, turns into a SIGSTP + signal(SIGTTIN, SIG_IGN); + signal(SIGTTOU, SIG_IGN); + +#if !defined(GP2X) //read is bad on GP2X + consolevent = !M_CheckParm("-noconsole"); +#endif + framebuffer = M_CheckParm("-framebuffer"); + + if (framebuffer) + consolevent = SDL_FALSE; + + if (!consolevent) return; + + if (isatty(STDIN_FILENO)!=1) + { + I_OutputMsg("stdin is not a tty, tty console mode failed\n"); + consolevent = SDL_FALSE; + return; + } + memset(&tty_con, 0x00, sizeof(tty_con)); + tcgetattr (0, &tty_tc); + tty_erase = tty_tc.c_cc[VERASE]; + tty_eof = tty_tc.c_cc[VEOF]; + tc = tty_tc; + /* + ECHO: don't echo input characters + ICANON: enable canonical mode. This enables the special + characters EOF, EOL, EOL2, ERASE, KILL, REPRINT, + STATUS, and WERASE, and buffers by lines. + ISIG: when any of the characters INTR, QUIT, SUSP, or + DSUSP are received, generate the corresponding signal + */ + tc.c_lflag &= ~(ECHO | ICANON); + /* + ISTRIP strip off bit 8 + INPCK enable input parity checking + */ + tc.c_iflag &= ~(ISTRIP | INPCK); + tc.c_cc[VMIN] = 0; //1? + tc.c_cc[VTIME] = 0; + tcsetattr (0, TCSADRAIN, &tc); +} + +void I_GetConsoleEvents(void) +{ + // we use this when sending back commands + event_t ev = {0,0,0,0}; + char key = 0; + ssize_t d; + + if (!consolevent) + return; + + ev.type = ev_console; + if (read(STDIN_FILENO, &key, 1) == -1 || !key) + return; + + // we have something + // backspace? + // NOTE TTimo testing a lot of values .. seems it's the only way to get it to work everywhere + if ((key == tty_erase) || (key == 127) || (key == 8)) + { + if (tty_con.cursor > 0) + { + tty_con.cursor--; + tty_con.buffer[tty_con.cursor] = '\0'; + tty_Back(); + } + ev.data1 = KEY_BACKSPACE; + } + else if (key < ' ') // check if this is a control char + { + if (key == '\n') + { + tty_Clear(); + tty_con.cursor = 0; + ev.data1 = KEY_ENTER; + } + else return; + } + else + { + // push regular character + ev.data1 = tty_con.buffer[tty_con.cursor] = key; + tty_con.cursor++; + // print the current line (this is differential) + d = write(STDOUT_FILENO, &key, 1); + } + if (ev.data1) D_PostEvent(&ev); + //tty_FlushIn(); + (void)d; +} + +#elif defined (_WIN32) && !(defined (_XBOX) || defined (_WIN32_WCE)) +static BOOL I_ReadyConsole(HANDLE ci) +{ + DWORD gotinput; + if (ci == INVALID_HANDLE_VALUE) return FALSE; + if (WaitForSingleObject(ci,0) != WAIT_OBJECT_0) return FALSE; + if (GetFileType(ci) != FILE_TYPE_CHAR) return FALSE; + if (!GetConsoleMode(ci, &gotinput)) return FALSE; + return (GetNumberOfConsoleInputEvents(ci, &gotinput) && gotinput); +} + +static boolean entering_con_command = false; + +void I_GetConsoleEvents(void) +{ + event_t ev = {0,0,0,0}; + HANDLE ci = GetStdHandle(STD_INPUT_HANDLE); + HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO CSBI; + INPUT_RECORD input; + DWORD t; + + while (I_ReadyConsole(ci) && ReadConsoleInput(ci, &input, 1, &t) && t) + { + memset(&ev,0x00,sizeof (ev)); + switch (input.EventType) + { + case KEY_EVENT: + if (input.Event.KeyEvent.bKeyDown) + { + ev.type = ev_console; + entering_con_command = true; + switch (input.Event.KeyEvent.wVirtualKeyCode) + { + case VK_ESCAPE: + case VK_TAB: + ev.data1 = KEY_NULL; + break; + case VK_SHIFT: + ev.data1 = KEY_LSHIFT; + break; + case VK_RETURN: + entering_con_command = false; + // Fall through. + default: + ev.data1 = MapVirtualKey(input.Event.KeyEvent.wVirtualKeyCode,2); // convert in to char + } + if (co != INVALID_HANDLE_VALUE && GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &t)) + { + if (ev.data1 && ev.data1 != KEY_LSHIFT && ev.data1 != KEY_RSHIFT) + { +#ifdef _UNICODE + WriteConsole(co, &input.Event.KeyEvent.uChar.UnicodeChar, 1, &t, NULL); +#else + WriteConsole(co, &input.Event.KeyEvent.uChar.AsciiChar, 1 , &t, NULL); +#endif + } + if (input.Event.KeyEvent.wVirtualKeyCode == VK_BACK + && GetConsoleScreenBufferInfo(co,&CSBI)) + { + WriteConsoleOutputCharacterA(co, " ",1, CSBI.dwCursorPosition, &t); + } + } + } + else + { + ev.type = ev_keyup; + switch (input.Event.KeyEvent.wVirtualKeyCode) + { + case VK_SHIFT: + ev.data1 = KEY_LSHIFT; + break; + default: + break; + } + } + if (ev.data1) D_PostEvent(&ev); + break; + case MOUSE_EVENT: + case WINDOW_BUFFER_SIZE_EVENT: + case MENU_EVENT: + case FOCUS_EVENT: + break; + } + } +} + +static void I_StartupConsole(void) +{ + HANDLE ci, co; + const INT32 ded = M_CheckParm("-dedicated"); +#ifdef SDLMAIN + BOOL gotConsole = FALSE; + if (M_CheckParm("-console") || ded) + gotConsole = AllocConsole(); +#else + BOOL gotConsole = TRUE; + if (M_CheckParm("-detachconsole")) + { + FreeConsole(); + gotConsole = AllocConsole(); + } +#ifdef _DEBUG + else if (M_CheckParm("-noconsole") && !ded) +#else + else if (!M_CheckParm("-console") && !ded) +#endif + { + FreeConsole(); + gotConsole = FALSE; + } +#endif + + if (gotConsole) + { + SetConsoleTitleA("SRB2 Console"); + consolevent = SDL_TRUE; + } + + //Let get the real console HANDLE, because Mingw's Bash is bad! + ci = CreateFile(TEXT("CONIN$") , GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + co = CreateFile(TEXT("CONOUT$"), GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (ci != INVALID_HANDLE_VALUE) + { + const DWORD CM = ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT; + SetStdHandle(STD_INPUT_HANDLE, ci); + if (GetFileType(ci) == FILE_TYPE_CHAR) + SetConsoleMode(ci, CM); //default mode but no ENABLE_MOUSE_INPUT + } + if (co != INVALID_HANDLE_VALUE) + { + SetStdHandle(STD_OUTPUT_HANDLE, co); + SetStdHandle(STD_ERROR_HANDLE, co); + } +} +static inline void I_ShutdownConsole(void){} +#else +void I_GetConsoleEvents(void){} +static inline void I_StartupConsole(void) +{ +#ifdef _arch_dreamcast + char title[] = "SRB2 for Dreamcast!\n"; + __set_fpscr(0x00040000); /* ignore FPU underflow */ + //printf("\nHello world!\n\n"); + pvr_init_defaults(); + conio_init(CONIO_TTY_PVR, CONIO_INPUT_LINE); + conio_set_theme(CONIO_THEME_MATRIX); + conio_clear(); + conio_putstr(title); + //printf("\nHello world!\n\n"); +#endif +#ifdef _DEBUG + consolevent = !M_CheckParm("-noconsole"); +#else + consolevent = M_CheckParm("-console"); +#endif + + framebuffer = M_CheckParm("-framebuffer"); + + if (framebuffer) + consolevent = SDL_FALSE; +} +static inline void I_ShutdownConsole(void){} +#endif + +// +// StartupKeyboard +// +void I_StartupKeyboard (void) +{ +#if defined (NDEBUG) && !defined (DC) +#ifdef SIGILL +// signal(SIGILL , signal_handler); +#endif +#ifdef SIGINT + signal(SIGINT , quit_handler); +#endif +#ifdef SIGSEGV +// signal(SIGSEGV , signal_handler); +#endif +#ifdef SIGBREAK + signal(SIGBREAK , quit_handler); +#endif +#ifdef SIGABRT +// signal(SIGABRT , signal_handler); +#endif +#ifdef SIGTERM + signal(SIGTERM , quit_handler); +#endif +#endif +} + +// +//I_OutputMsg +// +void I_OutputMsg(const char *fmt, ...) +{ + size_t len; + XBOXSTATIC char txt[8192]; + va_list argptr; + +#ifdef _arch_dreamcast + if (!keyboard_started) conio_printf(fmt); +#endif + + va_start(argptr,fmt); + vsprintf(txt, fmt, argptr); + va_end(argptr); + +#ifdef HAVE_TTF + if (TTF_WasInit()) I_TTFDrawText(currentfont, solid, DEFAULTFONTFGR, DEFAULTFONTFGG, DEFAULTFONTFGB, DEFAULTFONTFGA, + DEFAULTFONTBGR, DEFAULTFONTBGG, DEFAULTFONTBGB, DEFAULTFONTBGA, txt); +#endif + +#if defined (_WIN32) && !defined (_XBOX) && defined (_MSC_VER) + OutputDebugStringA(txt); +#endif + + len = strlen(txt); + +#ifdef LOGMESSAGES + if (logstream) + { + size_t d = fwrite(txt, len, 1, logstream); + fflush(logstream); + (void)d; + } +#endif + +#if defined (_WIN32) && !defined (_XBOX) && !defined(_WIN32_WCE) +#ifdef DEBUGFILE + if (debugfile != stderr) +#endif + { + HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD bytesWritten; + + if (co == INVALID_HANDLE_VALUE) + return; + + if (GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &bytesWritten)) + { + static COORD coordNextWrite = {0,0}; + LPVOID oldLines = NULL; + INT oldLength; + CONSOLE_SCREEN_BUFFER_INFO csbi; + + // Save the lines that we're going to obliterate. + GetConsoleScreenBufferInfo(co, &csbi); + oldLength = csbi.dwSize.X * (csbi.dwCursorPosition.Y - coordNextWrite.Y) + csbi.dwCursorPosition.X - coordNextWrite.X; + + if (oldLength > 0) + { + LPVOID blank = malloc(oldLength); + if (!blank) return; + memset(blank, ' ', oldLength); // Blank out. + oldLines = malloc(oldLength*sizeof(TCHAR)); + if (!oldLines) + { + free(blank); + return; + } + + ReadConsoleOutputCharacter(co, oldLines, oldLength, coordNextWrite, &bytesWritten); + + // Move to where we what to print - which is where we would've been, + // had console input not been in the way, + SetConsoleCursorPosition(co, coordNextWrite); + + WriteConsoleA(co, blank, oldLength, &bytesWritten, NULL); + free(blank); + + // And back to where we want to print again. + SetConsoleCursorPosition(co, coordNextWrite); + } + + // Actually write the string now! + WriteConsoleA(co, txt, (DWORD)len, &bytesWritten, NULL); + + // Next time, output where we left off. + GetConsoleScreenBufferInfo(co, &csbi); + coordNextWrite = csbi.dwCursorPosition; + + // Restore what was overwritten. + if (oldLines && entering_con_command) + WriteConsole(co, oldLines, oldLength, &bytesWritten, NULL); + if (oldLines) free(oldLines); + } + else // Redirected to a file. + WriteFile(co, txt, (DWORD)len, &bytesWritten, NULL); + } +#else +#ifdef HAVE_TERMIOS + if (consolevent) + { + tty_Hide(); + } +#endif + + if (!framebuffer) + fprintf(stderr, "%s", txt); +#ifdef HAVE_TERMIOS + if (consolevent) + { + tty_Show(); + } +#endif + + // 2004-03-03 AJR Since not all messages end in newline, some were getting displayed late. + if (!framebuffer) + fflush(stderr); + +#endif +} + +// +// I_GetKey +// +INT32 I_GetKey (void) +{ + // Warning: I_GetKey empties the event queue till next keypress + event_t *ev; + INT32 rc = 0; + + // return the first keypress from the event queue + for (; eventtail != eventhead; eventtail = (eventtail+1)&(MAXEVENTS-1)) + { + ev = &events[eventtail]; + if (ev->type == ev_keydown || ev->type == ev_console) + { + rc = ev->data1; + continue; + } + } + + return rc; +} + +// +// I_JoyScale +// +void I_JoyScale(void) +{ +#ifdef GP2X + if (JoyInfo.dev && SDL_JoystickIndex(JoyInfo.dev) == 0) + Joystick.bGamepadStyle = true; + else +#endif + Joystick.bGamepadStyle = cv_joyscale.value==0; + JoyInfo.scale = Joystick.bGamepadStyle?1:cv_joyscale.value; +} + +void I_JoyScale2(void) +{ +#ifdef GP2X + if (JoyInfo2.dev && SDL_JoystickIndex(JoyInfo2.dev) == 0) + Joystick.bGamepadStyle = true; + else +#endif + Joystick2.bGamepadStyle = cv_joyscale2.value==0; + JoyInfo2.scale = Joystick2.bGamepadStyle?1:cv_joyscale2.value; +} + +/** \brief Joystick 1 buttons states +*/ +static UINT64 lastjoybuttons = 0; + +/** \brief Joystick 1 hats state +*/ +static UINT64 lastjoyhats = 0; + +/** \brief Shuts down joystick 1 + + + \return void + + +*/ +static void I_ShutdownJoystick(void) +{ + INT32 i; + event_t event; + event.type=ev_keyup; + event.data2 = 0; + event.data3 = 0; + + lastjoybuttons = lastjoyhats = 0; + + // emulate the up of all joystick buttons + for (i=0;i<JOYBUTTONS;i++) + { + event.data1=KEY_JOY1+i; + D_PostEvent(&event); + } + + // emulate the up of all joystick hats + for (i=0;i<JOYHATS*4;i++) + { + event.data1=KEY_HAT1+i; + D_PostEvent(&event); + } + + // reset joystick position + event.type = ev_joystick; + for (i=0;i<JOYAXISSET; i++) + { + event.data1 = i; + D_PostEvent(&event); + } + + joystick_started = 0; + JoyReset(&JoyInfo); + if (!joystick_started && !joystick2_started && SDL_WasInit(SDL_INIT_JOYSTICK) == SDL_INIT_JOYSTICK) + { + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + if (cv_usejoystick.value == 0) + { + I_OutputMsg("I_Joystick: SDL's Joystick system has been shutdown\n"); + } + } +} + +void I_GetJoystickEvents(void) +{ + static event_t event = {0,0,0,0}; + INT32 i = 0; + UINT64 joyhats = 0; +#if 0 + UINT64 joybuttons = 0; + Sint16 axisx, axisy; +#endif + + if (!joystick_started) return; + + if (!JoyInfo.dev) //I_ShutdownJoystick(); + return; + +#if 0 + //faB: look for as much buttons as g_input code supports, + // we don't use the others + for (i = JoyInfo.buttons - 1; i >= 0; i--) + { + joybuttons <<= 1; + if (SDL_JoystickGetButton(JoyInfo.dev,i)) + joybuttons |= 1; + } + + if (joybuttons != lastjoybuttons) + { + INT64 j = 1; // keep only bits that changed since last time + INT64 newbuttons = joybuttons ^ lastjoybuttons; + lastjoybuttons = joybuttons; + + for (i = 0; i < JOYBUTTONS; i++, j <<= 1) + { + if (newbuttons & j) // button changed state? + { + if (joybuttons & j) + event.type = ev_keydown; + else + event.type = ev_keyup; +#ifdef _PSP + if (i == 12) + event.data1 = KEY_ESCAPE; + else +#endif + event.data1 = KEY_JOY1 + i; + D_PostEvent(&event); + } + } + } +#endif + + for (i = JoyInfo.hats - 1; i >= 0; i--) + { + Uint8 hat = SDL_JoystickGetHat(JoyInfo.dev, i); + + if (hat & SDL_HAT_UP ) joyhats|=(UINT64)0x1<<(0 + 4*i); + if (hat & SDL_HAT_DOWN ) joyhats|=(UINT64)0x1<<(1 + 4*i); + if (hat & SDL_HAT_LEFT ) joyhats|=(UINT64)0x1<<(2 + 4*i); + if (hat & SDL_HAT_RIGHT) joyhats|=(UINT64)0x1<<(3 + 4*i); + } + + if (joyhats != lastjoyhats) + { + INT64 j = 1; // keep only bits that changed since last time + INT64 newhats = joyhats ^ lastjoyhats; + lastjoyhats = joyhats; + + for (i = 0; i < JOYHATS*4; i++, j <<= 1) + { + if (newhats & j) // hat changed state? + { + if (joyhats & j) + event.type = ev_keydown; + else + event.type = ev_keyup; + event.data1 = KEY_HAT1 + i; + D_PostEvent(&event); + } + } + } + +#if 0 + // send joystick axis positions + event.type = ev_joystick; + + for (i = JOYAXISSET - 1; i >= 0; i--) + { + event.data1 = i; + if (i*2 + 1 <= JoyInfo.axises) + axisx = SDL_JoystickGetAxis(JoyInfo.dev, i*2 + 0); + else axisx = 0; + if (i*2 + 2 <= JoyInfo.axises) + axisy = SDL_JoystickGetAxis(JoyInfo.dev, i*2 + 1); + else axisy = 0; + +#ifdef _arch_dreamcast // -128 to 127 + axisx = axisx*8; + axisy = axisy*8; +#else // -32768 to 32767 + axisx = axisx/32; + axisy = axisy/32; +#endif + + if (Joystick.bGamepadStyle) + { + // gamepad control type, on or off, live or die + if (axisx < -(JOYAXISRANGE/2)) + event.data2 = -1; + else if (axisx > (JOYAXISRANGE/2)) + event.data2 = 1; + else event.data2 = 0; + if (axisy < -(JOYAXISRANGE/2)) + event.data3 = -1; + else if (axisy > (JOYAXISRANGE/2)) + event.data3 = 1; + else event.data3 = 0; + } + else + { + + axisx = JoyInfo.scale?((axisx/JoyInfo.scale)*JoyInfo.scale):axisx; + axisy = JoyInfo.scale?((axisy/JoyInfo.scale)*JoyInfo.scale):axisy; + +#ifdef SDL_JDEADZONE + if (-SDL_JDEADZONE <= axisx && axisx <= SDL_JDEADZONE) axisx = 0; + if (-SDL_JDEADZONE <= axisy && axisy <= SDL_JDEADZONE) axisy = 0; +#endif + + // analog control style , just send the raw data + event.data2 = axisx; // x axis + event.data3 = axisy; // y axis + } + D_PostEvent(&event); + } +#endif +} + +/** \brief Open joystick handle + + \param fname name of joystick + + \return axises + + +*/ +static int joy_open(const char *fname) +{ + return -1; // TODO SDL2 joystick overhaul +#if 0 + int joyindex = atoi(fname); + int num_joy = 0; + int i; + + if (joystick_started == 0 && joystick2_started == 0) + { + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) + { + CONS_Printf(M_GetText("Couldn't initialize joystick: %s\n"), SDL_GetError()); + return -1; + } + else + { + num_joy = SDL_NumJoysticks(); + } + + if (num_joy < joyindex) + { + CONS_Printf(M_GetText("Cannot use joystick #%d/(%s), it doesn't exist\n"),joyindex,fname); + for (i = 0; i < num_joy; i++) + CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickName(i)); + I_ShutdownJoystick(); + return -1; + } + } + else + { + JoyReset(&JoyInfo); + //I_ShutdownJoystick(); + //joy_open(fname); + } + + num_joy = SDL_NumJoysticks(); + + if (joyindex <= 0 || num_joy == 0 || JoyInfo.oldjoy == joyindex) + { +// I_OutputMsg("Unable to use that joystick #(%s), non-number\n",fname); + if (num_joy != 0) + { + CONS_Printf(M_GetText("Found %d joysticks on this system\n"), num_joy); + for (i = 0; i < num_joy; i++) + CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickName(i)); + } + else + CONS_Printf("%s", M_GetText("Found no joysticks on this system\n")); + if (joyindex <= 0 || num_joy == 0) return 0; + } + + JoyInfo.dev = SDL_JoystickOpen(joyindex-1); + CONS_Printf(M_GetText("Joystick: %s\n"), SDL_JoystickName(joyindex-1)); + + if (JoyInfo.dev == NULL) + { + CONS_Printf(M_GetText("Couldn't open joystick: %s\n"), SDL_GetError()); + I_ShutdownJoystick(); + return -1; + } + else + { + JoyInfo.axises = SDL_JoystickNumAxes(JoyInfo.dev); + if (JoyInfo.axises > JOYAXISSET*2) + JoyInfo.axises = JOYAXISSET*2; +/* if (joyaxes<2) + { + I_OutputMsg("Not enought axes?\n"); + I_ShutdownJoystick(); + return 0; + }*/ + + JoyInfo.buttons = SDL_JoystickNumButtons(JoyInfo.dev); + if (JoyInfo.buttons > JOYBUTTONS) + JoyInfo.buttons = JOYBUTTONS; + +#ifdef DC + JoyInfo.hats = 0; +#else + JoyInfo.hats = SDL_JoystickNumHats(JoyInfo.dev); + if (JoyInfo.hats > JOYHATS) + JoyInfo.hats = JOYHATS; + + JoyInfo.balls = SDL_JoystickNumBalls(JoyInfo.dev); +#endif + + //Joystick.bGamepadStyle = !stricmp(SDL_JoystickName(SDL_JoystickIndex(JoyInfo.dev)), "pad"); + + return JoyInfo.axises; + } +#endif +} + +//Joystick2 + +/** \brief Joystick 2 buttons states +*/ +static UINT64 lastjoy2buttons = 0; + +/** \brief Joystick 2 hats state +*/ +static UINT64 lastjoy2hats = 0; + +/** \brief Shuts down joystick 2 + + + \return void +*/ +static void I_ShutdownJoystick2(void) +{ + INT32 i; + event_t event; + event.type = ev_keyup; + event.data2 = 0; + event.data3 = 0; + + lastjoy2buttons = lastjoy2hats = 0; + + // emulate the up of all joystick buttons + for (i = 0; i < JOYBUTTONS; i++) + { + event.data1 = KEY_2JOY1 + i; + D_PostEvent(&event); + } + + // emulate the up of all joystick hats + for (i = 0; i < JOYHATS*4; i++) + { + event.data1 = KEY_2HAT1 + i; + D_PostEvent(&event); + } + + // reset joystick position + event.type = ev_joystick2; + for (i = 0; i < JOYAXISSET; i++) + { + event.data1 = i; + D_PostEvent(&event); + } + + JoyReset(&JoyInfo2); + if (!joystick_started && !joystick2_started && SDL_WasInit(SDL_INIT_JOYSTICK) == SDL_INIT_JOYSTICK) + { + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + if (cv_usejoystick2.value == 0) + { + DEBFILE("I_Joystick2: SDL's Joystick system has been shutdown\n"); + } + } +} + +void I_GetJoystick2Events(void) +{ + static event_t event = {0,0,0,0}; + INT32 i = 0; + UINT64 joyhats = 0; +#if 0 + INT64 joybuttons = 0; + INT32 axisx, axisy; +#endif + + if (!joystick2_started) + return; + + if (!JoyInfo2.dev) //I_ShutdownJoystick2(); + return; + + +#if 0 + //faB: look for as much buttons as g_input code supports, + // we don't use the others + for (i = JoyInfo2.buttons - 1; i >= 0; i--) + { + joybuttons <<= 1; + if (SDL_JoystickGetButton(JoyInfo2.dev,i)) + joybuttons |= 1; + } + + if (joybuttons != lastjoy2buttons) + { + INT64 j = 1; // keep only bits that changed since last time + INT64 newbuttons = joybuttons ^ lastjoy2buttons; + lastjoy2buttons = joybuttons; + + for (i = 0; i < JOYBUTTONS; i++, j <<= 1) + { + if (newbuttons & j) // button changed state? + { + if (joybuttons & j) + event.type = ev_keydown; + else + event.type = ev_keyup; + event.data1 = KEY_2JOY1 + i; + D_PostEvent(&event); + } + } + } +#endif + + for (i = JoyInfo2.hats - 1; i >= 0; i--) + { + Uint8 hat = SDL_JoystickGetHat(JoyInfo2.dev, i); + + if (hat & SDL_HAT_UP ) joyhats|=(UINT64)0x1<<(0 + 4*i); + if (hat & SDL_HAT_DOWN ) joyhats|=(UINT64)0x1<<(1 + 4*i); + if (hat & SDL_HAT_LEFT ) joyhats|=(UINT64)0x1<<(2 + 4*i); + if (hat & SDL_HAT_RIGHT) joyhats|=(UINT64)0x1<<(3 + 4*i); + } + + if (joyhats != lastjoy2hats) + { + INT64 j = 1; // keep only bits that changed since last time + INT64 newhats = joyhats ^ lastjoy2hats; + lastjoy2hats = joyhats; + + for (i = 0; i < JOYHATS*4; i++, j <<= 1) + { + if (newhats & j) // hat changed state? + { + if (joyhats & j) + event.type = ev_keydown; + else + event.type = ev_keyup; + event.data1 = KEY_2HAT1 + i; + D_PostEvent(&event); + } + } + } + +#if 0 + // send joystick axis positions + event.type = ev_joystick2; + + for (i = JOYAXISSET - 1; i >= 0; i--) + { + event.data1 = i; + if (i*2 + 1 <= JoyInfo2.axises) + axisx = SDL_JoystickGetAxis(JoyInfo2.dev, i*2 + 0); + else axisx = 0; + if (i*2 + 2 <= JoyInfo2.axises) + axisy = SDL_JoystickGetAxis(JoyInfo2.dev, i*2 + 1); + else axisy = 0; + +#ifdef _arch_dreamcast // -128 to 127 + axisx = axisx*8; + axisy = axisy*8; +#else // -32768 to 32767 + axisx = axisx/32; + axisy = axisy/32; +#endif + + if (Joystick2.bGamepadStyle) + { + // gamepad control type, on or off, live or die + if (axisx < -(JOYAXISRANGE/2)) + event.data2 = -1; + else if (axisx > (JOYAXISRANGE/2)) + event.data2 = 1; + else + event.data2 = 0; + if (axisy < -(JOYAXISRANGE/2)) + event.data3 = -1; + else if (axisy > (JOYAXISRANGE/2)) + event.data3 = 1; + else + event.data3 = 0; + } + else + { + + axisx = JoyInfo2.scale?((axisx/JoyInfo2.scale)*JoyInfo2.scale):axisx; + axisy = JoyInfo2.scale?((axisy/JoyInfo2.scale)*JoyInfo2.scale):axisy; + +#ifdef SDL_JDEADZONE + if (-SDL_JDEADZONE <= axisx && axisx <= SDL_JDEADZONE) axisx = 0; + if (-SDL_JDEADZONE <= axisy && axisy <= SDL_JDEADZONE) axisy = 0; +#endif + + // analog control style , just send the raw data + event.data2 = axisx; // x axis + event.data3 = axisy; // y axis + } + D_PostEvent(&event); + } +#endif + +} + +/** \brief Open joystick handle + + \param fname name of joystick + + \return axises + + +*/ +static int joy_open2(const char *fname) +{ + return -1; // TODO SDL2 joystick overhaul +#if 0 + int joyindex = atoi(fname); + int num_joy = 0; + int i; + + if (joystick_started == 0 && joystick2_started == 0) + { + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) + { + CONS_Printf(M_GetText("Couldn't initialize joystick: %s\n"), SDL_GetError()); + return -1; + } + else + num_joy = SDL_NumJoysticks(); + + if (num_joy < joyindex) + { + CONS_Printf(M_GetText("Cannot use joystick #%d/(%s), it doesn't exist\n"),joyindex,fname); + for (i = 0; i < num_joy; i++) + CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickName(i)); + I_ShutdownJoystick2(); + return -1; + } + } + else + { + JoyReset(&JoyInfo2); + //I_ShutdownJoystick(); + //joy_open(fname); + } + + num_joy = SDL_NumJoysticks(); + + if (joyindex <= 0 || num_joy == 0 || JoyInfo2.oldjoy == joyindex) + { +// I_OutputMsg("Unable to use that joystick #(%s), non-number\n",fname); + if (num_joy != 0) + { + CONS_Printf(M_GetText("Found %d joysticks on this system\n"), num_joy); + for (i = 0; i < num_joy; i++) + CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickName(i)); + } + else + CONS_Printf("%s", M_GetText("Found no joysticks on this system\n")); + if (joyindex <= 0 || num_joy == 0) return 0; + } + + JoyInfo2.dev = SDL_JoystickOpen(joyindex-1); + CONS_Printf(M_GetText("Joystick2: %s\n"), SDL_JoystickName(joyindex-1)); + + if (!JoyInfo2.dev) + { + CONS_Printf(M_GetText("Couldn't open joystick2: %s\n"), SDL_GetError()); + I_ShutdownJoystick2(); + return -1; + } + else + { + JoyInfo2.axises = SDL_JoystickNumAxes(JoyInfo2.dev); + if (JoyInfo2.axises > JOYAXISSET*2) + JoyInfo2.axises = JOYAXISSET*2; +/* if (joyaxes < 2) + { + I_OutputMsg("Not enought axes?\n"); + I_ShutdownJoystick2(); + return 0; + }*/ + + JoyInfo2.buttons = SDL_JoystickNumButtons(JoyInfo2.dev); + if (JoyInfo2.buttons > JOYBUTTONS) + JoyInfo2.buttons = JOYBUTTONS; + +#ifdef DC + JoyInfo2.hats = 0; +#else + JoyInfo2.hats = SDL_JoystickNumHats(JoyInfo2.dev); + if (JoyInfo2.hats > JOYHATS) + JoyInfo2.hats = JOYHATS; + + JoyInfo2.balls = SDL_JoystickNumBalls(JoyInfo2.dev); +#endif + + //Joystick.bGamepadStyle = !stricmp(SDL_JoystickName(SDL_JoystickIndex(JoyInfo2.dev)), "pad"); + + return JoyInfo2.axises; + } +#endif +} + +// +// I_InitJoystick +// +void I_InitJoystick(void) +{ + I_ShutdownJoystick(); + if (!strcmp(cv_usejoystick.string, "0") || M_CheckParm("-nojoy")) + return; + if (joy_open(cv_usejoystick.string) != -1) + JoyInfo.oldjoy = atoi(cv_usejoystick.string); + else + { + cv_usejoystick.value = 0; + return; + } + joystick_started = 1; +} + +void I_InitJoystick2(void) +{ + I_ShutdownJoystick2(); + if (!strcmp(cv_usejoystick2.string, "0") || M_CheckParm("-nojoy")) + return; + if (joy_open2(cv_usejoystick2.string) != -1) + JoyInfo2.oldjoy = atoi(cv_usejoystick2.string); + else + { + cv_usejoystick2.value = 0; + return; + } + joystick2_started = 1; +} + +static void I_ShutdownInput(void) +{ + if (SDL_WasInit(SDL_INIT_JOYSTICK) == SDL_INIT_JOYSTICK) + { + JoyReset(&JoyInfo); + JoyReset(&JoyInfo2); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + } + +} + +INT32 I_NumJoys(void) +{ + INT32 numjoy = 0; + if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0) + { + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) != -1) + numjoy = SDL_NumJoysticks(); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + } + else + numjoy = SDL_NumJoysticks(); + return numjoy; +} + +const char *I_GetJoyName(INT32 joyindex) +{ + const char *joyname = "NA"; + joyindex--; //SDL's Joystick System starts at 0, not 1 + if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0) + { + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) != -1) + joyname = SDL_JoystickNameForIndex(joyindex); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + } + else + joyname = SDL_JoystickNameForIndex(joyindex); + return joyname; +} + +#ifndef NOMUMBLE +#ifdef HAVE_MUMBLE +// Best Mumble positional audio settings: +// Minimum distance 3.0 m +// Bloom 175% +// Maximum distance 80.0 m +// Minimum volume 50% +#define DEG2RAD (0.017453292519943295769236907684883l) // TAU/360 or PI/180 +#define MUMBLEUNIT (64.0f) // FRACUNITS in a Meter + +static struct { +#ifdef WINMUMBLE + UINT32 uiVersion; + DWORD uiTick; +#else + Uint32 uiVersion; + Uint32 uiTick; +#endif + float fAvatarPosition[3]; + float fAvatarFront[3]; + float fAvatarTop[3]; // defaults to Y-is-up (only used for leaning) + wchar_t name[256]; // game name + float fCameraPosition[3]; + float fCameraFront[3]; + float fCameraTop[3]; // defaults to Y-is-up (only used for leaning) + wchar_t identity[256]; // player id +#ifdef WINMUMBLE + UINT32 context_len; +#else + Uint32 context_len; +#endif + unsigned char context[256]; // server/team + wchar_t description[2048]; // game description +} *mumble = NULL; +#endif // HAVE_MUMBLE + +static void I_SetupMumble(void) +{ +#ifdef WINMUMBLE + HANDLE hMap = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, L"MumbleLink"); + if (!hMap) + return; + + mumble = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(*mumble)); + if (!mumble) + CloseHandle(hMap); +#elif defined (HAVE_SHM) + int shmfd; + char memname[256]; + + snprintf(memname, 256, "/MumbleLink.%d", getuid()); + shmfd = shm_open(memname, O_RDWR, S_IRUSR | S_IWUSR); + + if(shmfd < 0) + return; + + mumble = mmap(NULL, sizeof(*mumble), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0); + if (mumble == MAP_FAILED) + mumble = NULL; +#endif +} + +void I_UpdateMumble(const mobj_t *mobj, const listener_t listener) +{ +#ifdef HAVE_MUMBLE + double angle; + fixed_t anglef; + + if (!mumble) + return; + + if(mumble->uiVersion != 2) { + wcsncpy(mumble->name, L"SRB2 "VERSIONSTRING, 256); + wcsncpy(mumble->description, L"Sonic Robo Blast 2 with integrated Mumble Link support.", 2048); + mumble->uiVersion = 2; + } + mumble->uiTick++; + + if (!netgame || gamestate != GS_LEVEL) { // Zero out, but never delink. + mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f; + mumble->fAvatarFront[0] = 1.0f; + mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f; + mumble->fCameraPosition[0] = mumble->fCameraPosition[1] = mumble->fCameraPosition[2] = 0.0f; + mumble->fCameraFront[0] = 1.0f; + mumble->fCameraFront[1] = mumble->fCameraFront[2] = 0.0f; + return; + } + + { + UINT8 *p = mumble->context; + WRITEMEM(p, server_context, 8); + WRITEINT16(p, gamemap); + mumble->context_len = p - mumble->context; + } + + if (mobj) { + mumble->fAvatarPosition[0] = FIXED_TO_FLOAT(mobj->x) / MUMBLEUNIT; + mumble->fAvatarPosition[1] = FIXED_TO_FLOAT(mobj->z) / MUMBLEUNIT; + mumble->fAvatarPosition[2] = FIXED_TO_FLOAT(mobj->y) / MUMBLEUNIT; + + anglef = AngleFixed(mobj->angle); + angle = FIXED_TO_FLOAT(anglef)*DEG2RAD; + mumble->fAvatarFront[0] = (float)cos(angle); + mumble->fAvatarFront[1] = 0.0f; + mumble->fAvatarFront[2] = (float)sin(angle); + } else { + mumble->fAvatarPosition[0] = mumble->fAvatarPosition[1] = mumble->fAvatarPosition[2] = 0.0f; + mumble->fAvatarFront[0] = 1.0f; + mumble->fAvatarFront[1] = mumble->fAvatarFront[2] = 0.0f; + } + + mumble->fCameraPosition[0] = FIXED_TO_FLOAT(listener.x) / MUMBLEUNIT; + mumble->fCameraPosition[1] = FIXED_TO_FLOAT(listener.z) / MUMBLEUNIT; + mumble->fCameraPosition[2] = FIXED_TO_FLOAT(listener.y) / MUMBLEUNIT; + + anglef = AngleFixed(listener.angle); + angle = FIXED_TO_FLOAT(anglef)*DEG2RAD; + mumble->fCameraFront[0] = (float)cos(angle); + mumble->fCameraFront[1] = 0.0f; + mumble->fCameraFront[2] = (float)sin(angle); +#else + (void)mobj; + (void)listener; +#endif // HAVE_MUMBLE +} +#undef WINMUMBLE +#endif // NOMUMBLE + +#ifdef HAVE_TERMIOS + +void I_GetMouseEvents(void) +{ + static UINT8 mdata[5]; + static INT32 i = 0,om2b = 0; + INT32 di, j, mlp, button; + event_t event; + const INT32 mswap[8] = {0, 4, 1, 5, 2, 6, 3, 7}; + + if (!mouse2_started) return; + for (mlp = 0; mlp < 20; mlp++) + { + for (; i < 5; i++) + { + di = read(fdmouse2, mdata+i, 1); + if (di == -1) return; + } + if ((mdata[0] & 0xf8) != 0x80) + { + for (j = 1; j < 5; j++) + if ((mdata[j] & 0xf8) == 0x80) + for (i = 0; i < 5-j; i++) // shift + mdata[i] = mdata[i+j]; + if (i < 5) continue; + } + else + { + button = mswap[~mdata[0] & 0x07]; + for (j = 0; j < MOUSEBUTTONS; j++) + { + if (om2b & (1<<j)) + { + if (!(button & (1<<j))) //keyup + { + event.type = ev_keyup; + event.data1 = KEY_2MOUSE1+j; + D_PostEvent(&event); + om2b ^= 1 << j; + } + } + else + { + if (button & (1<<j)) + { + event.type = ev_keydown; + event.data1 = KEY_2MOUSE1+j; + D_PostEvent(&event); + om2b ^= 1 << j; + } + } + } + event.data2 = ((SINT8)mdata[1])+((SINT8)mdata[3]); + event.data3 = ((SINT8)mdata[2])+((SINT8)mdata[4]); + if (event.data2 && event.data3) + { + event.type = ev_mouse2; + event.data1 = 0; + D_PostEvent(&event); + } + } + i = 0; + } +} + +// +// I_ShutdownMouse2 +// +static void I_ShutdownMouse2(void) +{ + if (fdmouse2 != -1) close(fdmouse2); + mouse2_started = 0; +} +#elif defined (_WIN32) && !defined (_XBOX) + +static HANDLE mouse2filehandle = INVALID_HANDLE_VALUE; + +static void I_ShutdownMouse2(void) +{ + event_t event; + INT32 i; + + if (mouse2filehandle == INVALID_HANDLE_VALUE) + return; + + SetCommMask(mouse2filehandle, 0); + + EscapeCommFunction(mouse2filehandle, CLRDTR); + EscapeCommFunction(mouse2filehandle, CLRRTS); + + PurgeComm(mouse2filehandle, PURGE_TXABORT | PURGE_RXABORT | + PURGE_TXCLEAR | PURGE_RXCLEAR); + + CloseHandle(mouse2filehandle); + + // emulate the up of all mouse buttons + for (i = 0; i < MOUSEBUTTONS; i++) + { + event.type = ev_keyup; + event.data1 = KEY_2MOUSE1+i; + D_PostEvent(&event); + } + + mouse2filehandle = INVALID_HANDLE_VALUE; +} + +#define MOUSECOMBUFFERSIZE 256 +static INT32 handlermouse2x,handlermouse2y,handlermouse2buttons; + +static void I_PoolMouse2(void) +{ + UINT8 buffer[MOUSECOMBUFFERSIZE]; + COMSTAT ComStat; + DWORD dwErrorFlags; + DWORD dwLength; + char dx,dy; + + static INT32 bytenum; + static UINT8 combytes[4]; + DWORD i; + + ClearCommError(mouse2filehandle, &dwErrorFlags, &ComStat); + dwLength = min(MOUSECOMBUFFERSIZE, ComStat.cbInQue); + + if (dwLength <= 0) + return; + + if (!ReadFile(mouse2filehandle, buffer, dwLength, &dwLength, NULL)) + { + CONS_Alert(CONS_WARNING, "%s", M_GetText("Read Error on secondary mouse port\n")); + return; + } + + // parse the mouse packets + for (i = 0; i < dwLength; i++) + { + if ((buffer[i] & 64)== 64) + bytenum = 0; + + if (bytenum < 4) + combytes[bytenum] = buffer[i]; + bytenum++; + + if (bytenum == 1) + { + handlermouse2buttons &= ~3; + handlermouse2buttons |= ((combytes[0] & (32+16)) >> 4); + } + else if (bytenum == 3) + { + dx = (char)((combytes[0] & 3) << 6); + dy = (char)((combytes[0] & 12) << 4); + dx = (char)(dx + combytes[1]); + dy = (char)(dy + combytes[2]); + handlermouse2x+= dx; + handlermouse2y+= dy; + } + else if (bytenum == 4) // fourth UINT8 (logitech mouses) + { + if (buffer[i] & 32) + handlermouse2buttons |= 4; + else + handlermouse2buttons &= ~4; + } + } +} + +void I_GetMouseEvents(void) +{ + static UINT8 lastbuttons2 = 0; //mouse movement + event_t event; + + if (mouse2filehandle == INVALID_HANDLE_VALUE) + return; + + I_PoolMouse2(); + // post key event for buttons + if (handlermouse2buttons != lastbuttons2) + { + INT32 i, j = 1, k; + k = (handlermouse2buttons ^ lastbuttons2); // only changed bit to 1 + lastbuttons2 = (UINT8)handlermouse2buttons; + + for (i = 0; i < MOUSEBUTTONS; i++, j <<= 1) + if (k & j) + { + if (handlermouse2buttons & j) + event.type = ev_keydown; + else + event.type = ev_keyup; + event.data1 = KEY_2MOUSE1+i; + D_PostEvent(&event); + } + } + + if (handlermouse2x != 0 || handlermouse2y != 0) + { + event.type = ev_mouse2; + event.data1 = 0; +// event.data1 = buttons; // not needed + event.data2 = handlermouse2x << 1; + event.data3 = -handlermouse2y << 1; + handlermouse2x = 0; + handlermouse2y = 0; + + D_PostEvent(&event); + } +} +#else +void I_GetMouseEvents(void){}; +#endif + +// +// I_StartupMouse2 +// +void I_StartupMouse2(void) +{ +#ifdef HAVE_TERMIOS + struct termios m2tio; + size_t i; + INT32 dtr = -1, rts = -1;; + I_ShutdownMouse2(); + if (cv_usemouse2.value == 0) return; + if ((fdmouse2 = open(cv_mouse2port.string, O_RDONLY|O_NONBLOCK|O_NOCTTY)) == -1) + { + CONS_Printf(M_GetText("Error opening %s!\n"), cv_mouse2port.string); + return; + } + tcflush(fdmouse2, TCIOFLUSH); + m2tio.c_iflag = IGNBRK; + m2tio.c_oflag = 0; + m2tio.c_cflag = CREAD|CLOCAL|HUPCL|CS8|CSTOPB|B1200; + m2tio.c_lflag = 0; + m2tio.c_cc[VTIME] = 0; + m2tio.c_cc[VMIN] = 1; + tcsetattr(fdmouse2, TCSANOW, &m2tio); + for (i = 0; i < strlen(cv_mouse2opt.string); i++) + { + if (toupper(cv_mouse2opt.string[i]) == 'D') + { + if (cv_mouse2opt.string[i+1] == '-') + dtr = 0; + else + dtr = 1; + } + if (toupper(cv_mouse2opt.string[i]) == 'R') + { + if (cv_mouse2opt.string[i+1] == '-') + rts = 0; + else + rts = 1; + } + if (dtr != -1 || rts != -1) + { + INT32 c; + if (!ioctl(fdmouse2, TIOCMGET, &c)) + { + if (!dtr) + c &= ~TIOCM_DTR; + else if (dtr > 0) + c |= TIOCM_DTR; + } + if (!rts) + c &= ~TIOCM_RTS; + else if (rts > 0) + c |= TIOCM_RTS; + ioctl(fdmouse2, TIOCMSET, &c); + } + } + mouse2_started = 1; + I_AddExitFunc(I_ShutdownMouse2); +#elif defined (_WIN32) && !defined (_XBOX) + DCB dcb; + + if (mouse2filehandle != INVALID_HANDLE_VALUE) + I_ShutdownMouse2(); + + if (cv_usemouse2.value == 0) + return; + + if (mouse2filehandle == INVALID_HANDLE_VALUE) + { + // COM file handle + mouse2filehandle = CreateFileA(cv_mouse2port.string, GENERIC_READ | GENERIC_WRITE, + 0, // exclusive access + NULL, // no security attrs + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (mouse2filehandle == INVALID_HANDLE_VALUE) + { + INT32 e = GetLastError(); + if (e == 5) + CONS_Alert(CONS_ERROR, M_GetText("Can't open %s: Access denied\n"), cv_mouse2port.string); + else + CONS_Alert(CONS_ERROR, M_GetText("Can't open %s: error %d\n"), cv_mouse2port.string, e); + return; + } + } + + // getevent when somthing happens + //SetCommMask(mouse2filehandle, EV_RXCHAR); + + // buffers + SetupComm(mouse2filehandle, MOUSECOMBUFFERSIZE, MOUSECOMBUFFERSIZE); + + // purge buffers + PurgeComm(mouse2filehandle, PURGE_TXABORT | PURGE_RXABORT + | PURGE_TXCLEAR | PURGE_RXCLEAR); + + // setup port to 1200 7N1 + dcb.DCBlength = sizeof (DCB); + + GetCommState(mouse2filehandle, &dcb); + + dcb.BaudRate = CBR_1200; + dcb.ByteSize = 7; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + + dcb.fDtrControl = DTR_CONTROL_ENABLE; + dcb.fRtsControl = RTS_CONTROL_ENABLE; + + dcb.fBinary = TRUE; + dcb.fParity = TRUE; + + SetCommState(mouse2filehandle, &dcb); + I_AddExitFunc(I_ShutdownMouse2); +#endif +} + +// +// I_Tactile +// +void I_Tactile(FFType pFFType, const JoyFF_t *FFEffect) +{ + // UNUSED. + (void)pFFType; + (void)FFEffect; +} + +void I_Tactile2(FFType pFFType, const JoyFF_t *FFEffect) +{ + // UNUSED. + (void)pFFType; + (void)FFEffect; +} + +/** \brief empty ticcmd for player 1 +*/ +static ticcmd_t emptycmd; + +ticcmd_t *I_BaseTiccmd(void) +{ + return &emptycmd; +} + +/** \brief empty ticcmd for player 2 +*/ +static ticcmd_t emptycmd2; + +ticcmd_t *I_BaseTiccmd2(void) +{ + return &emptycmd2; +} + +#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) +static HMODULE winmm = NULL; +static DWORD starttickcount = 0; // hack for win2k time bug +static p_timeGetTime pfntimeGetTime = NULL; + +// --------- +// I_GetTime +// Use the High Resolution Timer if available, +// else use the multimedia timer which has 1 millisecond precision on Windowz 95, +// but lower precision on Windows NT +// --------- + +tic_t I_GetTime(void) +{ + tic_t newtics = 0; + + if (!starttickcount) // high precision timer + { + LARGE_INTEGER currtime; // use only LowPart if high resolution counter is not available + static LARGE_INTEGER basetime = {{0, 0}}; + + // use this if High Resolution timer is found + static LARGE_INTEGER frequency; + + if (!basetime.LowPart) + { + if (!QueryPerformanceFrequency(&frequency)) + frequency.QuadPart = 0; + else + QueryPerformanceCounter(&basetime); + } + + if (frequency.LowPart && QueryPerformanceCounter(&currtime)) + { + newtics = (INT32)((currtime.QuadPart - basetime.QuadPart) * NEWTICRATE + / frequency.QuadPart); + } + else if (pfntimeGetTime) + { + currtime.LowPart = pfntimeGetTime(); + if (!basetime.LowPart) + basetime.LowPart = currtime.LowPart; + newtics = ((currtime.LowPart - basetime.LowPart)/(1000/NEWTICRATE)); + } + } + else + newtics = (GetTickCount() - starttickcount)/(1000/NEWTICRATE); + + return newtics; +} + +static void I_ShutdownTimer(void) +{ + pfntimeGetTime = NULL; + if (winmm) + { + p_timeEndPeriod pfntimeEndPeriod = (p_timeEndPeriod)GetProcAddress(winmm, "timeEndPeriod"); + if (pfntimeEndPeriod) + pfntimeEndPeriod(1); + FreeLibrary(winmm); + winmm = NULL; + } +} +#else +// +// I_GetTime +// returns time in 1/TICRATE second tics +// +tic_t I_GetTime (void) +{ +#ifdef _arch_dreamcast + static Uint64 basetime = 0; + Uint64 ticks = timer_ms_gettime64(); //using timer_ms_gettime64 instand of SDL_GetTicks for the Dreamcast +#else + static Uint32 basetime = 0; + Uint32 ticks = SDL_GetTicks(); +#endif + + if (!basetime) + basetime = ticks; + + ticks -= basetime; + + ticks = (ticks*TICRATE); + +#if 0 //#ifdef _WIN32_WCE + ticks = (ticks/10); +#else + ticks = (ticks/1000); +#endif + + return (tic_t)ticks; +} +#endif + +// +//I_StartupTimer +// +void I_StartupTimer(void) +{ +#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) + // for win2k time bug + if (M_CheckParm("-gettickcount")) + { + starttickcount = GetTickCount(); + CONS_Printf("%s", M_GetText("Using GetTickCount()\n")); + } + winmm = LoadLibraryA("winmm.dll"); + if (winmm) + { + p_timeEndPeriod pfntimeBeginPeriod = (p_timeEndPeriod)GetProcAddress(winmm, "timeBeginPeriod"); + if (pfntimeBeginPeriod) + pfntimeBeginPeriod(1); + pfntimeGetTime = (p_timeGetTime)GetProcAddress(winmm, "timeGetTime"); + } + I_AddExitFunc(I_ShutdownTimer); +#elif 0 //#elif !defined (_arch_dreamcast) && !defined(GP2X) // the DC have it own timer and GP2X have broken pthreads? + if (SDL_InitSubSystem(SDL_INIT_TIMER) < 0) + I_Error("SRB2: Needs SDL_Timer, Error: %s", SDL_GetError()); +#endif +} + + + +void I_Sleep(void) +{ +#if !(defined (_arch_dreamcast) || defined (_XBOX)) + if (cv_sleep.value != -1) + SDL_Delay(cv_sleep.value); +#endif +} + +INT32 I_StartupSystem(void) +{ + SDL_version SDLcompiled; + SDL_version *SDLlinked = NULL; +#ifdef _XBOX +#ifdef __GNUC__ + char DP[] =" Sonic Robo Blast 2!\n"; + debugPrint(DP); +#endif + unlink("e:/Games/SRB2/stdout.txt"); + freopen("e:/Games/SRB2/stdout.txt", "w+", stdout); + unlink("e:/Games/SRB2/stderr.txt"); + freopen("e:/Games/SRB2/stderr.txt", "w+", stderr); +#endif +#ifdef _arch_dreamcast +#ifdef _DEBUG + //gdb_init(); +#endif + printf(__FILE__":%i\n",__LINE__); +#ifdef _DEBUG + //gdb_breakpoint(); +#endif +#endif + SDL_VERSION(&SDLcompiled) + SDL_GetVersion(SDLlinked); + I_StartupConsole(); + I_OutputMsg("Compiled for SDL version: %d.%d.%d\n", + SDLcompiled.major, SDLcompiled.minor, SDLcompiled.patch); + I_OutputMsg("Linked with SDL version: %d.%d.%d\n", + SDLlinked->major, SDLlinked->minor, SDLlinked->patch); +#if 0 //#ifdef GP2X //start up everything + if (SDL_Init(SDL_INIT_NOPARACHUTE|SDL_INIT_EVERYTHING) < 0) +#else + if (SDL_Init(SDL_INIT_NOPARACHUTE) < 0) +#endif + I_Error("SRB2: SDL System Error: %s", SDL_GetError()); //Alam: Oh no.... +#ifndef NOMUMBLE + I_SetupMumble(); +#endif + return 0; +} + + +// +// I_Quit +// +void I_Quit(void) +{ + static SDL_bool quiting = SDL_FALSE; + + /* prevent recursive I_Quit() */ + if (quiting) goto death; + SDLforceUngrabMouse(); + quiting = SDL_FALSE; + I_ShutdownConsole(); + M_SaveConfig(NULL); //save game config, cvars.. +#ifndef NONET + D_SaveBan(); // save the ban list +#endif + G_SaveGameData(); // Tails 12-08-2002 + //added:16-02-98: when recording a demo, should exit using 'q' key, + // but sometimes we forget and use 'F10'.. so save here too. + if (demorecording || metalrecording) + G_CheckDemoStatus(); + D_QuitNetGame(); + I_ShutdownMusic(); + I_ShutdownSound(); + I_ShutdownCD(); + // use this for 1.28 19990220 by Kin + I_ShutdownGraphics(); + I_ShutdownInput(); + I_ShutdownSystem(); +#ifndef _arch_dreamcast + SDL_Quit(); +#endif + /* if option -noendtxt is set, don't print the text */ + if (!M_CheckParm("-noendtxt") && W_CheckNumForName("ENDOOM") != LUMPERROR) + { + printf("\r"); + ShowEndTxt(); + } +death: + W_Shutdown(); +#ifdef GP2X + chdir("/usr/gp2x"); + execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL); +#endif + exit(0); +} + +void I_WaitVBL(INT32 count) +{ + count = 1; + SDL_Delay(count); +} + +void I_BeginRead(void) +{ +} + +void I_EndRead(void) +{ +} + +// +// I_Error +// +/** \brief phuck recursive errors +*/ +static INT32 errorcount = 0; + +/** \brief recursive error detecting +*/ +static boolean shutdowning = false; + +void I_Error(const char *error, ...) +{ + va_list argptr; +#if (defined (MAC_ALERT) || defined (_WIN32) || (defined (_WIN32_WCE) && !defined (__GNUC__))) && !defined (_XBOX) + char buffer[8192]; +#endif + + // recursive error detecting + if (shutdowning) + { + errorcount++; + if (errorcount == 1) + SDLforceUngrabMouse(); + // try to shutdown each subsystem separately + if (errorcount == 2) + I_ShutdownMusic(); + if (errorcount == 3) + I_ShutdownSound(); + if (errorcount == 4) + I_ShutdownCD(); + if (errorcount == 5) + I_ShutdownGraphics(); + if (errorcount == 6) + I_ShutdownInput(); + if (errorcount == 7) + I_ShutdownSystem(); +#ifndef _arch_dreamcast + if (errorcount == 8) + SDL_Quit(); +#endif + if (errorcount == 9) + { + M_SaveConfig(NULL); + G_SaveGameData(); + } + if (errorcount > 20) + { +#ifdef MAC_ALERT + va_start(argptr, error); + vsprintf(buffer, error, argptr); + va_end(argptr); + // 2004-03-03 AJR Since the Mac user is most likely double clicking to run the game, give them a panel. + MacShowAlert("Recursive Error", buffer, "Quit", NULL, NULL); +#elif (defined (_WIN32) || (defined (_WIN32_WCE)) && !defined (__GNUC__)) && !defined (_XBOX) + va_start(argptr,error); + vsprintf(buffer, error, argptr); + va_end(argptr); +#ifndef _WIN32_WCE + { + HANDLE co = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD bytesWritten; + if (co != INVALID_HANDLE_VALUE) + { + if (GetFileType(co) == FILE_TYPE_CHAR && GetConsoleMode(co, &bytesWritten)) + WriteConsoleA(co, buffer, (DWORD)strlen(buffer), NULL, NULL); + else + WriteFile(co, buffer, (DWORD)strlen(buffer), &bytesWritten, NULL); + } + } +#endif + OutputDebugStringA(buffer); + MessageBoxA(vid.WndParent, buffer, "SRB2 Recursive Error", MB_OK|MB_ICONERROR); +#else + // Don't print garbage + va_start(argptr, error); + if (!framebuffer) + vfprintf (stderr, error, argptr); + va_end(argptr); +#endif + W_Shutdown(); +#ifdef GP2X + chdir("/usr/gp2x"); + execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL); +#endif + exit(-1); // recursive errors detected + } + } + shutdowning = true; + I_ShutdownConsole(); +#ifndef MAC_ALERT + // Message first. + va_start(argptr,error); + if (!framebuffer) + { + fprintf(stderr, "Error: "); + vfprintf(stderr,error,argptr); + fprintf(stderr, "\n"); + } + va_end(argptr); + + if (!framebuffer) + fflush(stderr); +#endif + M_SaveConfig(NULL); // save game config, cvars.. +#ifndef NONET + D_SaveBan(); // save the ban list +#endif + G_SaveGameData(); // Tails 12-08-2002 + + // Shutdown. Here might be other errors. + if (demorecording || metalrecording) + G_CheckDemoStatus(); + + D_QuitNetGame(); + I_ShutdownMusic(); + I_ShutdownSound(); + I_ShutdownCD(); + // use this for 1.28 19990220 by Kin + I_ShutdownGraphics(); + I_ShutdownInput(); + I_ShutdownSystem(); +#ifndef _arch_dreamcast + SDL_Quit(); +#endif +#ifdef MAC_ALERT + va_start(argptr, error); + vsprintf(buffer, error, argptr); + va_end(argptr); + // 2004-03-03 AJR Since the Mac user is most likely double clicking to run the game, give them a panel. + MacShowAlert("Critical Error", buffer, "Quit", NULL, NULL); +#endif + W_Shutdown(); +#if defined (PARANOIA) && defined (__CYGWIN__) + *(INT32 *)2 = 4; //Alam: Debug! +#endif +#ifdef GP2X + chdir("/usr/gp2x"); + execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL); +#endif + exit(-1); +} + +/** \brief quit function table +*/ +static quitfuncptr quit_funcs[MAX_QUIT_FUNCS]; /* initialized to all bits 0 */ + +// +// Adds a function to the list that need to be called by I_SystemShutdown(). +// +void I_AddExitFunc(void (*func)()) +{ + INT32 c; + + for (c = 0; c < MAX_QUIT_FUNCS; c++) + { + if (!quit_funcs[c]) + { + quit_funcs[c] = func; + break; + } + } +} + + +// +// Removes a function from the list that need to be called by +// I_SystemShutdown(). +// +void I_RemoveExitFunc(void (*func)()) +{ + INT32 c; + + for (c = 0; c < MAX_QUIT_FUNCS; c++) + { + if (quit_funcs[c] == func) + { + while (c < MAX_QUIT_FUNCS-1) + { + quit_funcs[c] = quit_funcs[c+1]; + c++; + } + quit_funcs[MAX_QUIT_FUNCS-1] = NULL; + break; + } + } +} + +// +// Closes down everything. This includes restoring the initial +// palette and video mode, and removing whatever mouse, keyboard, and +// timer routines have been installed. +// +// NOTE: Shutdown user funcs are effectively called in reverse order. +// +void I_ShutdownSystem(void) +{ + INT32 c; + + for (c = MAX_QUIT_FUNCS-1; c >= 0; c--) + if (quit_funcs[c]) + (*quit_funcs[c])(); +#ifdef LOGMESSAGES + if (logstream) + { + fclose(logstream); + logstream = NULL; + } +#endif + +} + +void I_GetDiskFreeSpace(INT64 *freespace) +{ +#if defined (_arch_dreamcast) || defined (_PSP) + *freespace = 0; +#elif defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) +#if defined (SOLARIS) || defined (__HAIKU__) || defined (_WII) || defined (_PS3) + *freespace = INT32_MAX; + return; +#else // Both Linux and BSD have this, apparently. + struct statfs stfs; + if (statfs(".", &stfs) == -1) + { + *freespace = INT32_MAX; + return; + } + *freespace = stfs.f_bavail * stfs.f_bsize; +#endif +#elif (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) + static p_GetDiskFreeSpaceExA pfnGetDiskFreeSpaceEx = NULL; + static boolean testwin95 = false; + ULARGE_INTEGER usedbytes, lfreespace; + + if (!testwin95) + { + pfnGetDiskFreeSpaceEx = (p_GetDiskFreeSpaceExA)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetDiskFreeSpaceExA"); + testwin95 = true; + } + if (pfnGetDiskFreeSpaceEx) + { + if (pfnGetDiskFreeSpaceEx(NULL, &lfreespace, &usedbytes, NULL)) + *freespace = lfreespace.QuadPart; + else + *freespace = INT32_MAX; + } + else + { + DWORD SectorsPerCluster, BytesPerSector, NumberOfFreeClusters, TotalNumberOfClusters; + GetDiskFreeSpace(NULL, &SectorsPerCluster, &BytesPerSector, + &NumberOfFreeClusters, &TotalNumberOfClusters); + *freespace = BytesPerSector*SectorsPerCluster*NumberOfFreeClusters; + } +#else // Dummy for platform independent; 1GB should be enough + *freespace = 1024*1024*1024; +#endif +} + +char *I_GetUserName(void) +{ +#ifdef GP2X + static char username[MAXPLAYERNAME] = "GP2XUSER"; + return username; +#elif defined (PSP) + static char username[MAXPLAYERNAME] = "PSPUSER"; + return username; +#elif !(defined (_WIN32_WCE) || defined (_XBOX)) + static char username[MAXPLAYERNAME]; + char *p; +#ifdef _WIN32 + DWORD i = MAXPLAYERNAME; + + if (!GetUserNameA(username, &i)) +#endif + { + p = I_GetEnv("USER"); + if (!p) + { + p = I_GetEnv("user"); + if (!p) + { + p = I_GetEnv("USERNAME"); + if (!p) + { + p = I_GetEnv("username"); + if (!p) + { + return NULL; + } + } + } + } + strncpy(username, p, MAXPLAYERNAME); + } + + + if (strcmp(username, "") != 0) + return username; +#endif + return NULL; // dummy for platform independent version +} + +INT32 I_mkdir(const char *dirname, INT32 unixright) +{ +//[segabor] +#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) || defined (__CYGWIN__) || defined (__OS2__) + return mkdir(dirname, unixright); +#elif (defined (_WIN32) || (defined (_WIN32_WCE) && !defined (__GNUC__))) && !defined (_XBOX) + UNREFERENCED_PARAMETER(unixright); /// \todo should implement ntright under nt... + return CreateDirectoryA(dirname, NULL); +#else + (void)dirname; + (void)unixright; + return false; +#endif +} + +char *I_GetEnv(const char *name) +{ +#ifdef NEED_SDL_GETENV + return SDL_getenv(name); +#elif defined(_WIN32_WCE) + (void)name; + return NULL; +#else + return getenv(name); +#endif +} + +INT32 I_PutEnv(char *variable) +{ +#ifdef NEED_SDL_GETENV + return SDL_putenv(variable); +#elif defined(_WIN32_WCE) + return ((variable)?-1:0); +#else + return putenv(variable); +#endif +} + +/** \brief The isWadPathOk function + + \param path string path to check + + \return if true, wad file found + + +*/ +static boolean isWadPathOk(const char *path) +{ + char *wad3path = malloc(256); + + if (!wad3path) + return false; + + sprintf(wad3path, pandf, path, WADKEYWORD1); + + if (FIL_ReadFileOK(wad3path)) + { + free(wad3path); + return true; + } + + sprintf(wad3path, pandf, path, WADKEYWORD2); + + if (FIL_ReadFileOK(wad3path)) + { + free(wad3path); + return true; + } + + free(wad3path); + return false; +} + +static void pathonly(char *s) +{ + size_t j; + + for (j = strlen(s); j != (size_t)-1; j--) + if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/')) + { + if (s[j] == ':') s[j+1] = 0; + else s[j] = 0; + return; + } +} + +/** \brief search for srb2.srb in the given path + + \param searchDir starting path + + \return WAD path if not NULL + + +*/ +static const char *searchWad(const char *searchDir) +{ + static char tempsw[256] = ""; + filestatus_t fstemp; + + strcpy(tempsw, WADKEYWORD1); + fstemp = filesearch(tempsw,searchDir,NULL,true,20); + if (fstemp == FS_FOUND) + { + pathonly(tempsw); + return tempsw; + } + + strcpy(tempsw, WADKEYWORD2); + fstemp = filesearch(tempsw, searchDir, NULL, true, 20); + if (fstemp == FS_FOUND) + { + pathonly(tempsw); + return tempsw; + } + return NULL; +} + +/** \brief go through all possible paths and look for srb2.srb + + \return path to srb2.srb if any +*/ +static const char *locateWad(void) +{ + const char *envstr; + const char *WadPath; + + I_OutputMsg("SRB2WADDIR"); + // does SRB2WADDIR exist? + if (((envstr = I_GetEnv("SRB2WADDIR")) != NULL) && isWadPathOk(envstr)) + return envstr; + +#if defined(_WIN32_WCE) || defined(_PS3) || defined(_PSP) + // examine argv[0] + strcpy(returnWadPath, myargv[0]); + pathonly(returnWadPath); + I_PutEnv(va("HOME=%s",returnWadPath)); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif + +#ifndef NOCWD + I_OutputMsg(",."); + // examine current dir + strcpy(returnWadPath, "."); + if (isWadPathOk(returnWadPath)) + return NULL; +#endif + + // examine default dirs +#ifdef DEFAULTWADLOCATION1 + I_OutputMsg(","DEFAULTWADLOCATION1); + strcpy(returnWadPath, DEFAULTWADLOCATION1); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif +#ifdef DEFAULTWADLOCATION2 + I_OutputMsg(","DEFAULTWADLOCATION2); + strcpy(returnWadPath, DEFAULTWADLOCATION2); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif +#ifdef DEFAULTWADLOCATION3 + I_OutputMsg(","DEFAULTWADLOCATION3); + strcpy(returnWadPath, DEFAULTWADLOCATION3); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif +#ifdef DEFAULTWADLOCATION4 + I_OutputMsg(","DEFAULTWADLOCATION4); + strcpy(returnWadPath, DEFAULTWADLOCATION4); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif +#ifdef DEFAULTWADLOCATION5 + I_OutputMsg(","DEFAULTWADLOCATION5); + strcpy(returnWadPath, DEFAULTWADLOCATION5); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif +#ifdef DEFAULTWADLOCATION6 + I_OutputMsg(","DEFAULTWADLOCATION6); + strcpy(returnWadPath, DEFAULTWADLOCATION6); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif +#ifdef DEFAULTWADLOCATION7 + I_OutputMsg(","DEFAULTWADLOCATION7); + strcpy(returnWadPath, DEFAULTWADLOCATION7); + if (isWadPathOk(returnWadPath)) + return returnWadPath; +#endif +#ifndef NOHOME + // find in $HOME + I_OutputMsg(",HOME"); + if ((envstr = I_GetEnv("HOME")) != NULL) + { + WadPath = searchWad(envstr); + if (WadPath) + return WadPath; + } +#endif +#ifdef DEFAULTSEARCHPATH1 + // find in /usr/local + I_OutputMsg(", in:"DEFAULTSEARCHPATH1); + WadPath = searchWad(DEFAULTSEARCHPATH1); + if (WadPath) + return WadPath; +#endif +#ifdef DEFAULTSEARCHPATH2 + // find in /usr/games + I_OutputMsg(", in:"DEFAULTSEARCHPATH2); + WadPath = searchWad(DEFAULTSEARCHPATH2); + if (WadPath) + return WadPath; +#endif +#ifdef DEFAULTSEARCHPATH3 + // find in ??? + I_OutputMsg(", in:"DEFAULTSEARCHPATH3); + WadPath = searchWad(DEFAULTSEARCHPATH3); + if (WadPath) + return WadPath; +#endif + // if nothing was found + return NULL; +} + +const char *I_LocateWad(void) +{ + const char *waddir; + + I_OutputMsg("Looking for WADs in: "); + waddir = locateWad(); + I_OutputMsg("\n"); + + if (waddir) + { + // change to the directory where we found srb2.srb +#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) + SetCurrentDirectoryA(waddir); +#elif !defined (_WIN32_WCE) && !defined (_PS3) + if (chdir(waddir) == -1) + I_OutputMsg("Couldn't change working directory\n"); +#endif + } + return waddir; +} + +#ifdef LINUX +#define MEMINFO_FILE "/proc/meminfo" +#define MEMTOTAL "MemTotal:" +#define MEMFREE "MemFree:" +#endif + +// quick fix for compil +UINT32 I_GetFreeMem(UINT32 *total) +{ +#if defined (_arch_dreamcast) + //Dreamcast! + if (total) + *total = 16<<20; + return 8<<20; +#elif defined (_PSP) + // PSP + if (total) + *total = 32<<20; + return 16<<20; +#elif defined (FREEBSD) + struct vmmeter sum; + kvm_t *kd; + struct nlist namelist[] = + { +#define X_SUM 0 + {"_cnt"}, + {NULL} + }; + if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open")) == NULL) + { + *total = 0L; + return 0; + } + if (kvm_nlist(kd, namelist) != 0) + { + kvm_close (kd); + *total = 0L; + return 0; + } + if (kvm_read(kd, namelist[X_SUM].n_value, &sum, + sizeof (sum)) != sizeof (sum)) + { + kvm_close(kd); + *total = 0L; + return 0; + } + kvm_close(kd); + + if (total) + *total = sum.v_page_count * sum.v_page_size; + return sum.v_free_count * sum.v_page_size; +#elif defined (SOLARIS) + /* Just guess */ + if (total) + *total = 32 << 20; + return 32 << 20; +#elif defined (LINUX) + /* Linux */ + char buf[1024]; + char *memTag; + UINT32 freeKBytes; + UINT32 totalKBytes; + INT32 n; + INT32 meminfo_fd = -1; + + meminfo_fd = open(MEMINFO_FILE, O_RDONLY); + n = read(meminfo_fd, buf, 1023); + close(meminfo_fd); + + if (n < 0) + { + // Error + *total = 0L; + return 0; + } + + buf[n] = '\0'; + if (NULL == (memTag = strstr(buf, MEMTOTAL))) + { + // Error + *total = 0L; + return 0; + } + + memTag += sizeof (MEMTOTAL); + totalKBytes = atoi(memTag); + + if (NULL == (memTag = strstr(buf, MEMFREE))) + { + // Error + *total = 0L; + return 0; + } + + memTag += sizeof (MEMFREE); + freeKBytes = atoi(memTag); + + if (total) + *total = totalKBytes << 10; + return freeKBytes << 10; +#elif (defined (_WIN32) || (defined (_WIN32_WCE) && !defined (__GNUC__))) && !defined (_XBOX) + MEMORYSTATUS info; + + info.dwLength = sizeof (MEMORYSTATUS); + GlobalMemoryStatus( &info ); + if (total) + *total = (UINT32)info.dwTotalPhys; + return (UINT32)info.dwAvailPhys; +#elif defined (__OS2__) + UINT32 pr_arena; + + if (total) + DosQuerySysInfo( QSV_TOTPHYSMEM, QSV_TOTPHYSMEM, + (PVOID) total, sizeof (UINT32)); + DosQuerySysInfo( QSV_MAXPRMEM, QSV_MAXPRMEM, + (PVOID) &pr_arena, sizeof (UINT32)); + + return pr_arena; +#else + // Guess 48 MB. + if (total) + *total = 48<<20; + return 48<<20; +#endif /* LINUX */ +} + +const CPUInfoFlags *I_CPUInfo(void) +{ +#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) + static CPUInfoFlags WIN_CPUInfo; + SYSTEM_INFO SI; + p_IsProcessorFeaturePresent pfnCPUID = (p_IsProcessorFeaturePresent)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsProcessorFeaturePresent"); + + ZeroMemory(&WIN_CPUInfo,sizeof (WIN_CPUInfo)); + if (pfnCPUID) + { + WIN_CPUInfo.FPPE = pfnCPUID( 0); //PF_FLOATING_POINT_PRECISION_ERRATA + WIN_CPUInfo.FPE = pfnCPUID( 1); //PF_FLOATING_POINT_EMULATED + WIN_CPUInfo.cmpxchg = pfnCPUID( 2); //PF_COMPARE_EXCHANGE_DOUBLE + WIN_CPUInfo.MMX = pfnCPUID( 3); //PF_MMX_INSTRUCTIONS_AVAILABLE + WIN_CPUInfo.PPCMM64 = pfnCPUID( 4); //PF_PPC_MOVEMEM_64BIT_OK + WIN_CPUInfo.ALPHAbyte = pfnCPUID( 5); //PF_ALPHA_BYTE_INSTRUCTIONS + WIN_CPUInfo.SSE = pfnCPUID( 6); //PF_XMMI_INSTRUCTIONS_AVAILABLE + WIN_CPUInfo.AMD3DNow = pfnCPUID( 7); //PF_3DNOW_INSTRUCTIONS_AVAILABLE + WIN_CPUInfo.RDTSC = pfnCPUID( 8); //PF_RDTSC_INSTRUCTION_AVAILABLE + WIN_CPUInfo.PAE = pfnCPUID( 9); //PF_PAE_ENABLED + WIN_CPUInfo.SSE2 = pfnCPUID(10); //PF_XMMI64_INSTRUCTIONS_AVAILABLE + //WIN_CPUInfo.blank = pfnCPUID(11); //PF_SSE_DAZ_MODE_AVAILABLE + WIN_CPUInfo.DEP = pfnCPUID(12); //PF_NX_ENABLED + WIN_CPUInfo.SSE3 = pfnCPUID(13); //PF_SSE3_INSTRUCTIONS_AVAILABLE + WIN_CPUInfo.cmpxchg16b = pfnCPUID(14); //PF_COMPARE_EXCHANGE128 + WIN_CPUInfo.cmp8xchg16 = pfnCPUID(15); //PF_COMPARE64_EXCHANGE128 + WIN_CPUInfo.PFC = pfnCPUID(16); //PF_CHANNELS_ENABLED + } +#ifdef HAVE_SDLCPUINFO + else + { + WIN_CPUInfo.RDTSC = SDL_HasRDTSC(); + WIN_CPUInfo.MMX = SDL_HasMMX(); + WIN_CPUInfo.AMD3DNow = SDL_Has3DNow(); + WIN_CPUInfo.SSE = SDL_HasSSE(); + WIN_CPUInfo.SSE2 = SDL_HasSSE2(); + WIN_CPUInfo.AltiVec = SDL_HasAltiVec(); + } + WIN_CPUInfo.MMXExt = SDL_HasMMXExt(); + WIN_CPUInfo.AMD3DNowExt = SDL_Has3DNowExt(); +#endif + GetSystemInfo(&SI); + WIN_CPUInfo.CPUs = SI.dwNumberOfProcessors; + WIN_CPUInfo.IA64 = (SI.dwProcessorType == 2200); // PROCESSOR_INTEL_IA64 + WIN_CPUInfo.AMD64 = (SI.dwProcessorType == 8664); // PROCESSOR_AMD_X8664 + return &WIN_CPUInfo; +#elif defined (HAVE_SDLCPUINFO) + static CPUInfoFlags SDL_CPUInfo; + memset(&SDL_CPUInfo,0,sizeof (CPUInfoFlags)); + SDL_CPUInfo.RDTSC = SDL_HasRDTSC(); + SDL_CPUInfo.MMX = SDL_HasMMX(); + SDL_CPUInfo.MMXExt = SDL_FALSE; //SDL_HasMMXExt(); No longer in SDL2 + SDL_CPUInfo.AMD3DNow = SDL_Has3DNow(); + SDL_CPUInfo.AMD3DNowExt = SDL_FALSE; //SDL_Has3DNowExt(); No longer in SDL2 + SDL_CPUInfo.SSE = SDL_HasSSE(); + SDL_CPUInfo.SSE2 = SDL_HasSSE2(); + SDL_CPUInfo.AltiVec = SDL_HasAltiVec(); + return &SDL_CPUInfo; +#else + return NULL; /// \todo CPUID asm +#endif +} + +#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) +static void CPUAffinity_OnChange(void); +static consvar_t cv_cpuaffinity = {"cpuaffinity", "-1", CV_SAVE | CV_CALL, NULL, CPUAffinity_OnChange, 0, NULL, NULL, 0, 0, NULL}; + +static p_GetCurrentProcess pfnGetCurrentProcess = NULL; +static p_GetProcessAffinityMask pfnGetProcessAffinityMask = NULL; +static p_SetProcessAffinityMask pfnSetProcessAffinityMask = NULL; + +static inline VOID GetAffinityFuncs(VOID) +{ + HMODULE h = GetModuleHandleA("kernel32.dll"); + pfnGetCurrentProcess = (p_GetCurrentProcess)GetProcAddress(h, "GetCurrentProcess"); + pfnGetProcessAffinityMask = (p_GetProcessAffinityMask)GetProcAddress(h, "GetProcessAffinityMask"); + pfnSetProcessAffinityMask = (p_SetProcessAffinityMask)GetProcAddress(h, "SetProcessAffinityMask"); +} + +static void CPUAffinity_OnChange(void) +{ + DWORD_PTR dwProcMask, dwSysMask; + HANDLE selfpid; + + if (!pfnGetCurrentProcess || !pfnGetProcessAffinityMask || !pfnSetProcessAffinityMask) + return; + else + selfpid = pfnGetCurrentProcess(); + + pfnGetProcessAffinityMask(selfpid, &dwProcMask, &dwSysMask); + + /* If resulting mask is zero, don't change anything and fall back to + * actual mask. + */ + if(dwSysMask & cv_cpuaffinity.value) + { + pfnSetProcessAffinityMask(selfpid, dwSysMask & cv_cpuaffinity.value); + CV_StealthSetValue(&cv_cpuaffinity, (INT32)(dwSysMask & cv_cpuaffinity.value)); + } + else + CV_StealthSetValue(&cv_cpuaffinity, (INT32)dwProcMask); +} +#endif + +void I_RegisterSysCommands(void) +{ +#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) + GetAffinityFuncs(); + CV_RegisterVar(&cv_cpuaffinity); +#endif +} +#endif diff --git a/src/sdl2/i_ttf.c b/src/sdl2/i_ttf.c new file mode 100644 index 000000000..770a81d98 --- /dev/null +++ b/src/sdl2/i_ttf.c @@ -0,0 +1,340 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2011 by Callum Dickinson. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief SDL_ttf interface code. Necessary for platforms with no framebuffer console systems. + +#if defined(SDL) && defined(HAVE_TTF) +#include "SDL.h" +#include "SDL_ttf.h" +#include "../doomdef.h" +#include "../doomstat.h" +#include "../d_netfil.h" +#include "../filesrch.h" +#include "i_ttf.h" + +// Search directories to find aforementioned TTF file. +#ifdef _PS3 +#include <sysutil/video.h> +#define FONTSEARCHPATH1 "/dev_hdd0/game/SRB2-PS3_/USRDIR/etc" +#elif defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) +#define FONTSEARCHPATH1 "/usr/share/fonts" +#define FONTSEARCHPATH2 "/usr/local/share/fonts" +#define FONTSEARCHPATH3 "/usr/games/SRB2" +#define FONTSEARCHPATH4 "/usr/local/games/SRB2" +#define FONTSEARCHPATH5 "/usr/local/share/games/SRB2" +#else +#define FONTSEARCHPATH1 "." +#endif + +#define FONTHANDLE -1 + +// Renduring surfaces. +SDL_Surface *TTFSurface = NULL; +SDL_Surface *TTFRendSurface = NULL; +// Text box. +SDL_Rect TTFRect; +// Temporary storage for the new TTFRect, used to check for +// line wrapping. +SDL_Rect TTFRectCheck; +// Text rendering resolution. +videoResolution res; +// Text storage buffer, the contents get printed to the SDL surface. +char textbuffer[8192]; + +// look for default ttf file in given directory +static char *searchFont(const char *fontsearchDir) +{ + static char tempsw[256] = ""; + filestatus_t fstemp; + + strcpy(tempsw, FONTFILE); + fstemp = filesearch(tempsw, fontsearchDir, NULL, true, 20); + if (fstemp == FS_FOUND) + { + return tempsw; + } + return NULL; +} + +// Load TTF font from file. +INT32 I_TTFLoadFont(const char *file, UINT32 ptsize) +{ + TTF_Font *tmpfont = NULL; + float fontsize; + + // If a font is currently loaded, unload it. + if (currentfont) + { + TTF_CloseFont(currentfont); + } + + // Scale the specified font point size for the current resolution. + fontsize = (ptsize * 0.005f) * (res.width - res.height); + + tmpfont = TTF_OpenFont(file, fontsize); + + if (!tmpfont) + return FONTHANDLE; + + // set pointer for current font + currentfont = tmpfont; + + // set current font point size + currentfontpoint = ptsize; + + // get font properties, and set them + currentfontstyle = TTF_GetFontStyle(currentfont); + TTF_SetFontStyle(currentfont, currentfontstyle); + + // these functions only exist in SDL_ttf 2.0.10 onwards +#if SDL_TTF_VERSION_ATLEAST(2,0,10) + currentfontkerning = TTF_GetFontKerning(currentfont); + TTF_SetFontKerning(currentfont, currentfontkerning); + + currentfonthinting = TTF_GetFontHinting(currentfont); + TTF_SetFontHinting(currentfont, currentfonthinting); + + currentfontoutline = TTF_GetFontOutline(currentfont); + TTF_SetFontOutline(currentfont, currentfontoutline); +#endif + + return 0; +} + +static void I_TTFRendSurface(const char *textmsg, TTF_Font *font, TextQuality quality, SDL_Color fontfgcolor, SDL_Color fontbgcolor) +{ + // Print text in the buffer. + // SDL_ttf has three modes to draw text. + // Solid rendering is quick, but dirty. Use it if you need speed more than quality. + switch (quality) + { + case solid: + TTFRendSurface = TTF_RenderText_Solid(font, textmsg, fontfgcolor); + break; + // Shaded rendering adds a background to the rendered text. Because of this, I_TTFDrawText + // takes an extra color more than the other styles to be a background color. + // Shaded is supposedly as fast as solid rendering and about as good quality as blended. + case shaded: + TTFRendSurface = TTF_RenderText_Shaded(font, textmsg, fontfgcolor, fontbgcolor); + break; + // Blended rendering is the opposite of solid. Good quality, but slow. + case blended: + TTFRendSurface = TTF_RenderText_Blended(font, textmsg, fontfgcolor); + break; + } + + // Get SDL to update the main surface. + SDL_BlitSurface(TTFRendSurface, NULL, TTFSurface, &TTFRect); + SDL_Flip(TTFSurface); +} + +// Draw text to screen. It will accept four colour vales (red, green, blue and alpha) +// with foreground for draw modes Solid and Blended, and an extra four values for background +// colour with draw type Shaded. +void I_TTFDrawText(TTF_Font *font, TextQuality quality, INT32 fgR, INT32 fgG, INT32 fgB, INT32 fgA, INT32 bgR, INT32 bgG, INT32 bgB, INT32 bgA, const char *textmsg) +{ + // Temporary small buffer to store character to process. + // NULL pointer to prevc to kill warning + char c, prevc = 0x0; + // hack to allow TTF_SizeText to work properly. + char linebuffer[2]; + // Don't need h, but TTF_SizeText needs a height parameter + INT32 w, h; + + // Globally declare foreground and background text colours, + // text drawing mode and the font to draw. + SDL_Color fontfgcolor = {fgR, fgG, fgB, fgA}; + SDL_Color fontbgcolor = {bgR, bgG, bgB, bgA}; + + // Keep on processing until the null terminator in the text buffer is reached. + while (*textmsg != '\0') + { + // Copy pointer for current character into the temporary buffer. + c = *textmsg; + // If c is a newline, move to the next available line. + if (c == '\n') + { + TTFRectCheck.x = 0; + TTFRectCheck.y += (currentfontpoint + 1); + } + // Otherwise... + else + { + // If the previous character was a newline, actually move to the next line. + if (prevc == '\n') + { + if (textbuffer != NULL) + { + // Render cached text to the SDL surface. + I_TTFRendSurface(textbuffer, font, quality, fontfgcolor, fontbgcolor); + // Empty text buffer. + memset(textbuffer, '\0', 1); + } + TTFRect.x = TTFRectCheck.x; + TTFRect.y = TTFRectCheck.y; + } + // Copy the character to the text buffer. + sprintf(textbuffer, "%s%c", textbuffer, c); + // Hack to allow TTF_SizeText to work properly. + sprintf(linebuffer, "%c", c); + // If we have reached the end of the screen, move to the next available line. + TTF_SizeText(currentfont, linebuffer, &w, &h); + TTFRectCheck.x += w; + if (TTFRectCheck.x >= res.width) + { + // Render cached text to the SDL surface. + I_TTFRendSurface(textbuffer, font, quality, fontfgcolor, fontbgcolor); + // Empty text buffer. + memset(textbuffer, '\0', 1); + // Move to the next line. + TTFRectCheck.x = 0; + TTFRectCheck.y += (currentfontpoint + 1); + // Set stored co-ordinates for next line. + TTFRect.x = TTFRectCheck.x; + TTFRect.y = TTFRectCheck.y; + } + } + // Add 1 to the pointer reference for the character to process. + textmsg++; + // Copy contents of the now-old buffer to somewhere else, so it can be referenced in next loop. + prevc = c; + } + + // If the buffer was previously emptied by a line wrapping operation and + // no text came after that, don't print anything. Otherwise, print everything + // still in the buffer. + if (textbuffer != NULL) + { + // Render cached text to the SDL surface. + I_TTFRendSurface(textbuffer, font, quality, fontfgcolor, fontbgcolor); + // Empty text buffer. + memset(textbuffer, '\0', 1); + // Set stored co-ordinates for next line. + TTFRect.x = TTFRectCheck.x; + TTFRect.y = TTFRectCheck.y; + } +} + +// Initialise SDL_ttf. +void I_StartupTTF(UINT32 fontpointsize, Uint32 initflags, Uint32 vidmodeflags) +{ + char *fontpath = NULL; + INT32 fontstatus = -1; +#ifdef _PS3 + videoState state; + videoGetState(0, 0, &state); + videoGetResolution(state.displayMode.resolution, &res); + bitsperpixel = 24; +#else + res.width = 320; + res.height = 200; + bitsperpixel = 8; +#endif + + // what's the point of trying to display an error? + // SDL_ttf is not started, can't display anything to screen (presumably)... + if (SDL_InitSubSystem(initflags) < 0) + I_Error("Couldn't initialize SDL: %s\n", SDL_GetError()); + + TTFSurface = SDL_SetVideoMode(res.width, res.height, bitsperpixel, vidmodeflags); + if (!TTFSurface) + I_Error("Couldn't set SDL Video resolution: %s\n", SDL_GetError()); + + if (TTF_Init() < 0) + I_Error("Couldn't start SDL_ttf: %s\n", TTF_GetError()); + + // look for default font in many directories +#ifdef FONTSEARCHPATH1 + fontpath = searchFont(FONTSEARCHPATH1); + if (fontpath) fontstatus = I_TTFLoadFont(fontpath, fontpointsize); +#endif +#ifdef FONTSEARCHPATH2 + if (fontstatus < 0) + { + fontpath = searchFont(FONTSEARCHPATH2); + if (fontpath) fontstatus = I_TTFLoadFont(fontpath, fontpointsize); + } +#endif +#ifdef FONTSEARCHPATH3 + if (fontstatus < 0) + { + fontpath = searchFont(FONTSEARCHPATH3); + if (fontpath) fontstatus = I_TTFLoadFont(fontpath, fontpointsize); + } +#endif +#ifdef FONTSEARCHPATH4 + if (fontstatus < 0) + { + fontpath = searchFont(FONTSEARCHPATH4); + if (fontpath) fontstatus = I_TTFLoadFont(fontpath, fontpointsize); + } +#endif +#ifdef FONTSEARCHPATH5 + if (fontstatus < 0) + { + fontpath = searchFont(FONTSEARCHPATH5); + if (fontpath) fontstatus = I_TTFLoadFont(fontpath, fontpointsize); + } +#endif +#ifdef FONTSEARCHPATH6 + if (fontstatus < 0) + { + fontpath = searchFont(FONTSEARCHPATH6); + if (fontpath) fontstatus = I_TTFLoadFont(fontpath, fontpointsize); + } +#endif +#ifdef FONTSEARCHPATH7 + if (fontstatus < 0) + { + fontpath = searchFont(FONTSEARCHPATH7); + if (fontpath) fontstatus = I_TTFLoadFont(fontpath, fontpointsize); + } +#endif + // argh! no font file found! disable SDL_ttf code + if (fontstatus < 0) + { + I_ShutdownTTF(); + CONS_Printf("Unable to find default font files! Not loading SDL_ttf\n"); + } + else + { + // Get SDL_ttf compiled and linked version + SDL_version TTFcompiled; + const SDL_version *TTFlinked; + + SDL_TTF_VERSION(&TTFcompiled); + TTFlinked = TTF_Linked_Version(); + + // Display it on screen + CONS_Printf("Compiled for SDL_ttf version: %d.%d.%d\n", + TTFcompiled.major, TTFcompiled.minor, TTFcompiled.patch); + CONS_Printf("Linked with SDL_ttf version: %d.%d.%d\n", + TTFlinked->major, TTFlinked->minor, TTFlinked->patch); + } +} + +void I_ShutdownTTF(void) +{ + // close current font + TTF_CloseFont(currentfont); + // shutdown SDL_ttf + TTF_Quit(); + + // Free TTF rendering surfaces. + SDL_FreeSurface(TTFSurface); + SDL_FreeSurface(TTFRendSurface); +} +#endif diff --git a/src/sdl2/i_ttf.h b/src/sdl2/i_ttf.h new file mode 100644 index 000000000..929c8021c --- /dev/null +++ b/src/sdl2/i_ttf.h @@ -0,0 +1,88 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2011 by Callum Dickinson. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief SDL_ttf interface code. Necessary for platforms with SDL inits that need to run immediately. + +#ifndef __I_TTF__ +#define __I_TTF__ + +#include "../doomdef.h" +#include "SDL_ttf.h" + +// Default name for standard TTF file. +#define FONTFILE "srb2.ttf" +#define FONTPOINTSIZE 12 + +// Default font foreground colours +#define DEFAULTFONTFGR 255 +#define DEFAULTFONTFGG 255 +#define DEFAULTFONTFGB 255 +#define DEFAULTFONTFGA 255 + +// Default font background colours +#define DEFAULTFONTBGR 0 +#define DEFAULTFONTBGG 0 +#define DEFAULTFONTBGB 0 +#define DEFAULTFONTBGA 255 + +#ifndef SDL_TTF_COMPILEDVERSION +#define SDL_TTF_COMPILEDVERSION \ + SDL_VERSIONNUM(TTF_MAJOR_VERSION, TTF_MINOR_VERSION, TTF_PATCHLEVEL) +#endif + +#ifndef SDL_TTF_VERSION_ATLEAST +#define SDL_TTF_VERSION_ATLEAST(X, Y, Z) \ + (SDL_TTF_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) +#endif + +TTF_Font* currentfont; +int currentfontpoint; +int currentfontstyle; +#if SDL_TTF_VERSION_ATLEAST(2,0,10) +int currentfontkerning; +int currentfonthinting; +int currentfontoutline; +#endif + +#ifndef _PS3 +typedef struct +{ + UINT16 width; + UINT16 height; +} VideoResolution; +#endif +UINT8 bitsperpixel; + +typedef enum +{ + solid, + shaded, + blended +} TextQuality; + +// Load TTF font from file. +INT32 I_TTFLoadFont(const char *file, UINT32 ptsize); + +// Draw TTF text to screen. It will accept four colour vales (red, green, blue and alpha) +// with foreground for draw modes Solid and Blended, and an extra four values for background +// colour with draw type Shaded. +void I_TTFDrawText(TTF_Font *font, TextQuality quality, INT32 fgR, INT32 fgG, INT32 fgB, INT32 fgA, INT32 bgR, INT32 bgG, INT32 bgB, INT32 bgA, const char *textmsg); + +// Initialise SDL_ttf. +void I_StartupTTF(UINT32 fontpointsize, Uint32 initflags, Uint32 vidmodeflags); + +void I_ShutdownTTF(void); +#endif diff --git a/src/sdl2/i_video.c b/src/sdl2/i_video.c new file mode 100644 index 000000000..ce74f537c --- /dev/null +++ b/src/sdl2/i_video.c @@ -0,0 +1,186 @@ +#include "../doomdef.h" +#include "../command.h" +#include "../i_video.h" +#include "../d_clisrv.h" + +#include <SDL.h> + +typedef struct sdlmode_s +{ + Uint16 w; + Uint16 h; +} sdlmode_t; + +rendermode_t rendermode = render_soft; + +boolean highcolor = true; + +boolean allow_fullscreen = true; + +consvar_t cv_vidwait = {"vid_wait", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + +static SDL_bool graphicsInitialized = SDL_FALSE; + +// SDL2 vars +static SDL_Window *window; +static SDL_Renderer *renderer; +static Uint16 logicalWidth; // real for windowed +static Uint16 logicalHeight; // real for windowed + +#define SDLI_MAX_MODES 32 +static int numVidModes = 0; +static sdlmode_t sdlmodes[SDLI_MAX_MODES]; + +static SDL_bool Impl_CreateWindow() +{ + window = SDL_CreateWindow("Sonic Robo Blast 2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 320, 200, 0); + renderer = SDL_CreateRenderer(window, -1, 0); + if (window == NULL || renderer == NULL) + { + return SDL_FALSE; + } + else + { + return SDL_TRUE; + } +} + +static SDL_bool Impl_DestroyWindow() +{ + if (window != NULL) + { + SDL_DestroyWindow(window); + } + window = NULL; + if (renderer != NULL) + { + SDL_DestroyRenderer(renderer); + } + renderer = NULL; + return SDL_TRUE; +} + +static SDL_bool Impl_SetMode(Uint16 width, Uint16 height, SDL_bool fullscreen) +{ + logicalWidth = width; + logicalHeight = height; + return SDL_TRUE; +} + +static SDL_bool Impl_AddSDLMode(Uint16 width, Uint16 height) +{ + if (numVidModes >= SDLI_MAX_MODES) + { + return SDL_FALSE; + } + + numVidModes += 1; + sdlmodes[numVidModes].w = width; + sdlmodes[numVidModes].h = height; + + return SDL_TRUE; +} + +void I_StartupGraphics(void) +{ + if (graphicsInitialized) + { + return; + } + + if (dedicated) + { + rendermode = render_none; + return; + } + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) + { + if (!SDL_WasInit(SDL_INIT_VIDEO)) + { + CONS_Printf(M_GetText("Failed to initialize SDL video: %s\n"), SDL_GetError()); + return; + } + } + + // Add 'supported' modes +#ifdef ANDROID + Impl_AddSDLMode(640, 400); +#else + Impl_AddSDLMode(320, 200); + Impl_AddSDLMode(640, 400); + Impl_AddSDLMode(1280, 800); +#endif + + if (!Impl_CreateWindow() || !Impl_SetMode(640, 400, SDL_FALSE)) + { + CONS_Printf(M_GetText("SDL: Could not create window and set initial mode: %s\n"), SDL_GetError()); + return; + } + + graphicsInitialized = SDL_TRUE; + + return; +} + +void I_ShutdownGraphics(void) +{ + if (!graphicsInitialized) + { + return; + } + + Impl_DestroyWindow(); + return; +} + +void I_SetPalette(RGBA_t *palette) +{ + (void)palette; +} + +INT32 VID_NumModes(void) +{ + return 0; +} + +INT32 VID_GetModeForSize(INT32 w, INT32 h) +{ + (void)w; + (void)h; + return 0; +} + +void VID_PrepareModeList(void){} + +INT32 VID_SetMode(INT32 modenum) +{ + (void)modenum; + return 0; +} + +const char *VID_GetModeName(INT32 modenum) +{ + (void)modenum; + return NULL; +} + +void I_UpdateNoBlit(void){} + +void I_FinishUpdate(void){} + +void I_UpdateNoVsync(void) {} + +void I_WaitVBL(INT32 count) +{ + (void)count; +} + +void I_ReadScreen(UINT8 *scr) +{ + (void)scr; +} + +void I_BeginRead(void){} + +void I_EndRead(void){} + diff --git a/src/sdl2/macosx/English.lproj/InfoPlist.strings b/src/sdl2/macosx/English.lproj/InfoPlist.strings new file mode 100644 index 000000000..e69de29bb diff --git a/src/sdl2/macosx/Info.plist b/src/sdl2/macosx/Info.plist new file mode 100644 index 000000000..ae0ce24de --- /dev/null +++ b/src/sdl2/macosx/Info.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string>Srb2mac.icns</string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.Srb2mac</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>NSMainNibFile</key> + <string>SDLMain</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/src/sdl2/macosx/Srb2mac.icns b/src/sdl2/macosx/Srb2mac.icns new file mode 100644 index 0000000000000000000000000000000000000000..4baedc1c5a091a3917d2a33bc3780da5b1b5e996 GIT binary patch literal 79787 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�i(robi7CM_>5Ezjxl|98V5&fovv<buY3<wU^a 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 D?5qEO literal 0 HcmV?d00001 diff --git a/src/sdl2/macosx/Srb2mac.pbproj/project.pbxproj b/src/sdl2/macosx/Srb2mac.pbproj/project.pbxproj new file mode 100644 index 000000000..de12201f5 --- /dev/null +++ b/src/sdl2/macosx/Srb2mac.pbproj/project.pbxproj @@ -0,0 +1,3546 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 38; + objects = { + 6726EB5E10190F860074DCBA = { + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 7; + files = ( + 6755C8D0101802C300A80195, + 6755C8D1101802C300A80195, + 6755C8D2101802C300A80195, + 6755C8D3101802C300A80195, + 6755C8D4101802C300A80195, + 6755C8D5101802C300A80195, + 6755C8D6101802C300A80195, + 6755C8D7101802C300A80195, + 6755C8D8101802C300A80195, + ); + isa = PBXCopyFilesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 6726EB5F10190FFC0074DCBA = { + buildActionMask = 2147483647; + files = ( + ); + generatedFileNames = ( + ); + isa = PBXShellScriptBuildPhase; + neededFileNames = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "touch -c $SRCROOT/../../comptime.c"; + }; + 6755C7A91017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = lzf.c; + path = ../../lzf.c; + refType = 2; + }; + 6755C7AA1017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = lzf.h; + path = ../../lzf.h; + refType = 2; + }; + 6755C7AB1017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_dllist.h; + path = ../../m_dllist.h; + refType = 2; + }; + 6755C7AC1017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_queue.c; + path = ../../m_queue.c; + refType = 2; + }; + 6755C7AD1017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_queue.h; + path = ../../m_queue.h; + refType = 2; + }; + 6755C7AE1017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_polyobj.c; + path = ../../p_polyobj.c; + refType = 2; + }; + 6755C7AF1017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_polyobj.h; + path = ../../p_polyobj.h; + refType = 2; + }; + 6755C7B11017FE2500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = string.c; + path = ../../string.c; + refType = 2; + }; + 6755C7B21017FE2500A80195 = { + fileRef = 6755C7A91017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7B31017FE2500A80195 = { + fileRef = 6755C7AA1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7B51017FE2500A80195 = { + fileRef = 6755C7AC1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7B71017FE2500A80195 = { + fileRef = 6755C7AE1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7B81017FE2500A80195 = { + fileRef = 6755C7AF1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7BB1017FE2500A80195 = { + fileRef = 6755C7A91017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7BC1017FE2500A80195 = { + fileRef = 6755C7AA1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7BD1017FE2500A80195 = { + fileRef = 6755C7AB1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7BE1017FE2500A80195 = { + fileRef = 6755C7AC1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7BF1017FE2500A80195 = { + fileRef = 6755C7AD1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7C01017FE2500A80195 = { + fileRef = 6755C7AE1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7C11017FE2500A80195 = { + fileRef = 6755C7AF1017FE2500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C7C41017FE4400A80195 = { + children = ( + 6755C7FA1017FE4500A80195, + 6755C7FB1017FE4500A80195, + ); + isa = PBXGroup; + name = macosx; + path = ""; + refType = 2; + }; + 6755C7FA1017FE4500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + path = mac_alert.c; + refType = 2; + }; + 6755C7FB1017FE4500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + path = mac_alert.h; + refType = 2; + }; + 6755C82A1017FE4500A80195 = { + fileEncoding = 30; + isa = PBXFileReference; + name = sdlmain.h; + path = ../sdlmain.h; + refType = 2; + }; + 6755C84B1017FE4500A80195 = { + fileRef = 6755C7FA1017FE4500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8651017FE4500A80195 = { + fileRef = 6755C82A1017FE4500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8861017FE4500A80195 = { + fileRef = 6755C7FA1017FE4500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8871017FE4500A80195 = { + fileRef = 6755C7FB1017FE4500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8A01017FE4500A80195 = { + fileRef = 6755C82A1017FE4500A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8A41017FE8000A80195 = { + children = ( + 84177748085A1097000C01D8, + 84177749085A1097000C01D8, + 8417774A085A1097000C01D8, + 8417774B085A1097000C01D8, + 8417774C085A1097000C01D8, + 8417774D085A1097000C01D8, + 8417774E085A1097000C01D8, + 8417774F085A1097000C01D8, + 84177750085A1097000C01D8, + 84177751085A1097000C01D8, + 84177752085A1097000C01D8, + 84177753085A1097000C01D8, + 84177754085A1097000C01D8, + 84177755085A10AA000C01D8, + 84177756085A10AA000C01D8, + 6755C82A1017FE4500A80195, + 84177757085A10AA000C01D8, + 6755C7C41017FE4400A80195, + ); + isa = PBXGroup; + name = SDL; + path = ""; + refType = 2; + }; + 6755C8BE101802C300A80195 = { + isa = PBXFileReference; + name = drill.dta; + path = ../../../bin/Resources/drill.dta; + refType = 2; + }; + 6755C8BF101802C300A80195 = { + isa = PBXFileReference; + name = fmod.dll; + path = ../../../bin/Resources/fmod.dll; + refType = 2; + }; + 6755C8C0101802C300A80195 = { + isa = PBXFileReference; + name = knux.plr; + path = ../../../bin/Resources/knux.plr; + refType = 2; + }; + 6755C8C1101802C300A80195 = { + isa = PBXFileReference; + name = music.dta; + path = ../../../bin/Resources/music.dta; + refType = 2; + }; + 6755C8C2101802C300A80195 = { + isa = PBXFileReference; + name = rings.wpn; + path = ../../../bin/Resources/rings.wpn; + refType = 2; + }; + 6755C8C3101802C300A80195 = { + isa = PBXFileReference; + name = soar.dta; + path = ../../../bin/Resources/soar.dta; + refType = 2; + }; + 6755C8C4101802C300A80195 = { + isa = PBXFileReference; + name = sonic.plr; + path = ../../../bin/Resources/sonic.plr; + refType = 2; + }; + 6755C8C5101802C300A80195 = { + isa = PBXFileReference; + name = srb2.wad; + path = ../../../bin/Resources/srb2.wad; + refType = 2; + }; + 6755C8C6101802C300A80195 = { + isa = PBXFileReference; + name = tails.plr; + path = ../../../bin/Resources/tails.plr; + refType = 2; + }; + 6755C8C7101802C300A80195 = { + fileRef = 6755C8BE101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8C8101802C300A80195 = { + fileRef = 6755C8BF101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8C9101802C300A80195 = { + fileRef = 6755C8C0101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8CA101802C300A80195 = { + fileRef = 6755C8C1101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8CB101802C300A80195 = { + fileRef = 6755C8C2101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8CC101802C300A80195 = { + fileRef = 6755C8C3101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8CD101802C300A80195 = { + fileRef = 6755C8C4101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8CE101802C300A80195 = { + fileRef = 6755C8C5101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8CF101802C300A80195 = { + fileRef = 6755C8C6101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D0101802C300A80195 = { + fileRef = 6755C8BE101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D1101802C300A80195 = { + fileRef = 6755C8BF101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D2101802C300A80195 = { + fileRef = 6755C8C0101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D3101802C300A80195 = { + fileRef = 6755C8C1101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D4101802C300A80195 = { + fileRef = 6755C8C2101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D5101802C300A80195 = { + fileRef = 6755C8C3101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D6101802C300A80195 = { + fileRef = 6755C8C4101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D7101802C300A80195 = { + fileRef = 6755C8C5101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 6755C8D8101802C300A80195 = { + fileRef = 6755C8C6101802C300A80195; + isa = PBXBuildFile; + settings = { + }; + }; + 677B5EC810180D4E00A80195 = { + fileRef = 84177758085A10D2000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 677B5EC910180D6600A80195 = { + children = ( + 84177758085A10D2000C01D8, + ); + isa = PBXGroup; + name = r_opengl; + refType = 4; + }; + 677B5ECA10180D7100A80195 = { + children = ( + 84F202CA08A92AA0000C01D8, + ); + isa = PBXGroup; + name = s_openal; + refType = 4; + }; + 67B2D0C91018779900A80195 = { + fileRef = 84177748085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 67B2D0CA1018779D00A80195 = { + fileRef = 84177748085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; +//670 +//671 +//672 +//673 +//674 +//840 +//841 +//842 +//843 +//844 + 840CE6B009198AA7000C01D8 = { + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 840CE6B309198ABB000C01D8, + 840CE6B409198ABB000C01D8, + 849BD32D0A7E471D000C01D8, + ); + isa = PBXCopyFilesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 840CE6B309198ABB000C01D8 = { + fileRef = 84C4E04B08620A46000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 840CE6B409198ABB000C01D8 = { + fileRef = 84C4E04C08620A46000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 841776FE085A0C64000C01D8 = { + children = ( + 84C4E00D0862063C000C01D8, + 84177705085A0CDB000C01D8, + 84177706085A0D9D000C01D8, + 84177708085A0DB5000C01D8, + 84177709085A0DD1000C01D8, + 84177712085A0EB5000C01D8, + 8417770B085A0E17000C01D8, + 8417770C085A0E40000C01D8, + 8417770D085A0E4E000C01D8, + 8417770E085A0E5B000C01D8, + 8417770F085A0E66000C01D8, + 84177710085A0E71000C01D8, + 84177711085A0E77000C01D8, + 841779E2085A138F000C01D8, + 84F202C708A92A5D000C01D8, + 84C4E03F0862096F000C01D8, + 84C4E0420862098A000C01D8, + 84C4E045086209D3000C01D8, + 84C4E048086209FF000C01D8, + 84C4E04C08620A46000C01D8, + 84C4E04B08620A46000C01D8, + 849BD31C0A7E45B3000C01D8, + ); + isa = PBXGroup; + refType = 4; + }; + 84177700085A0C64000C01D8 = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = NO; + }; + isa = PBXBuildStyle; + name = Development; + }; + 84177701085A0C64000C01D8 = { + buildRules = ( + ); + buildSettings = { + COPY_PHASE_STRIP = YES; + }; + isa = PBXBuildStyle; + name = Deployment; + }; + 84177702085A0C64000C01D8 = { + buildStyles = ( + 84177700085A0C64000C01D8, + 84177701085A0C64000C01D8, + ); + hasScannedForEncodings = 1; + isa = PBXProject; + mainGroup = 841776FE085A0C64000C01D8; + productRefGroup = 841779E2085A138F000C01D8; + projectDirPath = ""; + targets = ( + 841779E0085A138F000C01D8, + 841779E9085A13B1000C01D8, + ); + }; + 84177705085A0CDB000C01D8 = { + children = ( + 849603A80A791C11000C01D8, + 84177713085A0FCE000C01D8, + 84177714085A0FCE000C01D8, + 84177716085A0FCE000C01D8, + 84177717085A0FCE000C01D8, + 84177718085A0FCE000C01D8, + 84177719085A0FCE000C01D8, + 8417771A085A0FCE000C01D8, + 8417771B085A0FCE000C01D8, + 8417771C085A0FCE000C01D8, + 8417771D085A0FCE000C01D8, + 8417771E085A0FCE000C01D8, + 8417771F085A0FCE000C01D8, + 84177720085A0FCE000C01D8, + 84177721085A0FCE000C01D8, + 84177722085A0FCE000C01D8, + 84177723085A0FCE000C01D8, + 84177724085A0FF2000C01D8, + 84177725085A0FF2000C01D8, + 84177726085A0FF2000C01D8, + 84177727085A0FF2000C01D8, + 6755C7B11017FE2500A80195, + ); + isa = PBXGroup; + name = D_SRB2; + path = ""; + refType = 2; + }; + 84177706085A0D9D000C01D8 = { + children = ( + 8417772A085A100E000C01D8, + 8417772B085A100E000C01D8, + 8417772C085A100E000C01D8, + ); + isa = PBXGroup; + name = F_Frame; + path = ""; + refType = 2; + }; + 84177708085A0DB5000C01D8 = { + children = ( + 841779DA085A1347000C01D8, + 841778C6085A1295000C01D8, + 841778C4085A1295000C01D8, + 841778C5085A1295000C01D8, + 8417772D085A1029000C01D8, + 8417772E085A1029000C01D8, + 8417772F085A1029000C01D8, + 84177730085A1029000C01D8, + 84177731085A1029000C01D8, + 841779D4085A1296000C01D8, + 841779D5085A1296000C01D8, + ); + isa = PBXGroup; + name = G_Game; + path = ""; + refType = 2; + }; + 84177709085A0DD1000C01D8 = { + children = ( + 841778BE085A1295000C01D8, + 841778BF085A1295000C01D8, + 841778C2085A1295000C01D8, + 841778C3085A1295000C01D8, + 841778C0085A1295000C01D8, + 841778C1085A1295000C01D8, + 84177732085A1040000C01D8, + 84177733085A1040000C01D8, + 841779D2085A1296000C01D8, + 841779D3085A1296000C01D8, + 841779D8085A1296000C01D8, + 8490D433085DF537000C01D8, + ); + isa = PBXGroup; + name = H_Hud; + path = ""; + refType = 2; + }; + 8417770B085A0E17000C01D8 = { + children = ( + 6755C8A41017FE8000A80195, + 84177759085A10D2000C01D8, + 841777A4085A1200000C01D8, + 841777A5085A1200000C01D8, + 841777A6085A1200000C01D8, + 841777A8085A1200000C01D8, + 841777A9085A1200000C01D8, + 841777AA085A1200000C01D8, + 841777AB085A1200000C01D8, + 841777AC085A1200000C01D8, + 841777AD085A1200000C01D8, + 841777AE085A1200000C01D8, + ); + isa = PBXGroup; + name = I_Interface; + path = ""; + refType = 2; + }; + 8417770C085A0E40000C01D8 = { + children = ( + 8417775A085A10EB000C01D8, + 8417775B085A10EB000C01D8, + 8417775C085A10EB000C01D8, + 8417775D085A10EB000C01D8, + 8417775E085A10EB000C01D8, + 8417775F085A10EB000C01D8, + 6755C7AB1017FE2500A80195, + 84177760085A10EB000C01D8, + 84177761085A10EB000C01D8, + 84177762085A10EB000C01D8, + 84177763085A10EB000C01D8, + 84177764085A10EB000C01D8, + 84177765085A10EB000C01D8, + 6755C7AC1017FE2500A80195, + 6755C7AD1017FE2500A80195, + 84177766085A10EB000C01D8, + 84177767085A10EB000C01D8, + 84177768085A10EB000C01D8, + ); + isa = PBXGroup; + name = M_Misc; + path = ""; + refType = 2; + }; + 8417770D085A0E4E000C01D8 = { + children = ( + 84177769085A1104000C01D8, + 8417776A085A1104000C01D8, + 8417776B085A1104000C01D8, + 8417776C085A1104000C01D8, + 8417776D085A1104000C01D8, + 8417776E085A1104000C01D8, + 8417776F085A1104000C01D8, + 84177770085A1104000C01D8, + 84177771085A1104000C01D8, + 84177772085A1104000C01D8, + 84177773085A1104000C01D8, + 84177774085A1104000C01D8, + 6755C7AE1017FE2500A80195, + 6755C7AF1017FE2500A80195, + 84177775085A1104000C01D8, + 84177776085A1104000C01D8, + 84177777085A1104000C01D8, + 84177778085A1104000C01D8, + 84177779085A1104000C01D8, + 8417777A085A1104000C01D8, + 8417777B085A1104000C01D8, + 8417777C085A1104000C01D8, + 8417777D085A1104000C01D8, + 8417777E085A1104000C01D8, + 8417777F085A1104000C01D8, + 84177780085A1104000C01D8, + ); + isa = PBXGroup; + name = P_Play; + path = ""; + refType = 2; + }; + 8417770E085A0E5B000C01D8 = { + children = ( + 84177781085A111B000C01D8, + 84177782085A111B000C01D8, + 84177783085A111B000C01D8, + 84177784085A111B000C01D8, + 84177785085A111B000C01D8, + 84177786085A111B000C01D8, + 84177787085A111B000C01D8, + 84177788085A111B000C01D8, + 84177789085A111B000C01D8, + 8417778A085A111B000C01D8, + 8417778B085A111B000C01D8, + 8417778C085A111B000C01D8, + 8417778D085A111B000C01D8, + 8417778E085A111B000C01D8, + 8417778F085A111B000C01D8, + 84177790085A111B000C01D8, + 84177791085A111B000C01D8, + 84177792085A111B000C01D8, + 84177793085A111B000C01D8, + 84177794085A111B000C01D8, + 84177795085A111B000C01D8, + 84177796085A111B000C01D8, + 84177797085A111B000C01D8, + 841777A2085A1197000C01D8, + 841777A3085A1197000C01D8, + 8490D436085DF57B000C01D8, + 841779D7085A1296000C01D8, + ); + isa = PBXGroup; + name = R_Rend; + path = ""; + refType = 2; + }; + 8417770F085A0E66000C01D8 = { + children = ( + 84177798085A1138000C01D8, + 84177799085A1138000C01D8, + 8417779A085A1138000C01D8, + 8417779B085A1138000C01D8, + ); + isa = PBXGroup; + name = S_Sounds; + path = ""; + refType = 2; + }; + 84177710085A0E71000C01D8 = { + children = ( + 8417779C085A114C000C01D8, + 8417779D085A114C000C01D8, + 8417779E085A116B000C01D8, + 8417779F085A116B000C01D8, + ); + isa = PBXGroup; + name = SDL_main; + path = ""; + refType = 2; + }; + 84177711085A0E77000C01D8 = { + children = ( + 6755C7A91017FE2500A80195, + 6755C7AA1017FE2500A80195, + 841777AF085A1228000C01D8, + 841777B0085A1228000C01D8, + 841777A0085A117F000C01D8, + 841777A1085A117F000C01D8, + 841778BC085A122A000C01D8, + 841778BD085A122A000C01D8, + ); + isa = PBXGroup; + name = W_Wad; + path = ""; + refType = 2; + }; + 84177712085A0EB5000C01D8 = { + children = ( + 677B5EC910180D6600A80195, + 677B5ECA10180D7100A80195, + 84177734085A106C000C01D8, + 84177735085A106C000C01D8, + 84177736085A106C000C01D8, + 84177737085A106C000C01D8, + 84177738085A106C000C01D8, + 84177739085A106C000C01D8, + 8417773A085A106C000C01D8, + 8417773B085A106C000C01D8, + 8417773C085A106C000C01D8, + 8417773D085A106C000C01D8, + 8417773E085A106C000C01D8, + 8417773F085A106C000C01D8, + 84177740085A106C000C01D8, + 84177741085A106C000C01D8, + 84177742085A106C000C01D8, + 84177743085A106C000C01D8, + 84177744085A106C000C01D8, + 84177745085A106C000C01D8, + 84177746085A106C000C01D8, + 84177747085A106C000C01D8, + ); + isa = PBXGroup; + name = Hw_Hardware; + path = ""; + refType = 2; + }; + 84177713085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_clisrv.c; + path = ../../d_clisrv.c; + refType = 2; + }; + 84177714085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_clisrv.h; + path = ../../d_clisrv.h; + refType = 2; + }; + 84177716085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_event.h; + path = ../../d_event.h; + refType = 2; + }; + 84177717085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_main.c; + path = ../../d_main.c; + refType = 2; + }; + 84177718085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_main.h; + path = ../../d_main.h; + refType = 2; + }; + 84177719085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_net.c; + path = ../../d_net.c; + refType = 2; + }; + 8417771A085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_net.h; + path = ../../d_net.h; + refType = 2; + }; + 8417771B085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_netcmd.c; + path = ../../d_netcmd.c; + refType = 2; + }; + 8417771C085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_netcmd.h; + path = ../../d_netcmd.h; + refType = 2; + }; + 8417771D085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_netfil.c; + path = ../../d_netfil.c; + refType = 2; + }; + 8417771E085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_netfil.h; + path = ../../d_netfil.h; + refType = 2; + }; + 8417771F085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_player.h; + path = ../../d_player.h; + refType = 2; + }; + 84177720085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_think.h; + path = ../../d_think.h; + refType = 2; + }; + 84177721085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = d_ticcmd.h; + path = ../../d_ticcmd.h; + refType = 2; + }; + 84177722085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = dehacked.c; + path = ../../dehacked.c; + refType = 2; + }; + 84177723085A0FCE000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = dehacked.h; + path = ../../dehacked.h; + refType = 2; + }; + 84177724085A0FF2000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = doomdata.h; + path = ../../doomdata.h; + refType = 2; + }; + 84177725085A0FF2000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = doomdef.h; + path = ../../doomdef.h; + refType = 2; + }; + 84177726085A0FF2000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = doomstat.h; + path = ../../doomstat.h; + refType = 2; + }; + 84177727085A0FF2000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = doomtype.h; + path = ../../doomtype.h; + refType = 2; + }; + 8417772A085A100E000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = f_finale.c; + path = ../../f_finale.c; + refType = 2; + }; + 8417772B085A100E000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = f_finale.h; + path = ../../f_finale.h; + refType = 2; + }; + 8417772C085A100E000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = f_wipe.c; + path = ../../f_wipe.c; + refType = 2; + }; + 8417772D085A1029000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = g_game.c; + path = ../../g_game.c; + refType = 2; + }; + 8417772E085A1029000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = g_game.h; + path = ../../g_game.h; + refType = 2; + }; + 8417772F085A1029000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = g_input.c; + path = ../../g_input.c; + refType = 2; + }; + 84177730085A1029000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = g_input.h; + path = ../../g_input.h; + refType = 2; + }; + 84177731085A1029000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = g_state.h; + path = ../../g_state.h; + refType = 2; + }; + 84177732085A1040000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hu_stuff.c; + path = ../../hu_stuff.c; + refType = 2; + }; + 84177733085A1040000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hu_stuff.h; + path = ../../hu_stuff.h; + refType = 2; + }; + 84177734085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_bsp.c; + path = ../../hardware/hw_bsp.c; + refType = 2; + }; + 84177735085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_cache.c; + path = ../../hardware/hw_cache.c; + refType = 2; + }; + 84177736085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_data.h; + path = ../../hardware/hw_data.h; + refType = 2; + }; + 84177737085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_defs.h; + path = ../../hardware/hw_defs.h; + refType = 2; + }; + 84177738085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_dll.h; + path = ../../hardware/hw_dll.h; + refType = 2; + }; + 84177739085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_draw.c; + path = ../../hardware/hw_draw.c; + refType = 2; + }; + 8417773A085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_drv.h; + path = ../../hardware/hw_drv.h; + refType = 2; + }; + 8417773B085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_glide.h; + path = ../../hardware/hw_glide.h; + refType = 2; + }; + 8417773C085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_glob.h; + path = ../../hardware/hw_glob.h; + refType = 2; + }; + 8417773D085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_light.c; + path = ../../hardware/hw_light.c; + refType = 2; + }; + 8417773E085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_light.h; + path = ../../hardware/hw_light.h; + refType = 2; + }; + 8417773F085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_main.c; + path = ../../hardware/hw_main.c; + refType = 2; + }; + 84177740085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_main.h; + path = ../../hardware/hw_main.h; + refType = 2; + }; + 84177741085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_md2.c; + path = ../../hardware/hw_md2.c; + refType = 2; + }; + 84177742085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_md2.h; + path = ../../hardware/hw_md2.h; + refType = 2; + }; + 84177743085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw_trick.c; + path = ../../hardware/hw_trick.c; + refType = 2; + }; + 84177744085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw3dsdrv.h; + path = ../../hardware/hw3dsdrv.h; + refType = 2; + }; + 84177745085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw3sound.c; + path = ../../hardware/hw3sound.c; + refType = 2; + }; + 84177746085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hw3sound.h; + path = ../../hardware/hw3sound.h; + refType = 2; + }; + 84177747085A106C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hws_data.h; + path = ../../hardware/hws_data.h; + refType = 2; + }; + 84177748085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = dosstr.c; + path = ../dosstr.c; + refType = 2; + }; + 84177749085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = endtxt.c; + path = ../endtxt.c; + refType = 2; + }; + 8417774A085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = endtxt.h; + path = ../endtxt.h; + refType = 2; + }; + 8417774B085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = filesrch.c; + path = ../../filesrch.c; + refType = 2; + }; + 8417774C085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hwsym_sdl.c; + path = ../hwsym_sdl.c; + refType = 2; + }; + 8417774D085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = hwsym_sdl.h; + path = ../hwsym_sdl.h; + refType = 2; + }; + 8417774E085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_cdmus.c; + path = ../i_cdmus.c; + refType = 2; + }; + 8417774F085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_main.c; + path = ../i_main.c; + refType = 2; + }; + 84177750085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_net.c; + path = ../i_net.c; + refType = 2; + }; + 84177751085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_sound.c; + path = ../i_sound.c; + refType = 2; + }; + 84177752085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_system.c; + path = ../i_system.c; + refType = 2; + }; + 84177753085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_video.c; + path = ../i_video.c; + refType = 2; + }; + 84177754085A1097000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = IMG_xpm.c; + path = ../IMG_xpm.c; + refType = 2; + }; + 84177755085A10AA000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = ogl_sdl.c; + path = ../ogl_sdl.c; + refType = 2; + }; + 84177756085A10AA000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = ogl_sdl.h; + path = ../ogl_sdl.h; + refType = 2; + }; + 84177757085A10AA000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = SDL_icon.xpm; + path = ../SDL_icon.xpm; + refType = 2; + }; + 84177758085A10D2000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_opengl.c; + path = ../../hardware/r_opengl/r_opengl.c; + refType = 2; + }; + 84177759085A10D2000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_opengl.h; + path = ../../hardware/r_opengl/r_opengl.h; + refType = 2; + }; + 8417775A085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_argv.c; + path = ../../m_argv.c; + refType = 2; + }; + 8417775B085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_argv.h; + path = ../../m_argv.h; + refType = 2; + }; + 8417775C085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_bbox.c; + path = ../../m_bbox.c; + refType = 2; + }; + 8417775D085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_bbox.h; + path = ../../m_bbox.h; + refType = 2; + }; + 8417775E085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_cheat.c; + path = ../../m_cheat.c; + refType = 2; + }; + 8417775F085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_cheat.h; + path = ../../m_cheat.h; + refType = 2; + }; + 84177760085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_fixed.c; + path = ../../m_fixed.c; + refType = 2; + }; + 84177761085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_fixed.h; + path = ../../m_fixed.h; + refType = 2; + }; + 84177762085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_menu.c; + path = ../../m_menu.c; + refType = 2; + }; + 84177763085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_menu.h; + path = ../../m_menu.h; + refType = 2; + }; + 84177764085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_misc.c; + path = ../../m_misc.c; + refType = 2; + }; + 84177765085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_misc.h; + path = ../../m_misc.h; + refType = 2; + }; + 84177766085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_random.c; + path = ../../m_random.c; + refType = 2; + }; + 84177767085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_random.h; + path = ../../m_random.h; + refType = 2; + }; + 84177768085A10EB000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = m_swap.h; + path = ../../m_swap.h; + refType = 2; + }; + 84177769085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_ceilng.c; + path = ../../p_ceilng.c; + refType = 2; + }; + 8417776A085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_enemy.c; + path = ../../p_enemy.c; + refType = 2; + }; + 8417776B085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_fab.c; + path = ../../p_fab.c; + refType = 2; + }; + 8417776C085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_floor.c; + path = ../../p_floor.c; + refType = 2; + }; + 8417776D085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_inter.c; + path = ../../p_inter.c; + refType = 2; + }; + 8417776E085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_lights.c; + path = ../../p_lights.c; + refType = 2; + }; + 8417776F085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_local.h; + path = ../../p_local.h; + refType = 2; + }; + 84177770085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_map.c; + path = ../../p_map.c; + refType = 2; + }; + 84177771085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_maputl.c; + path = ../../p_maputl.c; + refType = 2; + }; + 84177772085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_maputl.h; + path = ../../p_maputl.h; + refType = 2; + }; + 84177773085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_mobj.c; + path = ../../p_mobj.c; + refType = 2; + }; + 84177774085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_mobj.h; + path = ../../p_mobj.h; + refType = 2; + }; + 84177775085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_pspr.h; + path = ../../p_pspr.h; + refType = 2; + }; + 84177776085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_saveg.c; + path = ../../p_saveg.c; + refType = 2; + }; + 84177777085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_saveg.h; + path = ../../p_saveg.h; + refType = 2; + }; + 84177778085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_setup.c; + path = ../../p_setup.c; + refType = 2; + }; + 84177779085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_setup.h; + path = ../../p_setup.h; + refType = 2; + }; + 8417777A085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_sight.c; + path = ../../p_sight.c; + refType = 2; + }; + 8417777B085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_spec.c; + path = ../../p_spec.c; + refType = 2; + }; + 8417777C085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_spec.h; + path = ../../p_spec.h; + refType = 2; + }; + 8417777D085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_telept.c; + path = ../../p_telept.c; + refType = 2; + }; + 8417777E085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_tick.c; + path = ../../p_tick.c; + refType = 2; + }; + 8417777F085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_tick.h; + path = ../../p_tick.h; + refType = 2; + }; + 84177780085A1104000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = p_user.c; + path = ../../p_user.c; + refType = 2; + }; + 84177781085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_bsp.c; + path = ../../r_bsp.c; + refType = 2; + }; + 84177782085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_bsp.h; + path = ../../r_bsp.h; + refType = 2; + }; + 84177783085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_data.c; + path = ../../r_data.c; + refType = 2; + }; + 84177784085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_data.h; + path = ../../r_data.h; + refType = 2; + }; + 84177785085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_defs.h; + path = ../../r_defs.h; + refType = 2; + }; + 84177786085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_draw.c; + path = ../../r_draw.c; + refType = 2; + }; + 84177787085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_draw.h; + path = ../../r_draw.h; + refType = 2; + }; + 84177788085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_draw8.c; + path = ../../r_draw8.c; + refType = 2; + }; + 84177789085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_draw16.c; + path = ../../r_draw16.c; + refType = 2; + }; + 8417778A085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_local.h; + path = ../../r_local.h; + refType = 2; + }; + 8417778B085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_main.c; + path = ../../r_main.c; + refType = 2; + }; + 8417778C085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_main.h; + path = ../../r_main.h; + refType = 2; + }; + 8417778D085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_plane.c; + path = ../../r_plane.c; + refType = 2; + }; + 8417778E085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_plane.h; + path = ../../r_plane.h; + refType = 2; + }; + 8417778F085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_segs.c; + path = ../../r_segs.c; + refType = 2; + }; + 84177790085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_segs.h; + path = ../../r_segs.h; + refType = 2; + }; + 84177791085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_sky.c; + path = ../../r_sky.c; + refType = 2; + }; + 84177792085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_sky.h; + path = ../../r_sky.h; + refType = 2; + }; + 84177793085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_splats.c; + path = ../../r_splats.c; + refType = 2; + }; + 84177794085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_splats.h; + path = ../../r_splats.h; + refType = 2; + }; + 84177795085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_state.h; + path = ../../r_state.h; + refType = 2; + }; + 84177796085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_things.c; + path = ../../r_things.c; + refType = 2; + }; + 84177797085A111B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = r_things.h; + path = ../../r_things.h; + refType = 2; + }; + 84177798085A1138000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = s_sound.c; + path = ../../s_sound.c; + refType = 2; + }; + 84177799085A1138000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = s_sound.h; + path = ../../s_sound.h; + refType = 2; + }; + 8417779A085A1138000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = sounds.c; + path = ../../sounds.c; + refType = 2; + }; + 8417779B085A1138000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = sounds.h; + path = ../../sounds.h; + refType = 2; + }; + 8417779C085A114C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + path = mac_alert.c; + refType = 2; + }; + 8417779D085A114C000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + path = mac_alert.h; + refType = 2; + }; + 8417779E085A116B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = SDL_macosx_main.h; + path = ../SDL_main/SDL_macosx_main.h; + refType = 2; + }; + 8417779F085A116B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = SDL_macosx_main.m; + path = ../SDL_main/SDL_macosx_main.m; + refType = 2; + }; + 841777A0085A117F000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = w_wad.c; + path = ../../w_wad.c; + refType = 2; + }; + 841777A1085A117F000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = w_wad.h; + path = ../../w_wad.h; + refType = 2; + }; + 841777A2085A1197000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = screen.c; + path = ../../screen.c; + refType = 2; + }; + 841777A3085A1197000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = screen.h; + path = ../../screen.h; + refType = 2; + }; + 841777A4085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = filesrch.h; + path = ../../filesrch.h; + refType = 2; + }; + 841777A5085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_joy.h; + path = ../../i_joy.h; + refType = 2; + }; + 841777A6085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_net.h; + path = ../../i_net.h; + refType = 2; + }; + 841777A8085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_sound.h; + path = ../../i_sound.h; + refType = 2; + }; + 841777A9085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_system.h; + path = ../../i_system.h; + refType = 2; + }; + 841777AA085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_tcp.c; + path = ../../i_tcp.c; + refType = 2; + }; + 841777AB085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_tcp.h; + path = ../../i_tcp.h; + refType = 2; + }; + 841777AC085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = i_video.h; + path = ../../i_video.h; + refType = 2; + }; + 841777AD085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = mserv.c; + path = ../../mserv.c; + refType = 2; + }; + 841777AE085A1200000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = mserv.h; + path = ../../mserv.h; + refType = 2; + }; + 841777AF085A1228000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = md5.c; + path = ../../md5.c; + refType = 2; + }; + 841777B0085A1228000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = md5.h; + path = ../../md5.h; + refType = 2; + }; + 841778BC085A122A000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = z_zone.c; + path = ../../z_zone.c; + refType = 2; + }; + 841778BD085A122A000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = z_zone.h; + path = ../../z_zone.h; + refType = 2; + }; + 841778BE085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = am_map.c; + path = ../../am_map.c; + refType = 2; + }; + 841778BF085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = am_map.h; + path = ../../am_map.h; + refType = 2; + }; + 841778C0085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = command.c; + path = ../../command.c; + refType = 2; + }; + 841778C1085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = command.h; + path = ../../command.h; + refType = 2; + }; + 841778C2085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = console.c; + path = ../../console.c; + refType = 2; + }; + 841778C3085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = console.h; + path = ../../console.h; + refType = 2; + }; + 841778C4085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = info.c; + path = ../../info.c; + refType = 2; + }; + 841778C5085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = info.h; + path = ../../info.h; + refType = 2; + }; + 841778C6085A1295000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = keys.h; + path = ../../keys.h; + refType = 2; + }; + 841779D2085A1296000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = st_stuff.c; + path = ../../st_stuff.c; + refType = 2; + }; + 841779D3085A1296000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = st_stuff.h; + path = ../../st_stuff.h; + refType = 2; + }; + 841779D4085A1296000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = tables.c; + path = ../../tables.c; + refType = 2; + }; + 841779D5085A1296000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = tables.h; + path = ../../tables.h; + refType = 2; + }; + 841779D7085A1296000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = v_video.h; + path = ../../v_video.h; + refType = 2; + }; + 841779D8085A1296000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = y_inter.c; + path = ../../y_inter.c; + refType = 2; + }; + 841779DA085A1347000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = byteptr.h; + path = ../../byteptr.h; + refType = 2; + }; + 841779DC085A138F000C01D8 = { + buildActionMask = 2147483647; + files = ( + 6755C8C7101802C300A80195, + 6755C8C8101802C300A80195, + 6755C8C9101802C300A80195, + 6755C8CA101802C300A80195, + 6755C8CB101802C300A80195, + 6755C8CC101802C300A80195, + 6755C8CD101802C300A80195, + 6755C8CE101802C300A80195, + 6755C8CF101802C300A80195, + ); + isa = PBXResourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 841779DD085A138F000C01D8 = { + buildActionMask = 2147483647; + files = ( + 84177A2A085A18A8000C01D8, + 84177A2E085A18D2000C01D8, + 84177A30085A18D3000C01D8, + 84177A32085A18D4000C01D8, + 84177A34085A18D5000C01D8, + 84177A39085A18D8000C01D8, + 84177A3F085A18DC000C01D8, + 84177A41085A18E0000C01D8, + 84177A43085A18E1000C01D8, + 84177A46085A18E8000C01D8, + 84177A4A085A18EA000C01D8, + 84177A4E085A18EC000C01D8, + 84177A50085A18F2000C01D8, + 84177A52085A193F000C01D8, + 84177A53085A1940000C01D8, + 84177A54085A1942000C01D8, + 84177A55085A1943000C01D8, + 84177A56085A195A000C01D8, + 84177A57085A195B000C01D8, + 84177A58085A1968000C01D8, + 84177A59085A1969000C01D8, + 84177A5A085A196B000C01D8, + 84177A5B085A197A000C01D8, + 84177A5C085A197C000C01D8, + 84177A5D085A197D000C01D8, + 84177A5E085A197E000C01D8, + 84177A5F085A1980000C01D8, + 84177A61085A1985000C01D8, + 84177A62085A1986000C01D8, + 84177A63085A1988000C01D8, + 84177A64085A1989000C01D8, + 84177A65085A198A000C01D8, + 84177A66085A198A000C01D8, + 84177A67085A198B000C01D8, + 84177A68085A198C000C01D8, + 84177A69085A198E000C01D8, + 84177A6B085A1994000C01D8, + 84177A6C085A1995000C01D8, + 84177A6D085A199D000C01D8, + 84177A6E085A19A0000C01D8, + 84177A6F085A19A1000C01D8, + 84177A70085A19A2000C01D8, + 84177A71085A19A4000C01D8, + 84177A72085A19A5000C01D8, + 84177A73085A19A6000C01D8, + 84177A74085A19A7000C01D8, + 84177A75085A19AC000C01D8, + 84177A76085A19AD000C01D8, + 84177A77085A19AE000C01D8, + 84177A78085A19AE000C01D8, + 84177A79085A19AF000C01D8, + 84177A7A085A19B0000C01D8, + 84177A7B085A19B3000C01D8, + 84177A7C085A19B4000C01D8, + 84177A7D085A19B5000C01D8, + 84177A7E085A19B7000C01D8, + 84177A7F085A19B8000C01D8, + 84177A80085A19B9000C01D8, + 84177A81085A19BA000C01D8, + 84177A82085A19BB000C01D8, + 84177A83085A19BB000C01D8, + 84177A84085A19BC000C01D8, + 84177A85085A19C1000C01D8, + 84177A86085A19C2000C01D8, + 84177A87085A19C3000C01D8, + 84177A88085A19C6000C01D8, + 84177A89085A19C7000C01D8, + 84177A8A085A19C9000C01D8, + 84177A8B085A19CC000C01D8, + 84177A8C085A19CD000C01D8, + 84177A8D085A19CF000C01D8, + 84177A8E085A19D0000C01D8, + 84177A90085A19D8000C01D8, + 84177A91085A19D9000C01D8, + 84177A92085A19DD000C01D8, + 84177A93085A19DF000C01D8, + 84177A94085A19E1000C01D8, + 84177A95085A19E3000C01D8, + 84177A96085A19E6000C01D8, + 8490D438085DF57B000C01D8, + 849603AA0A791C11000C01D8, + 6755C7B21017FE2500A80195, + 6755C7B31017FE2500A80195, + 6755C7B51017FE2500A80195, + 6755C7B71017FE2500A80195, + 6755C7B81017FE2500A80195, + 6755C84B1017FE4500A80195, + 6755C8651017FE4500A80195, + 677B5EC810180D4E00A80195, + 67B2D0C91018779900A80195, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 841779DE085A138F000C01D8 = { + buildActionMask = 2147483647; + files = ( + 84C4E0410862096F000C01D8, + 84C4E0440862098A000C01D8, + 84C4E047086209D3000C01D8, + 84C4E04A086209FF000C01D8, + 84C4E04F08620A46000C01D8, + 84C4E05008620A46000C01D8, + 849BD31E0A7E45B3000C01D8, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 841779E0085A138F000C01D8 = { + buildPhases = ( + 841779DC085A138F000C01D8, + 841779DD085A138F000C01D8, + 841779DE085A138F000C01D8, + ); + buildSettings = { + DEBUGGING_SYMBOLS = NO; + FRAMEWORK_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks\""; + HEADER_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL_mixer.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/OpenAL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/libpng.framework/Headers\""; + INSTALL_PATH = "$(HOME)/Applications"; + JAVA_COMPILER_DEBUGGING_SYMBOLS = NO; + OPTIMIZATION_CFLAGS = "-O2"; + OTHER_CFLAGS = "-DMAC_ALERT -DUNIXCOMMON -DSDLMAIN -DHAVE_MIXER -DHAVE_PNG -D_BIG_ENDIAN -DSTDC_HEADERS -DSDL -Wall -Winline -fno-strict-aliasing"; + OTHER_REZFLAGS = ""; + PREBINDING = NO; + PRODUCT_NAME = Srb2; + SECTORDER_FLAGS = ""; + USE_GCC3_PFE_SUPPORT = NO; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas -Wno-long-double"; + WRAPPER_EXTENSION = app; + }; + dependencies = ( + ); + isa = PBXApplicationTarget; + name = Srb2; + productInstallPath = "$(HOME)/Applications"; + productName = Srb2; + productReference = 841779E1085A138F000C01D8; + productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> +<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"> +<plist version=\"1.0\"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>Srb2</string> + <key>CFBundleGetInfoString</key> + <string></string> + <key>CFBundleIconFile</key> + <string>Srb2mac</string> + <key>CFBundleIdentifier</key> + <string></string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Sonic Robo Blast 2</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.09</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.09</string> + <key>NSMainNibFile</key> + <string>SDL_Main.nib</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> +"; + }; + 841779E1085A138F000C01D8 = { + isa = PBXApplicationReference; + path = Srb2.app; + refType = 3; + }; + 841779E2085A138F000C01D8 = { + children = ( + 841779E1085A138F000C01D8, + 841779EA085A13B1000C01D8, + ); + isa = PBXGroup; + name = Products; + refType = 4; + }; + 841779E6085A13B1000C01D8 = { + buildActionMask = 2147483647; + files = ( + 84177A98085A1A0B000C01D8, + 84177A99085A1A0E000C01D8, + 84177A9A085A1A0F000C01D8, + 84177A9B085A1A11000C01D8, + 84177A9C085A1A12000C01D8, + 84177A9D085A1A14000C01D8, + 84177A9E085A1A16000C01D8, + 84177A9F085A1A1E000C01D8, + 84177AA0085A1A1F000C01D8, + 84177AA1085A1A24000C01D8, + 84177AA2085A1A25000C01D8, + 84177AA3085A1A27000C01D8, + 84177AA4085A1A28000C01D8, + 84177AA5085A1A2B000C01D8, + 84177AA6085A1A2C000C01D8, + 84177AA7085A1A2D000C01D8, + 84177AA8085A1A2F000C01D8, + 84177AA9085A1A30000C01D8, + 84177AAA085A1A31000C01D8, + 84177AB4085A1A5E000C01D8, + 84177AB5085A1A60000C01D8, + 84177AB8085A1A65000C01D8, + 84177AB9085A1A65000C01D8, + 84177ABA085A1A66000C01D8, + 84177ABB085A1A67000C01D8, + 84177ABC085A1A67000C01D8, + 84177ABD085A1A68000C01D8, + 84177AC1085A1A70000C01D8, + 84177AC2085A1A72000C01D8, + 84177AC3085A1A77000C01D8, + 84177AC4085A1A78000C01D8, + 84177AC5085A1A7A000C01D8, + 84177AC6085A1A7B000C01D8, + 84177AC7085A1A7C000C01D8, + 84177AC8085A1A7D000C01D8, + 84177AC9085A1A7F000C01D8, + 84177ACA085A1A87000C01D8, + 84177ACB085A1A88000C01D8, + 84177ACC085A1A88000C01D8, + 84177ACD085A1A89000C01D8, + 84177ACE085A1A8A000C01D8, + 84177ACF085A1A8B000C01D8, + 84177AD0085A1A8C000C01D8, + 84177AD1085A1A8D000C01D8, + 84177AD2085A1A90000C01D8, + 84177AD4085A1A92000C01D8, + 84177AD5085A1A93000C01D8, + 84177AD6085A1A94000C01D8, + 84177AD7085A1A97000C01D8, + 84177AD8085A1A97000C01D8, + 84177AD9085A1A99000C01D8, + 84177ADA085A1A9F000C01D8, + 84177ADB085A1AA0000C01D8, + 84177ADC085A1AA2000C01D8, + 84177ADF085A1AA4000C01D8, + 84177AE0085A1AA6000C01D8, + 84177AE1085A1AA7000C01D8, + 84177AE2085A1AA8000C01D8, + 84177AE3085A1AA9000C01D8, + 84177AE4085A1AAA000C01D8, + 84177AE5085A1AAE000C01D8, + 84177AE7085A1AB5000C01D8, + 84177AE8085A1AB6000C01D8, + 84177AEB085A1ABD000C01D8, + 84177AEC085A1ABF000C01D8, + 84177AED085A1ABF000C01D8, + 8490D432085DF3D6000C01D8, + 8490D437085DF57B000C01D8, + 8490D43C085E0518000C01D8, + 8490D43D085E05F6000C01D8, + 8490D43E085E05F7000C01D8, + 8490D43F085E05F8000C01D8, + 8490D440085E05FA000C01D8, + 8490D441085E05FB000C01D8, + 8490D442085E05FC000C01D8, + 8490D443085E05FE000C01D8, + 8490D444085E05FF000C01D8, + 8490D445085E0606000C01D8, + 8490D446085E060A000C01D8, + 8490D447085E060B000C01D8, + 8490D448085E067E000C01D8, + 849603A90A791C11000C01D8, + 6755C7BB1017FE2500A80195, + 6755C7BC1017FE2500A80195, + 6755C7BD1017FE2500A80195, + 6755C7BE1017FE2500A80195, + 6755C7BF1017FE2500A80195, + 6755C7C01017FE2500A80195, + 6755C7C11017FE2500A80195, + 6755C8861017FE4500A80195, + 6755C8871017FE4500A80195, + 6755C8A01017FE4500A80195, + 67B2D0CA1018779D00A80195, + ); + isa = PBXSourcesBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 841779E7085A13B1000C01D8 = { + buildActionMask = 2147483647; + files = ( + 84C4E0400862096F000C01D8, + 84C4E0430862098A000C01D8, + 84C4E046086209D3000C01D8, + 84C4E049086209FF000C01D8, + 84C4E04E08620A46000C01D8, + 8494DFE80886EA0D000C01D8, + 849BD31D0A7E45B3000C01D8, + ); + isa = PBXFrameworksBuildPhase; + runOnlyForDeploymentPostprocessing = 0; + }; + 841779E9085A13B1000C01D8 = { + buildPhases = ( + 840CE6B009198AA7000C01D8, + 6726EB5E10190F860074DCBA, + 6726EB5F10190FFC0074DCBA, + 841779E6085A13B1000C01D8, + 841779E7085A13B1000C01D8, + ); + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks\""; + HEADER_SEARCH_PATHS = "\"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/SDL_mixer.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/OpenAL.framework/Headers\" \"$(LOCAL_LIBRARY_DIR)/Frameworks/libpng.framework/Headers\""; + INSTALL_PATH = "$(HOME)/Applications"; + OPTIMIZATION_CFLAGS = "-O0"; + OTHER_CFLAGS = "-DMAC_ALERT -DUNIXCOMMON -DSDLMAIN -DHAVE_MIXER -DHAVE_PNG -D_BIG_ENDIAN -DSTDC_HEADERS -DSDL -Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wsign-compare -Waggregate-return -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing -fno-exceptions -D_DEBUG"; + OTHER_REZFLAGS = ""; + PREBINDING = NO; + PRODUCT_NAME = Srb2Debug; + SECTORDER_FLAGS = ""; + USE_GCC3_PFE_SUPPORT = NO; + WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas -Wno-long-double"; + WRAPPER_EXTENSION = app; + }; + dependencies = ( + ); + isa = PBXApplicationTarget; + name = Srb2Debug; + productInstallPath = "$(HOME)/Applications"; + productName = Srb2Debug; + productReference = 841779EA085A13B1000C01D8; + productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> +<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"> +<plist version=\"1.0\"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>Srb2Debug</string> + <key>CFBundleGetInfoString</key> + <string></string> + <key>CFBundleIconFile</key> + <string>srb2mac</string> + <key>CFBundleIdentifier</key> + <string></string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>Sonic Robo Blast 2</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.09</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.09 Debug</string> + <key>NSMainNibFile</key> + <string>SDL_Main.nib</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> +"; + }; + 841779EA085A13B1000C01D8 = { + isa = PBXApplicationReference; + path = Srb2Debug.app; + refType = 3; + }; + 84177A2A085A18A8000C01D8 = { + fileRef = 84177713085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A2E085A18D2000C01D8 = { + fileRef = 84177717085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A30085A18D3000C01D8 = { + fileRef = 84177719085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A32085A18D4000C01D8 = { + fileRef = 8417771B085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A34085A18D5000C01D8 = { + fileRef = 8417771D085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A39085A18D8000C01D8 = { + fileRef = 84177722085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A41085A18E0000C01D8 = { + fileRef = 8417772A085A100E000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A43085A18E1000C01D8 = { + fileRef = 8417772C085A100E000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A46085A18E8000C01D8 = { + fileRef = 841778C4085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A4A085A18EA000C01D8 = { + fileRef = 8417772D085A1029000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A4E085A18EC000C01D8 = { + fileRef = 841779D4085A1296000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A50085A18F2000C01D8 = { + fileRef = 8417772F085A1029000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A52085A193F000C01D8 = { + fileRef = 841778C2085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A53085A1940000C01D8 = { + fileRef = 841778C0085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A54085A1942000C01D8 = { + fileRef = 841778BE085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A55085A1943000C01D8 = { + fileRef = 84177732085A1040000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A56085A195A000C01D8 = { + fileRef = 841779D2085A1296000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A57085A195B000C01D8 = { + fileRef = 841779D8085A1296000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A58085A1968000C01D8 = { + fileRef = 84177734085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A59085A1969000C01D8 = { + fileRef = 84177735085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A5A085A196B000C01D8 = { + fileRef = 84177739085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A5B085A197A000C01D8 = { + fileRef = 8417773D085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A5C085A197C000C01D8 = { + fileRef = 8417773F085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A5D085A197D000C01D8 = { + fileRef = 84177741085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A5E085A197E000C01D8 = { + fileRef = 84177743085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A5F085A1980000C01D8 = { + fileRef = 84177745085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A61085A1985000C01D8 = { + fileRef = 84177749085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A62085A1986000C01D8 = { + fileRef = 8417774B085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A63085A1988000C01D8 = { + fileRef = 8417774E085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A64085A1989000C01D8 = { + fileRef = 8417774F085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A65085A198A000C01D8 = { + fileRef = 84177750085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A66085A198A000C01D8 = { + fileRef = 84177751085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A67085A198B000C01D8 = { + fileRef = 84177752085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A68085A198C000C01D8 = { + fileRef = 84177753085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A69085A198E000C01D8 = { + fileRef = 84177755085A10AA000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A6B085A1994000C01D8 = { + fileRef = 841777AA085A1200000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A6C085A1995000C01D8 = { + fileRef = 841777AD085A1200000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A6D085A199D000C01D8 = { + fileRef = 8417774C085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A6E085A19A0000C01D8 = { + fileRef = 8417775A085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A6F085A19A1000C01D8 = { + fileRef = 8417775C085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A70085A19A2000C01D8 = { + fileRef = 8417775E085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A71085A19A4000C01D8 = { + fileRef = 84177760085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A72085A19A5000C01D8 = { + fileRef = 84177762085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A73085A19A6000C01D8 = { + fileRef = 84177764085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A74085A19A7000C01D8 = { + fileRef = 84177766085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A75085A19AC000C01D8 = { + fileRef = 84177769085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A76085A19AD000C01D8 = { + fileRef = 8417776A085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A77085A19AE000C01D8 = { + fileRef = 8417776B085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A78085A19AE000C01D8 = { + fileRef = 8417776C085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A79085A19AF000C01D8 = { + fileRef = 8417776D085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A7A085A19B0000C01D8 = { + fileRef = 8417776E085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A7B085A19B3000C01D8 = { + fileRef = 84177770085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A7C085A19B4000C01D8 = { + fileRef = 84177771085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A7D085A19B5000C01D8 = { + fileRef = 84177773085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A7E085A19B7000C01D8 = { + fileRef = 84177776085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A7F085A19B8000C01D8 = { + fileRef = 84177778085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A80085A19B9000C01D8 = { + fileRef = 8417777A085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A81085A19BA000C01D8 = { + fileRef = 8417777B085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A82085A19BB000C01D8 = { + fileRef = 8417777D085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A83085A19BB000C01D8 = { + fileRef = 8417777E085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A84085A19BC000C01D8 = { + fileRef = 84177780085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A85085A19C1000C01D8 = { + fileRef = 84177781085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A86085A19C2000C01D8 = { + fileRef = 84177783085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A87085A19C3000C01D8 = { + fileRef = 84177786085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A88085A19C6000C01D8 = { + fileRef = 8417778B085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A89085A19C7000C01D8 = { + fileRef = 8417778D085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A8A085A19C9000C01D8 = { + fileRef = 8417778F085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A8B085A19CC000C01D8 = { + fileRef = 84177791085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A8C085A19CD000C01D8 = { + fileRef = 84177793085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A8D085A19CF000C01D8 = { + fileRef = 84177796085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A8E085A19D0000C01D8 = { + fileRef = 841777A2085A1197000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A90085A19D8000C01D8 = { + fileRef = 84177798085A1138000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A91085A19D9000C01D8 = { + fileRef = 8417779A085A1138000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A92085A19DD000C01D8 = { + fileRef = 8417779C085A114C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A93085A19DF000C01D8 = { + fileRef = 8417779F085A116B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A94085A19E1000C01D8 = { + fileRef = 841777A0085A117F000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A95085A19E3000C01D8 = { + fileRef = 841777AF085A1228000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A96085A19E6000C01D8 = { + fileRef = 841778BC085A122A000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A98085A1A0B000C01D8 = { + fileRef = 84177713085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A99085A1A0E000C01D8 = { + fileRef = 84177717085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A9A085A1A0F000C01D8 = { + fileRef = 84177719085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A9B085A1A11000C01D8 = { + fileRef = 8417771B085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A9C085A1A12000C01D8 = { + fileRef = 8417771D085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A9D085A1A14000C01D8 = { + fileRef = 84177722085A0FCE000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177A9F085A1A1E000C01D8 = { + fileRef = 8417772A085A100E000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA0085A1A1F000C01D8 = { + fileRef = 8417772C085A100E000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA1085A1A24000C01D8 = { + fileRef = 841778C4085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA2085A1A25000C01D8 = { + fileRef = 8417772D085A1029000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA3085A1A27000C01D8 = { + fileRef = 8417772F085A1029000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA4085A1A28000C01D8 = { + fileRef = 841779D4085A1296000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA5085A1A2B000C01D8 = { + fileRef = 841778BE085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA6085A1A2C000C01D8 = { + fileRef = 841778C2085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA7085A1A2D000C01D8 = { + fileRef = 841778C0085A1295000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA8085A1A2F000C01D8 = { + fileRef = 84177732085A1040000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AA9085A1A30000C01D8 = { + fileRef = 841779D2085A1296000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AAA085A1A31000C01D8 = { + fileRef = 841779D8085A1296000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AB4085A1A5E000C01D8 = { + fileRef = 84177749085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AB5085A1A60000C01D8 = { + fileRef = 8417774B085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AB8085A1A65000C01D8 = { + fileRef = 8417774E085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AB9085A1A65000C01D8 = { + fileRef = 8417774F085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ABA085A1A66000C01D8 = { + fileRef = 84177750085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ABB085A1A67000C01D8 = { + fileRef = 84177751085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ABC085A1A67000C01D8 = { + fileRef = 84177752085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ABD085A1A68000C01D8 = { + fileRef = 84177753085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC1085A1A70000C01D8 = { + fileRef = 841777AA085A1200000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC2085A1A72000C01D8 = { + fileRef = 841777AD085A1200000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC3085A1A77000C01D8 = { + fileRef = 8417775A085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC4085A1A78000C01D8 = { + fileRef = 8417775C085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC5085A1A7A000C01D8 = { + fileRef = 8417775E085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC6085A1A7B000C01D8 = { + fileRef = 84177760085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC7085A1A7C000C01D8 = { + fileRef = 84177762085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC8085A1A7D000C01D8 = { + fileRef = 84177764085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AC9085A1A7F000C01D8 = { + fileRef = 84177766085A10EB000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ACA085A1A87000C01D8 = { + fileRef = 84177769085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ACB085A1A88000C01D8 = { + fileRef = 8417776A085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ACC085A1A88000C01D8 = { + fileRef = 8417776B085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ACD085A1A89000C01D8 = { + fileRef = 8417776C085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ACE085A1A8A000C01D8 = { + fileRef = 8417776D085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ACF085A1A8B000C01D8 = { + fileRef = 8417776E085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD0085A1A8C000C01D8 = { + fileRef = 84177770085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD1085A1A8D000C01D8 = { + fileRef = 84177771085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD2085A1A90000C01D8 = { + fileRef = 84177773085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD4085A1A92000C01D8 = { + fileRef = 84177778085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD5085A1A93000C01D8 = { + fileRef = 8417777A085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD6085A1A94000C01D8 = { + fileRef = 8417777B085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD7085A1A97000C01D8 = { + fileRef = 8417777D085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD8085A1A97000C01D8 = { + fileRef = 8417777E085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AD9085A1A99000C01D8 = { + fileRef = 84177780085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ADA085A1A9F000C01D8 = { + fileRef = 84177781085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ADB085A1AA0000C01D8 = { + fileRef = 84177783085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ADC085A1AA2000C01D8 = { + fileRef = 84177786085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177ADF085A1AA4000C01D8 = { + fileRef = 8417778B085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE0085A1AA6000C01D8 = { + fileRef = 8417778D085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE1085A1AA7000C01D8 = { + fileRef = 8417778F085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE2085A1AA8000C01D8 = { + fileRef = 84177791085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE3085A1AA9000C01D8 = { + fileRef = 84177793085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE4085A1AAA000C01D8 = { + fileRef = 84177796085A111B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE5085A1AAE000C01D8 = { + fileRef = 841777A2085A1197000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE7085A1AB5000C01D8 = { + fileRef = 84177798085A1138000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AE8085A1AB6000C01D8 = { + fileRef = 8417779A085A1138000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AEB085A1ABD000C01D8 = { + fileRef = 841777AF085A1228000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AEC085A1ABF000C01D8 = { + fileRef = 841777A0085A117F000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84177AED085A1ABF000C01D8 = { + fileRef = 841778BC085A122A000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D432085DF3D6000C01D8 = { + fileRef = 84177776085A1104000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D433085DF537000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = y_inter.h; + path = ../../y_inter.h; + refType = 2; + }; + 8490D436085DF57B000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = v_video.c; + path = ../../v_video.c; + refType = 2; + }; + 8490D437085DF57B000C01D8 = { + fileRef = 8490D436085DF57B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D438085DF57B000C01D8 = { + fileRef = 8490D436085DF57B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D43C085E0518000C01D8 = { + fileRef = 8417779F085A116B000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D43D085E05F6000C01D8 = { + fileRef = 84177734085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D43E085E05F7000C01D8 = { + fileRef = 84177735085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D43F085E05F8000C01D8 = { + fileRef = 84177739085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D440085E05FA000C01D8 = { + fileRef = 8417773D085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D441085E05FB000C01D8 = { + fileRef = 8417773F085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D442085E05FC000C01D8 = { + fileRef = 84177741085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D443085E05FE000C01D8 = { + fileRef = 84177743085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D444085E05FF000C01D8 = { + fileRef = 84177745085A106C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D445085E0606000C01D8 = { + fileRef = 8417774C085A1097000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D446085E060A000C01D8 = { + fileRef = 84177755085A10AA000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D447085E060B000C01D8 = { + fileRef = 84177758085A10D2000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8490D448085E067E000C01D8 = { + fileRef = 8417779C085A114C000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 8494DFE80886EA0D000C01D8 = { + fileRef = 84C4E04B08620A46000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 849603A80A791C11000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = comptime.c; + path = ../../comptime.c; + refType = 2; + }; + 849603A90A791C11000C01D8 = { + fileRef = 849603A80A791C11000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 849603AA0A791C11000C01D8 = { + fileRef = 849603A80A791C11000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 849BD31C0A7E45B3000C01D8 = { + isa = PBXFrameworkReference; + name = libpng.framework; + path = /Library/Frameworks/libpng.framework; + refType = 0; + }; + 849BD31D0A7E45B3000C01D8 = { + fileRef = 849BD31C0A7E45B3000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 849BD31E0A7E45B3000C01D8 = { + fileRef = 849BD31C0A7E45B3000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 849BD32D0A7E471D000C01D8 = { + fileRef = 849BD31C0A7E45B3000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E00D0862063C000C01D8 = { + children = ( + 6755C8BE101802C300A80195, + 6755C8BF101802C300A80195, + 6755C8C0101802C300A80195, + 6755C8C1101802C300A80195, + 6755C8C2101802C300A80195, + 6755C8C3101802C300A80195, + 6755C8C4101802C300A80195, + 6755C8C5101802C300A80195, + 6755C8C6101802C300A80195, + ); + isa = PBXGroup; + name = Data; + refType = 4; + }; + 84C4E03F0862096F000C01D8 = { + isa = PBXFrameworkReference; + name = AppKit.framework; + path = /System/Library/Frameworks/AppKit.framework; + refType = 0; + }; + 84C4E0400862096F000C01D8 = { + fileRef = 84C4E03F0862096F000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E0410862096F000C01D8 = { + fileRef = 84C4E03F0862096F000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E0420862098A000C01D8 = { + isa = PBXFrameworkReference; + name = Foundation.framework; + path = /System/Library/Frameworks/Foundation.framework; + refType = 0; + }; + 84C4E0430862098A000C01D8 = { + fileRef = 84C4E0420862098A000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E0440862098A000C01D8 = { + fileRef = 84C4E0420862098A000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E045086209D3000C01D8 = { + isa = PBXFrameworkReference; + name = CoreFoundation.framework; + path = /System/Library/Frameworks/CoreFoundation.framework; + refType = 0; + }; + 84C4E046086209D3000C01D8 = { + fileRef = 84C4E045086209D3000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E047086209D3000C01D8 = { + fileRef = 84C4E045086209D3000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E048086209FF000C01D8 = { + isa = PBXFrameworkReference; + name = ApplicationServices.framework; + path = /System/Library/Frameworks/ApplicationServices.framework; + refType = 0; + }; + 84C4E049086209FF000C01D8 = { + fileRef = 84C4E048086209FF000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E04A086209FF000C01D8 = { + fileRef = 84C4E048086209FF000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E04B08620A46000C01D8 = { + isa = PBXFrameworkReference; + name = SDL_mixer.framework; + path = /Library/Frameworks/SDL_mixer.framework; + refType = 0; + }; + 84C4E04C08620A46000C01D8 = { + isa = PBXFrameworkReference; + name = SDL.framework; + path = /Library/Frameworks/SDL.framework; + refType = 0; + }; + 84C4E04E08620A46000C01D8 = { + fileRef = 84C4E04C08620A46000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E04F08620A46000C01D8 = { + fileRef = 84C4E04B08620A46000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84C4E05008620A46000C01D8 = { + fileRef = 84C4E04C08620A46000C01D8; + isa = PBXBuildFile; + settings = { + }; + }; + 84F202C708A92A5D000C01D8 = { + isa = PBXFrameworkReference; + name = OpenAL.framework; + path = /Library/Frameworks/OpenAL.framework; + refType = 0; + }; + 84F202CA08A92AA0000C01D8 = { + fileEncoding = 30; + isa = PBXFileReference; + name = s_openal.c; + path = ../../hardware/s_openal/s_openal.c; + refType = 2; + }; + }; + rootObject = 84177702085A0C64000C01D8; +} diff --git a/src/sdl2/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl2/macosx/Srb2mac.xcodeproj/project.pbxproj new file mode 100644 index 000000000..f898a9934 --- /dev/null +++ b/src/sdl2/macosx/Srb2mac.xcodeproj/project.pbxproj @@ -0,0 +1,1508 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 44; + objects = { + +/* Begin PBXBuildFile section */ + 002F39FA09D0881F00EBEB88 /* SDL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 002F39F909D0881F00EBEB88 /* SDL.framework */; }; + 002F3A0009D0884600EBEB88 /* SDL.framework in Copy Frameworks into .app bundle */ = {isa = PBXBuildFile; fileRef = 002F39F909D0881F00EBEB88 /* SDL.framework */; }; + 1E308E720B71172D0015728C /* lzf.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44B2240B67EADE00BAD059 /* lzf.c */; }; + 1E32C4290B6E6D5D0029E058 /* libpng.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E32C4140B6E6D5D0029E058 /* libpng.framework */; }; + 1E32C42B0B6E6D6E0029E058 /* libpng.framework in Copy Frameworks into .app bundle */ = {isa = PBXBuildFile; fileRef = 1E32C4140B6E6D5D0029E058 /* libpng.framework */; }; + 1E44AE750B67CC2B00BAD059 /* hw_bsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE610B67CC2B00BAD059 /* hw_bsp.c */; }; + 1E44AE770B67CC2B00BAD059 /* hw3sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE630B67CC2B00BAD059 /* hw3sound.c */; }; + 1E44AE780B67CC2B00BAD059 /* hw_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE640B67CC2B00BAD059 /* hw_cache.c */; }; + 1E44AE7C0B67CC2B00BAD059 /* hw_light.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE680B67CC2B00BAD059 /* hw_light.c */; }; + 1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */; }; + 1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE6E0B67CC2B00BAD059 /* hw_main.c */; }; + 1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE700B67CC2B00BAD059 /* hw_md2.c */; }; + 1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE720B67CC2B00BAD059 /* hw_trick.c */; }; + 1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */; }; + 1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE900B67CC8400BAD059 /* d_main.c */; }; + 1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE910B67CC8500BAD059 /* d_net.c */; }; + 1E44AEAB0B67CC8500BAD059 /* d_netfil.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE940B67CC8500BAD059 /* d_netfil.c */; }; + 1E44AEAF0B67CC8500BAD059 /* d_netcmd.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE980B67CC8500BAD059 /* d_netcmd.c */; }; + 1E44AEB30B67CC8500BAD059 /* dehacked.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AE9C0B67CC8500BAD059 /* dehacked.c */; }; + 1E44AEBF0B67CCA900BAD059 /* f_wipe.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEBC0B67CCA900BAD059 /* f_wipe.c */; }; + 1E44AEC00B67CCA900BAD059 /* f_finale.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEBD0B67CCA900BAD059 /* f_finale.c */; }; + 1E44AEC80B67CCC600BAD059 /* g_game.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEC30B67CCC600BAD059 /* g_game.c */; }; + 1E44AECC0B67CCC600BAD059 /* g_input.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEC70B67CCC600BAD059 /* g_input.c */; }; + 1E44AED00B67CCEE00BAD059 /* hu_stuff.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AECE0B67CCEE00BAD059 /* hu_stuff.c */; }; + 1E44AEDC0B67CD1300BAD059 /* i_tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AED50B67CD1200BAD059 /* i_tcp.c */; }; + 1E44AEE30B67CD2B00BAD059 /* am_map.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEE10B67CD2B00BAD059 /* am_map.c */; }; + 1E44AEE90B67CD3F00BAD059 /* command.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEE70B67CD3F00BAD059 /* command.c */; }; + 1E44AEEC0B67CD4400BAD059 /* comptime.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEEB0B67CD4400BAD059 /* comptime.c */; }; + 1E44AEEF0B67CD5400BAD059 /* console.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEED0B67CD5400BAD059 /* console.c */; }; + 1E44AEF30B67CD7F00BAD059 /* filesrch.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEF10B67CD7F00BAD059 /* filesrch.c */; }; + 1E44AF070B67CDE900BAD059 /* m_argv.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEF80B67CDE900BAD059 /* m_argv.c */; }; + 1E44AF0A0B67CDE900BAD059 /* m_cheat.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEFB0B67CDE900BAD059 /* m_cheat.c */; }; + 1E44AF0B0B67CDE900BAD059 /* m_bbox.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEFC0B67CDE900BAD059 /* m_bbox.c */; }; + 1E44AF0D0B67CDE900BAD059 /* m_fixed.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AEFE0B67CDE900BAD059 /* m_fixed.c */; }; + 1E44AF0F0B67CDE900BAD059 /* m_menu.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF000B67CDE900BAD059 /* m_menu.c */; }; + 1E44AF110B67CDE900BAD059 /* m_misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF020B67CDE900BAD059 /* m_misc.c */; }; + 1E44AF130B67CDE900BAD059 /* m_random.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF040B67CDE900BAD059 /* m_random.c */; }; + 1E44AF1A0B67CE2A00BAD059 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF180B67CE2A00BAD059 /* info.c */; }; + 1E44AF1E0B67CE3600BAD059 /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF1C0B67CE3600BAD059 /* md5.c */; }; + 1E44AF220B67CE4100BAD059 /* mserv.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF200B67CE4100BAD059 /* mserv.c */; }; + 1E44AF3C0B67CE5F00BAD059 /* p_enemy.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF240B67CE5F00BAD059 /* p_enemy.c */; }; + 1E44AF3D0B67CE5F00BAD059 /* p_inter.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF250B67CE5F00BAD059 /* p_inter.c */; }; + 1E44AF3E0B67CE5F00BAD059 /* p_fab.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF260B67CE5F00BAD059 /* p_fab.c */; }; + 1E44AF3F0B67CE5F00BAD059 /* p_lights.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF270B67CE5F00BAD059 /* p_lights.c */; }; + 1E44AF400B67CE5F00BAD059 /* p_map.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF280B67CE5F00BAD059 /* p_map.c */; }; + 1E44AF410B67CE5F00BAD059 /* p_maputl.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF290B67CE5F00BAD059 /* p_maputl.c */; }; + 1E44AF430B67CE5F00BAD059 /* p_mobj.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF2B0B67CE5F00BAD059 /* p_mobj.c */; }; + 1E44AF450B67CE5F00BAD059 /* p_floor.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF2D0B67CE5F00BAD059 /* p_floor.c */; }; + 1E44AF480B67CE5F00BAD059 /* p_saveg.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF300B67CE5F00BAD059 /* p_saveg.c */; }; + 1E44AF4A0B67CE5F00BAD059 /* p_setup.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF320B67CE5F00BAD059 /* p_setup.c */; }; + 1E44AF4C0B67CE5F00BAD059 /* p_sight.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF340B67CE5F00BAD059 /* p_sight.c */; }; + 1E44AF4D0B67CE5F00BAD059 /* p_spec.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF350B67CE5F00BAD059 /* p_spec.c */; }; + 1E44AF4F0B67CE5F00BAD059 /* p_telept.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF370B67CE5F00BAD059 /* p_telept.c */; }; + 1E44AF500B67CE5F00BAD059 /* p_tick.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF380B67CE5F00BAD059 /* p_tick.c */; }; + 1E44AF520B67CE5F00BAD059 /* p_user.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF3A0B67CE5F00BAD059 /* p_user.c */; }; + 1E44AF530B67CE5F00BAD059 /* p_ceilng.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF3B0B67CE5F00BAD059 /* p_ceilng.c */; }; + 1E44AF6C0B67CEC200BAD059 /* r_bsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF550B67CEC100BAD059 /* r_bsp.c */; }; + 1E44AF6F0B67CEC200BAD059 /* r_data.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF580B67CEC100BAD059 /* r_data.c */; }; + 1E44AF700B67CEC200BAD059 /* r_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF590B67CEC100BAD059 /* r_draw.c */; }; + 1E44AF730B67CEC200BAD059 /* r_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF5C0B67CEC100BAD059 /* r_main.c */; }; + 1E44AF780B67CEC200BAD059 /* r_plane.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF610B67CEC100BAD059 /* r_plane.c */; }; + 1E44AF7A0B67CEC200BAD059 /* r_segs.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF630B67CEC100BAD059 /* r_segs.c */; }; + 1E44AF7C0B67CEC200BAD059 /* r_sky.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF650B67CEC200BAD059 /* r_sky.c */; }; + 1E44AF7E0B67CEC200BAD059 /* r_splats.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF670B67CEC200BAD059 /* r_splats.c */; }; + 1E44AF810B67CEC200BAD059 /* r_things.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF6A0B67CEC200BAD059 /* r_things.c */; }; + 1E44AF870B67CEE000BAD059 /* s_sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF850B67CEE000BAD059 /* s_sound.c */; }; + 1E44AF8B0B67CEE900BAD059 /* screen.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF890B67CEE900BAD059 /* screen.c */; }; + 1E44AF8F0B67CEF000BAD059 /* sounds.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF8D0B67CEF000BAD059 /* sounds.c */; }; + 1E44AF930B67CEFF00BAD059 /* st_stuff.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF910B67CEFF00BAD059 /* st_stuff.c */; }; + 1E44AF9B0B67CF2E00BAD059 /* tables.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AF990B67CF2E00BAD059 /* tables.c */; }; + 1E44AFA50B67CF5D00BAD059 /* v_video.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFA30B67CF5D00BAD059 /* v_video.c */; }; + 1E44AFA90B67CF6400BAD059 /* w_wad.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFA70B67CF6400BAD059 /* w_wad.c */; }; + 1E44AFAD0B67CF6F00BAD059 /* y_inter.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFAB0B67CF6F00BAD059 /* y_inter.c */; }; + 1E44AFB10B67CF7A00BAD059 /* z_zone.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFAF0B67CF7A00BAD059 /* z_zone.c */; }; + 1E44AFC40B67CFDC00BAD059 /* dosstr.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFB40B67CFDC00BAD059 /* dosstr.c */; }; + 1E44AFC50B67CFDC00BAD059 /* endtxt.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFB50B67CFDC00BAD059 /* endtxt.c */; }; + 1E44AFC70B67CFDC00BAD059 /* hwsym_sdl.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFB70B67CFDC00BAD059 /* hwsym_sdl.c */; }; + 1E44AFC90B67CFDC00BAD059 /* i_cdmus.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFB90B67CFDC00BAD059 /* i_cdmus.c */; }; + 1E44AFCA0B67CFDC00BAD059 /* i_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFBA0B67CFDC00BAD059 /* i_main.c */; }; + 1E44AFCB0B67CFDC00BAD059 /* i_net.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFBB0B67CFDC00BAD059 /* i_net.c */; }; + 1E44AFCD0B67CFDC00BAD059 /* i_system.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFBD0B67CFDC00BAD059 /* i_system.c */; }; + 1E44AFCE0B67CFDC00BAD059 /* i_video.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFBE0B67CFDC00BAD059 /* i_video.c */; }; + 1E44AFD00B67CFDC00BAD059 /* ogl_sdl.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFC00B67CFDC00BAD059 /* ogl_sdl.c */; }; + 1E44AFEA0B67D06200BAD059 /* Srb2mac.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1E44AFE70B67D06200BAD059 /* Srb2mac.icns */; }; + 1E44AFEB0B67D06200BAD059 /* mac_alert.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFE80B67D06200BAD059 /* mac_alert.c */; }; + 1E44AFED0B67D0AB00BAD059 /* r_opengl.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E44AFEC0B67D0AB00BAD059 /* r_opengl.c */; }; + 1E44B0590B67D81E00BAD059 /* SDL_macosx_main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E44B0570B67D81E00BAD059 /* SDL_macosx_main.m */; }; + 1E66921C0B690C5B00B7313A /* SDL_mixer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E66921B0B690C5B00B7313A /* SDL_mixer.framework */; }; + 1E66921D0B690C6B00B7313A /* SDL_mixer.framework in Copy Frameworks into .app bundle */ = {isa = PBXBuildFile; fileRef = 1E66921B0B690C5B00B7313A /* SDL_mixer.framework */; }; + 67259DFD18D2687D00F02971 /* lua_hudlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67259DFB18D2687D00F02971 /* lua_hudlib.c */; }; + 67259DFE18D2687D00F02971 /* lua_skinlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67259DFC18D2687D00F02971 /* lua_skinlib.c */; }; + 67259E0118D268AE00F02971 /* m_anigif.c in Sources */ = {isa = PBXBuildFile; fileRef = 67259DFF18D268AE00F02971 /* m_anigif.c */; }; + 67259E0618D268F700F02971 /* i_ttf.c in Sources */ = {isa = PBXBuildFile; fileRef = 67259E0218D268F600F02971 /* i_ttf.c */; }; + 67259E0718D268F700F02971 /* mixer_sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 67259E0418D268F600F02971 /* mixer_sound.c */; }; + 67259E0818D268F700F02971 /* sdl_sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 67259E0518D268F600F02971 /* sdl_sound.c */; }; + 67259E2E18D26D5700F02971 /* patch.dta in Resources */ = {isa = PBXBuildFile; fileRef = 67259E2B18D26D5700F02971 /* patch.dta */; }; + 67259E2F18D26D5700F02971 /* rings.dta in Resources */ = {isa = PBXBuildFile; fileRef = 67259E2C18D26D5700F02971 /* rings.dta */; }; + 67259E3018D26D5700F02971 /* srb2.srb in Resources */ = {isa = PBXBuildFile; fileRef = 67259E2D18D26D5700F02971 /* srb2.srb */; }; + 67259E3218D26DD200F02971 /* music.dta in Resources */ = {isa = PBXBuildFile; fileRef = 1E44AE440B67CBE800BAD059 /* music.dta */; }; + 67259E3318D26DD300F02971 /* player.dta in Resources */ = {isa = PBXBuildFile; fileRef = 67A1F91813FAD026009FA3E5 /* player.dta */; }; + 67259E3518D26DD500F02971 /* zones.dta in Resources */ = {isa = PBXBuildFile; fileRef = 6766C0AE11B057E50065F389 /* zones.dta */; }; + 676BB5200E0DE06100C95963 /* m_queue.c in Sources */ = {isa = PBXBuildFile; fileRef = 676BB51C0E0DE06100C95963 /* m_queue.c */; }; + 676BB5220E0DE06100C95963 /* p_polyobj.c in Sources */ = {isa = PBXBuildFile; fileRef = 676BB51E0E0DE06100C95963 /* p_polyobj.c */; }; + 67B83BFA14F57EAB00AAAE4E /* lapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BCB14F57EAB00AAAE4E /* lapi.c */; }; + 67B83BFB14F57EAB00AAAE4E /* lauxlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BCD14F57EAB00AAAE4E /* lauxlib.c */; }; + 67B83BFC14F57EAB00AAAE4E /* lbaselib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BCF14F57EAB00AAAE4E /* lbaselib.c */; }; + 67B83BFD14F57EAB00AAAE4E /* lcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BD014F57EAB00AAAE4E /* lcode.c */; }; + 67B83BFE14F57EAB00AAAE4E /* ldebug.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BD214F57EAB00AAAE4E /* ldebug.c */; }; + 67B83BFF14F57EAB00AAAE4E /* ldo.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BD414F57EAB00AAAE4E /* ldo.c */; }; + 67B83C0014F57EAB00AAAE4E /* ldump.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BD614F57EAB00AAAE4E /* ldump.c */; }; + 67B83C0114F57EAB00AAAE4E /* lfunc.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BD714F57EAB00AAAE4E /* lfunc.c */; }; + 67B83C0214F57EAB00AAAE4E /* lgc.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BD914F57EAB00AAAE4E /* lgc.c */; }; + 67B83C0314F57EAB00AAAE4E /* linit.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BDB14F57EAB00AAAE4E /* linit.c */; }; + 67B83C0414F57EAB00AAAE4E /* llex.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BDC14F57EAB00AAAE4E /* llex.c */; }; + 67B83C0514F57EAB00AAAE4E /* lmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BDF14F57EAB00AAAE4E /* lmem.c */; }; + 67B83C0614F57EAB00AAAE4E /* lobject.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BE114F57EAB00AAAE4E /* lobject.c */; }; + 67B83C0714F57EAB00AAAE4E /* lopcodes.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BE314F57EAB00AAAE4E /* lopcodes.c */; }; + 67B83C0814F57EAB00AAAE4E /* lparser.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BE514F57EAB00AAAE4E /* lparser.c */; }; + 67B83C0914F57EAB00AAAE4E /* lstate.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BE714F57EAB00AAAE4E /* lstate.c */; }; + 67B83C0A14F57EAB00AAAE4E /* lstring.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BE914F57EAB00AAAE4E /* lstring.c */; }; + 67B83C0B14F57EAB00AAAE4E /* lstrlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BEB14F57EAB00AAAE4E /* lstrlib.c */; }; + 67B83C0C14F57EAB00AAAE4E /* ltable.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BEC14F57EAB00AAAE4E /* ltable.c */; }; + 67B83C0D14F57EAB00AAAE4E /* ltablib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BEE14F57EAB00AAAE4E /* ltablib.c */; }; + 67B83C0E14F57EAB00AAAE4E /* ltm.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BEF14F57EAB00AAAE4E /* ltm.c */; }; + 67B83C0F14F57EAB00AAAE4E /* lundump.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BF414F57EAB00AAAE4E /* lundump.c */; }; + 67B83C1014F57EAB00AAAE4E /* lvm.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BF614F57EAB00AAAE4E /* lvm.c */; }; + 67B83C1114F57EAB00AAAE4E /* lzio.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83BF814F57EAB00AAAE4E /* lzio.c */; }; + 67B83C1414F57ECA00AAAE4E /* b_bot.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1214F57ECA00AAAE4E /* b_bot.c */; }; + 67B83C2214F57EE600AAAE4E /* lua_baselib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1514F57EE600AAAE4E /* lua_baselib.c */; }; + 67B83C2314F57EE600AAAE4E /* lua_consolelib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1614F57EE600AAAE4E /* lua_consolelib.c */; }; + 67B83C2414F57EE600AAAE4E /* lua_hooklib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1814F57EE600AAAE4E /* lua_hooklib.c */; }; + 67B83C2514F57EE600AAAE4E /* lua_infolib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1914F57EE600AAAE4E /* lua_infolib.c */; }; + 67B83C2614F57EE600AAAE4E /* lua_maplib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1B14F57EE600AAAE4E /* lua_maplib.c */; }; + 67B83C2714F57EE600AAAE4E /* lua_mathlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1C14F57EE600AAAE4E /* lua_mathlib.c */; }; + 67B83C2814F57EE600AAAE4E /* lua_mobjlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1D14F57EE600AAAE4E /* lua_mobjlib.c */; }; + 67B83C2914F57EE600AAAE4E /* lua_playerlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1E14F57EE600AAAE4E /* lua_playerlib.c */; }; + 67B83C2A14F57EE600AAAE4E /* lua_script.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C1F14F57EE600AAAE4E /* lua_script.c */; }; + 67B83C2B14F57EE600AAAE4E /* lua_thinkerlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C2114F57EE600AAAE4E /* lua_thinkerlib.c */; }; + 67B83C3314F57F1500AAAE4E /* m_cond.c in Sources */ = {isa = PBXBuildFile; fileRef = 67B83C2F14F57F1500AAAE4E /* m_cond.c */; }; + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 002F39FD09D0883400EBEB88 /* Copy Frameworks into .app bundle */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 12; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1E32C42B0B6E6D6E0029E058 /* libpng.framework in Copy Frameworks into .app bundle */, + 1E66921D0B690C6B00B7313A /* SDL_mixer.framework in Copy Frameworks into .app bundle */, + 002F3A0009D0884600EBEB88 /* SDL.framework in Copy Frameworks into .app bundle */, + ); + name = "Copy Frameworks into .app bundle"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 002F39F909D0881F00EBEB88 /* SDL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL.framework; path = /Library/Frameworks/SDL.framework; sourceTree = "<absolute>"; }; + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; }; + 1E32C4140B6E6D5D0029E058 /* libpng.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libpng.framework; path = /Library/Frameworks/libpng.framework; sourceTree = "<absolute>"; }; + 1E44AE440B67CBE800BAD059 /* music.dta */ = {isa = PBXFileReference; lastKnownFileType = text; name = music.dta; path = ../../../bin/Resources/music.dta; sourceTree = SOURCE_ROOT; }; + 1E44AE4B0B67CBE800BAD059 /* srb2.wad */ = {isa = PBXFileReference; lastKnownFileType = text; name = srb2.wad; path = ../../../bin/Resources/srb2.wad; sourceTree = SOURCE_ROOT; }; + 1E44AE600B67CC2B00BAD059 /* hw3dsdrv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw3dsdrv.h; path = ../../hardware/hw3dsdrv.h; sourceTree = SOURCE_ROOT; }; + 1E44AE610B67CC2B00BAD059 /* hw_bsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_bsp.c; path = ../../hardware/hw_bsp.c; sourceTree = SOURCE_ROOT; }; + 1E44AE620B67CC2B00BAD059 /* hw_defs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_defs.h; path = ../../hardware/hw_defs.h; sourceTree = SOURCE_ROOT; }; + 1E44AE630B67CC2B00BAD059 /* hw3sound.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw3sound.c; path = ../../hardware/hw3sound.c; sourceTree = SOURCE_ROOT; }; + 1E44AE640B67CC2B00BAD059 /* hw_cache.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_cache.c; path = ../../hardware/hw_cache.c; sourceTree = SOURCE_ROOT; }; + 1E44AE650B67CC2B00BAD059 /* hw_dll.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_dll.h; path = ../../hardware/hw_dll.h; sourceTree = SOURCE_ROOT; }; + 1E44AE660B67CC2B00BAD059 /* hw_drv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_drv.h; path = ../../hardware/hw_drv.h; sourceTree = SOURCE_ROOT; }; + 1E44AE670B67CC2B00BAD059 /* hw_glide.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_glide.h; path = ../../hardware/hw_glide.h; sourceTree = SOURCE_ROOT; }; + 1E44AE680B67CC2B00BAD059 /* hw_light.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_light.c; path = ../../hardware/hw_light.c; sourceTree = SOURCE_ROOT; }; + 1E44AE690B67CC2B00BAD059 /* hw_light.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_light.h; path = ../../hardware/hw_light.h; sourceTree = SOURCE_ROOT; }; + 1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw3sound.h; path = ../../hardware/hw3sound.h; sourceTree = SOURCE_ROOT; }; + 1E44AE6B0B67CC2B00BAD059 /* hw_data.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_data.h; path = ../../hardware/hw_data.h; sourceTree = SOURCE_ROOT; }; + 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_draw.c; path = ../../hardware/hw_draw.c; sourceTree = SOURCE_ROOT; }; + 1E44AE6D0B67CC2B00BAD059 /* hw_glob.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_glob.h; path = ../../hardware/hw_glob.h; sourceTree = SOURCE_ROOT; }; + 1E44AE6E0B67CC2B00BAD059 /* hw_main.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_main.c; path = ../../hardware/hw_main.c; sourceTree = SOURCE_ROOT; }; + 1E44AE6F0B67CC2B00BAD059 /* hw_main.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_main.h; path = ../../hardware/hw_main.h; sourceTree = SOURCE_ROOT; }; + 1E44AE700B67CC2B00BAD059 /* hw_md2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_md2.c; path = ../../hardware/hw_md2.c; sourceTree = SOURCE_ROOT; }; + 1E44AE710B67CC2B00BAD059 /* hw_md2.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_md2.h; path = ../../hardware/hw_md2.h; sourceTree = SOURCE_ROOT; }; + 1E44AE720B67CC2B00BAD059 /* hw_trick.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_trick.c; path = ../../hardware/hw_trick.c; sourceTree = SOURCE_ROOT; }; + 1E44AE730B67CC2B00BAD059 /* hws_data.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hws_data.h; path = ../../hardware/hws_data.h; sourceTree = SOURCE_ROOT; }; + 1E44AE8A0B67CC6000BAD059 /* asm_defs.inc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.pascal; name = asm_defs.inc; path = ../../asm_defs.inc; sourceTree = SOURCE_ROOT; }; + 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_clisrv.c; path = ../../d_clisrv.c; sourceTree = SOURCE_ROOT; }; + 1E44AE8E0B67CC8400BAD059 /* d_clisrv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_clisrv.h; path = ../../d_clisrv.h; sourceTree = SOURCE_ROOT; }; + 1E44AE8F0B67CC8400BAD059 /* d_event.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_event.h; path = ../../d_event.h; sourceTree = SOURCE_ROOT; }; + 1E44AE900B67CC8400BAD059 /* d_main.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_main.c; path = ../../d_main.c; sourceTree = SOURCE_ROOT; }; + 1E44AE910B67CC8500BAD059 /* d_net.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_net.c; path = ../../d_net.c; sourceTree = SOURCE_ROOT; }; + 1E44AE920B67CC8500BAD059 /* d_net.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_net.h; path = ../../d_net.h; sourceTree = SOURCE_ROOT; }; + 1E44AE930B67CC8500BAD059 /* d_netcmd.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_netcmd.h; path = ../../d_netcmd.h; sourceTree = SOURCE_ROOT; }; + 1E44AE940B67CC8500BAD059 /* d_netfil.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_netfil.c; path = ../../d_netfil.c; sourceTree = SOURCE_ROOT; }; + 1E44AE950B67CC8500BAD059 /* d_player.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_player.h; path = ../../d_player.h; sourceTree = SOURCE_ROOT; }; + 1E44AE960B67CC8500BAD059 /* d_think.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_think.h; path = ../../d_think.h; sourceTree = SOURCE_ROOT; }; + 1E44AE980B67CC8500BAD059 /* d_netcmd.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = d_netcmd.c; path = ../../d_netcmd.c; sourceTree = SOURCE_ROOT; }; + 1E44AE990B67CC8500BAD059 /* d_ticcmd.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_ticcmd.h; path = ../../d_ticcmd.h; sourceTree = SOURCE_ROOT; }; + 1E44AE9A0B67CC8500BAD059 /* d_main.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_main.h; path = ../../d_main.h; sourceTree = SOURCE_ROOT; }; + 1E44AE9B0B67CC8500BAD059 /* d_netfil.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = d_netfil.h; path = ../../d_netfil.h; sourceTree = SOURCE_ROOT; }; + 1E44AE9C0B67CC8500BAD059 /* dehacked.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = dehacked.c; path = ../../dehacked.c; sourceTree = SOURCE_ROOT; }; + 1E44AE9D0B67CC8500BAD059 /* dehacked.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = dehacked.h; path = ../../dehacked.h; sourceTree = SOURCE_ROOT; }; + 1E44AE9E0B67CC8500BAD059 /* doomdata.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = doomdata.h; path = ../../doomdata.h; sourceTree = SOURCE_ROOT; }; + 1E44AE9F0B67CC8500BAD059 /* doomdef.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = doomdef.h; path = ../../doomdef.h; sourceTree = SOURCE_ROOT; }; + 1E44AEA00B67CC8500BAD059 /* doomstat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = doomstat.h; path = ../../doomstat.h; sourceTree = SOURCE_ROOT; }; + 1E44AEA10B67CC8500BAD059 /* doomtype.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = doomtype.h; path = ../../doomtype.h; sourceTree = SOURCE_ROOT; }; + 1E44AEBC0B67CCA900BAD059 /* f_wipe.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = f_wipe.c; path = ../../f_wipe.c; sourceTree = SOURCE_ROOT; }; + 1E44AEBD0B67CCA900BAD059 /* f_finale.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = f_finale.c; path = ../../f_finale.c; sourceTree = SOURCE_ROOT; }; + 1E44AEBE0B67CCA900BAD059 /* f_finale.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = f_finale.h; path = ../../f_finale.h; sourceTree = SOURCE_ROOT; }; + 1E44AEC30B67CCC600BAD059 /* g_game.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = g_game.c; path = ../../g_game.c; sourceTree = SOURCE_ROOT; }; + 1E44AEC40B67CCC600BAD059 /* g_game.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = g_game.h; path = ../../g_game.h; sourceTree = SOURCE_ROOT; }; + 1E44AEC50B67CCC600BAD059 /* g_input.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = g_input.h; path = ../../g_input.h; sourceTree = SOURCE_ROOT; }; + 1E44AEC60B67CCC600BAD059 /* g_state.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = g_state.h; path = ../../g_state.h; sourceTree = SOURCE_ROOT; }; + 1E44AEC70B67CCC600BAD059 /* g_input.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = g_input.c; path = ../../g_input.c; sourceTree = SOURCE_ROOT; }; + 1E44AECE0B67CCEE00BAD059 /* hu_stuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hu_stuff.c; path = ../../hu_stuff.c; sourceTree = SOURCE_ROOT; }; + 1E44AECF0B67CCEE00BAD059 /* hu_stuff.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hu_stuff.h; path = ../../hu_stuff.h; sourceTree = SOURCE_ROOT; }; + 1E44AED30B67CD1200BAD059 /* i_net.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = i_net.h; path = ../../i_net.h; sourceTree = SOURCE_ROOT; }; + 1E44AED40B67CD1200BAD059 /* i_sound.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = i_sound.h; path = ../../i_sound.h; sourceTree = SOURCE_ROOT; }; + 1E44AED50B67CD1200BAD059 /* i_tcp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = i_tcp.c; path = ../../i_tcp.c; sourceTree = SOURCE_ROOT; }; + 1E44AED60B67CD1200BAD059 /* i_tcp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = i_tcp.h; path = ../../i_tcp.h; sourceTree = SOURCE_ROOT; }; + 1E44AED70B67CD1200BAD059 /* i_system.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = i_system.h; path = ../../i_system.h; sourceTree = SOURCE_ROOT; }; + 1E44AED80B67CD1200BAD059 /* i_video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = i_video.h; path = ../../i_video.h; sourceTree = SOURCE_ROOT; }; + 1E44AED90B67CD1300BAD059 /* i_joy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = i_joy.h; path = ../../i_joy.h; sourceTree = SOURCE_ROOT; }; + 1E44AEE10B67CD2B00BAD059 /* am_map.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = am_map.c; path = ../../am_map.c; sourceTree = SOURCE_ROOT; }; + 1E44AEE20B67CD2B00BAD059 /* am_map.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = am_map.h; path = ../../am_map.h; sourceTree = SOURCE_ROOT; }; + 1E44AEE50B67CD3200BAD059 /* byteptr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = byteptr.h; path = ../../byteptr.h; sourceTree = SOURCE_ROOT; }; + 1E44AEE70B67CD3F00BAD059 /* command.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = command.c; path = ../../command.c; sourceTree = SOURCE_ROOT; }; + 1E44AEE80B67CD3F00BAD059 /* command.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = command.h; path = ../../command.h; sourceTree = SOURCE_ROOT; }; + 1E44AEEB0B67CD4400BAD059 /* comptime.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = comptime.c; path = ../../comptime.c; sourceTree = SOURCE_ROOT; }; + 1E44AEED0B67CD5400BAD059 /* console.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = console.c; path = ../../console.c; sourceTree = SOURCE_ROOT; }; + 1E44AEEE0B67CD5400BAD059 /* console.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = console.h; path = ../../console.h; sourceTree = SOURCE_ROOT; }; + 1E44AEF10B67CD7F00BAD059 /* filesrch.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = filesrch.c; path = ../../filesrch.c; sourceTree = SOURCE_ROOT; }; + 1E44AEF20B67CD7F00BAD059 /* filesrch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filesrch.h; path = ../../filesrch.h; sourceTree = SOURCE_ROOT; }; + 1E44AEF50B67CD9F00BAD059 /* keys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = keys.h; path = ../../keys.h; sourceTree = SOURCE_ROOT; }; + 1E44AEF80B67CDE900BAD059 /* m_argv.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_argv.c; path = ../../m_argv.c; sourceTree = SOURCE_ROOT; }; + 1E44AEF90B67CDE900BAD059 /* m_bbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_bbox.h; path = ../../m_bbox.h; sourceTree = SOURCE_ROOT; }; + 1E44AEFA0B67CDE900BAD059 /* m_argv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_argv.h; path = ../../m_argv.h; sourceTree = SOURCE_ROOT; }; + 1E44AEFB0B67CDE900BAD059 /* m_cheat.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_cheat.c; path = ../../m_cheat.c; sourceTree = SOURCE_ROOT; }; + 1E44AEFC0B67CDE900BAD059 /* m_bbox.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_bbox.c; path = ../../m_bbox.c; sourceTree = SOURCE_ROOT; }; + 1E44AEFD0B67CDE900BAD059 /* m_cheat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_cheat.h; path = ../../m_cheat.h; sourceTree = SOURCE_ROOT; }; + 1E44AEFE0B67CDE900BAD059 /* m_fixed.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_fixed.c; path = ../../m_fixed.c; sourceTree = SOURCE_ROOT; }; + 1E44AEFF0B67CDE900BAD059 /* m_fixed.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_fixed.h; path = ../../m_fixed.h; sourceTree = SOURCE_ROOT; }; + 1E44AF000B67CDE900BAD059 /* m_menu.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_menu.c; path = ../../m_menu.c; sourceTree = SOURCE_ROOT; }; + 1E44AF010B67CDE900BAD059 /* m_menu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_menu.h; path = ../../m_menu.h; sourceTree = SOURCE_ROOT; }; + 1E44AF020B67CDE900BAD059 /* m_misc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_misc.c; path = ../../m_misc.c; sourceTree = SOURCE_ROOT; }; + 1E44AF030B67CDE900BAD059 /* m_misc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_misc.h; path = ../../m_misc.h; sourceTree = SOURCE_ROOT; }; + 1E44AF040B67CDE900BAD059 /* m_random.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = m_random.c; path = ../../m_random.c; sourceTree = SOURCE_ROOT; }; + 1E44AF050B67CDE900BAD059 /* m_random.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_random.h; path = ../../m_random.h; sourceTree = SOURCE_ROOT; }; + 1E44AF060B67CDE900BAD059 /* m_swap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = m_swap.h; path = ../../m_swap.h; sourceTree = SOURCE_ROOT; }; + 1E44AF180B67CE2A00BAD059 /* info.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = info.c; path = ../../info.c; sourceTree = SOURCE_ROOT; }; + 1E44AF190B67CE2A00BAD059 /* info.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = info.h; path = ../../info.h; sourceTree = SOURCE_ROOT; }; + 1E44AF1C0B67CE3600BAD059 /* md5.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../md5.c; sourceTree = SOURCE_ROOT; }; + 1E44AF1D0B67CE3600BAD059 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = md5.h; path = ../../md5.h; sourceTree = SOURCE_ROOT; }; + 1E44AF200B67CE4100BAD059 /* mserv.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mserv.c; path = ../../mserv.c; sourceTree = SOURCE_ROOT; }; + 1E44AF210B67CE4100BAD059 /* mserv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = mserv.h; path = ../../mserv.h; sourceTree = SOURCE_ROOT; }; + 1E44AF240B67CE5F00BAD059 /* p_enemy.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_enemy.c; path = ../../p_enemy.c; sourceTree = SOURCE_ROOT; }; + 1E44AF250B67CE5F00BAD059 /* p_inter.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_inter.c; path = ../../p_inter.c; sourceTree = SOURCE_ROOT; }; + 1E44AF260B67CE5F00BAD059 /* p_fab.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_fab.c; path = ../../p_fab.c; sourceTree = SOURCE_ROOT; }; + 1E44AF270B67CE5F00BAD059 /* p_lights.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_lights.c; path = ../../p_lights.c; sourceTree = SOURCE_ROOT; }; + 1E44AF280B67CE5F00BAD059 /* p_map.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_map.c; path = ../../p_map.c; sourceTree = SOURCE_ROOT; }; + 1E44AF290B67CE5F00BAD059 /* p_maputl.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_maputl.c; path = ../../p_maputl.c; sourceTree = SOURCE_ROOT; }; + 1E44AF2A0B67CE5F00BAD059 /* p_maputl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_maputl.h; path = ../../p_maputl.h; sourceTree = SOURCE_ROOT; }; + 1E44AF2B0B67CE5F00BAD059 /* p_mobj.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_mobj.c; path = ../../p_mobj.c; sourceTree = SOURCE_ROOT; }; + 1E44AF2C0B67CE5F00BAD059 /* p_mobj.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_mobj.h; path = ../../p_mobj.h; sourceTree = SOURCE_ROOT; }; + 1E44AF2D0B67CE5F00BAD059 /* p_floor.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_floor.c; path = ../../p_floor.c; sourceTree = SOURCE_ROOT; }; + 1E44AF2E0B67CE5F00BAD059 /* p_local.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_local.h; path = ../../p_local.h; sourceTree = SOURCE_ROOT; }; + 1E44AF2F0B67CE5F00BAD059 /* p_pspr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_pspr.h; path = ../../p_pspr.h; sourceTree = SOURCE_ROOT; }; + 1E44AF300B67CE5F00BAD059 /* p_saveg.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_saveg.c; path = ../../p_saveg.c; sourceTree = SOURCE_ROOT; }; + 1E44AF310B67CE5F00BAD059 /* p_saveg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_saveg.h; path = ../../p_saveg.h; sourceTree = SOURCE_ROOT; }; + 1E44AF320B67CE5F00BAD059 /* p_setup.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_setup.c; path = ../../p_setup.c; sourceTree = SOURCE_ROOT; }; + 1E44AF330B67CE5F00BAD059 /* p_setup.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_setup.h; path = ../../p_setup.h; sourceTree = SOURCE_ROOT; }; + 1E44AF340B67CE5F00BAD059 /* p_sight.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_sight.c; path = ../../p_sight.c; sourceTree = SOURCE_ROOT; }; + 1E44AF350B67CE5F00BAD059 /* p_spec.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_spec.c; path = ../../p_spec.c; sourceTree = SOURCE_ROOT; }; + 1E44AF360B67CE5F00BAD059 /* p_spec.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_spec.h; path = ../../p_spec.h; sourceTree = SOURCE_ROOT; }; + 1E44AF370B67CE5F00BAD059 /* p_telept.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_telept.c; path = ../../p_telept.c; sourceTree = SOURCE_ROOT; }; + 1E44AF380B67CE5F00BAD059 /* p_tick.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_tick.c; path = ../../p_tick.c; sourceTree = SOURCE_ROOT; }; + 1E44AF390B67CE5F00BAD059 /* p_tick.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = p_tick.h; path = ../../p_tick.h; sourceTree = SOURCE_ROOT; }; + 1E44AF3A0B67CE5F00BAD059 /* p_user.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_user.c; path = ../../p_user.c; sourceTree = SOURCE_ROOT; }; + 1E44AF3B0B67CE5F00BAD059 /* p_ceilng.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = p_ceilng.c; path = ../../p_ceilng.c; sourceTree = SOURCE_ROOT; }; + 1E44AF550B67CEC100BAD059 /* r_bsp.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_bsp.c; path = ../../r_bsp.c; sourceTree = SOURCE_ROOT; }; + 1E44AF560B67CEC100BAD059 /* r_bsp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_bsp.h; path = ../../r_bsp.h; sourceTree = SOURCE_ROOT; }; + 1E44AF570B67CEC100BAD059 /* r_defs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_defs.h; path = ../../r_defs.h; sourceTree = SOURCE_ROOT; }; + 1E44AF580B67CEC100BAD059 /* r_data.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_data.c; path = ../../r_data.c; sourceTree = SOURCE_ROOT; }; + 1E44AF590B67CEC100BAD059 /* r_draw.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_draw.c; path = ../../r_draw.c; sourceTree = SOURCE_ROOT; }; + 1E44AF5A0B67CEC100BAD059 /* r_draw16.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_draw16.c; path = ../../r_draw16.c; sourceTree = SOURCE_ROOT; }; + 1E44AF5B0B67CEC100BAD059 /* r_draw8.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_draw8.c; path = ../../r_draw8.c; sourceTree = SOURCE_ROOT; }; + 1E44AF5C0B67CEC100BAD059 /* r_main.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_main.c; path = ../../r_main.c; sourceTree = SOURCE_ROOT; }; + 1E44AF5D0B67CEC100BAD059 /* r_main.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_main.h; path = ../../r_main.h; sourceTree = SOURCE_ROOT; }; + 1E44AF5E0B67CEC100BAD059 /* r_data.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_data.h; path = ../../r_data.h; sourceTree = SOURCE_ROOT; }; + 1E44AF5F0B67CEC100BAD059 /* r_draw.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_draw.h; path = ../../r_draw.h; sourceTree = SOURCE_ROOT; }; + 1E44AF600B67CEC100BAD059 /* r_local.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_local.h; path = ../../r_local.h; sourceTree = SOURCE_ROOT; }; + 1E44AF610B67CEC100BAD059 /* r_plane.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_plane.c; path = ../../r_plane.c; sourceTree = SOURCE_ROOT; }; + 1E44AF620B67CEC100BAD059 /* r_plane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_plane.h; path = ../../r_plane.h; sourceTree = SOURCE_ROOT; }; + 1E44AF630B67CEC100BAD059 /* r_segs.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_segs.c; path = ../../r_segs.c; sourceTree = SOURCE_ROOT; }; + 1E44AF640B67CEC100BAD059 /* r_segs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_segs.h; path = ../../r_segs.h; sourceTree = SOURCE_ROOT; }; + 1E44AF650B67CEC200BAD059 /* r_sky.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_sky.c; path = ../../r_sky.c; sourceTree = SOURCE_ROOT; }; + 1E44AF660B67CEC200BAD059 /* r_sky.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_sky.h; path = ../../r_sky.h; sourceTree = SOURCE_ROOT; }; + 1E44AF670B67CEC200BAD059 /* r_splats.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_splats.c; path = ../../r_splats.c; sourceTree = SOURCE_ROOT; }; + 1E44AF680B67CEC200BAD059 /* r_splats.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_splats.h; path = ../../r_splats.h; sourceTree = SOURCE_ROOT; }; + 1E44AF690B67CEC200BAD059 /* r_state.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_state.h; path = ../../r_state.h; sourceTree = SOURCE_ROOT; }; + 1E44AF6A0B67CEC200BAD059 /* r_things.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_things.c; path = ../../r_things.c; sourceTree = SOURCE_ROOT; }; + 1E44AF6B0B67CEC200BAD059 /* r_things.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = r_things.h; path = ../../r_things.h; sourceTree = SOURCE_ROOT; }; + 1E44AF850B67CEE000BAD059 /* s_sound.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = s_sound.c; path = ../../s_sound.c; sourceTree = SOURCE_ROOT; }; + 1E44AF860B67CEE000BAD059 /* s_sound.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = s_sound.h; path = ../../s_sound.h; sourceTree = SOURCE_ROOT; }; + 1E44AF890B67CEE900BAD059 /* screen.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = screen.c; path = ../../screen.c; sourceTree = SOURCE_ROOT; }; + 1E44AF8A0B67CEE900BAD059 /* screen.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = screen.h; path = ../../screen.h; sourceTree = SOURCE_ROOT; }; + 1E44AF8D0B67CEF000BAD059 /* sounds.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = sounds.c; path = ../../sounds.c; sourceTree = SOURCE_ROOT; }; + 1E44AF8E0B67CEF000BAD059 /* sounds.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sounds.h; path = ../../sounds.h; sourceTree = SOURCE_ROOT; }; + 1E44AF910B67CEFF00BAD059 /* st_stuff.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = st_stuff.c; path = ../../st_stuff.c; sourceTree = SOURCE_ROOT; }; + 1E44AF920B67CEFF00BAD059 /* st_stuff.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = st_stuff.h; path = ../../st_stuff.h; sourceTree = SOURCE_ROOT; }; + 1E44AF950B67CF1300BAD059 /* string.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = string.c; path = ../../string.c; sourceTree = SOURCE_ROOT; }; + 1E44AF990B67CF2E00BAD059 /* tables.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = tables.c; path = ../../tables.c; sourceTree = SOURCE_ROOT; }; + 1E44AF9A0B67CF2E00BAD059 /* tables.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = tables.h; path = ../../tables.h; sourceTree = SOURCE_ROOT; }; + 1E44AF9D0B67CF3D00BAD059 /* tmap.nas */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = tmap.nas; path = ../../tmap.nas; sourceTree = SOURCE_ROOT; }; + 1E44AF9F0B67CF4900BAD059 /* tmap_mmx.nas */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = tmap_mmx.nas; path = ../../tmap_mmx.nas; sourceTree = SOURCE_ROOT; }; + 1E44AFA00B67CF4900BAD059 /* tmap_vc.nas */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = tmap_vc.nas; path = ../../tmap_vc.nas; sourceTree = SOURCE_ROOT; }; + 1E44AFA30B67CF5D00BAD059 /* v_video.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = v_video.c; path = ../../v_video.c; sourceTree = SOURCE_ROOT; }; + 1E44AFA40B67CF5D00BAD059 /* v_video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = v_video.h; path = ../../v_video.h; sourceTree = SOURCE_ROOT; }; + 1E44AFA70B67CF6400BAD059 /* w_wad.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = w_wad.c; path = ../../w_wad.c; sourceTree = SOURCE_ROOT; }; + 1E44AFA80B67CF6400BAD059 /* w_wad.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = w_wad.h; path = ../../w_wad.h; sourceTree = SOURCE_ROOT; }; + 1E44AFAB0B67CF6F00BAD059 /* y_inter.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = y_inter.c; path = ../../y_inter.c; sourceTree = SOURCE_ROOT; }; + 1E44AFAC0B67CF6F00BAD059 /* y_inter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = y_inter.h; path = ../../y_inter.h; sourceTree = SOURCE_ROOT; }; + 1E44AFAF0B67CF7A00BAD059 /* z_zone.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = z_zone.c; path = ../../z_zone.c; sourceTree = SOURCE_ROOT; }; + 1E44AFB00B67CF7A00BAD059 /* z_zone.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = z_zone.h; path = ../../z_zone.h; sourceTree = SOURCE_ROOT; }; + 1E44AFB40B67CFDC00BAD059 /* dosstr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = dosstr.c; path = ../dosstr.c; sourceTree = SOURCE_ROOT; }; + 1E44AFB50B67CFDC00BAD059 /* endtxt.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = endtxt.c; path = ../endtxt.c; sourceTree = SOURCE_ROOT; }; + 1E44AFB60B67CFDC00BAD059 /* endtxt.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = endtxt.h; path = ../endtxt.h; sourceTree = SOURCE_ROOT; }; + 1E44AFB70B67CFDC00BAD059 /* hwsym_sdl.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hwsym_sdl.c; path = ../hwsym_sdl.c; sourceTree = SOURCE_ROOT; }; + 1E44AFB80B67CFDC00BAD059 /* hwsym_sdl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hwsym_sdl.h; path = ../hwsym_sdl.h; sourceTree = SOURCE_ROOT; }; + 1E44AFB90B67CFDC00BAD059 /* i_cdmus.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = i_cdmus.c; path = ../i_cdmus.c; sourceTree = SOURCE_ROOT; }; + 1E44AFBA0B67CFDC00BAD059 /* i_main.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = i_main.c; path = ../i_main.c; sourceTree = SOURCE_ROOT; }; + 1E44AFBB0B67CFDC00BAD059 /* i_net.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = i_net.c; path = ../i_net.c; sourceTree = SOURCE_ROOT; }; + 1E44AFBD0B67CFDC00BAD059 /* i_system.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = i_system.c; path = ../i_system.c; sourceTree = SOURCE_ROOT; }; + 1E44AFBE0B67CFDC00BAD059 /* i_video.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = i_video.c; path = ../i_video.c; sourceTree = SOURCE_ROOT; }; + 1E44AFBF0B67CFDC00BAD059 /* IMG_xpm.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = IMG_xpm.c; path = ../IMG_xpm.c; sourceTree = SOURCE_ROOT; }; + 1E44AFC00B67CFDC00BAD059 /* ogl_sdl.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ogl_sdl.c; path = ../ogl_sdl.c; sourceTree = SOURCE_ROOT; }; + 1E44AFC10B67CFDC00BAD059 /* ogl_sdl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ogl_sdl.h; path = ../ogl_sdl.h; sourceTree = SOURCE_ROOT; }; + 1E44AFC20B67CFDC00BAD059 /* SDL_icon.xpm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = SDL_icon.xpm; path = ../SDL_icon.xpm; sourceTree = SOURCE_ROOT; }; + 1E44AFC30B67CFDC00BAD059 /* sdlmain.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sdlmain.h; path = ../sdlmain.h; sourceTree = SOURCE_ROOT; }; + 1E44AFD50B67D03100BAD059 /* filters.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = filters.c; path = ../filter/filters.c; sourceTree = SOURCE_ROOT; }; + 1E44AFD60B67D03100BAD059 /* filters.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filters.h; path = ../filter/filters.h; sourceTree = SOURCE_ROOT; }; + 1E44AFD70B67D03100BAD059 /* hq2x.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hq2x.c; path = ../filter/hq2x.c; sourceTree = SOURCE_ROOT; }; + 1E44AFD80B67D03100BAD059 /* hq2x.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hq2x.h; path = ../filter/hq2x.h; sourceTree = SOURCE_ROOT; }; + 1E44AFD90B67D03100BAD059 /* interp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = interp.h; path = ../filter/interp.h; sourceTree = SOURCE_ROOT; }; + 1E44AFDA0B67D03100BAD059 /* lq2x.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lq2x.c; path = ../filter/lq2x.c; sourceTree = SOURCE_ROOT; }; + 1E44AFDB0B67D03100BAD059 /* lq2x.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lq2x.h; path = ../filter/lq2x.h; sourceTree = SOURCE_ROOT; }; + 1E44AFDC0B67D03100BAD059 /* main.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = main.c; path = ../filter/main.c; sourceTree = SOURCE_ROOT; }; + 1E44AFE60B67D06200BAD059 /* mac_alert.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = mac_alert.h; sourceTree = SOURCE_ROOT; }; + 1E44AFE70B67D06200BAD059 /* Srb2mac.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Srb2mac.icns; sourceTree = SOURCE_ROOT; }; + 1E44AFE80B67D06200BAD059 /* mac_alert.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = mac_alert.c; sourceTree = SOURCE_ROOT; }; + 1E44AFEC0B67D0AB00BAD059 /* r_opengl.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = r_opengl.c; path = ../../hardware/r_opengl/r_opengl.c; sourceTree = SOURCE_ROOT; }; + 1E44B0560B67D81E00BAD059 /* SDL_macosx_main.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SDL_macosx_main.h; path = ../SDL_main/SDL_macosx_main.h; sourceTree = SOURCE_ROOT; }; + 1E44B0570B67D81E00BAD059 /* SDL_macosx_main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = SDL_macosx_main.m; path = ../SDL_main/SDL_macosx_main.m; sourceTree = SOURCE_ROOT; }; + 1E44B2240B67EADE00BAD059 /* lzf.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = lzf.c; path = ../../lzf.c; sourceTree = SOURCE_ROOT; }; + 1E44B2250B67EADE00BAD059 /* lzf.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lzf.h; path = ../../lzf.h; sourceTree = SOURCE_ROOT; }; + 1E66921B0B690C5B00B7313A /* SDL_mixer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL_mixer.framework; path = /Library/Frameworks/SDL_mixer.framework; sourceTree = "<absolute>"; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; + 67259DFA18D2687D00F02971 /* lua_hud.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lua_hud.h; path = ../../lua_hud.h; sourceTree = SOURCE_ROOT; }; + 67259DFB18D2687D00F02971 /* lua_hudlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_hudlib.c; path = ../../lua_hudlib.c; sourceTree = SOURCE_ROOT; }; + 67259DFC18D2687D00F02971 /* lua_skinlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_skinlib.c; path = ../../lua_skinlib.c; sourceTree = SOURCE_ROOT; }; + 67259DFF18D268AE00F02971 /* m_anigif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = m_anigif.c; path = ../../m_anigif.c; sourceTree = SOURCE_ROOT; }; + 67259E0018D268AE00F02971 /* m_anigif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = m_anigif.h; path = ../../m_anigif.h; sourceTree = SOURCE_ROOT; }; + 67259E0218D268F600F02971 /* i_ttf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = i_ttf.c; path = ../i_ttf.c; sourceTree = SOURCE_ROOT; }; + 67259E0318D268F600F02971 /* i_ttf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = i_ttf.h; path = ../i_ttf.h; sourceTree = SOURCE_ROOT; }; + 67259E0418D268F600F02971 /* mixer_sound.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mixer_sound.c; path = ../mixer_sound.c; sourceTree = SOURCE_ROOT; }; + 67259E0518D268F600F02971 /* sdl_sound.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sdl_sound.c; path = ../sdl_sound.c; sourceTree = SOURCE_ROOT; }; + 67259E2B18D26D5700F02971 /* patch.dta */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = patch.dta; path = ../../../bin/Resources/patch.dta; sourceTree = SOURCE_ROOT; }; + 67259E2C18D26D5700F02971 /* rings.dta */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rings.dta; path = ../../../bin/Resources/rings.dta; sourceTree = SOURCE_ROOT; }; + 67259E2D18D26D5700F02971 /* srb2.srb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = srb2.srb; path = ../../../bin/Resources/srb2.srb; sourceTree = SOURCE_ROOT; }; + 6766C0AE11B057E50065F389 /* zones.dta */ = {isa = PBXFileReference; lastKnownFileType = text; name = zones.dta; path = ../../../bin/Resources/zones.dta; sourceTree = SOURCE_ROOT; }; + 676BB51C0E0DE06100C95963 /* m_queue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = m_queue.c; path = ../../m_queue.c; sourceTree = SOURCE_ROOT; }; + 676BB51D0E0DE06100C95963 /* m_queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = m_queue.h; path = ../../m_queue.h; sourceTree = SOURCE_ROOT; }; + 676BB51E0E0DE06100C95963 /* p_polyobj.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = p_polyobj.c; path = ../../p_polyobj.c; sourceTree = SOURCE_ROOT; }; + 676BB51F0E0DE06100C95963 /* p_polyobj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = p_polyobj.h; path = ../../p_polyobj.h; sourceTree = SOURCE_ROOT; }; + 67A1F91813FAD026009FA3E5 /* player.dta */ = {isa = PBXFileReference; lastKnownFileType = text; name = player.dta; path = ../../../bin/Resources/player.dta; sourceTree = SOURCE_ROOT; }; + 67B2071C1180FA8200E93654 /* vid_copy.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = vid_copy.s; path = ../../vid_copy.s; sourceTree = SOURCE_ROOT; }; + 67B83BCB14F57EAB00AAAE4E /* lapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lapi.c; path = ../../blua/lapi.c; sourceTree = SOURCE_ROOT; }; + 67B83BCC14F57EAB00AAAE4E /* lapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lapi.h; path = ../../blua/lapi.h; sourceTree = SOURCE_ROOT; }; + 67B83BCD14F57EAB00AAAE4E /* lauxlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lauxlib.c; path = ../../blua/lauxlib.c; sourceTree = SOURCE_ROOT; }; + 67B83BCE14F57EAB00AAAE4E /* lauxlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lauxlib.h; path = ../../blua/lauxlib.h; sourceTree = SOURCE_ROOT; }; + 67B83BCF14F57EAB00AAAE4E /* lbaselib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lbaselib.c; path = ../../blua/lbaselib.c; sourceTree = SOURCE_ROOT; }; + 67B83BD014F57EAB00AAAE4E /* lcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lcode.c; path = ../../blua/lcode.c; sourceTree = SOURCE_ROOT; }; + 67B83BD114F57EAB00AAAE4E /* lcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lcode.h; path = ../../blua/lcode.h; sourceTree = SOURCE_ROOT; }; + 67B83BD214F57EAB00AAAE4E /* ldebug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldebug.c; path = ../../blua/ldebug.c; sourceTree = SOURCE_ROOT; }; + 67B83BD314F57EAB00AAAE4E /* ldebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ldebug.h; path = ../../blua/ldebug.h; sourceTree = SOURCE_ROOT; }; + 67B83BD414F57EAB00AAAE4E /* ldo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldo.c; path = ../../blua/ldo.c; sourceTree = SOURCE_ROOT; }; + 67B83BD514F57EAB00AAAE4E /* ldo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ldo.h; path = ../../blua/ldo.h; sourceTree = SOURCE_ROOT; }; + 67B83BD614F57EAB00AAAE4E /* ldump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ldump.c; path = ../../blua/ldump.c; sourceTree = SOURCE_ROOT; }; + 67B83BD714F57EAB00AAAE4E /* lfunc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lfunc.c; path = ../../blua/lfunc.c; sourceTree = SOURCE_ROOT; }; + 67B83BD814F57EAB00AAAE4E /* lfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lfunc.h; path = ../../blua/lfunc.h; sourceTree = SOURCE_ROOT; }; + 67B83BD914F57EAB00AAAE4E /* lgc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lgc.c; path = ../../blua/lgc.c; sourceTree = SOURCE_ROOT; }; + 67B83BDA14F57EAB00AAAE4E /* lgc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lgc.h; path = ../../blua/lgc.h; sourceTree = SOURCE_ROOT; }; + 67B83BDB14F57EAB00AAAE4E /* linit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = linit.c; path = ../../blua/linit.c; sourceTree = SOURCE_ROOT; }; + 67B83BDC14F57EAB00AAAE4E /* llex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = llex.c; path = ../../blua/llex.c; sourceTree = SOURCE_ROOT; }; + 67B83BDD14F57EAB00AAAE4E /* llex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = llex.h; path = ../../blua/llex.h; sourceTree = SOURCE_ROOT; }; + 67B83BDE14F57EAB00AAAE4E /* llimits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = llimits.h; path = ../../blua/llimits.h; sourceTree = SOURCE_ROOT; }; + 67B83BDF14F57EAB00AAAE4E /* lmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lmem.c; path = ../../blua/lmem.c; sourceTree = SOURCE_ROOT; }; + 67B83BE014F57EAB00AAAE4E /* lmem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lmem.h; path = ../../blua/lmem.h; sourceTree = SOURCE_ROOT; }; + 67B83BE114F57EAB00AAAE4E /* lobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lobject.c; path = ../../blua/lobject.c; sourceTree = SOURCE_ROOT; }; + 67B83BE214F57EAB00AAAE4E /* lobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lobject.h; path = ../../blua/lobject.h; sourceTree = SOURCE_ROOT; }; + 67B83BE314F57EAB00AAAE4E /* lopcodes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lopcodes.c; path = ../../blua/lopcodes.c; sourceTree = SOURCE_ROOT; }; + 67B83BE414F57EAB00AAAE4E /* lopcodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lopcodes.h; path = ../../blua/lopcodes.h; sourceTree = SOURCE_ROOT; }; + 67B83BE514F57EAB00AAAE4E /* lparser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lparser.c; path = ../../blua/lparser.c; sourceTree = SOURCE_ROOT; }; + 67B83BE614F57EAB00AAAE4E /* lparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lparser.h; path = ../../blua/lparser.h; sourceTree = SOURCE_ROOT; }; + 67B83BE714F57EAB00AAAE4E /* lstate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstate.c; path = ../../blua/lstate.c; sourceTree = SOURCE_ROOT; }; + 67B83BE814F57EAB00AAAE4E /* lstate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lstate.h; path = ../../blua/lstate.h; sourceTree = SOURCE_ROOT; }; + 67B83BE914F57EAB00AAAE4E /* lstring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstring.c; path = ../../blua/lstring.c; sourceTree = SOURCE_ROOT; }; + 67B83BEA14F57EAB00AAAE4E /* lstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lstring.h; path = ../../blua/lstring.h; sourceTree = SOURCE_ROOT; }; + 67B83BEB14F57EAB00AAAE4E /* lstrlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lstrlib.c; path = ../../blua/lstrlib.c; sourceTree = SOURCE_ROOT; }; + 67B83BEC14F57EAB00AAAE4E /* ltable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltable.c; path = ../../blua/ltable.c; sourceTree = SOURCE_ROOT; }; + 67B83BED14F57EAB00AAAE4E /* ltable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ltable.h; path = ../../blua/ltable.h; sourceTree = SOURCE_ROOT; }; + 67B83BEE14F57EAB00AAAE4E /* ltablib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltablib.c; path = ../../blua/ltablib.c; sourceTree = SOURCE_ROOT; }; + 67B83BEF14F57EAB00AAAE4E /* ltm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ltm.c; path = ../../blua/ltm.c; sourceTree = SOURCE_ROOT; }; + 67B83BF014F57EAB00AAAE4E /* ltm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ltm.h; path = ../../blua/ltm.h; sourceTree = SOURCE_ROOT; }; + 67B83BF114F57EAB00AAAE4E /* lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lua.h; path = ../../blua/lua.h; sourceTree = SOURCE_ROOT; }; + 67B83BF214F57EAB00AAAE4E /* luaconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = luaconf.h; path = ../../blua/luaconf.h; sourceTree = SOURCE_ROOT; }; + 67B83BF314F57EAB00AAAE4E /* lualib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lualib.h; path = ../../blua/lualib.h; sourceTree = SOURCE_ROOT; }; + 67B83BF414F57EAB00AAAE4E /* lundump.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lundump.c; path = ../../blua/lundump.c; sourceTree = SOURCE_ROOT; }; + 67B83BF514F57EAB00AAAE4E /* lundump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lundump.h; path = ../../blua/lundump.h; sourceTree = SOURCE_ROOT; }; + 67B83BF614F57EAB00AAAE4E /* lvm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lvm.c; path = ../../blua/lvm.c; sourceTree = SOURCE_ROOT; }; + 67B83BF714F57EAB00AAAE4E /* lvm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lvm.h; path = ../../blua/lvm.h; sourceTree = SOURCE_ROOT; }; + 67B83BF814F57EAB00AAAE4E /* lzio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lzio.c; path = ../../blua/lzio.c; sourceTree = SOURCE_ROOT; }; + 67B83BF914F57EAB00AAAE4E /* lzio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lzio.h; path = ../../blua/lzio.h; sourceTree = SOURCE_ROOT; }; + 67B83C1214F57ECA00AAAE4E /* b_bot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = b_bot.c; path = ../../b_bot.c; sourceTree = SOURCE_ROOT; }; + 67B83C1314F57ECA00AAAE4E /* b_bot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = b_bot.h; path = ../../b_bot.h; sourceTree = SOURCE_ROOT; }; + 67B83C1514F57EE600AAAE4E /* lua_baselib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_baselib.c; path = ../../lua_baselib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1614F57EE600AAAE4E /* lua_consolelib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_consolelib.c; path = ../../lua_consolelib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1714F57EE600AAAE4E /* lua_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lua_hook.h; path = ../../lua_hook.h; sourceTree = SOURCE_ROOT; }; + 67B83C1814F57EE600AAAE4E /* lua_hooklib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_hooklib.c; path = ../../lua_hooklib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1914F57EE600AAAE4E /* lua_infolib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_infolib.c; path = ../../lua_infolib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1A14F57EE600AAAE4E /* lua_libs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lua_libs.h; path = ../../lua_libs.h; sourceTree = SOURCE_ROOT; }; + 67B83C1B14F57EE600AAAE4E /* lua_maplib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_maplib.c; path = ../../lua_maplib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1C14F57EE600AAAE4E /* lua_mathlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_mathlib.c; path = ../../lua_mathlib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1D14F57EE600AAAE4E /* lua_mobjlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_mobjlib.c; path = ../../lua_mobjlib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1E14F57EE600AAAE4E /* lua_playerlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_playerlib.c; path = ../../lua_playerlib.c; sourceTree = SOURCE_ROOT; }; + 67B83C1F14F57EE600AAAE4E /* lua_script.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_script.c; path = ../../lua_script.c; sourceTree = SOURCE_ROOT; }; + 67B83C2014F57EE600AAAE4E /* lua_script.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lua_script.h; path = ../../lua_script.h; sourceTree = SOURCE_ROOT; }; + 67B83C2114F57EE600AAAE4E /* lua_thinkerlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lua_thinkerlib.c; path = ../../lua_thinkerlib.c; sourceTree = SOURCE_ROOT; }; + 67B83C2C14F57F1500AAAE4E /* fastcmp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fastcmp.h; path = ../../fastcmp.h; sourceTree = SOURCE_ROOT; }; + 67B83C2D14F57F1500AAAE4E /* i_addrinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = i_addrinfo.c; path = ../../i_addrinfo.c; sourceTree = SOURCE_ROOT; }; + 67B83C2E14F57F1500AAAE4E /* i_addrinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = i_addrinfo.h; path = ../../i_addrinfo.h; sourceTree = SOURCE_ROOT; }; + 67B83C2F14F57F1500AAAE4E /* m_cond.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = m_cond.c; path = ../../m_cond.c; sourceTree = SOURCE_ROOT; }; + 67B83C3014F57F1500AAAE4E /* m_cond.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = m_cond.h; path = ../../m_cond.h; sourceTree = SOURCE_ROOT; }; + 67B83C3114F57F1500AAAE4E /* m_dllist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = m_dllist.h; path = ../../m_dllist.h; sourceTree = SOURCE_ROOT; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; + 8D1107320486CEB800E47090 /* Srb2mac.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Srb2mac.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D11072E0486CEB800E47090 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 002F39FA09D0881F00EBEB88 /* SDL.framework in Frameworks */, + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + 1E66921C0B690C5B00B7313A /* SDL_mixer.framework in Frameworks */, + 1E32C4290B6E6D5D0029E058 /* libpng.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + 1E44AE890B67CC4E00BAD059 /* A_Asm */, + 67B83BCA14F57DD400AAAE4E /* B_Bot */, + 67B83BC914F57D7F00AAAE4E /* BLUA */, + 1E44AE8C0B67CC6500BAD059 /* D_Doom */, + 1E44AEBB0B67CC9800BAD059 /* F_Frame */, + 1E44AEC20B67CCB500BAD059 /* G_Game */, + 1E44AECD0B67CCD200BAD059 /* H_Hud */, + 1E44AE5C0B67CC0F00BAD059 /* Hw_Hardware */, + 1E44AED20B67CCF600BAD059 /* I_Interface */, + 67B83BC814F57D6E00AAAE4E /* LUA */, + 1E44AEF70B67CDA900BAD059 /* M_Misc */, + 1E44AF160B67CDFB00BAD059 /* P_Play */, + 1E44AF540B67CE8C00BAD059 /* R_Render */, + 1E44AF830B67CEC900BAD059 /* S_Sound */, + 1E44AF170B67CE1000BAD059 /* W_Wad */, + ); + name = Classes; + sourceTree = "<group>"; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1E32C4140B6E6D5D0029E058 /* libpng.framework */, + 1E66921B0B690C5B00B7313A /* SDL_mixer.framework */, + 002F39F909D0881F00EBEB88 /* SDL.framework */, + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = "<group>"; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = "<group>"; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D1107320486CEB800E47090 /* Srb2mac.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + 1E44AE5C0B67CC0F00BAD059 /* Hw_Hardware */ = { + isa = PBXGroup; + children = ( + 1E44AE600B67CC2B00BAD059 /* hw3dsdrv.h */, + 1E44AE610B67CC2B00BAD059 /* hw_bsp.c */, + 1E44AE620B67CC2B00BAD059 /* hw_defs.h */, + 1E44AE630B67CC2B00BAD059 /* hw3sound.c */, + 1E44AE640B67CC2B00BAD059 /* hw_cache.c */, + 1E44AE650B67CC2B00BAD059 /* hw_dll.h */, + 1E44AE660B67CC2B00BAD059 /* hw_drv.h */, + 1E44AE670B67CC2B00BAD059 /* hw_glide.h */, + 1E44AE680B67CC2B00BAD059 /* hw_light.c */, + 1E44AE690B67CC2B00BAD059 /* hw_light.h */, + 1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */, + 1E44AE6B0B67CC2B00BAD059 /* hw_data.h */, + 1E44AE6C0B67CC2B00BAD059 /* hw_draw.c */, + 1E44AE6D0B67CC2B00BAD059 /* hw_glob.h */, + 1E44AE6E0B67CC2B00BAD059 /* hw_main.c */, + 1E44AE6F0B67CC2B00BAD059 /* hw_main.h */, + 1E44AE700B67CC2B00BAD059 /* hw_md2.c */, + 1E44AE710B67CC2B00BAD059 /* hw_md2.h */, + 1E44AE720B67CC2B00BAD059 /* hw_trick.c */, + 1E44AE730B67CC2B00BAD059 /* hws_data.h */, + ); + name = Hw_Hardware; + sourceTree = "<group>"; + }; + 1E44AE890B67CC4E00BAD059 /* A_Asm */ = { + isa = PBXGroup; + children = ( + 67B2071C1180FA8200E93654 /* vid_copy.s */, + 1E44AE8A0B67CC6000BAD059 /* asm_defs.inc */, + 1E44AF9D0B67CF3D00BAD059 /* tmap.nas */, + 1E44AF9F0B67CF4900BAD059 /* tmap_mmx.nas */, + 1E44AFA00B67CF4900BAD059 /* tmap_vc.nas */, + ); + name = A_Asm; + sourceTree = "<group>"; + }; + 1E44AE8C0B67CC6500BAD059 /* D_Doom */ = { + isa = PBXGroup; + children = ( + 1E44AEEB0B67CD4400BAD059 /* comptime.c */, + 1E44AE8D0B67CC8400BAD059 /* d_clisrv.c */, + 1E44AE8E0B67CC8400BAD059 /* d_clisrv.h */, + 1E44AE8F0B67CC8400BAD059 /* d_event.h */, + 1E44AE900B67CC8400BAD059 /* d_main.c */, + 1E44AE910B67CC8500BAD059 /* d_net.c */, + 1E44AE920B67CC8500BAD059 /* d_net.h */, + 1E44AE930B67CC8500BAD059 /* d_netcmd.h */, + 1E44AE940B67CC8500BAD059 /* d_netfil.c */, + 1E44AE950B67CC8500BAD059 /* d_player.h */, + 1E44AE960B67CC8500BAD059 /* d_think.h */, + 1E44AE980B67CC8500BAD059 /* d_netcmd.c */, + 1E44AE990B67CC8500BAD059 /* d_ticcmd.h */, + 1E44AE9A0B67CC8500BAD059 /* d_main.h */, + 1E44AE9B0B67CC8500BAD059 /* d_netfil.h */, + 1E44AE9C0B67CC8500BAD059 /* dehacked.c */, + 1E44AE9D0B67CC8500BAD059 /* dehacked.h */, + 1E44AE9E0B67CC8500BAD059 /* doomdata.h */, + 1E44AE9F0B67CC8500BAD059 /* doomdef.h */, + 1E44AEA00B67CC8500BAD059 /* doomstat.h */, + 1E44AEA10B67CC8500BAD059 /* doomtype.h */, + 1E44AFAF0B67CF7A00BAD059 /* z_zone.c */, + 1E44AFB00B67CF7A00BAD059 /* z_zone.h */, + ); + name = D_Doom; + sourceTree = "<group>"; + }; + 1E44AEBB0B67CC9800BAD059 /* F_Frame */ = { + isa = PBXGroup; + children = ( + 1E44AEBC0B67CCA900BAD059 /* f_wipe.c */, + 1E44AEBD0B67CCA900BAD059 /* f_finale.c */, + 1E44AEBE0B67CCA900BAD059 /* f_finale.h */, + 1E44AFAB0B67CF6F00BAD059 /* y_inter.c */, + 1E44AFAC0B67CF6F00BAD059 /* y_inter.h */, + ); + name = F_Frame; + sourceTree = "<group>"; + }; + 1E44AEC20B67CCB500BAD059 /* G_Game */ = { + isa = PBXGroup; + children = ( + 1E44AEC30B67CCC600BAD059 /* g_game.c */, + 1E44AEC40B67CCC600BAD059 /* g_game.h */, + 1E44AEC50B67CCC600BAD059 /* g_input.h */, + 1E44AEC60B67CCC600BAD059 /* g_state.h */, + 1E44AEC70B67CCC600BAD059 /* g_input.c */, + ); + name = G_Game; + sourceTree = "<group>"; + }; + 1E44AECD0B67CCD200BAD059 /* H_Hud */ = { + isa = PBXGroup; + children = ( + 1E44AEE10B67CD2B00BAD059 /* am_map.c */, + 1E44AEE20B67CD2B00BAD059 /* am_map.h */, + 1E44AEE70B67CD3F00BAD059 /* command.c */, + 1E44AEE80B67CD3F00BAD059 /* command.h */, + 1E44AEED0B67CD5400BAD059 /* console.c */, + 1E44AEEE0B67CD5400BAD059 /* console.h */, + 1E44AECE0B67CCEE00BAD059 /* hu_stuff.c */, + 1E44AECF0B67CCEE00BAD059 /* hu_stuff.h */, + 1E44AF000B67CDE900BAD059 /* m_menu.c */, + 1E44AF010B67CDE900BAD059 /* m_menu.h */, + 1E44AF910B67CEFF00BAD059 /* st_stuff.c */, + 1E44AF920B67CEFF00BAD059 /* st_stuff.h */, + ); + name = H_Hud; + sourceTree = "<group>"; + }; + 1E44AED20B67CCF600BAD059 /* I_Interface */ = { + isa = PBXGroup; + children = ( + 67259E0218D268F600F02971 /* i_ttf.c */, + 67259E0318D268F600F02971 /* i_ttf.h */, + 67259E0418D268F600F02971 /* mixer_sound.c */, + 67259E0518D268F600F02971 /* sdl_sound.c */, + 1E44AFB30B67CF8500BAD059 /* SDL */, + 67B83C2D14F57F1500AAAE4E /* i_addrinfo.c */, + 67B83C2E14F57F1500AAAE4E /* i_addrinfo.h */, + 1E44AEE50B67CD3200BAD059 /* byteptr.h */, + 1E44AEF10B67CD7F00BAD059 /* filesrch.c */, + 1E44AEF20B67CD7F00BAD059 /* filesrch.h */, + 1E44AED30B67CD1200BAD059 /* i_net.h */, + 1E44AED40B67CD1200BAD059 /* i_sound.h */, + 1E44AED50B67CD1200BAD059 /* i_tcp.c */, + 1E44AED60B67CD1200BAD059 /* i_tcp.h */, + 1E44AED70B67CD1200BAD059 /* i_system.h */, + 1E44AED80B67CD1200BAD059 /* i_video.h */, + 1E44AED90B67CD1300BAD059 /* i_joy.h */, + 1E44AEF50B67CD9F00BAD059 /* keys.h */, + 1E44AF200B67CE4100BAD059 /* mserv.c */, + 1E44AF210B67CE4100BAD059 /* mserv.h */, + ); + name = I_Interface; + sourceTree = "<group>"; + }; + 1E44AEF70B67CDA900BAD059 /* M_Misc */ = { + isa = PBXGroup; + children = ( + 67259DFF18D268AE00F02971 /* m_anigif.c */, + 67259E0018D268AE00F02971 /* m_anigif.h */, + 1E44AEF80B67CDE900BAD059 /* m_argv.c */, + 1E44AEFA0B67CDE900BAD059 /* m_argv.h */, + 1E44AEFC0B67CDE900BAD059 /* m_bbox.c */, + 1E44AEF90B67CDE900BAD059 /* m_bbox.h */, + 1E44AEFB0B67CDE900BAD059 /* m_cheat.c */, + 1E44AEFD0B67CDE900BAD059 /* m_cheat.h */, + 67B83C2F14F57F1500AAAE4E /* m_cond.c */, + 67B83C3014F57F1500AAAE4E /* m_cond.h */, + 67B83C3114F57F1500AAAE4E /* m_dllist.h */, + 1E44AEFE0B67CDE900BAD059 /* m_fixed.c */, + 1E44AEFF0B67CDE900BAD059 /* m_fixed.h */, + 1E44AF020B67CDE900BAD059 /* m_misc.c */, + 1E44AF030B67CDE900BAD059 /* m_misc.h */, + 676BB51C0E0DE06100C95963 /* m_queue.c */, + 676BB51D0E0DE06100C95963 /* m_queue.h */, + 1E44AF040B67CDE900BAD059 /* m_random.c */, + 1E44AF050B67CDE900BAD059 /* m_random.h */, + 1E44AF060B67CDE900BAD059 /* m_swap.h */, + 1E44AF950B67CF1300BAD059 /* string.c */, + ); + name = M_Misc; + sourceTree = "<group>"; + }; + 1E44AF160B67CDFB00BAD059 /* P_Play */ = { + isa = PBXGroup; + children = ( + 1E44AF180B67CE2A00BAD059 /* info.c */, + 1E44AF190B67CE2A00BAD059 /* info.h */, + 1E44AF3B0B67CE5F00BAD059 /* p_ceilng.c */, + 1E44AF240B67CE5F00BAD059 /* p_enemy.c */, + 1E44AF250B67CE5F00BAD059 /* p_inter.c */, + 1E44AF260B67CE5F00BAD059 /* p_fab.c */, + 1E44AF270B67CE5F00BAD059 /* p_lights.c */, + 1E44AF280B67CE5F00BAD059 /* p_map.c */, + 1E44AF290B67CE5F00BAD059 /* p_maputl.c */, + 1E44AF2A0B67CE5F00BAD059 /* p_maputl.h */, + 1E44AF2B0B67CE5F00BAD059 /* p_mobj.c */, + 1E44AF2C0B67CE5F00BAD059 /* p_mobj.h */, + 1E44AF2D0B67CE5F00BAD059 /* p_floor.c */, + 1E44AF2E0B67CE5F00BAD059 /* p_local.h */, + 676BB51E0E0DE06100C95963 /* p_polyobj.c */, + 676BB51F0E0DE06100C95963 /* p_polyobj.h */, + 1E44AF2F0B67CE5F00BAD059 /* p_pspr.h */, + 1E44AF300B67CE5F00BAD059 /* p_saveg.c */, + 1E44AF310B67CE5F00BAD059 /* p_saveg.h */, + 1E44AF320B67CE5F00BAD059 /* p_setup.c */, + 1E44AF330B67CE5F00BAD059 /* p_setup.h */, + 1E44AF340B67CE5F00BAD059 /* p_sight.c */, + 1E44AF350B67CE5F00BAD059 /* p_spec.c */, + 1E44AF360B67CE5F00BAD059 /* p_spec.h */, + 1E44AF370B67CE5F00BAD059 /* p_telept.c */, + 1E44AF380B67CE5F00BAD059 /* p_tick.c */, + 1E44AF390B67CE5F00BAD059 /* p_tick.h */, + 1E44AF3A0B67CE5F00BAD059 /* p_user.c */, + 1E44AF990B67CF2E00BAD059 /* tables.c */, + 1E44AF9A0B67CF2E00BAD059 /* tables.h */, + ); + name = P_Play; + sourceTree = "<group>"; + }; + 1E44AF170B67CE1000BAD059 /* W_Wad */ = { + isa = PBXGroup; + children = ( + 1E44B2240B67EADE00BAD059 /* lzf.c */, + 1E44B2250B67EADE00BAD059 /* lzf.h */, + 1E44AF1C0B67CE3600BAD059 /* md5.c */, + 1E44AF1D0B67CE3600BAD059 /* md5.h */, + 1E44AFA70B67CF6400BAD059 /* w_wad.c */, + 1E44AFA80B67CF6400BAD059 /* w_wad.h */, + ); + name = W_Wad; + sourceTree = "<group>"; + }; + 1E44AF540B67CE8C00BAD059 /* R_Render */ = { + isa = PBXGroup; + children = ( + 1E44AF550B67CEC100BAD059 /* r_bsp.c */, + 1E44AF560B67CEC100BAD059 /* r_bsp.h */, + 1E44AF570B67CEC100BAD059 /* r_defs.h */, + 1E44AF580B67CEC100BAD059 /* r_data.c */, + 1E44AF590B67CEC100BAD059 /* r_draw.c */, + 1E44AF5A0B67CEC100BAD059 /* r_draw16.c */, + 1E44AF5B0B67CEC100BAD059 /* r_draw8.c */, + 1E44AF5C0B67CEC100BAD059 /* r_main.c */, + 1E44AF5D0B67CEC100BAD059 /* r_main.h */, + 1E44AF5E0B67CEC100BAD059 /* r_data.h */, + 1E44AF5F0B67CEC100BAD059 /* r_draw.h */, + 1E44AF600B67CEC100BAD059 /* r_local.h */, + 1E44AF610B67CEC100BAD059 /* r_plane.c */, + 1E44AF620B67CEC100BAD059 /* r_plane.h */, + 1E44AF630B67CEC100BAD059 /* r_segs.c */, + 1E44AF640B67CEC100BAD059 /* r_segs.h */, + 1E44AF650B67CEC200BAD059 /* r_sky.c */, + 1E44AF660B67CEC200BAD059 /* r_sky.h */, + 1E44AF670B67CEC200BAD059 /* r_splats.c */, + 1E44AF680B67CEC200BAD059 /* r_splats.h */, + 1E44AF690B67CEC200BAD059 /* r_state.h */, + 1E44AF6A0B67CEC200BAD059 /* r_things.c */, + 1E44AF6B0B67CEC200BAD059 /* r_things.h */, + 1E44AF890B67CEE900BAD059 /* screen.c */, + 1E44AF8A0B67CEE900BAD059 /* screen.h */, + 1E44AFA30B67CF5D00BAD059 /* v_video.c */, + 1E44AFA40B67CF5D00BAD059 /* v_video.h */, + ); + name = R_Render; + sourceTree = "<group>"; + }; + 1E44AF830B67CEC900BAD059 /* S_Sound */ = { + isa = PBXGroup; + children = ( + 1E44AF850B67CEE000BAD059 /* s_sound.c */, + 1E44AF860B67CEE000BAD059 /* s_sound.h */, + 1E44AF8D0B67CEF000BAD059 /* sounds.c */, + 1E44AF8E0B67CEF000BAD059 /* sounds.h */, + ); + name = S_Sound; + sourceTree = "<group>"; + }; + 1E44AFB30B67CF8500BAD059 /* SDL */ = { + isa = PBXGroup; + children = ( + 1E44AFE50B67D04900BAD059 /* macosx */, + 1E44AFD40B67D03100BAD059 /* filter */, + 1E44AFB40B67CFDC00BAD059 /* dosstr.c */, + 1E44AFB50B67CFDC00BAD059 /* endtxt.c */, + 1E44AFB60B67CFDC00BAD059 /* endtxt.h */, + 1E44AFB70B67CFDC00BAD059 /* hwsym_sdl.c */, + 1E44AFB80B67CFDC00BAD059 /* hwsym_sdl.h */, + 1E44AFB90B67CFDC00BAD059 /* i_cdmus.c */, + 1E44AFBA0B67CFDC00BAD059 /* i_main.c */, + 1E44AFBB0B67CFDC00BAD059 /* i_net.c */, + 1E44AFBD0B67CFDC00BAD059 /* i_system.c */, + 1E44AFBE0B67CFDC00BAD059 /* i_video.c */, + 1E44AFBF0B67CFDC00BAD059 /* IMG_xpm.c */, + 1E44AFEC0B67D0AB00BAD059 /* r_opengl.c */, + 1E44AFC00B67CFDC00BAD059 /* ogl_sdl.c */, + 1E44AFC10B67CFDC00BAD059 /* ogl_sdl.h */, + 1E44AFC20B67CFDC00BAD059 /* SDL_icon.xpm */, + 1E44AFC30B67CFDC00BAD059 /* sdlmain.h */, + ); + name = SDL; + sourceTree = "<group>"; + }; + 1E44AFD40B67D03100BAD059 /* filter */ = { + isa = PBXGroup; + children = ( + 1E44AFD50B67D03100BAD059 /* filters.c */, + 1E44AFD60B67D03100BAD059 /* filters.h */, + 1E44AFD70B67D03100BAD059 /* hq2x.c */, + 1E44AFD80B67D03100BAD059 /* hq2x.h */, + 1E44AFD90B67D03100BAD059 /* interp.h */, + 1E44AFDA0B67D03100BAD059 /* lq2x.c */, + 1E44AFDB0B67D03100BAD059 /* lq2x.h */, + 1E44AFDC0B67D03100BAD059 /* main.c */, + ); + name = filter; + path = ../filter; + sourceTree = SOURCE_ROOT; + }; + 1E44AFE50B67D04900BAD059 /* macosx */ = { + isa = PBXGroup; + children = ( + 1E44AFE60B67D06200BAD059 /* mac_alert.h */, + 1E44AFE70B67D06200BAD059 /* Srb2mac.icns */, + 1E44AFE80B67D06200BAD059 /* mac_alert.c */, + 1E44B0560B67D81E00BAD059 /* SDL_macosx_main.h */, + 1E44B0570B67D81E00BAD059 /* SDL_macosx_main.m */, + ); + name = macosx; + sourceTree = "<group>"; + }; + 29B97314FDCFA39411CA2CEA /* Srb2mac */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = Srb2mac; + sourceTree = "<group>"; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + ); + name = "Other Sources"; + sourceTree = "<group>"; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 67259E2B18D26D5700F02971 /* patch.dta */, + 67259E2C18D26D5700F02971 /* rings.dta */, + 67259E2D18D26D5700F02971 /* srb2.srb */, + 67A1F91813FAD026009FA3E5 /* player.dta */, + 6766C0AE11B057E50065F389 /* zones.dta */, + 1E44AE440B67CBE800BAD059 /* music.dta */, + 1E44AE4B0B67CBE800BAD059 /* srb2.wad */, + 8D1107310486CEB800E47090 /* Info.plist */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = "<group>"; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; + 67B83BC814F57D6E00AAAE4E /* LUA */ = { + isa = PBXGroup; + children = ( + 67259DFA18D2687D00F02971 /* lua_hud.h */, + 67259DFB18D2687D00F02971 /* lua_hudlib.c */, + 67259DFC18D2687D00F02971 /* lua_skinlib.c */, + 67B83C2C14F57F1500AAAE4E /* fastcmp.h */, + 67B83C1514F57EE600AAAE4E /* lua_baselib.c */, + 67B83C1614F57EE600AAAE4E /* lua_consolelib.c */, + 67B83C1714F57EE600AAAE4E /* lua_hook.h */, + 67B83C1814F57EE600AAAE4E /* lua_hooklib.c */, + 67B83C1914F57EE600AAAE4E /* lua_infolib.c */, + 67B83C1A14F57EE600AAAE4E /* lua_libs.h */, + 67B83C1B14F57EE600AAAE4E /* lua_maplib.c */, + 67B83C1C14F57EE600AAAE4E /* lua_mathlib.c */, + 67B83C1D14F57EE600AAAE4E /* lua_mobjlib.c */, + 67B83C1E14F57EE600AAAE4E /* lua_playerlib.c */, + 67B83C1F14F57EE600AAAE4E /* lua_script.c */, + 67B83C2014F57EE600AAAE4E /* lua_script.h */, + 67B83C2114F57EE600AAAE4E /* lua_thinkerlib.c */, + ); + name = LUA; + sourceTree = "<group>"; + }; + 67B83BC914F57D7F00AAAE4E /* BLUA */ = { + isa = PBXGroup; + children = ( + 67B83BCB14F57EAB00AAAE4E /* lapi.c */, + 67B83BCC14F57EAB00AAAE4E /* lapi.h */, + 67B83BCD14F57EAB00AAAE4E /* lauxlib.c */, + 67B83BCE14F57EAB00AAAE4E /* lauxlib.h */, + 67B83BCF14F57EAB00AAAE4E /* lbaselib.c */, + 67B83BD014F57EAB00AAAE4E /* lcode.c */, + 67B83BD114F57EAB00AAAE4E /* lcode.h */, + 67B83BD214F57EAB00AAAE4E /* ldebug.c */, + 67B83BD314F57EAB00AAAE4E /* ldebug.h */, + 67B83BD414F57EAB00AAAE4E /* ldo.c */, + 67B83BD514F57EAB00AAAE4E /* ldo.h */, + 67B83BD614F57EAB00AAAE4E /* ldump.c */, + 67B83BD714F57EAB00AAAE4E /* lfunc.c */, + 67B83BD814F57EAB00AAAE4E /* lfunc.h */, + 67B83BD914F57EAB00AAAE4E /* lgc.c */, + 67B83BDA14F57EAB00AAAE4E /* lgc.h */, + 67B83BDB14F57EAB00AAAE4E /* linit.c */, + 67B83BDC14F57EAB00AAAE4E /* llex.c */, + 67B83BDD14F57EAB00AAAE4E /* llex.h */, + 67B83BDE14F57EAB00AAAE4E /* llimits.h */, + 67B83BDF14F57EAB00AAAE4E /* lmem.c */, + 67B83BE014F57EAB00AAAE4E /* lmem.h */, + 67B83BE114F57EAB00AAAE4E /* lobject.c */, + 67B83BE214F57EAB00AAAE4E /* lobject.h */, + 67B83BE314F57EAB00AAAE4E /* lopcodes.c */, + 67B83BE414F57EAB00AAAE4E /* lopcodes.h */, + 67B83BE514F57EAB00AAAE4E /* lparser.c */, + 67B83BE614F57EAB00AAAE4E /* lparser.h */, + 67B83BE714F57EAB00AAAE4E /* lstate.c */, + 67B83BE814F57EAB00AAAE4E /* lstate.h */, + 67B83BE914F57EAB00AAAE4E /* lstring.c */, + 67B83BEA14F57EAB00AAAE4E /* lstring.h */, + 67B83BEB14F57EAB00AAAE4E /* lstrlib.c */, + 67B83BEC14F57EAB00AAAE4E /* ltable.c */, + 67B83BED14F57EAB00AAAE4E /* ltable.h */, + 67B83BEE14F57EAB00AAAE4E /* ltablib.c */, + 67B83BEF14F57EAB00AAAE4E /* ltm.c */, + 67B83BF014F57EAB00AAAE4E /* ltm.h */, + 67B83BF114F57EAB00AAAE4E /* lua.h */, + 67B83BF214F57EAB00AAAE4E /* luaconf.h */, + 67B83BF314F57EAB00AAAE4E /* lualib.h */, + 67B83BF414F57EAB00AAAE4E /* lundump.c */, + 67B83BF514F57EAB00AAAE4E /* lundump.h */, + 67B83BF614F57EAB00AAAE4E /* lvm.c */, + 67B83BF714F57EAB00AAAE4E /* lvm.h */, + 67B83BF814F57EAB00AAAE4E /* lzio.c */, + 67B83BF914F57EAB00AAAE4E /* lzio.h */, + ); + name = BLUA; + sourceTree = "<group>"; + }; + 67B83BCA14F57DD400AAAE4E /* B_Bot */ = { + isa = PBXGroup; + children = ( + 67B83C1214F57ECA00AAAE4E /* b_bot.c */, + 67B83C1314F57ECA00AAAE4E /* b_bot.h */, + ); + name = B_Bot; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D1107260486CEB800E47090 /* Srb2mac */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Srb2mac" */; + buildPhases = ( + 8D1107290486CEB800E47090 /* Resources */, + 677E4CB30E1765500034519D /* ShellScript */, + 8D11072C0486CEB800E47090 /* Sources */, + 8D11072E0486CEB800E47090 /* Frameworks */, + 002F39FD09D0883400EBEB88 /* Copy Frameworks into .app bundle */, + 679B708A102B872300AA9E4C /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Srb2mac; + productInstallPath = "$(HOME)/Applications"; + productName = Srb2mac; + productReference = 8D1107320486CEB800E47090 /* Srb2mac.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Srb2mac" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 29B97314FDCFA39411CA2CEA /* Srb2mac */; + projectDirPath = ""; + projectRoot = ../../..; + targets = ( + 8D1107260486CEB800E47090 /* Srb2mac */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, + 1E44AFEA0B67D06200BAD059 /* Srb2mac.icns in Resources */, + 67259E2E18D26D5700F02971 /* patch.dta in Resources */, + 67259E2F18D26D5700F02971 /* rings.dta in Resources */, + 67259E3018D26D5700F02971 /* srb2.srb in Resources */, + 67259E3218D26DD200F02971 /* music.dta in Resources */, + 67259E3318D26DD300F02971 /* player.dta in Resources */, + 67259E3518D26DD500F02971 /* zones.dta in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 677E4CB30E1765500034519D /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + comments = "update the time and date stamps in src/comptime.c"; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "PATH=\"/usr/local/bin:$PATH\" $SRCROOT/../../../comptime.sh $SRCROOT/../../"; + }; + 679B708A102B872300AA9E4C /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + comments = "make DMG file for Release builds"; + files = ( + ); + inputPaths = ( + $BUILT_PRODUCTS_DIR/$WRAPPER_NAME, + ); + outputPaths = ( + $BUILT_PRODUCTS_DIR/$TARGET_NAME.nodata.dmg, + $BUILT_PRODUCTS_DIR/$TARGET_NAME.dmg, + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -ex\n\n[ \"$ACTION\" = build ] || exit 0\n[ \"$CURRENT_VARIANT\" = \"normal\" ] || exit 0\n[ \"$BUILD_STYLE\" = \"Release\" ] || exit 0\n\ndir=\"$TEMP_FILES_DIR/$TARGET_NAME.disk\"\ndmg=\"$BUILT_PRODUCTS_DIR/$TARGET_NAME.dmg\"\ndmg_nodata=\"$BUILT_PRODUCTS_DIR/$TARGET_NAME.nodata.dmg\"\n\nrm -rf -- \"$dir\"\nmkdir \"$dir\"\ncp -R \"$BUILT_PRODUCTS_DIR/$WRAPPER_NAME\" \"$dir\"\nrm -f -- \"$dmg\"\nhdiutil create -ov -fs HFS+ -srcfolder \"$dir\" -volname \"$TARGET_NAME\" \"$dmg\"\nhdiutil internet-enable -yes \"$dmg\"\ncd \"$dir/$WRAPPER_NAME/Contents/Resources\"\nrm -f -- *.wad\nrm -f -- *.dta\nrm -f -- *.plr\nrm -f -- *.wpn\ncd \"$OLDPWD\"\nrm -f -- \"$dmg_nodata\"\nhdiutil create -ov -fs HFS+ -srcfolder \"$dir\" -volname \"$TARGET_NAME Lite\" \"$dmg_nodata\"\nhdiutil internet-enable -yes \"$dmg_nodata\"\nrm -rf -- \"$dir\""; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D11072C0486CEB800E47090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1E44AE750B67CC2B00BAD059 /* hw_bsp.c in Sources */, + 1E44AE770B67CC2B00BAD059 /* hw3sound.c in Sources */, + 1E44AE780B67CC2B00BAD059 /* hw_cache.c in Sources */, + 1E44AE7C0B67CC2B00BAD059 /* hw_light.c in Sources */, + 1E44AE800B67CC2B00BAD059 /* hw_draw.c in Sources */, + 1E44AE820B67CC2B00BAD059 /* hw_main.c in Sources */, + 1E44AE840B67CC2B00BAD059 /* hw_md2.c in Sources */, + 1E44AE860B67CC2B00BAD059 /* hw_trick.c in Sources */, + 1E44AEA40B67CC8500BAD059 /* d_clisrv.c in Sources */, + 1E44AEA70B67CC8500BAD059 /* d_main.c in Sources */, + 1E44AEA80B67CC8500BAD059 /* d_net.c in Sources */, + 1E44AEAB0B67CC8500BAD059 /* d_netfil.c in Sources */, + 1E44AEAF0B67CC8500BAD059 /* d_netcmd.c in Sources */, + 1E44AEB30B67CC8500BAD059 /* dehacked.c in Sources */, + 1E44AEBF0B67CCA900BAD059 /* f_wipe.c in Sources */, + 1E44AEC00B67CCA900BAD059 /* f_finale.c in Sources */, + 1E44AEC80B67CCC600BAD059 /* g_game.c in Sources */, + 1E44AECC0B67CCC600BAD059 /* g_input.c in Sources */, + 1E44AED00B67CCEE00BAD059 /* hu_stuff.c in Sources */, + 1E44AEDC0B67CD1300BAD059 /* i_tcp.c in Sources */, + 1E44AEE30B67CD2B00BAD059 /* am_map.c in Sources */, + 1E44AEE90B67CD3F00BAD059 /* command.c in Sources */, + 1E44AEEC0B67CD4400BAD059 /* comptime.c in Sources */, + 1E44AEEF0B67CD5400BAD059 /* console.c in Sources */, + 1E44AEF30B67CD7F00BAD059 /* filesrch.c in Sources */, + 1E44AF070B67CDE900BAD059 /* m_argv.c in Sources */, + 1E44AF0A0B67CDE900BAD059 /* m_cheat.c in Sources */, + 1E44AF0B0B67CDE900BAD059 /* m_bbox.c in Sources */, + 1E44AF0D0B67CDE900BAD059 /* m_fixed.c in Sources */, + 1E44AF0F0B67CDE900BAD059 /* m_menu.c in Sources */, + 1E44AF110B67CDE900BAD059 /* m_misc.c in Sources */, + 1E44AF130B67CDE900BAD059 /* m_random.c in Sources */, + 1E44AF1A0B67CE2A00BAD059 /* info.c in Sources */, + 1E44AF1E0B67CE3600BAD059 /* md5.c in Sources */, + 1E44AF220B67CE4100BAD059 /* mserv.c in Sources */, + 1E44AF3C0B67CE5F00BAD059 /* p_enemy.c in Sources */, + 1E44AF3D0B67CE5F00BAD059 /* p_inter.c in Sources */, + 1E44AF3E0B67CE5F00BAD059 /* p_fab.c in Sources */, + 1E44AF3F0B67CE5F00BAD059 /* p_lights.c in Sources */, + 1E44AF400B67CE5F00BAD059 /* p_map.c in Sources */, + 1E44AF410B67CE5F00BAD059 /* p_maputl.c in Sources */, + 1E44AF430B67CE5F00BAD059 /* p_mobj.c in Sources */, + 1E44AF450B67CE5F00BAD059 /* p_floor.c in Sources */, + 1E44AF480B67CE5F00BAD059 /* p_saveg.c in Sources */, + 1E44AF4A0B67CE5F00BAD059 /* p_setup.c in Sources */, + 1E44AF4C0B67CE5F00BAD059 /* p_sight.c in Sources */, + 1E44AF4D0B67CE5F00BAD059 /* p_spec.c in Sources */, + 1E44AF4F0B67CE5F00BAD059 /* p_telept.c in Sources */, + 1E44AF500B67CE5F00BAD059 /* p_tick.c in Sources */, + 1E44AF520B67CE5F00BAD059 /* p_user.c in Sources */, + 1E44AF530B67CE5F00BAD059 /* p_ceilng.c in Sources */, + 1E44AF6C0B67CEC200BAD059 /* r_bsp.c in Sources */, + 1E44AF6F0B67CEC200BAD059 /* r_data.c in Sources */, + 1E44AF700B67CEC200BAD059 /* r_draw.c in Sources */, + 1E44AF730B67CEC200BAD059 /* r_main.c in Sources */, + 1E44AF780B67CEC200BAD059 /* r_plane.c in Sources */, + 1E44AF7A0B67CEC200BAD059 /* r_segs.c in Sources */, + 1E44AF7C0B67CEC200BAD059 /* r_sky.c in Sources */, + 1E44AF7E0B67CEC200BAD059 /* r_splats.c in Sources */, + 1E44AF810B67CEC200BAD059 /* r_things.c in Sources */, + 1E44AF870B67CEE000BAD059 /* s_sound.c in Sources */, + 1E44AF8B0B67CEE900BAD059 /* screen.c in Sources */, + 1E44AF8F0B67CEF000BAD059 /* sounds.c in Sources */, + 1E44AF930B67CEFF00BAD059 /* st_stuff.c in Sources */, + 1E44AF9B0B67CF2E00BAD059 /* tables.c in Sources */, + 1E44AFA50B67CF5D00BAD059 /* v_video.c in Sources */, + 1E44AFA90B67CF6400BAD059 /* w_wad.c in Sources */, + 1E44AFAD0B67CF6F00BAD059 /* y_inter.c in Sources */, + 1E44AFB10B67CF7A00BAD059 /* z_zone.c in Sources */, + 1E44AFC40B67CFDC00BAD059 /* dosstr.c in Sources */, + 1E44AFC50B67CFDC00BAD059 /* endtxt.c in Sources */, + 1E44AFC70B67CFDC00BAD059 /* hwsym_sdl.c in Sources */, + 1E44AFC90B67CFDC00BAD059 /* i_cdmus.c in Sources */, + 1E44AFCA0B67CFDC00BAD059 /* i_main.c in Sources */, + 1E44AFCB0B67CFDC00BAD059 /* i_net.c in Sources */, + 1E44AFCD0B67CFDC00BAD059 /* i_system.c in Sources */, + 1E44AFCE0B67CFDC00BAD059 /* i_video.c in Sources */, + 1E44AFD00B67CFDC00BAD059 /* ogl_sdl.c in Sources */, + 1E44AFEB0B67D06200BAD059 /* mac_alert.c in Sources */, + 1E44AFED0B67D0AB00BAD059 /* r_opengl.c in Sources */, + 1E44B0590B67D81E00BAD059 /* SDL_macosx_main.m in Sources */, + 1E308E720B71172D0015728C /* lzf.c in Sources */, + 676BB5200E0DE06100C95963 /* m_queue.c in Sources */, + 676BB5220E0DE06100C95963 /* p_polyobj.c in Sources */, + 67B83BFA14F57EAB00AAAE4E /* lapi.c in Sources */, + 67B83BFB14F57EAB00AAAE4E /* lauxlib.c in Sources */, + 67B83BFC14F57EAB00AAAE4E /* lbaselib.c in Sources */, + 67B83BFD14F57EAB00AAAE4E /* lcode.c in Sources */, + 67B83BFE14F57EAB00AAAE4E /* ldebug.c in Sources */, + 67B83BFF14F57EAB00AAAE4E /* ldo.c in Sources */, + 67B83C0014F57EAB00AAAE4E /* ldump.c in Sources */, + 67B83C0114F57EAB00AAAE4E /* lfunc.c in Sources */, + 67B83C0214F57EAB00AAAE4E /* lgc.c in Sources */, + 67B83C0314F57EAB00AAAE4E /* linit.c in Sources */, + 67B83C0414F57EAB00AAAE4E /* llex.c in Sources */, + 67B83C0514F57EAB00AAAE4E /* lmem.c in Sources */, + 67B83C0614F57EAB00AAAE4E /* lobject.c in Sources */, + 67B83C0714F57EAB00AAAE4E /* lopcodes.c in Sources */, + 67B83C0814F57EAB00AAAE4E /* lparser.c in Sources */, + 67B83C0914F57EAB00AAAE4E /* lstate.c in Sources */, + 67B83C0A14F57EAB00AAAE4E /* lstring.c in Sources */, + 67B83C0B14F57EAB00AAAE4E /* lstrlib.c in Sources */, + 67B83C0C14F57EAB00AAAE4E /* ltable.c in Sources */, + 67B83C0D14F57EAB00AAAE4E /* ltablib.c in Sources */, + 67B83C0E14F57EAB00AAAE4E /* ltm.c in Sources */, + 67B83C0F14F57EAB00AAAE4E /* lundump.c in Sources */, + 67B83C1014F57EAB00AAAE4E /* lvm.c in Sources */, + 67B83C1114F57EAB00AAAE4E /* lzio.c in Sources */, + 67B83C1414F57ECA00AAAE4E /* b_bot.c in Sources */, + 67B83C2214F57EE600AAAE4E /* lua_baselib.c in Sources */, + 67B83C2314F57EE600AAAE4E /* lua_consolelib.c in Sources */, + 67B83C2414F57EE600AAAE4E /* lua_hooklib.c in Sources */, + 67B83C2514F57EE600AAAE4E /* lua_infolib.c in Sources */, + 67B83C2614F57EE600AAAE4E /* lua_maplib.c in Sources */, + 67B83C2714F57EE600AAAE4E /* lua_mathlib.c in Sources */, + 67B83C2814F57EE600AAAE4E /* lua_mobjlib.c in Sources */, + 67B83C2914F57EE600AAAE4E /* lua_playerlib.c in Sources */, + 67B83C2A14F57EE600AAAE4E /* lua_script.c in Sources */, + 67B83C2B14F57EE600AAAE4E /* lua_thinkerlib.c in Sources */, + 67B83C3314F57F1500AAAE4E /* m_cond.c in Sources */, + 67259DFD18D2687D00F02971 /* lua_hudlib.c in Sources */, + 67259DFE18D2687D00F02971 /* lua_skinlib.c in Sources */, + 67259E0118D268AE00F02971 /* m_anigif.c in Sources */, + 67259E0618D268F700F02971 /* i_ttf.c in Sources */, + 67259E0718D268F700F02971 /* mixer_sound.c in Sources */, + 67259E0818D268F700F02971 /* sdl_sound.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CURRENT_PROJECT_VERSION = 2.1.2; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + NORMALSRB2, + ); + PRODUCT_NAME = Srb2mac; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CURRENT_PROJECT_VERSION = 2.1.2; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + NORMALSRB2, + ); + PRODUCT_NAME = Srb2mac; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + ppc, + ); + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 0.0.0; + DEBUG_INFORMATION_FORMAT = dwarf; + DSTROOT = "$(HOME)/Applications"; + FRAMEWORK_SEARCH_PATHS = ( + "$(HOME)/Library/Frameworks", + /Library/Frameworks, + "$(FRAMEWORK_SEARCH_PATHS)", + ); + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_ENABLE_OBJC_EXCEPTIONS = NO; + GCC_ENABLE_PASCAL_STRINGS = NO; + GCC_FAST_OBJC_DISPATCH = NO; + "GCC_MODEL_TUNING[arch=ppc]" = G3; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + MAC_ALERT, + SDLMAIN, + SDL, + HAVE_MIXER, + HAVE_PNG, + HAVE_BLUA, + LUA_USE_POSIX, + COMPVERSION, + ); + GCC_THREADSAFE_STATICS = NO; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_VERSION_i386 = 4.0; + GCC_VERSION_ppc0 = 3.3; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_GLOBAL_CONSTRUCTORS = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = NO; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_PEDANTIC = NO; + GCC_WARN_PROTOTYPE_CONVERSION = NO; + GCC_WARN_SHADOW = NO; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = NO; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VALUE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GGG_MODEL_TUNING_ppc = G3; + HEADER_SEARCH_PATHS = ( + "$(HOME)/Library/Frameworks/SDL.framework/Headers", + /Library/Frameworks/SDL.framework/Headers, + "$(HOME)/Library/Frameworks/SDL_mixer.framework/Headers", + /Library/Frameworks/SDL_mixer.framework/Headers, + "$(HOME)/Library/Frameworks/libz.framework/Headers", + /Library/Frameworks/libz.framework/Headers, + "$(HOME)/Library/Frameworks/libpng.framework/Headers", + /Library/Frameworks/libpng.framework/Headers, + "$(HEADER_SEARCH_PATHS)", + ); + INFOPLIST_FILE = Info.plist; + MACH_O_TYPE = mh_execute; + MACOSX_DEPLOYMENT_TARGET = 10.4; + "MACOSX_DEPLOYMENT_TARGET[arch=i386]" = 10.4; + "MACOSX_DEPLOYMENT_TARGET[arch=ppc64]" = 10.5; + "MACOSX_DEPLOYMENT_TARGET[arch=ppc]" = 10.2; + "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; + MACOSX_DEPLOYMENT_TARGET_i386 = 10.4; + MACOSX_DEPLOYMENT_TARGET_ppc = 10.2; + OBJROOT = "$(inherited)/$(PRODUCT_NAME)/$(CURRENT_PROJECT_VERSION)"; + OTHER_CFLAGS_normal = "-D_DEBUG -DPARANOIA -DRANGECHECK"; + PREBINDING = NO; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + PRODUCT_NAME = SRB2dummy; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + "SDKROOT[arch=i386]" = macosx10.4; + "SDKROOT[arch=ppc]" = macosx10.3.9; + SDKROOT_i386 = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + SDKROOT_ppc = "$(DEVELOPER_SDK_DIR)/MacOSX10.3.9.sdk"; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "$(inherited)/$(PRODUCT_NAME)/$(CURRENT_PROJECT_VERSION)"; + WARNING_CFLAGS = ( + "-Wall", + "-W", + "-Wno-undef", + "-Wpointer-arith", + "-Wbad-function-cast", + "-Wno-cast-qual", + "-Wcast-align", + "-Wwrite-strings", + "-Waggregate-return", + "-Wmissing-prototypes", + "-Wmissing-declarations", + "-Wno-missing-noreturn", + "-Wnested-externs", + "-Winline", + ); + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + ppc, + ); + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 0.0.0; + DSTROOT = "$(HOME)/Applications"; + FRAMEWORK_SEARCH_PATHS = ( + "$(HOME)/Library/Frameworks", + /Library/Frameworks, + "$(FRAMEWORK_SEARCH_PATHS)", + ); + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = NO; + GCC_ENABLE_PASCAL_STRINGS = NO; + GCC_FAST_OBJC_DISPATCH = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + "GCC_MODEL_TUNING[arch=ppc]" = G3; + GCC_OPTIMIZATION_LEVEL = 2; + GCC_PREPROCESSOR_DEFINITIONS = ( + MAC_ALERT, + SDLMAIN, + SDL, + HAVE_MIXER, + HAVE_PNG, + HAVE_BLUA, + LUA_USE_POSIX, + COMPVERSION, + ); + GCC_THREADSAFE_STATICS = NO; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_VERSION_i386 = 4.0; + GCC_VERSION_ppc0 = 3.3; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_GLOBAL_CONSTRUCTORS = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = YES; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = NO; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_PEDANTIC = NO; + GCC_WARN_PROTOTYPE_CONVERSION = NO; + GCC_WARN_SHADOW = NO; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VALUE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GGG_MODEL_TUNING_ppc = G3; + HEADER_SEARCH_PATHS = ( + "$(HOME)/Library/Frameworks/SDL.framework/Headers", + /Library/Frameworks/SDL.framework/Headers, + "$(HOME)/Library/Frameworks/SDL_mixer.framework/Headers", + /Library/Frameworks/SDL_mixer.framework/Headers, + "$(HOME)/Library/Frameworks/libz.framework/Headers", + /Library/Frameworks/libz.framework/Headers, + "$(HOME)/Library/Frameworks/libpng.framework/Headers", + /Library/Frameworks/libpng.framework/Headers, + "$(HEADER_SEARCH_PATHS)", + ); + INFOPLIST_FILE = Info.plist; + MACH_O_TYPE = mh_execute; + MACOSX_DEPLOYMENT_TARGET = 10.4; + "MACOSX_DEPLOYMENT_TARGET[arch=i386]" = 10.4; + "MACOSX_DEPLOYMENT_TARGET[arch=ppc64]" = 10.5; + "MACOSX_DEPLOYMENT_TARGET[arch=ppc]" = 10.2; + "MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5; + MACOSX_DEPLOYMENT_TARGET_i386 = 10.4; + MACOSX_DEPLOYMENT_TARGET_ppc = 10.2; + OBJROOT = "$(inherited)/$(PRODUCT_NAME)/$(CURRENT_PROJECT_VERSION)"; + OTHER_CFLAGS_normal = "-DNDEBUG"; + PREBINDING = NO; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + PRODUCT_NAME = SRB2dummy; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + "SDKROOT[arch=i386]" = macosx10.4; + "SDKROOT[arch=ppc]" = macosx10.3.9; + SDKROOT_i386 = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + SDKROOT_ppc = "$(DEVELOPER_SDK_DIR)/MacOSX10.3.9.sdk"; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "$(inherited)/$(PRODUCT_NAME)/$(CURRENT_PROJECT_VERSION)"; + WARNING_CFLAGS = ( + "-Wall", + "-W", + "-Wno-undef", + "-Wpointer-arith", + "-Wbad-function-cast", + "-Wno-cast-qual", + "-Wcast-align", + "-Wwrite-strings", + "-Waggregate-return", + "-Wmissing-prototypes", + "-Wmissing-declarations", + "-Wno-missing-noreturn", + "-Wnested-externs", + "-Winline", + "-Wno-aggregate-return", + ); + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Srb2mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Srb2mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/src/sdl2/macosx/mac_alert.c b/src/sdl2/macosx/mac_alert.c new file mode 100644 index 000000000..455e36509 --- /dev/null +++ b/src/sdl2/macosx/mac_alert.c @@ -0,0 +1,45 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1993-1996 by id Software, Inc. +// Portions Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief Graphical Alerts for MacOSX +/// +/// Shows alerts, since we can't just print these to the screen when +/// launched graphically on a mac. + +#ifdef __APPLE_CC__ + +#include "mac_alert.h" +#include <CoreFoundation/CoreFoundation.h> + +int MacShowAlert(const char *title, const char *message, const char *button1, const char *button2, const char *button3) +{ + CFOptionFlags results; + + CFUserNotificationDisplayAlert(0, + kCFUserNotificationStopAlertLevel | kCFUserNotificationNoDefaultButtonFlag, + NULL, NULL, NULL, + CFStringCreateWithCString(NULL, title, kCFStringEncodingASCII), + CFStringCreateWithCString(NULL, message, kCFStringEncodingASCII), + button1 != NULL ? CFStringCreateWithCString(NULL, button1, kCFStringEncodingASCII) : NULL, + button2 != NULL ? CFStringCreateWithCString(NULL, button2, kCFStringEncodingASCII) : NULL, + button3 != NULL ? CFStringCreateWithCString(NULL, button3, kCFStringEncodingASCII) : NULL, + &results); + + return (int)results; +} + +#endif diff --git a/src/sdl2/macosx/mac_alert.h b/src/sdl2/macosx/mac_alert.h new file mode 100644 index 000000000..82a28d120 --- /dev/null +++ b/src/sdl2/macosx/mac_alert.h @@ -0,0 +1,27 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1993-1996 by id Software, Inc. +// Portions Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief Graphical Alerts for MacOSX +/// +/// Shows alerts, since we can't just print these to the screen when +/// launched graphically on a mac. + +#ifdef __APPLE_CC__ + +extern int MacShowAlert(const char *title, const char *message, const char *button1, const char *button2, const char *button3); + +#endif diff --git a/src/sdl2/mixer_sound.c b/src/sdl2/mixer_sound.c new file mode 100644 index 000000000..6888331de --- /dev/null +++ b/src/sdl2/mixer_sound.c @@ -0,0 +1,824 @@ +/// \file +/// \brief SDL Mixer interface for sound + +#include "../doomdef.h" + +#if defined(SDL) && defined(HAVE_MIXER) && SOUND==SOUND_MIXER + +#include "../sounds.h" +#include "../s_sound.h" +#include "../i_sound.h" +#include "../w_wad.h" +#include "../z_zone.h" +#include "../byteptr.h" + +#ifdef _MSC_VER +#pragma warning(disable : 4214 4244) +#endif +#include "SDL.h" +#ifdef _MSC_VER +#pragma warning(default : 4214 4244) +#endif + +#include "SDL_mixer.h" + +/* This is the version number macro for the current SDL_mixer version: */ +#ifndef SDL_MIXER_COMPILEDVERSION +#define SDL_MIXER_COMPILEDVERSION \ + SDL_VERSIONNUM(MIX_MAJOR_VERSION, MIX_MINOR_VERSION, MIX_PATCHLEVEL) +#endif + +/* This macro will evaluate to true if compiled with SDL_mixer at least X.Y.Z */ +#ifndef SDL_MIXER_VERSION_ATLEAST +#define SDL_MIXER_VERSION_ATLEAST(X, Y, Z) \ + (SDL_MIXER_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) +#endif + +#ifdef HAVE_LIBGME +#include "gme/gme.h" +#define GME_TREBLE 5.0 +#define GME_BASS 1.0 +#ifdef HAVE_PNG /// TODO: compile with zlib support without libpng + +#define HAVE_ZLIB + +#ifndef _MSC_VER +#ifndef _WII +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE +#endif +#endif +#endif + +#ifndef _LFS64_LARGEFILE +#define _LFS64_LARGEFILE +#endif + +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 0 +#endif + +#include "zlib.h" +#endif +#endif + +UINT8 sound_started = false; + +static boolean midimode; +static Mix_Music *music; +static UINT8 music_volume, midi_volume, sfx_volume; +static float loop_point; + +#ifdef HAVE_LIBGME +static Music_Emu *gme; +static INT32 current_track; +#endif + +void I_StartupSound(void) +{ + I_Assert(!sound_started); + sound_started = true; + + midimode = false; + music = NULL; + music_volume = midi_volume = sfx_volume = 0; + +#if SDL_MIXER_VERSION_ATLEAST(1,2,11) + Mix_Init(MIX_INIT_FLAC|MIX_INIT_MOD|MIX_INIT_MP3|MIX_INIT_OGG); +#endif + Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 2048); + Mix_AllocateChannels(256); +} + +void I_ShutdownSound(void) +{ + I_Assert(sound_started); + sound_started = false; + + Mix_CloseAudio(); +#if SDL_MIXER_VERSION_ATLEAST(1,2,11) + Mix_Quit(); +#endif +#ifdef HAVE_LIBGME + if (gme) + gme_delete(gme); +#endif +} + +void I_UpdateSound(void) +{ +} + +// this is as fast as I can possibly make it. +// sorry. more asm needed. +static Mix_Chunk *ds2chunk(void *stream) +{ + UINT16 ver,freq; + UINT32 samples, i, newsamples; + UINT8 *sound; + + SINT8 *s; + INT16 *d; + INT16 o; + fixed_t step, frac; + + // lump header + ver = READUINT16(stream); // sound version format? + if (ver != 3) // It should be 3 if it's a doomsound... + return NULL; // onos! it's not a doomsound! + freq = READUINT16(stream); + samples = READUINT32(stream); + + // convert from signed 8bit ???hz to signed 16bit 44100hz. + switch(freq) + { + case 44100: + if (samples >= UINT32_MAX>>2) + return NULL; // would wrap, can't store. + newsamples = samples; + break; + case 22050: + if (samples >= UINT32_MAX>>3) + return NULL; // would wrap, can't store. + newsamples = samples<<1; + break; + case 11025: + if (samples >= UINT32_MAX>>4) + return NULL; // would wrap, can't store. + newsamples = samples<<2; + break; + default: + frac = (44100 << FRACBITS) / (UINT32)freq; + if (!(frac & 0xFFFF)) // other solid multiples (change if FRACBITS != 16) + newsamples = samples * (frac >> FRACBITS); + else // strange and unusual fractional frequency steps, plus anything higher than 44100hz. + newsamples = FixedMul(frac, samples) + 1; // add 1 sample for security! the code below rounds up. + if (newsamples >= UINT32_MAX>>2) + return NULL; // would and/or did wrap, can't store. + break; + } + sound = Z_Malloc(newsamples<<2, PU_SOUND, NULL); // samples * frequency shift * bytes per sample * channels + + s = (SINT8 *)stream; + d = (INT16 *)sound; + + i = 0; + switch(freq) + { + case 44100: // already at the same rate? well that makes it simple. + while(i++ < samples) + { + o = ((INT16)(*s++)+0x80)<<8; // changed signedness and shift up to 16 bits + *d++ = o; // left channel + *d++ = o; // right channel + } + break; + case 22050: // unwrap 2x + while(i++ < samples) + { + o = ((INT16)(*s++)+0x80)<<8; // changed signedness and shift up to 16 bits + *d++ = o; // left channel + *d++ = o; // right channel + *d++ = o; // left channel + *d++ = o; // right channel + } + break; + case 11025: // unwrap 4x + while(i++ < samples) + { + o = ((INT16)(*s++)+0x80)<<8; // changed signedness and shift up to 16 bits + *d++ = o; // left channel + *d++ = o; // right channel + *d++ = o; // left channel + *d++ = o; // right channel + *d++ = o; // left channel + *d++ = o; // right channel + *d++ = o; // left channel + *d++ = o; // right channel + } + break; + default: // convert arbitrary hz to 44100. + step = 0; + frac = ((UINT32)freq << FRACBITS) / 44100; + while (i < samples) + { + o = (INT16)(*s+0x80)<<8; // changed signedness and shift up to 16 bits + while (step < FRACUNIT) // this is as fast as I can make it. + { + *d++ = o; // left channel + *d++ = o; // right channel + step += frac; + } + do { + i++; s++; + step -= FRACUNIT; + } while (step >= FRACUNIT); + } + break; + } + + // return Mixer Chunk. + return Mix_QuickLoad_RAW(sound, (UINT8*)d-sound); +} + +void *I_GetSfx(sfxinfo_t *sfx) +{ + void *lump; + Mix_Chunk *chunk; +#ifdef HAVE_LIBGME + Music_Emu *emu; + gme_info_t *info; +#endif + + if (sfx->lumpnum == LUMPERROR) + sfx->lumpnum = S_GetSfxLumpNum(sfx); + sfx->length = W_LumpLength(sfx->lumpnum); + + lump = W_CacheLumpNum(sfx->lumpnum, PU_SOUND); + + // convert from standard DoomSound format. + chunk = ds2chunk(lump); + if (chunk) + { + Z_Free(lump); + return chunk; + } + + // Not a doom sound? Try something else. +#ifdef HAVE_LIBGME + // VGZ format + if (((UINT8 *)lump)[0] == 0x1F + && ((UINT8 *)lump)[1] == 0x8B) + { +#ifdef HAVE_ZLIB + UINT8 *inflatedData; + size_t inflatedLen; + z_stream stream; + int zErr; // Somewhere to handle any error messages zlib tosses out + + memset(&stream, 0x00, sizeof (z_stream)); // Init zlib stream + // Begin the inflation process + inflatedLen = *(UINT32 *)lump + (sfx->length-4); // Last 4 bytes are the decompressed size, typically + inflatedData = (UINT8 *)Z_Malloc(inflatedLen, PU_SOUND, NULL); // Make room for the decompressed data + stream.total_in = stream.avail_in = sfx->length; + stream.total_out = stream.avail_out = inflatedLen; + stream.next_in = (UINT8 *)lump; + stream.next_out = inflatedData; + + zErr = inflateInit2(&stream, 32 + MAX_WBITS); + if (zErr == Z_OK) // We're good to go + { + zErr = inflate(&stream, Z_FINISH); + if (zErr == Z_STREAM_END) { + // Run GME on new data + if (!gme_open_data(inflatedData, inflatedLen, &emu, 44100)) + { + short *mem; + UINT32 len; + gme_equalizer_t eq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0}; + + Z_Free(inflatedData); // GME supposedly makes a copy for itself, so we don't need this lying around + Z_Free(lump); // We're done with the uninflated lump now, too. + + gme_start_track(emu, 0); + gme_set_equalizer(emu, &eq); + gme_track_info(emu, &info, 0); + + len = (info->play_length * 441 / 10) << 2; + mem = Z_Malloc(len, PU_SOUND, NULL); + gme_play(emu, len >> 1, mem); + gme_delete(emu); + + return Mix_QuickLoad_RAW((Uint8 *)mem, len); + } + } + else + { + const char *errorType; + switch (zErr) + { + case Z_ERRNO: + errorType = "Z_ERRNO"; break; + case Z_STREAM_ERROR: + errorType = "Z_STREAM_ERROR"; break; + case Z_DATA_ERROR: + errorType = "Z_DATA_ERROR"; break; + case Z_MEM_ERROR: + errorType = "Z_MEM_ERROR"; break; + case Z_BUF_ERROR: + errorType = "Z_BUF_ERROR"; break; + case Z_VERSION_ERROR: + errorType = "Z_VERSION_ERROR"; break; + default: + errorType = "unknown error"; + } + CONS_Alert(CONS_ERROR,"Encountered %s when running inflate: %s\n", errorType, stream.msg); + } + (void)inflateEnd(&stream); + } + else // Hold up, zlib's got a problem + { + const char *errorType; + switch (zErr) + { + case Z_ERRNO: + errorType = "Z_ERRNO"; break; + case Z_STREAM_ERROR: + errorType = "Z_STREAM_ERROR"; break; + case Z_DATA_ERROR: + errorType = "Z_DATA_ERROR"; break; + case Z_MEM_ERROR: + errorType = "Z_MEM_ERROR"; break; + case Z_BUF_ERROR: + errorType = "Z_BUF_ERROR"; break; + case Z_VERSION_ERROR: + errorType = "Z_VERSION_ERROR"; break; + default: + errorType = "unknown error"; + } + CONS_Alert(CONS_ERROR,"Encountered %s when running inflateInit: %s\n", errorType, stream.msg); + } + Z_Free(inflatedData); // GME didn't open jack, but don't let that stop us from freeing this up +#else + //CONS_Alert(CONS_ERROR,"Cannot decompress VGZ; no zlib support\n"); +#endif + } + // Try to read it as a GME sound + else if (!gme_open_data(lump, sfx->length, &emu, 44100)) + { + short *mem; + UINT32 len; + gme_equalizer_t eq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0}; + + Z_Free(lump); + + gme_start_track(emu, 0); + gme_set_equalizer(emu, &eq); + gme_track_info(emu, &info, 0); + + len = (info->play_length * 441 / 10) << 2; + mem = Z_Malloc(len, PU_SOUND, NULL); + gme_play(emu, len >> 1, mem); + gme_delete(emu); + + return Mix_QuickLoad_RAW((Uint8 *)mem, len); + } +#endif + + // Try to load it as a WAVE or OGG using Mixer. + return Mix_LoadWAV_RW(SDL_RWFromMem(lump, sfx->length), 1); +} + +void I_FreeSfx(sfxinfo_t *sfx) +{ + if (sfx->data) + Mix_FreeChunk(sfx->data); + sfx->data = NULL; +} + +INT32 I_StartSound(sfxenum_t id, UINT8 vol, UINT8 sep, UINT8 pitch, UINT8 priority) +{ + UINT8 volume = (((UINT16)vol + 1) * (UINT16)sfx_volume) / 62; // (256 * 31) / 62 == 127 + INT32 handle = Mix_PlayChannel(-1, S_sfx[id].data, 0); + Mix_Volume(handle, volume); + Mix_SetPanning(handle, min((UINT16)sep<<1, 0xff), min((UINT16)(0xff-sep)<<1, 0xff)); + (void)pitch; // Mixer can't handle pitch + (void)priority; // priority and channel management is handled by SRB2... + return handle; +} + +void I_StopSound(INT32 handle) +{ + Mix_HaltChannel(handle); +} + +boolean I_SoundIsPlaying(INT32 handle) +{ + return Mix_Playing(handle); +} + +void I_UpdateSoundParams(INT32 handle, UINT8 vol, UINT8 sep, UINT8 pitch) +{ + UINT8 volume = (((UINT16)vol + 1) * (UINT16)sfx_volume) / 62; // (256 * 31) / 62 == 127 + Mix_Volume(handle, volume); + Mix_SetPanning(handle, min((UINT16)sep<<1, 0xff), min((UINT16)(0xff-sep)<<1, 0xff)); + (void)pitch; +} + +void I_SetSfxVolume(UINT8 volume) +{ + sfx_volume = volume; +} + +// +// Music +// + +// Music hooks +static void music_loop(void) +{ + Mix_PlayMusic(music, 0); + Mix_SetMusicPosition(loop_point); +} + +#ifdef HAVE_LIBGME +static void mix_gme(void *udata, Uint8 *stream, int len) +{ + int i; + short *p; + + (void)udata; + + // no gme? no music. + if (!gme || gme_track_ended(gme)) + return; + + // play gme into stream + gme_play(gme, len/2, (short *)stream); + + // apply volume to stream + for (i = 0, p = (short *)stream; i < len/2; i++, p++) + *p = ((INT32)*p) * music_volume / 31; +} +#endif + +void I_InitMusic(void) +{ +} + +void I_ShutdownMusic(void) +{ + I_ShutdownDigMusic(); + I_ShutdownMIDIMusic(); +} + +void I_PauseSong(INT32 handle) +{ + (void)handle; + Mix_PauseMusic(); +} + +void I_ResumeSong(INT32 handle) +{ + (void)handle; + Mix_ResumeMusic(); +} + +// +// Digital Music +// + +void I_InitDigMusic(void) +{ +#ifdef HAVE_LIBGME + gme = NULL; + current_track = -1; +#endif +} + +void I_ShutdownDigMusic(void) +{ + if (midimode) + return; +#ifdef HAVE_LIBGME + if (gme) + { + Mix_HookMusic(NULL, NULL); + gme_delete(gme); + gme = NULL; + } +#endif + if (!music) + return; + Mix_HookMusicFinished(NULL); + Mix_FreeMusic(music); + music = NULL; +} + +boolean I_StartDigSong(const char *musicname, boolean looping) +{ + char *data; + size_t len; + lumpnum_t lumpnum = W_CheckNumForName(va("O_%s",musicname)); + + I_Assert(!music); +#ifdef HAVE_LIBGME + I_Assert(!gme); +#endif + + if (lumpnum == LUMPERROR) + { + lumpnum = W_CheckNumForName(va("D_%s",musicname)); + if (lumpnum == LUMPERROR) + return false; + midimode = true; + } + else + midimode = false; + + data = (char *)W_CacheLumpNum(lumpnum, PU_MUSIC); + len = W_LumpLength(lumpnum); + +#ifdef HAVE_LIBGME + if ((UINT8)data[0] == 0x1F + && (UINT8)data[1] == 0x8B) + { +#ifdef HAVE_ZLIB + UINT8 *inflatedData; + size_t inflatedLen; + z_stream stream; + int zErr; // Somewhere to handle any error messages zlib tosses out + + memset(&stream, 0x00, sizeof (z_stream)); // Init zlib stream + // Begin the inflation process + inflatedLen = *(UINT32 *)(data + (len-4)); // Last 4 bytes are the decompressed size, typically + inflatedData = (UINT8 *)Z_Calloc(inflatedLen, PU_MUSIC, NULL); // Make room for the decompressed data + stream.total_in = stream.avail_in = len; + stream.total_out = stream.avail_out = inflatedLen; + stream.next_in = (UINT8 *)data; + stream.next_out = inflatedData; + + zErr = inflateInit2(&stream, 32 + MAX_WBITS); + if (zErr == Z_OK) // We're good to go + { + zErr = inflate(&stream, Z_FINISH); + if (zErr == Z_STREAM_END) { + // Run GME on new data + if (!gme_open_data(inflatedData, inflatedLen, &gme, 44100)) + { + gme_equalizer_t eq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0}; + gme_start_track(gme, 0); + current_track = 0; + gme_set_equalizer(gme, &eq); + Mix_HookMusic(mix_gme, gme); + Z_Free(inflatedData); // GME supposedly makes a copy for itself, so we don't need this lying around + return true; + } + } + else + { + const char *errorType; + switch (zErr) + { + case Z_ERRNO: + errorType = "Z_ERRNO"; break; + case Z_STREAM_ERROR: + errorType = "Z_STREAM_ERROR"; break; + case Z_DATA_ERROR: + errorType = "Z_DATA_ERROR"; break; + case Z_MEM_ERROR: + errorType = "Z_MEM_ERROR"; break; + case Z_BUF_ERROR: + errorType = "Z_BUF_ERROR"; break; + case Z_VERSION_ERROR: + errorType = "Z_VERSION_ERROR"; break; + default: + errorType = "unknown error"; + } + CONS_Alert(CONS_ERROR,"Encountered %s when running inflate: %s\n", errorType, stream.msg); + } + (void)inflateEnd(&stream); + } + else // Hold up, zlib's got a problem + { + const char *errorType; + switch (zErr) + { + case Z_ERRNO: + errorType = "Z_ERRNO"; break; + case Z_STREAM_ERROR: + errorType = "Z_STREAM_ERROR"; break; + case Z_DATA_ERROR: + errorType = "Z_DATA_ERROR"; break; + case Z_MEM_ERROR: + errorType = "Z_MEM_ERROR"; break; + case Z_BUF_ERROR: + errorType = "Z_BUF_ERROR"; break; + case Z_VERSION_ERROR: + errorType = "Z_VERSION_ERROR"; break; + default: + errorType = "unknown error"; + } + CONS_Alert(CONS_ERROR,"Encountered %s when running inflateInit: %s\n", errorType, stream.msg); + } + Z_Free(inflatedData); // GME didn't open jack, but don't let that stop us from freeing this up +#else + //CONS_Alert(CONS_ERROR,"Cannot decompress VGZ; no zlib support\n"); +#endif + } + else if (!gme_open_data(data, len, &gme, 44100)) + { + gme_equalizer_t eq = {GME_TREBLE, GME_BASS, 0,0,0,0,0,0,0,0}; + gme_start_track(gme, 0); + current_track = 0; + gme_set_equalizer(gme, &eq); + Mix_HookMusic(mix_gme, gme); + return true; + } +#endif + + music = Mix_LoadMUS_RW(SDL_RWFromMem(data, len)); + if (!music) + { + CONS_Alert(CONS_ERROR, "Mix_LoadMUS_RW: %s\n", Mix_GetError()); + return true; + } + + // Find the OGG loop point. + loop_point = 0.0f; + if (looping) + { + const char *key1 = "LOOP"; + const char *key2 = "POINT="; + const char *key3 = "MS="; + const UINT8 key1len = strlen(key1); + const UINT8 key2len = strlen(key2); + const UINT8 key3len = strlen(key3); + char *p = data; + while ((UINT32)(p - data) < len) + { + if (strncmp(p++, key1, key1len)) + continue; + p += key1len-1; // skip OOP (the L was skipped in strncmp) + if (!strncmp(p, key2, key2len)) // is it LOOPPOINT=? + { + p += key2len; // skip POINT= + loop_point = (float)((44.1L+atoi(p)) / 44100.0L); // LOOPPOINT works by sample count. + // because SDL_Mixer is USELESS and can't even tell us + // something simple like the frequency of the streaming music, + // we are unfortunately forced to assume that ALL MUSIC is 44100hz. + // This means a lot of tracks that are only 22050hz for a reasonable downloadable file size will loop VERY badly. + } + else if (!strncmp(p, key3, key3len)) // is it LOOPMS=? + { + p += key3len; // skip MS= + loop_point = atoi(p) / 1000.0L; // LOOPMS works by real time, as miliseconds. + // Everything that uses LOOPMS will work perfectly with SDL_Mixer. + } + // Neither?! Continue searching. + } + } + + if (Mix_PlayMusic(music, looping && loop_point == 0.0f ? -1 : 0) == -1) + { + CONS_Alert(CONS_ERROR, "Mix_PlayMusic: %s\n", Mix_GetError()); + return true; + } + if (midimode) + Mix_VolumeMusic((UINT32)midi_volume*128/31); + else + Mix_VolumeMusic((UINT32)music_volume*128/31); + + if (loop_point != 0.0f) + Mix_HookMusicFinished(music_loop); + return true; +} + +void I_StopDigSong(void) +{ + if (midimode) + return; +#ifdef HAVE_LIBGME + if (gme) + { + Mix_HookMusic(NULL, NULL); + gme_delete(gme); + gme = NULL; + current_track = -1; + return; + } +#endif + if (!music) + return; + Mix_HookMusicFinished(NULL); + Mix_FreeMusic(music); + music = NULL; +} + +void I_SetDigMusicVolume(UINT8 volume) +{ + music_volume = volume; + if (midimode || !music) + return; + Mix_VolumeMusic((UINT32)volume*128/31); +} + +boolean I_SetSongSpeed(float speed) +{ + if (speed > 250.0f) + speed = 250.0f; //limit speed up to 250x +#ifdef HAVE_LIBGME + if (gme) + { + SDL_LockAudio(); + gme_set_tempo(gme, speed); + SDL_UnlockAudio(); + return true; + } +#else + (void)speed; +#endif + return false; +} + +boolean I_SetSongTrack(int track) +{ +#ifdef HAVE_LIBGME + if (current_track == track) + return false; + + // If the specified track is within the number of tracks playing, then change it + if (gme) + { + SDL_LockAudio(); + if (track >= 0 + && track < gme_track_count(gme)) + { + gme_err_t gme_e = gme_start_track(gme, track); + if (gme_e != NULL) + { + CONS_Alert(CONS_ERROR, "GME error: %s\n", gme_e); + return false; + } + current_track = track; + SDL_UnlockAudio(); + return true; + } + SDL_UnlockAudio(); + return false; + } +#endif + (void)track; + return false; +} + +// +// MIDI Music +// + +void I_InitMIDIMusic(void) +{ +} + +void I_ShutdownMIDIMusic(void) +{ + if (!midimode || !music) + return; + Mix_FreeMusic(music); + music = NULL; +} + +void I_SetMIDIMusicVolume(UINT8 volume) +{ + midi_volume = volume; + if (!midimode || !music) + return; + Mix_VolumeMusic((UINT32)volume*128/31); +} + +INT32 I_RegisterSong(void *data, size_t len) +{ + music = Mix_LoadMUS_RW(SDL_RWFromMem(data, len)); + if (!music) + { + CONS_Alert(CONS_ERROR, "Mix_LoadMUS_RW: %s\n", Mix_GetError()); + return -1; + } + return 1337; +} + +boolean I_PlaySong(INT32 handle, boolean looping) +{ + (void)handle; + + midimode = true; + + if (Mix_PlayMusic(music, looping ? -1 : 0) == -1) + { + CONS_Alert(CONS_ERROR, "Mix_PlayMusic: %s\n", Mix_GetError()); + return false; + } + Mix_VolumeMusic((UINT32)music_volume*128/31); + return true; +} + +void I_StopSong(INT32 handle) +{ + if (!midimode || !music) + return; + + (void)handle; + Mix_HaltMusic(); +} + +void I_UnRegisterSong(INT32 handle) +{ + if (!midimode || !music) + return; + + (void)handle; + Mix_FreeMusic(music); + music = NULL; +} + +#endif diff --git a/src/sdl2/ogl_sdl.c b/src/sdl2/ogl_sdl.c new file mode 100644 index 000000000..9427d3317 --- /dev/null +++ b/src/sdl2/ogl_sdl.c @@ -0,0 +1,315 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +// +//----------------------------------------------------------------------------- +/// \file +/// \brief SDL specific part of the OpenGL API for SRB2 + +#ifdef _MSC_VER +#pragma warning(disable : 4214 4244) +#endif + +#ifdef SDL + +#include "SDL.h" + +#ifdef _MSC_VER +#pragma warning(default : 4214 4244) +#endif + +#include "../doomdef.h" + +#ifdef HWRENDER +#include "../hardware/r_opengl/r_opengl.h" +#include "ogl_sdl.h" +#include "../i_system.h" +#include "hwsym_sdl.h" +#include "../m_argv.h" + +#ifdef DEBUG_TO_FILE +#include <stdarg.h> +#if defined (_WIN32) && !defined (__CYGWIN__) +#include <direct.h> +#else +#include <unistd.h> +#endif +#include <sys/types.h> +#include <sys/stat.h> +#endif + +#ifdef USE_WGL_SWAP +PFNWGLEXTSWAPCONTROLPROC wglSwapIntervalEXT = NULL; +#else +typedef int (*PFNGLXSWAPINTERVALPROC) (int); +PFNGLXSWAPINTERVALPROC glXSwapIntervalSGIEXT = NULL; +#endif + +#ifndef STATIC_OPENGL +PFNglClear pglClear; +PFNglGetIntegerv pglGetIntegerv; +PFNglGetString pglGetString; +#endif + +#ifdef _PSP +static const Uint32 WOGLFlags = SDL_HWSURFACE|SDL_OPENGL/*|SDL_RESIZABLE*/; +static const Uint32 FOGLFlags = SDL_HWSURFACE|SDL_OPENGL|SDL_FULLSCREEN; +#else +static const Uint32 WOGLFlags = SDL_OPENGL/*|SDL_RESIZABLE*/; +static const Uint32 FOGLFlags = SDL_OPENGL|SDL_FULLSCREEN; +#endif + +/** \brief SDL video display surface +*/ +SDL_Surface *vidSurface = NULL; +INT32 oglflags = 0; +void *GLUhandle = NULL; + +#ifndef STATIC_OPENGL +void *GetGLFunc(const char *proc) +{ + if (strncmp(proc, "glu", 3) == 0) + { + if (GLUhandle) + return hwSym(proc, GLUhandle); + else + return NULL; + } + return SDL_GL_GetProcAddress(proc); +} +#endif + +boolean LoadGL(void) +{ +#ifndef STATIC_OPENGL + const char *OGLLibname = NULL; + const char *GLULibname = NULL; + + if (M_CheckParm ("-OGLlib") && M_IsNextParm()) + OGLLibname = M_GetNextParm(); + + if (SDL_GL_LoadLibrary(OGLLibname) != 0) + { + I_OutputMsg("Could not load OpenGL Library: %s\n" + "Falling back to Software mode.\n", SDL_GetError()); + if (!M_CheckParm ("-OGLlib")) + I_OutputMsg("If you know what is the OpenGL library's name, use -OGLlib\n"); + return 0; + } + +#if 0 + GLULibname = "/proc/self/exe"; +#elif defined (_WIN32) + GLULibname = "GLU32.DLL"; +#elif defined (__MACH__) + GLULibname = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib"; +#elif defined (macintos) + GLULibname = "OpenGLLibrary"; +#elif defined (__unix__) + GLULibname = "libGLU.so.1"; +#elif defined (__HAIKU__) + GLULibname = "libGLU.so"; +#else + GLULibname = NULL; +#endif + + if (M_CheckParm ("-GLUlib") && M_IsNextParm()) + GLULibname = M_GetNextParm(); + + if (GLULibname) + { + GLUhandle = hwOpen(GLULibname); + if (GLUhandle) + return SetupGLfunc(); + else + { + I_OutputMsg("Could not load GLU Library: %s\n", GLULibname); + if (!M_CheckParm ("-GLUlib")) + I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n"); + } + } + else + { + I_OutputMsg("Could not load GLU Library\n"); + I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n"); + } +#endif + return SetupGLfunc(); +} + +/** \brief The OglSdlSurface function + + \param w width + \param h height + \param isFullscreen if true, go fullscreen + + \return if true, changed video mode +*/ +boolean OglSdlSurface(INT32 w, INT32 h, boolean isFullscreen) +{ + INT32 cbpp; + Uint32 OGLFlags; + const GLvoid *glvendor = NULL, *glrenderer = NULL, *glversion = NULL; + + cbpp = cv_scr_depth.value < 16 ? 16 : cv_scr_depth.value; + + if (vidSurface) + { + //Alam: SDL_Video system free vidSurface for me +#ifdef VOODOOSAFESWITCHING + SDL_QuitSubSystem(SDL_INIT_VIDEO); + SDL_InitSubSystem(SDL_INIT_VIDEO); +#endif + } + + if (isFullscreen) + OGLFlags = FOGLFlags; + else + OGLFlags = WOGLFlags; + + cbpp = SDL_VideoModeOK(w, h, cbpp, OGLFlags); + if (cbpp < 16) + return true; //Alam: Let just say we did, ok? + + vidSurface = SDL_SetVideoMode(w, h, cbpp, OGLFlags); + if (!vidSurface) + return false; + + glvendor = pglGetString(GL_VENDOR); + // Get info and extensions. + //BP: why don't we make it earlier ? + //Hurdler: we cannot do that before intialising gl context + glrenderer = pglGetString(GL_RENDERER); + glversion = pglGetString(GL_VERSION); + gl_extensions = pglGetString(GL_EXTENSIONS); + + DBG_Printf("Vendor : %s\n", glvendor); + DBG_Printf("Renderer : %s\n", glrenderer); + DBG_Printf("Version : %s\n", glversion); + DBG_Printf("Extensions : %s\n", gl_extensions); + oglflags = 0; + +#ifdef _WIN32 + // BP: disable advenced feature that don't work on somes hardware + // Hurdler: Now works on G400 with bios 1.6 and certified drivers 6.04 + if (strstr(glrenderer, "810")) oglflags |= GLF_NOZBUFREAD; +#elif defined (unix) || defined (UNIXCOMMON) + // disable advanced features not working on somes hardware + if (strstr(glrenderer, "G200")) oglflags |= GLF_NOTEXENV; + if (strstr(glrenderer, "G400")) oglflags |= GLF_NOTEXENV; +#endif + DBG_Printf("oglflags : 0x%X\n", oglflags ); + +#ifdef USE_PALETTED_TEXTURE + if (isExtAvailable("GL_EXT_paletted_texture", gl_extensions)) + glColorTableEXT = SDL_GL_GetProcAddress("glColorTableEXT"); + else + glColorTableEXT = NULL; +#endif + +#ifdef USE_WGL_SWAP + if (isExtAvailable("WGL_EXT_swap_control", gl_extensions)) + wglSwapIntervalEXT = SDL_GL_GetProcAddress("wglSwapIntervalEXT"); + else + wglSwapIntervalEXT = NULL; +#else + if (isExtAvailable("GLX_SGI_swap_control", gl_extensions)) + glXSwapIntervalSGIEXT = SDL_GL_GetProcAddress("glXSwapIntervalSGI"); + else + glXSwapIntervalSGIEXT = NULL; +#endif + +#ifndef KOS_GL_COMPATIBILITY + if (isExtAvailable("GL_EXT_texture_filter_anisotropic", gl_extensions)) + pglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnisotropy); + else +#endif + maximumAnisotropy = 0; + + granisotropicmode_cons_t[1].value = maximumAnisotropy; + + SetModelView(w, h); + SetStates(); + pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + + HWR_Startup(); +#ifdef KOS_GL_COMPATIBILITY + textureformatGL = GL_ARGB4444; +#else + textureformatGL = cbpp > 16 ? GL_RGBA : GL_RGB5_A1; +#endif + + return true; +} + +/** \brief The OglSdlFinishUpdate function + + \param vidwait wait for video sync + + \return void +*/ +void OglSdlFinishUpdate(boolean waitvbl) +{ + static boolean oldwaitvbl = false; + if (oldwaitvbl != waitvbl) + { +#ifdef USE_WGL_SWAP + if (wglSwapIntervalEXT) + wglSwapIntervalEXT(waitvbl); +#else + if (glXSwapIntervalSGIEXT) + glXSwapIntervalSGIEXT(waitvbl); +#endif + } + oldwaitvbl = waitvbl; + + SDL_GL_SwapBuffers(); +} + +EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma) +{ + INT32 i = -1; + UINT32 redgamma = pgamma->s.red, greengamma = pgamma->s.green, + bluegamma = pgamma->s.blue; + +#if 0 // changing the gamma to 127 is a bad idea + i = SDL_SetGamma(byteasfloat(redgamma), byteasfloat(greengamma), byteasfloat(bluegamma)); +#endif + if (i == 0) redgamma = greengamma = bluegamma = 0x7F; //Alam: cool + for (i = 0; i < 256; i++) + { + myPaletteData[i].s.red = (UINT8)MIN((palette[i].s.red * redgamma) /127, 255); + myPaletteData[i].s.green = (UINT8)MIN((palette[i].s.green * greengamma)/127, 255); + myPaletteData[i].s.blue = (UINT8)MIN((palette[i].s.blue * bluegamma) /127, 255); + myPaletteData[i].s.alpha = palette[i].s.alpha; + } +#ifdef USE_PALETTED_TEXTURE + if (glColorTableEXT) + { + for (i = 0; i < 256; i++) + { + palette_tex[(3*i)+0] = palette[i].s.red; + palette_tex[(3*i)+1] = palette[i].s.green; + palette_tex[(3*i)+2] = palette[i].s.blue; + } + glColorTableEXT(GL_TEXTURE_2D, GL_RGB8, 256, GL_RGB, GL_UNSIGNED_BYTE, palette_tex); + } +#endif + // on a chang�de palette, il faut recharger toutes les textures + // jaja, und noch viel mehr ;-) + Flush(); +} + +#endif //HWRENDER +#endif //SDL diff --git a/src/sdl2/ogl_sdl.h b/src/sdl2/ogl_sdl.h new file mode 100644 index 000000000..43c28fa42 --- /dev/null +++ b/src/sdl2/ogl_sdl.h @@ -0,0 +1,30 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1998-2000 by DooM Legacy Team. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief SDL specific part of the OpenGL API for SRB2 + +#include "../v_video.h" + +extern SDL_Surface *vidSurface; +extern void *GLUhandle; + +boolean OglSdlSurface(INT32 w, INT32 h, boolean isFullscreen); + +void OglSdlFinishUpdate(boolean vidwait); + +#ifdef _CREATE_DLL_ +EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette, RGBA_t *pgamma); +#endif diff --git a/src/sdl2/sdl_sound.c b/src/sdl2/sdl_sound.c new file mode 100644 index 000000000..3750e6778 --- /dev/null +++ b/src/sdl2/sdl_sound.c @@ -0,0 +1,2030 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// 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. +// +// The source 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief SDL interface for sound + +#include <math.h> +#include "../doomdef.h" + +#ifdef _MSC_VER +#pragma warning(disable : 4214 4244) +#endif + +#if defined(SDL) && SOUND==SOUND_SDL + +#include "SDL.h" + +#ifdef _MSC_VER +#pragma warning(default : 4214 4244) +#endif + +#ifdef HAVE_MIXER +#include "SDL_mixer.h" +/* This is the version number macro for the current SDL_mixer version: */ +#ifndef SDL_MIXER_COMPILEDVERSION +#define SDL_MIXER_COMPILEDVERSION \ + SDL_VERSIONNUM(MIX_MAJOR_VERSION, MIX_MINOR_VERSION, MIX_PATCHLEVEL) +#endif + +/* This macro will evaluate to true if compiled with SDL_mixer at least X.Y.Z */ +#ifndef SDL_MIXER_VERSION_ATLEAST +#define SDL_MIXER_VERSION_ATLEAST(X, Y, Z) \ + (SDL_MIXER_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) +#endif + +#else +#define MIX_CHANNELS 8 +#endif + +#if defined (_WIN32) && !defined (_WIN32_WCE) && !defined (_XBOX) +#include <direct.h> +#elif defined (__GNUC__) +#include <unistd.h> +#endif +#include "../z_zone.h" + +#include "../m_swap.h" +#include "../i_system.h" +#include "../i_sound.h" +#include "../m_argv.h" +#include "../m_misc.h" +#include "../w_wad.h" +#include "../screen.h" //vid.WndParent +#include "../doomdef.h" +#include "../doomstat.h" +#include "../s_sound.h" + +#include "../d_main.h" + +#ifdef HW3SOUND +#include "../hardware/hw3dsdrv.h" +#include "../hardware/hw3sound.h" +#include "hwsym_sdl.h" +#endif + +#ifdef HAVE_LIBGME +#include "gme/gme.h" +#endif + +// The number of internal mixing channels, +// the samples calculated for each mixing step, +// the size of the 16bit, 2 hardware channel (stereo) +// mixing buffer, and the samplerate of the raw data. + +// Needed for calling the actual sound output. +#if defined (_WIN32_WCE) || defined (DC) || defined (PSP) || defined(GP2X) +#define NUM_CHANNELS MIX_CHANNELS +#else +#define NUM_CHANNELS MIX_CHANNELS*4 +#endif + +#define INDEXOFSFX(x) ((sfxinfo_t *)x - S_sfx) + +#if defined (_WIN32_WCE) || defined (DC) || defined (PSP) +static Uint16 samplecount = 512; //Alam: .5KB samplecount at 11025hz is 46.439909297052154195011337868481ms of buffer +#elif defined(GP2X) +static Uint16 samplecount = 128; +#else +static Uint16 samplecount = 1024; //Alam: 1KB samplecount at 22050hz is 46.439909297052154195011337868481ms of buffer +#endif + +typedef struct chan_struct +{ + // The channel data pointers, start and end. + Uint8 *data; //static unsigned char *channels[NUM_CHANNELS]; + Uint8 *end; //static unsigned char *channelsend[NUM_CHANNELS]; + + // pitch + Uint32 realstep; // The channel step amount... + Uint32 step; //static UINT32 channelstep[NUM_CHANNELS]; + Uint32 stepremainder; //static UINT32 channelstepremainder[NUM_CHANNELS]; + Uint32 samplerate; // ... and a 0.16 bit remainder of last step. + + // Time/gametic that the channel started playing, + // used to determine oldest, which automatically + // has lowest priority. + tic_t starttic; //static INT32 channelstart[NUM_CHANNELS]; + + // The sound handle, determined on registration, + // used to unregister/stop/modify, + INT32 handle; //static INT32 channelhandles[NUM_CHANNELS]; + + // SFX id of the playing sound effect. + void *id; // Used to catch duplicates (like chainsaw). + sfxenum_t sfxid; //static INT32 channelids[NUM_CHANNELS]; + INT32 vol; //the channel volume + INT32 sep; //the channel pan + + // Hardware left and right channel volume lookup. + Sint16* leftvol_lookup; //static INT32 *channelleftvol_lookup[NUM_CHANNELS]; + Sint16* rightvol_lookup; //static INT32 *channelrightvol_lookup[NUM_CHANNELS]; +} chan_t; + +static chan_t channels[NUM_CHANNELS]; + +// Pitch to stepping lookup +static INT32 steptable[256]; + +// Volume lookups. +static Sint16 vol_lookup[128 * 256]; + +UINT8 sound_started = false; +static SDL_mutex *Snd_Mutex = NULL; + +//SDL's Audio +static SDL_AudioSpec audio; + +static SDL_bool musicStarted = SDL_FALSE; +#ifdef HAVE_MIXER +static SDL_mutex *Msc_Mutex = NULL; +/* FIXME: Make this file instance-specific */ +#ifdef _arch_dreamcast +#define MIDI_PATH "/ram" +#elif defined(GP2X) +#define MIDI_PATH "/mnt/sd/srb2" +#define MIDI_PATH2 "/tmp/mnt/sd/srb2" +#else +#define MIDI_PATH srb2home +#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON) +#define MIDI_PATH2 "/tmp" +#endif +#endif +#define MIDI_TMPFILE "srb2music" +#define MIDI_TMPFILE2 "srb2wav" +static INT32 musicvol = 62; + +#if SDL_MIXER_VERSION_ATLEAST(1,2,2) +#define MIXER_POS //Mix_FadeInMusicPos in 1.2.2+ +static void SDLCALL I_FinishMusic(void); +static double loopstartDig = 0.0l; +static SDL_bool loopingDig = SDL_FALSE; +static SDL_bool canlooping = SDL_TRUE; +#endif + +#if SDL_MIXER_VERSION_ATLEAST(1,2,7) +#define USE_RWOPS // ok, USE_RWOPS is in here +#if defined (DC) || defined (_WIN32_WCE) || defined (_XBOX) //|| defined(_WIN32) || defined(GP2X) +#undef USE_RWOPS +#endif +#endif + +#if SDL_MIXER_VERSION_ATLEAST(1,2,10) +//#define MIXER_INIT +#endif + +#ifdef USE_RWOPS +static void * Smidi[2] = { NULL, NULL }; +static SDL_bool canuseRW = SDL_TRUE; +#endif +static const char *fmidi[2] = { MIDI_TMPFILE, MIDI_TMPFILE2}; + +static const INT32 MIDIfade = 500; +static const INT32 Digfade = 0; + +static Mix_Music *music[2] = { NULL, NULL }; +#endif + +typedef struct srb2audio_s { + void *userdata; +#ifdef HAVE_LIBGME + Music_Emu *gme_emu; + UINT8 gme_pause; + UINT8 gme_loop; +#endif +} srb2audio_t; + +static srb2audio_t localdata; + +static void Snd_LockAudio(void) //Alam: Lock audio data and uninstall audio callback +{ + if (Snd_Mutex) SDL_LockMutex(Snd_Mutex); + else if (nosound) return; + else if (nomidimusic && nodigimusic +#ifdef HW3SOUND + && hws_mode == HWS_DEFAULT_MODE +#endif + ) SDL_LockAudio(); +#ifdef HAVE_MIXER + else if (musicStarted) Mix_SetPostMix(NULL, NULL); +#endif +} + +static void Snd_UnlockAudio(void) //Alam: Unlock audio data and reinstall audio callback +{ + if (Snd_Mutex) SDL_UnlockMutex(Snd_Mutex); + else if (nosound) return; + else if (nomidimusic && nodigimusic +#ifdef HW3SOUND + && hws_mode == HWS_DEFAULT_MODE +#endif + ) SDL_UnlockAudio(); +#ifdef HAVE_MIXER + else if (musicStarted) Mix_SetPostMix(audio.callback, audio.userdata); +#endif +} + +FUNCMATH static inline Uint16 Snd_LowerRate(Uint16 sr) +{ + if (sr <= audio.freq) // already lowered rate? + return sr; // good then + for (;sr > audio.freq;) // not good? + { // then let see... + if (sr % 2) // can we div by half? + return sr; // no, just use the currect rate + sr /= 2; // we can? wonderful + } // let start over again + if (sr == audio.freq) // did we drop to the desired rate? + return sr; // perfect! but if not + return sr*2; // just keep it just above the output sample rate +} + +#ifdef _MSC_VER +#pragma warning(disable : 4200) +#pragma pack(1) +#endif + +typedef struct +{ + Uint16 header; // 3? + Uint16 samplerate; // 11025+ + Uint16 samples; // number of samples + Uint16 dummy; // 0 + Uint8 data[0]; // data; +} ATTRPACK dssfx_t; + +#ifdef _MSC_VER +#pragma pack() +#pragma warning(default : 4200) +#endif + +// +// This function loads the sound data from the WAD lump, +// for single sound. +// +static void *getsfx(lumpnum_t sfxlump, size_t *len) +{ + dssfx_t *sfx, *paddedsfx; + Uint16 sr , csr; + size_t size = *len; + SDL_AudioCVT sfxcvt; + + sfx = (dssfx_t *)malloc(size); + if (sfx) W_ReadLump(sfxlump, (void *)sfx); + else return NULL; + sr = SHORT(sfx->samplerate); + csr = Snd_LowerRate(sr); + + if (sr > csr && SDL_BuildAudioCVT(&sfxcvt, AUDIO_U8, 1, sr, AUDIO_U8, 1, csr)) + {//Alam: Setup the AudioCVT for the SFX + + sfxcvt.len = (INT32)size-8; //Alam: Chop off the header + sfxcvt.buf = malloc(sfxcvt.len * sfxcvt.len_mult); //Alam: make room + if (sfxcvt.buf) M_Memcpy(sfxcvt.buf, &(sfx->data), sfxcvt.len); //Alam: copy the sfx sample + + if (sfxcvt.buf && SDL_ConvertAudio(&sfxcvt) == 0) //Alam: let convert it! + { + size = sfxcvt.len_cvt + 8; + *len = sfxcvt.len_cvt; + + // Allocate from zone memory. + paddedsfx = (dssfx_t *) Z_Malloc(size, PU_SOUND, NULL); + + // Now copy and pad. + M_Memcpy(paddedsfx->data, sfxcvt.buf, sfxcvt.len_cvt); + free(sfxcvt.buf); + M_Memcpy(paddedsfx,sfx,8); + paddedsfx->samplerate = SHORT(csr); // new freq + } + else //Alam: the convert failed, not needed or I couldn't malloc the buf + { + if (sfxcvt.buf) free(sfxcvt.buf); + *len = size - 8; + + // Allocate from zone memory then copy and pad + paddedsfx = (dssfx_t *)M_Memcpy(Z_Malloc(size, PU_SOUND, NULL), sfx, size); + } + } + else + { + // Pads the sound effect out to the mixing buffer size. + // The original realloc would interfere with zone memory. + *len = size - 8; + + // Allocate from zone memory then copy and pad + paddedsfx = (dssfx_t *)M_Memcpy(Z_Malloc(size, PU_SOUND, NULL), sfx, size); + } + + // Remove the cached lump. + free(sfx); + + // Return allocated padded data. + return paddedsfx; +} + +// used to (re)calculate channel params based on vol, sep, pitch +static void I_SetChannelParams(chan_t *c, INT32 vol, INT32 sep, INT32 step) +{ + INT32 leftvol; + INT32 rightvol; + c->vol = vol; + c->sep = sep; + c->step = c->realstep = step; + + if (step != steptable[128]) + c->step += (((c->samplerate<<16)/audio.freq)-65536); + else if (c->samplerate != (unsigned)audio.freq) + c->step = ((c->samplerate<<16)/audio.freq); + // x^2 separation, that is, orientation/stereo. + // range is: 0 (left) - 255 (right) + + // Volume arrives in range 0..255 and it must be in 0..cv_soundvolume... + vol = (vol * cv_soundvolume.value) >> 7; + // note: >> 6 would use almost the entire dynamical range, but + // then there would be no "dynamical room" for other sounds :-/ + + leftvol = vol - ((vol*sep*sep) >> 16); ///(256*256); + sep = 255 - sep; + rightvol = vol - ((vol*sep*sep) >> 16); + + // Sanity check, clamp volume. + if (rightvol < 0) + rightvol = 0; + else if (rightvol > 127) + rightvol = 127; + if (leftvol < 0) + leftvol = 0; + else if (leftvol > 127) + leftvol = 127; + + // Get the proper lookup table piece + // for this volume level + c->leftvol_lookup = &vol_lookup[leftvol*256]; + c->rightvol_lookup = &vol_lookup[rightvol*256]; +} + +static INT32 FindChannel(INT32 handle) +{ + INT32 i; + + for (i = 0; i < NUM_CHANNELS; i++) + if (channels[i].handle == handle) + return i; + + // not found + return -1; +} + +// +// This function adds a sound to the +// list of currently active sounds, +// which is maintained as a given number +// (eight, usually) of internal channels. +// Returns a handle. +// +static INT32 addsfx(sfxenum_t sfxid, INT32 volume, INT32 step, INT32 seperation) +{ + static UINT16 handlenums = 0; + INT32 i, slot, oldestnum = 0; + tic_t oldest = gametic; + + // Play these sound effects only one at a time. +#if 1 + if ( +#if 0 + sfxid == sfx_stnmov || sfxid == sfx_sawup || sfxid == sfx_sawidl || sfxid == sfx_sawful || sfxid == sfx_sawhit || sfxid == sfx_pistol +#else + ( sfx_litng1 <= sfxid && sfxid >= sfx_litng4 ) + || sfxid == sfx_trfire || sfxid == sfx_alarm || sfxid == sfx_spin + || sfxid == sfx_athun1 || sfxid == sfx_athun2 || sfxid == sfx_rainin +#endif + ) + { + // Loop all channels, check. + for (i = 0; i < NUM_CHANNELS; i++) + { + // Active, and using the same SFX? + if ((channels[i].end) && (channels[i].sfxid == sfxid)) + { + // Reset. + channels[i].end = NULL; + // We are sure that iff, + // there will only be one. + break; + } + } + } +#endif + + // Loop all channels to find oldest SFX. + for (i = 0; (i < NUM_CHANNELS) && (channels[i].end); i++) + { + if (channels[i].starttic < oldest) + { + oldestnum = i; + oldest = channels[i].starttic; + } + } + + // Tales from the cryptic. + // If we found a channel, fine. + // If not, we simply overwrite the first one, 0. + // Probably only happens at startup. + if (i == NUM_CHANNELS) + slot = oldestnum; + else + slot = i; + + channels[slot].end = NULL; + // Okay, in the less recent channel, + // we will handle the new SFX. + // Set pointer to raw data. + channels[slot].data = (Uint8 *)S_sfx[sfxid].data; + channels[slot].samplerate = (channels[slot].data[3]<<8)+channels[slot].data[2]; + channels[slot].data += 8; //Alam: offset of the sound header + + while (FindChannel(handlenums)!=-1) + { + handlenums++; + // Reset current handle number, limited to 0..65535. + if (handlenums == UINT16_MAX) + handlenums = 0; + } + + // Assign current handle number. + // Preserved so sounds could be stopped. + channels[slot].handle = handlenums; + + // Restart steper + channels[slot].stepremainder = 0; + // Should be gametic, I presume. + channels[slot].starttic = gametic; + + I_SetChannelParams(&channels[slot], volume, seperation, step); + + // Preserve sound SFX id, + // e.g. for avoiding duplicates of chainsaw. + channels[slot].id = S_sfx[sfxid].data; + + channels[slot].sfxid = sfxid; + + // Set pointer to end of raw data. + channels[slot].end = channels[slot].data + S_sfx[sfxid].length; + + + // You tell me. + return handlenums; +} + +// +// SFX API +// Note: this was called by S_Init. +// However, whatever they did in the +// old DPMS based DOS version, this +// were simply dummies in the Linux +// version. +// See soundserver initdata(). +// +// Well... To keep compatibility with legacy doom, I have to call this in +// I_InitSound since it is not called in S_Init... (emanne@absysteme.fr) + +static inline void I_SetChannels(void) +{ + // Init internal lookups (raw data, mixing buffer, channels). + // This function sets up internal lookups used during + // the mixing process. + INT32 i; + INT32 j; + + INT32 *steptablemid = steptable + 128; + + if (nosound) + return; + + // This table provides step widths for pitch parameters. + for (i = -128; i < 128; i++) + { + const double po = pow((double)(2.0l), (double)(i / 64.0l)); + steptablemid[i] = (INT32)(po * 65536.0l); + } + + // Generates volume lookup tables + // which also turn the unsigned samples + // into signed samples. + for (i = 0; i < 128; i++) + for (j = 0; j < 256; j++) + { + //From PrDoom + // proff - made this a little bit softer, because with + // full volume the sound clipped badly + vol_lookup[i * 256 + j] = (Sint16)((i * (j - 128) * 256) / 127); + } +} + +void I_SetSfxVolume(UINT8 volume) +{ + INT32 i; + + (void)volume; + //Snd_LockAudio(); + + for (i = 0; i < NUM_CHANNELS; i++) + if (channels[i].end) I_SetChannelParams(&channels[i], channels[i].vol, channels[i].sep, channels[i].realstep); + + //Snd_UnlockAudio(); +} + +void *I_GetSfx(sfxinfo_t *sfx) +{ + if (sfx->lumpnum == LUMPERROR) + sfx->lumpnum = S_GetSfxLumpNum(sfx); +// else if (sfx->lumpnum != S_GetSfxLumpNum(sfx)) +// I_FreeSfx(sfx); + +#ifdef HW3SOUND + if (hws_mode != HWS_DEFAULT_MODE) + return HW3S_GetSfx(sfx); +#endif + + if (sfx->data) + return sfx->data; //Alam: I have it done! + + sfx->length = W_LumpLength(sfx->lumpnum); + + return getsfx(sfx->lumpnum, &sfx->length); + +} + +void I_FreeSfx(sfxinfo_t * sfx) +{ +// if (sfx->lumpnum<0) +// return; + +#ifdef HW3SOUND + if (hws_mode != HWS_DEFAULT_MODE) + { + HW3S_FreeSfx(sfx); + } + else +#endif + { + size_t i; + + for (i = 1; i < NUMSFX; i++) + { + // Alias? Example is the chaingun sound linked to pistol. + if (S_sfx[i].data == sfx->data) + { + if (S_sfx+i != sfx) S_sfx[i].data = NULL; + S_sfx[i].lumpnum = LUMPERROR; + S_sfx[i].length = 0; + } + } + //Snd_LockAudio(); //Alam: too much? + // Loop all channels, check. + for (i = 0; i < NUM_CHANNELS; i++) + { + // Active, and using the same SFX? + if (channels[i].end && channels[i].id == sfx->data) + { + channels[i].end = NULL; // Reset. + } + } + //Snd_UnlockAudio(); //Alam: too much? + Z_Free(sfx->data); + } + sfx->data = NULL; + sfx->lumpnum = LUMPERROR; +} + +// +// Starting a sound means adding it +// to the current list of active sounds +// in the internal channels. +// As the SFX info struct contains +// e.g. a pointer to the raw data, +// it is ignored. +// As our sound handling does not handle +// priority, it is ignored. +// Pitching (that is, increased speed of playback) +// is set, but currently not used by mixing. +// +INT32 I_StartSound(sfxenum_t id, UINT8 vol, UINT8 sep, UINT8 pitch, UINT8 priority) +{ + (void)priority; + (void)pitch; + + if (nosound) + return 0; + + if (S_sfx[id].data == NULL) return -1; + + Snd_LockAudio(); + id = addsfx(id, vol, steptable[pitch], sep); + Snd_UnlockAudio(); + + return id; // Returns a handle (not used). +} + +void I_StopSound(INT32 handle) +{ + // You need the handle returned by StartSound. + // Would be looping all channels, + // tracking down the handle, + // an setting the channel to zero. + INT32 i; + + i = FindChannel(handle); + + if (i != -1) + { + //Snd_LockAudio(); //Alam: too much? + channels[i].end = NULL; + //Snd_UnlockAudio(); //Alam: too much? + channels[i].handle = -1; + channels[i].starttic = 0; + } + +} + +boolean I_SoundIsPlaying(INT32 handle) +{ + boolean isplaying = false; + int chan = FindChannel(handle); + if (chan != -1) + isplaying = (channels[chan].end != NULL); + return isplaying; +} + +FUNCINLINE static ATTRINLINE void I_UpdateStream8S(Uint8 *stream, int len) +{ + // Mix current sound data. + // Data, from raw sound + register Sint16 dr; // Right 8bit stream + register Uint8 sample; // Center 8bit sfx + register Sint16 dl; // Left 8bit stream + + // Pointers in audio stream + Sint8 *rightout = (Sint8 *)stream; // currect right + Sint8 *leftout = rightout + 1;// currect left + const Uint8 step = 2; // Step in stream, left and right, thus two. + + INT32 chan; // Mixing channel index. + + // Determine end of the stream + len /= 2; // not 8bit mono samples, 8bit stereo ones + + if (Snd_Mutex) SDL_LockMutex(Snd_Mutex); + + // Mix sounds into the mixing buffer. + // Loop over len + while (len--) + { + // Reset left/right value. + dl = *leftout; + dr = *rightout; + + // Love thy L2 cache - made this a loop. + // Now more channels could be set at compile time + // as well. Thus loop those channels. + for (chan = 0; chan < NUM_CHANNELS; chan++) + { + // Check channel, if active. + if (channels[chan].end) + { +#if 1 + // Get the raw data from the channel. + sample = channels[chan].data[0]; +#else + // linear filtering from PrDoom + sample = (((Uint32)channels[chan].data[0] *(0x10000 - channels[chan].stepremainder)) + + ((Uint32)channels[chan].data[1]) * (channels[chan].stepremainder))) >> 16; +#endif + // Add left and right part + // for this channel (sound) + // to the current data. + // Adjust volume accordingly. + dl = (Sint16)(dl+(channels[chan].leftvol_lookup[sample]>>8)); + dr = (Sint16)(dr+(channels[chan].rightvol_lookup[sample]>>8)); + // Increment stepage + channels[chan].stepremainder += channels[chan].step; + // Check whether we are done. + if (channels[chan].data + (channels[chan].stepremainder >> 16) >= channels[chan].end) + channels[chan].end = NULL; + else + { + // step to next sample + channels[chan].data += (channels[chan].stepremainder >> 16); + // Limit to LSB??? + channels[chan].stepremainder &= 0xffff; + } + } + } + + // Clamp to range. Left hardware channel. + // Has been char instead of short. + + if (dl > 0x7f) + *leftout = 0x7f; + else if (dl < -0x80) + *leftout = -0x80; + else + *leftout = (Sint8)dl; + + // Same for right hardware channel. + if (dr > 0x7f) + *rightout = 0x7f; + else if (dr < -0x80) + *rightout = -0x80; + else + *rightout = (Sint8)dr; + + // Increment current pointers in stream + leftout += step; + rightout += step; + + } + if (Snd_Mutex) SDL_UnlockMutex(Snd_Mutex); +} + +FUNCINLINE static ATTRINLINE void I_UpdateStream8M(Uint8 *stream, int len) +{ + // Mix current sound data. + // Data, from raw sound + register Sint16 d; // Mono 8bit stream + register Uint8 sample; // Center 8bit sfx + + // Pointers in audio stream + Sint8 *monoout = (Sint8 *)stream; // currect mono + const Uint8 step = 1; // Step in stream, left and right, thus two. + + INT32 chan; // Mixing channel index. + + // Determine end of the stream + //len /= 1; // not 8bit mono samples, 8bit mono ones? + + if (Snd_Mutex) SDL_LockMutex(Snd_Mutex); + + // Mix sounds into the mixing buffer. + // Loop over len + while (len--) + { + // Reset left/right value. + d = *monoout; + + // Love thy L2 cache - made this a loop. + // Now more channels could be set at compile time + // as well. Thus loop those channels. + for (chan = 0; chan < NUM_CHANNELS; chan++) + { + // Check channel, if active. + if (channels[chan].end) + { +#if 1 + // Get the raw data from the channel. + sample = channels[chan].data[0]; +#else + // linear filtering from PrDoom + sample = (((Uint32)channels[chan].data[0] *(0x10000 - channels[chan].stepremainder)) + + ((Uint32)channels[chan].data[1]) * (channels[chan].stepremainder))) >> 16; +#endif + // Add left and right part + // for this channel (sound) + // to the current data. + // Adjust volume accordingly. + d = (Sint16)(d+((channels[chan].leftvol_lookup[sample] + channels[chan].rightvol_lookup[sample])>>9)); + // Increment stepage + channels[chan].stepremainder += channels[chan].step; + // Check whether we are done. + if (channels[chan].data + (channels[chan].stepremainder >> 16) >= channels[chan].end) + channels[chan].end = NULL; + else + { + // step to next sample + channels[chan].data += (channels[chan].stepremainder >> 16); + // Limit to LSB??? + channels[chan].stepremainder &= 0xffff; + } + } + } + + // Clamp to range. Left hardware channel. + // Has been char instead of short. + + if (d > 0x7f) + *monoout = 0x7f; + else if (d < -0x80) + *monoout = -0x80; + else + *monoout = (Sint8)d; + + // Increment current pointers in stream + monoout += step; + } + if (Snd_Mutex) SDL_UnlockMutex(Snd_Mutex); +} + +FUNCINLINE static ATTRINLINE void I_UpdateStream16S(Uint8 *stream, int len) +{ + // Mix current sound data. + // Data, from raw sound + register Sint32 dr; // Right 16bit stream + register Uint8 sample; // Center 8bit sfx + register Sint32 dl; // Left 16bit stream + + // Pointers in audio stream + Sint16 *rightout = (Sint16 *)(void *)stream; // currect right + Sint16 *leftout = rightout + 1;// currect left + const Uint8 step = 2; // Step in stream, left and right, thus two. + + INT32 chan; // Mixing channel index. + + // Determine end of the stream + len /= 4; // not 8bit mono samples, 16bit stereo ones + + if (Snd_Mutex) SDL_LockMutex(Snd_Mutex); + + // Mix sounds into the mixing buffer. + // Loop over len + while (len--) + { + // Reset left/right value. + dl = *leftout; + dr = *rightout; + + // Love thy L2 cache - made this a loop. + // Now more channels could be set at compile time + // as well. Thus loop those channels. + for (chan = 0; chan < NUM_CHANNELS; chan++) + { + // Check channel, if active. + if (channels[chan].end) + { +#if 1 + // Get the raw data from the channel. + sample = channels[chan].data[0]; +#else + // linear filtering from PrDoom + sample = (((Uint32)channels[chan].data[0] *(0x10000 - channels[chan].stepremainder)) + + ((Uint32)channels[chan].data[1]) * (channels[chan].stepremainder))) >> 16; +#endif + // Add left and right part + // for this channel (sound) + // to the current data. + // Adjust volume accordingly. + dl += channels[chan].leftvol_lookup[sample]; + dr += channels[chan].rightvol_lookup[sample]; + // Increment stepage + channels[chan].stepremainder += channels[chan].step; + // Check whether we are done. + if (channels[chan].data + (channels[chan].stepremainder >> 16) >= channels[chan].end) + channels[chan].end = NULL; + else + { + // step to next sample + channels[chan].data += (channels[chan].stepremainder >> 16); + // Limit to LSB??? + channels[chan].stepremainder &= 0xffff; + } + } + } + + // Clamp to range. Left hardware channel. + // Has been char instead of short. + + if (dl > 0x7fff) + *leftout = 0x7fff; + else if (dl < -0x8000) + *leftout = -0x8000; + else + *leftout = (Sint16)dl; + + // Same for right hardware channel. + if (dr > 0x7fff) + *rightout = 0x7fff; + else if (dr < -0x8000) + *rightout = -0x8000; + else + *rightout = (Sint16)dr; + + // Increment current pointers in stream + leftout += step; + rightout += step; + + } + if (Snd_Mutex) SDL_UnlockMutex(Snd_Mutex); +} + +FUNCINLINE static ATTRINLINE void I_UpdateStream16M(Uint8 *stream, int len) +{ + // Mix current sound data. + // Data, from raw sound + register Sint32 d; // Mono 16bit stream + register Uint8 sample; // Center 8bit sfx + + // Pointers in audio stream + Sint16 *monoout = (Sint16 *)(void *)stream; // currect mono + const Uint8 step = 1; // Step in stream, left and right, thus two. + + INT32 chan; // Mixing channel index. + + // Determine end of the stream + len /= 2; // not 8bit mono samples, 16bit mono ones + + if (Snd_Mutex) SDL_LockMutex(Snd_Mutex); + + // Mix sounds into the mixing buffer. + // Loop over len + while (len--) + { + // Reset left/right value. + d = *monoout; + + // Love thy L2 cache - made this a loop. + // Now more channels could be set at compile time + // as well. Thus loop those channels. + for (chan = 0; chan < NUM_CHANNELS; chan++) + { + // Check channel, if active. + if (channels[chan].end) + { +#if 1 + // Get the raw data from the channel. + sample = channels[chan].data[0]; +#else + // linear filtering from PrDoom + sample = (((Uint32)channels[chan].data[0] *(0x10000 - channels[chan].stepremainder)) + + ((Uint32)channels[chan].data[1]) * (channels[chan].stepremainder))) >> 16; +#endif + // Add left and right part + // for this channel (sound) + // to the current data. + // Adjust volume accordingly. + d += (channels[chan].leftvol_lookup[sample] + channels[chan].rightvol_lookup[sample])>>1; + // Increment stepage + channels[chan].stepremainder += channels[chan].step; + // Check whether we are done. + if (channels[chan].data + (channels[chan].stepremainder >> 16) >= channels[chan].end) + channels[chan].end = NULL; + else + { + // step to next sample + channels[chan].data += (channels[chan].stepremainder >> 16); + // Limit to LSB??? + channels[chan].stepremainder &= 0xffff; + } + } + } + + // Clamp to range. Left hardware channel. + // Has been char instead of short. + + if (d > 0x7fff) + *monoout = 0x7fff; + else if (d < -0x8000) + *monoout = -0x8000; + else + *monoout = (Sint16)d; + + // Increment current pointers in stream + monoout += step; + } + if (Snd_Mutex) SDL_UnlockMutex(Snd_Mutex); +} + +#ifdef HAVE_LIBGME +static void I_UpdateSteamGME(Music_Emu *emu, INT16 *stream, int len, UINT8 looping) +{ + #define GME_BUFFER_LEN 44100*2048 + // Mix current sound data. + // Data, from raw sound + register Sint32 da; + + static short gme_buffer[GME_BUFFER_LEN]; // a large buffer for gme + Sint16 *in = gme_buffer; + + do + { + int out = min(GME_BUFFER_LEN, len); + if ( gme_play( emu, len, gme_buffer ) ) { } // ignore error + len -= out; + while (out--) + { + //Left + da = *in; + in++; + da += *stream; + stream++; + //Right + da = *in; + in++; + da += *stream; + stream++; + } + if (gme_track_ended( emu )) + { + if (looping) + gme_seek( emu, 0); + else + break; + } + } while ( len ); + #undef GME_BUFFER_LEN +} +#endif + +static void SDLCALL I_UpdateStream(void *userdata, Uint8 *stream, int len) +{ + if (!sound_started || !userdata) + return; + +#if SDL_VERSION_ATLEAST(1,3,0) + if (musicStarted) + memset(stream, 0x00, len); // only work in !AUDIO_U8, that needs 0x80 +#endif + + if ((audio.channels != 1 && audio.channels != 2) || + (audio.format != AUDIO_S8 && audio.format != AUDIO_S16SYS)) + ; // no function to encode this type of stream + else if (audio.channels == 1 && audio.format == AUDIO_S8) + I_UpdateStream8M(stream, len); + else if (audio.channels == 2 && audio.format == AUDIO_S8) + I_UpdateStream8S(stream, len); + else if (audio.channels == 1 && audio.format == AUDIO_S16SYS) + I_UpdateStream16M(stream, len); + else if (audio.channels == 2 && audio.format == AUDIO_S16SYS) + { + I_UpdateStream16S(stream, len); +#ifdef HAVE_LIBGME + if (userdata) + { + srb2audio_t *sa_userdata = userdata; + if (!sa_userdata->gme_pause) + I_UpdateSteamGME(sa_userdata->gme_emu, (INT16 *)stream, len/4, sa_userdata->gme_loop); + } +#endif + + } +} + +void I_UpdateSoundParams(INT32 handle, UINT8 vol, UINT8 sep, UINT8 pitch) +{ + // Would be using the handle to identify + // on which channel the sound might be active, + // and resetting the channel parameters. + + INT32 i = FindChannel(handle); + + if (i != -1 && channels[i].end) + { + //Snd_LockAudio(); //Alam: too much? + I_SetChannelParams(&channels[i], vol, sep, steptable[pitch]); + //Snd_UnlockAudio(); //Alam: too much? + } + +} + +#ifdef HW3SOUND + +static void *soundso = NULL; + +static INT32 Init3DSDriver(const char *soName) +{ + if (soName) soundso = hwOpen(soName); +#if defined (_WIN32) && defined (_X86_) && !defined (STATIC3DS) + HW3DS.pfnStartup = hwSym("Startup@8",soundso); + HW3DS.pfnShutdown = hwSym("Shutdown@0",soundso); + HW3DS.pfnAddSfx = hwSym("AddSfx@4",soundso); + HW3DS.pfnAddSource = hwSym("AddSource@8",soundso); + HW3DS.pfnStartSource = hwSym("StartSource@4",soundso); + HW3DS.pfnStopSource = hwSym("StopSource@4",soundso); + HW3DS.pfnGetHW3DSVersion = hwSym("GetHW3DSVersion@0",soundso); + HW3DS.pfnBeginFrameUpdate = hwSym("BeginFrameUpdate@0",soundso); + HW3DS.pfnEndFrameUpdate = hwSym("EndFrameUpdate@0",soundso); + HW3DS.pfnIsPlaying = hwSym("IsPlaying@4",soundso); + HW3DS.pfnUpdateListener = hwSym("UpdateListener@8",soundso); + HW3DS.pfnUpdateSourceParms = hwSym("UpdateSourceParms@12",soundso); + HW3DS.pfnSetCone = hwSym("SetCone@8",soundso); + HW3DS.pfnSetGlobalSfxVolume = hwSym("SetGlobalSfxVolume@4",soundso); + HW3DS.pfnUpdate3DSource = hwSym("Update3DSource@8",soundso); + HW3DS.pfnReloadSource = hwSym("ReloadSource@8",soundso); + HW3DS.pfnKillSource = hwSym("KillSource@4",soundso); + HW3DS.pfnKillSfx = hwSym("KillSfx@4",soundso); + HW3DS.pfnGetHW3DSTitle = hwSym("GetHW3DSTitle@8",soundso); +#else + HW3DS.pfnStartup = hwSym("Startup",soundso); + HW3DS.pfnShutdown = hwSym("Shutdown",soundso); + HW3DS.pfnAddSfx = hwSym("AddSfx",soundso); + HW3DS.pfnAddSource = hwSym("AddSource",soundso); + HW3DS.pfnStartSource = hwSym("StartSource",soundso); + HW3DS.pfnStopSource = hwSym("StopSource",soundso); + HW3DS.pfnGetHW3DSVersion = hwSym("GetHW3DSVersion",soundso); + HW3DS.pfnBeginFrameUpdate = hwSym("BeginFrameUpdate",soundso); + HW3DS.pfnEndFrameUpdate = hwSym("EndFrameUpdate",soundso); + HW3DS.pfnIsPlaying = hwSym("IsPlaying",soundso); + HW3DS.pfnUpdateListener = hwSym("UpdateListener",soundso); + HW3DS.pfnUpdateSourceParms = hwSym("UpdateSourceParms",soundso); + HW3DS.pfnSetCone = hwSym("SetCone",soundso); + HW3DS.pfnSetGlobalSfxVolume = hwSym("SetGlobalSfxVolume",soundso); + HW3DS.pfnUpdate3DSource = hwSym("Update3DSource",soundso); + HW3DS.pfnReloadSource = hwSym("ReloadSource",soundso); + HW3DS.pfnKillSource = hwSym("KillSource",soundso); + HW3DS.pfnKillSfx = hwSym("KillSfx",soundso); + HW3DS.pfnGetHW3DSTitle = hwSym("GetHW3DSTitle",soundso); +#endif + +// if (HW3DS.pfnUpdateListener2 && HW3DS.pfnUpdateListener2 != soundso) + return true; +// else +// return false; +} +#endif + +void I_ShutdownSound(void) +{ + if (nosound || !sound_started) + return; + + CONS_Printf("I_ShutdownSound: "); + +#ifdef HW3SOUND + if (hws_mode != HWS_DEFAULT_MODE) + { + HW3S_Shutdown(); + hwClose(soundso); + return; + } +#endif + + if (nomidimusic && nodigimusic) + SDL_CloseAudio(); + CONS_Printf("%s", M_GetText("shut down\n")); + sound_started = false; + SDL_QuitSubSystem(SDL_INIT_AUDIO); + if (Snd_Mutex) + SDL_DestroyMutex(Snd_Mutex); + Snd_Mutex = NULL; +} + +void I_UpdateSound(void) +{ +} + +void I_StartupSound(void) +{ +#ifdef HW3SOUND + const char *sdrv_name = NULL; +#endif +#ifndef HAVE_MIXER + nomidimusic = nodigimusic = true; +#endif +#ifdef DC + //nosound = true; +#ifdef HAVE_MIXER + nomidimusic = true; + nodigimusic = true; +#endif +#endif + + memset(channels, 0, sizeof (channels)); //Alam: Clean it + + audio.format = AUDIO_S16SYS; + audio.channels = 2; + audio.callback = I_UpdateStream; + audio.userdata = &localdata; + + if (dedicated) + { + nosound = nomidimusic = nodigimusic = true; + return; + } + + // Configure sound device + CONS_Printf("I_StartupSound:\n"); + + // Open the audio device + if (M_CheckParm ("-freq") && M_IsNextParm()) + { + audio.freq = atoi(M_GetNextParm()); + if (!audio.freq) audio.freq = cv_samplerate.value; + audio.samples = (Uint16)((samplecount/2)*(INT32)(audio.freq/11025)); //Alam: to keep it around the same XX ms + CONS_Printf (M_GetText(" requested frequency of %d hz\n"), audio.freq); + } + else + { + audio.samples = samplecount; + audio.freq = cv_samplerate.value; + } + + if (M_CheckParm ("-mono")) + { + audio.channels = 1; + audio.samples /= 2; + } + +#if defined (_PSP) && defined (HAVE_MIXER) // Bug in PSP's SDL_OpenAudio, can not open twice + I_SetChannels(); + sound_started = true; + Snd_Mutex = SDL_CreateMutex(); +#else + if (nosound) +#endif + return; + +#ifdef HW3SOUND +#ifdef STATIC3DS + if (M_CheckParm("-3dsound") || M_CheckParm("-ds3d")) + { + hws_mode = HWS_OPENAL; + } +#elif defined (_WIN32) + if (M_CheckParm("-ds3d")) + { + hws_mode = HWS_DS3D; + sdrv_name = "s_ds3d.dll"; + } + else if (M_CheckParm("-fmod3d")) + { + hws_mode = HWS_FMOD3D; + sdrv_name = "s_fmod.dll"; + } + else if (M_CheckParm("-openal")) + { + hws_mode = HWS_OPENAL; + sdrv_name = "s_openal.dll"; + } +#else + if (M_CheckParm("-fmod3d")) + { + hws_mode = HWS_FMOD3D; + sdrv_name = "./s_fmod.so"; + } + else if (M_CheckParm("-openal")) + { + hws_mode = HWS_OPENAL; + sdrv_name = "./s_openal.so"; + } +#endif + else if (M_CheckParm("-sounddriver") && M_IsNextParm()) + { + hws_mode = HWS_OTHER; + sdrv_name = M_GetNextParm(); + } + if (hws_mode != HWS_DEFAULT_MODE) + { + if (Init3DSDriver(sdrv_name)) + { + snddev_t snddev; + + //nosound = true; + //I_AddExitFunc(I_ShutdownSound); + snddev.bps = 16; + snddev.sample_rate = audio.freq; + snddev.numsfxs = NUMSFX; +#if defined (_WIN32) && !defined (_XBOX) + snddev.cooplevel = 0x00000002; + snddev.hWnd = vid.WndParent; +#endif + if (HW3S_Init(I_Error, &snddev)) + { + audio.userdata = NULL; + CONS_Printf("%s", M_GetText(" Using 3D sound driver\n")); + return; + } + CONS_Printf("%s", M_GetText(" Failed loading 3D sound driver\n")); + // Falls back to default sound system + HW3S_Shutdown(); + hwClose(soundso); + } + CONS_Printf("%s", M_GetText(" Failed loading 3D sound driver\n")); + hws_mode = HWS_DEFAULT_MODE; + } +#endif + if (!musicStarted && SDL_OpenAudio(&audio, &audio) < 0) + { + CONS_Printf("%s", M_GetText(" couldn't open audio with desired format\n")); + nosound = true; + return; + } + else + { + char ad[100]; + CONS_Printf(M_GetText(" Starting up with audio driver : %s\n"), SDL_AudioDriverName(ad, (int)sizeof ad)); + } + samplecount = audio.samples; + CV_SetValue(&cv_samplerate, audio.freq); + CONS_Printf(M_GetText(" configured audio device with %d samples/slice at %ikhz(%dms buffer)\n"), samplecount, audio.freq/1000, (INT32) (((float)audio.samples * 1000.0f) / audio.freq)); + // Finished initialization. + CONS_Printf("%s", M_GetText(" Sound module ready\n")); + //[segabor] + if (!musicStarted) SDL_PauseAudio(0); + //Mix_Pause(0); + I_SetChannels(); + sound_started = true; + Snd_Mutex = SDL_CreateMutex(); +} + +// +// MUSIC API. +// + +void I_ShutdownMIDIMusic(void) +{ + nomidimusic = false; + if (nodigimusic) I_ShutdownMusic(); +} + +#ifdef HAVE_LIBGME +static void I_ShutdownGMEMusic(void) +{ + Snd_LockAudio(); + if (localdata.gme_emu) + gme_delete(localdata.gme_emu); + localdata.gme_emu = NULL; + Snd_UnlockAudio(); +} +#endif + +void I_ShutdownDigMusic(void) +{ + nodigimusic = false; + if (nomidimusic) I_ShutdownMusic(); +} + +#ifdef HAVE_MIXER +static boolean LoadSong(void *data, size_t lumplength, size_t selectpos) +{ + FILE *midfile; + const char *tempname; +#ifdef USE_RWOPS + if (canuseRW) + { + SDL_RWops *SDLRW; + void *olddata = Smidi[selectpos]; //quick shortcut to set + + Z_Free(olddata); //free old memory + Smidi[selectpos] = NULL; + + if (!data) + return olddata != NULL; //was there old data? + + SDLRW = SDL_RWFromConstMem(data, (int)lumplength); //new RWops from Z_zone + if (!SDLRW) //ERROR while making RWops! + { + CONS_Printf(M_GetText("Couldn't load music lump: %s\n"), SDL_GetError()); + Z_Free(data); + return false; + } + + music[selectpos] = Mix_LoadMUS_RW(SDLRW); // new Mix_Chuck from RWops + if (music[selectpos]) + Smidi[selectpos] = data; //all done + else //ERROR while making Mix_Chuck + { + CONS_Printf(M_GetText("Couldn't load music data: %s\n"), Mix_GetError()); + Z_Free(data); + SDL_RWclose(SDLRW); + Smidi[selectpos] = NULL; + } + return true; + } +#endif + tempname = va("%s/%s", MIDI_PATH, fmidi[selectpos]); + + if (!data) + { + if (FIL_FileExists(tempname)) + return unlink(tempname)+1; +#ifdef MIDI_PATH2 + else if (FIL_FileExists(tempname = va("%s/%s", MIDI_PATH2, fmidi[selectpos]))) + return unlink(tempname)+1; +#endif + else + return false; + } + + midfile = fopen(tempname, "wb"); + +#ifdef MIDI_PATH2 + if (!midfile) + { + tempname = va("%s/%s", MIDI_PATH2, fmidi[selectpos]); + midfile = fopen(tempname, "wb"); + } +#endif + + if (!midfile) + { + CONS_Printf(M_GetText("Couldn't open file %s to write music in\n"), tempname); + Z_Free(data); + return false; + } + + if (fwrite(data, lumplength, 1, midfile) == 0) + { + CONS_Printf(M_GetText("Couldn't write music into file %s because %s\n"), tempname, strerror(ferror(midfile))); + Z_Free(data); + fclose(midfile); + return false; + } + + fclose(midfile); + + Z_Free(data); + + music[selectpos] = Mix_LoadMUS(tempname); + if (!music[selectpos]) //ERROR while making Mix_Chuck + { + CONS_Printf(M_GetText("Couldn't load music file %s: %s\n"), tempname, Mix_GetError()); + return false; + } + return true; +} +#endif + + +void I_ShutdownMusic(void) +{ +#ifdef HAVE_MIXER + if ((nomidimusic && nodigimusic) || !musicStarted) + return; + + CONS_Printf("%s", M_GetText("I_ShutdownMusic: ")); + + I_UnRegisterSong(0); + I_StopDigSong(); + Mix_CloseAudio(); +#ifdef MIX_INIT + Mix_Quit(); +#endif + CONS_Printf("%s", M_GetText("shut down\n")); + musicStarted = SDL_FALSE; + if (Msc_Mutex) + SDL_DestroyMutex(Msc_Mutex); + Msc_Mutex = NULL; +#endif +} + +void I_InitMIDIMusic(void) +{ + if (nodigimusic) I_InitMusic(); +} + +void I_InitDigMusic(void) +{ + if (nomidimusic) I_InitMusic(); +} + +void I_InitMusic(void) +{ +#ifdef HAVE_MIXER + char ad[100]; + SDL_version MIXcompiled; + const SDL_version *MIXlinked; +#ifdef MIXER_INIT + const int mixstart = MIX_INIT_OGG; + int mixflags; +#endif +#endif +#ifdef HAVE_LIBGME + I_AddExitFunc(I_ShutdownGMEMusic); +#endif + + if ((nomidimusic && nodigimusic) || dedicated) + return; + +#ifdef HAVE_MIXER + MIX_VERSION(&MIXcompiled) + MIXlinked = Mix_Linked_Version(); + I_OutputMsg("Compiled for SDL_mixer version: %d.%d.%d\n", + MIXcompiled.major, MIXcompiled.minor, MIXcompiled.patch); +#ifdef MIXER_POS +#ifndef _WII + if (MIXlinked->major == 1 && MIXlinked->minor == 2 && MIXlinked->patch < 7) +#endif + canlooping = SDL_FALSE; +#endif +#ifdef USE_RWOPS + if (M_CheckParm("-noRW")) + canuseRW = SDL_FALSE; +#endif + I_OutputMsg("Linked with SDL_mixer version: %d.%d.%d\n", + MIXlinked->major, MIXlinked->minor, MIXlinked->patch); +#if !(defined (DC) || defined (PSP) || defined(GP2X) || defined (WII)) + if (audio.freq < 44100 && !M_CheckParm ("-freq")) //I want atleast 44Khz + { + audio.samples = (Uint16)(audio.samples*(INT32)(44100/audio.freq)); + audio.freq = 44100; //Alam: to keep it around the same XX ms + } +#endif + + if (sound_started +#ifdef HW3SOUND + && hws_mode == HWS_DEFAULT_MODE +#endif + ) + { + I_OutputMsg("Temp Shutdown of SDL Audio System"); + SDL_CloseAudio(); + I_OutputMsg(" Done\n"); + } + + CONS_Printf("%s", M_GetText("I_InitMusic:")); + +#ifdef MIXER_INIT + mixflags = Mix_Init(mixstart); + if ((mixstart & MIX_INIT_FLAC) != (mixflags & MIX_INIT_FLAC)) + { + CONS_Printf("%s", M_GetText(" Unable to load FLAC support\n")); + } + if ((mixstart & MIX_INIT_MOD ) != (mixflags & MIX_INIT_MOD )) + { + CONS_Printf("%s", M_GetText(" Unable to load MOD support\n")); + } + if ((mixstart & MIX_INIT_MP3 ) != (mixflags & MIX_INIT_MP3 )) + { + CONS_Printf("%s", M_GetText(" Unable to load MP3 support\n")); + } + if ((mixstart & MIX_INIT_OGG ) != (mixflags & MIX_INIT_OGG )) + { + CONS_Printf("%s", M_GetText(" Unable to load OGG support\n")); + } +#endif + + if (Mix_OpenAudio(audio.freq, audio.format, audio.channels, audio.samples) < 0) //open_music(&audio) + { + CONS_Printf(M_GetText(" Unable to open music: %s\n"), Mix_GetError()); + nomidimusic = nodigimusic = true; + if (sound_started +#ifdef HW3SOUND + && hws_mode == HWS_DEFAULT_MODE +#endif + ) + { + if (SDL_OpenAudio(&audio, NULL) < 0) //retry + { + CONS_Printf("%s", M_GetText(" couldn't open audio with desired format\n")); + nosound = true; + sound_started = false; + } + else + { + CONS_Printf(M_GetText(" Starting with audio driver : %s\n"), SDL_AudioDriverName(ad, (int)sizeof ad)); + } + } + return; + } + else + CONS_Printf(M_GetText(" Starting up with audio driver : %s with SDL_Mixer\n"), SDL_AudioDriverName(ad, (int)sizeof ad)); + + samplecount = audio.samples; + CV_SetValue(&cv_samplerate, audio.freq); + if (sound_started +#ifdef HW3SOUND + && hws_mode == HWS_DEFAULT_MODE +#endif + ) + I_OutputMsg(" Reconfigured SDL Audio System"); + else I_OutputMsg(" Configured SDL_Mixer System"); + I_OutputMsg(" with %d samples/slice at %ikhz(%dms buffer)\n", samplecount, audio.freq/1000, (INT32) ((audio.samples * 1000.0f) / audio.freq)); + Mix_SetPostMix(audio.callback, audio.userdata); // after mixing music, add sound effects + Mix_Resume(-1); + CONS_Printf("%s", M_GetText("Music initialized\n")); + musicStarted = SDL_TRUE; + Msc_Mutex = SDL_CreateMutex(); +#endif +} + +boolean I_PlaySong(INT32 handle, boolean looping) +{ + (void)handle; +#ifdef HAVE_MIXER + if (nomidimusic || !musicStarted || !music[handle]) + return false; + +#ifdef MIXER_POS + if (canlooping) + Mix_HookMusicFinished(NULL); +#endif + + if (Mix_FadeInMusic(music[handle], looping ? -1 : 0, MIDIfade) == -1) + CONS_Printf(M_GetText("Couldn't play song because %s\n"), Mix_GetError()); + else + { + Mix_VolumeMusic(musicvol); + return true; + } +#else + (void)looping; +#endif + return false; +} + +static void I_PauseGME(void) +{ +#ifdef HAVE_LIBGME + localdata.gme_pause = true; +#endif +} + +void I_PauseSong(INT32 handle) +{ + (void)handle; + I_PauseGME(); +#ifdef HAVE_MIXER + if ((nomidimusic && nodigimusic) || !musicStarted) + return; + + Mix_PauseMusic(); + //I_StopSong(handle); +#endif +} + +static void I_ResumeGME(void) +{ +#ifdef HAVE_LIBGME + localdata.gme_pause = false; +#endif +} + +void I_ResumeSong(INT32 handle) +{ + (void)handle; + I_ResumeGME(); +#ifdef HAVE_MIXER + if ((nomidimusic && nodigimusic) || !musicStarted) + return; + + Mix_VolumeMusic(musicvol); + Mix_ResumeMusic(); + //I_PlaySong(handle, true); +#endif +} + +void I_StopSong(INT32 handle) +{ + (void)handle; +#ifdef HAVE_MIXER + if (nomidimusic || !musicStarted) + return; + Mix_FadeOutMusic(MIDIfade); +#endif +} + +void I_UnRegisterSong(INT32 handle) +{ +#ifdef HAVE_MIXER + + if (nomidimusic || !musicStarted) + return; + + Mix_HaltMusic(); + while (Mix_PlayingMusic()) + ; + + if (music[handle]) + Mix_FreeMusic(music[handle]); + music[handle] = NULL; + LoadSong(NULL, 0, handle); +#else + (void)handle; +#endif +} + +INT32 I_RegisterSong(void *data, size_t len) +{ +#ifdef HAVE_MIXER + if (nomidimusic || !musicStarted) + return false; + + if (!LoadSong(data, len, 0)) + return false; + + if (music[0]) + return true; + + CONS_Printf(M_GetText("Couldn't load MIDI: %s\n"), Mix_GetError()); +#else + (void)len; + (void)data; +#endif + return false; +} + +void I_SetMIDIMusicVolume(UINT8 volume) +{ +#ifdef HAVE_MIXER + if ((nomidimusic && nodigimusic) || !musicStarted) + return; + + if (Msc_Mutex) SDL_LockMutex(Msc_Mutex); + musicvol = volume * 2; + if (Msc_Mutex) SDL_UnlockMutex(Msc_Mutex); + Mix_VolumeMusic(musicvol); +#else + (void)volume; +#endif +} + +#ifdef HAVE_LIBGME +static void I_CleanupGME(void *userdata) +{ + Z_Free(userdata); +} +#endif + +static boolean I_StartGMESong(const char *musicname, boolean looping) +{ +#ifdef HAVE_LIBGME + XBOXSTATIC char filename[9]; + void *data; + lumpnum_t lumpnum; + size_t lumplength; + Music_Emu *emu; + const char* gme_err; + + Snd_LockAudio(); + if (localdata.gme_emu) + gme_delete(localdata.gme_emu); + localdata.gme_emu = NULL; + Snd_UnlockAudio(); + + snprintf(filename, sizeof filename, "o_%s", musicname); + + lumpnum = W_CheckNumForName(filename); + + if (lumpnum == LUMPERROR) + { + return false; // No music found. Oh well! + } + else + lumplength = W_LumpLength(lumpnum); + + data = W_CacheLumpNum(lumpnum, PU_MUSIC); + + gme_err = gme_open_data(data, (long)lumplength, &emu, audio.freq); + if (gme_err != NULL) { + //I_OutputMsg("I_StartGMESong: error %s\n",gme_err); + return false; + } + gme_set_user_data(emu, data); + gme_set_user_cleanup(emu, I_CleanupGME); + gme_start_track(emu, 0); + gme_set_fade(emu, Digfade); + + Snd_LockAudio(); + localdata.gme_emu = emu; + localdata.gme_pause = false; + localdata.gme_loop = (UINT8)looping; + Snd_UnlockAudio(); + + return true; +#else + (void)musicname; + (void)looping; +#endif + return false; +} + +boolean I_StartDigSong(const char *musicname, boolean looping) +{ +#ifdef HAVE_MIXER + XBOXSTATIC char filename[9]; + void *data; + lumpnum_t lumpnum; + size_t lumplength; +#endif + + if(I_StartGMESong(musicname, looping)) + return true; + +#ifdef HAVE_MIXER + if (nodigimusic) + return false; + + snprintf(filename, sizeof filename, "o_%s", musicname); + + lumpnum = W_CheckNumForName(filename); + + I_StopDigSong(); + + if (lumpnum == LUMPERROR) + { + // Alam_GBC: like in win32/win_snd.c: Graue 02-29-2004: don't worry about missing music, there might still be a MIDI + //I_OutputMsg("Music lump %s not found!\n", filename); + return false; // No music found. Oh well! + } + else + lumplength = W_LumpLength(lumpnum); + + data = W_CacheLumpNum(lumpnum, PU_MUSIC); + + if (Msc_Mutex) SDL_LockMutex(Msc_Mutex); + +#ifdef MIXER_POS + if (canlooping && (loopingDig = looping) == SDL_TRUE && strcmp(data, "OggS") == 0) + looping = false; // Only on looping Ogg files, will we will do our own looping + + // Scan the Ogg Vorbis file for the COMMENT= field for a custom + // loop point + if (!looping && loopingDig) + { + size_t scan; + const char *dataum = data; + XBOXSTATIC char looplength[64]; + UINT32 loopstart = 0; + UINT8 newcount = 0; + + Mix_HookMusicFinished(I_FinishMusic); + + for (scan = 0; scan < lumplength; scan++) + { + if (*dataum++ == 'C'){ + if (*dataum++ == 'O'){ + if (*dataum++ == 'M'){ + if (*dataum++ == 'M'){ + if (*dataum++ == 'E'){ + if (*dataum++ == 'N'){ + if (*dataum++ == 'T'){ + if (*dataum++ == '='){ + if (*dataum++ == 'L'){ + if (*dataum++ == 'O'){ + if (*dataum++ == 'O'){ + if (*dataum++ == 'P'){ + if (*dataum++ == 'P'){ + if (*dataum++ == 'O'){ + if (*dataum++ == 'I'){ + if (*dataum++ == 'N'){ + if (*dataum++ == 'T'){ + if (*dataum++ == '=') + { + + while (*dataum != 1 && newcount != 63) + looplength[newcount++] = *dataum++; + + looplength[newcount] = '\0'; + + loopstart = atoi(looplength); + + } + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + else + dataum--;} + } + + if (loopstart > 0) + { + loopstartDig = (double)((44.1l+loopstart) / 44100.0l); //8 PCM chucks off and PCM to secs +//#ifdef GP2X//#ifdef PARANOIA + //I_OutputMsg("I_StartDigSong: setting looping point to %ul PCMs(%f seconds)\n", loopstart, loopstartDig); +//#endif + } + else + { + looping = true; // loopingDig true, but couldn't find start loop point + } + } + else + loopstartDig = 0.0l; +#else + if (looping && strcmp(data, "OggS") == 0) + I_OutputMsg("I_StartDigSong: SRB2 was not compiled with looping music support(no Mix_FadeInMusicPos)\n"); +#endif + + if (!LoadSong(data, lumplength, 1)) + { + if (Msc_Mutex) SDL_UnlockMutex(Msc_Mutex); + return false; + } + + // Note: LoadSong() frees the data. Let's make sure + // we don't try to use the data again. + data = NULL; + + if (Mix_FadeInMusic(music[1], looping ? -1 : 0, Digfade) == -1) + { + if (Msc_Mutex) SDL_UnlockMutex(Msc_Mutex); + I_OutputMsg("I_StartDigSong: Couldn't play song %s because %s\n", musicname, Mix_GetError()); + return false; + } + Mix_VolumeMusic(musicvol); + + if (Msc_Mutex) SDL_UnlockMutex(Msc_Mutex); + return true; +#else + (void)looping; + (void)musicname; + return false; +#endif +} + +static void I_StopGME(void) +{ +#ifdef HAVE_LIBGME + Snd_LockAudio(); + gme_seek(localdata.gme_emu, 0); + Snd_UnlockAudio(); +#endif +} + +void I_StopDigSong(void) +{ + I_StopGME(); +#ifdef HAVE_MIXER + if (nodigimusic) + return; + +#ifdef MIXER_POS + if (canlooping) + Mix_HookMusicFinished(NULL); +#endif + + Mix_HaltMusic(); + while (Mix_PlayingMusic()) + ; + + if (music[1]) + Mix_FreeMusic(music[1]); + music[1] = NULL; + LoadSong(NULL, 0, 1); +#endif +} + +void I_SetDigMusicVolume(UINT8 volume) +{ + I_SetMIDIMusicVolume(volume); +} + +boolean I_SetSongSpeed(float speed) +{ + + (void)speed; + return false; +} + +boolean I_SetSongTrack(int track) +{ + (void)track; + return false; +} + +#ifdef MIXER_POS +static void SDLCALL I_FinishMusic(void) +{ + if (!music[1]) + return; + else if (Msc_Mutex) SDL_LockMutex(Msc_Mutex); +// I_OutputMsg("I_FinishMusic: Loopping song to %g seconds\n", loopstartDig); + + if (Mix_FadeInMusicPos(music[1], loopstartDig ? 0 : -1, Digfade, loopstartDig) == 0) + Mix_VolumeMusic(musicvol); + else + I_OutputMsg("I_FinishMusic: Couldn't loop song because %s\n", Mix_GetError()); + + if (Msc_Mutex) SDL_UnlockMutex(Msc_Mutex); +} +#endif +#endif //SDL diff --git a/src/sdl2/sdlmain.h b/src/sdl2/sdlmain.h new file mode 100644 index 000000000..1e497b10d --- /dev/null +++ b/src/sdl2/sdlmain.h @@ -0,0 +1,65 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright (C) 2006 by Sonic Team Jr. +// +// 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. +//----------------------------------------------------------------------------- +/// \file +/// \brief System specific interface stuff. + +#ifndef __sdlmain__ +#define __sdlmain__ + +extern SDL_bool consolevent; +extern SDL_bool framebuffer; + +/** \brief The JoyInfo_s struct + + info about joystick +*/ +typedef struct SDLJoyInfo_s +{ + /// Joystick handle + SDL_Joystick *dev; + /// number of old joystick + int oldjoy; + /// number of axies + int axises; + /// scale of axises + INT32 scale; + /// number of buttons + int buttons; + /// number of hats + int hats; + /// number of balls + int balls; + +} SDLJoyInfo_t; + +/** \brief SDL info about joystick 1 +*/ +extern SDLJoyInfo_t JoyInfo; + +/** \brief joystick axis deadzone +*/ +#define SDL_JDEADZONE 153 +#undef SDL_JDEADZONE + +/** \brief SDL inof about joystick 2 +*/ +extern SDLJoyInfo_t JoyInfo2; + +void I_GetConsoleEvents(void); + +void SDLforceUngrabMouse(void); + +#endif diff --git a/src/sdl2/srb2.ttf b/src/sdl2/srb2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..53f4c6a28a2adc0c97df4a7570ace24cf4949580 GIT binary patch literal 318280 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 TT<wC3UhLZ#KhG98#=rvr3yZEx literal 0 HcmV?d00001 -- GitLab