{"id":18467295,"url":"https://github.com/paulschweizer/dungeoncrawler","last_synced_at":"2026-04-29T15:39:48.268Z","repository":{"id":83700788,"uuid":"80882257","full_name":"PaulSchweizer/DungeonCrawler","owner":"PaulSchweizer","description":"Extendable, json-based RPG","archived":false,"fork":false,"pushed_at":"2018-02-25T09:12:26.000Z","size":3656,"stargazers_count":1,"open_issues_count":16,"forks_count":0,"subscribers_count":3,"default_branch":"dev","last_synced_at":"2025-02-16T17:56:30.782Z","etag":null,"topics":["game-development","rpg","unity"],"latest_commit_sha":null,"homepage":"https://paulschweizer.github.io/DungeonCrawler/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PaulSchweizer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"publiccode":null,"codemeta":null}},"created_at":"2017-02-04T00:52:40.000Z","updated_at":"2024-03-12T10:32:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"299efd07-41fe-42e6-a692-c43800f81694","html_url":"https://github.com/PaulSchweizer/DungeonCrawler","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PaulSchweizer%2FDungeonCrawler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PaulSchweizer%2FDungeonCrawler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PaulSchweizer%2FDungeonCrawler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PaulSchweizer%2FDungeonCrawler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PaulSchweizer","download_url":"https://codeload.github.com/PaulSchweizer/DungeonCrawler/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252534186,"owners_count":21763731,"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":["game-development","rpg","unity"],"created_at":"2024-11-06T09:19:28.167Z","updated_at":"2026-04-29T15:39:43.229Z","avatar_url":"https://github.com/PaulSchweizer.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"Master: [![Build status](https://ci.appveyor.com/api/projects/status/a92mehch8obru8iy?svg=true)](https://ci.appveyor.com/project/PaulSchweizer/dungeoncrawler) [![Coverage Status](https://coveralls.io/repos/github/PaulSchweizer/DungeonCrawler/badge.svg?branch=master)](https://coveralls.io/github/PaulSchweizer/DungeonCrawler?branch=master)\n\nDev: [![Coverage Status](https://coveralls.io/repos/github/PaulSchweizer/DungeonCrawler/badge.svg?branch=dev)](https://coveralls.io/github/PaulSchweizer/DungeonCrawler?branch=dev)\n\nDocs: https://paulschweizer.github.io/DungeonCrawler/\n\n# DungeonCrawler\n\n1. Dialogs are managed with InkleWriter, a custom parser and custom classes for the dialogs.\n\n2. Data management with Google Spreadsheets and custom google script extensions.\n\n3. Serialization data format is JSON.\n\n# Different interaction levels in the game\nWorldmap\n  |\n  Location\n    |\n    Cell\n      |\n      Situation\n        |\n        Action\n\n## Worldmap\n- [ ] Travel between locations\n- [ ] Explore new territories\n- [ ] Random encounters during traveling\n- [ ] Hunting\n- [ ] Collecting herbs\n- [ ] Camping\n\n## Location\n- [x] Take control of the characters and explore the location\n- [ ] Isometric top down perspective\n- [x] Location is made up of Cells\n\n## Cell\n- [x] Building blocks for a location\n- [ ] Decorative elements\n- [ ] Items\n- [ ] NPCs\n- [ ] Enemies\n- [ ] Obstacles\n- [ ] Each cell has it's defined content randomly placed on the Cell\n- [x] A flat quad\n- [x] NavMesh has to be figured out\n\n## Situation\nThe situational state of the game.\n\n- [x] Exploration\n- [ ] Combat\n- [ ] Conversation\n- [ ] Trade\n- [ ] Cinematic (=\u003e Displaying story text)\n\n## Action\nThe action that a Character takes, basically the used Skill.\n\n- [ ] Attack\n- [ ] Magic\n- [ ] Use Item\n- [ ] Other Skills ...\n\n\n# Skill and Combat System - Driven by Aspects\nSkills have a base value ranging from 0 to 10.\n\nThe base value is altered by Aspects of the Character that correlate with the current Situation.\nAspects are traits that define and describe anything in the game.\n\nThese Aspects can be beneficial or counterproductive to the action that the Character wants to take and thus add or subtract from the Skill's base value.\n\nExample:\n\n    John the Ranger is known for having defeated the white #wolf. He is a child of the #wilderness. But he is afraid of #caverns.\n\nEach tag describes an aspect of the Player Character.\n\n    John is exploring #dark #caverns and stumbles upon a #hungry #northern #wolf.\n\nThe wolf attacks and we find ourselves in a MeleeCombat Situation. John has to slay the attacking beast. These are his Stats:\n\n```json\n\"Skills\": {\n    \"MeleeCombat\": 2,\n    \"Stealth\": 1\n},\n\"Aspects\": [\n    {\n        \"Name\": \"Master of the white #wolf\",\n        \"Skills\": [\"MeleeCombat\", \"Stealth\"],\n        \"Bonus\": 1\n    },\n    {\n        \"Name\": \"Child of the #wilderness\",\n        \"Skills\": [\"Stealth\"],\n        \"Bonus\": 0\n    },\n    {\n        \"Name\": \"Afraid of #caverns\",\n        \"Skills\": [\"MeleeCombat\"],\n        \"Bonus\": -1\n    }\n],\n\"Equipment\": {\n    \"Name\": \"Wolfbane\",\n    \"Description\": \"Magic sword against wolves\",\n    \"Skills\": [\"Combat\"],\n    \"Bonus\": 3,\n    \"Type\": \"Weapon\",\n    \"Aspects\": [\n        {\n            \"Name\": \"Slayer of #wolves\",\n            \"Skills\": [\"Combat\"],\n            \"Bonus\": 1\n        }\n    ]\n}\n```\n\nLet's look at the aspects of the situation first:\n    #dark #caverns\n\nNow let's compare these aspects to John the Ranger's aspects:\n    #wolf #wilderness #caverns\n\nThis means that the situation affects his combat skill negatively because he is afraid in these dark #caverns.\n\nNow, let's analyze the action, MeleeCombat. The opponent is a #wolf and since John has experience with wolves, he gets a bonus of +1 on his action.\n\nJohn also wields Wolfbane, a magic sword against wolves that will be helpful.\n\nThe final MeleeCombat value for this action in this particular situation for John is:\n\n    2(base) +3(weapon) -1(#caverns) +1(#wolf) +1(#wolf) = 6\n\n## Aspects and Tags\nTags are the key descriptors of the game elements.\nThese tags will trigger the corresponding aspects.\n\nAspects fall in three categories:\n\n1. Add 1 if the situation provides a corresponding tag.\n2. Subtract 1 if the situation does not provide the corresponding tag.\n3. Add 1 if the situation provides a corresponding tag but also subtract 1 if the situation does not provide the corresponding tag.\n\nEach aspect only affects a certain set of Skills.\n\nTag:\n\n```json\n{\n    \"Name\": \"wolf\",\n    \"Alternatives\": [\"wolves\"]\n}\n```\n\nAspect:\n\n```json\n{\n    \"Name\": \"#Master of #wolves\",\n    \"Skills\": [\"Combat\", \"Stealth\"],\n    \"Bonus\": 1\n}\n```\n\n### Acquiring, Removing and Changing Aspects\n- Permanent Aspects can be acquired on Level-Up, through taking Consequences and through completing certain quests.\n- Aspects can be changed on Level-Up.\n- Aspects can be changed and removed in certain areas (e.g. fountain of healing) or on completing certain tasks.\n\n\n## Special Skills\nThese Skills work in conjunction with the basic Skills.\nThey improve the Skill value for an action.\nThey cost activation points.\nThey can have tags assigned that limit their effectiveness to only those certain situations that hold a corresponding tag.\n\nThis Special Skill for example will only work against undead opponents.\n\n```json\n{\n    \"Name\": \"Vanquish the #undead\",\n    \"Bonus\": 4,\n    \"Skills\": [\"Combat\"]\n}\n```\n\n# Combat\n\n## Melee\n\n```cs\nCharacter.Attack(Character attacker,\n                 Skill skill,\n                 Weapon weapon,\n                 Stunt stunt,\n                 Character[] defenders,\n                 Situation situation){\n    int aspectBonus = AspectBonus(Attacker, defenders, situation);\n    int damage = Max(0, skill.Value\n                        + weapon.Bonus\n                        + stunt.Bonus\n                        + aspectBonus\n                        + DFate);\n    for (Character defender in defenders) {\n        defender.ReceiveDamage(damage, attacker);\n    }\n}\n```\n\n```cs\nCharacter.ReceiveDamage(int damage, Character attacker) {\n    if (PhysicalStress.Value + damage \u003e PhysicalStress.MaxValue) {\n        TakeConsequence(damage);\n    }\n    else {\n        PhysicalStress.Value += damage;\n    }\n}\n\nCharacter.TakeConsequence(int damage, Character attacker) {\n    // Try to see if the damage can be absorbed by a consequence\n    for (Consequence consequence in Consequences) {\n        if (damage \u003c= consequence.Capacity \u0026\u0026 !consequence.Active)\n        {\n            consequence.Active = True;\n            return;\n        }\n    }\n\n    // Too much damage, can't take another consequence\n    ChangeState(States.PassedOut);\n}\n```\n\n# Tags\n\n    TagsTable.Synonyms(string tag)\n    TagsTable.Opposing(string tag)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaulschweizer%2Fdungeoncrawler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaulschweizer%2Fdungeoncrawler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaulschweizer%2Fdungeoncrawler/lists"}