03:22 < bridge> do I need to keep the (c) magnus auvinen on new files? how does that work 03:31 < bridge> You do not unless they use his code 03:43 < bridge> ChillerDragon: for InteractState pr are my lasers supposed to disappear when I go into spectate? 03:43 < bridge> they have no effect in general after i spectate or exit, thought they were meant to stay the same 05:41 < bridge> currently doring map loading there is a duration that you can't cancel. Is it always the case or introduced by the recent description update? It's really annoying when accidentally entered some wacky large map that takes forever to load... 06:45 < bridge> @louis.place: they should stay when you go spectate yes. I think I only tested disconnect. Will investigate thanks for reporting. 06:46 < bridge> Sounds too slow, json is rather bad for binary data like tiles 06:47 < bridge> @louis.place: what do you mean by no effect when you exit? They already have an effect on the master when you leave I just made them visible 06:48 < bridge> Hmm maybe i was tripping or on the wrong branch but they just disappeared no effect at all 06:48 < bridge> not even invisible 06:49 < bridge> ill test it more sometime later 06:52 < bridge> what about xml like what Celeste does 06:53 < bridge> Yea even on the wrong branch they should have an effect xd 07:07 < bridge> All Text based formats are bad with binary blobs 07:33 < bridge> whats bad about action based 07:33 < bridge> isn't that how most undo/redo stacks are built 07:37 < ws-client> **** @louis i retested spectating just to be extra sure 07:37 < ws-client> **** works perfectly 07:38 < ws-client> **** @ryozuki 108 prs <:justatest:572499997178986510> 07:38 < bridge> xd 07:39 < ws-client> **** @MilkeeyCat wat we do about sessions now? is it stale forever or do you need convicing? 07:39 < ws-client> **** @learath2 any news on maintainer status? 07:45 < bridge> theres a lot of Prs that can be merged 07:45 < bridge> lots of rossbit prs that look good to go too 07:46 < bridge> I was advocating for images. I think chiller didn't like coz they don't give good git diffs 08:05 < bridge> i don't think you can have good git diffs because git is designed to manage text 08:05 < bridge> and nothing else really 08:05 < bridge> so it won't ever work for ddnet maps 08:07 < ws-client> **** well thats the thing @pilonpl so if ddnet maps are text it works 08:09 < bridge> technically yes 08:09 < bridge> but you probably won't be looking at the text form anyways 08:09 < bridge> and like what's the point? 08:11 < bridge> what is the reason to store a map in a git repo? 08:13 < bridge> btw one issue with the undo redo is that it's a stack and not a tree 08:14 < bridge> so it's a bit limited 08:22 < ws-client> **** my main motivation is version control so i know if i changed something unexpected or accidental. 08:22 < ws-client> **** and contributer safety. I would like to accept prs from ppl i dont trust to update a production map without having a Forris incident 08:23 < bridge> What 08:23 < ws-client> **** or was it Forris? in some Aoe vid i think they talked about someone sending a "fix" for official ddnet map which teleported you to the end xd 08:24 < bridge> Okay 08:24 < ws-client> **** the amount of times git showed me what kind of goofy empty lines i changed in files i didnt know i touched is crazy 08:24 < bridge> I am not sure if textual represenantion would help at all 08:24 < ws-client> **** i dont wanna know what random changes i already spammed into maps 08:25 < ws-client> **** @pilonpl yea it gets overwhealming fast 08:25 < ws-client> **** but for small fixes like 10 tiles changes you can verify exactly what happend 08:25 < ws-client> **** perfect to quickly merge hotfixes 08:26 < bridge> It also seems extremely inefficient 08:28 < bridge> How are layers stored? 08:28 < bridge> Is it just an array 08:29 < bridge> 2 bytes per tile? 08:29 < bridge> Actually idk 08:29 < bridge> Some tiles can have additional data 08:30 < bridge> hm okay weird 08:30 < bridge> ill try again 08:30 < bridge> idk how my lasers even disappeared i had destorylasersondeath 0 08:30 < bridge> there shouldn't be any branch with that behavior 08:30 < bridge> idk how my lasers even despawned i had destorylasersondeath 0 08:31 < bridge> yes 3d array essentially 08:32 < bridge> 2d array of tile indexes, then each tile is a short array of flags etc. 08:33 < bridge> I think it would be best to create a custom diff for ddnet maps specifically 08:36 < bridge> Seems doable 08:53 < bridge> it'd be cool to have a diff showing green and red changes with actual entities lol 10:21 < ws-client> **** who dis ``==670216==AddressSanitizer: WARNING: unexpected format specifier in printf interceptor: %) (reported once per process)`` 10:21 < ws-client> **** no line number? 10:22 < ws-client> **** rossbit i need you daddy 10:22 < ws-client> **** i get this a gazillion times daily ``/home/chiller/git/ddnet-insta/src/engine/shared/network.cpp:42:44: runtime error: index -1 out of bounds for type 'unsigned char[1394]'`` 10:22 < ws-client> **** im so ready. ill do anything 10:23 < ws-client> **** i patch my client i patch my server i do it all 10:26 < ws-client> **** i have one game server log the packets they all have the same shape with different payloads tho 10:27 < ws-client> **** i am running my main gaming client still with this patch https://paste.zillyhuhn.com/5k and still got 0 hits 10:27 < ws-client> **** i play like 4+ hours daily 10:28 < ws-client> **** and server side i get the hit like 3 times daily with an avarage of 2 players 10:32 < ws-client> **** the bad packet i logged server side gets hit rapidly multiple times in a row when it happens 10:32 < ws-client> **** the packet always has the header C3 00 00 always fails on the same huffman out of space error all are size 1197 10:35 < ws-client> **** interestingly i just see here in the log a player joining and the next second he already left again and AFTER he left the same ip and port sent like 20 times the bad payload 10:41 < ws-client> **** found another case of a player joining playing for half a minute then leaving and then sending all the bad packets 10:58 < ws-client> **** oh nvm i think the payload fully is always the exact same 10:58 < bridge> Any way we could figure out what's in it? 10:59 < bridge> It shouldn't cause issues without ASAN so it doesn't seem like an attack to me 10:59 < ws-client> **** yes its always the same payload! 10:59 < ws-client> **** its this https://github.com/ddnet/ddnet/issues/3346#issuecomment-3036142737 10:59 < ws-client> **** and as far as i can tell it happend 3 times when someone joined and left 10:59 < ws-client> **** after they left 11:00 < ws-client> **** if interpreted as a packet according to its header which says connection oriented compressed you can decompress infinite amount of garbage 11:00 < bridge> Hmm, so either the partial decompression didn't work, or the payload is garbage to begin with 11:00 < ws-client> **** seems to be some huffman decompression bomb 11:01 < ws-client> **** and inspecting the decompressed payload partially stops to make sense already at the first message in the payload 11:01 < ws-client> **** if its unitialized memory is it realisitic its the exact same value for multiple different users? 11:02 < bridge> No, at least with release build you should expect different values 11:02 < ws-client> **** so its something :D 11:03 < ws-client> **** i somehow want to believe it is actually some connless message but idk also doesnt make sense 11:03 < ws-client> **** i just dont understand how my client side logger does not hit 11:03 < bridge> Some weird third party client trying to communicate with its own game servers using a different huffman decoding tree :justatest: 11:06 < ws-client> **** well .. 11:06 < ws-client> **** it also affects chillerbot-zx 11:06 < ws-client> **** so i should know xd 11:06 < ws-client> **** i see my name ip and authed to rcon in log together with the bad packet 11:07 < ws-client> **** at least on the server side .... 11:07 < ws-client> **** maybe the server also hallucinated a packet 11:10 < ws-client> **** also thought its maybe only once on server boot or only client id 0 but that is not true either it happens multiple times and the server keeps running the client ids are all kinds of values 11:46 < bridge> Might be, especially for larger maps. But it is worth giving it a quick try to see how bad it it 11:46 < bridge> Might be, especially for larger maps. But it is worth giving it a quick try to see how bad it is 11:52 < bridge> doesnt have to be json 11:56 < bridge> It's very easy to get wrong. One action you forget and it's broken. One side-effect you miss, one inverse you misimplement. It's just very fragile. 11:56 < bridge> 11:56 < bridge> There is a way to make it less fragile, just do not allow any changes to the data except through an object that implements `IAction`. Then you can guarantee that nothing is forgotten. 11:56 < bridge> 11:56 < bridge> But in general undo/redo stacks of all kinds exist in the wild, photoshop e.g uses deltas 11:56 < bridge> same exact issue for groups confirmed, currently on the fix. How do you reorder envelopes? 11:56 < bridge> With the left and right arrow buttons 11:57 < bridge> Very similar issue, if you reorder and then undo changes, the subsequent actions may apply to the wrong envelope 11:58 < bridge> I don't get what this group ordering is trying to accomplish: 11:58 < bridge> ``` 11:58 < bridge> int CurrentOrder = m_Current; 11:58 < bridge> bool Dir = m_Current > m_Previous; 11:58 < bridge> while(CurrentOrder != m_Previous) 11:58 < bridge> { 11:58 < bridge> CurrentOrder = m_pEditor->m_Map.SwapGroups(CurrentOrder, Dir ? CurrentOrder - 1 : CurrentOrder + 1); 11:58 < bridge> } 11:58 < bridge> m_pEditor->m_SelectedGroup = m_Previous; 11:58 < bridge> ``` 11:59 < bridge> it looks like it tries to swap up or down until it matches, which I thought about 12:03 < bridge> yes it does this sophisticated at 2 places, and wrong just at another :justatest: 12:06 < bridge> That's what it looks like to me too. Just swap upwards or downwards one by one to get to the old position. Probably implemented that way because to get it there otherwise you'd have to do a block move of all layers to open up a space and insert it, but that comes with a huge issue with pointers 12:07 < bridge> I already implemented a Move instead of swap function for layers, doing the same rn for groups, because swapping around is more error prone if it can just be one operation 12:08 < bridge> As long as you are careful that's fine. You just need to make sure you don't break any pointers and it'll work either way 12:11 < bridge> How careful do you want to be? 12:11 < bridge> ``` 12:11 < bridge> int NewGroupIndex = m_pEditor->m_Map.MoveGroup(m_Previous, m_Current); 12:11 < bridge> dbg_assert(NewGroupIndex == m_Current, "fck2"); 12:11 < bridge> m_pEditor->m_SelectedGroup = NewGroupIndex; 12:11 < bridge> ``` 12:11 < bridge> 12:11 < bridge> I believe I don't need the assert :3 12:12 < bridge> Well idk what MoveGroup does. That's what needs to be implemented carefully. Not what calls it 😄 12:16 < bridge> but swapping doesn't make sense, like you can swap the 3rd and 1rst group by editing the group index and text-editing it to 0 12:17 < bridge> I find this bug kind of funny, because it was unnoticed for so long, because mostly everyone uses the arrow buttons which swap a layer with the previous one which is the same but only in this case 12:18 < bridge> I added groups and layers to the same PR (it's the exact same code and algorithm), should I also add envelopes? 12:19 < bridge> Yeah, seems fine in a different commit, since it's a similar bug 12:20 < bridge> It's the exact same code and algorithm :pepeW: 12:21 < bridge> oh shit it does more, it visits all quads and updates references :justatest: 12:33 < bridge> 🙃 12:34 < bridge> Using indices for everything in the editor has made it very complicated. Especially if you want to copy part of one map to another. 12:35 < bridge> for envelopes I am back to smart swapping :justatest: 12:35 < bridge> At least right now you can only swap envelopes left and right I think 12:35 < bridge> did you break it with that? 12:36 < bridge> yeah and with add, remove and undo/redo actions 12:36 < bridge> D: 12:36 < bridge> can you check out my PR and test if the group and layer thing is fixed for you? 12:36 < bridge> Not yet, can try now 12:37 < bridge> Hm, indices should be simpler than pointers. At least usually it is 12:37 < bridge> if you can only swap left and right this is not the issue here :justatest: since swapping and moving shouldn't make a difference 12:37 < bridge> Ah, I guess moves being possible makes it annoying 12:42 < bridge> mvoes make it easier, because a swap are 2 moves in principle 12:42 < bridge> assuming you don't swap just with an offset of 1 12:44 < bridge> The envelope editor also does not check if you can swap (if the envelope is already the first/last) and creates a history entry anyway, not sure if it's also wrong :pepeW: 12:45 < bridge> yeah I saw that and I am fixing that, it pretends that swapping never fails 12:52 < bridge> Should failed operations be in the history? 12:52 < bridge> Like trying to move an envelope from 0 to -1 but it moved from 0 to 0 12:53 < bridge> Because I fixed it, but the history has an entry "moved env 0 from 0 to 0" xD 12:55 < bridge> The buttons should be disabled if the operation would fail 12:55 < bridge> Seems to work 12:56 < bridge> how do I disable a DoButton_Ex? 12:58 < bridge> `-1` as `Checked` value 12:58 < bridge> (see undo/redo buttons for example) 13:01 < bridge> ^.^ 13:01 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1398621326121369701/screenshot_2025-07-26_13-01-12.png?ex=6886071d&is=6884b59d&hm=eb5368bd8d69ca81872a3c6b366aa551c6ec96c76b22022e80985838d07caf49& 13:01 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1398621326679347311/screenshot_2025-07-26_13-01-08.png?ex=6886071d&is=6884b59d&hm=02c78cf6e1ced66b9a155923fb0cd473551de53ba0b5e3581876c779e31a687c& 13:20 < bridge> Ah. envelope editor. 13:21 < bridge> When you are creating an animation which is over 20 minutes time long, you will feel the zoom scale of envelope editor is quite annoying. 13:37 < bridge> The maximum is 10 minutes currently. 30 minutes maximum zoom would still work AFAICT, but with 1 hour the labels would overlap. Would be fine if the labels would only be shown for every second line though. Feel free to PR. 13:37 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1398630273989738556/image.png?ex=68860f72&is=6884bdf2&hm=f98329d61f0fcbbc76a678cd235dde8ffdccdad2daa7a5627cc392190e2deb0e& 13:37 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1398630274337734676/image.png?ex=68860f72&is=6884bdf2&hm=b6bd2a664348368ebdc3c031303ff57f7705c25a574c9bcc3d56f9ad017f875a& 13:38 < bridge> That's great 13:59 < bridge> How do new map releases work? 13:59 < bridge> like when I am able to play, is there an event, or just "map now available gl" 14:09 < eeeqqweqweqeq> can someone help me? 14:09 < eeeqqweqweqeq> i have an issue about "bot client".. 14:09 < eeeqqweqweqeq> and because of that i have been banned... 14:09 < eeeqqweqweqeq> no bot client ever 14:10 < eeeqqweqweqeq> but still i have been banned from ddnet.. 14:19 < bridge> Wdym? 14:19 < bridge> 14:19 < bridge> The map will be announced in #map-releases and when officially available in #announcements 14:19 < bridge> yes but it was 14 oclock, the map was already votable with /map and I started 14:20 < bridge> and halfway through my map I got an announcement xD 14:20 < bridge> Ah yeah, that's normal 14:20 < bridge> The announcement will always be delayed 14:21 < bridge> The announcement will always be delayed 14:21 < bridge> (Or at least has been for so long that it feels normal) 14:44 < bridge> where do I donate? 15:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1398660784388837487/4a7f285a0d5635f6a9231bbee85ab13f.png?ex=68862bdc&is=6884da5c&hm=f35b6518c221725f3d207dcdf34627a55e0e474791450abf7fa891351aef4797& 15:40 < bridge> One of our friends who code on window meet this strange problem. 15:41 < bridge> One of our friends who code on windows meet this strange problem. 15:42 < bridge> On latest master? 15:43 < bridge> no. in https://github.com/Hu1night/DDNet-PvP/tree/ddnet_protocol 15:43 < bridge> no. on https://github.com/Hu1night/DDNet-PvP/tree/ddnet_protocol 15:51 < bridge> Is there a feed for map releases? 15:55 < bridge> This is missing all required definitions for Windows in the `CMakeLists.txt`: https://github.com/ddnet/ddnet/blob/708640fcf051bf3bb82ba4175ad313bd65a7d072/CMakeLists.txt#L3595-L3605 15:55 < bridge> The error is because Windows headers define a different `IStorage` class unless you define `WIN32_LEAN_AND_MEAN` 15:59 < bridge> I actually wonder why nobody answers 15:59 < bridge> https://ddnet.org/funding/ 16:33 < bridge> Why is pay pal the only option 16:42 < bridge> Idk google it 16:42 < bridge> done 16:42 < bridge> sometimes you just don't search the right keyword 16:44 < ws-client> **** @robyt3 i was on the biksies and dont think i formulated my comment clear enough. I agree jetpack code can be refactored. Still think full auto is good. And think they are unrelated things. So either you comment on something full auto related, say its not good, or needs more reviewers otherwise i will close it tomorrow oO 16:44 < ws-client> **** enuff stale prs this was not meant to become one 16:45 < ws-client> **** @learath2 ? 16:45 < ws-client> **** did the irc bridge die or did you ignore my question? 16:45 < bridge> I don't remember a question 16:46 < ws-client> **** i asked this morning what the state is about me getting merge rights? 16:49 < bridge> Oh, I asked everyone else, waiting for responses 16:49 < bridge> don't take it personally, I'm very absentminded lately, I read things and they just go right out of my mind 16:49 < bridge> I think the jetpack refactor should be done first in this case 16:50 < ws-client> **** first? 16:50 < ws-client> **** lel 16:50 < ws-client> **** uhm hm 17:09 < ws-client> **** uhm? ``Total reclaimed space: 308.4GB`` 17:10 < ws-client> **** ``podman system prune -a`` just freed 300gb of space on my raspberry pi with a 32GB disk? 17:26 < bridge> <0xdeen> @essigautomat Thanks! ^ 17:32 < ws-client> **** how much did he donate? 17:32 < ws-client> **** https://github.com/ddnet/ddnet-web/commit/8aa9d1df5cd336841c8b55a63fd3394a592eb8a6 17:32 < ws-client> **** wowo 50 17:32 < ws-client> **** @Assa goat 17:39 < ws-client> **** where can i donate? 17:39 < chillerbot> You can see donors and how to donate here https://ddnet.org/funding/ 17:39 < ws-client> **** ez 17:40 < ws-client> **** sadly my disk is still too full for containers 17:40 < ws-client> **** @learath2 pls dont wipe my disk its uncontainered again :c 18:11 < bridge> @heinrich5991 This was your Donation money 14 months ago ❤️ thx heini 18:58 < bridge> Hello, after playing around a little bit it seems that modded servers, playable with ddnet client, don't care or aren't good enough at detecting cheating clients, so many alternative game modes are less fair for honest players... 18:58 < bridge> I wonder if the ddnet team would develop his own version of some funny game types to prevent this. 18:58 < bridge> And later allow only trusted servers to appear in the list, keeping cheaters and hackers out of the game as much as possible. 19:01 < bridge> It depends, it's the modders who should integrate with ddnet and not vise versa, but there's overlap. Often we are the same people and Chillerdragon and me support a mod for example 19:01 < bridge> them cheaters even use hax in official ddnet servers, it wont change anything imo 19:14 < bridge> I had an idea that may improve authenticity: using the autoupdater also server side, doing periodical little random changes to network messages or how input are sent. 19:14 < bridge> But it needs to keep secret part of the source code related to it. 19:14 < bridge> That way a cheat client wouldn't last long and hackers would be annoyed of repeating the job of understanding how is working 19:19 < bridge> I had an idea that may improve authenticity: using the autoupdater also server side, doing periodical little random changes to network messages or how input are sent. 19:19 < bridge> But it needs to keep secret part of the source code related to it. 19:19 < bridge> That way a cheat client (or server) wouldn't last long and hackers would be annoyed of repeating the job of understanding how is working 20:08 < ws-client> **** @carmine1985 do you have a particular server in mind with a cheating problem? 20:08 < bridge> Fng 20:08 < ws-client> **** which one 20:10 < ws-client> **** the idea of changing the network protocol to confuse cheat client devs is unrealisitc 20:10 < bridge> I don't remember, in general I see some opponents hitting targets (or me) very easily with their rifle laser 20:10 < ws-client> **** all fng servers i know have something in place against cheaters 20:11 < ws-client> **** are you sure you can tell the difference between 10yr veteran pro players and cheaters? 20:11 < ws-client> **** would be interesting which server tho the solutions are different 20:11 < bridge> Indeed I wrote it to have some feedback, why not realistic? 20:12 < ws-client> **** for starters it doesnt help 20:12 < ws-client> **** and it breaks old clients too which is not an option 20:12 < bridge> It's impossible for the protocol to be secret, otherwise nobody can use it 20:13 < bridge> anti open source ddnet 20:13 < bridge> problem fixed and everyone happy 20:14 < bridge> Closed source doesn't make the protocol more secret either 20:15 < bridge> good luck to anyone figuring out what all the bytes do 20:15 < bridge> too much effort just to get advantage in a free game 20:23 < bridge> that's why DDNet is superior 20:23 < bridge> you can't cheat 20:23 < bridge> not really 20:23 < bridge> because people play for fun 20:24 < bridge> and don't care much about cheated ranks 20:24 < bridge> which is the only issue honestly 20:26 < bridge> oh ppl do 20:26 < bridge> in ffxiv ppl figurd the protocol and even built their own server 20:26 < bridge> just like wow private servers 20:30 < bridge> The best you can do is make it extremely annoying. Encrypted protocol with rolling encryption key generated within a kernel level anti cheat 21:23 < bridge> ^ how to lose all remaining players 21:36 < bridge> Tbf, I doubt 80% of the community made up of new players ages 8-15 care all that much about open source 21:39 < bridge> But they would care about kernel spyware 21:39 < bridge> Even some old players and devs prefer closed source 21:41 < bridge> People generally don't like caring about stuff i think 21:41 < bridge> Most don't even know what open source is 21:43 < bridge> Yea 21:44 < bridge> And let's be honest open source software sux too 21:44 < bridge> Just in a different way than stuff like adobe 21:47 < bridge> It's also true that paid software also uses open source projects 21:50 < bridge> Exactly this. You waaay overestimate how much people care. Like 10 people stopped playing lesgue of legends after they added their spyware 21:50 < bridge> Exactly this. You waaay overestimate how much people care. Like 10 people stopped playing league of legends after they added their spyware 21:51 < bridge> One more spyware in today's world is not a big deal unfortunately 21:53 < bridge> Games generally are closed source 21:53 < bridge> Which is quite acceptable for some reason 21:53 < bridge> I would never be for us shipping a kernel anticheat for the record. But I know most wouldn't care even 21:54 < bridge> Well obviously it's not a good idea lol 21:55 < bridge> Gaming on linux is pretty much perfect 21:55 < bridge> And now anti cheat is the only thing that doesn't work i guess 21:56 < bridge> And probably some hardware doesn't work either for similar reasons 21:56 < bridge> At least there is the steamdeck 21:56 < bridge> I watched the xbox talk, that's the only way to avoid cheating. Controlling all the hardware. The setup they have is insane 21:58 < bridge> That's great if they can eliminate cheaters this way 21:58 < bridge> But i would prefer to have more control over the thing i bought 21:59 < bridge> The way they designed it, it would cost tens of thousands to compromise the hardware 21:59 < bridge> Pretty much impossible to cheat on xbox live 22:00 < bridge> Cheating in an online game is certainly illegal 22:01 < bridge> Singleplayer should be fine though 22:02 < bridge> It's probably not entirely legal either 22:02 < bridge> Idk 22:02 < bridge> I wonder how it works 22:03 < bridge> I think fundamentally there shouldn't be anything stopping me from modifying hardware i own and software acquired legally 22:05 < bridge> I don't like they way everything functions 22:05 < bridge> I want to live in the middle of nowhere 22:05 < bridge> With no internet 22:05 < bridge> And be happy lol 22:06 < bridge> It's actually a good advice 22:06 < bridge> In order to be rich you should spend less money 22:07 < bridge> And the ultimate richness is not having any desires 22:07 < bridge> Then you don't have to do anything to be happy 22:07 < bridge> Technically makes sense 22:09 < bridge> It's similar to how religions justify evil 22:10 < bridge> Basically it doesn't matter that right now you are poor, enslaved, starving or whatever else. In the afterlife god will make everything just 22:10 < bridge> It's hard to make things actually just 22:10 < bridge> So religion gives you a promise that actually things are fair 22:13 < bridge> In some afterlife which is more convenient to believe than thinking that you simply are in a bad situation 22:14 < bridge> Very interesting stuff 22:14 < bridge> This definitely belonged in #off-topic 😄 22:15 < bridge> Well yeah 22:16 < bridge> Right so i think we should add katana back 22:17 < bridge> As a fun feature that can deepen the DDNet iceberg 23:36 < bridge> Wall of text 23:41 < bridge> Spaghetti for everyone