Some of the highlights of this release include native Windows support, customizable keybindings, type synonyms and equirecursive types, and a prototype tournament server (#1798) where players can upload their solutions to challenge scenarios. See below for a more detailed list (or see the complete list of git commits).
Aside from the more visible changes listed below, this release cycle saw a lot of internal refactoring. For example, we finished splitting the codebase into a number of independent sublibraries and split several large modules into smaller modules.
- New Discord server!
- Types are now required to start with an uppercase letter (#1583)
- Use
swarm format --v0.5
to convert old code.
- Use
volume
command measuring the enclosed area around a given location (#1747)sow
command for planting growing entities that spread (#1817)- Type synonyms (#1865)
- Recursive types (#1894)
- Entity tags and related commands (#1635)
meetAll
command now returns a list (#1999)
- New
lens
entity and recipe fordetonator
(#1876) infinite improbability drive
device enablingteleport
command (#1724)- Recipes for
rolex
,olfactometer
,dozer blade
, andhourglass
entities (#2028, #2025)
- Beekeeping scenario (#1599)
- Fishing scenario (#1628)
- Dim sum restaurant (#1686)
- Gallery scenario (#1760)
- Snake automata (#1699)
- Path caching, for more efficient repeated use of the
path
command (#1595) - Render any map to PNG (#1632)
- Extensible terrain (#1775)
- Spreadable plant growth (#1817)
- Exercising commands can consume entities (#1777)
- Recognize built structures (#1579)
- Test for point-to-point connectivity (#1721)
- Validate palettes (#1938), map shape (#1935), subworld references (#1875)
- Fix REPL type display (#1610)
- Handle backword kill word event in REPL (#1861)
- Make log error messages ephemeral (#1877)
- Pretty print code blocks according to widget size (#1897)
- Automatically insert matching close brackets at REPL (#1953)
- Highlight only the part of the REPL input indicated as the location of an error (#1957)
- Popups for new achievements, recipes, and commands (#2027)
- Save current REPL input with down arrow (#2000)
- Customizable keybindings (#1979)
format
subcommand now tries to preserve comments (#1845)- Add
format --v0.5
option to port code from older syntax (#1851) keybindings
subcommand for displaying and initializing keybinding configuration (#1979)docs recipes
subcommand now takes--forward
and--next
flags for filtering the output edges (#2033)
- Fix bug where some pretty-printed terms contained extra elaborated terms inserted by @byorgey (#1497)
- New
path
command for pathfinding by @kostmo (#1523)
- Grant
RobotIntoWater
achievement by @byorgey (#1504) - Achievement for pointless swapping by @kostmo (#1588)
- Support Markdown in achievement descriptions by @kostmo (#1508)
- Render map preview on scenario selection screen by @kostmo (#1515)
- Robot activity counts in F2 menu by @kostmo (#1484)
- Show robot IDs in F2 menu by @kostmo (#1482)
- Print REPL errors inline and get rid of error popup by @byorgey (#1487)
- Improvements to scrolling by @byorgey (#1481)
- Improvements to term pretty-printing by @xsebek (#1464)
swarm format
now actually formats by @xsebek (#1459)
- Save completion time immediately upon finishing scenario by @xsebek (#1118)
- Fix rightward bleeding of custom attributes by @kostmo (#1137)
- Recreate
GameState
from scratch when starting a scenario by @byorgey (#1277) - Load persistent state from disk only once and reuse for all integration tests by @byorgey (#1383)
- Continue parsing the rest of the scenarios in a directory when one fails by @byorgey (#1391)
- Throw an error instead of crashing on impredicative types by @byorgey (#1418)
- Some tutorial improvements, and enforce in CI that commands and entities are introduced before they are required by @kostmo (#1186)
- The
drill
command now returns the first inventory addition by @kostmo (#1165) - Type ascription syntax by @Alexander-Block (#1164)
- Records and record types by @byorgey (#1148)
requirements
command for viewing requirements of any expression by @byorgey (#1183)stride
command by @kostmo (#1219)- Many new robot sensing commands by @kostmo:
- New key input handler framework by @byorgey, so you can program robots to respond to keypresses (#1214)
instant
command (unrestricted variant ofatomic
) by @kostmo (#1231)push
command by @kostmo (#1235)density
command by @kostmo (#1296)use
command by @kostmo (#1287)halt
command by @byorgey (#1256)backup
command by @kostmo (#1400)
- Make
sand
a bit harder to get by @byorgey (#1024) - New
tweezers
entity to enable debugging view and single-stepping CESK machine by @xsebek (#1081) ADT calculator
description now mentionsunit
andvoid
types #1226- Allow zero-tick recipes to apply immediately by @kostmo (#1272)
- New
hourglass
device that provides relative (wait
) but not absolute (time
) capability by @kostmo (#1261) - New
binoculars
device that providesscout
command by @kostmo (#1337) - Separate entities to provide each text operation by @kostmo (#1339)
- Structure templates by @kostmo (#1332)
- Waypoints and portals by @kostmo (#1356)
- Subworlds by @kostmo (#1353)
- World description DSL by @byorgey (#1376)
let
-in
syntax highlighting by @kostmo (#1162)
- Web API to parse, render, and run code by @kostmo (#1142)
- CLI option to set initial speed by @kostmo (#1255)
- Adventure game scenario by @kostmo (#1136)
- Run around in circles by @kostmo (#1158)
- hackman by @kostmo (#1135)
- Whack-a-mole by @kostmo (#1026)
- Additional tutorial level on
give
by @byorgey (#1249) - Lights out by @kostmo (#1273)
- Pig capturing scenario by @kostmo (#1258)
- Sokoban levels by @kostmo (#1269)
- Traffic vignette by @kostmo (#1334)
- Active trapdoor demo by @kostmo (#976)
- Sliding puzzle by @kostmo (#1237)
- Scenario with enemies by @kostmo (#971)
- Arbitrage scenario by @kostmo (#1192)
- Powerset scenario by @kostmo (#1342)
- Allow scrolling the world map unless explicitly disallowed by @byorgey (#1109)
- Add random "static" to
view
outside a certain range by @byorgey (#1110, #1241) - Display the scenario in which an achievement was obtained by @kostmo (#1175)
- World editor prototype by @kostmo (#873)
- Scenario launch options selection by @kostmo (#1010)
- Record best code size by @kostmo (#974)
- Inventory search/filter mode by @byorgey (#1250)
- Display higher clock resolution at lower speeds by @kostmo (#1253)
- Make REPL panel collapsible by @ussgarci (#1076)
- Better typechecking error messages by @byorgey (#1308, #1318)
- Rename inventory to compendium by @kostmo (#1346)
- Goal dialog suppression with
--autoplay
by @kostmo (#1344) - Change binding for Hide REPL to
M-,
by @noahyor (#1375) - Highlight ticks per frame in red when it reaches the cap by @byorgey (#1386)
- Parse and render markdown descriptions by @xsebek (#1106, #1413)
- Achievement for disorientation by @kostmo (#1173)
A few critical bug fixes and improvements:
- Make sure the base always has a
logger
installed in every tutorial level, by @byorgey in #1067 and @xsebek in #1073 - Allow dialog boxes to scroll by @byorgey in #1071
- Fix bug that sometimes caused scenarios to be skipped or repeated by @byorgey in #1065
This is the first release of 2023! It contains:
- various new features and bugfixes (see subsections below)
- UI tweaks
- fewer typos (thanks @bwignall and @kostmo)
- upgraded dependencies (
>=lsp-1.6
and>=brick-1.5
) and raised Stack resolver to use GHC 9.4 #1001 - a ton of internal refactoring
- copy parent robot context to child when executing
build
by @byorgey in #817 - Merge new requirements context with existing when running from REPL by @byorgey in #965
- Reset
lastFrameTime
when starting a new scenario by @byorgey in #855 - Fix capability checking, and refactor/add lots of comments by @byorgey in #959
- Fix
EntityMap
merging by @byorgey in #962 - Fix: add first heard message to log by @xsebek in #842
- Fix hypothetical result of condition by @xsebek in #940
- One file per achievement record by @kostmo in #954
- Show duplicate robot logs by @xsebek in #1022
- Copy requirements map to robot context when loading a new
ProcessedTerm
by @byorgey in #827 - Set REPL to
Working
when base hasprogram
field specified by @byorgey in #846 - Create swarm subdirectories as necessary by @xsebek in #943
- implement Equip/Unequip by @kostmo in #887
- The great
install
/equip
switch by @byorgey in #989
- The great
- Meeting other robots by @byorgey in #920
- New
heading
command by @byorgey in #955 - Add
isempty : cmd bool
to check whether current cell has an entity by @byorgey in #968
- Add
GPS receiver
device to providesenseloc
capability by @byorgey in #956 - Device with recipe for 'appear' capability by @kostmo in #1027
- device for setname by @kostmo in #1028
- swarm-lang IDE hover by @kostmo in #972
- Include
SrcLoc
info with variable binding sites by @byorgey in #993 - Annotate ASTs with types at every node by @byorgey in #991
- Improve OnHover for Def/Let, App and Const by @xsebek in #986
- warn of unused variables by @kostmo in #983
- Expose REPL history via web interface by @kostmo in #821
- Add full color mode option by @xsebek in #851
- New ranching scenario by @kostmo in #835
- new bind tutorial by @kostmo in #895
- A "bucket brigade" of robots by @kostmo in #885
- Ice Cream Shop by @kostmo in #1008
- word search by @kostmo in #999
- Wolf, Goat, Cabbage scenario by @kostmo in #944
- swarm logo animation by @kostmo in #1018
- Boolean expressions of objective prerequisites by @kostmo in #927
- support 'orientationMap' by @kostmo in #1023
- support custom attributes defined in scenarios by @kostmo in #1058
- show devices that enable commands by @kostmo in #899
- Add a "driving mode" to the REPL by @kostmo in #819
- achievements board by @kostmo in #796
- first tutorial completion achievement by @kostmo in #925
- Add achievement for losing by @kostmo in #945
- Better CESK machine pretty-printing by @byorgey in #948
- Add the full expected location for the data directory by @TristanCacqueray in #908
- Extend logs for warnings by @xsebek in #982
A bunch of small fixes and improvements; special thanks to new contributors @0xcefaedfe, @kostmo, @ussgarci, and @valyagolev. Notable changes include:
- New UI features:
- REPL improvements:
- Improve user experience around quitting & moving between tutorial challenges (#754)
autoplay
flag for automatically demonstrating scenario solutions (#792)- Improved inventory sorting and user-controllable sort criteria (#793)
- Ability to temporarily hide robots so you can see what's under them (#802)
- New language features:
- New
void
type (#735)
- New
- Bug fixes:
- Documentation:
- Generate all wiki "cheat sheets" automatically (#769)
- Support for building on GHC 9.4 (#752)
There were several other small fixes and improvements; see the full changelog here.
A couple new features and an important bugfix for the Hackage release.
- Update to
hsnoise-0.0.3
, fixing some world generation bugs that only showed up in the Hackage release. (#746) - New "blank" creative scenario (#741)
- REPL improvements
A bugfix release for a few minor bugs that plagued the first release:
- Fall back to to the swarm data directory when a
run
file is not found (#730)- This bug caused the move tutorial to be unplayable because it tried to execute
run "data/scenarios/Tutorials/move_system.sw"
- This bug caused the move tutorial to be unplayable because it tried to execute
- Fix version check when there is no GitInfo
(#729)
- This bug caused the game to always report that there was a new version available even when you already had the latest (and only!) version.
First Swarm release! Swarm already has:
- a programming language based on the polymorphic lambda calculus + recursion, with a command monad for describing first-class imperative actions
- scenarios which can be loaded from YAML files
- the release comes with official challenges and an in-game tutorial
- the default Classic and Creative modes use the same YAML syntax
- we include JSON schemas for editor support when writing scenarios
- procedural 2D world generation
- LSP server built into the Swarm executable
- Terminal UI interface
- running the executable opens the Main menu by default
- game screen with a world view, inventory and REPL
- popup windows for messages, challenge descriptions, etc.