I just wanted to say "thank you". Your videos are very helpful and I learn a lot from them! So THANK YOU for the good and inspiring work, please keep it going.😊
Amazing video! I definitely recommend making more videos like these full guides, maybe guides on RPGs or Roguelikes! I love the in depthless of your videos as well! Keep it up!
Only about 45 minutes in and this is extremely enlightening! I see so many videos talking about composition vs inheritance and show a script saying it's easy to follow and end the video. You finally explain the code and funny enough you never said composition or inheritance! Your two videos make me understand the code rather than just show the code. Also I'm pleased to find a prototype coder instead of code snob Thanks and cheers!
Haha prototype first coding has always felt more intuitive and efficient for me personally! Thanks for watching! I'm glad this video has been enlightening/entertaining for you!
It's so satisfying to get to the end of the tutorial because it really is a journey following you through all the problems and everything. Thank you very much, keep helping us.
Hello, gonna say I'm loving these tutorial videos and the way its presented. The workflow and idea process is raw and I am able to absorb how to approach things when working on a game. I am currently trying to make a card game but its field based. But I do am getting points based on this tutorial. For now, I'll try to follow the tutorials and hopefully I can translate these into functionalities like placing cards on a field or summoning entities on a field. Looking forward to more of your videos!!! ( as of writing these, theres 2 videos that i havent watched yet) xD
Thanks for following along! I know things get messy and crazy as I find things out on thisn"tutorial" but I'm glad people are having a good time learning and seeing the real process! I do hope to make a cleaner, "now I've done it once and learned let's try it again better and faster."
honestly this journey you're on is very inspiring. i appreciate all the honesty, any mistakes you make, the basis of all of this is incredibly helpful. and even your uncertainty with it, is helpful because i go through this as well. when i watch any tutorials talking about math and such, i wonder to myself if maybe i'm too dumb to make it through this because i really don't understand a lot of the math that's going on.
I love that sharing my mistakes and process is encouraging to others! And yea even for me there are moments where I feel stupid for not getting the math and logic in tutorials. However, over time by slowly learning and building up knowledge I know you can get there! Thanks for following my journey! And hope you follow along and succeed too!
thanks for watching! I will not stop! haha taking a little time to get next few videos lined up so I can begin uploading more regularly, but I will be back with them soon!
I've never been one for long videos, but as a game dev very much in the beginner phase, it's really helpful looking at how the process really looks like, in comparison to tutorial vids just telling you what to do.
Ill be following along with my younger sibling this week. They understand coding concepts easier than I do so I figure our combined efforts will make us unstoppable! I am excited to have a project we will both enjoy! Thank you.
That's so awesome! Hope you and your brother get to make a game you can be proud of! Let me know if anything is too confusing or need more explanation and I'll do my best to answer! Good luck game dev'ing!
I absolutely love the way you go through everything. As a programmer, I do have some times where I question the method to your madness, but you often times think ahead about the questions that may arise and answer them. I appreciate how you think out loud, your workflow is similar to my own, and you have a pace which is great for learning. I don’t think you over-explain (this is also in response to the first video) and prefer it when the thought process is explained. One edge case I am not sure you accounted for was being able to use cards during an enemy’s turn. I don’t believe it’s technically possible just due to the speed of the enemy turn but if you ever prolong it for animations, it will be more evident.
Haha It's great to hear that my chaotic method is eventually addressed through my "thinking ahead" explanation! I often find that pausing too long to decide the "best" way often leads to halted progress for things that would have been changed anyways.. so I learned to trust my ability to fix things in the future! On that edge case! it's true I haven't thought about "reacting to enemy move," but I think it would be as simple of a solution as adding "reacting" state and a careful decision on how to "enter" and "exit" that before enemy turn is over! I will definitely address this as I go further into this project and further break down the states (since i was planning on sub-dividing the states I decided on this video later). Thanks for watching and commenting! Happy game dev'ing!
Unless of course, the mechanic is not turn based but rather "reacting in mid action" like an action game! Then yea, as you mentioned handling user input during enemy turn animation would do it!
TH-cam didn't notify me of your new video, I even have the bell clicked and everything. Regardless, great video as always! Keep doing your thing man! Also I just noticed the Gloomhaven in the background, love that game.
Haha youtube notification is so random and unreliable sometimes... anyways thanks for watching! And yea I love gloomhaven! I just can't seem to get consistent group to finish :(
First of all, English isn't my first language, so it's pretty difficult for me to express my thoughts in a message, but hopefully, you will understand me lol. This is by far one of the best tutorials I have ever followed. I'm really thankful for all the effort you put into it. I'm halfway through this tutorial, and it's a delight to see you working! I did some things differently, for example, I used resources for types of cards, different types of cards, etc. Thank you so much for this, and I hope you get the popularity you deserve!
Wow what a high praise! Thanks so much! This means so much to me and makes me happy! And yea haha definitely should be using custom resources for better structure and typing too! I'll probably do a clean up session at the end!
As more of a functional programmer I’m yelling at the screen telling you not to put game logic in your cards, but that’s up to each person to decide. Personally I think visual objects should be dumb and all the important logic should happen in controllers where you have access to all the data. This method seems a lot more organized and flexible to me since you can perform any complex transformations on the data using any data in the game and then push visual updates to your dumb components at the very end, but people trained on the idea that code is a “mirror of the world” tend to think objects should contain running state and do things on their own which can lead to unpredictable outcomes. At the end of the day do you want a bunch of messy objects around with meaningful state hidden all over the place or do you want powerful controllers with access to a single source of truth for game state. That’s up to each person.
I do constantly go back and forth in my personal projects between powerful controller model based on more MVC approach and the style of object knows their own thing (like shown on this video series) I do agree there's a huge benefit in organization expectation of where what is. However, there's the headache of moving around gamestate variables between different components and the problem of that "gamestate" being a bloat that end up being too much information for some use cases. I tend to try focus on more of MVC approach when it comes to strongly UI type of interaction vs. Core game logic.. still learning and experimenting and shaping what I feel most comfortable haha. I really appreciate this comment and the kind of conversation and thought it is spawning! Thanks for that and thanks for watching!
@@ezthedev Sure I mainly work with web apps and serverless backends now, but even though I've been programming for 20 years my thoughts on all of this have never stopped evolving. Lately I like the idea of having very flat databases that are easy to query and make indexes on and then everything else starts as an event that gets processed by some controller for that event and then makes and alteration to data. Then the data change triggers a ui update. I have not made a game yet, but your videos are giving me ideas how I want to organize my game. I don't know if there is anything like an in-game database, but I like the idea of keeping all the current state data in one place and then pushing it out to the objects. It might not even need a database. A few dictionaries might be fine. Then also you could save all the game events and actually recreate any game based on just the events. Then you could rewind and fastforward the replays. Also no data is truly lost as the event log is immutable. Anyway I'm really excited to make my first game. Everyone doesn't need to do things the same way and maybe I'll find that the way I'm imagining needs to change. That will be part of the fun.
@@nickjunes I'm excited for you and your game! Your exploration of idea of "main database of events/data" reminds me of this one approach that I've seen people do. There's a way to setup a "global" script where it's almost like Game level static (singleton) object. It's accessible ANYWHERE in the game code without any injection. I've seen people use this for gamestates and configuration. Maybe I can explore that! As an aside, I have been also trying to read up on the design intention of Godot as an engine and what people have been finding useful / effective! So hopefully I can share my findings on my future videos for more discussions like this! Thanks!
I prefer the term “limited state machine” to just “state machine” because technically all software is a state machine but the only real distinction is having a smaller more manageable number of outcomes. Otherwise software no software can produce output outside its maximum number of values.
Agreed! I always say basically everything is a "state machine". When I in schoole we called it "finite-state machine" which translates to what you call "limited " nicely haha
Honest question: in a turn-based card or board game, why do you use _process() to determine which state the game is in? As the game advances only after an action (such as selecting a card) which can be handled by emitting a signal that all scenes can pick up to act accordingly.
And you are right! In saying, for the most part state only progresses on action, and performance and "sync" wise that maybe more convenient. Personally, I like the process loop keeping the state action because it is more flexible to take in any type of "sub states" that maybe animation/timing dependent in the future. When working on games, I often find myself needing to switch over to less action/turn dependent state changes as the game matures, so I made a habit of starting the implementation like this!
both function to spend mana and take damage will just only work one way, can't you change "int hp" and "int mana" to a certain amount depending on the card use ?
That is perfectly valid way to try and manipulate those values! From my experience... because you may add some sort of passive effects that gets added (due to item gain or curse), sometimes you want to separate the implementation for gain versus loss. For example, you may have effect that happens only on life gain. And I don't think it's enough to say "if incoming change is positive, interpret it as gain" since those values can be further altered depending on how rest of the game is implemented! Hope this answers your question, but once again my way is only ONE of the ways to do this, and your suggestion is perfectly valid as well!
I believe that the importance of following best practices grows with the scale of the project and the amount of people working on the project, but they impose a cognitive cost on the individual developer that hinders their ability to work fast and focus on what really matters. In small projects like this it's best to take a little bit of time to adjust and clean up your code every once in a while instead of worrying about best practices at all times.
I really enjoing this serie. But i have some questions: 17:00 why you don't import the node with @onready and you do instead the ($node as node) thing? why you do not use custom resources for the cards'data? ps: I really like your approach. I often has decision paralysis when I'm working on a project and your "I'll do it later if it needed" approach is very helpfull
thanks for watching! and i'm glad my way of prototyping is helping with your struggle with decision paralysis! haha For your questions: 1. I tend to bias towards ($node as node) in-line when I'm trying to use a component that I'm not familiar with since I'm just trying to quickly test and see what "methods" are available for the class. It's more of a device i use to not break the flow. Whenever I need to touch that $node again in the code, I usually go back to using @onready var.. since that's just overall better! 2. For this particular case, I didn't think going through the works of creating custom resources for the card and then loading that on a unique card scene necessarily helps me enough to bother with it. In my head I thought, "well I will have a resource file representing the card data, and the scene file representing the card.. why not flatten it out to simplify." However, I do intend to create custom resource for game state eventually at least! if you prefer custom resources for cards, that's 100% fine too! Hope this answers your questions.
I'm having so much fun! Hope everyone is following along happily!
I just wanted to say "thank you". Your videos are very helpful and I learn a lot from them! So THANK YOU for the good and inspiring work, please keep it going.😊
@@FeiryStorm omg that means so much to me! I'm so happy to hear that I can produce something fun and inspiring! Happy dev'ing!
Amazing video! I definitely recommend making more videos like these full guides, maybe guides on RPGs or Roguelikes! I love the in depthless of your videos as well!
Keep it up!
@@Miguelcc08 thank you so much! i really hope to get around to all the other genres eventually (sooner than later!) thanks for watching!
@@ezthedev No worries! Love your stuff. Do you have a discord server to join?
Only about 45 minutes in and this is extremely enlightening! I see so many videos talking about composition vs inheritance and show a script saying it's easy to follow and end the video. You finally explain the code and funny enough you never said composition or inheritance! Your two videos make me understand the code rather than just show the code.
Also I'm pleased to find a prototype coder instead of code snob
Thanks and cheers!
Haha prototype first coding has always felt more intuitive and efficient for me personally! Thanks for watching! I'm glad this video has been enlightening/entertaining for you!
These are super useful and entertaining, thanks for making these!
Thank you so much for the support ! This means so much to me! :)
It's so satisfying to get to the end of the tutorial because it really is a journey following you through all the problems and everything. Thank you very much, keep helping us.
Thank you so much for following along in this journey! I'm so gad that you are able to experience the satisfaction of completing and seeing the result
Hello, gonna say I'm loving these tutorial videos and the way its presented. The workflow and idea process is raw and I am able to absorb how to approach things when working on a game. I am currently trying to make a card game but its field based. But I do am getting points based on this tutorial. For now, I'll try to follow the tutorials and hopefully I can translate these into functionalities like placing cards on a field or summoning entities on a field. Looking forward to more of your videos!!! ( as of writing these, theres 2 videos that i havent watched yet) xD
Thanks for following along! I know things get messy and crazy as I find things out on thisn"tutorial" but I'm glad people are having a good time learning and seeing the real process!
I do hope to make a cleaner, "now I've done it once and learned let's try it again better and faster."
honestly this journey you're on is very inspiring. i appreciate all the honesty, any mistakes you make, the basis of all of this is incredibly helpful. and even your uncertainty with it, is helpful because i go through this as well. when i watch any tutorials talking about math and such, i wonder to myself if maybe i'm too dumb to make it through this because i really don't understand a lot of the math that's going on.
I love that sharing my mistakes and process is encouraging to others! And yea even for me there are moments where I feel stupid for not getting the math and logic in tutorials. However, over time by slowly learning and building up knowledge I know you can get there!
Thanks for following my journey! And hope you follow along and succeed too!
Hey, another episode is finally here
It is here! Thanks for watching haha
Thank you, please don't stop😄
thanks for watching! I will not stop! haha taking a little time to get next few videos lined up so I can begin uploading more regularly, but I will be back with them soon!
@@ezthedev This is amazing❤
been looking forward to this!
Aww that makes me happy! Thanks for watching!
Great first 2 videos on this. Appreciate it a lot
Thanks for watching!!
I've never been one for long videos, but as a game dev very much in the beginner phase, it's really helpful looking at how the process really looks like, in comparison to tutorial vids just telling you what to do.
Im so glad to hear that you found this helpful! Thanks for watching!
Ill be following along with my younger sibling this week. They understand coding concepts easier than I do so I figure our combined efforts will make us unstoppable! I am excited to have a project we will both enjoy! Thank you.
That's so awesome! Hope you and your brother get to make a game you can be proud of! Let me know if anything is too confusing or need more explanation and I'll do my best to answer! Good luck game dev'ing!
I absolutely love the way you go through everything. As a programmer, I do have some times where I question the method to your madness, but you often times think ahead about the questions that may arise and answer them. I appreciate how you think out loud, your workflow is similar to my own, and you have a pace which is great for learning. I don’t think you over-explain (this is also in response to the first video) and prefer it when the thought process is explained.
One edge case I am not sure you accounted for was being able to use cards during an enemy’s turn. I don’t believe it’s technically possible just due to the speed of the enemy turn but if you ever prolong it for animations, it will be more evident.
Haha It's great to hear that my chaotic method is eventually addressed through my "thinking ahead" explanation! I often find that pausing too long to decide the "best" way often leads to halted progress for things that would have been changed anyways.. so I learned to trust my ability to fix things in the future!
On that edge case! it's true I haven't thought about "reacting to enemy move," but I think it would be as simple of a solution as adding "reacting" state and a careful decision on how to "enter" and "exit" that before enemy turn is over! I will definitely address this as I go further into this project and further break down the states (since i was planning on sub-dividing the states I decided on this video later).
Thanks for watching and commenting! Happy game dev'ing!
Unless of course, the mechanic is not turn based but rather "reacting in mid action" like an action game! Then yea, as you mentioned handling user input during enemy turn animation would do it!
@@ezthedev very true! I should develop that myself. I often get preoccupied on overthinking and it halts me from doing.
TH-cam didn't notify me of your new video, I even have the bell clicked and everything. Regardless, great video as always! Keep doing your thing man! Also I just noticed the Gloomhaven in the background, love that game.
Haha youtube notification is so random and unreliable sometimes... anyways thanks for watching!
And yea I love gloomhaven! I just can't seem to get consistent group to finish :(
First of all, English isn't my first language, so it's pretty difficult for me to express my thoughts in a message, but hopefully, you will understand me lol. This is by far one of the best tutorials I have ever followed. I'm really thankful for all the effort you put into it. I'm halfway through this tutorial, and it's a delight to see you working! I did some things differently, for example, I used resources for types of cards, different types of cards, etc. Thank you so much for this, and I hope you get the popularity you deserve!
Wow what a high praise! Thanks so much! This means so much to me and makes me happy! And yea haha definitely should be using custom resources for better structure and typing too! I'll probably do a clean up session at the end!
Great tutorial. Thank you for your time and effort.
thank you for watching!
Hey, found you a bit ago but just moved so a bit busy.
Excited to follow along, i like the way you present your vids.
Thanks for the comment! I hope it's a meaningful and fun follow along for you!
I JUST finished watching EP 1!!
What a perfect timing!
You're doing a fantastic job, and I'm excited to learn more from you. Keep up the great work!
Thanks so much!
Hey Ezra, your videos are excellent, thanks for all of your help. Please continue this series.
Thank you @remingten for watching! I'll do my best to continue putting out contents for this series and other useful contents like this for you! haha
this looks so cool! do you plan to implement a save system as well? I'm really struggling with that
Thanks for watching! And yea! Save and load should definitely be part of it!
great videoooo
Thank youuuuuuu
As more of a functional programmer I’m yelling at the screen telling you not to put game logic in your cards, but that’s up to each person to decide. Personally I think visual objects should be dumb and all the important logic should happen in controllers where you have access to all the data. This method seems a lot more organized and flexible to me since you can perform any complex transformations on the data using any data in the game and then push visual updates to your dumb components at the very end, but people trained on the idea that code is a “mirror of the world” tend to think objects should contain running state and do things on their own which can lead to unpredictable outcomes. At the end of the day do you want a bunch of messy objects around with meaningful state hidden all over the place or do you want powerful controllers with access to a single source of truth for game state. That’s up to each person.
I do constantly go back and forth in my personal projects between powerful controller model based on more MVC approach and the style of object knows their own thing (like shown on this video series)
I do agree there's a huge benefit in organization expectation of where what is. However, there's the headache of moving around gamestate variables between different components and the problem of that "gamestate" being a bloat that end up being too much information for some use cases.
I tend to try focus on more of MVC approach when it comes to strongly UI type of interaction vs. Core game logic.. still learning and experimenting and shaping what I feel most comfortable haha.
I really appreciate this comment and the kind of conversation and thought it is spawning! Thanks for that and thanks for watching!
@@ezthedev Sure I mainly work with web apps and serverless backends now, but even though I've been programming for 20 years my thoughts on all of this have never stopped evolving. Lately I like the idea of having very flat databases that are easy to query and make indexes on and then everything else starts as an event that gets processed by some controller for that event and then makes and alteration to data. Then the data change triggers a ui update. I have not made a game yet, but your videos are giving me ideas how I want to organize my game.
I don't know if there is anything like an in-game database, but I like the idea of keeping all the current state data in one place and then pushing it out to the objects. It might not even need a database. A few dictionaries might be fine.
Then also you could save all the game events and actually recreate any game based on just the events. Then you could rewind and fastforward the replays. Also no data is truly lost as the event log is immutable.
Anyway I'm really excited to make my first game. Everyone doesn't need to do things the same way and maybe I'll find that the way I'm imagining needs to change. That will be part of the fun.
@@nickjunes I'm excited for you and your game!
Your exploration of idea of "main database of events/data" reminds me of this one approach that I've seen people do. There's a way to setup a "global" script where it's almost like Game level static (singleton) object. It's accessible ANYWHERE in the game code without any injection. I've seen people use this for gamestates and configuration.
Maybe I can explore that! As an aside, I have been also trying to read up on the design intention of Godot as an engine and what people have been finding useful / effective! So hopefully I can share my findings on my future videos for more discussions like this! Thanks!
@@ezthedev Thanks! I'm looking forward to more of your videos.
I prefer the term “limited state machine” to just “state machine” because technically all software is a state machine but the only real distinction is having a smaller more manageable number of outcomes. Otherwise software no software can produce output outside its maximum number of values.
Agreed! I always say basically everything is a "state machine". When I in schoole we called it "finite-state machine" which translates to what you call "limited " nicely haha
@@ezthedev Thanks! This makes me feel less crazy. Also thanks for the videos I'm learning a lot!
Honest question: in a turn-based card or board game, why do you use _process() to determine which state the game is in? As the game advances only after an action (such as selecting a card) which can be handled by emitting a signal that all scenes can pick up to act accordingly.
And you are right! In saying, for the most part state only progresses on action, and performance and "sync" wise that maybe more convenient. Personally, I like the process loop keeping the state action because it is more flexible to take in any type of "sub states" that maybe animation/timing dependent in the future. When working on games, I often find myself needing to switch over to less action/turn dependent state changes as the game matures, so I made a habit of starting the implementation like this!
Subbed :)
Thank you!
both function to spend mana and take damage will just only work one way, can't you change "int hp" and "int mana" to a certain amount depending on the card use ?
That is perfectly valid way to try and manipulate those values! From my experience... because you may add some sort of passive effects that gets added (due to item gain or curse), sometimes you want to separate the implementation for gain versus loss.
For example, you may have effect that happens only on life gain.
And I don't think it's enough to say "if incoming change is positive, interpret it as gain" since those values can be further altered depending on how rest of the game is implemented!
Hope this answers your question, but once again my way is only ONE of the ways to do this, and your suggestion is perfectly valid as well!
@@ezthedev yeah, it's true if you need later on to play around gain or loose hp in the gameplay mecanics, your way is better.
I believe that the importance of following best practices grows with the scale of the project and the amount of people working on the project, but they impose a cognitive cost on the individual developer that hinders their ability to work fast and focus on what really matters. In small projects like this it's best to take a little bit of time to adjust and clean up your code every once in a while instead of worrying about best practices at all times.
Agreed!
Did u just teach us how to use a vending machine lol
Best knowledge is unexpected and unwanted knowledge! Lol... yes..
I really enjoing this serie. But i have some questions:
17:00 why you don't import the node with @onready and you do instead the ($node as node) thing?
why you do not use custom resources for the cards'data?
ps: I really like your approach. I often has decision paralysis when I'm working on a project and your "I'll do it later if it needed" approach is very helpfull
thanks for watching! and i'm glad my way of prototyping is helping with your struggle with decision paralysis! haha
For your questions:
1. I tend to bias towards ($node as node) in-line when I'm trying to use a component that I'm not familiar with since I'm just trying to quickly test and see what "methods" are available for the class. It's more of a device i use to not break the flow. Whenever I need to touch that $node again in the code, I usually go back to using @onready var.. since that's just overall better!
2. For this particular case, I didn't think going through the works of creating custom resources for the card and then loading that on a unique card scene necessarily helps me enough to bother with it. In my head I thought, "well I will have a resource file representing the card data, and the scene file representing the card.. why not flatten it out to simplify." However, I do intend to create custom resource for game state eventually at least! if you prefer custom resources for cards, that's 100% fine too!
Hope this answers your questions.