Releases: redruin1/factorio-draftsman
Releases · redruin1/factorio-draftsman
2.0.0
For a more user friendly overview of some of the changes, see here.
- Updated
factorio-data
to version2.0.28
(latest) - Updated
compatibility/defines.lua
to2.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 subcommandsdraftsman update ...
for the original functionality of modifying a Factorio environmentdraftsman list
to list all mods detected under a particular environmentdraftsman enable/disable ...
enables or disables one or more modsdraftsman factorio-version
reports or sets the version of Factorio's datadraftsman version
reports Draftsman's own semantic version- Write
draftsman -h
ordraftsman [command] -h
for more information
- Swapped from
schema
topydantic
- 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
topytest
(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
- Added a bunch of equivalent functions from the Factorio StdLib:
- Added
opposite()
,next()
,previous()
,to_orientation()
, andto_vector()
toDirection
- Added
Orientation
class, similar toDirection
; comes with it's own suite of__add__()
,to_direction()
, andto_vector()
helpers - Added
constants.Ticks
enumeration which containsSECONDS
,MINUTES
,HOURS
, etc. stored as quantities of Factorio ticks
- Added
- Added
union
,intersection
, anddifference
toEntityList
,TileList
, andScheduleList
- Updated
Direction
to now be the Factorio 2.0 16-direction enum; useLegacyDirection
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
andWaitConditions
objects which keep track of train station condition treesWaitConditions
can be combined using bitwiseand
andor
in order to collect them into aWaitConditions
object:- Added
WaitConditionType
andWaitConditionCompareType
enumerations
- Added
Collection.add_train_at_position()
andCollection.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
toLocomotive
,CargoWagon
, andArtilleryWagon
- 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
andInvalidTileErrors
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 typeContainer("wooden-chest")
and suggest that to you instead
- For example, if you accidentally type
- 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
, andtile_height
properties fromBlueprint
, which have been replaced withget_world_bounding_box()
andget_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 allBlueprintable
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
andy
attributes of bothposition
andtile_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
- Added the ability to modify
- 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 calldraftsman-update
, so you can queryentities.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 fordraftsman-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 allEntityCollection
andTileCollection
classes - Removed
on_(insert/set/remove)
from allEntity
implementations as well (they were not used and are replaced with better things now) - Renamed
data
member to_root
member onEntityList
andTileList
(Internal reasons) - Fixed issue #119
1.1.1
1.1.0
1.0.6
- Updated
factorio-data
to version1.1.88
- Updated
compatibility/defines.lua
to1.1.88
- Merged arpheno's pull request:
- Fixed
Pump
so that it now correctly exports it'sdirection
- Fixed
- Merged SIGSTACKFAULT's pull requests:
- Fix type annotation of
Tile.__init__()
- Fix type annotation of
BlueprintBook.insert()
- Fix type annotation of
draftsman-update
is now (finally) able to load mods from folder directories instead of just zip archivesdraftsman-update
will now prefer mods in folders instead of zip archives if one of each type present and they have the exact same ID and version (I think this matches Factorio, create an issue if it's not)- Added
--report
command todraftsman-update
that prints out a list of currently active mods and their versions (to aid in bug reports) - Fixed Lua
defines
table not being defined by the timefactorio-data/core
runs (#85) - Fixed UTF-8 BOM tokens not being properly stripped from all mod Lua files, resulting in issues when sending to Lupa (#84)
- Changed the Lua load process a whole lot for
draftsman-update
, hopefully behaving more predictably and causing no regressions
1.0.5
- Added
get_blueprintable_from_JSON()
and patchedget_blueprintable_from_string()
so that it no longer converts the string twice (accidentally) - Fixed issue where integer
playback_volume
values on programmable speakers wasn't getting coerced to a float and failing validation (#72) - Fixed Blueprintable objects not being correctly initialized from their constructor when JSON dicts were passed as an argument (#75)
- Fixed
OverlappingObjectsWarning
being incorrectly emitted whenGates
overlapStraightRails
(they now are only emitted if they're not perpendicular to each other) (#76) - Fixed
ConstantCombinator
not recognizing theis_on
member (#77)
1.0.4
- Updated
factorio-data
to version1.1.80
- Updated
compatibility/defines.lua
to1.1.80
- Merged louga31's pull request:
- Fix recipes so that they correctly read either internal format
- Fixed an issue where not all entities were being assigned to
entities.flippable
(#61) - Fixed mod dependency loading (hopefully) so that it should actually handle recursive requires across an arbitrary number of different mods (#70)
- Fixed an issue where required Lua files with a single prepended dot or slash would break the path resolution (#70)
1.0.3
- Updated
factorio-data
to version1.1.76
(latest stable) - Updated
compatibility/defines.lua
to1.1.76
(latest stable) - Merged penguincounter's pull request:
- Fixed logistics requester and buffer chest signatures not having the correct
circuit_mode_of_operation
key
- Fixed logistics requester and buffer chest signatures not having the correct
- Added a
dump_format()
method to entities that outputs a user friendly description of all of the possible key/value entries in the exported blueprint dict- Still needs to be done for Blueprintable; ideally there would be a
Exportable
parent class that would implement the madness - Also need to investigate faster validation options since schema is pretty slow; maybe we can unify and improve speed at the same time
- Still needs to be done for Blueprintable; ideally there would be a
- Added a
get_format()
method intended to get a readable formatted string (that can easily be autogenerated at the top of each entity in the documentation! Not yet but soon) - Changed
_exports
dict to be both more user readable and only defined on a per class basis instead of a per instance basis (so memory usage should be down) - Prepped
env.py
for when Lupa version 2.0 goes live (which will resolve #50) - Fixed
"Mining_Drones_Harder"
mod not loading because of stray "__MACOSX" folder defined alongside (#55) - Fixed
"FactorioExtended-Plus-Logistics"
not loading due to internal file titled__init__.lua
(#56) - Fixed
env.extract_entities().categorize_entities()
toget
flags instead of assuming they exist ("flags"
set is common but optional)
1.0.2
- Added
UpgradePlanner
andDeconstructionPlanner
(#40) - Created an abstract class
Blueprintable
which now implementsBlueprint
,BlueprintBook
,UpgradePlanner
, andDeconstructionPlanner
to increase code reuse - Added
description
attribute toBlueprint
andBlueprintBook
(#41) - Changed the behavior of
draftsman-update
to normalize all mod names to have no spaces (probably not perfect, but should work for now) (#49) - Added a
--path
argument todraftsman-update
so you can specify exactly where to load mods from instead of only the installation directory (#49) - Draftsman now distributes with a vanilla set of pickle data files, so you no longer need to run
draftsman-update
on first install (suggestion from rpdelaney) - Rolling Stock (Locomotives and Wagons) should now have proper collisions that are based on their
orientation
and issue correct warnings (#47) - Updated the documentation around
draftsman-update
to make it more clear and reflect recent changes - Updated all
Blueprintable
documentation files such that they now include a plaintext representation of their JSON structure
1.0.1
1.0.0
1.0.0
This ones' a doozy; for a more verbose explanation see here.
- Updated
factorio-data
to version1.1.61
- Added a
Vector
class to represent 2d positions, and changed most of the code to reflect this change- This is a breaking change, but it should be much more natural to access positions by attribute
x
andy
instead of["x"]
and["y"]
- By specifying a class like this, custom operators are allowed such as vector math, which means that offsetting positions and other operations have become much easier as a result
Vector
has a static member functionfrom_other()
that constructs aVector
object from all valid formats accepted in the past (tuple
,dict
,list
, etc.) which is used in all standard functions, so you shouldn't have to change any of their signaturesVector
also has ato_dict()
method to turn it back into it's dictionary format for exporting ({"x": ..., "y": ...}
)- The
Vector
class is only used on the "outermost" layer due to performance reasons, internally the most common representation is stilllist[float, float]
- This is a breaking change, but it should be much more natural to access positions by attribute
- Added an abstract
Shape
class, along with two implementations:AABB
andRectangle
AABB
andRectangle
are now used for issuingOverlappingObjectWarning
- All functions that used to use
Sequences
orlist[list[float], list[float]]
have been changed toVector
andAABB
respectively for user clarity - Added another class:
CollisionSet
, which is a list ofShapes
used for checking if twoEntity
s intersect one another- This was needed because curved rails have 2 collision boxes instead of a single one
- Collision sets also support rotations, which means that rotations are automatically generated or specified manually for edge cases like rails
- In essence,
CollisionSets
provide more flexibility for entity footprints on a per-entity-type (or even per-entity) level
- Added
find_entity_at_position()
so you can simply check for any entity in particular at a position instead of having to use fully-blownfind_entities_filtered
or the more-specificfind_entity()
function - Abstracted
SpatialHashMap
to be an implementation of abstract classSpatialDataStructure
, which will allow for different implementations such as quadtrees or other algorithms if they happen to be more performant than hash-mapping (For now allCollections
still useSpatialHashMap
though) - Renamed
entity_hashmap
andtile_hashmap
to more genericentity_map
andtile_map
to reflect the above change - Move almost all entity insert/set/remove logic to
EntityCollection.on_entity_insert
,on_entity_set
, andon_entity_remove
, which gets called fromEntityList.insert
and related - Added
on_tile_insert
,on_tile_set
, andon_tile_remove
toTileCollection
to mirror the changes toEntityCollection
- Added
copy
keyword toTileList.insert
andTileList.append
to mirrorEntityList.insert
andEntityList.append
- Added Entity/Tile merging
- Added
merge
keyword to bothEntityList.insert/append
andTileList.insert/append
- Attempting to use
merge=True
keywords andcopy=False
will result in aValueError
, as this behavior is loosely defined (for now at least)
- Added
- Rails now properly issue
OverlappingObjectsWarnings
; Rails can overlap each other provided they don't have the exact same position + direction + type - Another big documentation pass
- Split the
signatures.CONTROL_BEHAVIOR
into many sub implementations, which should improve both safety and (hopefully) performance - Fixed #24, #25, #27, #32, #33, and #34