{"id":15090142,"url":"https://github.com/relintai/broken_seals","last_synced_at":"2025-04-06T03:08:56.248Z","repository":{"id":38102315,"uuid":"222893537","full_name":"Relintai/broken_seals","owner":"Relintai","description":"An open source third person action RPG with multiplayer support.","archived":false,"fork":false,"pushed_at":"2023-10-09T10:46:23.000Z","size":28274,"stargazers_count":400,"open_issues_count":0,"forks_count":24,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-04-06T03:08:44.492Z","etag":null,"topics":["3d","action","game","godot","multiplayer","rpg"],"latest_commit_sha":null,"homepage":"","language":"GDScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Relintai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null},"funding":{"github":null,"patreon":"relintai","open_collective":null,"ko_fi":"relintai","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2019-11-20T08:57:35.000Z","updated_at":"2025-03-25T12:17:02.000Z","dependencies_parsed_at":"2024-04-11T23:44:47.363Z","dependency_job_id":"2df284e9-1875-4216-8096-75aa47c3d20a","html_url":"https://github.com/Relintai/broken_seals","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Relintai%2Fbroken_seals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Relintai%2Fbroken_seals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Relintai%2Fbroken_seals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Relintai%2Fbroken_seals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Relintai","download_url":"https://codeload.github.com/Relintai/broken_seals/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247427006,"owners_count":20937201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d","action","game","godot","multiplayer","rpg"],"created_at":"2024-09-25T09:21:58.944Z","updated_at":"2025-04-06T03:08:56.216Z","avatar_url":"https://github.com/Relintai.png","language":"GDScript","funding_links":["https://patreon.com/relintai","https://ko-fi.com/relintai"],"categories":[],"sub_categories":[],"readme":"# Broken Seals\n\nA 3D third person RPG. With both multiplayer, and singleplayer capabilities.\n\nThe main gameplay-loop goal is to create an experience with enough complexity and depth, that can rival the more old-school MMO- and action rpgs, because nowadays I feel like that is something that got lost.\n\nI want the game to run on every platform, but the game design is PC first. From the testing I've done this is not going to be an issue.\n\nThis project now uses the ![Pandemonium Engine](https://github.com/Relintai/pandemonium_engine), which is my custom version of godot.\n\nThe project also requires the presence of some of my engine modules, Pandemonium contains all of them. See [here](https://github.com/Relintai/pandemonium_engine/tree/master/modules).\n\nYou can get binaries under the releases tab [here](https://github.com/Relintai/broken_seals/releases).\\\nYou can also try a live version running in the browser [here](https://relintai.github.io/broken_seals/).\n\nUnfortunately the web editor needs custom http headers to work and I can't set that up from github.io, so right now I don't have a hosted version of that.\n\n#### On Desktop\n\n![Broken Seals desktop](pictures/screenshot_desktop.jpg)\n\n#### On Touchscreens\n\n![Broken Seals on touchscreen](pictures/screenshot_touchscreen.jpg)\n\n## Status \n\nCurrently I'm working content.\n\nRoadmap:\n\n- Have a few animal models that can be used for the starter zones.\n- Have a few building models.\n- Add in sounds.\n- Have some ambient sounds as music.\n- Set up a proper starter zone.\n- Implement the naturalist's spells.\n- Add a male model.\n- Add more classes.\n- Then start working on new zones.\n\nSome planned changes that will come sometime:\n\n- Add support for multiple worlds. (Just have to make use of the new World class in the engine. The scene tree (Entities and Entity Bodies) will need small changes.)\n- Fix up multiplayer, and implement missing things (like animations for clients).\n\n## Features\n\n### Multiplayer\n\nMultiplayer was broken for quite a while, so currently it has a lot more bugs than it used to.\nMost of these should be relativelty easy to fix.\n\n- Authoritative server implementation. (Except for movement. Can be done though, I'll do it eventually, but it's usual for these kind of games to not have authoritative movement.)\n- You can create, and join to servers.\n- Movement works. Although the animations are not yet implemented for client players.\n- Targeting works.\n- Spell casting works. Although auras have some issues for now.\n- Inventory management should work.\n- Stuff like vendors, trainers should all work. I think except for crafting (I think just some methods need to be marked as RPCs, and they might need to need to call eachother via rpcs).\n\n### Characters\n\n- Main and secondary stats all work, they are also customizable in the project settings. They also have built in maint stat -\u003e secondary stat conversion support.\n- Character resources all work and scriptable. (Like health, mana, speed, energy etc) Also you can dynamically add it and remove it from a character.\n- Tab targeting support.\n- Spells, and auras are fully scriptable, and networked.\n- Actionbar, actionbar profiles support.\n- Spell learning support.\n- Talent support, with multiple talent trees.\n- Loot.\n- Equipment support including weapons, clothes, and also other attachments. Although starter gear support is not yet finished.\n- Support for changing clothes via texture merging.\n- Support for changing parts of models via clothes. Also support for alternative bodyparts.\n- Character models are using merged meshes and textures, with generated LOD. (This is also multi threaded, with fallback when no threads are available.) This system is using MeshDataResources.\n- Generic attach point support for the character skeletons. (Spell cast particle effects, spell effects, also the same system can be used for weapons.)\n- Interaction support.\n- Vendors, Trainers, Crafting.\n- Fully scriptable ai support.\n- Control over characters can be easily changed by the server, and the character bodies are scripted to act accordingly automatically. For example mind control effects can be implemented with this system.\n\nMissing:\n\n- Character customization support (like selecting hairtyles). It's mostly there, but some crucial features are still missing.\n- Temporary character model change support. Think of polymorph effects, toys etc. Needs the character customization support first.\n\n### Terrain\n\n- Multi threaded chunk generation. It will even work when no threads are available, also in this case the work gets distributed over multiple frames (although one of the steps is a bit too long, so it still needs some tweaks).\n- Prop system. You can serialize scenes into a more efficient format than scene files. These can contain lights, meshes, rooms and portals, etc. The system is scriptable. Scene hierarchies also work.\n- PropInstance node, which can mesh and put props into the scene.\n- Per chunk material support, even for props.\n- Terraman: prop support, even with mesh (and texture) merging. If you look at the trees on the screenshot, they are merged together per chunk, and they all share the material, and shader. Also if you serialize lights into props, they are added as vertex lights.\n- Terraman and PropInstance: Vertex light support. You can add vertex lights (via code, or the prop system), and the meshes will be colored with it.\n- Terraman: Vertex colors are also used to achieve the main style. (RAO).\n- Terraman: Vertex color based ambient occlusion support.\n- Terraman and PropInstance: LOD support, even for prop meshes.\n- Terraman and PropInstance: LOD generation is scriptable.\n- Dungeon generation support via a separate prop based system. Dungeons are generated below ground, with teleporters to them. Also support for turning off the terrain engine while the player is inside a dungeon.\n- Procedural world generation. [See here](#terrain-generation).\n\n### UI\n\n- Menu and game ui.\n- Actionbars with keybind support. Also the icons that you drag to the actionbar actually gets merged into the ui's texture to reduce drawcalls.\n- Character, talent, spellbook, crafting, inventory, loot, vendor, trainer windows are all implemented.\n- Easily scriptable options dialog.\n- The menu has full support for keyboard / controller navigation. (The game itself misses it at the moment though.)\n- Touchscreen controls. It will also make the buttons bigger if it detects a touchscreen.\n- Keybind window.\n- About window.\n\n## Project overview\n\nAs stated in the opening section the project uses a custom version of the godot engine.\n\nThe project's workflow has been set up so you can easily compile this version for yourself if you want to.\n\nSee the [Compiling](#compiling) section if you want to know how to do this.\n\n### Engine\n\nCurrently the [Pandemonium Engine](https://github.com/Relintai/pandemonium_engine) is used as the engine for this project,\nwhich is a heavily customized verison of the [Godot game engine](https://godotengine.org/). It's based on the 3.x branch. \n\nIt contains my engine modules, and also it got significanlty slimmed down compared to vanilla Godot.\n\nFor a more in-depth changelog see it's changelog file [here](https://github.com/Relintai/pandemonium_engine/blob/master/CHANGELOG.md).\n\n### Game\n\nThe [/game](https://github.com/Relintai/broken_seals/tree/master/game) folder contains the game's code and assets.\nThis is the folder you are supposed to open in the editor.\n\nThe game's folder structure should be (hopefully) mostly self explanatory.\n\n#### Game Modules\n\nI designed the game's code to be highly modular, so I created a [loader module](https://github.com/Relintai/broken_seals/tree/master/game/scripts/game_modules). \\\nIt will look for files named ` game_module.tres ` and call methods on them on certain events.\\\nThis system uses the [DataManager](https://github.com/Relintai/broken_seals/blob/master/game/scripts/game_modules/DataManager.gd) singleton.\n\nFor example this is how the ui initializes itself:\n\nThe player's [body](https://github.com/Relintai/broken_seals/blob/master/game/player/Body.gd) script requests the ui nodes from the [DataManager](https://github.com/Relintai/broken_seals/blob/master/game/scripts/game_modules/DataManager.gd) singleton (like ` var ui = DataManager.request_instance(DataManager.PLAYER_UI_INSTANCE) `). And then the data manager will instance it's ` player_ui ` scene, and call all module's ` on_request_instance ` methods, while also passing the newly instanced scene to them.\n\nThese module scripts are also responsible for collecting all spells and then setting them into the ESS singleton, so they are actually castable.\n\nThis is the [module](https://github.com/Relintai/broken_seals/blob/master/game/modules/entity_classes/naturalist/game_module.tres) for the naturalist, and it's [ResourceDB](https://github.com/Relintai/broken_seals/blob/master/game/modules/entity_classes/naturalist/resource_db.tres), which will be merged into a central resource db for ESS. \n\nNote that the module resources are sorted by their resource paths, so spells should always get the same id, on every platform every time.\nThis is to optimize networkd spell casts.\n\nMost of the game assets ended up under the modules folder [here](https://github.com/Relintai/broken_seals/tree/master/game/modules) for this reason,\nhowever these might get moved, if I find a better arrangement.\n\n#### Terrain generation\n\nThe terrain generation is now handled by the new [world_generator](https://github.com/Relintai/broken_seals/tree/master/game/addons/world_generator)\naddon. \n\nRight now the terrain is only going to be pseudo-random, as generating proper connected worlds are kind of super difficult,\nespecially if you also have to mesh them in 3d. \\\nI think this solution can be extended later to be able to do a full continent / world randomization / generation. \n\nFor now the idea is that we have a World resource, this contains Continents, those zontain Zones, and those contain SubZones.\n\nThe position and size is predetermined by the designer. And then when a chunk needs to be generated it gets put into this world, and then these generate it's data.\n\n- World does mostly nothing on it's own for now, except for holding continents.\n- Continents handle things like oceans, and big mountains.\n- Zones generate proper terrain, and add props. They need to blend into continents.\n- SubZones can be used as spawners, prop spawners, or they can even do terrain modifications.\n\nSo when a chunk needs to be generated, first the world gets it, then all continents which intersect with it's position,\nthen all zones which intersect with it's position, then all subzones which intersect with it's position.\n\nThe editor contains an addon to help with editing the world.\n\n## Editing the game\n\nGrab the engine itself, and then open the project inside the `game` folder.\n\nAfter the initial import it might need an editor restart, however everything should work after that.\n\nIf you want to use master, you will likely need to build the editor for it if the c++ side had breaking changes since the last release.\n\n## Compiling\n\nFirst make sure, that you have everything installed to be able to compile the engine. \nSee the [official docs for compiling Godot](https://docs.godotengine.org/en/3.4/development/compiling/index.html) for more info. \nMy setup/compile script uses the same tools, so you don't need to install anything else.\n\nEven though the project doesn't use godot anymore, their docs are still sufficient.\n\nNow let's clone this repository:\n\n``` git clone https://github.com/Relintai/broken_seals ```\n\ncd into the new folder:\n\n``` cd broken_seals ```\n\nNow let's run the project's setup script, by calling scons without arguments.\n\n``` scons ```\n\nThis will clone and setup the engine, and all of the required modules into a new `engine` folder inside the project, using http.\n\n(If you want to use the github's ssh links append `repository_type=ssh` like ``` scons repository_type=ssh ```)\n\nOnce it is done you can compile the engine.\n\nTo build the editor on windows with 4 threads run the following command:\n\n``` scons bew -j4 ```\n\nTo build the editor on linux with 4 threads run the following command:\n\n``` scons bel -j4 ```\n\nI call this feature of the setup script build words. [See](#build-words).\n\nOnce the build finishes you can find the editor executable inside the `./engine/bin/` folder.\n\nFor convenience there is a provided `editor.sh`, or `editor.bat` for running it from the project's folder.\nThese will create a copy, so you can even compile while the editor is running.\n\nAlternatively if you don't want to use build words, you can also just go into the engine folder:\n\n``` cd engine ```\n\nAnd compile godot as per the [official docs](https://docs.godotengine.org/en/latest/development/compiling/index.html).\n\n### Build words\n\nThe project's setup script contains support for \"build words\". These can be used from the root of this project.\n\nFor example to build the editor for windows with 4 threads you can use:\n\n``` scons bew -j4 ```\n\nThe first argument must start with b (build), then it needs to be followed by a few abbreviations (the order does not matters)\n\nThe rest of the arguments will be passed directly to godot's scons script.\n\n#### Editor\n\nAppend `e` to build with `tools=yes` a.k.a. the editor.\n\n``` scons bew -j4 ```\n\nif you omit `e`, the system will build the export template for you. For example:\n\n``` scons bw -j4 ```\n\nThis will be the `release_debug` windows export template.\n\n#### Platform abbreviations\n\n`l`: linux \\\n`w`: windows \\\n`a`: android \\\n`j`: Javascript \\\n`i`: iphone (Not yet finished, use `build_ios.sh`, and `build_ios_release.sh`) \\\nMac OSX: Not yet finished, use `build_osx.sh`\n\n#### Target abbreviations\n\nBy default the system builds in release_debug.\n\nAppend `d` for debug, or `r` for release.\n\n``` scons bewd -j4 ```\n\nbuild editor windows debug\n\n``` scons bwr -j4 ```\n\nbuild windows release (this will build the windows release export template)\n\n#### Shared modules\n\nNote: This only works on linux!\n\nappend `s` to the build string. \n\nOptionally you can also make the build system only build a target module, by appending one of these:\n\n`E`: Entity Spell System \\\n`T`: Texture Packer \\\n`V`: Voxelman \\\n`W`: World Generator \\\n`P`: Procedural Animations\n\nExample:\n\n``` scons belsE -j4 ```\n\nbuild editor linux shared (Entity Spell System) with 4 threads\n\nNote: to easily run the editor you can use the `editor.sh` or `editor.bat` in the root of the project.\n\n#### Other\n\nAppend `v` to pass the `vsproj=yes` parameter to the build script. This will generate Visual Studio project files.\\\nAppend `c` to pass the `compiledb=yes` parameter to the build script. This is a new feature in 3.x to have this disabled by default to lessen compile times.\n\n#### Postfixes\n\nThere are a few postfixes for the build words. These are more complex options. You have to append them to your build word with an underscore.\n\nYou can use as many as you want.\n\nFor example:\n\n``` scons bel_slim_latomic -j4 ```\n\n##### slim\n\nWith this postfix you can build a slimmed down version of the engine. This disables quite a few unneeded modules.\n\n``` scons bel_slim -j4 ```\n\n##### latomic\n\nIf you get linker errors while building the game/editor about undefined referenced with atomic related functions you can use this postfix.\nIt will add the ` -latomic ` command line switch to the linker flags.\n\nI ran into this issue while building on a raspberry pi 4 with the x11 platform. It might be related to the recent reworks to threading.\n\n``` scons bel_latomic -j4 ```\n\n##### strip\n\nAppends `debug_symbols=no` to the build command, which will strip the resulting binary from debug symbols.\n\n``` scons bel_strip -j4 ```\n\n##### threads\n\nAppends `threads_enabled=yes` to the build command. Useful for building the editor for html.\n\n``` scons bej_threads -j4 ```\n\n#### Scons cache, and sdk locations\n\nIn order to use scons cache and to tell the build system where some of the required sdks are located you usually \nhave to use environment variables. Most of the time you might just want to add them globally, \nhowewer this is sometimes unfeasible (e.g. you don't have administrator access, or you just want to have\nmultiple sdk versions installed).\n\nIn order to solve this a build config file was added.\n\nIf you want to use the config simply rename the provided `build.config.example` to `build.config`, and customize \nthe settings inside.\n\n### Manual Setup\n\nIf you you don't want to use the setup script (or just want to know what it actually does), \nthis section will explain how to set everything up manually.\n\nFirst clone the engine:\n\n``` git clone https://github.com/Relintai/pandemonium_engine ```\n\nNow if you look at the [HEADS file](https://github.com/Relintai/broken_seals/blob/master/HEADS).\n\nIt contains the commit hashes for that particular revision for every module and the engine.\nThe engine now contains all the modules, so at the moment only worry about the engine's commit hash.\n\nYou need to go and checkout the proper commit for it.\n\nNow you can go ahead and compile the engine normally.\n\n## Pulling upstream changes\n\nFirst pull the changes by calling\n\n``` git pull orgin master ```\n\nThen just run `scons`, to will update the modules.\n\n## Upgrading the modules\n\nNote: this is how to update the HEADS file. Normally you don't need to do this.\n\nIf you want to update the modules, and the engine to the latest, you can use (`action=update`):\n\n``` scons a=u ``` \n\nYou can also update different targets: `all`, `engine`, `modules`, `all_addons`, `addons`, `third_party_addons`\n\nFor example to update the engine to the latest: ``` scons a=u target=engine ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frelintai%2Fbroken_seals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frelintai%2Fbroken_seals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frelintai%2Fbroken_seals/lists"}