jojoleprowebsite

[Done] The Sauce of https://jojolepro.com
git clone https://git.jojolepro.com/jojoleprowebsite.git
Log | Files | Refs | README | LICENSE

commit 1ea3160bbebf0380877c233f15a7220de97f5314
parent 4b4e33a1a8b20fe6d6da200afb31ebbecb5955f7
Author: jojolepro <jojolepro@jojolepro.com>
Date:   Mon, 31 May 2021 11:41:27 -0400

add blog post about amethyst, minigene, wotfg, shotcaller.

Diffstat:
Asrc/blog/2021-05-31_minigene_and_the_future/index.txt | 391+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/blog/2021-05-31_minigene_and_the_future/shotcaller.png | 0
Asrc/blog/2021-05-31_minigene_and_the_future/shotcaller2.png | 0
Asrc/blog/2021-05-31_minigene_and_the_future/wotfg.png | 0
Asrc/blog/2021-05-31_minigene_and_the_future/wotfg2.png | 0
Asrc/blog/2021-05-31_minigene_and_the_future/wotfg3.png | 0
Asrc/blog/2021-05-31_minigene_and_the_future/wotfg4.png | 0
Mtarget/gemini/blog/2020-03-31_extracting_data_from_websites/index.gmi | 4++--
Mtarget/gemini/blog/2020-04-09_simple_school_documents/index.gmi | 4++--
Mtarget/gemini/blog/2020-05-04_why_i_moved_from_wordpress/index.gmi | 4++--
Mtarget/gemini/blog/2020-07-07_minimalist_alternatives/index.gmi | 4++--
Mtarget/gemini/blog/2020-08-20_event_chaining/index.gmi | 4++--
Mtarget/gemini/blog/2020-09-17_the_lost_of_autonomy/index.gmi | 4++--
Mtarget/gemini/blog/2020-11-17_the_fall_of_the_giant/index.gmi | 4++--
Mtarget/gemini/blog/2021-01-13_planck_ecs/index.gmi | 4++--
Mtarget/gemini/blog/2021-01-13_removing_the_us/index.gmi | 4++--
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/index.gmi | 389+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/index.txt | 391+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/shotcaller.png | 0
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/shotcaller2.png | 0
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/wotfg.png | 0
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/wotfg2.png | 0
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/wotfg3.png | 0
Atarget/gemini/blog/2021-05-31_minigene_and_the_future/wotfg4.png | 0
Mtarget/gemini/focks/index.gmi | 4++--
Mtarget/gemini/index.gmi | 4++--
Mtarget/gemini/projects/index.gmi | 4++--
Mtarget/gemini/quotes/index.gmi | 4++--
Mtarget/html/blog/2020-03-31_extracting_data_from_websites/index.html | 4++--
Mtarget/html/blog/2020-04-09_simple_school_documents/index.html | 4++--
Mtarget/html/blog/2020-05-04_why_i_moved_from_wordpress/index.html | 4++--
Mtarget/html/blog/2020-07-07_minimalist_alternatives/index.html | 4++--
Mtarget/html/blog/2020-08-20_event_chaining/index.html | 4++--
Mtarget/html/blog/2020-09-17_the_lost_of_autonomy/index.html | 4++--
Mtarget/html/blog/2020-11-17_the_fall_of_the_giant/index.html | 4++--
Mtarget/html/blog/2021-01-13_planck_ecs/index.html | 4++--
Mtarget/html/blog/2021-01-13_removing_the_us/index.html | 4++--
Atarget/html/blog/2021-05-31_minigene_and_the_future/index.html | 455+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atarget/html/blog/2021-05-31_minigene_and_the_future/index.txt | 391+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atarget/html/blog/2021-05-31_minigene_and_the_future/shotcaller.png | 0
Atarget/html/blog/2021-05-31_minigene_and_the_future/shotcaller2.png | 0
Atarget/html/blog/2021-05-31_minigene_and_the_future/wotfg.png | 0
Atarget/html/blog/2021-05-31_minigene_and_the_future/wotfg2.png | 0
Atarget/html/blog/2021-05-31_minigene_and_the_future/wotfg3.png | 0
Atarget/html/blog/2021-05-31_minigene_and_the_future/wotfg4.png | 0
Mtarget/html/blog/index.html | 4++--
Mtarget/html/focks/index.html | 4++--
Mtarget/html/index.html | 4++--
Mtarget/html/projects/index.html | 4++--
Mtarget/html/quotes/index.html | 4++--
Mtemplate.gmi | 4++--
Mtemplate.html | 4++--
52 files changed, 2075 insertions(+), 58 deletions(-)

diff --git a/src/blog/2021-05-31_minigene_and_the_future/index.txt b/src/blog/2021-05-31_minigene_and_the_future/index.txt @@ -0,0 +1,391 @@ +Minigene, Shotcaller, WOTFG, Amethyst and the Future of Rust Gamedev +================================================================================ +Hello and welcome to your ~~daily~~ ~~monthly~~ yearly status update! + +This post is rather long, so feel free to skip sections underlined with dashes, +as they are more in-depth explanations of what was mentioned just before them. + +Let's task about what has been happening in the past few months and what is +coming in the future! + +Minigene +================================================================================ +Minigene is a new game engine. It is meant to fill the empty space between +indie game development and professionnal game development. + +https://github.com/jojolepro/minigene + +By that, I mean that it sits between the "we do everything for you and hold your +hand" approach and the "build everything yourself" approach. + +Minigene is built from a wide collection of small (and not so small) crates. +To understand how it works, we can think of the engine using layers. + +For instance, here are the layers used for the game Shotcaller: +- 4: Game +- 3: Minigene +- 2: Glue +- 1: Features + +Layers Explained +-------------------------------------------------------------------------------- + +Let's start at the bottom, with layer 1: the features. This layer is composed of +many small and specialized crates. For instance, one crate for i18n, one crate +for game inventory and item management, etc... +https://github.com/jojolepro/game_features + +This layer also include crates which aren't "game features" but are +"engine features". +For instance, the crate game_engine_core gives us a structure in which we can +run our game logic using global states. +https://github.com/jojolepro/game_engine_core + +Crates in layer 1 are small and usually aim to have all of their functions +verified using unit tests. They also aim to have clear documentation. +Finally, they aim to limit the number of different ways you can do the same +thing. This is so it is easier to learn how to use them and it also limits +complexity. + +Now, let's talk about layer 2: the glue! +The glue is the part of the engine that takes data from some global storage and +updates/calls the layer 1 features. + +In the case of minigene, we use planck_ecs, the easiest entity-component-system +to use and also the most tested and minimalist. + +At layer 2, we "wrap" the layer one features inside of the glue. +One layer 2 crate can use one or more layer one crate, although we usually try +to limit ourselves to one. + +For instance, we can have a planck_game_features crate that creates Systems +which execute game_features update functions using Components coming from +Planck's World structure. + +Now, layer 3 is simply minigene, the crate. It re-export a bunch of layer 2 +crates into a convenient package. To avoid importing a billion crates when using +minigene, we place the different features into groups and hide them behind +feature gates. + +You can enable those features using: +``` +minigene = { git = "https://github.com/jojolepro/minigene", + features = ["feature1", "feature2", "..."] } +``` + +Finally, layer 4 is the game you want to make. +Usually, it will import minigene and use some of its features. +It will also import some crates that are specific to the needs of the game. + +Here's how it will look in practice: +https://www.figma.com/file/cv7orWvUWfB6teK7RLqu3L/The-New-Amethyst?node-id=0%3A1 + +Quite the mess, I know, but it is the cleanest graph of a full detailed game +engine that I have ever seen. I'll let you imagine how horrible it is for +engines which are not aiming to have small dependencies! + +Let's continue: +You are free to replace any feature of minigene with your own or an equivalent +crate. Minigene is written in such a way that, if you want, you can even use it +alongside another game engine! For more details on this, read the section on +Shotcaller. + +Finally, the engine makes heavy use of event chaining. I discussed of this +extensively here: +https://jojolepro.com/blog/2020-08-20_event_chaining/ + +In short, it allows to drive the execution of systems using events and to +creates events from past events. Here is a quick example: +<bracket-lib event>::char(x) -> InputEvent::KeyPress(x) -> GameEvent::Jump +-> NetworkedAction::PlayerJump(auth_id) -> NetworkEvent::PlayerJumped(entity_id) + +Here, we started with a key press, inserted it in a more convenient structure, +created an event specific to the game we are creating, pushed a network event +to the server and finally notified all clients in the game that we jumped. + +Features Of Minigene +-------------------------------------------------------------------------------- +Currently, Minigene has quite a few features but is far from having all of the +planned features. + +Here are some features that are currently implemented and working: +- ASCII rendering in the terminal +- 2D Tile-Based graphics in a desktop window +- Input handling +- Game inventory management +- Game stats management (health, mana, damage dealt this game, etc...) +- Game engine core (sleeping, executing game frames, managing states) +- Game clock & stopwatch +- Planck ECS integration +- Bracket-lib integration +- Runs on WASM (Web Assembly) + +Planned Features and Changes +-------------------------------------------------------------------------------- +The engine has a lot of planned features, but for now we will mention only +a few of them. + +- Add a command/debug console (clap to events, custom logger output) +- Add network backend nakama-rs +- Add network backend message-io +- Integrate planck_ecs_bundle +- Create bundle with game_features related systems (planck_game_features crate) +- Move code (when applicable) from minigene systems to game_features +- Integrate a 2d renderer to emulate terminal rendering +- Integrate a 2d renderer to render sprites in any position, shape or rotation. +- Choose a math crate that will be used as the base on which we build other + crates. +- Mobile device support (high priority!) + +Shotcaller +================================================================================ +Shotcaller is a MOBA game inspired by DOTA 2 and League of Legends. +https://github.com/amethyst/shotcaller + +It is built on minigene and was the reason the engine was created in the first +place. Development of this game is currently on hold until more funds are +available. + +The game can be tested using: +``` +git clone https://github.com/amethyst/shotcaller +cd shotcaller +git checkout ac07a7bfb4224e8af4bd43e6df3afcaa879d4a48 +``` + +In the case that this does not work, there is also an online version: +https://shotcaller.jojolepro.com/ +This version quite a bit older, however. + +Desktop Version: +./shotcaller.png +Old WASM Build: +./shotcaller2.png + +WOTFG +================================================================================ +World Of The Fox God is a tile-based MMORPG (multiplayer roguelike/roleplay). +https://github.com/jojolepro/wotfg + +It is inspired by games like Cataclysm: Dark Days Ahead (graphics and skills), +Path Of Exile (depth of items and skills) and Minecraft Faction servers +(core gameplay ideas). + +It aims to be an anarchist (without hierarchy) game, meaning that there is no +strongly enforced concepts like groups, leaders and chiefs. It is up to players +to communicate, form alliances and figure out how they best want to play +together. + +It also aims to be a hardcore game while still being easy to enjoy, meaning that +it is punishing when you do bad actions, but there will be plenty of room to +enjoy the game and learn from your mistakes. + +To achieve this, we will make death very punishing: You will lose your +character, experience, skills and items. When you create a new character, you +will appear in a random location in the giant world, with no indication of +where you are until you find a map. + +The reason for this is two fold: +- We want to encourage players to cooperate and for this to happen we need to +discourage attacking other players. Since the downside to dying is so high, +attacking players is a risky gamble that not many players would risk to taking. +- Players should be more likely to cooperate with others and should avoid +fighting others in most cases. + +The game also aims to maximise enjoyment while minimising the time spent +actively playing it. To this effect, we took some inspiration from +Runescape's model: Crafting and farming items takes a long time. +This means that you can start crafting a new chestplate, go cook yourself some +food in real life, and come back to a brand new chestplate. + +The time it takes to make something will depend on its rarity and level. +Some items will take 5 seconds to craft, while the best items will take 24 +hours. Crafting recipes are pausable, so you could craft one of those +longer recipe over multiple nights while still actively playing during the day. + +Kind of related to this, the game aims to be strategic and gives you some time +to think about your actions. Game updates happen every 5 seconds. This means +you can only do one thing each 5 seconds, being it to move, continue crafting, +attacking a player or mining some ore. + +This slows the game down quite a bit, removing the stress factor of real-time +games. Since the goal is not to make you press a key every 5 seconds and stay +in front of the game, there is what I call an "Action Queue". It queues your +action that will be executed, one at a time, every 5 seconds. +For example, if you press ddddd, your character will move 5 times right over +the course of 25 seconds. + +Again, while this might seem boring, it is not. The game is meant to be played +while doing other things (working, cooking, watching videos), so it actually +feels fast when you do other things at the same time. The great thing about that +is that it can fill this feeling of "not doing progress in life" while still +encouraging you to do the things you need to do but might not fulfill you. + +Currently, the game only runs in a terminal using ASCII graphics. +Tile-based 2D graphics are planned. Mobile device support is also planned and +a high priority! + +Let's complete this section with some details with the world and some details +about the short-term future of the game. + +The world is huge, 125x125 chunks of 128x128x16 tiles. That's 4 billion tiles! +The current plan is to have a single server containing around 10,000 players. +Depending on how much resources that takes and the number of players on the +game, it is possible that more servers will be created or that the world will be +extended. + +Right now, the game has around a third of the planned "base" features. +- Inventory management +- Crafting +- World generation +- Mining +- Moving around the map +- Player Action Queue +- Picking up items +- Partial implementation of multiplayer + +Here's a preview of some of the planned features for the next couple weeks: +- Add placing tiles in the world +- Complete world chunk saving +- Add description of items at the left of the inventory screen +- Add item dropping +- Add item containers (chests, lockers) +- Show keybinds right side of the screen +- Add timing to crafting (currently, crafting does not take time) +- Add falling and fall damage +- Add mining up (but not down!) +- Limit view to what your character can see +- Event Log at the bottom of the screen + +Underground Layer: +./wotfg.png +Surface Layer: +./wotfg2.png +Inventory: +./wotfg3.png +Crafting: +./wotfg4.png + +There are way more things I want to talk about, but I will keep those for +future blog posts. + +Amethyst +================================================================================ +I recently joined the Board of Director of the Amethyst Foundation! +All this mean is that is that now I'm in charge of getting the engine back +on track. + +There are a couple ways to do that, so let's start with what we can do +RIGHT NOW. + +First of all, we are making all issues "actionnable". What I mean by this is +that we will ensure that all github issues have a list of task that, once +completed, will lead to the issue being closed. + +This is to make it easy for contributors to understand what they have to do. +It also makes it easy to know which issues we have to close: Issues that have +no clear way to get solved get closed and discussion is encouraged in the RFC +process to come up with a solution there. + +Secondly, Amethyst 0.16.0 NEEDS to be released. The only remaining task to get +there is to update the book with new information concerning the legion port and +update the code examples. + +Finally, I have made a longer term list of tasks to improve the engine and also +time estimations of the work: +- Make all issues actionnable (4h) +- Fix book for legion port (10h) +- Add test_all.sh script and release.sh script (with places to check everything is fine) (4h) +- Publish 0.16 (2h) +- Replace src/ content with game_engine_core (5h) +- Remove hard dependency on git lfs (5h) +- Publish 0.17 (1h) +- Replace stopwatch by rust-stopwatch2 (1h) +- Implement default, serialize, deserialize, debug to more types (2h) +- Explore replacements for amethyst rendering (3h) +- Explore replacements for amethyst ui (3h) +- Look at what code can be moved out of amethyst and into other crates (8h) +- Publish 0.18 (1h) +- Check that we are using nice color crate (1h) +- Implement physics crate with bindings to nphysics_ecs (6h) +- Publish 0.19 (1h) +- Implement mesh editing and querying (ram-side mesh data) (3h) +- Add wgpu renderer (or any renderer with opengl and mobile support) (20+h) +- Publish 0.20 (1h) + +As you can see, there is this "look at what code can be moved out of Amethyst" +item. + +This is because I want Amethyst to follow the example of Minigene: features +should be moved to layer 1 crates, legion glue to layer 2, and Amethyst should +act as layer 3. This is a ton of work for an engine of this size, so it is fair +to assume that Amethyst codebase will contain both layer 2 and layer 3. +I'm still hoping we can get layer 1 out of amethyst and into reusable crates +that will benefit the whole ecosystem! + +Call For Help! +================================================================================ +Wew! This was a long blog post! Still here? Good! + +We need your help! *I* need your help! + +There are a lots of ways you can help, even if you are not familiar with +programming and even if you didn't read the blog post at all! + +Donating on Patreon +-------------------------------------------------------------------------------- +Donating on patreon helps me spend more time working on open source projects! +Whether it is games or game engines, your monetary donation helps create that! + +It is also the easiest and fastest way to help me and the open source game +ecosystem as a whole! + +https://patreon.com/jojolepro + +Contributing Code/Unit Tests +-------------------------------------------------------------------------------- +There are multiple ways to contribute code. + +In the case of Amethyst and Minigene, it can be as simple as taking layer 1 code +(features) and layer 2 code (Entity Component System systems) and moving them to +small crates. + +In the case of WOTFG and Shotcaller, you can open pull request with features +that you want. Before doing that, it is always a good idea to contact us +to know what is most needed and if your feature is something that would fit well +with the game concepts. + +Finally, for all of those, adding unit tests to ensure that everything is +working like it should is extremely appreciated! + +Contributing Documentation +-------------------------------------------------------------------------------- +Documentation is also something that is very appreciated. +Whether it is just fixing a typo or contributing pages of documentation, +we are very grateful towards anyone writing documentation, blog posts, tutorials +and books! + +Talk about us! +-------------------------------------------------------------------------------- +If none of the previous options sounds like a good fit for you, simply talk +about us! Post the link to this blog post to places you know. Every bit helps! + +Joining/Contacting us +================================================================================ +Here is how you can contact us for those different projects: + +Myself: +- By Mail: +jojolepro [at] jojolepro [dot] com +- On Discord: +jojolepro#8057 +- Patreon: +https://patreon.com/jojolepro + +Minigene and WOTFG Development Team: +- On Discord: +https://discord.gg/gb2wENz + +Amethyst and Shotcaller: +- On Discord: +https://discord.gg/amethyst diff --git a/src/blog/2021-05-31_minigene_and_the_future/shotcaller.png b/src/blog/2021-05-31_minigene_and_the_future/shotcaller.png Binary files differ. diff --git a/src/blog/2021-05-31_minigene_and_the_future/shotcaller2.png b/src/blog/2021-05-31_minigene_and_the_future/shotcaller2.png Binary files differ. diff --git a/src/blog/2021-05-31_minigene_and_the_future/wotfg.png b/src/blog/2021-05-31_minigene_and_the_future/wotfg.png Binary files differ. diff --git a/src/blog/2021-05-31_minigene_and_the_future/wotfg2.png b/src/blog/2021-05-31_minigene_and_the_future/wotfg2.png Binary files differ. diff --git a/src/blog/2021-05-31_minigene_and_the_future/wotfg3.png b/src/blog/2021-05-31_minigene_and_the_future/wotfg3.png Binary files differ. diff --git a/src/blog/2021-05-31_minigene_and_the_future/wotfg4.png b/src/blog/2021-05-31_minigene_and_the_future/wotfg4.png Binary files differ. diff --git a/target/gemini/blog/2020-03-31_extracting_data_from_websites/index.gmi b/target/gemini/blog/2020-03-31_extracting_data_from_websites/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2020-04-09_simple_school_documents/index.gmi b/target/gemini/blog/2020-04-09_simple_school_documents/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2020-05-04_why_i_moved_from_wordpress/index.gmi b/target/gemini/blog/2020-05-04_why_i_moved_from_wordpress/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2020-07-07_minimalist_alternatives/index.gmi b/target/gemini/blog/2020-07-07_minimalist_alternatives/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2020-08-20_event_chaining/index.gmi b/target/gemini/blog/2020-08-20_event_chaining/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2020-09-17_the_lost_of_autonomy/index.gmi b/target/gemini/blog/2020-09-17_the_lost_of_autonomy/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2020-11-17_the_fall_of_the_giant/index.gmi b/target/gemini/blog/2020-11-17_the_fall_of_the_giant/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2021-01-13_planck_ecs/index.gmi b/target/gemini/blog/2021-01-13_planck_ecs/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2021-01-13_removing_the_us/index.gmi b/target/gemini/blog/2021-01-13_removing_the_us/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/index.gmi b/target/gemini/blog/2021-05-31_minigene_and_the_future/index.gmi @@ -0,0 +1,389 @@ +# Jojolepro +=> blog Blog +=> projects Projects +=> quotes Quotes +=> https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives + + + +## Minigene, Shotcaller, WOTFG, Amethyst and the Future of Rust Gamedev +Hello and welcome to your ~~daily~~ ~~monthly~~ yearly status update! + +This post is rather long, so feel free to skip sections underlined with dashes, +as they are more in-depth explanations of what was mentioned just before them. + +Let's task about what has been happening in the past few months and what is +coming in the future! + +## Minigene +Minigene is a new game engine. It is meant to fill the empty space between +indie game development and professionnal game development. + +=>https://github.com/jojolepro/minigene + +By that, I mean that it sits between the "we do everything for you and hold your +hand" approach and the "build everything yourself" approach. + +Minigene is built from a wide collection of small (and not so small) crates. +To understand how it works, we can think of the engine using layers. + +For instance, here are the layers used for the game Shotcaller: +* 4: Game +* 3: Minigene +* 2: Glue +* 1: Features + +### Layers Explained + +Let's start at the bottom, with layer 1: the features. This layer is composed of +many small and specialized crates. For instance, one crate for i18n, one crate +for game inventory and item management, etc... +=>https://github.com/jojolepro/game_features + +This layer also include crates which aren't "game features" but are +"engine features". +For instance, the crate game_engine_core gives us a structure in which we can +run our game logic using global states. +=>https://github.com/jojolepro/game_engine_core + +Crates in layer 1 are small and usually aim to have all of their functions +verified using unit tests. They also aim to have clear documentation. +Finally, they aim to limit the number of different ways you can do the same +thing. This is so it is easier to learn how to use them and it also limits +complexity. + +Now, let's talk about layer 2: the glue! +The glue is the part of the engine that takes data from some global storage and +updates/calls the layer 1 features. + +In the case of minigene, we use planck_ecs, the easiest entity-component-system +to use and also the most tested and minimalist. + +At layer 2, we "wrap" the layer one features inside of the glue. +One layer 2 crate can use one or more layer one crate, although we usually try +to limit ourselves to one. + +For instance, we can have a planck_game_features crate that creates Systems +which execute game_features update functions using Components coming from +Planck's World structure. + +Now, layer 3 is simply minigene, the crate. It re-export a bunch of layer 2 +crates into a convenient package. To avoid importing a billion crates when using +minigene, we place the different features into groups and hide them behind +feature gates. + +You can enable those features using: +``` +minigene = { git = "https://github.com/jojolepro/minigene", + features = ["feature1", "feature2", "..."] } +``` + +Finally, layer 4 is the game you want to make. +Usually, it will import minigene and use some of its features. +It will also import some crates that are specific to the needs of the game. + +Here's how it will look in practice: +=>https://www.figma.com/file/cv7orWvUWfB6teK7RLqu3L/The-New-Amethyst?node-id=0%3A1 + +Quite the mess, I know, but it is the cleanest graph of a full detailed game +engine that I have ever seen. I'll let you imagine how horrible it is for +engines which are not aiming to have small dependencies! + +Let's continue: +You are free to replace any feature of minigene with your own or an equivalent +crate. Minigene is written in such a way that, if you want, you can even use it +alongside another game engine! For more details on this, read the section on +Shotcaller. + +Finally, the engine makes heavy use of event chaining. I discussed of this +extensively here: +=>https://jojolepro.com/blog/2020-08-20_event_chaining/ + +In short, it allows to drive the execution of systems using events and to +creates events from past events. Here is a quick example: +<bracket-lib event>::char(x) -> InputEvent::KeyPress(x) -> GameEvent::Jump +-> NetworkedAction::PlayerJump(auth_id) -> NetworkEvent::PlayerJumped(entity_id) + +Here, we started with a key press, inserted it in a more convenient structure, +created an event specific to the game we are creating, pushed a network event +to the server and finally notified all clients in the game that we jumped. + +### Features Of Minigene +Currently, Minigene has quite a few features but is far from having all of the +planned features. + +Here are some features that are currently implemented and working: +* ASCII rendering in the terminal +* 2D Tile-Based graphics in a desktop window +* Input handling +* Game inventory management +* Game stats management (health, mana, damage dealt this game, etc...) +* Game engine core (sleeping, executing game frames, managing states) +* Game clock & stopwatch +* Planck ECS integration +* Bracket-lib integration +* Runs on WASM (Web Assembly) + +### Planned Features and Changes +The engine has a lot of planned features, but for now we will mention only +a few of them. + +* Add a command/debug console (clap to events, custom logger output) +* Add network backend nakama-rs +* Add network backend message-io +* Integrate planck_ecs_bundle +* Create bundle with game_features related systems (planck_game_features crate) +* Move code (when applicable) from minigene systems to game_features +* Integrate a 2d renderer to emulate terminal rendering +* Integrate a 2d renderer to render sprites in any position, shape or rotation. +* Choose a math crate that will be used as the base on which we build other + crates. +* Mobile device support (high priority!) + +## Shotcaller +Shotcaller is a MOBA game inspired by DOTA 2 and League of Legends. +=>https://github.com/amethyst/shotcaller + +It is built on minigene and was the reason the engine was created in the first +place. Development of this game is currently on hold until more funds are +available. + +The game can be tested using: +``` +git clone =>https://github.com/amethyst/shotcaller +cd shotcaller +git checkout ac07a7bfb4224e8af4bd43e6df3afcaa879d4a48 +``` + +In the case that this does not work, there is also an online version: +=>https://shotcaller.jojolepro.com/ +This version quite a bit older, however. + +Desktop Version: +=>./shotcaller.png +Old WASM Build: +=>./shotcaller2.png + +## WOTFG +World Of The Fox God is a tile-based MMORPG (multiplayer roguelike/roleplay). +=>https://github.com/jojolepro/wotfg + +It is inspired by games like Cataclysm: Dark Days Ahead (graphics and skills), +Path Of Exile (depth of items and skills) and Minecraft Faction servers +(core gameplay ideas). + +It aims to be an anarchist (without hierarchy) game, meaning that there is no +strongly enforced concepts like groups, leaders and chiefs. It is up to players +to communicate, form alliances and figure out how they best want to play +together. + +It also aims to be a hardcore game while still being easy to enjoy, meaning that +it is punishing when you do bad actions, but there will be plenty of room to +enjoy the game and learn from your mistakes. + +To achieve this, we will make death very punishing: You will lose your +character, experience, skills and items. When you create a new character, you +will appear in a random location in the giant world, with no indication of +where you are until you find a map. + +The reason for this is two fold: +* We want to encourage players to cooperate and for this to happen we need to +discourage attacking other players. Since the downside to dying is so high, +attacking players is a risky gamble that not many players would risk to taking. +* Players should be more likely to cooperate with others and should avoid +fighting others in most cases. + +The game also aims to maximise enjoyment while minimising the time spent +actively playing it. To this effect, we took some inspiration from +Runescape's model: Crafting and farming items takes a long time. +This means that you can start crafting a new chestplate, go cook yourself some +food in real life, and come back to a brand new chestplate. + +The time it takes to make something will depend on its rarity and level. +Some items will take 5 seconds to craft, while the best items will take 24 +hours. Crafting recipes are pausable, so you could craft one of those +longer recipe over multiple nights while still actively playing during the day. + +Kind of related to this, the game aims to be strategic and gives you some time +to think about your actions. Game updates happen every 5 seconds. This means +you can only do one thing each 5 seconds, being it to move, continue crafting, +attacking a player or mining some ore. + +This slows the game down quite a bit, removing the stress factor of real-time +games. Since the goal is not to make you press a key every 5 seconds and stay +in front of the game, there is what I call an "Action Queue". It queues your +action that will be executed, one at a time, every 5 seconds. +For example, if you press ddddd, your character will move 5 times right over +the course of 25 seconds. + +Again, while this might seem boring, it is not. The game is meant to be played +while doing other things (working, cooking, watching videos), so it actually +feels fast when you do other things at the same time. The great thing about that +is that it can fill this feeling of "not doing progress in life" while still +encouraging you to do the things you need to do but might not fulfill you. + +Currently, the game only runs in a terminal using ASCII graphics. +Tile-based 2D graphics are planned. Mobile device support is also planned and +a high priority! + +Let's complete this section with some details with the world and some details +about the short-term future of the game. + +The world is huge, 125x125 chunks of 128x128x16 tiles. That's 4 billion tiles! +The current plan is to have a single server containing around 10,000 players. +Depending on how much resources that takes and the number of players on the +game, it is possible that more servers will be created or that the world will be +extended. + +Right now, the game has around a third of the planned "base" features. +* Inventory management +* Crafting +* World generation +* Mining +* Moving around the map +* Player Action Queue +* Picking up items +* Partial implementation of multiplayer + +Here's a preview of some of the planned features for the next couple weeks: +* Add placing tiles in the world +* Complete world chunk saving +* Add description of items at the left of the inventory screen +* Add item dropping +* Add item containers (chests, lockers) +* Show keybinds right side of the screen +* Add timing to crafting (currently, crafting does not take time) +* Add falling and fall damage +* Add mining up (but not down!) +* Limit view to what your character can see +* Event Log at the bottom of the screen + +Underground Layer: +=>./wotfg.png +Surface Layer: +=>./wotfg2.png +Inventory: +=>./wotfg3.png +Crafting: +=>./wotfg4.png + +There are way more things I want to talk about, but I will keep those for +future blog posts. + +## Amethyst +I recently joined the Board of Director of the Amethyst Foundation! +All this mean is that is that now I'm in charge of getting the engine back +on track. + +There are a couple ways to do that, so let's start with what we can do +RIGHT NOW. + +First of all, we are making all issues "actionnable". What I mean by this is +that we will ensure that all github issues have a list of task that, once +completed, will lead to the issue being closed. + +This is to make it easy for contributors to understand what they have to do. +It also makes it easy to know which issues we have to close: Issues that have +no clear way to get solved get closed and discussion is encouraged in the RFC +process to come up with a solution there. + +Secondly, Amethyst 0.16.0 NEEDS to be released. The only remaining task to get +there is to update the book with new information concerning the legion port and +update the code examples. + +Finally, I have made a longer term list of tasks to improve the engine and also +time estimations of the work: +* Make all issues actionnable (4h) +* Fix book for legion port (10h) +* Add test_all.sh script and release.sh script (with places to check everything is fine) (4h) +* Publish 0.16 (2h) +* Replace src/ content with game_engine_core (5h) +* Remove hard dependency on git lfs (5h) +* Publish 0.17 (1h) +* Replace stopwatch by rust-stopwatch2 (1h) +* Implement default, serialize, deserialize, debug to more types (2h) +* Explore replacements for amethyst rendering (3h) +* Explore replacements for amethyst ui (3h) +* Look at what code can be moved out of amethyst and into other crates (8h) +* Publish 0.18 (1h) +* Check that we are using nice color crate (1h) +* Implement physics crate with bindings to nphysics_ecs (6h) +* Publish 0.19 (1h) +* Implement mesh editing and querying (ram-side mesh data) (3h) +* Add wgpu renderer (or any renderer with opengl and mobile support) (20+h) +* Publish 0.20 (1h) + +As you can see, there is this "look at what code can be moved out of Amethyst" +item. + +This is because I want Amethyst to follow the example of Minigene: features +should be moved to layer 1 crates, legion glue to layer 2, and Amethyst should +act as layer 3. This is a ton of work for an engine of this size, so it is fair +to assume that Amethyst codebase will contain both layer 2 and layer 3. +I'm still hoping we can get layer 1 out of amethyst and into reusable crates +that will benefit the whole ecosystem! + +## Call For Help! +Wew! This was a long blog post! Still here? Good! + +We need your help! *I* need your help! + +There are a lots of ways you can help, even if you are not familiar with +programming and even if you didn't read the blog post at all! + +### Donating on Patreon +Donating on patreon helps me spend more time working on open source projects! +Whether it is games or game engines, your monetary donation helps create that! + +It is also the easiest and fastest way to help me and the open source game +ecosystem as a whole! + +=>https://patreon.com/jojolepro + +### Contributing Code/Unit Tests +There are multiple ways to contribute code. + +In the case of Amethyst and Minigene, it can be as simple as taking layer 1 code +(features) and layer 2 code (Entity Component System systems) and moving them to +small crates. + +In the case of WOTFG and Shotcaller, you can open pull request with features +that you want. Before doing that, it is always a good idea to contact us +to know what is most needed and if your feature is something that would fit well +with the game concepts. + +Finally, for all of those, adding unit tests to ensure that everything is +working like it should is extremely appreciated! + +### Contributing Documentation +Documentation is also something that is very appreciated. +Whether it is just fixing a typo or contributing pages of documentation, +we are very grateful towards anyone writing documentation, blog posts, tutorials +and books! + +### Talk about us! +If none of the previous options sounds like a good fit for you, simply talk +about us! Post the link to this blog post to places you know. Every bit helps! + +## Joining/Contacting us +Here is how you can contact us for those different projects: + +Myself: +* By Mail: +jojolepro [at] jojolepro [dot] com +* On Discord: +jojolepro#8057 +* Patreon: +=>https://patreon.com/jojolepro + +Minigene and WOTFG Development Team: +* On Discord: +=>https://discord.gg/gb2wENz + +Amethyst and Shotcaller: +* On Discord: +=>https://discord.gg/amethyst + +(C) Joël Lupien 2020-2021 +=>/blog/2021-05-31_minigene_and_the_future/index.txt View page source diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/index.txt b/target/gemini/blog/2021-05-31_minigene_and_the_future/index.txt @@ -0,0 +1,391 @@ +Minigene, Shotcaller, WOTFG, Amethyst and the Future of Rust Gamedev +================================================================================ +Hello and welcome to your ~~daily~~ ~~monthly~~ yearly status update! + +This post is rather long, so feel free to skip sections underlined with dashes, +as they are more in-depth explanations of what was mentioned just before them. + +Let's task about what has been happening in the past few months and what is +coming in the future! + +Minigene +================================================================================ +Minigene is a new game engine. It is meant to fill the empty space between +indie game development and professionnal game development. + +https://github.com/jojolepro/minigene + +By that, I mean that it sits between the "we do everything for you and hold your +hand" approach and the "build everything yourself" approach. + +Minigene is built from a wide collection of small (and not so small) crates. +To understand how it works, we can think of the engine using layers. + +For instance, here are the layers used for the game Shotcaller: +- 4: Game +- 3: Minigene +- 2: Glue +- 1: Features + +Layers Explained +-------------------------------------------------------------------------------- + +Let's start at the bottom, with layer 1: the features. This layer is composed of +many small and specialized crates. For instance, one crate for i18n, one crate +for game inventory and item management, etc... +https://github.com/jojolepro/game_features + +This layer also include crates which aren't "game features" but are +"engine features". +For instance, the crate game_engine_core gives us a structure in which we can +run our game logic using global states. +https://github.com/jojolepro/game_engine_core + +Crates in layer 1 are small and usually aim to have all of their functions +verified using unit tests. They also aim to have clear documentation. +Finally, they aim to limit the number of different ways you can do the same +thing. This is so it is easier to learn how to use them and it also limits +complexity. + +Now, let's talk about layer 2: the glue! +The glue is the part of the engine that takes data from some global storage and +updates/calls the layer 1 features. + +In the case of minigene, we use planck_ecs, the easiest entity-component-system +to use and also the most tested and minimalist. + +At layer 2, we "wrap" the layer one features inside of the glue. +One layer 2 crate can use one or more layer one crate, although we usually try +to limit ourselves to one. + +For instance, we can have a planck_game_features crate that creates Systems +which execute game_features update functions using Components coming from +Planck's World structure. + +Now, layer 3 is simply minigene, the crate. It re-export a bunch of layer 2 +crates into a convenient package. To avoid importing a billion crates when using +minigene, we place the different features into groups and hide them behind +feature gates. + +You can enable those features using: +``` +minigene = { git = "https://github.com/jojolepro/minigene", + features = ["feature1", "feature2", "..."] } +``` + +Finally, layer 4 is the game you want to make. +Usually, it will import minigene and use some of its features. +It will also import some crates that are specific to the needs of the game. + +Here's how it will look in practice: +https://www.figma.com/file/cv7orWvUWfB6teK7RLqu3L/The-New-Amethyst?node-id=0%3A1 + +Quite the mess, I know, but it is the cleanest graph of a full detailed game +engine that I have ever seen. I'll let you imagine how horrible it is for +engines which are not aiming to have small dependencies! + +Let's continue: +You are free to replace any feature of minigene with your own or an equivalent +crate. Minigene is written in such a way that, if you want, you can even use it +alongside another game engine! For more details on this, read the section on +Shotcaller. + +Finally, the engine makes heavy use of event chaining. I discussed of this +extensively here: +https://jojolepro.com/blog/2020-08-20_event_chaining/ + +In short, it allows to drive the execution of systems using events and to +creates events from past events. Here is a quick example: +<bracket-lib event>::char(x) -> InputEvent::KeyPress(x) -> GameEvent::Jump +-> NetworkedAction::PlayerJump(auth_id) -> NetworkEvent::PlayerJumped(entity_id) + +Here, we started with a key press, inserted it in a more convenient structure, +created an event specific to the game we are creating, pushed a network event +to the server and finally notified all clients in the game that we jumped. + +Features Of Minigene +-------------------------------------------------------------------------------- +Currently, Minigene has quite a few features but is far from having all of the +planned features. + +Here are some features that are currently implemented and working: +- ASCII rendering in the terminal +- 2D Tile-Based graphics in a desktop window +- Input handling +- Game inventory management +- Game stats management (health, mana, damage dealt this game, etc...) +- Game engine core (sleeping, executing game frames, managing states) +- Game clock & stopwatch +- Planck ECS integration +- Bracket-lib integration +- Runs on WASM (Web Assembly) + +Planned Features and Changes +-------------------------------------------------------------------------------- +The engine has a lot of planned features, but for now we will mention only +a few of them. + +- Add a command/debug console (clap to events, custom logger output) +- Add network backend nakama-rs +- Add network backend message-io +- Integrate planck_ecs_bundle +- Create bundle with game_features related systems (planck_game_features crate) +- Move code (when applicable) from minigene systems to game_features +- Integrate a 2d renderer to emulate terminal rendering +- Integrate a 2d renderer to render sprites in any position, shape or rotation. +- Choose a math crate that will be used as the base on which we build other + crates. +- Mobile device support (high priority!) + +Shotcaller +================================================================================ +Shotcaller is a MOBA game inspired by DOTA 2 and League of Legends. +https://github.com/amethyst/shotcaller + +It is built on minigene and was the reason the engine was created in the first +place. Development of this game is currently on hold until more funds are +available. + +The game can be tested using: +``` +git clone https://github.com/amethyst/shotcaller +cd shotcaller +git checkout ac07a7bfb4224e8af4bd43e6df3afcaa879d4a48 +``` + +In the case that this does not work, there is also an online version: +https://shotcaller.jojolepro.com/ +This version quite a bit older, however. + +Desktop Version: +./shotcaller.png +Old WASM Build: +./shotcaller2.png + +WOTFG +================================================================================ +World Of The Fox God is a tile-based MMORPG (multiplayer roguelike/roleplay). +https://github.com/jojolepro/wotfg + +It is inspired by games like Cataclysm: Dark Days Ahead (graphics and skills), +Path Of Exile (depth of items and skills) and Minecraft Faction servers +(core gameplay ideas). + +It aims to be an anarchist (without hierarchy) game, meaning that there is no +strongly enforced concepts like groups, leaders and chiefs. It is up to players +to communicate, form alliances and figure out how they best want to play +together. + +It also aims to be a hardcore game while still being easy to enjoy, meaning that +it is punishing when you do bad actions, but there will be plenty of room to +enjoy the game and learn from your mistakes. + +To achieve this, we will make death very punishing: You will lose your +character, experience, skills and items. When you create a new character, you +will appear in a random location in the giant world, with no indication of +where you are until you find a map. + +The reason for this is two fold: +- We want to encourage players to cooperate and for this to happen we need to +discourage attacking other players. Since the downside to dying is so high, +attacking players is a risky gamble that not many players would risk to taking. +- Players should be more likely to cooperate with others and should avoid +fighting others in most cases. + +The game also aims to maximise enjoyment while minimising the time spent +actively playing it. To this effect, we took some inspiration from +Runescape's model: Crafting and farming items takes a long time. +This means that you can start crafting a new chestplate, go cook yourself some +food in real life, and come back to a brand new chestplate. + +The time it takes to make something will depend on its rarity and level. +Some items will take 5 seconds to craft, while the best items will take 24 +hours. Crafting recipes are pausable, so you could craft one of those +longer recipe over multiple nights while still actively playing during the day. + +Kind of related to this, the game aims to be strategic and gives you some time +to think about your actions. Game updates happen every 5 seconds. This means +you can only do one thing each 5 seconds, being it to move, continue crafting, +attacking a player or mining some ore. + +This slows the game down quite a bit, removing the stress factor of real-time +games. Since the goal is not to make you press a key every 5 seconds and stay +in front of the game, there is what I call an "Action Queue". It queues your +action that will be executed, one at a time, every 5 seconds. +For example, if you press ddddd, your character will move 5 times right over +the course of 25 seconds. + +Again, while this might seem boring, it is not. The game is meant to be played +while doing other things (working, cooking, watching videos), so it actually +feels fast when you do other things at the same time. The great thing about that +is that it can fill this feeling of "not doing progress in life" while still +encouraging you to do the things you need to do but might not fulfill you. + +Currently, the game only runs in a terminal using ASCII graphics. +Tile-based 2D graphics are planned. Mobile device support is also planned and +a high priority! + +Let's complete this section with some details with the world and some details +about the short-term future of the game. + +The world is huge, 125x125 chunks of 128x128x16 tiles. That's 4 billion tiles! +The current plan is to have a single server containing around 10,000 players. +Depending on how much resources that takes and the number of players on the +game, it is possible that more servers will be created or that the world will be +extended. + +Right now, the game has around a third of the planned "base" features. +- Inventory management +- Crafting +- World generation +- Mining +- Moving around the map +- Player Action Queue +- Picking up items +- Partial implementation of multiplayer + +Here's a preview of some of the planned features for the next couple weeks: +- Add placing tiles in the world +- Complete world chunk saving +- Add description of items at the left of the inventory screen +- Add item dropping +- Add item containers (chests, lockers) +- Show keybinds right side of the screen +- Add timing to crafting (currently, crafting does not take time) +- Add falling and fall damage +- Add mining up (but not down!) +- Limit view to what your character can see +- Event Log at the bottom of the screen + +Underground Layer: +./wotfg.png +Surface Layer: +./wotfg2.png +Inventory: +./wotfg3.png +Crafting: +./wotfg4.png + +There are way more things I want to talk about, but I will keep those for +future blog posts. + +Amethyst +================================================================================ +I recently joined the Board of Director of the Amethyst Foundation! +All this mean is that is that now I'm in charge of getting the engine back +on track. + +There are a couple ways to do that, so let's start with what we can do +RIGHT NOW. + +First of all, we are making all issues "actionnable". What I mean by this is +that we will ensure that all github issues have a list of task that, once +completed, will lead to the issue being closed. + +This is to make it easy for contributors to understand what they have to do. +It also makes it easy to know which issues we have to close: Issues that have +no clear way to get solved get closed and discussion is encouraged in the RFC +process to come up with a solution there. + +Secondly, Amethyst 0.16.0 NEEDS to be released. The only remaining task to get +there is to update the book with new information concerning the legion port and +update the code examples. + +Finally, I have made a longer term list of tasks to improve the engine and also +time estimations of the work: +- Make all issues actionnable (4h) +- Fix book for legion port (10h) +- Add test_all.sh script and release.sh script (with places to check everything is fine) (4h) +- Publish 0.16 (2h) +- Replace src/ content with game_engine_core (5h) +- Remove hard dependency on git lfs (5h) +- Publish 0.17 (1h) +- Replace stopwatch by rust-stopwatch2 (1h) +- Implement default, serialize, deserialize, debug to more types (2h) +- Explore replacements for amethyst rendering (3h) +- Explore replacements for amethyst ui (3h) +- Look at what code can be moved out of amethyst and into other crates (8h) +- Publish 0.18 (1h) +- Check that we are using nice color crate (1h) +- Implement physics crate with bindings to nphysics_ecs (6h) +- Publish 0.19 (1h) +- Implement mesh editing and querying (ram-side mesh data) (3h) +- Add wgpu renderer (or any renderer with opengl and mobile support) (20+h) +- Publish 0.20 (1h) + +As you can see, there is this "look at what code can be moved out of Amethyst" +item. + +This is because I want Amethyst to follow the example of Minigene: features +should be moved to layer 1 crates, legion glue to layer 2, and Amethyst should +act as layer 3. This is a ton of work for an engine of this size, so it is fair +to assume that Amethyst codebase will contain both layer 2 and layer 3. +I'm still hoping we can get layer 1 out of amethyst and into reusable crates +that will benefit the whole ecosystem! + +Call For Help! +================================================================================ +Wew! This was a long blog post! Still here? Good! + +We need your help! *I* need your help! + +There are a lots of ways you can help, even if you are not familiar with +programming and even if you didn't read the blog post at all! + +Donating on Patreon +-------------------------------------------------------------------------------- +Donating on patreon helps me spend more time working on open source projects! +Whether it is games or game engines, your monetary donation helps create that! + +It is also the easiest and fastest way to help me and the open source game +ecosystem as a whole! + +https://patreon.com/jojolepro + +Contributing Code/Unit Tests +-------------------------------------------------------------------------------- +There are multiple ways to contribute code. + +In the case of Amethyst and Minigene, it can be as simple as taking layer 1 code +(features) and layer 2 code (Entity Component System systems) and moving them to +small crates. + +In the case of WOTFG and Shotcaller, you can open pull request with features +that you want. Before doing that, it is always a good idea to contact us +to know what is most needed and if your feature is something that would fit well +with the game concepts. + +Finally, for all of those, adding unit tests to ensure that everything is +working like it should is extremely appreciated! + +Contributing Documentation +-------------------------------------------------------------------------------- +Documentation is also something that is very appreciated. +Whether it is just fixing a typo or contributing pages of documentation, +we are very grateful towards anyone writing documentation, blog posts, tutorials +and books! + +Talk about us! +-------------------------------------------------------------------------------- +If none of the previous options sounds like a good fit for you, simply talk +about us! Post the link to this blog post to places you know. Every bit helps! + +Joining/Contacting us +================================================================================ +Here is how you can contact us for those different projects: + +Myself: +- By Mail: +jojolepro [at] jojolepro [dot] com +- On Discord: +jojolepro#8057 +- Patreon: +https://patreon.com/jojolepro + +Minigene and WOTFG Development Team: +- On Discord: +https://discord.gg/gb2wENz + +Amethyst and Shotcaller: +- On Discord: +https://discord.gg/amethyst diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/shotcaller.png b/target/gemini/blog/2021-05-31_minigene_and_the_future/shotcaller.png Binary files differ. diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/shotcaller2.png b/target/gemini/blog/2021-05-31_minigene_and_the_future/shotcaller2.png Binary files differ. diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg.png b/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg.png Binary files differ. diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg2.png b/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg2.png Binary files differ. diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg3.png b/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg3.png Binary files differ. diff --git a/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg4.png b/target/gemini/blog/2021-05-31_minigene_and_the_future/wotfg4.png Binary files differ. diff --git a/target/gemini/focks/index.gmi b/target/gemini/focks/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/index.gmi b/target/gemini/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/projects/index.gmi b/target/gemini/projects/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/gemini/quotes/index.gmi b/target/gemini/quotes/index.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives diff --git a/target/html/blog/2020-03-31_extracting_data_from_websites/index.html b/target/html/blog/2020-03-31_extracting_data_from_websites/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2020-04-09_simple_school_documents/index.html b/target/html/blog/2020-04-09_simple_school_documents/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2020-05-04_why_i_moved_from_wordpress/index.html b/target/html/blog/2020-05-04_why_i_moved_from_wordpress/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2020-07-07_minimalist_alternatives/index.html b/target/html/blog/2020-07-07_minimalist_alternatives/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2020-08-20_event_chaining/index.html b/target/html/blog/2020-08-20_event_chaining/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2020-09-17_the_lost_of_autonomy/index.html b/target/html/blog/2020-09-17_the_lost_of_autonomy/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2020-11-17_the_fall_of_the_giant/index.html b/target/html/blog/2020-11-17_the_fall_of_the_giant/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2021-01-13_planck_ecs/index.html b/target/html/blog/2021-01-13_planck_ecs/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2021-01-13_removing_the_us/index.html b/target/html/blog/2021-01-13_removing_the_us/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/index.html b/target/html/blog/2021-05-31_minigene_and_the_future/index.html @@ -0,0 +1,455 @@ +<!doctype html> +<html lang=en> + <head> + <link href='data:image/png;base64,R0lGODlhGAAYAOeIAAAAALVSwLlUxLxXyLlZxMlb1cpc1hScoRSepNBf3c9h29Rg4NJh39Nh4BWhps9j3NJi3s1k2dVh4tBk3NVi4tNj39Zi49di49di5NBl3NVj4tNk39hi5dZj49Zj5Nli5dRk4ddj5NVk4thj5dti5tNl4Nhj5tZk49Fm3tlj5dRl4Nlj5tdk49dk5Npj5ddk5dVl4dhk5dZl49lk5tdl5dpk5tZm49Nn5NVn4tVn5dZn49Ro4Nlm5tNo5ddn5NBq29Vo4dVo4haortln5dRp4Ndo49Zp49Nq5Raqr9pp59hr5NFu5Nls5s1y5BevtBawtcp25BizuRi1uhm4vi20wbqG4hm7wRq8whm9w7yI4raM4Bq/xRq/xrSO4RrByBrDyRvDyhvFyxvGzBvHzRvHzqeb4BvIzhvIzxzIzxvJz6ad4CTH0aKf3xzK0BzK0RzL0p6i3xzN1BzP1R3P1pGr3h3Q15Or3RzR2CPP2R3R2B3R2R/R2RzS2R3S2SfP2Yex3Yey3TPN2TbN2Xm43DDP2Xa63EXK2kbK2v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH+B2hhaSBoYWkAIfkEAQoA/wAsAAAAABgAGAAACP4A/wkcSLCgwYMFASgEgLDhQiFWrkxZ2JAgACl58vTZuDGPwor/ALzhyFEMmI1uGCIEUKfPHABkODoAMGZjHZUJ02wEEAUARwBofNrEOVBoH5EAzuyMA0Djxi9EAXD5mWdOS5JYo2Ld+pNjGpUAEGwVmrLPlqMkwSLhCgAqAgAHjG40wxCAE656ADzBQwWAHz5ZQ2LhashOlR4uSOToAkjQz5BesB5ic4QHiyQyiFiokQJKoZ8ATnIctCQGBCYqRHjYoWPIihUvyhA6CiDMxj10aFhI8MBGhghBZnTg8fp1FkIKa/aBk2LFhQUlbOAoooHDiRbFX2tR2EbPnw+vR0NMMAJEAQwQFBpoCDFCgoCFAOQEapJ9Q5EKDFCUKPKDAPyid6hhQnZK+GDAAPARVdQaN7yGQQEB/AdSSAlOaOGFAgUEADs=' + rel=icon> + <title>Jojolepro.com</title> + <meta charset=utf-8> + <meta name=description content="A bunch of stuff and things!"> + <style> + body{ + text-align:center; + overflow-y:scroll; + /*font:calc(0.75em + 1vmin) monospace;*/ + font: 1.3em monospace; + background-color: #181a1b; + border-color: #575757; + color: #e8e6e3; + } + pre{ + text-align:left; + display:inline-block; + } + img{ + max-width:80ch; + display:block; + height:auto; + width:100%; + } + nav a { + margin-right: 1ch; + } + a { + color: #3391ff; + } + * { + scrollbar-color: #2a2c2e #1c1e1f; + } + </style> + </head> + <body> + <nav> + <a href=/><b>Jojolepro</b></a> + <br/> + <a href=/blog>Blog</a> + <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> + <!--<a href=/focks>Focks</a>--> + <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> + </nav> + <br/> + <article> + <pre> +Minigene, Shotcaller, WOTFG, Amethyst and the Future of Rust Gamedev +================================================================================ +Hello and welcome to your ~~daily~~ ~~monthly~~ yearly status update! + +This post is rather long, so feel free to skip sections underlined with dashes, +as they are more in-depth explanations of what was mentioned just before them. + +Let's task about what has been happening in the past few months and what is +coming in the future! + +Minigene +================================================================================ +Minigene is a new game engine. It is meant to fill the empty space between +indie game development and professionnal game development. + +<a href='https://github.com/jojolepro/minigene'>https://github.com/jojolepro/minigene</a> + +By that, I mean that it sits between the "we do everything for you and hold your +hand" approach and the "build everything yourself" approach. + +Minigene is built from a wide collection of small (and not so small) crates. +To understand how it works, we can think of the engine using layers. + +For instance, here are the layers used for the game Shotcaller: +- 4: Game +- 3: Minigene +- 2: Glue +- 1: Features + +Layers Explained +-------------------------------------------------------------------------------- + +Let's start at the bottom, with layer 1: the features. This layer is composed of +many small and specialized crates. For instance, one crate for i18n, one crate +for game inventory and item management, etc... +<a href='https://github.com/jojolepro/game_features'>https://github.com/jojolepro/game_features</a> + +This layer also include crates which aren't "game features" but are +"engine features". +For instance, the crate game_engine_core gives us a structure in which we can +run our game logic using global states. +<a href='https://github.com/jojolepro/game_engine_core'>https://github.com/jojolepro/game_engine_core</a> + +Crates in layer 1 are small and usually aim to have all of their functions +verified using unit tests. They also aim to have clear documentation. +Finally, they aim to limit the number of different ways you can do the same +thing. This is so it is easier to learn how to use them and it also limits +complexity. + +Now, let's talk about layer 2: the glue! +The glue is the part of the engine that takes data from some global storage and +updates/calls the layer 1 features. + +In the case of minigene, we use planck_ecs, the easiest entity-component-system +to use and also the most tested and minimalist. + +At layer 2, we "wrap" the layer one features inside of the glue. +One layer 2 crate can use one or more layer one crate, although we usually try +to limit ourselves to one. + +For instance, we can have a planck_game_features crate that creates Systems +which execute game_features update functions using Components coming from +Planck's World structure. + +Now, layer 3 is simply minigene, the crate. It re-export a bunch of layer 2 +crates into a convenient package. To avoid importing a billion crates when using +minigene, we place the different features into groups and hide them behind +feature gates. + +You can enable those features using: +``` +minigene = { git = "https://github.com/jojolepro/minigene", + features = ["feature1", "feature2", "..."] } +``` + +Finally, layer 4 is the game you want to make. +Usually, it will import minigene and use some of its features. +It will also import some crates that are specific to the needs of the game. + +Here's how it will look in practice: +<a href='https://www.figma.com/file/cv7orWvUWfB6teK7RLqu3L/The-New-Amethyst?node-id=0%3A1'>https://www.figma.com/file/cv7orWvUWfB6teK7RLqu3L/The-New-Amethyst?node-id=0%3A</a> + +Quite the mess, I know, but it is the cleanest graph of a full detailed game +engine that I have ever seen. I'll let you imagine how horrible it is for +engines which are not aiming to have small dependencies! + +Let's continue: +You are free to replace any feature of minigene with your own or an equivalent +crate. Minigene is written in such a way that, if you want, you can even use it +alongside another game engine! For more details on this, read the section on +Shotcaller. + +Finally, the engine makes heavy use of event chaining. I discussed of this +extensively here: +<a href='https://jojolepro.com/blog/2020-08-20_event_chaining/'>https://jojolepro.com/blog/2020-08-20_event_chaining/</a> + +In short, it allows to drive the execution of systems using events and to +creates events from past events. Here is a quick example: +&lt;bracket-lib event&gt;::char(x) -&gt; InputEvent::KeyPress(x) -&gt; GameEvent::Jump +-&gt; NetworkedAction::PlayerJump(auth_id) -&gt; NetworkEvent::PlayerJumped(entity_id) + +Here, we started with a key press, inserted it in a more convenient structure, +created an event specific to the game we are creating, pushed a network event +to the server and finally notified all clients in the game that we jumped. + +Features Of Minigene +-------------------------------------------------------------------------------- +Currently, Minigene has quite a few features but is far from having all of the +planned features. + +Here are some features that are currently implemented and working: +- ASCII rendering in the terminal +- 2D Tile-Based graphics in a desktop window +- Input handling +- Game inventory management +- Game stats management (health, mana, damage dealt this game, etc...) +- Game engine core (sleeping, executing game frames, managing states) +- Game clock &amp; stopwatch +- Planck ECS integration +- Bracket-lib integration +- Runs on WASM (Web Assembly) + +Planned Features and Changes +-------------------------------------------------------------------------------- +The engine has a lot of planned features, but for now we will mention only +a few of them. + +- Add a command/debug console (clap to events, custom logger output) +- Add network backend nakama-rs +- Add network backend message-io +- Integrate planck_ecs_bundle +- Create bundle with game_features related systems (planck_game_features crate) +- Move code (when applicable) from minigene systems to game_features +- Integrate a 2d renderer to emulate terminal rendering +- Integrate a 2d renderer to render sprites in any position, shape or rotation. +- Choose a math crate that will be used as the base on which we build other + crates. +- Mobile device support (high priority!) + +Shotcaller +================================================================================ +Shotcaller is a MOBA game inspired by DOTA 2 and League of Legends. +<a href='https://github.com/amethyst/shotcaller'>https://github.com/amethyst/shotcaller</a> + +It is built on minigene and was the reason the engine was created in the first +place. Development of this game is currently on hold until more funds are +available. + +The game can be tested using: +``` +git clone <a href='https://github.com/amethyst/shotcaller'>https://github.com/amethyst/shotcaller</a> +cd shotcaller +git checkout ac07a7bfb4224e8af4bd43e6df3afcaa879d4a48 +``` + +In the case that this does not work, there is also an online version: +<a href='https://shotcaller.jojolepro.com/'>https://shotcaller.jojolepro.com/</a> +This version quite a bit older, however. + +Desktop Version: +<img src='./shotcaller.png'/> +Old WASM Build: +<img src='./shotcaller2.png'/> + +WOTFG +================================================================================ +World Of The Fox God is a tile-based MMORPG (multiplayer roguelike/roleplay). +<a href='https://github.com/jojolepro/wotfg'>https://github.com/jojolepro/wotfg</a> + +It is inspired by games like Cataclysm: Dark Days Ahead (graphics and skills), +Path Of Exile (depth of items and skills) and Minecraft Faction servers +(core gameplay ideas). + +It aims to be an anarchist (without hierarchy) game, meaning that there is no +strongly enforced concepts like groups, leaders and chiefs. It is up to players +to communicate, form alliances and figure out how they best want to play +together. + +It also aims to be a hardcore game while still being easy to enjoy, meaning that +it is punishing when you do bad actions, but there will be plenty of room to +enjoy the game and learn from your mistakes. + +To achieve this, we will make death very punishing: You will lose your +character, experience, skills and items. When you create a new character, you +will appear in a random location in the giant world, with no indication of +where you are until you find a map. + +The reason for this is two fold: +- We want to encourage players to cooperate and for this to happen we need to +discourage attacking other players. Since the downside to dying is so high, +attacking players is a risky gamble that not many players would risk to taking. +- Players should be more likely to cooperate with others and should avoid +fighting others in most cases. + +The game also aims to maximise enjoyment while minimising the time spent +actively playing it. To this effect, we took some inspiration from +Runescape's model: Crafting and farming items takes a long time. +This means that you can start crafting a new chestplate, go cook yourself some +food in real life, and come back to a brand new chestplate. + +The time it takes to make something will depend on its rarity and level. +Some items will take 5 seconds to craft, while the best items will take 24 +hours. Crafting recipes are pausable, so you could craft one of those +longer recipe over multiple nights while still actively playing during the day. + +Kind of related to this, the game aims to be strategic and gives you some time +to think about your actions. Game updates happen every 5 seconds. This means +you can only do one thing each 5 seconds, being it to move, continue crafting, +attacking a player or mining some ore. + +This slows the game down quite a bit, removing the stress factor of real-time +games. Since the goal is not to make you press a key every 5 seconds and stay +in front of the game, there is what I call an "Action Queue". It queues your +action that will be executed, one at a time, every 5 seconds. +For example, if you press ddddd, your character will move 5 times right over +the course of 25 seconds. + +Again, while this might seem boring, it is not. The game is meant to be played +while doing other things (working, cooking, watching videos), so it actually +feels fast when you do other things at the same time. The great thing about that +is that it can fill this feeling of "not doing progress in life" while still +encouraging you to do the things you need to do but might not fulfill you. + +Currently, the game only runs in a terminal using ASCII graphics. +Tile-based 2D graphics are planned. Mobile device support is also planned and +a high priority! + +Let's complete this section with some details with the world and some details +about the short-term future of the game. + +The world is huge, 125x125 chunks of 128x128x16 tiles. That's 4 billion tiles! +The current plan is to have a single server containing around 10,000 players. +Depending on how much resources that takes and the number of players on the +game, it is possible that more servers will be created or that the world will be +extended. + +Right now, the game has around a third of the planned "base" features. +- Inventory management +- Crafting +- World generation +- Mining +- Moving around the map +- Player Action Queue +- Picking up items +- Partial implementation of multiplayer + +Here's a preview of some of the planned features for the next couple weeks: +- Add placing tiles in the world +- Complete world chunk saving +- Add description of items at the left of the inventory screen +- Add item dropping +- Add item containers (chests, lockers) +- Show keybinds right side of the screen +- Add timing to crafting (currently, crafting does not take time) +- Add falling and fall damage +- Add mining up (but not down!) +- Limit view to what your character can see +- Event Log at the bottom of the screen + +Underground Layer: +<img src='./wotfg.png'/> +Surface Layer: +<img src='./wotfg2.png'/> +Inventory: +<img src='./wotfg3.png'/> +Crafting: +<img src='./wotfg4.png'/> + +There are way more things I want to talk about, but I will keep those for +future blog posts. + +Amethyst +================================================================================ +I recently joined the Board of Director of the Amethyst Foundation! +All this mean is that is that now I'm in charge of getting the engine back +on track. + +There are a couple ways to do that, so let's start with what we can do +RIGHT NOW. + +First of all, we are making all issues "actionnable". What I mean by this is +that we will ensure that all github issues have a list of task that, once +completed, will lead to the issue being closed. + +This is to make it easy for contributors to understand what they have to do. +It also makes it easy to know which issues we have to close: Issues that have +no clear way to get solved get closed and discussion is encouraged in the RFC +process to come up with a solution there. + +Secondly, Amethyst 0.16.0 NEEDS to be released. The only remaining task to get +there is to update the book with new information concerning the legion port and +update the code examples. + +Finally, I have made a longer term list of tasks to improve the engine and also +time estimations of the work: +- Make all issues actionnable (4h) +- Fix book for legion port (10h) +- Add test_all.sh script and release.sh script (with places to check everything is fine) (4h) +- Publish 0.16 (2h) +- Replace src/ content with game_engine_core (5h) +- Remove hard dependency on git lfs (5h) +- Publish 0.17 (1h) +- Replace stopwatch by rust-stopwatch2 (1h) +- Implement default, serialize, deserialize, debug to more types (2h) +- Explore replacements for amethyst rendering (3h) +- Explore replacements for amethyst ui (3h) +- Look at what code can be moved out of amethyst and into other crates (8h) +- Publish 0.18 (1h) +- Check that we are using nice color crate (1h) +- Implement physics crate with bindings to nphysics_ecs (6h) +- Publish 0.19 (1h) +- Implement mesh editing and querying (ram-side mesh data) (3h) +- Add wgpu renderer (or any renderer with opengl and mobile support) (20+h) +- Publish 0.20 (1h) + +As you can see, there is this "look at what code can be moved out of Amethyst" +item. + +This is because I want Amethyst to follow the example of Minigene: features +should be moved to layer 1 crates, legion glue to layer 2, and Amethyst should +act as layer 3. This is a ton of work for an engine of this size, so it is fair +to assume that Amethyst codebase will contain both layer 2 and layer 3. +I'm still hoping we can get layer 1 out of amethyst and into reusable crates +that will benefit the whole ecosystem! + +Call For Help! +================================================================================ +Wew! This was a long blog post! Still here? Good! + +We need your help! *I* need your help! + +There are a lots of ways you can help, even if you are not familiar with +programming and even if you didn't read the blog post at all! + +Donating on Patreon +-------------------------------------------------------------------------------- +Donating on patreon helps me spend more time working on open source projects! +Whether it is games or game engines, your monetary donation helps create that! + +It is also the easiest and fastest way to help me and the open source game +ecosystem as a whole! + +<a href='https://patreon.com/jojolepro'>https://patreon.com/jojolepro</a> + +Contributing Code/Unit Tests +-------------------------------------------------------------------------------- +There are multiple ways to contribute code. + +In the case of Amethyst and Minigene, it can be as simple as taking layer 1 code +(features) and layer 2 code (Entity Component System systems) and moving them to +small crates. + +In the case of WOTFG and Shotcaller, you can open pull request with features +that you want. Before doing that, it is always a good idea to contact us +to know what is most needed and if your feature is something that would fit well +with the game concepts. + +Finally, for all of those, adding unit tests to ensure that everything is +working like it should is extremely appreciated! + +Contributing Documentation +-------------------------------------------------------------------------------- +Documentation is also something that is very appreciated. +Whether it is just fixing a typo or contributing pages of documentation, +we are very grateful towards anyone writing documentation, blog posts, tutorials +and books! + +Talk about us! +-------------------------------------------------------------------------------- +If none of the previous options sounds like a good fit for you, simply talk +about us! Post the link to this blog post to places you know. Every bit helps! + +Joining/Contacting us +================================================================================ +Here is how you can contact us for those different projects: + +Myself: +- By Mail: +jojolepro [at] jojolepro [dot] com +- On Discord: +jojolepro#8057 +- Patreon: +<a href='https://patreon.com/jojolepro'>https://patreon.com/jojolepro</a> + +Minigene and WOTFG Development Team: +- On Discord: +<a href='https://discord.gg/gb2wENz'>https://discord.gg/gb2wENz</a> + +Amethyst and Shotcaller: +- On Discord: +<a href='https://discord.gg/amethyst'>https://discord.gg/amethyst</a> + </pre> + </article> + <br/> + <footer> + <div> + (C) Joël Lupien 2020-2021 + </div> + <a href="/blog/2021-05-31_minigene_and_the_future/index.txt">View page source</a> + </footer> + </body> +</html> diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/index.txt b/target/html/blog/2021-05-31_minigene_and_the_future/index.txt @@ -0,0 +1,391 @@ +Minigene, Shotcaller, WOTFG, Amethyst and the Future of Rust Gamedev +================================================================================ +Hello and welcome to your ~~daily~~ ~~monthly~~ yearly status update! + +This post is rather long, so feel free to skip sections underlined with dashes, +as they are more in-depth explanations of what was mentioned just before them. + +Let's task about what has been happening in the past few months and what is +coming in the future! + +Minigene +================================================================================ +Minigene is a new game engine. It is meant to fill the empty space between +indie game development and professionnal game development. + +https://github.com/jojolepro/minigene + +By that, I mean that it sits between the "we do everything for you and hold your +hand" approach and the "build everything yourself" approach. + +Minigene is built from a wide collection of small (and not so small) crates. +To understand how it works, we can think of the engine using layers. + +For instance, here are the layers used for the game Shotcaller: +- 4: Game +- 3: Minigene +- 2: Glue +- 1: Features + +Layers Explained +-------------------------------------------------------------------------------- + +Let's start at the bottom, with layer 1: the features. This layer is composed of +many small and specialized crates. For instance, one crate for i18n, one crate +for game inventory and item management, etc... +https://github.com/jojolepro/game_features + +This layer also include crates which aren't "game features" but are +"engine features". +For instance, the crate game_engine_core gives us a structure in which we can +run our game logic using global states. +https://github.com/jojolepro/game_engine_core + +Crates in layer 1 are small and usually aim to have all of their functions +verified using unit tests. They also aim to have clear documentation. +Finally, they aim to limit the number of different ways you can do the same +thing. This is so it is easier to learn how to use them and it also limits +complexity. + +Now, let's talk about layer 2: the glue! +The glue is the part of the engine that takes data from some global storage and +updates/calls the layer 1 features. + +In the case of minigene, we use planck_ecs, the easiest entity-component-system +to use and also the most tested and minimalist. + +At layer 2, we "wrap" the layer one features inside of the glue. +One layer 2 crate can use one or more layer one crate, although we usually try +to limit ourselves to one. + +For instance, we can have a planck_game_features crate that creates Systems +which execute game_features update functions using Components coming from +Planck's World structure. + +Now, layer 3 is simply minigene, the crate. It re-export a bunch of layer 2 +crates into a convenient package. To avoid importing a billion crates when using +minigene, we place the different features into groups and hide them behind +feature gates. + +You can enable those features using: +``` +minigene = { git = "https://github.com/jojolepro/minigene", + features = ["feature1", "feature2", "..."] } +``` + +Finally, layer 4 is the game you want to make. +Usually, it will import minigene and use some of its features. +It will also import some crates that are specific to the needs of the game. + +Here's how it will look in practice: +https://www.figma.com/file/cv7orWvUWfB6teK7RLqu3L/The-New-Amethyst?node-id=0%3A1 + +Quite the mess, I know, but it is the cleanest graph of a full detailed game +engine that I have ever seen. I'll let you imagine how horrible it is for +engines which are not aiming to have small dependencies! + +Let's continue: +You are free to replace any feature of minigene with your own or an equivalent +crate. Minigene is written in such a way that, if you want, you can even use it +alongside another game engine! For more details on this, read the section on +Shotcaller. + +Finally, the engine makes heavy use of event chaining. I discussed of this +extensively here: +https://jojolepro.com/blog/2020-08-20_event_chaining/ + +In short, it allows to drive the execution of systems using events and to +creates events from past events. Here is a quick example: +<bracket-lib event>::char(x) -> InputEvent::KeyPress(x) -> GameEvent::Jump +-> NetworkedAction::PlayerJump(auth_id) -> NetworkEvent::PlayerJumped(entity_id) + +Here, we started with a key press, inserted it in a more convenient structure, +created an event specific to the game we are creating, pushed a network event +to the server and finally notified all clients in the game that we jumped. + +Features Of Minigene +-------------------------------------------------------------------------------- +Currently, Minigene has quite a few features but is far from having all of the +planned features. + +Here are some features that are currently implemented and working: +- ASCII rendering in the terminal +- 2D Tile-Based graphics in a desktop window +- Input handling +- Game inventory management +- Game stats management (health, mana, damage dealt this game, etc...) +- Game engine core (sleeping, executing game frames, managing states) +- Game clock & stopwatch +- Planck ECS integration +- Bracket-lib integration +- Runs on WASM (Web Assembly) + +Planned Features and Changes +-------------------------------------------------------------------------------- +The engine has a lot of planned features, but for now we will mention only +a few of them. + +- Add a command/debug console (clap to events, custom logger output) +- Add network backend nakama-rs +- Add network backend message-io +- Integrate planck_ecs_bundle +- Create bundle with game_features related systems (planck_game_features crate) +- Move code (when applicable) from minigene systems to game_features +- Integrate a 2d renderer to emulate terminal rendering +- Integrate a 2d renderer to render sprites in any position, shape or rotation. +- Choose a math crate that will be used as the base on which we build other + crates. +- Mobile device support (high priority!) + +Shotcaller +================================================================================ +Shotcaller is a MOBA game inspired by DOTA 2 and League of Legends. +https://github.com/amethyst/shotcaller + +It is built on minigene and was the reason the engine was created in the first +place. Development of this game is currently on hold until more funds are +available. + +The game can be tested using: +``` +git clone https://github.com/amethyst/shotcaller +cd shotcaller +git checkout ac07a7bfb4224e8af4bd43e6df3afcaa879d4a48 +``` + +In the case that this does not work, there is also an online version: +https://shotcaller.jojolepro.com/ +This version quite a bit older, however. + +Desktop Version: +./shotcaller.png +Old WASM Build: +./shotcaller2.png + +WOTFG +================================================================================ +World Of The Fox God is a tile-based MMORPG (multiplayer roguelike/roleplay). +https://github.com/jojolepro/wotfg + +It is inspired by games like Cataclysm: Dark Days Ahead (graphics and skills), +Path Of Exile (depth of items and skills) and Minecraft Faction servers +(core gameplay ideas). + +It aims to be an anarchist (without hierarchy) game, meaning that there is no +strongly enforced concepts like groups, leaders and chiefs. It is up to players +to communicate, form alliances and figure out how they best want to play +together. + +It also aims to be a hardcore game while still being easy to enjoy, meaning that +it is punishing when you do bad actions, but there will be plenty of room to +enjoy the game and learn from your mistakes. + +To achieve this, we will make death very punishing: You will lose your +character, experience, skills and items. When you create a new character, you +will appear in a random location in the giant world, with no indication of +where you are until you find a map. + +The reason for this is two fold: +- We want to encourage players to cooperate and for this to happen we need to +discourage attacking other players. Since the downside to dying is so high, +attacking players is a risky gamble that not many players would risk to taking. +- Players should be more likely to cooperate with others and should avoid +fighting others in most cases. + +The game also aims to maximise enjoyment while minimising the time spent +actively playing it. To this effect, we took some inspiration from +Runescape's model: Crafting and farming items takes a long time. +This means that you can start crafting a new chestplate, go cook yourself some +food in real life, and come back to a brand new chestplate. + +The time it takes to make something will depend on its rarity and level. +Some items will take 5 seconds to craft, while the best items will take 24 +hours. Crafting recipes are pausable, so you could craft one of those +longer recipe over multiple nights while still actively playing during the day. + +Kind of related to this, the game aims to be strategic and gives you some time +to think about your actions. Game updates happen every 5 seconds. This means +you can only do one thing each 5 seconds, being it to move, continue crafting, +attacking a player or mining some ore. + +This slows the game down quite a bit, removing the stress factor of real-time +games. Since the goal is not to make you press a key every 5 seconds and stay +in front of the game, there is what I call an "Action Queue". It queues your +action that will be executed, one at a time, every 5 seconds. +For example, if you press ddddd, your character will move 5 times right over +the course of 25 seconds. + +Again, while this might seem boring, it is not. The game is meant to be played +while doing other things (working, cooking, watching videos), so it actually +feels fast when you do other things at the same time. The great thing about that +is that it can fill this feeling of "not doing progress in life" while still +encouraging you to do the things you need to do but might not fulfill you. + +Currently, the game only runs in a terminal using ASCII graphics. +Tile-based 2D graphics are planned. Mobile device support is also planned and +a high priority! + +Let's complete this section with some details with the world and some details +about the short-term future of the game. + +The world is huge, 125x125 chunks of 128x128x16 tiles. That's 4 billion tiles! +The current plan is to have a single server containing around 10,000 players. +Depending on how much resources that takes and the number of players on the +game, it is possible that more servers will be created or that the world will be +extended. + +Right now, the game has around a third of the planned "base" features. +- Inventory management +- Crafting +- World generation +- Mining +- Moving around the map +- Player Action Queue +- Picking up items +- Partial implementation of multiplayer + +Here's a preview of some of the planned features for the next couple weeks: +- Add placing tiles in the world +- Complete world chunk saving +- Add description of items at the left of the inventory screen +- Add item dropping +- Add item containers (chests, lockers) +- Show keybinds right side of the screen +- Add timing to crafting (currently, crafting does not take time) +- Add falling and fall damage +- Add mining up (but not down!) +- Limit view to what your character can see +- Event Log at the bottom of the screen + +Underground Layer: +./wotfg.png +Surface Layer: +./wotfg2.png +Inventory: +./wotfg3.png +Crafting: +./wotfg4.png + +There are way more things I want to talk about, but I will keep those for +future blog posts. + +Amethyst +================================================================================ +I recently joined the Board of Director of the Amethyst Foundation! +All this mean is that is that now I'm in charge of getting the engine back +on track. + +There are a couple ways to do that, so let's start with what we can do +RIGHT NOW. + +First of all, we are making all issues "actionnable". What I mean by this is +that we will ensure that all github issues have a list of task that, once +completed, will lead to the issue being closed. + +This is to make it easy for contributors to understand what they have to do. +It also makes it easy to know which issues we have to close: Issues that have +no clear way to get solved get closed and discussion is encouraged in the RFC +process to come up with a solution there. + +Secondly, Amethyst 0.16.0 NEEDS to be released. The only remaining task to get +there is to update the book with new information concerning the legion port and +update the code examples. + +Finally, I have made a longer term list of tasks to improve the engine and also +time estimations of the work: +- Make all issues actionnable (4h) +- Fix book for legion port (10h) +- Add test_all.sh script and release.sh script (with places to check everything is fine) (4h) +- Publish 0.16 (2h) +- Replace src/ content with game_engine_core (5h) +- Remove hard dependency on git lfs (5h) +- Publish 0.17 (1h) +- Replace stopwatch by rust-stopwatch2 (1h) +- Implement default, serialize, deserialize, debug to more types (2h) +- Explore replacements for amethyst rendering (3h) +- Explore replacements for amethyst ui (3h) +- Look at what code can be moved out of amethyst and into other crates (8h) +- Publish 0.18 (1h) +- Check that we are using nice color crate (1h) +- Implement physics crate with bindings to nphysics_ecs (6h) +- Publish 0.19 (1h) +- Implement mesh editing and querying (ram-side mesh data) (3h) +- Add wgpu renderer (or any renderer with opengl and mobile support) (20+h) +- Publish 0.20 (1h) + +As you can see, there is this "look at what code can be moved out of Amethyst" +item. + +This is because I want Amethyst to follow the example of Minigene: features +should be moved to layer 1 crates, legion glue to layer 2, and Amethyst should +act as layer 3. This is a ton of work for an engine of this size, so it is fair +to assume that Amethyst codebase will contain both layer 2 and layer 3. +I'm still hoping we can get layer 1 out of amethyst and into reusable crates +that will benefit the whole ecosystem! + +Call For Help! +================================================================================ +Wew! This was a long blog post! Still here? Good! + +We need your help! *I* need your help! + +There are a lots of ways you can help, even if you are not familiar with +programming and even if you didn't read the blog post at all! + +Donating on Patreon +-------------------------------------------------------------------------------- +Donating on patreon helps me spend more time working on open source projects! +Whether it is games or game engines, your monetary donation helps create that! + +It is also the easiest and fastest way to help me and the open source game +ecosystem as a whole! + +https://patreon.com/jojolepro + +Contributing Code/Unit Tests +-------------------------------------------------------------------------------- +There are multiple ways to contribute code. + +In the case of Amethyst and Minigene, it can be as simple as taking layer 1 code +(features) and layer 2 code (Entity Component System systems) and moving them to +small crates. + +In the case of WOTFG and Shotcaller, you can open pull request with features +that you want. Before doing that, it is always a good idea to contact us +to know what is most needed and if your feature is something that would fit well +with the game concepts. + +Finally, for all of those, adding unit tests to ensure that everything is +working like it should is extremely appreciated! + +Contributing Documentation +-------------------------------------------------------------------------------- +Documentation is also something that is very appreciated. +Whether it is just fixing a typo or contributing pages of documentation, +we are very grateful towards anyone writing documentation, blog posts, tutorials +and books! + +Talk about us! +-------------------------------------------------------------------------------- +If none of the previous options sounds like a good fit for you, simply talk +about us! Post the link to this blog post to places you know. Every bit helps! + +Joining/Contacting us +================================================================================ +Here is how you can contact us for those different projects: + +Myself: +- By Mail: +jojolepro [at] jojolepro [dot] com +- On Discord: +jojolepro#8057 +- Patreon: +https://patreon.com/jojolepro + +Minigene and WOTFG Development Team: +- On Discord: +https://discord.gg/gb2wENz + +Amethyst and Shotcaller: +- On Discord: +https://discord.gg/amethyst diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/shotcaller.png b/target/html/blog/2021-05-31_minigene_and_the_future/shotcaller.png Binary files differ. diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/shotcaller2.png b/target/html/blog/2021-05-31_minigene_and_the_future/shotcaller2.png Binary files differ. diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/wotfg.png b/target/html/blog/2021-05-31_minigene_and_the_future/wotfg.png Binary files differ. diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/wotfg2.png b/target/html/blog/2021-05-31_minigene_and_the_future/wotfg2.png Binary files differ. diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/wotfg3.png b/target/html/blog/2021-05-31_minigene_and_the_future/wotfg3.png Binary files differ. diff --git a/target/html/blog/2021-05-31_minigene_and_the_future/wotfg4.png b/target/html/blog/2021-05-31_minigene_and_the_future/wotfg4.png Binary files differ. diff --git a/target/html/blog/index.html b/target/html/blog/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/focks/index.html b/target/html/focks/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/index.html b/target/html/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/projects/index.html b/target/html/projects/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/target/html/quotes/index.html b/target/html/quotes/index.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article> diff --git a/template.gmi b/template.gmi @@ -1,9 +1,9 @@ # Jojolepro => blog Blog -=> quotes Quotes => projects Projects -=> https://git.jojolepro.com Git +=> quotes Quotes => https://github.com/jojolepro/ GitHub +=> https://git.jojolepro.com Archives %%CONTENT%% diff --git a/template.html b/template.html @@ -42,11 +42,11 @@ <a href=/><b>Jojolepro</b></a> <br/> <a href=/blog>Blog</a> - <a href=/quotes>Quotes</a> <a href=/projects>Projects</a> + <a href=/quotes>Quotes</a> <!--<a href=/focks>Focks</a>--> - <a href=https://git.jojolepro.com>Git</a> <a href=https://github.com/jojolepro/>GitHub</a> + <a href=https://git.jojolepro.com>Archive</a> </nav> <br/> <article>