Commit graph

1122 commits

Author SHA1 Message Date
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
6863938e67 - Texture animation improvements:
* Animations are now millisecond-accurate, so delays in ANIMDEFS can have
    fractional parts.
  * Cleaned up the animation code and moved it into r_anim.cpp.
  * Blood's oscillating texture animations are now available for use by actual
    supported games by adding the word "oscillate" after a "range" definition
    in ANIMDEFS.
  * Not exactly texture animation, but it's handled in the same function as
    texture animations: Scrolling skies also have millisecond precision.


SVN r125 (trunk)
2006-05-18 01:42:50 +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
3e9fbf5616 - Don't need blocks.nas in the repository, as it hasn't been used for ages.
SVN r122 (trunk)
2006-05-16 23:25:22 +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
Christoph Oelckers
4a8ca6d134 Changed TAG_MORE parameter to a struct containing a va_list to ensure that no matter how va_list is defined the address can be taken.
SVN r119 (trunk)
2006-05-16 10:06:23 +00:00
Christoph Oelckers
bb25008804 Fixed ZDBSP seg splitter. On occasion it assigned the offset to the incorrect of the two segs created by a split.
SVN r118 (trunk)
2006-05-16 09:26:54 +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
Christoph Oelckers
ee12c25f47 - Fixed: PClass::CreateNew didn't check whether the class had valid
defaults and tried to copy data from a NULL pointer.
- Fixed: FireThing and BrassTorch were misspelled in hexendecorations.txt


SVN r104 (trunk)
2006-05-10 16:43:46 +00:00
Christoph Oelckers
159c548c5a - Changed A_ChangeFlag so that it doesn't need to alter the flag
string. With strings being passed as names this is unsafe.
- Removed unused parameter types from the function parameter parser for
  DECORATE.
- Changed: All actor name parameters in DECORATE are now passed as 
  FNames, not as strings. 
- Fixed: The MAPINFO parser stored the RedirectType as a type pointer.
  But at this point DECORATE hasn't been read yet so this was limited to
  the internal classes.
- Fixed: TXT_NEED_IDCARD wasn't terminated with a ';'.
- Fixed: Strife's DeadRebel was missing its DoomEdNum.
- With names as type identifiers it is no longer necessary to remap
  the monster types to internal constants in A_BossDeath.
- Fixed: A_BossDeath got the string from a name - just to get a name from
  the string. Using the name directly is sufficient.


SVN r103 (trunk)
2006-05-10 15:07:14 +00:00
Randy Heit
032526340a - Redid ClearLcoks() fix that I accidentally removed.
SVN r102 (trunk)
2006-05-10 04:12:43 +00:00
Randy Heit
c70ba60fd6 - Fixed: Some non-POD arguments to printf and a typo in the GCC portion of dobject.h.
SVN r101 (trunk)
2006-05-10 03:29:07 +00:00
Randy Heit
d1ba4a1b76 - Added a new setting for am_rotate: 2 will enable rotation only for the
overlay map while leaving the regular map unrotated.


SVN r100 (trunk)
2006-05-10 03:24:32 +00:00
Randy Heit
0bf87acb00 - Added a new setting for am_overlay: 2 will disable the normal automap and
show only the overlayed version.


SVN r99 (trunk)
2006-05-10 03:17:34 +00:00
Randy Heit
def53bdd5d - Fixed?: WallSpriteColumn apparently needs to set dc_texturefrac. At least
Valgrind seems to say so.
- Fixed: The FWadCollection destructor needs to use free to free the LumpInfo
  and Wads arrays.
- Fixed: The ColorMapKiller needs to use the delete[] form of delete.
- Fixed: FConfigFile::ClearCurrentSection() should be calling the delete[] form
  of delete to free the entry.
- Fixed: FPatchTexture::MakeTexture() does not need to blindly recreate the
  Spans if they already exist.
- Fixed: The FMultiPatchTexture destructor did not call its Unload() method.
- Restored the original padding calculation to FMultiPatchTexture::MakeTexture().
  I believe the Valgrind errors were caused by accessing off the end of the
  screen buffer, not from accessing off the end of a texture.


SVN r98 (trunk)
2006-05-10 03:08:27 +00:00
Randy Heit
d878c2e7d6 - Backported the classnames-are-names changes from the FP code.
SVN r97 (trunk)
2006-05-10 02:40:43 +00:00
Christoph Oelckers
632e03fa7e - Fixed a few Strife ammo amount values.
- Fixed the ClearLocks function so it doesn't crash when called before the
  ActorInfos have been created.

SVN r96 (trunk)
2006-05-10 00:25:53 +00:00
Randy Heit
de54d7a667 Fixed: vplce[] has an underscore under Linux?!?
SVN r95 (trunk)
2006-05-09 22:12:24 +00:00
Randy Heit
199d4dc57f - Backported the improved hierarchical dumpclasses command from the FP code.
SVN r94 (trunk)
2006-05-09 22:10:43 +00:00
Randy Heit
981f663319 - Updated Jim's Makefile.linux.
- Added support for wrapping midtextures vertically.
- Since zdoom.wad is now zdoom.pk3, the default mapinfos can use full pathnames.
  So now they do.
- Fixed: The DSimpleCanvas constructor used a pitch too narrow on screens wider
  than 640 pixels when using a non-AMD processor and the processor's L1 cache
  line size could not be determined. I think this should fix the issue of
  weirdly rendered 8 pixel wide borders on the left and right of the screen that
  some people experienced.
- Fixed: The secnodes were never freed.


SVN r93 (trunk)
2006-05-09 21:30:31 +00:00
Christoph Oelckers
7ed597fcbe - Fixed: The FSpecialFont constructor created the name string twice.
- Fixed: The animated door parser was still leaking memory when it encountered
  an invalid animation due to missing textures.
- Fixed: The music volume list wasn't freed.
- Fixed: The image for WADs that were loaded from inside Zips was never freed.


SVN r92 (trunk)
2006-05-09 21:21:57 +00:00
Christoph Oelckers
6de9e9a433 - Changed FDoorAnimation deletion so that the array takes care of it. The
original destructor approach would have necessitated a lot more supporting
  code to work as intended.


SVN r91 (trunk)
2006-05-09 15:51:17 +00:00
Christoph Oelckers
763efb3682 - Fixed: Skin definitions were never freed.
- Fixed: Names in terrain definitions were never freed. Replacing them with
  FNames would have been a good idea anyway.
- Fixed: The lock definitions were never freed.
- Fixed: FDoorAnimation was missing a destructor.
- Fixed: animation and switch definitions were never freed.
- Replaced all other places where FindType was used with FNames with 
  IFindType.

SVN r90 (trunk)
2006-05-09 15:07:45 +00:00
Christoph Oelckers
ace3ed1188 May 9, 2006 (Changes by Graf Zahl)
- Fixed: If you want to use a name as the missile parameter for the basic
  attack functions the type search in DoAttack must be case insensitive.
- Fixed: APowerup::DoEffect must do more thorough checks before resetting
  the fixed colormap.


SVN r89 (trunk)
2006-05-09 08:58:30 +00:00