Commit graph

221 commits

Author SHA1 Message Date
Randy Heit
5e37e4a0b8 - Fixed: Makefile.mgw was mysteriously missing some targets. After fixing that,
I also removed some of GCC's warnings.


SVN r255 (trunk)
2006-07-16 01:25:29 +00:00
Christoph Oelckers
1c3153690a - Fixed: Any kill in multiplayer games that could not be credited to a player
didn't count at all - not even toward the global level statistics.
- ...and removed it again. It was not an accident. The only reason the PowerupGiver
  had its own RespawnTics was to account for the pickup flash delay. 
  But that is better handled by checking the flag and adding the additional 30 
  tics in AInventory::Hide because then it affects all items that have one - 
  and only those. The AT_GAME_SET function didn't work anyway because it was
  called after parsing DECORATE.


SVN r253 (trunk)
2006-07-14 08:04:17 +00:00
Randy Heit
3113037229 - Restored the PowerupGiver AT_GAME_SET function. I assume its removal was an
accident from merging in Grubber's custom player classes.


SVN r252 (trunk)
2006-07-14 00:33:11 +00:00
Christoph Oelckers
bada3bf462 - Removed the game filter check from addplayerclass. If a player class is added
here the game filter is irrelevant and there's nothing that should prevent
  the HereticPlayer being added to a Hexen game, for example.
- Changed: The addplayerclass CCMD was far too paranoid and needlessly aborted
  the game for any error being encountered. Since an empty player class list
  is checked for elsewhere outputting the messages to the console is sufficient.


SVN r251 (trunk)
2006-07-13 10:24:54 +00:00
Christoph Oelckers
31c749058b - Generalized Hexen's class-based spawning to be a property of the player class
so now it is available in all games.
- Replaced the call to A_FlameSnd in the HereticPlayer's burn death sequence
  with A_FireScream and defined *burndeath for Heretic.
- Added Grubber's custom player class support.


SVN r250 (trunk)
2006-07-13 10:17:56 +00:00
Randy Heit
38a073626f - Changed decorate replacement to be opt-in instead of opt-out. This allows for
greater flexibility in what can be replaced (replaced actors need not be ancestors
  of actors that replace them) at the expense of not having universal actor
  replacement. Instances where replacements work:
   - Line specials that spawn things (Thing_Spawn and related)
   - ACS spawning commands (SpawnSpot and the like)
   - Spawning mapthings at level load time in P_SpawnMapThing()
   - Spawning items off of dead dudes in P_DropItem()
   - The A_SpawnItem decorate function
   - The summon and summonfriend console commands
   - ThingCount will count both original actors and their replacements as the same
     things.
  TBD: Should the ACS inventory functions use replacements too, or not?


SVN r249 (trunk)
2006-07-13 03:34:50 +00:00
Randy Heit
56427d1b1c - Fixed: The game would crash after informing you of a duplicate class registration
because PClass::CreateDerivedClass() did not initialize everything before calling
  InsertIntoHash().
- Fixed: Forcefully removing a weapon from a player's inventory would not reset
  the player's refire counter.
- Fixed: FreeKeySections() was called before M_SaveDefaults() during shutdown,
  so all custom keys would go to a "(null)" section instead of their intended
  section.


SVN r248 (trunk)
2006-07-13 02:08:39 +00:00
Randy Heit
18af8a57cf - Restored the previous level flag values to avoid needlessly breaking some
savegames at this point in time.
- Fixed: R_ClearPlanes() did not clear skybox planes for a full clear.
- Streamlined zip file loading by delaying the processing of the local file
  header until it is actually needed.


SVN r247 (trunk)
2006-07-12 03:35:55 +00:00
Christoph Oelckers
5d1563b0e4 - Changed the additive scrollers option into a compatibility flag so that it can
be changed from the menu.


SVN r245 (trunk)
2006-07-11 08:27:05 +00:00
Randy Heit
0b3730392c - Fixed closed doors between the front sector's floor and ceiling the right way.
I was just missing a non-null texture check.
- Removed references to texturewidthmask. What was that?


SVN r244 (trunk)
2006-07-11 04:48:10 +00:00
Christoph Oelckers
133a035c76 - Fixed: The earthquake code needs to check whether a quake's spot is still valid.
Super Sonic Doom crashed due to this.
- Fixed: G_DoAutosave could divide by 0 if autosavecount was 0.


SVN r243 (trunk)
2006-07-11 00:20:45 +00:00
Christoph Oelckers
a9470f8642 - Fixed: The calls to DCanvas::Dim in c_console.cpp were missing some type casts.
- Fixed: CCMD(dir) passes FStrings directly to Printf.

For R241:

- Fixed: The defaultbind command still treated the bindings as char pointers and
  as a result didn't work.
- Added SpawnSpotFacing ACS function which is the same as SpawnSpot but it uses
  the map spot's angle.
- Added ThingCountName ACS function which is the same as ThingCount but it takes
  an actor's type name instead of a spawn ID.


SVN r242 (trunk)
2006-07-09 21:50:16 +00:00
Christoph Oelckers
dd3c0d82f7 SVN r241 (trunk) 2006-07-09 20:15:38 +00:00
Randy Heit
d027aafb4c - Fixed: If the sector behind a seg was closed, but it was closed between the
ceiling and floor of the front sector, the renderer did not add it to the
  solid clip list.
- Blends created with the ACS fade commands now degrade to transparent overlays
  when the console is visible, just as they do for the menu.


SVN r240 (trunk)
2006-07-09 20:04:05 +00:00
Christoph Oelckers
5541dc69f1 - Fixed: Specifying 'strifefallingdamage' in MAPINFO cleared all other flags.
- Fixed: maxstepheight and maxdropoffheight were stored as ints instead of 
  fixed_t's by the DECORATE parser.


SVN r239 (trunk)
2006-07-08 20:17:52 +00:00
Randy Heit
6695e255ce - Added actor replacement for DECORATE. This works at a higher level than
using duplicate DoomEdNums and will affect all attempts to spawn the
  replaced actor. However, because this happens for all spawns and not just
  at map load, the replacing actor must be compatible with the replaced
  actor, which means that an actor can only serve as a replacement for one
  of its baseclasses. For example, if you want to use a modified imp, you can
  use this DECORATE:
      actor MyImp : DoomImp replaces DoompImp
      {
          // Put changed properties here
      }
- New: The IWAD dialog now remembers the last IWAD you picked and
  automatically highlights it the next time you run the game. This also
  applies if you check "Don't ask me this again": The IWAD selected will be
  the one that gets automatically loaded, not the one located first. (Using
  the -iwad parameter will not change the default IWAD.) In addition, you
  can now bring the dialog up even if you disable it by holding down SHIFT
  during startup.
- Changed ExtractFilePath() and ExtractFileBase() to return FStrings instead
  of writing to a provided output buffer. ExtractFileBase() can also
  optionally keep the file's extension in the result.
- Removed the -heapsize parameter entirely. The informational message should
  no longer be needed.
- Removed -maxdemo parameter. There's no point to having it around since
  the demo buffer grows automatically.


SVN r238 (trunk)
2006-07-08 02:17:35 +00:00
Christoph Oelckers
43c1ec4a74 - Fixed: Changed initialization of Weapon.Kickback so that it is only done
for direct descendants of AWeapon and not for every weapon being defined.
- Changed parsing of actor names back to not use C-mode. This change breaks
  any definition that contain periods in their name and apparently there's
  more than anyone could expect. Also altered the parser to manually check
  for colons inside the parsed string so that placing spaces around them
  is no longer necessary.
- Fixed: Weapons could be picked up for ammo even if they gave none.
- Fixed: A_Beacon was missing a NULL pointer check for the beacon's owner.
- Fixed: The status bar tried to access CPlayer->camera without checking
  its validity. In spy mode there is a possibility that it is NULL.

SVN r237 (trunk)
2006-07-03 09:07:56 +00:00
Christoph Oelckers
9e6d5c8fd9 - Fixed: G_NewInit destroyed the players' userinfo data.
- Changed the special radius damage handling for the barrel and boss brain
  into an actor flag.
- Added A_RadiusThrust code pointer for DECORATE and adjusted the radius 
  attack functions accordingly.


SVN r236 (trunk)
2006-07-02 21:58:10 +00:00
Randy Heit
0398ddcc76 - Changed the earthquake view shaking so that it works for anything and not
just players.


SVN r235 (trunk)
2006-07-01 00:21:36 +00:00
Christoph Oelckers
207c84e3dd - Fixed: In multiplayer games, when trying to change targets, A_Chase forgot
to check whether the new target was the same as the old one and treated 
  this case as a real target change.


SVN r234 (trunk)
2006-07-01 00:15:06 +00:00
Randy Heit
9fdcb553aa - Added some hackery at the start of MouseRead_Win32() that prevents it from
yanking the mouse around if they keys haven't been read yet to combat the
  same situation that causes the keyboard to return DIERR_NOTACQUIRED in
  KeyRead(): The window is sort of in focus and sort of not. User.dll
  considers it to be focused and it's drawn as such, but another focused
  window is on top of it, and DirectInput doesn't see it as focused.
- Fixed: KeyRead() should handle DIERR_NOTACQUIRED errors the same way it
  handles DIERR_INPUTLOST errors. This can happen if our window had the
  focus stolen away from it before we tried to acquire the keyboard in
  DI_Init2(). Strangely, MouseRead_DI() already did this.
- When a stack overflow occurs, report.txt now only includes the first and
  last 16KB of the stack to make it more manageable.
- Limited StreamEditBinary() to the first 64KB of the file to keep it from
  taking too long on large dumps.
- And now I know why gathering crash information in the same process that
  crashed can be bad: Stack overflows. You get one spare page to play with
  when the stack overflows. MiniDumpWriteDump() needs more than that and
  causes an access violation when it runs out of leftover stack, silently
  terminating the application. Windows XP x64 offers SetThreadStackGuarantee()
  to increase this, but that isn't available on anything older, including
  32-bit XP. To get around this, a new thread is created to write the mini
  dump when the stack overflows.
- Changed A_Burnination() to be closer to Strife's.
- Fixed: When playing back demos, DoAddBot() can be called without an
  associated call to SpawnBot(). So if the bot can't spawn, botnum can
  go negative, which will cause problems later in DCajunMaster::Main()
  when it sees that wanted_botnum (0) is higher than botnum (-1).
- Fixed: Stopping demo recording in multiplayer games should not abruptly
  drop the recorder out of the game without notifying the other players.
  In fact, there's no reason why it should drop them out of multiplayer at
  all.
- Fixed: Earthquakes were unreliable in multiplayer games because
  P_PredictPlayer() did not preserve the player's xviewshift.
- Fixed: PlayerIsGone() needs to stop any scripts that belong to the player
  who left, in addition to executing disconnect scripts.
- Fixed: APlayerPawn::AddInventory() should also check for a NULL player->mo
  in case the player left but somebody still has a reference to their actor.
- Fixed: DDrawFB::PaintToWindow() should simulate proper unlocking behavior
  and set Buffer to NULL.
- Improved feedback for network game initialization with the console ticker.
- Moved i_net.cpp and i_net.h out of sdl/ and win32/ and into the main source
  directory. They are identical, so keeping two copies of them is bad.
- Fixed: (At least with Creative's driver's,) EAX settings are global and not
  per-application. So if you play a multiplayer ZDoom game on one computer
  (or even another EAX-using application), ZDoom needs to restore the
  environment when it regains focus.
- Maybe fixed: (See http://forum.zdoom.org/potato.php?t=10689) Apparently,
  PacketGet can receive ECONNRESET from nodes that aren't in the game. It
  should be safe to just ignore these packets.
- Fixed: PlayerIsGone() should set the gone player's camera to NULL in case
  the player who left was player 0. This is because if a remaining player
  receives a "recoverable" error, they will become player 0. Once that happens,
  they game will try to update sounds through their camera and crash in
  FMODSoundRenderer::UpdateListener() because the zones array is now NULL.
  G_NewInit() should also clear all the player structures.


SVN r233 (trunk)
2006-06-30 02:13:26 +00:00
Christoph Oelckers
38b0230253 - Added a 'default' setting to all color selection menu items that leaves
the font untranslated.
- Fixed: Heretic's monsters were missing the MF2_MCROSS flag.


SVN r232 (trunk)
2006-06-29 14:21:56 +00:00
Christoph Oelckers
81ee5b4942 - Fixed: Bouncing projectiles should not bounce off horizon lines. Now they
vanish instead.
- Changed masses of ice chunks and glass shards to make small splashes


SVN r231 (trunk)
2006-06-28 11:14:20 +00:00
Christoph Oelckers
7ff576adf4 - Fixed: P_UndoPlayerMorph didn't properly transfer the inventory. It just
copied the pointer instead of using ObtainInventory.


SVN r230 (trunk)
2006-06-27 23:49:45 +00:00
Randy Heit
3b39092412 - Moved the version resource into the "compile-time directives" section of
the resource script so that Developer Studio won't replace the version macros
  in it with their literal values. Now updating version.h is guaranteed to be
  enough to bump the version everywhere it's used.


SVN r225 (trunk)
2006-06-25 01:16:18 +00:00
Christoph Oelckers
7266c1e929 - Fixed: PIT_CheckThing checked AActor::tid instead of TidToHate to determine
whether a monster of the same species can be hurt.
- Added new ice chunk sprites submitted by Enjay.

SVN r223 (trunk)
2006-06-24 23:58:01 +00:00
Christoph Oelckers
3c3a9dd8f8 - Deleted the programmer death script from strifehelp.acs because it is no
longer used.
- Fixed: strifehelp.acs and the PUMPUPS cheat need to give 10 UpgradeStaminas
  because that item is using Inventory::Amount now.


SVN r220 (trunk)
2006-06-24 08:03:15 +00:00
Randy Heit
27ff97f16e - Changed the archive format for crash reports from tar.gz to zip.
- Went back to a single process model for crash reporting. It appears there
  are some machines that don't like having another process collect the
  information and report it. I still feel that having another process do
  it _should_ be more reliable, because that process can execute in a known
  good state. Ah well. I haven't yet seen anything that left the main process
  in a totally unrecoverable state, so it's probably okay. Unlike before, this
  single-process version is still GCC-compatible.


SVN r217 (trunk)
2006-06-24 03:47:17 +00:00
Christoph Oelckers
1faa6d57a4 - Fixed: The resurrect cheat didn't reset the player's damage type so
if he died by being frozen the blue blend didn't disappear.

SVN r216 (trunk)
2006-06-23 16:20:41 +00:00
Christoph Oelckers
27c00bcb95 - Fixed: FWarpTexture::MakeTexture must be declared virtual so that
the FWarp2Texture version of it can be called.

SVN r215 (trunk)
2006-06-23 08:20:08 +00:00
Christoph Oelckers
550d687bcf - Fixed: The check to prevent items from being given to dead players
didn't work properly. It has to be done in the cheat code, not in
  APlayerPawn::AddInventory.
- Fixed: The medikit and stimpack used a MaxAmount of 100 so that
  stamina upgrades were ineffective.

SVN r214 (trunk)
2006-06-22 20:52:49 +00:00
Christoph Oelckers
a0c912ef2d - Fixed: Jumping and crouching at the same time created jerky results.
Now jumping takes precedence and you can't crouch while pressing the
  jump key (which causes an uncrouch.)

SVN r213 (trunk)
2006-06-22 09:36:48 +00:00
Randy Heit
e6268bf0a2 - Fixed: DF_NO_COOP_WEAPON_SPAWN was handled backwardly.
SVN r212 (trunk)
2006-06-22 02:19:43 +00:00
Randy Heit
9eb0aa1a02 - Fixed: G_InitLevelLocals() needs to OR in the crouching bits, otherwise it
discards the jumping bits.
- ProcessActor() now sets C mode before retrieving the actor's name.
- Fixed: The new SC_GetString() scanner accepted slashes at the end of tokens
  when not in C mode, even if they were the start of a comment. Now if you
  want a slash at the end, you must quote it.


SVN r211 (trunk)
2006-06-21 23:22:17 +00:00
Christoph Oelckers
729e3b346d - Fixed: Decal actors with an invalid decal texture caused a crash.
SVN r210 (trunk)
2006-06-21 20:45:19 +00:00
Christoph Oelckers
e7f21912a5 Fixed: Player could crouch while dead.
SVN r209 (trunk)
2006-06-21 17:59:34 +00:00
Christoph Oelckers
14765bf64b - Fixed: The sidedef loader could allocate insufficient memory if a map
contained unused sidedefs.
- Fixed: Color control sequences were written to the log file. Since any
  entered console command contains such a sequence it was quite noticable.

SVN r208 (trunk)
2006-06-21 15:40:42 +00:00
Christoph Oelckers
f356e356a0 - Fixed: The obituary code didn't use the attacker's name for kills caused
by other players.

SVN r207 (trunk)
2006-06-21 12:10:36 +00:00
Christoph Oelckers
e2ac4c1168 - Fixed: PIT_StompThing never checked for COMPATF_NO_PASSMOBJ.
- Fixed: COMPATF_TRACE returned true for all two-sided lines, not just for
  those with the same sector on both sides.

SVN r206 (trunk)
2006-06-21 11:47:27 +00:00
Randy Heit
19dad144e1 - Added grubber's thingdef_exp.cpp. I might not use it later, but I can still
use it now.
- Fixed sc_man_scanner.re for negative numbers in C mode.


SVN r201 (trunk)
2006-06-20 21:21:52 +00:00
Randy Heit
c54f2f66fc - Unlimited the monster pain sounds in Hexen after playing as the Cleric a
while and killing centaurs with the flechette.
- Fixed: Moving to an old level in a hub caused the old player's inventory to
  spawn owned by the current player (but still hanging off the old player), so
  the game would hang when trying to delete it.
- Modified re2c so that it doesn't add a date to the file it generates. Thus,
  if it regenerates a file during a full rebuild, SVN won't see it as a change.
  Also updated it to 0.10.5.
- Fixed: SC_GetString() did not properly terminate sc_String when the last
  token in the file had no white space after it. Since I could not actually
  find the problem (it works fine in debug mode and I saw no logic errors),
  I decided to take this opportunity to reimplement it using an re2c-generated
  scanner. Now it's 1.6x faster than before and correctness is easier to
  verify.
- Fixed: FMODSoundRenderer::Shutdown() also needs to reset NumChannels.
- Added back the Manifest to zdoom.rc for non-VC8 Windows compilers.
- Fixed MinGW compilation again. Now it uses the same method as Makefile.linux
  to find all the source files so that it doesn't need to be manually updated
  each time source files are added or removed.
- Added the SVN revision number to the version string. A new tool is used to
  obtain this information from the svnversion command and write it into a
  header file. If you don't have the svn command line tools installed or didn't
  check it out from the repository, you can still build. I added some rules for
  this to Makefile.linux, and I assume they work because they do for
  Makefile.mingw.
- Fixed: MIDISong2 did not delete MusHeader in its destructor.


SVN r200 (trunk)
2006-06-20 20:30:39 +00:00
Christoph Oelckers
cf7d8ab43b - Removed the unused sfx_ variables for the chainsaw sounds.
- Fixed map name checks in idclev, hxvisit, for +map and the titlemap.
- Changed handling of Zips so that the patches/, graphics/, sounds/ and
  music/ subdirectories no longer are placed in the global namespace. Instead
  new namespaces are defined. These namespaces aren't merged, however and 
  searching in them either returns a lump inside it or one from the global
  namespace when it doesn't come from a Zip file. Proper order of files is
  still observed though. As a result proper use of the directories inside Zips 
  is strictly enforced now so that for example anything used as a patch must be 
  in the patches/ directory and won't be found anywhere else.


SVN r199 (trunk)
2006-06-19 15:31:10 +00:00
Christoph Oelckers
a42f98af15 - Added another set of ACS inventory functions which take a tid for the actor
and aren't limited to the script's activator.
- Added GetSectorLightLevel(tag), GetActorCeilingZ(tid) and
  SetActorPosition(tid, x, y, z, fog) ACS functions.
- Fixed: First initialization of camera textures should not mark the rendered
  lines as mapped.

SVN r198 (trunk)
2006-06-18 15:49:00 +00:00
Randy Heit
c87e2252ed - Finally implemented code to keep some or all of your inventory intact when
respawning in coop. Now the new inventory code should finally be complete. :-)
- Fixed: PROP_Inventory_PickupMessage was improperly defined for non-VC++
  compilation.


SVN r197 (trunk)
2006-06-18 04:10:47 +00:00
Christoph Oelckers
1bd6ac028b - Converted a_doomhealth.cpp to DECORATE.
- Added a PickupMessage property to the internal actor parser, replaced
  most of the virtual PickupMessages with it and placed the code that
  reads the metadata into AInventory::PickupMessage. Now the
  PickupMessage method is truly virtual and I can do:
   Added a Health.LowMessage property to define double message items like
   Doom's medikit in DECORATE.
- Since defining Mana3 as an ammo type and then overriding the TryPickup
  method means that this item defeats all ammo checks in the game it might
  as well be defined as a CustomInventory item. At least this fixes the
  amount given in easy and very hard skills.
- Converted all ammo items to DECORATE.
- Changed internal property setting of ammo types and sister weapons
  to use fuglyname as for DECORATE definitions. This allows to export
  the ammo definitions into DECORATE definitions without doing it for
  the weapons themselves.
- Replaced obituary methods with actor properties.
- Fixed: The secret map check didn't work for maps inside Zips.



SVN r196 (trunk)
2006-06-17 20:29:41 +00:00
Christoph Oelckers
9338c7360b - Fixed: The secret map check didn't work for maps inside Zips.
SVN r195 (trunk)
2006-06-17 07:46:02 +00:00
Randy Heit
d99f5b4b99 SVN r191 (trunk) 2006-06-15 03:31:19 +00:00
Randy Heit
6e198e034b - Removed my "backwards compatibility fix" for APROP_Speed. It turns out that
in all the public versions where monster speed is not fixed point, you
  couldn't modify the monster's speed due to a bug in P_Move() anyway. So
  there's nothing to be backward compatible with.


SVN r190 (trunk)
2006-06-14 23:22:14 +00:00
Christoph Oelckers
fd79fac52c - Fixed: Saving on maps that don't contain a MAPINFO definition didn't work.
- Fixed: The Zip loader loaded all WADs inside a Zip into the lump directory.
  This is only supposed to be done for WADs in the root directory.
- Complete restructuring of the map loading code. Previously the only way
  to put maps into Zips was to load them as embedded WADs which caused
  some problems, most importantly that the map's file name was irrelevant
  and the internal map label was used instead. With the new code there
  is now a properly defined way to add maps to Zips:
  * Maps are placed in a subdirectory called 'maps'.
  * Maps are stored as WADs that contain all map related lumps.
  * The first lump in the map's WAD directory must be the map label.
  * All lumps not belonging to the first map are ignored.
  * The map's file name determines the name the map is identified with. 
    For maps stored this way the internal map label is ignored so with this 
    method renaming maps is as easy as renaming a file and it is no longer 
    necessary to manipulate the map label.
  With the new code it is also possible to load external maps without
  adding them to the WAD list. Type 'open mapfile.wad' in the console
  to start such a map.
  The new code also performs stricter lump name checks to prevent accidental
  loading of non-map data.


SVN r188 (trunk)
2006-06-14 15:56:56 +00:00
Randy Heit
2a0216cf6f - Fixed: In the past, ZDoom worked like Doom and used integral values for
monster speeds. Now it uses fixed point so that an actor's speed property
  can always be considered is always fixed point. So DoSetActorProperty()
  should scale very slow speeds, just like dehacked's PatchThing() has done
  for some time now.


SVN r187 (trunk)
2006-06-14 03:57:58 +00:00
Christoph Oelckers
37ab80b566 - Changed UpgradeStamina to use AInventory's Amount and MaxAmount to
control the amount of upgrade and the maximum that can be reached.

SVN r186 (trunk)
2006-06-12 20:54:39 +00:00
Christoph Oelckers
bb5a44fc90 - Fixed: The skin loader assumed that all skin textures are in Doom patch
format. Now it calls FTexture::CreateTexture to do proper checks.
- Removed the PickupSound method from FakeInventory and changed it so that
  it uses AInventory::PickupSound to store its custom pickup sound.
- Removed the PickupMessage method from FakeInventory. This can be handled
  by the standard pickup message code now that it uses the meta data for the
  message.
- Fixed: The maximum indices for StrifeTypes were inconsistent. Now the
  allowed range is 0-1000 in all situations.
- Fixed: Setting a local SNDINFO for a map deleted all skin based sounds.
- Added a crouchsprite property to the skin info.
- Fixed: Crouching sprites must be checked each frame, not just each tic.
- Added an srand call to D_DoomMain in order to randomize the values returned
  by rand which is being used to shuffle the playlist.


SVN r185 (trunk)
2006-06-11 11:28:48 +00:00
Randy Heit
5859aa7194 - Fixed: Information added with addkeysection and addmenukey was never freed.
- Fixed: A classic decorate FakeInventory's PickupText was never freed.
- Fixed: Colored lights were never freed.
- Fixed: When a dehacked patch was applied, the dehacked StateMap was never
  freed.
- Removed termdone checks around atterm(S_ClearSoundData) and
  atterm(S_Shutdown) because atterm() already checks for duplicates.
- Fixed: S_ClearSoundData() should unload all sounds before it clears S_sfx.
- Fixed: AltSoundRenderer::LoadSound() didn't check if the sound had already
  been loaded and lost the old sound data if it had been.
- Fixed: FinishDehPatch() needlessly duplicated the new DehackedPickup's name.
- Fixed: PatchStrings() allocated a private string and never freed it.


SVN r183 (trunk)
2006-06-11 01:06:19 +00:00
Christoph Oelckers
9655ee9843 - Changed music name handling in MAPINFO so that music can be specified by
full path of a file in a Zip.
- Fixed: intermusic in MAPINFO was limited to WAD lumps and couldn't handle 
  external data.

ACS:

- Fixed: Global and World array symbols didn't initialize their array information.


SVN r182 (trunk)
2006-06-09 08:19:46 +00:00
Randy Heit
c808041337 - Fixed: Trying to play a 0-length song from a wad inside a zip caused a crash.
SVN r181 (trunk)
2006-06-09 00:26:07 +00:00
Christoph Oelckers
6b821afa64 SVN r179 (trunk) 2006-06-07 20:53:40 +00:00
Randy Heit
7a601515df - ClassifyLine now chooses either SSE2 or regular x87 math depending on whether
or not SSE2 is available at runtime. Since most of the time is spent in
  ClassifyLine, using SSE2 in just this one function helps the most.
- Nodebuilding is a little faster if we inline PointOnSide.
- Changed FEventTree into a regular binary tree, since there just aren't enough
  nodes inserted into it to make a red-black tree worthwhile.
- Added more checks at the start of ClassifyLine so that it has a better chance
  of avoiding the more complicated checking, and it seems to have paid off with
  a reasonably modest performance boost.
- Added a "vertex map" for ZDBSP's vertex selection. (Think BLOCKMAP for
  vertices instead of lines.) On large maps, this can result in a very
  significant speed up. (In one particular map, ZDBSP had previously
  spent 40% of its time just scanning through all the vertices in the
  map. Now the time it spends finding vertices is immeasurable.) On small maps,
  this won't make much of a difference, because the number of vertices to search
  was so small to begin with.


SVN r173 (trunk)
2006-06-06 21:39:08 +00:00
Christoph Oelckers
15681d0588 - Added a StartConversation special that allows automatic activation of Strife
dialogs.
- Added Thing_Raise special that allows Arch-Vile like resurrections from scripts
  or DECORATE states.
- Added a RadiusDamageFactor property for actors. This replaces the hard coded
  factor of 0.25 for Hexen's players.
- Added new SpawnProjectile function to ACS. It's the same as Thing_Projectile2
  but the projectile is specified by name, not spawn ID.
- Added MAPINFO option to set the compatibility flags. If this is done these
  explicit settings will take precedence over the compatflags CVAR.

SVN r164 (trunk)
2006-06-03 12:30:11 +00:00
Randy Heit
4325fb8993 - Merged in recent ZDBSP fixes:
- Added code to explicitly handle outputting overlapping segs when
   building GL nodes with ZDBSP, removing the check that discarded
   them early on.
 - AddIntersection() should convert to doubles before subtracting the vertex
   from the node, not after, to avoid integer overflow. (See cah.wad, MAP12
   and MAP13.) A simpler dot product will also suffice for distance calculation.
 - Splitters that come too close to a vertex should be avoided. (See cata.wad.)
 - Red-Black Tree implementation was broken and colored every node red.
 - Moved most of the code for outputting degenerate GL subsectors into another
   function.


SVN r160 (trunk)
2006-06-01 01:43:16 +00:00
Christoph Oelckers
fd1a239c66 SVN r158 (trunk) 2006-06-01 00:05:03 +00:00
Randy Heit
12b066ef2e - Fixed: When building GL nodes for Deathkings MAP42, one polyobject had one
of its segs thrown away, so the map could not start. This was because the
  nodebuilder assumed all subsectors would be 2D and could not handle the
  case where a degenerate 1D subsector is created. In this case, that happens
  because that map has three polyobjects in the middle of the void, so the only
  way to assign them to a subsector is to use a 1D subsector.


SVN r153 (trunk)
2006-05-29 03:27:32 +00:00
Christoph Oelckers
fb31db860d - Fixed: Monsters couldn't hurt other monsters of the same species if they
were supposed to hate them.
- Since I was editing the file anyway I added checks for Heretic's and Strife's
  damaging floor types to DCajunMaster::IsDangerous.
- Added a NULL pointer check to DCajunMaster::TurnToAng because a crash log
  indicated that this can happen.
- Fixed: Strife's energy pod contains 20 units when dropped by monsters.
  To achieve this I added an Ammo.DropAmount property because there are
  no other means to control this from inside a conversation script.

SVN r151 (trunk)
2006-05-28 14:54:01 +00:00
Christoph Oelckers
96f6cfd18a SVN r148 (trunk) 2006-05-27 10:27:51 +00:00
Randy Heit
67da924a02 - Changed makewad's zip routines so that it simply stores files that cannot be
compressed smaller instead of using deflate anyway. Saves 133 bytes currently.


SVN r147 (trunk)
2006-05-27 02:17:30 +00:00
Christoph Oelckers
5abd6b972c SVN r146 (trunk) 2006-05-26 08:19:39 +00:00
Randy Heit
90b5130db0 - Fixed: The C code in AltSoundRenderer::CopyAndClip() did not shift the sample
data enough (2 bits instead of 8), so it was super loud and aliased.
- Fixes for GCC 4.1: Several type-punned pointer warnings, but more
  importantly, declaring a friend function inside a class body is no longer
  enough to declare that function globally; you must declare it again outside
  the class.
- Upgraded FArchive::SerializePointer so that it can store 32-bit indices.
- ACS printing pcodes now build their string in an FSttring instead of a fixed
  sized buffer on the stack.


SVN r145 (trunk)
2006-05-26 04:38:22 +00:00
Randy Heit
43abfba723 - Modified ccdv-win32 to show "Generating X" messages when running lemon and
re2c instead of "Linking X".
- Updated lemon and re2c to the latest versions and ported dehsupp to use them
  for code generation. (Xlatcc is next.)
- Added function level linking for Makefile.mingw.


SVN r144 (trunk)
2006-05-25 04:32:20 +00:00
Randy Heit
f50b284fda SVN r142 (trunk) 2006-05-24 15:31:21 +00:00
Christoph Oelckers
283d5971fe - Fixed: A_SpawnItem performed an integer multiplication with fixed point
values to calculate the spawn position.
- Fixed: A_SpawnItem tried to set the spawned actor's angle before checking
  the validity of the returned pointer.

SVN r141 (trunk)
2006-05-24 13:11:30 +00:00
Randy Heit
2ff618e474 SVN r140 (trunk) 2006-05-24 00:22:15 +00:00
Randy Heit
cb18719d05 - Fixed: The new sound pausing on menu open interrupted Strife conversations.
- Did some very preliminary support for x64 compiling.
- Now I see why makewad is using the __fastcall calling convention by default:
  Because the release zlib is built with it as well.
- Fixed: Conversion from 'const char *' to 'char *' in DEM_SAVEGAME case in
  Net_DoCommand().
- Updated the project files for Visual C++ 2005.


SVN r138 (trunk)
2006-05-23 04:25:49 +00:00
Randy Heit
ade6319a3c - Fixed: The new Thing_ChangeTID check would infinite loop if an actor
scheduled for destruction was encountered.

SVN r137 (trunk)
2006-05-22 22:02:13 +00:00
Christoph Oelckers
7f2ac35dce - Fixed: Thing_ChangeTid must check whether the actor whose tid is about to
be changed is scheduled for destruction.
- Fixed: G_FinishTravel added the player to the hash chain twice.
- Fixed: The animations for Doom's E3 intermission used incorrect patch names.
- Added a check for MF_NOLIFTDROP to PIT_CeilingRaise because the overlapping 
  bridges in 007LTSD got moved by this function.

SVN r136 (trunk)
2006-05-22 09:53:09 +00:00
Randy Heit
df799ade24 - Fixed GCC 4 warnings in FNodeBuilder::CreateSubsectorsForReal().
- Changed f_finale.cpp/atkstates[] into a static variable, since its
  anonymous type prevents it from being accessed from other files anyway.
- Fixed: The behavior of the eventtail advancement in d_net.cpp/CheckAbort()
  was compiler-dependant.
- Fixed warnings GCC 4 threw up while compiling re2c and lemon.
- Removed __cdecl from makewad.c again. This is already defined as a builtin
  for MinGW, and redefining it produces a warning. (Why is main explicitly
  declared __cdecl anyway?)
- Fixed building ccdv-win32 with GCC 4. GCC 4 creates a memcpy call, which
  won't work because it doesn't get linked with the standard C library.


SVN r135 (trunk)
2006-05-22 01:34:07 +00:00
Randy Heit
62b7dd3efc - Fixed default.cbd and Makefile.mingw for current code state.
- New: Pausing the game (through any means, not just the pause key) now pauses
  sound effects as well as music. "PauseMusicInMenus" has been added as a
  MAPINFO flag to also pause the music when a menu or the console are open.


SVN r134 (trunk)
2006-05-21 02:10:16 +00:00
Christoph Oelckers
f8bdceab38 - Fixed: The automap code had the check for rotation reversed.
- Changed type PClass::FreeIndices to TArray<unsigned int> because that's
  the type of the indices.
- Fixed: makewad.c needs __cdecl for non-Windows builds.
- Fixed: FinishThingdef didn't check whether the WeaponClass pointer in
  AWeaponPiece was a valid name.



SVN r133 (trunk)
2006-05-20 09:16:08 +00:00
Randy Heit
2b91f31d86 - Fixed: FloorAndCeiling_Raise/Lower did not work with slopes because they
used ZatPointDist instead of PointToDist to calculate the destination
  distance for the plane equation.
- Fixed: Sky scroll positions could "jump" once they wrapped past position
  32767. An fmod now keeps them within range of the sky textures' real widths.

SVN r132 (trunk)
2006-05-20 01:34:31 +00:00
Christoph Oelckers
3431564b02 - Increased the StrifeTypes array to 999 entries so that custom WADs have
more flexibility.



SVN r131 (trunk)
2006-05-19 21:31:25 +00:00
Randy Heit
cf63f2c28e - Added a check against rw_havelow in the "sky hack" part of R_NewWall().
This prevents the front ceiling from being moved up if there has been no
  texture defined to draw on the wall. This makes various parts of The
  Darkest Hour render properly again while still allowing the crosses in
  heroes2.wad and lamasery.wad to render correctly.

SVN r130 (trunk)
2006-05-19 06:22:36 +00:00
Randy Heit
93c5753270 - Added a NULL sector check to P_CheckFakeFloorTrigger() because there was
a crash report indicating that an actor being pushed up by a moving floor
  had a NULL sector. Since this field should be valid for every actor, the
  debug build gets an assert here, and the release build just returns without
  doing anything.
- Fixed: Camera textures were not rendered properly when the underlying
  canvas's pitch and width were different (which, really, only happens if
  you use ridiculously large camera textures).
- Fixed: FCanvasTextureInfo's were never freed.
- Fixed: MAPINFO special action structures were not freed.
- Fixed: FSingleLumpFont::LoadFON2() never freed its widths2 array.


SVN r129 (trunk)
2006-05-19 05:14:37 +00:00
Christoph Oelckers
1971f97fd6 - Fixed: In case the path to strife1.wad didn't contain any '/' an
incorrect path was created for voices.wad.
- Fixed: The code building the path for Strife's voices.wad called the
  wrong FString constructor.
- Fixed: LS_Thing_SetGoal set MF5_CHASEGOAL in flags, not flags5.

SVN r128 (trunk)
2006-05-18 15:03:35 +00:00
Randy Heit
a39f5bb8f7 - Fixed: M_NotifyNewSave() needlessly created a copy of the filename.
- Fixed: Any touching_sectorlists for actors unlinked in G_StartTravel() were
  lost forever.
- Fixed: DLightningThinker::Serialize() did not delete the old
  LightningLightLevels array when loading from an archive.
- Fixed: Although I moved the correct polyobject freeing code into
  P_FreeLevelData(), I left the old wrong code there too, which just deleted
  the array without deleting anything hanging off of it.


SVN r127 (trunk)
2006-05-18 04:25:26 +00:00
Randy Heit
ba01f00d7c SVN r126 (trunk) 2006-05-18 01:43:19 +00:00
Randy Heit
3f51b80cac - Implemented Quasar's suggestion to use line flag 2048 as a "reserved" flag
that, if set, clears all the non-original-Doom flags on a line. This is
  only for Doom format maps when playing Doom.

SVN r124 (trunk)
2006-05-17 02:19:20 +00:00
Randy Heit
c770d4a99a - Added support for automatically loading ACS objects (even for Doom-format
maps). To use it, compile the ACS files as ordinary libraries placed
  between A_START/A_END markers. Then outside the markers, create a lump
  called LOADACS. This is just a plain text lump that lists all the libraries
  you want to autoload with every map. You can do this with as many libraries
  as you want, and LOADACS lumps are also cummulative.

SVN r123 (trunk)
2006-05-17 01:38:07 +00:00
Randy Heit
c4bda7e0be - Fixed: ApplyActorDefault() must ensure that dataint is non-negative before
calculating a non-NULL state. When compiling with Visual C++, states are
  stored in the defaults list as byte values, but when compiling with GCC,
  they are passed as 32-bit arguments to the function directly. So in VC++,
  using ~0 to specify a NULL state appears as 255, but in GCC, it appears as
  -1.

SVN r121 (trunk)
2006-05-16 22:31:58 +00:00
Christoph Oelckers
2ad91cc973 - Added a missing NULL pointer check to APlayerPawn::Tick.
- Fixed: The falling scream should not be played when the player is under
  water.


SVN r120 (trunk)
2006-05-16 17:53:15 +00:00
Randy Heit
6cd1e2ce6a - Fixed: CopyPlayer() in p_saveg.cpp should use normal assignment, not
memcpy to copy the player structures.
- Fixed compilation with MinGW again and removed most of the new warnings.

And following is the log that I forgot to paste in for the previous commit:

- Changed the memory management for FString. Instead of using a garbage
  collected heap, it now uses normal heap calls and reference counting to
  implement lazy copying. You may now use bitwise operators to move
  (but not copy!) FStrings around in memory. This means that the
  CopyForTArray template function is gone, since TArrays can now freely
  move their contents around without bothering with their specifics.
  
  There is one important caveat, however. It is not acceptable to blindly 0
  an FString's contents. This necessitated the creation of a proper
  constructor for player_s so that it can be reset without using memset. I
  did a quick scan of all memsets in the source and didn't see anything else
  with a similar problem, but it's possible I missed something.
- Fixed: Build tiles were never deallocated.
- Fixed: Using Build's palette.dat only got half the palette right.


SVN r117 (trunk)
2006-05-16 04:19:20 +00:00
Randy Heit
ac53ed6ecd SVN r116 (trunk) 2006-05-16 02:50:18 +00:00
Christoph Oelckers
afd6a1258f - Added a show_obituaries option to disable obituaries without disabling
other more important message types which have lower priority for some
  reason.
- Added a menu option for show_messages after accidentally switching it
  off far too often and wondering why no messages appear.
- Added crouching DoomPlayer sprites submitted by Enjay.
- Fixed DF_NO_CROUCH was not checked.
- Fixed: The intermission script parser had some of its cases in the
  keyword parser incorrectly sorted.
- Fixed: atterm was still defined to take a STACK_ARGS function argument.
- Added an AltFlash state for weapons.
- Turned FloatSpeed into an actor property and changed the value to 5
  for all floating Strife actors, as a comment in the source indicated.
(r114 below):
- Added GZDoom's code for Vavoom slope things because I wanted to test
  something with a map from Silent Steel.
- Added nocrouch and allowcrouch MAPINFO commands and a DF_NO_CROUCH
  dmflag.
- Added GZDoom's crouching code after cleaning it up so that adding
  crouching sprites will be easier.

SVN r115 (trunk)
2006-05-15 15:28:46 +00:00
Christoph Oelckers
caed57baa5 SVN r114 (trunk) 2006-05-14 14:30:13 +00:00
Christoph Oelckers
b97c417101 - Fixed: P_StartScript was missing a NULL pointer check for the error
message. When trying to puke a script outside a map it crashed.
- Fixed: The random number generator for large numbers must mask out the
  sign bit before performing a modulo.
- Now that the conversation states are pointers there is no need to make
  AActor::ConversationAnimation virtual. No class overrides this method 
  anymore.
- Replaced AMacil1::TakeSpecialDamage with MF5_NODAMAGE.
- Fixed: AMacil2::TakeSpecialDamage and AOracle::TakeSpecialDamage didn't
  check whether inflictor was NULL and crashed when used with 'kill monsters'.
- Fixed: Some Strife decorations didn't loop their animation


SVN r113 (trunk)
2006-05-13 21:22:08 +00:00
Christoph Oelckers
bb617dfbfd - Changed: The decision whether blood splatter sprites are spawned is no
longer determined by game. Instead there's a new flag, MF5_BLOODSPLATTER
  which is deciding what to do. To keep backwards compatibility this flag
  is unset for projectiles in Doom and Strife and set for them in Heretic 
  and Hexen. The same applies to DECORATE but of course the flag can be
  manipulated here.
- BLODxx sprites are now globally renamed to BLUDxx when not playing Doom. 
  This allows using the same states in every game, including the 
  Raven-specific blood actors.
- Gave the bullet puff and the axe blood masses of 5 so that the make small
  splashes.
- Added A_Light(value) code pointer for DECORATE to generalize the weapon
  light effect.
- Added 'noskillmenu' option to MAPINFO episode definitions. This is for
  WADs that want to implement a skill selection level.
- Added APROP_ChaseGoal and APROP_Frightened actor properties for ACS.
- Added MF5_CHASEGOAL flag that makes monsters to go after their goal even
  if they have a valid target.
- Fixed some issues with the changes to P_NewChaseDir I made to include
  MBF's dropoff logic.
- Added a PowerFrightener powerup class. It seemed like such a waste to
  have this cool feature but no means to use it in a decent fashion.
- Fixed: S_Init and S_ParseSndInfo should call atterm only once but not
  each time they are called.

SVN r112 (trunk)
2006-05-13 12:41:15 +00:00
Randy Heit
8fcf93d65a - Merged a lot of these static destructor-only structs into regular
functions added to the exit chain with atterm so that they can be called
  in a deterministic order and not whatever order the linker decides to put
  them in.
- Fixed: DCajunMaster did not free its getspawned.
- Fixed: P_FreeLevelData() did not free ACS scripts.
- Fixed: Level snapshots were not freed at exit.
- Fixed: The save/load menu list was not freed at exit.
- Fixed: FCompressedMemFile needs a destructor to free the m_ImplodedBuffer.
- Fixed: G_DoLoadGame() did not free the engine string.
- Fixed: M_ReadSaveStrings() did not free the engine string.
- Fixed: Processing DEM_SAVEGAME did not free the pathname string.
- Added a check for truncated flats to FFlatTexture::MakeTexture() because
  Heretic's F_SKY1 is only four bytes long.
- Added a dump of the offending state to the "Cannot find state..." diagnostic.
- Fixed: FCompressedFile did not initialize m_Mode in its default constructor.
- Fixed: Heretic and Hexen status bars did not initialize ArtiRefresh.
- Fixed: PNGHandle destructor should use delete[] to free TextChunks.


SVN r111 (trunk)
2006-05-12 03:14:40 +00:00
Christoph Oelckers
01441cd4f0 - Converted the stealth monsters to DECORATE.
- Added string replacement option to obituary strings.
- Changed lock and pickup message handling so that it is either a real
  string or a LANGUAGE identifier. The only reason I did the mixed format
  in the first place were Hexen's lock messages but they have been 
  replaced by unique strings in the mean time so the feature isn't needed 
  any more.
- Added a flags parameter to TranslucentLine.
- Extended the second arg of Line_SetIdentification to set not only 
  ML_ZONEBOUNDARY but all 8 bits of the third byte in the flag word.
  This allows a relatively simple means of setting all the new flags
  directly.
- Moved ML_ZONEBOUNDARY to doomdata.h so that it is in the same place as the
  other line flags.
- Fixed: Strife's teleport swirl didn't loop its animation.
- Fixed: Strife's rat is not supposed to be shootable.

SVN r110 (trunk)
2006-05-11 17:56:35 +00:00
Christoph Oelckers
e89867489c - Fixed: Strife's MiniMissile pickup amount was still incorrect.
- Moved Strife's random dialogs into the string table. Now it should also be
  possible to define dialogs for other actors as well.


SVN r109 (trunk)
2006-05-11 12:11:59 +00:00
Randy Heit
2b391c69a1 - Fixed: sdl/i_net.cpp needs the same changes as win32/i_net.cpp.
SVN r108 (trunk)
2006-05-11 05:02:47 +00:00
Randy Heit
b8e61376c3 - Fixed: When revisiting a map in a hub, the player could spawn at the wrong
height if the floor had moved while they were there before. This was because
  the player was spawned on the original copy of the map before the changes to
  it were dearchived, so they didn't know about the new floor height.
- Fixed: Calling BaseFileSearch() and letting it fill in the file's extension
  didn't work because the space for the path was deallocated before it
  returned.
- Guess we're not leak-free yet. Try travelling around in a hub and see that
  it leaks. I don't have time to track it down right now.


SVN r107 (trunk)
2006-05-11 05:00:35 +00:00
Randy Heit
a0c88a9b31 - Yay! We now seem to be free of memory leaks! The next step will be to
merge a lot of these static destructor-only structs into regular
  functions added to the exit chain with atterm so that they can be called
  in a deterministic order and not whatever order the linker decides to put
  them in. (Interestingly, the amount of memory used when repeatedly
  executing the same map command at the console varies up and down, but it
  now stays relatively stable rather than increasing unbounded.)
- Fixed: The list of resolutions in the video modes menu was not freed
  at exit.
- Fixed: mus_playing.name was not freed at exit.
- Fixed: SN_StopAllSequences() should be called at the start of
  P_FreeLevelData(), not just before the call to P_SetupLevel() in
  G_DoLoadLevel(), so it can run even at exit. And C_FullConsole() can
  call P_FreeLevelData() to free more memory too.
- Fixed: StatusBar was not freed at exit.
- Fixed: spritesorter was not freed at exit.
- Fixed: Bad things happened if FString's data pool was destroyed before
  all C_RemoveTabCommand() calls were made.
- Added an overload for FArchive << FString.
- Fixed: The players' log text was not freed at exit.
- Fixed: Bot information was not freed at exit.
- Fixed: doomcom was not freed at exit. But since it's always created,
  there's no reason why it needs to be allocated from the heap. My guess
  is that in the DOS days, the external packet driver was responsible for
  allocating doomcom and passed its location with the -net parameter.
- Fixed: FBlockNodes were not freed at exit.
- Fixed: Openings were not freed at exit.
- Fixed: Drawsegs were not freed at exit.
- Fixed: Vissprites were not freed at exit.
- Fixed: Console command history was not freed at exit.
- Fixed: Visplanes were not freed at exit.
- Fixed: Call P_FreeLevelData() at exit.
- Fixed: Channel, SoundCurve, and PlayList in s_sound.cpp were not freed at
  exit.
- Fixed: Sound sequences were not freed at exit.
- Fixed: DSeqNode::Serialize() did not resize the m_SequenceChoices array
  when loading.


SVN r106 (trunk)
2006-05-11 04:00:58 +00:00
Randy Heit
0069ca4072 - Fixed mvlineasm1 and mvlineasm4 so that they can be used with textures
taller than 256 pixels. There was a very slight performance hit for this,
  but I was able to tweak mvlineasm4 to make it approximately as fast as
  before. Interestingly, maskwallscan manages to be nearly as fast as
  wallscan despite having to check every pixel for transparency. I'm
  tempted to dump all the old masked rendering code and use
  (trans)maskwallscan for everything for the sake of simplicity: Only
  two functions to maintain for each render style, and much less
  complicated supporting code. Currently, I need five different functions
  for each rendering style: One traditional column-at-a-time style like
  Doom did it originally, two for rt_draw4cols, and two for transmaskwallscan.
  (Right now, I have cheated, and just done the ones that can be used
  by walls for transmaskwallscan, so the actual number of different functions
  isn't quite so high.) For small textures, such as font characters and
  far-away sprites, I'm sure maskwallscan is faster than the current code.
  For large textures, it's probably still competitive even if it isn't faster.
  But considering how similar wallscan and maskwallscan perform, the
  difference is probably pretty minimal, and maskwallscan still might come
  out ahead due to its simpler overhead.


SVN r105 (trunk)
2006-05-11 01:15:15 +00:00