|
- <!DOCTYPE html>
-
- <html lang="en">
- <head>
- <meta name="theme-color" content="#20c420" />
- <meta name="author" content="Exmods community" />
- <meta name="keywords" content="exmods,gamecraft,modding,mod" />
- <meta name="og:type" content="website" />
- <meta name="og:title" content="Exmods" />
- <meta name="og:description" content="Gamecraft modding website" />
- <meta name="description" content="Gamecraft modding website" />
- <meta name="og:image" content="../static/favicon.png" />
- <meta name="og:url" content="https://www.exmods.org" />
- <meta charset="UTF-8" />
- <link rel="icon" href="../static/favicon.png" type="image/x-icon"/>
- <link rel="shortcut icon" href="../static/favicon.png" type="image/x-icon"/>
- <link rel="stylesheet" href="../static/style.css" type="text/css" />
- <title>Exmods | Modding ECS</title>
- </head>
- <body>
- <h3><a href="index.html" title="You know your browser has a back button, right?">Back to list</a></h3>
- <h1>Modding ECS in Gamecraft</h1>
-
- <div class="text-content">
- <p>
- <span class="tab"></span>
- Gamecraft is built on an entity component system created by FreeJam's CTO called <a href="https://github.com/sebas77/Svelto.ECS">Svelto.ECS</a>, which is a quite powerful piece of open-source software.
- The ECS paradigm is a relatively novel programming concept, but many frameworks exist including one made by the Unity Engine devs specifically for their engine called <a href="https://connect.unity.com/p/what-is-unity-ecs">UECS</a>.
- ECS is a data-oriented system which uses "entities" instead of "objects" from object-oriented programming.
- An entity is comprised of independent components which act like individual properties for an object in OOP.
- All of the components are stored in some sort of fast in-memory database (Svelto.ECS uses a Dictionary).
- What makes ECS great is that it's fast,
- since the computer only needs to worry about the component in cache instead of the entire object,
- and it makes the code easier to maintain,
- since you can add a new component to an existing entity without touching other components in the same entity.
- </p>
- <p>
- <span class="tab"></span>
- ECS is great, but it can be a lot to wrap your head around.
- I've found that the best way to understand it is to jump in, swear at your computer a bit, and slowly accept it for what it is.
- A lot of material I've seen says that ECS is really only practical for games,
- but the idea of data-oriented design is a universal concept.
- Data-oriented programs are the future, since big data and machine learning are focused on number-crunching.
- So if you need a reason to persevere through your ECS learning, think of that.
- Unfortunately, ECS is unlikely to be the way to get there, but it is the way to make a (good) modern game.
- And Gamecraft is one of those modern good games... well at least it uses ECS.
- </p>
- <p>
- <span class="tab"></span>
- Gamecraft is FreeJam's first completely ECS-based game.
- Robocraft and CardLife both used Svelto.ECS as well, but the game logic wasn't completely reliant on it.
- Because all of Gamecraft's data is handled by Svelto.ECS,
- it's easier to mod than CardLife and Robocraft (or so I'd imagine, I've never tried).
- The biggest hurdle is to get access to the database containing all of the entity components.
- Luckily, Svelto.ECS will automatically provide that database to engines, the logic and behaviour implementors in Svelto.ECS.
- In Gamecraft, engines are usually registered during the "compose" stage, which occurs in loading screens or when switching gamemode.
- I think of the compose stage as when the composer taps his baton on the stand in front of him,
- right after the musicians have walked on stage and sat down (init stage) and right before the music starts playing (gameplay stage).
- Registering an engine to Svelto.ECS is made quite trivial by <a href="https://harmony.pardeike.net/">Harmony</a>,
- which can intercept a method call and its parameters to allow you to perform your own operations.
- Specifically, all of the compose methods in Gamecraft get passed a Svelto.ECS EngineRoots object,
- which is how Gamecraft (and now me) registers engines to operate on entity components.
- </p>
- <p>
- <span class="tab"></span>
- In the interest of not getting sued for reverse-engineering Gamecraft or divulging company secrets, I won't go into much more detail
- (although they're not very good company secrets if me,
- a person living on a different continent,
- working for a different company,
- figured them out in my spare time).
- You can find out more details about Gamecraft by using a
- <a href="https://github.com/0xd4d/dnSpy#dnspy---latest-release---%EF%B8%8F-donate">C# decompiler</a> to view the original code,
- no reverse-engineering required.
- By the way, <a href="https://en.wikipedia.org/wiki/Reverse_engineering#Legality">reverse-engineering</a> is
- <a href="https://ghbintellect.com/is-reverse-engineering-legal/">usually legal</a> anyway.
- Of course, I'm not a lawyer, and I don't like closed-source software that much so I'm a bit biased.
- Interestingly, the European laws about
- <a href="https://en.wikipedia.org/wiki/Computer_Programs_Directive">software protection</a>
- seem to explicitly allow external mods and servers (you can tell I'm still a bit annoyed about RC14 getting shutdown).
- Regardless, FreeJam seems to be ok with the unofficial Gamecraft mods that have been created so far,
- so I wouldn't expect them to suddenly change their stance on mods in the near future.
- </p>
- <p>
- <span class="tab"></span>
- The <a href="https://git.exmods.org/modtainers/GamecraftModdingAPI#user-content-gamecraftmoddingapi">GamecraftModdingAPI</a>
- is probably the best example of modding with ECS.
- It provides a friendly object-oriented API for developers who want simplicity.
- For developers who want performance or understand the ECS paradigm, the modding API offers an easy way to register engines,
- so that Harmony isn't even required in the process of getting the entities database for modding entity components.
- As a major contributor to the GamecraftModdingAPI, I've seen how ECS has simplified modding.
- One of Svelto.ECS's primary focuses is code maintainability, which is very obvious whenever Gamecraft is updated.
- The average Gamecraft update breaks one or two parts of the API,
- and that's usually only caused by one or two variables changing name or location.
- I'd bet that if half of Gamecraft were rewritten,
- the biggest fix that the GamecraftModdingAPI would need would be changing the name of the components the API queries.
- The focus on maintainability doesn't just make Gamecraft easier to develop, it also makes mods easier.
- </p>
- <p>
- <span class="tab"></span>
- The data-oriented design of ECS helps as well.
- The object-oriented API in the GamecraftModdingAPI still queries entity components behind-the-scenes,
- so even OOP can take advantage of ECS design, albeit with some drawbacks.
- The database system in Svelto.ECS purposely allows for new entities to be created but not made queriable immediately for some deterministic reason.
- If a new entity is created as an object through the object-oriented API,
- the GamecraftModdingAPI has to force the database to sync new entities before any of the object's properties can be accessed.
- This database sync operation is a lot of unnecessary overhead which could be avoided with pure ECS.
- Pure ECS modding is easy,
- since almost every operation can be accomplished by operating on one or more entity components in the entity database.
- In Gamecraft's case, there's never more than one entity database on the go at once,
- which makes modding easy with a single point of contact.
- Once you've got the active entities database, you've basically completely pwned Gamecraft.
- </p>
- <p>
- <span class="tab"></span>
- A year ago, I thought ECS was a fancy niche concept which would be worthless for me to learn. It may still be worthless for my job, but it's a vital part of Gamecraft and mods that I wouldn't pass up. I wonder when FreeJam will give us an official modding API for interacting with Svelto.ECS...
- </p>
- </div>
- <footer>
- exmods.org|<a href="https://git.exmods.org/ExMods/html-site">Site Repository</a>|<a href="https://exmods.org">Home</a>|<a href="https://discord.gg/2CtWzZT">Discord</a>|<a href="https://twitter.com/GamecraftMods">Twitter</a>
- </footer>
- </body>
- </html>
|