A generic skill system tailored for Godot's design. #29
Replies: 2 comments
-
Do you think it makes sense for characters to share skills? Lets say I'm working on a combat turn-based game where different units could reuse skills acquired by individual members of a group/team. Sort of like clan/family skill. When you describe the skill system, it reminds me of a weapon system which seems to share common logic. The only difference is that skills are more "magical" rather than "physical". See this GodotWeapons plugin for instance. In there different components can affect how a weapon behaves. In this case, sharing skills would be something like using the same arsenal of weapons between members of a team.
The mentioned plugin is already too general purpose for me so I've felt like I could write some more specific system for that, but I guess this is with any software, it just needs better documentation and examples. |
Beta Was this translation helpful? Give feedback.
-
Well, if two in-game characters can both simultaneously have the same spell learned / have the same weapon equipped, then characters would be sharing logic for the Skill. That is what I meant.
The only "magic" is in the examples I used, but you could presumably use this same system for a shooter a la Borderlands (was actually one of the use cases I thought of while designing it).
Right. But it would also be for even just parts of a Skill (re-using Targeters or Effects to compose new Skills).
Very true. Maybe I'll find ways of simplifying the design as I dig into it further. It'll be a while before I can really devote much time to it anyway. |
Beta Was this translation helpful? Give feedback.
-
Context
Working on an RPG. Characters can use several skills of varying nature. However, many game genres can include highly complex, interlocking skill systems. I would rather develop an open-source subsystem (either a module, GDNative plugin, or Mono plugin) that can deal with this problem, to be maintained by the community.
Problem
Feature requirements include:
Suggestion
Create a data-driven, multi-threaded Server API with nodes and resources that work together to fulfill the requirements.
Solution
I am considering doing all of the following:
Split the work of a Skill up into parts.
Make a Skill's parts be resources instead of nodes.
The only node that is necessary for the system to be visualized independently is the Skill node. Targeters and Effects are more of a configuration for how the Skill should behave and do not need a visual editor of their own. Performance could be improved drastically if what previously would be tens of nodes in a hierarchy (so potentially thousands of more nodes in the world than necessary), can now instead be a single node with a few nested resource arrays.
If any sort of process or input callback is necessary for an Effect or Targeter, we can pass requisite information to the type's callback manually (delta, input event, etc.). This would be similar to how Unity's MonoBehaviour components receive callbacks from their attached GameObject.
Make a Server pattern for multi-threading mutation requests from Skill nodes in phases.
source/power
,target/health
, etc.Make a SkillUser node. Skills are parented under a SkillUser and may only target other SkillUser nodes. Why? Because SkillUsers have state information necessary to apply or receive a Skill's instructions.
My biggest concern with this idea is that it would end up being a lot of work for not much gain as you'd still be going through repeated scripting API callbacks to fetch the data from nodes with roles in the Effect mutation parameters. The level of separation there is between the data and the logic could result in a lot of wasted time just trying to lookup data. I do however think that if we can minimize the complexity and flexibly repurpose data and logic for the skills, then we can achieve the goal well.
With that said, I also feel like the current system is likely too complicated for someone to pick up easily, so I'm looking for ways to maintain the power/flexibility it could present while also simplifying it for learning purposes.
I appreciate any feedback, whether its thoughts on ways to improve the design or a suggestion to go with something else entirely.
Beta Was this translation helpful? Give feedback.
All reactions