This is EXACTLY the kinda stuff I love hearing about in devlog type videos. I love systems design the most and you breaking down things such as hierarchy and how different systems are handled/interact is so enjoyable to me for some reason
Infinite agreeance. The node visual layout alone.... but also the isolation of sections (i.e. the `@export` variables in-editor) visually. All the video edits.... yes, some semblance of perfection. Hope we/I collect great tutorial examples into a compilation someday, for tutorial makers(a skillset in the knowledge world we need more of).
I really like how you covered the design of the game! It feels well laid out and extensible, and moving to 4 with its better handling of resources editor-wise is the right choice. No feedback on the implementation, but I think this is a great window into the thought process of actually creating a tactics type game
I know nothing about developing games. I am starting from scratch. Don't know about any coding, but can do art (haven't tried pixel art yet, but I know it will be easy). I am on this journey because Square Enix won't make another Final Fantasy Tactics game, and if they won't, I'll do it on my fucking own.
I'm with you there brother. No new FFT, no new Tactics Ogre, no new Shining Force. My friends and I have just started the same journey a few weeks ago.
Having just gotten out of the basic godot tutorial and being struck dumb trying to figure out the top-level basic structure to use for my first self developed project, hearing you talk about the way you organised yours and what informed your decisions feels like opening my mind a little
I was trying to make a little tactic game for godot about a half a year ago. It is pleasing to see that I had some similarities in architecture, though it was too much for me when I started AI
Thank you for sharing your experience with Godot and tactic games dev! There are pretty clear and useful explanations you've provided in video. The only thing was hard for me is to catch some of the examples related to the events and reaction loop without some kind of event sequence diagrams or other supportive visuals. Anyway, now I'm going to watch the rest of your videos :)
love this video. showing and explaining actual node structure when designing game is far more valuable then tutorials about features that beginner developer have no idea how to apply
I have a software engineering background and I've been working on a tactics game myself for the past several months. This is my first real game development project so it is taking me quite a long time. I am happy that it seems like the overall structure I have landed on is very similar to yours. So far I have a "working" concept where I have implemented a "Move" action and can select and move units within their movement range along the grid. I have also implemented a basic melee attack action (that currently doesn't do anything because I haven't implemented a health system yet) which seems to work well. I ran into a bit of a snag today when trying to ask myself what to do about actions that target different kinds of units (friendly, self, enemy, or multiple of these). Currently each unit has its own "Faction" property, and can be "player", "friendly", "neutral", "enemy". I tried to use Data Driven Design where possible and I used an EventBus pattern for most of the communication between nodes. Currently most of the core game logic is being handled by my GameBoard class as that is what contains the actual grid. At first this seemed fine because the GameBoard could answer questions like "What is on the grid in this location?" and "highlight the valid cells I can move to with the move action on this particular unit". But as I go along, this class just keeps growing and growing. It is now over 250 lines, which doesn't seem right. Maybe it is? It just feels very icky to me. I am finding that the Eventbus is just passing around the "active_unit" and "selected_action" around everywhere. Also I can answer questions like "Which cells on the grid are occupied by a grid_object (just units for now)" but I am struggling with more detailed questions like "get me all of the cells in range of this action that specifically have "Friendly" units on them". I think I need to do some more decoupling and the "Services" you talk about sounds like it could be the answer. It's at times like this I wish I had a mentor or more experienced developer to keep me on the right path. I would love to see a more detailed overview of the Services pattern and how they communicate with one another.
Thanks for sharing! As a fellow software dev, it's also a bit of relief to me that another dev landed on something similar 😅 Understand about the GameBoard getting a bit large. I started in a similar spot, and that's why I ended up separating questions about combat from those about the game world itself. Not that there's inherently anything long with a larger class like that, but it just felt neater that way. For services, it sounds like there's a fair bit of interest in that subject so I'm thinking of covering it further in a future video. Game Programming Patterns also has a good talk about this pattern, though he may or may not approve of how I've used it here: gameprogrammingpatterns.com/service-locator.html
@@TheShaggyDev Sounds good. Thank you for the link to the resource. It's very interesting. I was able to do some cleanup today and it feels a bit more organized. GameBoard is still a bit large for my liking, but its a start.
I just realised I'm trying to make a tactics game. This helps tremendously, if only for that realisation. This came at exactly the right time, please more on this of you have it
Great video! Extremely helpful. Looking to create a similar game, and your insight into the game design rather than going into a deep dive into code is a great approach. Thank you!!!
such a great technical dive! ive been in the process of iterating on my own tactics game in godot, and when i eventually finish it i hope to rethink my entire approach and create a basic framework similarly to what you are doing
This is perfect! I will be following this closely. I've started on my own tactics game and was wrestling with how to compartmentalize code and your layout makes so much sense.
This video has made me pretty interested in trying out Godot over my current engine of choice: GameMaker. The ability to segment similarly functioned code seems to be more robust in Godot's node system compared to simple class inheritance and scripts in GameMaker. The parameter specification within the editor also looks easier to use, and I know 2d lighting and 3d development is out of the box with Godot vs. GameMaker where it requires much more complicated implementation
As someone who is also trying to make a tactics game in Godot 4, I'd love to see more of this. Also, if you wouldn't mind sharing some of the code, that'd be appreciated as well since there's little to no tutorials for this stuff in Godot 4. If not, that's understandable.
Thanks! I plan on releasing more videos about the game as development progresses and want to to keep a similar structure where I can to help make it more useful for other people. As for source code, I probably won't be releasing the code to this project any time soon, but I do want to think on this some as there's been a lot of interest in the nuts and bolts of games like this. Maybe a proper "tutorial" type video + project or something like that...
@@TheShaggyDev A TRPG focused tutorial would be nice for sure. I've been going through all sorts of random Godot 4 tutorials and open-source code for TRPGs in Godot 3 and trying to mesh it all together. It's been quite the experience to say the least lol.
Great Video as always! I am most interested in the action overrides mechanic. There are a lot of Pull Requests related to Godot 4's AnimationPlayer and AnimationTree but until more features are implemented this seems like a great way to handle more complex time based events.
Thank you! Yeah, my hope is I don't have to use overrides too often, but they really come in handy when I need them as modifying AnimationPlayer animations through code is a SLOG.
wow so cool thanks for the tips and experiences. I've been trying to make a game inspired in the gameplay of darkest dungeon 1 and I always reach a point in which complexity is a mess, signals flying everywhere. in all honesty it's quite the balancing act to not use too many global objects or event buses nor too few that makes everything coupled together.
For real. I've been developing this structure over the course of a few games and every time I update it I find something else that didn't quite work how I would've liked for it to originally. It's definitely a tricky balance to get right and I feel like this genre doesn't have a lot of good resource available so I'm trying to help expand the knowledge base a bit, even if it's not always 100% right off the bat.
@@TheShaggyDev preach it, I have "some" time here and there to attend to my hobby of game dev, I enjoy Godot very much, but once I did the basic tutorial games (asteroirds, snake, flappy, Mario...) and wanted to do something I enjoyed, the lack of material was baffling. Everywhere I look is either ARPG (zeldalikes) or 2d platformers. I wanted to do something jrpg-lite style, maybe even turn based strategy. I was able to do some stuff on my own, but I would feel much more secure if I saw something with experience tackle the genre and explain some stuff. I have a list of concepts I'd like to see explained, maybe I can share it with you, and you can either tackle them or ignore them, that's okey. haha.
@@tNag556 Ha sure! I definitely wouldn't call myself experienced in this area but I'd at least be curious to see what's on your mind and if there's anything that would make sense for me to cover at some point. I'm always on the lookout for new topic ideas or even just what people consider "the important bits" of a subject.
Honestly, the basics like better editor exports have probably made the biggest difference to my workflow. Being able to define custom resources and data types, export, nest, and edit them in the editor, throwing them into arrays, and stuff like that. The main problem I ran into with Godot 3 was defining custom data constraints and then trying to enforce those constraints via exports. For instance, I forget what the exact issue was, but there was a trick to making that nested Resources save correctly.
@@TheShaggyDev As I said: it would be very interesting to get a detailed breakdown on how all those work in Godot 4. Tons of beginner godot tutorials out there, not so many go into nuts and bolts of those sorts of features
No special sauce there. I grab every potential tile for an action, filter it as appropriate (line of sight checks, how many tiles to move to it once obstacles are accounted for, etc) and then use an autotiling layer to display the results of whatever is left.
This is a great video and really helpful towards understanding a better way to structure a Godot project. It raised a question for me though, if you have services which do all the "messy" stuff, if they are not autoloaded than how are you referencing them? Surely then you have nodes (like a Unit) which has to have a reference to any service it needs to talk to and if you were to decide to move/rename that service you would have to find and update all the references to it. Is there a reason you wouldn't have all (most) services as autoloaders rather than $path/to/the/service?
Good question! I kind of glossed over that piece when writing the script. To get around the fragility of node paths, I experiment with two different techniques. The first was completely avoiding autoloads and doing a chain of dependency injection, where Level gave a reference to Combatants, which gave to Groups and so on, but that really just wasn't workable even at the modest scale the game is currently at. So instead I have a ServiceLocator autoload that contains a reference to each service that any interested party can use to connect to. When a level starts, the top "Level" node sets the appropriate references in the locator, and then each node just calls ServiceLocator.some_service.some_function()
Afraid not, but the good news is that there's no secret sauce to them. They're just nodes in the application that other nodes get a reference to. How and when to use them becomes a bit trickier, but what I show here is really my thinking behind them: Things that need to get a lot of info from a lot of places and answer a lot of questions from a lot of places.
Really insightful video! I was wondering if you make the services nodes global to make them easier to access, or do all the nodes that require for example the navigation service have a reference to it?
Yep, I use a global Service Locator that objects can use to look up the service they need. Had originally tried keeping references local but it was becoming a bit of a pain to manage.
Yeah I probably will at some point as there does seem to be a desire for something more in-depth than just a devlog-type video. Maybe after this game comes out? I still kind of consider all of this to be "in development" so I want to have some time to get it right before trying to sell it as a proper tutorial / complete solution.
I am very happy about the architecture part of your dev log. Specifically about dependency injection and the services @2:21. Would you be interested in making an in-depth tutorials about this topic? I once did a card game where I wanted to have lots of animations and execute code after an animation is complete (each card had effects and such). I had a UI component that handled animations, CardSuit components which represented the cards, a game state object that held the state of the game and a controller to tie everything together. The controller would consume the input events from the UI, modify the game state, request animations to be played through the ui controller and wait for said animations to finish and so on. I think these kinds of architectures are pretty scarse. It would help out indie game devs a lot! Great video, I really enjoyed watching it and I learned a few things!
Thanks for watching! And good suggestions on topics. I agree that it can be hard to find such information, which is partially why I try to structure my devlogs the way I do (though I'm still figuring that piece out a bit). Definitely the kind of topics I like to dive into. Your card game architecture sounds great! Something I'd like to see myself, haha.
@@gokusupersaiyan6 Just give it a go! You won't really know what you're doing / want to do until you start anyways (I would place myself firmly in the "still figuring it out stage") and Godot needs more content like what you described!
I wanted to echo what others said about how good this video is. Also kudos on writing a text version. I'd be interested in learning more about how you're handling your service nodes. My impression is that you have an autoload that you register your service nodes with, and everything else accesses the service nodes through the autoload. What are the benefits of that vs making the service nodes themselves autoloads?
It's mostly as a lazy way to manage cleanup. The services aren't 100% stateless, so instantiating a fresh one with each battle is an easy way to make sure everything's as it should be.
Fell in love with the sci-fi tiny pixel art one… would be great if one day you could tell us more about how easy/hard it is for you to do all of this? Is it part time? As a hobby? Does it come naturally? Cheers and thanks for this video
Good suggestion! Could be worth talking about fully at some point, but it's all just a part-time hobby for me. An hour here and there kind of thing, and just trying to keep my scope manageable 🙃 And glad you like the sci-fi one! I'm partial to it as well, but it just wasn't quite ready yet when I was picking my next project to do so went with the other one. Definitely plan on coming back to it though...
@@TheShaggyDev nice! will be lurking around here for any updates on any of that at whatever pace it happens to be. These videos have been motivating too to find the energies to do any sort of exploration after a energy zapping day of work. Cheers and good luck.
I'd love to know more about your use of Services. How does a node request data from a service and how does the service get that data? Is this done by a signal or do you have to pass a reference to the service to any object that needs it? Or does the level script do that? Does the node assume that there is always a service in the scene it's placed in? Keep up the super informative videos!
I've played around with a few different styles of access. Originally, I manually gave each node access that needed it via dependency injection moving down the tree. So the level would give combatants access, which would give the combatant groups access, which would give units access, and so on. The problem with this approach is it became a pain to get a reference to everything that needed it (as that chain of injection can go a fair bit deeper at the deepest layers of the game) and it felt like a lot of bulky code just to pass some references around. So I ended up going with a service locator pattern and creating an Autoload that holds a reference to each service that nodes can use to access directly. When the level fires up, the top-level node registers services with this Autoload, then everyone can access what they need by something like "ServicesLocator.navigation_service.my_func(...)". This does mean that there's an assumption that the services are present in every level, but based off of my plan for the game I really can't think of any reason why they wouldn't be. It also means that references should be cleared when leaving the level (since the nodes won't exist anymore) and that I have to be mindful about not calling any functions needing services when units appear elsewhere, like on the home screen, but again I don't see that as too much of an issue. For registering data, I have a few exports on each service I use to hook up the nodes they care about and then pull data from when needed. Ex: Combat Service has a reference to the combatant groups and registers each on startup so it can then ask them for data about where each unit is when needed.
@@TheShaggyDev I see, using an autoload probably is the most elegant solution so that makes sense! I guess even in the situation that a service wasn't needed in one place for whatever reason, the node could just check with the locator if it exists and block the functionality that needs it if it doesn't (Though I suppose having a service that wasn't needed in every level would sort of go against the idea of it being a service in the first place). Thanks for the detailed response.
Really love the format of explaining the structure of the nodes! It's great to be able to look at it and compare my own structural preferences and utilization to yours! (I hate dynamic typing too, but my experience with C# Godot has been eh). Question, I saw that you use custom resources pretty extensively for a good bit of the data in your game, and I don't actually make use of them much, but I do think it's a way to allow certain data to be synced across all locations. My question however, would be, how would you deal with things like upgrades? Like let's say your have a unit that individually has been given extra health, or something, how would you only give that specific unit health if you define the units parameters in a custom resource? Great video as always, and one that I will definitely be revisiting, kind of interesting and useful even for non-tactics games honestly!
Glad you enjoyed it! And great question, as that's something that bit me a little on Elemechs since I didn't quite get it implemented correctly. I do plan to show this a bit more in-depth in a future video, but right now each individual unit has its own copy of a data "definition" that holds its specific stats (Currently that's done as a Resource but really should probably be changed to a RefCounted just to make it a little more lightweight). When a unit is created in the world, it loads its definition and sets up its stats, available actions, etc based on that. And it's a similar thing for monster parts. There's a base definition that says "this part does X and should have these stats at minimum" and then each instance of a part copies this base information to its own private data container and can layer information on top of that, such as upgrades.
@@TheShaggyDev Gotcha, that's helpful, so basically just storing a private set of references to the custom resource parameters that need to change, makes sense. I presume a similar thing would need to be done for any UI showing statistics etc too? Not sure if you had resolved that issue yet, but just something I was curious about. And same here, I put together a game recently and I sort of just ran out of time and never quite got it implemented successfully, hence my curiosity
@@Zyjin The UI so far, for what little I currently have, is more dynamic. Anything unit specific holds a reference to that unit and can watch and update accordingly. So in the Kaiju example, since it does at least have a functioning health bar, an instance of the monster card is created for each monster and given a reference to that monster so it can watch for stat-related signals as appropriate.
@@TheShaggyDev gotcha, I was utilizing the same shared custom resource across UI and individuals, and I think that was my issue there. Thanks for the notes, very helpful, keep doing what you do!
This is incredible, thank you for making this! I'm trying to make a tactics game and this has given me some great ideas! I know a lot of people would love a tutorial series, but if you wanted to make something smaller in scope, I would love to hear more about how your Navigation Service works with the rest of the game. Does it store a reference to the tilemap that is on the current level? Does it need to know what units, obstacles, etc. are on the tilemap at all times? And how do your other entities, like units, call functionality on the Nav Service like pathfinding? Are you using dependency injection to pass down a reference to children nodes and having a chain of each parent passing to the child? Or is there some other way you can reference the Nav Service without having to pass it down from parent to child in a chain? In my own project, I'm passing a reference to the tilemap to basically everything and this is not scaling well, so very curious to hear how you've done it here!
That's a good suggestion. I may do a video on my services in the future as there's been a number of people wanting to learn more about how that's set up. (Any sort of tutorial would have to come after this project wraps up!) I had started with a dependency injection chain, but also found it to be a bit unwieldy so I ripped that out and went with a service locator pattern instead. Now, there's a ServiceLocator autoload that gets a reference to all services when the level starts and can then be accessed through the global namespace. So any object can just call "ServiceLocator.navigation_service.some_function()". I've found this to be a lot more workable since there's a lot of places in the application that may want to know about pathfinding. As for what's in the navigation service, there's two layers. The lower layer is an extension of Godot's AStarGrid2D class, which adds some helper functions, like pathfinding with some extra checks, and applies some default configuration options, like what heuristic to use. Then there's the service node itself, which adds functions for navigating, like finding adjacent open tiles to a cell, checking lines of sight, and storing unit positions, which are updated after every action and can turned on or off for pathfinding purposes depending on what kind of check needs to be done. At this time, it actually doesn't store the tilemap reference itself because I don't need that after initializing everything. On level start, it gets passed the map structure, parses that into AStarGrid2D, and then forgets about the tilemap itself. For any sort of dynamic level modification, like destructible objects, the current plan is that would live outside of the tilemap, though I can change that in the future if needed.
@@TheShaggyDev That makes a lot of sense! Thank you! And I totally understand the need to focus on your own projects before figuring out more tutorials. Looking forward to the future videos!
I'm probably not the best person to ask since I don't make my own tools that often, but the plugin I showed was straightforward enough to make since you can use built-in Godot tools, which should make the process for most people a bit easier. I just started here in the docs and built it up from there, little by little: docs.godotengine.org/en/stable/tutorials/plugins/editor/making_plugins.html I can also suggest you think about how you're going to save/load data, both to and from the tool and in your game, as that's all on you now and if you change that format too much you may lose or have to go back and fix older data.
This is good but a lot of it glosses over these pretty meaty concepts. But you can only do so much on a video. But very well organized.good to study over
I would really love I you could say something about that x-com style ground highlight you did in your games. I'm uding AStar Grid and have collisions down, but struggle with that. That and textured lines, they work unitl I need to swap a texture.
For that piece, I have a tilemap with a auto-tiling / terrain set up so I just need to feed it all the tiles for an attack or movement and it displays correctly. As for figuring out *which* tiles to highlight, I just brute force it and check every potential tile within range. Not exactly elegant, but it's simple and works.
@@TheShaggyDev I went for similar brute force approach highlighting terrain just few days ago and seems to be working. But still stumped at the arrow thingie - wwould it be possible for you to make a video about this or maybe share the code snippet just for this bit on github or somewhere?
@@dziwic Sure, but that's fairly simple. I have a Line2D node and just feed it the points that my pathfinding system prints out when I find a path from the player to the node they're highlighting. Doesn't let you do much in the way of styling beyond the simple colors shown here, but that's all I needed.
@@TheShaggyDev Ah, for some reason I thought you had textured lines. Those I'm struggling with, corners prove to be a problem. The drawn ones I got down, thanks ;)
Not an overly important question at all, but since i'm right now trying to understand them: Have you considered hexagonal grids for those games, and if yes what were the main reasons you decided to not go with them ? For context i'm playing around on what at this stage is more a concept than a prototype. A turn based transport business game in space, mostly ui driven but with a grid based map where you can plan your ships routes and watch them fly around each time you hit next turn. And i'm really trying to understand hex grids now because i feel like they'd make the map part of the game feel slightly more modern (the main inspiration for that project is a 1994 game that probably didn't make waves internationally even, and that used what i'd call points of interest on a simple drawn map)
Great question! Generally speaking, I subscribe to the paradigm that hex grids are great for natural or open spaces, or perhaps large scale maps, while square grids are great for man-made spaces and scales. I anticipate both of these projects would largely take place in built spaces, so I kind of just naturally went in that direction, though I do like hex grids and think there is some interesting things they can offer. You also may have noticed that I treat diagonal directions the same as cardinal when resolving movement or attacks (so there's 8 valid places you can be to do an attack that requires the target be adjacent to you), just to spice up the square grid a bit and make movement feel more natural and, dare I say, hex-like. For the sci-fi game specifically, there's also the issue that, in my experience, hex grids can be difficult to get right with pixel at since they inherently don't align to low resolution pixel grids well. You *can* make it work, but since this game would largely, or entirely, take place indoors, I think square may be the better call anyways.
@@TheShaggyDev I admit i never even thought about the whole indoors aspect, Maybe that is the reason why i felt hex grids more fitting in my project. You don't get space that's much more open than space itself after all^^ Hexes and Pixel art is another headache for me right now. We'll see if i can get them right in a pixel art style, or if i end using a different art style for them, and only make the transporters themselves in pixel art.
@@Thurasiz Yeah I got the indoor vs outdoor idea from this awesome talk some time back and it really makes sense: th-cam.com/video/KM6ZTAcnEkE/w-d-xo.html Good luck on the pixel art with hexes! I never could come up with a satisfying solution for it, though I know it has to exist. If you figure it out, let me know!
@@TheShaggyDev For now i found a script that generates polygons in aseprite, and by changing some of the options i got a 32x32 hexagon that works nicely enough with the godot tilemap editor i think. It looks best with double or triple wide borders, thicker on the left side and thinner on the right. The slightly thicker border is not much of a problem, since i plan to use changing colors on those borders to signal different information to the player (things like, what places do they have cargo for, what places potential transports from the current planned stop would go to etc.) The fact it's shifted 1 pixel to the left will probably make some problems at a point, or i might get lucky. I'm basicly flying blind here, alternating between reading up on the essential math on hex grids, tweaking the one tile i'll use as base for every other, and trying to keep myself from adding more and more features to my plan because if there is one thing i learned by now, it's how feature creep kills projects^^
I'm curious with your navigation do you use the navigation layer on the TileMap, or load it into your own AStar and build out the paths out of the world?
Own Astar layer. In Godot 4, that's the AStarGrid2D class, which is easy enough to populate from a tilemap. In Godot 3 I used the regular AStar2D class, which is a bit more involved to get set up.
I’m kinda beginner here in Godot. But is there a tutorial where this is done and sort of explained line by line. I’ve been looking to make an Advanced Wars clone in the future but I barely see any tutorials in the genre. thanks.
The closest I've seen is one of the GDQuest courses talks about a JRPG-style turn-based combat system. Would still have to figure out all the spatial stuff, but might at least get you going on the general game flow.
More likely I'd just release something open source at some point, but if people want to give me money for it I'd certainly consider the asset store as one potential way of doing it
I definitely would buy on a Godot asset store. I have spent/bought a lot of assets on unity. Helps the developer's make more and new content.. For me to figure out a new way of making games is always great. A good give and take.. Especially since Godot has almost no books on Azon to learn from. and any documentation is very lack luster at best..
do you plan on making a tutorial for these kinds of game, I've been looking for one built for godot 4 because the godot 3 tutorial from gdquest has been really confusing and the code isn't explained very well, either that or I'm just stupid
Maybe at some point, after this game is out. I'm a bit selective with my tutorials and would need to be a bit more comfortable in the nitty gritty before I'd consider making one. In the meantime, I do plan to cover the game's development at more or less this video's level - technical enough that more advanced users can jump in with the info given without diving so deep into the weeds as to slow things to a crawl.
How did you achieve the tile hover highlighting in 3D, i tried to do this effect with 3D GridMaps too, but i don't really know how to access a single Mesh from the GridMap after ray casting from the mouse button and getting the ray cast position? :/
For Elemechs, I just used a quad with a texture on it and snapped it to the grid positions as the mouse moved around. It's probably possible to do in GridMaps as well, just kept it simpler.
Oh that's an interesting idea! I hadn't thought of streaming development but I would definitely be open to it, though I'm a little bit worried it might be a bit boring 😅
@@TheShaggyDev I would love to see this 😄. You are my go to source for applying tried and true game development principles to Godot's latest features and I learn so much from each of your videos. I actually landed a job recently where I am using the Godot engine to simulate real world warehouses to make them more efficient.
@@SiisKolkytEuroo Apologies! Wasn't my intent. I show a lot of games that aren't made in Godot for general footage on this channel so didn't even cross my mind.
@@TheShaggyDev IMHO / too many indie dev vloggers show triple A or popular indie games while explaining their idea or concept in their videos - it annoys me too - I no longer have time to browse all the games available in the world, and then I see a vlog that starts with something nice that isn't actually created by the vlog author (turns out later) - it would be fair to process borrowed material either by framing, labeling (add a title when showing a clip) or post processing to make it clear that these clips are NOT your creations. I know indie devs who can create such quality... so one might expect that you start with your own content.
@@322ss That's a fair point, and one I hadn't considered. I've been thinking about adding title cards to game clips anyways so I think this is another good reason why I should start doing that. Thanks for the honest and helpful feedback.
I just did one! Though I kind of skipped over the core mechanics since I didn't feel they were that interesting. Is there something in particular you're curious about?
The development community has been sucked into trending words so much they lost sight of what an Engine is. Is it a roguelike because characters can die and open world because you can choose where to walk too? LOLOL
Thanks for the feedback! I've been meaning to revisit my audio setup and processing chain for some time. May finally look into it. If you're noticing anything in particular, I'm all ears. Otherwise I've got some ideas...
This is EXACTLY the kinda stuff I love hearing about in devlog type videos. I love systems design the most and you breaking down things such as hierarchy and how different systems are handled/interact is so enjoyable to me for some reason
Infinite agreeance. The node visual layout alone.... but also the isolation of sections (i.e. the `@export` variables in-editor) visually. All the video edits.... yes, some semblance of perfection.
Hope we/I collect great tutorial examples into a compilation someday, for tutorial makers(a skillset in the knowledge world we need more of).
😊
LOVE seeing your node structure. This is the most helpful kind of video.
I really like how you covered the design of the game! It feels well laid out and extensible, and moving to 4 with its better handling of resources editor-wise is the right choice. No feedback on the implementation, but I think this is a great window into the thought process of actually creating a tactics type game
I know nothing about developing games. I am starting from scratch. Don't know about any coding, but can do art (haven't tried pixel art yet, but I know it will be easy). I am on this journey because Square Enix won't make another Final Fantasy Tactics game, and if they won't, I'll do it on my fucking own.
If you're still on this project then all the best. I'd kill for a good tactics game
I'm with you there brother. No new FFT, no new Tactics Ogre, no new Shining Force. My friends and I have just started the same journey a few weeks ago.
Just seen this now and yeah ... i wanna add Advance wars and Rebelstar tactical command to that 😂
Having just gotten out of the basic godot tutorial and being struck dumb trying to figure out the top-level basic structure to use for my first self developed project, hearing you talk about the way you organised yours and what informed your decisions feels like opening my mind a little
Great video, I'm just getting started with Godot and trying to create a small Tactics game for practice, so this kind of overview is very helpful!
I like the depth of your explanation on node organization. Will come back to study this video later.
I was trying to make a little tactic game for godot about a half a year ago. It is pleasing to see that I had some similarities in architecture, though it was too much for me when I started AI
Thank you for sharing your experience with Godot and tactic games dev!
There are pretty clear and useful explanations you've provided in video.
The only thing was hard for me is to catch some of the examples related to the events and reaction loop without some kind of event sequence diagrams or other supportive visuals.
Anyway, now I'm going to watch the rest of your videos :)
love this video. showing and explaining actual node structure when designing game is far more valuable then tutorials about features that beginner developer have no idea how to apply
I have a software engineering background and I've been working on a tactics game myself for the past several months. This is my first real game development project so it is taking me quite a long time. I am happy that it seems like the overall structure I have landed on is very similar to yours.
So far I have a "working" concept where I have implemented a "Move" action and can select and move units within their movement range along the grid. I have also implemented a basic melee attack action (that currently doesn't do anything because I haven't implemented a health system yet) which seems to work well.
I ran into a bit of a snag today when trying to ask myself what to do about actions that target different kinds of units (friendly, self, enemy, or multiple of these). Currently each unit has its own "Faction" property, and can be "player", "friendly", "neutral", "enemy".
I tried to use Data Driven Design where possible and I used an EventBus pattern for most of the communication between nodes. Currently most of the core game logic is being handled by my GameBoard class as that is what contains the actual grid. At first this seemed fine because the GameBoard could answer questions like "What is on the grid in this location?" and "highlight the valid cells I can move to with the move action on this particular unit". But as I go along, this class just keeps growing and growing. It is now over 250 lines, which doesn't seem right. Maybe it is? It just feels very icky to me.
I am finding that the Eventbus is just passing around the "active_unit" and "selected_action" around everywhere. Also I can answer questions like "Which cells on the grid are occupied by a grid_object (just units for now)" but I am struggling with more detailed questions like "get me all of the cells in range of this action that specifically have "Friendly" units on them".
I think I need to do some more decoupling and the "Services" you talk about sounds like it could be the answer. It's at times like this I wish I had a mentor or more experienced developer to keep me on the right path. I would love to see a more detailed overview of the Services pattern and how they communicate with one another.
Thanks for sharing! As a fellow software dev, it's also a bit of relief to me that another dev landed on something similar 😅
Understand about the GameBoard getting a bit large. I started in a similar spot, and that's why I ended up separating questions about combat from those about the game world itself. Not that there's inherently anything long with a larger class like that, but it just felt neater that way.
For services, it sounds like there's a fair bit of interest in that subject so I'm thinking of covering it further in a future video. Game Programming Patterns also has a good talk about this pattern, though he may or may not approve of how I've used it here: gameprogrammingpatterns.com/service-locator.html
@@TheShaggyDev Sounds good. Thank you for the link to the resource. It's very interesting. I was able to do some cleanup today and it feels a bit more organized. GameBoard is still a bit large for my liking, but its a start.
Exactly what I was looking for and exactly what Godot needs. Beautiful explanations and break downs.
This is really cool, I like seeing good architecture and design patterns being applied in games and not just in other fields of Software development
Such an awesome deep dive! Love to hear how you're thinking about scene organization and coding patterns
I just realised I'm trying to make a tactics game. This helps tremendously, if only for that realisation. This came at exactly the right time, please more on this of you have it
Great video! Extremely helpful. Looking to create a similar game, and your insight into the game design rather than going into a deep dive into code is a great approach. Thank you!!!
I'd love to see more about the Action system, it seems really modular and versatile! Excellent videos, love your content.
Thank you so much for sharing your code architecture
I wanted to make a tactics toy project during summer, this will be super helpful!
Thank you so much for explaining your node tree the way you did. Soooo helpful.
You are one of the most underrated TH-camrs I watch. Your explanations are very concise and to the point, I always learn something from these.
Game design ~ node hierarchy 🤯
What a great insight, thank you!
Excellent video! Subscribed!
such a great technical dive! ive been in the process of iterating on my own tactics game in godot, and when i eventually finish it i hope to rethink my entire approach and create a basic framework similarly to what you are doing
This is perfect! I will be following this closely. I've started on my own tactics game and was wrestling with how to compartmentalize code and your layout makes so much sense.
This video has made me pretty interested in trying out Godot over my current engine of choice: GameMaker. The ability to segment similarly functioned code seems to be more robust in Godot's node system compared to simple class inheritance and scripts in GameMaker. The parameter specification within the editor also looks easier to use, and I know 2d lighting and 3d development is out of the box with Godot vs. GameMaker where it requires much more complicated implementation
As someone who is also trying to make a tactics game in Godot 4, I'd love to see more of this.
Also, if you wouldn't mind sharing some of the code, that'd be appreciated as well since there's little to no tutorials for this stuff in Godot 4. If not, that's understandable.
Thanks! I plan on releasing more videos about the game as development progresses and want to to keep a similar structure where I can to help make it more useful for other people.
As for source code, I probably won't be releasing the code to this project any time soon, but I do want to think on this some as there's been a lot of interest in the nuts and bolts of games like this. Maybe a proper "tutorial" type video + project or something like that...
@@TheShaggyDev A TRPG focused tutorial would be nice for sure. I've been going through all sorts of random Godot 4 tutorials and open-source code for TRPGs in Godot 3 and trying to mesh it all together.
It's been quite the experience to say the least lol.
Great Video as always! I am most interested in the action overrides mechanic. There are a lot of Pull Requests related to Godot 4's AnimationPlayer and AnimationTree but until more features are implemented this seems like a great way to handle more complex time based events.
Thank you! Yeah, my hope is I don't have to use overrides too often, but they really come in handy when I need them as modifying AnimationPlayer animations through code is a SLOG.
Awesome job!
I'm currently working on tactics for a unity game as well. It was interesting to see your architecture as an example
wow so cool
thanks for the tips and experiences. I've been trying to make a game inspired in the gameplay of darkest dungeon 1 and I always reach a point in which complexity is a mess, signals flying everywhere.
in all honesty it's quite the balancing act to not use too many global objects or event buses nor too few that makes everything coupled together.
For real. I've been developing this structure over the course of a few games and every time I update it I find something else that didn't quite work how I would've liked for it to originally. It's definitely a tricky balance to get right and I feel like this genre doesn't have a lot of good resource available so I'm trying to help expand the knowledge base a bit, even if it's not always 100% right off the bat.
@@TheShaggyDev preach it, I have "some" time here and there to attend to my hobby of game dev, I enjoy Godot very much, but once I did the basic tutorial games (asteroirds, snake, flappy, Mario...) and wanted to do something I enjoyed, the lack of material was baffling. Everywhere I look is either ARPG (zeldalikes) or 2d platformers. I wanted to do something jrpg-lite style, maybe even turn based strategy. I was able to do some stuff on my own, but I would feel much more secure if I saw something with experience tackle the genre and explain some stuff. I have a list of concepts I'd like to see explained, maybe I can share it with you, and you can either tackle them or ignore them, that's okey. haha.
@@tNag556 Ha sure! I definitely wouldn't call myself experienced in this area but I'd at least be curious to see what's on your mind and if there's anything that would make sense for me to cover at some point. I'm always on the lookout for new topic ideas or even just what people consider "the important bits" of a subject.
@@TheShaggyDev
Either way thanks for the videos, all experiences are good to learn from.
great stuff 👍
Im not making a tactics game but a turn based rpg, and this still pretty useful information for that since the general systems are the same
Hell yea dude !! Love this
hey this is super cool! i have tried making my own mini tactics engine a few times and it always gets 'messy' like you say without services.
Brruh your game looks so good
Thank you!
I would really love a deep-dive into what Godot 4 changes to resources, typing, etc. you make use of
Honestly, the basics like better editor exports have probably made the biggest difference to my workflow. Being able to define custom resources and data types, export, nest, and edit them in the editor, throwing them into arrays, and stuff like that. The main problem I ran into with Godot 3 was defining custom data constraints and then trying to enforce those constraints via exports. For instance, I forget what the exact issue was, but there was a trick to making that nested Resources save correctly.
@@TheShaggyDev As I said: it would be very interesting to get a detailed breakdown on how all those work in Godot 4. Tons of beginner godot tutorials out there, not so many go into nuts and bolts of those sorts of features
awesome, thanks! Any directions for the range highlight that "shapes" around the walls?
No special sauce there. I grab every potential tile for an action, filter it as appropriate (line of sight checks, how many tiles to move to it once obstacles are accounted for, etc) and then use an autotiling layer to display the results of whatever is left.
@@TheShaggyDev never thought about autotiling. Brilliant, thanks!
I’d love a breakdown of the combat service and how it interacts with everything else
This is a great video and really helpful towards understanding a better way to structure a Godot project.
It raised a question for me though, if you have services which do all the "messy" stuff, if they are not autoloaded than how are you referencing them? Surely then you have nodes (like a Unit) which has to have a reference to any service it needs to talk to and if you were to decide to move/rename that service you would have to find and update all the references to it. Is there a reason you wouldn't have all (most) services as autoloaders rather than $path/to/the/service?
Good question! I kind of glossed over that piece when writing the script. To get around the fragility of node paths, I experiment with two different techniques. The first was completely avoiding autoloads and doing a chain of dependency injection, where Level gave a reference to Combatants, which gave to Groups and so on, but that really just wasn't workable even at the modest scale the game is currently at. So instead I have a ServiceLocator autoload that contains a reference to each service that any interested party can use to connect to. When a level starts, the top "Level" node sets the appropriate references in the locator, and then each node just calls ServiceLocator.some_service.some_function()
This was really interesting. Do you have any videos breaking down how to use service nodes?
Afraid not, but the good news is that there's no secret sauce to them. They're just nodes in the application that other nodes get a reference to. How and when to use them becomes a bit trickier, but what I show here is really my thinking behind them: Things that need to get a lot of info from a lot of places and answer a lot of questions from a lot of places.
Really insightful video! I was wondering if you make the services nodes global to make them easier to access, or do all the nodes that require for example the navigation service have a reference to it?
Yep, I use a global Service Locator that objects can use to look up the service they need. Had originally tried keeping references local but it was becoming a bit of a pain to manage.
Awesome. Have you ever thought about putting all this together in a complete tutorial series? Maybe on youtube or Udemy?
Yeah I probably will at some point as there does seem to be a desire for something more in-depth than just a devlog-type video. Maybe after this game comes out? I still kind of consider all of this to be "in development" so I want to have some time to get it right before trying to sell it as a proper tutorial / complete solution.
I am very happy about the architecture part of your dev log. Specifically about dependency injection and the services @2:21. Would you be interested in making an in-depth tutorials about this topic?
I once did a card game where I wanted to have lots of animations and execute code after an animation is complete (each card had effects and such). I had a UI component that handled animations, CardSuit components which represented the cards, a game state object that held the state of the game and a controller to tie everything together. The controller would consume the input events from the UI, modify the game state, request animations to be played through the ui controller and wait for said animations to finish and so on.
I think these kinds of architectures are pretty scarse. It would help out indie game devs a lot!
Great video, I really enjoyed watching it and I learned a few things!
Thanks for watching! And good suggestions on topics. I agree that it can be hard to find such information, which is partially why I try to structure my devlogs the way I do (though I'm still figuring that piece out a bit). Definitely the kind of topics I like to dive into.
Your card game architecture sounds great! Something I'd like to see myself, haha.
@@TheShaggyDev I will try to do a tutorial and start my own channel 🤣 Been planning it for a while but was scared to start.
@@gokusupersaiyan6 Just give it a go! You won't really know what you're doing / want to do until you start anyways (I would place myself firmly in the "still figuring it out stage") and Godot needs more content like what you described!
I wanted to echo what others said about how good this video is. Also kudos on writing a text version.
I'd be interested in learning more about how you're handling your service nodes. My impression is that you have an autoload that you register your service nodes with, and everything else accesses the service nodes through the autoload. What are the benefits of that vs making the service nodes themselves autoloads?
It's mostly as a lazy way to manage cleanup. The services aren't 100% stateless, so instantiating a fresh one with each battle is an easy way to make sure everything's as it should be.
Fell in love with the sci-fi tiny pixel art one… would be great if one day you could tell us more about how easy/hard it is for you to do all of this? Is it part time? As a hobby? Does it come naturally?
Cheers and thanks for this video
Good suggestion! Could be worth talking about fully at some point, but it's all just a part-time hobby for me. An hour here and there kind of thing, and just trying to keep my scope manageable 🙃
And glad you like the sci-fi one! I'm partial to it as well, but it just wasn't quite ready yet when I was picking my next project to do so went with the other one. Definitely plan on coming back to it though...
@@TheShaggyDev nice! will be lurking around here for any updates on any of that at whatever pace it happens to be.
These videos have been motivating too to find the energies to do any sort of exploration after a energy zapping day of work.
Cheers and good luck.
Great video! Is there any chance we could get a code template or project for this, would be super helpful.
In the immediate future, no, but I do understand there's an interest in starter templates so it's something I'm considering for the future.
Bro the second game ❤ my boy made Quazimorph 🎉😂
I'm trying to build a board game, there's a lot of overlap here. Thank you.
I'd love to know more about your use of Services. How does a node request data from a service and how does the service get that data? Is this done by a signal or do you have to pass a reference to the service to any object that needs it? Or does the level script do that? Does the node assume that there is always a service in the scene it's placed in?
Keep up the super informative videos!
I've played around with a few different styles of access. Originally, I manually gave each node access that needed it via dependency injection moving down the tree. So the level would give combatants access, which would give the combatant groups access, which would give units access, and so on. The problem with this approach is it became a pain to get a reference to everything that needed it (as that chain of injection can go a fair bit deeper at the deepest layers of the game) and it felt like a lot of bulky code just to pass some references around.
So I ended up going with a service locator pattern and creating an Autoload that holds a reference to each service that nodes can use to access directly. When the level fires up, the top-level node registers services with this Autoload, then everyone can access what they need by something like "ServicesLocator.navigation_service.my_func(...)".
This does mean that there's an assumption that the services are present in every level, but based off of my plan for the game I really can't think of any reason why they wouldn't be. It also means that references should be cleared when leaving the level (since the nodes won't exist anymore) and that I have to be mindful about not calling any functions needing services when units appear elsewhere, like on the home screen, but again I don't see that as too much of an issue.
For registering data, I have a few exports on each service I use to hook up the nodes they care about and then pull data from when needed. Ex: Combat Service has a reference to the combatant groups and registers each on startup so it can then ask them for data about where each unit is when needed.
@@TheShaggyDev I see, using an autoload probably is the most elegant solution so that makes sense! I guess even in the situation that a service wasn't needed in one place for whatever reason, the node could just check with the locator if it exists and block the functionality that needs it if it doesn't (Though I suppose having a service that wasn't needed in every level would sort of go against the idea of it being a service in the first place). Thanks for the detailed response.
Really love the format of explaining the structure of the nodes! It's great to be able to look at it and compare my own structural preferences and utilization to yours! (I hate dynamic typing too, but my experience with C# Godot has been eh).
Question, I saw that you use custom resources pretty extensively for a good bit of the data in your game, and I don't actually make use of them much, but I do think it's a way to allow certain data to be synced across all locations.
My question however, would be, how would you deal with things like upgrades? Like let's say your have a unit that individually has been given extra health, or something, how would you only give that specific unit health if you define the units parameters in a custom resource?
Great video as always, and one that I will definitely be revisiting, kind of interesting and useful even for non-tactics games honestly!
Glad you enjoyed it! And great question, as that's something that bit me a little on Elemechs since I didn't quite get it implemented correctly. I do plan to show this a bit more in-depth in a future video, but right now each individual unit has its own copy of a data "definition" that holds its specific stats (Currently that's done as a Resource but really should probably be changed to a RefCounted just to make it a little more lightweight). When a unit is created in the world, it loads its definition and sets up its stats, available actions, etc based on that. And it's a similar thing for monster parts. There's a base definition that says "this part does X and should have these stats at minimum" and then each instance of a part copies this base information to its own private data container and can layer information on top of that, such as upgrades.
@@TheShaggyDev Gotcha, that's helpful, so basically just storing a private set of references to the custom resource parameters that need to change, makes sense.
I presume a similar thing would need to be done for any UI showing statistics etc too? Not sure if you had resolved that issue yet, but just something I was curious about.
And same here, I put together a game recently and I sort of just ran out of time and never quite got it implemented successfully, hence my curiosity
@@Zyjin The UI so far, for what little I currently have, is more dynamic. Anything unit specific holds a reference to that unit and can watch and update accordingly. So in the Kaiju example, since it does at least have a functioning health bar, an instance of the monster card is created for each monster and given a reference to that monster so it can watch for stat-related signals as appropriate.
@@TheShaggyDev gotcha, I was utilizing the same shared custom resource across UI and individuals, and I think that was my issue there.
Thanks for the notes, very helpful, keep doing what you do!
This is incredible, thank you for making this! I'm trying to make a tactics game and this has given me some great ideas! I know a lot of people would love a tutorial series, but if you wanted to make something smaller in scope, I would love to hear more about how your Navigation Service works with the rest of the game. Does it store a reference to the tilemap that is on the current level? Does it need to know what units, obstacles, etc. are on the tilemap at all times? And how do your other entities, like units, call functionality on the Nav Service like pathfinding? Are you using dependency injection to pass down a reference to children nodes and having a chain of each parent passing to the child? Or is there some other way you can reference the Nav Service without having to pass it down from parent to child in a chain? In my own project, I'm passing a reference to the tilemap to basically everything and this is not scaling well, so very curious to hear how you've done it here!
That's a good suggestion. I may do a video on my services in the future as there's been a number of people wanting to learn more about how that's set up. (Any sort of tutorial would have to come after this project wraps up!)
I had started with a dependency injection chain, but also found it to be a bit unwieldy so I ripped that out and went with a service locator pattern instead. Now, there's a ServiceLocator autoload that gets a reference to all services when the level starts and can then be accessed through the global namespace. So any object can just call "ServiceLocator.navigation_service.some_function()".
I've found this to be a lot more workable since there's a lot of places in the application that may want to know about pathfinding.
As for what's in the navigation service, there's two layers. The lower layer is an extension of Godot's AStarGrid2D class, which adds some helper functions, like pathfinding with some extra checks, and applies some default configuration options, like what heuristic to use. Then there's the service node itself, which adds functions for navigating, like finding adjacent open tiles to a cell, checking lines of sight, and storing unit positions, which are updated after every action and can turned on or off for pathfinding purposes depending on what kind of check needs to be done.
At this time, it actually doesn't store the tilemap reference itself because I don't need that after initializing everything. On level start, it gets passed the map structure, parses that into AStarGrid2D, and then forgets about the tilemap itself. For any sort of dynamic level modification, like destructible objects, the current plan is that would live outside of the tilemap, though I can change that in the future if needed.
@@TheShaggyDev That makes a lot of sense! Thank you! And I totally understand the need to focus on your own projects before figuring out more tutorials. Looking forward to the future videos!
When can we play your game? Looking forward to it!
Thanks! Probably still some time off. Taking a bit to get the art together for it.
it's amazing that you made specific tools for it, i really want to be at that level. do you have any tips?
I'm probably not the best person to ask since I don't make my own tools that often, but the plugin I showed was straightforward enough to make since you can use built-in Godot tools, which should make the process for most people a bit easier. I just started here in the docs and built it up from there, little by little: docs.godotengine.org/en/stable/tutorials/plugins/editor/making_plugins.html
I can also suggest you think about how you're going to save/load data, both to and from the tool and in your game, as that's all on you now and if you change that format too much you may lose or have to go back and fix older data.
This is good but a lot of it glosses over these pretty meaty concepts. But you can only do so much on a video. But very well organized.good to study over
I would really love I you could say something about that x-com style ground highlight you did in your games. I'm uding AStar Grid and have collisions down, but struggle with that. That and textured lines, they work unitl I need to swap a texture.
For that piece, I have a tilemap with a auto-tiling / terrain set up so I just need to feed it all the tiles for an attack or movement and it displays correctly. As for figuring out *which* tiles to highlight, I just brute force it and check every potential tile within range. Not exactly elegant, but it's simple and works.
@@TheShaggyDev I went for similar brute force approach highlighting terrain just few days ago and seems to be working. But still stumped at the arrow thingie - wwould it be possible for you to make a video about this or maybe share the code snippet just for this bit on github or somewhere?
@@dziwic Sure, but that's fairly simple. I have a Line2D node and just feed it the points that my pathfinding system prints out when I find a path from the player to the node they're highlighting. Doesn't let you do much in the way of styling beyond the simple colors shown here, but that's all I needed.
@@TheShaggyDev Ah, for some reason I thought you had textured lines. Those I'm struggling with, corners prove to be a problem.
The drawn ones I got down, thanks ;)
I like those graphics
Thank you!
Very cool
Not an overly important question at all, but since i'm right now trying to understand them: Have you considered hexagonal grids for those games, and if yes what were the main reasons you decided to not go with them ?
For context i'm playing around on what at this stage is more a concept than a prototype. A turn based transport business game in space, mostly ui driven but with a grid based map where you can plan your ships routes and watch them fly around each time you hit next turn. And i'm really trying to understand hex grids now because i feel like they'd make the map part of the game feel slightly more modern (the main inspiration for that project is a 1994 game that probably didn't make waves internationally even, and that used what i'd call points of interest on a simple drawn map)
Great question! Generally speaking, I subscribe to the paradigm that hex grids are great for natural or open spaces, or perhaps large scale maps, while square grids are great for man-made spaces and scales. I anticipate both of these projects would largely take place in built spaces, so I kind of just naturally went in that direction, though I do like hex grids and think there is some interesting things they can offer.
You also may have noticed that I treat diagonal directions the same as cardinal when resolving movement or attacks (so there's 8 valid places you can be to do an attack that requires the target be adjacent to you), just to spice up the square grid a bit and make movement feel more natural and, dare I say, hex-like.
For the sci-fi game specifically, there's also the issue that, in my experience, hex grids can be difficult to get right with pixel at since they inherently don't align to low resolution pixel grids well. You *can* make it work, but since this game would largely, or entirely, take place indoors, I think square may be the better call anyways.
@@TheShaggyDev I admit i never even thought about the whole indoors aspect, Maybe that is the reason why i felt hex grids more fitting in my project. You don't get space that's much more open than space itself after all^^
Hexes and Pixel art is another headache for me right now. We'll see if i can get them right in a pixel art style, or if i end using a different art style for them, and only make the transporters themselves in pixel art.
@@Thurasiz Yeah I got the indoor vs outdoor idea from this awesome talk some time back and it really makes sense: th-cam.com/video/KM6ZTAcnEkE/w-d-xo.html
Good luck on the pixel art with hexes! I never could come up with a satisfying solution for it, though I know it has to exist. If you figure it out, let me know!
@@TheShaggyDev For now i found a script that generates polygons in aseprite, and by changing some of the options i got a 32x32 hexagon that works nicely enough with the godot tilemap editor i think.
It looks best with double or triple wide borders, thicker on the left side and thinner on the right. The slightly thicker border is not much of a problem, since i plan to use changing colors on those borders to signal different information to the player (things like, what places do they have cargo for, what places potential transports from the current planned stop would go to etc.)
The fact it's shifted 1 pixel to the left will probably make some problems at a point, or i might get lucky. I'm basicly flying blind here, alternating between reading up on the essential math on hex grids, tweaking the one tile i'll use as base for every other, and trying to keep myself from adding more and more features to my plan because if there is one thing i learned by now, it's how feature creep kills projects^^
I'm curious with your navigation do you use the navigation layer on the TileMap, or load it into your own AStar and build out the paths out of the world?
Own Astar layer. In Godot 4, that's the AStarGrid2D class, which is easy enough to populate from a tilemap. In Godot 3 I used the regular AStar2D class, which is a bit more involved to get set up.
It is hard to find an guide of tactics style to engines.. 😮😮🎉🎉🎉
Great breakdown!!
Thank you for the demonstration.
Excuse me, but in 11:30 do you use a shader to create the movement zone?
Nope, that's just a tilemap sitting on top of the regular map.
I’m kinda beginner here in Godot. But is there a tutorial where this is done and sort of explained line by line. I’ve been looking to make an Advanced Wars clone in the future but I barely see any tutorials in the genre. thanks.
The closest I've seen is one of the GDQuest courses talks about a JRPG-style turn-based combat system. Would still have to figure out all the spatial stuff, but might at least get you going on the general game flow.
Will you be selling a Simple demo like this on the new Godot asset store.. If they ever get one?
More likely I'd just release something open source at some point, but if people want to give me money for it I'd certainly consider the asset store as one potential way of doing it
I definitely would buy on a Godot asset store. I have spent/bought a lot of assets on unity. Helps the developer's make more and new content.. For me to figure out a new way of making games is always great. A good give and take.. Especially since Godot has almost no books on Azon to learn from. and any documentation is very lack luster at best..
@@BalugaLugaLuga That makes sense, I'll keep that in mind if an asset store ever comes!
do you plan on making a tutorial for these kinds of game, I've been looking for one built for godot 4 because the godot 3 tutorial from gdquest has been really confusing and the code isn't explained very well, either that or I'm just stupid
Maybe at some point, after this game is out. I'm a bit selective with my tutorials and would need to be a bit more comfortable in the nitty gritty before I'd consider making one. In the meantime, I do plan to cover the game's development at more or less this video's level - technical enough that more advanced users can jump in with the info given without diving so deep into the weeds as to slow things to a crawl.
@@TheShaggyDev thanks for answering my question
How did you achieve the tile hover highlighting in 3D, i tried to do this effect with 3D GridMaps too, but i don't really know how to access a single Mesh from the GridMap after ray casting from the mouse button and getting the ray cast position? :/
For Elemechs, I just used a quad with a texture on it and snapped it to the grid positions as the mouse moved around. It's probably possible to do in GridMaps as well, just kept it simpler.
@@TheShaggyDev Sounds good, im a little bit stuck right now, so i will look into it, thank you for the help. Keep up the good work ! :)
I need someone to officially release an engine like this. I've wanted to make these kinds of games since playing FFTA as a kid.
do you have a discord? I am working on a similar concept with hex grid.
I try not to make it public to help avoid bots and other nonsense. Message me on Twitter or at the email on the channel first?
is the art for the scifi game made by you or is it an asset pack?
Made by me, but using proportions from some Oryx assets to help get everything the right general shape.
Have you considered lve-streaming your sessions? Wouldn't need to have commentary, it'd just be so great to be a fly-on-the-wall
Oh that's an interesting idea! I hadn't thought of streaming development but I would definitely be open to it, though I'm a little bit worried it might be a bit boring 😅
@@TheShaggyDev I would love to see this 😄. You are my go to source for applying tried and true game development principles to Godot's latest features and I learn so much from each of your videos. I actually landed a job recently where I am using the Godot engine to simulate real world warehouses to make them more efficient.
Great video, wish you would go more indepth with the code. Would really like to see the nuts and bolts of what's going on
its something like create a engine for your own game? btw looks interessant!
What's the one at 0:00
XCom 2!
@@TheShaggyDev Thanks. it's the best looking game in the video but it's not even made in Godot, I feel kind of clickbaited now :(
@@SiisKolkytEuroo Apologies! Wasn't my intent. I show a lot of games that aren't made in Godot for general footage on this channel so didn't even cross my mind.
@@TheShaggyDev IMHO / too many indie dev vloggers show triple A or popular indie games while explaining their idea or concept in their videos - it annoys me too - I no longer have time to browse all the games available in the world, and then I see a vlog that starts with something nice that isn't actually created by the vlog author (turns out later) - it would be fair to process borrowed material either by framing, labeling (add a title when showing a clip) or post processing to make it clear that these clips are NOT your creations. I know indie devs who can create such quality... so one might expect that you start with your own content.
@@322ss That's a fair point, and one I hadn't considered. I've been thinking about adding title cards to game clips anyways so I think this is another good reason why I should start doing that. Thanks for the honest and helpful feedback.
next video please about idle game and mechanisms please
I just did one! Though I kind of skipped over the core mechanics since I didn't feel they were that interesting. Is there something in particular you're curious about?
I feel like system is a more idiomatic term for games, service makes me think of microservices...
The development community has been sucked into trending words so much they lost sight of what an Engine is. Is it a roguelike because characters can die and open world because you can choose where to walk too? LOLOL
The noise suppression in your mic really needs fixing. It's small but it's noticeable. Game looks really good tho :)
Thanks for the feedback! I've been meaning to revisit my audio setup and processing chain for some time. May finally look into it. If you're noticing anything in particular, I'm all ears. Otherwise I've got some ideas...
Downvote was for starting a statement with 'so'. As 'so' is meant as a joiner between a previous comment and the present one.
🤓