Skip to content

Commit f073c11

Browse files
authored
Merge branch 'development' into macos-build
2 parents 808562b + 29dbc2a commit f073c11

File tree

4,274 files changed

+1189572
-826748
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

4,274 files changed

+1189572
-826748
lines changed

.github/workflows/meson.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ on:
3636
macosx-deployment-target:
3737
type: string
3838
required: false
39-
default: "10.15"
39+
default: "11.1"
4040

4141
# Triggers the workflow when called by a top-level workflow
4242
workflow_call:
@@ -63,7 +63,7 @@ on:
6363
macosx-deployment-target:
6464
type: string
6565
required: false
66-
default: "10.15"
66+
default: "11.1"
6767

6868
jobs:
6969
build-linux:
@@ -255,7 +255,7 @@ jobs:
255255
echo "::group::Installing pkg-config"
256256
sudo apt install pkg-config
257257
echo "::group::Installing mac deps"
258-
omp install libsdl2 libsdl2_image onetbb lz4 libpng minizip luajit flac
258+
omp install SDL3 onetbb lz4 libpng minizip luajit flac
259259
echo "OSXCROSS_PKG_CONFIG_PATH=${{env.OSXCROSS_TARGET}}/macports/pkgs/opt/local/libexec/onetbb/lib/pkgconfig" >> $GITHUB_ENV
260260
echo "::endgroup::"
261261
echo "::group::Installing meson"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
compile_commands.json
1414
**/.ccls-cache
15+
**/.cache
1516

1617
**/build*
1718

CHANGELOG.md

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
99
<details><summary><b>Added</b></summary>
1010

1111
- Pathfinding and navigation overhaul, including jetpack/jump-aware pathfinding.
12-
Actors will now intelligently choose their path depending on how high they can jump, instead of always taking the shortest flying path. This will reduce instances of the AI getting stuck while trying to take paths that are impossible for them.
12+
Actors will now choose their path depending on how high they can jump, instead of always taking the shortest flying path. This will reduce instances of the AI getting stuck while trying to take paths that are impossible for them.
1313
Improvements to both `ACrab` and `AHuman` navigation. `ACrab`s are now aware of how to pathfind and navigate using their jetpack, and will use it where applicable. Actors are better at using their jetpack, and will use automovers if their jetpack is not sufficient to reach a destination.
1414
Actors are now more capable and responsive when digging. They will dig to their target if they cannot reach it with their jetpack (for example if there is a long vertical shaft in the route they cannot get up), and they preferentially avoid rocks, metal and other hard substances by digging around them. Actors also dig faster and spend less time idle.
1515
In the `CalculatePath` and `CalculatePathAsync` functions, the parameter `movePathToGround` has been replaced with `jumpHeight`, which is the height in metres the pathfind can jump vertically.
1616
New `Actor` Lua property `JumpHeight` (R) to estimate the jump height of the actor (in metres), based on the actor's jetpack and weight. Actors without a jetpack return 0.
17-
The new function `GetPathFindingFlyingJumpHeight()` can be used to get a jumpHeight that allows flying (i.e infinite jump height). This is also the value that `ACRocket`s and `ACDropships` return for `JumpHeight`.
17+
The new function `GetPathFindingFlyingJumpHeight()` can be used to get a jumpHeight that allows flying (i.e infinite jump height). This is also the value that `ACRocket`s and `ACDropShip`s return for `JumpHeight`.
1818

1919
- Improved locomotion.
2020
Added the ability to run. When running, you cannot sharpaim whatsoever.
@@ -26,6 +26,23 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2626
Added new `Actor` INI and Lua (R/W) property `CanRun` which denotes whether the Actor can run or not.
2727
Added new `Actor` INI and Lua (R/W) property `CrouchWalkSpeedMultiplier` which is a walking speed multiplier when at max crouch amount.
2828

29+
- New hotkey system for `Actor` and `HeldDevice`.
30+
Pressing a certain new hotkey will mark it as activated on `Actor` and `HeldDevice`, letting scripts make use of the new bindings easily.
31+
`Enum` binding for `HeldDevice.HeldDeviceHotkeyType`: `PRIMARYHOTKEY = 0, AUXILIARYHOTKEY = 1, HELDDEVICEHOTKEYTYPECOUNT = 2`.
32+
`Enum` binding for `Actor.ActorHotkeyType`: `PRIMARYHOTKEY = 0, AUXILIARYHOTKEY = 1, ACTORHOTKEYTYPECOUNT = 2`.
33+
Both `Actor` and `HeldDevice` have the following functions:
34+
`HotkeyActionIsActivated(hotkeyType)` returns whether a certain hotkey action is being activated or not.
35+
`ActivateHotkeyAction(hotkeyType)` activates a certain hotkey action.
36+
`DeactivateHotkeyAction(hotkeyType)` deactivates a certain hotkey action.
37+
38+
- New hotkey bindings.
39+
On Mouse+KB PC the defaults are: Weapon Primary Hotkey on V, Weapon Auxiliary Hotkey on H, Actor Primary Hotkey on X, Actor Auxiliary Hotkey on O.
40+
Added new `Controller` states `WEAPON_PRIMARY_HOTKEYSTART`, `WEAPON_AUXILIARY_HOTKEYSTART`, `ACTOR_PRIMARY_HOTKEYSTART`, `ACTOR_AUXILIARY_HOTKEYSTART`, `WEAPON_PRIMARY_HOTKEY`, `WEAPON_AUXILIARY_HOTKEY`, `ACTOR_PRIMARY_HOTKEY`, `ACTOR_AUXILIARY_HOTKEY`
41+
42+
- Added multiseat support for multiple mice and keyboards on one computer.
43+
44+
- Added optional player argument to all `UInputMan:Key*` Lua Methods. (e.g. `KeyHeld(keycode, player)`) This allows checking individual player's keyboards, when multiple keyboards are available.
45+
2946
- New music system, including a dynamic horizontal sequencing system, under the new music manager `MusicMan`.
3047
`PlayDynamicSong(string songName, string songSectionName, bool playImmediately, bool playTransition, bool smoothFade)` to play a new DynamicSong.
3148
`SetNextDynamicSongSection(string songSectionName, bool playImmediately, bool playTransition, bool smoothFade)` to queue a new DynamicSongSection for the currently playing song.
@@ -51,19 +68,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5168
- New `AEmitter` and `PEmitter` INI and Lua (R/W) property `PlayBurstSound` which denotes whether the BurstSound should play when appropriate. This should not be confused for a trigger - it's just a enable/disable toggle to avoid having to remove and add BurstSound altogether.
5269

5370
- New `MOSprite` INI and Lua (R/W) integer property `ForcedHFlip` which forces a certain flippedness and disallows anything else from ever changing it without clearing the forced value first. 0 is forced not flipped, 1 forced flipped, and -1 is no force.
54-
55-
- New hotkey bindings.
56-
On Mouse+KB PC the defaults are: Weapon Primary Hotkey on V, Weapon Auxiliary Hotkey on H, Actor Primary Hotkey on X, Actor Auxiliary Hotkey on O.
57-
Added new `Controller` states `WEAPON_PRIMARY_HOTKEYSTART`, `WEAPON_AUXILIARY_HOTKEYSTART`, `ACTOR_PRIMARY_HOTKEYSTART`, `ACTOR_AUXILIARY_HOTKEYSTART`, `WEAPON_PRIMARY_HOTKEY`, `WEAPON_AUXILIARY_HOTKEY`, `ACTOR_PRIMARY_HOTKEY`, `ACTOR_AUXILIARY_HOTKEY`
58-
59-
- New hotkey system for `Actor` and `HeldDevice`.
60-
Pressing a certain new hotkey will mark it as activated on `Actor` and `HeldDevice`, letting scripts make use of the new bindings easily.
61-
`Enum` binding for `HeldDevice.HeldDeviceHotkeyType`: `PRIMARYHOTKEY = 0, AUXILIARYHOTKEY = 1, HELDDEVICEHOTKEYTYPECOUNT = 2`.
62-
`Enum` binding for `Actor.ActorHotkeyType`: `PRIMARYHOTKEY = 0, AUXILIARYHOTKEY = 1, ACTORHOTKEYTYPECOUNT = 2`.
63-
Both `Actor` and `HeldDevice` have the following functions:
64-
`HotkeyActionIsActivated(hotkeyType)` returns whether a certain hotkey action is being activated or not.
65-
`ActivateHotkeyAction(hotkeyType)` activates a certain hotkey action.
66-
`DeactivateHotkeyAction(hotkeyType)` deactivates a certain hotkey action.
6771

6872
- New `Controller` state `WEAPON_RELOADHELD`, which is true every frame reload input is held (as opposed to `WEAPON_RELOAD` which is only true once when pressed).
6973

@@ -81,6 +85,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
8185

8286
- New `Attachable` INI and Lua (R/W) properties `InheritsVelWhenDetached` and `InheritsAngularVelWhenDetached`, which determine how much of these velocities an attachable inherits from its parent when detached. Defaults to 1.
8387

88+
- New GPU Renderer using OpenGL+Raylib, draw now takes 0ms in pretty much every instance.
89+
90+
- New Z Order for scene layers and primitives: Background layer sits at z=100, Terrain Background at z=50, Terrain color and MO color at z=0, GUIs sit at z=-100, allowed z range is [-200, +200], in the future this'll be expanded to MO draw as well.
8491
- Added Lua-accessible bitmap manipulation functions to `MOSprite`s:
8592
```
8693
GetSpritePixelIndex(int x, int y, int whichFrame) - Returns the color index of the pixel at the given coordinate on the given frame of the sprite ((0, 0) is the upper left corner!)
@@ -103,6 +110,34 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
103110

104111
- New `SceneMan` function `CastAllMOsRay(startVector, rayVector, table ignoreMOIDs, ignoreTeam, ignoreMaterial, bool ignoreAllTerrain, int skip)` which returns an iterator with pointers to all the non-ignored MOs met along the ray.
105112

113+
- New parameter `depth` for all primitives sets draw depth of the drawn primitive. The default depth is -75.0 (lower numbers draw on top, higher numbers in the back).
114+
115+
- New `DrawDepth` enum for default draw depths:
116+
- `Default` = 0.0f (Main draw depth for MOs)
117+
- `GUI` = -100.0f (Draw Depth of GUI elements)
118+
- `Primitive` = -75.0f (Default Primitive draw depth)
119+
- `TerrainBackground` = 50.0f (Draw Depth of Terrain Background layer)
120+
- `Background` = 100.0f (Draw Depth of Background layer)
121+
122+
- Added scaling capability to Bitmap primitives.
123+
New draw bindings with argument for scale are:
124+
```
125+
PrimitiveMan:DrawBitmapPrimitive(pos, moSprite, rotAngle, frame, scale)
126+
PrimitiveMan:DrawBitmapPrimitive(pos, moSprite, rotAngle, frame, scale, bool hFlipped, bool vFlipped)
127+
PrimitiveMan:DrawBitmapPrimitive(player, pos, moSprite, rotAngle, frame, scale)
128+
PrimitiveMan:DrawBitmapPrimitive(player, pos, moSprite, rotAngle, frame, scale, bool hFlipped, bool vFlipped)
129+
PrimitiveMan:DrawBitmapPrimitive(pos, filePath, rotAngle, scale)
130+
PrimitiveMan:DrawBitmapPrimitive(pos, filePath, rotAngle, scale, bool hFlipped, bool vFlipped)
131+
PrimitiveMan:DrawBitmapPrimitive(player, pos, filePath, rotAngle, scale)
132+
PrimitiveMan:DrawBitmapPrimitive(player, pos, filePath, rotAngle, scale, bool hFlipped, bool vFlipped)
133+
```
134+
As well as constructors:
135+
```
136+
BitmapPrimitive(player, pos, moSprite, rotAngle, frame, scale, hFlipped, vFlipped)
137+
BitmapPrimitive(player, pos, filePath, rotAngle, scale, hFlipped, vFlipped)
138+
```
139+
Original bindings with no scale argument are untouched and can be called as they were.
140+
106141
</details>
107142

108143
<details><summary><b>Changed</b></summary>
@@ -113,6 +148,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
113148
The Ronin Scrambler, the basic scanner, and `SceneMan:CastUnseenRay` have been changed to accomodate fog-of-war resolutions as fine as 1x1 and as coarse as 20x20.
114149
The fog-of-war revealing code is now multithreaded to increase performance.
115150

151+
- Save files are now compressed and stored in a single file, instead of a directory.
152+
Savefiles have the extension `.ccsave`, but their underlying format is really just a `.zip` file. This can be opened and modified as before with any zip file viewer.
153+
These savefiles can be safely renamed and moved without breaking the savegame, unlike before.
154+
116155
- All vanilla scenario activities have had their settings polished, respecting settings which make sense and disabling settings which don't.
117156
You can now have fog of war in the test scene, and can no longer require path to orbit in Zero-G Diggers-Only One Man Army.
118157

@@ -145,6 +184,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
145184

146185
- `InheritsVel` and its ilk have been uncapped, allowing users to set them outside of 0-1.
147186

187+
- Lua renamed `SceneLayer`->`StaticSceneLayer` due to changed SLBackground base class.
188+
148189
- `Scene` Lua functions `AddNavigatableArea(areaName)` and `ClearNavigatableAreas()` have been renamed/corrected to `AddNavigableArea(areaName)` and `ClearNavigableAreas()`, respectively.
149190

150191
- `MOSRotating` Lua function `AddWound` now additionally accepts the format `MOSRotating:AddWound(AEmitter* woundToAdd, const Vector& parentOffsetToSet, bool checkGibWoundLimit, bool isEntryWound, bool isExitWound)`, allowing modders to specify added wounds as entry- or exit wounds, for the purpose of not playing multiple burst sounds on the same frame. These new arguments are optional.
@@ -157,6 +198,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
157198

158199
- Various performance improvements.
159200

201+
- Drop support for macOS < 11.1 (Big Sur) :(
202+
203+
- Updated SDL2 to SDL3
204+
160205
</details>
161206

162207
<details><summary><b>Fixed</b></summary>
@@ -177,6 +222,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
177222

178223
- Fixed an issue where internal Lua functions OriginalDoFile, OriginalLoadFile, and OriginalRequire were polluting the global namespace. They have now been made inaccessible.
179224

225+
- Fixed the palette being mangled to 6bit/color on load.
226+
227+
- Fixed allegro not loading alpha of image with alpha by using SDL_image instead.
180228
- Fixed `MOSprite:UnRotateOffset()` giving the wrong results on HFLipped sprites.
181229

182230
- Various fixes and improvements to inventory management when dual-wielding or carrying a shield, to stop situations where the actor unexpectedly puts their items away.
@@ -189,6 +237,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
189237

190238
- Fixed issue where scripts applied to `MovableObject`s could become disordered in certain circumstances.
191239

240+
- Fixed a minor inconsistency where `ACDropShip`s were frequently referred to as `ACDropship`s in Lua, the lower case 's' invalidating keywords where the typo occured.
241+
192242
</details>
193243

194244
<details><summary><b>Removed</b></summary>

Data/Base.rte/Activities/BrainVsBrain.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ function BrainvsBrain:CreateMediumDrop(xPosLZ)
625625
if craftMaxMass < 0 then
626626
craftMaxMass = math.huge;
627627
elseif craftMaxMass < 1 then
628-
if Craft.ClassName == "ACDropship" then
628+
if Craft.ClassName == "ACDropShip" then
629629
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
630630
else
631631
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -685,7 +685,7 @@ function BrainvsBrain:CreateLightDrop(xPosLZ)
685685
if craftMaxMass < 0 then
686686
craftMaxMass = math.huge;
687687
elseif craftMaxMass < 1 then
688-
if Craft.ClassName == "ACDropship" then
688+
if Craft.ClassName == "ACDropShip" then
689689
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
690690
else
691691
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -743,7 +743,7 @@ function BrainvsBrain:CreateScoutDrop(xPosLZ)
743743
if craftMaxMass < 0 then
744744
craftMaxMass = math.huge;
745745
elseif craftMaxMass < 1 then
746-
if Craft.ClassName == "ACDropship" then
746+
if Craft.ClassName == "ACDropShip" then
747747
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
748748
else
749749
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined

Data/Base.rte/Activities/Harvester.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ function Harvester:UpdateActivity()
263263
if shipMaxMass < 0 then
264264
shipMaxMass = math.huge;
265265
elseif shipMaxMass < 1 then
266-
if Craft.ClassName == "ACDropship" then
266+
if Craft.ClassName == "ACDropShip" then
267267
DeleteEntity(ship);
268268
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
269269
else

Data/Base.rte/Activities/Massacre.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ function Massacre:UpdateActivity()
261261
if shipMaxMass < 0 then
262262
shipMaxMass = math.huge;
263263
elseif shipMaxMass < 1 then
264-
if Craft.ClassName == "ACDropship" then
264+
if Craft.ClassName == "ACDropShip" then
265265
DeleteEntity(ship);
266266
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
267267
else

Data/Base.rte/Activities/Siege.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ function Siege:CreateMediumDrop(xPosLZ, techName)
612612
if craftMaxMass < 0 then
613613
craftMaxMass = math.huge;
614614
elseif craftMaxMass < 1 then
615-
if Craft.ClassName == "ACDropship" then
615+
if Craft.ClassName == "ACDropShip" then
616616
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
617617
else
618618
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -666,7 +666,7 @@ function Siege:CreateLightDrop(xPosLZ, techName)
666666
if craftMaxMass < 0 then
667667
craftMaxMass = math.huge;
668668
elseif craftMaxMass < 1 then
669-
if Craft.ClassName == "ACDropship" then
669+
if Craft.ClassName == "ACDropShip" then
670670
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
671671
else
672672
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -718,7 +718,7 @@ function Siege:CreateEngineerDrop(xPosLZ, techName)
718718
if craftMaxMass < 0 then
719719
craftMaxMass = math.huge;
720720
elseif craftMaxMass < 1 then
721-
if Craft.ClassName == "ACDropship" then
721+
if Craft.ClassName == "ACDropShip" then
722722
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
723723
else
724724
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -767,7 +767,7 @@ function Siege:CreateScoutDrop(xPosLZ, techName)
767767
if craftMaxMass < 0 then
768768
craftMaxMass = math.huge;
769769
elseif craftMaxMass < 1 then
770-
if Craft.ClassName == "ACDropship" then
770+
if Craft.ClassName == "ACDropShip" then
771771
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
772772
else
773773
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined

Data/Base.rte/Activities/SkirmishDefense.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ function SkirmishDefense:CreateMediumDrop(xPosLZ, Destination, Team)
740740
if craftMaxMass < 0 then
741741
craftMaxMass = math.huge;
742742
elseif craftMaxMass < 1 then
743-
if Craft.ClassName == "ACDropship" then
743+
if Craft.ClassName == "ACDropShip" then
744744
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
745745
else
746746
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -798,7 +798,7 @@ function SkirmishDefense:CreateLightDrop(xPosLZ, Destination, Team)
798798
if craftMaxMass < 0 then
799799
craftMaxMass = math.huge;
800800
elseif craftMaxMass < 1 then
801-
if Craft.ClassName == "ACDropship" then
801+
if Craft.ClassName == "ACDropShip" then
802802
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
803803
else
804804
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -854,7 +854,7 @@ function SkirmishDefense:CreateScoutDrop(xPosLZ, Destination, Team)
854854
if craftMaxMass < 0 then
855855
craftMaxMass = math.huge;
856856
elseif craftMaxMass < 1 then
857-
if Craft.ClassName == "ACDropship" then
857+
if Craft.ClassName == "ACDropShip" then
858858
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
859859
else
860860
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined

Data/Base.rte/Activities/WaveDefense.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ function WaveDefense:CreateMediumDrop(xPosLZ, Destination)
679679
if craftMaxMass < 0 then
680680
craftMaxMass = math.huge;
681681
elseif craftMaxMass < 1 then
682-
if Craft.ClassName == "ACDropship" then
682+
if Craft.ClassName == "ACDropShip" then
683683
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
684684
else
685685
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -737,7 +737,7 @@ function WaveDefense:CreateLightDrop(xPosLZ, Destination)
737737
if craftMaxMass < 0 then
738738
craftMaxMass = math.huge;
739739
elseif craftMaxMass < 1 then
740-
if Craft.ClassName == "ACDropship" then
740+
if Craft.ClassName == "ACDropShip" then
741741
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
742742
else
743743
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined
@@ -793,7 +793,7 @@ function WaveDefense:CreateScoutDrop(xPosLZ, Destination)
793793
if craftMaxMass < 0 then
794794
craftMaxMass = math.huge;
795795
elseif craftMaxMass < 1 then
796-
if Craft.ClassName == "ACDropship" then
796+
if Craft.ClassName == "ACDropShip" then
797797
Craft = RandomACDropShip("Craft", 0); -- MaxMass not defined
798798
else
799799
Craft = RandomACRocket("Craft", 0); -- MaxMass not defined

0 commit comments

Comments
 (0)