Skip to content

Latest commit

 

History

226 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EVERSPACE™ Builder (ESBuilder)

◄♦ Shoot. Loot. Share. ♦♦ https://esbuilder.onrender.com/ ♦►
◄♦ Developed by WildCharger ♦♦ Twitter/X ♦♦ YouTube ♦♦ LinkedIn ♦►

About

EVERSPACE™ Builder (shorthand ESBuilder) is an online platform that allows users to create, manage, & share customized loadouts for the game EVERSPACE™, a deep space combat simulation with roguelike & story-based elements released in 2017 by ROCKFISH Games GmbH. This application serves as a tool for players to assemble their own ship, enhancement, & equipment configurations, using a GUI that reflects the menus in the game itself as closely as possible. This makes it possible for players to do things such as record in-game loadouts they have created in the past, plan for loadouts they may seek to build in the future, or create loadouts to help other players, among other possibilities.

Learn more about EVERSPACE™ on its official website, or purchase it on Steam or GOG.

ESBuilder is currently in early beta. Functionality is present, but significant bugs are likely to be present, and many edge case scenarios have likely not yet been caught. Testers are encouraged to use the Issues board to submit problems with the application as needed.

The loadout builder has been built to be compatible with the widescreen (16:9) aspect ratio, tested at the minimum resolution of HD 720p up to a resolution of 2K 1440p. Screen resolutions above or below this are not guaranteed to display properly.

Roadmap

The current goal is to make ESBuilder proficient at its core functionalities, as well as their accuracy to the original game. Features that require completion in order to achieve this currently take top priority, including:

  • Stat numbers that have been properly formatted & appear with their respective units of measurement
  • Ship stats visually appearing influenced by installed Enhancements & Equipment (e.g. installing the Splitter enhancement reduces the ship's Secondary Weapons slot number to 1)
  • Equipment stats visually appearing influenced by installed Enhancements & Mods (e.g. outfitting a Teleporter with Energy Consumption Mods causes the displayed Energy Consumption stat to decrease accordingly)
  • Comprehensive Primary Weapon & Device Enhancement, allowing players to define the differences of applicable Equipment from their basic versions within reasonable restrictions

Additionally, in order to ensure that Loadouts remain accessible as more are added:

  • The Recent Loadouts page will be completed, properly ordering loadouts by newest first, and allowing users to see more than just ten.
  • A basic profile system will be implemented, allowing users to see all of the loadouts they specifically have created.

Once this goal has been achieved, further development will only continue if there is sufficient interest in the project from EVERSPACE™ players. Long-term goals include, but are not limited to:

  • Additional loadout details, including the option to input the player's run number/name.
  • A more comprehensive profile system that allows users to share unique elements such as their favorite Ship, Weapon, or Enhancement.
  • A completed user system that allows for the modification of user details as well as account deletion.
  • A search feature that finds loadouts by name.
  • The ability to save existing loadouts locally as images, thereby allowing them to be shared offline.
  • Some way, somehow, maybe allow users to upload a save file of their current run, and decipher the loadout data from it. This one's a massive reach.
  • Implementation of player progression. This allows players to change what perks, preset loadouts, etc. they have unlocked, and having the loadout builder optionally reflect the applicable differences as a profile setting. This would be the last stretch goal to complete ESBuilder, and mark the end of its extended development cycle; any other major features would be implemented before this.

Credits

As with many applications, ESBuilder was built on a foundation of many other packages & modules that make it possible.

Backend

  • Application powered by Express, Morgan, & Sequelize, with assistance from dotenv, Helmet, & bcryptjs, among others.
  • Database developed in SQLite and deployed using PostgreSQL.
  • Image asset delivery provided by Amazon Web Services S3 using AWS SDK. Note that the AWS SDK v2 will reach end-of-support on September 8, 2025, and use of AWS SDK v3 is recommended for new projects.
  • Special thanks to Chalk for letting me assemble a development logging system that stands out and is easily recognizable & findable in a sea of other messages.

Frontend

And, of course...

  • Credit belongs to ROCKFISH Games for creating EVERSPACE™. I've been playing their games ever since the original Galaxy on Fire on iOS - and it was Galaxy on Fire 2 that led me to being a big part of one of the greatest internet communities I could have ever asked to join. Almost all of the website's image assets are sourced from EVERSPACE™ itself, and its UX was the basis for the design of the loadout builder.
  • The idea to create this can be attributed to PD2 Builder, a loadout builder for the game PAYDAY 2.
  • ESBuilder itself was created over the course of many sleepless nights by me, WildCharger. I hope you enjoy using it.

Endpoints

The following information is mainly for the technically inclined - continue at your own discretion!

Request Purpose Return Value
GET /api/custom-equippables/:customEquippableId Retrieves a specific Custom Equippable's data. If no Custom Equippable is found, a 404 is returned, but no error is thrown, as this is expected to be handled on the frontend.
{
"id": 1,
"userId": 4,
"equippableType": "Primary",
"equippableId": 2,
"stats": {
"Hull DPS": 96,
"Shield DPS": 80,
"Energy Consumption": 6.5,
"Range": 1150
},
"createdAt": "2025-01-14T01:15:44.342Z",
"updatedAt": "2025-01-14T01:15:44.342Z"
}
POST /api/custom-equippables Creates a new Custom Equippable & returns its data.
{
"id":2,
"userId": 4,
"equippableType": "Primary",
"equippableId": 2,
"stats": "{"Hull DPS":96,"Shield DPS":80,"Energy Consumption":6.5,"Range":1150}"
"createdAt": "2025-01-14T01:15:44.342Z",
"updatedAt": "2025-01-14T01:15:44.342Z"
}
GET /api/loadouts Retrieves the ten most recently created Loadouts & their owners. No error is thrown if the list is empty, as this is expected to be handled on the frontend.
{
"list": [
{
"id": 1,
"userId": 1,
"flags": {
"ancientWeaponEquipped": null,
"splitterEquipped": null
},
"name": "PREPPED FOR ANYTHING",
"shipId": 0,
"enhancements": {
"0": 19,
"1": 20,
"2": 22
},
"primaryWeapons": {
"0": {
"id": 11,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"1": {
"id": 6,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"2": {
"id": null,
"mods": null
}
},
"secondaryWeapons": {
"0": "0x1",
"1": "1x7",
"2": "7x6"
},
"devices": {
"0": {
"id": 59,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"1": {
"id": 14,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"2": {
"id": 26,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"3": {
"id": 45,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"4": {
"id": null,
"mods": null
}
},
"consumables": {
"0": "16x2",
"1": "11x4",
"2": "13x1",
"3": "14x1",
"4": null
},
"createdAt": "2025-01-17T21:30:44.661Z",
"updatedAt": "2025-01-17T21:30:44.661Z",
"User": {
"id": 1,
"username": "HIVEUnit"
}
}
],
"limit": 10
}
POST /api/loadouts Creates a new Loadout & returns its data.
{
"id":4,
"userId":1,
"flags":"{"ancientWeaponEquipped":false,"splitterEquipped":false}",
"name":"SCOUT PRESET",
"shipId":1,
"enhancements":"{"0":4,"1":null,"2":null}",
"primaryWeapons":"{"0":{"id":20,"mods":{"0":null,"1":null,"2":null}},"1":{"id":1,"mods":{"0":null,"1":null,"2":null}}}",
"secondaryWeapons":"{"0":"9x10","1":null}",
"devices":"{"0":{"id":63,"mods":{"0":null,"1":null,"2":null}},"1":{"id":3,"mods":{"0":null,"1":null,"2":null}},"2":{"id":null,"mods":null},"3":{"id":null,"mods":null}}",
"consumables":"{"0":"10x4","1":"9x2","2":null,"3":null,"4":null}",
"updatedAt":"2025-01-18T20:44:31.267Z",
"createdAt":"2025-01-18T20:44:31.267Z"
}
PUT /api/loadouts/:loadoutId Edits the data of an existing Loadout. Verifies that the user sending the request is the owner of the Loadout. Returns a success message if no errors occur.
{
"message": "Successfully edited"
}
DELETE /api/loadouts/:loadoutId Deletes an existing Loadout. Verifies that the user sending the request is the owner of the Loadout. Returns a success message if no errors occur.
{
"message": "Successfully deleted"
}
GET /api/session Retrieves the current Session User's data. Unlike GET /api/users/:userId, also returns the User's Email.
{
"user": {
"id": 3,
"email": "user2@aa.io",
"username": "Maurice"
}
}
POST /api/session The User Login route. Validates input data, then returns the specified User, in the same way as GET /api/session.
{
"user": {
"id": 3,
"email": "user2@aa.io",
"username": "Maurice"
}
}
DELETE /api/session The User Logout route. If no User exists, a faux error (not sent to the default error handler) is returned with status code 400. Returns a success message otherwise.
{
"message": "Successfully logged out"
}
GET /api/users/:userId Retrieves a specific User's ID & Username. If no User is found, a 404 is returned, but no error is thrown, as this is expected to be handled on the frontend.
{
"id": 1,
"username": "HIVEUnit"
}
GET /api/users/:userId/loadouts Retrieves a User's Loadouts. If any exist, also safely returns the User's ID & Username. Does not reveal any personally identifying information.
{  "list": [
{
"id": 1,
"userId": 1,
"flags": {
"ancientWeaponEquipped": false,
"splitterEquipped": false
},
"name": "PREPPED FOR ANYTHING",
"shipId": 0,
"enhancements": {
"0": 19,
"1": 20,
"2": 22
},
"primaryWeapons": {
"0": {
"id": 11,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"1": {
"id": 6,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"2": {
"id": null,
"mods": null
}
},
"secondaryWeapons": {
"0": "0x1",
"1": "1x7",
"2": "7x6"
},
"devices": {
"0": {
"id": 59,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"1": {
"id": 14,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"2": {
"id": 26,
"mods": {
"0": null,
"1": null,
"2": null,
"3": null
}
},
"3": {
"id": 45,
"mods": {
"0": null,
"1": null,
"2": null
}
},
"4": {
"id": null,
"mods": null
}
},
"consumables": {
"0": "16x2",
"1": "11x4",
"2": "13x1",
"3": "14x1",
"4": null
},
"createdAt": "2025-01-17T21:30:44.661Z",
"updatedAt": "2025-01-18T20:37:54.982Z",
"User": {
"id": 1,
"username": "HIVEUnit"
}
}
]
}
POST /api/users The User Signup route. Validates input data, then returns the created User. Signups are blocked if a User is already logged in.
{
"user": {
"id": 5,
"email": "user5@aa.io",
"username": "NotHIVEUnit"
}
}
GET /img-assets/* For all backend routes beginning with /img-assets, serve assets from the AWS bucket.
{
"url": "https://aa-capstone-esbuilder-s3.s3.ap-southeast-2.amazonaws.com/ships/ship0-top.png?AWSAccessKeyId=AKIATQPD7IBRMW5DAEN3&Expires=1737327177&Signature=CMohNq3PWESUz2G9eRHz9erjKV0%3D"
}
GET /favicon.ico This catches the browser request to get a favicon when directly accessing a backend route. The request is intercepted and, instead of proceeding as a 404 error, returns a 204 No Content. No Response

About

Create, manage, & share your EVERSPACE™ loadouts.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages