After almost 1500 changes we're proud to announce the first release candidate of the Spring 0.82 series.
Thanks everyone for their contributions!
Download links: We will put these links on the download page once the release is live on the lobby server.
Please, test this release candidate and report any bugs you may find (in particular regressions since the last release, 0.81.2.1!) on mantis. If no blocking issues are reported, we will officially release this in one - two weeks, though not earlier than on the 3rd of August.
We'd also like to remember game developers to test their games against this build of Spring, and in particular think about the following breaking changes:
- Removal of start unit spawning (replacement gadgets in the linked thread)
- Dropping support for modinfo.tdf (modinfo.lua is the alternative)
- Removal of AllowUnsafeChanges (everything will be allowed by default now)
Additionally I'd like to highlight that this release will allow mid-game join and rejoin (by replaying the game up to the point where the real game is).
Detailed changes since the 0.81.2.1 bugfix release:
Engine / General:
- added HeadLess version of the engine (no graphics, no sound) by hughperkins
- better overall handling of connection problems, with highlighting of uncontrolled units
- players in startscript may reconnect to a running game, even with changed IP address
- players can choose server speed throttling algorithm by voting (/speedcontrol)
- do not crash on AI Interface error
- MT/GML: now a separate build target: make spring-multithreaded
- fix linking under Fedora 13
- allow choosing between available sound devices through config (snd_device)
- add missing /skip variants to word completion
- use new dependency system for maphelper.sdz (by Beherith)
- OS X fixes
- hardcoded startscripts removed (Air Test, etc.)
- more default intercept types added
EmgCannon -> 1, AircraftBomb -> 8, Flame -> 16, TorpedoLauncher -> 32
LightningCannon -> 64, Rifle -> 128, Melee -> 256 - engine does not spawn start unit anymore
- engine does not use StartUnit tag in sidedata.lua anymore (but still passes it to Spring.GetSideData)
- engine does not read `Script' map tag anymore
- engine does not read `ScriptName' modoption anymore
- engine does not deal with `StartMetal' and `StartEnergy' modoptions anymore
- pathfinder debugging views can be rendered now when spectating (and not cheating)
- dropped modinfo.tdf support (only modinfo.lua is supported now)
- clients now compare their path-cache CRCs and warn about differences instead of updating their running checksums with them
- Spring's CPU affinity can now also be set on non-win32 platforms, use the SetCoreAffinity ~/.springrc parameter as a bitmask
- new unit tag: cloakTimeout, int, default 128 frames
- fixed the featureVisibility mod-option
- fixed calls to the engine path-finder to be sync-safe when run in unsynced context
- reduced frequency of units ending up in "can't reach destination" situations
- fixed units not inheriting orders from factories and piling up (due to having their paths aborted)
- removed the TEDclassString UnitDef parameter (side-effect: hub-like units will break if they have a yardmap)
- changed the semantics of the holdSteady UnitDef tag
true ==> slave transportees to orientation of transporter attachment piece
false ==> slave transportees to orientation of transporter body (default)
- fixed alpha-masked shadows for S3O models
- fixed far-textures (caused changing teamcolors and disappearing units)
- support the OBJ model format (http://springrts.com/phpbb/viewtopic.php?f=9&t=22635)
- support specular lighting, multiple blendable detail textures, and sky reflections on SMF maps ("SSMF")
http://springrts.com/phpbb/viewtopic.php?f=13&t=21951
http://springrts.com/phpbb/viewtopic.php?f=13&t=22564 (slightly outdated wrt. the SMD parameters) - converted all shadow, tree, grass, model, and map shaders to GLSL
- vertex-animated grass; maps can specify the grass blade- and shading-textures and the dimensions/angle for blades
- refactored and abstracted unit/feature/projectile drawing to be format-agnostic
- increased global decoupling between simulation and rendering code
- fixed model specular lighting (most visible on units)
- S3O model normals are now auto-scaled to unit-length
- maps with mis-specified skybox textures will now load (without crashing Spring)
- use OpenAL Soft 1.11 under windows (was Creative)
- air-absorpion: absorb high frequencies when sound effects are far away (config-key & default value: snd_airAbsorption=0.1)
- no-sound support through NO_SOUND compile time define or NoSound config-key
- list of data-dirs for engine & unitsync are now always equal
- API cleaned: no more void*, all structs deprecated
- data dirs read from /etc/spring/datadir (separator is now ":" instead of " ")
- added a new inline ctrl command '\008' which resets the TextColor to the
color that was active when Print() got called, as in the following example:
font:SetTextColor(0, 0, 1); -- blue
font:Print("\255\255\000\000red\255\000\255\000green\008blue");
- LuaLobby:
- callouts:
- Script.CreateLobby() -> userdata lobCon
- lobCon:Connect(string url, int port)
- lobCon:Disconnect()
- lobCon:Login(string username, string password)
- lobCon:Rename(string newname)
- lobCon:ChangePass(string oldpassword, string newpassword)
- lobCon:Register(string username, string password)
- lobCon:ConfirmAggreement()
- lobCon:JoinChannel(string chan_name [,string password])
- lobCon:LeaveChannel(string chan_name)
- lobCon:Say(string chan_name, string message)
- lobCon:SayEx(string chan_name, string message)
- lobCon:SayPrivate(string user_name, string message)
- lobCon:StatusUpdate(bool ingame, bool away)
- lobCon:Channels()
- lobCon:KickChannelMember(string chan_name, string user_name, string reason)
- lobCon:ChangeTopic(string chan_name, string topic)
- lobCon:Poll()
- callins:
- lobCon.DoneConnecting(bool sucess, string error_message)
- lobCon.ServerGreeting(string server_version, string spring_version, int udp_port, int mode)
- lobCon.RegisterDenied(string reason)
- lobCon.RegisterAccepted()
- lobCon.LoginDenied(string reason)
- lobCon.LoginEnd()
- lobCon.Aggreement(string text)
- lobCon.Motd(string text)
- lobCon.ServerMessage(string text)
- lobCon.ServerMessageBox(string text, string url)
- lobCon.AddUser(string user_name, string country, number cpu)
- lobCon.RemoveUser(string user_name)
- lobCon.UserStatusUpdate(string user_name, bool away, bool bot, bool ingame, bool moderator, int rank)
- lobCon.ChannelInfo(string chan_name, int num_users)
- lobCon.ChannelInfoEnd()
- lobCon.RequestMutelist(string chan_name)
- lobCon.Mutelist(string chan_name, table {"userABC","userXYZ",...})
- lobCon.Joined(string chan_name)
- lobCon.JoinFailed(string chan_name, string reason)
- lobCon.ChannelMember(string chan_name, string user_name, bool joined)
- lobCon.ChannelMemberLeft(string chan_name, string user_name, string reason)
- lobCon.ChannelMemberKicked(string chan_name, string user_name, string reason)
- lobCon.ChannelTopic(string chan_name, string author, int time, string topic)
- lobCon.ChannelMessage(string chan_name, string text)
- lobCon.Said(string chan_name, string user_name, string text)
- lobCon.SaidEx(string chan_name, string user_name, string text)
- lobCon.SaidPrivate(string user_name, string text)
- lobCon.Disconnected()
- lobCon.NetworkError(string message)
- callouts:
- added a new los checking argument to Set..RulesParam()
e.g. new syntax is SetUnitRulesParam(int unitID, string paramName, float paramValue, { public = true } )
possible values for the table are:
`private` : only readable by the ally (default)
`allied` : readable by ally + ingame allied
`inlos` : readable if the unit is in LOS
`inradar` : readable if the unit is in AirLOS
`public` : readable by all
note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it can read params with `inradar=true` even if the param has `inlos=false`)
note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied` and/or `public` - new Spring.GetUnitMetalExtraction(unitID) -> nil | number
- new synced Spring.ShareTeamResource(teamID_src, teamID_dst, type = ["metal"|"energy"], amount) -> nil
- new Spring.GetTeamResourceStats(teamID, resourcetype = ["metal"|"energy"]) -> nil | used, produced, excess, recv, sent
- added Spring.SetProjectileMoveControl(number pid, boolean b) --> nil callout; if <b>, makes all piece/weapon projectile movement fully Lua-controllable
- improved Spring.GetTeamStatsHistory. It retuns now also the most recent data, not just the data of the cached stats which get updated only all 16 seconds.
- fixed incorrect scaling in Spring.SetUnitResourceParam
- fixed Spring.GetAIInfo, it returned incorrectly the given teamID as first argument
- fixed a bug in Script.RemoveSyncedActionFallback
- added missing `coroutines` module and missing `select` function to unsynced LuaGadgets
- added os.setlocale to LuaUI
- added Save/Load callins, both get a userdatum representing a save file as single argument
Save is unsynced, Load is synced (both gadget only)
Should allow implementing savegames mod side with less hacks
/reloadgame chat command added for development purposes, this fires the Load event again - modified base {armordefs|movedefs|sidedata}.lua to follow pattern of icontypes.lua
- added a ShieldPreDamaged call-in to LuaRules, triggered before any engine shield-vs-projectile logic executes
- UnitDefs.model.textures now actually contains the names of the model textures for unit-type i
- script.txt: Engine ignores GAME\\ModOptions\\LuaRules & interprets GAME\\ModOptions\\LuaGaia just as a boolean now
- fixed GetScreenGeometry on win32 platforms to return the proper screenSizeY, not screenSizeY
- taskbarSizeY
- moved Spring.SetUnitRulesParam, Spring.SetTeamRulesParam, Spring.SetGameRulesParam from LuaRules-only to LuaSyncedCtrl
- removed evaluator functions from LuaOpengl
- removed Spring.MakeFont
- removed Spring.SetRulesInfoMap, Spring.GetRulesInfoMap, Script.GetConfigString
- removed Spring.CreateUnitRulesParams, Spring.CreateTeamRulesParams, Spring.CreateGameRulesParams
- removed AllowUnsafeChanges("USE AT YOUR OWN PERIL"), it's always enabled now
Engine / Unit Scripts:
- LUS: SetSignalMask raises error now when called outside thread
- LUS: Signal/SetSignalMask support arbitrary objects as `signal names' now, bitwise logic is still applied to numbers
- LUS: _G in a Lua Unit Script points to the environment of that Lua Unit Script now
- LUS: TargetWeight and BlockShot are actually called now
- COB: Added KSIN (135, 1024*sin(x)), KCOS (136), KTAN (137) and SQRT (138) get constants.
- LUS: Fixed a desync bug.
Interface:
- fixed middle click scroll speed on linux
- added new MiddleClickScrollSpeed option
- more responsive mouse movement
- made it easier to select units in factories
- added new command "/buildwarnings [0|1]", analogous to "/movewarnings [0|1]"
- improved unit type mix in front moves
- new middle click scroll icon
AIs:
- added various new debug-draw callouts for profiling, state visualization, etc.
- make sure the Release event always reaches dieing-state AI's
- added a GetUnitVel callback, returns a unit's velocity vector
- new Python AI Interface by theGeorge & abma
- E323AI bug-fixes, logic- and performance enhancements
- AAI: fix some crashes (one on death) & a logic error
- RAI, KAIK and AAI: support unit captured&given from&to them
- RAI, KAIK and AAI: config-, log- & cache-files now compatible with pool archived mods
- KAIK: switched to .lua config-file format, added a basic mod whitelisting mechanism
- KAIK: event-based TM updates
- fix a crash on Skirmish AI death
- fix Java AI Interface loading on Debian
- fix Java compilation on some systems
- fix Java crash: increase initial java heap size (by cranphin)
- send an Update event before the first UnitCreated (when initializing mid-game)
Bugfixes:
- LightingCannon (sic) finally isn't supported anymore, use LightningCannon instead (default weapondef_post.lua includes backward compability)
- fixed a bug in LuaParser, so you can know use booleans in lua CEG configfiles (before it just accepted "1"/"0" for some tags)
- fixed occasional bug where countdown time went into negative numbers and game never started
- fixed impactOnly ignored features
- improved error handling on network packet level