Code problem question: Branches alternative

Hello,
I have some question I didnt find a clear answer to, so Im asking to you that surely are way more expert than me.

Lemme give some context:

Im trying to solve a problem that is about an alternative to using a couple of Branch nodes.

-I have an actor, this actor has a random Integer assigned between a min-max value that the code will assign to it and display to the player through a WidgetB. Nothing hard, very easy.
But this number is random, as I said, so in order to assign it the right Enum (I need this Enum value in order to display it correctly in grams/1 digit Kg/2digits Kg etc etc…) value I need to do basic math with branches before setting the right Enum.

-The workflow basically is: Random Int between Min-Max → Result Int >= than x, /> than or < than? Branches check → if one of this branches is true then the Enum is setted to the right value.

Example: Random Int assigned is 13000, 13000 is greater than 10000 so assign the Enum = Chilograms.

-This “random Int” is one and only one, is not setted to multiple actors but to one single actor and every time is cleared before setting it again.

Now, my question is, is there a way to zip the code and make it more “elegant” without using 3-4 branches nodes and then assign/set the right enum?

I tried using a Map Var. but the problem, as you can imagine, is the map doesnt know if the Integer belongs to Enum 1 or Enum 2 or Enum 3 because the Int is random generated, so I need anyway to use branches to check that integer before setting the right enum, so making it useless using a map and a for each loop to make a more slim code.

Is there any workaround to this problem or, considering is a random number, the only way is using basic math –> branches –> set Enum?

Thanks for the time reading this no-sense

it was quite hard to understand, but i don’t think having multiple branches is bad. it’s one of the few cases where it might be the best way.

a branchless code would use math to convert those ranges to “discrete” values https://statisticsbyjim.com/basics/discrete-vs-continuous-data/

that match the enum values, then convert the values to enum directly.

but that math could be tricky.

if you end up using something like clamp or mod (%) it will use a branch under the hood.
and it will make it much much harder to read and tell the intention.

don’t understimate the value of clarity of intention and ease of understanding.

aesthetics by themselves are not valuable and are subjective. ease of read, maintain, and clarity of intention are much more important, in my experience (they are still subjective, but asthetics are extremely contentious for no good value). unfortunately it’s very easy to confuse ease of read with aesthetics.

Thank you for your reply.

While waiting for someone to answer, I continued to try out others solutions, attempting to use only one branch node but, as you already said, I believe this is one of the few cases in which trying to avoid the use of multiple branch nodes make the code way more confusing and complex than it actually was at the beginning; making it not clare and easy understandable if someone will try to make a mod of my game or simply looking at the code for personal purpouses.

The aesthetics were secondary; it was more to avoid multiple branches for a my “personal tantrum”.

Looking at the profiler, I came to the conclusion that it was much more efficient to use branch nodes than the other solutions I found or tried. It wasn’t a huge difference, but the first “version”(in the screenshot) was clearly more efficient and faster.
Especially considering that that Integer would also be influenced by a function that determined the probability of it being assigned more easily based on a percentage.

Sometimes simpler is better, this one is the code I was trying to “zip up” - just fyi. And as you said, its way more easy to understand this than a for each loop with complex operations that, at the end of the day the final code would make the exact same thing but slower and more confusionate

1 Like

great work!

don’t underestimate the value of simplicity. “simplicity is the utmost sophistication”.
also the value of readability. the more clear the intention of the code them easier it is to maintain and document.

this is one of my fav principles KISS principle - Wikipedia not a rule, but a principle. (i only pay attention to a few that are really worth it, that’s one).

it’s not the only value or factor, but it’s a very useful one.

i’m a fan of optimization and i do a ton of low level micro opts, but readability and intention still win most of the time for most of the projects.

just spending so much time even considering optimizing this, is quite a waste in the project tbh. it’s not a waste if it’s a learning experience though.

i do not think you would gain much perf out of that code. and if you do, i would say there’s a problem with your architecture, not your code.

one suggestion though, i would cascade those if’s. e.g. connect the next if to the previous “false” branch.

i don’t know for sure since the image, the text is unreadable, and i don’t see the full code. but the pattern looks “mutually exclusive” to me.

something like

1 Like

I just spent a couple of hours on it not days and its a personal project so Its fine no one losing money ahahaha the project is pretty big in therms of mechanics and gameplay loop so I try to find the best possible approach to everything I make, just to not leave nothing to the laziness.
Im not an expert coder or a blueprint expert (in fact, I never coded in my life before this project, just a couple of minecraft mods when I was 14yo and now im a grown ■■■ man of 27) so if I can learn something during this “solution finding process” its always a good thing for me. Wasting time is relative if you gonna learn something from it imo

Yep I did already modified that code into a cascade, it was like that using a sequencer because I was testing out different approaches to, as I said, try to use only one branch so i was testing on a single branch leaving the others out of the “testing zone” but now I fixed that into a single cascade to check that random Integer. Way more readable and easy to understand what is doing that function. So if anyone will, for some reason, make a mod of the game he could easily understand the process and modify it for his purpouses.

I needed that branches check for a pretty simple feature of the game: it takes two “clamped” integer from a structure after a probablity function that determines if the actor is a small specimen or a big one. The result map’s key and value are assigned to a “random int in range” and the return value will be checked through that branch code that I showed initially in the thread about to set the right Enum, I need that Enumerator in order to print through a widget (multiple widgets) the right value of that specimen: so if its, for example, 204g or 12,7kg, or 102kg. The branch node before the two collapsed graph is needed because if a specimen is a “small” one then either the length must be taken from the “Small” Map’s value and key (im using that as a Min-Max map since every specimen will have different weight and lenght I set for each actor) or there were situation where a 20cm specimen would weight 4,5kg ( just an example, but during some tests turned out something like 20cm and 23kg or even more cuz the two values were assigned independently) and thats not so logic and believable.

Im showing this to you because maybe you have a different approach to optimize the entire process, every suggestion is appreciated

The reason im using a Structure for the RNG and Weight/Lenght values is for scalability, so If i just want to add a new actor all I need to do is setting his values inside the structures and every mechanics knows what they can and cant do with that specific actor or values without setting or creating new variables everytime inside differents blueprints. I used structures mainly to avoid everytime checking what actors is and then setting his values in the related blueprint/actor that needs to do something with the specimen, pretty boring and could result in various problems in therms of scalability for what I learned through this dev journey, correct me if im wrong

everybody does lol. 2 people 4 opinions.

here are some suggestions:

you’re loosing time. which is way more valuable than money. time is your essence and it won’t come back. money comes and goes. just because you have free time atm doesn’t mean you’ll have it later. and in retrospective is usually more desireable to do more interesting things, than spending time in uninteresting thing. also the way you spend your time determines the money you’ll make. and it’s an investment, the value gets compounded with time. don’t mean to scare you, just what i’ve learnt with “time”.

in any case don’t underestimate. “it’s just a personal project” sometimes is used as a clutch to lower anxiety and friction and that’s totally fine. but also the more responsible you are with your code the farther you get. you never know if your project will suddenly become popular (its better not to expect it). also it’s always an opportunity to learn, and if you don’t take the coding a bit serious, you won’t learn anything serious. of course you have to balance it, don’t become a purist, dogmatic or believer of the one and only best practice. that really stunts progress. like i said above and might sound contradictory, don’t spend toooooo much figuring out meager things. that’s my opinion, a balance. try your best, don’t waste too much time.

it’s also useful to keep an eye on it since sometimes you can copy code. i started puting the code of my project in plugins and i can reuse them.

but if you’re not an expert don’t expect your code to be perfect and don’t try to make it perfect either. (perfect is the enemy of done, good enough is better than good). in my experience.

though i rather not think of my self in terms of expert, that way i can keep learning. learning is pretty much constant.

other suggestions:

in the first picture: don’t use a macro, use a function. i don’t really like macros. functions are more usable. macros tend to create really bad code. returning multiple values from a function is an indicator of bad code and it will force you to have those branches. i’d say make a function and return the enum. one single enum. enum are hugely powerful including “select” and '“switch” nodes.

also multiple return execution pins is not amazing. is the equivalent of gotos.

2nd picture. use local variables for those arrays. and don’t use collapsed nodes like that. use functions. functions are the most important base for coding. better than macros and events in my experience. i rather think of collapsed nodes as a folder to put my nodes in. but i use functions.

3rd picture. joining execution lines is akin to gotos. i wont tell you not to use it. sometimes you need it when falling of a branch (though i rather use a sequence for that). but joining execution lines it’s the way to spaghetti code.

4rd picture. lots of repeated code. i would refactor that “Weight value” function to receive the weightclass enum.

btw another suggestion, i’d make sure that the branches are in order, from smaller to bigger.

that way it’ll be a bit more efficient. though its hard to measure.

also if the categories are exclusive you can simplify the booleans expressions.

for example the 1st expression is Weight < 1000

the 2nd expression is Weight >=1.000 & Weight < 10.000 (dunno hard to read)

if you connect the false branch to the next one, you can imply that Weight<1.000 is false, hence Weight >= 1000 is always true. so in the 2nd branch you only need to test if Weight <10.000

same for the other branches.

it also avoids making the (very common mistake even after decades working) of mixing a <= with a < and now you have one value (1000) that it’s neither <1000 nor >1000 and gives weird results.

try to avoid doing the same thing twice, is kinda a pretty decent guide in programming (in balance of course) some people call it “don’t repeat yourself”.

i’d say there’s a way more important reason that is easy to dismiss early. it’s good for yourself. the longer you spend making your project the more difficult it is to maintain. sooner or later you’ll forget something and it will be hard to know what you did. so even if it is for yourself only it’s important to be clear and simple.

also that idea about “debugging is twice as hard as coding, so if your code is too complex to understand you wont be able to debug it” or smth.

1 Like

Thank you for the huges suggestions, very much appreciated.

For the first part of your answer, I never saw that in that perspective and you are right: “just because you have free time atm doesn’t mean you’ll have it later.” This made me think a lot, I will keep that in mind.

”but also the more responsible you are with your code the farther you get”
Thats the reason I want to find the best way to improve my code even if its decent and could work like as it is, I want to make it even better so I can learn something new for the future projects too.

”that’s my opinion, a balance. try your best, don’t waste too much time.” Totally right.

Okay I didnt know Macros were bad, I thought was a useful “tool” to keep local stuff organized and re-use them. I will take out that math from the macro now lmao

”equivalent of gotos” You will kill me for this but…. I don’t know what it means, Is the meaning for jumping a section of the code that can lead to bad code? (pls dont kill me)

Returning multiple values from a function […] one single enum. enum are hugely powerful including “select” and '“switch” nodes.

Wait what u mean multiple values from a function? (1) You suggest me to not make a single function with every “enum check” inside but to make multiple functions with a single return of the enum I need? So 4 different function or a single function that return the enum? Because all that code is yet inside a function but doesnt return nothing it just set the enum needed for the Switch on Enum, is that bad? Maybe i didnt understand what u meant my english is kinda meh

Edit 3:Maybe I understood what u mean, u saying that using a macro for that is bad but making a function returning multiple boolean values is also a bad practice/code so u was suggesting me to put everything inside a function and return the enum without using macros and function for the math but just everything inside a single function returning the enum, Im correct?

Anyway, why I shouldnt output multiple values from a function? Is not that their “purpouse” other than calling them multiple times? And if, for example, I have a function that output multiple and different values (like a hit struct, a boolean and an actor reference) I need to make a struct holding all those variables in order to make the function output only a single value?

And yeah im using select and switch on enum nodes, they are very useful in many cases

2nd picture. use local variables for those arrays. and don’t use collapsed nodes like that. use functions. functions are the most important base for coding. better than macros and events in my experience. i rather think of collapsed nodes as a folder to put my nodes in. but i use functions.

Yeah I used collapsed to put inside nodes to avoid making a function I will not re-use so I thought a collapsed, as u you said using it as a folder, was more efficient/good for that purpouse. Inside the collapsed there are nodes that basically take the key and the value from the array and assign it to the random int in range node, so considering its something I don’t need again I thought a function was useless, but I can convert them if they are more convenient

EDIT: Since im very dumb and nodes and operation are the same (take key and value at index 0) for every collaps_graph I promoted them to a single function and called it instead of using collapsed, way better lmao

”Use local variables for those arrays”, totally right I didnt thought about that I could be dumb at this point.

3rd picture. joining execution lines is akin to gotos. i wont tell you not to use it. sometimes you need it when falling of a branch (though i rather use a sequence for that). but joining execution lines it’s the way to spaghetti code.

Yeah u right, I don’t know why I joined them when I could have use a sequencer - that will make them independents and avoid problems, totally right

4rd picture. lots of repeated code. i would refactor that “Weight value” function to receive the weightclass enum.

Im a little lost here (2), “Weight Value: Print on Screen” is after a Switch on Enum(Weight Class Enum with the math check from the 1st screenshot) so what u mean? To receive directly the Integer variable (Random Weight to Display) to avoid repeating it or im not understanding the entire suggestion? Because if Weight Class Enum is needed before to set the right switch enum for that switch to fire the right “Print on Screen” how can i refactor it to receive the function after the related Switch part? Maybe im dumb sorry and i didnt understand it at all

btw another suggestion, i’d make sure that the branches are in order, from smaller to bigger.
that way it’ll be a bit more efficient. though its hard to measure.

Yep they are yet in order from smaller to bigger, I didnt even think about it was a natural and logical thing I made in the first place

also if the categories are exclusive you can simplify the booleans expressions.

Oh yeah you totally right, since I changed the code to the original one I can get rid of the AND check boolean, totally right

i’d say there’s a way more important reason that is easy to dismiss early. it’s good for yourself.

And again, totally right.. the project is yet quite big but im not having problem to find and fix thing when I find some problems or I need to change something but I agree with you, better to be cleaner and simple as much as possible just to avoid falling in that mistake. Thats why im making so much question to you ahahahah I want to improve as much as possible, and even its a personal project maybe it can turn into something I will update/add content to so better to be a nice and clean developer from the start than crying in the future, totally agree with ya

Edit 2: I fixed all the stuff except for the point number 1 and 2: the multiple return values from a function and the refactor for the weight value function because im waiting a your answer cuz i didnt full understand the suggestion and I dont want to make a mess doing something before understanding what Im going to do.

that makes me want to help further :slight_smile: thanks

Zelda Good GIF - Zelda Good - Discover & Share GIFs

good. that’s something worth thinking about. it’s something important. not to be depressed, but to make the best use of what you have. also how i’ve seen life works.

like the meme

but sometimes it’s just “■■■■ happens” and well. you have to rearrange your life.

for example, last night i saw this video, of a guy working 10 years on a game, and suddenly it had to rush to make a demo in early access because he lost funding. and had to cut a ton of content (many years of work). he was lucky to pull it off. but most people aren’t and it’s a lost opportunity. from my outsider pov he could have been more efficient/effective and saved a lot of headaches.

i’ve been through enough shhtuff to know that’s pretty common. and i’ve worked on a few companies that had the same issue.

Macros (not to be confused with Macross :ringed_planet:) aren’t “bad” (i don’t think in terms of good/bad). you have to know when to use them and how. the way you were using them would bring you issues. most people using macros are overusing them in my experience.

don’t worry i’m not dogmatic, nor i expect people to know things. i just like to help and share my views. goto’s are a very old element in programming which allows you to jump to random places of the code. when used properly they are good, and the cpu works in terms of gotos. so if you disasemble a program, or write assembly, you’ll end up doing gotos. but they are hard to maintain and requires proper thinking. and end up causing issues when missuses. so most people decided that “goto” was a bad word. to avoid even having to think about them. not bad per se, but requires discipline and careful thought. and they aren’t really necessary. pretty much like macros. you can get away with not using them without much pain. (for general programming i mean). the fact you don’t know about them, it’s a pretty much a result of that i think.

gotos in particular lead to spaghetti code, and unpredictability, since you can’t really follow the flow of the code as easily.

macros have specific side-effects, when you’re starting you might not be aware of them (dejavu). i won’t explain now, but beware they exist and require time to learn.

i used function too loosely. i meant “block of code”.

this macro returns 5 different variables. and will force you to branch always you call it (mostly).

i would put the branches inside the same block of code and return that enum. so only one variable. since my experience tells me you’ll rarely need to know exactly that one of those bools is true. and if you do, it’s easier to do with a select or switch node, using the enum instead of 5 bools.

rule of thumb, if your values are mutually exclusive, and boolean (on/off), an enum will be fine. (but make sure tehy are mutually exclusive,

a single function that returns the enum.

this is a stub

you can either return the value or set it on the variable you use. that depends on how you will use the function.

at the same time. multiple output variables. it’s leads to issues. usually you’ll return only one variable. if you need complex data you usually use a struct or a reference. since bps has issues passing things by reference, sometimes you use more than one variable.

for example map::find returns the value and another boolean to know if it found it or not.

this is legal and i’ve used it multiple times, specially when interfacing with bps. but it’s not ideal imho. nobody will kill you, and shouldnt. but i prefer to minimize that to make it easier. now, returning 5 bools is just too much.

most of the times yes. if the values are “correlated” you’d probably want to use a struct. correlated are values that together make up a concept. e.g. you have a car piece. every car piece has a mesh, a position, a scale, a rotation, etc. those should go together most of the time. so make a struct. then in the future it makes it easier to define other things, like data tables. and it’s easier to pass parameters from one function to other. since you only connect one cable.

sometimes if you have a function with lots of params, you just make a struct to clean it up. but that’s preference. i’ve done that for a cpu 3d renderer in cpp that had to pass like 10 parameters, and it was getting annoying to maintain. later on it saved me since i used it for other things.

ultimately is your call. you’ll get the hang of “how many are too many”. but it’s good to be aware that multiple return values usually are a sign that something could be improved.

i personally would still recommend a function even if you use it only once. i have ton of those. since they are more closer to programming paradigm than collapsed nodes. you don’t have that in cpp. also having data going into the collapsed nodes and data out makes it harder to handle.

a function still provides some usefulness, it can be reused, bound to events, renamed, found in searches, they also can use return nodes which breaks the flow, exposed to other objects, etc.

the reason is good, but the reasoning might miss a bit. you don’t know if you are going to need it or not. using a function is not THAT much more effort than collapsing the nodes. in fact you can just select > right click > collapse to function (i think). yet not using a function prevents you to reuse it in the future. so you end up with what could be called “technical debt”. or plainly get shot in the foot for refactors.

the biggest issue i see with bps is that it has many new utility elements like macros and collapsed nodes and events, multiple execution paths, the ability to goto, that lets people use ways of doing things that are not the usual ones, then they get confused. i don’t say they should remove it, it has its place, but it confuses people. and most of the bps users are not hardcore programmers, they’re mostly people starting, designers, artists and other non-programmers. so it’s too much power to shoot yourself in the foot. kinda funny, since that’s the argument some programmers use to force others to not use goto. lol.

i usually would prefer a sequence for that code. that way makes it much easier to maintain.

i don’t have much more time. but what i meant is to remove that switch. and have only one function for “Weight value print on screen”. that receives both, the “random weight to display” and the enum that you use on the switch.

in fact i wonder if you really need to pass the enum at all, or you should call the function that converts a weight to an enum inside WeightPrintOnScreen. which is what i would do. it depends on whether you are going to use the enum elsewhere.

in cpp itd be something like this.

(this is pseudo code fast, it wont compile) also if you want to translate your game you would need to use ftexts.

EWeightType GetWeightType(float Weight){

if (weight <1000) return EWeightType::Grams;

if (weight < 10000) return EWeightType::KG;

return the last one;

}

FString WeightValuePrintOnScreen(float WeightToDisplay) {

EWeightType Type = GetWeightType(WeightToDisplay);

FString result = “Whatever text “ + FString::FromFloatIDontRemember(WeighttoDisplay);

switch(Type){ // you can use an array instead

case ::Grams: result+= “gr”; break;

case ::KG: result += “kg”;break;

}

return result;

}

yeah. it’s helpful to be clean when you can to avoid having to pay for it later. but beware. you can be “too clean” to the point of being wasteful (ocd/paranoic/dogmatic/etc). if you end up arguing with your colleagues, it’s a red flag. also it’s important to move forward and break stuff sometimes. perfectionism leads to paralisis, and there are too many things that you only learn by experiencing them (that’s why i try not to tell people what they “should”™ do and why i don’t like gpt that much (since it’s very strict on what it “knows” (it’s too eager to give you an “answer” and doesn’t care to ask what you want.)).

for example in my project that i’ve been working for 2 years, i started doing some things in a way, and a year later realized, actually, not optimal, let’s refactor it. and it was ok. i didn’t held the whole project to decide one thing. for example i’ve removed a big mechanic, and i’m happy i did it this way.

i was trying the technique for “do only good enough work, but only what you need, refactor later”. and i’m happy that it worked well. it’s a balance, doing good enough work. not too trash, not future proof/perfect.

one issue that i ran into, is, after 1 year of working in a project, i started to forget what i’ve done before and why. the codebase and content is quite large. so it’s easier to remember my pattern for how i work, than the specifics of the code. (like, oh i usually check for null pointers inside a function, not before calling it. so it’s relatively safe to call here, or this potential bug is not going to crash).

and maybe if you’re lucky you find someone to help you.

those are my opinions.

pd my english is not the best either, don’t worry.

1 Like

First of all thank you for this talking and suggestions, you helped me a lot in many aspect of how manage and think as a better dev/coder and thats more important than a “branch alternative” question so im glad you answered me in this thread ngl.

gotos in particular lead to spaghetti code, and unpredictability, since you can’t really follow the flow of the code as easily.

Got it, I will try to keep that away from my way of coding since I don’t want to make mess and since Im alone doing everything this pattern can lead me to big mistakes so thank you for warning me and giving me a better explanation.

macros have specific side-effects, when you’re starting you might not be aware of them (dejavu). i won’t explain now, but beware they exist and require time to learn.

I didnt know that, im reading a documentation about them right now and hopefully u warned me on them too because Im reading stuff I didnt know at all about the problems they can lead to. Yeah def they need to be used with logic and be aware of how they work before using them without thinking. Hopefully that was the only macro I used so not a big deal for me just getting rid of it.

i would put the branches inside the same block of code and return that enum. […] rule of thumb, if your values are mutually exclusive, and boolean (on/off), an enum will be fine. (but make sure tehy are mutually exclusive,

Okok perfect hopefully I understood it later correctly and fixed that yesterday, I did exactly what u saying getting the enum value from the function. So a single func with the enum output, and since I dont need that enum anywhere else I did a big change to all that block of code in the grap and that function: so now the two switch on enum are inside a single function that include getting the enum and directly running the piece of code for the switch, a very good improvement ngl the code is much clear and readable and not anymore hard to follow. This bringed me to “fix” other logic I did and now almost the whole code of the game is very easy to manage and understand what is doing. A big win here so thank you again

sometimes if you have a function with lots of params, you just make a struct to clean it up. but that’s preference.

Perfect, ngl that was more a “curiosity/need to know thing” but since I started this project I used structures very often to get values from functions or interface communication and they are life-saver in terms of scalability and storing/passing data.

ultimately is your call. you’ll get the hang of “how many are too many”. but it’s good to be aware that multiple return values usually are a sign that something could be improved.

So if I understood: its not a mistake, specifically talking, but its more a bad practice and its better to keep values in order and improve where you can. Perfect

i personally would still recommend a function even if you use it only once […] a function still provides some usefulness, it can be reused, bound to events…

you don’t know if you are going to need it or not

You totally right here too, in fact the edit on the message I made was about that and thinking about what those collapsed was doing it was useless so I just promoted it to a function (in fact I used that again later) so a function was the more logical and smart thing to do as you said.

Yeah I need to be aware about the UE utility tools can lead to bad stuff if used improperly so I will just stick with functions and custom event as much as possible to keep the code clean, easy to follow and understand and avoid of refactor when I’ll need a function I didnt made.

Your suggestions and this talking made me do a big improvement (not in memory talking but kinda too) about using local var for those arrays, I got rid of global I didnt need and - were useless to keep - and used local var in other functions too since the original data came from a struct and the local var didnt need to pass their data anywhere else so was kinda dumb using global since local are faster and “destroyed” immediately after the function “stop to exist”. Big improvement on the code here too, and a new thing learned for the future for sure.

i usually would prefer a sequence for that code. that way makes it much easier to maintain.

Since I refactor all that code block into a single function that works better ( Struct’s data → RNG probability check → Random Int → Check the Weight Class of that Rand Int → Switch on Enum → Print on Screen) now I don’t need a sequence anymore since is a “single line” of fire so 1)better to read 2) better to keep track of what the code is doing 3) functions I can use later if I need them 4) no need to use a sequencer or joining input anymore 5) better code in general

if you end up arguing with your colleagues, it’s a red flag.

Im alone doing everything the only one I can argue with is myself hopefully

and there are too many things that you only learn by experiencing them

Totally agree with you and you’re right, when I started this “journey” I didnt even know how to made basic stuff like passing data or what an Enum was, thanks to the experience and mistakes (and some study too to understand what coding is even if its in blueprint) I made an entire game I never imagined to achieve alone or from the starting. It started as a joke with a friend when I was playing an indie game and talking with him I was yapping about how it would be cool the same game concept but applied in other context without memes or funny stuff and he told me “do it by yourself”. Just a joke sentence that bringed me to made a whole game just for the will of making something I would like to play. Life is very unpredictable

those are my opinions.

Way more of just opinions, ngl you helped me a lot and I can’t thank you enough for all the time you spent on this and on me. VERY MUCH THANK YOU, really. I appreciate it so much you can’t imagine, sometime a little question can bring you to change and improve many way of looking at stuff and your work and directly improving it.

Thank you so much, again!

1 Like

no prob :slight_smile: i’m glad, makes me happy :slight_smile: it’s just my experience shared. you might find other answers as time goes on.

good for you :slight_smile: i’d recommend to try coding without macros until you really need them. that way you’ll see when they work.

great work! i’m glad! :clap:

all good. curiosity is a great teacher :slight_smile: curious people tend to learn very fast. and it makes learning fun , which is great.

i’m so happy about that. it’s really nice. placing one foot in front of the other. adding some perseverance, some time. and then you can see results. it’s very nice you dared im happy for you.

heheh thank you :slight_smile: you’re welcome ! :slight_smile:

keep it up and i hope you keep enjoying learning and making your game!

you can go very far i’m sure. :clap:

all the best wishes for you :slight_smile:

1 Like