summaryrefslogtreecommitdiff
path: root/src/doom
diff options
context:
space:
mode:
authorSimon Howard2008-09-07 20:33:36 +0000
committerSimon Howard2008-09-07 20:33:36 +0000
commitcf7b4fab6313cd2162cb0bd3f28596fbdc2fffd3 (patch)
tree3af7945fdf4a94387fe8cac9c2e4db589cbc88c3 /src/doom
parent20ea83f058cb0ad8463ee6304df974b4ec55404a (diff)
downloadchocolate-doom-cf7b4fab6313cd2162cb0bd3f28596fbdc2fffd3.tar.gz
chocolate-doom-cf7b4fab6313cd2162cb0bd3f28596fbdc2fffd3.tar.bz2
chocolate-doom-cf7b4fab6313cd2162cb0bd3f28596fbdc2fffd3.zip
Move m_bbox.[ch], f_wipe.[ch] to doom/
Subversion-branch: /branches/raven-branch Subversion-revision: 1209
Diffstat (limited to 'src/doom')
-rw-r--r--src/doom/Makefile.am2
-rw-r--r--src/doom/f_wipe.c302
-rw-r--r--src/doom/f_wipe.h71
-rw-r--r--src/doom/m_bbox.c62
-rw-r--r--src/doom/m_bbox.h55
5 files changed, 492 insertions, 0 deletions
diff --git a/src/doom/Makefile.am b/src/doom/Makefile.am
index dfba05a7..4d95266e 100644
--- a/src/doom/Makefile.am
+++ b/src/doom/Makefile.am
@@ -17,10 +17,12 @@ dstrings.c dstrings.h \
d_textur.h \
d_think.h \
f_finale.c f_finale.h \
+f_wipe.c f_wipe.h \
g_game.c g_game.h \
hu_lib.c hu_lib.h \
hu_stuff.c hu_stuff.h \
info.c info.h \
+m_bbox.c m_bbox.h \
m_menu.c m_menu.h \
p_ceilng.c \
p_doors.c \
diff --git a/src/doom/f_wipe.c b/src/doom/f_wipe.c
new file mode 100644
index 00000000..2ab66848
--- /dev/null
+++ b/src/doom/f_wipe.c
@@ -0,0 +1,302 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 2005 Simon Howard
+//
+// 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.
+//
+// DESCRIPTION:
+// Mission begin melt/wipe screen special effect.
+//
+//-----------------------------------------------------------------------------
+
+#include <string.h>
+
+#include "z_zone.h"
+#include "i_video.h"
+#include "v_video.h"
+#include "m_random.h"
+
+#include "doomtype.h"
+
+#include "f_wipe.h"
+
+//
+// SCREEN WIPE PACKAGE
+//
+
+// when zero, stop the wipe
+static boolean go = 0;
+
+static byte* wipe_scr_start;
+static byte* wipe_scr_end;
+static byte* wipe_scr;
+
+
+void
+wipe_shittyColMajorXform
+( short* array,
+ int width,
+ int height )
+{
+ int x;
+ int y;
+ short* dest;
+
+ dest = (short*) Z_Malloc(width*height*2, PU_STATIC, 0);
+
+ for(y=0;y<height;y++)
+ for(x=0;x<width;x++)
+ dest[x*height+y] = array[y*width+x];
+
+ memcpy(array, dest, width*height*2);
+
+ Z_Free(dest);
+
+}
+
+int
+wipe_initColorXForm
+( int width,
+ int height,
+ int ticks )
+{
+ memcpy(wipe_scr, wipe_scr_start, width*height);
+ return 0;
+}
+
+int
+wipe_doColorXForm
+( int width,
+ int height,
+ int ticks )
+{
+ boolean changed;
+ byte* w;
+ byte* e;
+ int newval;
+
+ changed = false;
+ w = wipe_scr;
+ e = wipe_scr_end;
+
+ while (w!=wipe_scr+width*height)
+ {
+ if (*w != *e)
+ {
+ if (*w > *e)
+ {
+ newval = *w - ticks;
+ if (newval < *e)
+ *w = *e;
+ else
+ *w = newval;
+ changed = true;
+ }
+ else if (*w < *e)
+ {
+ newval = *w + ticks;
+ if (newval > *e)
+ *w = *e;
+ else
+ *w = newval;
+ changed = true;
+ }
+ }
+ w++;
+ e++;
+ }
+
+ return !changed;
+
+}
+
+int
+wipe_exitColorXForm
+( int width,
+ int height,
+ int ticks )
+{
+ return 0;
+}
+
+
+static int* y;
+
+int
+wipe_initMelt
+( int width,
+ int height,
+ int ticks )
+{
+ int i, r;
+
+ // copy start screen to main screen
+ memcpy(wipe_scr, wipe_scr_start, width*height);
+
+ // makes this wipe faster (in theory)
+ // to have stuff in column-major format
+ wipe_shittyColMajorXform((short*)wipe_scr_start, width/2, height);
+ wipe_shittyColMajorXform((short*)wipe_scr_end, width/2, height);
+
+ // setup initial column positions
+ // (y<0 => not ready to scroll yet)
+ y = (int *) Z_Malloc(width*sizeof(int), PU_STATIC, 0);
+ y[0] = -(M_Random()%16);
+ for (i=1;i<width;i++)
+ {
+ r = (M_Random()%3) - 1;
+ y[i] = y[i-1] + r;
+ if (y[i] > 0) y[i] = 0;
+ else if (y[i] == -16) y[i] = -15;
+ }
+
+ return 0;
+}
+
+int
+wipe_doMelt
+( int width,
+ int height,
+ int ticks )
+{
+ int i;
+ int j;
+ int dy;
+ int idx;
+
+ short* s;
+ short* d;
+ boolean done = true;
+
+ width/=2;
+
+ while (ticks--)
+ {
+ for (i=0;i<width;i++)
+ {
+ if (y[i]<0)
+ {
+ y[i]++; done = false;
+ }
+ else if (y[i] < height)
+ {
+ dy = (y[i] < 16) ? y[i]+1 : 8;
+ if (y[i]+dy >= height) dy = height - y[i];
+ s = &((short *)wipe_scr_end)[i*height+y[i]];
+ d = &((short *)wipe_scr)[y[i]*width+i];
+ idx = 0;
+ for (j=dy;j;j--)
+ {
+ d[idx] = *(s++);
+ idx += width;
+ }
+ y[i] += dy;
+ s = &((short *)wipe_scr_start)[i*height];
+ d = &((short *)wipe_scr)[y[i]*width+i];
+ idx = 0;
+ for (j=height-y[i];j;j--)
+ {
+ d[idx] = *(s++);
+ idx += width;
+ }
+ done = false;
+ }
+ }
+ }
+
+ return done;
+
+}
+
+int
+wipe_exitMelt
+( int width,
+ int height,
+ int ticks )
+{
+ Z_Free(y);
+ return 0;
+}
+
+int
+wipe_StartScreen
+( int x,
+ int y,
+ int width,
+ int height )
+{
+ wipe_scr_start = screens[2];
+ I_ReadScreen(wipe_scr_start);
+ return 0;
+}
+
+int
+wipe_EndScreen
+( int x,
+ int y,
+ int width,
+ int height )
+{
+ wipe_scr_end = screens[3];
+ I_ReadScreen(wipe_scr_end);
+ V_DrawBlock(x, y, 0, width, height, wipe_scr_start); // restore start scr.
+ return 0;
+}
+
+int
+wipe_ScreenWipe
+( int wipeno,
+ int x,
+ int y,
+ int width,
+ int height,
+ int ticks )
+{
+ int rc;
+ static int (*wipes[])(int, int, int) =
+ {
+ wipe_initColorXForm, wipe_doColorXForm, wipe_exitColorXForm,
+ wipe_initMelt, wipe_doMelt, wipe_exitMelt
+ };
+
+ void V_MarkRect(int, int, int, int);
+
+ // initial stuff
+ if (!go)
+ {
+ go = 1;
+ // wipe_scr = (byte *) Z_Malloc(width*height, PU_STATIC, 0); // DEBUG
+ wipe_scr = screens[0];
+ (*wipes[wipeno*3])(width, height, ticks);
+ }
+
+ // do a piece of wipe-in
+ V_MarkRect(0, 0, width, height);
+ rc = (*wipes[wipeno*3+1])(width, height, ticks);
+ // V_DrawBlock(x, y, 0, width, height, wipe_scr); // DEBUG
+
+ // final stuff
+ if (rc)
+ {
+ go = 0;
+ (*wipes[wipeno*3+2])(width, height, ticks);
+ }
+
+ return !go;
+
+}
diff --git a/src/doom/f_wipe.h b/src/doom/f_wipe.h
new file mode 100644
index 00000000..9045be3f
--- /dev/null
+++ b/src/doom/f_wipe.h
@@ -0,0 +1,71 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 2005 Simon Howard
+//
+// 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.
+//
+// DESCRIPTION:
+// Mission start screen wipe/melt, special effects.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __F_WIPE_H__
+#define __F_WIPE_H__
+
+//
+// SCREEN WIPE PACKAGE
+//
+
+enum
+{
+ // simple gradual pixel change for 8-bit only
+ wipe_ColorXForm,
+
+ // weird screen melt
+ wipe_Melt,
+
+ wipe_NUMWIPES
+};
+
+int
+wipe_StartScreen
+( int x,
+ int y,
+ int width,
+ int height );
+
+
+int
+wipe_EndScreen
+( int x,
+ int y,
+ int width,
+ int height );
+
+
+int
+wipe_ScreenWipe
+( int wipeno,
+ int x,
+ int y,
+ int width,
+ int height,
+ int ticks );
+
+#endif
diff --git a/src/doom/m_bbox.c b/src/doom/m_bbox.c
new file mode 100644
index 00000000..02389209
--- /dev/null
+++ b/src/doom/m_bbox.c
@@ -0,0 +1,62 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 2005 Simon Howard
+//
+// 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.
+//
+// DESCRIPTION:
+// Main loop menu stuff.
+// Random number LUT.
+// Default Config File.
+// PCX Screenshots.
+//
+//-----------------------------------------------------------------------------
+
+
+
+#include "m_bbox.h"
+
+
+
+
+void M_ClearBox (fixed_t *box)
+{
+ box[BOXTOP] = box[BOXRIGHT] = INT_MIN;
+ box[BOXBOTTOM] = box[BOXLEFT] = INT_MAX;
+}
+
+void
+M_AddToBox
+( fixed_t* box,
+ fixed_t x,
+ fixed_t y )
+{
+ if (x<box[BOXLEFT])
+ box[BOXLEFT] = x;
+ else if (x>box[BOXRIGHT])
+ box[BOXRIGHT] = x;
+ if (y<box[BOXBOTTOM])
+ box[BOXBOTTOM] = y;
+ else if (y>box[BOXTOP])
+ box[BOXTOP] = y;
+}
+
+
+
+
+
diff --git a/src/doom/m_bbox.h b/src/doom/m_bbox.h
new file mode 100644
index 00000000..3788044b
--- /dev/null
+++ b/src/doom/m_bbox.h
@@ -0,0 +1,55 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 2005 Simon Howard
+//
+// 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.
+//
+// DESCRIPTION:
+// Nil.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __M_BBOX__
+#define __M_BBOX__
+
+#include <limits.h>
+
+#include "m_fixed.h"
+
+
+// Bounding box coordinate storage.
+enum
+{
+ BOXTOP,
+ BOXBOTTOM,
+ BOXLEFT,
+ BOXRIGHT
+}; // bbox coordinates
+
+// Bounding box functions.
+void M_ClearBox (fixed_t* box);
+
+void
+M_AddToBox
+( fixed_t* box,
+ fixed_t x,
+ fixed_t y );
+
+
+#endif