Commit graph

2855 commits

Author SHA1 Message Date
Christoph Oelckers
a41ebfeb73 - Duke: fixed the explosion's lighting hackery.
The animatesprites handler in the old code got called on the already animated sprite, meaning it will only activate for the first frame.
To do this right the code had to be moved to applyanimations and be guarded by a flag.
2023-09-10 20:42:26 +02:00
alexey.lysiuk
ecc0301f5b - removed obsolete forward declarations
source/core/savegamehelp.h:10:1: error: declaration conflicts with target of using declaration already in scope
source/core/savegamehelp.h:13:24: error: reference to 'FileReader' is ambiguous
source/core/gameconfigfile.h:40:1: error: declaration conflicts with target of using declaration already in scope
source/core/gameconfigfile.h:61:27: error: reference to 'FileWriter' is ambiguous
2023-09-07 12:44:51 +03:00
Christoph Oelckers
e88d2fb6b4 - fixed directory loader 2023-08-23 22:09:09 +02:00
Christoph Oelckers
4ff6e9bc72 - fix altered virtuals and gave them an override qualifier. 2023-08-23 21:26:42 +02:00
Christoph Oelckers
ec18e022ca - fix allocation for tile buffer. 2023-08-23 21:05:00 +02:00
Christoph Oelckers
82057bcd5a - Backend update from GZDoom-
This compiles but doesn't run.
2023-08-23 20:36:19 +02:00
Christoph Oelckers
f2740e434a - adapted game code. 2023-08-20 02:25:12 +02:00
Christoph Oelckers
2095a2120c - consolidated the 4 ReadSound functions. 2023-08-19 18:11:19 +02:00
Christoph Oelckers
3c695a5abd - adapted to backend changes. 2023-08-19 18:08:27 +02:00
Christoph Oelckers
6aa61e72b5 - backend update from GZDoom.
* cleanup on the sound init code.
* added #pragma once in several headers.
* macOS version detection overhaul.
2023-07-22 09:54:00 +02:00
Christoph Oelckers
8adc32c6c9 -fixed: tilenum 0 is a valid image for flat and wall sprites.
It's only invalid for face sprites.
2023-06-05 23:35:24 +02:00
Christoph Oelckers
fcb8e7614f - new names and SWActor properties.
Not used yet
2023-06-03 10:16:48 +02:00
Christoph Oelckers
61bc698029 - sprite init code. 2023-06-01 22:08:42 +02:00
Christoph Oelckers
d7a00b76f1 - added extensions to texnames parser to handle fully rotated sprite animations in one line
Also define all sprites for Shadow Warrior.
2023-05-30 22:32:58 +02:00
Christoph Oelckers
54335f7215 - got rid of the tilenum variant of hud_drawsprite. 2023-05-30 19:08:26 +02:00
Christoph Oelckers
beb8368819 - more stateGroup wrapping 2023-05-28 08:24:56 +02:00
Christoph Oelckers
7eb713ab04 - wrap state setters so they can use state names. 2023-05-28 08:13:20 +02:00
Christoph Oelckers
c72e2dbbe0 - fix missing #include 2023-05-27 10:37:00 +02:00
Christoph Oelckers
d20c37e708 - reinstated the state's sprite frame code.
Having frames makes management a lot easier so let's keep it.
2023-05-27 10:11:30 +02:00
Christoph Oelckers
f3ea1e312a - Backend update from GZDoom. 2023-05-27 10:10:42 +02:00
Christoph Oelckers
5dfb0c902a - consolidation of sound init code. 2023-05-27 09:12:51 +02:00
Christoph Oelckers
92f2503160 - did a bit of optimization on sfxinfo_t.
Using two bytes of alignment gap to add a userval variable.
2023-05-27 09:03:10 +02:00
Christoph Oelckers
1468bedf4c - don't print file-not-found errors for internal SNDINFO definitions. 2023-05-27 07:15:43 +02:00
Christoph Oelckers
1cb86af5f9 - give SW's sounds proper names and move their definition out of the EXE.
Also handle custom rolloff by the sound engine
2023-05-26 23:27:46 +02:00
Christoph Oelckers
0e64a38812 - ported a few SNDINFO options from GZDoom. 2023-05-26 18:56:42 +02:00
Mitchell Richters
b69dbe1db3 - Remove some debug leftovers. 2023-05-21 20:01:17 +10:00
Christoph Oelckers
147f5ac8a0 - added GZDoom's state manager.
We will need this for SW's actors
2023-05-21 09:59:22 +02:00
Christoph Oelckers
f58504250c - remove DCoreActor::picnum's script export.
This is something we definitely do not want to export.
2023-05-21 07:54:16 +02:00
Christoph Oelckers
56f5e01c84 fix tileCRC 2023-05-20 18:08:58 +02:00
Christoph Oelckers
a2b2e2ec87 - got rid of tileHeight and tileWidth. 2023-05-20 18:08:40 +02:00
Christoph Oelckers
058f1b4233 - handle exclusion of tilenum 0 for sprites in the backend. 2023-05-20 12:55:58 +02:00
Christoph Oelckers
de6b5fec7b - got rid of some 'picnum's that don't reference spritetype. 2023-05-20 10:59:03 +02:00
Christoph Oelckers
4e6023ea34 add a bit of vertical tolerance to neartag's sprite check.
This is not pitch aware and can cause problems with very small sprites on occasion.
2023-05-20 09:01:46 +02:00
Christoph Oelckers
a8e03723ef - NOSHADOW flag. 2023-05-19 23:03:20 +02:00
Christoph Oelckers
11ba136df1 - make autosaving happen immediately for other games than Blood only.
Blood does not like it, but for the others it should be ok.
2023-05-19 22:59:47 +02:00
Christoph Oelckers
6e060c2e83 Revert "- Tidy up autosaving for all the games."
This reverts commit 10445635cf.

Contrary to what the reverted commit states, it is absolutely essential to have this delay. Duke and Blood initialize a lot of things in their first tick that are necessary before the world is stable to save.
2023-05-19 22:53:17 +02:00
Christoph Oelckers
3b0da4c221 - fix '-gamegrp' path 2023-05-19 22:53:16 +02:00
Christoph Oelckers
28e451311b - fixed ActorInfo inheritance. 2023-05-19 22:50:47 +02:00
Christoph Oelckers
ecfa45c3ec - Duke: fixed animation lookup code. 2023-04-30 10:51:48 +02:00
Christoph Oelckers
960e58cdf2 - move the action default propeerties into FActorInfo 2023-04-30 08:07:10 +02:00
Christoph Oelckers
47f9642294 - added compile time validation for SetAction, SetAI and SetMove.
the expression classes were deleted again, this can be done without them.
2023-04-29 10:09:36 +02:00
Christoph Oelckers
bf577916ec - made the is*** checkers compiler intrinsics.
With the exception of isWorldTour, isPlutoPak and isShareware when playing Duke these are always constant and this way can be used to completely eliminate unneeded code.
2023-04-29 10:09:36 +02:00
Christoph Oelckers
f1f1e54e04 - moved the remaining content of the flags* files directly into game.cpp 2023-04-29 09:59:54 +02:00
Christoph Oelckers
6fd4368592 - moved Duke/RR's tile name list to raze.pk3, now that internally it is not used anymore.
This way it can later also be used by editors.
2023-04-29 09:55:48 +02:00
Christoph Oelckers
44f4104eda - got rid of the last tilenum uses in Duke.
This meant refactoring the crosshair drawer to work on a named texture called "CROSSHAIR" and hard coding the magic numbers for spawndebris.
2023-04-29 09:54:15 +02:00
Christoph Oelckers
bb08a118d9 - replaced the sprite precaching code with one that scans the actual content.
This will currently not do proper precacing for Duke, which requires actions to be defined as the ones from CON cannot be assigned to an actor.
2023-04-29 09:53:52 +02:00
Christoph Oelckers
83eb4852f7 - do not use literal tile numbers for initializing WW2GI's weapon gamevars.
Instead use the type numbers of the items to be spawned so it is derived from configurable data.
2023-04-29 09:51:51 +02:00
Christoph Oelckers
5d4f137623 - migrated Duke's entire HUD weapon code to texture names. 2023-04-29 09:16:46 +02:00
Christoph Oelckers
8f61abdf75 - more HUD refactoring and fixed issues with badly named textures crashing the precacher. 2023-04-29 09:08:42 +02:00
Christoph Oelckers
34160a4354 - ported the scuba mask drawers to texture IDs.
These were also the last places in Duke using tileWidth and tileHeight.
2023-04-29 07:06:42 +02:00
Mitchell Richters
52ab0fae19 - Duke: Allow reversing while moving forwards to act as the brake.
* Much more intuitive for controllers.
2023-04-25 11:30:48 +10:00
Mitchell Richters
918789705f - Duke: Use the player's angle when adjusting vehicle's HUD rotation. 2023-04-24 22:44:22 +10:00
Mitchell Richters
14629e7b2b - Clamp vehicle input to 1.5x the calculated velocity. 2023-04-24 22:18:40 +10:00
Mitchell Richters
11181f51f8 - Allow roll input through the packet system, giving us 6DOF for VR usage, etc. 2023-04-24 21:31:21 +10:00
Christoph Oelckers
1c7ca7b63a - moved all indirect precaching info to external definition files. 2023-04-23 17:43:22 +02:00
Christoph Oelckers
6924869895 - store texture IDs in the sprite set. 2023-04-23 17:42:07 +02:00
Christoph Oelckers
1bace1d508 - use texture IDs in the spawn records. 2023-04-23 17:33:50 +02:00
Christoph Oelckers
4692cc55f7 - cleaned up checkhitdefault
Only required 4 new flags plus one property...
2023-04-23 17:33:36 +02:00
Christoph Oelckers
524df20d26 - renamed most local picnum variables in shaded code to reduce search noise. 2023-04-23 17:33:35 +02:00
Mitchell Richters
a731db95ae - Add initial support for up/down movement within the game, either by key or joystick axis.
* Started with Duke's jetpack, other games to follow for swimming, etc.
2023-04-23 19:53:45 +10:00
Mitchell Richters
e60e767232 - Break down some increasingly long lines in GameInput::processMovement(). 2023-04-23 19:19:26 +10:00
Christoph Oelckers
fc0c8e0787 - NOHITJIBS flag. 2023-04-23 10:45:44 +02:00
Christoph Oelckers
cc83438e31 - replace dispicnum with dispictex 2023-04-23 10:32:58 +02:00
Christoph Oelckers
b2493116f8 - use texture IDs in the model interface. 2023-04-23 09:52:56 +02:00
Christoph Oelckers
1bc9de1cf0 - the last picnums in actors_r.cpp 2023-04-23 09:52:56 +02:00
Christoph Oelckers
14bf74c0f9 - turned adjustfall into a 'gravityfactor' property. 2023-04-23 09:51:24 +02:00
Christoph Oelckers
4812e1431e - made fallspecial game independent and eliminated all the wrapping and callback weirdness with fall. 2023-04-23 09:43:20 +02:00
Christoph Oelckers
5a2410cbbb - more properties to get rid of the remaining actor type checks in move_d and move_r. 2023-04-23 09:42:29 +02:00
Christoph Oelckers
c4c035a527 - handle more of move's special cases with flags and properties. 2023-04-23 09:42:28 +02:00
Christoph Oelckers
2d4eee4153 - eliminated the last references to picnum in actors.cpp. 2023-04-23 09:42:28 +02:00
Christoph Oelckers
0249725ed8 - got rid of all TILE_* globals, except TILE_CROSSHAIR. 2023-04-23 09:42:28 +02:00
Christoph Oelckers
46f7e38e46 - cleaned up movesprite_ex.
This needed 5 actor flags to handle some really inane special cases!
2023-04-23 09:42:27 +02:00
Mitchell Richters
175f858047 - Make scaletozero() static again within gameinput.cpp. 2023-04-23 09:06:31 +10:00
Mitchell Richters
05cb6563f3 - Add roll output to stat coord since we're now using this angle.
* Do a line split between coords and angles since it was getting a bit long.
* Was going to allow warping to a specific roll as well, but its pretty useless.
2023-04-23 09:03:02 +10:00
Mitchell Richters
0a90ed4802 - Remove some duplicated lines in PlayerAngles::doViewTilting(). 2023-04-23 08:51:14 +10:00
Mitchell Richters
b179079168 - Move constant from previous commit into the class with the other constants. 2023-04-22 22:45:12 +10:00
Mitchell Richters
df30c01472 - Rework cl_viewtilting 1 to be consistent across games.
* Setup before from when it was Exhumed-only assumed a 30Hz clock. Needed adjusted variables and setup for Shadow Warrior.
2023-04-22 21:40:57 +10:00
Christoph Oelckers
927d014cea - final cleanup on hitradius.
Several dead code paths were also removed that are unable to be triggered by any event in the game - due to the spaghetti-style checks this hadn't been obvious before.
Also one more flag that handles the WT flamethrower's special case of not hurting any actors of the shooter's kind in a more generalized form
2023-04-22 12:08:47 +02:00
Christoph Oelckers
ac430e6bc7 - another flag and the second old one renamed. 2023-04-22 12:08:47 +02:00
Christoph Oelckers
9ddb5987cd - two new flags and one renamed one for hitradius.
slowly getting closer to sorting this one out. The new flags already make operation a lot clearer.
2023-04-22 12:08:47 +02:00
Christoph Oelckers
19f4e4ff63 - added a new flag and split out the geometry destruction part from the hitradius functions
... which suddenly look a lot less menacing...
2023-04-22 12:08:47 +02:00
Christoph Oelckers
65e66a573d - Duke: look up all internally used actor classes at game startup.
This allows early validation of the names but is also more efficient.
2023-04-22 12:08:46 +02:00
Christoph Oelckers
36d5ab74bb - eliminated lots of direct tile references in spawn() calls. 2023-04-22 12:08:46 +02:00
Mitchell Richters
6ba227ab8b - Spaces be damned! 2023-04-22 19:50:55 +10:00
Mitchell Richters
71d833f9ea - Make Exhumed's new view tilting features accessible for all games. 2023-04-22 19:34:53 +10:00
Mitchell Richters
6799322544 - Exhumed: Add view bobbing, with defaults matching intensity of Powerslave Exhumed.
* `cl_viewbob` extended from bool to int, and allowing two modes: 1 == Powerslave Exhumed bobbing, 2 == Duke 3D-style bobbing.
* Height and speed of bobbing customisable.
2023-04-21 21:13:19 +10:00
Mitchell Richters
bb19997a2c - Apply pitch/yaw input along-side the key inputs.
* Removes a lot of duplicated code.
2023-04-21 21:13:18 +10:00
Mitchell Richters
70dd565c50 - Slightly tune mouse formula in GameInput::processVehicle(). 2023-04-21 21:13:17 +10:00
Mitchell Richters
258ab0db89 - Exhumed: Initial setup of view rolling effects.
* `cl_exviewtilting 1` enables a console-like view rolling upon yaw input.
* `cl_exviewtilting 2` enables a Quake-like view rolling upon strafe input.
2023-04-21 21:13:17 +10:00
Mitchell Richters
19da7a61bb - Exhumed: Setup detection for Steam version.
* Buying games for $15 AUD that I already own just so I can add a detection... aren't I super? 🙃.
2023-04-21 21:13:16 +10:00
Christoph Oelckers
86637cd20c - fixed typo in NOHITSCANHIT flag export. 2023-04-16 23:38:54 +02:00
Marisa Heit
1bf03e463a Add more GOG registry search paths
Adds the following GOG registry paths to locate games from GOG:
- Duke Nukem 3D Atomic Edition (no longer sold on GOG)
- Blood: One Unit Whole Blood (no longer sold on GOG)
- Shadow Warrior Classic Complete (Free! on GOG)

There are also three I scraped from their store pages, but commented
out because I don't own them so can't verify if they need any additional
search paths or not:
- Redneck Rampage Collection
- NAM
- Shadow Warrior Classic Redux
2023-04-16 21:37:44 +02:00
Christoph Oelckers
608b4e8e0f - initialize the new temporary actor properties to something useful. 2023-04-16 17:35:23 +02:00
Christoph Oelckers
a3da3a4c43 - added a large bunch of script exports. 2023-04-16 17:35:15 +02:00
Christoph Oelckers
cb8137c32b - consolidated shoot_d and shoot_r. 2023-04-16 16:53:52 +02:00
Christoph Oelckers
e97fc54179 - scriptified shootstuff. 2023-04-16 16:53:52 +02:00
Christoph Oelckers
1f5cd93564 - wall flag interface cleanup.
With wall textures now available the workarounds could be removed.
2023-04-16 16:53:51 +02:00
Christoph Oelckers
041d5214a4 - two new flags for the hitscan attack. 2023-04-16 16:53:51 +02:00
Christoph Oelckers
0643ab22c0 - scriptified the melee attack. 2023-04-16 16:53:51 +02:00
Christoph Oelckers
e15517cf57 - fixed some issues with projectile ownership.
Some init code was run here that should not be run. Added a new flag to handle this case without major code explosion.
2023-04-16 07:54:26 +02:00
Christoph Oelckers
c73830992f - added a few exports and properties for weapon shooting and added missing 'const' annotations for ShootThis overrides. 2023-04-15 23:23:09 +02:00
Christoph Oelckers
812b9d76d6 - Blood: display the charge meter for the dynamite also on the alternative HUD. 2023-04-15 09:33:46 +02:00
Christoph Oelckers
c418356420 - added the action, move and ai properties. 2023-04-12 21:52:56 +02:00
Christoph Oelckers
ebf7b4a121 - copy the CON defined info into the actual actors.
Only using the strength value right now.
2023-04-12 20:29:37 +02:00
Christoph Oelckers
62ace9371f - moved the 3 actor properties out of the global data. 2023-04-12 20:07:12 +02:00
Christoph Oelckers
0c17a369db - Duke: changed skill filter to be solely controlled by the spawnclasses definitions.
All classes with no skill filter now need an explicit noskill declaration.
The only exception is inert sprites using DukeActor directly, these will never get filtered by skill.
2023-04-12 20:06:25 +02:00
Christoph Oelckers
660227e175 - Duke: restrict skill filter to those actors which originally handled it.
For flexibility there now is a flag that can be set on any actor class, but due to precedent it needs to be off by default.
2023-04-11 20:14:02 +02:00
Christoph Oelckers
7f758eef2b - got rid of the script-side flag wrappers. 2023-04-09 09:46:09 +02:00
Christoph Oelckers
04a027f748 - removed most parameters from fall_common. 2023-04-09 09:46:09 +02:00
Christoph Oelckers
ae4ef6401c - use the actual actor flags.
Not fully working yet...
2023-04-09 09:45:42 +02:00
Christoph Oelckers
510afe16fb - NODAMAGEPUSH is the default for RR.
The game never had this feature
2023-04-09 09:35:38 +02:00
Christoph Oelckers
b908ede470 - reviewed actor flags and applied several fixes. 2023-04-09 09:35:37 +02:00
Christoph Oelckers
8172a9ac0c - moved all flags into the actor definitions. 2023-04-09 09:35:37 +02:00
Christoph Oelckers
672374c5f4 - added fullbright flags where appropriate 2023-04-09 09:35:37 +02:00
Christoph Oelckers
f4c176988a - first round of flag additions. 2023-04-09 09:35:36 +02:00
Christoph Oelckers
307276a276 - WIP for a default scale property.
For now a NOP, we need to get a little further with the scriptification work before this can be made operational.
2023-04-08 09:38:46 +02:00
Christoph Oelckers
60339a217c - moved a lot of shareable code out of the CON interpreter. 2023-04-07 13:15:06 +02:00
Christoph Oelckers
0e169759d5 - animatesprites_r.cpp cleanup 2023-04-07 12:22:45 +02:00
Christoph Oelckers
ce00183707 - scriptified PlayerOnWater. 2023-04-07 12:17:56 +02:00
Christoph Oelckers
8b04f42ab5 - exported several fire related actors. 2023-04-07 11:52:53 +02:00
Christoph Oelckers
ef6a8c010a - exported ceilingsteam and consolidated movefallers functions. 2023-04-07 11:52:53 +02:00
Christoph Oelckers
7a699e032f - cleaned up Duke's very broken kill count system.
This now uses a static flag to denote an actor as countable and an internal flag to track its killed state, because CON can toggle that at will.
2023-04-07 09:49:20 +02:00
Mitchell Richters
85482b0951 - Fix CVAR comments from previous commit. 2023-04-05 17:59:04 +10:00
Mitchell Richters
32e6e1ce5f - Allow disabling of level start/end cutscenes if a user desires.
* Allows for situations where in Blood or Exhumed, you wish to have a shortcut that directly gets you into a level.
* Could be used for seamless playing options if a user doesn't care for level ending screens.
* Not exposing this to the menu for now as I doubt demand would be high for such a thing.
2023-04-05 17:46:40 +10:00
Mitchell Richters
0f07ea9e37 - Fix skip size in SkipTicCmd() missed during 8bfcb8c939. 2023-04-05 15:00:47 +10:00
Mitchell Richters
c4bd550483 - Change InputState::KeyStatus to be a FixedBitArray object. 2023-04-05 12:57:48 +10:00
Mitchell Richters
2658af9fd0 - Use weapon enums when determining max slot numbers. 2023-04-05 10:22:18 +10:00
Mitchell Richters
4d82a0effa - Put SB_QUICK_KICK into the correct mask. 2023-04-05 10:20:54 +10:00
Mitchell Richters
3951407b68 - Fix issue with memset calls from 0eba341ac1. 2023-04-05 07:39:31 +10:00
Mitchell Richters
6403c7291f - Update player camera angles right before drawing a frame.
* Also stops situations where `GameInput::getInput()` was being called incessantly while in the menu, during screenjobs, etc.
2023-04-04 20:55:09 +10:00
Mitchell Richters
0eba341ac1 - Remove GameInput::prepareHidInput() and GameInput::resetHidInput().
* Also reverts 23bff9f701, but changes the loop into a `memset()` call instead.
2023-04-04 20:07:06 +10:00
Mitchell Richters
d454455d22 - Move invertmouse CVARs into common code.
* Removes duplication of CVAR definitions between Raze and GZDoom.
2023-04-04 20:01:21 +10:00
Mitchell Richters
b4ea03b8ef - Ensure GameInput::Clear() clears the entire object.
* Unused mouse input could still accumulate during screenjobs (level end stats, etc).
2023-04-04 10:53:19 +10:00
Mitchell Richters
133c8fa80b - Only scale the mouse input in GameInput::processMovement(), where it's needed.
* Also fixes a potential signedness issue for `processVehicle()` if `m_yaw` is negatively set.
2023-04-04 09:53:43 +10:00
Mitchell Richters
a68fcfc71c - Remove GameInterface::getConsoleAngles(), it's not needed anymore. 2023-04-04 07:02:39 +10:00
Mitchell Richters
3ef431a428 - Make scaleAdjust a float since it's what's needed anyway. 2023-04-03 19:38:00 +10:00
Mitchell Richters
69c65dfe7e - Internalise InputPacket used in movement functions. 2023-04-03 19:35:35 +10:00
Mitchell Richters
dbba0abb2e - Move all mouse handling into GameInput class. 2023-04-03 18:47:14 +10:00
Mitchell Richters
8d11fef916 - Initial conversion of game input into class GameInput. 2023-04-03 18:46:36 +10:00
Mitchell Richters
23186cd8bb - Relocate processCrouchToggle(). 2023-04-03 18:38:10 +10:00
Mitchell Richters
31d3349d93 - Rearrange bools in processVehicleInput(). 2023-04-03 18:37:38 +10:00
Mitchell Richters
fb519e9c53 - Move PlayerAngles constants into the class. 2023-04-03 17:07:34 +10:00
Christoph Oelckers
810977f19f - made RR thunder effect also work for Duke.
This mainly meant adding support for random sounds and playing the thunder sound by name instead of by index.
2023-04-02 17:20:06 +02:00
Christoph Oelckers
6248c8813b - make RR's ingame thunder effect not depend on having seen one specific texture.
This really should check if the player has seen one sector where the effect is active.
2023-04-02 16:45:43 +02:00
Christoph Oelckers
30d066cee9 - added script exports for Duke's bosses.
This allows removing a few hack checks.
2023-04-02 13:13:45 +02:00
Christoph Oelckers
7f240a0a7a - converted all remaining classes used by PicForName.
This means all functions using this can now pass class pointers directly to the native code.
2023-04-02 13:13:45 +02:00
Christoph Oelckers
c9888ae6cb - exported several RR enemies/animals needed for the UFO spawner. 2023-04-02 13:13:06 +02:00
Christoph Oelckers
7b4d5eb26d - scriptified SHRINKEREXPLOSION and WATERBUBBLE. 2023-04-02 13:10:26 +02:00
Christoph Oelckers
673ea69d35 - scriptified a few more skeleton items needed by PicforName. 2023-04-02 13:00:13 +02:00
Mitchell Richters
07ea5d06ae - Update version.h. 2023-04-02 20:11:51 +10:00