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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 HAkhB;OHxy? 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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 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 zcmeI(dz8)f;{WlzhnPZ5E=4r988PHeQ=)PyQDSn>rDn{GjK<Iymm@S35mLFNPA;Kb zqvB9;N}Wi^J#wi->7;T_7fLkr9a_#g`;Xt+Ykk-H{qx<AX<6evpP4c5$9`Eo*J>3A zcq2f7009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ 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 zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U 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 E52|=-G5`Po 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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 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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 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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 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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 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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 Z{vWl3$A6Dk3OWD)002ovPDHLkV1k2@h&uoP 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 zcmc)MF-Rj>7{Ku_cLzDP@DL%Qupn6?*P33vQd8Mz`oK0Ph`Dgiyx^jhY&KvZg{5q< z97j^6k=O-`1g@}}N-UNHtTxHa7)=(1cmJ8mME5w$<KE+&dA{%W-psr=Nfe1t7Z$`X zfBq;EqxCbfK>R{Pgigxg5B@1QM4sA*;#Kng;i=JRG^BCe5c{t`$Q_FItBBSZKZ1s) z!+y~6>ElPSY%R66mSaoHc2mn*T}z^Z^P+q$l0O&8oQR}yBFPQ0I`|g8iZ9`F_%wEt zSjR8pm+%Sv9G-b=HT*Gt8^4B6VEr4y3tsSomksIQTlgxzgwNsA_)Yw}T+1?k37^2v z;ca{yZ{eHxI=+Ih;LG?tK7&u;lX#8Sc#YS1jn{auUQ^GhC)6Bu!}m76jkoYkd>!x2 zUO|`9d2|MyLMNHOgKy!h_!2&cPvbZ7>-c5-5<Y>S!!vKKhCjw{<Ja&Byx{-2I;>g; z-@;e%C43H_#&6=+@yo2{604bDHRtd)zKyr=O?(|+!B_BQd>)^{r|?O<#%sLBYrMv5 zJU4XB4V|-HCu~=a?b_H7vGHxZg>T~P_zM1o*GD?|7QTuv;dA&j{)N|vc`d2okMZ01 zHGBg9(gIn!gKy!h_!6F#)@l5|FOa2ed>e1!oA^4O#d%?YEEb|h9248b8j&DgS|HbT z<>ux_uCA`+^72wHE-vKk>`W?^ikzOFO1WH?qoX6q=kv0&vm=>IMz*%LB$Z0Z%F2o) zlSx@zT$K6wd6}A;;*I!!%3$W(>-HTd+7G*&p;F)E<8NlYa(8<>GZ;M<ca>63h()5Y zu*}{Ui^VKirJmC9FdMsz#fBe({O%<0c=<TRXG2vidc%z{?>vZ(yS*>nuI)m&bnydu zH_Z3DBlmVXD1*DVqzWDg(+qp;N;k-Ny_uED6|?tYzCRt+x8jT^FhdZgB|06I2XV)F zBgiY2%?|GeL&MBE)4iNR1!XVHhv%>Mbnl&d=Zy2ehW+80kuL4w_y#BQkMpj4>9H3| z4SL=T{c(4A8giSiw;9Y3?e(HTGt8>5-c$6)o%b_$hRO5oPtvb~hxE70H1?d|4T|zF zhnZ}U!33t4^2=R(-}K6Ou!v(ASrulDK`g$nb_@QMgX!-L!wkopqc^kh?+S%NHpp>g zxT%Jwe*tq>y&b;(jeMaHf{|f(TWth)fKXYo@83^A2!kmm54RWgKb;Zd{Z-~u@AH<i z3t%ap_x;Che!HKSRUI9zK8mc`A_t#|25}g~_(wM4ox|e&7vaVChkOi)pBjuM7!%Q6 W2;XFU%N+2>f&LuPdK7(rJ^eQjQPkQ1 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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 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 zcmeFad4McQRqr2J)m?j4R#tA6nYCASSKscw>)aV;V_?`<8D?ZxU>F!swqb{11VjNr z1w;fC9RvXpWKj^1)fqtC6@4hOJoTrD&+VbOg3tPWzLAyP_s(3<|NLi8+>ETsjP=Ah z-#Bq1s;_a3F(J{0x#BKY-Sh6d=U@HTX5;1!W0Jev{fhft)qD5d9%RZl?-=uU`**+U z0e5=)N1t<<*?9N28`FE&eZKvwd%WQn-}y!g_(=-*(*3SFe(I&i{{7v?IG>}`M?UZ_ z_kHkJfArs;Z%lfFG12F)dE(XAJ?jsD@8!n)))$T0{Jm?Q`Si)|lgEE)%ok3R=W*9w z_t+;s^P_k9q%pt$^Tt%RAA9xFt}}_LQ-7cGx{rOrbFTf!UElXCW4^j!N|#*vxJN(n z*?;!%t=AZHlJ>m*2OjsBs~`POfBU&1Wqk+fFL)des=r*jH{V~)_r>F$`1EJL;4gml zN@GeF8sk6u@sD}xlWzW(-*!xS?~cYi=B-b7@-<gi=Fj*QW4=g#{Kq}<>Ste9{jKWl z$p1m|Po8x36Cd-oN8S8DQ-0-N(f%L0?#WMk`twWE51aC9o^H(Eo3DH7W3KznPi<Xc z%;)|Wbv)9Dx8^->{`3>?{^duwm;STK%H%WV*Is|qeeC`BW|yxXwz~7izm{+2d)<`s z9E!_tUftOYHh!1)kJxzq`nfV$+W2EVA->L3%~MT<oLzI=JcL@GQ<<AGZ_A}eIIlFD zJo!lJWn}uH{O)|o+|PWSr_Ifca-~!*ZTzVzt*$VWhpme?ce(t&mzz5p^No#iZFP5Z zVfoGGqZ4D^@IY!T)k?oax{29v{>hxOIsS&2%juhYI&U@iD!sv+2Y2sKez-YZy3w34 z|7`B%+{0YKRd@cvEO~c3>fdpWn*sNWo$p`$HP23SJ%a0Eu8X*Kx$ew$IoD-edUn3j zD=(jKS6t5POj!O9X<u&|rI(lom##CHmVTT29k_;EZ|3`_%!3_|>)%N89G*4JgUgRM zcP)L9dx!UrUf=buZ|0?oOt17lb5-fprd5868I_)ElF~y>t#rAWJNGq@Qk%IqXv0b8 ztE>NXZZIcH9dopFe{-etS#v)3^GoNM^PLx)D@%9d^Bs8Zn7cU6>SLt4(h1EK<*Rvj zC$1}P`YV-3>7AR+uJammAKu-^`MT+q+a@TLP0#sfc>V>m?cAUD8Ev?~t$&|395?@$ zHea}Ur}GvwN5UTM{HZx&uN%w-8@~&0>65cGlk%6%rKG(~=}CK;(mPKu7ciDal1V?3 z(l<<E+psjd<qyy{`dy4Kbv>9%<8h43x9#|<IZD2*@+os?=cSD6znTf}Zm03J&u%a$ zoGZ-0K6|{GIFC0o(qC7)2Yr8;IcjC#26K0wpQhfU<likn$(&waGsbsh$5!Kei>v$& z#zf<-u|DHstjk>Ib2*N;`fBO(CM?EU<9+5uyRNh{pz%KQ(s)0Ha-T*!HMZxt%8xL| z?07TQ8t>v_oWH?%ALah<Tz_Tdp%`n8_nDVuS>GA&GcS#|l_%ZRZ`FUxJAJqHf3v&v z;Hi|Y{!1psBenCtx=Uvyx8LlJK2gR6r9YwEJD3_g{xbdi5_kH&`kLjxc;F!;j%jkg zFL$d0<qh(d&;@jnv>&tjh)$ILmght6P11(ckB)LbV($}kg}pz6yU=}ZHZ`7Be{OLv z-^bK>UN7F;v4y|4ysKWTpZPsF_%2;R2d&PWc?T1$Uf%L9nbFw&H}Ap|tJBDr9b;h% zdTp`gj5~e5@}LdtI>j$^=b2m=aGl_~gzJS|58}Ef*LG3<E$`A})n{I}dYJQgGv-RU zcDa`8YsP)brFW;fa$Wsq>3-GJ%5O7wUhC<k&{yu#-{l$4XM9fA-wWMV`r`R5(<^Q9 zY*xCj*(<#Q`Tr>6T?Oj{<W6%4{SbEWxl>~La-MO3hX->*X&=mM!N-@Zuh(<u+Gul4 z`OLiIJjZy>*G%U8hsjC__kRMbw!w}s7_YR;T(%9y|95%v-%WRed7b%xCgQpiWA-EH zW)1oGN>8Sb%pqJYa4q7>Xz!&Zlj|^e+ATf9oUpolFRRDP(x>3T9r-+5{iW5{mzzfU z`RLjW$oD--|C5xdIcLu267$I)@coOV1&<0G6#i^%m`lnRQO<AB4z(el3#aJ9k<#su z(b?*)R{p;oerbNv9Qhl_{zJ@t?3jFr&u?D+Yw0p{vykaaX#XYf_zTF{|7Lu)(5sOd zz~hng2h5q87d4lC#XPEXd$1H6VzXl&yzw@!eRTFenU`C%H!@c+k3G2jC9XT$F|>GS z@!eT{z0mFdt`1rZyakqOE)kxWZie5&;{yA{hmN_RsH3>kugv+vY9*aKv&}`mjV<!Y z9x3o?U0+epK{>Z*$1SlLO#J|LyqmsmaQ}}YUvX!g9te&_2l#bM9Lm70527OlX2aXk z7wF%cknO9`rDCj#cC6=yqWo`mFYv^<arK|2-)9`Tm*2>kaUrv<(u<gz{*2Fk=7{TP z!_8*P`D5&ZKQmqIjuy66So$5VS0Wb=qD^-qZPiqr<?3@~;lJjq7qc>X6>|F|WUWp< z@%sjIAy>q8HP@W$4qT%%t_7bT!FA{LCA-F6mbdEP*C@~7F55wPFWV41L37eZY}}0s z@BV=_8hef3{owD%xr;~AQH`te{}E{@ul&O%MF+<=t<o#sr;TfEO!#hjsQlQOwod5| zWtJa}?#j0OeV#uTyW|U`{d+!t9zFdI?oY7kvyBG#=QBsh26&LUV`&F|zZE@r1m$Qx zU!jwKhwMItXSy_xKGe9(&vz|-8=oc5cjLacPtiSVPnJvAhS-)iO=3=zF98#j?x8&U zI`@Ej{>3cH$N9WtriFb&pKGe0cjs%aT-&yPC0!_AL%$zHdeYc-&>lO_NpG*99rR7* z7jjklXJp|*p8Xwtd^BmEgG_W8bMZ<z1fQMvaPJ@s@8bE>dA^{XKgFEV1gqe??fa{F zzD>GMbAK}T7g5d$(tm}rui^R}&uL5fJnpXs|G|~=Bl#X71COCyg$<>-7XDcI{`wjB zA7Pw4+I=O@ew^#&<XeEnFXWzpk>5wT;92?ZwCPQzQ`{w6Rz4Ub#@M!<wz$;kTAkGR z{9)cU%DOXUohZMAar>INtMXczJHz%X@I!KE$3yskp1IJ@1KbblD)_R-DJz?j4aukY zpmoo=>>}nIjk)C0j@vEo$f??B#|0U%a*C{MJc)j?hF~nU#?$)k6qkqY?b|*SI-|K< zZ3lPMf3?H*Q#u0{6zekP?&Vo}!yIJi9PF4vZy3uv+qvgajNfCCvv06g(mLuJ<|60g zV4H02hx3{BmX$?^abw+~b(QmZWWUgh2eH=rBxQUTd2b@kU6|7<d`CB!f9_Mhm$}6D z;d!gSDA!ki;XHuLTm3_Mx%!LJ=eX3SUGB6)b*o<Lyx0j>U*Y<Yt%ovIt}UDL;L9ty zp5xrG`ZwkKmX~mctL%Y|rPY^8f4ur!>7Tg2e)ZYXTUMX7{Z*fDah0A&y63IFRKApa zN4alvznpyH%eT178>HJH{mtCp%l+rMf13L<R-e^H-|oP5g1-GR*C+YBvHtuG?%!~( zSbdJ`OQjC?73+e3qa8l?o5;&$`61rl;wty4=ThqVI`_Zf{tMiHi*nB3-8nyhg0zq2 zdOg?uX(RmomRCl(myz~Axc?pZ_j3Oo?%ze;7t_A=coh6Bctzj-oxbiLwEK+lv@-Hv zjAQvdj3L(s<FFA^-`{hubAJ!@eu#R%#hB>bMnd{z^`(tJ;{I#gZ{q$%?k`(?R@b-e zGd$TiLHes!U)n^DHjyLB_}s>ybAKNBB}?C`{c9OS=04B0Qa_O2>*2?D*n2)N&(GP1 z53W8_;)3V-^?5M;26XTSGvq=)S6}D)N3IX8FMa<qxUhkq{XgertIyc$25iSX-$l2Q z19X_V@j%C<llJ;6>g-Yf&me#3T7H?6=j7EhNP9P~XK~$g^_h($cAa${bv{M<r|X;P z;D4nv<^M|NRKD;qU*Fu-`Lt=t!{=C9#@wb;CwAWKIPn45&rU0GSY|st=lxFCxna2D z>^RPA{ntET`$pxBOHOk?-tRiCottiQ-utAfv%l}Oz3C^ecdn`HecV^!IraPbJ!m@) zxvA(KPDzhq>ZSIxC=vO)s@r)#6b^Sp@s1CXyJ^XZyU<P0{?ulV>Bw|?&Hgn>Gimxw zKhA^Wg!{B#q2qLWtvon8!Or_{D#A@FpzD+!=e-2cTZU5whfDpY=Q*_<dhl9L!Jihv znLgn98?SNd3Js_ITCYg$Jm7kT8?RY+|KRz5@gZ~Kz7sF)h&Yb#-}~NTQq38VZ~L3( z-S4&c_ZypZ*q`i^>NrDpJEeY$a}C|taeCc0;{~bxjh5rwYe18oMx&_#a~uq=4r6hY zoJsTjH|;n@2mL7zlIE`Cd%adS=LcSvPTZrA;ne5Nj!hvpi>U?2R6x_=rQ<|SJ+U8i ze%^RZeNeyt`fk_pH`NF)@SSPqI5gbzDEpSQ+(Z`iu<P~inzWsz<2?Mh=OLKR&eZW= z+q-squzf0U8qVfXzv-NG_PW=WeBU{B7vyL^{`G5K;5dUz!c&cA$3NNa?l_$`qNAqy z*HGB09p~DY4t=<@zqHJ__{!rYr~aHbI6eQE<Da0Ay5q;M{q-AfzVT+i2h-ZkfigS( z`yYPocGGj=jqeYh_`LV$oPrb3!>^^3hR3VC*PET*H458<C2Zey;&;Tclc+Pa<o#X$ zhGB!=IIq3&+U?srZUb%vQzUZfe8RG%{=c0UIM2U6AvL_X(Q%#Wd*5pX_Ie(<Yf6$D zWhN(iWNGT0iliE%^&^LDmhAUKdDVNmdPvu=sd(bL!i#mC*B3Q58t|;!XxS=kE&Y*l z9OT|}96dN_V3IT#DHUZ?JI)qg@)qTz%-5W5MBzoYD94#NsM0Mvn5W>mw8TIT`xEE^ zv{|V*n`IOm(woJ`yXqIVZ|>d4+*JEDJkZV6|6_kdal^ETo2E_NvT@sV_}npFV%IQV zuot2jYn`}fW8Va;|1g0Gi9-_+M>dX4fAtO1w{c?9)z?jG<IH4y9+&~~&<u%3HXfT1 zpC@Lz`gb!mGvb+z=Vs35g;@}9nJwaN8!yfF>fg+cSrQ*HyTrT1|7!MZyl?jSeAFBz zK4#<N<`|z(nB&AJ%?aXD=H%*M%z5S%@o94&@%iR7@dd>Hj34X*V*Fvm7nuu*FE$qu zUt%s^{S)5)ONno9ZclufjqhMC<MSQO9f&VCcO<@(xzp-v=FT?0i@7tO?`rNsd^dB~ z)jyiMo4XO;!`z+to;JRhxd)%`ZSJ}H2Xh~DFXH=}dlP?~xzFmW>@D4w_zLrF#P>J% zBfipHL41|DKk>JlD~TUqu3G(H^FSLv$UK104>k`Zeu#}9Y97Srhna`0{@#3tc_{IB z+W6t-VSIjs`OekfnMayO5MOQMN0~?R`5JRI@uP|V);z|>*P2K1`LX62;>Ve5iNDLn z-)$bd`Wy3j^El!snC~WjBJp3FCz;0+KiNEi_&W1M;-}d7spiS6|6`tJt|NZBc?$6} zZ2U~~R6ak;JdOC-=IO-GG0z~r-aKpdSLV6qImFmU#NR{w74tmvT;k`O8;D<EzK8gG zZTvzTf1i0CPrl#0VD*>gMdo{nUu<4T{1Wqh#6MuZpZKLVewld@pMTK2nD~dx53Igy ze%QQ}_~qtht3NldFh5BAO7la+KVsuonV0kVN6jmUUu|AV{9`tLjd>NHUu%Ap_;u#h z#6NE1pD;hh=hvIp5dS1z*8k7^l#Oq+@f*xftp3dWwE0QmHxmD;d6W4m;-4`$62IBJ zf%q*peyjOuKL4zF6Y<;3&k+Bdjo)tG%;$HQx32!g{Jf3dY2L=?cbT6fez$r1>PzN5 zHvR?k4nF^)c_;CE&AW)-XX9To@8<LS&3lMHV19x4gXR~Bf7!f`_(L}Su=%Cc7tKe^ z`-wklK0y32^FiW|n_njW72+?Lo6LuZZ#Ew${)G9+>htE4=A*=)G9M@YRr4#vpEfrU z|C+g(I7gz|>OXHoqT7(@HY75)A<_RV65VDK-DVTrW)sOWx($i`XOT$jpt@b}H0-*j zY1c9>yK-sUbxOysN?g18=-Rc0XIB<IyN>Yfsv)pzgwU=6B5U)<*23>wdp@z&dulEA z%v$CHYljc5)jhH{_So9e6Kg+Dt(`oxR`J~0zzb{fZdv<w+gh_rYqjoJ8}*2_MR%>` zxo7RneQR4DwKn82YcU?T_TdR@4W2ZgTKzGrvtM6*j@8-kto{g_=rhFUo6oNPkk#4e zSO1IE*_VhfG=H}G16F5WA->rB&FV9(&i<bGQuB|i-(z+5FT|Ibe_#Esxr6!7)o+_S zIwj)EoeJ@tociiF*~x4Z-vwXjZ?G#A6W`5ASD)t8)QI>V&UE#woc`D%zL#@^_}<R3 z)hF50I7NJ4=YrKI%(pq0tZp**b8b(3g>yOa{hhn5euaICd#yfZu5#{6{O!(_tB;xo zI1eO#p!1N`M>tjT@YRR$)n2{&ka>u6E%8I0?_Pb-Jj{90>I3+FpF;ed&a;Rg?p(im zAG@y4BYvdwLgK5P7ZX1UzwLX?HO?zmzreY)R}nwP`LWe|%(c!>tlniF>--e)<D56H z-f6ze`B~!ccHXgihk3m7PU0sxzqoq4d7|@v;wL%3y!tuwWas0npEcJxHxoa_`84rU zo!?l!#XQaV9pa}upIN=xJj3}M@iW;gev^5Y^C!g5cK&?zMs`}hOnklbe^x(jp6mSm z>PB;e^EKk{asGw)dCu2YuQ$(k{*(9xr4sS?ma40tFfS}MSFbbQ$4<uU%=fd0@mlku zQcV2fQcC=i(rEQ#<_Aji)vL`*OH1OHm3CLJGCx>4zGC%NI*<5=OBWEoymayE73LMC z%ZOiDx)bq_l<vNIxp`ITUaKEAKU(^>)eo6hm#$j<p!u=V1BqW#dg$s0%xg;zCw^V& z8sZ->J$CgH^An{ftX^bZUwRVpPnMoW{8Oc8t-jyfSh}A04W;L;UTA*0^nJu{EWKp) zz2;4&m#v;}ex~$t;y0IGMf{f1Ygf-RZ^egygZbIg8;IXldeiE;=I2UpC4PJ9?W^m} zJ4)|fJ=^?z>3ziSEPa6ZU8N7No@w4)`q=6j<~^lP5dT8y)5O16`pwl-&3j9~OZ>jl z9}xdi>5o=VG4C&Zp7;Z$KUqE5e6aNAt0$RXE`5dgL#4l7J;8jq^i|@Il)gs%(bB)J z9&bKY`o`+J%*V@y_*cs1)#J=f<tp*b<>u<K<`ZRib*=ei*<U@ze5xE1|7tm1U1L67 z9<3f_eyuzwzRgc`o1aMDqTBpLxA}?wXZ=L-Ur*S(`(m?GG39c3vs$TF%NrY;mGWkJ zqjEsyG9NdZ)oQg?snlxa3h8R~YQ0+7tPxi$8yg#y&5cTx0ye4@l9%fhQg3W-RyOOE zO%Cu=TDh{><YT8&Zc-J=n;W&wa-(WX-z;x#)Je2irzjPdx1-T$Y)}x?sH!<MvRtdx zMKl58P2S8pj`{q3RaNuYzSvZoY|tk{ty){>P<nl{p;EJDt9*!Vma9CX%?cY8o+#9H z(PR3&p-`cJ>fR=lr&y<}SM8h1CY|1dmus>O=Uu6IaB$zGr{|^$Ot16%hYHn+sJmKi zwknJgM08NbnIFpK4LWA2!cfs=4P6!PGCq|iMb@j$1}P|k!P%hs@Y9yZpy^)bU#Hz_ z)+?PRBV8`nX-E+)OB;2uPBJ4&P~uv(MWSk@LFwxOuxu?jrtHWJT~fswhn$<FhJl;P zwTTo#w(*FO7!8BZCUwS&S*vMVKsR~9;P4H>r0`9eRI4_d>Uv8pk!WwKO$er~p{~l+ zCGy$+vZ+&U@L4U8R8ySNi$P@O4Y8i6M)A(JITtF8iG<Gfrc9|yWZPJ;BS$tjU&VBl zmX~08B9&2qEA?8t$y*diIT*BZwOZGxsPQDWb&$Y{0SvNPX}n(4H_D`=UI~L`tL_IR zO`%jvB$o25sa9*US&Nb#kX}%_rFy;DY%~wjvMF~+dedm+rK&E=&2^29MyqvZ&Q`0_ zZu76m&G(MJA2bm41|raUk@UNH&>jR?q!+3L2&z~4Zi{Nv8}*hd&pTLjCT}*4tHEy5 z>gL#1t2Szs1+aiMhc%aBb9J*>rB;TmUS^b<uoTWqfOxmD2}fbOl2rv(Wj#eo7yu0? z4d-!nvjyMW%0?^4wifR|OqE`%0s;-mb%UZn*J=&0+pKWtVBHR+7!vTTIb=J;L!?s# zo7eB{ha$3qBVmz1S)r1+AJD;51Vd%7iLnRG6tA&uLy}krVDmdVfhyJn0`y3-d02sp z1Ptsm;Rvrl@|>D=g>zzCe!k)yF<eJyN-!yxR>rYjZ?(l-mCfUG5Q>UISeB7n7)HyH z8h$5M1FC5Q<JaPOjpmcoYL8WbT!1JUFfDh%t9r$4F|k-|Tk}xGQMIs9C5R^^AaSkQ z7JGT4SdCi`87VBsNRJi^f!6N}ega_i%_dSKk%6cAtOeU^G*0uwnM7yA)pCW_+2OP- zYSO0~?4@i<=Uc7WtRogJ#8hIb=@x8Ln^YSmNQT#vL!FF0`XI<4k={_bvRE_{yi+dC z(z`~jMGvV(oMWULG(fdBYUoeX!i<thO)R!GX@(xClpF!|&GN{WAjEIfJ3?WKQ(5$- zY~?5)MD@*bjK-noutc38&`R_YY@<DDJhGtvVMMI;M&G0{lxnF~(-f+wA|$EV<lmtP zDN&KvVpJ<niJ}2!g?#338u@rpsnTfla%wi)ZJ}H7z1`Lsgifc(-EMd7_u@VGCV;c9 zRxNDtC2y0UqIhG|GroM!i=sts<;pu)bmpLO^m@~@y()Iw22#ghd^2p59Km2sMR2{L zanv_@P|LB6$2BCl23T!0WmF+Bk_BtmS!`>=w{CT#Z5v!|Z#KX=3^cVF8%Qulq={Ok zU_ZdGCbPMyMLBCl$?cn}okgfo&n3&MQP`wAWWP(`axprHrB??*vwRWOxTYIpk7N;B z>kJXvP;VQxrj7L}$2Li75sG4TM}{S#1Tg>B*j6oRxXz*qqHt~!(;LDzv|L2p^?JLL zi#Mf<Tel`SOglt$oGf-67%Z$~I@P8N4eSI`Py#cFfY6#@QfBFm%!BHN2VOO*T@r%) zjRQ`tl^2^%by$t2lO(R!I`9V61oo`%!f4CSHOG`5-L5g;S~yZ~@<2Bl2&|nhrCs!q zl3}}geQRuEPS%`A>r{`DBD(qjwox|h7q+!Kb>tAltzoY-iIXg63jIZ1WY>WQR&sJ| z<AG#@L~50a<sSoxJxW4q;;WuF>uuXZ%7LUcLOP}nLXK@DQexCed}s-OY&w;uS9!06 zog$%Rv*ET$f-#`Zz@jppX&~hi@TQDxwT(WYF7}RiZPs`J)3AELHZ>kV(4Y(3bQjg@ z7+ltpwpD@n4Xd4c*JuDj{5!-prIGDq-wLDJ`De-z2(GDN-!xmaiEgj!JSf%LWt3Xv z>~wS@(shg6oet;Y_`ZH`)!Qz9>;suyAlBK~RuqNAH0r#xMYU*AhiPiv!J;!o<9J@J z7}u{Ex`*Z6Zm__@#$|H1kYXci0#-T{AwD+Cj7+=P0&XOvvNW06tVIVO$p*Y^So>4s z$V|?70h{#=ECBe{t8KWlF*j>2Vztp>nM4UFT&0CgNW=ubiLC+HRcq~bd)<zXg)%7$ z6OE|e62_4=?=}Vlr1!cX5Mm-xDufAm(#)QdMtvRhRC(9LsGwGi)rJj~+D2}1wMnLa zx71I9qzy^5pNpb&$NW~sgblsUZEaMR?m$>!w*n*7^qWu}No>_iFv)U)&x}L2i`}7) z6WyvT9<VlHLbu(dA7nvb;6bB}eL$C7y3wk;U>5TegN^OQ6LAxKkhJP4|NLIpZPj{i zyADLP4!9-sAb>1-M2o1Ps>F?Y7ZK4Lo+u3@mKGdSdMP~ft*RnL&Q0a7G+_^S0TY&x z9oY@)M1)Ybvxv@+6*23&=qY8=2;j!9pb$*^gl`Qj1xj><M)0n{KH7vxsstFr7`N0+ zhLU#D0E?9xWsNvF$x3F;1HxfjkyzEGhrG38j5gSrUb@h(mj!#dxHM{=CW}S!Lrrel zQiOym-}2<3gj%J|F;reK%Blw-0j}B%y&Xjg&N<5X2&S#6VvV*MUBt{OlTP}`*o)~H z5o^8CH`!2>YDq>-%W7x-rqk)TZ9&PJl*pED^I>hdN+)V+8M&rbOK+Gv&^}s}*LhH? zu*~gtc$-tV>-T!T=M}lT9Jb|quXxYBW0k}{Pzzn!pEt;Qtj_FAv(?~bQB=FDcX<Z| zsp`x@;~3wn>4p~D;CiPCwqfJm8r!OpBN*LWV_Um{Xfqh<k+2OJfVWb>9NT!wtYooG z>L+ZgcA2e%`exTI&}-dFtGemt*v5!e+QK%pPu>7w8`?`_WxGMBBP2zU#S1a;5PF`E zSw|9T-%Iy}dNe=^gcP3@q<jaI%U~X>>^0@shO7wN<ceBjTL<}3zmesNLN42Rd}dL? zFUd3o=;f`kjUJv&RZRACld!FQh;4$PX4CUzh1e>@ty`0@jdhczBcxxf(9j9nn!+}^ z(MCUo0#*D_KpF1@I8tU^JVgpZ-|M#O0SQ5pHk>Ph)l?TpoOH%YLQRRAbx(<EF0d!2 zi_c<d!7-(`x{YB6wD3OXCJmHr(iSXWN}*l!krbQgElgf7rw)3FFr)s68LbnxX%Rt> z*4RcN)Y29Jbz2?g0bvF9PaA9}t>gmj)m+$WH5g;7lCXewN*(b#khRSlyEY*$t<h`+ zU`eRR1FJmS!+higVR}O<@&S+yvRc-lPG#}IrCdF**olh^X4`Opj?~g=^}1q@mijcY z*)C&$SOXCzBJILYjY|VngC$f~g*R<Rw<&A``((tTX&P){o7Dm$^aVJ>B(=o+CgoX^ zU_h(IHL!6b5o3|(W$g$?6=|CthV_7Q^pf@o+cXuag*mw{cA4iMprYpmfgkvOk=g5o zVG#8Eb#klThu9|l2C;69ZFauH9U~8*ElN&1uY%($?_klHyxCd;qlU(d>ey`<>J7Jv zB4XpRm?~N-Pa~hJT^US_EpD=A-EA>Cj6|#HGEx|54G;i+!|(>C(}t_uxl|xZ_$(-; zQT4#Ku)gV8Y^!^fc5Sl@n3A*!f^-<TN{2zwz}R-wVf-4~kYY$<z_cThHO-Jojzz9T zG%1qO9T07jP!$s;lO?!+ND|Z{u;O2bGGh;#DJFom^^H7HM{;cgYXO1<m-XCR6r+1? z5h0`a$9a8#ZEjlu6OkUCO_(6xgc{5~XbeMOrB#sLYV~>zCIX1)?1I+cWQ4;U1e>m- zdQ6549eYN&fHvwL-Do#@9U()lVV!L}QF^UaRWMKa7X>}9T@O7#4DC7Kl;9PXV$<;m zKEV;JK@ztbJ=m)^IS`7`VyaSzUrH}OpT<qb4T`o7m_@CsRxK=jP%k!1NKxOk*^r;J ziELEQeA(-1{h&z>$Z=I{3&Es(S!=B(*hYyUuCT3<W1Ce#FbUMGcRCcLPl&4Qz_ROF zjG~olm&Hx83XQv+!Wh%@P7_;JwOAXh!FMZU+&j%p4X`?D8PVCyIVJu}E+iBBl=pir zyL6^rb=$rt1wvJYs;xHbF3mwOyN;3xIcPHDgPCCO6jh=9ZMw*m)nRZ+fPRSSvU_wF z2`c~uS}STcHHGGHgmd|7QF<lH4W!&B$6Ku(y&`Q3Q>>6tyQ&1e1UJ%3rO~&Xy4_yS z>vg-u_a0a#G%IrV{3z1*^?PAk7l>FlS>_jrb>N7wW_wYTIwNe$ivn$X7TatGi_R2{ zYl2ZV<0lPa8#Z&dt^VQp0_YCNE^li+zyvK}mB`r8O~i=qH+>`uY?I9n&}jV+6jlI2 zJ~P)La;Tqn1+W-=#xQPFd`%D4hF^8-m0oK@i)Tix+NA^{R;o<mEnFG(hUa-&mqI<e z*r!(&>`qY=>r?jU8md?fLGl~uen5y#E=IYuA(r&vklM_8MPTMw2O;w&NptILQxl}5 zw$to#Q8A%~Dz=!<ZLr>xq8QzMgwjfTommuslM_Say9zCBf!%`YJ-T{M(g?ZDGEB-x z#MRgb0nF8SqXxGqDgTONp^3NygY8DAE8a1^w_9+xjYb4?!)*rL4oFmQR<JBkOZX|Z zLeFfu%wU^I9QbY{_Pb=-a1S^|Ix&@BN%9Ddg&#l-iQCNp_Ua9ZNg+mysRhTBUj7W` zTXN`q&Q16!R~=BrN>572pws3?g%{Rse|8_yPec$^2m%eKq=5D_IDG3edGNJ~$=2d^ zx77;x2B0)?z9FCjLcZ2JJnZ!-2m$2@b`YY|?P{*1c-qByQw|Vo(a2-nK#!1h)!1zZ z06UUramubxX%JxA?zSskri>0?BIbG>_$_{j|7e%BbR|i7zXg8^DyiFve0j90!e)}Y zl~#-N^ai`E+p_gx9<oCYTyckits3p8$6CU<9qFUgULEYhFirg;dGgtpTw7HX>bh1t zmCkj0kS8cvlNBnJuD4y*j=lUdEfQR<$-ZHgDIPGyd7bb&r(REX+F{Nh=<_4zC@OLX zVba(4b#klT)^%yC5=8m5zi5#i`=SvDKW@ot)fNTtb^}cCbq9;i6piC~vu=X4VE}EU z&TFHHSW!4%i{d~fp-&By5_v&@m@OJT7j`44owm<_W1t}ej3t}$EjB}&)t=go4Xx=^ zE<N-TYy+ulNwX5<*cQ~lHos+eLs7U|7hfLBR_6C=jcH5vH;i9n8xRVqza7_h3_*by zy1bn%h9JGS2{na_w1~7~McZt^j@7$$Kv37gwPh<mBy4LVf1nz;)}Tc~a<}Di(QiT< z7d7hvE18mh)+Gl;by~u&ygD!+Y|EDewc5A9HiYQh)M|GcU13`*$F?rp>76h{8#R~E zYdiM0i0}f`Xsbxr#t_+|YkTZuHmi+*ZggANV{os)HWW$Ph~n$2qe9I}+7E+nGYLG+ zl|qXmSeE+aR|(<=lM{(Mt+0*Z)YMW|Y!{ow&w^u0kKaS`iB{-+&P}vJ*cJq6pbQM~ z50@SAB}Pl}&n6ZhNE+A{hS<R<uizgHbMXN6I$#UD?@<Dl0@@d<9$}lc>%<B+h;a<I zn!O%&9n5740NZFM%1ZSVPme$!`aoL77|aGZfGeIz4!Z4-9v0Xpt+7JZ^4eaz5&+yT z9kq-A+u(ywxk5Ccm?5(zSSg~N*6$|7_uM$3p*SEchIYEFyLv8CE^O<e@9LG7O{ki^ zTM_HB@CFR36|j$`jW#vaL7YD*Votoq6hMkBwcEJy;Yv=ft3QL#>m7=ZhF`07QCDlp zT=DqU@p@!klYPVQ_u&C8%IiG9Hs8l83lDRKU|Bzj?cZ2X{xC{YzV~e<0^fGq$ECGy zvdpf4FL|5R`x@({+^`;bX`6v@=!I++tvgtBCU3Tf1a!f+Fl!3ikh)$+*oM)BZXA%- zfw*0e7MC$%3!sfnt~rV&K!I(@3nK%borP^$D!?tUjiqd>9wMe`vl7bvR%?beJmLY^ zri#Eej}ln6vT08*J93#KeLdFkP$#fLDMex05o!K$CD=K(u^3V*knRVB7)ZF7+}A<M za7cx&O5BupO^7?#MhvPoISp1|8@ga+@@#C&<x@oz0c^8Cigq%)%KMws8r#?cyCpT4 z=FUw3LDOrM8G?L7fFRdp&SN4#Cy}gM7G=K++XQKFuIYN>orbOx;Mbu`IkrWf)DIMs zez|RrsbA$Gt$-T?(yC-h6n2|w$kI;$Rdf#yik(4EDx70mtFcMqPAkHmM~8cBY@=SW zw7@nMAb*BDHx}F0+?3wpRfr;1OY)7gTvUo?#cOq#aBq!mU8-ja#S~yTu}SD;j%_Z2 zY2C>^?6)9vd+l~aTeY_9vgE)V(%>VKU8EH|kukQ44uH{4zz%y8UbQXeDn0E5+gbt3 z_ztb*qF}ERu~<j^?I^QCWs(*0^?=q2?nw%ut0eG2D9b7FpC$@^SedTNCr@62tk_<+ zAF6G@x-3SQoE;cUZ+J*UZGDVZn<>sB3d>OpI(0(W##k}~71-882&~@NNWL*jwFI_# z!lazK-2n1sCap<{3T*Q{tsINAZtrmZ&ENDeceFIfu}uxhDF|3|Mu#~gunaWo7Xlu~ zStfKV(sK_Eu}$7O5bM_1Ci`4~D{Qkxu_4imEVkJW7M(e095Y+P#G{t54Xy_+_{sVm z@7ZC^)^%5pFl`yOE?WR@3&<4bne1bv5Cct0!l20M3A|JRLL9U5u2Q}>r+M6N#PDs< zs>WJb*IIGC*QiFFO*sacjp{xF$FdcBsD>AT&8Y^fia<U$D6)P`DGEa)YFi80nr`ZH zz|urjW7nzb{BR&sV8>3AQn);HJGg-lNC2G&Cfq|}>^aqi(A$+KnqSq7?1AH6Tk_ju z_edd^%pBW_f^?5PJUJFjD<sJ`IOXh!J%vug?$cWgDxwCWaBjj(MYK1N^n65m!uEb2 zj}yJ7l7l_^qA1-_)H)p%(GOos5)GXj)Y(U<wj#RG>-2qj78;y9!13Pgz)vYN(uxc< zQK5EalqLOMYY>CgC_bZK1gUN-Vo@t>5kG($5_j8ufK+eb5GjfwDLAI=TEVfFu*MCR ziRC8P&}ev#2oY=I{s&rJkQSj3qh;!yP3R{egP8UEp6hkGY}ujM5nAhZdjzdbG1=TG z_JU5QFZ5%9k*`@{3TobH^eCa{cNl5w;s$aUehf#d$IV2m7;lQDC|-5iaE#?4{NkzC z@!dW>l$pz#P$naGk-*IF0%j3#M59Q?3lBLGKg9oT8z@F9R6^cw+PN;F#pIU8SPyOF zU9i~gF^L19^oBMCuIi)7G!8QX>y}=S6<19Uf#}sL7|}ie3qnb}wFPNMUjo3oQ=E~O zfSJ}(D-@vDi=cpoT~4{_gagr1&yV9MD$;g?@NfdQZ-S6EG04<OrAXA8qNs1zoJG!l ze>fNnv&`x(QId>?gJGJjlUwz+N@6pxBK2e1pSLLY09w&kB^Y&VxzzErLfW86aILO8 zSac?DHWOR7*KU~pxMkRu#ETYo!M0XM*jBWZMJPV5P9tVU1Q)s<*w&_(c#hgFuM4)Z zN6C_mLswV^WCIF;EC^>1>oeKe+VQM(8d#zAQM=j~w$)qxdaqfHI~6#?u|*6+(6NU0 zY3~@59KUA^7bHGP$X27GHMv^qSPvB=mvb<r?)<&(2Lz(oX_BRP9z6G82uOr-+8|*& zgf<q+U|XAcsA@yKjglz@Ynd#tEyu4M;Uuv|i2VXeSpuRpbjVWvm(AFVE*>1*n>bg` zO&wMcerJOrup@&0bUiOg*s{fIE-X4I<IE4jwjLt`=UTmh544SS4czUv!8SV6>#){D zSDT$GK86;m0pMr^!8WWFRH#!O57WeNkNSZN@}uqtfqZT|W>G6`7iT)n3W>X&q$>!F zLpVeV4TBvrQfMwv0n%-YKMYLgfS<sPu#J_KeB<Ds8q=!!ovz)OIkRihS`27Sp-IwX zIORa1{Skd~y?}KJ=wPu8OCfaKgnC%Bl1H!x&ePaNlW(k9J9zl)G;G(nl`s_W<*fqu zgjj+Tnh*gTU3yAyQG%eGguZZC?pvM*ObbdIbOW%BeFj0Um>YpmmQ&)ttUc0W<rSfr za#5s4*vtBATb<6(ch9f5-GCWf=CrVl`lyR#6An4u>4n>%Q;aT0xGc7j06<V70SvQx zV<XvHhu9`xn9_(q5hx7T(8dlm^BS|;`fUJ4#rbDiBvWinzI_ui7s>m(uJd58AdZtn zYtSO6uxvOQ42s-oHXiHyVGG@uEt@qQYge_;m$R^~D2lQ1g>AMd7QR8Mj^-UKI&;uC zCiSLCCT(FGQWtpzwym*Sh344SXSIzGd%cQgAXqBn8*F1Bth=e9sf$^R<ia)@j&DI8 z82uK<Vp}s|?J;gw6FDF2?WEy1tNk3?P^Ct|q=ZXO*w(-#$I;PdQqg__q-qLmvmNUM zdW=<*V_O7|^Y_f+B33mJf|Z+Gc9FrNf_dG(&`UbQ?5-eTI}_Wm0K09!Q(#+Xjcp;x z=r;jB2jQDyn{)&TL_00E<*trKBMuch?Q>uo6Xdx`vriyw!-5f^N1m6aU>hB$3e5z! zB01V!UrNtfribGj)uy-Ih?PH`>eG$DWvvPK*4Wl_0}CgbiD4UB!oSHVOM~_}31!t{ z30VbIEUTs+qs7<**!qBHt3qPW%@7g2Au%b`Ua_^{n6l!}kmrURdY^NX{J3x%m|?7C zSuM7j%+5TkT1KPzXA?S!2qI=_>NA{xvS6nVwsm_5rt}!$WRaKj@L#9k4mcn@L@0m= z6cU36$zW>7XtRoL*SM7kLj)vbVH>zU))_egf9(PE!8RtqZkMNGRZ0)FlGYeo@0*O; zPUwYRrH`ov<Z5-?j)O|hsT?oiJL&Z*@3%!n8X|)^@&}3d)$mkOrx#SZU9gbekO$DT zwjrbCVwiy_^a5;S%^fgqKE54ECPrPA-DcO-7NqVXutKNF)~Czxb_KGxa`OE?6h&uX z8&ah`1`$4g9A)`ujH4(f>zcxpH&HChLfB?gA7ER*pQQ<F(4v+!9gj!j;jqY@4JH%N zZMZI3dfe9miyU&aq)hlyV4EHLq7e*zpq*P=6bs)l!{A?cu;@&%Zk*R+&&*`=4%k-1 zix&65&$i3H_W^G>hM~4MQw$~4rRP_W(0-tCq^53$WU=^Udt1Yc^OLhFooZh$F<csW ztYv4{09Q7>G8T!`PAwC*H9A=%Y}HZ>MKzpLQV|1Jk0^?^cYE};)q(Nyxj~8bV_HQC ztbya=tn_{KJm+9+f7hY+su{|?a)?bnN#+R0veE+_ut4*m6^w$f3HOi~`zo`u+o=+2 z;B{3qasZA8-OvV)qXnM!%oOZ$SL=}?WT93d3LIO)!DWYsC<_(3ZJnt(n_7s<xv9&_ zDReigz^NVJP;2tRkW&GmH%7t1&ih#f;xz3d^son+kHk9-T`y_WdvqzK8)0`4!9IN6 zHSG%e-H^k#R++W!)b7^WZf!mp4#Lhfi-r8*LHAS?SedYa+M@(<gv~1w_qs#at2ZIB zEUK<fBak)hieKW7+aebZISowL&AA!!tr;}2v%otK&~D;M0Y_>!8@P8iVSgfmh#95; z_4x=U+MlBTp5OO5XNP4NVZmit5PRN$Z-}KEV7Iz71j68D3)RKD%}8T>uyLq0ZiNQ` z62+6u*W}4`pb_?%2WT&|g$J$$V9o%em9|=cVUIt9E0kxR@5Q}J8Yqz@%5#$tb65Q6 z+8uKEE=WC;BB=}kq;JOIIMcM;=vfT)!;06#V5T>?f+7#cr>taLLL7zE41mYkYr%*B z*I!t#;2?-tg8&HXU<AW-7wH5Br^(jK70=TYn!f?(!qlQrfo-|zgsaI?7|AbIr1dey zis?6u2J)Dp<vORkuJfSOBpD8}L2{6DFyN28&c@>+_i!|y^L?@|*{Zk2Hv7Qmgb0Xr zfNem<VP_bdu*Y{>6bs*Yh<jn(!J;!o<9dGRw#;DBG1{E;yL}&QgGHR&Df+Z-dox3Z zumJp^%CwY(u$uw({fylc+^yQK20yxF0}5*iTIFfRb3+smY~yjaH9%@-ZfzjvW1}-@ zhV5GBRki8iasDxGcDnVLqS&ed+c>k(;cr|w1!2CQT5Qu81flI%H_~Ht*J`}m*Jx{K ztLzMmSk*v?T<*Xxur26G<qImnNW!eVYhp!R?YXRHYBn@nluV(|MZXEXrh?WR7={+- zilTJSLfJD4HNDO^IC0YE*yg#n#<q59|Dg9dB7ne+x*Jsv8rfDy9P##tBYBU6ZQXNX z8=I$1<{l9`8f$|~L)T02YPz)!_!>ptFlGTq2{pAp@S=d_E?l%*>OAdqYm4b<7`Zb! z+^W?GeJw&)OilYz;hrmgfZ`<fyQ3bcz#9^iLJby63yvwfJnHyK$f5T+HzWK(>;(*m zKIW7R3|3mS*{zAu9;VaTgic~{vl1E(LxvM60KmHm*wzb@AhHI1ObOW_=zHE!xWfX2 zJm3#Z!IX6oOExBBFLZGj(@IvTv=e2OB`Rik5px4M1^!rCU>j1;lWxe{xHqJSh?Ecw zE3EHZL#->HLp8x11^@|Ui|o0d6c7-iC6t1lo0m@=VCTAoPOBeI29nvP4;qp@sxlQZ zPKYb37W`sLEte1{f#uPo7l2*ZiDMk<jVfb_Cs+HU5^o&aobS#_SfO3Z+y?0Nv<lV0 zh(M7n&G=K%Yhr;X%T@agP!tabX_lv?Mg5c&YEF8SW&MOUfo;@DrEqgiX`1`fik!pY zd^Vd;r$z43c(ItxC)0IutKMwbadbtbrR9Jxd6N)ikzS}0j5?0WG@G`lBu@IHCIFFl zu;@(DI6uI@X@=YG8ru>dBjcRd)*7%`%+_}h))~zt)EtEr2-`S+fvXN|W154d7TeTr zoYJ_4*tF%0gvGWYPJ%_ZJ`}b!-C;9o*9V8#*5^P?y`OK&dp><?yXbmLUAGWQiCTPx zq3u{VmR*VslVe+Af3qe<T663G;c{%#^r;Zi2jN~Gav2Pe_|VG_nJca`m4j_~e{yVV zc56xydVQ{ZKOo1p9KSp!P!G59VaTvDC5de5Fe$GOZ!jWRqTqGUK7*&RYa?LiCeIJt z*kW5g^s%@x8iQ@JJ?XWw--?87Oz5!3cSFn}WP+jdlV$^KbBA;z_D1~>T?NJXuME^N zxJi?(w7MN88?UxKACF>pG3@&;2NTcepvATfhn*By9Pv6;5(nPc4?(poi7mE?$zrHd zh+|5x6&!vNa`>`z*8F5K8VcKRu(5ZKmsZx7%jSy@u$*}!Q9VWLTzQn;(I{d#^#dL^ z^fJ~my%52~MnUX)VQ)MPlU{G6dhkU=_9UtWd{`H%@;(K*T4HdxN7$BV+@wEhmCr1K zH=o&y%vnTxvDb7V2mUC*R$C*J?<OoD2wp$v2lXrh07*o{x@p8*B7Oj^1eJoFo0l)1 z&<F+nv@MCILq39S<e&-cwE18gy`ez~h-7U;4w-Sx+m4gAwZLYu&5s*(?8unngl&+p z%`SI{c+KJsDYB%68~t8Wg#DEb(zL*~d?j08TihQFvq6zIM05*u%HJfZw2vdGd7ZQ{ zrz{(fhNHurqtRk9U(9Aj?(t-MYq6Nl*2%4UTWqsc;ce>=X@A}(oi>JwMhI{NzT2Ww z&~_|r%R5+frf8fW#$elMX|atNB@MtfSj5S+!{Th)TSNAWnV^MjSSAtJ#&Cvy#z3%@ z#NkFQL(p=tty@d9nJH_&z&0Lx?Gf0v)vb?o-mdA6nsKK-1ly>|=QoZ?%k}tgD;gec z?*-s^$7SnSd!^8TYI1CgBHJ+!7ifrbVr+;~Bv(~et8C$l@aaH^O}?DOePTm|$m&H- z1ssJ;qGw<meuNrQ%#1{+V~b)yC?s6M^tk7<N8;o2RmeZ*=$FT5VjHgyjtUmort^Yl zQwIS%H}wMSMQ^hv3r2(}2f=va;S<r`4l~HPh|TU^go~BLZj|r=eZsEEnvI}abH{We z?%_v+dmXQ?zJxu_vRR$6zXk-@kb>o6GLE}jqa*;LVymxt2QlD-?f{3KEI0836en@u zO%M^i!E7Rh+H0|G%`s)R*rp#mU~0)A$ph#Ufo%cUCIh35^`-SdUyNqjJe$ad2!d_n zu@Fdy7%(0)R$D$xel{{dyTp(D@hD1te~fJj4hRo%KZKGDuq_51*@|GXXcZlo9HNu5 zIsi&=+R-XXCZ`Nr_HPEU7MeWaih4;fPHCFZ8DcpcV2grn31%bMW&x07QWJi$CVmJn zfnSc@Xh*@8FP_kd+$G|+(|9&gX-#$w7znV<4@ggM_#aIYpABo-hB>xr*-9_`4vdI7 zUk$clNA`1UlX#zrZ8|v%ARJ(u&YGzrQH=ei9n3>)laE$=o}zv-9u0<hN?Mc-4zMkM zld|)fW1D6Zp>Ixu!36)>Vb1Y*3!2XhY@1A%+gsc7`8v5(??Y_E+m>LB9bg+~P>yY? z1Z?XcV4Kuw(rgwTEILy(E(rTx$4qv+hJynbHG>dEWKWqR8bwPvKC9y-?J>)CggA=p zSnI=B<LLQOIL1?{vqCKYnQ(fTS#^F@$PCQcJx=y|2@6Bc2vJI}J;9B;^y(9xNojQ_ zt$wFI@@v}A_3PbM%Eosir6{(l{gBgKo$g>TXy@C9BfI}ByG^?=P%qKa6g|&*KR|Lh z3<s%Z2myx>xm+6yr*#})!ygbxXG4siMtRpnn`;49n#bmy$1jvT&gLs*T!<MVU<noA zT~_cp8{)H*b{NKq)@llD4f-5EUDG&G@Vh!Mcs99g8=aecR{u$Fvxb)2W+x$Qa^^gI zA}AugKD(gxH#WQdK01%zxErT@K$Gy<j9bl+wJngqe`qyLV;r*`P7nrdbu6-m3eu|O zV6Wco)sJk?rir(lu*R;}g%(AyFgIeY$^c05Sd-OA9Qm^_#&R1C5@IGENGvTlrtDsa zTrs$dsl}>m%};*%5VxmO4&!oc0}nL_#Zr@uArr1WlXgZo(K<x1UhmGPeTFk)zYKsK zV%r2Uf{7lpY7b&&fSA3xDPjr^^b%G(9{q&SU%q)s=CgZ&@c~TnM@;JV0TVSMV@J6U z|Css&{y6kUsf;nEQ+!~tpN7*x0$Rwz@`YKl7(M3s2rwHaK~GX<8PVq#YvKn>LBcQr z$y~k4`)v^s5yhJA4El?Sre)3sP*X2X>OnY+d-MiL9tH{Zk&>NFHXHE4(F+{He$vgd zFu>KoSmMpoPc+rR3~pJIfJj&o_rtX}jQK51Go=wFpcg1KAe$vX1hLZosePMGC!=xx z8Kw+ISwV??GhlZ>Ysht-SyAI?G@DJPhdF1no#k?8YpcjTo9`as`}R7$6nw-%Dzsjt zrR9V#d5iQr)#8nP-B0v;23r(Py==ze>~#l=&J>LcW46)FbkDQc#$HVXwsn25t!+!P z5eMq|q3f7q3OE+PHb!gMPXnfH9}g%(h+_@m^uQ0ae2r~19AA{rbjmMI>KKkSzca;~ zbEMap*4Q>}dDC{{HpXC^DyetdS=;j)8AY)T4YqLt(i;wk+AD=rjf$?<`+aNR_^GA= zpFIsr1AA^q@7dxO>BqUKbkNI9t`PT`LO+zs7gXr#EwK$dI|NZIwsAs_Ej+-l?+>`> zHz8~*<oK0iTaJEtJjORESjD)&0nINM)-=u({N6dRjcucI6F}gl{$>q0RjYfc*5tD} zMkAIfs&Y<j<Ir0>NVFpcGWL;v=_@{)G5c|JYDzcKV3x5XMEe@TwtkQTI8to;Ye1I) z@#}lb`7G@nnGUdO>#5b(yn|S0kvAU10hSWBKH%A{kvQ__h=|^#Y+&GXgES-s$CO#R z9rfkh)BBv8<kvpubc)BEV;gv=Z3?ep8I7rTHldSV2xxlqS;BC#BGEE&%xWtH+tL{C zQZNkr;dI&`1mTP|F#b3{v;H_F22<ASWdI)jIL0{BEXeYbb`A#;7|syTBhUxg0^YQW z>@jMrMulw&Z?kANq-hq}u;jb}(*o#*_6(x>ILiT0%pLXXIj6+`*jFj|v~Bs8C$vlf z+pIH4wx;4&J7N(*^0XdC!#;=JB(B4d4QnkjaCfuWfVWb;0LwBqOrkJt*0a8!0pb9H z(z9vD25L^6oaID@{B@!*6fCGBQIfD>IT_-R&&e7{%x-zkG@DJwlRPCY;@C!kPWhYR zNS1}LO|uC*H)|S??OwqFD$eIec6N?zZx^}eTYI~FU#^o|_13}I9CCEBcgmN%MZ&iA z8&yJ+Q=Pc8MR7=OFz0agx`Rb$ipE88>bqusv<J2|_|?ZKW_{}gYz}Zrpdfpkq=PFk zN&<FE>e$rd6u&rv-H(Aheng17sf`;sWZ#CfHND1Io0&|8fj`8Q<OEm{)B<;o|8>uA z%xi3owtMq-)@@9~nl^O9hSwgl@!cHiz!3uz)2D84JRajL6;18o8mlO&?O2d$UlHB4 z)=Y1N<f>}?arr(fJ{<_L$rn8lOH73%N)LCk5wbia2($9830u1!^-{mb!309vN68dM zT={-L#Br(!4~#<CQ7DSi9Y+tVHHC&==fgv<#zTd$x5?+TsXL{s=OoQOgJ6?c+)AsT z@zcEiVk=;EqOJYIzpijrfrvzyqVp`^d+Cr5SlK><)o#UfXi7J-a4}>@2&17vPw-O> z`qogf(#lG{;RTJOyIYIQ-<xAU)aw~AQUnb6xHlaMS)!gef*D2Pez1j+s5dMPNl^@m zQixy5j(194X>#a&&P~}podj&d3+P8IRb8wvPKq`LVVwU2;H=ICLCS&~G22?C3@4zB zeS>|LrV(awMz6wf93|0Wo{pku0q)?B3*?XU>8Gqbu#JaoMKI9}H5Xd{U41kPSe$c) zfc9q0-Q)!P@x1y|c4TGR#ym~1rxv3DmXK_<5X>4e$wq!04Ew`=eTrTrBocEcSv}`e z0RL$s@PpqcFJC+nA`)c9j<TJ(rsXzkJ1oy6t4HxT_2~`rJdOs`M@n2m4e%FZkzTOf zk@d1+9A&NgfB~fG0D{DO2*2|6j%GsbcE;;p1w@fnp&A%b26|}+a}90$Btu55_D@BF z;e!3lJS8m}O*p2OQ~qW=fjtZ&by6wZT+?*Q3Uo1@7CE=J_V)Jnj~pp-Z!eD?-P_+e zvQBQ*n;)93;TUh*5X3sbHaryh8&$$y=%CMcTa=V(s|~~Q4i=p$8W$&nplh~H_=ZDe z?Bh%lY{OnCY%5wChVtKs?wlXE%KlC3b_N<UMIr_99DD)W5Kc|zVJ9NF4`hMHOoj*$ zwg%WnDPeaD|Ld`!xy5n<C&pH1;5FxA9nNq>x7QiDe%Kt@6LHMjb^d;dKbcIlp8(CR zdrjDrWwvACQ05yWm(ME`Bv&o1*KwSRB;W`$a%Mx}w9aDYxdTej00jxN@~(+CvkDyq zeuL1&_+Ovi7?W%mDa0Lx9KUjdP!d~&`4E}6Qrlpkf+Ln|nhzC1|M1UGF-(@cIbA&` zMg5d%yTUA<kH`>rNwU4<sGTg3UZ|PiR>T6U6Ajq1X94eLBR<f!An8v#t%NSk>BcbH z9;fK47dG9<1qg=#4vn_bitaReVdKR9&h{`kw#7Ocqed{Y4xyMjpMWJ%?28|4%#%2Y zmKce8GsMZqf)Wx-3yvu}-YI#d$)Wc-H_4B~-JK(1J&tYQ7wczzo;8P2A2V-#e4*eX zd>8;Eh}m*`z;LE4x%@1gW0Az^I2~fphtZf47F*dQj<>NSIUo@Zv0DS03Sn#vc{l+w z0)M2rkYyh2oJ>MlqO2^3Q5Fug#s&QGC<crgt5FallmLzT+moSoSuM6Pmn9bTLwOwP z^C5;^oKi?Xm<;WDd=3bx?<$2ey0(1F6U0*i#P3c9yIbN{Ct-y^@?kyhV*=6}9**(q zTl{335W@^CR4+KfGW3U3K5W;SO-8JO0V#?17+zVEfM|UpgZ&OszpquODiRGrFQL#O zwvmL{O-up>$J=03o{|<#0KqloZzjw|`t7KWWKie0sBu1DF6B=vaxRz0jvhU>w^!ue zIdbAS-}l$)t$On-3;j$Q(rLH_U-CBTXzu!rDiPr77@#d`I-ZV~9S&32BPU7GnWAw? z%AT3oJ}GQ#vaK_<*cRy*y?Or>+v6nN1qb<L|7H!wVm27XoL7(1{+y$KEIv87t;swj z8zyRVB8NZw+fgvac;ftH6xE~dHrRGNXl@JJI{tQN=rtEnou36p5ePDN{ir$S_bs$N zO6V*9gZOlc$5*tV8Wr7W3<e`nG!nK&F~){yidKrt9FWcT8t~~rcwIDMVk-3Vko8e{ za4!!``!-}OCX{zg__Q1SU=Rizx*~MKrdAt+Xu?Im34K=~$F>M;h}iBw4D&HsgmoKf zYcM(k+s1Q36zF#zXOoA3otvU03r10;0i3Es;Yi$A?qD>6ZNj3n3tE3;vpXK>uP^iy ze=x?Gj6QLsaoTAobZ9|0M)7i-!96c(y0IH&G3RtyTFL3gl+a^9qUOn?N0y`D`1T}W zZXThpMF_>x1qa_!6j=O-dJPh%(M~eJxaT;C^~Z|IVrjuKW#`ygl(N|%k37Ax+$4X{ z&AQv$xKTN_0k&yRE()3ylmEQwtWKhJ7=U<rc9z5bz^+JwK{Ug*>1VTSM6aS~2DWW) z52pS8l2t4IxNyYT0@kd^1x{~FaIkF>GtyG@2yCOB(@DfOYZMP?)sUE+vGxM`;cO&h zjLmEiZxD}@B|YqGgefKoCOik-qDeYQ8#DHw1-Z&TA2xDMambXQQgk*><y)QrunNd< zcRJkL)&Qfb0V~LC)aWO(K}c_SIO{WBTGit2Zi2sf^l(*hGGr8tCLDxlH^zfV8!Nco zm3{)h3Z%(@;gqneA_Ci3g{mUaaL9(`)@)Yn)nFi5Y|HbG#>?%+R-Td;O%Lba(L`^i z?0m{Urfo~=WFE<BvDn$!UM?0z&Yhj($B!M~-!JCwBfBS09zU^vbe-I)w|)*{1)SfW zP9|G?$=jrz+w~h&!d~bo<-09vHknO!gl#%<0+OveQ#3BgMv-TBP6xs^FN<dxwjuj2 z{OYA>X&i$W9EsWHu(9mlK?_gLY&h<-&(<HLTbOffCB+;wWWtHbhKbsop;dkMfMOhF zIN_QYj*Zyc!Hs(|Z0+bQu^a5T<6djKU)P3ipWkm!yFuKV@>?D@tK*bD^@90)j<Zy> zZTD#KBC?xiK|96;iZCNpmge@?BT^)`xJ8`ngAkj1*^^sui9bw+2d8u}X4heWDCa+& zQrw`;jU*gJVUy4TubZ+`hw+SyeiIU$(TTSD34PAJ_1Q@~3|nJ)oE4gSeQ*qVYpl=@ z)_;B~-<7v<k8PxLQ$HPqlep3VPSv4kj4L=hvK!+Qk&&U_V4i~ziT+4CVj$yi$`H}I zC`%V^JEKcGbYt8<G9C8WDvew8gvHckz;YKZ+T%ig+~nWs6MIL-;mMt87V?7<W`!bP zz-Qt194v_wj0(WhZ;&{Pche#7I1YmS#<~;|Lko^6yL3AnX5`TOoSS2o!`{%_*~wB? zjrhMjtgn6?wkG{F|9R6{U5w)qD?YsCyGKS0CqHCOwM>kM!(=cUj1h`{f0hiB?VaH) zNsgqUHWA|yXA2_wiDa<!o8XU|02yI0)m(_<3(=X+Vz4?Uk=iwaJ9s^?&XQ<r#A-Ae z;p`dlcA6fUgJ;a~l!!SyV_Lv2LwjafYcWb98bUG*wNWeQl=wejC96#atz7ed%Xg=M z412TD(H+UGo2jIDFm5I3Y#7lS<aw4%Cw-;vp()@mrXJ9m`0<2JWa+rmnlOMg9YBzH z&)}EU0wPXi@C&EH8<wWisqC$s#^den?d5!ah;3T;u~%bhGCcxD6=?@^KyXd@oB2X+ zjF?LG+pO8FsBwFHSN^o^BIoYzsgoy99XnR!-rGNY9^a3z(_8iCR~Bf!NGE-le97CS zbHwX6s-)i^am3kmZBg^te75JhMF)${6piEO4{^`zUJx372GC=#W`MmE^!1B^qNV&a zfVTI&9gZT8`s|jp@U(4@rzz7mKZ0H2_rkH(XZg>BgO>L(^O_5^N?TF=Xo~T~*=`>9 zd%Mg}r{mVH&Jw%fZg=9hcKQu|^4#yY!tTrq`>h#8X&Wo!*smY5b?oKahf7XDlL{J- zt%1{@YH7;8LOwezkX%*WXy7;%Nx%{2#2Q>o?$%+3%Phr)KcGQB4<m%_3~XciZf4Ab zQIpV$I0~7|;+$mDL?Oe>$n057wjtP2?X$ab7?x9H-b!stuk(Xx98_6O75dSwvCUs< zoBUjq42IFPUugoTYIZ#3K+<4;pJT-O0T+_RNZ*P$^wv$roCi)*=JOdJ(A0R4ZL=Ro zmv-sKG})Vvl8pAXINJgcPKWZi<<c4k{TBZ&ICXSy8lB#q5299M3XBv1YiSTI(PGdI zTOaTYnj{|dk7ht1Z>HF91Aa2ikb!Ll$CN$B!9E-h$f5T+H_0D)Bd~42F9}kRr#E1$ zwI8)$w0_=XPx%~1{r)6MV>Zb4_a@mm8F9drHRv`LNjBOZO)=>E$pZUrcXzx<)4eR> zFk0H5XgiHXBa*=%s+jO_HcuF7I}PJ~Lv$94ew;*{A)rSS_^0)*tnV~lPGpRM5dAR% zG#l(MrtHSRF0gG7EtnPv{rO-%Xl+k29A%?K%-xx^a!#R>gl$UE3RdMSusXLc5p1*G zVsc_v{OS%c`A9x(WrOW;OmBF&$fnc>pyTewFiS8NG00ONMoead3|GT!+@AsB0D{DO zrc+UC0xKrt3H~}uS*CNesz@}M?CdO$Y;6_ThUtV6t33wMbS|HNo{|=AEjgo>Q~qXa zn>GRe)T!BIR@At&b98@qZ)c~-xeu0|clzYXBKOhb7hG`O`6o^tG;lE3;Wv@`6A%#I zw)qjh6xgOCyY`JL!R(w4_->2Zns3dIb~#Lucd+P8(YV2gJu`Fc(%5i*)E}oiWAHOd z`5AVvXemd`T735RIgmF^lkv0_5Boc_#Q<M4=Hnhe=*Qif#_Y#o8T2xe_uD%HV+01L z2MZz&h^A>X^^f5sxG3oy(|J2DKIYBC&VJhDXMt(T-_F?X#c6w+-?y-xlZ`kU7sfj~ zJAS@Ory5AuHk&O(=|XmCI$$Ce?byGgqW7v9%6A+Pxg3@X$If)fJa<6(#^pGhrZZc% z@<X(_HDt2vw{7r}wr1p6w&YsaFyzR=kaOb-DMFUwHa-k{i<Cu)LR+s7jtcHA6w<gj zUu<`-Y!o62=ca5l=`Yf1D@Dsi3*05+6DL#76QQaR$4$>gt(KR~IJkt7+n;UoftiT? z{vFR9)1`g7vB-{ZPcya?(l%#X(&=C^8A+L$E5HDrMrr%f+nqeVNG>|I4f3}ZXLK+X zQ}=d2mTZXPEwEc!BpzocM>EiEZ)ZU~wj0`(pQI4K#34ND>3B9~dr$9kZjwLtr~W=7 z79~Ucr9KEX;J4!-RQ?lyv-+5(^Zt<ECdVg^&l%1MW(lU$ZZ?|@r#sWdM1NyqdpI5L zADitAhbLIKvM^5<SOm#{se!7am^CY2%fY-KZ!rO+Z1~gAon@L}Rc5n++BHMAXaop0 zO!l@|v?r6{D4h+agYD6Yodt6a)*9O)qyBO%C>y2A@p9bSMK7k*GaZbQ-FYkL6y_3P zccE4M4C8VwMeAk55Fgvl{PZ!6uQvt-(`>qE4M#gOq+BN-w};z{0WFKeY|zFv)aRVU zARGkQtiRYE4;S6m)->HB0iIWNa2tLVM~d)XVc-<ru;FlfYwKXga<SOomzTeA*vi_& zr)c+5vuv?_{Mg=6l_#3+>@KnLEN$^-|LD#U+624Sb#50m?(LmCaqPt2ex5JOPMo;t z!V51t|NJ8N$@4C~<id;3zhIqS3ckm$EYNz<WU{?|lrMRkw7ao>GhmxGO=pWS-)&Jx zmPeK+J+J6s(V3!g<LM#|&8f>1!*Q~3HrShipZx)UIl(Vl$`P|RpMw*i<6@Z2=IvyX z9^GObCm9fXk}YI5r4gSL7s7z;l6E`o><w{=;p`e_hzm#P;B;#cp6d7g%QE+r&ZP8` zQ~q}Bo*1_HS>RyUN&F*0GUyzkD7I>b(>6!4lKuVtAa_F@w}&Lu->t2sXn-j_pR+!d zKrlNaxoT;<&5>x)z;5awauO=kDbB-UyrtFoI?RT7m=CwKwNwyoZcoy!EbZ9fXPqq) zYz=q0mLr8pppY+Vhk-)APmsqams<KNbTV8z2ghknE)|AJ{^zIi4c<JCaYvk+hSPbv z9Msx_Q9dHe$z(b`eg1&CHN$Kgz^z*oKLPhgTk;xXUvC{@R$>o>J+XbiJEcn}>Be$& z-jT%!8)M+&d>SrBocF*E<{zt=Bp!D9!_MWGo`2plyX@rdG;Oz+qr)x^#M0v!ezV~u z6+edkHi>7$^Cw$OfXDZiBc%|V#nXagDj<u%qpcY^^gib%`IB%Fo;=CQD;u-$2&ekF zSL%w<9FxsmMF%nZnU2w@<n-z7$<}DjL4|ZNJUZOknk<gam+0|uv^QByPM+Gre|>tA zvZ*;5ER)eF8_h?^2h+kbWn*%8w4Eg==zt$E#I$p7Z<w*l9c|I0ZTL4y$0PX&$JsGP zZ914^|7?vHqa)MPdpn>7ehQYp({yh-74Q#tXS=iZQS@Rlo{z-b<6G^VQyf+x9JO+> zWy@F3u{mv+unyhZzUUO}8u-&m%93QhY)_^~w~%rU!4CH(N0wuyj)tR7ma?Q*FKECr zUG7aMORv4N7#<lX{P3qEx!;3VxlN!|&T_ffp0YX@O(sW<?CjdzIHKk9#Bn@d`((4E zzrv6J{Z@lUJ4entb^K(JcD{dXm;FvlJG*+bf0Q=i!lzCuJ=`lee*FB?r%oR~QRF;* z`m)>K{<4cNE^=RRyUXu*`#W5G$-0G7@Z%hW=BSHkKHuFv$(OuE+9F-QQ6>1)mNUNF zqV{+9chC26%I6&{I#V=mI$sWAbHUv*!_Nrg#rXJwGs&#qInz_{hGQ7omWWOR|4TMq zw_Rqm<2$?4U7T)PTj#NRg42mDoxvoTjK~HQc8-rRs_=7+vm-2J*+=K`IKBWI_D;j@ z1=_a_vJ1i^{qA|=Hpk1yV>b);!))yBQxr@7$-Kk5C_8@qcx0`#g{mPHwA|Shjd!(z z8&7A#w87vwk~<nnkubnTV@~d{NI}j93bP~+%h^(grq>~NfNhPp$2;Tv$DxYbyMwGV z8|(}R9YPnp?(C3YXMBunccL)k*wie{@oO9@6h-NN-VqE!w(Q2Ki)&@Q!O4=~ydw(Z zjK45@3rfzTtLLQ2e0#7ru64#}IW*c8q+fW^nEiVcF=Ylh2eH8rPIhLK2}bT<xz7i> zINX{a4|@x`bUxkKom_|(&S+nk1sW68-u8ltLURSbv`NNpI(F}N$BS>bJG|5RM;8OP zy*oMV;z%q#k4=WH@oXS|jMEN@x5gLEcgA|NJ5dU;Sqv>WrUHij?J=txa_D`|P4Z{a zGCJ=(PHhZlm~-)BIsgBOd-wRbs&aq$S$oe+Cdnk3Tqc=JCNq2P_xpV&lgwmtZLV#a zCZSE6mbMfq(9&|L6k8E!X=|y9+>cg8Das|4BIQ`MYDMG}M6Dc-2cbWy9?pBHRz*dH z<o&Lhq<}B)`Mm$VYt47|-s|$LwVri*p0)NxGV0YH$pSG4iqD6P(dg2f@fL}eRMKU3 zN;W*4sCO7cMyJzk57^!4$3`h&c9>&vhu>sQTJ(|ux}6IWL95BdTLz{Dk6vmG_)M<W z7BAY35eg-mPQY($g)AyLOm4|#bebRsN_?HnYzVuJEmniwWHC5R4#{gx20R!opj|?8 zwY2)J7C!JBeO8~fCgd_3945QukSwhsS51jiMvRqqL#Ws;oRYKHhR})@L}7EQzRB;( z#(4#6tQZBcbmXovTLMl4N(0A$8H)pa{DewY-Kxh}h*D@xO-7I2<FlIGbv0gx(Q9hq z`=h+w`@pY~Okgrut!}r&g+1e<F`Io}J|>ln+s(DbV6Zff;O!%I5RNdr6?>56@g?Gs z=weuVAdKzKk}3Mc0wLrHt9g8BA8Gm)Q;bAXsd)1Jn5k5uv$N3Au^2nu*3;eD)t*}j z&pUVoHyiM+Rv1Waz8Ee_dBT&w+;9(`h|%bD^PSrwsh}_DOKUWX1zar5V&<%NkFlB3 z1FeKdZL|(k*n#m=Z-SE9w3t(qsip?!+61;n+}Lz=satKRYt$new$mB6nN3(UH(}Wm zYMZIajNr!F2v>-kbXs$(4`LGbnoOo@lQyl_H})E9(|BQ^R@0hp^y+F8=4v&lo7Jt2 zfu>edT>$qILFG5wYp}1^8i_=-MJde@FK#44(^k9P#e$i9T!({x$_s2XhOr{SbGoq1 zXf~UQDmmmbt|&N+i^`AN>c%ZSiv}ZI(Yj0?6Mtz%$<`pxH8!KiXuu*6Y@@N3&&Y0b z2=EoHt%=*x_+{2|>omV_<398X=q^|qFzU?Oi(AfdAGhXKeoxJZjV_L&exxzmT?W6Y zyvAg1<hho7cDvKrmNj9I3mp+}i}^62(iJus8qFRok65h^gFAo|lM7X6k2KahjJ1X& zis3W21zl#FQD>^fUboq0@jLA%WZA@@m}zY>sr4rHKzDn_XY5S{9Y%GH?*j!iahArz zE-=q#<Qy^SYY^CBZnwKJ0b=P5|Bm9qC}$}T!TH5GWYoD#4!6T%!f<3VmAL7HHmP-M zQz?f{k0r7ey%r;s1<xS)5e>JJEpE6i98D&#!D>{iTeEFmn;SR1TkQt7DQ0rJZLYA( z=facN=CI9eOQ+potF_H$v`AWu$p?wRXz}o7foZ{KFdG9Qi`Up1fE;YnLP)Hs35QKa zNR?){1^F_0tdP;n28>`<DegD5+9j+^Ngj*a612C4{m|;s;L*VB#*l-L@-`Ef%GEKS zO>$dZAYwB{z3LLDOyIxE6!V$TF5I9{Dz|k(ZGeQW4SPG&Smif0Ixq?%xKC}fhusoN zgO(h&1^gBsT4%OEX~k*-7R_|lX0y)_2smuM26ez~<_bF0HD15~IK}5cZulJ-Zm+|^ zg&v4KHZH00Fx>cj$wVR<i6C0hK-x33Vs<O}`h%HtB3U{&n_ZE3XmR!}`9z{noWQPy zGy|pdES5x~J)3SzBo<?4vwgk2eTBke?DpKilHUG8*Ft#S!4tUm6x+evIGxa8aZ$<< ze+GZS$AXnYv)SW!;JQdE5{iV{8ygo3xLBCQ%sE_sla2}#X2Qc0dY?V*LmHADdqcWK z?br_G9p^1MpT`|^Sbf2IR9hw#bw%A)u&v$WazJdio0>6YJMB7$qpr?U-{!!;1F_#> zj#^9-w%_b_wOwD3q~>MTh5}#z)0zv-5ko`HrLG5cN4=>zp)=bxiDul8q-}P1Yq9)o z&SWwzrP02_%~=3xv_2Gya$}GBVO*}F9AmMh`Hm0nF{!I_@}#i|jpsZZ4y?cUEZjoQ zE83tt<aF2<t<O=iK{QI-3A<qHqNp#oC2Y0S7j3h(zNAg25G?BC)~(~#3dIA;9M<6+ z&|2QN?NRh!OxzBso_pg}k|om~<<@1wo67#l7&=hYk2DT%z!I}p)Y_fRyo9!>$K&&L z_u89HW~<pI*=+wrsd$M+xMpYA?SzQyGlvpx@Pb#Jx2?I+XQ?+AP>iUvI}yYrXt39} zI9nV+XDr~iJFwP)9eAtRhzhaSPmK0;MXk#^lZaFob-rIfJ7;M}I^gs<+!oFcyHtz7 zK1Z)7<lsJ0ClA5d%$d5#F;2kR8g%$WKBq(C{v~ckop|;ksPF9bL6vkHBuVeZ-Es~~ zL(J)Eaq}(74;hCeVs=~W>&-pgVN@r&uE!j5WF4W9JD3SZ11`72nehZYorO@^?e6wi zoHo779yK|gR%aNC=T4)+6ty_5@uV|iH79InetNS3O(&glSRt1=Lnu+i9!A@8InB_c z-M03q!{oIE-5$7xoC$AtI_7d49R`=#W%gQ9KCcZcsg9&C>8sC1J+_c52qGS9Hd0^W zl*1l`&4P+u3Ki)Wd17{=fjTjYn)T_(U;*s1H~Tzhj6}g`z1y1!*-#q0!<F$QVlK$2 zkO*D%R?H|8N?~vr98pU=>GMRJ>f<3-98(SY2XFUD@XNJeAO%H35zJ*p<MAZo@g(mW z+(e_fj*fgL!}}FCO-&d-u%cV+LC#pBtI&}zg>*Oq>2@rel}s$jebQ~nlbQEQFx8Pv zE~ePg(c4q#?#M01?CBX>wrp&8crkY0l8F_|mJf|w%%IQLf%_P6YZEttKr-2hi&Bp8 z=n8*D4)@@RxLo0w57$LfnPeu}+uXcZz{SEWX3iIk*$p(X)=s#sNeX-NVZ8Cz>VY5z z{dv(8)mvj<I24F`T#=Z@9&mIfGX6}!>57JWf<6xx9XwdV@mjp@RxfmYhbHfV=-X;G zcx-JD_psvb@zi;w0jsrjm9uf6u1=C#>;tVSb7QZsPQ%mD*jlr#c283lq%f^|L-m-O z?46yR#&FT}1d5>`mLw9zF~F1IBb?74;Kg=0^3c-VZq5%c`aX=u$0OLi_OOH7fTd*P zfrQuNUbGQ!$;Lbh55L8{Wb4!Dk^x83<<P)3I`l400s#`94j|*>Hqgp#Nm6s6k+}>} z&-=Eg&1Wy|8)%$nm!Y(dfJw8bja#3+vZNn;;NRSXqJE_DhGLG4r?TGT)$;<mGuTcK z507~CHoMdAvbtR#pmOmPHy^iplUTzG1j6=27AKw<sxDM$Z4RSI{U}DpH`E^Y2ApP3 zqrqcv#eJD**n>=atX7xHZb5~3G;60uhceDpOF9s#KI418fNsvxo_x#~@dg~6A0BHx z0!O@~p@fI~WPCgXXESH%BF8uZrzz%%BqE5x{Y%`;_<VL_+}Pb64qBZ7v&AZf;~}5N z(U|cD4FL>?A2uFO${uiPH1?69B&supr5}63)9pzl0<q3mCgu;gy!l`}xMU!a4+MsT z4xdZ%yHhrw&*e*a(J(C*d&c2)ws-haPJ7nnc6%f{U&YDiJTBCnH-Qo*JxPDS>GyKw zGT`b-du(A>ED&@j{Rv+-Je<$?0~VLXXY<)Y&Rm!eW<gI!q$8r~P6b^Ff6N>A1)W_f zO^H(;cMP^W<-r)3@NxP@o}hVh8^qj@PmK@o3T_RD>>-aQmeB-4oe4KegFNMf*^J+h zkY<lh<Fb2gn5TSZzsZ|%WIDpZv`&*nuKacn`UlGA?Eu60)Xz;g4CyNsj_{e$ZVv|A zvu*7>A#T!XNL2luor|(R1`((QT%O}5(>^%R+rPLB9LslOAS{`-_96J>yO1Y4`Yu#N zq}fqQ&+qT;9UU1M>g_9~;qi=&Os`rwJu$Hudvt8=%&OHZCKtl<{@vS(`-n?J4p!&d zm*8SCPsL?6o(Y}^WV1{Jo<&lf9fgk3*4D)WE*54nbKzLVW2UjqZo-W!mSmtWiFF)j z0K0$Eq68TTXf!xCk0j#JwjgLXx?`T6Y(A2Yd9eX97z+pWl0M*)ybx{zQZU%q=xyo? zhC(69W)6BgJ#H-N=>vg=fMv|-ls0;`V-2`*&EOuBI&9jJa6=QQ2b)|{m&qMy?gA-; zK?=q-lELQg@9#G!ie?zA0-SVXV>X-TCXi3Tgd@=s@B1*`V{r~9#FNI&fgv8j9dakU z+(sQG+ZN4+f`LVw43=yrm@U%g@nLf4k}+?)&(j2}^%#9kSp>)idw_h1+nB_y*T!wo z%xx<8z8&lgL&W8_iF<2G%NLR~*vW0!T~%7E{lLF{7)AX^6N;xj`9Kv~x{;UApO42A zi4~Ipqs#4cLlE+RfXc;FD5_GZ9oz2FXu^~2!U+T#UoyT#YDsvTJfkQ^J~ZBy3B|m& zfEK!TFcZ$FlffXk=-`5oBiQ5&HeGq?)Og;zaani5+t`>7y<b3#C<*UyUnZ0c#=M*# z0fz>GlflV&HpqSQAs&LWne%gzW1N7`mI)@a$xzV2{Y%`;hr(`in|W|B5qEl{Hiy%a zXp4t~9&J7p$Fe=PPd;RV!46LpIdV^ocf_)xbRrt}v;_x(*=#J+lgX#Cf)whBwZ)b# z&-O;5D`MWT-x3bAyTV~#I15&Uuw<L_gnZpS;SR66%a7(~ar1jr`+9>u)LbYV&WCcL z_DIYd33;quYt%QG;{#SY8uzzH+QMCl6@8tND1_axH;i)jCgQ%BFBa@c_9Pnz+GD=9 zNG8+<38TNgvBarhAOkzl9&`m9*)XTiZ4}Lu+nCQ|>FroOhC5sXQX=k&2ZNb>V=Ug2 z^`kU_V7MpNm5)Ra(iRLi`8+|dBNPnVBlcj<)7h1X<@Ak(ws0Zh4&weW-tN1=uf-LP zL~-Rlk>qo~+Z~H_7Yg0HYjBgxjgAbD_V@Gq%DBPZMQ*p(W-IofP-pk}*znR)NaUz* zsHbbeaG#N-eFMmoJBUQV)L>WFVv57VlM~BV438|voS3+5<A%#-W)@>lt=fFW#!YM1 zErjR&dsu2hmWvV6>F(}jxG3ca?}ace_=Lm3U^v{KPvW{rs=sGR&!i+R7I3jJi<wJg z@&P-oy1`F);?&U|9cgbe7<^Ie09m<MR5DFXINB$(ZK=)}XgB-Q!KH=1WM4WI%Vk%j zlQE;!81-9%5N)E?c&xcOs9PFChOI7JEYyeHVysI=qm5C=DomMMLoKVgj%@O;vh=uG zCX$UhP><>SmI13j+B#q{MolJ5ysgP%a`~4oU24x3%?j)x$3VKdxlriiCfb*SNhZ@J z4vu(uUb%mQC!I({6Fh=H;V%tKDNo6ErVEK!bkVlQOEw?tD$?fhVR{38Z8``kLI>Lt zG>2OXF>Z%}z67^vE4LvRw=o;Hx!C)5MPCvVH@D5)Tf4Xrv7(RLq#sXC{*!U9Kv6%^ z#M^Sg{%CbmG;Zc4jP$j&WwUG6MlJq8$PcMA@=uhCmw26wCDENqBvPqtpfHe5#AA6> zUE4B?AscK7OraQki8X_riFC*nZLuY7vCc$)u04h<$GqN1*zbwyd@<b(SFc;$7uvdV zC>v~U?n}I1z$j<xijjPxJ)RD7e#E?51a6P7Yb(UKPhWzE;B4mnT;v!h5O(Hc9ffwp z;Ql3U_9c>jd#8P3BAfAsQZBF8k?m|t#DXpTiHt23gq-yugZ>#vg_@iFGi$ojg?K)j zY6}!%W3fUZonM;o%j157_(-}ly>hxRl1i<~1QQWQGTP%yB*KY8JP}WLeE$AGJTy3z z=n44;B4~aNzYF;s9f^e@a>WZMQBS-(nGPir0cX&e4lnPG`LdDDbSB!BEF=c9YexE$ zDNoFo3?u_>q2X*>I1|dmhT4bPo5y<6;X*PGBAL)wcXNqTv1lH4tOp~Yw~*lUxlQ@w zMVrRlFw(PW71$NEWZMF5u~@#ZIo-Cj5J738vE)d40O<u10aq-k3nS}Zl){~I$NB>U zL)lEPv3W@$Igkv*aK`{|_e0><q6WxUy9zzoc0Mx(0-4O<z>*=}HMr^RotjuNwRCCm zRs;Ou?xKJ{<Z=~zP@;cu^{R=fQb^=zbbNSd!4!Qi868U|u_uZ|6G(JuXfef!iFGs6 zYbGWaW3F9$?ba>VUU}tW>`OP^aQ)V8S8QGg&-?d;r5RZ+M#$v`2Up^vlqYDBcr2{w z!xKp+yZYL3T_m-1XxY#@i)FEZi-lRtTsGeyb<_G=!lc#e-G$VOLbJ&fOkw@h!NsDI zX>P{RwWg47?@PzKdiCLs=!*W~>~Kds-Q78z%cgNdYAS4xVQNY`(&^^rn0_J+#Sywd zIx-v$2XRMFDy2=i*9U|4o8pG`TCLk{4X?Kk`V4EbT0N+z^<n!mM>u6%W;ds-R(m?% zY`6NtlarIKLeZ?o9&#Fc5qf=p|1dYH;cl30wxh(s70}X?e3_v+!;{WrQW+j0oC%kP zrS?F{_I31U(#b{Jl`h%d^pZ4gep;~2Ly@qqBQ_9^>S0@>ws>oQn%m{TaE99s2e+lY zfwYU;?)3Y1dN><S2f5Y9eQDRlrOWAIZnNQ<(%$a}{(Y-a)Q>co&YtK<s-`)GUJjES z&gTn-O;@Ds;Yd832x12L2!n^0?3sb~Os2iP5b0lr#k_PcsxE(t-BgIRM%JMi!<oy* zdNUnyU#iuWb)|dTMtZtZ>0l}q3?|~?Kw2M4=|6G9l^cg+H(k2C5YsmgXWlPhk~4Mn zir!3Dx+BK<kqYV%xGQ}{zCX=<hBG__XESH&BF8v^xVJam)n8~!2f2TVo5PuG*wyD+ zxv~INvfT&Gud}bSEgdzCWb)4TXt1PCUHng{2P5scJ1TtnWdo?ro<e&*(w|<H?(gsD zUC}#?ew@y%$o1te-O#_Hz5TLWtS#ZrCWk_8ZSl5#up$FZeJGlVk1cP5*0C&s3DO<r zt2h%Y(($%%I@8}aoEc0HplxL{5oq%riRs}qG{im#4NJ29ZOb}0tr)>*kq%@d81Z7` zg?u6x&!v|amKXG^hH{DiY%hr9;+G8QOPoq4dtp}%r6K(Gw{iO1wxfA+n~O)>D+af& zPo+~Sdm)c8G~GL_@9137pG0X=>FkQ!GNc#DM11M2J|2NAmr1wz+WqOF=*U<hH*D4~ z?awaFMtBF|?S2frD#--dY@skR)IV5Qkg9UIv87ALc-P=&XlQ25>a|l-ykBu+Hpe0m zH+{t(lo=V@xPHyrQb^=zV%7NAf*Bp#xM9uOiA%ECNQC!FFf~0kwwU7T)mL1;;j-0h z7Gqw1`Oc4hZ0Gjvi?Oe~=9b+byLsF73*mYHUTxPS%f$#-og2Fp7o{BO^$vbl9rtN# zOQ*BhB_mz9E|QvBKDGQxyM3{Mi-lRtT%mU)<tG?%0eWJ^%V*)j&-5e{zlP)YX*VgT z6KCaw7xmJ|S%@WAA6v@C*c!H$-N1ISPqWVmO+t$h7ZSpV@EPHR@FU^J!mq?y@pf^a zctAWPeo=fxoE3j8z9?HGyHs|a>~DtK41Y3e@IZgJamYAfoHDL7P8)AF9y6XY{@nPV z#@`#?HqPO>5}jngvtxECD5a$?X^XT&x<h(YdR#gtJ!7gj;dN#vyUA}_Z5GT5bB(zU z_h;zL2D8W9XPz-{uswfv{(|u5+IL$2A)BA)r6Xmr3=$n?VU}e5Y#Ce5X4pD*BiqeB z!#*o$1wG1;ESBL}l;IVW;Z|`k%5YHpwD@K5YvNJyc^S#p$*z^{Gwe3}(MY&QQ!@4$ zM;FSl#<<(~P2;o1myN$N{?Ygssb0cEO%SGe8B)bEY?pR_L>a~w%210kG+!*k`eGT_ zpB3-WKL}-D^M9NF^ZdE_H|GCy{?++k&A&!8|0?iHlx=M8XS8fSPs8(e8luX%FA>e% z1HVtfF9u8Vf1m#w{{IN~$L1cL`~2L#U;p;kA3OK+b3Z-zlXEYe`?qt?pZoE-=g$4; z+z-#4I`@Nf-#d5m+;`4>o3o9Zv$?ZrqW|MQJAd}wvwwO0o4@{#U;pf!;p|nvzWVj$ zXKy?^M)dl<uYc}!r1tv$*Z01D+v_`CpMJgP^}>I?Zut)))!y=>AX02&MRM=|&Ej+s z@4J@H9>sy<Sn=}x|L>H%|3CiUPoJkR(N~M1OaC7o@!*2<=Rd-`<aYo*SJ4i-l5U`n zq4kWR{fx5}Y=TYF<;DK6j$O*u({*fv_>%ZD@r3w&@s#+ycvAd<_(Sno@kiow;*019 zr^SC0Ul4yn+i1IZ8(mG;(51A6w$cW=j5g7=w3%*Xx3EvLz3dLQkL_m%*r(X7>^62g z+r$2aeSv+QJ;uJq9%YZSC)g}0gbJQxF!!JN%Sc!#%i?k2^8axt#S}?Ka`g8y^ptX{ zph{Aq$5c}dsi~IgsGb@~Lygo#T52X8wP2iRB?B2rA`_X(LRPYoogCyO7rDtpUh<Kj z0u-bWg(*T&w8S_iC`l<wQ-<0oOYPJ_Im%;{DNq-6QxEl0ANA7`8lXY6<zX73QCdpN zXpENAIIW-wnxrYZgjUijnx@sXhGu9j%Jc;~jGBH3ZRRLFO(*DE^lkbseTPnB96Lon zpdZq+^c?+&eoW8PX?l@fpr6oB=_UFFouQZM-@*O;bTfUNZb2P<n*NpUpj+vBx|2T1 zzDi%DC)t<j0DG7n!I*f6-H)1hQ2Yjah;F0LvCq@@=;w4l?W8^IOSGPSg*`yG)7`X@ zZlVX!{$`8q2K8O6XI|q!V~@};(Tc97b;bHdZKCc!gO;#?uAqORuh4^NvtOno^ay>8 z9;V0X36$_LdWybD$C!#Pr|W1RMqso!`YhYP*0VLaj>+-mW6PFe!C?qudVgPUPj^?L zGoS0gVrwRyN<xnd_<eX2h7C9N;UQ4Guo0gDE?1T*<T6oU<n6Zf%t*8LnOT|L(%0wX z*Os+#So;BonOO-=Js%D;EAe=1;q{@AIfUH!Pa$)qkhzN?nObV2HlJ7Own(!tbXlb1 z?2@IEIR8|aWlEYoUpyZwp3CgTiz-~;W(z#2+^yZzCC#!Kse88P`c3<~XS#e|cC@mh zU@2^<@OkNIMI}xvaW?C;Y&puD?W}krIJ?tF1yWY=WM@TN_uBQdqe~~dyKvvlRMCwJ zMOw3p!faWQmUQ_n@=W`squ!JI4jfn0x*3mZy=DE{Rg<&gT146>cJJG_XSUWe>#}ss zx;}PJ3kGhO^;){RXFV2VY+%{N1lX+HrnX4?{!GZc<@{U7^#@$mF1RRc>OT|r<VC#5 zrdibb0?P<_Lk>|slZoeL|M48H!^Q0GrIV#=iPp7zgK`1S)T}VWeNHa=XvVqE?nR%A z(PwaP2`avOX5n}JChhF*b&}7Enl1ipvoag}rCHHFv+mMO{J3_*K1&x$2wu|i$=O^N zPI7A(nAv?a7(n>7GbqI6oDEASX9JckvkjKc61U+1BDU_!$0mzWO0M0r4TV{nxpX1c zY@i!)(L}oU@rvOY<g_eHC!e9n{Mn;XspUyNzD)6a%r+KKDfaGtlj}Fm8fRM8qkV3a zCR<Fixhb%3$}+iOir11wJ?lDKyw!@=dNCHt_D`V~1EbipWj3WWDYS@Fytd#V_2AFa z*#-~wtfF+uYqYaXnq)1s7!0W_gy3f%qJs<3R_H@y91*q9*J48BE}H)(OD&}WARDvF zi+PeE6Y}@-R7&UnHEX5NJVP$2dqdX;GWa2)xF}|Df!assQ{cQ<U<R_F<ki{7%i!}0 zIG5n9oE1>cq7$!0tu#xc(xhdBWy*p!lpCGomBV>mtlxn#%fQl0CX2Pb&`Oqn=&IzO zyy&-ZHY*g+0DC;eO67H0yzVVtU%c%5C-446Z)u;>GBCD}r)*guNYcLkSwfS|p}QvQ zqNM~`4@OE$&svM5mU{NBJwCsC-M*u_+`cW{Gn>-r2m37j>-Sm4CfiV%#g2b-%g1=~ zbu_>RmUsHR7<@X9TG-yDM{{iN*d>$CsEMS#%O{TttaAz>F|dIF7zMkf^_)37r#9`I znc_{G8o@~X*etWO)2v`=KgtA!YPQ0%p>wv<(#hRBxO+#*UBTVUES<Bgk@<=ff3ETM zCx8Fs{FCAn-}vq~gxu_**~7Eq6OXgw^CxrPcucA4Q9pY4Q6cyB(XY>ZU7YzEJNz~F z@Iy-DSAnlQq%l4ulo`J)h{i8{USa&==PQkear^=kjGt$6<G(PO@xl9^Gd^&i#(4j| zHyiIm*n5Ru<2^#yc=xAu#?O8FX5(F-{i^Y^j2S<}bjDA!X5*oQea1Tvt~ZVxWY-+r zbx?TXAj=(0W_k_^g7H)P8;u9{-)!8^>W%wuYd7Ap$86lYXT4FqN7@tIBaZHw*(305 zKffoQ>e(aI8*fL(p1AG1xBcWc@iu`OZ{6K&{NyKoY`kUHSB;-w&lz_!(J1YL(o%2y z_>PG2=9?16ojcYWZxVdQk0H4=JFeLw>=5dVH*Rk>-f-Q=jn{8mZ@iA(Y}}5r&1~DU zO;B%>ww>H2ZUcd9KYq>l){k!)-?Vb&_+=~CjBi{yJ-&YBCF7T_Ts6LK<<$6OVa51F zVSIe-(9rm@Lj&VW4=ouVJ=8xwa%gxwFwDN&|9by?zu3F7Fy6DWbG&<He*Bs|TRwK2 z(UXl#&W^J~1INYxS~f7N99=of_RiYI_<wHcC9{gXvowCm%E_aQ9h|!DQ=g*F)`8j9 zvB}xPty2TDeK^VSlifI>)}xKoIpy)tHtd6L<9{DC%(MNv;x&1;7msjQxaL8No(w01 zxcq{jmoE9?Ls#3jZ{LOlwr$g*k#)oV|7e7#py~7qzb5tkALi%8UO~yP=dTfdEiy>A zRnVg5=I4Y*h=ix+|A0`vVhxW2S?mwcZvQL{BmAF$%cyDo_mF-Y<_kiXut|7LRI-fl zZBov^Lu(<S^+UoNhIBUqi7XB2v;b*-8nR{=B+@~+chhTd9fih_g{(RQ33w2a>~)Y{ z!|>}v*ry=fwnK*OM9kai8}uNnfV_Myq}@|+y&Cb{kapW}9fNH9TckEhKVY{aZu<g* zyKwv<xHk11N@j(651mPlk)>=BxEBg=5P)9=>ZoEn@Cs3-1Z)8iR&^Iq75u7q6V;p` zQp3G=6H(oI;3QE)ACYD!a0EC*)VK<mC2DFT(mIKBN}?8=>o*a#o+2_J96qK^Mud}a zZc+oIL}s{IlE8K%8`85~AaV=>?-IF?wtFX$*9#mV@&yS`850HGAqv4Qgku=);nPGB z(2Iax<V~We9+-r(i*)11h!XHmo+C=<fai$XaLf|0nW(*isACg=GUSm~XOyS_w*qK) zgHHFYM7>=A^3{j)eqiW9qT#!UM&2eG-A=R=^p<WRT81OkU&uYcNuqJ2JARI6g$zKv z3HVPOBAP<FQ}+V!yW}j<${7IRSH1!uomE``=&eFJ)1ySIk;ZDAuSWQpB!KuuAUxzy zTDP0%(npEbpCG6VL>rN>%TT7v)kIey{1u>a#Q^{`HY5CI(76i7tNVzqX&@*fKn?(J zw!&@eD&Q@mYjM6!2Izq{0Pfp%5^bLW4gn{CH;JwTjq4Eh286u<w09f>aQv7W0Nsym z2Oa`m0^TLMDM++a4<OFY8v*$3gx^m1-3-5*k@jws?Gs8M3Lw2t+y$H@x@9xbClT&e zCol>i{;h`r#J}}zqT4SJ?FHSvNOSLlz$pOkcSr!-@7Mw${C>pWkNEp{0!V-VX#n94 zSb?)d2jO-QG!MQ*bSL88iLiGftwYO!TY*^sdHl2t@DhCn;qM9ps{r`l1^>I?|2g=7 z4*s8;1a<>(|J((FLP&HE{O*YYh;z>Y;23a@=w20Yn&|#f0CDa=0-OQfC3*n)egN(d zAm0x>1Uv`4P4po0_~0NxT?F1F`g{Y>2HXX_1%+4(<N(k;d<ZxJAl?^|hcD`ZC@=%; z1!e){{Yz@1FC*TU`+)7hgTN`GhY<cDxIMHPfZJCP_bbl<p!ZeyeYFdK-&gMiP6D9y zFw%J#{znk*2#${++#{gz$QIxs0AaqS1cJaMup2-=z6STNBktF|0NlS0_s8}UJuyf$ zn<P5Qu^u=~^bHAk33!+2Nh>f4+z5dFlcxcsdrS);?y;RjPd!NV&AWh;z*|I5!|&-F zuo-~+({O(p?#JPNybC~nj=w_m3;|96^q)CS^sf?dBY=E;3x40~BRYZdodErB<M?f) z_wAj)5#S8bca%UIfONidFL0LVyITm069E3chx~qDOZ0;oqEn!CY83$gQ?~*Lf9g>H z;ZA|psW*XliGHXide#cy{70buqn!Zq{@g0yG|`XY_G7sH_yq7S(et=|9%XzUVgAhv zYz7_$aD5urr*VDy6wwQMU^{S{=ta<faVODFP7u9xoam=A;6dO~;1vLQ`RThvKSSQm zL;=J<^D5CV_5z0i#CaL{e|eVZ-*Nr#IKF~Byz&qLny;Jz&H--|{Re3OM+0C5qCgk0 z99R!*2W|!K0v-a60jGd7z&YS;qF>5@2EYll0i(cr;6~s8fb@Tfc)xrOKpy{74eSQa z61}P=`W527HiI=xxW5j!vnR3Uc`MPc5$7Ce{sv)wgX3?b0Q~<8{{OuRI79S5;N4qq z5uM*o^t;nU7m)rR9wPdq3P6}Yy+ZV72{=OZ*BsG1pz$}*`WtBc{W#G-ke_!EX3h$^ zV?EaLmJ?%}hzVW9WSfb}j}TKlN~~-rG36j|nppW^Vih@Jl``NJVybh*st~3cP{U1q zhFI-G#Oi>0#BTr^5w~fEn07s}<{&X$AMg&b79}77hXBxRL0moD^lbq0qTdYM3OooL z15N{o*NQl;pxL?|K)lxHfVYVmu%}=^Ji`It6!0!FV-x@#Bl2T>m6&uA01XrJVM2aP zcL67X3&bpHV%AY$CxGzQGsJ8}%zl=b6MoJ%0CAj$fD^zu;9X*_2EYqU0=tR1k*50< zVjh&mgL7XJm;sP4-*Eu({3;*^YzL5*|1_}x0SF&J8Uch2oCMw`7L<TK0Qm~e0<RJa z$pFv|Z3Z3$P66)_3wwb{U^lVI8DcRNfN(L;j9nm>SVb&(m{{rvu{6@o<N(mf+(oQy zFR^x{(~h|9$APzqb?5=Ob!-710zeZ@iRGNc@}S)b_X22l9V6ELCb8a~#QJ5#mW%?R zF@QKjn}`h$5*vZr=yGC9j}Tji^p?#M8$+0JxUWzGpglQBY^smgCCJw$r-`i!5}Q6n zZ1pR|)*#%Plf-5Y5nJm7a9oEtm%d62G6~!8An+!!ja>lFFI!J+lSJ%t(7rqgY$kRE z+^#^pE1v^E^Gbx@tOvZrt^%$`*{+7))$b6y#tBRk+Y$tjpDm-n3;^0&+kio0*CPIQ zE3xYk<~sOYw}sgCpmDt#kN~(}zZ*CN90q2I-S9TC8)ZNPu$|ZrgxztL*vD{w6Vkj1 zG<V)g>}G`9MZ|U^+-{`ti9TYtaKP`A$m=JOhg(k*yA9!PKL&sX<Px?AY3+T8*d0nh z3v2>z1oi^20&fx94|m8WY(Lx}i?B~A0hH_D7Gigz%!lBA=uKjuK11v?CjrFyte)6i zUBD`0pF`ZwC4oNRMqn?oyAl7M?Evz3&!fOA#O_7@?_E#qzH`Lxe~H)waQhd;`8;TR zVUXBiFEPjf?8`Vlqy&)vue?j_VF}m-pj=0^z)oV1fcDqgh&`$z_Sk7+Ps|cK3iody z&rc%FW1#cRAhD<6cKigfXWk+9EyVrSy~Iv500?se^uPTkvF{-6NyPi!yTrZ^df(Rr zhXBO+0rK&KSBYW%V?RXtKiW*}Ih_C42^=Q&{3Nk|1HFGcOYAi0ywC+KC-&lLVlO3$ z{q!YbKVJnP-p`Tt&rcEi#d=~dZzuNegT!6|omb8f`;Xnkei;N1{y%pTd(}(qHPC$> z@m|OE>qmf-z$?H7VrL0Z1Bib%N9_NA_OI^(o&(+`_6Fj<0UB>0KW`xYH$dkN(0K!4 z-gp#1KHhj0c$?Tc6`%*+CH5P{`%NE!u)moF5azcs0A=~@Cg4HfG_n6e`u`OKb^|XF zdlO;aM410ZKK}b8vHyt@dkeJQx{=s<#5;cmI0w8<>~{$JJNW(13Pgb}V!ub4zn=sU z_5$25!2JT;FCY&WK<@(5xNsJ@K<p0$sEPeC2aFQ?)2+nbM!J8-@h>Nc{dEhmcM$IH zGGhNgn17rh_AcDta{@_XbMT+r4ICmi{}%8rcB)jsn<TK)BnS_ZAO?Y15@dUUdr6Qd zNl@UZI0d{4yiGzG;*{lpNni``5O4xGM}iW5$|x`c+y%S@yhB2{6Bq?RxBM6h6$pnp zRH%51gi0;Y1>6Wc3Y;ZD)d2JXI|0yFod!T(^)3lj@T)@js?ETy0OC}=LPE6?XanG0 z{UCsJsu8am@v0H82JvdVz;a+WfO6KrPmT1|NK1|M)klDn0O+YNkWdSnwGxm7kbmgq zLhW4u!qmP^LY)(s1P%ajtAks;3a|pmOFh!6-wYt1^~h8GG2m4a8bG%JG#lX8a2R+A zc#{MT0a_pk^Z_%#UI6hl$ZI3~AWI01JAp?5&}u}QO)3CsHnjnpfO~<{BxpfT8wKE| zeGou8+BZpPhI=z;K^763`v9cVd?RoOH~}Cnof=32>wyEnaRBZuaBqQo3*1}a-h%Kg zpsCjbqX69W&ymn70|o)mY&`=YpN0ki`GJfg7`6j<0mpzdBp6jd7jP?ZiUbMqC0t9m zmiYBK5==6{3UmSMfm?xxfKw!xQ6_U6up7X&MF}8%3(~iMzU6H!&ols0U^%cIxC=N2 zoFM^nj$rcws{qijJqo-+f*o}1QD6qx3(Nv2pB;V<@WBBZPUIc3kN`PIa3K$_%>dk8 z$cO7y;B6Az2;;T_@OPgf!GkosUBDLLK>+l8i0{h*JAoqr!uj4J!7l?2lMq09kcWhz z9za~kLqhNvaF&D+=!c>J(hl7VoC012-XS5Z25=n)y$H@DgTQ*=F5o0^frKc^8I=H} z5gi3K0iX@}Nr<%ppc^{?JPMo!-XbB6@bMfl1MCJ411EvABqRusfE+Lb>;?`4CxNph zBngm!9Duwe_X41u0^JPK!)hHSBjI->V)am$tB?uhWlUKnDg+9=5O{&9UwZ++P%u(! zs&xQib|^e|M)=)(bzx!Od)E_;K>b)z{0UYW%dv-U$*C*E@?H3_a#>TOSYLIiawT<i z{OUzkTbBw%PQ4dC6$;ijD9S8$dn^{gnZ<06MdOih<9Af$>2lTjTD&NLzbwGY{<i#% zuC6<lpLp*REqHq^!0!}U!v4%w3GZMpp5Gf#hX13*JVcO@&B#Lw_U!+W`)ZSsX${OE zR4JNTg{ty~YM}~Wi4av4^-57y-cTm06iqTwCD$^cO0E^ERH7hO?NW&iDzU0V#Z+RQ z4&S_~!H0e7EA%aDe6>bbTi$^0J*gE<&AM7S-b`DoXrdOiT&pn319CxbYEjqfT6F4N z_(oQ(P94-ST}>^+yK(VVI#w?!ns&&wx_o)VjtatcZKtYJ%!4x>uT7tP?_|eo_+#pq zr%#?d`SSFsY5LwCxkt_aZ&sgTTJFJLnSek1UOw|-f9}IgD9EO#8J_(ri)buGSQ3^p zAQmYiBI3vlU$QK>OkQTb;~pG~=Nrv?alZUZmM^inr=MQ(<dUah_+f7FN${3Y$NXp6 zUqmI=c>k9BLe#}HE+%)f2^-Vc*uB+kQze_KWG$7<<6=iD*?mpW!WvnlqjnD-Y~153 zms_QB$+``n{*jkk<x)_N&!z<L6`6R;!w&X22dl=bkp!h9)_O}-C>Xt8&i2dM6>@fi zbdMz1rHzu%Br&;EAELcMuY0fWUY~H8?*^aXTheqRn7p^Kqi&>5s8iowe|No5Pl4&k z3)7MF)8US3oJG!u>r$!dqCsO0zkFW(@@ib2pGI@6OVy>+-`gYes2ToCoIW28oL8Tk z4o`=I1a6jM;@=jI$D)40;TO?b6R`+h$k$Y6$IA~Cng)Z=WDqrI)EYb`ZO1e6jZ8Vz z-r~y`4H<vy_|h@&AYLlm7jMhgTSEp%PfS{I$ym>1W3yrTnvh-ZG~i8`Eslh<ccp6E z7NJf#Twd>YH{qrCl{J#D-P=1+`H7DUEvkWP%rsc`rs(`1M7MAXcdZyvCmmRu|6Fck zA)m`X-dSkqEOh2NbL1|UnkAPcN{^=>Esr+iNqI5)c!!%Q+>LI#TXc8hjs6w(3bEqx zhDQ~6=apS2>K-r0%`YxOO?MUYot^p4T;6tb;<4<_fu5S1TOVt>S>8<@@6DYr0!<eT zT|NEY^xXMrG|<usdU+}k*yGuAGw<iob|Dfr2>6<oU@`lJM6|@O#z;8+zxj#G!lGJF z+H6jHw2Q|Jc=#SKe{r~<TXb1GUi4|3+p&`E5mde|y#6@Q<y$<)v)MQ>_wz-E#p8m9 z(D~j#agzk2U~vAg!l#8F;trn_^{}0}zufC)_9iydz&6&iW;wg7lYOm&J<!1_T&%K{ zmEj9BLYa(pO8J5;rZB}djZ!|Ykt<9ESt`y7vbd(8iSLvZ8f1mIEUGYRBUXh;Z)=tE zdRvo}*G3|Gn|`M@f*0sUmdMz84ZGLIHlkl?p*yi1TDDTlv^I@QM$I?i&Gcr4$&{D! zyA-Adg(<H{-@?b3+RG*8keJk`P~>i*GIg1tEW5$WythzqL!{Zpls0D5I=W=+HVxaM zVM+~CXk=n@vub1L`j8OXS?*wt9#f~(so#-h*_{cDf5+!998*^IsZik_bQV8qyVPfz zik+$0r~J&Xe(n79nbp(hBLVf#rl(H^rq37q6Nar*d#X<{_4l=b^L3>tyeI8Z^M=94 zs$!4RUhH@@T^hg^x?8E+CD42lm>k}3L}g9!M3X{MhQ5dS!=b?BfmVh7hX$2!REzZs z4XmkM3~F8R)+H^0yu;byX>4+Y^<Oeq49QFeOQwFE%2Myz+>>7sYn-l@BKFXj^n*H^ zq5e-kyy&2-(a~Ca+>s60s+Wv7b6&hgHEFcqIgFaGbPQFv)&}iMEDdgrD`HD^nd;n@ zCadX(<yuRSEj0&Xj(mHi&g{aNiFt~?j(Mt_8gu2e3*XkRkd<FT9WN9o!t>}He84Eq zf?rpaC(2dAJK@lkvDlU25c)Wy(fMB1A=cn7wY9lUnXbZJA(U6J`zrps;%^n={t8x6 zCQ>E4P|1!}vcr|^U?pp<ysGl%O0lMrRZf6FsUehAS5~YSW$TDPI?E@R_okmMF?nlP z{ln?$ty{x<J}!=Bd|(52A6wGbIlN}gaA)5V=GpzrY2TW^9z6KhHNNRz@_d!g_tHCy z`Kr*!Y%)P1V|UAbEBlK~yj8|zWtBA|n-|%)MD~Qpc8jb|Tqj;Dii80lN*LWzQ)Vm^ z%4#Yr)`_z9|9ifo#le&_$`Ox0@W1BEfxCCVjZW;P6S>+Q`aAT(_0_jm3pdKy<#J{@ zK7TehT~pVGHw$PEHM8x_w>AsS_vu&;6Npapg<5t~?fzP!_HH%9H^a&#ge+4kHD0d< zBaT5OYBYYIMrBAqq7WVBru)nAE=tdO#8q!V47_gE10m;!;Xru0HZonC3ZyXY)JAX` ziSX)f4iukO(*|lI{1@@yZ#ps!?*Qhg;xU5PgYtS|C~F)KX*QLWnt4+h?u14|FDrB4 zoe2q?I}&)$3SMOb>4_O@l-3@XLa%g=x=rb3dB04H4`f@kvVM7U+T<Q}D)kCik5yT7 ziSU?v$kkx47M6=O<)S_Y`9NXqwcC5Gib$CyrWea=#N|S@y}>o)R`PmIP*7lk9(PKH zayt2}SoQ>?S$vI8g&Sg?P$-nM^u#DyA*S2&=>6}VFE;D9PQDlBO*?}55i$s-Lrdb@ zqu<7l4Zrx}$WMNPrVZN8`L);`z7}oU{|qTmHTcMOpMu0&s><-)n3|5Nkt(68OhEzg zr%3lj@G}e!B^vQvhGJugp=lgrHmR>!&Dgcd8fC{#$)?EV{wi%{DGfdLyX#pWMs#1U z1zW{(K`GA(yGiy0Zk+rHoO6=3kM4n(d)_mRiA?t^-HV~%>gjsqTmRR;vc8EDoit?I zlejaslFUy^$UDC$1FtjfBZW#TXXWCh=+axcnC#h#{Cz;2J-H~y#uuemUiSI_3;p_j z^dFHNIgNnB<4kB^0+Wg2dSN|VhmCsv>@^FhUtX9+n=CBSzlM!XKO;WJ^Ca;3Uyxyr zs>J-iE7z(zpvbkdA^g#h0-pq=L4{gXjek?)0iNF{;aNK3o>M-s^C0}>n>-XrEjWFu znuc2LEXP@{9;f9K_yRKx)!r%c1Nv=;=RDrdaNdKG^7|toMHLTxj_0yFY6Wt<4FZzI zT#fmjkI3yp^row>x`~5bU1f~g?NPi=apA~TK7QiF;~c4tgFfHj#?-=*w~saW+lIcZ zqS0JTl<hAw!m&nSR0v9iqPpr+W&ctptSP&uY*(3BMhDd@NflI$s%BJMR0@?!l#h!m zz(dG)n3vF_xZ<&T`bEfuDP$L&C{k;wtrpAHq&E9Hr&Si0Pb1hHyQ7c+qLuhqZ5gj8 z-1C41Ch*uxzsUu}vic^mseXT%2+g6stf{O?tvjHioEi+xDa*k`ztwhS#Z47L#R0X? z3NAibM?*NCeX_QAd@iR&SgTQqOT3~>O@qce%cSZW8f-c~|7Nj5_{leGXsE17WkbYc zYE%+V-Z@rILpC=^7DM6W%_l($NBC6IAot0YE8#L(aZoi*9p^iE%|!4%kW`A-l*fbD zPVjm=zxCNLueMX?i!$1WR1ByNkkQJjMU6>gvg2_(%)IT8bW8PF=4cmD$?O-c!8Sv! z&)LE{=2kIdxZTj~vuNrikG3^v*OmFpt>Jd-RaXfzYa!o(mx6`;wId3ZJg~GcXVBvL z8@<7;uTpE86rB~Vy1ETTKBwmY!2Sn(PSO{1S3GQDcbnKA6Pr?Bt`^h>?zDWt@`Oda z-onrcES_omRdxYFt37sw$oj=8=xhgW@a*vjMh~m@Fr_E0ZH~uMc6-G^rP2_mJ7Y>P zG!|6WfS17ut>(^VgR%;3-oP6)#uWT{xPlNkkH<lwX1x~XEGp>-P!J%=POHygR6Y-F z0Ea|L2f$NzymgnjgVBgHhYPuiGOh)bL|v`~oSPbwqTN<}t03mpH<&!yV4=yXviW1J ziP5O8-P;nzo9XiF3c5tls;sLW>FUYwE;3l5^WlY^x=MXbud-fU*%B%^;zJEegTKw@ z8%jz_l}ff$slzzn#$cdAKdFY^ePyo0DKKR%tJZkr%qdUGg>pHok;|+0msOPGi#9B? zrs0}~T@7Nxexm9|YB*R`Rd%qvTwXa|b5JIeqt8Ut=Xtlmcz!<2)GvnB=dWE2(f(Iq zC`Dij7ZqqVbRskjbfVG#Z(`_55qEv(*qY$fvSpXdJ<sBXY&z2L>ILt0J8ulm^$i|9 z%I=m%R$SuY{i=ZaK94**=$2f>d<FEx12v*i6qKTiESCLJOM`^hT~}8*E#`v~9fVSi zx@%FQ$+z&K2xHaRoS}+esqojLlvY&N-ic3O^X{Tlqq>z7sM})YqA0v8V6fuFf$o>u z<5^IrA+k<$1qI(T`#^<VtW}iHq_I?sKfdQv#*UdzUEI$rXejB++G};4S1(tTDP#g0 zevipyGWIpajhFd{FV;(g*@x%woSM*zWlMb{HIYQLIA-TDW{bjcJX_$S>vFLPk;#J! zR-<4F1x?|8vjaEOa}A>mYXbqp?Ui>|3YDe<y?7u%Ab(}`o%n);+|Ijt1(;yJQ#+x! zQ_jZ(T*-^0bH{mf_yF28N;-W$JdJi-Y`AcQjKP&zu5l%rP+Rzj!bPRbo-m^@MIE+O zdV4;3*=JXkW!4Txt8{rwW?8gJ7h9IR_J*^THUncSW7KK#8>;fGal->wB-k+1M#r)$ zwKX&3wvTqYAAG5*s<NrlJDjoTy%B9!AFuOv{Qb4qPHnlmYBawx`F^FktfqRrTz;?& z4G%pL?M?kMMy3GdhY06?%%nkHzoPJUj@aj(V9%IFdn1a`qYvNdTRLRF?JM7!23s+G z^6_IH<A({Fa5tTNhQb(p`J9CT@|%31jUGUoc_-IXY)2HR$x8t#zrQBXP!q_H*041a ztC4D?3h#l9cp^fmL3VrF57a7o@LKbMisE2h(Nj|+N%GX4jo|r{Xk`3|Q5PeB<D`Sv z#5=i4UKMKYBrmo=J`STiko}4yi|70qK5JquDUB=B|FrG^-%!xwu`M*m;t2d<-KSB$ zFs&BXAry-G56rer@i?1rO|3}gC!&q@Mpx51Lt;3X9E~*9w%Qu5pS!<G3fs*QNv-vD zIDMhNSLyMHfe(YRIbnB)kGXqet+r&r&>HjGs*_jQyQ4;PEN5tqc+FMGU3Ct8wA$#@ zNI`3JdGit$tg+%FUPfD8qt|XIZ!Q$ucWizRb^OC(`+oEp5=ymzTUg(D5|b0|z<ra~ z3XbpOT$s@e<)-3DY&t-)2gI+7!VMxDfrcPr@t@T|t`U?J@bJ)$h~`0sU<ANZ9r*Jb zAgDk=J(<&1&=4kkyAna{cQ#JS?iBf{$oYT1)FJplP?TBDd(_Wj41;ivZh?W$6UJ!9 zM+Yu(J20FlO4{V2x>*K|GLDIGQKD&Ne|_P3v17wvM5XJz*ey~M8N*pid+P`K#o-r! z&W5$I<ylpY1)ai%PT?H9>JD@ZO{Hf9-NJ)z(Mx<SvnX2%O2Lk2kZ}7$@&8Uz=PDW1 zs^m1vl+`01?CkTfTxLF53|sS0VXNz_%h)I*btx<waDsXvyYuIrW^#6!TtPBYJRz4g z$YlySe;Ni)LOvmg4T8u7NX8gU<)|kNEjSZKX*Y%(Y7R`l;CaErFl~Rhp?>HRBdEL# z?|5kXJiAmkH_B#p%>J37r$?V2Dz=FP-6b$~9O;#jKc^GR$^^N*Tq!)!fm=hLfV1q0 zpdzObAn8w^$EZ~l)gn-kAW1_GsRa`3`MEg98zam*@}aV=&zVIOPE^RBkcka4QH~** zII$;+5;g8Afi}v^#Y-q-{GW{~cJmM)C|%$~3xNN$EP?VR<Qlodme8@;xltXSfjeF- z-e-#C)6D;g-BcWVd~`*w#e9o1*OKgWI_q{37HzcRCgY99y++ZvtCBZlN4cs`0p&a( zh<;5FL%!`&f%b|`3Ws8k;vU7r3b{hTl!{H%fp*G;lV5Fpu{aCAJnbniSMp^RK1$S^ zxjMWshRZbk<x6~|kU=N<;ClLOXNS%_9!&Ln@g7aTUB`xHO;)G1DPFm#nFu$S`|28v z!Ay%e=6CyICb>$EFC0aE4yRY=j=lHYi<*modHXW)29&iM&#C=2_t;mv*d2xY3c_U_ zY`lX_#@O91c8}#@i?FYmUEa*f1$G3zxqoO^Jzh)m`+9bF{a5RSz4dGb=C}LwkLZOP z^=wMd^t%q_59ftFc~+A*<^^SbVr<t-m1iq2REj$)@2I@5Qmnk*e!Kl{yXded>=Sm; zzUyp)eIdaTD~3k*sN43K>eVy-O+9-Qf$$!`=W=m}c!wwsh$}@Qjr1kxl_I(U^luNk z{c8|pAPa;$BCjpT1k+pJgY)#(g;il(KvCe5P5?thI8|H({=gcrd2!9DG)mwTm<?FV zToeTt6`$fN3SXI8980*2;lOypmG*@t<3{0_<gRXPHwH)2k|8r5kBsA6PC7@k%De2k z{{D|mhN9EE1~WsI6}3~5sn1{E-L>tW<;y;Eb<P;=yP)yZih{zd>Fw$A)YYhJ4Ve|G z;CP2st(<!iUq(px+dHmV9t^F#b@}9NQ@(215=C|7@-J`M{G}`7u?=@#(zU7Ax)iFs zPW3;6Y_ib1oa>a>O~Jb7Qy7D^^y)KIg9aN#k5SiDSE*`MWy<o3N=2m%-!0OhLrAJR zHdu+1ZHmeUMWtN91QDOQ)<6#B9j>5aLn@qat5r4Bst8~GR@CZ<ueNN_9oD_1lhx=T z`4rW;W>L07yGC=3W|v0fAAD3{V<cahS9BJ&;L=oC9K!kFJ-t=^EWVW#C~k~s`BEbD zsIks?N`C4T{y)mO=nXF(>J%hC<}qOn#Z+eDBCJ7d5=*Nqf}_@;o_n@qgR`g5X`Qlm z7J8gNlse3o4x?|vcl7FS9l38{;Jzc@x|*?xFAofSnJ*5AG&%owVVQ6O9CJZ`+4Izd zh6S&$2M4%VR<ACeK#brgxhhP0YU}llP#4)C#D{lswbhVL_~PJDV-QnhV>->}G<`W6 zYEEvGA4w%+J1gtmJ6tYORCeo(JLPzOv;!@;Bf_PmR8gq?%lWWpK_frI6+Mg&({i*t zNA3Gc372sdOoQ*vzTZ|I@3&e-8LP*aID!og!B9}scKHxqte5S(Z*IP_rpnUf8A@Ap zp)U8$8?CuOi$2t8v$<;(0wxmSupB~gou?;~>aVLC?%i}b>wlZURN}QB=73%`T%mJI z23NC65HN1HLH-@b_~D@6<}9w9s;+O7$P7xT$$MJvX%Pf|CUA8PUnDeJTsrXVNlfoJ zzLQgfN4o3fJcyhJ;qulu!D9I%PVn~4TtgKUX|+bl^=S=SD*kuYAWTtX#>tzxW*(xZ zf~(&ZTtukoHfy<)*~o+Oc>E++&*K_*T8e%a;xY#sGy>oV<`+54|G0v&pjtEa99J<s z5HG?QH6UnvJkuUF?cvq1H~=)2`Nj7aMle29i|m&E8&?Ekm)zLp>5fPWeYx2a(IqC^ zO|9vPbOC!qW!89KO>otoiHSX{f-1FIHj1w{m)rX;%e8Opcj_xg<u%oO3lx2qx5H1P z9jfun@-4a61~o5GgBt8>fIK?Xphoj*xSn!oTD&-XZKBvuTX;A)<MI)sZkzImLD!^2 ztfrk@zACa<)!kCdIa3Aa+MP-{XP%t1A_57j^v~3PIj{Z;7p1@j{+T1blz`PBM{Q}6 zVq9zH8$V_EWV!I^<i>;J?hP*22KV^Ejmfz^`}XeL=kk@8``F4$ZkzCwRS1VG$~+Ud z&E5a0UAsOdu=jokDTUD_3aZ8UR7tU1YnfP6VXP386;(3jHaen`?<gx{<vS`n#T^Wr zs*wG77eUovyvG*Rvsl@~1~y;YDB4N(@Z7&L^W1A}jqudii%TzzaXuE)V1Gv%<>bs^ zp{KG)yrM+>BI)-jzx+Y6wUg{ibKhmHb8mp;PnXSouh{1QD9jYw{4buWP@^&NMwtts z1($2_*VO3P#&SwFgg^M9>l|^pa%iHi9JuVtRia*8j5ka!I^zgY2GwA^Ud1D+cu(Nf zl*20C5S;M$h!d+w2nB~G9S^J9S<6@%hMPBY)x5no*76Fh?RH>osz?>b3r{1Ub*E5< zYDKLUtCj1LTt>#a(PGU`qi)rI!T<SZ`8oi9Mv6tSj`qQcuCyci{yfO$*Q$J(9&4$o z@8}NnM@<T2>r6N{ku|qwCNl0!6&s&BA*-k;3$D8TVpCsQ-@Mq+%VihqM!2e2|B0MY ztlU;37%^xFN2=uI+sclpDt5?Z3MJ+Zp_7W+>cxeOQVW>FCgn*qOTO-B0?-r$)!Mal zkF8zH#)PNd8(_J)lfqMTuP?L#dIsr;WPOI@7?5khYm(z8WwuQ`B3mF2w!HV-X|(lv z5S?7RmQyL^vjY0)R}jCRc05BODx(42>oPT~-B!>0AHNsih(=S?UT|4i!5#63`mbQh ziiWy;Wi_wUR#a~F&WhqXZiSo=L~^eD$d#z(V*leK5buJFt2KN~;&p@JpQa&LerQc2 z9;=P8uV`XZ1#`-8uCQwg;l9qbuZLIUZI!k4<wG^5{wemtLfM6_$h(eyky|-cy`x&F zQa8}h-YWKrioK#_4=Y$DzKl3jDOJ|>DJ!*=&Pq{Pxvjjsq7k2@)D@q!m*Y_>1Uac= z&trc?PV#LUU4urWb74OfI-Qn_8oW6MKsZ=2S}}tyXuYPkVO!mi7G3@%wo`6832y&H z!)i1PpYE;C*LGHXpiZZ^rna8niejU0^ED0+wzEpxifnpoNg7y~?pbX_t3J<}Q`%a= zGCvj+Fy~wRqNCUhAOi?f#^LehHqXqer7hPQh9{=nYu8$qFY9j>o-&V3EVmja*KZ00 z)=VtX%{`4K@}g;M`B3ZPSn)UTN=_}gDk_t06OJgvynF|P<Z>R_!<hJNC}@Kg6RBl? zn_KgLv-T$NbyerR=w5rDVV`-Qd7ej|qwyS#wk&PQk}S!C<avs0JX>bQ!2>ZBwF4I9 z=9(td*n|d}rVMrxhZsm{n&773gf;})0<TSh(D8ELeQw-_rtlKW@BgiRjwBnBJN%w( zoqdL-b@pC+t#5t9|NDR2)~vxKd5p`MK`0M-{B0e}z91xVw@1Cf;oZq6lHz|R*ppGV zJIdBWhxW2*`-gUM($4<V#AG=jiyz6j4e!h1Y58ecoR)z&W^g1KPdcA)ipLQM-mk!9 zzVIBTROxAw7tfQP7T+JE>6S6uhGVJIVHV#1M1<WN`Q3;(1_iwC09jS{E2ovG6$!iP z1vQ6;3T7Vu)Vv?jMA`Cm(Wi!D!@eVRb&+^~q%Yj(>`Rf48VX{{h`;%^H^`QK)5z$# zYDLqp;`tG!4>zv2_tFG5MC_UPA=ybH1@5=fo27|2Ca!4S)$*H|%l}eRE=^28wm{J% zT~9mUv6OAp=MCbl&PJ-6%bm`NdAr`oPMDLqQZ8w>*!5d=W}CybHr&&*AP`v4(-U5s za&FZl0;;vRAuzgb^GeluVCK?)+4Svao?2Re=-9FL_G8Bm)z3UL^T>Z;?gLJB<>qyx zf$DzqS-y@>s)^%vmXO#%3zIA`W%nx<k77~wySOgrsxIfn7<HZZvtGpB_nV&bxcfh6 z{E|_;%gAmtvQ0)dVq~9H9#X{Z${mU*s>-+`qNcGT8Wq_Ih1c9C_ajr11_`5t82i@h z<@2e8NenrBg$IP#Rt=hx#GueD#)QTc6Dz*1{v|{Gk*&*{Zk(J*Y|VaZ$L_6b5?8Pt zmGAxhbQ?BONGOr(VSj}^$qh~HebwtErOHWLiH)A|O$B$6>j?aaPso)<Is+Y5FW!jJ zCK99lC3Zj)VAU2_*&nJ7wBQoW{B+&rI_9Cz&>qLjY7~D%nh42M`aXfa881l#DFmx6 z`4J6qysU;G8iPk1LuvZXG-)SkQU}vV2#Z1r2Y;BiP0emte3K%Lq*VGC*kqn3jr6ka zw#|nJ79ZTy*0$;3;(^1P+jb`wu5D{uvoMiZxTdXb?ZO1xym5MSW8>!OjkRO%p5c6c zcu#Nj$n`Kh^g<7_3lU)z?H-rUlj{NEj*jGGc@D?G0X~pHQof{^$+_S1RMd4Cg5BKj zbR4n5!sc4Ore{FGN6ZFt9aq69&IZ*gjoaSd?oSz=H7%YgU--S!%1@6h-&VJ)+>;zB zk9Wl4ZA0Rp+<Hs*+P1*VRq?FZxK^6EY>T%S3#|Zw;)mwK5|QRY3@E^VS4}X<ZFE0= z<Nc?N$#EbQ66#3HsG~_xcfjoRetaHS=jK5x38Pshh9*J$*Gz&6S4c<=&m3`(^8amo zOK8Y*1Y4#S0mG9Ys&32}Z=*u(8jom7DIrxZmEiG*;}vSm+>B8Eg{DB6^chlXXpf{f zO57n{^MupB03{vpE)7mHXVcHljlz<x?JVCtn)SDCUEXTyy=_(VZ<r=4?%LR4_NN1i zZkf@aTUf8FY(Bd7*UXt+m@^@vfLN~ml#Fx=wq9hG%mE=l3j(8vBfQNRhyXdU@alqE zZ$|7dpf~K_qdTq>5xyzjP-Kqie&<uD0(Qh3J8YpsQ7-SG(y!-Yg^b2ZMRR*#Qcb{I zA+!z;<HD%qQWxk3zBw9F)j6g`cBT0<?X1$$T5;|3fSuWG3)|OY#udMCdgLcP$w8WR zvC1GzdHTlI6>=+<^!VA#ztPmY<>tZdtU;Rjr8!b5=38TY{xKm9U5R|g%`BsK>GN=R zGTFw=IreZ0tOQV$T<o-qO}m&YD<o-Lk}+AI)XV#0Nlz>($71@hcmOd{9&M%Lvx-xo zpy`EY;f<#!m(?v07TI$6fE59v<<<bSYuHlsfcLG94XSJ(ZfH5BXNUD{ksgjvi=N4! zj<Nn2)5r8N#}a^?_Fy|W(m*R?Lj!9l3>|bo>=wz9<vZe{uW;g%`&=ho;z1W%hm&<+ zDkAU<b*wxwfoJgEm8;Rj3G!k9ZtzyA%tyW!M|XBz3q&O7VE`~hz8~TR2O@Tqx#yoF z5OHVbE880WkW_IBJbrX4+_*5A8z@JQ+}yh-5cjU`h%{%szCv4~VQEL~-otf+?RiVo zzh!W5q9GZu+LAySZr&YM#%w`rARCP2q5-QbQyy&Dyxrn(8pdr2uD7@#G)QkT3JcVX zX^Nd7%ZxE;|CH{8P88s7t$KB2sh=4RlOhgiE3S6S1mOem3zdj@Nq(i<#QaaT{X~3j z&6UT*ZSX*mPPH070;tkp;o7J+`ee*?FFi=~Aku@fAH^44@D)52d@RU}@R9_aeTF{E z5pLEZAV_BIvt&1MYyA>I6n_D9A}JizWzWrWY?xKY9X+#)Y}3F_HNNdrquE9Efo<`= z9ggD2&IRoJ%!a*N{LM>S*;6yi7wjA<;v6w`#c7<QOZb6WoOZH93fp669kwO5<2LD_ zmHm;K9XGK<CeZK=Gx1HwKRd*W4#ww6GpSUl*k*O@7xW$gIjvmDa#$?}hrznvV(?h- z`x?FkXxA`XrpH8n&g~n9myM#H5qj@61PmRPxJ8sLZdae?D#HTTOdh&ijP;unr7NY< zn-dqI7tdmdOUDCBNv7~;3G)fJfhHpVA+4BH;)>7ZZ+CTw)49R^zSQPa-{PU{jqQ6o zI`+1S&&_$jzC82xJyR_EWt?UVdhBtGMS`tRvz-a{eu8zz*`WaIaIyd9Vh2qCV}jTX zjA88AC_5Qtd`DkT!w?O6g8M^JPbm6e>hYAA3VBY)81PjVlx!8-o$P)m^Eg?|>2dBC zkk5d!u<UgY^9bM3vC}#x^MTXJHhI5M=P?>}Cnd(cY+JFu+ZFbR!s?U}Wuqc_6egk4 z`hG$3z@&T6#%vE7A2*5|gC-l3vHoa(sLx{)68OW@0y`wI-AE|2u^Vh`z_!LF3O1eM z4ED)=#y(xYR8`R4x`6en4IZFe(AfB}PXynb2)wE3X!!8<(gY1TcT!GF1OT?Xz4jTY zwn631z{Lse9r&g(J2kNJ?NEGgM^M;E`YkDU1Xuy!i<Dl{fpa<b*Tr?EZEY*lyX~k_ z<ScB;ugQO^pr8_{eMe?x>$dte?5+F$>88_c%@0>R`o;UYCVzR~eZQRSyzh&@x8jF0 zUpsx%Kk>Cj$tk<|TKnnw$AffdE~t5{GW>vt-G{MvoBfEqTl|XMWf2@Ew^{Et3y!K) zfNhDp*7&UUa6`dmaqV}T@n>#7pgP>U6r&HgmZ$LBB`AKZU%><Y@Nq!I=?ioCLVpl| zJV&r8C_1VWJK*nk_qqC%K1ZL0Y`^NL*TxwJpK=j{TOHd{iIAp%$XCa*RC3@Az)7_s zElngbw`q!FAf<}iU6C-F>_bPf+#U?Jx0D<=HXL01?rmqEzV#;qhZ<ueV`J&`*w{#H z!}B+=B{MTjocZpyKibI048S<}d!K`!?Q<^(7D)b8bcwP>)?4;l9Ud!St*%?Gk6F)I zB`c<!o?o`C$9!e_{W|8+F?K7c{3!C}(8YD4tb=#P;jk*)=dJJ45mg{r0NheS+?ZDL z#fkFqdCNGUK#pE?R*qK}GkLb)!=@=hGX)dJd1dgf_B(Q0$}L;+H?`k2z<f8pzH`;n zD^@(cYUgYFX5QCiZ5r1S!nJsX<!aH2TkQgWjFE1mVDv!3JLI@5%Cg^W@qr%ku&2*r zln<M5dRNLX_g;A!SkiYdl5b5Lc8oZ8u|uxFCWDu)tw&EGd{OZ)8W<kz39|cUOx~`( zp~1fJ%%kk@#J!=BjXQSjY*^h_xMAn+Evw?IAy2jg8@CwPIHM3%ZKB>JO&Mj~af5hV z07{Sic?jFQ1y2rP^ay^k{qG-m;O`~J$glo<gznEgY+aq|V?dmKLu4KiQ9+$3Z5Ow* zodWQt_yM?%WFwYlOS4pAY2O4}y;XAj3i*428Ti)!Q9B2m06;X?p2J%ga2hSmet>|m zi&g#yox=+wQahaj{=Nk)I!27ELAXinzh8e^FLvtp>JRCqv%2r-#IK6aisF6jBojN> z9&pS`qtYgc)HeyIDH#kBB&uW-byLy_=`l%?5W0GK;?*)-8Nd;6{Af^lxg2QH9%qFH z^aHn1lJagg`2Eq}|NYVL!&ULM91G3-OO9!KD_DV+uz$aL5>qdrni<mz2nrt;m%@fZ z=Y&daX{P%ovJYmg`^Ku*A`T!EM#kSHRBM+Al%gQ%5Im;bpm!)YDEM;Vo#4xK8g2kp zcRx`$FUb$KB9~Yc8m|5a`#w_b>|po#E7g)D%dMXL@8mcjNC1S#d#WE#xL01PBXh8B z%EN7HvKdt;{=(BqfC|r<j(7(vS4d>o%~k<1_@i;&5O&4;WSVm4s29D*$GHoiEXsI$ zU1nOxT@q&4n?{u&9sH#WpBjx0NtpJAR+gKlD~@q;eIl~L!C<frc*u!sXr)Upm7pz? z7xYRAbC25&aIqnr$76Zq?DV+_PjkI5bQT{5Y=)SuIL!?SZ&N;`Hgzs<@>omlz47|d z_E@@myxtxQdvrj3Wf}*a7T21^lI}}-qrsgFm-FneqHQDfGv5)xWa-MI{9#Ydg-ACG z`GLH%8J9yV6~T`Cff&JkasdT1{aiQ!O$kQAduj<!f@C)bj}ks=xlGSx#bN_g>TDXV zr<5}(*9y09TCvq+I-YPasBL8uU3{CyEE$`IKz~n#lt8#ZgIHj|IChSQLO6T}Mn#zq z(<S)ZFiJpL){HA24CsLOA29vesGM^SHgvA<j%NpM=<eH@n6OuJOE)PQ)QeJ`?B6Vb z!tl=S-d#gEmr4BZ%9RnFamVJuP$e3&V~w?4{eZoQxs?>Y^#W+DxRp(N5n0)|!Tbmt z`!e~bY*CsuE~{@in(j@HrEg73Y1Qc)=2Ogy2A-pOK9!(tT~^Z=AbJT9&)JmSNjj&K zfM(8Vn-(`3k8tk<-X~q=d3+R{j*|AtV?--4D&?vRoer82if2I4m7x2Q**O;%nx8;K z2@Dh!YVF<Hmq@D<UFjjz;pvF4SnaM;8?)U`n;grPtcBqn-Q7D!>a4agvvvEH;!rtk zmsjXbMyzL%kIPle13O0M>$4*Rr_A5b$dGg9SqoMVuJk?Chj;9l0Q}nN5fQXAX_*Fr z;tBH6ApeA}lJE8OL<M$oIlV6|3!Y8UoZ$0Akfv#_s3vW)jN1Ws0Gb37&NA)vtW;J& z=<;w8fi33@bDAvVm#0Bt6c*=8i3Y;i;hYb~!FK%>r<yBtWt2@za~1nUVrO6X4FlPD z_xjF;K_`2}jsnC(h0QyRI`K*6iqYiC4ejdf-Z@<0U~p|*eu?=K0*~+iLmpQ?L+FZV zTxhA#5q@_*PBeo!qBcMtcM=%S5{?WyxaR$GZFS#@M6>Ww`D}J9duvuq;}gP9r;pBs zV~!Fo80rr`BEJWYmsL9%D17vUvl$m+LHHVcuVdPmK8_)~pqktsVVT9Eck}qL8-M3p zS@pG{U2Iy9Rfoxhl?P*<V2!mI2FC|b>@anZxTc9HjlfRxd%<huF(&!yqx=rC60_}m zyp3&z{&fwLx3QT=4Xf6-EOy$QYug8QsBzHl_H`v%Qf`1K2KNl4j@@T)%PZG7k(%bI z8{TnC@5*4IHB9^6Dm;81bIvUcs7ak0xuY)Z8D6s;vc=;VwH>!$?aDNO#%YN!6i8{n zfA~TvS6$`saba}`u#Vy5((GCTD$H|Bv9+B=>lOloP@m{){oxNMwo9^AKW?xr>26pt zGbDEGycwGn-QxlF0n-0sz*qk33xG@Udz!D_W85NsZ@H9!`H$oKv<cBnt*(vBY6OEU z#2T(!6HUFq@A=_N;5QP-%ja<)>9uNwrI|e{^E*u|hc6U7fnOE(PNt}iJdAIV&o&0a z(|+y&P4d|6s(1=Acf27%OQxYX4f}&+D>7$fNdVTCuN1x|X<HF(KU#eCC2cdh@)B+| ze-oI&YZr@?WAVukK;jkvhiZ-@tt@uRI@s8>x+jzB+p@54Tk^<nwX9D#BP;7yk1%^v zVd+YLz7o#%xLW04tanRa*Ve(jTb^k?bdzFPX>s-svr{_b_LU84(Ss}G`VQTH$_)() zH@$%5pv%wWdY38;nFJs5WrN}PP%UD}ZBrILQ1pmdekME>{#jTY3o|h=C7cNbN3Ej) z_cX0CLctrxMG_kj7@7@V2KEDkpjq(<aaABAsv8Wv2{oL$bJav>VYFvei)X?XD`y>v zs9!IBsLcGrY)SWSXq$PPDa`{#H&A2Z%s8FDC=B57PsH~~B^N3H^g9)&C_B&Cp!%^h z3VgR0R13fgy8F$mMPlxT`pBJ&<tycX*#fhz0!=huOJN4k;@reU6H2xO@hi$(P^3Fa zzx=zde(&la|1Jlzl*e8W>_GmLwnBnO1zEvzA*w`0IeI2&opMX&GZ7w+fxBQ>x!<>% z))7|FD$P5roy1F(>RFUZMg-iex14+$2KT&klB_wK)f}=k*G+7$ub$j@4Ekk~ZebS# zTjb7d5<g4rOtm#VgL@hhuBu+I3=_db=?exqfE7bRkqh_$mVrgV5-`hnFoEF#3I;wT zKlk|{nnSKW>j^NDobNpg4a@-7?R)3LY&rRI)v(9QfYu=4n815N!iT1ULhsVfqK45G zQL;}dUXS7x6rX}Fd_dST!hgI+S|5%V)Ravb)<+cUl>JQDH=-!C!zqfvJK|Vj!<;gV z>iJF6Y^oADgsxoRZqJLFRi#<z+EPNML{-DXYZ9R~k0>Nj2Ou>a6>QP=*y6qgo}0ZL z-8~T)_6s`8uABYs3l_4Ne_(87Iz6(u)BXR_tjh&ZT-zH&St`iM@vFZOeu*))2#ZuV zOVC!J$gmz6Flxdw8<+ozY#p}Tqo0z_SoJF`)8Nz8<l~jlyQDn`bV`)@g>yjw!~d`A zh9_iK%x4ydM#bBdD<}Lhmx-!eU`<M1$ifDeRGn#32SXf2@1>`hZJMCMllLf<1jpCO z%S@Udmtc6pb4+mjo9YK#W5@1>a5nzJM9QRzlzCYp+&wK?YDo8m_kbt72ON3VJOqM2 zY@*GS_C<Q4c0fKhopC|lMz9Ma@@q&;g~wvd5o2<!G}UmXv3@i@>KrYh@VA1$4hN<! zFpuzU$W6uk!kB&d94#P=ri}tP3Q!b0{hCYW7nk1N0wmv+uD9WVMGRo>&Q|3nKX5gb z+$&sJt;rHfG4<A7*hQl=y(%#|SRU{jWA*Lv?qwy%geh1`H7&Bp@`O29O4<|AfNp|) zB)h^Py~}A!s~cKL+%)#rdxPdsPpbAplyq#SYAbTtiTmUi_E8=jGz46hos>=+-6^_I zx<T`X_kA^jH_TI2>-<d6JLNwU@Qs>Ay~?yeaiwQ*A0$2=HPJcW`-vG;)61{Bx_yJ! zicNkk^M&T@iPK*Db1@2iit^9zenE(9dn;h}f1?I)-oXMMyz~Gh5-Hfi*(Bk)xON>n zYUbMjJqpXrXA^!h{QM*b{L_wcXzM)INJoNrMW^+&3bZgESEm8w{zcWq!1}Br9cn-; z<Gc)WF`DV4h+bc&cHA~LFfc~HOxLrMqIWxc7VV<ru0<R6?Ad@{ZBJN*xL5@Dh4kpV z)D1R@x>)Ishyk3d*o<caA`Q!h07)<03;-VB`oRNThJ%YB$Jw;OKNUQaGDy>*=y+hM zk#F%v^R%Bo@q2Jx+BQ%7Jo%|L^9h<9rYg-%HjA2~I9~_9)Lb5-sEVul&ZecsCVN#g z-d5FyCz3n3a?GU7+YP#zKO)_Du&|IT!>^0a$ZqJyn!dCIc@x?-zVL$J)bt>d0VG** z<oXj?QK}!;8w|=*etzTV5ov2@(xl9BTLCG({1a%j+!*JYt%pW}H+7s%$^4RKh=a>& z4!!B8L;RgkbY)<v$x35srJ=KO+tdnG2{V|mNC3FdAk7CNaWw!HiTMz@c_0@S1J`nl zJXIX1+;p3!5}m9Xl=i0L(oNgAsktLLQMEjoR2U?Kk`3z&+c%S~>6WjIz0OTfng`lG zco)XVDIjmfpm)<A<HDw5FikrE&&N)T$QeO!2<!oUjKK|1)m|YnaGRLR8jl4HiltHr zRpg1}cF`^A_2NpM#UjouW&dvV^6x3ao;{8A)W8<JAY`$cC}vd)b6T4zQbi686V1L7 zjiCb*E*BtANS1~TE)~9LxN8MtNv~BC1VK^;$_BO>zo+~Np9+b0ZU@p$hChYmIf?QB zo{^|g`_a3BR;7XK?Hc5gPijQpVsb1wrI$T=If(#SNSb;Kfw0V3(vm|{mSSU!)CB-e zK71a6N*}Y+`JTsHIDV*la5^Pnx|m<-@lU($v~KJ*S%pPV%~^zF=`9M{yfks?`ncF9 z%5crr;mLV91aLW<%<PSrW9J|*1T>_-=;~<iiFFhLyEh<zB`P}|YD0d3EnJ9X7u5M~ z+%dSq?o@^r$C9Z+&>BoNrw3Q+jj}W@JL5@b$m=rO!<kBUc+_tgH*h`<CM<)m>nJ$4 z{lXU25r-?gHz>IixMNlkV|)P#2!UZ+a4g6q|CIMkz)H%o8YGS1G;LF43gs#kk5pFr z;p-fMynB_WuyON_VzqD{09lHNHRaq@r+n3tgEH{+%P(64nLx2(cG-s-+6Ifx2~l2g zIbVrd-MZyQZ@7J|mA$TLbDGZeGJsfKVVN2;1aOjTtjs;-@Wz2$@t*OUr{ps}&xmQn zO^Sl*pma$)wiccTC6R-JoATPEug28~a#poLW+Q7I0G(aNp4q*s?3?Ib;z&gN`U!{Z zN~`PJSZ3z()>Wc}T$FFqI&<OSeVmg^_|EeVKIdp_2atr!ZgLzNXml9f`!;R&4<d?# zVLjj7Kg^H020Ff{jv`iOa{<RPMbREXvdKmr0HRY`h{!{ZcVxDJm`T8_)t#e=rGnUb zH5TM{jmRU$5#6XXO1FUjRKsZ#SKdVEa$Yp87E2>%;2l`^B&|z~hi9~)4OB(;etxoL zP0M6{r!|?)Ii0y|(kjYdnE7DeK4$$w%dI!>E);g(d}|A?A15n*gzL{pUwJM{SU)Jp zd_mJNocD9ZiofOp)Q!ceFW|-@+Y?R)LXvXlj0t}z(<_2doCg|-j?cPrqw(bZXX!@L z6V;5dR5PqK!|?LL`CM@rM+kyMcKD7AQ#0e48!{4q%i;D9XA<GWR5Ig9W^xc97tY%m z36u-u??{HR1t6`9qlys>v5^*U#)ATVPEhEZg#^w=AdtvrTxX(C8omPlK2Q>ZEfGYG z;Dr>}-C)}kZWZ8*W`8049jMj{=+T!zZ#>J+gC2b{dh{iHejr$33(yB2o`)>q4NQ<C zJ`#=m70he2#M${s72$8)gRgJ*F`bY7!pHu}#~${5+b16Iv7J7)%EvzPF~Jx1O-X`B z61YtomW)6mEH?%)hDN#;Bfl0SDKkdu6`u&p$Bb+tP;M&5&zQj2-ECxJM#@T;j0udJ z5vI|U+2{eX6+)Gd64&F<CysEIp<hFwW+r)kT#LT^tP36>`kb6b^motW>((IVOMl|Z zmxkXmu+JLU0RtN_>_jFLzj63BuYwasu)JzpfhlCUH-K*-i%We7-{KAU@Q}dRc@^?9 zd1;8e30z0Jmsz~*BQJZ_`;u2Y>1BJoY@L@a<?neDSW^bC;+>KV9?7s(dQo~!k|;Xy zGejp;<#k28LAi`n?J6ESn;A`xBu0EAVP&WCX+?Zgf^&%7D1Al}6$v((WyCyUgiWRy z(%dHFfm9wv)xxNVqTU|BZ!I)>JO8=k4!*{;2YRP8`^IdP6>pYi+fl%^8gKoC9^jGH z-kskQLb9b&;9~WQ=X%pN9c_`9c>c(|@GMq3MQQ1P_0N78=?#T?A}bp=<ae4Q@sz`v zjD^k1O`%xQ=}0Cb<{R=G8i!xlx$}kLJxo5`bjvNfb4`;s?rCV)bK_)FZuc#>G@YLL zkn5qET>Kg2f?s%A%?u&@?KUfZgz6Okh@BxY>kzcStV7TOv*g`UJrt8PBak;$i^n2i zkUnUp59UI#Q(7q2ADj!jj=D!&Bg%+l#4>80yG7OT_QhJv3<Ggp#FYnJ+3gMoC@|(l zTk{n^xX38ldcP%+E4bZ-Y{GIwdRz0?CXd{`<EiFdX<vI6%C~lPwR;CXum0!r&;MKB z?+ijt=-|uydt7%y_>UKaAeOo&;@&5NKo?*n9o1=ChYn^WacLx<1bFN8WI7266C9py zzguzn-7dXfkAd*xb;_;Mj_X#@#tjP1<-lX(!D@4u9jFs#G9+?Xnu&aI*kE>;r%VQq z$)I;QOmUMao06|P-g8`bNDd@Wy5R3lgjdm6nXyl5TLrWi@Em~%1QFZd%jM(M>?9f~ zEi%f2m|WWQs$nveYS5IT*Q7oICX4@g@N2%>c>n-REe&a(_gdhJ=n3}ToY`rK=jsEw z&fpE14HZwRwXe<+@Vj-}^rn`ML(KL-!`@qNsZ9R(<}c3t+ku9@qDO+)OVa^z*l*8c ze4Rp{n$_D)_9?=n=rxKBgB$#Gvcu#;b-d%sh)HiaZiENr%AZo$_fIM83r>J{t8rh7 z_exs4m#1vAv);imnDDWg{ehw7BjK5=2y%Ykzh?Jsl@&ep`v6Q`f%{uTEE07|fOy-a zT1*LMl7agQJ9+LxLADM1r|vJDE{NL;cND~e;qeqpDR?(kSC~ej4v!@~9ksy|Kp|nC zUk#2aoK|U~jMTj=rSgw4lz>^eDKC%Pg%vMI+K8S3Ha&uM(4i<bhX<mHft26ksvl|B zb+x1uiF8Ysu6?8)xQA4LjXA?<*RyqM$v;xJ;F11ek7v05kp*=lzIwIpSywuYoLyWC zV%EY7xE5?5-)7&CC<_(Q>L#Ab3U4Ll2W(%zo(GqCd&HMno?rVGHM1wd4ET@B58M0- zU8FLVqUw6$&BEQ#Q_cYiPfOQ@PxM7$x={EHmyfHj%w7Hjqj-vj7j1(dn8=;rI-*P* zuvZ{l$@NH<{|y6RtPViE@7e+Imu3e5mGy)-L^C@KOL>F3;E4b;dDvn3ep!6l2ud3! zC(n%ww+Rm-ZVW9agHck>nVdmqol|l;Q$o^r&f-)e=k&OnZ(n+;tiY{J;pmA=z=dP< zI9iTi`=q;TA)+c5311>Gibb=|nP^GJD*kXe0w1ASr|MksYu*5NTXQKIuq$zgKWuZk zTjpNi{x!juQ73*M>;W&Uhfn9(287LnP9=zcjYdNfwQ-9}fSC`t98V%2VXCE65T0mc zry7}|(bqWCcweKgvGq&Ivq=$A(ySmjuypQqwzN2rI$H|d8*<{G^tsfR0C9R4ENm-3 zYkUagSLW$2@_pO@7DV{`r8NSP72=Z16TLX{v`4tI;LyTgP!0p7tpYaqHh@EA`~Xmh zp9wH@yamP*-W-ZIOax4Oat_R51C1beGJrG5<HwVE5ujWivw(PBTEPtYIsf#&`UO!> zpevT^stXzayZxUT`%C+GoEsMx7onEon#!H`xHqk0s0;cxciw3+jhigKLRWg&7P5nG zX?Ww1Vi_}erfwg$1Z?(@4U`WU*Ywq+VCE!_r&f*QDfCGkPjLA`iy_X&>zSSqvcfK# zZ>QX`{4-3K3lDp}jNM`Jnp=0*`|CI5&3+3oA76*BM#25d3n$f;4=32eARKclZbitW z5~SizF@>e3+=|Doq})%rnZfOIi}FUs@(fkOzz`*8vvR0TE`(!8{Q1mbz?X74eaJs( zvLf4UNfj1=a2u#1FOhqZDKAkHD!3y_alr)T(tH-61DVc~QEO-zkj7}Um;2^1Vcncc zNAnWEu}CzX@5-^}p{9Jr>Ne%V@nXoKAC=>kkusuQZbZG3^$~~Odj7>wd8|ER(vRs( z?sQ9x{WZO`BNAq#mm@2{5r8pgdoboXVF&Jk5s%Mv?tq<Fe=dC%99G~N0A);GaI%B^ zb0;_?>0Z@cy_F%m1^dB}S`_S4vh_uU-J?9Hh-1oDMbvaV#cDQN70K;#9Cz9*$4$Cr zLT}TRi;%re?0ij4#1MngxIkE9M$#5gwYD})GtLFZ0<x*mBtQ1p_+#wERgKv7>hiz+ zTMz}zeZOBgq%H#lMo~OdI-}YCqL1C<d(bD2`L_DR7hUWg*Mlx`%(c}ea{s5p8iz&Y zbJ@X&Bimg*eK6oX?g#6r15roQaic_Mc!{6m+*wx7lb`GB7vR6q7EZQ$!gRj1b50`y zIeXr8=8rvg-^yc)7av=>{7>lA|71DNy<Hq)LlPjHU^objLtg8*0ul=%3quXV1Cnnf zpuh7fn5cl_0eEKu$ZPBjK+G8P-<!^F+m@HuiTVv2>gk?=+e`PQYq&kv<37HmPX90R zd+LgwVg~%4rh(u<-GDUkjV)g@Z3u3t+aPWDMs5X*u3&~0Y{jnM$o{#r#{M~yy?b-V z*S9UYd-e4Upa?w8P%bilu=mzjK;Ol%f)DfxQtJPIrUPa3SRiTpo=+wEe@+z&l7?T$ zGAjNbvWQ;!phhlQJ61_X`T7LjUHX0SeY9iR8)5ct5FQnX@59v6){q%z_V!s0j|6yK zudt6WuS(DAL_LEi7O7Qs*D&}Dbb3N!fyJWoYWdYNVIN;Ey;*)43(pPWK)*5ZXy2`< zxEFaR{l|Zth8od*^&{zf$T4ssHh!x*oX+nzn*+I2U6T=}g(w_26gU-lDj@9!X+@*C zaJZN`oXaJO{g%|>M4xOA*f-es+I99L(Lp2B>Gk?OdY!C4;s(STI}_5oh`t9BvPP)@ zY9)m8FVZ`7MpbuJ)kh1gH7Q?JM{O-37e|BP4{}R(_xh6-tI1dI>)pL1$6PBP*wwXQ z*8?m4ok4bd<`w3ixx~h2ZU}a<&Fap<EY_JQf(ikJO=q^&gX>`9XE)UAq?La;_Vblc zIJj)<fu8##@Nn9Mr7xhk9ruLtm~;-#6Qf}PQW_0mL&+e?2H~j9>`>ucGCpWvO@>~> ztp)<%VQ0qX1pcT?Wr#T1WhtSkwF7WV_~4*W`g>-#C&03=-JgUsn-QJ?zqU=NQ~d^` zO*m?{!-3Ug>$Tl#lWay6#=W-x;XB^AR3Yuv{cAQq@n5O;T@C(*jePebUKm^-e2>J3 zjglgeAGcIxKE9Xj!T09iTA}xErT0l*3ID*_*?WlHxSvP*xYq+uHh8{?B=1!S?(5<y ztlgDtip83euG*1p3pJ*^-c(~K*hI%B^of!^>;twQQ_}ey(_`cbAjp&p3eY{2c1@T< zww^$Rysh*;Z|nY8TdlS9{;vYmnh8O158E#O6j|+S)s9KyVdMQq3He8Hp@}$(?T(lb zjXrMqrsV=?LRvio9?^3y^kV2WFc~8^-rl7j0WCKl+lune#M={~g>E7a)bfv@P{F95 zuUJCW&^BgGNn+de&JbL!X~h|^IHPj2&Ncs~_ycPq4F9z(N0h+aQ;Mqu*<SI7*h`H< zv+#xI28f-vnU?NqI8vJB$F1MAUI04yi?@LY<~Bs*QcID88Of>mG?zV>d@=c2Qc8X? zC7csq6kh{j*cWw%mgddb&A(k@pGI@PUy3;Or`Rdu=9C3UkxHfa5<(ETdC(rYq5jsD zi8tT+=ZQC8E`cb6*z4Yy2+Y2uomtDiNWv^9(0>*CU&TjPJsGTda&S`oqHL9iK<uFt zEuo;_&;sJ~uvw%e-$8uRF9#w~yDb($TIzF)W-c>jQRT7Ez?Sa}xGUv)o2|ZFaR)lP zx`Lm1tm16$To4W~=xm0~ggMLO9g-e$a2=+Efo%mCnX?`>mW%0eW~*>12s=^eg_I;2 zSWsOO!@N=<07bnKF;qd1v7Qxx@4i}k2ci(XL3#Z1-$?TB(OwdN?_gFUUMWo>zLJNQ z-z_|@?mg%~?iVvz$^B$E>s}Mv854(KvmPx>W!c8UWI@apvIWazD{DP^FnAnHv1fbM zHSTT{8;|mI*t3he?~O(c?mZx{8}Aq?Z7hkUX=OZ<Ob)fI1E2D=VP#eVjTOc3p{PSb zLdl><==LNPk-Ln1lnG@94_tSL+C-VJ6J1?ghu6c{xfasHb$aMjUN7z&;dmf;wCEt& zv*q?0oJ)LhY%-eI-dhWL_U?!$ceU@mo$y_&*J=2!nIFtXLAP^|SJER{7gX9iYvIs^ zmCp9h-YZ-5rt!5L@WqsBbo7B5><jmhW8tN{a1T)pj2VSvkT8!5epSKN<j(4><DxE# zII9!4veep&rH{2S0$cet$m43A0MrPWLahLk&yP9*<1(<w*VPH=fXxbEyVskR=CO=! zx~@)usA-em5r1ozt_Wkl0i5;!fOVJ=_NuBeI%SBfVD*j11&cX&4w>n>by%85g=}!h zx6UW}rW3J{DH@E5(NW8YeWP8pPn(T;gX|*^JVI1}WWB7B%4<jL2ei#iaPzB)Kw1#n zM6d^KcNW1m7pWm;_(o|%xMjFu^@7%Gft~h&%<AUh<{(SAtQ%-FJ@`4vv)p9evZ=7R zIb=63lO5vc9yB#9#!?~q2`)X+1bZh1#>XC`mxV(zV@^3^l=i?+vfp+Nq`Zfm(;zc; zq{Go8enmJe+U+Q`LTm}5DYVCb&@cK2jU3B=Nt=<lI9QovV?sK<gYp9xu1u6)=4K9e zOab1_15XC>^uQwH8gg|DH*z4M_rvdgS4Mu`%mIsYVj|u(-dx`u@wat{>*G##=Tf<R zOL=_B=a)E^t{&ai<x?!<K_#a))0}7&ZWhfzR#6V>7t|XZtxc_Ct&;4r9=Ebx);q1D z)opn^4yNOX6h-3IDN)=fqM)&Ou8!3Sm5_JZd&(>B^WNnZy<v}EXEy1N>mSyOyYzQL z_&=WcX66Ed8OC#sFE+l`C^h=AF-^RUjes_Cn9n~h^Jlo5v+v>4>bsl{xRvAyOlm(g zE6$_?{VH!De*_qrKgM{wIWn?fv}xhO#-$5J?GA^1bivZ*u4ub|biqi3br4f(pp<ae zj%@Ry2DFGq(c0G*Pqg|*7mP;i_^XkIo=9WT=}b08q78IxpnLDefaNf!W5RRlEkZyE zh=E8<ODJ>uJZ_&696zEjmblgZnERYtatCAk1!R}W4jI{HGP29CVL@EWJWCHGKC{Uv zT0&V|3LO?B2nrtd$+FMqj`1`c$}zh(Erq5EX+xMSTd=*r;fC>?7afB_dZqjZC8@vz z&r{9<7-+)E@rgs8hiej6Xl~K(&%W}NuS~aZEA7dwX{cYB-BrJ>{eHZ)Z^`Z@8@|43 z#iPT+kFHq#_4RnUPm?EezBisR!t~#ej7F0n>o$oSAxxBu4C0m>q@43tbH%M+e{trw zr611xw$?`j<itzJL0u@UWES;&ww-m9o-Bz4KYL1H>jzn=gIPM*S6kVA74}q_J=Mf^ zm6$ic;D>(N%BHPsbotQ+!_l^Aq|?IMi_B8Af3?gy%B<XhWYN{V{YQm`_ViKT8HC9@ z;k92CjV7kS^=ZKC-cw~}Dl@q}`cRP_DBf2TZ!EHPMK;~b?&@VX_p*ma*=Y;A%kqFl zoV2h_&>2R1i@K9g8G@@%FJuc*&4og;kUo@WI>)n5)~&O`wN-K|A(7}^Y%g!1umx@# zNi8Bmg#Y5DGTtN6MJcAUKRh*1^FfpIg(B(@Y_R6J5Y}85b5$?k#Ng|KmV}$LY4MOd z&qpF3>riaCv$LyR&GfZIoWX=67~Qs^vLWOR47TRGtf4}LK2QR2M>Ml<`{MPXb4Hsn zn(^0lCiNygo)lV{&6Uig^FC{&&{+sIWWy#;Yie+%M_z97B$KY7*Ja`#1?w|WleaUw zbh+2Y{!!FR?n*3_4tp)oquk|qC>=tem1Is<+=~?JcY($83w19DUZ`g-n`_wXkW?J7 zBL!Sm1H8CY00$1ZS4&VYAl~O8Dl7AzZ}q3se*8XJJ&Jpip-^)EFJjTedn^8|%DXTk z{GIycj>iYt;5R)NJg<AC(;l`L;hlpU1e61k3Mh981_4nNmcH2YTF*~=q$he<&%qOz zPcOz^i~Tevos6+PP*@JGH}5fvRa0IzkN&WebuPTS<F+!}hWYn+@SDL4LFs-Z_uak6 z!G;|h9AePH9D@UWcMnb#*ewNCIG27g{aRYO5A4c!@71#<u<k@3oEWg}FdeQ;P~I-4 z%r!5_7Q)oRhcNS@w<vFct70pEja;>l+YrWC4o!^}d@ccE9!NveYV4Buv(7C?1_q97 z>8u?`3QKk@T)1ONp>~|P3eK@eymcraDkZ!+zqKu08R+TGSL|-RKUHFz*B+l}X_+{_ zws!2lc}20f;^zM9@$-?^<>i)TZ4udGk-ClUB?CQUPGh%ZF&Qy83T%X}!v1O(THsME z4#zjd#o;hp?_zEj)47=R&FqEj>scxL#r2*&9x>->_Y8qkxxx{RUSLt1UbMbu{V8<( zheo0sqmxmIC!l2D{fw3yOOH6RLP|-Aa_SMqm@vL>e9wqVNe<zWK$8Q^kCiuwxoV>7 z@x?$>@r{>C#2b5M0@f79oFW?^%RTa5t1s4)Y~Vh<=&RRTQi?MjaW$ptI@6B8s=8!H z!5^w$kg%t`23I2F@9>!2i;$};?i59x)vLsUY@sJpNxY{w5m9WsK5PY8!x8g448~qP ztVZa6@K3N;p_}J~o3N&gczhklYTW>KFLd^ZYK0jCfCW;QPzeG-5poq0sWv?O4EU%d zNJ++L?qm1PoMnbF^jYQXheMdaD!Oad%pzf!4XXdTu7kC840gbSFxa}bRr-OI{lLh6 z2yT{Ez_|*~_P^BsM!(d5u<dV4A3-bc>|C_y;WoCfjpf_cw~1}fdS3Fp;gL?!S}VZ$ zvR9C*D{Zv?#o^b6e>yA;-+7^tZET!uJl!a%jjRs&|8t8jc2HYv>&&}B%48mSz306i zvF9_LiBdDZt<*4h_kDcrtt~TOd8jO2zXpSj5ywVE5eFCD-@tBZV8MowhK&tU!*$Eh zrytU<(@WYayrNN3(i+55IMz6YFg)g$w1qhPCQ&|PCE_(vSeEZ@g4Kb%W7r*c11%?P z)$)sxDtMiZfBpJ2LWrYu14kJWbs$k=fG@B{;`YC=LeKcSyo;BFyMyaC<um3`Bx3oG zTtjzP0gO@q)75!z!^*%(U>ppnJ=Ec_X6l;*uLtwlD1+;O=2x>g#g>UbfJ6<cR(g{c zbP%y}q1lnNCTO4=dTKL^%>0x1gJFCUVgJscQ*ylOq&iIXAAX7s9`ca0;HPjGJY>G$ zVVr<VwJ5_Lv&WoFyarME$OS(e^0P&LX7Hot25JE8eJ#qOkLVQ>0&*ZIhVu(!jWt@G z*(C@@j5z*(k{pDpO#UK_C2RHPDv?Mf=dT?XmtwIJ{fc)dS~G5UrZrJJrt9j`_@(O? z!R?DelHyI+yBuKmU0~BwWe(Fhs0NOE^bhJqUW^R9)_N0S*Ln%rYv=5rqKX}66@Mq3 z8$+;>Y=o_l@GnnXxkyDwz?WBZ;^Sg4YsiaFrs(`a9^}ZW74slY-amNdm9bY|nfYZk zS2V#EvIW@RlEPMXp*xXIR1%W=TYH3qg18R1O)$ydLXoS83IEcmu<v|aK0kufcxHFx zK;*uNv=%ze5Y+tJaavHxKL9le6iiKAI6(<~38#s1=3X1jUy2P?P^kcV36Bs_@|Z@7 z>tjWCq8M-{r9Yneh2)6lys1($>Wl^4`V4@dgZ<(<Zy}%e+LN~4WTlvPMOy-)fXQal zwYbtK`ap9m#VV{5*U}*DQA6Gg(`A_45!n+F<I1-V;QpsfrlRyMpe!$|aoI7PYV!F@ zpkFCA#?9wtIaCtP7xT~f+~@rvTn?1853q%j;ok*~nJh-&`AE#eIdh3(c9=5|>0D+* zH|BJ*G*hbA<MnX;3cNp1un<N1LR-NFGH!R!9uF$nXt>cCR2HX37ImcST!r5HxaxBF zTG;K$kTc*gcImBNN6_n*J1qW%jV*CYB^@dyU3OD9pc4FAZ$pmnQmhT|-Kq8kpz{zV z$Zl1-2X=hZtEh?sN8Y?VUk0m(Ej?d&Lj1F-R@68}?&%Wt3)u7lp;L`prc5sHlrZHt z;a?~i81XH2HAAIx>82ek%><RWQ~?oK^}Z@_T`9Pw?kX7vAcH*bFPG;wzw=zrpavUE z?CS35^GM>SM0w`_-nvW!4$c^5m){rZitiDLYq0@wz%+c^KA}YoJMVN$ck11GR5x%- z0l#Z8EqPI}59$`<9A2HEGvF~R1=9>GmAEO>z!2B`()<PctgIMT+<K&8&7sla4RtH* zMe$a~e)SXfqGj*yj#Zrzqxn~lN@<K2?S~75e-tjTNzsoe8cL+|v0ZX?F=oC8{>!o& z6vEP1oZ;X1S}ZZIHy#tLPdJ{CLzD78vQ#h<G$>67EYc~_+JgelqxaffuYmgnwSPFw z$nZ)uWDXRfp_0vF4LdU^St41j7D+X@vi4-c67tz)eV5MQw>V_U91eM*0Pyo^WebJN z;&;LI+lcd-!t&F7%V4lt9x$@c0Lo@QFX*3<Zi8F@T^JNv;gm~1CY26BWo|)X)wSkE z!!1L;E{}M#tu8e4TP$by88EgDpgZ~9YTRm*+Ve3PdouJyNQ9uB)p(!whz5_(gQ`|R zFnMY+*Z+uPFQn@poB|g~q%2@{X#TPPxlsMxaC3h?-`^ar9Y;GV<<5>ur9(87kSZH4 z50y$wTEgL$C8f^Ai#t08ko|>wM}Efti|aCnFiu9{5a}{_A8soYMfxsuoQLp!p54N3 zq|e!HqBQe^>gS8D`J9|IM&a|-&oS!w`<L<e|F!z}cg_7h#w-S$(=n`_BqYr?wdc6P zb}P&b5+pE*7Xnk^uw8!}2+JQt7@|p-vIEjRY;O#dvg3Mb`mo`C!)bhAG6hX_Cdq`n zFbGbl>L|5I@<o9zj@d-DJSa^K2A-dGo>~GZW;*!7TfrNFNv4}$#OI!l7L7Q(eYgQM zoTXflh{KbGq(7UfR_65QT8KD2Qr{6ywl)=;TFF%NxIr9VC=}UCb8a|{5wu0|ccibv zPndydHKJDGN%#rfR3YHM0R$N`ILAdxxEl8Qg!U&ec05KV#==3~IHWb6ZTow(eNPG} zs%?eXH672k{mg9JI{`}3`V|UVzxnI>CEuoY&c}Ga@NG(>5N^OpNS5rFXbH~wHl^xy zE)f#sWoD@tgb;9RfSMue`hx0qM~BUgs>eUv*x2Gx@yb)6_g4YBStzu$#Nvr$DxHaD z!VsGNh(DT%?vMCAcoHFsdmu)Hd@h?YvJC1X89l%mikXZUX;a&7YkRy+a<s839cnA( zUOW#+=Xz)_1omwJa>!9?NeGAYYVw}sgGuQN8Fnng?#i%@naK?5{3bIIlxl71i}Z_} zd<138;2S{Y8~VZKMWwAkXw0i8fOzFv{%yb=2=7p1*`}I89Qj7Dx9Zy*4)GGmSHWL_ ziUQcj@rW2&2j_FF$=q7~9A4KCP#-wJjkRiiq%eJ>cUQK*cTv*qb4IdWZ#LrexspA- z{keT0?v7|o-QSM;d~y2y*0**)^Vow+?8QhR8@AiS*+96?zT|fvduC6=hK4aB@czmM z_FgC&4dEB-5WZ}QxE?7({Fpj~TsgPL;jvkQKD*BokX^$byU)Jg;Q@7x$K=~D8VnAv z&KPlo#lyN#@UR)B{qRrrG0>zqkOO2l90r>s_B!I#Ky<VU&>_DWoc|ZA(NT<Tjl)Jc zP6Xz2B;`=Gw0~`gi}G<wqBwxDBHcLi*UU8YpKNGm)6CBTO}@QdH}Bn5X5X9H-*(5M ze-d|6<nvqg8yjwV@yzKZ%Z8sPM;UQ%FXr6aDhsH~`iXmcXCqtP$od;uy0OwIx*D0( z$krBFx>zYLE=sN<lZs3RL3f?l1&3?XT}=-(NslzL{l#O&FBYZkMK)MmTNHU=mEXc_ zEA}ja9n@OCU;$Wa9jSD`FT{*+vLD#1KcyGf!=dnWUrT3C-Dql4YF`R`a&doreSA+` z7e6wZ-jv=4P6lCb?ojSjPFkO1xuHR2Eh_6titG(|H+c7Yb>1V#9S=LiLC0FhF4#}g zX12%7Hedq-)f!DxQo#v3HG!gg^z5y7-i6*WLvIt)9Z~`z3t#=wk4X|zB>+yS#&;I} z0&Lxymy3{bA0z9=$m9PfZO6#)S=O_2N&Yv`c-wDWg-F-OHf){EB6n=Qd+gVddt2fn zc=bQFn_CmKFL5qxE>jCtnff_Rrn0M`adg-O^EhMG(jlMJ{)F&bn(Sj~a1u~s+pO%< z`X-sG^*t%vT<iPiV0id7eUq%z+8^WXL(hmv*Z4UIBNFIeWPvf14${OW&L0|+@Gd`p zKwfB1xcXPM?|5G&E(<DWV$e>B&c6+<lzHt>Tz$EE{vm^oH`dRdKNK$Jl<54mz9+B# zMYXM9x~Ai+SFb`#V<{fP(%K&5ZM7H{a(mdgh@vWhBWov)lZLGDf@}TD&@(+kRye3G zuM12D4hN(FfR6zt2M#<euyw+2t&Y&sc_DvW{+oFzorvuRf5=lgOZ>1oiM*)*5QRr< z>yh$0nDzr!ctqY%b-Gn!Oqj#a1|cDkTlVA1l^??-`vqnywsOwhR!s#Y{-Ihj;H-Vl zUFjfN|8kXReSEy`I;!=fM@_S2>#S=ji(JFE{^rtuhn>jvADRoFm1xgw;rHoIAo?`C zijel0T;t4~njLrI_x~$?kIKC5V(3uSeIEC;R414a5iHK#)9c%x5dKW-TMQNpym8%i zebYVF`koYCskRjwuIU(aMeCQ&S!;Wz@aMI*9a_ItjLmFYn!8%tW4vE&pGN_C)3~H- z9TRnhx%*E!fuCak!Y;%9zF*y7xxw^JlXwz!AWckv8bD6z6*GI@e9<hPglxK~V=w4l z(TO0e1M`>FX85MePQv__%_6Ag1mP7Ud)|1_D4vAwt-HwB3+xppo(8DJOp)!0+wXud z!vpYQWc=R2ONnalYi|=c6mNrNnqpB1QxW)wed7yX=&b$!RP71g!K&-N`ZoApe}Y{u zBQ%Mt)lUyL?rId<8+JE{_t&#SF}63#x}vNQWupPM(@zO9yS-G~d&qpBS=?u0H_7ZU z9Ao092DYi5?XF{M3v4*e;ErAwWrI<6EW*}=h`ah^fbH_JefVP!d&JD}r>O5#7w8Iz z#IEuzcz1}2>3uZ>=72ynW|aN1pAu;OM9>K&G#)5(1;l({$<MkHdM~l?c){ngyn(W5 zG{p)eGxTm_gW2Tcr7I~heVNInmy!4Lo*F_cA0oIyk@6dhlqp%HRHWhoq>J%<Dmrq$ zVjJZG*q&~=+`?#6qwE_TFRK<b4<FE|im9y=9nI$~ZiaLB^0z5ZE!x<Kl+7AP$cI$B z0<SMWhkmn1II?{aot)nnAj*V**XyDTOBWF)xP}^dc3nd(mY|bNP|90^Qr;3rOgzEf zBtwmS|9SkO*=PhJyp{~cv%QH38H`oVO6ejBfFRtC>B4E5u6>6mPje0tjm?T$LNN(8 zHPNA5x*IykOJIk@4?!aF$M_+|gukho5ZY!r?{SVrQhQS)oT<f1HJ=5=Npl?@0Bgxh z!(sU_Wtoo?>+V~%ut&`|5btu^);e%@7aDihv)+y|B3=GxVqo@pX1?F1(Jyx{Z(Q9l zwTc*+!{Mck;|=$$xp|2FUI{eJGhZVv=C<|enO$&{VQq6RQ7(@<tMcd%G<n1@?M&gI z4&uvDH6=c&{RwWT5Go}Y3h>6H?!zLS?VIG0*7qcOuFA#eH672kB^jf&J;vK=drYVv z9gBv{7&8QBWeolX`lz^ypSy;wI3et-_8)RP0j)qBLOU1iM<k<rp}X1<6$a<DpHj_` zb5Dzl$gI2v42VN3;r&qq{w3my`-nw29J1hFBnF)y&IhiYlGmZ;Z^JW8A##kAN-&^n zRLCh~n-@TogqBkP2k{FU&vfUCCRg6=u5%-D$~matwI#qZ-3D;(OSg;co$l3bf&Yp# zBwx`7;s|_AgTm|T2~?2E4>0cld%BrD-Nc@5WTgU&6euuiKwi&ccBqpbY-U{^cCW$= zE}sj;XRf1Z;b=uZ`V^p0p{}Wgr_$_Hg*iasS6R5Ql9rYXkq-G(PRc13`*7}oKeVy? zY$t7^1)x5g_x^UaxBXDN*gkFOd!i4;rp6YGh5;E*OozNYiVB1dfF4j8vG-y=Q(@q$ zp9rs%D?diKi^geoEzFz!<Wz^2I6vFC5nQ}6&`NLwJE@oLsGCXo7jOc@!Nl<sG4So# zy+MmV;Rr+>;ij~E+iq_$6E-M@U^4G1H#c^nZm79FX!g1+t*wg}O+?zqTiaK(_{F`! zd@^DUCW8*2VmI1i`L^teH3pMeS}7stus)kFhaBNZ%u{HGvnUv{*S9QNeC2P%VtLhq zM4+^g<}v5!lc@e2{2<IAEM6sOmib4jsjDOA9v2;*e4>3q+Y^HvvxOK-J8#%Q4QJc2 z**+)1I*(N(Iv39Cu+~oe>1?|@muc->gIa$B^ZOIuoo#mv{qY^z**S_YmK^<KqJy?{ zLK)Til`OUPYzNv~zb%Q*Uh0<`NkZe*4^V%>i<tj1VJ$PM-&nVb?Pz6dTG_!8`@<}g zhLO=CvQuGZP(aAU>TOJ1ezdFM;rx?%aav-#CAL;V1{1K3SxL-G53hZ4t+;zFTRViX z>rsDyum8zWHhMH^JJ@i%L6pJ`EbRY`Uqr2w2zqkZScBhY^EXKA*EO$aYwvZmu$C6T zYr0=RM0ijhpUxjFvb{xSgbh|4PeiAanepE4X-Qt$**4ups4@!4LOJBWq!Lzm)DZ7L zA-KdQYLgbxAd1W?FI|FD9}Ak|{x#xSyjd+IKye}75|yKJ00i>vsOs$W&x<5dTFEB? z(TEBW2D_G?gYd>I7;R72+JrgT*p(`ebyj%}L-TkJS2rVupWM`P9XxGcYq#QX0!P8w z68qRkvmmu_$mjw;V&Rim5Sxk(_1A#b#{8Cun$c(!E4iOnk!!>qxR`SXE)c$<+Qz!K zc29Ln-9!i|lFAT;vG22<)IEW)C3CrAxf|N=fxzfqkJ$TBuo}Ft4nU}`CyttUOpKjf znBP!jBXIps=hEYC>&uL0z_egB1x(7Y$)@;NdyuplQ!p5;3r+?P2laB0-$9ggD8ouE zzgmJ*0O2~^OFUweCf;yDmJxvZ<yR+OLXjaN{+ZDK8Vj_eX1RV0b_T8@)$(!6(=Jz* zw}w8MV=$b`TZ13BI#Ui~!_emTk24SIIP)N_JK|&nzY*5muqI0;tFi<ncloSfg!Z4S z$&%~ap7@lu_LI2`Z<wvFeXSkI60Oh4?OHpzPV0~qbCNl{9hVVWyJKj_WrUpXLWh#B z1zJ3Hs>z6}zl3@77M&|_7F_QAIX_pf85s58YGR^heUdyu3wd7K6W`_Mz+iduhTQUm zE%_1JnNU!(*5~A(Y3*Qj&UJ`(@1tFa&b9j8$IwpG1`Gi-6h&B^;;hA~aqYBY&rBim z_mAqyuO->(Bzq#x&V<<#R9#Fmf09iGm=QTW3R|bJCx8oyMuE9bGTqU1E*$XX8jspD z@MVizLTqV>#Y0V@-jL+5$L(-E=R$USC@1K;I?0X|1Hpp;wXSuuA;6QS>pq=iyOL~u zlC>vUDa=?nDWx!v>rAQT(R*WKmFW@FMw4iQM4EuZUehEHSRt`fg|s4=SldH2Pd?s< zEUEzNjs!ONWo9>1?vla7>@=TC6UcF_9R<Jq9a3v<mUmUdlZfp%ChGm2TZb2JTo_Gu zuWzp`b6HD={JWEtg}$!nkv%LmnyBl_I9=(sG<flC;_qbJAKcRanXO&*!&@qyn|hN8 z`}jazZ#ti?*jqBCnLA}gj`@Q13sS%)MeBz@g?WIj5pgcsuU6ujLAVn++8nc-4`7Pn zzR%7@a3k?`K!1Tf^^WQ~fYzB#nsA5hn$gVX?X_)BfSHH(%3vzN8z!&mlh%RO=On@q z)K19G>#)`zKS!<Ioi|n6HEI1d&hL+}7p>hf^vBnWkZQ#jOZNIP(VnQT7wnfE0!oXE z8Q8pjFxTx+)yKl;!r~2KHWuC*hD%%ti*h(9IS4)FFnR9*qqj&jDB`&H9`A!*Dd-J) zqY;-ia4sYmP(?KaQ2x8GDp%m6(;~byT`s&+x}dzueR8m9=i#fQdCv)e3h<l8uSXnv z^gBcKVGA{?J$AJA>{DYn_cqwPQLzM@HzgEVr~3NC*(bB88o>@lpNfh*18jAGt@AS^ z)GxHNGd8x_e4|-xX8^uGA+RTl>`Pg8ILmI#vQ1g`bc#I`WrzUpin2AR(G-9Sa@s7O zin3EScGz~mO$@}MHfs>UxI)5v+RWe$Iw0I9pk{qmfX3|&K5k*>g3J=M1eJ~H$+Vb0 zDxIxg7v3Ef!$%!TToGmEZ0QsdMPsp%#KwdO)ifvsC^5%7{xBlXx!h1;9g?D_trnYk z5<Ui*6j$u-7bzzci|v{h*iA^C1w9er%wg$~W?QZrdKhyoMCkdNiHDciXz)1uGf%t4 zvaGp3`BIz>ly>;_9>1GZT77F?;>d=7h{TC+YivPFTf6o&KNxLko4MQjMy6$Oj1_!; zovPsY-Sk8kv2fL?g`xD8E+XRcdDOzyz6R!s?Ah4UH1n@v;z7W?=A1QrO~KlsHHG&P zLE`c{=r=-Mo5+6R`rq|!Pi)fGX)xg94gJ+MptYklrS&;^gVs(6&+D-E-F&TR?T(?H zCa(iUbSRoqW6b2Mt`)TB+y(qxv8mx)Pb}8@ZA>Q<Zk(vL_=&R_9Al8{3jBzB)xpzg z_K3*t7uY6&jlfizddkU8JJ|*&t8;caN02UkHXoIPQ{gi?S(=U|$D=DkOFw7&5~Qzn z`g6fAAxXi<rvgDiiEfuv35ZzkHYAe<cNce&tPdC}oQfIPiK-tFwp@)(lYvwWw3$Br z^|WFWp{`KZ*2PecH}By5ncusHSxkCHnfXtX1>|D2G2mmSjlnVS-SIK=WIHejqNxdE zmYy3kEk?Kl_d<)eJunx?3tk_`(|E;yfVP^=@&NREZeO%tYhP%6-e2pJZ4*AP+0dd8 zE%7+woIS7gd8yVX+Xgj)_qkx0+cuiV5QXcm4vG)Kk}V(s=^vj<HKPh1f@~kEhu~<s zu261MV?(_~Uq8P<Ze6idZ-rNySH%ULZN0%6Ie|6(So$0Uf#2Dpw%pe8c#8ycpjt+y zSrA%KAGc|1{jK#=^-^7ZUA@y9O+<p%6v>4SS+0sv+;;c`Yq7ew0BZjcqymv7R7p~* z@j4=<n2pt47sJy+cK}6zsv2tjT&Y|h2Jw1e&}u<s!UF?+1A<u!)`<mY{F(~7{X+#) z%wbmwM!&^qNqaimgW%I%uZ8MFz}{+Ab)Wps&3ccb1nf~sw@7cOL(y56Y-KXV>HYwP zc8N=VkZD}<OND3EI}05w*KBqTpXz72PF9yASmr4+dn|u0FXm4`^9f5&^|IcnyocF6 zF=U0ES>Cjq4JSsLN7NB%#Cr4(+n5AcV5F_SO%xG4ZCjSiB%;l|3#N6C8P6F-g!pBR zAHKocymEMOdSsR$9wQ9B9J>^rC~srr3DN`WY3l@WFLN*bm5JBi{1KAPYT^{S`zNu* z|C-_Kn2+Q{FlwFw_6aQVQHR|%H^4{@v+MmWf&UF&c@vzi*Ni-(PNMGDFwK)J=5>6z zZ;Dt%j995(ullA?=U#{GEz_Lep7in;xhx#gWZ{G+3)M_YA4T+lL;&gUTA$=k)B2ng z&R6>^G}Q4vtAPWw)%qm4t@Sy%L+dl2PxC%A*YtU$)+gIO*JrVr_sOjXzQ6E3#rJA` zvhB4#GezDfm)W!D`TMhdZk_A1P|y2ppl_e+ljpec^JH6VeWr4}PmVS~pS*T2&k4@c zcp@j5Fbo_Y@e|b)OUc+{EPSA}y%6Urei{2lPFTX*zsA0f57KHdrA8vdDR`*y-~cEM z+>7)e4{O9ln2r3rs_`peY|r8i&W+A}a(1B(5sfY8IJ1OVhk1!v%scGaDX)vGCCZu7 zI(auzM~<$G?v9>}J`vS9qH$zPoh`avEWB3uX+bKu^A8DMMUT?-L)oup#Tw3e+<p?^ z#A$D!Mg$LA7YRqibpgp$HF=?=d@zAP*M$nqU2Im@^TAV4>pD(&$|bpu7k+d!aSb#4 zGtaP-_E4leSlGOsbHh&zUU}N&$}ZX2+r48+K43WvCl=iU3`9Vp{ind^^aIz#JQ1w8 zE}lyB<(DGuL7Kh!fTm-JLMF%U*V%i^`=vdI_lrGfn|5zeszfy@G2SnQMKNV&ZD^79 zA>J?BwprVUbaidl*u~oU(%jbi-G0sa+C87#FU@bQ-|aO!I^QtYFO-fA*xw@9-_pWr zwI$LFU&v$8bGXSTP_D;mtkqo3^0LU8klRu%yDZGrUFMFcOMr}Mm3NURaPh})Yr+r_ zidk3#;Og92di`F~F|RW7Cu|<bG^J|ID?h$n*bLfS9>jg|BJ;LO_`Bz_bO97@;<UPr z#1WNEV5i1g^BDb!pswz*+_{{Xi=RlaM9}3{@s_*gsC;(e)`hGK8$6NSb#ZckdS*RJ z%%|jK=d@Z03T9DKvM38@7XW7On6B?SPHD*^sQl~P^`s&A(0WNdt6$kl0iISOlx>}* z^PebHC@+*lUf;&ZL20KrjmGHzMydQRHgPNz@&n-q%lQ*&{rP~B20m|h*7lN`L+;~b z|Hun)_?=dt(P+&nm4(T;?38~q{l6{bbOu4juNM~?^qGRcHN@ClL4et{L^4vFn_GpQ z^X9x&;d7I+Lg&wUE+@6QxwSSoGX*|3x#Z`v7qzr`T))WI=%nzS>K;*QsIvetpv>PR zPz!*3F`$_v9ei@XwvHl|CZjSgTAOG02<ns8C+`#M^N(tM)-T|F&fg=bz5uOF-Y463 zTeZ)!%KNO@*4<aBPg<K=pWElov)D|1I<N1O)}_|x_S$(iw_n%i0M!wn?eld3-X_8P zJhQhJ(Ph;KM%Qes_GM&$Df}tgkQUp~+&S0Vth~FKk7cPkmS3%2x8SrH34Bonk6_%} z(c%}<_t7sDZBSf3_4BIj^?B7457XTgBih{rHUf+A&mljE(R#PqqXe19VBc>tB5T_6 zRB${<j)89mbzaG_Ulbgul=u{g6m^HeQ|CJ@*cJGr>~=}%xAhzPq}d|g;1+q8^X!su z^i`-`T+1rIiYM4AI6^&%q+8k`(oQPxolcUR8AomJZR6uq<r}WYnXjYL_o^NES#sq+ zc)4#2QQ$!4$^7~VgL&V115$!%wf1u2Q77{$V0;4EZXD%4&ZJMIucpPVX=XOv1EO;M z1%lI`NhL=;qlxgeU3yV|P5vo)3QZtR{ZO@2AJvN*H&87DtZKgDA-qPJ`oH)w=(@_G zA0ft%3kz{*J8*UrysA`N2ZwQxyPYZv&987UIy&*pGas*VuzPU1GBJ2lwa~$P%sN}> zU=7{#tN)DaY~)xD4eN5})gM*wIdf|mnrciDZQnuL9Ql!|KFT{^;xh?!Nt(}-w?sSm zQJJ6bn_8a_aQsXU@jYE2;&Mc)QR9sW`c#|3mg)E-Js0?MVHvPB^DsFi-AX0&izx;` zBlg$o_doDwg7ClD>zvP3>y^)YiTdU1ou4n;cJ+s~c`y4oj))wuTz})&W~BA5oder; zK^p@BFh6n-Yb}wJi<%C9hB+S;I@F|#wwx2lz7^e5$n}&3;CxUwKKN8fF$YDhOk;&M zN2(rQ+ZRC*cg=PPoWEvSb!^yX@q_Y(EBJw8S6c`Ml%7h>%Pw10Yqx0Tl1)eZpQTz~ zA^<yjwVH779b7pFdd?GAfqEgQ<U~1lCKZ^9_|9ZO8VhP-fB}Q|$5;DD;7~I9h?lcW z2IVzXE^235nZIk#o#u4~Fan-yPuXsmt%%|B&O7a*+k~sRrbY(j&2p^Dm%04Z?$P!+ z{FcEw{~l318EwyD+m(d4>J;<}defhgrq~&ssFmvA16`}qac%;%$b25ab3k=CpaU<{ z<RP$2&*L8EV4V|wyMbvu6$7w4zbn3n_t6gTFK0mQ;2h1UTl*_6KPft36ehu~QjPz6 zJT7>7T$($I*4_7zAECtsVEoWtgt-i<%tpOV36XqDbuB^n8W3+6|3Av!1h9_kz89V| zbN7AU_kGdTa<6vD)<~9Q$(tl^vH{r^7%vbOBakgnBI5v(Ng7j1S+W$8CSaRT5)2`{ zrY}p4n>IjbUmjnY0?AAI+I(r<ke8H_G?KsH|IEFTY)JDygYGhS=FB-~&hlS>zZbC1 z)>E16b>S7<(@a*b?>wIkI}BLn>E2rrGY)PJoVTTV-b1zXUdMT6b@e=w5r55bVR(7M z%_8b5gk@Jy_IQSZfa1mrl!c&-2w|=wkcPnfR5YWX0?08>f7{LO)U)?A3?ZCIKyEcM zY_%{u<_zrDdUi;M{Xl`H-HOm=P0G!_;$}sG{e$o?!hZ_VO9-bDrv<jm;$d@pZdX5~ z77rlUZJDv-dfYT`>%bu8q#eWWC+&c;K<g#Zb|^5+#Hk4-0YsT)Vs)r7#dCw@D#nhA zo6;rV1+ztm2D;rhd%EPlFc>@5_O#kR<mu{J%YvSDTgH-!^?mJ5<gonEyQZhZ>02ZB zDC3a*n(Mg@)X%~xtcqMOW0xKTI~1TaN13Eukz=|!zsFbcTt;xdMtlm3D7R7mJD8hI zqH&a|l^{!$jc3h%&7U<d8_)W5?HT^$d4~=~E6+NAsh>DQYGtz5oz)TXx6k`5D6%F) z;aQ`+ui!i?Ps6@@*PjVJFK9^l148gO0Gi?$(#S41UVJ{~kPFJ9Mvf=&l1>jXFK-aa zQ&vmrRn!xlC2SMdHF=xZccG7<O{PoVco8K6lU`3FM>$ui1C3v$P1g$FUHUf3DEoC5 z-k@rEcPy8ug-(7K&iTL+(I1#=7{f-)OEWUvx^6JCyCilPiKJG85yY=5wN^ZBnMP#V z!v@J<JgIsNK3g@?<rnxU^{cVsF>SAThEXUs`KB;rD7lSXQnq)2TCiAtrEKH8Qxg+u zcifIZCB!`;h|Vn<m-Y_FZ<xG2_R#k2ERybPW&KP4*4?-Hx4d3z^h*-$a0(+|A^w&j zx0AX#iBHbsMw3N92jmdxtP8}x>OV5FlT;N!zr|T)bm3K@2&-B(UMmOQR0v+YgqcV6 zz<;O*07SgM-8s||+dVNHJyhd*c_qBI1XthE-(=RdUgVrFG^Ws3_wezm#A==r&Q{kX zzekDHbl3Ja#h1m$mEy}fwNF`-5a|S&n~B^qs*F<+aq)PjyiAPKe?$BEn)Hv)$2^Dt zU0IXf6`eSb%A>XG^DF120w_~CPpKp621<E*g)c3yn?4>-x?+<h&(ynIFW_}#dk<9i zU%*;Z9mCWb)KQOi|B8>PCP?HOw&#y<YvnlcQdR4u9Ov^f13#S7%!tw<ir!1{|1sg@ zOW4p~mm9Dq2K)yR*NI%XDU04^(F-xll<jmvJ*7PzR}+-Xgqm$sv*VTrfEDxAOJ9{^ zwqe;aYT0Lznk`Ii(O7%+pbhqW0%1EvdulKWD-#uEZ&gMk1)>uj-bJi!<!{cbit}n( z*nF=*uq~$Rr7Yw=LS({FsT%6x0i}2%F`b;)e{F8>=7t-AsJqt`>nvH)M!hbmOZ$Bt zpZLT_ON&1dUnt-E2MfrsUffte*x*x3!;;uUTL7)`*w^s9;CZ<A+@TNy%KYnJL5qPY zgyrHrIYpwY!|q#VnaL*S(q}WN4GwTzZq;u{f)A3YW?rE4q#A!iPX$tg(i({D)CPnt z0M3{Ll9CX6c^g(ZyOLXD3i*sVzS55HGJn@9BAQhVVR4dgYn(KA-b&mr*>K7<28H`q zVuW*7#t19?HDte0{Ga#V$j6o_#4h)zDrJ&>$jgL&ctIJjqEOe#W0Y6xa>R*4`XMiq zO&+S2nJRN%F1b@{w$4>?((HQV4RYKhNh}oVc+7DL(F$ZlrDz2{mU(^oSf;YIxaMB` zz&*BwM2dTCk&k2{ck%KyG}o@@>j6d2lbyDzhl`hfLh;yk^{D7t6^~6N-^uT>1E1ix zN-6U#=yCvL6mo90{v@YdFMbW}<mF<n|267@H9@@e+Vd?%6syd27xp-Cr{FwZ9(#SM zx^m1uA90~XoTbQKyq>fsDCO<tv5uIj;-$Zl_4yL7Cs(eO^ObrMc9>G`-n>#z=J4=( z*8F=($Y}q;+fN!SwSQ}Mtw~gxIM!mBTEy$1;E~Z<f&4vcdt50q+*r@?$Qr6`SIQ(i zwNmC`th$Qar*AFuG8N=9T7Q%>$p)d6c^KwhlKZ4e122=?ATSq`h)4Pl<OmM4_LmTt z_PX2;6+&-jk0cm!^y==*Kb(IuFXeN+rd+zS)8stuV2?T20+i>p7-uJexfB5_i&{4o ziMt|kT_mCo!n;jYFFoRm?@K=nODt_pdl3-nfn#}NaN0zX)}J&nzv(34mDUf+I?K@D z2IS}TKB{IjYPLqbSuNfZVOt|i1u8DkyhN<)f!KWz)tw!rh~-^_Y%te5c+~lbQ{0J2 z5zj1#p10$t`y3BD#G?+j6E(CVG8w5k2xvm!Sr4Mw5!qB$AkVm;A6|c+r}G9vq3A5g zcStpRAL$Fc(ts2?kAlee;s6paw(wV9<4X*J*NSb(jYY5}53yW@eY_Hjsa=jKsdD7; zTw3I`VvWU;`s+u72n)&dm&3C+^&Ip?-P_tijVZS$*AgpjY>V8u{{w=kOxjFOIb{fY z_Y540mEt~=IbK>@clCjwZN%(1`O^MSChRjgQssfBv3&-g<;t{NW7vX>eVb;~9K*Oq z#}+UShy!Ryc=siMQok-gigDls#ATX=P0R{^*eCVu$w2^@6*8R}X*$8a8fUk~S=!uU z7F}j`r;a_PVUKDUU|jO*4z<|Q+EY4MI9d=3*}j2ns;g@tRUImG%R>e9J<inA8$jGM zFkJ5F`I!1sYVl4rdo=RxhzRbU3xn)MJZWKJAlt_odrm{C#d=T9FFa0qs)|^}pCU+m zz}fS@r$-?kzLlp&_?B0M8St@yr??U*tE6F3MB%E4S{OKg*K>pm63_8>Gy9}E3!c%9 zD(wg5VQG8Tn|~+akHZhn1y1<0c1W+YXx{f6O^Bj$D@;J(Ye1e|7IH*Vn3G2|l**uq zk+DOQ1K+@=vl`$=32|TCAB(2v!l%OUM6+<zXp-#FDgRvHR6rCE8)FScL!vH}GU`lL zcdRcm6POA0`YBNR;>DgfNq&IKanHnC6F_PEpRWSL44*F8zJZ)g5-F*3u?whc;Tl&A zcv#0;;$$hqUXKLwE3(K{4xQx(qWcF<wc-7V<d&ROoZP;B@o@vR5aK*q$2pJ6!iVG# z_=PxXy(Wf1i`)jGv5}f(4=3u7uJH{yZ1D}1nv>DF@YzaTexZ@Kt>kMQOUy@OfCYH< zB8C$MLn;__M1_Vmfnc^@zEDQ1l!if^nD|`{!{oOsHnUZrduXKo{f#v1FtN=OE2K&0 zj*LqC{sx=lR&}g-xB=8jpIv5C(f~c&OzXP?`&O3w?SRO^{dRk*dx4+>cocTbm7F?? zH95ieR=BgFpZ(n)L5RO3_|P*Bn{CJ^o6UHEHpO3{LE{PHLGpEh-v?vLDr}JJ>~riC ztd2+#Qi<9rvvE#$3fdx4ij-(Ri%r|7HmHouG9$o#y7&z)ZSvs)JpET-ZhQsr(0G6X zS~Zx$i3UfSnEk<t6O$)S{6KtR`}a34eT%K#`2Fq5{dwKNZ50$IWOG<Hn1_sB25r#> zOX)Y{Jn%T}VXYJd(_Kh2uTqJ&dGjM?(Y#>yxpGME2hz@%I3FZNB|Kzun=5JQBq$;} zg`P4N1eiuS!XTl*tvo*-h|KA&R-V-=f~$qW#FZ3RcrHrb2jzdY({mB-5I$3TE?Fgy zLkUBrXUJoKc)T2>CG7imRDHB!T8R~^`I40~Nw!qVydNc2?LEFL^F5R@Nw!qVynmmv z?+XaeT@F-Qt|!TsyiCZJkJZWy6?neMvJI(PPm(QpnQXG^M;8J)UM7Vfk!-2d^Qq-B zujBPJy(ls)J1CP2hqZR|7<r|<>rh92R+QR}vzE)EynUs9*K->ekK!o=LOgE;_?{Y4 z*p_8Z-gZ9Dm2$5K+<|h1FTi7^f{6Pe0gYe5P~QP@5@Wk4{K*ShGFBpO>)S;3!U<yG zRNFk9WnEdeP<*r~9xl!RW9jkSvj~5Sp90pUS1|4iJrH^#B!xn1+mzK2b%;90>5_Iz zeY(!xtLaUo;}PSmK+ZPqu|uvHdF-A?8Wn;EkTX@hND&;|7>}(Bp>pJf>*%N`{<dmB z9NES=WErVpP`{84L!Wp~FeQ9k?r~#R_3xLXlh<rWuc`A*cJ+AER*Q8dLL=?87KZnC zvU5wj4(;(aZfs_!mo|@mBxUif4#Nml?3jGC#tv|<wvuqGyulE`V&)I$!;+o4%6Q7e zOpiOBb%+j4an4$bmPB3YY(ru$2HMo&_;7JBvlBkeg`ml5)cNiKf`up?4$dIZkfL>= ziBi)kC19ob*iI;32+AkyA(xq?H7my6YIw?WXK<c3)BEC3tcXJiUB>-p(g#+z5kWp0 z6R@J+#|MY87ePM$Jh!iQ@;Q8%xoUGGlh6i6nYJ1bfpcA0hkwm|eQ?5Kz8@C8jlLsE zTPS1<aYUJ{;5xwii@Yk5-@B{l5@szw*W=)MRb0#AI)M_$NAkN8!*+OBDb<xp@HoC& zjCvAf2DqNFhL?FtxVBnm+~+aqMwyFiB)rTF&N#>Chhhspl~&61xEwkSJeV~dODU6l zh`dbL$qrS^)cPX4Og`gR%H**tyi9g2TzcHju_)_Z0bZ=)*g;<@<&v(Yl)HDOTu*?P zTLt34xk_D0&r-_WyQ*A=hnHJz7`GX74tT53AcrKwoXKRj88>ind7ZF8u-%VoCGB<< zXig9)4$OFx2^$vAV<W0jl_)7utEt{s5xp;dr%LlqZGc`0eF^pAIvDiNlX%|TCiSD| z*HoZ|Df(vt=Ruyvd0hWuuj7rM_5J5N8=-;K^iK!$S;%ZSPua&QYq@&nPo8%fu#+q0 zZ9;kAc*J?i9{xJ?dtToEem)g&nU(TjtcSgy`y{MFNe+k>W&#<ZO^Qhppm+@EmSOFJ zY5}?^Nprj#&STwyBU4+$`Ds;_7ikq|_e(Xd?!_h5{z+61Ys0kID!d1~msuz){3<?J zA2mWuV#lQiBoWB+27|?_)tE<wo>vrbq1P&}!eUM)^UDF|-(#wTZ=KT))(V}`YN+hU zcr(Kp17Lk{pH^`L_$}11gEh-RwYV3#%qnpdKLDRn!=ziq<KhFr*8~{a%M&l-J{6=c zgW`fxlR1JI&q{73l8XiL?}_B%6snKsSjBOJ59WT}o-XlPwqCplA96kLn`|1jNBz3( zNAL<52^-x=08=?aeHRdX_f`?8L=bDBcAzc91_3h}t;|4+wus*hHKkpwn}NE|?GD+r z_~=SEiPt)l&2hwFTP*H?G2Wbn6ie+pAs!HZ10Ro(@Z@UvpJoOAlRuv;p+En7HR@bE zP>VB1IifHw_OP^M<QQ|e%UMBoMu&taTmgCyJYjg&#X!<#_>w_VkdD4?WlwR477*e> z{kA^!B`=G5nbq6io%25KRq4DpJqzvNDQM)NJhu#~Z^VW*aq$Se$VZMKGUN!=jia>K zK!{9y$nS^sQ`9H27_xK?HKq1mu3@E!U#MZE)ZS~jC=7Vr1Bf)Bu5Xb2B86PKJ^EA9 z;}~8Bn=Rni_qiP&JP}Y&C}SA|tbCp}5bv@NvvT=H@?v{yz;1HtCXB1Lj6dg2OtW2$ zB=F^EMD%F}*ksdq<`R5w+vVaz8ulp_dq`xT64>LEGq2V>j+}epI1_a$LDovgHT~jt zU_&G02FUOe<-l9z09Tj%F9&>Y`Cp#!z2SeEf2iu9PMF#O=iK(UcQsDEg+KB2kEfn! z#~&Uk#;CFnkqo5lL+e-&s{>zMfnAikY%8MkmA#1UNXlNc4ya?*)fngJF58YisQgpR zQeEf$$vEHVR`3<BEc=x3EtE}r7tj&;KDQ#*D)pwEW2N37<@+a>#DruE3Kq4c5vIM& zUdYSmG22SrKg#z}<(g~<ZXg<(Mwp?NMaBC^*-xo|l>Ky_FkR~(WV^U7+fu2$SH{M# z8?E-vZ>cv|wpGl_OK>%@4#<X*kd@tV`mjF}B^MSNl_2$seemfh0U``2dYrHk6M!Wd z>sXo@2a+j#<hYjRWfWL`8)08FB0>u*i|IMF#tq7;xaT<oe4KD}#)9YcU$&o<j$ldt z)kUr>ks%6e@@iD9wktqvqoad^qxAP<tt0I5gdIAa@~&mSoji1ClKuei=<xvNF<hqi zGOC061b~w`2Fx%ER*Fq>$!XC%r)JNBS5v%|uiNftVK{q2_a($yx*U3l3tFwD{_^8k zD=a`}dv#**wK8F~^SI+zDNk_XEo6gY&M_V_f)u9~cs<EhQen|@x&ND%y5`QXDk^)Y z#lQGj*Th7<U+(YqZ;Op#hsXL?K>x_7PZ+q3-~okC6U12N=Xhva(PSM;f-?atJ#h8V zS5aT^Ik!XG2uDFAc+TN)12aw|ec5}?jk;a@Z58GaeK=8m<HF*3vQzAZK@S@}-VqE0 zF_H{5<inu;gar;7A2;hTd31ZM*KV~|qAhuQzQ0+k7r*~$QB>{O$)0H$0AQiUiWvEj z(^x*x(BsOv)xAo8X8H5|I-X??c@*n2Hs-al%yXJn=b&?^Q?fZ@2*xP18V8L#jSm}D z#>jI*-srJp;I%my2?o{ibADeQiEm%-&<tyK15!<;Ij5$vKp2#eQb=J%gJA2TzCN#n z>2RcfFGw@00Xm9nqYW^E8bw0@z(J~iZ?`7CrkvEe(zZ-%+-gg<q&9AT(3N$FsYYkO zrc1H^r)_6fl&xWAUkV;rSF+CMsZaaHZ`5kq)|r8J5lirA1SN<K@G-Mi&RCv<o9i(( zyHkC?T0D&HVMMoAcZ*Jn!3<#20Q2*l<;z+;j(?;S5Ri7lY6{CKLBU}}V`z{82sNKn z1+opk3oPO;ml7)0Rk(WR#$a!od;RYH7^xD+z#PK72}3(;6Fw(Twgp*B-E%Jn*^@+v zmwE0MVDbntjOdPh`MIwe*%^eGSR&6+ZA4xBlPzBX-tJ2P>3<5R-(!5pDBfti%P2M* z`;FU;lF{f)o|9}Q+mO@<xkdVN!#TK6-#do`c>n41<VnRtfQI%f{Gsw_0(2JqM}zC) z_s}G=5#d$&hylij7v&6cp2KSXvcmePRcs1m_0?#WnWK=*%!W1%71|S)l+PP<rpnP& zbKDyCrUGwcGQ0E1j*827Dw0k|3Joql`+T{_9m_gGO;&qDz>|wOT#>XRRI=IYlR5`D z(p;ga$(nf59E(|98NDT@jL$ghz_WW9^Cv0XDUSqA>@h9t)NasTrIjRY;5k9nOt>-D z8+q!_MgdE83Z0rxJh#buja3voF!NL1bJ_xuy$r60A%2~cz8pU1ab=L$0L17CELyO_ z5*{#h4e}7^k@E*WL40+{O`y$=dMAtdwmQ4OqeZZ2E2IRNFkNim{uAQxA<G93R=ZY= z-+F9~*w|1VrlpK;{06nAt)GTzFV^<xrC+m+>|>&r-69A}7x@0rjP>OmARKxLKe2i& z2J2NPorip!+OY(#ZRf{6v3x9m^Ty~}2DfhY+5*m#`LQF*$Flss_u{<UR*vD?0e;@p z@-e!{5U=0u%g5rEF5x_?^Bu}Dbi59Jqh}y<B;ljJ7YIKQ77Q~F;C=M0O}Ab*u9MO_ z=F)*{7GXVpNz{3L*`qxe`;|m8ma;WX3GvYwi<NCQ_=u6Jn}{cELJAa9vvmXBdDkO& zYO}r|%n!7%^jx$fTNXZGESRs8Jq#3>7~YCWjGiL>YpX#;5by?K0%-YMhH<1|0YbpV zYD$msX7XedS|Wx>>*j`rN~~y4`-d9KeR+Fd>RUa-DvQr)4Z2O2SbX5BW_PS<O}J%p z_qJ@^K(Eg{;0Z>`eJNc-%Y&T@JM8hG-4ySF6;cE~*Ds~(f$bT`Ua(%yBuuduvE=cz zG#65-Y~#K0xIK9PC$nrOdlCsa+Y$AwyWb8g0~*u-lOL_3$oWOM18IFPqlM>RCb1n1 zq+Y%kP>jxM&;hqQ+nnXbe~M{_g(Y5Y`3JSWadvp*p2m*Az}9OTw>|iwo}LdqxNX}X z-PH3Cei>T-kp{I|&Hj&yjj3KX>nrWOt+7hV)iL?ejT=9DZAZtoAKhs9q1o8j+S#Zw zYrm=0l04FU={Hi>mH3^oA$)@HJB83of)#O$Mk6J8ed9$7q;%P28mbv*aea(mPxzh~ z%R&_&boKQa<@!wZ`pgyA)BQKT|NiWDe*euc30=zdWJ9mjgWkL7JL<!aQ@!wAcHl!7 z-JnD-%T<N-3jeSKpuP!yKdLY0*-Cv^?zcy|&uI02<?8#M>izg}+=h<x`|Y7yjnYe* zUTV=pwfhxn?PHj)A9TMh%KhZ(eSoOU+qtEBKYkqdqvQO3Tj(w_y(B*9e%a;wVczrm z^+CkZuC%X5DZi<DABx(c{_LsVj~~bVcr*|7XAj+_iC&x^bU%82>ptN59r^z;e%4`c zSQ$Te^7<}c|9i#{Jx}HO%b(}+^<|}f^t@>NE<Yr4E?_(aYW1fzmiHIdLG;)1^*-f# zU-f!ltrM!(Q~S4E)_w$1;QHHm`&(XuQ}eQMTd4LkAFpOqs6Yj-9;(VXrE$Z{T^={n zmzTRnDYrIW)>O;o<AlmxL*=d>B1*Z<5Nw7ntM3+G?$rP7^WxX9eqKs@m#_bQ&ujVm z+Vg_L0sXan{qK8TwfZkVuPd(qJ<kgn2}=8y`}K<J6D$2n<7K%AtIr!D47mR5LWcHQ zK3=Z4zNB1F>k?hhSE5zx<@@`eY;#(6M{T@R`;W#4%}ZK0X`NdhFMI)g|9FWl_iJq( z#{6GhZgsry@=$JVywG<*R945!^6I?2UIv!?t2RHbD7QhWC(RG4Z$q`d^qrU6K;v+E z)-0F%{^y{Kqvd|+P|B-~Z{#5Hepnvg9UnZtmFEMzYIgbhw_I*@KGxQ~+I-~e-ST`~ zz0@i523iQ7JH|bO?8Kk@74_Yw)VI6Z58JBsrSH5Swo!e%>7}|w(0~$!BDlA`khKzs zuX;wl<Ky)}7i4!7*nFN1rP(ua_USm=7-wf=>{Br|6Jv+`Y`33n@)JBEJc|Q1_Q%#Q zSj8F3NsD;KKtO{}>)FW|i!`2i0^X6Qn{y{rR!`IelHjK+_W>9sxX_qPO4G=pTCk6) zv<s2|lQe-TaS^%#B@cedJ<#%yk)hBcT?T@n$Yb>CtikgWZZW~!t$>x(OHM9Ob43uq zNI!`p`ztn@96!<*2=?AM(y*l?mh9WRraWX<`O90p4RX#g+}6A<YZIgE#jltQBW9C) z!^bxcK5+YnNayxe`G$@8xTS4(PjcyEvSTQ-d41RJ!=(uHagI5CFYFvfc%z?}KLXUM zU5q`XW%pr9Y1w|5$fjU0JE>xKs@RRt9HwIbiEc3o#*f+9u<fvI#wHbjK?*k5M&mx? zt;Pq8PZ-rk*F9F2u?|`fSf{Nj>l9+%oi^)?u@5mQKQ~=6i61uof$1|Q=|d*gZ(>Ol zsOg0=P5}xqPtd<3ko=%}a$F;VAt!tzU{VnuWq>|%I0BAGP@w>AL^v|o0OFa9A<>Ia zmEGBazTU*rH$3|X+1%j%4}IkepWeFl(_i??hs43sFTeM_Ut$PCuK>Rv;?Rg^GmY5) zIZ)f_RC5}QUZ<T0SuU*67dYDtBu^4QVIDy+C1nSR*H13J0H@<`-xgn6EK3;L44AHe zgxszdkhL@@C-GDa*lzs3c?331TP#*-TI;hq=7AiE6oX!^G!I)hh77f*0(up09pH`S zce1?!njYRBcf3UjF@nM!j{r4n?R1IVvJ}tV)fbh!n;q;Qmj1-r*wMopw|`-5+qx~! zT~oSh$Hs8acK`aV@G)S2Zp9>d8@>*W^f}(<HsO-U*cNE#j<3J~uY#iiRpAs>5U6pN zHbO#STfn7Lv!B66e={$u#!sLX$hY_oFVBL!hd#*)ThzR~?wEPOELzOS{SwS`OmH!? z0Wk~)4Kp*toCf+MGf?kp^cwA)PVds`wFv)b8bN16YyuQ64G44_5a-jt0SE{v93A9q zxPl&CK^@=+KWsZcuk+c8Hip<&e8HM9;RIry*IALk9iG)%KIe!<!nVKM`m^n^{?u-E zRdaS=a6_GV=C?oI@x+!8nt+~&36F}6?0L+A3K)~Wg*7G?dvXn1^XxrPt7-kIz<qF< zRBV0QvqX;FU%0(+PvQB3hIq333)}JWeBpZq?LQXSpBLEeg@+I^Md5S(h=?up>Yu&Q zbC*ZF#>3h@Lmsit!$iHu50*VyxX}DYv)KHsw8pe1CZ+8{gRS9#hA%a!bPbx9I{&&; z?0hzuh8-Ge9$Xd`z#`eJwj?O&Gzk#=fVU&Jaq~v;$i<0{H4TX0K^zoT4IcUA;oR}H zr3JCzL{Yo4;wTYQI1^z}&j#yUuDW2TSo~wXFP8B*8;jv^vC-+t#C+g0yW+^LI4{Jn z`1@p`kc6_8HCcili#gtw&$q?R7Ej1*4z2zk6zL>78S}+}oR%B0ZhM6xx!ySE)p#8a zuSW9wobzX_%x7hK7%jHe{C-|3D?KGi8VNXBa7H283j`e00ni7lBpg*+YuW3jcEh=z zOeC_PLTPRJ__c>ct<lueR(mH;AR8U%Sp1>#PV=NrxIr|q{|%4WBzUMaczu|U?=}H! zq+%y5t%v2_8OKS7_(}U&yZEq)P3!K{iGQs9f)=Ehpp-P)f;Lg5acO|R1L#FPvZ>5^ zy~}O0IG@EF&}&rBN(MYj05OC45MeZ2l?5#g@^<mm2oC}lDE_alLKZf76=2yUiW=zW z$+pM(-(u>%zQ!Z?u=Jnw;m7xld^ELpgun9n*(Na5br@}k0@*~%9>-A;ZCg1WUpbDo zKX&Qoq6s`mPFN~#me-$hJ??rIJY*v<69E!(1a`sWkq07AM5G8<TC4)o38^{%DgWbs z$uA=m)US>pP5f4c5@0OO8sl<Yj9ZCBX=1|vR=He$%l9hqFUf?9=jDG3M7HI(CVT{I zK~_XeQy3BJB??o=2hR2vOUm7y;c#cSoLv6I4!bicqBBZm+=W5F7qP3`CU<Si=eO;e zY+L!1=x%Ec1e)8r6a6<fH{XbMZ^h(xVvJ=FIz+iw!-z1W`HtgQvncn%i<ZyHO+F_( zs+-q|2Xsv3WM<WI%=MsqF77>>-j}{L{X|-_rlaYGw4^gw=4@wETsVs&?ag;GvduH> z+F;#ao;MDw4rz~pXJJ8_#{kDL1??T#XNchbA`CQ$RzgQ0ZDbLls%4%uLZZPc|8+H> zs=1XRYCp^UUkFBp0g{E2Wuw`c3HCOB``Z)Ovb!gi^Wh|&UNx%HukS8xSsJ8~{oD60 zONdkYf!d38{AskGaD(0z@8<1~3U|rjRjqeZCJMTM+9})4#^O<0{_1fs>OXF}72V>U z8}&0Q_yGM|q6@CE-_vmTr(t$o1QKBYJaiXq?*_O?gjlWL*>YsBAajMXR<3OHH+Bw9 zQ2xsMTl{b0;0Ezl+u|vn$-?JCwT)==Gs<^7_;0U_1@<(J1?rni@2a$`jz3d9-i&=s zg?-b5Q9|co$75;i?;64N9DNVs`>T*=HG=zp@$aztDc?OmuKm8q&-ea<zK8Jp1^(Ul z_w>DmV#~#^;(GtD=sT59dCwXl@IUB#1;78AmmmBMeQ&z7#D2-Yhki@nqiDfKX^rTC zt@IeaH?woXJ5mek`w;&gW9L{W{SLbl{hq-2?fm;E`1b&QAEWc32h#5a{4VqFNBH+F zFTV}H-&Xy8jt%hNr}%d&Z;0RjcK$uizKq|gK6mi%(Mxy3mg~e*BwH?YWUAw(ld$C) ztF~O_SnSeC*m7|mx8*9w61cXVAN$1ewE>(5c2$%IJ*rw>0q4p5*pcO9S$<zL&Ldl{ zQeGC<4)F7!(^QYqJ%)JwppR6K#V^g{JgPI<a&axD@uOm1_yxv?B=}?qGY}HhDkdQp z`&GVv({OfblP$jpu9b8@{2?yEH6G;LefiRBkf@s}uHtn$fM6@r1F9#GUFLAOoaXyw z{c$*6$sI<q2!S^PilB+uDRO*QJT65e$Yfh6R&0DXbAtBQjHGwJO<z`<rC43aEQ;+a za{xKVLZ3J(d`~h%h5`xvZbVer^oHZs2dtu12AMJL)DS@UMnm8&uo6?U+JrNiY378i zSb*K1-pyR`oGT8NFP%7v!c#3Nx4NWv_>&mq)Sf>S2Zf*UK8VP+X9ePAl5mjs#8t~Z zL904?;%C$o-})A<GdkeR5I$J|xG?v~<A(sNbmEMTay~nB!@Au%Ndte=)5U<_BjkY+ zV>?^$YzamdY>$|qGK)LS2M_}~_E7%wc`=_^keuH89exEJ2Badp;m$=&jHsjBA*`zK z>JXhUL}||80ofYsEx=&P<yR^-{4&(<GG7~VqY$~uBYruUS=9ut(LM{3xAyVwXu5x2 zcklif&z84TG8?b5r8;sM+0HH+ecAQbb@%LFpLXcQah^86_%AB$wO8i`%AtS--D3yG z!;9c}h(j;!6Hdu{K(^|$=j`ovgz?x}$Miw4)y?}K@jvC4ru<Cw_zwVotu%cwdNev8 zm7-B*jxt@eU+zENFDCk?)Yd88sCu7TRIlqbY1YoVLY0|vS#S*`bF*p+MI;rJ)RYd} z;`vvQ7WnqW+l0qG!HHJk<06T%%)^B6fr1gUb|MlaDqe-MjD$iZIvzph9<Qgo4BHLn z#u|XPCYfZ%+)Yi5uB#c_EUG%MJ2BLKcuT3HQ6741>5|cE2K3hE&SapezwqH}^PnFO zm)E7eNpk>P(Hgb5Q$3`!YxLTXrAv-z9AIJX7`8jM3>`YmHoS|NWMinDNi>8_n~eTq zERy$|7{<}AOTQKeur@ldTd$L|!+<iJc8qJ8724^UbWfTIktyrx6q^Z$4UQRGZ`3(! zHE{O`c3<ifzV~uqEx;IK7`PP?7$PEdL)<OZ+LyFb!(ZAtJT+Q);z8a{_Qn4<yS_CR zZXGFaMe|bPwO{hJZ0o-H7T%txw=MpwDcYPXw8qR!KSu+U{guYOgjkNGuutw;fcNr* z>oH^k5~8^NY1B74XFr>A%{#WZeGB$SENsxS6VBwZ`;rd>#x1sRAA1;*+^}jl77UDU z4DOY2tuzLpd_~w8cw?>@)NwakagRf=zhX4AKU{ic^<WlX`1WO^`Bz&OKfP)sQ+rI+ zdF+N;@g{j_7e?-h$8>C$j^%YUlO^5L8T>ZqfXI+`>~nAN_!pEI?m_cTn#A{{9!iO+ z_<|Bbx=UiikR+&Km$i&&0^be1Mn0@}F{63ou4o&%AOFj_I+)s4x4L!g7e-%hXn%Ll z^@ABq)x(?IDdXa>N_*Yaxxq>pGnLxs!T1`+T&3|fDwlR+$(sgVX4D5veGsywg*0>O zl2frr3Rz0BPOT2c_9X}Omf48nge&(1UL~a!!VTsfHJ~=@@O;wTua*E_Vs%O}v<U$C z7<`$mof^b`66+XgbY@*fiz(^N4z<OXe&EWxSl6FEShzkvnA%bQ_l5SDSzP)Tj4$}j zm_cMex%F19L5!n0CS{EdLSAWxe2^Bt{-To@DxA}Zzj#j$a|{t1Aq~l3gAmSSgCU~< zi2}kVLx%HHIL#JeQ_x4CLOyI9!Y1Er2+Avg6XE@*&m;6X6eq_zKsfOJj%-Fyb$q~R zqw9<WR6?iX{T(?>ms@5HbUT9&7lPrIFgyr1iI`|XF+r$A#WLrXsD6ZgKoR^H&~yNX zkE$^&%cDG&7alE$3u)Sl%?&$`4i|>nQd+-fysvY-D-!P9)z!Dd<JTrz*B6G5?QBpO zViCKj9yNw?!w1%`JusXL8mS_NrU?js#Ao#j@m0wIjsJ%)a7=a>h<}8HDbvtVGdm`- zX9?~<6mmJ8_11=HLr=pk4Uadd;n)PZlqbWqpqN_4Ox65Ih}{=r1EC$E>k&(?Lx#?- z_@THeK5KA!XPv~-^RSuSV`e+dcbLUNl)bP*KeeI$s`?x1rFw1ATO2PQEUJpL8yc=^ zxS>I6I0PQSN3olr?`ZMHALa}u4gS4Jq}mD|J5;PC#Ue%wYs6GV5RMpoNRk5Rcg?WK z6|7asZBV@wzdd0f!yOEigA>$y#6*>E_t|=SEE%H>8Ns2LL$A>%>MDV@U2Egv&hgH5 zyU^RI)*)--HS^=dKP4J<&GlOKdP(I;l{_l5S)Um?C{wqGjH7C+1%@xeP5+fx7Vi)m zh3n;>*3@81OsAM8<w=R!2us{8<Pa5Mzr~LIv8+2Wh*k6HrhMIkoJ$`UhM|luBx0jB z-gkD6Q%cGenL`3^mif$EB6|qX!ro8<Y@k_D19|pWwS6l#Rxd3qRkU-9$Ud*}MiRCy z+njm1KHY6M>mr$=t7mU7)X|BKNW`(W%aTG@_;rDZU579-FsNL+rvN%gi*Ab=_~p5w z>$(ZqT+@zDSjRg7^6r&5c{a!d?_!+^0@vw&dC&C$cE-uB7g;`fI64!Rd{L$ceeLv9 z0)xH{9r6HT;lwC9?o8ci-4k`96*8G4?|96i(mC$17}Ha_Vp{J*8pEu`Iu3lbfs7YR z^OZzUuap-j&XYiJ5fT!H2j2(z`dYO(C=(8g(UtN5<LPwhLS<VN->uR?UBkEju50gJ zzvB}J+Lz|<Us$-m)P&F-Q<7bM)xG0IEKQeh^u_Uemp=Iib8~;d7XOttNl|FTnj5a} z={<7FXP>gdc5ymQ1isS(_=1dQQnnetpZT1#l5Ws3!w{^86fcDZ7aIlbepM5@vn6gP z_rD^@R9d8Rxefb7ZEzo9UvxE=8{H2+Q5c;X-g&JzWwsi(mPcB{vDWqC{;|a!YK=;~ z<z^xod2aD%s2{U)`jO@+Ev_8jkX^!lZo&R=v+N%?FiT=C3ZSR6X)8<y<B(!cJc+bB zS_12^#ajc>fT#;Ro#F{?05iNV@o+*+L`N<6p<N4(M?lv#mYlaii$FdT58~iEJX!_K zm`vN}(XvJ2YQG%BkfEWMMc;T^E{88%dWHSr<@kk{p%?DovS?b3UHEO<JE(o@MK|(B z3kZn(nfx)gA#G?eNXLR~gMl^HtEEP%eoig9)aqWf)CDRFi3PBKpQ*6Q2|;(lUytLF zP%wHj$TnlrMtjvkb?;m>=!yn=qiP|FLF;$Kg{Rl8Ibn@Q<DxG9bl;~?Ks1{9V>P=+ z%?_xi)nYSdxZ2#lFr3+qoRd+fXTf1ch&vuQ;*+@HA7hrM?IMvE{dCdxPn=_ta(Qip zd{DCiW6>l0Sz<!OnZ&h1s2%gV%dNyn`sI8pwIoLff-6yluv6A#Vk8T~WV#$21G|Li z_7%HR@w#YBf68C3i|g#x4b6?s{z6-1U>nDf-_;pj`mQx$kF{pqHNbe2JIoTvfu3fY ztDH%dV-~eeFKyDg++laf=eK7*w7sx<sJ_rY{#Qnq-kh&=M&eziK(whV7_LikJ2eyF zn`8fsIb#%LIc5Ndq)um2sW3)O8jabcozbgjV4`L-Mt!f5d?_|A{DLo%yb1__Q~tNT zj`gw960iMd&$7KsZ?nYGe`8N=duQymZHpT*COWY{o`gIR5%LUCED4AbP9&p3lNC1m zk&3$6PefWg*$O*6-hX-y-;s3n9wlEPu@AgbNLwX=fdmI|PrWB+@gc7eVR5o5fn*MW zgcU(Y0*Nr~l=W;gT#4_<cDfp0A;_F5>h;9}EK%>BLk;l$j!XhYbQ-ur7;%(|4nYQ@ z4t@<%)q+Hig&*;9rVyFQ=PjvOnCy_wjtck&b<!*`eNnaW4hRaoTPV#O@<+Lc(`u8D z4RM4^Bt_~y{&kTbLEsTQkR0xazE@{xO+2Y8?i51k<spN}C=gTnqj$zy3Q>bkmul|M zjvwEiZ`^*Q@1uV#vg>@Mb#;}EWz4AC?*6de3;+U+)oN(nchBZ)7OpA%*)uwyW~6Cr zS3K7<n&W%uFT^<FsM>`ezmVWSkkl^_wNmtsCMD_J$=~03-VVAj9QY~y0P2x<<P?7K z`tVIf9o63MFIqdx(~-Dl+D}ROev;e(>IIfE6bWMkUPjT6{xcmMgVKU?>KbM<k+vC- zQWtUJ^SGdxp)1@L+$@7I+gZ?;3Y)Di68%6T^&Ux(uB!A$9b5rf80o1O%VZSgeTooF z?A=6H!aJ8ALl-k;30K^pkWXs+H=G-_`APa~ZIiFCXV#WBcf|MZh_=_KjbUT1wLjBy zXc%l0ZIP}uDS20ObWJ61in@2T$(vK{{qbftXpB^H{T&7i^5``VtI=B?Y0Gt&!aC>n z#)g5CM{Ba`kdEI`O4bJrh$;Uk<kS5IbI>ca%Mms6OWG+L80TEGX4Q;FgG50ed_Ly& zBF~<^h{jS|xrguVS18;RE-Lb}(SKK<ne1YpTlzW+Fa2aShKXN%VeES&OJ83FTcXJO zgc137kY8JbzmPwC(!fr~*fBkee+<d8A5XGdl5<IMJjs&D;9hJ@EmKx(YNy+J+HPrk zyiGb-Vi}OpOdm6`g9<Ky=}hZ<@{y!?N0Mz%vH@J^&#~OBJs6n{c#+hj9YnbYIhMSA zfH-PA;Ha4u4?zJZ(G*)4WHAy<X{x-rBA6<^@TzPIe>m{1A(+yMJj<LG;R@fnYYwU^ zJ&^KL5vq8(h{`Tano3=RDUwo~cOM%lb-qtZP1d(XT6T8F!(HQD1+XP;UHZBTTvm<O z+{fiq^Y0Q<$zMZzq2bbyNH{)VU>1HLAMXgVrYWD#Q=Cd9Qn|9aV0LIc1+yhzFc;F9 ztkIM*Jqg8L<1wX#vf7j?;J}o*;4+&FZkH3G+!|G-tS;kyN?ms0gW8i)M<M^Ws1f;C z_IOgar|wCKJ*g2W$m;qTO3oAwVWtbOGxwU{6Yr@f)JNI@33!T!K=O!e?0t$`6hLOR z?G7}1;7+y`amZ>FCTfhz^t06p7q5?ED9Mp6Opwo|!W9CFoYZ<F(&`ulxSmKBB<ERk zmO0|G+?T$-<#1Qmq1Nlt>*Sue$rf>&Es6Gg9+A%$PsG-fb%8P_;`)=$J5M|?cH3LG z-~Q&**r^l8I^E%>x`M~klnVxPO&(97t|{Ci$6~>3HW-UxJ==Qe-=zv{gn8lT^4z^y zrp_>F!HzI=rpwPcoe|BP?kqH-RB?N8fAOB;=Zoiy+RpD4e^nHpE;3cI8OLugK2%iy zOOZWa{9aM~Sn*RuajwWjxwx+=HeiJ*vL6-SDT?1MvRF|r-da3fe4_ZJqQ+We@lb3o za<&ln({|!tzzX`#^PqX$L?2`$7!)_9Mq^vT8{h+eNA}|!X~BZuHzU&)FE%>CGNwgZ zI?n?x!p%b(EJ1RS2>}0&967QVe@AY+?Y2D-R{3^}-pBKV4KA&8FlE73qdycWL!(8A zL5)kn&HlBcySrn;Uca@scWb@fh{Uu=r*UE;&>HR;Yq0-p*YNNz7FqhAb=!Nh+1~AS z6~Z(!sh38@_iRh=Do~!Jd+mZh;WmtGtI#M1b!H#%`E+_agWb%gQ_t#6Hu!i<gAf4G z2*_O2283Vm$^u++RlsnjW!GdwV<2gCm^%{twu&z-sn)i_1*I`g-iZ6ya5KueG2%X6 zHC9I>h)vBVK(uNM1`V8}eInfh>qLceP!uO9q9|U)y2yt&$6!s`_D}A||9~pUEd5~P z($`o&wE+|Kr1+PxLM_VsXY?%VW=}DeN+#klA!diG)m;Q1o9NbIlS{dq-Qo}2>>fAU z=tg*k%{>(pTrpud#yVrn7t6)OSg0X55_~);1=SiKF44q5#-P*qG&zl=(@d#Uz#jdn z+~*QD_p6yr-3Z%j#%8iknNO!<q3G;GL3VGD-42P@?HlMaG9P67y8weKcx<gU(F&E{ zX0r5}`qVtE1q}vq8p-wqVgsMp1&os=vUMTUp7^^U`4=hD<?rw#&qg8-*^%NAK8veU znPx7nnedz@F@Xu&%MM5CDqU8CaAy`OUbk;s@V3b4?rRE@lkS#|?ogzyROqzU+0zzJ z)YY+r-5%Y&|8PUY-ti5Ar5EuG|0d8o&>xN^qxJ!t&F$_yKw}1eQo@NuR?O>i==(`_ zzaFR!*fCj$k+mC$u=bdac@+4@7hFEJNdsBqN9Ujh;QbwW!sTY0kQ>D|3o#FV6>N0i zc7Y}F1m_}2S0pJ!QlE$1Ux;|oYlw(AZkn^4&8LPtBEz6Yi)fO=-oU+{jI-4#s-14& zW;jPK$9BY2A`O9hm*YDIkbF)Uj~A8~M}Yg#zbeWj;XE?D)VdI(ji-4m6Q5Ck65gXF zvaYw&b(6cTdu?c9^^P3&b+(rsH+fq-yI92AKQfj~4zFu>{zlxqYL8xe-PhUO=Jt25 zS%ZGG0qc)q)SQTXH?|}EhU5L2c*tCU(o~L{^>bPc(Ef~?d({Z8T8;BpWpF+ZUj`xk zk=wX9!7=`bxf!YR3f=`_{B7AXam_U~guj0tWb158&kTOQ>Jvph9C)7phI(X~Up_q_ zWt=qVq>WX~EM;bo8c!QVou2u041j~lcn}nl<bnvMBIZyqWq~CzZ3&xf>4;gUH)@QM zh=g7j2E8qf)ZRIb(WTKCvjV=_(kbvcrRP#XS1J{>gd=8)IWiZvxWbl5*gYO*jo1K# zVaems^rToS--sBXTzW%lg9pdM;b741m>1L@|A=OT8ep=ZqH%P9myk9;5Yr$m><Ipc zGUM$yg8Y=#x*y;EmLr2K=hf#e)h$u?;q%oUk<TS7{xPh{v^UbMqRGbpG3<s(i~)tC z2$H21CR#ETVNaxKm&q_gupt{U?6uUj_Qbq5c=y}0VT)UBR;PX4!@gPX(Zm{Hm`w(H z+1b{qTMiaG@40_rZA+>r5ss+DjiRQjvDlN}`lp|Mpl8q9iY$k<8K}xH2o1swa{t)| z_OXUfHHfnf?3k7{oz73qWmz^fH3vD)G-Wv5nClJp8hZ<+k~*8%nK%H$f_JCm05BY8 z1)bVQ__Ywp5G@4DSh*@PpbKe1e{%x=FaDDfW|FRo)3pC6Bxod6ulk0MWNXN<ca7<$ z?!>@&lVj2pX(@P$sgT~Fr_Xs?DiPF9rtci6jFz-+r#ZjjKsS4K>4uK2Eq<NZrj2dR z*1n3!`4+ER95>jZ&2l-K%UN;Z6LQm0#1kMsV=CfzMf{N|Id(b;{SQ=Dw&U6<@9Bh= zz!GoLva7X>;!#AXGGCPow&BspzR0Z+sXxNBk!ZXx+UxK2^+Fc6nQZ`>F_;6`<;?4O zTp^ZMS}5?3!%Z#YCenfduft+>$!%(k*Q>KvNai&JMX}=P=vzP77rG2BakGM;n7-z^ z1ADi}7Jss884xcl11R$K6fsYPndlWZox?J%A+0G!dahv^CeiPn^Pcs2Ht09HcVP#4 zKS(0vZ2l~{353=Hwt|kh3gSCi14Nwo01(6^`|DN6hs5a(-gW5uP9X&U!QJxi(?Mbg zjGy*1BAgWc(?<<Y8N?{!f{2fvJse}PrvfY!I1ms6)5m~3EAr@|Gnse{COfspwUbhm z4p|?C3wm%Da?ocFsvp7j2_+jlApK#%=0XOEw&a&2{Bq?Jxu=&i?-apEO=<aYkB1^= z<Mk3JeO`C;sup5=?w`53g>7sa?M$kcI`v2Q@1HiX3+iOoh(h;VfAzv{;(EsW*AhLu z+iyJ~7Cv%I+xXfzWPNJ)|B&KncMI&X*I4uUXf)Mu$iVVw>2%#8m{eUy15X9SDCXXo zHld9j1gJR{(&=NV(<#xKV!G6s)=Hh%XWeBLDPV2(VEz%fs|UR5akZ$y&Nh1}`e;;) zl9EJQKfP2cuV6AN4d>0qG)15g0n^b62RW!ZA8SS@#7!=PmaW#4C>If-0-uX@?PzHR z)ivImiSk-(%4brATIaM}J=5Q|zYwr6wuiB+dkzj|iRQZc&aP|RnJUeWRQrhcRWufE zNdmgT=;XG+UyAF++l3e+<c@t=2b|Au$ZKF;G49SDMyA$@f?6F42`-2C>H3}V1Bm}R zQRA^Ftxt`o9!W{5h0xegVOQbNf>c;=S#{)RF<2mGUk$sd8eTwP`n`hH3IWu-U&yR` z9xFa|1}xV_im<5e(Uhge+w69&>XEjprb2dr7UGSoAC3CZ+-ulYr<=aFT-BSJ+%hn* zh5nd|XyPKFa7AgO=KA5-Xg#sWWry~!-F5KbF8tBDEFyL4|43hittAVo@(KCo1s*^? z6Jl`aPV4W}!)HG&ohm(E67!|QC9zam(`}wIo?i3#8kT80&?dG`Ta!$eJk#wVUHVvr z<s*l&b`6^PJj2f2NGYC`9?`G^nrY2_8cCz^lS+M*2G{}Io2Cjz3u(*TK+L~Y`-fBs zGD>mThs%W6x+si{b}G2>As2F|<CVk4S#xvq;BxRr&s6qiy*oMwww0`t=1^lI)?|-o z%i~kMy;I|r%J}VaWwb3EZX2ysM%%;T_EGVCB<##(2CnN~8f2gC*wW;2n@TgAchA!V zo8L|EiyzGn9q8#fK;5alD}6~e=8Lc~lV1Hrd4tx=vR;-JPB?se(~uGQ>brA?b7BlV zm1}7Z&2bZY;A~4nOHa#Oi?p-;K)qOh0vWOf(eQM0aAP{LaG!(Sj_XL$EMm2HJnVkb zEgo|(xJ8ZI;}&)9(c$85z&$NkM+cjBHi=COfHhPjrx4wWv8F_gU?0G)fPST!Nw3v@ zMaDTPKUFJn&F(~Uzz6iPRw3l(!%(!PdZ_Q@R7xJNfVR*zT-QC6HBaa~xo99^a{Kme z>h0Y`e@s;ybu=P<9!n$%3)K=<=lZ@nw^^6iUak#Ck>bO|FTi)?hcteNywT^)c||=? z)E@Hy@?=~TQ`76Eap|BWNrlD&vlamKG-Y(Sr|k2<TRdfa+$fGBI$t#ABQrXkVCV~* zg0r&SahwJkqJsj9=PNvXgaSt<-d22z&|xW+l;j00R~TU2MgZi$%REJ1@(<M_MA-C$ zpHUdxmz_i-_4Sg%^4>Bieob++EG;6^XmupW4z_ghGM~!|w_yb_imjIu8_MrzHf$-T zj&p9qW^fzUHH@Zn3n}ic_QItbANenc4!K;QsJsxdYvDpX%YYm(zmx9pa=n3Q?J@U$ zC->oHD#Y*MLDZ}gA@*`YL}d<9zQQAr-#yr+56Npz>lmUi4vK6D7O42NaMZ;PxR@1| zI%sJ+%?WkZVhqfgPiOpISn_6IOE(xyR`YRtui6Bi^c6gJvQAbIx4;dQ3Ys1i(KoQ1 zz=j70GOa6$)SIQpUU8EsjMxP!fq;hPXMWn=-a8mQG<0Y74<;wm<p&?z{6?(KIZz&L zi$p2|Eal#O==k~v|9kz?&n4Yf>BgJ-Cs|Qk`cHkRQph$($j8QnIP4Su4jH78edZ;Q z^>HskzG}J7t$wG_1`?de24nT%n-K&sn~mg`FkobFh9CbOIZB4_oQ+<s&Rm_fE;r@0 zx}4UWvyQIg1z2DJuXCC_WTy5I-0gekPzK)LAvXiwxz(JGzd)9rv<h3_3-Io#%E-}r zhr9+2)7&Y6tH>!)bxyz!fdZo@s*uS><|Gr)`|&!2%9)yo0Q^Oq5DCsEP>mmvWuB@- zCVadrL{oKSKzG(T>-4K`z^(gqqZeR>-xNh67x#zIyX-;Pi2+HNRq5zQm7aP+Pd4`o z_i0ev1+4A>`ypLevAn-QAJ5|t;6HB^`L~O74t`&)Qo+}On8am&2hk96OFXy0x7A!@ zH8qJ=2rYsNT`bza#~U_gTL<zp_eR<_mZGgWk2}>EYTM?H`VRKoG#f7WXX0J;!GV~0 zRAaXquf4iypqv83Z#Wb3r+p^BdBhexaCP0<Qrv9v#Y?e6G*0s1O?wpkNKyE6`RH_( zO=s9iGi!%Ri%^0XYmE*@MRn92O-H4y87L%VrRdac(1}GIm~I0)(QzWKN@dNql+8Ss zO}VlubN10JyAL{+%^<~8jR?6a`TTihuhAKvuJgGUP<+;=^+!e}VL_$E7DB27<__#R zWGRC)5=r;4-M}b|C3AJ}!2`J*j==RxOenllf`*rCS3C@p%Qalrq!<^z%u?FA%kv+d zgEqTm%fPiC@)SB#Z7rSIl5Dl>!kMCX*8yLyEwZ+?ZJiIE3-5-ZbOpM$JC%$_?YdD( zr&W&)BpVZclRuY;1I-70m&6`ohMwsco|PxZ-9+{6_jx^TSjVguv&n8SnzRVGliY&I z?zRh4CcDcdNG7`^;Ir0c(h8<KP4@%uS?f{-@3TK_f6^`;g&W+ejUov`8?d`(943?6 zfdr=+vU+jD3=(+w>hcC6GiX17lV?IP&MYVIP(lxVv2dp?H)kvUTNt#fn=mDJAsGsa zIqY85WT@#j=*Tlm9%suMITBve(PT$D)E6wJmQHqf=ws`)4M+QjH)S)M*01%i+2-!( zU61BpdJ_Jd2-Z;AM|To_>W>iKj=2fCPD3uIx8E(t^vBiyIep$>T9DJn!wa5~gX*JD zUgkAEooz@1pEMw-dlmz4E8$*?uLW#~--ThFTpD{OSdsjG<iKdLLw#Nr*a1jD0%{GL z^mVe+n0F4vi;1SF6-hIN9fK2zL@chg`W>E_CBV%#TPU!-!{tji`Wy{~(7qjkTrux8 zdR;)rqdh^vcl-#jRqKSUa+52@Ne5D~Ig@Cwm+IyUXG^Ae{Uc!bT}bJ({%k%gWyb>H z1;1x&oj6a3suy2XT<j!dVkmPL6--SE_C5zx<=P0CajPDJ74#j@OejN`<Exr{DPOVE zz(kQ5!mV|Pm(giLx=etX680U#pv_V6Zw;cx<MZl@15E+7)GtcqlBkssvV8C`d)<ci zket(pG3pjN<ha2UFcnN-FK|w|q&s9T{^<-JXP-uUT%br#0Mug3CIJq^D{%39i*NAo zX6ojZ$W{(kZ2xAV%ou3A09X-W_x@l~++R#rLs3gz3Cq~xr^WreKmVQ0V|*k9*kX)M zruMOE?|oh|WD?D3DLLmpn+hL_vDiEh-W8|)OzZdhMV)`7*3o94EoT$;(B6Ss%exq| zJD1@hMDY*Re!fs4V;(ICtNWQR3m7%_W^Q(>x;M{!=R3TE%X()OzIO74LMKS{>SDdk zwZ3(#HfcS<Rv;<gy#FQ>9LdJ@1gZs0=>d)@?G~<*yL2X>DTh9tbDnaF0`e0zBig;l zS`nt^tf#EtRAbgE464WGo^keSq*<-OhACoLPumIRG_85)ZomL9!g!*f0SgoARXzf$ zJ_m_roBe47km-$SOQ|z%CSYiLsYwKpgxc3ISdZYFG1QMRXMY4eJSS|F>!qo5Z0eMr zArim}d$Ya(S=KWpyH4kG$8~qbd)>XkSum|<Ep3RHCB1qA2{so4uc1>RvsI&=--OW0 zlqh=bvU_F4wgod64{gedKV+szQ!3hfT|dWM_0_FO6YA=)7dT*2-00MJ>$5@C(gU6Q zhYK~-)#i<jUIlkGk>Uu4$~^pc@h0fWDX`WxAyf?eu`m~p1m-j{qzR1-aRFpH2y)P5 zVi{%!CEVF`;<)<Wz_4}L4=?#UvX$Z~T?-mLkB!h{mqBkAVeYvYAcFyK9PQTRUd4{g zqgQItK-4r3$z!kwD=mXzK)lHmYD&cp4|H!WdnUTqb58C7YS}eR9QD>`(6C{h<4W{Y z-YDq)z-_$r4su7yF1aA@nzysh7@jeRS1aZb^MjesWyI|WgT()dTg=R7X8RJ%n_%XI zIiXI4r=yS=&NMks7_DmP`DYpvh*+C3rFuQSojy^E81C7_xJS)0f`LVVWY|kD@XYD+ zTw0+m6Gq?a3*^ySFk=;hN?A>n7*X05lFBN@?(e;0cZ(-g?>)tgvDTb7*15G@-r5=S z=Gs6`d&*m%^0e%pwiS1LWLv||4Qo7G`vYq>>~8Ja)0;^2?&)gXy<ttDf2(KBhMf)D zKC+`&9i!98*GURj%U##U*v=Rm*0Bu$UXa-R63a>Lk{CKZgvhSxLp)hdIFmNRT$}RE zMte=YSw|aLXvs8-&7+40ag)hwaUy_}555RcTWhhe%XU~Ycq|*C5qmTpTzBh^fyuR@ zNszh4CntM1TkIMM2=emIW-r^{ch8M|tB2|QseA7M29n4sSAUrA7nlA6>+7e1zmO0f zl-C}#9JPo$Eo{KT0^xuwJjGG{<B3!xF(m|CS{7igDJ{bXmsZOJlNn<t9uFt_BE8{W z69(;zW+b*~^)u$`XR~d9TU$x$M38UQ&xhp#0lrm#b<H{t$q1{py)s|aRTFn7CgRw% zvOJzcvASa)h4#@3h&Sy2cDCMGS66gc;8+ja8(m#Re>&uaKO&v9HtorNsP)c%W=n4! z+Z6HH9QHnU96PK#+&9o4*>Yy<{_ozf^i!IrYS<w<AwM<<e<ers0d`Q$GHRw#WmIB) zNo-53hdn(J&gT5NFbUSXVR%l2L;i$6JQwnV@yd^oM1L+fCu&_HazEL_T81bHBqOwH z2eo2a%QT3I2t^Ug*c9R>Y@MyKJ|_zErNXFRYYY#EhV8C-n{lHeM3ObSr?U913cP_N zAwl1^Q@9%an=hhc*u*^LH&;a@RwR#wju?J`^ThSD2?nbux<@hR*Mg?oGGdmp;vq08 z?h9>({YN;Y3-@MRh34M8(dTul?8c-$ScnHrJvXKH8>5*zzuD_{8O@z*U3s_7!Tu^5 znf}i1lAL!+YK^#2tw*9j@F=sMEFHS}mP&Th=CQiAwL0yP9{ozPWq`|;Gjfl`=5%|^ z9;E9EdObc&33``+2#e|l9`rgWamhR5b2=Qz3Q^naGm=VW^!1wc2A~AcuKqGvBWO_| zGoZa<TYQ;9ST9_l1^$f-+**&GP%CmG-Yk$5DP>*(10-1y!v-EQydu&~w8gGzdhE5j zkubYwNgv+UaP*6%?a8H2vVRZ{rH=G(?3ryJ>usAK*w}M(Zj8%S84Q+l$j|Z%Gjgxe z942Y>0ySrDb#n|sA;@%IJ8#kaN{jC0EgD9P=8bS-Eq?R;E&3*J5xh`uFE@!ALXQ|N z`mfr<o_6)7Z~a`P!;84RDfgP>u9MMr&(eRgqwFu;8youy+q0WG^LrZm@`Hg*ygig3 zpvCj46Fwr30NxNu7;1~&G9{>8z$7@PUx18=Ovmt0W*5RQr;j@4o#J6g2lX0G(ya@Z z1j}8!Ne$FSlC!Ys55uhQ8$`&V7E&0gLu5%KqhwV)prH(-8jgT=Wu6D6phbYaz>vff zA^gCaNJ+7m1iq^zU?u;XA4r)t#6o?|THoFsDvfm~^TUUFGX1SN#B`<W+oL=7#yd8b zoNV6T-QDgQ>-2Q?AQ&suw4teWq~bGL9ngqu7DH!0u{7{?54nfG5M#XkC*;v!h`F;& zm1Thlvx1%`8%ai{>awo7x@;X_8#31Vq-OfCf5tEF^s_ch_)<2RnMv10?m}+J5JtP; zO7|krZP>aS9uA6aqxfAKvD67rcd(Pej0Uw(32Lh-?T5n=|H!EHyW-lGl^ZX++xdZ^ zY{~AiQn;(V-panV^mSW(GitZl9Baw-cP@vp`6?r==!%d!BKM$c#$4^)-F{m83h+O@ zi7}nSe!ku8W5>KC-op4QlARhs%X7J;E0;^=D3C*NC(K;-ie{iwABd{dh|JcUIOIO& z7I$Ks%O|6W`FJh>8Yx?R*rZ=D+p23Cx?xo(Am*#8_5ojTxgTnKUV6DFstU29FRf^K zUN&jZ47JC1jx}ucy8IJuUHb;ov9^r`e@kQDg4z6YbH1VMdE5|c%J!~z7)Q;HVCz_G z(?BVp3HA1Nd0V%*+tw)UH-K;C8MME|BJx+DnHW59UbB!`CyK}cxGKup0!#`p-H?%D zy3sWTyU*>LwLpTj*mZ7ZbcZR{Bo))BRa%ub#=0Mmv7g6SETz)Mw5qvO%$16%QreV7 z5>6W!qVkTxk#yov_|dQ!!*oF&2`ij%a0iJ{Z}Hvxl$M>;vZGpdfG4x*j-?h-Vhdd2 zDW**oA2YKBGmDuU&7#@tEV}LUPEy#)1dxF~CG!I}%;J^Lxe1Dh=aUXUdanqIK0*;l zSXdMln<AqD8h-iXpwX%L!M(6;a?=hHP?ZIg*w&Tl%B?$GxiWaO<xr}x65VxUWt)HL z-`GcE<E@QD4Zd{mc-fMOxU}N1#&laeAGB%p7GE}2YLM2JwuQHJ<gaejdNb|W#;&Z_ zB<ZX`6!fXB#uSZF4AlPxJ77V0L<Um}J8gn!;*CF+XS?!@<x{F@FI@4WH)u^plcFwJ z7p-IQ>2%s+Eu@O+_)Jm&*G)c;%$;Q4r(pV?(Vx^Ks^Jipx7kk-C=KwjIf5cNSZK{6 z?<3!9C>)7fD&9VSz6{t)^d(??z6X~8bu|0}9W-c3Sz7^1RHA;#BFeEE&`H>NGU&YI z_+KQO9MQZl-kb|)>n+)GPv+o}d~E!a?S*cU^(>96JcW+P?d))JxGqu%nQd;brr#3w zS|_h5jAVv8iW_5N^&^8l5%dY=j{g>GR}pBE)<Z!i?NYO}Z~8h=79ce3t8$-tSVla3 z$y!2;_*6JyG1odrm<j73!Q{goVbOsR7}jNG5;Lh@i*xo6Vl9T?furAbSiy?u4N~qX zNR5cJ6nUil78!yus)~EDn(+?UJK<a%G*1h+B7jra1ZjP7i}Y8IekQi=z(BaGk^voj zyx0<I=*>H#>u=wo(yCSBBs;(KE<oT_?5y_a!TK%jF`dbz+Nv@cb*@CopXtoGGX3(} z*w~n*+}6zZuL$gZ7ch78!VbBt$+58g1P2rrimB+FHxSfYby0xE>I#9#y`j{-9%`1y zBZY?bmIa+uHQAwQU<j*jP~|tMZD<<D7EV(_-W3}Wmmr{2V5{P`{R?;88tQ0DY3-V5 zu@YRr&Q;znm$fLJJ@^hDg^Ia5Ci+qjZyeX^4bm1#Z_pO=p{&o?epTa!4W@W9YIGI* z@I0H)mb0+gq=hr`0eF!^$f=Dnjf1Jc7j9u42^LF46DC6<YBnSc=DBFX6-}6<Pa4=G z26jD`lxRA9LY1{WViQ3xZbQ)IoF|>}1{RR7(S^7y1Jf0vol(&c6+O-|rkWSAZY-Wx zES5COc@JFRjmM&)EF_niEp3Vvq6~OkfNgu38HvY=qO(>Rg0i4a+O+58mkr)@h<LJ& zTsyGMVz+MU?C5S?8);6v#m8))-JEen{cd8yDyN4wcr~MlI*lig;_J_JVAqAulYBl# z#77vBA+=p@)|%PD0K3ZqfPD?P%S=y)wHo`J6C^>>f@|D+(0kM?c}J(UY&}Hog~KpJ zI<N!1MN^tWk`;3nf;%`lf)Y5VC{q;UMRsZge^tFUXSWO%8Z32J4V5O__kCn=0y#7t zSM?-V-M|Q9DQ~mo){b|N9vSQK-Yx#ADI8m~lj9j&3!a9TB&(<q_SU|$dx3?N#rIdx zB7PjtyB_Vb;<!_&$UdMU{h3uT8r?3Pd0s0y=IttrR*U?&h6V_{)g*Q$ERw`uB`op^ zuBFN^$6v-j{vuhIzOZ3>!_sHib$H|T7zX?Kcfm)Y0lX98F6_GW8`VEcp9KyIGDz^Z zMtl{ktd{MST7b0<{C7!cZZB6xrE&+c04-m09GnfcYbI*ffDf8u#!EtDbA7|8RNu0E z4f6X`D%j340!*#A&x8nBn(iac)~@-0`}{)s64o}(`HL8!l4z{ne*o<5KUzM%xq5sQ z_S?VZ_ZUH$#Ha19p8pHg-MpM8e!L{USu00+l$WC%-&{Qo{!(#?A18Sq<%oU!d^`y8 z4>>0n$SbMtV149$Bntkp#y%<<tCX+k*Ah6nz9kXANk7iju)TnpL2ruI*3O7?RJ3+c z&)_@=Q_RlG#5kuiSNO<PI)Q=bOJD25OTWPx1}c-8lrqorGQrlR<DBvQOq9uEc6ga( zrOZ`ar9=S=FGj6Q<adErl-H9YI#EwR?@>L47!iMpmKqO@!u>?tE(%}MUbMW*ZQ~=l zCZ^$xxxAkgo+fI$!qc>OpHff3Lo`iH&sktlPo>On)yfn<ixQs@BEaJpnGmQ$sZyjo zB5G0~f+Dsm;&q}vQ_4@&$`?P2@~c<*3b=z5Y#b5w36Mb%j}5<y*XzprJ&pS<Us*`e z{WLk;FH|F*y6k>Cm+$xamHVY4bieTb-Tl4@uCUtuSmys@?ac$@x~qHf`@MJeec$(0 zGb3p<Gm=KKWb10*Y)f9{C5o5Cb{s<DM4&_<kgFt?5}IZqI0>PNfs({_c>zM8p?zRz zOkXJpd61^iCV}_b@@T0aX$us1Sbm@Ly)%-WgudS&KiQg1Gjs1f-|zQ)&-t8lJ|{-U z3%C8w>+4xP-e(T2eo8rBw(|e!`lv&5{gXnZ<*Mro)Frbj&$a9O^xE|)^31-=^+6|N zO|$<4yd(e*|9$e7+kNbV+K*_(c{GVkKAL<cDJ5?(vArfX0usMP;e0x{c+hzQxh=Kr z_<YKEcQUDV?6tBEm|n}yJs#$n+zlSZWlF^W7Dk9TZ^}uS7z{2H_WklQHk^w}{c;Tw zL#&~-3VOeFSeRPj$*;2i)6loO>4sYwyI!+ncd6fQw(n{mxK56)JkEMMW2LxDVw%BY z1Btut_Ni5qyX?BHdRK1b`uFy1^Eb2xAsc1Q(;Ve%9&_}5Wsa(l;~H$js#j?%6OtAU za<#l!S#8cJ>!0Q*U;pAK$N5O$Q}&KAXaJRUaze89O+X>kM`E3hSv%gR`0>yu1Bdem za5zaD#-V5l;Yb)>oa5V%^(h>Sf5MK?jB`@5ZopwWYM;RSb>KU?OQL>rpCtVt+>3%@ zMUUMU3|X~k+`G1xo3H#_%0k;_gs&^_6@H3?qDP5z<%+D|J!NW~l#+Y!-E=O{W>kCh zIoRk$;Sc2__gL5+X4WheW`Y3?(%%^`H7cDbohgaOk}QK-qS-ra?3j%qC0=Jc+p-%O z^L|W#d3O(rl9+KYuq$vRAO()O*&g_ngHrRHs;My5z<An}<_2UK6G&Xaq$tz&NYNC6 z6{dOdJD)V%jGwmsoEj8<lepCs!-Z9NKZ~`xF|y+7rA75X9GYEJP**fLc~xamajY$& ziG~ihuB#=w`DS+0!O<_QFDF8PU$xEUtJk{gRVPOIni)n6%L$CNO?X<q`ILvjkr5Ks zR@Ry<f#~K8$%3+5&s9%WStvM_JC+lNa;%D02aBh5PwB*6x+6L<3hR6X^cv^eL(%2n zQQs_DOl(hPmd%dVyDLugr7%xEUOJD&rsn0xh4VPBmFV$^P)Okm;mIA`r>UDml=X_$ zHvJ+@dI*d7alVZwgd?I^+qz(-mkUnesHm02N^5m?2wrokJ!%?kF7DWrBFMb=P<-pw z`45+-V)oFs#vP-~QfwIC=FL`u=}nFkCt7v>NYAysod*W9PTh+G7w@>qX5419_l>ZR zfox=3lbm<CEjMBr(Ojqbb&&6Ed76*dga1sKyG+&4XvBVLTfesru%Gk24Ym*MZAX;7 z&C*=f+9pL4@1~6Jq}q{N`FA$gzVl9eC-1}ahO7@p9R_T}yur3|4&cp1?E|e*@IWz* zcov+Y{N4A^yUprJX05%O@<<1H{%oTlv%DP4Q$|U1Y*S1$$HFmDHyULdqU^Yt1yH7X zLAIg!=jPzaII^!$ADb1Bu!7=Ae8g%%*V8JcepIO@wmM5ivy_v<i)T^MwZ%a7u!ggJ zZ}l<oBXiyj+*AIWu%&5MsjQ_kPJwD)g|od8n-%#d5uXW>rHGd@QoP{t=AYyD_!#a{ z6^gGd&s!Vl9S!sa4MW{@9^FWM+0so_pxyK8+R4!U7x5NK=B3<`0_XCe`_~IEAy1^n z<55619bUuhSgMXr+`d!@e4COvd9ppckiz;jUqZ0o*$I&xFgRt^w<W}`CIAP^137Qz zs_uvZyM*>DlofoG@?zU|QeN!NHp+`#%LtZ_@9cIOgKLeVc=IUGOH#V<+cISNdL9H< zfg8A4D^Q8!I;YRs;FLb%c-(Q`A$2=8JFam^Mn}+5a7fF@6ebo$(FM}tlM?EhqkD75 zkrIr(v3+;(Xi+RKTBFgZsEeL&8)@9r_-LclxSX1_?6n`ai*~bNxI9&Uq%4(}r2uzY zr_p1PNCek%V>zbk=%l1Q{H3-_QgaUN?+_uJvsyy+Rf&q>q3%L-ePc<8&Y&vq=uWKW z%uWmpOwcb=?f$)pC$`#GOA(hIxrW1sx+r-uJ91=WEmx7RU#th(d&F*9Yv|7Qm$kh| z=<OE_lcKs`*-Y@>Hmsd6?LFc~T4%z&b=$O~8ij3|s?t00K8|10`W5x`ozMyUYdXQu zR0_j3)voqp2XpN(`#k9c5w;lV1kn8Owfl4G1|Ot1E8XDnPW0NV+1t~~du#UgxXmS* zCIR`?j?aB4<X<ZOkXG@bNUy-RI=Sw3?kDl<TJH;K6<-LiE4q#PU2)xpo&Qg3*D;W9 z;JPihPBx_5s23R5ZNmN6E4r<{rJ3tC-cug?G1ZU!0KQLH*dw=EW=!fC$<Kl_VUs@` z_M4<=M4Sr*RH452>)BB~+ofkiNEn=7Mxx-5c~sRaP(dDbRm9G~p|EwVs%5YR*bq!d zZC<<<WLBCB)=L(_hrH(y+i_^)=;+3SuGYPS1AE)tE1v~BGUpW7dU*f-!%V&MzpB#% znasd+b;rtAp<s#AYgpU`xmn@sZ;_i$nNFL;0BC||k&6_ZVfVY)D2xI83x{m;*1lk; zZxq|#yr>-%`f<8EpMnz`)Ed~KkPfFwy2YD>e_zj{LdH-ng8ITCM+qq<_dFusa(b%w z)*UU^?P}?^zaR~3?PmR*AD&veaa(+Uc;mMBj&GZ?X!t%vd&XT7jTL-H%;SFH%k@12 zy~(_8J!X=j)<%=|E%L5@$;S&mCFXMfdu#I!?+&8CWs-?xlEaEp)oo5xTqI#fRoIai zKtuH_If67mYnioBzrNe8?1+`!Ze&M{?3ENNmCM)&F32BnhDQuP%U=P<aK5S1((*Oi zcVJ4$p74lG{!!{J)DfqengYR4I1-KdV@U6EL0|b}{u!Usg$F(fJ?|*rgP?3Ji=lG> zg)*5Ki;2EAx$Q*TnKsGV#;jsg1hZ{x3pJr>shljAN)+Y&5}r)~Iz$?y+(f1B*`|;% zmz2XN!w-a|hhhMM*#}~5Z|rzX3}gHAX|>L#USFSxs9sOc#WF}J_=sVu0p75^34+){ zxp*<~#zkx$U@t<f0JP8kB9D0bsFWF4R6Wjze6Y3G3Cym+**yODB1*}rZDasn2?``) zKza#ZU8!qGFwqvOyta$j18Rw^wVJMM7R<!hf}FJ+E#y+PS3$e`UwV$D`+GLUt&VCY z-C?)HH_3gO8|@KWDAtom_C&uBav>&+-=-(rk9^?^$G-67L&GNIL6u4cZ_+gU(3$6s zHSKAdnELei_^0-;?|TCQuQwR{a(8v>noa))m|u$ja0WKLRo0XL(9;g1p4<$2pJL0? zJXCD?``PU^eYzM9a$7#Msx!DP&*z|G%ik~jBi0*XJia}<xgkHb`rhs<uR~AM_ddtx z_x-}3E8i>mOGUwiB*N0_d)x5dF#q1~@wt7!VrNPIrh-+Rl>CkKPMoU&Yvw`zohkZG z@k!xEd}rYElK3ZA{!TW>xO-!aPKd^udxOs?z76R)MGjBKh1w^6BAYiV?oIbP_l9Jm z9EW;eE5~_4_=vJL#VhCpShxzRS(P;^5bDQxqK?&!T#ePxn)mVZZ>XLBK7Rfpqq-Hd z(@gspb4)O1!4+eKa4y_O=CT<f*@#be)X)D-*<46t;Y+Iggs7tKirk^YXO!d6`76hH zLU^xo{_M)X%le27hXD<dB7Qo5#Sf?RSB~+-VP!ASwKw4VMHSyQu%CUI&YGV;$C|_^ zuMpxA_&lBe-^ga88h8^}4knnOsh|IqXUXKH^H(q@@yW;N{8v8#+({Ji39<GGt{YW2 zj!mNTSB~?<m2cxXm}hAH_jXL{w|K9PWMBLKCtl>|PVamdOpE3t$Fwkap5*6FbLTbL zT+9L2l2px*WWIjxkPBg3G<P_*B|h0(mpwj_jRW73ESU+>LR~QHvRAM(I(OwbPpsJ| z8#s2RUhiMv`}w?4zW<53eNw&}I|Cvt9^rCtqY=Ql%d6*pMmD$P?dnO%Rh$rAh1GNS z;GG}f=e`S%FmEspirl|1oBd8u!H9wnBjs9m?lf<XaJehTd4jJmSU2L8Z^`<uCLBg| zDb@`iCpzm7@bg!W@kFjB`;-UY&jj9p8S_iQ%}Dl`y!`xcTb(zMWR!Z;i<$^fGma{) z!{|u%I4e4TI8Dm=;}c=(RWIs+v*|gmM?l8vaY**cah||YY8YewT`@*}?#lN+aZovT z0U@<jj1l&a12)`0piZk*_?rBC)xvN=Y{)RwF6V5Wwo#jO&dNrpUmnX#%qOwk4eY3m zEo&duip1xB)*(4&<GGJy*al>><&4G>am~@Dr=EQ}$D;7b+l%eY=Pz4J(UPbuwPj3m z21BSU%$J&n??E2hh<gv%v*!IbgzgB5As$ymGA-)-6|S;Q9!Wz2loFgR5OzUq9=2DB z;SzC)TF?~_roHu08bAsDa6RC~bL;D&Hy(Z2)_K#;)~3F#@l2#)v?IP{kSEvQ(9^!J zH|>a*qnmg2-}1m#W5%e_g|D|aj&_!NGuEw+bZ4e-gwpE+{`MUkg6%C0X76nylQ;E+ zn79+{Y#2<z0-1gUK2HS*#!cgXw!zQN`q)!;w#&}IkO=<!(>iv$#5@vHNo-bRsNucK z#LzL}l*k@K8P~$?5MyZZDWHCB??cQgkw86T(Pec<sWz+i7+y*)$K!%~`IL*Hbj7v3 zxv*RmP!FhJJe(|pnyDZPTfR`Hx-2A)BU*=uY<){#t=cBpIjQuG!aB9IlI$imub@nF z4&_=J-6rWXjhm}6TR7*7l@s=Xn@;s={F{0<7Q@-<Ca)>Bu^8%VZyH06eJtNBx}A;v zE#5*lYS2dVrQpyt?OrSZlPgh5WE#ENEv8^&tfkG3bbA9jSMd3bnJT`Q;|v8_NAOer zs6M|<=p&64S5xX(3xqNJl4A_m_}60$_sRM|gmwTiilvW*LpDCy%P*pKxJS+)cYnam z23-vN9p0!H4Fvs$8I#YTo;Oz=!$>q7L=qL5$u;2THBOAk?PGBNqB;=M3W7pK4_V3( zo4D)n_I-|qOu~5BRqY+gj2zw+d_kPJ?HEXIrORi;Piu?@4Hb9eA|>eD0r5@5U>eX_ zU_f~Kxu+`($#OrEkATad)z7ki=JqqVASoXkuCU`8wnxJ<4N0a?`ay47tqS&qE=S+u zFo3|JYKfH=3F$gNm`?R9$HpBKPhrV5E<c6H=20^vTXWL0Z0%sWj%q9Fp_NeXs|f0G zAdrZ0d(iC=xC7>e4U+>@Qj|3Y`*Qv2D!d)xTBBIu^eY)&@ZZW&E(_)nw*XPvR%@0B zCxU(2+Y#tKIFOEZPjxg6+NWKOfk-Low5K|<og<FTEyuB8%bAAGlx^R5reZnkPuLrh z$#lw~Go}Zx@9DmNqyZcuTH9sWV)bTQL;gxWP|WSmFK8|7QA;3P8EV*n(5UM4IQ*%` zLL>qQQ3MbC{}FG2Z|6j3k_Y8O-JP==PkB#!pF-%f2aCo!yA)zaL$gpky)Bj5;yt;? za%Xc=uBDMRs%Mu|?09O9DwU&f3*==lTh1|Wu6=$48e0^EXm@Y17j%Y(`Qya&fd4>R zVS`hODj}?wDDwd;5UUHzj>?oNUcUOc)WT|&r1cblDo_Yoeydm_XX@hln{_@Rs^9gn zZMpt(FjDDHr~4}rz&QV{sU=)Vdrm#F<))#SJ5!FdH0gEMY7B#$HxC*#*MgQ}!V)Vb zlI5ty5-learI_X0ojdLNXrVKC_||ZBYbn)Hi0bV-J6i@a$)RNb@NhrwGB7Ab<S}y_ z0deI{Fpq9(uPj!rCSlRlm2X<iB{P~uYXm;BF0#RzoNYPPA`Z0dY!O?Qw<|owlD~ax zZtIYKH&s#im7ql})eDR+igw4O<FZliiS(Bgw{pqOnoQPOJpC@A{MS0(vZ*EOZ;U%r zy?c4>vNPW3&$j3_`!(9G4V_(DJkbAi%f5YE@XIcC?y;M4)&6Y9{@zrocYjB=znU}I z_jKmB<&(q7Z6hPwaF?e%`y{Xy%F#>;hvX{wFRUj$vzkCOriP!$69LtNRTBkAk0u@W zr(!~UF460pGuia!5z{cr`saLFcyR!YFQNpdr<Re)6Eb-|COK-9)eA}m%nT$=#Cg5w zTA~0L2REsebj;*+Hy%l`JJ%B_1XqrtNM~rUH-x|q@-j0Ye)tpp+t!sr+It%g9yxmL zjwoGA2614@&x~V4H`s77qV=SAL8AtL!~*3s)-FYp6p-5%^(P`ibSXA!b6S<l*^bLu z@@bKnS)t6#Lgl40E{G>&D*2cS9|XUe1Jgh)f7kW!WJY%0JvcFen8sC=FDrlH8`?4& zT)Bd*%x`#i9z9Xnx~}ZSy{YlW<I}ON*as9}W*#;X_hs1OwU~1-PBCX5byDmn?kkBu z!h12bfo&be)<Lmcd&eetj7p@5dgkuA(l7cj)>&a*9(Plb^#j&3NLDn-DNt_(WV{eK z>4?Pyt)x^{=Ty2G;h6@nP45^{p|IE+Nzt29Mr3$unSM?%_DQQGtWXY@Y_AqxyGWfp zh{g!%j^BJ4uU;gKw?h8>H))eD05)>h|0!L%ubLB3t6A`?RQIr_K|h%QWOU$5YJ(IG z7<>)kK*4M@1??%1ORKi)#OHUsyzQ+W=o)2-$BY4wMW^mmX}m_OPO>yuu`f}qvY*E) z+l3ycegW-mej*zHQCt^g15u_WpxX~zyp`C#I$K$wHQy>4TUm^#ukhCkoUoFUawPDM z@{>hY^k&lGLg5TRU9VSgx~Pi7Rb4cm@9hB!{yY%!o<$%b{E>N)__m1(8~1O?O(vlH zbt(ioov@(=L?V+b%BZ9%I&I6|o~1LU&!Lvi1YS5VJ}F!9QSY`5gu8E8CSHU~K-Mc1 z#6d{(Qu&R-n`Ph`Jl;jPI;u8*c?s+Y`1?0O6Y$cv%eKFszDP1JDC8!%twHRRpXPSQ zl}5R!FCwu0Dm$`Lt`7vd@hIJ#wQaSi>dGhTQPuI1N+Z5wXpp_qG1=y4M^=Nak`ipy z8P$3oZPhtNty%q!Q8Ohh+NR-aZcxIo<Qph{8O2-_zwDFn%gzXh`coV>-wp3i)zvp4 zsaoLyHjqz500};)_<#v~PVvz`2_LQYsYEM0KvikOgk))i7f2x+{wZ#&z5RGk3E#r; zlsIg)ft=0m5gdvKZ|iZ`w;$`Nn`&`bp%^1)vsK1n$p0c|bM>0;t6vk=_FoF0RkAPg zEjWa7CCb|7-_6%HzYca7*TM5N5)C|0g9n^ezjIAapW<>-&bxs-$xT(9H$ej2<yG(l z+5^{Q^eKF|@`;$@B&XIn$vB1%3u-%$AJ;MbTk3YK-Jt?9u5#k*mGf3z8DRf|$B(Ze zoh00=U@Od(O2(YX1>yN6a8Ot9zE8q#^da-@ggi)uX|RXXS+$s4)Mc$%<^z?;f|E+; zJdTWStB{eH8^L?zHZF%^yzP+A?;MLQo9%XNN`B<Uq8bx~DoEYzfkg=W1eOY~27HYh zD**rCWhrJLuY*uLge0~kfP3hHVy_aX%&KYfjjK#L=XlEvY<hFuj2pSyYWuLxrW60g zcG<hmT!RkU4%_&z5&La~t?^a)<k8@4P<$l7P6gQYf%gT(PxzU^$NVm4bTO5M5%q^S zt3IU`B@{^o0|U@BA%Ap1cR$SH>Yetk6J2bgixn1xa~ld{AM`Ul>Q6*}C>?5p#iucO zpg`_bHMzh((z+ZB1Ogu9!!XZyeovaEVJs873VczrltHHQCJeg@uczV^Lga$tH8Pip zC<<aC_?7=~$I4lwx~Neb)D?G4a<z8ha3a#{MOfz@dZ#4U5fQyrmnr)->d$)iw7vdL z*)r7{M^W@D87uP$`I8}JgWe&Jt(!;L#h|VLW=9`3w)#ZMhn51Pz8&i)Qw-VIRwCJS zj-~!zlZk4zURyVvUi{DJ69vxypL6O<U;0mH)qS>4Ze2OD{+h|>`nhxy){X^H9$7do zZxs5NuC-E$TP=9hcdmQUrir2KLDE<jtfi988naF!=g_;DJJ;J<Dpf70>NM(j%ZBCV zD(yE8Vx9uG%hq@*6%oSWK!A8IzidRTSXz#dom;3C-`Fdh6tYk+#=#zR`DI}2Hq4&O zKc>`ZUi^IRbo#2sBj8F~pWTl|cXf`zRUR0-vc7G{^m<3?V$;@8XiL+2*K4go&kmKo z-pixrLS3g<9kA(iw#?9xHJ@wcpVs<-)O^@s=_agG3t~Gm7)J6!pREt<l;>QFwhgfj zlN+QB;qqd{ri<w&(cnZ_%%1BFkL${1bsKH(36f;nax@f5fH)a~^l#InsrW`vJ_?&R zE*BfEwDhQc6EdW29E}^5$0R%~y31vf-L){16uKwy)$;_4bPdHI9pz5)0_)Wha#X^B zGjAO*bh_4%$WqLY?_>Y{-6hoBv?UbU+O;ZCB)T%GVUW6?upyQ1@be_7F7BMZ@(Pzy z7j;V^5w7efnGQDWKde*1?>Aj}Tzo*%1A_<)2^Nx{dM3`M&|5dc?g+D~0GqNiWb1$< zEAG|%RAGb1r*a!SF3D<hI4w?7Fo5okU>=>ZI8jjHL>m&1;r+th=z^6HyataKq;lQ` zkHO_Jcs&SFMSUut$k2~a<x|Z_E|(;^^d6tbr<W{JN=}{N1YA~2)FSFENo0;|=X{|= zMCA$wRUTKbv)9sR?$fLKBnmveOaV@^Pf-^^>TWI6<mDYki%KO#y*`3y1M88ddg&d! z8-$q{iYUOctB~wo6`2B|AiRWC1qyCm%>QgsLhnW%bgB@8APlcc737UsE&FcM{`Mn? zBt3M)z<~oj*EJ0F_oa3hhX#L~?2jJWvD@f1HM9SH<Ig^Z_|eKg`B%Ph^PfKR*!a<} z_&&4s+@2r)FtRa<KJVCXx-ll#VNBBKs`0P#qxw8Mons(6$_WfzM?NMnhdpF*dy*-0 z>OH~-5hRg1g}wM(E^joMQ)!dg1fE8-D`ifnOd;818wr&UA^uoqsU={j84neM-5@<G ziMz22pDn3@&5Q>32F0MqH=jx#53&6rHj1tjR5FCQ5Fg6BcY~Fwaem0Y8wm{-lW`Bg z9S(}V4B}J3HDzo^;D3gsD!f$=VSFo82|Im(3WW+6xWrdW9&HrmgIr1O+`r_kv^CI_ zd(xZGzJ&8LLgre?R#LDVO8de#?*tQolPjXX>>F?0H`^B|x?;m2Z%7l?N8R7gw)O2t zFOzh~XkKnD4CC`JhXR$I-SJf8CvKt6CMwnDNUzSKnp9h~mw#)Epq&Z2$T)6@uul!2 zNV9)YBl(N_9)FDbgku<oCgBBn#-C$G57QZS%!vGS2+ikp>pYL<**$r7N1h$ev-~62 zqLW$y?N5R#$$UR*Rf>;f*bqSI#bC2mrRpq<7VarX1#III45>+s>)kolo;#YG1;At0 zp%$RsFa$oVWuM1waS|?8d6_3ua`NFGJmKA9?Nm4k!wAR?KxicU+bj6t1Atwhe#k(A zgt7axcNO7PQf4GifE(;#EM>pZZ+X8jf%eH}U9_Rml}`FM1vYM^t|@wlA-HMfpZ%em z#jQI;jY_B9sy3)rKB~1+%M_hjH|gFM|IiNVn!?yl_sZwXTl{R#VZu7ynAjTlu4Zto zM+NL-C(z7JG8=R=T9x>WMXjGxk>S{Do?}?tmw5FKPxnVc+siQdK&y}jy*lxu;vaJ7 zMa{~A$;m^HKfZG(8yM%5!f#>B99O<C-X{KsU_utcS^1dW!WzU5QS^)KC?>ne^e6%| zXhf~rU{KGf%sOU;Bcipc1Pi7#6SX?6xWIHS#I~3fE83%FDy>#!dXhbh4!=lkv|CM4 zlc+O+UBxhm^66f6pH_u4hBo3;pKBpM$|F(p+lfBMSP@sxeN1^E8^oVN%B5B%&Z=I9 zYs1XOEvqI)b#u?k-(LGr&nth&I_?5@d0%d2*UB5`zt_N;SasXVTVErYrh(@ZZ_XeS z<?~}*th0*+K#(quH?R#2EZ9(J5KRs2ktFjZ*nowlEo~N2WdSsL*1#S$uz)_V7oX9x zISp%VOY7B%s6LulQ0rZ4eL{V%i9OoH?rmb~Xp<Ba7tR2fOrIYPE|~iJhFWJ~$}Y8a zjQ_EkEvs3lnteaYI-_T)JO#V}QR_GR*_Zp->3-HPEcZ1LQ=pjNhQ4U7XMj*)7o|J_ zGV-B1c+p$UNacntW_B6i_Aik&Z1++*+*MU9ROH4J&hUq;eyZ?yQR_pAQSECvp`4qA zSGN#Umq~iLHKXwK@OM*j^<SMZhZ>`iYJ>0S9#3N?jP4(DQ+9(n*nrBHoF`Ns%;}Q4 zCf9~0z2BraXH4<tRLp6QM52z6X`sK??gwX{$)9LR4sKJUc4$&(kH#H-m(ySgB+Ka( z3_7vh7Z=5GNo8<HT=q;Vq90QGXbc-LhCcx2l^3p;H+{yyKmePqfn9==lXf^7g+``p zNEEU{!%}WEf&MD$yW?ZlCD6p}^W5kWM?Gu<IS3FdelBhLA8-!VaIe3eE`OuQkuR<i z0O6s8oLA<qlR`2{G(0Hb<*3)TxVIq|(A(q5tWV`P8R&{j4Jnr~j+S^X-_ZCf0Ji<u zOjYf~Hg8V^QF01D-X6sJ!a+w33B!J-@P~gLxy4za-8<bOrV62FIMb{BYVo*gPIZq; z8dI?W7sDbIXOv1x!F}8`XS&BEnP#63v(qSZ%hkh74Z69J1Zz*Q26RbE2rm0PI+VO6 zg9dHH9T<f6AmadyKa|R42!t<51?1*A#!9HEwyjr^oUMscikdM)G^^Erh^1I0_YV)* z;-$C~t&;&@hpT(sQB$t1J32GxN*05GwAc9Gb6v%>)94At-9&H|HDmCt`U5*M)qLD; z55@9C(*zk%<;Oi(t7&8#9&rWOScG*&*jSjQc~~W_W@Qx<7pOCo;C#$*7JI;AFzc{7 zqe#5ZoYp?26_>OOg;9ebZP40?o9XV@4KY@YF=LFy1c!O)b|>5IJc_sbCfOL$%SZ~i zd~6Sx7DPr)KM)4UabM#JheQKNu}b=3(=|!dc&l*vyg8dfTm?z|<z9Ov?+-W2MOR}k zVF(+t<!a#YF-JJ#cEr5qlkt{p#A+`@GBKUWs@bBkne|%+qRq*W+2jqxp#CM^JL>@Q z!$Ppn`-G3nhez`47%snK_84ecmr%m_v`d<Cp>d|`D6%aZXO9JL4=e>FP_>%jL=VIU zCeb-lO2oo_GX|adnf|_w^Hy(pt`ybH#k4VNEQ-wBQmhmc4A#L!cCCjd(RxugZg36& z*5qwUV6uOkQl+uAyot+S*Guz2t(7LFL)T+zfcpttLlaHfdOW|Yk){?z5i#Cja&pqu zQYyLE+GwuaemixVTy3QJ;p<i#X;SMd4RxM8J;Yw5wpCZP&>X*Z2=QBH45Nu=OUOKC z4Ah!v;zjItZq&fPfPK}62*62sgE1QO`j`rhi1dc2dd8?D9<Te+3|X6QLEme1y^g77 zd;&V|Vy&fo2EATD;9K<1qr1;rGHA-TWKeTAr0ErT0wHQfVPK;?nG6nerz^h<WMSI& zI>NVj0C@64qKZs7ZqO-ZZ9J!tq{KsT@N?RdjKbb1B6WG(<A>PhL*wIha-MOvov3+M zzIY8g!`x_wh~M!Ybz+_!EB{8EJR>7FT+6XN!qiWR&m*VzV^~v$KUw*cFXG-fS-{-d zbLC#KP5cdZed1#Nf_#00hviHtz_fc%mZTL0vk6<jE{Dt3VxMQa1+9o;W?hGNL@VZL zm#1f1qs4D?&2%!>0P(7y@wr_t^PJV=_1X=3+nmX0R3kDjSo<7vT8$ba!k$k?SuHKU zOoZl`VkE6!UZk}Lt^fkDritrg)%;Z)4$5;Q*>P3~@T35PN!rmNUV`utW?^U;Z^tha zN`sj_>;vJU-yb@5lnE=3Jh}H*{-X=CfosI)2Lmf#*z$`>_Ry=B|M?e?g$kI$ABzTV zvo>OtwF&=Qe*bcksZGomwCS=)l1nD^iNxJTmN7D~k;NSLQj5_LH|Tp{=<5L+HZ9uD zqp1ulFE%dj7C>7&EU<QBzll<7<MZu__;BkZtzxUsamsz#Eh22~UXGM9jd!=%&)7bP ztVNqT84L2pL;)}>Mz*!=1=HTLK|jlr9*sIm#o#6YloO^CHY>Q&91<sc0Lv3_AFSP% z6<D0sCSt(UXM=JK?UfJJghu+iQkNjC0&*dcFi>OggkQ!H@+8(R<^911CZK{tgqdnJ z1N9b1oI<OGlhKwN*wbQg=!2UA^X%1%E$b-{J0zXt+S^{v2Q~#ab$+iUy&>lnnKKy3 ze_2z^F%E~5i96Z)4U<iJ5_BgzSIVV#8h5yNB|rF~M<j2dGg{i@x^rM><4My0TGV_0 z8`fzMv8|1I6m@umGvL{~0jtgJcRLLRr`xXzhkSDZ5bg!=PwnY7Qrk@e9}Lu&tJZgu z%DR=VR$L;~3=Nf~UI?dHw7o)e4oV%cO>Oxp<T347g>}oBeahXow?EO@oG@hE{pFFq z2OmVG%n!@Ed(%d{Q@_O;AKiP6Vo(F${XSxHUhzj*Q%Rh84n;3<o6WTVh7`1Fj-l_d zWN}zbCW}K#r_6U7?RPtk_$Qz>*9F;Xa*X)yiR`eBYL`{Z0P<0Zj=;V`TDktjiMOEg z3auNAp%*Agtv-cLx=ktgacP{?3lOFqjjPv`F`EnlV@vLuYo@nu-B<7@lYadEsYbn7 zQgwCyuc7aLcj(90ACltnP>BC3e)XW#3p*r*Jf(k-ZDt+Cb4)(H5e#11ljsohE7?W3 zPm1C-DXNo5%~)+#(1r5Oskr~ub9j-Se+l&y>Dd5SLqXI@pDEI3ioDlqfP+Wq9Eh*O z+pWbwplFpgbhc6>uGV>?|CCMinJ671I+!Qb>%`yk^ERIq1tc~%{|0KjCL8b;_mD=K zBdRtS&D3s{f=IZj4?BfF!2gLGQa-pt83E=1cwOGc-_~|@)s#E_wi*oaJL{R<Ot#9V zfjCuN5Z!qH?B3SP-+MbP`Fi5F>jL?RZ5=oJJBlu#pD3O;D88R#bVWq0yMwS6M%<p0 z#RVPW^+4pT*=QDF`)njzYH2Wam>z`*xIElA)hISjM$s-59SBAe+uV+2KTRiU?N*^I zcPg&tTf7adjmU4WiQsA+4sI^#0<H;YW4ao;yc&2r9$rs!w}wr2_g)uYh1y0`n!_s( zt|Pzmu3>FXL|bTo#?5W8d4h-@+$s+~s$=({yQIjB4YLAlpCSKlzi2}yw}{~N%rVsx zs7h7pW>b8|X|p`j6c5dN?1?#>fE-Mt(d_gLn){UAGph;{+YL4wfCOMGEmK&LGCQz2 zlQvv!i9$rbqyRW?6xNRfLw7yH^Ox-9){5gsSFxq&ybszScO?JNW1Ig5`OX&Op5~DX z(mIIqw{K#1LuO*6$GdWgImg)+gZ5@l{ENME<u}xHtw#L|eMdcm7BS9#VS^mjsDtpE z7rZXVxq#Jmw;N$m`<O|iU-qhbau|gxuJZW7*i8DIt=9HwwA}Jaa*fd5j<y-mh+ktf zRvH2o-9ryekB!9-i=ebpi`#%Bh@TpI>7}6`njm}{0|#!fSpwlq376#i6Y5CV5jWu` zr1FOyQBb5tOnOs9u<O*gNg?4NqK=^ALgjY_Kmp-bF_mAi6VT}iJ8Wi;V0XJft{O3! zJrNIDgL%*z3>yr3imA*FhusV|z{$+XjAYHQa9FUaqAF3RO8ff!9z3<rdAtsX$=ios zV7=;Ilxo0E=czfoAqp%lh57OV1{3%W?kG*}QW<FGI@l6c15gBe#mf0#UR3)y;~HU| z*4j%PyL487ol#FP;>;q#HP{xo#caUqNj24Cc|49Co}BAud&c#;E9<zymG|uYaCk%X zP^>HbA=Y3|+3#~C#aL!6ogT|5x1%iwTUP#wxl4yyZVzvW#Wq03Hu$l><bG@sXvEWV zX{PbA=7P$eZ!%`=`J99shsk5lTTLFD;5H-7r7fszh-|A2NM_U-GkC0$GKGw4LCOFa zM$a(3lrfq-8IN(n<Z+oiAN73NBhGqGdBj~FR`m>{xe%CaZKalyjM~(bB~`S<Vo@O? z<!jbTODwq@$lHW_GoE(5IUr-VwHu>>anq=AR5dDrLW6$zT7s8^el&bFQFh{MFJcDL z0F+--$lI1y#cy5D-o~Y^dr=WOb)ZoYV+j6T<i4KItsMv)4FN{LIi3j~GDe-BwD?Wa zmY}t7kGCZNN;f&bO6k_#<BN3#jxaIgeSeg7-FRKo@oMErTl@8ufss4A*U`B(SGyPb zAKyH&6a83t%@oF@L3lzwqIR=K>`ZNEl8u>6Of3>}V}vax2n!ay%c2)7mY^Q{&q#y5 zL%&Ba`B6}mSe$j9;-q0QXA3;bd^FEO8f!2b6m`MeG2ojG4PeGw4*JIR>LqHM29*p| zgc*BLN%Q<B94ww|21E=SKgV*27#QXo$0MMmK%K0B59|5ER&4-s%ab4Ql#30Pm7lS@ zEV-68e}23gOAj9Gs!sb|-tEP0yA#!sjQw@AW~#ckwtKsJdqbK)(_jgtQ9*}!(&!lO z&6YxNADGY~9%cjLCFtd589l<Rc8?%CJtJBeI9UNPp$o=Wz^Jdb3E=IReu<~Ty!OVM zFTuBgF4Cey7tgXxf)D7cXxrvu-AMimx!ob;fp!BSD~Xq!$=0|r03GKJ7~`!;5U`OB z@`wXKAa(Fmw8F5Q6saAwAZgSmAAoj&M>3$^seV`uPCn^zFrNr25PcLYZ&00}4ZjFi z`Y%ogd~f(K`sfioz$tmP*(`qleWvAu@5QgAJCpkT4*cRMhr}Khl>PvZs2b~ivPp>P ztRu(4fC?`G#@UyVyP`UY5+gFyJb2<EnqNccI8f4)j7pWL9_X#-@gcJl-9rJe;Gth@ z!>v{*7LdB~1_;Jct_Vb-T*P_V-Y9@S8R;x|B4BU}3?7Y_*BdK#+xkjH7DRDPs3T3b zc)FvhUUDN1qKxL>snmv-+bE?qke?(Z#c{S*N+93Qi|gtA;*(%-gMoBGj#wNcZma$Q zByCGF9!q+C2!!LZ(>vk|Ac41t(JK^Rg03vSQFsyFKHWlg>#WJjy2n{)$i3cZ)QjKe z=-v~H{bprF9FO?@k@dfSBlB_X!Fg@u=VcX2;Ct1Zl(Ufadb<sDnq1JPlT>|%Gl6(G z4NTyT!nbXxXkUL8bmXskV=*s&PxB)N0+9%QaU@BI;5gSxyKC3~6S)yh>IQ?XHOSII z_$5peWCQ;9`Nejm==zz)&vyD)$=B->6A%m$N_FW+1s~Im2j3GE-{-r__pnd8&PVU^ z$&Uxw?Ll-7W5JUT``Iic`;oxo0rA5Db_-yafS${_nag>dh(8j193dll!uKqS_)cE$ zzsvuyU-AcJ%q2zcuNM3-(VU$Q;NGVU!Ak{<My>Pn8|Zk5zv32uuc-qpI6PeYSuddV z!z5wa@2m~ef2|GE^9P%5dFMDW<9(S04Anbi_^iD75%6x!22bHK$P7IdI2{n*AAkT( z`A_>Lqd({uksm)xA~K)@xG(BM@!VbLqvU5F^nb)J-hxi%{@}xFGD^Q)M*g~Z9)@tQ z5)C8+!MyZ#sl0)e4Q0boId))G8U-|${7*%JS?YlpxF~SHx%-x;cN0bHLS|JCJ$x>O zg+<x*he7s{AbSYe{-`kxh5f$pNj~Nkx*pjYK3JdA2Losb>M#X;{=k!Ac60c{;XepV z(_yw10Bs9I80ORbRX&Dqym1jJY*=^xVg-u9hgxyJt$zQ8@1oy^8*Zik&P#*-fFr;2 zZ5MYreC@U255DvA{-SB)#-;<%wJC9oO<_%jkx6>H9M#$^_K|2f2(Gm*;XQ(i`dWzs z6vrfj5ec|s7vwx9ZS-W^g_Mai#?Kiq7$sw?YXBJJvw^P#z5^l)wbf$jRF8r(UI67` zv0{5;`t|9T_#?ikc_1$EIz|iuIqrPXUZ2VG_<s#a^(s&Vt#dY|vio8#N5W!v8|?vY z)74M^1<U`BOkuynq|@m_7MCeP5B1uh<whCX#sR6qLeigLBwJ+vKK222FZ(!C2|i>p zg0c*0va)m%OgzPx0&fIfLO2D=neP{9GDtd^g`RPLQo4l-7Maj5wX;s?8~70HbR!Bs zR4@rdRD9_e6r5Ir2JRwlRVP(K5z3yD9!P`v@dQ>9wkDdav=M2uU;Q8rjP#8IG!C@a zu6=i#95P~`gW$oaCdi^1xd0EqYdE>Ydx$}%w2|=dtpr{wzl3jvB%OTt`}uH7A5%t` z*0CV|l+ELumA&nR9GsKbjS>S@#vGz{yvEgx?-m{qMC@D_<OHU%-^sMJJ!s8ld<DZ^ z7Ycg}DoGYjGSP;MtGv#|WqXPDFU6dN#wz=ZW!x30q?KkWA$d40y4rPH#(KT<5Oh$i zrk8$Q(@WAfpn*QUe(#{i@3@Y`vi}dI&mt?5*_f!?B^(h%C!Mj=FJdRYAP4Z+tkp`A zAfnx52&ouw3u&NXMX#Ry#ovAQIC;J!uRHVjy2mVYOVhz?YNx*PgW8&t{$L?<-{1Tv z=T7@^SXh!>9}lv7g6v~{cIs*!(vH*qT{<Luhutyq;V=`!cUVW?RgHk6u<-wbB1!X^ z)Ly$NJ}|h_m48$;$xq*YedlU(4LOrk`?Icg6csqNnpAe>-(<a&N=KElQKU^$PNwqy z4<I+R0ZTwD+{tS|l?u9l2Y&=&6R0&s1t2rkQaP#CZAJVm_@`OnE_vtsB(@|{@f9p^ z>9{04pgV(2N5>B8PJjzhn6-icd&Yaz%H-g|plAh8u{G%R`$3+m$~Az-cNCc#4o_$f zNMf(2Pj8y%y(3|h19>AbA6^a?nt~V7e1^vZ%=O!NRJX?!=y1&dr?Llf89DpETd6J* z|0-A+FIl1{Nn^KkcOBS~?6)8KD>3wzKAg(f2afc`UuoRZ8DruW#>P4~4<Sq7v*Mwh zJHHB(SBiD-tjmi1jOr`J3tU$BgJVyr8}#cyJA}F_t&)!lT|#-iyMWy_2p8nLyugPZ ziGWdw>5l2x4I+#bByd=h$yEMSkWG;_<iVysiw?EE*&Eb%s2^2JQ_yQ?bH2Iz15cvE zVL%wN?FLxA?0gh%%{<ETcU##Y_Jd=FM-X}&yd%l3NwP5z9X-N%;bZf6q}W($A4+a+ z5FW)IL-a-P4+*S>=qUSzo|KgUBTs(0M1Mr$Lb*tl>zzfus}o&to$r1vN=<0AJ6;RQ zqEYSdjoz`VSloTbXnwdosr7qy^|fu^5LdI7m6uiVt{v@tQ%G+~RY$C)>7`w}PfeE$ zR-1Z@F&OXO*}A>DS5AhI(Sig8%*P~f=l>8d!ks{6nle8H#EbA8HNNl=--6^563tg$ z^DErRdF+ryj15HN<AudGl&h-N=N%jHouA>~0W}X<Sg-t2dJFS6ihQLT<xQD-G{rlM z@Iu2(l+D;iV|!y_ENZhwV^X=KA2sZSlntevp>aOsaL=dHwx~WdB=Ghhh^UZ9PLVof zby3ZKr8Z$PS(WL^w+BX02IARSz!->H#wn*YR?lcn^KdRYTG6Jv31q;3sWOEuxs5wI zj6+-eAuGGbk#n%t{MHjg`Ga{jAL-cAY|lFE#bA1<EhZj5adBVML|01OsT&#F_0tD` zE3&`u*x3=%8orb7h?&KepNh;BYs2N^`uAM<we&+=zYn>qJLRHgHj)v1GZqgbNsiIT zUi1g_U`a-#Lf$<G${%SynY4S6&1UcO&l3+8KygC906!F0v3y#WwhMf10tc(%c07k6 ziwGMviH_SV&U$GnEl`g~ycXB=@sHQ8Y30uj9byBA_S5yOULE_QDBd)qTnXE<au$>x zzhK78kKtPK`Sz%Zi7Rhm<au9V@sDv$<U5WXH8S&zRT4cjzNnQUMt#!9qCUnO`dI~E zAm9Va6%I*SotOAp=Wi#baUP2v0o}OM>z`wD!Cr5lg@@*AbhOimNUy0PES0)0;(7=H z#9AGr8xi_76(ly-RLuUW_uxQH?L5D#S6W~B&e$-N&3}Qisn2(CL{SYi=ZHcT&MHR~ zI0cZX0R1i0s21w_oAZM}*O2~xJ3k20`%&XwQ%hJ+o-6+$4oY`HhrL4Ym+lp2pu;#b z&5EpVXz|4+nNLZU$6QfrK951JMs!TPjvA7iO}ZI_!E6#|1jHz<X5=g3W*};2QFGD! zHS>4ODyunae$ou^z-%+e%(D4}`HcBTW^HGS`5+#jG^-vkzk(MeqLrTHuYJyZ0WZB} z)|2J%T%~=4TM%Hl7?I|T46viN&)BEu)ucT=2q2-ngvg|?<+m_mIpnx@Q);2CD@-_h z5~Bfbm@S8X06_Kf6XM~^<1f5Ga^v+*TqmI3iS*2sUyFnEoc(p}`ESJS;-5k9q!l?p z7(as?)Iv};3tDkT^^Atise5^9CsH=3RXrv?rF_}h&sM$#@|m5NpTq~S-cTDZ{y836 zVS7xVDrd%GnDOj(A4SEsZAP!s3p1j{qZdWJ$D;E4j1pE|pSj;Vr|(5R61GA7C&f|^ zno-1nqS~Ak2gbR*LU0saY#Xl-v)_EpXr<~`GqyZ+&C2VN*4x;?Hom}28}9qVv%4-o zvGVg5#KV2}EG>44s992UEY)e@T44iV%mc7E--q)pF_ZlG(~ayIu&$?4GyaGRcHpv; zS)AyF<afDT{#X3$r2hf`8NYNJyzrDIWl5XOX;<YW?~t6$HX4nZOvcoh&CUo-E};pn zxixCcCCv=lcB|FG4+VBV2o|0dqz~b^rkRt7_={=v=bD(cDcU6Jn#xUmjeVIu!S6Sv z`=Wi3KFX>kBwB+>p`f9Jh?0R{@!<i0C+t|?L<ugoxmyW?W@v>5{EpxI3LMHKik1)Q zsD*{^)#-1d|3^_kH0DDRa%-_I-b!#OeFSYURCq`q;aRn;S>pXHAZZ934ca+z3tq&K z;|ZvzSx01abTD|UXXD^-Y&tqJxY2VWI5;{IX_y@E3)~zW7#WRE$HzwcgYWhCjc;Qo zlDnpMCPL#occod|%3q~-?Hms!c24a~ruH7ZzNLA3YIAtyc{U#2JT=|ia{a+QkWmzN zg%LH_9l%JBEyWqy*#jv(>S3TRoai{vA$D}+q5%{;Yi6JJvirP$2%hrtEE=sJjn1M8 z@c9iUFzV-`IZ>DE3<z^o)M_ISv^WoD^IU4kq@Q0hKVlY-nrF=-l|4_vI;*jiL!`XL z0GSLF!y(l9o1iv^9fAH!sOq5g$Bi;hCg5C`BhE8(sP3gs;QkJp>yNg^2Rc$)WF=#% z(j9BvBd0cYMXEXfyY^k!#6D&SHYb}pK_Q^CnzWv#!D7o!Ct5^wH&iFeD9Nk!U+5fY zs6>pI)}+g@7?GQZjEir}_r$F1F$;UfOs)H#)}RW8J*{SDWQm)cY7MgOaX%yJ0PO2b zGfH*hGj7?<Z0<?-Nw*};uxDJxK0{xZi9HM2(HO#fohFtyp+N`nMC<g(NMXIsl*AsE z*lp6HgbZl}8l*`{EK4jYA*r0Hfn5sNV#p$!24aG_N8Q0Im22q<RGiXgdzv~lU%EOw zTxm+jKSyOXd_vMRRBQJfh)o}VPjSnEP~XsSU#ACZ?@HV9eRr2HkAn<p=YgZwU6Zb@ z`MdZ&!1oR81D~z$1HS^VRFv-<MEbGLPq>xq2<%IcC2S~O6YduJ<%R|wvtv6j!hSgC zHCT;Nqo^~YMVfog-g~$4V@7cZ;lMcqnGUc$FJYB}WeHP<C+qO-6YFQ4Wkfo3P*mw` zma8nFL*n6%<JVo=v})+=yz~IB>M-fBLFlY3Kfjh$o%UY-yuhFHIy-JxmRIKj?Q2@0 zL3Tj_i+Y`EMx)W|q&aObs|78|y1``UH&6jMEmH5|u|q4*LBG?Xv86!8*W}s5_lwHv z@nHW$r)Kzbis>omSLMg&`!GJ6622#&JPnT^81kdDPbBJ$h7h?6IXPFB%kA|!eS2V( zM58k?<`Poz7&4F8LyTR=X4sufYGng#CzG<+<Qb?Q7|M<^4`kRa8Ad@p(VB^7M5Do= zfPubrtalGvMmmvN=~M5dlnrVK1%IoV>(S}j;Gk>`Kek#h2@gNSxvmhn<C<|bjJF!& z!=H7p(tAi(rq@S~(29UGC!%^3)PuY5`>sOQj*X^(&!Mtow}>>QLgvP;eeLd><Hvd$ zMq|gl&CSiPHgD@rP<&y#+F%W4eZ%+Nb$fa0wfFD;yPHN9-hT_pd;`WjFaA$aBZ0LB z&(UB+Ji^DkOBrMAyI+NjjX=5sXp$uvXY_irNjsx{#$><_!gO=0K9O&+wT||Dq{~I* z8K!AFrA-yT;<2e~F8`9Oh#j<dayx?70ICwjB);D-Y?d2MGX{&*;-B$GEokq+EMAK@ z7_h46iQh%kIec{EFr&RtpOJ4|m{{1UE^%~<GKH|8^GpDM?6oup^ijiXs|EerDxa{X zds>{?R7ij5kaMDG^TDd?AiI?B$+;xd#IggI$C;=$Bzvbj|C^%gq&xYwKPlgCn9=FX zCdGPF>^3w@d)Cav1v9gn7htnVR+w%Ge{+lMg!ut8S!6#l>tM4@!eTqapJ~XTYk>*( z0G_^O)+$fQf;-7y`jJ_W)uR|}`d-j~U`D}OyTn$FwFA?)uC1urvZ|YEBy5;!D*9iu z)wsQep``1%GA#WquE#1&%bl>GU_$9|LAV-}1qmvhWVe0I&Q91Lu!{%mEM}MOqScP# z2Rb3Lru48ESj}R%gzbx<1nQ{4fdw+9U{cYzuRj}_0`)VRs@sorPGmxHyYAQGbNrlQ z#2+Zk+KdL@jApOxxJ`^|m_k2o)97>>o0N!Sskz;f7FJzoUgBO9SAVO99i36#TjZS} zGB7M^UZVDG-r;kf`e^?8{1=(qm2<JKqp{8j%nX;KDV80n#(!|)gw`PL*+D+w+nhhj zJN&hz!a3W77<3P;(Zoz@H^R)bLP!^!@sA2D1!GG{Ntv{eVWH@}S{+aJ#d`z2rg_hL z-;dRWS37Ck5$6OYC6gChrtP0P91yBZO`GBCRv}RKYR$JxB)n;OdPi&C-y!ba9zS&G z2eng{$i-6}Kk+;+<=2<TvE1r*I_feaLbn_fW??z&W;AFZH;U-4#-fQufgypJSlb(@ ziCM8%FxzU&OrdG4i�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 F4*&~`u1f#_ literal 0 HcmV?d00001 -- GitLab