Christoph Oelckers
6c702847ff
Backend update from GZDoom.
2023-12-05 22:39:34 +01:00
Christoph Oelckers
a9dc57e99f
fixed potentially undefined behavior with bool parameters in direct native functions.
2023-12-05 22:39:34 +01:00
Christoph Oelckers
98f2257aad
Exhumed: fix handling of angles for the queen's eggs when colliding with a wall.
2023-12-05 22:39:34 +01:00
Mitchell Richters
d753c92cfa
- Exhumed: Remove sequence post-processing since range checks from c039882dcc
handle this.
2023-12-05 22:39:34 +01:00
Mitchell Richters
23a557a361
- Exhumed: Clean up push factor in runlist_CheckRadialDamage()
for players.
...
* Some fudging was added due to issues that have now been properly resolved in 40265e649f
.
2023-12-05 22:39:34 +01:00
Christoph Oelckers
5b56fb7939
Exhumed: fixed a few more bad velocities in queen code.
2023-12-05 22:39:34 +01:00
Christoph Oelckers
1cb15ed878
Exhumed: Always perform a range check on a sequence's length.
...
Too many of these are not correct and prone to overflows so ignoring this is not good.
2023-12-05 22:39:34 +01:00
Christoph Oelckers
8dfb21636a
Exhumed: fixed radial damage push factor.
...
The original did 'bsin(x) >> 3' with vel being Q18.14 and bsin also returning Q18.14. So for fully floatified values we still must multiply by 1/8, not 128.
2023-12-05 22:39:33 +01:00
Christoph Oelckers
5a176fdf3d
Exhumed: sanitize stupid implementation of UpdateEnemy and fixed bad use of it for the queen's eggs.
2023-12-05 22:39:33 +01:00
Mitchell Richters
91dfeb42bd
- Blood: Fix GCC fallthrough warning.
2023-12-05 22:39:33 +01:00
Mitchell Richters
aea71092cc
- Clean up some GCC const warnings.
2023-12-05 22:39:33 +01:00
Mitchell Richters
be101bfc6c
- Change paused
check in 433c051751ebdf3b9d82ec4cabf01122414de961
as to not affect the crouch_toggle
while paused.
2023-12-05 22:39:33 +01:00
Mitchell Richters
be41bbcd28
- Move gi->getCrouchState()
into DCorePlayer
.
2023-12-05 22:39:33 +01:00
Mitchell Richters
1608c331a7
- Fix bad indentation in searchpaths.cpp
.
2023-12-05 22:39:33 +01:00
Mitchell Richters
c989d4c3a4
- statFPS()
doesn't need to be in GameInterface
.
2023-12-05 22:39:32 +01:00
Mitchell Richters
79504254a2
- Blood: Clean up some getPlayer()
and DCorePlayer::GetActor()
accesses in ticker.
2023-12-05 22:39:32 +01:00
Mitchell Richters
f219ee0208
- Clean up some leftover floats in the input code.
2023-12-05 22:39:32 +01:00
Mitchell Richters
73e68705da
- Duke: Slight cleanup in drawoverlays()
.
2023-12-05 22:39:32 +01:00
Mitchell Richters
085aefb1a5
- Repair issue where opening the menu cancels player's pitch returning to centre.
2023-12-05 22:39:32 +01:00
Mitchell Richters
b5da574613
- Remove some leftover debug code.
2023-12-05 22:39:32 +01:00
Mitchell Richters
9d3aaed1b7
- SW: Reduce some line lengths in DoPlayerVehicleInputScaling()
.
2023-12-05 22:39:32 +01:00
Mitchell Richters
08d808089f
- Simplify some vector math in calcChaseCamPos()
.
2023-12-05 22:39:31 +01:00
Mitchell Richters
ac91a70950
- Remove some unnecessary casts in SetupViewpoint()
.
2023-12-05 22:39:31 +01:00
Mitchell Richters
98046afa28
- Consolidate player coord stat/CCMD into coreplayer.cpp
.
2023-12-05 22:39:31 +01:00
Mitchell Richters
f22b6b95d2
- Remove DCorePlayer::getCameraAngles()
.
...
* `CameraAngles` used to be private within `PlayerAngles` and accessed via a friendship with `GameInput`.
* Just make it public for now, its not worth the complex setup to protect against this as we can control access by simply not exporting it to ZScript.
2023-12-05 22:39:31 +01:00
Mitchell Richters
fcc09afa18
- Consolidate Exhumed's nCamerapos
and SW's DSWPlayer::si
into something inside DCorePlayer
.
2023-12-05 22:39:31 +01:00
Mitchell Richters
1c725377ea
- Interalise slope tilting checks for DCorePlayer::doViewPitch()
.
2023-12-05 22:39:31 +01:00
Mitchell Richters
59366d3ffc
- Internalise player velocity setup for DCorePlayer::doRollInput()
.
...
* Would have been nice to have this constexpr, but can only do that when we switch to C++20.
2023-12-05 22:39:30 +01:00
Mitchell Richters
ce75f7d7ef
- Internalise player InputPacket
access.
2023-12-05 22:39:30 +01:00
Mitchell Richters
531c95c7ca
- Move PlayerAngles
class directly into DCorePlayer
.
...
* No refactoring around it yet.
* The #includes could use some cleaning up...
2023-12-05 22:39:30 +01:00
alexey.lysiuk
7230ceebaf
- bumped minimum OS version to 10.13 in .plist file
2023-12-05 22:39:30 +01:00
Christoph Oelckers
62c471e225
Duke: fixed breakable ceilings.
2023-12-05 22:39:30 +01:00
Christoph Oelckers
8aa34eea7b
renamed $conreserve to $resourceid.
...
This better matches its use, especially since it is not exclusive to CON supporting games.
2023-12-05 22:39:30 +01:00
Christoph Oelckers
c12b94cf48
fix handling of super secrets in statistics code.
2023-12-05 22:39:29 +01:00
Christoph Oelckers
b67f2cb727
added some awful hackery to handle the different offsetting of Blood's native voxels vs. those imported via .DEF.
2023-12-05 22:39:29 +01:00
Christoph Oelckers
375ef31304
removed voxel offsetting in Blood's animateSprites function
...
Since offsetting is being done in the backend now, this one is redundant.
2023-12-05 22:39:29 +01:00
Christoph Oelckers
93294b2d44
for line intersection, exclude the end point of the intersected line.
...
This is needed to make Build's utilities work as expected.
2023-12-05 22:39:29 +01:00
Christoph Oelckers
f00a90aa07
two minor backend fixes
2023-12-05 22:39:29 +01:00
Christoph Oelckers
9f2808df1f
Duke fixed two issues with displaying incorrect sprites
...
* We cannot check a projectiles owner because it may have been destroyed, so copy all info over
* CON changing an actor's type to one without class did not do anything at all.
2023-12-05 22:39:28 +01:00
Christoph Oelckers
272f44786c
added some more symbolic constants.
2023-12-05 22:39:28 +01:00
Christoph Oelckers
e8dd2d5b89
did some flag naming
2023-12-05 22:39:28 +01:00
Christoph Oelckers
6229a6256c
fix compilation of release builds.
2023-12-05 22:39:28 +01:00
Christoph Oelckers
1573e6fb49
fix some bad English
2023-12-05 22:39:28 +01:00
Christoph Oelckers
b68e79e4bc
use symbolic constants for explosion types.
2023-12-05 22:39:28 +01:00
Christoph Oelckers
54035f9396
replace sprintf with snprintf.
2023-12-05 22:39:27 +01:00
Christoph Oelckers
f0b7d57941
fixed Mac compilation.
...
Unlike the other platforms this builds its config paths from variable data.
2023-12-05 22:39:27 +01:00
Mitchell Richters
395a4e5421
- Apply last remaining .GetChars()
fixes for POSIX targets.
2023-12-05 22:39:27 +01:00
Christoph Oelckers
3614d03e1b
fix compilation of non-windows targets.
2023-12-05 22:39:27 +01:00
Christoph Oelckers
74f6ff0c03
we really do not need to pack the GAMEOPTIONS struct...
2023-12-05 22:39:27 +01:00
Christoph Oelckers
0c397033f1
added the remaining needed GetChars calls.
2023-12-05 22:39:27 +01:00
Christoph Oelckers
f50430eb7c
GetChars in non-windows code.
2023-12-05 22:39:26 +01:00
Christoph Oelckers
7cffe6e3f0
a few Getchars
2023-12-05 22:39:26 +01:00
Christoph Oelckers
90eb9ceafe
Use GetChars on FStrings.
2023-12-05 22:39:26 +01:00
Mitchell Richters
1859a902e0
- Fix some warnings in MSVC.
2023-12-05 22:39:26 +01:00
Mitchell Richters
7ba5d22d5d
- Bump MAXVOXELS
from 1024 to 2048.
2023-12-05 22:39:26 +01:00
Mitchell Richters
d3811c7816
- Add getTicrateAngle()
to reduce the amount of times DAngle::fromDeg()
needs to be called in input code.
2023-12-05 22:39:26 +01:00
Christoph Oelckers
bbbb61f450
backend update from GZDoom
...
LZMA update plus several ZScript improvements.
2023-12-05 22:39:26 +01:00
Mitchell Richters
31bb7d3348
- Duke: Repair crash when calling OnEvent(EVENT_ENTERLEVEL)
.
2023-12-05 22:39:25 +01:00
Mitchell Richters
a8ec00d7ce
- SW: No need to mark off PlayerArray
for saving game-side.
2023-12-05 22:39:25 +01:00
Mitchell Richters
2ddd15b932
- Slight clean-up in gameinput.cpp.
2023-12-05 22:39:25 +01:00
Mitchell Richters
ddd39775e6
- Re-add lost paused
check in GameInput::GetInput()
.
2023-12-05 22:39:25 +01:00
Mitchell Richters
b83f062037
- Exhumed: A little bit more cleanup.
2023-12-05 22:39:25 +01:00
Mitchell Richters
83cd140d75
- Exhumed: Remove static copy of last yaw input from draw code.
2023-12-05 22:39:25 +01:00
Mitchell Richters
11d9739707
- Duke: Interpolate getavel()
since we now have the last packet available to do so.
2023-12-05 22:39:24 +01:00
Mitchell Richters
1e6ee7ee61
- Remove unnecessary clamp in PlayerAngles::doViewPitch()
.
2023-12-05 22:39:24 +01:00
Mitchell Richters
52b20e1f59
- Move syncinput mechanism into GameInput
object.
2023-12-05 22:39:24 +01:00
Mitchell Richters
39df2714e9
- Modernise function declarations in Cephis C math to address ongoing GCC and Clang warnings.
...
Examples:
/home/mrichters/Repos/Raze/source/common/thirdparty/math/exp.c: In function ‘c_exp’:
/home/mrichters/Repos/Raze/source/common/thirdparty/math/exp.c:171:48: warning: declaration of built-in function ‘floor’ without a prototype; expected ‘double(double)’ [-Wbuiltin-declaration-mismatch]
171 | double polevl(double, void *, int), floor(), ldexp();
| ^~~~~
/home/mrichters/Repos/Raze/source/common/thirdparty/math/exp.c:171:57: warning: declaration of built-in function ‘ldexp’ without a prototype; expected ‘double(double, int)’ [-Wbuiltin-declaration-mismatch]
171 | double polevl(double, void *, int), floor(), ldexp();
/home/mrichters/Repos/Raze/source/common/thirdparty/math/exp.c:200:16: warning: passing arguments to 'polevl' without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
px = x * polevl( xx, P, 2 );
^
/home/mrichters/Repos/Raze/source/common/thirdparty/math/exp.c:201:17: warning: passing arguments to 'polevl' without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
x = px/( polevl( xx, Q, 3 ) - px );
^
/home/mrichters/Repos/Raze/source/common/thirdparty/math/exp.c:167:8: warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
double c_exp(x)
^
3 warnings generated.
2023-12-05 22:39:24 +01:00
Mitchell Richters
790fc0b28a
- Fix most warnings in Clang under Linux.
2023-12-05 22:39:24 +01:00
Mitchell Richters
7e393e04a5
- Duke: Remove casts from setting RR vehicle velocities and consolidate setup into an inline.
2023-12-05 22:39:24 +01:00
Mitchell Richters
6a06df0e45
- Duke: Change a few triple negations from the wrapper removal process.
2023-12-05 22:39:24 +01:00
Mitchell Richters
0f1f3d804f
- Use DCorePlayer::GetActor()
inside of CCMD(warptocoords)
.
2023-12-05 22:39:23 +01:00
Mitchell Richters
0c13d4fe3a
- Fix most GCC warnings in the backend/common code code.
...
* Most of them were just signedness issues. Hopefully I got everything right here.
* 3rd party stuff deliberately not touched.
2023-12-05 22:39:23 +01:00
Mitchell Richters
526db7f8b0
- Fix all GCC warnings in the game-side code.
...
* Most of these were due to mixed spaces/tabs playing nastiness with non-braced if/else statements.
2023-12-05 22:39:23 +01:00
Mitchell Richters
084be1a45c
- Store scaleAdjust
directly inside the GameInput
object.
2023-12-05 22:39:23 +01:00
Mitchell Richters
bdf566b348
- Remove GameInput
friendships inside PlayerAngles
in lieu of a local inline function.
2023-12-05 22:39:23 +01:00
Mitchell Richters
23dd0bab87
- Exhumed: Manual sweep for last replacements of player index for pointer.
2023-12-05 22:39:23 +01:00
Mitchell Richters
9871bb4a73
- Exhumed: Clean up player accesses in player.cpp
.
2023-12-05 22:39:22 +01:00
Mitchell Richters
33296e61fb
- Exhumed: Clean up player accesses in map.cpp
and move.cpp
.
2023-12-05 22:39:22 +01:00
Mitchell Richters
51b5393a23
- Exhumed: Clean up player accesses in items.cpp
and associated utilities.
2023-12-05 22:39:22 +01:00
Mitchell Richters
692d995257
- Exhumed: Clean up player accesses in gun.cpp
and associated utilities.
2023-12-05 22:39:22 +01:00
Mitchell Richters
a9ca3d7375
- Exhumed: Clean up player accesses in grenade code.
2023-12-05 22:39:22 +01:00
Mitchell Richters
856b6630f1
- Exhumed: Clean up player accesses in cheats.cpp
.
2023-12-05 22:39:22 +01:00
Mitchell Richters
ad5f1d9f7d
- Exhumed: Clean up player accesses in AddAmmo()
.
2023-12-05 22:39:22 +01:00
Mitchell Richters
d4b0cb14b4
- Exhumed: Convert most of Ra to pointers.
2023-12-05 22:39:22 +01:00
Mitchell Richters
02f8ac3bb3
- Duke: Clean up player accesses in weapons code.
2023-12-05 22:39:21 +01:00
Mitchell Richters
2d6930fddc
- SW: Clean up player accesses in DoGet()
.
2023-12-05 22:39:21 +01:00
Mitchell Richters
63605f034d
- Duke: Manual sweep for last replacements of GetActor() calls for stack pointer.
2023-12-05 22:39:21 +01:00
Mitchell Richters
66a77ea860
- Duke: Manual sweep for last replacements of player index for pointer.
2023-12-05 22:39:21 +01:00
Mitchell Richters
0615eba516
- Duke: Clean up player/actor accesses in checksectors_*()
.
2023-12-05 22:39:21 +01:00
Mitchell Richters
48f1be7e0c
- Duke: Clean up player/actor accesses in checkhitswitch()
and associated utilities.
2023-12-05 22:39:21 +01:00
Mitchell Richters
b5f2357949
- Duke: Clean up player/actor accesses in moveclouds()
.
2023-12-05 22:39:21 +01:00
Mitchell Richters
2de143214b
- Duke: Clean up player/actor accesses in checkhitdefault()
.
2023-12-05 22:39:20 +01:00
Mitchell Richters
4b410d48ba
- Duke: Clean up player/actor accesses in doanimations()
.
2023-12-05 22:39:20 +01:00
Mitchell Richters
5f132f5cda
- Duke: Clean up player/actor accesses in findplayer utilities.
2023-12-05 22:39:20 +01:00
Mitchell Richters
60228e10c6
- Duke: Clean up actor accesses in premap.cpp
.
2023-12-05 22:39:20 +01:00
Mitchell Richters
7401bf4c6f
- Duke: Clean up actor accesses in player_d.cpp
.
2023-12-05 22:39:20 +01:00
Mitchell Richters
4464497c28
- Duke: Clean up player/actor accesses in processinput_*()
.
2023-12-05 22:39:20 +01:00
Mitchell Richters
32d294fed0
- Duke: Clean up player/actor accesses in processweapon()
.
2023-12-05 22:39:20 +01:00
Mitchell Richters
0c7450bdb7
- Duke: Clean up player/actor accesses in player_w.cpp
.
2023-12-05 22:39:19 +01:00
Mitchell Richters
3cefaf9030
- Duke: Clean up player/actor accesses in operateweapon()
.
2023-12-05 22:39:19 +01:00
Mitchell Richters
9836925258
- Duke: Clean up player/actor accesses in fireweapon()
.
2023-12-05 22:39:19 +01:00
Mitchell Richters
caa7d50505
- Duke: Clean up player/actor accesses in operateTripbomb()
.
2023-12-05 22:39:19 +01:00
Mitchell Richters
58a87b658c
- Duke: Clean up player/actor accesses in movement()
.
2023-12-05 22:39:19 +01:00
Mitchell Richters
7dc0bde2be
- Duke: Clean up player/actor accesses in operateJetpack()
.
2023-12-05 22:39:19 +01:00
Mitchell Richters
18f362d68e
- Add player's view angles to stat coord
.
2023-12-05 22:39:19 +01:00
Mitchell Richters
561d756baa
- Duke: Repair SB_CENTERVIEW
not re-applying on the first tic.
2023-12-05 22:39:18 +01:00
Mitchell Richters
a6396cb491
- Centralise input clamping to occur centrally when the engine requests a packet.
2023-12-05 22:39:18 +01:00
Mitchell Richters
d2af13b924
- Make some utilities in vectors.h
available as constexpr.
2023-12-05 22:39:18 +01:00
Mitchell Richters
a64de707e0
- Make TRotator<T>
available as constexpr.
2023-12-05 22:39:18 +01:00
Mitchell Richters
4ff3351dd1
- Make TMatrix3x3<T>
available as constexpr.
2023-12-05 22:39:18 +01:00
Mitchell Richters
eae8ebec31
- Make TVector4<T>
available as constexpr.
2023-12-05 22:39:18 +01:00
Mitchell Richters
6b9ec49038
- Make TVector3<T>
available as constexpr.
2023-12-05 22:39:18 +01:00
Mitchell Richters
ad694b7a8c
- Make TVector2<T>
available as constexpr.
2023-12-05 22:39:17 +01:00
Christoph Oelckers
60a36f4902
fix Vectoe3 clamp for real.
2023-12-05 22:39:17 +01:00
Mitchell Richters
d32961ca01
- Duke: Clean up actor accesses in player.cpp
.
2023-12-05 22:39:17 +01:00
Mitchell Richters
3293d2337b
- Duke: Clean up player/actor accesses in underwater()
.
2023-12-05 22:39:17 +01:00
Mitchell Richters
6bb5958a93
- Duke: Clean up player/actor accesses in checkp()
.
2023-12-05 22:39:17 +01:00
Mitchell Richters
be417e324b
- Duke: Clean up player/actor accesses in haslock()
.
2023-12-05 22:39:17 +01:00
Mitchell Richters
175b856406
- Duke: Clean up player/actor accesses in shoot()
.
2023-12-05 22:39:17 +01:00
Mitchell Richters
0e1520ab1f
- Duke: Clean up player/actor accesses in all input look functions.
2023-12-05 22:39:16 +01:00
Mitchell Richters
8e2d4a3f52
- Duke: Clean up player/actor accesses in playerJump()
.
2023-12-05 22:39:16 +01:00
Mitchell Richters
443b66ea9d
- Duke: Clean up player/actor accesses in playerCrouch()
.
2023-12-05 22:39:16 +01:00
Mitchell Richters
2197128dc4
- Duke: Clean up player/actor accesses in timedexit()
.
2023-12-05 22:39:16 +01:00
Mitchell Richters
c7c63413ce
- Duke: Clean up player/actor accesses in endoflevel()
.
2023-12-05 22:39:16 +01:00
Mitchell Richters
55c150845c
- Duke: Clean up player/actor accesses in playerisdead()
.
2023-12-05 22:39:16 +01:00
Mitchell Richters
4865fc7d8e
- Duke: Clean up player/actor accesses in footprints()
.
2023-12-05 22:39:16 +01:00
Mitchell Richters
d44d14a770
- Duke: Clean up player/actor accesses in makepainsounds()
.
2023-12-05 22:39:15 +01:00
Mitchell Richters
6c067d4c38
- Duke: Clean up player/actor accesses in dokneeattack()
.
2023-12-05 22:39:15 +01:00
Mitchell Richters
387ed6ceac
- Duke: Clean up player/actor accesses in PlayerColorChanged()
.
2023-12-05 22:39:15 +01:00
Mitchell Richters
0425cc82fa
- Duke: Clean up player/actor accesses in noise.cpp
.
2023-12-05 22:39:15 +01:00
Mitchell Richters
dbf7872243
- Duke: Clean up player/actor accesses in hudweapon_*()
.
2023-12-05 22:39:15 +01:00
Mitchell Richters
74a5a7584e
- Duke: Clean up player/actor accesses in checkcursectnums()
.
2023-12-05 22:39:15 +01:00
Mitchell Richters
9e56237f99
- Duke: Clean up player/actor accesses in selectweapon_*()
.
2023-12-05 22:39:15 +01:00
Mitchell Richters
287df1c18a
- Duke: Clean up player/actor accesses in hud_input()
.
2023-12-05 22:39:14 +01:00
Mitchell Richters
823e032c9a
- Duke: Clean up player/actor accesses in displayweapon_*()
.
2023-12-05 22:39:14 +01:00
Mitchell Richters
8f64af1f04
- Duke: Clean up player/actor accesses in displaymasks_*()
.
2023-12-05 22:39:14 +01:00
Mitchell Richters
1e55b12e61
- Duke: Convert all the aplWeapon* crap to work on player pointers.
2023-12-05 22:39:14 +01:00
Mitchell Richters
b8ffcf3799
- Duke: Pass player pointer through to alterang()
.
2023-12-05 22:39:14 +01:00
Mitchell Richters
2720c6f8c6
- Duke: Move PlayerUseItem()
wrapper into DDukePlayer
.
2023-12-05 22:39:14 +01:00
Mitchell Richters
4aeb19df84
- Duke: Move PlayerUseItem()
wrapper into DDukePlayer
.
...
* Regex used: `PlayerUseItem\(\w+\,\s?(\w+)\)` -> `p->itemUsed($1)`.
2023-12-05 22:39:14 +01:00
Mitchell Richters
487459afd7
- Duke: Remove PlayerInput()
wrapper.
...
* Regex used: `PlayerInput\(\w+\,\s?(SB_\w+)\)` -> `!!(p->cmd.ucmd.actions & $1)`.
2023-12-05 22:39:13 +01:00
Mitchell Richters
14cf143739
- Duke: Remove PlayerInputBits()
wrapper.
2023-12-05 22:39:13 +01:00
Mitchell Richters
97504df124
- Duke: Remove PlayerSetInput()
wrapper.
2023-12-05 22:39:13 +01:00
Mitchell Richters
d7fbd8b348
- Duke: Remove PlayerNewWeapon()
wrapper.
2023-12-05 22:39:13 +01:00
Mitchell Richters
beb083e471
- Duke: Got rid of two more InputPacket wrappers.
2023-12-05 22:39:13 +01:00
Mitchell Richters
2b0b98a49c
- SW: Shorten the setup in DoPlayerVehicleInputScaling()
.
2023-12-05 22:39:13 +01:00
Mitchell Richters
e8451d3ddb
- Take better advantage of InputPacket::ang
's FRotator
status.
...
* Change it to a DRotator as that's what the game is expecting. Too many narrowings against DAngle objects needed.
* Utilise object methods where possible.
* Do all math against the object where possible, not its members.
2023-12-05 22:39:13 +01:00
Mitchell Richters
af8f3139ed
- Change InputPacket
angles to an FRotator
.
2023-12-05 22:39:12 +01:00
Mitchell Richters
3eaf7d2b87
- Make the last commit compile.
2023-12-05 22:39:12 +01:00
Mitchell Richters
e2a949949c
- Take better advantage of InputPacket::vel
's FVector3
status.
...
* Change it to a DVector3 as that's what the game is expecting. Too many narrowings against DAngle objects needed.
* Utilise object methods where possible.
* Do all math against the object where possible, not its members.
2023-12-05 22:39:12 +01:00