IRC logs for #openttd on OFTC at 2023-07-17
β΄ go to previous day
02:13:41 *** debdog has quit IRC (Ping timeout: 480 seconds)
02:24:17 *** Wormnest has quit IRC (Quit: Leaving)
04:14:43 *** esselfe has quit IRC (Ping timeout: 480 seconds)
04:14:57 *** esselfe_ has joined #openttd
04:16:33 *** ethanabrams has joined #openttd
04:21:38 *** ethanabrams has quit IRC (Quit: WeeChat 3.8)
04:31:11 *** justanortherner has joined #openttd
04:31:11 <justanortherner> Goodbye then?
06:59:17 <pickpacket> Good morning, rather
07:12:17 <pickpacket> How does the sale offering for a company going bankrupt work? It happens so rarely in the games I play that I don't remember. Iirc at least one company is offered to buy a competitor that is about to go bankrupt, but I'm not even sure that's true π
07:16:11 <andythenorth> GS needs access to industry var 0xB0
07:16:16 <andythenorth> /me looks how to do that
07:17:02 <andythenorth> `case 0xB0: return ClampTo<uint16_t>(this->industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR); // Date when built since 1920 (in days)`
07:17:19 <andythenorth> that 1920 thing is weird, can I just use `this->industry->construction_date`? π
07:28:26 <peter1138> Yes, the 1920 thing is to be compatible with NewGRF varactions.
07:28:50 <truebrain> Haven't actually read chat for a while, but was it talked over to have #10204 not dismiss the old setting, and just convert it? We have a few example of that already?
07:29:46 <peter1138> Oh it was mentioned...
07:30:35 <truebrain> I am never a fan of resetting a setting for everyone because one person wanted a new entry in the dropdown π Feels unbalanced π
07:30:54 <truebrain> we have solutions, but they take a bit of code .. so I am balancing whether to ask that in this case
07:30:58 <pickpacket> I can't find an explanation of how bankruptcy proceedings work anywhere on the wiki
07:31:20 <pickpacket> or even a page specifically about "Company" in the manual
07:35:36 <andythenorth> ach I've forgotten how to git π
07:35:56 <andythenorth> I need to base patches on master, not 11141 π
07:36:16 <truebrain> meh, too bad `full` in settings is not a map, but a list
07:39:38 <truebrain> and just to highlight one thing of my review (CCing talltyler for visibility): we really should stop storing enums as numbers in settings. Please please store them as values π (so a `full` entry in the settings entry)
07:41:18 <truebrain> After all: `right_click_wnd_close = close-except-sticky` is a lot better than `right_click_wnd_close = 2` π
07:44:33 <LordAro> truebrain: depends if configs are supposed to be read by people (or users, at least)
07:44:49 <truebrain> we set this in motions years ago π
07:44:57 <truebrain> all new settings do this already
07:45:21 <truebrain> I am not sure if "should be readable by people" is any part of the decision here
07:45:27 <truebrain> "should be readable by devs" however ...
07:45:30 <truebrain> (are we people? π )
07:45:39 <peter1138> Hmm, breakfast now or not...
07:45:43 <LordAro> not according to some...
07:46:02 <truebrain> yeah, exactly ... so I am not sure I agree with your statement π π Change people to devs, and it works for me π
07:46:42 <LordAro> that was why i added the "or users" bit
07:46:46 <peter1138> Maybe we should just Google it?
07:47:00 <truebrain> LordAro: I am just trolling π
07:47:15 <LordAro> i don't agree with my statement either :p
07:47:22 <truebrain> but yeah, let's please make enums in our openttd.cfg be stored as names; we have the infra, it is little effort, let's goooooo π
07:47:27 <peter1138> Can we look up the numerical enum values in DHCP?
07:47:38 <truebrain> owh, the DHCP ... that one is old π That was hilarious π
07:47:49 <LordAro> put a lookup service on a cheap VPS
07:48:13 <truebrain> we can start a bingo-card here π
07:49:04 <andythenorth> I have a spare MBP in the loft somewhere
07:49:24 <andythenorth> can we use that?
07:49:55 <andythenorth> my broadband is mostly reliable, until it's not
07:49:58 <truebrain> I am trying to find out how the `full` in settings actually works .. oof .. that is hidden somewhere π
07:50:46 <andythenorth> pff...tempted to yolo exposing the entire industry spec to the (GS) content API
07:51:06 <andythenorth> I forsee having to debate anew each PR for each var I add π
07:51:17 <andythenorth> as new people turn up and express a range of opinions
07:51:32 <truebrain> huh ... I did type the comment about `full` in the PR
07:51:35 <truebrain> but can't find it back
07:51:43 <truebrain> am I going crazy now? Lol
07:52:44 <LordAro> i don't recall any automatic enum stringify stuff...
07:52:52 <truebrain> owh, it exists in many places
07:52:57 <truebrain> but I wrote a nice comment about how to do it
07:53:02 <truebrain> and it isn't there!
07:53:06 <peter1138> Is exposing the industryspec useful? Exposing some industry vars, yes, but industryspec is just the prototype.
07:53:43 <LordAro> truebrain: *in ottd :p
07:54:45 <andythenorth> I am reading what's exposed already (or not)
07:54:55 <andythenorth> most of it seems to already be available
07:54:59 <truebrain> I guess I never pressed the green button
07:55:01 <andythenorth> and yes, I mean vars
07:55:06 <andythenorth> `i->owner` is interesting
07:55:35 <andythenorth> can't see it used for anything, is that just an artefact of 'everything must be owned'
07:55:35 <truebrain> LordAro: it exists in OpenTTD, in many places
07:55:48 <truebrain> so you can add "in ottd" in my sentence too, if you so like π
07:56:18 <truebrain> as I said, it is zero effort to make it store as names instead of numbers, from our perspective π We have everything setup to do it correctly π
07:57:26 <truebrain> you seem to suggest I am making a new PR author write extra stuff in our settings processor, but I am really not π
07:58:39 <LordAro> i just can't remember it
07:58:55 <truebrain> yeah, hence my highlight I made above π
07:59:10 <LordAro> it has been some months since i did any real OTTD dev :(
07:59:19 <truebrain> I do wonder if we should add "alias" support to it, so you can remap "true" and "false" .. but that seems like effort π
07:59:23 <peter1138> andythenorth: trolling variable π
07:59:30 <truebrain> LordAro: something only you can fix! π
08:01:21 <peter1138> But not right now as it's 9am.
08:02:02 <peter1138> Hmm, do I need an ultrasonic parts cleaner...
08:02:13 <peter1138> Gotta clean yer parts
08:02:27 <truebrain> I have one, and it is shit
08:02:36 <truebrain> buying a cheap version turns out to be a shitty idea
08:02:51 <truebrain> (tried it for my glasses; but it doesn't actually help all that much)
08:03:09 <truebrain> yeah, they claim it will work, but you need "very expensive fluids" to make it work
08:08:45 <peter1138> I guess a plastic tub and a bottle of white spirit will do.
08:08:50 <andythenorth> /me considers auto-tree-planter GS for sawmills
08:09:16 <peter1138> Natural tree growth not suitable?
08:09:28 <andythenorth> just reading what vars are exposed π
08:10:11 <peter1138> IIRC that was bug that lead to me finding that tree-growth wasn't scaled properly.
08:10:20 <peter1138> (And most people think trees grow too many anyway)
08:10:42 <andythenorth> I am more seriously considering 'plant objects around industries' via GS
08:10:45 <brickblock19280> what is expected to happen when a baseset extra grf is loaded as a regular grf?
08:15:09 <peter1138> farms already plant fields, don't they?
08:15:28 <andythenorth> yes, but they don't contain cows π
08:15:38 <andythenorth> they're quite definitively arable
08:15:58 <andythenorth> objects probably can animate?
08:16:04 <peter1138> That doesn't seem to be an issue solvable by GS
08:16:57 <andythenorth> "shouldn't be" maybe, but I think GS can do it π
08:17:49 <andythenorth> yeah GSObject.BuildObject()
08:18:09 <andythenorth> then some kind of tile walk from the industry
08:19:43 *** D-HUND has quit IRC (Ping timeout: 480 seconds)
08:24:02 <andythenorth> oof horrible idea
08:24:30 <andythenorth> the day has a 'y' in it
08:24:40 <andythenorth> expose all grf vars and GS getters (not setters) via a common interface
08:24:53 <andythenorth> then use that as the basis for the WASM port π
08:25:32 <andythenorth> setters would be a problem π
08:33:39 <peter1138> Might be too unstable as an API π
08:35:53 <truebrain> ugh, we already have an alias system working, but just for 1 type of OMANY (we have 2)
08:37:18 *** debdog has quit IRC (Ping timeout: 480 seconds)
08:38:51 <truebrain> why too often I am wondering where the hell it finds a `openttd.cfg` to load
08:43:57 <truebrain> why on earth is autosave setting loaded twice ... this rabbithole ...
08:45:18 <truebrain> owh, yeah, old OPTS bla
08:47:00 <truebrain> haha, so I was changing that the autosave setting wasn't `monthly` anymore, but `30-minutes`
08:47:08 <truebrain> turns out, when you do that, it uses `30` as value
08:47:16 <truebrain> instead of the Nth position the `30-minutes` entry is in π
08:47:27 <truebrain> when a value starts with a number, it is parsed as number, instead of doing a lookup
08:55:30 <truebrain> right, that would simplify #10204 a lot π
08:56:13 <shrekshellraiser> That sounds very familiar
08:56:35 <shrekshellraiser> I remember trying to do setting conversation with OMANY
08:56:54 <truebrain> yeah, it was done partial .. doing one OMANY and not the other is just lazy π
08:57:01 <truebrain> (I might have done it, so I can say that π )
08:58:29 <truebrain> meh, it is still weird ... many-of-many also supports `load`, but it doesn't do anything
09:05:02 <peter1138> So we've flipped from "don't bother" to "do it"
09:05:24 <peter1138> I guess the argument about switching versions and having conversion issues is moot.
09:05:40 <peter1138> God damn, something bit me a lot last night π¦
09:06:09 <truebrain> I am not following peter1138 ?
09:09:02 <truebrain> peter1138: if I understand you correctly, we are backwards compatible; not forwards compatible π
09:09:36 <truebrain> should I split my PR into two PRs .. hmm .. guess this is fine. It is two commits now π
09:10:37 <shrekshellraiser> truebrain: The issue they are talking about is the possibility of getting a warning about an invalid setting when running an older/alternative version of the game
09:10:51 <truebrain> yup; what I said, we are backwards compatible, not forwards
09:10:59 <shrekshellraiser> That's why the setting was renamed
09:11:00 <truebrain> we have had this discussion many times over the last 20 years π
09:11:16 <truebrain> it is completely impracticle to also want to be forwards compatible
09:11:28 <truebrain> the argument mostly comes down to: neither are savegames
09:12:54 <truebrain> anyway, as I started this morning: I have missed chat for the last few days, so not sure this was talked about π
09:12:56 <shrekshellraiser> frosch123[d]: Yeah I was directly told to rename it
09:13:32 <shrekshellraiser> Doing conversion on load was mentioned, but not how to actually do it
09:13:43 <truebrain> we have precedent how to do that π
09:14:30 <truebrain> but I can talk that over with frosch123[d] when he gets on π I think renaming is the wrong solution. Saying: "everyone who didn't use the default has to redo their setting", is not a nice thing to say in my book π
09:14:44 <brickblock19280> brickblock19280: did this get missed?
09:15:38 <truebrain> especially as this setting is about adding another entry; not about changing the meaning
09:20:05 <truebrain> (and I see the argument for switching between release and nightly; but some conversations in OpenTTD we have many times, yet we fail to write them down π )
09:22:16 <truebrain> anyway, I am not against renaming the variable; I am against resetting the user preference. There are other ways to address that .. we have had talks in the past to present the user with what settings have changed, so they can make choices
09:22:47 <truebrain> but it we reset behaviour without notifying the user every time we add a setting to something, that is just in poor taste, in my opinion π
09:23:22 <truebrain> (I had to read up the conversation on Discord π Too much talk in this channel sometimes π )
09:27:34 <peter1138> brickblock19280: What do you expect to happen?
09:27:50 <brickblock19280> that it would replace the sprites
09:27:59 <peter1138> I simply "don't expect" a user to try loading a baseset extra grf as a regular NewGRF.
09:28:19 <brickblock19280> I did it failed
09:45:08 <peter1138> LordAro: lol, "morning ride" -- rear wheel turning as I moved the bike.
09:47:29 <LordAro> peter1138: it counts!
10:15:01 <truebrain> so how about the last commit here; that renames the setting, while keeping the original value
10:15:04 <truebrain> best of both worlds?
10:15:58 <truebrain> as we are getting a few more `IFV` versions, we could make that a bit more readable; but that is not the point π
10:18:54 <peter1138> Flipped, from not caring to supporting config updates. Okay π
10:19:17 <truebrain> yeah, seems people forgot I added config versioning like 2 years ago π
10:19:42 <peter1138> Also, that setting should probably just be a number of minutes instead of a string :p
10:19:53 <truebrain> but that is more work π
10:20:14 <peter1138> So the first commit is good, the rest is... arguable.
10:20:44 <truebrain> haha, well, ignore it is for autosave; imagine it is for right-click thingy π
10:21:43 <truebrain> (as yes, I really should just allow the setting to be in minutes, and don't limit it to just a preset amount of minutes in the config π )
10:22:40 <truebrain> ideally you can also select any minute-amount from the GUI; but did we have a GUI element for that yet?
10:28:28 <peter1138> I already have a patch to do it, but there were complaints that the slider widget looked odd, and it should just be a dropdown. Which is... odd.
10:28:47 <peter1138> (Also I didn't do any conversion, but that should be doable)
10:31:24 <truebrain> oof, changing autosave interval to be proper, is .... difficult π
10:34:44 <kamnet> peter1138: Isn't it already into brunch?
10:35:34 <peter1138> I've not eaten yet so anything is breakfast π
10:41:32 *** barbagus has joined #openttd
10:41:45 <truebrain> till we have a new GUI element, that is the most proper way I can do this I think
10:42:03 <truebrain> but the first commit is now irrelevant π
10:43:04 <peter1138> IIRC the main issue with the existing slider is it always draws a wedge, which is silly for this.
10:43:33 <peter1138> But looks good. Saves me doing the conversion code π
10:44:28 <truebrain> and it gives a template how to make the right-click work properly
10:44:35 <truebrain> (as in, not dismiss user preference :P)
11:03:11 <truebrain> in theory we could make code that you could define these conversions in the settings table .. but given the few amount we have, sounds hardly worth it at this moment in time π
11:03:45 <truebrain> so I guess the options are: either get an error popup when you switch between release and nightly, or have a bit of code that converts old to new π
11:05:43 <peter1138> Hmm, so that conversion doesn't use the "load" system?
11:15:25 <truebrain> No, the load is only useful if we keep the same name. If we change the name, it isn't useful π
11:16:01 <peter1138> That limit's load's usefulness a bit.
11:19:41 <peter1138> Β£71.50 for a bike tyre :/
11:48:08 <truebrain> peter1138: If we state we want to be forward compatible here, loads is mostly pointless yes π
11:53:08 <peter1138> Well, if we can make the config do what people expect, and not throw warnings where possible, that's nice π
11:57:55 <truebrain> Just a bit awkward coming up with new names for the same stuff π
11:58:27 <truebrain> Another solution would be to postfix names with the version, and have conversion run on that
11:58:53 <truebrain> So the config would read `autosave. 4` and `autosave.5`
11:59:12 <_glx_> Won't tell old versions how to read newer ones
11:59:33 <alfagamma_0007> peter1138: For a single tyre???
11:59:35 <truebrain> no, for that you simply use afterload.cpp-like stuff
11:59:48 <truebrain> owh, old how to read new: no, exactly
11:59:52 <truebrain> so in a migrated configuration you have both keys
11:59:57 <truebrain> v4 clients read the .4
12:00:02 <truebrain> v5 clients read the .5, if it doesn't exist, convert .4
12:00:36 <truebrain> it is just really annoying bookkeeping for something that rarely happens
12:00:43 <truebrain> so .. *shrug* .. I am fine with my PR suggestion π
12:09:37 <peter1138> Old versions don't need to be able to read newer ones.
12:09:42 *** barbagus has quit IRC (Ping timeout: 480 seconds)
12:10:01 <peter1138> It's just nice if they don't throw an error because they don't understand the value, which means the unique name solves that.
12:17:28 <peter1138> Hmm, I quite dislike how browsers render scrollbars these days. Maybe it's a Windows thing.
12:25:30 <truebrain> they tend to want to hide it
12:25:35 <truebrain> so I don't always notice when things are scrollable
12:28:59 <Eddi|zuHause> the worst is the new steam client, it fails to render correctly, so you don't know at which position the scroll bar is
12:30:40 <Eddi|zuHause> the second worst is youtube videos in full screen, like, why is that even a feature?
12:32:37 <Eddi|zuHause> the third worst problem is, due to them being very narrow, makes them very hard to drag&drop, instead of using the mous wheel
12:33:12 <truebrain> didn't know people made lists
12:33:48 <Eddi|zuHause> should have gone with the current meta, and made a tier list instead? :p
12:41:15 <kamnet> Anybody remember the link to the NML town name tutorial? My brain isn't working well today
13:50:31 *** barbagus has joined #openttd
14:41:08 * pickpacket canβt read twitter
15:00:03 <FLHerne> reminds me of an LWN writeup of I think Fosdem -- > They were even more proud of the core router and server setup ("this is a lot better than last year's, because it's not balancing on chairs").
15:18:33 <pickpacket> peter1138: lol. And thanks π
15:21:18 *** barbagus has quit IRC (Ping timeout: 480 seconds)
15:31:10 *** Flygon has quit IRC (Read error: Connection reset by peer)
16:04:10 *** HerzogDeXtEr has joined #openttd
16:10:11 *** barbagus has joined #openttd
16:37:01 *** gelignite has joined #openttd
17:22:46 <peter1138> "There's a hole in the ground"
17:24:02 <andythenorth> what do we think about storing a history of industry production changes?
17:24:15 <andythenorth> is there some PR about industry stats? I shall look
17:24:23 <peter1138> Wil it also slow down the savegame?
17:25:19 <andythenorth> we should thread that or something
17:27:21 <andythenorth> I am saving the history in GS currently
17:27:31 <andythenorth> I wrote a serialise-deserialise thingy
17:40:08 <andythenorth> ok industry props/vars that might be eligible for GS getters:
17:40:08 <andythenorth> * i->construction_type
17:40:08 <andythenorth> * i->selected_layout
17:40:09 <andythenorth> * i->random_colour
17:52:06 *** Wormnest has joined #openttd
17:53:41 <talltyler> If we do extended production history, we should give GS access to read it, so authors donβt have to duplicate it in GS
17:57:44 <_glx_> make sure it's only for GS
17:57:55 * andythenorth trolling with the latter
18:12:54 <peter1138> i->owner is always OWNER_NONE, so no point in that.
18:16:29 <andythenorth> give me a setter π
18:16:38 <andythenorth> then we can own industries
18:40:11 <DorpsGek> - Update: Translations from eints (by translators)
19:12:36 <andythenorth> nothing is simple
19:13:42 <andythenorth> my patch has errors π
19:39:48 <andythenorth> maybe I fixed them π
19:46:17 *** gelignite has quit IRC (Quit: Stay safe!)
19:53:41 <andythenorth> nope, crashed the game π¦
19:55:06 *** HerzogDeXtEr has quit IRC (Read error: Connection reset by peer)
19:55:17 <peter1138> Fantastic documentation... on the wrong function.
19:56:42 <andythenorth> ha ha, do I have the order transposed?
19:56:57 <andythenorth> IRL, none of my shoes have shoelaces
19:57:06 <andythenorth> or at least none that I have to tie
20:01:50 <andythenorth> meh, I don't understand the crashlog π
20:02:00 <andythenorth> reproducible though
20:02:50 <andythenorth> maybe ScriptDate is incorrect for i->constructed_date
20:05:34 <_glx_> crashlog says it crashed when drawing the thing above train (un)loading at the station
20:06:04 <peter1138> Hmm, Β£50 for GP5000 S TR 700cx30
20:06:26 <_glx_> looks like tire reference
20:06:53 <andythenorth> ok so that's unrelated to my GS patch π
20:07:29 <peter1138> What is this + -1189653989067587432 in the crashlog?
20:07:59 <_glx_> offset from 17257090089024524124
20:09:07 *** nielsm has quit IRC (Ping timeout: 480 seconds)
20:09:23 <_glx_> macos crashlog are always fun (at least they are usable now)
20:11:44 <andythenorth> oh I pulled upstream master and rebased
20:11:55 <andythenorth> so maybe this is a regression?
20:11:59 <andythenorth> wasn't happening yesterday
20:18:29 <_jgr_> That suggests that it crashed because RIP is completely wrong
20:19:28 <andythenorth> do I need to bisect?
20:19:32 <_jgr_> Or whatever the ARM equivalent of that is called
20:23:56 <andythenorth> ok I need to run 2 PRs simultaneously, new branch? π
20:49:47 <shrekshellraiser> If I have a `IniItem` which is supposed to contain a boolean value, how do I parse that?
20:57:59 <truebrain> So you could cheat and just compare with true/false .. or look how the setting code does it and call that function
20:59:02 <truebrain> size_t BoolSettingDesc::ParseValue(const char *str) const
20:59:10 <truebrain> That would be a good function to call
21:00:04 <shrekshellraiser> truebrain: yes, but I don't have a `BoolSettingDesc` to call it on
21:00:07 <truebrain> (The string is in `->value` btw)
21:00:20 <shrekshellraiser> I didn't know if a quick string comparison would be okay
21:00:31 <truebrain> Isn't it a static function?
21:01:12 <shrekshellraiser> I don't have much experience with cpp, but it's interacting on self
21:01:28 <shrekshellraiser> so i thought it needed something to act on
21:02:31 <andythenorth> hmm GS is nearly complete π
21:02:48 <andythenorth> the handling of buttons seems like it's never going to work well though
21:02:56 <truebrain> OneOfMany does have a static parse function.. guess same needs to be done for Boolean .. bit complicated to explain π
21:03:05 <truebrain> If you like, I can help with the code tomorrow
21:03:13 <andythenorth> event bubbling with unpredictable response time does not make for good UI π
21:04:48 <andythenorth> not really bubbling, but I don't know the correct term π
21:07:29 <shrekshellraiser> truebrain: I'm gonna do the basic string comparison and push it so it can be commented on more easily
21:08:04 <truebrain> I will write up some code tomorrow for it. And tnx for continuing the work on this π
21:08:17 <truebrain> Always sounds so easy, changing a setting .. it never is π
21:10:33 <shrekshellraiser> Hah it works, its being persisted between the steam version and my build
21:12:40 <shrekshellraiser> so I'll do that now
21:13:41 <truebrain> Cool, tnx. Makes our ini so much better π
21:15:36 <shrekshellraiser> `_right_click_close{"no", "yes", "except pinned"}` would `except pinned` be fine, or should I make it `yes except pinned`?
21:15:53 <shrekshellraiser> it's kinda odd to me seeing spaces in config values
21:16:19 <truebrain> And except-pinned sounds perfectly fine to me
21:16:34 <shrekshellraiser> well i mean `_autosave_interval{"off", "monthly", "quarterly", "half year", "yearly"};`
21:16:54 <truebrain> Owh, we already did spaces .. so yeah, space it is π
21:23:31 <truebrain> Did you see Peters comment about the type in the setting?
21:23:53 <shrekshellraiser> Oh no I didn't!
21:25:17 <shrekshellraiser> *now* it's been resolved, sorry about that
21:28:31 <truebrain> Yeah, looks good otherwise. Sweet!
21:40:48 <shrekshellraiser> oh changing to enum broke my setting persistence
21:45:14 <truebrain> Replaced 0/1 with the enum value?
21:50:17 <truebrain> Owh, and please set RCC_NO to 0, like the enums above
21:50:37 <truebrain> This sets the first value, and the rest is always one more than the one before
21:51:39 *** Wolf01 has quit IRC (Quit: Once again the world is quick to bury me.)
22:04:37 *** keikoz has quit IRC (Ping timeout: 480 seconds)
22:17:37 <shrekshellraiser> Tested to make sure it works before pushing this time
22:25:01 <peter1138> Pffft, trivialities π
22:25:21 <peter1138> God bless the old says with svn where you could just commit to trunk wtihout compiling...
22:25:53 <peter1138> (svn r23725) -Fix (r23723): compile before commit
22:26:09 <peter1138> (svn r23135) -Fix (r23133): always compile before commit
23:07:39 *** tokai|noir has joined #openttd
23:07:39 *** ChanServ sets mode: +v tokai|noir
23:14:32 *** tokai has quit IRC (Ping timeout: 480 seconds)
23:37:48 <_glx_> I don't want to count the "forgot to run the script to update msvc projects"
continue to next day β΅