01:16 < bridge> @kollpotato hi developa 01:48 < bridge> hi shiverdragon 02:18 < bridge> I greet Koll Dragon 02:18 < bridge> Koll D. Potato 02:20 < bridge> how to build ddnet 02:22 < bridge> with msys2 02:27 < bridge> isn't there a readme that explains that? 02:29 < bridge> im from russia i idk what say in readme 02:30 < bridge> did not see anything in the readme at first glance 02:31 < bridge> there are two options, when programming learn english or use a translator. Learning english is usually the better option. 02:31 < bridge> shut up 02:32 < bridge> I'm lazy 02:32 < bridge> you will not get far with that. 02:33 < bridge> but someone probably has built ddnet with msys2 and will answer your question. 02:33 < bridge> just wait. 02:35 < bridge> womp womp 02:35 < bridge> i don’t think helping ignorant ppl is a great use of time 02:51 < bridge> why doesnt it show a "not done" symbol 02:51 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393031847520243752/image.png?ex=6871b181&is=68706001&hm=fa2a02e75f87309f2c91b639170019871184ffef6cea72cc17bf3cf47aaeb7f0& 02:51 < bridge> like none have failed why is it an x 02:51 < bridge> (something did just fail) 07:00 < bridge> hi chillerdragon 07:00 < bridge> in your fork ddnetpp is the money farm used and how to set it up 07:00 < bridge> and another question how to issue money or do you need to work with the code? 07:01 < bridge> hi chillerdragon 07:01 < bridge> in your fork ddnetpp is the money farm used and how to set it up 07:01 < bridge> and another question how to issue money or do you need to work with the code? 07:01 < bridge> 07:01 < bridge> how to change /shop 07:29 < bridge> afk farm? 07:29 < bridge> https://github.com/DDNetPP/DDNetPP/issues/458 07:29 < bridge> 07:29 < bridge> and you can change /shop in the code, idk 07:29 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393101766027116596/IMG_2751.jpg?ex=6871f29f&is=6870a11f&hm=01ef7e5a5304463c463312fa4e4d1d229e0a2c5a2d9f12651893d16df926b693& 08:01 < bridge> @blackkkent: Money Farm? Used? You mean the chairs where you can sit on to farm money? Yes they exist. You can just place the tiles in the map. The entities filo sent you can help you. 08:01 < bridge> 08:01 < bridge> By issuing money you mean cheating money? That works by patching the values in the database using sql. 09:34 < bridge> Done, but I am afraid D: this doesn't use buffered tiles yet and I need a huge cleanup 09:34 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393133209818239118/screenshot_2025-07-11_09-32-03.png?ex=68720fe8&is=6870be68&hm=a3c6b058b6a2d62c8b1951d3ebc5a83609b4ee5c0562a58ecca6d07db9f50423& 10:22 < bridge> oh you see on the screenshot, I accidentally added borders as a feature πŸ€” 11:11 < bridge> halo 11:24 < bridge> There's just extended flag for thisb 11:24 < bridge> But on old editor it lag too much 11:27 < bridge> I don't know what to do with this feature, this is a 4 digit PR again, and maybe I should make open a draft PR as orientation and implement it bit by bit 11:27 < bridge> I needed to create 2 interfaces, because CEditorMap is not an IMap 11:33 < bridge> Split into smaller prs 11:48 < ws-client> Someone forgot to merge my crispy clean prs #10470, #10399 11:48 < chillerbot> https://github.com/ddnet/ddnet/issues/10470 11:48 < chillerbot> https://github.com/ddnet/ddnet/issues/10399 11:49 < ws-client> @blackkkent btw there is documentation /shop not sure what exactly you want to change but here are some options https://github.com/DDNetPP/DDNetPP/blob/master/docs/shop.md 12:50 < bridge> Is this one compatible with the upcoming QUIC pr? 12:50 < bridge> thx bro 12:52 < bridge> Is there a draft PR of the quic impl? 12:52 < bridge> Yes 12:52 < bridge> O 12:53 < bridge> #6961 12:53 < bridge> https://github.com/ddnet/ddnet/pull/6961 12:53 < bridge> how to load this 12:55 < bridge> damn 12:55 < bridge> 12:55 < bridge> looks painful, i missed that entirely :kek: 13:00 < bridge> I wish I could help, but I am not quic enough 13:08 < ws-client> wdym compatible @learath2 i wrap udp sending not sure how it can be compatible or incompatible to quic. The quic pr should do the same then to allow the unit tests to run smoothly without depending on networking. 13:09 < bridge> chiller how to use this https://github.com/DDNetPP/DDNetPP/issues/458 13:09 < bridge> Move the image in your ddnet folder 13:10 < bridge> corn? 13:10 < bridge> root? 13:10 < bridge> data/editor/entities 13:10 < bridge> Next to the others 13:11 < bridge> I was wondering if you moved around things so much that the quic pr would need to be significantly changed 13:11 < bridge> No 13:11 < bridge> It’s chill af 13:11 < bridge> Heinrich will love it 13:11 < bridge> Seems you didn't. My next concern is whether this gets optimized properly and doesn't have a performance hit 13:11 < bridge> rename to ddnet.png? 13:12 < bridge> You can name it whatever 13:12 < bridge> Also why do you reply to random messages? 13:12 < bridge> I am very sleepy I haven't slept all night I really want to sleep. 13:12 < bridge> What are the next steps? 13:13 < bridge> Open the editor and in the top select the entities 13:14 < bridge> This needs not optimization. Accessing a pointer isn’t crazy expensive. This is done all over the place. Even in loops. Which gets run way more than the udp code 13:17 < bridge> where? 13:18 < bridge> Top 13:19 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393189876920352818/image.png?ex=687244ae&is=6870f32e&hm=b5c2a72c10d9c6b2f03fd4b6cb9cd35055a8425ee33fdb9960e9f79f2084fa10& 13:20 < ws-client> settings 13:20 < bridge> chiller: is this a good fix for the semicolon issue xd 13:20 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393190215476318301/image.png?ex=687244ff&is=6870f37f&hm=343b345af1ba16303bdbc0972373bc87a19e758ef07a97c3419f29b1ab0636a3& 13:20 < ws-client> ono xd 13:20 < bridge> thx 13:20 < bridge> :wtf: 13:21 < bridge> its tower 13:21 < bridge> everyone love tower 13:21 < ws-client> fikmesan will love it 13:39 < bridge> i tried 10 different way to fix it 13:39 < bridge> i tried 10 different ways to fix it 13:39 < bridge> i gave up and copy pasted it into chatgpt 13:39 < bridge> lets see 13:43 < bridge> it couldnt fix it either 15:30 < ws-client> @milkeeycat ddnet_protocol in 2025? wot 15:34 < ws-client> there is too much ci omagawd who added all dat shit xd 15:35 < bridge> :clueless: 15:39 < bridge> chilllerdragon: you don't have ideas for prs for others tw related projects? xd 15:42 < bridge> chilllerdragon: you don't have ideas for prs for other tw related projects? xd 15:47 < ws-client> 0.6 ddnet_protocol is priority number 1 right now! 15:49 < ws-client> it bothers me that we did not spawn a tee yet"! 15:50 < bridge> there's a branch which can parse inputs! 15:58 < bridge> > free(): invalid next size (normal) 15:58 < bridge> @learath2 what does this mean 15:59 < bridge> i guess it means a double free 15:59 < bridge> but my god, what a useful error message 16:03 < bridge> I guess it could also be a buffer overflow somewhere else ruining the next size 16:04 < bridge> asan would 100% catch this 16:05 < bridge> What's the status on the account system for DDNet? 16:10 < bridge> not happening before heino's retirement 16:10 < bridge> :kek: 16:12 < bridge> damn, this guy is unstable. He keeps leaving and coming by πŸ˜„ 16:15 < bridge> https://lwn.net/ml/all/cover.1747070147.git.anand.jain@oracle.com/ 16:16 < bridge> btrfs: new performance-based chunk allocation using device roles 16:16 < ws-client> bruv why is it called hack and not merged @milkeeycat 16:17 < bridge> because i made it quickly to make kernel module work xd 16:17 < ws-client> the CI passes 16:17 < ws-client> ship it 16:18 < bridge> btw, does your editor formats C code correctly(in ddnet_protocol)? 16:18 < bridge> @learath2 someone made a tool to create factorio maps from images 16:18 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393234923107909652/new-mapart-meta-use-ghosts-to-place-free-maparts-instatly-v0-1by02w6vb2cf1.png?ex=68726ea2&is=68711d22&hm=7bb4cd8d6b2b9a14904f2227389a615b83c73993083c5f2f9f4a00f2182c202e& 16:18 < bridge> https://www.reddit.com/r/factorio/comments/1lwf7qf/new_mapart_meta_use_ghosts_to_place_free_maparts/ 16:18 < bridge> mine formats correctly only C++ code -.- 16:18 < bridge> https://factorio.voxelartcraft.de/ 16:22 < ws-client> @milkeeycat i dont use my editor :p i use ./scripts/fix_style.py :p and it works well 16:22 < bridge> but I remember it was working before :\ 16:26 < bridge> I also use fix_style πŸ˜› 16:27 < bridge> :brownbear: 16:48 < bridge> I use vscodes workspace which makes it do stuff :mlem: 16:50 < bridge> i use neovim btw 17:12 < bridge> Uh clion:nouis: 17:12 < bridge> i use zed btw 17:12 < bridge> written in rust 17:12 < bridge> btw 17:52 < bridge> I think you might need to use a higher Res 18:03 < bridge> my second PR 18:03 < bridge> pro tip, you can write "closes #number" or "fixes #number" and the issue will be closed automatically when the pr is merged 18:04 < bridge> Where? In the title? 18:05 < bridge> does it? 18:05 < bridge> in pr description 18:05 < bridge> That's so dumb actually lol 18:05 < bridge> deen closed the issue i fixed manually i think 18:05 < bridge> Why can't i just add it in a separate menu? 18:05 < bridge> what menu xd 18:06 < bridge> bcs git is text based 18:06 < bridge> Idk, on github 18:06 < bridge> its jsut github that does it automatically by parsing the commit msg 18:06 < bridge> But issues is a github thing 18:06 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393262218346496020/image.png?ex=6872880e&is=6871368e&hm=2ab94cf1562ceccecc209592d9e2f397f0c1ecb60b4eede2b8bc09035ba1b52b& 18:06 < bridge> the issue was closed because the pr was merged 18:07 < bridge> is this a github feature? 18:08 < bridge> I can still edit the pr 18:08 < bridge> it closes only on merge 18:08 < bridge> you can edit pr before merged and include closes # 18:09 < bridge> sick 18:09 < bridge> one minute before merge i can just copy paste all issues 18:09 < bridge> and it will close them all 18:09 < bridge> xD 18:10 < bridge> 300iq 18:10 < bridge> you could solve all issues this way 18:10 < bridge> wait is this really how it can be fixed 18:10 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393263206973309039/image.png?ex=687288fa&is=6871377a&hm=df1d27a1319a437a09547aa754bfc84998f41e13316730b58335b1d9f7cf16b3& 18:10 < bridge> i tried to apply my parser knowledge but it didnt work 18:10 < bridge> this is simple af 18:10 < bridge> well idk, but it seems to work 18:11 < bridge> have u tried all test cases? 18:11 < bridge> idk 18:11 < bridge> i think i tried most stuff and it works as expected 18:11 < bridge> i PRed this so others can test it 18:12 < bridge> some checks failed xd 18:12 < bridge> no merge for u 18:12 < bridge> bcus space after if 18:12 < bridge> well 18:12 < bridge> its just style, run clang format script 18:13 < bridge> i don't like the formatting used in this project tbh 18:13 < bridge> yeah but u dont have an option 18:13 < bridge> space after `if` is clearly better 18:13 < bridge> also personally i would avoid continue statements and just flip the if stuff around (conditionally return, otherwise nothing) 18:13 < bridge> really? 18:14 < bridge> i think its fine 18:14 < bridge> i think many people avoid continue because its too long as a keyword 18:14 < bridge> its more readable if you have one conditional return inside nested ifs instead of both a conditional continue and also a return 18:14 < bridge> wtf xd 18:15 < bridge> yes its random 18:15 < bridge> i think stuff like 18:15 < bridge> ```c 18:15 < bridge> if (condition) { 18:15 < bridge> // optionally do stuff 18:15 < bridge> continue; 18:15 < bridge> // or 18:15 < bridge> break; 18:15 < bridge> // or 18:15 < bridge> return; 18:15 < bridge> } 18:15 < bridge> ``` 18:15 < bridge> is the best way to write code 18:15 < bridge> but ive seen 2 people avoid it 18:17 < bridge> nested ifs are really unreadable tho 18:17 < bridge> continue makes it immediately obvious it skips everything 18:18 < bridge> okay anyways 18:18 < bridge> what do i do when a check fails? 18:18 < bridge> you fix it 18:19 < bridge> but like i just commit to the branch? 18:19 < bridge> yes 18:20 < bridge> u should squash commits 18:20 < bridge> or git commit --amend and then force push, idk best practice 18:20 < bridge> since its only gonna be a style fix 18:21 < bridge> idk its just kinda ugly imo 18:21 < bridge> and then u have to find where the continue will jump to 18:21 < bridge> @pilonpl i think ur pr broke everything 18:21 < bridge> i launched the client it cant load the binds 18:21 < bridge> or maybe i did something wrong 18:21 < bridge> yeah same 18:21 < bridge> but i can live with that 18:21 < bridge> it works on my machine 18:22 < bridge> idk in c++ continue probs a bit ugly 18:22 < bridge> in rust in some places it falls lovely 18:22 < bridge> they do the same thing xd 18:22 < bridge> might be biased cuz c++ ugly for me 18:22 < bridge> i know but its also about style 18:23 < bridge> it can be nice where the logic requires it idk 18:23 < bridge> does c++ have labeled loops btw 18:23 < bridge> doesnt look like it 18:23 < bridge> It has goto xd 18:23 < bridge> ```rust 18:23 < bridge> loop { 18:23 < bridge> if skipped_leg_day { 18:23 < bridge> continue; 18:23 < bridge> } 18:23 < bridge> 18:23 < bridge> strength += 1; 18:23 < bridge> } 18:23 < bridge> ``` 18:23 < bridge> im bored 18:23 < bridge> oh right xd 18:24 < bridge> (this is rust) 18:24 < bridge> looks ugly 18:24 < bridge> afaik c++ has no loop, but u can just do for(;;) 18:24 < bridge> yo mama 18:24 < bridge> strength += if skipped_leg_day 1 else 0 ez 18:24 < bridge> yeah its just somehow all my binds were reset when i was testing my code 18:24 < bridge> i think it works 18:25 < bridge> what is m_pCommand 18:25 < bridge> okay so now i have to remove that one space character 18:25 < bridge> a ptr to char? 18:25 < bridge> yeah 18:25 < bridge> @milkeeycat: btw i got weird gtest error 18:26 < bridge> thats a big while 18:27 < bridge> til https://en.cppreference.com/w/cpp/utility/integer_sequence.html 18:27 < ws-client> @milkeeycat https://github.com/MilkeeyCat/ddnet_protocol/pull/83/commits/082432151d066a0a46c81dade633699c0b02e2f6 18:28 < bridge> what is it even for 18:29 < bridge> i guess useful for overcomplicated c++ templates 18:30 < bridge> btw how would i do that without `continue` anyways? 18:31 < bridge> i think just inverse and remove continue 18:31 < bridge> inverse what? 18:31 < bridge> ```cpp 18:31 < bridge> if(!pNextPart) 18:31 < bridge> { 18:31 < bridge> return; 18:31 < bridge> } 18:31 < bridge> 18:31 < bridge> pStr = pNextPart; 18:32 < bridge> ``` 18:32 < bridge> idk if it works 18:32 < bridge> maybe 18:32 < bridge> well no 18:32 < bridge> it would not 18:32 < bridge> you really need to start a new iteration 18:32 < bridge> oh right 18:33 < bridge> oh it's the entire while loop xd 18:33 < bridge> so jank 18:33 < bridge> wouldnt that be the equivalent of while(true) 18:33 < bridge> just much more ugly 18:33 < bridge> idk, some people really like `for (;;)` 18:34 < bridge> if your code requires an endless loop you should reevaluate your life choices 18:34 < bridge> :Pepega: 18:34 < bridge> cap 18:34 < bridge> yeah otherwise it does this 18:34 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393269237027438734/image.png?ex=68728e97&is=68713d17&hm=e597014ea18386c38fd157e0a0a03f8f2c759827f177af1ca0bbf4d8399a5858& 18:34 < bridge> just code good 18:34 < bridge> yeah, games should have a time limit anyways 18:34 < bridge> like in china or something 18:34 < bridge> <.dartmonkey> So real xd 18:35 < bridge> after 400k frames the game should tell you to touch grass 18:37 < bridge> a kernel uses a endless loop 18:37 < bridge> iirc 18:37 < bridge> embedded 18:37 < bridge> i'll make an exception for that 18:38 < bridge> idk loop in rust is used a bit 18:38 < bridge> it fits in some places 18:38 < bridge> like main loops 18:38 < bridge> with multiple stop conditions 18:38 < bridge> why does no one pr new features using rust 18:38 < bridge> cxx is pretty much useless 18:39 < bridge> because any new feature requires adding lot of bridge code 18:39 < bridge> i guess 18:39 < bridge> QUIC utilizes rust 18:39 < bridge> heinrich is the one who utilizes rust 18:39 < bridge> master server is in rust 18:40 < bridge> actually i think 18:40 < bridge> ```c 18:40 < bridge> loop { 18:40 < bridge> if (!condition) break; 18:40 < bridge> // Equivalent to while (condition) 18:40 < bridge> } 18:40 < bridge> ``` 18:40 < bridge> wouldn't be half bad 18:40 < bridge> mastersrv does not need cxx bridge 18:40 < bridge> Isn't every application an endless loop? 18:40 < bridge> its independent 18:40 < bridge> i know 18:40 < bridge> just saying 18:40 < bridge> no 18:40 < bridge> btw a loop that breaks is considered endless?, but if its enough complex u cant know if it breaks even if it has a if break 18:40 < bridge> cuz halting problem 18:41 < bridge> so 18:41 < bridge> everything is and is not a endless loop 18:41 < bridge> at the same time 18:41 < bridge> thanks for coming to my ted talk 18:41 < bridge> now ill queue for a dota ranked 18:42 < bridge> ```rust 18:42 < bridge> fn main() { 18:42 < bridge> let mut counter = 0; 18:42 < bridge> 18:42 < bridge> let result = loop { 18:42 < bridge> counter += 1; 18:42 < bridge> 18:42 < bridge> if counter == 10 { 18:42 < bridge> break counter * 2; 18:42 < bridge> } 18:42 < bridge> }; 18:42 < bridge> 18:42 < bridge> assert_eq!(result, 20); 18:42 < bridge> } 18:42 < bridge> 18:42 < bridge> ``` 18:42 < bridge> btw u cant do this in cpp 18:42 < bridge> ```rust 18:42 < bridge> 18:42 < bridge> fn main() { 18:42 < bridge> let mut counter = 0; 18:43 < bridge> 18:43 < bridge> let result = loop { 18:43 < bridge> counter += 1; 18:43 < bridge> 18:43 < bridge> if counter == 10 { 18:43 < bridge> break counter * 2; 18:43 < bridge> } 18:43 < bridge> }; 18:43 < bridge> 18:43 < bridge> assert_eq!(result, 20); 18:43 < bridge> } 18:43 < bridge> 18:43 < bridge> ``` 18:43 < bridge> loops can return values 18:43 < bridge> <.dartmonkey> Maybe if it breaks it's not endless cause there is an end 18:43 < bridge> xd 18:43 < bridge> idk i usually avoid endless loops at all costs, atleast fully intention ones like `while(true) or for (;;)` 18:43 < bridge> having to early return and/or break out of it is just another thing to keep track for me 18:44 < bridge> monkeybrain 18:44 < bridge> <.dartmonkey> https://tenor.com/view/roblox-meme-roblox-lua-meme-luau-roblox-studio-gif-9076490622546437733 18:44 < bridge> oh no roblox development 18:50 < ws-client> stability seems closer to stabbable and stabbing than stable to me. Change my mind. 18:51 < bridge> Pioooooo approved my PR 18:51 < bridge> even tho it's apparently midnight for her lol? 18:52 < bridge> wait is she a maintainer 18:52 < ws-client> everyone can approve 18:52 < ws-client> you too @kollpotato 18:52 < bridge> o 18:52 < bridge> ok i go approve all ur prs 18:52 < ws-client> ez 18:52 < bridge> that's crazy 18:52 < bridge> actually 18:54 < bridge> but why would anyone approve PRs at midnight? 18:55 < bridge> midnight is not that late 18:55 < bridge> so why not 18:55 < bridge> chillerdragon: imagine if we already introduced ub :santatrollet: 18:57 < bridge> play deadlock 18:57 < bridge> if ur into fps 18:57 < bridge> super good game 19:15 < ws-client> @milkeeycat im sure this fakin google test library is full of bugs 19:16 < ws-client> @pilonpl being stuck in the club queue at midnight is perfect time to review some prs 19:19 < ws-client> @milkeeycat i mean we use malloc and free for those strings so thats scary af 19:21 < bridge> I'll have fun time debugging this 19:58 < bridge> chillerdragon: btw we don't use malloc for those strings :p 20:05 < ws-client> wot? is it stack from the packer like in tw? 20:10 < bridge> What's the purpose of the merge queue? 20:13 < bridge> to avoid race conditions 20:13 < bridge> if two prs are merged at the exact same time it goes kaboom 20:15 < bridge> No it actually goes patoeii 20:15 < bridge> > imagine this: 20:15 < bridge> > 20:15 < bridge> > Pull Request #1: Rename bifurcate() to bifurcateCrab() 20:15 < bridge> > 20:15 < bridge> > Change the name of this function, as well as every call site that currently exists in the main branch. I've thought of making it a method on Crab instead of on Sword, but then it would be bifurcateWithSword(), which hardly seems like an improvement. 20:15 < bridge> > Pull Request #2: bifurcate() after landing, in addition to before 20:15 < bridge> > 20:15 < bridge> > Adds another call to bifurcate(), to make sure it gets done even if we skip the pre-landing procedure. 20:15 < bridge> > 20:15 < bridge> > When both of these pull requests are sitting open in the backlog, they will both be tested with the main branch. Assuming they both pass, GitHub will happily present the Big Green Merge Button. Once they both get merged, the main branch will go red (Method bifurcate() not found). 20:22 < bridge> chillerdragon: ye https://github.com/MilkeeyCat/ddnet_protocol/blob/9203c4ae5f03ebac786c487f7d2afaf17eba4022/src/packer.c#L208-L233 20:24 < bridge> I mean yeah but I woke up at midnight 20:30 < bridge> Is 2 PRs enough for the dev role? 20:30 < bridge> one is enough 20:30 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393298492209893486/image.png?ex=6872a9d6&is=68715856&hm=b4894566addcc0d2dd76329dbac3b7411e9776f24a0f909b362e08c3d4e61b0b& 20:32 < bridge> this doesnt quite say how much u need but some people got a role just after 1 pr 20:33 < bridge> and u have to ask for it if u want 20:33 < bridge> But probably for a bit more than 7 new lines 20:33 < bridge> meh 20:33 < bridge> it doesnt matter 20:33 < bridge> this role is pretty much useless 20:34 < bridge> some people have 200 prs merged some just 1 20:34 < bridge> It's nor useless 20:34 < bridge> It makes your nick purple 20:34 < bridge> yea 20:35 < bridge> true 20:35 < bridge> it looks good 20:41 < bridge> you need to do some woolooloo to summon the discord gods to give you roles 20:42 < bridge> FyI - i did a lot of wooloolooing 20:43 < bridge> where is the summoning 20:43 < bridge> u lied!!! 20:46 < bridge> :kek: - i got the role within 0.01 seconds as well 20:56 < bridge> chillerdragon: it's the weirdest shit I've ever seen 20:56 < bridge> ```cpp 20:56 < bridge> ... 20:56 < bridge> std::cout << (int)*info.version << std::endl; 20:56 < bridge> std::cout << (int)info.version[0] << std::endl; 20:56 < bridge> ... 20:56 < bridge> ``` 20:56 < bridge> ``` 20:56 < bridge> 48 20:56 < bridge> -10 20:56 < bridge> ``` 20:56 < bridge> ???? 20:59 < bridge> 48 makes sense 20:59 < bridge> -10 does not 20:59 < bridge> where did it come from xd 21:00 < bridge> magic 21:01 < bridge> i should really learn c 21:01 < bridge> i barely know pointer arithmetic 21:01 < bridge> but i know address cant be negative 21:01 < bridge> this doesn't print the address tho 21:01 < bridge> is it the character at index 0? 21:02 < bridge> yeah 21:02 < bridge> i mean idk, this is weird 21:03 < bridge> what is the type of `info.version`? 21:03 < bridge> `const char *` 21:07 < bridge> ```cpp 21:07 < bridge> std::cout << (void *)info.version << std::endl; 21:07 < bridge> std::cout << (int)*info.version << std::endl; 21:07 < bridge> std::cout << (int)*info.version << std::endl; 21:07 < bridge> ``` 21:07 < bridge> ``` 21:07 < bridge> 0x7fffcb8c06e4 21:07 < bridge> -1 21:07 < bridge> -1 21:07 < bridge> ``` 21:07 < bridge> and when I print the pointer it gives equal results 21:07 < bridge> cool 21:07 < bridge> second one is [0]* 21:08 < bridge> ```cpp 21:08 < bridge> std::cout << (void *)info.version << std::endl; 21:08 < bridge> std::cout << (int)*info.version << std::endl; 21:08 < bridge> std::cout << (int)info.version[0] << std::endl; 21:08 < bridge> ``` 21:08 < bridge> ``` 21:08 < bridge> 0x7fffcb8c06e4 21:08 < bridge> -1 21:08 < bridge> -1 21:08 < bridge> ``` 21:08 < bridge> and when I print the pointer it gives equal results 21:09 < bridge> seems to work on my machine lol 21:09 < bridge> ```cpp 21:09 < bridge> #include 21:09 < bridge> 21:09 < bridge> int main() { 21:09 < bridge> const char* string = "0idkwhatsnext"; 21:09 < bridge> std::cout << (int)*string << std::endl; 21:09 < bridge> std::cout << (int)string[0] << std::endl; 21:09 < bridge> return 0; 21:09 < bridge> } 21:09 < bridge> 21:09 < bridge> // > g++ main.cpp && ./a.out 21:09 < bridge> // 48 21:09 < bridge> // 48 21:09 < bridge> 21:09 < bridge> ``` 21:09 < bridge> yea im trying to reproduce too 21:09 < bridge> works fine for me 21:10 < bridge> what compiler? os? flags? idk what might matter 21:11 < bridge> it's either gtest or skill issue :thonk: 21:12 < bridge> can you try `std::cout << (unsigned int)(unsigned char)*info.version << "\n"` for me please 21:12 < bridge> :kek: 21:12 < bridge> can you try `std::cout << (unsigned int)(unsigned char)*info.version << "\n";` for me please 21:12 < bridge> how do i run tests 21:13 < bridge> i cloned the repo xd 21:13 < ws-client> wotfeke @milkeeycat 21:13 < bridge> `cmake -DCMAKE_TESTING_ENABLED=ON ..` then `make run_tests` 21:13 < bridge> chillerdragon: I've never seen anything like this xd 21:14 < bridge> if it's our fault, we must've done some criminal stuff 21:14 < bridge> didnt use rust 21:14 < bridge> fatal mistake 21:15 < bridge> tho this is funny, whats the ASCII value of it? how does it land on -1 21:15 < bridge> learath would know this for sure 21:16 < bridge> each time is a different value :lol: 21:16 < ws-client> @milkeeycat i see shit like this all the time. I am criminal like that. 21:16 < bridge> there's probably some UB involved somewhere 21:16 < bridge> or not 21:16 < bridge> last line cast a char to an int 21:17 < bridge> while 2nd line interprets the pointed value as an int 21:18 < bridge> though the output should be somewhat related which doesn't seem to be the case here 21:18 < ws-client> @chairn isnt ``*string`` and ``string[0]`` the same? 21:18 < bridge> i assume weird behaviour of a signed char casted to an int which somehow goes from a binary value to a negative one 21:19 < bridge> hm true 21:19 < bridge> where is lerato 21:19 < bridge> yeah, but should be related, like -10 and 245 21:19 < bridge> where is lerato, i dont want to ping 21:19 < bridge> @learath2 send help 21:19 < ws-client> xd 21:19 < bridge> not -10 and 48 which have completely different binary representation 21:19 < bridge> how can I be of service? 21:19 < bridge> ```cpp 21:19 < ws-client> lmao 21:19 < bridge> #include 21:20 < bridge> 21:20 < bridge> int main() { 21:20 < bridge> std::cout << (int)(char)0xff << std::endl; 21:20 < bridge> 21:20 < bridge> return 0; 21:20 < bridge> } 21:20 < bridge> ``` 21:20 < bridge> This prints `-1` 21:20 < bridge> @learath2 explain pointer 21:20 < bridge> this can also print 255 πŸ™‚ 21:20 < bridge> what??? 21:20 < bridge> can you clone a repo? xd 21:20 < bridge> char is neither signed or unsigned in C 21:20 < bridge> it's implementation defined 21:20 < bridge> now? not really 21:20 < bridge> wait @milkeeycat is is even a valid string?, you mentioned getting different results all the time 21:20 < bridge> so it might as well just be.. uninitialized garbaghe 21:20 < bridge> so it might as well just be.. uninitialized garbage 21:20 < bridge> what an awesome world we live in 21:20 < bridge> doesn't matter here 21:21 < bridge> given he reads it without modifying it 21:21 < bridge> hmm 21:22 < bridge> it feels like there's an UB somewhere above the code triggering this behavior 21:25 < bridge> Does it happen in a small reproducible program? 21:27 < bridge> I'd guess compiler reordering shenanigans due to UB 21:31 < bridge> so can i get the Developer role? 21:33 < bridge> pr? 21:33 < bridge> 2 prs! 21:33 < bridge> he is very cool 21:34 < bridge> if char is 1 byte, then maybe the cast to it sign extends it? 21:35 < bridge> but both should still yield same results as the cast is both char to int 21:36 < bridge> well 21:36 < bridge> show us the rest of the code @milkeeycat 21:36 < bridge> u are casting a int to char to int 21:36 < bridge> iirc 21:36 < bridge> the literal is not a char 21:36 < bridge> right? 21:36 < bridge> i forgot c 21:36 < bridge> also i dont have context 21:36 < bridge> just came 21:36 < bridge> and read last msg 21:36 < bridge> xd 21:37 < bridge> also the binary representation of 48 has too many 0s to the right to become a -10 sign extended wrongly 21:37 < bridge> https://github.com/MilkeeyCat/ddnet_protocol/blob/owo/test/packet_normal.cc 21:37 < bridge> OWO 21:37 < bridge> yea, even binary representation is too different 21:38 < bridge> lmao 21:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393315414573977670/image.png?ex=6872b999&is=68716819&hm=8a5fd18acfd2e6bc33647abc0ae7f6becd00374713404de8e3177c6ab7d1b82c& 21:39 < bridge> AI said "oh this is interesting" and proceeded to spit out 50 lines of utter garbage about the issue 21:39 < bridge> 21:39 < bridge> It'lL StEaL OuR JoBs 21:39 < bridge> here's what valgrind says 21:39 < bridge> ``` 21:39 < bridge> ==175266== Invalid read of size 1 21:39 < bridge> ==175266== at 0x111F2D: NormalPacket2_Info_Test::TestBody() (packet_normal.cc:23) 21:39 < bridge> ==175266== by 0x151242: void testing::internal::HandleSehExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) (gtest.cc:2635) 21:39 < bridge> ==175266== by 0x149BC0: void testing::internal::HandleExceptionsInMethodIfSupported(testing::Test*, void (testing::Test::*)(), char const*) (gtest.cc:2671) 21:39 < bridge> ==175266== by 0x125ABB: testing::Test::Run() (gtest.cc:2710) 21:39 < bridge> ==175266== by 0x126464: testing::TestInfo::Run() (gtest.cc:2856) 21:39 < bridge> ==175266== by 0x126D3C: testing::TestSuite::Run() (gtest.cc:3034) 21:39 < bridge> ==175266== by 0x136B23: testing::internal::UnitTestImpl::RunAllTests() (gtest.cc:5964) 21:39 < bridge> ==175266== by 0x152486: bool testing::internal::HandleSehExceptionsInMethodIfSupported(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) (gtest.cc:2635) 21:40 < bridge> ==175266== by 0x14AC06: bool testing::internal::HandleExceptionsInMethodIfSupported(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) (gtest.cc:2671) 21:40 < bridge> ==175266== by 0x13539C: testing::UnitTest::Run() (gtest.cc:5543) 21:40 < bridge> ==175266== by 0x114737: RUN_ALL_TESTS() (gtest.h:2334) 21:40 < bridge> ==175266== by 0x1146BC: main (gtest_main.cc:64) 21:40 < bridge> ==175266== Address 0x1ffefff414 is on thread 1's stack 21:40 < bridge> ==175266== 1468 bytes below stack pointer 21:40 < bridge> ==175266== 21:40 < bridge> ``` 21:40 < bridge> use ubsan and asan rather than valgrind 21:40 < bridge> @milkeeycat pls dont just write it in C, write it all in ANSI C (c99) 21:40 < bridge> its the real c 21:40 < bridge> other c is not real 21:40 < bridge> @teero777 confirm 21:40 < bridge> and for a challenge 21:40 < bridge> do c89 21:40 < bridge> I'll write in C which has `bool` type 21:40 < bridge> u haveto declare variables at start 21:40 < bridge> of functions 21:41 < bridge> iirc 21:41 < bridge> thats a fake c 21:41 < bridge> btw 21:41 < bridge> to ensure ur project is C 21:41 < bridge> project(crocks) -> project(crocks C) 21:42 < bridge> mhm 21:42 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393316555852480562/message.txt?ex=6872baa9&is=68716929&hm=c4283fb5be1dff93a6062a52e8b5e02f8abda41cea2116445484cf14f40f37d9& 21:42 < bridge> @learath2 whats ur take 21:42 < bridge> nice wall of text 21:42 < bridge> nah thats just pain 21:42 < bridge> stack-buffer-overflow just means u are right at the heard of C coding 21:42 < bridge> it feels like home 21:43 < bridge> heart* 21:43 < bridge> @milkeeycat tests are supposed to pass right? 21:43 < bridge> i'm a bit preoccupied, if you still haven't figured it out in 20 I'll take a look 21:43 < bridge> so in conclusion 21:43 < bridge> 21:43 < bridge> its joever, you're reading non-existent memory, the brain is dead - unplug the life support, go home, cry 21:43 < bridge> it would be fun to find a compiler bug 21:43 < bridge> including stdbool.h is fine 21:43 < bridge> works on my machine 21:43 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393316840305852437/image.png?ex=6872baed&is=6871696d&hm=d7820a811459ef9ceff9e0da2e00d0709a26f63f800635d746934450fa8826e1& 21:43 < bridge> it makes the code more clear imo 21:43 < bridge> i meant as joke, i think c21 or some of those has it, c99 real 21:44 < bridge> c21 has bool type built in? 21:44 < bridge> nah, it looks like simple buffer overflow 21:44 < bridge> or what 21:44 < bridge> @learath2 btw, is there a optimized malloc for zeroed data? 21:44 < bridge> or i just have to relly on generic malloc 21:44 < bridge> or calloc 21:44 < bridge> i'd say the multiple unions in the structs don't really help eihter 21:45 < bridge> do u think kernels keep zeroed regions of memory for faster malloc? 21:45 < bridge> would be fun 21:46 < bridge> the pointer is in the stack, you might be reading the stack you're currently using which explains the change in between 2 calls to std::cout 22:02 < bridge> chillerdragon: we return strings which point to stack of this function xd https://github.com/MilkeeyCat/ddnet_protocol/blob/9203c4ae5f03ebac786c487f7d2afaf17eba4022/src/packet.c#L62 22:06 < bridge> ok no longer preoccupied, so did you figure it out @milkeeycat 22:07 < bridge> idk, but I do know it's better to calloc then malloc+memset 22:08 < bridge> old bsds used to zero pages while the system idled, but idk if it's still a thing 22:08 < bridge> look at the message above xd 22:08 < bridge> ok so you didn't 22:09 < bridge> Is it reproducible? Did anyone else get it by cloning your repo? 22:09 < bridge> I did -.- 22:09 < bridge> we are returning pointers to stack :\ 22:09 < bridge> Oh you did, ok then I didn't read properly 22:10 < bridge> classic whoopsie daisy :pepeW: 22:10 < bridge> Rust would have never let you 22:10 < bridge> Go would have promoted it to a dynamic allocation immediately. C bad frfr 22:11 < bridge> I like having ability to shoot both of my legs 22:11 < bridge> me too 22:11 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393323861776400504/screenshot-2025-07-11_23-10-40.png?ex=6872c177&is=68716ff7&hm=0c6d15f6bf0e25fed8685434b958e1e096f1afb55df0fdcdbe3271d92fa158b4& 22:11 < bridge> And it doesn't generate any warnings?? 22:11 < bridge> that's why you would like my language, I'll add register coalescing soon, it will be so gooood 22:12 < bridge> @pilonpl what is your github name? 22:12 < bridge> pilonpl 22:12 < bridge> that's why you would like my language, I'll add register coalescing(to the compiler backend) soon, it will be so gooood 22:12 < bridge> c is just assembly with fancy stuff 22:12 < bridge> Lol 22:12 < bridge> like functions 22:12 < bridge> and integers 22:13 < bridge> But i thought clang had a warning for that specific thing 22:13 < bridge> the pointer goes through a few functions 22:13 < bridge> it's not just 22:13 < bridge> ```c 22:13 < bridge> int a = 0; 22:13 < bridge> return &a; 22:13 < bridge> ``` 22:13 < bridge> god I hate modern websites and their searching abilities, I typed `pilo` like 4 times and it didn't show me your name 22:13 < bridge> There you go, proud owner of a purple name 22:13 < bridge> gg 22:13 < bridge> gg 22:14 < bridge> gege 22:14 < bridge> Great 22:14 < bridge> now u can quit developing for ddnet 22:14 < bridge> official retirement 22:15 < bridge> And tell everyone i am an open source contributor lol 22:15 < bridge> deen landed a job with that 22:16 < bridge> :Pepega: 22:16 < bridge> I didn't so YMMV 22:16 < bridge> I didn't, so YMMV 22:16 < bridge> "i have contributed and maintained a 20 year old game" 22:16 < bridge> i still wonder 22:16 < bridge> why heinrich is not active 22:17 < bridge> well at least in this channel 22:17 < bridge> didnt he say anything about that 22:17 < bridge> What posessed you to write this in C btw? I approve but I didn't think you were a C person 22:18 < bridge> for https://github.com/MilkeeyCat/nodummies 22:18 < bridge> idk why, but I guess it's because everyone is more interested in beefing with him πŸ˜› 22:19 < bridge> LOL, I'm so installing this on all ddnet servers 22:19 < bridge> I even ran without outside vm :justatest: 22:19 < bridge> I even ran outside vm :justatest: 22:20 < bridge> How can a kernel module do that? 22:21 < bridge> intercept all packets, modify teeworlds ones 22:21 < bridge> ^ 22:21 < bridge> I also approve your usage of goto, you are well on track to becoming a real programmer 22:21 < bridge> Not one of these 2025 zoozers 22:21 < bridge> here or on github? 22:21 < bridge> can be used as a cheat lol xD 22:21 < bridge> the copy moves 22:21 < bridge> here 22:22 < bridge> kernel-level cheats 22:22 < bridge> crazy 22:22 < bridge> ring0 ddnet cheats before gta 6 wor 22:22 < bridge> ring0 ddnet cheats before gta 6 wow 22:22 < bridge> well im gonna search for the so called beef myself then 22:22 < bridge> XD 22:22 < bridge> 8 spaces of indentation is crazy 22:22 < bridge> yea 22:22 < bridge> Why is that a thing in the linux kernel 22:22 < bridge> 2 or 4 is fine 22:23 < bridge> tabs I understand but 8 spaces is diabolical 22:23 < bridge> So much storage space wasted 22:23 < bridge> xd 22:23 < bridge> I should try to make ring -3 ddnet cheats that run on the management engine 22:24 < bridge> kinda crazy that tabstop 8 used to be standard, I guess it's due to shorter variable names or sth 22:24 < bridge> learath on his way to broadcast `hey bro, check out this client: learath-ddnetclient.com` 22:24 < bridge> kinda crazy that tabstop 8 used to be standard, I guess it's due to shorter variable names or sth that it was tolerable 22:25 < bridge> The BASIC code I wrote as a kid never had line length issues and I was using 8 wide tabs 22:25 < bridge> I guess it used to be used for making tables 22:25 < bridge> The BASIC code I wrote as a kid never had line length issues and I was using 8 wide tabs XD 22:26 < bridge> 8 wide tabs give you 7 characters per cell in your table 22:26 < bridge> Also explains the name of the key πŸ˜„ 22:26 < bridge> wait no way 22:27 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393327851096248350/image.png?ex=6872c52e&is=687173ae&hm=c900e4350561a35ac763866d75c71415d02352c5a566182848c7d7f09cc99209& 22:27 < bridge> oh right, it's Tabulator 22:27 < bridge> oh right, it's Tab for Tabulator 22:27 < bridge> ...for making tables 22:27 < bridge> but at least it's not literally the Table key 22:28 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393328069716082740/image.png?ex=6872c562&is=687173e2&hm=79d6c5da9ffb8f7d2dafe8243aaac05391b3bcc59b1e7c554efc0c16ef8d12f8& 22:28 < bridge> yeah 22:28 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393328224116674592/image.png?ex=6872c587&is=68717407&hm=a897fbd0a9dae073e59c65a2983ea2e2a12e6b02bb3308e98932644caec05af5& 22:28 < bridge> πŸ˜› 22:28 < bridge> Honestly idk how tab can be used for making tables 22:30 < bridge> as such 22:30 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393328719191605353/image.png?ex=6872c5fd&is=6871747d&hm=05c3dafc5dac844484f8dd5b0697a0e535cfa4322815a69846cab4d9812dcab4& 22:31 < ws-client> ah nice find @milkeeycat 22:31 < ws-client> @milkeeycat we dont have asan in CI right? we need that! 22:31 < bridge> The magic of the Tab character is that it isn't always 8 spaces wide, it aligns to the next multiple of 8 characters 22:31 < bridge> chihllerdragon: we need valgrind,asan,ubsan,everythingsan 22:32 < bridge> you can see that if it was 4 characters I couldn't possibly list my quantity and price for cheese and cake 22:32 < bridge> or in rich text documents it aligns to wherever your tab stops are set 22:32 < bridge> chillerdragon: we need valgrind,asan,ubsan,everythingsan 22:32 < bridge> tbh I'm really surprised one of the sans didn't catch this, did you use them to find it? 22:33 < bridge> I don't really see tabs anywhere 22:33 < bridge> you can still use a variable number of tabs for possibly longer fields 22:33 < bridge> all the spaces in there are tabs 22:33 < bridge> Yeah but i mean in practice 22:33 < bridge> I always use ddnet readme when I need to use asan, I did what readme said 22:33 < bridge> probably in the output of traditional command line tools 22:33 < ws-client> me too @milkeeycat xd 22:33 < bridge> xdd 22:33 < bridge> Well you are supposed to be using it in code when indenting, idk why everyone decided to use spaces instead, weirdos 22:33 < bridge> if you use traditional command line tools 22:34 < bridge> chillerdragon: should i fix an issue which wont matter until 2026 22:34 < bridge> xd 22:34 < bridge> Right? What even is the benefit. 22:35 < ws-client> 2026 seems pretty near 22:35 < ws-client> fix it fast 22:35 < bridge> october 2026 22:35 < bridge> well it also depends 22:35 < bridge> with tabs? everyone gets to view it however they like it, easily, without expensive find and replace to fix all the indents 22:35 < bridge> if ddnet wants to upgrade to rust 1.100 22:35 < bridge> I guess tabs are wider than a normal character 22:35 < bridge> :justatest: hi developers 22:35 < bridge> wtf fat 22:35 < ws-client> @learath2 tabs dont go well with ascii art and alignments 22:36 < bridge> no u? 22:36 < bridge> because people like tabstop 4 (or even 2, yeesh) and they want their code to look the same everywhere 22:36 < bridge> especially for alignments that aren't exact multiples of the tabstop it's important, because a mix of tabs and spaces looks awful when you change the tabstop 22:36 < bridge> tabs to indent spaces to align, best of all worlds 22:36 < bridge> if you indent with 2 spaces never talk to me again 22:36 < ws-client> then you end up mixing tabs and spaces in one line and before you know you have non portable ascii art 22:36 < ws-client> 2 spaces goated 22:37 < ws-client> i also press space twice 22:37 < bridge> I don't, because I don't need 8 levels of nested callbacks like the JS devs :kek: 22:37 < ws-client> https://www.youtube.com/watch?v=oRva7UxGQDw 22:37 < bridge> 1 space enjoyers? 22:37 < ws-client> 1 space????? 22:37 < bridge> ```c 22:37 < bridge> if (foo) 22:37 < bridge> { 22:37 < bridge> goto jail; 22:37 < bridge> } 22:37 < bridge> ``` 22:37 < bridge> you don't even need to press space twice 22:37 < bridge> 2 spaces is okay for yaml i think 22:37 < bridge> only once 22:37 < bridge> i prefer -4 spaces 22:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1393330504404566066/quality20.png?ex=6872c7a7&is=68717627&hm=b92258ba84c341dfb3dec52b13e738ca4863076ed9d370aad50b83a705ee8eeb& 22:38 < bridge> you get solitary confinement 22:38 < bridge> 4 spaces is what i use 22:38 < ws-client> why use spaces or tabs? 22:38 < ws-client> we could also use semicolons 22:38 < bridge> Huh, I've been accidentally based 22:38 < bridge> Godot defaults to tabs (yeah I generally just use whatever the editor defaults to for a language) 22:39 < bridge> my default is 4 spaces because I'm boring 22:39 < bridge> not opinionated enough for tabs 22:39 < bridge> not feeling opinionated enough for tabs 22:39 < bridge> 4 spaces use 4 bytes 22:39 < bridge> If you use anything except Allman, K&R or Stroustrup style you are irredeemable 22:39 < bridge> Tab only uses 1 22:39 < bridge> Also with tabs anyone can set the width they want 22:40 < bridge> So idk, seems like tabs win 22:42 < ws-client> i switched from spaces to tabs actually xd 22:42 < bridge> 0 indent is also an option 22:42 < ws-client> because of bash syntax 22:43 < bridge> Who even invented indentation? 22:44 < bridge> pff probably ancient 22:45 < bridge> Btw what about mixed indentation 22:49 < bridge> Maybe 22:49 < bridge> ```c 22:49 < bridge> int func(int a, int b) { 22:49 < bridge> Int c = a + b; // 4 indent 22:49 < bridge> if (c < a) { 22:49 < bridge> printf("what"); // 8 indent 22:49 < bridge> } // 6 indent 22:49 < bridge> } // 2 indent 22:49 < bridge> ``` 22:50 < bridge> someone take this man's devrole away 22:50 < bridge> Maybe 22:50 < bridge> ```c 22:50 < bridge> int func(int a, int b) { 22:50 < bridge> int c = a + b; // 4 indent 22:50 < bridge> if (c < a) { 22:50 < bridge> printf("what"); // 8 indent 22:50 < bridge> } // 6 indent 22:50 < bridge> } // 2 indent 22:50 < bridge> ``` 22:50 < ws-client> i mean you see some weird ass indents out in the wild if the code is weird 22:50 < ws-client> like multi line if conditions 22:50 < ws-client> or js callback hell 22:57 < bridge> Btw can we just agree writing blocks like this 22:57 < bridge> ```c 22:57 < bridge> if (condition) 22:57 < bridge> { 22:57 < bridge> // Do stuff 22:57 < bridge> } 22:57 < bridge> ``` 22:57 < bridge> Is terrible? 22:57 < bridge> Why would you waste a whole line for no reason 22:58 < bridge> Vertical space is already a precious resource 22:59 < bridge> what’s wasted exactly? 23:00 < bridge> As bash enjoyer I ofc do `condition && do_stuff` 23:00 < bridge> the bracket `{` could be right after the condition 23:00 < bridge> the } after the do stuff 23:00 < bridge> Could also remove them entirely 23:00 < bridge> it's more readable imo 23:01 < bridge> How so? 23:01 < bridge> there is no reason 23:01 < bridge> it just is as it is 23:02 < bridge> i have noticed that c/c++/c# all prefer it that way 23:03 < bridge> btw teewars 0.1 is just 10k lines of code 23:03 < bridge> I think it's dumb because the indentation already separates the lines enough 23:17 < bridge> it's even more clearly separated like that 23:39 < bridge> message(9).txt