All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
Implemented Lua Just-In-Time compilation (MoonJIT 2.2.0).
-
Implemented PNG file loading and saving. PNGs still need to be indexed just like BMPs! Transparency (alpha) not supported (yet).
-
New
Settings.inipropertyLoadingScreenReportPrecision = intValueto control how accurately the module loading progress reports what line is currently being read.
Only relevant whenDisableLoadingScreen = 0. Default value is 100, lower values increase loading times (especially if set to 1).
This should be used for debugging where you need to pinpoint the exact line that is crashing and the crash message isn't helping or doesn't exist at all. -
New
Settings.inipropertyMenuTransitionDuration = floatValueto control how fast transitions between different menu screens happen (e.g main menu to activity selection screen and back).
This property is a multiplier, the default value is 1 (being the default hardcoded values), lower values decrease transition durations. 0 makes transitions instant. -
New
ADoorsound properties: (Issue #106)// Played when the door starts moving from fully open/closed position towards the opposite end. DoorMoveStartSound = SoundContainer AddSound = ContentFile FilePath = pathToFile // Played while the door is moving, between fully open/closed position. DoorMoveSound = SoundContainer AddSound = ContentFile FilePath = pathToFile LoopSetting = -1 // Doesn't have to loop indefinitely, but generally should. // Played when the door changes direction while moving between fully open/closed position. DoorDirectionChangeSound = SoundContainer AddSound = ContentFile FilePath = pathToFile // Played when the door stops moving and is at fully open/closed position. DoorMoveEndSound = SoundContainer AddSound = ContentFile FilePath = pathToFile -
Exposed
Actor.StableVelocityThresholdto lua. New bindings are: (Issue #101)
Actor:GetStableVelocityThreshold()returns aVectorwith the currently set stable velocity threshold.
Actor:SetStableVelocityThreshold(xFloatValue, yFloatValue)sets the stable velocity threshold to the passed in float values.
Actor:SetStableVelocityThreshold(Vector)sets the stable velocity threshold to the passed inVector. -
New
AttachableandAEmitterpropertyDeleteWithParent = 0/1. If enabled the attachable/emitter will be deleted along with the parent if parent is deleted/gibbed/destroyed. (Issue #97) -
New
Settings.inipropertyLaunchIntoActivity = 0/1. WithPlayIntrofunctionality changed to actually skip the intro and load into main menu, this flag exists to skip both the intro and main menu and load directly into the set default activity. -
Exposed
AHuman.ThrowPrepTimeto lua and ini: (Issue #101)
ThrowPrepTime = valueInMSwill set how long it takes theAHumanto fully charge a throw. Default value is 1000.
AHuman.ThrowPrepTimeto get/set values via lua. -
Added new
SpriteAnimModemodes:SpriteAnimMode = 7 // OVERLIFETIMEThis mode handles exactly like (now removed)
MOSParticle.Framerate = 0and will complete the sprite's animation cycle over the course of its existence.SpriteAnimDurationis inapplicable when using this mode and will do nothing.
For example, an object that has a sprite with 10 frames and a lifetime of 10 seconds will animate at a rate of 1 frame per second, finishing its animation cycle just before being deleted from the scene.
If this mode is used on an object that hasLifeTime = 0(infinite) it will be overridden toSpriteAnimMode = 1(ALWAYSLOOP) otherwise it will never animate.SpriteAnimMode = 8 // ONCOLLIDEThis mode will drive the animation forward based on collisions this object has with other MOs or the terrain.
SpriteAnimDurationis inapplicable when using this mode and will do nothing.
This mode isMOSParticlespecific and used mainly for animating casings and small gibs. Using this mode on anything other thanMOSParticlewill do nothing. -
New
Settings.inipropertiesEnableCrabBombs = 0/1andCrabBombThreshold = intValue.
WhenEnableCrabBombsis enabled, releasing a number of crabs equal toCrabBombThresholdor more at once will trigger the crab bomb effect.
If disabled releasing whatever number of crabs will do nothing except release whatever number of crabs. -
Doors can now be stopped at their exact position using
ADoor:StopDoor()via lua. When stopped, doors will stop updating their sensors and will not try to reset to a default state.
If the door was stopped in a script, it needs to opened/closed by calling eitherADoor:OpenDoor()orADoor:CloseDoor()otherwise it will remain in the exact position it was stopped forever.
If eitherDrawMaterialLayerWhenOpenorDrawMaterialLayerWhenClosedproperties are set true, a material layer will be drawn when the door is stopped. This is to prevent a situation where the material layer will be drawn only if the door is travelling in one direction, without adding an extra property. -
New value
STOPPED(4) was to theADoor.DoorStateenumeration.ADoor:GetDoorStatewill return this if the door was stopped by the user viaADoor:StopDoor. -
New shortcut
ALT + Wto generate a detailed 140x55px miniWorldDumpto be used for scene previews. No relying onSceneEditor, stretches over whole image, no ugly cyan bunkers, no actors or glows, has sky gradient, indexed to palette. -
All text in TextBox (any TextBox) can now be selected using
CTRL + A. -
Console can now be resized using
CTRL + UP/DOWN(arrow keys) while open. -
Added new lua function
UInputMan:GetInputDevice(playerNum)to get a number value representing the input device used by the specified player. Should be useful for making custom key bindings compatible with different input devices. -
Scripts can now be attached to
ACrab.TurretandLeg. Additionally, a binding to get the Foot of a Leg has been added. -
Added H/V flipping capabilities to Bitmap primitives. New bindings with arguments for flip are:
PrimitiveMan:DrawBitmapPrimitive(pos, entity, rotAngle, frame, bool hFlipped, bool vFlipped)
PrimitiveMan:DrawBitmapPrimitive(player, pos, entity, rotAngle, frame, bool hFlipped, bool vFlipped)
Original bindings with no flip arguments are untouched and can be called as they were. -
Added new primitive drawing functions to
PrimitiveMan:-- Arc PrimitiveMan:DrawArcPrimitive(Vector pos, startAngle, endAngle, radius, color) PrimitiveMan:DrawArcPrimitive(player, Vector pos, startAngle, endAngle, radius, color) PrimitiveMan:DrawArcPrimitive(Vector pos, startAngle, endAngle, radius, color, thickness) PrimitiveMan:DrawArcPrimitive(player, Vector pos, startAngle, endAngle, radius, color, thickness) -- Spline (Bézier Curve) PrimitiveMan:DrawSplinePrimitive(Vector start, Vector guideA, Vector guideB, Vector end, color) PrimitiveMan:DrawSplinePrimitive(player, Vector start, Vector guideA, Vector guideB, Vector end, color) -- Box with rounded corners PrimitiveMan:DrawRoundedBoxPrimitive(Vector upperLeftCorner, Vector bottomRightCorner, cornerRadius, color) PrimitiveMan:DrawRoundedBoxPrimitive(player, Vector upperLeftCorner, Vector bottomRightCorner, cornerRadius, color) PrimitiveMan:DrawRoundedBoxFillPrimitive(Vector upperLeftCorner, Vector bottomRightCorner, cornerRadius, color) PrimitiveMan:DrawRoundedBoxFillPrimitive(player, Vector upperLeftCorner, Vector bottomRightCorner, cornerRadius, color) -- Triangle PrimitiveMan:DrawTrianglePrimitive(Vector pointA, Vector pointB, Vector pointC, color) PrimitiveMan:DrawTrianglePrimitive(player, Vector pointA, Vector pointB, Vector pointC, color) PrimitiveMan:DrawTriangleFillPrimitive(Vector pointA, Vector pointB, Vector pointC, color) PrimitiveMan:DrawTriangleFillPrimitive(player, Vector pointA, Vector pointB, Vector pointC, color) -- Ellipse PrimitiveMan:DrawEllipsePrimitive(Vector pos, horizRadius, vertRadius, color) PrimitiveMan:DrawEllipsePrimitive(player, Vector pos, horizRadius, vertRadius, color) PrimitiveMan:DrawEllipseFillPrimitive(Vector pos, short horizRadius, short vertRadius, color) PrimitiveMan:DrawEllipseFillPrimitive(player, Vector pos, horizRadius, vertRadius, color) -
Added log for non-fatal loading errors. This log will show image files that have been loaded with incorrect extensions (has no side effects but should be addressed) and audio files that failed loading entirely and will not be audible.
If errors are present the console will be forced open to notify the player (only when loading into main menu).
Log will be automatically deleted if warnings are no longer present to avoid polluting the root directory. -
Game window resolution can now be changed without restarting the game.
-
Codebase now uses the C++17 standard.
-
Updated game framework from Allegro 4.2.3.1 to Allegro 4.4.3.1.
-
Major cleanup and reformatting in the
Managersfolder. -
Lua error reporting has been improved so script errors will always show filename and line number.
-
Ini error reporting has been improved so asset loading crash messages (image and audio files) will also display the ini file and line they are being referenced from and a better explanation why the crash occured. (Issue #161)
-
Settings.iniwill now fully populate with all available settings (now also broken into sections) when being created (first time or after delete) rather than with just a limited set of defaults. -
Temporarily removed
PreciseCollisionsfromSettings.inidue to bad things happening when disabled by user. -
Settings.inipropertyPlayIntrorenamed toSkipIntroand functionality changed to actually skip the intro and load user directly into main menu, rather than into the set default activity. -
Lua calls for
GetParentandGetRootParentcan now be called by anyMovableObjectrather than being limited toAttachableonly. (Issue #102)
In some cases a cast to the appropriate type (ToWhateverType, e.gToMOSRotating) will be needed when attempting to manipulate the object returned, because it will be returned asMovableObjectif it is the root parent.
In cases where you need to iterate over a parent's attachable list the parent must be cast to the appropriate type that actually has an attachable list to iterate over.
For example:for attachable in ToMOSRotating(self:GetParent()).Attachables do ... endOr
local parent = ToMOSRotating(self:GetParent()); for attachable in parent.Attachables do ... end -
Physics constants handling removed from
FrameManand now hardcoded inConstants. Lua bindings moved toRTEToolsand are now called without theFrameManprefix like so:
GetPPM(),GetMPP(),GetPPL(),GetLPP(). -
Removed hardcoded 10 second
LifeTimerestriction forMOPixelandMOSParticle. -
MOSParticleanimation can now be set withSpriteAnimModeandSpriteAnimDuration. If the property isn't defined it will default toSpriteAnimMode = 7(OVERLIFETIME). -
Reworked crab bombing behavior. When enabled through
Settings.iniand triggered will gib all living actors on scene except brains and doors. Devices and non-actor MOs will remain untouched. -
ADoorpropertiesDrawWhenOpenandDrawWhenClosedrenamed toDrawMaterialLayerWhenOpenandDrawMaterialLayerWhenClosedso they are more clear on what they actually do. -
Specially handled Lua function
OnScriptRemoveOrDisablehas been changed toOnScriptDisable, and no longer has a parameter saying whether it was removed or disabled, since you can no longer remove scripts. -
When pasting multiple lines of code into the console all of them will be executed instead of the last line being pasted into the textbox and all before it executing.
-
Input enums moved from
UInputMantoConstantsand are no longer accessed with theUInputManagerprefix. These enums are now accessed with their own names as the prefix.
For example:UInputManager.DEVICE_KEYB_ONLYis nowInputDevice.DEVICE_KEYB_ONLY,UInputManager.INPUT_L_UPis nowInputElements.INPUT_L_UPand so on. -
CraftsOrbitAtTheEdgecorrected toCraftOrbitAtTheEdge. Applies to both ini property and lua binding. -
Game will now Abort with an error message when trying to load a copy of a non-existent
AtomGroup,AttachableorAEmitterpreset. -
ComboBoxes (dropdown lists) can now also be closed by clicking on their top part.
-
Activity:IsPlayerTeamrenamed toActivity:IsHumanTeam. -
Screenshot functionality changed: (Issue #162)
ThePrintScreenbutton will now take a single screenshot on key release and will not take more until the key is pressed and released again.
TheCtrl+Skey combination is unchanged and will take a single screenshot every frame while the keys are held.
TheCtrl+WandAlt+Wkey combinations will now take a single WorldDump/ScenePreview onWkey release (whileCtrl/Altare still held) and will not take more until the key is pressed and released again.Additionally, all screenshots (excluding abortscreen) will now be saved into a
_Screenshotsfolder (_so it's on top and not hiding between module folders) to avoid polluting the root directory. (Issue #163)
This folder will be created automatically after modules are loaded if it is missing. -
ScreenDumpsandWorldDumpsare now saved as compressed PNGs. -
Controller deadzone setting ignores more input. Previously setting it to the maximum was just enough to eliminate stick drift.
-
Arm.HandPoswill now get/set the hand position as relative to the arm's joint position, instead of relative to the arm's center of mass. -
Resolution settings in options screen changed:
Resolution multiplier button changed toFullscreenbutton - this will set the game window resolution to match the desktop resolution. When resolution matches the desktop, this button will change toWindowedand will allow setting the game window resolution back to default (960x540).
AddedUpscaled Fullscreenbutton - this will change the resolution to half of the desktop and the multiplier to 2. TheFullscreenbutton will change toWindowedin this mode to return to non-upscaled mode (960x540).
Selecting any resolution setting from the resolution combobox will immediately change to selected resolution. (Known bug: Clicking off the combobox without making a new selection while inUpscaled Fullscreenmode will change resolution toFullscreen. This will be addressed later.)Note: Changing the game window resolution while an Activity is active requires ending the Activity. A dialog box will appear asking to confirm the change.
-
Moved from C-style random number generation to C++ standard. This includes usage of an mt19937 random number generator.
For C++ coders the functions SelectRand, PosRand and RangeRand have been replaced by the function template RandomNum() and its overload RandomNum(T min, T max). The function NormalRand has been replaced by the function template RandomNormalNum(). For lua coders there is no change. -
Resolution validation changed to support multiple screens. Incompatible/bad resolution settings will be overridden at startup with messages explaining the issue.
Note: For multi-screen to work properly, the left-most screen MUST be set as primary. Screens having different resolutions does not actually matter but different heights will still be warned about and overridden due to the likeliness of GUI elementes being cropped on the shortest screen.
Resolution validation can be disabled for multi-screen setups withSettings.inipropertyDisableMultiScreenResolutionValidation. Bad settings are likely to crash, use at own risk.
For setups with more than 3 screensDisableMultiScreenResolutionValidationmust be set true. -
Damage to actors from impulses is now relative to their max health instead of being on a scale from 0 to 100.
-
Fix crash when returning to
MetaGamescenario screen after activity end. -
Control schemes will no longer get deleted when being configured. Resetting the control scheme will load a preset instead of leaving it blank. (Issue #121)
-
Fix glow effects being drawn one frame past
EffectStartTimemaking objects that exist for a single frame not draw glows. (Issue #67) -
Time scale can no longer be lowered to 0 through the performance stats interface.
-
Actors now support their held devices identically while facing to either side. (Issue #31)
-
Fixed issue where clicking a ComboBox's scrollbar would release the mouse, thus causing unexpected behavior like not being able to close the list by clicking outside of it.
-
Fixed issue where ComboBoxes did not save the current selection, thus if the ComboBox was deselected without making a selection then the selection would revert to the default value instead of the last selected value.
-
Fixed issue with double clicks and missing clicks in menus (anything that uses AllegroInput).
-
Fixed issue where OnPieMenu function wasn't working for
AHumanequipped items, and made it work forBGArmequipped items as well asFGArmones. -
The "woosh" sound played when switching actors from a distance will now take scene wrapping into account. Additionally, attempting to switch to previous or next actor with only one actor will play the more correct "error" sound.
-
Removed the ability to remove scripts from objects with Lua. This is no longer needed cause of code efficiency increases.
-
Removed
Settings.inipropertyPixelsPerMeter. Now hardcoded and cannot be changed by the user. -
Removed
MOSParticlepropertyFramerateand lua bindings.MOSParticleanimation is now handled withSpriteAnimModelike everything else. -
Removed
ConsoleMan.ForceVisibilityandConsoleMan.ScreenSizelua bindings. -
Removed
ActivityMan.PlayerCountandActivityMan.TeamCountsetters lua bindings (obsolete and did nothing). -
Removed
ActivitypropertiesTeamCountandPlayerCount. These are handled internally and do nothing when set in ini. -
Removed
ActivitypropertyFundsOfTeam#, useTeam#Fundsinstead.
0.1.0 pre-release 2 - 2020/05/08
-
Lua binding for
Box::IntersectsBox(otherBox), that returns true if 2 boxes intersect. -
Command line arguments for launching directly into editors using
-editor "EditorName".
Valid editor names are:ActorEditor,GibEditor,SceneEditor,AreaEditorandAssemblyEditor. -
Added handling for custom number and string values in INI.
AddCustomValue = NumberValue YourKeyName = YourNumberValue // Integer or floating point number. AddCustomValue = StringValue YourKeyName = YourStringValueYourKeyNameis a string value and is not limited to just numbers. -
New
Settings.inipropertyAdvancedPerformanceStats = 0/1to disable/enable the performance counter graphs (enabled by default). -
Added
PassengerSlotsINI and Lua property to Actors. This determines how many spaces in the buy menu an actor will take up (1 by default). It must be a whole number but can theoretically be 0 or less. -
Added Lua bindings for
IsInsideXandIsInsideYtoArea. These act similarly to the pre-existingIsInside, but allow you to check for the X and Y axes individually. -
Added the concept of
SoundSets, which are collections of sounds inside aSoundContainer. This allows you to, for example, put multiple sounds for a given gunshot inside aSoundSetso they're played together. -
SoundContainershave been overhauled to allow for a lot more customization, including per-sound customization. The following INI example shows all currently available capabilities with explanatory comments:AddSoundContainer = SoundContainer // Note that SoundContainers replace Sounds, so this can be used for things like FireSound = SoundContainer PresetName = Preset Name Here CycleMode = MODE_RANDOM (default) | MODE_FORWARDS // How the SoundContainer will cycle through its `SoundSets` whenever it's told to select a new one. The former is prior behaviour, the latter cycles through SoundSets in the order they were added. LoopSetting = -1 | 0 (default) | 1+ // How the SoundContainer loops its sounds. -1 means it loops forever, 0 means it plays once, any number > 0 means it plays once and loops that many times. Immobile = 0 (default) | 1 // Whether or not the SoundContainer's sounds should be treated as immobile. Immobile sounds are generally used for UI and system sounds; they will always play at full volume and will not be panned or affected by global pitch during game slowdown. AttenuationStartDistance = Number (default -1) // The distance at which the SoundContainer's sounds will start to attenuate out, any number < 0 set it to the game's default. Attenuation calculations follows FMOD's Inverse Rolloff model, which you can find linked below. Priority = 0 - 256 (default 128) // The priority at which the SoundContainer's sounds will be played, between 0 (highest priority) and 256 (lowest priority). Lower priority sounds are less likely to be played are a lot of sounds playing. AffectedByGlobalPitch = 0 | 1 (default) // Whether or not the SoundContainer's sounds will be affected by global pitch, or only change pitch when manually made to do so via Lua (note that pitch setting is done via AudioMan). AddSoundSet = SoundSet // This adds a SoundSet containing one or more sounds to the SoundContainer. AddSound = ContentFile // This adds a sound to the SoundSet, allowing it to be customized as shown. Filepath = "SomeRte.rte/Path/To/Sound.wav" Offset = Vector // This specifies where the sound plays with respect to its SoundContainer. This allows, for example, different sounds in a gun's reload to come from slightly different locations. X = Number Y = Number AttenuationStartDistance = Number // This functions identically to SoundContainer AttenuationStartDistance, allowing you to override it for specific sounds in the SoundContainer. MinimumAudibleDistance = Number (default 0) // This allows you to make a sound not play while the listener is within a certain distance, e.g. for gunshot echoes. It is automatically accounted for in sound attenuation. AddSound = "SomeRte.rte/Path/To/AnotherSound.wav" // This adds a sound to the SoundSet in oneline, allowing it to be compactly added (without customisation). AddSound = "SomeRte.rte/Path/To/YetAnotherSound.wav" // This adds a sound to the SoundContainer, creating a new SoundSet for it with just this sound.NOTE: Here is a link to FMOD's Inverse Rolloff Model.
-
SoundContainerLua controls have been overhauled, allowing for more control in playing and replaying them. The following Lua bindings are available:soundContainer:HasAnySounds() - Returns whether or not the SoundContainer has any sounds in it. Returns True or false.soundContainer:IsBeingPlayed() - Returns whether or not any sounds in the SoundContainer are currently being played. Returns True or False.soundContainer:Play(optionalPosition, optionalPlayer) - Plays the sounds belonging to the SoundContainer's currently selected SoundSet. The sound will play at the position and for the player specified, or at (0, 0) for all players if parameters aren't specified.soundContainer:Stop(optionalPlayer) - Stops any playing sounds belonging to the SoundContainer, optionally only stopping them for a specified player.soundContainer:AddSound(filePath, optional soundSetToAddSoundTo, optionalSoundOffset, optionalAttenuationStartDistance, optionalAbortGameIfSoundIsInvalid) - Adds the sound at the given filepath to the SoundContainer. If a SoundSet index is specified it'll add it to that SoundSet. If an offset or attenuation start distance are specified they'll be set, as mentioned in the INI section above. If set to abort for invalid sounds, the game will error out if it can't load the sound, otherwise it'll show a console error.soundContainer:SetPosition(position) - Sets the position at which the SoundContainer's sounds will play.soundContainer:SelectNextSoundSet() - Selects the next SoundSet to play when soundContainer:Play(...) is called, according to the INI defined CycleMode.soundContainer.Loops - Set or get the number of loops for the SoundContainer, as mentioned in the INI section above.soundContainer.Priority - Set or get the priority of the SoundContainer, as mentioned in the INI section above.soundContainer.AffectedByGlobalPitch - Set or get whether the SoundContainer is affected by global pitch, as mentioned in the INI section above. -
MovableObjectscan now run multiple scripts by putting multipleAddScript = FilePath.lualines in the INI definition. (Issue #109)
Scripts will have their appropriate functions run in the order they were added. Note that all scripts share the sameself, so care must be taken when naming self variables.
Scripts can be checked for withmovableObject:HasScript(filePath);and added and removed withmovableObject:AddScript(filePath);andmovableObject:RemoveScript(filePath);. They can also be enabled and disabled in Lua (preserving their ordering) withmovableObject:EnableScript(filePath);andmovableObject:DisableScript(filePath);. -
Scripts on
MovableObjectsand anything that extends them (i.e. most things) now support the following new functions (in addition toCreate,Update,DestroyandOnPieMenu). They are added in the same way as the aforementioned scripts:OnScriptRemoveOrDisable(self, scriptWasRemoved) - This is run when the script is removed or disabled. The scriptWasRemoved parameter will be True if the script was removed and False if it was disabled.OnScriptEnable(self) - This is run when the script was disabled and has been enabled.OnCollideWithTerrain(self, terrainMaterial) - This is run when the MovableObject this script on is in contact with terrain. The terrainMaterial parameter gives you the material ID for the terrain collided with. It is suggested to disable this script when not needed to save on overhead, as it will be run a lot!OnCollideWithMO(self, collidedMO, collidedRootMO) - This is run when the MovableObject this script is on is in contact with another MovableObject. The collidedMO parameter gives you the MovableObject that was collided with, and the collidedRootMO parameter gives you the root MovableObject of that MovableObject (note that they may be the same). Collisions with MovableObjects that share the same root MovableObject will not call this function. -
Scripts on
Attachablesnow support the following new functions:OnAttach(self, newParent) - This is run when the Attachable this script is on is attached to a new parent object. The newParent parameter gives you the object the Attachable is now attached to.OnDetach(self, exParent) - This is run when the Attachable this script is on is detached from an object. The exParent gives you the object the Attachable was attached to.
-
Codebase now uses the C++14 standard.
-
Major cleanup and reformatting in the
Systemfolder. -
Upgraded to new, modern FMOD audio library. (Issue #72).
Sounds now play in 3D space, so they pan to the left and right, and attenuate automatically based on the player's viewpoint. -
Soundshave been renamed toSoundContainers, and are able to handle multiple sounds playing at once. INI definitions have changed accordingly.
They must be added using... = SoundContainer, and individual sounds for them must be added usingAddSound = ContentFile.... -
Various lua bindings around audio have been upgraded, changed or fixed, giving modders a lot more control over sounds. See documentation for more details.
-
Centered the loading splash screen image when
DisableLoadingScreenis true. -
Box:WithinBoxlua bindings have been renamed:
Box:WithinBoxis nowBox:IsWithinBox.
Box:WithinBoxXis nowBox:IsWithinBoxX.
Box:WithinBoxYis nowBox:IsWithinBoxY. -
Made
AHumanshow both weapon ammo states when 2 one-handed weapons are equipped. -
Added support for multiple lines in item descriptions (Issue#58). This is done as follows:
Description = MultiLineText AddLine = First line of text AddLine = Second line of text ... -
FrameManbroken down to 4 managers. New managers are:
PerformanceManto handle all performance stats and measurements.
PostProcessManto handle all post-processing (glows).
PrimitiveManto handle all lua primitive drawing. -
Post-processing (glow effects) is now enabled at all times with no option to disable.
-
All lua primitive draw calls are now called from
PrimitiveMan.
For example:FrameMan:DrawLinePrimitive()is nowPrimitiveMan:DrawLinePrimitive(). -
Resolution multiplier properties (
NxWindowedandNxFullscreen) in settings merged into a single propertyResolutionMultiplier. -
Incompatible/bad resolution settings will be overridden at startup with messages explaining the issue instead of multiple mode switches and eventually a reset to default VGA.
Reset to defaults (now 960x540) will happen only on horrible aspect ratio or if you managed to really destroy something. -
You can no longer toggle native fullscreen mode from the settings menu or ini. Instead, either select your desktop resolution at 1X mode or desktop resolution divided by 2 at 2X mode for borderless fullscreen windowed mode.
Due to limitations in Allegro 4, changing the actual resolution from within the game still requires a restart. -
If the current game resolution is half the desktop resolution or less, you will be able to instantly switch between 1X and 2X resolution multiplier modes in the settings without screen flicker or delay.
If the conditions are not met, the mode switch button will showUnavailable. -
PieMenuActorandOrbitedCrafthave now been removed. They are instead replaced with parameters in their respective functions, i.e.OnPieMenu(pieMenuActor);andCraftEnteredOrbit(orbitedCraft);. Their use is otherwise unchanged.
-
Fixed LuaBind being all sorts of messed up. All lua bindings now work properly like they were before updating to the v141 toolset.
-
Explosives (and other thrown devices) will no longer reset their explosion triggering timer when they're picked up. (Issue #71)
-
Sprite Animation Mode
ALWAYSPINGPONGnow works properly. Sprite animation has also been moved toMOSpriteinstead ofMOSRotating, they they'll be able to properly animate now. (Issue#77) -
Fixed
BG Armflailing when reloading one-handed weapon, so shields are no longer so useless. -
Fixed crash when clearing an already empty preset list in the buy menu.
-
Temporary fix for low mass attachables/emitters being thrown at ridiculous speeds when their parent is gibbed.
-
The audio system now better supports splitscreen games, turning off sound panning for them and attenuating according to the nearest player.
-
The audio system now better supports wrapping maps so sounds handle the seam better. Additionally, the game should be able to function if the audio system fails to start up.
-
Scripts on attached attachables will only run if their parent exists in MovableMan. (Issue #83)
-
Removed all Gorilla Audio and SDL Mixer related code and files.
-
Removed all Steam Workshop and Achievement related code.
-
Removed a bunch of outdated/unused sources in the repo.
-
Removed all OSX/Linux related code and files because we don't care. See Liberated Cortex for working Linux port.
-
Removed a bunch of low-level
FrameManlua bindings:
FrameMan:ResetSplitScreens,FrameMan:PPMsetter,FrameMan:ResX/Y,FrameMan:HSplit/VSplit,FrameMan:GetPlayerFrameBufferWidth/Height,FrameMan:IsFullscreen,FrameMan:ToggleFullScreen,FrameMan:ClearBackbuffer8/32,FrameMan:ClearPostEffects,FrameMan:ResetFrameTimer,FrameMan:ShowPerformanceStats. -
Native fullscreen mode has been removed due to poor performance compared to windowed/borderless mode and various input device issues.
The version of Allegro we're running is pretty old now (released in 2007) and probably doesn't properly support/utilize newer features and APIs leading to these issues.
The minimal amount of hardware acceleration CC has is still retained through Windows' DWM and that evidently does a better job. -
Removed now obsolete
Settings.iniproperties:
Post-processing:TrueColorMode,PostProcessing,PostPixelGlow.
Native fullscreen mode:Fullscreen,NxWindowed,NxFullscreen,ForceSoftwareGfxDriver,ForceSafeGfxDriver.
0.1.0 pre-release 1 - 2020/01/27
-
You can now run the game with command line parameters, including
-hto see help and-cto send ingame console input to cout. -
MOSpritenow has theFlipFactorproperty that returns -1 if the sprite is flipped and 1 if it's not.
Using anynugNumcalculations based onHFlippedis now considered criminal activity. -
TDExplosivenow has theIsAnimatedManuallyproperty that lets modders set its frames manually through lua. -
You can now add
AEmitterstoMOSRotatingand have them function similarly to attachables.
Addition:parent:AddEmitter(emitterToAdd)orparent:AddEmitter(emitterToAdd, parentOffsetVector)
Removal:parent:RemoveEmitter(emitterToRemove)orparent:RemoveEmitter(uniqueIdOfEmitterToRemove) -
Attachables can now collide with terrain when attached.
INI property:CollidesWithTerrainWhenAttached = 0/1
Check value:attachable.IsCollidingWithTerrainWhileAttached
Manipulate function:attachable:EnableTerrainCollisions(trueOrFalse)
Collisions can be manipulated only if the attachable was set toCollidesWithTerrainWhenAttached = 1in ini. -
Actor.DeathSoundis now accessible to lua usingActor.DeathSound = "string pathToNewFile"orActor.DeathSound = nilfor no DeathSound. -
AHumanFeet are now accessible to lua usingAHuman.FGFootandAHuman.BGFoot. Interaction with them may be wonky. -
Streamlined debug process and requirements so old Visual C++ Express edition is no longer needed for debugging.
-
Added minimal debug configuration for quicker debug builds without visualization.
-
ACrabaim limits now adjust to crab body rotation. -
ACrab.AimRangecan now be split intoAimRangeUpperLimitandAimRangeLowerLimit, allowing asymmetric ranges. -
Objective arrows and Delivery arrows are now color coordinated to match their teams, instead of being only green or red.
-
BuyMenu
Bombstab will now show allThrownDevicesinstead of justTDExplosives. -
The list of
MOSRotatingattachables (mosr.Attachables) now includes hardcoded attachables like dropship engines, legs, etc. -
Attachable lua manipulation has been significantly revamped. The old method of doing
attachable:Attach(parent)has been replaced with the following:
Addition:parent:AddAttachable(attachableToAdd)orparent:AddAttachable(attachableToAdd, parentOffsetVector)
Removal:parent:RemoveAttachable(attachableToRemove)orparent:RemoveAttachable(uniqueIdOfAttachableToRemove) -
Wounds have been separated internally from emitter attachables.
They can now be added withparent:AddWound(woundEmitterToAdd).
Removing wounds remains the same as before. -
Built-in Actor angular velocity reduction on death has been lessened.
-
SFX slider now works properly.
-
BGM now loops properly.
-
Sound pitching now respects sounds that are not supposed to be affected by pitch.
-
Using
actor:Clone()now works properly, there are no longer issues with controlling/selecting cloned actors. -
TDExplosive.ActivatesWhenReleasednow works properly. -
Various bug fixed related to all the Attachable and Emitter changes, so they can now me affected reliably and safely with lua.
-
Various minor other things that have gotten lost in the shuffle.
-
All licensing-related code has been removed since it's no longer needed.
-
Wounds can no longer be added via ini, as used to be doable buggily through ini
AddEmitter. -
All usage of the outdated Slick Profiler has been removed.
-
TDExplosive.ParticleNumberToAddproperty has been removed.
Note: For a log of changes made prior to the commencement of the open source community project, look here.