* initial modloader draft * modloader features * Refactor mods to use signals * Add support for modifying and registering new transltions * Minor adjustments * Support for string building ids for mods * Initial support for adding new buildings * Refactor how mods are loaded to resolve circular dependencies and prepare for future mod loading * Lazy Load mods to make sure all dependencies are loaded * Expose all exported members automatically to mods * Fix duplicate exports * Allow loading mods from standalone * update changelog * Fix mods folder incorrect path * Fix modloading in standalone * Fix sprites not getting replaced, update demo mod * Load dev mod via raw loader * Improve mod developing so mods are directly ready to be deployed, load mods from local file server * Proper mods ui * Allow mods to register game systems and draw stuff * Change mods path * Fix sprites not loading * Minor adjustments, closes #1333 * Add support for loading atlases via mods * Add support for loading mods from external sources in DEV * Add confirmation when loading mods * Fix circular dependency * Minor Keybindings refactor, add support for keybindings to mods, add support for dialogs to mods * Add some mod signals * refactor game loading states * Make shapez exports global * Start to make mods safer * Refactor file system electron event handling * Properly isolate electron renderer process * Update to latest electron * Show errors when loading mods * Update confirm dialgo * Minor restructure, start to add mod examples * Allow adding custom themesw * Add more examples and allow defining custom item processor operations * Add interface to register new buildings * Fixed typescript type errors (#1335) * Refactor building registry, make it easier for mods to add new buildings * Allow overriding existing methods * Add more examples and more features * More mod examples * Make mod loading simpler * Add example how to add custom drawings * Remove unused code * Minor modloader adjustments * Support for rotation variants in mods (was broken previously) * Allow mods to replace builtin sub shapes * Add helper methods to extend classes * Fix menu bar on mac os * Remember window state * Add support for paste signals * Add example how to add custom components and systems * Support for mod settings * Add example for adding a new item type * Update class extensions * Minor adjustments * Fix typo * Add notification blocks mod example * Add small tutorial * Update readme * Add better instructions * Update JSDoc for Replacing Methods (#1336) * upgraded types for overriding methods * updated comments Co-authored-by: Edward Badel <you@example.com> * Direction lock now indicates when there is a building inbetween * Fix mod examples * Fix linter error * Game state register (#1341) * Added a gamestate register helper Added a gamestate register helper * Update mod_interface.js * export build options * Fix runBeforeMethod and runAfterMethod * Minor game system code cleanup * Belt path drawing optimization * Fix belt path optimization * Belt drawing improvements, again * Do not render belts in statics disabled view * Allow external URL to load more than one mod (#1337) * Allow external URL to load more than one mod Instead of loading the text returned from the remote server, load a JSON object with a `mods` field, containing strings of all the mods. This lets us work on more than one mod at a time or without separate repos. This will break tooling such as `create-shapezio-mod` though. * Update modloader.js * Prettier fixes * Added link to create-shapezio-mod npm page (#1339) Added link to create-shapezio-mod npm page: https://www.npmjs.com/package/create-shapezio-mod * allow command line switch to load more than one mod (#1342) * Fixed class handle type (#1345) * Fixed class handle type * Fixed import game state * Minor adjustments * Refactor item acceptor to allow only single direction slots * Allow specifying minimumGameVersion * Add sandbox example * Replaced concatenated strings with template literals (#1347) * Mod improvements * Make wired pins component optional on the storage * Fix mod examples * Bind `this` for method overriding JSDoc (#1352) * fix entity debugger reaching HTML elements (#1353) * Store mods in savegame and show warning when it differs * Closes #1357 * Fix All Shapez Exports Being Const (#1358) * Allowed setting of variables inside webpack modules * remove console log * Fix stringification of things inside of eval Co-authored-by: Edward Badel <you@example.com> * Fix building placer intersection warning * Add example for storing data in the savegame * Fix double painter bug (#1349) * Add example on how to extend builtin buildings * update readme * Disable steam achievements when playing with mods * Update translations Co-authored-by: Thomas (DJ1TJOO) <44841260+DJ1TJOO@users.noreply.github.com> Co-authored-by: Bagel03 <70449196+Bagel03@users.noreply.github.com> Co-authored-by: Edward Badel <you@example.com> Co-authored-by: Emerald Block <69981203+EmeraldBlock@users.noreply.github.com> Co-authored-by: saile515 <63782477+saile515@users.noreply.github.com> Co-authored-by: Sense101 <67970865+Sense101@users.noreply.github.com> |
||
---|---|---|
.github/workflows | ||
.vscode | ||
electron | ||
electron_wegame | ||
gulp | ||
mod_examples | ||
res | ||
res_raw | ||
src | ||
translations | ||
.editorconfig | ||
.eslintignore | ||
.eslintrc.yml | ||
.gitignore | ||
.gitpod.Dockerfile | ||
.gitpod.yml | ||
.prettierrc.yaml | ||
.travis.yml | ||
.yamllint | ||
CONTRIBUTORS | ||
Dockerfile | ||
LICENSE | ||
package.json | ||
README.md | ||
shapez.code-workspace | ||
sync-translations.js | ||
version | ||
yarn.lock |
shapez.io

This is the source code for shapez.io, an open source base building game inspired by Factorio. Your goal is to produce shapes by cutting, rotating, merging and painting parts of shapes.
- Steam Page
- Official Discord <- Highly recommended to join!
- Trello Board & Roadmap
- itch.io Page
- Free web version
Reporting issues, suggestions, feedback, bugs
- Ask in
#bugs
/#feedback
/#questions
on the Official Discord if you are not entirely sure if it's a bug etc. - Check out the trello board: https://trello.com/b/ISQncpJP/shapezio
- See if it's already there - If so, vote for it, done. I will see it. (You have to be signed in on trello)
- If not, check if it's already reported here: https://github.com/tobspr/shapez.io/issues
- If not, file a new issue here: https://github.com/tobspr/shapez.io/issues/new
- I will then have a look (This can take days or weeks) and convert it to trello, and comment with the link. You can then vote there ;)
Building
- Make sure
ffmpeg
is on your path - Install Node.js and Yarn
- Install Java (required for textures)
- Run
yarn
in the root folder - Cd into
gulp
folder - Run
yarn
and thenyarn gulp
- it should now open in your browser
Notice: This will produce a debug build with several debugging flags enabled. If you want to disable them, modify src/js/core/config.js
.
Build Online with one-click setup
You can use Gitpod (an Online Open Source VS Code-like IDE which is free for Open Source) for working on issues and making PRs to this project. With a single click it will start a workspace and automatically:
- clone the
shapez.io
repo. - install all of the dependencies.
- start
gulp
ingulp/
directory.
Helping translate
Please checkout the Translations readme.
Contributing
Since this game is in the more or less early development, I will only accept pull requests which add an immediate benefit. Please understand that low quality PR's might be closed by me with a short comment explaining why.
If you want to add a new building, please understand that I can not simply add every building to the game! I recommend to talk to me before implementing anything, to make sure its actually useful. Otherwise there is a high chance of your PR not getting merged.
If you want to add a new feature or in generally contribute I recommend to get in touch with me on Discord:

Code
The game is based on a custom engine which itself is based on the YORG.io 3 game engine (Actually it shares almost the same core). The code within the engine is relatively clean with some code for the actual game on top being hacky.
This project is based on ES5. Some ES2015 features are used but most of them are too slow, especially when polyfilled. For example, Array.prototype.forEach
is only used within non-critical loops since its slower than a plain for loop.
Adding a new component
- Create the component file in
src/js/game/components/<name_lowercase>.js
- Create a component class (e.g.
MyFancyComponent
) whichextends Component
- Create a
static getId()
method which should return thePascalCaseName
without component (e.g.MyFancy
) - If any data needs to be persisted, create a
static getSchema()
which should return the properties to be saved (See other components) - Add a constructor. The constructor must be called with optional parameters only!
new MyFancyComponent({})
should always work. - Add any props you need in the constructor.
- Add the component in
src/js/game/component_registry.js
- Add the component in
src/js/game/entity_components.js
- Done! You can use your component now
Adding a new building
(The easiest way is to copy an existing building)
- Create your building in
src/js/game/buildings/<my_building.js>
- Create the building meta class, e.g.
MetaMyFancyBuilding extends MetaBuilding
- Override the methods from MetaBuilding you want to override.
- Most important is
setupEntityComponents
- Add the building to
src/js/game/meta_building_registry.js
: You need to register it on the registry, and also callregisterBuildingVariant
. - Add the building to the right toolbar, e.g.
src/js/game/hud/parts/buildings_toolbar.js
:supportedBuildings
- Add a keybinding for the building in
src/js/game/key_action_mapper.js
inKEYMAPPINGS.buildings
- In
translations/base-en.yaml
add it to two sections:buildings.[my_building].XXX
(See other buildings) and alsokeybindings.mappings.[my_building]
. Be sure to do it the same way as other buildings do! - Create a icon (128x128, prefab) for your building and save it in
res/ui/buildings_icons
with the id of your building - Create a tutorial image (600x600) for your building and save it in
res/ui/building_tutorials
- In
src/css/resources.scss
add your building to$buildings
as well as$buildingAndVariants
- Done! Optional: Add a new reward for unlocking your building at some point.
Adding a new game system
- Create the class in
src/js/game/systems/<system_name>.js
- Derive it from
GameSystemWithFilter
if you want it to work on certain entities only which have the given components. Otherwise useGameSystem
to do more generic stuff. - Implement the
update()
method. - Add the system in
src/js/game/game_system_manager.js
(Tothis.systems
and also calladd
in theinternalInitSystems()
method) - If your system should draw stuff, this is a bit more complicated. Have a look at existing systems on how they do it.
Checklist for a new building / testing it
This is a quick checklist, if a new building is added this points should be fulfilled:
- The translation for all variants is done and finalized
- The artwork (regular sprite) is finalized
- The blueprint sprite has been generated and is up to date
- The building has been added to the appropriate toolbar
- The building has a keybinding which makes sense
- The building has a reward assigned and is unlocked at a meaningful point
- The reward for the building has a proper translation
- The reward for the building has a proper image
- The building has a proper tutorial image assigned
- The buliding has a proper toolbar icon
- The reward requires a proper shape
- The building has a proper silhouette color
- The building has a proper matrix for being rendered on the minimap
- The building has proper statistics in the dialog
- The building properly contributes to the shapes produced analytics
- The building is properly persisted in the savegame
- The building is explained properly, ideally via an interactive tutorial
Assets
For most assets I use Adobe Photoshop, you can find them here.
All assets will be automatically rebuilt into the atlas once changed (Thanks to dengr1065!)
