THIS is what gamedev is actually like.

  Рет қаралды 58,253

BrosMakeGames!

BrosMakeGames!

Ай бұрын

hey we're two brothers trying to make it as indie game devs.
welcome to the family.

Пікірлер: 217
@rapushkaa
@rapushkaa Ай бұрын
i really love this quote, "the code does what you tell it to do, not what you want it to do."
@BrosMakeGames
@BrosMakeGames Ай бұрын
painfully true
@bupza
@bupza Ай бұрын
I am writing this down.
@kaiiboraka
@kaiiboraka Ай бұрын
"Do as I think, not as I say!" 😂
@charg1nmalaz0r51
@charg1nmalaz0r51 Ай бұрын
I always joke with my wife that the codes doing what i'm telling it to do and not what i think i'm telling it to do.
@DJL3G3ND
@DJL3G3ND 27 күн бұрын
except those few occasions where it ACTUALLY happens to be an engine bug which leaves you doubting every problem you ever run into from that point
@grass324
@grass324 Ай бұрын
>Looks at debugger >11717 errors
@null6482
@null6482 Ай бұрын
Too little, i have half a million
@chefaku
@chefaku Ай бұрын
better than having a bug and not getting any errors 💀
@null6482
@null6482 29 күн бұрын
@@chefaku good pfp btw
@chefaku
@chefaku 29 күн бұрын
@@null6482 my picture reflects the nature of the human being. how some can be white, normal and good and others are bl...
@rungeon83
@rungeon83 26 күн бұрын
I make sure I have 0 errors/warnings, even making if I'm not using delta to rename it _delta, silly I know, but when your game does break it's very easy to resolve it.
@lemonlimebitta8903
@lemonlimebitta8903 24 күн бұрын
I feel like as a game dev I’m just jumping from ‘I’m a genius!’ To ‘I’m an idiot’ on repeat
@DrTomb
@DrTomb 2 күн бұрын
Lol yeah, kinda love that tho 😂
@user-vv3gg6xm1b
@user-vv3gg6xm1b Күн бұрын
that what every programmer gets, no matter what they do lol😅
@GuyMakeGame
@GuyMakeGame Ай бұрын
Game dev in a nutshell “If I do (xyz) that should fix it” **multiply problem by ten**
@pydude13
@pydude13 Ай бұрын
idk why but this is the gamedev content I enjoy the most
@BrosMakeGames
@BrosMakeGames Ай бұрын
that's great to hear, thanks!
@gphr5987
@gphr5987 Ай бұрын
Maybe bcuz it's actually realistic 😂
@vaiterius
@vaiterius Ай бұрын
me too! super relateable
@damsen978
@damsen978 27 күн бұрын
Because he perfectly puts it into perspective the experience of an average game developer.
@McRaptorRex
@McRaptorRex Ай бұрын
Next step: add enemy ricochet off of walls on death.
@BrosMakeGames
@BrosMakeGames Ай бұрын
YES, on my to-do list.
@naalex9058
@naalex9058 Ай бұрын
​@@BrosMakeGames I'd be pretty easy, just keep collision with walls on, then on contact reflect velocity along normal of the wall. The formula for reflection is something like r=d−2(d⋅n)n where r is the resultant vector, n is the reflection vector (in this case the walls normal), and d is the input vector (velocity) Oh and d⋅n means dotproduct or dot(d,n)
@rungeon83
@rungeon83 26 күн бұрын
@@naalex9058 A much easier way would to use the bounce method of the vector2 class, so the example I wrote a while back so will be flawed but still works. I have a room with 4 staticbody2d walls as bounds, then a characterbody2d ball that I set off at vector2(0.5,0.5) and the code in the characterbody2d is as follows: extends CharacterBody2D var dir : Vector2 = Vector2(0.5,0.5) func _process(delta): velocity = dir * 10 var Collision_Data = move_and_collide(velocity) if(Collision_Data): dir = dir.bounce(Collision_Data.get_normal()) figured this might be interesting for anyone others reading.
@nubunto
@nubunto 26 күн бұрын
@@naalex9058 nice! godot has a method called "bounce" on Vector2 that does exactly this! so basically get the collision normal with move_and_collide (if using Kinematic/CharacterBody2D), check if collided, and bounce along the collision normal
@FloatingOer
@FloatingOer 21 күн бұрын
"Do what I want, not what I tell you!"
@NachitenRemix
@NachitenRemix Ай бұрын
Little advice for you all folks. Sometimes you just need to take a REAL break (away from you phone AND computer), and then ideas will flow more easily. Creativity needs energy, and energy needs rest.
@fk3239
@fk3239 4 күн бұрын
Fucking REAL. I was recently trying to solve a problem with jumping while on a slope. It would essentially bank and I think also multiply the vertical acceleration, spent a few days on it, couldn't figure it out and was getting really frustrated. Took a few days off of it because life stuff, came back, solved that shit immediately with barely any thought.
@thegameguy208
@thegameguy208 Ай бұрын
“Ok I just had an idea” *starts murdering*
@bluemonkey189
@bluemonkey189 Ай бұрын
obviously the enemy is just really stupid
@question_mark
@question_mark Ай бұрын
of course its the random_in_circle
@sjoerdev
@sjoerdev Ай бұрын
its such a simple function, how can anyone possibly have bugs related to it?
@ultimaxkom8728
@ultimaxkom8728 Ай бұрын
@@sjoerdev The _random_in_circle_ is perfectly fine. It's just not the _random_walkable_in_circle_ the human _actually_ wanted.
@FifthOfNovember_Original
@FifthOfNovember_Original Ай бұрын
There’s always one random in the circle
@robertwallace5498
@robertwallace5498 24 күн бұрын
I feel your pain brother, this is like therapy. And the excitement/relief once it works is unparalleled
@IamNewbo
@IamNewbo Ай бұрын
Bro this is so true! Sometimes tho the entire system is just broken and then you have to remake it over and over again or add stuff until it's just right realizing its only a smol thing u missed lol. Bro epic vid
@1BucketOfChicken
@1BucketOfChicken Ай бұрын
you mentally hurt my by reminding me that ive rewritten stuff so many times just to realize i, for example, divided by delta instead of multiplying it, plus instead of minus, wrong values and other stuff like that
@poleve5409
@poleve5409 Ай бұрын
rewriting parts of your game mutliple times is natural and a good thing.
@rowleskids
@rowleskids Ай бұрын
The video is 2 minutes but this process usually takes about 2 hours 💀
@ince55ant
@ince55ant 28 күн бұрын
"its my fault, but i dont know why" sometimes i think i took up game dev for similar reasons i see a therapist
@user-ek2jc1xf3y
@user-ek2jc1xf3y Ай бұрын
help me step player i'm stuck
@henrystickmin8812
@henrystickmin8812 Ай бұрын
Alternative title: "I didn't know birds couldn't pass through walls"
@Zethneralith
@Zethneralith 5 күн бұрын
This is probably the most relatable video on anything software dev I've ever seen. Bravo!
@franciscobernardo95
@franciscobernardo95 Ай бұрын
of course its the state machine
@user-vv3gg6xm1b
@user-vv3gg6xm1b Күн бұрын
even though I haven't made any games for a while and I'm not very good at it anyways, still I feel like THAT right there is what's fun about gamedev - you want to make some stuff, you make it, but it's broken, then you spend countless amount of hours trying to fix it and then you magically fix it! it's a real emotinal roller coaster huh
@nickhurst7493
@nickhurst7493 24 күн бұрын
I love these short little tid bits of devlogs. Super fun to watch!
@patek2385
@patek2385 Ай бұрын
They are just dancing.
@LookjaklooK
@LookjaklooK Ай бұрын
That's why it's important to be aware of our assumptions we made on how we think things supposed to work. And then test those assumptions by tweaking values and debugging, until we reach to the fault in one of our assumptions that we need to fix. In this case, the assumption that the destination is within the reach of the duckies.
@ghostradiogames
@ghostradiogames Ай бұрын
I'm trying to pay attention but I can't get past your insane amount of rising debugger errors.... you gonna uh...you gonna check those? D=
@BrosMakeGames
@BrosMakeGames Ай бұрын
if you don't look down there they don't exist.
@ultimaxkom8728
@ultimaxkom8728 Ай бұрын
@@BrosMakeGames 100% working strat. I used this exploit to escape the IRS and the kids. It's also extremely milk-compatible.
@3PlayerGaming
@3PlayerGaming Ай бұрын
Having worked in the games industry for over 5 years now, can confirm, it happens to even the most experienced of us. Having said that... I actually think the game engine should warn you when you trying to do something that doesn't make any sense... like telling the nav agent to navigate to a point outside the nav mesh. Because then the problem would have been obvious way earlier, and you wouldn't have spent hours blindly debugging.
@iantrolington6594
@iantrolington6594 7 күн бұрын
The problem was obvious just looking at it without even reading the code. And there are plenty of examples where you could make use of navigating between collision layers. The fact that you say these things and say you have been doing this for 5 years is just baffling.
@NihongoWakannai
@NihongoWakannai 5 күн бұрын
The code is producing thousands of errors which he never looks at...
@_MrMen_
@_MrMen_ Ай бұрын
This is so relatable, and describes a lot of the issues I encounter. I'm subscribing.
@BrosMakeGames
@BrosMakeGames Ай бұрын
Thanks for the sub!
@simplexeon
@simplexeon Ай бұрын
missing: 12 other attempts that were SURE to work
@DivideBy0YT
@DivideBy0YT Ай бұрын
as a new, learning gamedev, i can 100% confirm
@paulimriss
@paulimriss Ай бұрын
I'm really scared of people that don't solve the debugger errors
@CrispyDaFrog
@CrispyDaFrog Ай бұрын
now just repeat this process multiple times per every time you want to change anything whatsoever
@RKIOrbMage
@RKIOrbMage Ай бұрын
Really nice bitw sized vid, please make more :D
@BrosMakeGames
@BrosMakeGames Ай бұрын
thanks! will do.
@Math_Mage_9869
@Math_Mage_9869 Ай бұрын
accidentally became woodpeckers
@aztecagames
@aztecagames Ай бұрын
Yup! The hard part is figuring out where it went wrong. 99 percent of the time it's an easy fix. This is looking great btw
@thekingscrown8931
@thekingscrown8931 Ай бұрын
Something similar happened to me not too long ago. I'm currently making a zombie game where the player is stuck in a grocery store and has to use whatever they can survive incoming waves of zombies. Now I put together a multiplayer system, difficult at first but ultimately didn't give me many issues, shelves so that the players can store items ended up being insanely easy, zombie movement and spawning I was able to do with my eyes closed. But, the wave mechanic, the one thing I thought was gonna be so simple I could probably get a monkey to do it, ended up taking me a week to figure out. Turns out throwing rpc calls everywhere is NOT a good idea and I was basically calling an rpc call with an rpc call, so the system that handles zombie tracking wasn't accurately tracking zombies because of it.
@DanPos
@DanPos 20 күн бұрын
Excellent video that really captures the frustration of programming haha. Another is when something doesn't work you change some stuff out of desperation, and it works, but you don't know exactly what you did to fix it or what the problem was, and then you just move on with your life
@THExRISER
@THExRISER 13 күн бұрын
Feels good when it does work.
@Robomobius_Art
@Robomobius_Art 14 күн бұрын
Absolutely. What's worse is when there's multiple different single points of failure.
@foreducation408
@foreducation408 Ай бұрын
Yup that's game dev in it's purest form.
@umar7812
@umar7812 Ай бұрын
where's the part when you say IT TOOK ME HOURS TO FIX THIS!!!
@charg1nmalaz0r51
@charg1nmalaz0r51 Ай бұрын
probably in a later video when he finally fixes it. Based on his debugger tab at the end his codes still broken lol
@d34drat
@d34drat 29 күн бұрын
you need a rubber duck...
@bungercolumbus
@bungercolumbus 24 күн бұрын
You can notice this in more than just game dev. I am in my final year in school and sometimes I get really stuck at some pretty easy math problems. And I just can't wrap my head around them to find the solution for some reason. It feels the same I swear to god.
@Ryuko15
@Ryuko15 Ай бұрын
i want to applause for your problem solving skills, not the fact that is impressive, but you got through it. Congratulations man!
@donkeykong315
@donkeykong315 22 күн бұрын
Literally me every time I add a feature with any slight complexity.
@savagekid94
@savagekid94 Ай бұрын
its what I love most about development. it stresses me out but i love it
@AtelicDev
@AtelicDev 26 күн бұрын
The solution sounds so simple, but one has to first come up with the idea! Also, awesome editing!
@Gerardheime
@Gerardheime 23 күн бұрын
If you had some sort of debug visualization of the wanted destination, you would've solved that in a jiffy. That's why debugging tools are so important.
@scroopynoopers9824
@scroopynoopers9824 21 күн бұрын
"as usual the problem was me and my stupid brain" I felt that
@taylorfisdboss5200
@taylorfisdboss5200 10 күн бұрын
This really is a great look into the gamedev experience. 1. You encounter a problem - and you really aren't 100% sure why it's happening. 2. You take a guess at what the problem is. 3. You implement a "fix" to try to correct it. 4. You correct the issues created by step two and scrap the "fix" 5. Repeat steps 3 and 4 until you want to rip your hair out or you accidentally enter step 6. 6. You spot the actual problem, realize you're an idiot, and solve it in two or three easy attempts. 7. You regain *almost* all of the sanity you had before the problem occurred.
@snagfeather
@snagfeather Ай бұрын
Great video! I feel this so much. Yesterday was 30 minutes figuring out that my code should've been in `_physics_process` and not `_process`.
@Nezarus0
@Nezarus0 21 күн бұрын
Accurate. I was playing with creating islands with proc gen, and reasoned I needed to make elevation fall off sharply along the edges of my map, leaving an island. My first try somehow smasheed all 800 pixels of 'terrain; into the top line of the window and made the rest ocean...Turns out I'm stupid, like everyone else. Felt really great to finally figure out what stupid thing I had done, which was totally forget to iterate over one axis for most of the process, resulting in my strange 1 row of x data.
@ThaAftrPartie
@ThaAftrPartie 3 сағат бұрын
Debugger: 11717 problems found Me: you what?
@3ustin
@3ustin Ай бұрын
This is such a great example of everyday life in game development. Thanks so much for the commiseration.
@aaronmarsden120
@aaronmarsden120 15 күн бұрын
I was terrified there would be a glitching NPC at the end of the video
@smoresgobbo
@smoresgobbo 9 күн бұрын
As a new godot user (just shifted from Unity after 6 years) it’s amazing to see there is a state machine system for me to explore. Those tend to make programming a lot simpler and now I don’t have to create it myself LOL
@JayFolipurba
@JayFolipurba Ай бұрын
What I like is, when you follow a tutorial and the code is as 1:1 as it can be, but for them it works and the same code on your computer just says nope
@BrosMakeGames
@BrosMakeGames Ай бұрын
my favorite
@nobenx
@nobenx Ай бұрын
Your code is so clean! I could never
@Wesley1996J
@Wesley1996J Ай бұрын
Just do what I do everytime give up!
@itswhteveriwant
@itswhteveriwant 8 күн бұрын
That debugger is going CRAZY LMAO
@bromodo2773
@bromodo2773 24 күн бұрын
I have that "if I'm right" statement soo many times lol
@vladulay8762
@vladulay8762 9 күн бұрын
Recently I tried to implement something new and the hitbox collisions from a test print didn't show up. But I already had set up something similar before, so I got really confused. I didn't find anything on Google about my issue, so I spent hours on recreating a minimal setup to try ro find out what was different in those cases. It got worse there, since I didn't seem to be able to recreate the old setup. After a while I got frustrated and just played around for a bit, when I realized that no print messages at all show up. Which is the point where I found out that I accidently disabled the debugger messages in the engine. I didn't even know I could do that, but whelp. I was so relieved, but it didn't even feel that satisfiying :D
@OctagonalSquare
@OctagonalSquare Күн бұрын
Not a game, but I spent 2 months bug hunting for my app. I was missing a single negative sign. TWO MONTHS!
@TomInbound
@TomInbound 22 күн бұрын
This is incredibly accurate! Great video! The struggles are real 😭
@cmorellato
@cmorellato 24 күн бұрын
This is an awesome way of teaching!
@jipcoumou4935
@jipcoumou4935 29 күн бұрын
true, also loveit when you think your code is broken but then after 30 min you see that you disabled a script for testing :)
@AlessandroMencarini
@AlessandroMencarini Ай бұрын
As an experienced software developer dipping my toes in gamedev, this constantly happens in “classic” software engineering too
@UltraViolentYT
@UltraViolentYT Ай бұрын
Very informative videos, really tell us how to solve problems instead of quitting the project and starting a new one.
@KlausbergerYT
@KlausbergerYT Ай бұрын
Take this subscription, Sir. Many know those moments! 💙 (even though they are often much longer, till one tries to evade the situation... going to the bathroom.... doing laundry...)
@BrosMakeGames
@BrosMakeGames Ай бұрын
we humbly accept your sub, thank you!
@roadtripwarrior
@roadtripwarrior 19 күн бұрын
dude your brilliant dont call yourself stupid my man i am impressed by your skills. I've been doing coding for 2 years and 90% of that time seems to be fixing errors haha. at least thats what my teacher said it usually is and he said thats normal.
@NagoTheCat
@NagoTheCat 14 күн бұрын
Really love your use a Kirby sound effects.
@Kolbiathan
@Kolbiathan Ай бұрын
how do you get you collision shapes to look pixelated? kinda fun that they match the sprites! Fire vid man, I know these feels
@linux5min
@linux5min 14 күн бұрын
My dudes... this is software development in general... it just be more visual and fun in games... or frustrating instead of fun... writing code is the single thing that humbles me every day...
@DJL3G3ND
@DJL3G3ND 27 күн бұрын
true, although I only wish I could stay as calm as this also is there some pixel filter going on or is the spinning crosshair actually animated? seeing pixels rotate always slightly bugs me so its nice to see here it looks as it should
@lebobshark
@lebobshark 24 күн бұрын
The conclusion is always “I’m the biggest idiot of all time.”
@FindTheFun
@FindTheFun 17 күн бұрын
Ahh yes, the tried and true method of "make it smaller then bigger and see if that gets you anywhere".
@AstonJay
@AstonJay 2 күн бұрын
Hahaha, there are a lot of these types of moments when programming basically anything! Something so simple, yet so frustrating to figure out😅🙈
@the_procrastinator8606
@the_procrastinator8606 Ай бұрын
Just wait until you get to the Context Based Steering Behaviors part... Now thats actually the true game dev experience
@Korn1holio
@Korn1holio 27 күн бұрын
Just been there... I overcame it but oh my brain...
@the_procrastinator8606
@the_procrastinator8606 24 күн бұрын
@@Korn1holio dw, you'll spend a few more months tweaking it for the 100th or so time until it kinda feels right and performant 💀
@noiseworks
@noiseworks 18 күн бұрын
Superstition is a huge part of development for me
@slipperynickels
@slipperynickels 21 күн бұрын
would love a video about your state machine implementation, specifically how it decides which action to take
@onceisdrawing
@onceisdrawing 11 күн бұрын
Programming is me telling my lovely wife, "i'm fine, thanks", her becoming upset for 2 days, me trying to understand wtf i just said, finally realizing it was our birthday and i forgot about it. But every day.
@thomlaurent
@thomlaurent 22 күн бұрын
In Unity you can sample a position on the navmesh from a point you give, so you can random in circle then ensure it's inside the navmesh. The only problem with this approach is you can still ask for an impossible move if the navmesh of the target is not connected to the one your character is on, but that's a tricky case that's unlikely to happen I guess 😅
@NachitenRemix
@NachitenRemix Ай бұрын
This is what most people dont see nor understand, the real struggle you get sometimes with bugs. And, its not always your fault. The worst feeling is finding an engine or language limitation that simply cannot acomplish what you want, and then you have to code a workaround youself, thats painful. But worse still is thinking you found an engine limitation, when it was just a PEBCAK issue lmfao.
@erniebeasley8521
@erniebeasley8521 17 күн бұрын
This video brings great pain and suffering
@badhasher
@badhasher Ай бұрын
Haha I love this, the enemy navigation can be such a nightmare!
@Korn1holio
@Korn1holio 27 күн бұрын
Just wanted to comment on your 'game' looking charming, the toad protagonist and these little guys just crack me up for some reason
@BrosMakeGames
@BrosMakeGames 27 күн бұрын
thank you!
@unconscious5630
@unconscious5630 3 күн бұрын
I had a problem like this in 3D godot and it wasnt the exact same problem as I did check if its in the navmesh first. Turns out it's due to Godot's collision system/physics system being not so good so I had to get an alternative physics system called Jolt which fixed it.
@635574
@635574 Ай бұрын
For a development version of the game cosider also visualising their actual trget and not just the navmesh they are sticking to.
@kadenfrfx
@kadenfrfx Ай бұрын
do you think you can do a tutorial on how you make the lighting pixelated instead of being smooth?
@AIAdev
@AIAdev Ай бұрын
Every. Day.
@kronksstronkstonks6360
@kronksstronkstonks6360 21 күн бұрын
Game development is problem solving and you are the problem - me to myself every time I try anything and it inevitably doesnt work. Best piece of advice my Computer Science lecturer gave my class was "If you write code and it works first time, it doesnt work, you just haven't come across the issue yet." Best piece of damn advice Ive ever gotten in an educational setting.
@atomiz2002
@atomiz2002 27 күн бұрын
this would never have been a time consuming issue if your gizmos were correctly displaying that the targets are inside the walls...
@mrreemann8313
@mrreemann8313 13 күн бұрын
Still stuck in the stage of "I don't know what I just copy pasted but it is/isn't working."
@JF-um3wz
@JF-um3wz Ай бұрын
Yep, I could tell that’s likely what was happening upon seeing the issue. It really is sometimes that you’ll forget something crucial, and it leads to bugs like this. That’s why we have the rubber duck technique, after all.
@Hemmels
@Hemmels 9 күн бұрын
What's worse is when you actually understand everything. You spend ages debugging the complex logic, get right to the end, and it's a display issue. Output text instead of formatted text. I'm not bitter.
@Talonkratt
@Talonkratt 22 күн бұрын
Knowledge is Power, once yiu understand why things work, you'll know why they aren't, it a journey and most can't walk a mile
@kristapspurinsh
@kristapspurinsh 19 күн бұрын
yes , But ! enemy still renders in when they are behind wall , your vision :D
@IlSharmouta
@IlSharmouta 18 күн бұрын
"I'm the biggest idiot" Ah the sound of progress
@MichaelDub
@MichaelDub 11 күн бұрын
ayyy u use the same state machine architecture that I learned! shaggy dev for the win
@Rikaisan
@Rikaisan Ай бұрын
That game looks really cool! :3 Birb exterminator
@AverySadBear
@AverySadBear Ай бұрын
Just add a check that forces them away from a wall if they change their sprite directions too rapidly *snicker*
@soumyadebnath3614
@soumyadebnath3614 19 күн бұрын
Yeah this is what happens with me all the time... Recently I was working on my game and the enemy was getting stuck in the scene's global position and not the camera... Then I saw the problem I was setting the position to global myself... That had to be only position not global... Good to know I am not alone.... 😅
Making a game about lil guys is fun and hard
12:10
Radnyx
Рет қаралды 79 М.
Optimizing my Game so it Runs on a Potato
19:02
Blargis
Рет қаралды 382 М.
Hot Ball ASMR #asmr #asmrsounds #satisfying #relaxing #satisfyingvideo
00:19
Oddly Satisfying
Рет қаралды 26 МЛН
Creepy Teacher Kidnapped My Girlfriend?!
00:42
Alan Chikin Chow
Рет қаралды 9 МЛН
Final increíble 😱
00:39
Juan De Dios Pantoja 2
Рет қаралды 44 МЛН
How I Would Start Gamedev (if I had to start over)
9:02
Sasquatch B Studios
Рет қаралды 12 М.
AK-xolotl: How NOT to Make a Roguelite
7:12
sl1ppey
Рет қаралды 786 М.
choosing a game engine is easy, actually
15:08
samyam
Рет қаралды 250 М.
A platformer level, but...
10:28
Flocab
Рет қаралды 211 М.
Why Stardew Valley’s Creator Hated His Game
20:17
Nello
Рет қаралды 419 М.
I Optimised My Game Engine Up To 12000 FPS
11:58
Vercidium
Рет қаралды 519 М.
Why Starbound Failed
15:00
RoboKast
Рет қаралды 565 М.
Making a VIRUS for a Game Jam (and almost winning)
9:36
Deynum Studio
Рет қаралды 257 М.
Every game needs this feature! | Devlog
6:03
Challacade
Рет қаралды 35 М.
ОСЫ СКИН МАҒАН ҚАТТЫ ҰНАДЫ!
13:14
Асхат Gaming
Рет қаралды 26 М.
РАНГ ЖАНА СЕЗОН  - АДЕЛАЙДА СТРИМ !
5:53:20