Commit 47bb8aa7 authored by Steven Fuller's avatar Steven Fuller

Removed unused files

parent 095e8f06
...@@ -26,10 +26,8 @@ LFLAGS = -lm ...@@ -26,10 +26,8 @@ LFLAGS = -lm
SLFLAGS = $(LFLAGS) -lvga SLFLAGS = $(LFLAGS) -lvga
#XLFLAGS = $(LFLAGS) -L/usr/X11R6/lib -lX11 -lXext -lXxf86vm -lXxf86dga #XLFLAGS = $(LFLAGS) -L/usr/X11R6/lib -lX11 -lXext -lXxf86vm -lXxf86dga
XLFLAGS = $(LFLAGS) -L/usr/X11R6/lib -lX11 XLFLAGS = $(LFLAGS) -L/usr/X11R6/lib -lX11
XMLFLAGS = $(LFLAGS) -L/usr/X11R6/lib -lX11 -L/usr/local/motif/lib
GLFLAGS = $(LFLAGS) `gtk-config --libs` # -L/usr/X11R6/lib -lX11 -lXi -lXext -lgdk -lgtk GLFLAGS = $(LFLAGS) `gtk-config --libs` # -L/usr/X11R6/lib -lX11 -lXi -lXext -lgdk -lgtk
GLLFLAGS = $(LFLAGS) -L/usr/lib -L/usr/X11R6/lib -lX11 -lXext -lGL GLLFLAGS = $(LFLAGS) -L/usr/lib -L/usr/X11R6/lib -lX11 -lXext -lGL
GLXMLFLAGS = $(LFLAGS) -L/usr/lib -L/usr/X11R6/lib -L/usr/local/motif/lib -lX11 -lXext -lGL
NASM = nasm NASM = nasm
...@@ -39,43 +37,29 @@ all: swolf3d xwolf3d glwolf3d ...@@ -39,43 +37,29 @@ all: swolf3d xwolf3d glwolf3d
$(SOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h $(SOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h
$(XOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h $(XOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h
$(XMOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h
$(GOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h $(GOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h
$(GLOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h $(GLOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h
$(GLXMOBJS): Sounds.h Sprites.h States.h Wolf.h burger.h wolfdef.h
.asm.o: .asm.o:
$(NASM) -f elf -o $@ $< $(NASM) -f elf -o $@ $<
vi_xm.o: vi_xm.c
gcc -c vi_xm.c $(CFLAGS) -I/usr/local/motif/include
vi_gtk.o: vi_gtk.c vi_gtk.o: vi_gtk.c
gcc -c vi_gtk.c $(CFLAGS) `gtk-config --cflags` gcc -c vi_gtk.c $(CFLAGS) `gtk-config --cflags`
vi_glxm.o: vi_glxm.c
gcc -c vi_glxm.c $(CFLAGS) -I/usr/local/motif/include
swolf3d: $(SOBJS) swolf3d: $(SOBJS)
gcc -o swolf3d $(SOBJS) $(SLFLAGS) gcc -o swolf3d $(SOBJS) $(SLFLAGS)
xwolf3d: $(XOBJS) xwolf3d: $(XOBJS)
gcc -o xwolf3d $(XOBJS) $(XLFLAGS) gcc -o xwolf3d $(XOBJS) $(XLFLAGS)
xmwolf3d: $(XMOBJS)
gcc -o xmwolf3d $(XMOBJS) $(XMLFLAGS)
gwolf3d: $(GOBJS) gwolf3d: $(GOBJS)
gcc -o gwolf3d $(GOBJS) $(GLFLAGS) gcc -o gwolf3d $(GOBJS) $(GLFLAGS)
glwolf3d: $(GLOBJS) glwolf3d: $(GLOBJS)
gcc -o glwolf3d $(GLOBJS) $(GLLFLAGS) gcc -o glwolf3d $(GLOBJS) $(GLLFLAGS)
glxmwolf3d: $(GLXMOBJS)
gcc -o glxmwolf3d $(GLXMOBJS) $(GLXMLFLAGS)
clean: clean:
rm -rf swolf3d xwolf3d gwolf3d glwolf3d xmwolf3d glxmwolf3d *.o rm -rf swolf3d xwolf3d gwolf3d glwolf3d *.o
distclean: clean distclean: clean
rm -rf core *~ DEADJOE rm -rf core *~ DEADJOE
......
/*
Copyright (C) 1992-1994 Id Software, Inc.
Copyright (C) 2000 Steven Fuller <relnev@atdot.org>
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <getopt.h>
#include <setjmp.h>
#include <Xm/MainW.h>
#include <X11/keysym.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glext.h>
#include "wolfdef.h"
Display *dpy;
int screen;
Window win, root;
XVisualInfo *vi;
GLXContext ctx;
Atom wmDeleteWindow;
#ifdef GL_EXT_shared_texture_palette
extern int UseSharedTexturePalette;
extern PFNGLCOLORTABLEEXTPROC pglColorTableEXT;
#endif
extern int CheckToken(const char *str, const char *item);
int VidWidth, VidHeight, ViewHeight;
int HandleEvents();
extern jmp_buf ResetJmp;
extern Boolean JumpOK;
int attrib[] = {
GLX_RGBA,
GLX_RED_SIZE, 5,
GLX_GREEN_SIZE, 5,
GLX_BLUE_SIZE, 5,
GLX_DEPTH_SIZE, 16,
GLX_DOUBLEBUFFER,
None
};
int main(int argc, char *argv[])
{
XSetWindowAttributes attr;
Colormap cmap;
Pixmap bitmap;
Cursor cursor;
XColor bg = { 0 };
XColor fg = { 0 };
char data[8] = { 0x01 };
char *display;
const char *ext;
int mask, major, minor, verbose = 0;
int opt;
while ((opt = getopt(argc, argv, "v")) != -1) {
switch(opt) {
case 'v':
verbose = 1;
break;
default:
fprintf(stderr, "%d (%c) is unknown to me\n", opt, opt);
break;
}
}
if ((argc - optind) != 1) {
fprintf(stderr, "usage: %s <mac wolf3d resource fork>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (InitResources(argv[optind])) {
fprintf(stderr, "could not load %s\n", argv[optind]);
exit(EXIT_FAILURE);
}
display = getenv("DISPLAY");
dpy = XOpenDisplay(getenv(display));
if (dpy == NULL) {
fprintf(stderr, "Unable to open display %s\n", XDisplayName(display));
exit(EXIT_FAILURE);
}
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
if (glXQueryExtension(dpy, NULL, NULL) == False) {
fprintf(stderr, "Display %s does not support the GLX Extension\n", XDisplayName(display));
exit(EXIT_FAILURE);
}
if (glXQueryVersion(dpy, &major, &minor) == False) {
fprintf(stderr, "glXQueryVersion returned False?\n");
exit(EXIT_FAILURE);
} else if (verbose) {
printf("GLX Version %d.%d\n", major, minor);
printf("GLX Client:\n");
printf("GLX_VENDOR: %s\n", glXGetClientString(dpy, GLX_VENDOR));
printf("GLX_VERSION: %s\n", glXGetClientString(dpy, GLX_VERSION));
printf("GLX_EXTENSIONS: %s\n", glXGetClientString(dpy, GLX_EXTENSIONS));
printf("GLX Server:\n");
printf("GLX_VENDOR: %s\n", glXQueryServerString(dpy, screen, GLX_VENDOR));
printf("GLX_VERSION: %s\n", glXQueryServerString(dpy, screen, GLX_VERSION));
printf("GLX_EXTENSIONS: %s\n", glXQueryServerString(dpy, screen, GLX_EXTENSIONS));
printf("Both:\n");
printf("GLX_EXTENSIONS: %s\n", glXQueryExtensionsString(dpy, screen));
}
vi = glXChooseVisual(dpy, screen, attrib);
if (vi == NULL) {
fprintf(stderr, "No usable GL visual found on %s:%d\n", XDisplayName(display), screen);
exit(EXIT_FAILURE);
}
ctx = glXCreateContext(dpy, vi, NULL, True);
if (ctx == NULL) {
fprintf(stderr, "GLX context creation failed\n");
exit(EXIT_FAILURE);
}
cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);
attr.colormap = cmap;
attr.event_mask = KeyPressMask | KeyReleaseMask | ExposureMask |
StructureNotifyMask;
mask = CWColormap | CWEventMask;
win = XCreateWindow(dpy, root, 0, 0, 640, 480, 0, CopyFromParent,
InputOutput, vi->visual, mask, &attr);
if (win == None) {
fprintf(stderr, "Unable to create window\n");
exit(EXIT_FAILURE);
}
XSetWMProperties(dpy, win, NULL, NULL, argv, argc, None, None, None);
XStoreName(dpy, win, "Wolfenstein 3D");
XSetIconName(dpy, win, "Wolfenstein 3D");
wmDeleteWindow = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
XSetWMProtocols(dpy, win, &wmDeleteWindow, 1);
bitmap = XCreateBitmapFromData(dpy, win, data, 8, 8);
cursor = XCreatePixmapCursor(dpy, bitmap, bitmap, &fg, &bg, 0, 0);
XDefineCursor(dpy, win, cursor);
glXMakeCurrent(dpy, win, ctx);
if (verbose) {
printf("GL Library:\n");
printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR));
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
printf("GL_VERSION: %s\n", glGetString(GL_VERSION));
printf("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS));
}
XMapWindow(dpy, win);
XFlush(dpy);
ext = (const char *)glGetString(GL_EXTENSIONS);
#ifdef GL_EXT_shared_texture_palette
UseSharedTexturePalette = 0;
if (CheckToken(ext, "GL_EXT_shared_texture_palette")) {
pglColorTableEXT = glXGetProcAddressARB((unsigned const char *)"glColorTableEXT");
if (pglColorTableEXT) {
UseSharedTexturePalette = 1;
printf("GL_EXT_shared_texture_palette found...\n");
}
}
#endif
glShadeModel(GL_FLAT);
InitData();
SlowDown = 1;
GameViewSize = 3;
NewGameWindow(GameViewSize);
ClearTheScreen(BLACK);
BlastScreen();
/* NoEnemies = 1; */
return WolfMain(argc, argv);
}
void Quit(char *str)
{
FreeResources();
glXDestroyContext(dpy, ctx);
if (str && *str) {
fprintf(stderr, "%s\n", str);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
void BlastScreen2(Rect *BlastRect)
{
BlastScreen();
}
#define w VidWidth
#define h VidHeight
#define v ViewHeight
void BlastScreen()
{
GLint error;
glXSwapBuffers(dpy, win);
error = glGetError();
if (error != GL_NO_ERROR) {
do {
fprintf(stderr, "GL Error: %d\n", error);
error = glGetError();
} while (error != GL_NO_ERROR);
exit(EXIT_FAILURE);
}
}
Word VidXs[] = {320,512,640,640};
Word VidYs[] = {200,384,400,480};
Word VidVs[] = {160,320,320,400};
Word VidPics[] = {rFaceShapes,rFace512,rFace640,rFace640};
Word VidSize = -1;
Word NewGameWindow(Word NewVidSize)
{
XSizeHints sizehints;
if (NewVidSize == VidSize)
return VidSize;
if (NewVidSize < 4) {
w = VidXs[NewVidSize];
h = VidYs[NewVidSize];
v = VidVs[NewVidSize];
} else {
fprintf(stderr, "Invalid Vid size: %d\n", NewVidSize);
exit(EXIT_FAILURE);
}
sizehints.min_width = w;
sizehints.min_height = h;
sizehints.flags = PMinSize;
XSetWMNormalHints(dpy, win, &sizehints);
XResizeWindow(dpy, win, w, h);
SetAPalette(rBlackPal);
ClearTheScreen(BLACK);
BlastScreen();
VidSize = NewVidSize;
XSync(dpy, False);
glXWaitGL();
glXWaitX();
HandleEvents();
return VidSize;
}
/* Keyboard Hack */
static int RSJ;
static int keys[128];
void FlushKeys()
{
joystick1 = 0;
memset(keys, 0, sizeof(keys));
}
struct {
char code[13];
} CheatCodes[] = {
{ "XUSCNIELPPA" }, { "IDDQD" },
{ "BURGER" }, { "WOWZERS" },
{ "LEDOUX" }, { "SEGER" },
{ "MCCALL" }, { "APPLEIIGS" }
};
const int CheatCount = sizeof(CheatCodes) / sizeof(CheatCodes[0]);
int CheatIndex;
#define SC_CURSORUPLEFT 1
#define SC_CURSORUP 2
#define SC_CURSORUPRIGHT 3
#define SC_CURSORRIGHT 4
#define SC_CURSORDOWNRIGHT 5
#define SC_CURSORDOWN 6
#define SC_CURSORDOWNLEFT 7
#define SC_CURSORLEFT 8
#define SC_CURSORBLOCKLEFT 9
#define SC_CURSORBLOCKRIGHT 10
#define SC_CURSORBLOCKUP 11
#define SC_CURSORBLOCKDOWN 12
#define SC_KEYPADENTER 13
#define SC_ENTER 14
#define SC_SPACE 15
#define SC_LEFTALT 16
#define SC_RIGHTALT 17
#define SC_LEFTCONTROL 18
#define SC_RIGHTCONTROL 19
#define SC_LEFTSHIFT 20
#define SC_RIGHTSHIFT 21
#define SC_B 22
void UpdateKeys(KeySym key, int press)
{
switch(key) {
case XK_KP_Home:
keys[SC_CURSORUPLEFT] = press;
break;
case XK_KP_Up:
keys[SC_CURSORUP] = press;
break;
case XK_KP_Page_Up:
keys[SC_CURSORUPRIGHT] = press;
break;
case XK_KP_Right:
keys[SC_CURSORRIGHT] = press;
break;
case XK_KP_Page_Down:
keys[SC_CURSORDOWNRIGHT] = press;
break;
case XK_KP_Down:
keys[SC_CURSORDOWN] = press;
break;
case XK_KP_End:
keys[SC_CURSORDOWNLEFT] = press;
break;
case XK_KP_Left:
keys[SC_CURSORLEFT] = press;
break;
case XK_Up:
keys[SC_CURSORBLOCKUP] = press;
break;
case XK_Down:
keys[SC_CURSORBLOCKDOWN] = press;
break;
case XK_Left:
keys[SC_CURSORBLOCKLEFT] = press;
break;
case XK_Right:
keys[SC_CURSORBLOCKRIGHT] = press;
break;
case XK_KP_Enter:
keys[SC_KEYPADENTER] = press;
break;
case XK_Return:
keys[SC_ENTER] = press;
break;
case XK_space:
keys[SC_SPACE] = press;
break;
case XK_Alt_L:
keys[SC_LEFTALT] = press;
break;
case XK_Alt_R:
keys[SC_RIGHTALT] = press;
break;
case XK_Control_L:
keys[SC_LEFTCONTROL] = press;
break;
case XK_Control_R:
keys[SC_RIGHTCONTROL] = press;
break;
case XK_Shift_L:
keys[SC_LEFTSHIFT] = press;
break;
case XK_Shift_R:
keys[SC_RIGHTSHIFT] = press;
break;
case XK_b:
keys[SC_B] = press;
break;
}
}
void keyboard_handler(KeySym keycode, int press)
{
int i;
UpdateKeys(keycode, press);
if (press == 0) {
switch(keycode) {
case XK_Escape:
Quit(NULL); /* fast way out */
case XK_F2:
if (playstate == EX_STILLPLAYING) {
if (!SaveGame("wolf3d.sav"))
fprintf(stderr, "Unable to save game\n");
}
break;
case XK_F3:
if (!LoadGame("wolf3d.sav")) {
fprintf(stderr, "Unable to load game\n");
} else {
longjmp(ResetJmp, EX_LOADGAME);
}
break;
default:
break;
}
}
if (RSJ) {
if (press == 0) {
for (i = 0; i < CheatCount; i++) {
char *key = XKeysymToString(keycode);
if (key == NULL)
break;
if (strlen(key) != 1)
break;
if (CheatCodes[i].code[CheatIndex] == toupper(key[0])) {
CheatIndex++;
if (CheatCodes[i].code[CheatIndex] == 0) {
PlaySound(SND_BONUS);
switch (i) {
case 0:
case 4:
GiveKey(0);
GiveKey(1);
gamestate.godmode = TRUE;
break;
case 1:
gamestate.godmode^=TRUE;
break;
case 2:
gamestate.machinegun = TRUE;
gamestate.chaingun = TRUE;
gamestate.flamethrower = TRUE;
gamestate.missile = TRUE;
GiveAmmo(gamestate.maxammo);
GiveGas(99);
GiveMissile(99);
break;
case 3:
gamestate.maxammo = 999;
GiveAmmo(999);
break;
case 5:
GiveKey(0);
GiveKey(1);
break;
case 6:
playstate=EX_WARPED;
nextmap = gamestate.mapon+1;
if (MapListPtr->MaxMap<=nextmap)
nextmap = 0;
break;
case 7:
ShowPush ^= TRUE;
break;
}
CheatIndex = 0;
}
break;
}
}
if (i == CheatCount)
CheatIndex = 0;
}
joystick1 = 0;
if (press == 0) {
switch(keycode) {
case XK_1:
gamestate.pendingweapon = WP_KNIFE;
break;
case XK_2:
if (gamestate.ammo) {
gamestate.pendingweapon = WP_PISTOL;
}
break;
case XK_3:
if (gamestate.ammo && gamestate.machinegun) {
gamestate.pendingweapon = WP_MACHINEGUN;
}
break;
case XK_4:
if (gamestate.ammo && gamestate.chaingun) {
gamestate.pendingweapon = WP_CHAINGUN;
}
break;
case XK_5:
if (gamestate.gas && gamestate.flamethrower) {
gamestate.pendingweapon = WP_FLAMETHROWER;
}
break;
case XK_6:
if (gamestate.missiles && gamestate.missile) {
gamestate.pendingweapon = WP_MISSILE;
}
break;
case XK_period:
case XK_slash:
joystick1 = JOYPAD_START;
break;
}
}
if (keys[SC_CURSORUPLEFT])
joystick1 |= (JOYPAD_UP|JOYPAD_LFT);
if (keys[SC_CURSORUP])
joystick1 |= JOYPAD_UP;
if (keys[SC_CURSORUPRIGHT])
joystick1 |= (JOYPAD_UP|JOYPAD_RGT);
if (keys[SC_CURSORRIGHT])
joystick1 |= JOYPAD_RGT;
if (keys[SC_CURSORDOWNRIGHT])
joystick1 |= (JOYPAD_DN|JOYPAD_RGT);
if (keys[SC_CURSORDOWN])
joystick1 |= JOYPAD_DN;
if (keys[SC_CURSORDOWNLEFT])
joystick1 |= (JOYPAD_DN|JOYPAD_LFT);
if (keys[SC_CURSORLEFT])
joystick1 |= JOYPAD_LFT;
if (keys[SC_CURSORBLOCKLEFT])
joystick1 |= JOYPAD_LFT;
if (keys[SC_CURSORBLOCKRIGHT])
joystick1 |= JOYPAD_RGT;
if (keys[SC_CURSORBLOCKUP])
joystick1 |= JOYPAD_UP;
if (keys[SC_CURSORBLOCKDOWN])
joystick1 |= JOYPAD_DN;
if (keys[SC_KEYPADENTER])
joystick1 |= JOYPAD_A;
if (keys[SC_ENTER])
joystick1 |= JOYPAD_A;
if (keys[SC_SPACE])
joystick1 |= JOYPAD_A;
if (keys[SC_LEFTALT])
joystick1 |= JOYPAD_TR;
if (keys[SC_RIGHTALT])
joystick1 |= JOYPAD_TR;
if (keys[SC_LEFTCONTROL])
joystick1 |= JOYPAD_B;
if (keys[SC_RIGHTCONTROL])
joystick1 |= JOYPAD_B;
if (keys[SC_LEFTSHIFT])
joystick1 |= (JOYPAD_X|JOYPAD_Y);
if (keys[SC_RIGHTSHIFT])
joystick1 |= (JOYPAD_X|JOYPAD_Y);
if ((joystick1 & (JOYPAD_LFT|JOYPAD_RGT)) == (JOYPAD_LFT|JOYPAD_RGT))
joystick1 &= ~(JOYPAD_LFT|JOYPAD_RGT);
if ((joystick1 & (JOYPAD_UP|JOYPAD_DN)) == (JOYPAD_UP|JOYPAD_DN))
joystick1 &= ~(JOYPAD_UP|JOYPAD_DN);
if (joystick1 & JOYPAD_TR) {
if (joystick1 & JOYPAD_LFT) {
joystick1 = (joystick1 & ~(JOYPAD_TR|JOYPAD_LFT)) | JOYPAD_TL;
} else if (joystick1 & JOYPAD_RGT) {
joystick1 = joystick1 & ~JOYPAD_RGT;
} else {
joystick1 &= ~JOYPAD_TR;
}
}
}
}
int HandleEvents()
{
XEvent event;
int ret = 0;
if (XPending(dpy)) {
do {
XNextEvent(dpy, &event);
switch(event.type) {
case KeyPress:
keyboard_handler(XKeycodeToKeysym(dpy, event.xkey.keycode, 0), 1);
ret = 1;
break;
case KeyRelease:
keyboard_handler(XKeycodeToKeysym(dpy, event.xkey.keycode, 0), 0);
ret = 0;
break;
case Expose:
RedrawScreen();
break;
case ConfigureNotify:
glViewport(0, 0, event.xconfigure.width, event.xconfigure.height);
glPixelZoom(1.0f, -1.0f);
glRasterPos2f(-1.0f, 1.0f);
RedrawScreen();
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteWindow)
Quit(NULL);
break;
default:
break;
}
} while (XPending(dpy));
}
return ret;
}
void ReadSystemJoystick()
{
RSJ = 1;
HandleEvents();
}
int DoEvents()
{
RSJ = 0;
if (HandleEvents()) {
if (keys[SC_B]) { /* Special */
return 'B';
}
return 1;
}
return 0;
}
Word ChooseGameDiff()
{
/* 0 = easy, 1 = normal, 2 = hard, 3 = death incarnate */
difficulty = 1;
SetAPalette(rGamePal);
return 1;
}
/*
Copyright (C) 1992-1994 Id Software, Inc.
Copyright (C) 2000 Steven Fuller <relnev@atdot.org>
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <sdl.h>
#include "wolfdef.h"
/*
This is currently unimplemented.
*/
int main(int argc, char *argv[])
{
fprintf(stderr, "TO BE IMPLEMENTED\n");
}
/*
Copyright (C) 1992-1994 Id Software, Inc.
Copyright (C) 2000 Steven Fuller <relnev@atdot.org>
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include "wolfdef.h"
Display *dpy;
int screen;
Window win, root;
XVisualInfo *vi;
GC gc;
XImage *img;
Colormap cmap;
Atom wmDeleteWindow;
XColor clr[256];
Byte *gfxbuf;
int main(int argc, char *argv[])
{
XSetWindowAttributes attr;
XVisualInfo vitemp;
XGCValues gcvalues;
Pixmap bitmap;
Cursor cursor;
XColor bg = { 0 };
XColor fg = { 0 };
char data[8] = { 0x01 };
char *display;
int mask, i;
if (argc != 2) {
fprintf(stderr, "usage: %s <mac wolf3d resource fork>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (InitResources(argv[1])) {
fprintf(stderr, "could not load %s\n", argv[1]);
exit(EXIT_FAILURE);
}
display = getenv("DISPLAY");
dpy = XOpenDisplay(getenv(display));
if (dpy == NULL) {
fprintf(stderr, "Unable to open display %s\n", XDisplayName(display));
exit(EXIT_FAILURE);
}
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
vitemp.screen = screen;
vitemp.depth = 8;
vitemp.class = PseudoColor;
mask = VisualScreenMask | VisualDepthMask | VisualClassMask;
vi = XGetVisualInfo(dpy, mask, &vitemp, &i);
if ( !(vi && i) ) {
fprintf(stderr, "Unable to get a depth 8 PseudoColor visual on screen %d\n", screen);
exit(EXIT_FAILURE);
}
cmap = XCreateColormap(dpy, root, vi->visual, AllocAll);
for (i = 0; i < 256; i++) {
clr[i].pixel = i;
clr[i].flags = DoRed | DoGreen | DoBlue;
}
attr.colormap = cmap;
attr.event_mask = KeyPressMask | KeyReleaseMask | ExposureMask;
mask = CWColormap | CWEventMask;
win = XCreateWindow(dpy, root, 0, 0, 320, 200, 0, CopyFromParent,
InputOutput, vi->visual, mask, &attr);
if (win == None) {
fprintf(stderr, "Unable to create window\n");
exit(EXIT_FAILURE);
}
gcvalues.foreground = BlackPixel(dpy, screen);
gcvalues.background = WhitePixel(dpy, screen);
mask = GCForeground | GCBackground;
gc = XCreateGC(dpy, win, mask, &gcvalues);
XSetWMProperties(dpy, win, NULL, NULL, argv, argc, None, None, None);
XStoreName(dpy, win, "Wolfenstein 3D");
XSetIconName(dpy, win, "Wolfenstein 3D");
wmDeleteWindow = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
XSetWMProtocols(dpy, win, &wmDeleteWindow, 1);
bitmap = XCreateBitmapFromData(dpy, win, data, 8, 8);
cursor = XCreatePixmapCursor(dpy, bitmap, bitmap, &fg, &bg, 0, 0);
XDefineCursor(dpy, win, cursor);
XMapWindow(dpy, win);
XFlush(dpy);
InitData();
GameViewSize = 3;
NewGameWindow(GameViewSize);
ClearTheScreen(BLACK);
BlastScreen();
return WolfMain(argc, argv);
}
void Quit(char *str)
{
FreeResources();
if (img)
XDestroyImage(img);
if (str && *str) {
fprintf(stderr, "%s\n", str);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
void SetPalette(Byte *pal)
{
int i;
for (i = 0; i < 256; i++) {
clr[i].red = pal[i*3+0] << 8;
clr[i].green = pal[i*3+1] << 8;
clr[i].blue = pal[i*3+2] << 8;
}
XStoreColors(dpy, cmap, clr, 256);
}
void BlastScreen2(Rect *BlastRect)
{
BlastScreen();
}
int VidWidth, VidHeight, ViewHeight;
#define w VidWidth
#define h VidHeight
#define v ViewHeight
void BlastScreen()
{
XPutImage(dpy, win, gc, img, 0, 0, 0, 0, w, h);
}
Word VidXs[] = {320,512,640,640}; /* Screen sizes to play with */
Word VidYs[] = {200,384,400,480};
Word VidVs[] = {160,320,320,400};
Word VidPics[] = {rFaceShapes,rFace512,rFace640,rFace640};
Word VidSize = -1;
Word NewGameWindow(Word NewVidSize)
{
XSizeHints sizehints;
LongWord *LongPtr;
Byte *DestPtr;
int i;
printf("Called: %d\n", NewVidSize);
if (NewVidSize == VidSize)
return VidSize;
printf("Setting Size: %d (from %d)\n", NewVidSize, VidSize);
if (NewVidSize < 4) {
w = VidXs[NewVidSize];
h = VidYs[NewVidSize];
v = VidVs[NewVidSize];
} else {
fprintf(stderr, "Invalid Vid size: %d\n", NewVidSize);
exit(EXIT_FAILURE);
}
if (img) {
XDestroyImage(img);
/* free(gfxbuf); */
}
sizehints.min_width = sizehints.max_width = sizehints.base_width = w;
sizehints.min_height = sizehints.max_height = sizehints.base_height = h;
sizehints.flags = PMinSize | PMaxSize | PBaseSize;
XSetWMNormalHints(dpy, win, &sizehints);
XResizeWindow(dpy, win, w, h);
gfxbuf = (Byte *)malloc(w * h);
img = XCreateImage(dpy, vi->visual, vi->depth, ZPixmap, 0,
(char *)gfxbuf, w, h, 8, w);
if (img == NULL) {
fprintf(stderr, "XCreateImage returned NULL, Unable to create an XImage\n");
exit(EXIT_FAILURE);
}
VideoPointer = gfxbuf;
VideoWidth = w;
InitYTable();
SetAPalette(rBlackPal);
ClearTheScreen(BLACK);
BlastScreen();
LongPtr = (LongWord *) LoadAResource(VidPics[NewVidSize]);
if (GameShapes)
FreeSomeMem(GameShapes);
GameShapes = (Byte **)AllocSomeMem(lMSB(LongPtr[0]));
DLZSS((Byte *)GameShapes, (Byte *)&LongPtr[1], lMSB(LongPtr[0]));
ReleaseAResource(VidPics[NewVidSize]);
LongPtr = (LongWord *)GameShapes;
DestPtr = (Byte *)GameShapes;
for (i = 0; i < ((NewVidSize == 1) ? 57 : 47); i++)
GameShapes[i] = DestPtr + lMSB(LongPtr[i]);
VidSize = NewVidSize;
return VidSize;
}
/* Keyboard Hack */
static int RSJ;
static int keys[128];
void FlushKeys()
{
joystick1 = 0;
memset(keys, 0, sizeof(keys));
}
struct {
char code[13];
} CheatCodes[] = {
{ "XUSCNIELPPA" }, /* "XUSCNIELPPA" */
{ "IDDQD" }, /* "IDDQD" */
{ "BURGER" }, /* "BURGER" */
{ "WOWZERS" }, /* "WOWZERS" */
{ "LEDOUX" }, /* "LEDOUX" */
{ "SEGER" }, /* "SEGER" */
{ "MCCALL" }, /* "MCCALL" */
{ "APPLEIIGS" } /* "APPLEIIGS" */
};
const int CheatCount = sizeof(CheatCodes) / sizeof(CheatCodes[0]);
int CheatIndex;
#define SC_CURSORUPLEFT 1
#define SC_CURSORUP 2
#define SC_CURSORUPRIGHT 3
#define SC_CURSORRIGHT 4
#define SC_CURSORDOWNRIGHT 5
#define SC_CURSORDOWN 6
#define SC_CURSORDOWNLEFT 7
#define SC_CURSORLEFT 8
#define SC_CURSORBLOCKLEFT 9
#define SC_CURSORBLOCKRIGHT 10
#define SC_CURSORBLOCKUP 11
#define SC_CURSORBLOCKDOWN 12
#define SC_KEYPADENTER 13
#define SC_ENTER 14
#define SC_SPACE 15
#define SC_LEFTALT 16
#define SC_RIGHTALT 17
#define SC_LEFTCONTROL 18
#define SC_RIGHTCONTROL 19
#define SC_LEFTSHIFT 20
#define SC_RIGHTSHIFT 21
#define SC_B 22
void UpdateKeys(KeySym key, int press)
{
switch(key) {
case XK_KP_Home:
keys[SC_CURSORUPLEFT] = press;
break;
case XK_KP_Up:
keys[SC_CURSORUP] = press;
break;
case XK_KP_Page_Up:
keys[SC_CURSORUPRIGHT] = press;
break;
case XK_KP_Right:
keys[SC_CURSORRIGHT] = press;
break;
case XK_KP_Page_Down:
keys[SC_CURSORDOWNRIGHT] = press;
break;
case XK_KP_Down:
keys[SC_CURSORDOWN] = press;
break;
case XK_KP_End:
keys[SC_CURSORDOWNLEFT] = press;
break;
case XK_KP_Left:
keys[SC_CURSORLEFT] = press;
break;
case XK_Up:
keys[SC_CURSORBLOCKUP] = press;
break;
case XK_Down:
keys[SC_CURSORBLOCKDOWN] = press;
break;
case XK_Left:
keys[SC_CURSORBLOCKLEFT] = press;
break;
case XK_Right:
keys[SC_CURSORBLOCKRIGHT] = press;
break;
case XK_KP_Enter:
keys[SC_KEYPADENTER] = press;
break;
case XK_Return:
keys[SC_ENTER] = press;
break;
case XK_space:
keys[SC_SPACE] = press;
break;
case XK_Alt_L:
keys[SC_LEFTALT] = press;
break;
case XK_Alt_R:
keys[SC_RIGHTALT] = press;
break;
case XK_Control_L:
keys[SC_LEFTCONTROL] = press;
break;
case XK_Control_R:
keys[SC_RIGHTCONTROL] = press;
break;
case XK_Shift_L:
keys[SC_LEFTSHIFT] = press;
break;
case XK_Shift_R:
keys[SC_RIGHTSHIFT] = press;
break;
case XK_b:
keys[SC_B] = press;
break;
}
}
void keyboard_handler(KeySym keycode, int press)
{
int i;
UpdateKeys(keycode, press);
if (RSJ) {
if (press == 0) {
for (i = 0; i < CheatCount; i++) {
char *key = XKeysymToString(keycode);
if (key == NULL)
break;
if (strlen(key) != 1)
break;
if (CheatCodes[i].code[CheatIndex] == toupper(key[0])) {
CheatIndex++;
if (CheatCodes[i].code[CheatIndex] == 0) {
PlaySound(SND_BONUS);
switch (i) {
case 0:
case 4:
GiveKey(0);
GiveKey(1);
gamestate.godmode = TRUE;
break;
case 1:
gamestate.godmode^=TRUE;
break;
case 2:
gamestate.machinegun = TRUE;
gamestate.chaingun = TRUE;
gamestate.flamethrower = TRUE;
gamestate.missile = TRUE;
GiveAmmo(gamestate.maxammo);
GiveGas(99);
GiveMissile(99);
break;
case 3:
gamestate.maxammo = 999;
GiveAmmo(999);
break;
case 5:
GiveKey(0);
GiveKey(1);
break;
case 6:
playstate=EX_WARPED;
nextmap = gamestate.mapon+1;
if (MapListPtr->MaxMap<=nextmap)
nextmap = 0;
break;
case 7:
ShowPush ^= TRUE;
break;
}
CheatIndex = 0;
}
break;
}
}
if (i == CheatCount)
CheatIndex = 0;
}
joystick1 = 0;
if (press == 0) {
switch(keycode) {
case XK_1:
gamestate.pendingweapon = WP_KNIFE;
break;
case XK_2:
if (gamestate.ammo) {
gamestate.pendingweapon = WP_PISTOL;
}
break;
case XK_3:
if (gamestate.ammo && gamestate.machinegun) {
gamestate.pendingweapon = WP_MACHINEGUN;
}
break;
case XK_4:
if (gamestate.ammo && gamestate.chaingun) {
gamestate.pendingweapon = WP_CHAINGUN;
}
break;
case XK_5:
if (gamestate.gas && gamestate.flamethrower) {
gamestate.pendingweapon = WP_FLAMETHROWER;
}
break;
case XK_6:
if (gamestate.missiles && gamestate.missile) {
gamestate.pendingweapon = WP_MISSILE;
}
break;
case XK_period:
case XK_slash:
joystick1 = JOYPAD_START;
break;
case XK_Escape:
Quit(NULL); /* fast way out */
}
}
if (keys[SC_CURSORUPLEFT])
joystick1 |= (JOYPAD_UP|JOYPAD_LFT);
if (keys[SC_CURSORUP])
joystick1 |= JOYPAD_UP;
if (keys[SC_CURSORUPRIGHT])
joystick1 |= (JOYPAD_UP|JOYPAD_RGT);
if (keys[SC_CURSORRIGHT])
joystick1 |= JOYPAD_RGT;
if (keys[SC_CURSORDOWNRIGHT])
joystick1 |= (JOYPAD_DN|JOYPAD_RGT);
if (keys[SC_CURSORDOWN])
joystick1 |= JOYPAD_DN;
if (keys[SC_CURSORDOWNLEFT])
joystick1 |= (JOYPAD_DN|JOYPAD_LFT);
if (keys[SC_CURSORLEFT])
joystick1 |= JOYPAD_LFT;
if (keys[SC_CURSORBLOCKLEFT])
joystick1 |= JOYPAD_LFT;
if (keys[SC_CURSORBLOCKRIGHT])
joystick1 |= JOYPAD_RGT;
if (keys[SC_CURSORBLOCKUP])
joystick1 |= JOYPAD_UP;
if (keys[SC_CURSORBLOCKDOWN])
joystick1 |= JOYPAD_DN;
if (keys[SC_KEYPADENTER])
joystick1 |= JOYPAD_A;
if (keys[SC_ENTER])
joystick1 |= JOYPAD_A;
if (keys[SC_SPACE])
joystick1 |= JOYPAD_A;
if (keys[SC_LEFTALT])
joystick1 |= JOYPAD_TR;
if (keys[SC_RIGHTALT])
joystick1 |= JOYPAD_TR;
if (keys[SC_LEFTCONTROL])
joystick1 |= JOYPAD_B;
if (keys[SC_RIGHTCONTROL])
joystick1 |= JOYPAD_B;
if (keys[SC_LEFTSHIFT])
joystick1 |= (JOYPAD_X|JOYPAD_Y);
if (keys[SC_RIGHTSHIFT])
joystick1 |= (JOYPAD_X|JOYPAD_Y);
}
if ((joystick1 & (JOYPAD_LFT|JOYPAD_RGT)) == (JOYPAD_LFT|JOYPAD_RGT))
joystick1 &= ~(JOYPAD_LFT|JOYPAD_RGT);
if ((joystick1 & (JOYPAD_UP|JOYPAD_DN)) == (JOYPAD_UP|JOYPAD_DN))
joystick1 &= ~(JOYPAD_UP|JOYPAD_DN);
if (joystick1 & JOYPAD_TR) {
if (joystick1 & JOYPAD_LFT) {
joystick1 = (joystick1 & ~(JOYPAD_TR|JOYPAD_LFT)) | JOYPAD_TL;
} else if (joystick1 & JOYPAD_RGT) {
joystick1 = joystick1 & ~JOYPAD_RGT;
} else {
joystick1 &= ~JOYPAD_TR;
}
}
}
int HandleEvents()
{
XEvent event;
int ret = 0;
if (XPending(dpy)) {
do {
XNextEvent(dpy, &event);
switch(event.type) {
case KeyPress:
keyboard_handler(XKeycodeToKeysym(dpy, event.xkey.keycode, 0), 1);
ret = 1;
break;
case KeyRelease:
keyboard_handler(XKeycodeToKeysym(dpy, event.xkey.keycode, 0), 0);
ret = 0;
break;
case Expose:
BlastScreen();
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteWindow)
Quit(NULL);
break;
default:
break;
}
} while (XPending(dpy));
}
return ret;
}
void ReadSystemJoystick()
{
RSJ = 1;
HandleEvents();
}
int DoEvents()
{
RSJ = 0;
if (HandleEvents()) {
if (keys[SC_B]) { /* Special */
return 'B';
}
return 1;
}
return 0;
}
Word ChooseGameDiff()
{
/* 0 = easy, 1 = normal, 2 = hard, 3 = death incarnate */
difficulty = 1;
SetAPalette(rGamePal);
return 1;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment