* Updated `factorio-data` to version `2.0.28` (latest)
* Updated `compatibility/defines.lua` to `2.0.28` (latest)
* Updated all prototypes to match Factorio 2.0
* Added new prototypes in Factorio 2.0
* `AgriculturalTower`
* `AsteroidCollector`
* `Car`
* `CargoBay`
* `CargoLandingPad`
* `CurvedRailA`
* `CurvedRailB`
* `DisplayPanel`
* `ElevatedCurvedRailA`
* `ElevatedCurvedRailB`
* `ElevatedHalfDiagonalRail`
* `ElevatedStraightRail`
* `FusionGenerator`
* `FusionReactor`
* `HalfDiagonalRail`
* `LightningAttractor`
* `RailRamp`
* `RailSupport`
* `SelectorCombinator`
* `SpacePlatformHub`
* `SpiderVehicle`
* `Thruster`
* Removed command line utility `draftsman-update`
* Added command line utility `draftsman` with multiple subcommands
* `draftsman update ...` for the original functionality of modifying a Factorio environment
* `draftsman list` to list all mods detected under a particular environment
* `draftsman enable/disable ...` enables or disables one or more mods
* `draftsman factorio-version` reports or sets the version of Factorio's data
* `draftsman version` reports Draftsman's own semantic version
* Write `draftsman -h` or `draftsman [command] -h` for more information
* Swapped from `schema` to `pydantic`
* Format for specifying schemas is now much clearer
* Both blueprintables and entities now share the same exporting code, overall making more sense
* Can now create a JSON schema of any entity or blueprintable (by calling `Object.json_schema()`), which can be exported and used in any other program that reads JSON schema(!)
* However, minimum Python version is now 3.7 to support type hints
* Switched from `unittest` to `pytest` (more features with similar syntax; `coverage run` still works the same)
* Changed the code to be primarily Python3 compatible with the new minimum version
* Added `extras` module which implements some handy new features:
* Added `flip_belts(blueprint)` which flips all belt entities inside the blueprint (preserving continuity)
* Added a bunch of equivalent functions from the Factorio StdLib:
* Added `opposite()`, `next()`, `previous()`, `to_orientation()`, and `to_vector()` to `Direction`
* Added `Orientation` class, similar to `Direction`; comes with it's own suite of `__add__()`, `to_direction()`, and `to_vector()` helpers
* Added `constants.Ticks` enumeration which contains `SECONDS`, `MINUTES`, `HOURS`, etc. stored as quantities of Factorio ticks
* Added `union`, `intersection`, and `difference` to `EntityList`, `TileList`, and `ScheduleList`
* Updated `Direction` to now be the Factorio 2.0 16-direction enum; use `LegacyDirection` for the old enumerations
* Added `TrainConfiguration`, which allows you to specify entire trains with strings like `"1-4-1"` and customize them on a per-car basis
* Added `WaitCondition` and `WaitConditions` objects which keep track of train station condition trees
* `WaitConditions` can be combined using bitwise `and` and `or` in order to collect them into a `WaitConditions` object:
* Added `WaitConditionType` and `WaitConditionCompareType` enumerations
* Added `Collection.add_train_at_position()` and `Collection.add_train_at_station()` to make placing trains easier
* Added `Collection.find_trains_filtered()` to allow users to search Blueprints/Groups for trains of particular types
* Added `RailPlanner` (finally)
* Added `data.fluids` module with some useful helpers
* Added `data.planets` module allowing you to access planet metadata for things like surface properties
* Added `data.items.fuels` which is dict of sets of item names that fall under their respective fuel categories
* Added data functions `signals.add_signal()`, `tiles.add_tile()`, `entities.add_entity()`, etc. which allow you to add entities on the fly (primarily for Factorio environment compatibility)
* Added `RequestItemsMixin` to `Locomotive`, `CargoWagon`, and `ArtilleryWagon`
* Added `unknown` keyword to all entity/tile creation constructs which allows the user to specify what should happen when draftsman encounters an entity it doesn't recognize
* Changed `InvalidEntityError` and `InvalidTileErrors` so that they now try to detect a similar tile/entity name and display that information to the user in the error message
* For example, if you accidentally type `Container("wodenchest")`, it will realize you probably meant to type `Container("wooden-chest")` and suggest that to you instead
* Added a bunch of new documentation to document the above
* Added a bunch of new examples to test out the above new features
* Added a fixture that ensures that Draftsman is running a vanilla configuration before running tests, and exits if it detects that it is not the case.
* Added a new command line option for `draftsman-update` `--lua-version`, which prints the version of Lua currently being used for debugging compat issues
* Added a README.md to the `examples` folder which provides short descriptions for all of the examples
* Integrated aforementioned examples into the test suite
* Removed the `area`, `tile_width`, and `tile_height` properties from `Blueprint`, which have been replaced with `get_world_bounding_box()` and `get_dimensions()`
* These attributes are no longer cached in the blueprint and have to be recalculated each time such information is desired
* However, this means that it only has to be calculated when the user actually wants it, instead of every time a user adds a new entity/tile to a blueprint
* The user has a better idea of when they can cache the blueprint's dimension to reduce calculation, so it's deferred to the user
* By making them functions it also makes it abundantly clear that calling them is not likely `O(1)`
* Added the `get_first` method to the defaults for the name of every entity
* This means that if a data configuration has zero entities of a particular type, using a default name will result in a palatable error instead of something cryptic
* Added `index` attribute to all `Blueprintable` types, which allows the end user to customize the index in a parent BlueprintBook manually
(Still autogenerated based on list order if unspecified, but now *can* be overridden)
* Added data functions `signals.add_signal()`, `tiles.add_tile()`, `entities.add_entity()`, etc. which allow you to add entities on the fly (primarily for Factorio environment compatibility)
* Fixed a bunch of warts in the API:
* Added the ability to modify `x` and `y` attributes of both `position` and `tile_position` and have each other update in tandem
* Made it possible to rotate objects in parent `Collections` as long as they're either square or rotated such that they preserve their original footprint (akin to Factorio)
* Added `__eq__` operators to pretty much all draftsman things (`Entity`, `EntityList`, `TileList`, `ScheduleList`, `Schedule`, `WaitConditions`, etc.)
* Added more professional `__repr__` functions to pretty much all draftsman things as well
* Normalized all import filenames to use underscores consistently (potentially breaking change!)
* Finished up documentation on `DeconstructionPlanner`
* [PERF] Reduced memory consumption by up to ~80 percent(!) (This also made it quite a bit faster to boot)
* Made it so that default `collision_mask` keys are resolved at once at the data level when you call `draftsman-update`, so you can query `entities.raw` for the correct default value
* Bumped Lupa to 2.0 which allows me to specify Lua version 5.2 which Factorio uses (50)
* `draftsman-update` will issue a warning if it cannot specify the correct Lua version: It'll still try to load and may still work anyway, but it's not guaranteed to\
* Added `--factorio-version` command for `draftsman-update` which either displays the current Factorio version or sets it to a specific Github tag
* Patched InvalidModVersionError for now (51)
* Removed `on_(tile/entity)_(insert/set/remove)` from all `EntityCollection` and `TileCollection` classes
* Removed `on_(insert/set/remove)` from all `Entity` implementations as well (they were not used and are replaced with better things now)
* Renamed `data` member to `_root` member on `EntityList` and `TileList` (Internal reasons)
* Fixed issue 119