summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJames Haley2010-01-26 00:59:02 +0000
committerJames Haley2010-01-26 00:59:02 +0000
commitb80409202d07732ec201c9816887262b505b81d4 (patch)
tree364dcb86f2c22411a720447bfa21c4de9191ff6f /src
parent66e8dc63bd0b384c99f0d0ff60b3d75c42d441b1 (diff)
parent8f6edc1f7402215c5e38d1f03939ce6b5ff5e3ae (diff)
downloadchocolate-doom-b80409202d07732ec201c9816887262b505b81d4.tar.gz
chocolate-doom-b80409202d07732ec201c9816887262b505b81d4.tar.bz2
chocolate-doom-b80409202d07732ec201c9816887262b505b81d4.zip
Merge from raven-branch
Subversion-branch: /branches/strife-branch Subversion-revision: 1825
Diffstat (limited to 'src')
-rw-r--r--src/d_iwad.c2
-rw-r--r--src/d_iwad.h2
-rw-r--r--src/deh_str.c4
-rw-r--r--src/doom/d_main.c4
-rw-r--r--src/doom/d_net.h2
-rw-r--r--src/doom/deh_defs.h2
-rw-r--r--src/doom/deh_main.c4
-rw-r--r--src/doom/deh_ptr.c2
-rw-r--r--src/doom/p_doors.c37
-rw-r--r--src/doom/p_map.c3
-rw-r--r--src/doom/p_spec.c150
-rw-r--r--src/doomtype.h4
-rw-r--r--src/heretic/am_data.h12
-rw-r--r--src/heretic/am_map.c2
-rw-r--r--src/heretic/doomdef.h122
-rw-r--r--src/heretic/p_enemy.c8
-rw-r--r--src/heretic/p_mobj.c6
-rw-r--r--src/heretic/p_pspr.c12
-rw-r--r--src/heretic/r_data.c20
-rw-r--r--src/hexen/am_data.h141
-rw-r--r--src/hexen/m_random.h84
-rw-r--r--src/hexen/p_mobj.c4
-rw-r--r--src/hexen/r_data.c20
-rw-r--r--src/i_cdmus.c2
-rw-r--r--src/i_joystick.c2
-rw-r--r--src/i_main.c6
-rw-r--r--src/i_pcsound.c18
-rw-r--r--src/i_sdlmusic.c74
-rw-r--r--src/i_sdlsound.c49
-rw-r--r--src/i_sound.c38
-rw-r--r--src/i_system.h1
-rw-r--r--src/i_timer.c2
-rw-r--r--src/i_timer.h2
-rw-r--r--src/i_video.c102
-rw-r--r--src/m_config.c9
-rw-r--r--src/m_misc.c8
-rw-r--r--src/m_misc.h1
-rw-r--r--src/net_client.c4
-rw-r--r--src/net_common.c4
-rw-r--r--src/net_defs.h4
-rw-r--r--src/net_gui.c2
-rw-r--r--src/net_loop.c4
-rw-r--r--src/net_sdl.c2
-rw-r--r--src/net_server.c14
-rw-r--r--src/net_server.h2
-rw-r--r--src/setup/Makefile.am4
-rw-r--r--src/setup/execute.c123
-rw-r--r--src/setup/joystick.c2
-rw-r--r--src/setup/mainmenu.c9
-rw-r--r--src/setup/mode.c12
-rw-r--r--src/setup/multiplayer.c2
-rw-r--r--src/setup/setup-manifest.xml.in2
-rw-r--r--src/setup/sound.c29
-rw-r--r--src/w_merge.c2
54 files changed, 746 insertions, 436 deletions
diff --git a/src/d_iwad.c b/src/d_iwad.c
index 429ab129..fe60866b 100644
--- a/src/d_iwad.c
+++ b/src/d_iwad.c
@@ -19,7 +19,7 @@
// 02111-1307, USA.
//
// DESCRIPTION:
-// Search for and locate an IWAD file, and initialise according
+// Search for and locate an IWAD file, and initialize according
// to the IWAD type.
//
//-----------------------------------------------------------------------------
diff --git a/src/d_iwad.h b/src/d_iwad.h
index 055463a9..f95b4258 100644
--- a/src/d_iwad.h
+++ b/src/d_iwad.h
@@ -19,7 +19,7 @@
// 02111-1307, USA.
//
// DESCRIPTION:
-// Find IWAD and initialise according to IWAD type.
+// Find IWAD and initialize according to IWAD type.
//
//-----------------------------------------------------------------------------
diff --git a/src/deh_str.c b/src/deh_str.c
index 3ede4508..0baaa7e8 100644
--- a/src/deh_str.c
+++ b/src/deh_str.c
@@ -66,7 +66,7 @@ char *DEH_String(char *s)
{
int entry;
- // Fallback if we have not initialised the hash table yet
+ // Fallback if we have not initialized the hash table yet
if (hash_table_length < 0)
return s;
@@ -164,7 +164,7 @@ void DEH_AddStringReplacement(char *from_text, char *to_text)
{
deh_substitution_t *sub;
- // Initialise the hash table if this is the first time
+ // Initialize the hash table if this is the first time
if (hash_table_length < 0)
{
diff --git a/src/doom/d_main.c b/src/doom/d_main.c
index 9fa9ae3b..4e7812cc 100644
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -901,7 +901,7 @@ static struct
{ NULL, NULL, 0},
};
-// Initialise the game version
+// Initialize the game version
static void InitGameVersion(void)
{
@@ -1701,7 +1701,7 @@ void D_DoomMain (void)
I_InitJoystick();
#ifdef FEATURE_MULTIPLAYER
- printf ("NET_Init: Initialise network subsystem.\n");
+ printf ("NET_Init: Init network subsystem.\n");
NET_Init ();
#endif
diff --git a/src/doom/d_net.h b/src/doom/d_net.h
index 6d162d20..f801d216 100644
--- a/src/doom/d_net.h
+++ b/src/doom/d_net.h
@@ -42,7 +42,7 @@ void D_QuitNetGame (void);
//? how many ticks to run?
void TryRunTics (void);
-// Called at start of game loop to initialise timers
+// Called at start of game loop to initialize timers
void D_StartGameLoop(void);
extern boolean drone;
diff --git a/src/doom/deh_defs.h b/src/doom/deh_defs.h
index a6650544..e7b76182 100644
--- a/src/doom/deh_defs.h
+++ b/src/doom/deh_defs.h
@@ -41,7 +41,7 @@ struct deh_section_s
{
char *name;
- // Called on startup to initialise code
+ // Called on startup to initialize code
deh_section_init_t init;
diff --git a/src/doom/deh_main.c b/src/doom/deh_main.c
index 59e63ea3..63cae460 100644
--- a/src/doom/deh_main.c
+++ b/src/doom/deh_main.c
@@ -110,7 +110,7 @@ void DEH_Checksum(md5_digest_t digest)
// Called on startup to call the Init functions
-static void InitialiseSections(void)
+static void InitializeSections(void)
{
unsigned int i;
@@ -385,7 +385,7 @@ void DEH_Init(void)
char *filename;
int p;
- InitialiseSections();
+ InitializeSections();
//!
// @category mod
diff --git a/src/doom/deh_ptr.c b/src/doom/deh_ptr.c
index 87daf7d8..d757a178 100644
--- a/src/doom/deh_ptr.c
+++ b/src/doom/deh_ptr.c
@@ -56,7 +56,7 @@ static void DEH_PointerInit(void)
{
int i;
- // Initialise list of dehacked pointers
+ // Initialize list of dehacked pointers
for (i=0; i<NUMSTATES; ++i)
codeptrs[i] = states[i].action;
diff --git a/src/doom/p_doors.c b/src/doom/p_doors.c
index b681a8d0..89b65328 100644
--- a/src/doom/p_doors.c
+++ b/src/doom/p_doors.c
@@ -420,8 +420,41 @@ EV_VerticalDoor
{
if (!thing->player)
return; // JDC: bad guys never close doors
-
- door->direction = -1; // start going down immediately
+
+ // When is a door not a door?
+ // In Vanilla, door->direction is set, even though
+ // "specialdata" might not actually point at a door.
+
+ if (door->thinker.function.acp1 == (actionf_p1) T_VerticalDoor)
+ {
+ door->direction = -1; // start going down immediately
+ }
+ else if (door->thinker.function.acp1 == (actionf_p1) T_PlatRaise)
+ {
+ // Erm, this is a plat, not a door.
+ // This notably causes a problem in ep1-0500.lmp where
+ // a plat and a door are cross-referenced; the door
+ // doesn't open on 64-bit.
+ // The direction field in vldoor_t corresponds to the wait
+ // field in plat_t. Let's set that to -1 instead.
+
+ plat_t *plat;
+
+ plat = (plat_t *) door;
+ plat->wait = -1;
+ }
+ else
+ {
+ // This isn't a door OR a plat. Now we're in trouble.
+
+ fprintf(stderr, "EV_VerticalDoor: Tried to close "
+ "something that wasn't a door.\n");
+
+ // Try closing it anyway. At least it will work on 32-bit
+ // machines.
+
+ door->direction = -1;
+ }
}
return;
}
diff --git a/src/doom/p_map.c b/src/doom/p_map.c
index 9198d59e..3f88aabc 100644
--- a/src/doom/p_map.c
+++ b/src/doom/p_map.c
@@ -36,6 +36,7 @@
#include "doomdef.h"
#include "m_argv.h"
+#include "m_misc.h"
#include "p_local.h"
#include "s_sound.h"
@@ -1412,7 +1413,7 @@ static void SpechitOverrun(line_t *ld)
if (p > 0)
{
- baseaddr = atoi(myargv[p+1]);
+ M_StrToInt(myargv[p+1], (int *) &baseaddr);
}
else
{
diff --git a/src/doom/p_spec.c b/src/doom/p_spec.c
index 27042b5d..37beb850 100644
--- a/src/doom/p_spec.c
+++ b/src/doom/p_spec.c
@@ -38,6 +38,7 @@
#include "i_system.h"
#include "z_zone.h"
#include "m_argv.h"
+#include "m_misc.h"
#include "m_random.h"
#include "w_wad.h"
@@ -1169,10 +1170,94 @@ void P_UpdateSpecials (void)
memset(&buttonlist[i],0,sizeof(button_t));
}
}
-
}
+//
+// Donut overrun emulation
+//
+// Derived from the code from PrBoom+. Thanks go to Andrey Budko (entryway)
+// as usual :-)
+//
+
+#define DONUT_FLOORHEIGHT_DEFAULT 0x00000000
+#define DONUT_FLOORPIC_DEFAULT 0x16
+
+static void DonutOverrun(fixed_t *s3_floorheight, short *s3_floorpic,
+ line_t *line, sector_t *pillar_sector)
+{
+ static int first = 1;
+ static int tmp_s3_floorheight;
+ static int tmp_s3_floorpic;
+
+ extern int numflats;
+
+ if (first)
+ {
+ int p;
+
+ // This is the first time we have had an overrun.
+ first = 0;
+
+ // Default values
+ tmp_s3_floorheight = DONUT_FLOORHEIGHT_DEFAULT;
+ tmp_s3_floorpic = DONUT_FLOORPIC_DEFAULT;
+
+ //!
+ // @category compat
+ // @arg <x> <y>
+ //
+ // Use the specified magic values when emulating behavior caused
+ // by memory overruns from improperly constructed donuts.
+ // In Vanilla Doom this can differ depending on the operating
+ // system. The default (if this option is not specified) is to
+ // emulate the behavior when running under Windows 98.
+
+ p = M_CheckParm("-donut");
+
+ if (p > 0 && p < myargc - 2)
+ {
+ // Dump of needed memory: (fixed_t)0000:0000 and (short)0000:0008
+ //
+ // C:\>debug
+ // -d 0:0
+ //
+ // DOS 6.22:
+ // 0000:0000 (57 92 19 00) F4 06 70 00-(16 00)
+ // DOS 7.1:
+ // 0000:0000 (9E 0F C9 00) 65 04 70 00-(16 00)
+ // Win98:
+ // 0000:0000 (00 00 00 00) 65 04 70 00-(16 00)
+ // DOSBox under XP:
+ // 0000:0000 (00 00 00 F1) ?? ?? ?? 00-(07 00)
+
+ M_StrToInt(myargv[p + 1], &tmp_s3_floorheight);
+ M_StrToInt(myargv[p + 2], &tmp_s3_floorpic);
+
+ if (tmp_s3_floorpic >= numflats)
+ {
+ fprintf(stderr,
+ "DonutOverrun: The second parameter for \"-donut\" "
+ "switch should be greater than 0 and less than number "
+ "of flats (%d). Using default value (%d) instead. \n",
+ numflats, DONUT_FLOORPIC_DEFAULT);
+ tmp_s3_floorpic = DONUT_FLOORPIC_DEFAULT;
+ }
+ }
+ }
+
+ /*
+ fprintf(stderr,
+ "Linedef: %d; Sector: %d; "
+ "New floor height: %d; New floor pic: %d\n",
+ line->iLineID, pillar_sector->iSectorID,
+ tmp_s3_floorheight >> 16, tmp_s3_floorpic);
+ */
+
+ *s3_floorheight = (fixed_t) tmp_s3_floorheight;
+ *s3_floorpic = (short) tmp_s3_floorpic;
+}
+
//
// Special Stuff that can not be categorized
@@ -1186,26 +1271,67 @@ int EV_DoDonut(line_t* line)
int rtn;
int i;
floormove_t* floor;
-
+ fixed_t s3_floorheight;
+ short s3_floorpic;
+
secnum = -1;
rtn = 0;
while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)
{
s1 = &sectors[secnum];
-
+
// ALREADY MOVING? IF SO, KEEP GOING...
if (s1->specialdata)
continue;
-
+
rtn = 1;
s2 = getNextSector(s1->lines[0],s1);
- for (i = 0;i < s2->linecount;i++)
+
+ // Vanilla Doom does not check if the linedef is one sided. The
+ // game does not crash, but reads invalid memory and causes the
+ // sector floor to move "down" to some unknown height.
+ // DOSbox prints a warning about an invalid memory access.
+ //
+ // I'm not sure exactly what invalid memory is being read. This
+ // isn't something that should be done, anyway.
+ // Just print a warning and return.
+
+ if (s2 == NULL)
+ {
+ fprintf(stderr,
+ "EV_DoDonut: linedef had no second sidedef! "
+ "Unexpected behavior may occur in Vanilla Doom. \n");
+ break;
+ }
+
+ for (i = 0; i < s2->linecount; i++)
{
- if ((!s2->lines[i]->flags & ML_TWOSIDED) ||
- (s2->lines[i]->backsector == s1))
- continue;
s3 = s2->lines[i]->backsector;
-
+
+ if (s3 == s1)
+ continue;
+
+ if (s3 == NULL)
+ {
+ // e6y
+ // s3 is NULL, so
+ // s3->floorheight is an int at 0000:0000
+ // s3->floorpic is a short at 0000:0008
+ // Trying to emulate
+
+ fprintf(stderr,
+ "EV_DoDonut: WARNING: emulating buffer overrun due to "
+ "NULL back sector. "
+ "Unexpected behavior may occur in Vanilla Doom.\n");
+
+ DonutOverrun(&s3_floorheight, &s3_floorpic, line, s1);
+ }
+ else
+ {
+ s3_floorheight = s3->floorheight;
+ s3_floorpic = s3->floorpic;
+ }
+
// Spawn rising slime
floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0);
P_AddThinker (&floor->thinker);
@@ -1216,9 +1342,9 @@ int EV_DoDonut(line_t* line)
floor->direction = 1;
floor->sector = s2;
floor->speed = FLOORSPEED / 2;
- floor->texture = s3->floorpic;
+ floor->texture = s3_floorpic;
floor->newspecial = 0;
- floor->floordestheight = s3->floorheight;
+ floor->floordestheight = s3_floorheight;
// Spawn lowering donut-hole
floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0);
@@ -1230,7 +1356,7 @@ int EV_DoDonut(line_t* line)
floor->direction = -1;
floor->sector = s1;
floor->speed = FLOORSPEED / 2;
- floor->floordestheight = s3->floorheight;
+ floor->floordestheight = s3_floorheight;
break;
}
}
diff --git a/src/doomtype.h b/src/doomtype.h
index b79bd687..b458c1cd 100644
--- a/src/doomtype.h
+++ b/src/doomtype.h
@@ -36,7 +36,9 @@
#ifdef _WIN32
#define snprintf _snprintf
+#if _MSC_VER < 1400 /* not needed for Visual Studio 2008 */
#define vsnprintf _vsnprintf
+#endif
#define strcasecmp stricmp
#define strncasecmp strnicmp
@@ -50,7 +52,7 @@
//
// The packed attribute forces structures to be packed into the minimum
// space necessary. If this is not done, the compiler may align structure
-// fields differently to optimise memory access, inflating the overall
+// fields differently to optimize memory access, inflating the overall
// structure size. It is important to use the packed attribute on certain
// structures where alignment is important, particularly data read/written
// to disk.
diff --git a/src/heretic/am_data.h b/src/heretic/am_data.h
index 1f83d876..342f06a9 100644
--- a/src/heretic/am_data.h
+++ b/src/heretic/am_data.h
@@ -92,18 +92,18 @@ mline_t cheat_player_arrow[] = {
#define R (FRACUNIT)
mline_t triangle_guy[] = {
- { { -.867*R, -.5*R }, { .867*R, -.5*R } },
- { { .867*R, -.5*R } , { 0, R } },
- { { 0, R }, { -.867*R, -.5*R } }
+ { { (fixed_t)(-.867*R), (fixed_t)(-.5*R) }, { (fixed_t)(.867*R ), (fixed_t)(-.5*R) } },
+ { { (fixed_t)(.867*R ), (fixed_t)(-.5*R) }, { (fixed_t)(0 ), (fixed_t)(R ) } },
+ { { (fixed_t)(0 ), (fixed_t)(R ) }, { (fixed_t)(-.867*R), (fixed_t)(-.5*R) } }
};
#undef R
#define NUMTRIANGLEGUYLINES (sizeof(triangle_guy)/sizeof(mline_t))
#define R (FRACUNIT)
mline_t thintriangle_guy[] = {
- { { -.5*R, -.7*R }, { R, 0 } },
- { { R, 0 }, { -.5*R, .7*R } },
- { { -.5*R, .7*R }, { -.5*R, -.7*R } }
+ { { (fixed_t)(-.5*R), (fixed_t)(-.7*R) }, { (fixed_t)(R ), (fixed_t)(0 ) } },
+ { { (fixed_t)(R ), (fixed_t)(0 ) }, { (fixed_t)(-.5*R), (fixed_t)(.7*R ) } },
+ { { (fixed_t)(-.5*R), (fixed_t)(.7*R ) }, { (fixed_t)(-.5*R), (fixed_t)(-.7*R) } }
};
#undef R
#define NUMTHINTRIANGLEGUYLINES (sizeof(thintriangle_guy)/sizeof(mline_t))
diff --git a/src/heretic/am_map.c b/src/heretic/am_map.c
index aa1b273b..99a8e206 100644
--- a/src/heretic/am_map.c
+++ b/src/heretic/am_map.c
@@ -131,7 +131,7 @@ static fixed_t old_m_x, old_m_y;
static mpoint_t f_oldloc;
// used by MTOF to scale from map-to-frame-buffer coords
-static fixed_t scale_mtof = INITSCALEMTOF;
+static fixed_t scale_mtof = (fixed_t)INITSCALEMTOF;
// used by FTOM to scale from frame-buffer-to-map coords (=1/scale_mtof)
static fixed_t scale_ftom;
diff --git a/src/heretic/doomdef.h b/src/heretic/doomdef.h
index 0580f9b0..3f976c3d 100644
--- a/src/heretic/doomdef.h
+++ b/src/heretic/doomdef.h
@@ -205,74 +205,74 @@ typedef struct
// --- mobj.flags ---
-#define MF_SPECIAL 1 // call P_SpecialThing when touched
-#define MF_SOLID 2
+#define MF_SPECIAL 1 // call P_SpecialThing when touched
+#define MF_SOLID 2
#define MF_SHOOTABLE 4
-#define MF_NOSECTOR 8 // don't use the sector links
- // (invisible but touchable)
-#define MF_NOBLOCKMAP 16 // don't use the blocklinks
- // (inert but displayable)
-#define MF_AMBUSH 32
-#define MF_JUSTHIT 64 // try to attack right back
-#define MF_JUSTATTACKED 128 // take at least one step before attacking
-#define MF_SPAWNCEILING 256 // hang from ceiling instead of floor
-#define MF_NOGRAVITY 512 // don't apply gravity every tic
+#define MF_NOSECTOR 8 // don't use the sector links
+ // (invisible but touchable)
+#define MF_NOBLOCKMAP 16 // don't use the blocklinks
+ // (inert but displayable)
+#define MF_AMBUSH 32
+#define MF_JUSTHIT 64 // try to attack right back
+#define MF_JUSTATTACKED 128 // take at least one step before attacking
+#define MF_SPAWNCEILING 256 // hang from ceiling instead of floor
+#define MF_NOGRAVITY 512 // don't apply gravity every tic
// movement flags
-#define MF_DROPOFF 0x400 // allow jumps from high places
-#define MF_PICKUP 0x800 // for players to pick up items
-#define MF_NOCLIP 0x1000 // player cheat
-#define MF_SLIDE 0x2000 // keep info about sliding along walls
-#define MF_FLOAT 0x4000 // allow moves to any height, no gravity
-#define MF_TELEPORT 0x8000 // don't cross lines or look at heights
-#define MF_MISSILE 0x10000 // don't hit same species, explode on block
-
-#define MF_DROPPED 0x20000 // dropped by a demon, not level spawned
-#define MF_SHADOW 0x40000 // use translucent draw (shadow demons / invis)
-#define MF_NOBLOOD 0x80000 // don't bleed when shot (use puff)
-#define MF_CORPSE 0x100000 // don't stop moving halfway off a step
-#define MF_INFLOAT 0x200000 // floating to a height for a move, don't
- // auto float to target's height
-
-#define MF_COUNTKILL 0x400000 // count towards intermission kill total
-#define MF_COUNTITEM 0x800000 // count towards intermission item total
-
-#define MF_SKULLFLY 0x1000000 // skull in flight
-#define MF_NOTDMATCH 0x2000000 // don't spawn in death match (key cards)
-
-#define MF_TRANSLATION 0xc000000 // if 0x4 0x8 or 0xc, use a translation
+#define MF_DROPOFF 0x400 // allow jumps from high places
+#define MF_PICKUP 0x800 // for players to pick up items
+#define MF_NOCLIP 0x1000 // player cheat
+#define MF_SLIDE 0x2000 // keep info about sliding along walls
+#define MF_FLOAT 0x4000 // allow moves to any height, no gravity
+#define MF_TELEPORT 0x8000 // don't cross lines or look at heights
+#define MF_MISSILE 0x10000 // don't hit same species, explode on block
+
+#define MF_DROPPED 0x20000 // dropped by a demon, not level spawned
+#define MF_SHADOW 0x40000 // use translucent draw (shadow demons / invis)
+#define MF_NOBLOOD 0x80000 // don't bleed when shot (use puff)
+#define MF_CORPSE 0x100000 // don't stop moving halfway off a step
+#define MF_INFLOAT 0x200000 // floating to a height for a move, don't
+ // auto float to target's height
+
+#define MF_COUNTKILL 0x400000 // count towards intermission kill total
+#define MF_COUNTITEM 0x800000 // count towards intermission item total
+
+#define MF_SKULLFLY 0x1000000 // skull in flight
+#define MF_NOTDMATCH 0x2000000 // don't spawn in death match (key cards)
+
+#define MF_TRANSLATION 0xc000000 // if 0x4 0x8 or 0xc, use a translation
#define MF_TRANSSHIFT 26 // table for player colormaps
// --- mobj.flags2 ---
-#define MF2_LOGRAV 0x00000001 // alternate gravity setting
-#define MF2_WINDTHRUST 0x00000002 // gets pushed around by the wind
- // specials
-#define MF2_FLOORBOUNCE 0x00000004 // bounces off the floor
-#define MF2_THRUGHOST 0x00000008 // missile will pass through ghosts
-#define MF2_FLY 0x00000010 // fly mode is active
-#define MF2_FOOTCLIP 0x00000020 // if feet are allowed to be clipped
-#define MF2_SPAWNFLOAT 0x00000040 // spawn random float z
-#define MF2_NOTELEPORT 0x00000080 // does not teleport
-#define MF2_RIP 0x00000100 // missile rips through solid
- // targets
-#define MF2_PUSHABLE 0x00000200 // can be pushed by other moving
- // mobjs
-#define MF2_SLIDE 0x00000400 // slides against walls
-#define MF2_ONMOBJ 0x00000800 // mobj is resting on top of another
- // mobj
-#define MF2_PASSMOBJ 0x00001000 // Enable z block checking. If on,
- // this flag will allow the mobj to
- // pass over/under other mobjs.
-#define MF2_CANNOTPUSH 0x00002000 // cannot push other pushable mobjs
-#define MF2_FEETARECLIPPED 0x00004000 // a mobj's feet are now being cut
-#define MF2_BOSS 0x00008000 // mobj is a major boss
-#define MF2_FIREDAMAGE 0x00010000 // does fire damage
-#define MF2_NODMGTHRUST 0x00020000 // does not thrust target when
- // damaging
-#define MF2_TELESTOMP 0x00040000 // mobj can stomp another
-#define MF2_FLOATBOB 0x00080000 // use float bobbing z movement
-#define MF2_DONTDRAW 0X00100000 // don't generate a vissprite
+#define MF2_LOGRAV 0x00000001 // alternate gravity setting
+#define MF2_WINDTHRUST 0x00000002 // gets pushed around by the wind
+ // specials
+#define MF2_FLOORBOUNCE 0x00000004 // bounces off the floor
+#define MF2_THRUGHOST 0x00000008 // missile will pass through ghosts
+#define MF2_FLY 0x00000010 // fly mode is active
+#define MF2_FOOTCLIP 0x00000020 // if feet are allowed to be clipped
+#define MF2_SPAWNFLOAT 0x00000040 // spawn random float z
+#define MF2_NOTELEPORT 0x00000080 // does not teleport
+#define MF2_RIP 0x00000100 // missile rips through solid
+ // targets
+#define MF2_PUSHABLE 0x00000200 // can be pushed by other moving
+ // mobjs
+#define MF2_SLIDE 0x00000400 // slides against walls
+#define MF2_ONMOBJ 0x00000800 // mobj is resting on top of another
+ // mobj
+#define MF2_PASSMOBJ 0x00001000 // Enable z block checking. If on,
+ // this flag will allow the mobj to
+ // pass over/under other mobjs.
+#define MF2_CANNOTPUSH 0x00002000 // cannot push other pushable mobjs
+#define MF2_FEETARECLIPPED 0x00004000 // a mobj's feet are now being cut
+#define MF2_BOSS 0x00008000 // mobj is a major boss
+#define MF2_FIREDAMAGE 0x00010000 // does fire damage
+#define MF2_NODMGTHRUST 0x00020000 // does not thrust target when
+ // damaging
+#define MF2_TELESTOMP 0x00040000 // mobj can stomp another
+#define MF2_FLOATBOB 0x00080000 // use float bobbing z movement
+#define MF2_DONTDRAW 0X00100000 // don't generate a vissprite
//=============================================================================
typedef enum
diff --git a/src/heretic/p_enemy.c b/src/heretic/p_enemy.c
index 05566a07..6ad8cff0 100644
--- a/src/heretic/p_enemy.c
+++ b/src/heretic/p_enemy.c
@@ -1917,7 +1917,7 @@ void A_HeadIceImpact(mobj_t * ice)
angle >>= ANGLETOFINESHIFT;
shard->momx = FixedMul(shard->info->speed, finecosine[angle]);
shard->momy = FixedMul(shard->info->speed, finesine[angle]);
- shard->momz = -.6 * FRACUNIT;
+ shard->momz = (fixed_t)(-.6 * FRACUNIT);
P_CheckMissileSpawn(shard);
}
}
@@ -2507,7 +2507,7 @@ void A_VolcanoBlast(mobj_t * volcano)
angle >>= ANGLETOFINESHIFT;
blast->momx = FixedMul(1 * FRACUNIT, finecosine[angle]);
blast->momy = FixedMul(1 * FRACUNIT, finesine[angle]);
- blast->momz = (2.5 * FRACUNIT) + (P_Random() << 10);
+ blast->momz = (fixed_t)(2.5 * FRACUNIT) + (P_Random() << 10);
S_StartSound(blast, sfx_volsht);
P_CheckMissileSpawn(blast);
}
@@ -2540,8 +2540,8 @@ void A_VolcBallImpact(mobj_t * ball)
angle = i * ANG90;
tiny->angle = angle;
angle >>= ANGLETOFINESHIFT;
- tiny->momx = FixedMul(FRACUNIT * .7, finecosine[angle]);
- tiny->momy = FixedMul(FRACUNIT * .7, finesine[angle]);
+ tiny->momx = FixedMul((fixed_t)(FRACUNIT * .7), finecosine[angle]);
+ tiny->momy = FixedMul((fixed_t)(FRACUNIT * .7), finesine[angle]);
tiny->momz = FRACUNIT + (P_Random() << 9);
P_CheckMissileSpawn(tiny);
}
diff --git a/src/heretic/p_mobj.c b/src/heretic/p_mobj.c
index b5366501..e07ecf45 100644
--- a/src/heretic/p_mobj.c
+++ b/src/heretic/p_mobj.c
@@ -70,7 +70,7 @@ boolean P_SetMobjState(mobj_t * mobj, statenum_t state)
if (state == S_NULL)
{ // Remove mobj
- mobj->state = S_NULL;
+ mobj->state = (state_t *) S_NULL;
P_RemoveMobj(mobj);
return (false);
}
@@ -100,7 +100,7 @@ boolean P_SetMobjStateNF(mobj_t * mobj, statenum_t state)
if (state == S_NULL)
{ // Remove mobj
- mobj->state = S_NULL;
+ mobj->state = (state_t *) S_NULL;
P_RemoveMobj(mobj);
return (false);
}
@@ -1214,7 +1214,7 @@ void P_SpawnPuff(fixed_t x, fixed_t y, fixed_t z)
break;
case MT_GAUNTLETPUFF1:
case MT_GAUNTLETPUFF2:
- puff->momz = .8 * FRACUNIT;
+ puff->momz = (fixed_t)(.8 * FRACUNIT);
default:
break;
}
diff --git a/src/heretic/p_pspr.c b/src/heretic/p_pspr.c
index 07a04ac7..7f9660ac 100644
--- a/src/heretic/p_pspr.c
+++ b/src/heretic/p_pspr.c
@@ -1639,14 +1639,14 @@ void A_PhoenixPuff(mobj_t * actor)
puff = P_SpawnMobj(actor->x, actor->y, actor->z, MT_PHOENIXPUFF);
angle = actor->angle + ANG90;
angle >>= ANGLETOFINESHIFT;
- puff->momx = FixedMul(FRACUNIT * 1.3, finecosine[angle]);
- puff->momy = FixedMul(FRACUNIT * 1.3, finesine[angle]);
+ puff->momx = FixedMul((fixed_t)(FRACUNIT * 1.3), finecosine[angle]);
+ puff->momy = FixedMul((fixed_t)(FRACUNIT * 1.3), finesine[angle]);
puff->momz = 0;
puff = P_SpawnMobj(actor->x, actor->y, actor->z, MT_PHOENIXPUFF);
angle = actor->angle - ANG90;
angle >>= ANGLETOFINESHIFT;
- puff->momx = FixedMul(FRACUNIT * 1.3, finecosine[angle]);
- puff->momy = FixedMul(FRACUNIT * 1.3, finesine[angle]);
+ puff->momx = FixedMul((fixed_t)(FRACUNIT * 1.3), finecosine[angle]);
+ puff->momy = FixedMul((fixed_t)(FRACUNIT * 1.3), finesine[angle]);
puff->momz = 0;
}
@@ -1727,7 +1727,7 @@ void A_ShutdownPhoenixPL2(player_t * player, pspdef_t * psp)
void A_FlameEnd(mobj_t * actor)
{
- actor->momz += 1.5 * FRACUNIT;
+ actor->momz += (fixed_t)(1.5 * FRACUNIT);
}
//----------------------------------------------------------------------------
@@ -1738,7 +1738,7 @@ void A_FlameEnd(mobj_t * actor)
void A_FloatPuff(mobj_t * puff)
{
- puff->momz += 1.8 * FRACUNIT;
+ puff->momz += (fixed_t)(1.8 * FRACUNIT);
}
//---------------------------------------------------------------------------
diff --git a/src/heretic/r_data.c b/src/heretic/r_data.c
index 9846196a..ee005248 100644
--- a/src/heretic/r_data.c
+++ b/src/heretic/r_data.c
@@ -221,7 +221,7 @@ void R_GenerateLookup(int texnum)
// fill in the lump / offset, so columns with only a single patch are
// all done
//
- patchcount = (byte *) alloca(texture->width);
+ patchcount = (byte *) Z_Malloc(texture->width, PU_STATIC, &patchcount);
memset(patchcount, 0, texture->width);
patch = texture->patches;
@@ -263,6 +263,8 @@ void R_GenerateLookup(int texnum)
texturecompositesize[texnum] += texture->height;
}
}
+
+ Z_Free(patchcount);
}
@@ -322,7 +324,7 @@ void R_InitTextures(void)
names = W_CacheLumpName("PNAMES", PU_STATIC);
nummappatches = LONG(*((int *) names));
name_p = names + 4;
- patchlookup = alloca(nummappatches * sizeof(*patchlookup));
+ patchlookup = Z_Malloc(nummappatches * sizeof(*patchlookup), PU_STATIC, NULL);
for (i = 0; i < nummappatches; i++)
{
strncpy(name, name_p + i * 8, 8);
@@ -423,6 +425,8 @@ void R_InitTextures(void)
totalwidth += texture->width;
}
+ Z_Free(patchlookup);
+
W_ReleaseLumpName("TEXTURE1");
if (maptex2)
{
@@ -654,7 +658,7 @@ void R_PrecacheLevel(void)
//
// precache flats
//
- flatpresent = alloca(numflats);
+ flatpresent = Z_Malloc(numflats, PU_STATIC, NULL);
memset(flatpresent, 0, numflats);
for (i = 0; i < numsectors; i++)
{
@@ -671,10 +675,12 @@ void R_PrecacheLevel(void)
W_CacheLumpNum(lump, PU_CACHE);
}
+ Z_Free(flatpresent);
+
//
// precache textures
//
- texturepresent = alloca(numtextures);
+ texturepresent = Z_Malloc(numtextures, PU_STATIC, NULL);
memset(texturepresent, 0, numtextures);
for (i = 0; i < numsides; i++)
@@ -700,10 +706,12 @@ void R_PrecacheLevel(void)
}
}
+ Z_Free(texturepresent);
+
//
// precache sprites
//
- spritepresent = alloca(numsprites);
+ spritepresent = Z_Malloc(numsprites, PU_STATIC, NULL);
memset(spritepresent, 0, numsprites);
for (th = thinkercap.next; th != &thinkercap; th = th->next)
@@ -728,4 +736,6 @@ void R_PrecacheLevel(void)
}
}
}
+
+ Z_Free(spritepresent);
}
diff --git a/src/hexen/am_data.h b/src/hexen/am_data.h
index db964598..a4cb47f3 100644
--- a/src/hexen/am_data.h
+++ b/src/hexen/am_data.h
@@ -22,26 +22,25 @@
//
//-----------------------------------------------------------------------------
+#ifndef __AMDATA_H__
+#define __AMDATA_H__
-#ifndef __AMDATA_H__
-#define __AMDATA_H__
-
-// a line drawing of the player pointing right, starting from the middle.
-
-#define R ((8*PLAYERRADIUS)/7)
-
-mline_t player_arrow[] = {
- { { -R+R/4, 0 }, { 0, 0} }, // center line.
- { { -R+R/4, R/8 }, { R, 0} }, // blade
- { { -R+R/4, -R/8 }, { R, 0 } },
- { { -R+R/4, -R/4 }, { -R+R/4, R/4 } }, // crosspiece
- { { -R+R/8, -R/4 }, { -R+R/8, R/4 } },
- { { -R+R/8, -R/4 }, { -R+R/4, -R/4} }, //crosspiece connectors
- { { -R+R/8, R/4 }, { -R+R/4, R/4} },
- { { -R-R/4, R/8 }, { -R-R/4, -R/8 } }, //pommel
- { { -R-R/4, R/8 }, { -R+R/8, R/8 } },
- { { -R-R/4, -R/8}, { -R+R/8, -R/8 } }
- };
+// a line drawing of the player pointing right, starting from the middle.
+
+#define R ((8*PLAYERRADIUS)/7)
+
+mline_t player_arrow[] = {
+ { { -R+R/4, 0 }, { 0, 0} }, // center line.
+ { { -R+R/4, R/8 }, { R, 0} }, // blade
+ { { -R+R/4, -R/8 }, { R, 0 } },
+ { { -R+R/4, -R/4 }, { -R+R/4, R/4 } }, // crosspiece
+ { { -R+R/8, -R/4 }, { -R+R/8, R/4 } },
+ { { -R+R/8, -R/4 }, { -R+R/4, -R/4} }, //crosspiece connectors
+ { { -R+R/8, R/4 }, { -R+R/4, R/4} },
+ { { -R-R/4, R/8 }, { -R-R/4, -R/8 } }, //pommel
+ { { -R-R/4, R/8 }, { -R+R/8, R/8 } },
+ { { -R-R/4, -R/8}, { -R+R/8, -R/8 } }
+ };
/*
mline_t keysquare[] = {
@@ -55,64 +54,64 @@ mline_t keysquare[] = {
{ { -3*R/4, 0 }, { -3*R/4, -R/4 } }
};
*/
-
-/*mline_t player_arrow[] = {
- { { -R+R/8, 0 }, { R, 0 } }, // -----
- { { R, 0 }, { R-R/2, R/4 } }, // ----->
- { { R, 0 }, { R-R/2, -R/4 } },
- { { -R+R/8, 0 }, { -R-R/8, R/4 } }, // >---->
- { { -R+R/8, 0 }, { -R-R/8, -R/4 } },
- { { -R+3*R/8, 0 }, { -R+R/8, R/4 } }, // >>--->
- { { -R+3*R/8, 0 }, { -R+R/8, -R/4 } }
- };
-*/
-#undef R
-#define NUMPLYRLINES (sizeof(player_arrow)/sizeof(mline_t))
+
+/*mline_t player_arrow[] = {
+ { { -R+R/8, 0 }, { R, 0 } }, // -----
+ { { R, 0 }, { R-R/2, R/4 } }, // ----->
+ { { R, 0 }, { R-R/2, -R/4 } },
+ { { -R+R/8, 0 }, { -R-R/8, R/4 } }, // >---->
+ { { -R+R/8, 0 }, { -R-R/8, -R/4 } },
+ { { -R+3*R/8, 0 }, { -R+R/8, R/4 } }, // >>--->
+ { { -R+3*R/8, 0 }, { -R+R/8, -R/4 } }
+ };
+*/
+#undef R
+#define NUMPLYRLINES (sizeof(player_arrow)/sizeof(mline_t))
#define NUMKEYSQUARELINES (sizeof(keysquare)/sizeof(mline_t))
/*
-#define R ((8*PLAYERRADIUS)/7)
-mline_t cheat_player_arrow[] = {
- { { -R+R/8, 0 }, { R, 0 } }, // -----
- { { R, 0 }, { R-R/2, R/6 } }, // ----->
- { { R, 0 }, { R-R/2, -R/6 } },
- { { -R+R/8, 0 }, { -R-R/8, R/6 } }, // >----->
- { { -R+R/8, 0 }, { -R-R/8, -R/6 } },
- { { -R+3*R/8, 0 }, { -R+R/8, R/6 } }, // >>----->
- { { -R+3*R/8, 0 }, { -R+R/8, -R/6 } },
- { { -R/2, 0 }, { -R/2, -R/6 } }, // >>-d--->
- { { -R/2, -R/6 }, { -R/2+R/6, -R/6 } },
- { { -R/2+R/6, -R/6 }, { -R/2+R/6, R/4 } },
- { { -R/6, 0 }, { -R/6, -R/6 } }, // >>-dd-->
- { { -R/6, -R/6 }, { 0, -R/6 } },
- { { 0, -R/6 }, { 0, R/4 } },
- { { R/6, R/4 }, { R/6, -R/7 } }, // >>-ddt->
- { { R/6, -R/7 }, { R/6+R/32, -R/7-R/32 } },
- { { R/6+R/32, -R/7-R/32 }, { R/6+R/10, -R/7 } }
- };
-#undef R
-#define NUMCHEATPLYRLINES (sizeof(cheat_player_arrow)/sizeof(mline_t))
+#define R ((8*PLAYERRADIUS)/7)
+mline_t cheat_player_arrow[] = {
+ { { -R+R/8, 0 }, { R, 0 } }, // -----
+ { { R, 0 }, { R-R/2, R/6 } }, // ----->
+ { { R, 0 }, { R-R/2, -R/6 } },
+ { { -R+R/8, 0 }, { -R-R/8, R/6 } }, // >----->
+ { { -R+R/8, 0 }, { -R-R/8, -R/6 } },
+ { { -R+3*R/8, 0 }, { -R+R/8, R/6 } }, // >>----->
+ { { -R+3*R/8, 0 }, { -R+R/8, -R/6 } },
+ { { -R/2, 0 }, { -R/2, -R/6 } }, // >>-d--->
+ { { -R/2, -R/6 }, { -R/2+R/6, -R/6 } },
+ { { -R/2+R/6, -R/6 }, { -R/2+R/6, R/4 } },
+ { { -R/6, 0 }, { -R/6, -R/6 } }, // >>-dd-->
+ { { -R/6, -R/6 }, { 0, -R/6 } },
+ { { 0, -R/6 }, { 0, R/4 } },
+ { { R/6, R/4 }, { R/6, -R/7 } }, // >>-ddt->
+ { { R/6, -R/7 }, { R/6+R/32, -R/7-R/32 } },
+ { { R/6+R/32, -R/7-R/32 }, { R/6+R/10, -R/7 } }
+ };
+#undef R
+#define NUMCHEATPLYRLINES (sizeof(cheat_player_arrow)/sizeof(mline_t))
*/
/*
-#define R (FRACUNIT)
-mline_t triangle_guy[] = {
- { { -.867*R, -.5*R }, { .867*R, -.5*R } },
- { { .867*R, -.5*R } , { 0, R } },
- { { 0, R }, { -.867*R, -.5*R } }
- };
-#undef R
-#define NUMTRIANGLEGUYLINES (sizeof(triangle_guy)/sizeof(mline_t))
+#define R (FRACUNIT)
+mline_t triangle_guy[] = {
+ { { -.867*R, -.5*R }, { .867*R, -.5*R } },
+ { { .867*R, -.5*R } , { 0, R } },
+ { { 0, R }, { -.867*R, -.5*R } }
+ };
+#undef R
+#define NUMTRIANGLEGUYLINES (sizeof(triangle_guy)/sizeof(mline_t))
*/
-#define R (FRACUNIT)
-mline_t thintriangle_guy[] = {
- { { -.5*R, -.7*R }, { R, 0 } },
- { { R, 0 }, { -.5*R, .7*R } },
- { { -.5*R, .7*R }, { -.5*R, -.7*R } }
- };
-#undef R
-#define NUMTHINTRIANGLEGUYLINES (sizeof(thintriangle_guy)/sizeof(mline_t))
-
-#endif
+#define R (FRACUNIT)
+mline_t thintriangle_guy[] = {
+ { { (fixed_t)(-.5*R), (fixed_t)(-.7*R) }, { (fixed_t)(R ), (fixed_t)(0 ) } },
+ { { (fixed_t)(R ), (fixed_t)(0 ) }, { (fixed_t)(-.5*R), (fixed_t)(.7*R ) } },
+ { { (fixed_t)(-.5*R), (fixed_t)(.7*R ) }, { (fixed_t)(-.5*R), (fixed_t)(-.7*R) } }
+ };
+#undef R
+#define NUMTHINTRIANGLEGUYLINES (sizeof(thintriangle_guy)/sizeof(mline_t))
+
+#endif
diff --git a/src/hexen/m_random.h b/src/hexen/m_random.h
index 44e4643d..582bcfa7 100644
--- a/src/hexen/m_random.h
+++ b/src/hexen/m_random.h
@@ -1,42 +1,42 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright(C) 1993-1996 Id Software, Inc.
-// Copyright(C) 1993-2008 Raven Software
-// Copyright(C) 2008 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.
-//
-//-----------------------------------------------------------------------------
-
-#ifndef HEXEN_M_RANDOM_H
-#define HEXEN_M_RANDOM_H
-
-// Most damage defined using HITDICE
-#define HITDICE(a) ((1+(P_Random()&7))*a)
-
-int M_Random(void);
-// returns a number from 0 to 255
-int P_Random(void);
-// as M_Random, but used only by the play simulation
-
-void M_ClearRandom(void);
-// fix randoms for demos
-
-extern int rndindex;
-
-#endif // HEXEN_M_RANDOM_H
-
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 1993-2008 Raven Software
+// Copyright(C) 2008 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.
+//
+//-----------------------------------------------------------------------------
+
+#ifndef HEXEN_M_RANDOM_H
+#define HEXEN_M_RANDOM_H
+
+// Most damage defined using HITDICE
+#define HITDICE(a) ((1+(P_Random()&7))*a)
+
+int M_Random(void);
+// returns a number from 0 to 255
+int P_Random(void);
+// as M_Random, but used only by the play simulation
+
+void M_ClearRandom(void);
+// fix randoms for demos
+
+extern int rndindex;
+
+#endif // HEXEN_M_RANDOM_H
+
diff --git a/src/hexen/p_mobj.c b/src/hexen/p_mobj.c
index 5d6f7097..ee8f8fd4 100644
--- a/src/hexen/p_mobj.c
+++ b/src/hexen/p_mobj.c
@@ -100,7 +100,7 @@ boolean P_SetMobjState(mobj_t * mobj, statenum_t state)
if (state == S_NULL)
{ // Remove mobj
- mobj->state = S_NULL;
+ mobj->state = (state_t *) S_NULL;
P_RemoveMobj(mobj);
return (false);
}
@@ -130,7 +130,7 @@ boolean P_SetMobjStateNF(mobj_t * mobj, statenum_t state)
if (state == S_NULL)
{ // Remove mobj
- mobj->state = S_NULL;
+ mobj->state = (state_t *) S_NULL;
P_RemoveMobj(mobj);
return (false);
}
diff --git a/src/hexen/r_data.c b/src/hexen/r_data.c
index bd020073..b82c0ff6 100644
--- a/src/hexen/r_data.c
+++ b/src/hexen/r_data.c
@@ -218,7 +218,7 @@ void R_GenerateLookup(int texnum)
// fill in the lump / offset, so columns with only a single patch are
// all done
//
- patchcount = (byte *) alloca(texture->width);
+ patchcount = (byte *) Z_Malloc(texture->width, PU_STATIC, &patchcount);
memset(patchcount, 0, texture->width);
patch = texture->patches;
@@ -260,6 +260,8 @@ void R_GenerateLookup(int texnum)
texturecompositesize[texnum] += texture->height;
}
}
+
+ Z_Free(patchcount);
}
@@ -319,7 +321,7 @@ void R_InitTextures(void)
names = W_CacheLumpName("PNAMES", PU_STATIC);
nummappatches = LONG(*((int *) names));
name_p = names + 4;
- patchlookup = alloca(nummappatches * sizeof(*patchlookup));
+ patchlookup = Z_Malloc(nummappatches * sizeof(*patchlookup), PU_STATIC, NULL);
for (i = 0; i < nummappatches; i++)
{
strncpy(name, name_p + i * 8, 8);
@@ -403,6 +405,8 @@ void R_InitTextures(void)
totalwidth += texture->width;
}
+ Z_Free(patchlookup);
+
W_ReleaseLumpName("TEXTURE1");
if (maptex2)
W_ReleaseLumpName("TEXTURE2");
@@ -620,7 +624,7 @@ void R_PrecacheLevel(void)
//
// precache flats
//
- flatpresent = alloca(numflats);
+ flatpresent = Z_Malloc(numflats, PU_STATIC, NULL);
memset(flatpresent, 0, numflats);
for (i = 0; i < numsectors; i++)
{
@@ -637,10 +641,12 @@ void R_PrecacheLevel(void)
W_CacheLumpNum(lump, PU_CACHE);
}
+ Z_Free(flatpresent);
+
//
// precache textures
//
- texturepresent = alloca(numtextures);
+ texturepresent = Z_Malloc(numtextures, PU_STATIC, NULL);
memset(texturepresent, 0, numtextures);
for (i = 0; i < numsides; i++)
@@ -667,10 +673,12 @@ void R_PrecacheLevel(void)
}
}
+ Z_Free(texturepresent);
+
//
// precache sprites
//
- spritepresent = alloca(numsprites);
+ spritepresent = Z_Malloc(numsprites, PU_STATIC, NULL);
memset(spritepresent, 0, numsprites);
for (th = thinkercap.next; th != &thinkercap; th = th->next)
@@ -695,4 +703,6 @@ void R_PrecacheLevel(void)
}
}
}
+
+ Z_Free(spritepresent);
}
diff --git a/src/i_cdmus.c b/src/i_cdmus.c
index 5a52b143..94ac47c6 100644
--- a/src/i_cdmus.c
+++ b/src/i_cdmus.c
@@ -25,6 +25,8 @@
//
//-----------------------------------------------------------------------------
+#include <stdio.h>
+
#include "SDL.h"
#include "SDL_cdrom.h"
diff --git a/src/i_joystick.c b/src/i_joystick.c
index d11d3084..7767c19d 100644
--- a/src/i_joystick.c
+++ b/src/i_joystick.c
@@ -115,7 +115,7 @@ void I_InitJoystick(void)
SDL_JoystickEventState(SDL_ENABLE);
- // Initialised okay!
+ // Initialized okay!
printf("I_InitJoystick: %s\n", SDL_JoystickName(joystick_index));
}
diff --git a/src/i_main.c b/src/i_main.c
index a17d56b9..1ccc52c0 100644
--- a/src/i_main.c
+++ b/src/i_main.c
@@ -26,6 +26,8 @@
#include "config.h"
+#include <stdio.h>
+
#include "SDL.h"
#include "doomtype.h"
@@ -53,7 +55,7 @@ static void LockCPUAffinity(void)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
-typedef BOOL WINAPI (*SetAffinityFunc)(HANDLE hProcess, DWORD_PTR mask);
+typedef BOOL (WINAPI *SetAffinityFunc)(HANDLE hProcess, DWORD mask);
// This is a bit more complicated than it really needs to be. We really
// just need to call the SetProcessAffinityMask function, but that
@@ -79,7 +81,7 @@ static void LockCPUAffinity(void)
}
// Find the SetProcessAffinityMask function.
- SetAffinity = GetProcAddress(kernel32_dll, "SetProcessAffinityMask");
+ SetAffinity = (SetAffinityFunc)GetProcAddress(kernel32_dll, "SetProcessAffinityMask");
// If the function was not found, we are on an old (Win9x) system
// that doesn't have this function. That's no problem, because
diff --git a/src/i_pcsound.c b/src/i_pcsound.c
index 36d4873e..907aeb54 100644
--- a/src/i_pcsound.c
+++ b/src/i_pcsound.c
@@ -36,7 +36,7 @@
#include "pcsound.h"
-static boolean pcs_initialised = false;
+static boolean pcs_initialized = false;
static SDL_mutex *sound_lock;
static boolean use_sfx_prefix;
@@ -178,7 +178,7 @@ static int I_PCS_StartSound(sfxinfo_t *sfxinfo,
{
int result;
- if (!pcs_initialised)
+ if (!pcs_initialized)
{
return -1;
}
@@ -214,7 +214,7 @@ static int I_PCS_StartSound(sfxinfo_t *sfxinfo,
static void I_PCS_StopSound(int handle)
{
- if (!pcs_initialised)
+ if (!pcs_initialized)
{
return;
}
@@ -258,7 +258,7 @@ static int I_PCS_GetSfxLumpNum(sfxinfo_t* sfx)
static boolean I_PCS_SoundIsPlaying(int handle)
{
- if (!pcs_initialised)
+ if (!pcs_initialized)
{
return false;
}
@@ -279,21 +279,21 @@ static boolean I_PCS_InitSound(boolean _use_sfx_prefix)
PCSound_SetSampleRate(snd_samplerate);
- // Initialise the PC speaker subsystem.
+ // Initialize the PC speaker subsystem.
- pcs_initialised = PCSound_Init(PCSCallbackFunc);
+ pcs_initialized = PCSound_Init(PCSCallbackFunc);
- if (pcs_initialised)
+ if (pcs_initialized)
{
sound_lock = SDL_CreateMutex();
}
- return pcs_initialised;
+ return pcs_initialized;
}
static void I_PCS_ShutdownSound(void)
{
- if (pcs_initialised)
+ if (pcs_initialized)
{
PCSound_Shutdown();
}
diff --git a/src/i_sdlmusic.c b/src/i_sdlmusic.c
index 602fd17b..1e907739 100644
--- a/src/i_sdlmusic.c
+++ b/src/i_sdlmusic.c
@@ -43,12 +43,12 @@
#define MAXMIDLENGTH (96 * 1024)
-static boolean music_initialised = false;
+static boolean music_initialized = false;
-// If this is true, this module initialised SDL sound and has the
+// If this is true, this module initialized SDL sound and has the
// responsibility to shut it down
-static boolean sdl_was_initialised = false;
+static boolean sdl_was_initialized = false;
static boolean musicpaused = false;
static int current_music_volume;
@@ -57,21 +57,21 @@ static int current_music_volume;
static void I_SDL_ShutdownMusic(void)
{
- if (music_initialised)
+ if (music_initialized)
{
Mix_HaltMusic();
- music_initialised = false;
+ music_initialized = false;
- if (sdl_was_initialised)
+ if (sdl_was_initialized)
{
Mix_CloseAudio();
SDL_QuitSubSystem(SDL_INIT_AUDIO);
- sdl_was_initialised = false;
+ sdl_was_initialized = false;
}
}
}
-static boolean SDLIsInitialised(void)
+static boolean SDLIsInitialized(void)
{
int freq, channels;
Uint16 format;
@@ -79,25 +79,35 @@ static boolean SDLIsInitialised(void)
return Mix_QuerySpec(&freq, &format, &channels) != 0;
}
-// Initialise music subsystem
+// Initialize music subsystem
static boolean I_SDL_InitMusic(void)
-{
- // When trying to run with music enabled on OSX, display
- // a warning message.
-
-#ifdef __APPLE__
- printf("\n"
- " *** WARNING ***\n"
- " Music playback on OSX may cause crashes and\n"
- " is disabled by default.\n"
- "\n");
+{
+ // SDL_mixer prior to v1.2.11 has a bug that causes crashes
+ // with MIDI playback. Print a warning message if we are
+ // using an old version.
+
+#ifdef __MACOSX__
+ {
+ const SDL_version *v = Mix_Linked_Version();
+
+ if (SDL_VERSIONNUM(v->major, v->minor, v->patch)
+ < SDL_VERSIONNUM(1, 2, 11))
+ {
+ printf("\n"
+ " *** WARNING ***\n"
+ " You are using an old version of SDL_mixer.\n"
+ " Music playback on this version may cause crashes\n"
+ " under OS X and is disabled by default.\n"
+ "\n");
+ }
+ }
#endif
-
- // If SDL_mixer is not initialised, we have to initialise it
+
+ // If SDL_mixer is not initialized, we have to initialize it
// and have the responsibility to shut it down later on.
- if (!SDLIsInitialised())
+ if (!SDLIsInitialized())
{
if (SDL_Init(SDL_INIT_AUDIO) < 0)
{
@@ -107,17 +117,17 @@ static boolean I_SDL_InitMusic(void)
if (Mix_OpenAudio(snd_samplerate, AUDIO_S16SYS, 2, 1024) < 0)
{
- fprintf(stderr, "Error initialising SDL_mixer: %s\n", Mix_GetError());
+ fprintf(stderr, "Error initializing SDL_mixer: %s\n", Mix_GetError());
SDL_QuitSubSystem(SDL_INIT_AUDIO);
return false;
}
SDL_PauseAudio(0);
- sdl_was_initialised = true;
+ sdl_was_initialized = true;
}
- music_initialised = true;
+ music_initialized = true;
return true;
}
@@ -160,7 +170,7 @@ static void I_SDL_PlaySong(void *handle, boolean looping)
Mix_Music *music = (Mix_Music *) handle;
int loops;
- if (!music_initialised)
+ if (!music_initialized)
{
return;
}
@@ -184,7 +194,7 @@ static void I_SDL_PlaySong(void *handle, boolean looping)
static void I_SDL_PauseSong(void)
{
- if (!music_initialised)
+ if (!music_initialized)
{
return;
}
@@ -196,7 +206,7 @@ static void I_SDL_PauseSong(void)
static void I_SDL_ResumeSong(void)
{
- if (!music_initialised)
+ if (!music_initialized)
{
return;
}
@@ -208,7 +218,7 @@ static void I_SDL_ResumeSong(void)
static void I_SDL_StopSong(void)
{
- if (!music_initialised)
+ if (!music_initialized)
{
return;
}
@@ -220,7 +230,7 @@ static void I_SDL_UnRegisterSong(void *handle)
{
Mix_Music *music = (Mix_Music *) handle;
- if (!music_initialised)
+ if (!music_initialized)
{
return;
}
@@ -271,7 +281,7 @@ static void *I_SDL_RegisterSong(void *data, int len)
char *filename;
Mix_Music *music;
- if (!music_initialised)
+ if (!music_initialized)
{
return NULL;
}
@@ -315,7 +325,7 @@ static void *I_SDL_RegisterSong(void *data, int len)
// Is the song playing?
static boolean I_SDL_MusicIsPlaying(void)
{
- if (!music_initialised)
+ if (!music_initialized)
{
return false;
}
diff --git a/src/i_sdlsound.c b/src/i_sdlsound.c
index ff0ef10e..0b3f8aa3 100644
--- a/src/i_sdlsound.c
+++ b/src/i_sdlsound.c
@@ -49,9 +49,10 @@
#include "doomtype.h"
#define LOW_PASS_FILTER
+#define MAX_SOUND_SLICE_TIME 70 /* ms */
#define NUM_CHANNELS 16
-static boolean sound_initialised = false;
+static boolean sound_initialized = false;
static sfxinfo_t *channels_playing[NUM_CHANNELS];
@@ -311,7 +312,7 @@ static void ExpandSoundData_SDL(sfxinfo_t *sfxinfo,
chunk = AllocateChunk(sfxinfo, expanded_length);
- // If we can, use the standard / optimised SDL conversion routines.
+ // If we can, use the standard / optimized SDL conversion routines.
if (samplerate <= mixer_freq
&& ConvertibleRatio(samplerate, mixer_freq)
@@ -554,7 +555,7 @@ static void I_SDL_UpdateSoundParams(int handle, int vol, int sep)
{
int left, right;
- if (!sound_initialised)
+ if (!sound_initialized)
{
return;
}
@@ -588,7 +589,7 @@ static int I_SDL_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep)
{
Mix_Chunk *chunk;
- if (!sound_initialised)
+ if (!sound_initialized)
{
return -1;
}
@@ -622,7 +623,7 @@ static int I_SDL_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep)
static void I_SDL_StopSound (int handle)
{
- if (!sound_initialised)
+ if (!sound_initialized)
{
return;
}
@@ -670,7 +671,7 @@ static void I_SDL_UpdateSound(void)
static void I_SDL_ShutdownSound(void)
{
- if (!sound_initialised)
+ if (!sound_initialized)
{
return;
}
@@ -678,14 +679,40 @@ static void I_SDL_ShutdownSound(void)
Mix_CloseAudio();
SDL_QuitSubSystem(SDL_INIT_AUDIO);
- sound_initialised = false;
+ sound_initialized = false;
}
+// Calculate slice size, based on MAX_SOUND_SLICE_TIME.
+// The result must be a power of two.
+
+static int GetSliceSize(void)
+{
+ int limit;
+ int n;
+
+ limit = (snd_samplerate * MAX_SOUND_SLICE_TIME) / 1000;
+
+ // Try all powers of two, not exceeding the limit.
+
+ for (n=0;; ++n)
+ {
+ // 2^n <= limit < 2^n+1 ?
+
+ if ((1 << (n + 1)) > limit)
+ {
+ return (1 << n);
+ }
+ }
+
+ // Should never happen?
+
+ return 1024;
+}
static boolean I_SDL_InitSound(boolean _use_sfx_prefix)
-{
+{
int i;
-
+
use_sfx_prefix = _use_sfx_prefix;
// No sounds yet
@@ -701,7 +728,7 @@ static boolean I_SDL_InitSound(boolean _use_sfx_prefix)
return false;
}
- if (Mix_OpenAudio(snd_samplerate, AUDIO_S16SYS, 2, 1024) < 0)
+ if (Mix_OpenAudio(snd_samplerate, AUDIO_S16SYS, 2, GetSliceSize()) < 0)
{
fprintf(stderr, "Error initialising SDL_mixer: %s\n", Mix_GetError());
return false;
@@ -735,7 +762,7 @@ static boolean I_SDL_InitSound(boolean _use_sfx_prefix)
SDL_PauseAudio(0);
- sound_initialised = true;
+ sound_initialized = true;
return true;
}
diff --git a/src/i_sound.c b/src/i_sound.c
index 34f4ea46..a9e953ce 100644
--- a/src/i_sound.c
+++ b/src/i_sound.c
@@ -26,6 +26,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include "SDL_mixer.h"
+
#include "config.h"
#include "doomfeatures.h"
#include "doomtype.h"
@@ -35,14 +37,6 @@
#include "m_argv.h"
#include "m_config.h"
-// Disable music on OSX by default; there are problems with SDL_mixer.
-
-#ifndef __APPLE__
-#define DEFAULT_MUSIC_DEVICE SNDDEVICE_SB
-#else
-#define DEFAULT_MUSIC_DEVICE SNDDEVICE_NONE
-#endif
-
// Sound sample rate to use for digital output (Hz)
int snd_samplerate = 44100;
@@ -52,7 +46,7 @@ int snd_samplerate = 44100;
static sound_module_t *sound_module;
static music_module_t *music_module;
-int snd_musicdevice = DEFAULT_MUSIC_DEVICE;
+int snd_musicdevice = SNDDEVICE_SB;
int snd_sfxdevice = SNDDEVICE_SB;
// Sound modules
@@ -109,7 +103,7 @@ static boolean SndDeviceInList(snddevice_t device, snddevice_t *list,
return false;
}
-// Find and initialise a sound_module_t appropriate for the setting
+// Find and initialize a sound_module_t appropriate for the setting
// in snd_sfxdevice.
static void InitSfxModule(boolean use_sfx_prefix)
@@ -127,7 +121,7 @@ static void InitSfxModule(boolean use_sfx_prefix)
sound_modules[i]->sound_devices,
sound_modules[i]->num_sound_devices))
{
- // Initialise the module
+ // Initialize the module
if (sound_modules[i]->Init(use_sfx_prefix))
{
@@ -138,7 +132,7 @@ static void InitSfxModule(boolean use_sfx_prefix)
}
}
-// Initialise music according to snd_musicdevice.
+// Initialize music according to snd_musicdevice.
static void InitMusicModule(void)
{
@@ -155,7 +149,7 @@ static void InitMusicModule(void)
music_modules[i]->sound_devices,
music_modules[i]->num_sound_devices))
{
- // Initialise the module
+ // Initialize the module
if (music_modules[i]->Init())
{
@@ -200,7 +194,7 @@ void I_InitSound(boolean use_sfx_prefix)
nomusic = M_CheckParm("-nomusic") > 0;
- // Initialise the sound and music subsystems.
+ // Initialize the sound and music subsystems.
if (!nosound && !screensaver_mode)
{
@@ -416,5 +410,21 @@ void I_BindSoundVariables(void)
#ifdef FEATURE_SOUND
M_BindVariable("use_libsamplerate", &use_libsamplerate);
#endif
+
+ // Before SDL_mixer version 1.2.11, MIDI music caused the game
+ // to crash when it looped. If this is an old SDL_mixer version,
+ // disable MIDI.
+
+#ifdef __MACOSX__
+ {
+ const SDL_version *v = Mix_Linked_Version();
+
+ if (SDL_VERSIONNUM(v->major, v->minor, v->patch)
+ < SDL_VERSIONNUM(1, 2, 11))
+ {
+ snd_musicdevice = SNDDEVICE_NONE;
+ }
+ }
+#endif
}
diff --git a/src/i_system.h b/src/i_system.h
index b34f61e4..0697f7db 100644
--- a/src/i_system.h
+++ b/src/i_system.h
@@ -60,6 +60,7 @@ ticcmd_t* I_BaseTiccmd (void);
// Clean exit, displays sell blurb.
void I_Quit (void);
+void I_Error (char *error, ...);
// Allocates from low memory under dos,
// just mallocs under unix
diff --git a/src/i_timer.c b/src/i_timer.c
index ef97b7b7..d2c455e9 100644
--- a/src/i_timer.c
+++ b/src/i_timer.c
@@ -81,7 +81,7 @@ void I_WaitVBL(int count)
void I_InitTimer(void)
{
- // initialise timer
+ // initialize timer
SDL_Init(SDL_INIT_TIMER);
}
diff --git a/src/i_timer.h b/src/i_timer.h
index 17390884..56810468 100644
--- a/src/i_timer.h
+++ b/src/i_timer.h
@@ -40,7 +40,7 @@ int I_GetTimeMS (void);
// Pause for a specified number of ms
void I_Sleep(int ms);
-// Initialise timer
+// Initialize timer
void I_InitTimer(void);
// Wait for vertical retrace or pause a bit.
diff --git a/src/i_video.c b/src/i_video.c
index 6f82e60a..64a2e8eb 100644
--- a/src/i_video.c
+++ b/src/i_video.c
@@ -93,6 +93,9 @@ static const char shiftxform[] =
};
+#define LOADING_DISK_W 16
+#define LOADING_DISK_H 16
+
// Non aspect ratio-corrected modes (direct multiples of 320x200)
static screen_mode_t *screen_modes[] = {
@@ -145,7 +148,7 @@ static int windowwidth, windowheight;
// display has been set up?
-static boolean initialised = false;
+static boolean initialized = false;
// disable mouse?
@@ -221,7 +224,6 @@ static grabmouse_callback_t grabmouse_callback = NULL;
// restored by EndRead
static byte *disk_image = NULL;
-static int disk_image_w, disk_image_h;
static byte *saved_background;
static boolean window_focused;
@@ -338,7 +340,7 @@ static void UpdateFocus(void)
state = SDL_GetAppState();
// We should have input (keyboard) focus and be visible
- // (not minimised)
+ // (not minimized)
window_focused = (state & SDL_APPINPUTFOCUS) && (state & SDL_APPACTIVE);
@@ -378,20 +380,18 @@ void I_EnableLoadingDisk(void)
tmpbuf = Z_Malloc(SCREENWIDTH * (disk->height + 1), PU_STATIC, NULL);
V_UseBuffer(tmpbuf);
- disk_image_w = SHORT(disk->width);
- disk_image_h = SHORT(disk->height);
- V_DrawPatch(0, 0, disk);
+ // Draw the disk to the screen:
- // Copy the disk into the disk_image buffer.
+ V_DrawPatch(0, 0, disk);
- disk_image = Z_Malloc(disk_image_w * disk_image_h, PU_STATIC, NULL);
- saved_background = Z_Malloc(disk_image_w * disk_image_h, PU_STATIC, NULL);
+ disk_image = Z_Malloc(LOADING_DISK_W * LOADING_DISK_H, PU_STATIC, NULL);
+ saved_background = Z_Malloc(LOADING_DISK_W * LOADING_DISK_H, PU_STATIC, NULL);
- for (y=0; y<disk_image_h; ++y)
+ for (y=0; y<LOADING_DISK_H; ++y)
{
- memcpy(disk_image + disk_image_w * y,
+ memcpy(disk_image + LOADING_DISK_W * y,
tmpbuf + SCREENWIDTH * y,
- disk_image_w);
+ LOADING_DISK_W);
}
// All done - free the screen buffer and restore the normal
@@ -435,7 +435,9 @@ static int TranslateKey(SDL_keysym *sym)
case SDLK_PAUSE: return KEY_PAUSE;
+#if !SDL_VERSION_ATLEAST(1, 3, 0)
case SDLK_EQUALS: return KEY_EQUALS;
+#endif
case SDLK_MINUS: return KEY_MINUS;
@@ -448,9 +450,11 @@ static int TranslateKey(SDL_keysym *sym)
return KEY_RCTRL;
case SDLK_LALT:
- case SDLK_LMETA:
case SDLK_RALT:
+#if !SDL_VERSION_ATLEAST(1, 3, 0)
+ case SDLK_LMETA:
case SDLK_RMETA:
+#endif
return KEY_RALT;
case SDLK_CAPSLOCK: return KEY_CAPSLOCK;
@@ -497,14 +501,14 @@ static int TranslateKey(SDL_keysym *sym)
void I_ShutdownGraphics(void)
{
- if (initialised)
+ if (initialized)
{
SDL_ShowCursor(1);
SDL_WM_GrabInput(SDL_GRAB_OFF);
SDL_QuitSubSystem(SDL_INIT_VIDEO);
- initialised = false;
+ initialized = false;
}
}
@@ -521,9 +525,15 @@ void I_StartFrame (void)
static int MouseButtonState(void)
{
- Uint8 state = SDL_GetMouseState(NULL, NULL);
+ Uint8 state;
int result = 0;
+#if SDL_VERSION_ATLEAST(1, 3, 0)
+ state = SDL_GetMouseState(0, NULL, NULL);
+#else
+ state = SDL_GetMouseState(NULL, NULL);
+#endif
+
// Note: button "0" is left, button "1" is right,
// button "2" is middle for Doom. This is different
// to how SDL sees things.
@@ -739,7 +749,11 @@ static void CenterMouse(void)
// Clear any relative movement caused by warping
SDL_PumpEvents();
+#if SDL_VERSION_ATLEAST(1, 3, 0)
+ SDL_GetRelativeMouseState(0, NULL, NULL);
+#else
SDL_GetRelativeMouseState(NULL, NULL);
+#endif
}
//
@@ -753,7 +767,11 @@ static void I_ReadMouse(void)
int x, y;
event_t ev;
+#if SDL_VERSION_ATLEAST(1, 3, 0)
+ SDL_GetRelativeMouseState(0, &x, &y);
+#else
SDL_GetRelativeMouseState(&x, &y);
+#endif
if (x != 0 || y != 0)
{
@@ -784,7 +802,7 @@ static void I_ReadMouse(void)
//
void I_StartTic (void)
{
- if (!initialised)
+ if (!initialized)
{
return;
}
@@ -898,50 +916,54 @@ static void UpdateRect(int x1, int y1, int x2, int y2)
void I_BeginRead(void)
{
+ byte *screenloc = I_VideoBuffer
+ + (SCREENHEIGHT - LOADING_DISK_H) * SCREENWIDTH
+ + (SCREENWIDTH - LOADING_DISK_W);
int y;
- if (!initialised || disk_image == NULL)
+ if (!initialized || disk_image == NULL)
return;
// save background and copy the disk image in
- for (y=0; y<disk_image_h; ++y)
+ for (y=0; y<LOADING_DISK_H; ++y)
{
- byte *screenloc =
- I_VideoBuffer
- + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH
- + (SCREENWIDTH - 1 - disk_image_w);
-
- memcpy(saved_background + y * disk_image_w,
+ memcpy(saved_background + y * LOADING_DISK_W,
screenloc,
- disk_image_w);
- memcpy(screenloc, disk_image + y * disk_image_w, disk_image_w);
+ LOADING_DISK_W);
+ memcpy(screenloc,
+ disk_image + y * LOADING_DISK_W,
+ LOADING_DISK_W);
+
+ screenloc += SCREENWIDTH;
}
- UpdateRect(SCREENWIDTH - disk_image_w, SCREENHEIGHT - disk_image_h,
+ UpdateRect(SCREENWIDTH - LOADING_DISK_W, SCREENHEIGHT - LOADING_DISK_H,
SCREENWIDTH, SCREENHEIGHT);
}
void I_EndRead(void)
{
+ byte *screenloc = I_VideoBuffer
+ + (SCREENHEIGHT - LOADING_DISK_H) * SCREENWIDTH
+ + (SCREENWIDTH - LOADING_DISK_W);
int y;
- if (!initialised || disk_image == NULL)
+ if (!initialized || disk_image == NULL)
return;
// save background and copy the disk image in
- for (y=0; y<disk_image_h; ++y)
+ for (y=0; y<LOADING_DISK_H; ++y)
{
- byte *screenloc =
- I_VideoBuffer
- + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH
- + (SCREENWIDTH - 1 - disk_image_w);
+ memcpy(screenloc,
+ saved_background + y * LOADING_DISK_W,
+ LOADING_DISK_W);
- memcpy(screenloc, saved_background + y * disk_image_w, disk_image_w);
+ screenloc += SCREENWIDTH;
}
- UpdateRect(SCREENWIDTH - disk_image_w, SCREENHEIGHT - disk_image_h,
+ UpdateRect(SCREENWIDTH - LOADING_DISK_W, SCREENHEIGHT - LOADING_DISK_H,
SCREENWIDTH, SCREENHEIGHT);
}
@@ -955,7 +977,7 @@ void I_FinishUpdate (void)
int i;
// UNUSED static unsigned char *bigscreen=0;
- if (!initialised)
+ if (!initialized)
return;
if (noblit)
@@ -1697,7 +1719,7 @@ void I_InitGraphics(void)
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
- I_Error("Failed to initialise video: %s", SDL_GetError());
+ I_Error("Failed to initialize video: %s", SDL_GetError());
}
// Check for command-line video-related parameters.
@@ -1750,7 +1772,9 @@ void I_InitGraphics(void)
// has to be done before the call to SDL_SetVideoMode.
I_InitWindowTitle();
+#if !SDL_VERSION_ATLEAST(1, 3, 0)
I_InitWindowIcon();
+#endif
// Set the video mode.
@@ -1874,7 +1898,7 @@ void I_InitGraphics(void)
CenterMouse();
}
- initialised = true;
+ initialized = true;
// Call I_ShutdownGraphics on quit
diff --git a/src/m_config.c b/src/m_config.c
index f70e112a..056861cc 100644
--- a/src/m_config.c
+++ b/src/m_config.c
@@ -1214,7 +1214,14 @@ static void LoadDefaultCollection(default_collection_t *collection)
intparm = ParseIntParameter(strparm);
def->untranslated = intparm;
- intparm = scantokey[intparm];
+ if (intparm >= 0 && intparm < 128)
+ {
+ intparm = scantokey[intparm];
+ }
+ else
+ {
+ intparm = 0;
+ }
def->original_translated = intparm;
* (int *) def->location = intparm;
diff --git a/src/m_misc.c b/src/m_misc.c
index 4f3becfb..5847f1a2 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -199,6 +199,14 @@ char *M_TempFile(char *s)
return result;
}
+boolean M_StrToInt(const char *str, int *result)
+{
+ return sscanf(str, " 0x%x", result) == 1
+ || sscanf(str, " 0X%x", result) == 1
+ || sscanf(str, " 0%o", result) == 1
+ || sscanf(str, " %d", result) == 1;
+}
+
void M_ExtractFileBase(char *path, char *dest)
{
char* src;
diff --git a/src/m_misc.h b/src/m_misc.h
index ec70a405..c92ddde8 100644
--- a/src/m_misc.h
+++ b/src/m_misc.h
@@ -39,6 +39,7 @@ void M_MakeDirectory(char *dir);
char *M_TempFile(char *s);
boolean M_FileExists(char *file);
long M_FileLength(FILE *handle);
+boolean M_StrToInt(const char *str, int *result);
void M_ExtractFileBase(char *path, char *dest);
void M_ForceUppercase(char *text);
diff --git a/src/net_client.c b/src/net_client.c
index bcd5831d..131397e9 100644
--- a/src/net_client.c
+++ b/src/net_client.c
@@ -1155,7 +1155,7 @@ boolean NET_CL_Connect(net_addr_t *addr)
client_context = NET_NewContext();
- // initialise module for client mode
+ // initialize module for client mode
if (!addr->module->InitClient())
{
@@ -1167,7 +1167,7 @@ boolean NET_CL_Connect(net_addr_t *addr)
net_client_connected = true;
net_client_received_wait_data = false;
- // Initialise connection
+ // Initialize connection
NET_Conn_InitClient(&client_connection, addr);
diff --git a/src/net_common.c b/src/net_common.c
index d1d4390a..57699fd9 100644
--- a/src/net_common.c
+++ b/src/net_common.c
@@ -61,7 +61,7 @@ static void NET_Conn_Init(net_connection_t *conn, net_addr_t *addr)
conn->reliable_recv_seq = 0;
}
-// Initialise as a client connection
+// Initialize as a client connection
void NET_Conn_InitClient(net_connection_t *conn, net_addr_t *addr)
{
@@ -69,7 +69,7 @@ void NET_Conn_InitClient(net_connection_t *conn, net_addr_t *addr)
conn->state = NET_CONN_STATE_CONNECTING;
}
-// Initialise as a server connection
+// Initialize as a server connection
void NET_Conn_InitServer(net_connection_t *conn, net_addr_t *addr)
{
diff --git a/src/net_defs.h b/src/net_defs.h
index cb491124..a5fddc4d 100644
--- a/src/net_defs.h
+++ b/src/net_defs.h
@@ -60,11 +60,11 @@ struct _net_packet_s
struct _net_module_s
{
- // Initialise this module for use as a client
+ // Initialize this module for use as a client
boolean (*InitClient)(void);
- // Initialise this module for use as a server
+ // Initialize this module for use as a server
boolean (*InitServer)(void);
diff --git a/src/net_gui.c b/src/net_gui.c
index da7bde04..8c848d1c 100644
--- a/src/net_gui.c
+++ b/src/net_gui.c
@@ -263,7 +263,7 @@ void NET_WaitForStart(void)
{
if (!TXT_Init())
{
- fprintf(stderr, "Failed to initialise GUI\n");
+ fprintf(stderr, "Failed to initialize GUI\n");
exit(-1);
}
diff --git a/src/net_loop.c b/src/net_loop.c
index 825609d9..9f371bcb 100644
--- a/src/net_loop.c
+++ b/src/net_loop.c
@@ -99,7 +99,7 @@ static boolean NET_CL_InitClient(void)
static boolean NET_CL_InitServer(void)
{
- I_Error("NET_CL_InitServer: attempted to initialise client pipe end as a server!");
+ I_Error("NET_CL_InitServer: attempted to initialize client pipe end as a server!");
return false;
}
@@ -161,7 +161,7 @@ net_module_t net_loop_client_module =
static boolean NET_SV_InitClient(void)
{
- I_Error("NET_SV_InitClient: attempted to initialise server pipe end as a client!");
+ I_Error("NET_SV_InitClient: attempted to initialize server pipe end as a client!");
return false;
}
diff --git a/src/net_sdl.c b/src/net_sdl.c
index db129853..aa7fbd6e 100644
--- a/src/net_sdl.c
+++ b/src/net_sdl.c
@@ -57,7 +57,7 @@ typedef struct
static addrpair_t **addr_table;
static int addr_table_size = -1;
-// Initialises the address table
+// Initializes the address table
static void NET_SDL_InitAddrTable(void)
{
diff --git a/src/net_server.c b/src/net_server.c
index 5e256122..904d932e 100644
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -120,7 +120,7 @@ typedef struct
} net_client_recv_t;
static net_server_state_t server_state;
-static boolean server_initialised = false;
+static boolean server_initialized = false;
static net_client_t clients[MAXNETNODES];
static net_client_t *sv_players[MAXPLAYERS];
static net_context_t *server_context;
@@ -613,7 +613,7 @@ static void NET_SV_ParseSYN(net_packet_t *packet,
return;
}
- // Activate, initialise connection
+ // Activate, initialize connection
NET_SV_InitNewClient(client, addr, player_name);
@@ -1490,13 +1490,13 @@ void NET_SV_AddModule(net_module_t *module)
NET_AddModule(server_context, module);
}
-// Initialise server and wait for connections
+// Initialize server and wait for connections
void NET_SV_Init(void)
{
int i;
- // initialise send/receive context
+ // initialize send/receive context
server_context = NET_NewContext();
@@ -1511,7 +1511,7 @@ void NET_SV_Init(void)
server_state = SERVER_WAITING_START;
sv_gamemode = indetermined;
- server_initialised = true;
+ server_initialized = true;
}
// Run server code to check for new packets/send packets as the server
@@ -1523,7 +1523,7 @@ void NET_SV_Run(void)
net_packet_t *packet;
int i;
- if (!server_initialised)
+ if (!server_initialized)
{
return;
}
@@ -1565,7 +1565,7 @@ void NET_SV_Shutdown(void)
boolean running;
int start_time;
- if (!server_initialised)
+ if (!server_initialized)
{
return;
}
diff --git a/src/net_server.h b/src/net_server.h
index 3d0cf6e4..93b22fc3 100644
--- a/src/net_server.h
+++ b/src/net_server.h
@@ -24,7 +24,7 @@
#ifndef NET_SERVER_H
#define NET_SERVER_H
-// initialise server and wait for connections
+// initialize server and wait for connections
void NET_SV_Init(void);
diff --git a/src/setup/Makefile.am b/src/setup/Makefile.am
index 737dd278..07d7c936 100644
--- a/src/setup/Makefile.am
+++ b/src/setup/Makefile.am
@@ -2,8 +2,8 @@
gamesdir = $(prefix)/games
AM_CFLAGS = @SDL_CFLAGS@ \
- -I$(top_builddir)/textscreen -I.. \
- -DINSTALL_DIR="\"$(gamesdir)\""
+ @SDLMIXER_CFLAGS@ \
+ -I$(top_builddir)/textscreen -I..
noinst_LIBRARIES = libsetup.a
diff --git a/src/setup/execute.c b/src/setup/execute.c
index 18a07156..be7214f5 100644
--- a/src/setup/execute.c
+++ b/src/setup/execute.c
@@ -159,81 +159,69 @@ static unsigned int WaitForProcessExit(HANDLE subprocess)
}
}
-static wchar_t *GetFullExePath(const char *program)
+static void ConcatWCString(wchar_t *buf, const char *value)
+{
+ MultiByteToWideChar(CP_OEMCP, 0,
+ value, strlen(value) + 1,
+ buf + wcslen(buf), strlen(value) + 1);
+}
+
+// Build the command line string, a wide character string of the form:
+//
+// "program" "arg"
+
+static wchar_t *BuildCommandLine(const char *program, const char *arg)
{
wchar_t *result;
- unsigned int path_len;
char *sep;
- // Find the full path to the EXE to execute, by taking the path
- // to this program and concatenating the EXE name:
+ result = calloc(strlen(myargv[0]) + strlen(program) + strlen(arg) + 6,
+ sizeof(wchar_t));
+
+ wcscpy(result, L"\"");
sep = strrchr(myargv[0], DIR_SEPARATOR);
- if (sep == NULL)
- {
- path_len = 0;
- result = calloc(strlen(program) + 1, sizeof(wchar_t));
- }
- else
+ if (sep != NULL)
{
- path_len = sep - myargv[0] + 1;
-
- result = calloc(path_len + strlen(program) + 1,
- sizeof(wchar_t));
- MultiByteToWideChar(CP_OEMCP, 0,
- myargv[0], path_len,
- result, path_len);
- }
-
- MultiByteToWideChar(CP_OEMCP, 0,
- program, strlen(program) + 1,
- result + path_len, strlen(program) + 1);
-
- return result;
-}
+ ConcatWCString(result, myargv[0]);
-// Convert command line argument to wchar_t string and add surrounding
-// "" quotes:
+ // Cut off the string after the last directory separator,
+ // before appending the actual program.
-static wchar_t *GetPaddedWideArg(const char *arg)
-{
- wchar_t *result;
- unsigned int len = strlen(arg);
+ result[sep - myargv[0] + 2] = '\0';
+
+ }
- // Convert the command line arg to a wide char string:
+ ConcatWCString(result, program);
- result = calloc(len + 3, sizeof(wchar_t));
- MultiByteToWideChar(CP_OEMCP, 0,
- arg, len + 1,
- result + 1, len + 1);
+ wcscat(result, L"\" \"");
- // Surrounding quotes:
+ ConcatWCString(result, arg);
- result[0] = '"';
- result[len + 1] = '"';
- result[len + 2] = 0;
+ wcscat(result, L"\"");
return result;
}
static int ExecuteCommand(const char *program, const char *arg)
{
+ STARTUPINFOW startup_info;
PROCESS_INFORMATION proc_info;
- wchar_t *exe_path;
- wchar_t *warg;
+ wchar_t *command;
int result = 0;
- exe_path = GetFullExePath(program);
- warg = GetPaddedWideArg(arg);
+ command = BuildCommandLine(program, arg);
// Invoke the program:
memset(&proc_info, 0, sizeof(proc_info));
+ memset(&startup_info, 0, sizeof(startup_info));
+ startup_info.cb = sizeof(startup_info);
- if (!CreateProcessW(exe_path, warg,
- NULL, NULL, FALSE, 0, NULL, NULL, NULL,
- &proc_info))
+ if (!CreateProcessW(NULL, command,
+ NULL, NULL, FALSE, 0, NULL, NULL,
+ &startup_info, &proc_info))
{
result = -1;
}
@@ -247,19 +235,48 @@ static int ExecuteCommand(const char *program, const char *arg)
CloseHandle(proc_info.hThread);
}
- free(exe_path);
- free(warg);
+ free(command);
return result;
}
#else
+// Given the specified program name, get the full path to the program,
+// assuming that it is in the same directory as this program is.
+
+static char *GetFullExePath(const char *program)
+{
+ char *result;
+ char *sep;
+ unsigned int path_len;
+
+ sep = strrchr(myargv[0], DIR_SEPARATOR);
+
+ if (sep == NULL)
+ {
+ result = strdup(program);
+ }
+ else
+ {
+ path_len = sep - myargv[0] + 1;
+
+ result = malloc(strlen(program) + path_len + 1);
+
+ strncpy(result, myargv[0], path_len);
+ result[path_len] = '\0';
+
+ strcat(result, program);
+ }
+
+ return result;
+}
+
static int ExecuteCommand(const char *program, const char *arg)
{
pid_t childpid;
int result;
- const char *argv[] = { program, arg, NULL };
+ const char *argv[3];
childpid = fork();
@@ -267,7 +284,11 @@ static int ExecuteCommand(const char *program, const char *arg)
{
// This is the child. Execute the command.
- execv(argv[0], (char **) argv);
+ argv[0] = GetFullExePath(program);
+ argv[1] = arg;
+ argv[2] = NULL;
+
+ execvp(argv[0], (char **) argv);
exit(-1);
}
diff --git a/src/setup/joystick.c b/src/setup/joystick.c
index 3d2b713b..0094dd81 100644
--- a/src/setup/joystick.c
+++ b/src/setup/joystick.c
@@ -38,7 +38,7 @@ typedef enum
CALIBRATE_UP,
} calibration_stage_t;
-// SDL joystick successfully initialised?
+// SDL joystick successfully initialized?
static int joystick_initted = 0;
diff --git a/src/setup/mainmenu.c b/src/setup/mainmenu.c
index 3b79bc94..46e4b4e6 100644
--- a/src/setup/mainmenu.c
+++ b/src/setup/mainmenu.c
@@ -19,6 +19,7 @@
// 02111-1307, USA.
//
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -175,6 +176,10 @@ void MainMenu(void)
TXT_SetWindowAction(window, TXT_HORIZ_LEFT, quit_action);
}
+//
+// Initialize all configuration variables, load config file, etc
+//
+
static void InitConfig(void)
{
InitBindings();
@@ -228,7 +233,7 @@ static void SetIcon(void)
}
//
-// Initialise and run the textscreen GUI.
+// Initialize and run the textscreen GUI.
//
static void RunGUI(void)
@@ -237,7 +242,7 @@ static void RunGUI(void)
if (!TXT_Init())
{
- fprintf(stderr, "Failed to initialise GUI\n");
+ fprintf(stderr, "Failed to initialize GUI\n");
exit(-1);
}
diff --git a/src/setup/mode.c b/src/setup/mode.c
index ea90c76f..702db67d 100644
--- a/src/setup/mode.c
+++ b/src/setup/mode.c
@@ -162,16 +162,18 @@ void InitBindings(void)
static void SetExecutable(mission_config_t *config)
{
+ char *extension;
+
free(executable);
#ifdef _WIN32
- executable = malloc(strlen(config->executable) + 5);
- sprintf(executable, "%s.exe", config->executable);
+ extension = ".exe";
#else
- executable = malloc(strlen(INSTALL_DIR) + strlen(config->executable) + 2);
- sprintf(executable, "%s%c%s", INSTALL_DIR, DIR_SEPARATOR,
- config->executable);
+ extension = "";
#endif
+
+ executable = malloc(strlen(config->executable) + 5);
+ sprintf(executable, "%s%s", config->executable, extension);
}
static void SetMission(mission_config_t *config)
diff --git a/src/setup/multiplayer.c b/src/setup/multiplayer.c
index 131ec068..f3b3221d 100644
--- a/src/setup/multiplayer.c
+++ b/src/setup/multiplayer.c
@@ -783,7 +783,7 @@ void SetChatMacroDefaults(void)
HUSTR_CHATMACRO0,
};
- // If the chat macros have not been set, initialise with defaults.
+ // If the chat macros have not been set, initialize with defaults.
for (i=0; i<10; ++i)
{
diff --git a/src/setup/setup-manifest.xml.in b/src/setup/setup-manifest.xml.in
index 70ae915e..bac9a05e 100644
--- a/src/setup/setup-manifest.xml.in
+++ b/src/setup/setup-manifest.xml.in
@@ -3,7 +3,7 @@
<!-- The "name" field in this tag should be the same as the executable's
name -->
<assemblyIdentity version="@PACKAGE_VERSION@.0" processorArchitecture="*"
- name="chocolate-setup" type="win32"/>
+ name="@PROGRAM_PREFIX@setup" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
diff --git a/src/setup/sound.c b/src/setup/sound.c
index 0361ac62..97037ee9 100644
--- a/src/setup/sound.c
+++ b/src/setup/sound.c
@@ -23,6 +23,8 @@
#include <stdlib.h>
+#include "SDL_mixer.h"
+
#include "textscreen.h"
#include "m_config.h"
@@ -60,19 +62,10 @@ static char *musicmode_strings[] =
"CD audio"
};
-// Disable MIDI music on OSX: there are problems with the native
-// MIDI code in SDL_mixer.
-
-#ifdef __MACOSX__
-#define DEFAULT_MUSIC_DEVICE SNDDEVICE_NONE
-#else
-#define DEFAULT_MUSIC_DEVICE SNDDEVICE_SB
-#endif
-
// Config file variables:
int snd_sfxdevice = SNDDEVICE_SB;
-int snd_musicdevice = DEFAULT_MUSIC_DEVICE;
+int snd_musicdevice = SNDDEVICE_SB;
int snd_samplerate = 22050;
static int numChannels = 8;
@@ -237,5 +230,21 @@ void BindSoundVariables(void)
M_BindVariable("snd_sbirq", &snd_sbirq);
M_BindVariable("snd_sbdma", &snd_sbdma);
M_BindVariable("snd_mport", &snd_mport);
+
+ // Before SDL_mixer version 1.2.11, MIDI music caused the game
+ // to crash when it looped. If this is an old SDL_mixer version,
+ // disable MIDI.
+
+#ifdef __MACOSX__
+ {
+ const SDL_version *v = Mix_Linked_Version();
+
+ if (SDL_VERSIONNUM(v->major, v->minor, v->patch)
+ < SDL_VERSIONNUM(1, 2, 11))
+ {
+ snd_musicdevice = SNDDEVICE_NONE;
+ }
+ }
+#endif
}
diff --git a/src/w_merge.c b/src/w_merge.c
index 8f5690c9..150f075c 100644
--- a/src/w_merge.c
+++ b/src/w_merge.c
@@ -144,7 +144,7 @@ static void SetupLists(void)
SetupList(&pwad_sprites, &pwad, "S_START", "S_END", "SS_START", "SS_END");
}
-// Initialise the replace list
+// Initialize the replace list
static void InitSpriteList(void)
{