IRC logs for #openttd on OFTC at 2023-01-15
            
00:11:18 *** Wormnest has quit IRC (Ping timeout: 480 seconds)
00:23:47 <Eddi|zuHause> andythenorth: in which scenario should that help?
00:24:09 *** Wolf01 has quit IRC (Quit: Once again the world is quick to bury me.)
00:44:40 *** sla_ro|master has quit IRC ()
00:49:14 *** Wormnest has joined #openttd
01:17:09 <petern> You can use one engine ID for all your articulated parts... if you so desire.
01:24:43 *** WormnestAndroid has quit IRC (Ping timeout: 480 seconds)
01:41:58 *** Wormnest has quit IRC (Ping timeout: 480 seconds)
02:10:34 *** tokai|noir has joined #openttd
02:10:34 *** ChanServ sets mode: +v tokai|noir
02:17:23 *** tokai has quit IRC (Ping timeout: 480 seconds)
02:19:26 *** Wormnest has joined #openttd
03:12:11 *** Wormnest has quit IRC (Ping timeout: 480 seconds)
03:16:17 *** D-HUND has joined #openttd
03:19:41 *** debdog has quit IRC (Ping timeout: 480 seconds)
03:37:27 *** WormnestAndroid has joined #openttd
03:49:37 *** Wormnest has joined #openttd
04:20:20 *** HerzogDeXtEr has quit IRC (Read error: Connection reset by peer)
04:22:12 *** Wormnest has quit IRC (Quit: Leaving)
04:30:53 *** keikoz has joined #openttd
05:52:38 *** Flygon has joined #openttd
06:36:10 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 opened pull request #10354: Fix #10177: company list password padlock showed after switching to single player https://github.com/OpenTTD/OpenTTD/pull/10354
07:30:55 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 opened pull request #10355: Change #10077: make maximum loan a positive multiple of the loan interval https://github.com/OpenTTD/OpenTTD/pull/10355
08:01:49 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 opened pull request #10356: Fix #10057: FallbackParagraphLayout fails to properly wrap https://github.com/OpenTTD/OpenTTD/pull/10356
08:33:05 <Merni> Does someone plan to fix https://github.com/OpenTTD/OpenTTD/issues/10255 for OpenTTD 13? Pretty please?
08:34:22 <Pruple> it's in the milestone, so it hasn't been forgotten ๐Ÿ™‚
08:34:38 <Merni> nice!
08:36:28 *** WormnestAndroid has quit IRC (Remote host closed the connection)
08:37:32 *** sla_ro|master has joined #openttd
09:02:50 *** D-HUND is now known as debdog
09:19:15 *** nielsm has joined #openttd
09:22:44 <andythenorth> hmm
09:22:50 <andythenorth> my last map was too mountainous
09:22:57 <andythenorth> but this hilly map is mostly flat
09:23:01 <andythenorth> dull
09:23:51 <andythenorth> is there a new industry setting also in PRs?
09:23:53 * andythenorth looks
09:24:08 <andythenorth> currently the options seem to be '1 of each type' or 'lots of each type'
09:25:14 <andythenorth> yeah, https://github.com/OpenTTD/OpenTTD/issues/10339
09:27:13 <andythenorth> are the original fixed industry amounts scaled to the number of industry types in grf? ๐Ÿ˜›
09:29:08 <petern> I always assumed it was total number of industries, but if it's actually number of each industry then that would explain a few things...
09:29:21 <andythenorth> I assumed it's total
09:29:26 <andythenorth> I did look years ago
09:30:03 <andythenorth> iirc there's map size scaling
09:31:00 <petern> Yeah it is total.
09:31:32 <reldred> Yeah I've been using custom industry amount in jgrpp for a while, some weird things still happen with tthe random amount of new industries that get built though
09:31:46 <reldred> so now I'm using game scripts that control industry construction instead.
09:32:37 <andythenorth> numof_industry_table
09:32:54 <andythenorth> so 'very low' will produce one of each type in original game
09:32:57 <andythenorth> 10 or so
09:33:07 <andythenorth> whereas FIRS Steeltown has 41 industry types
09:34:01 <andythenorth> and I'm playing a 256x512 map
09:34:05 <andythenorth> so I get ~1 of each
09:35:05 <andythenorth> hmm maybe I should just write a GS
09:35:15 <andythenorth> they seem to get free opcodes during map gen
09:35:28 <andythenorth> place all the industries with that
09:40:04 <andythenorth> ok setting '80' gets me a nice result
09:40:15 <andythenorth> maybe FIRS should be able to hint to the game ๐Ÿ˜›
09:43:50 <andythenorth> ok this map is nice
09:44:11 <andythenorth> https://cdn.discordapp.com/attachments/1008473233844097104/1064117789599731742/image.png
09:44:11 <andythenorth> just one landlocked port ๐Ÿ˜›
09:44:15 <andythenorth> shall I just cheat money to fix that?
09:58:18 <DorpsGek> [OpenTTD/OpenTTD] andythenorth commented on issue #10339: [Bug]: Industry density settings are not granular enough https://github.com/OpenTTD/OpenTTD/issues/10339
10:00:22 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 opened pull request #10357: Fix #9865: removing files with the console always failed https://github.com/OpenTTD/OpenTTD/pull/10357
10:03:44 <DorpsGek> [OpenTTD/OpenTTD] PeterN opened pull request #10358: Codechange: Remove objectspec `enabled` flag and shuffle members. https://github.com/OpenTTD/OpenTTD/pull/10358
10:04:37 <petern> Right, back to the original task...
10:04:45 <andythenorth> hmm scenario editor can't randomly place individual industry types?
10:04:45 <petern> Wait, was I cycling or not?
10:05:04 <petern> Fuxake, lazy git.
10:05:59 <Rubidium> petern: yes :)
10:06:12 <Rubidium> cycling between tasks
10:06:58 <andythenorth> /me trying to figure out how to roundtrip .sav and .scn so I can use money cheat and 'prospect' to place random industries
10:07:11 <andythenorth> whilst not having 'you cheated' in my company history
10:07:28 <andythenorth> I guess I could just close my eyes and randomly click farms in scenario editor
10:09:17 *** HerzogDeXtEr has joined #openttd
10:10:20 <Rubidium> andythenorth: you could start a local multiplayer server, set max_loan to something ridiculous, start a new company, take out all the loan and then gift it to the other company. Remove the company and save. Free money without cheating ;)
10:10:26 <andythenorth> yes
10:10:47 <andythenorth> I could write an AI, use money cheat, gift it money, get the AI to build the farms
10:10:57 <andythenorth> then sell my company to the AI, then start a new company
10:11:55 <andythenorth> generally maps need more farms ๐Ÿ˜›
10:12:05 <andythenorth> when are we writing GS to fix everything? ๐Ÿ˜›
10:12:06 <petern> Excuses... it is dry but still very windy. And I need to visit the opticians today.
10:12:18 <petern> And maybe they'll have made my cycling glasses.
10:19:45 <petern> andythenorth: Because you care?
10:20:13 <andythenorth> think of my reputation
10:20:15 *** Samu has joined #openttd
10:20:23 <andythenorth> I will not qualify for the high score table
10:20:48 <petern> Big stakes.
10:21:17 <andythenorth> I did the .sav .scn .sav thing
10:21:22 <andythenorth> maybe we should make a button for that ๐Ÿ˜›
10:21:30 <andythenorth> 'do you want to edit this map before playing'
10:23:10 <petern> And a button in the scenario editor to just start playing?
10:23:41 <andythenorth> praps
10:23:43 <andythenorth> 'play now'
10:24:34 <andythenorth> hmm how do I add a GS to my map?
10:24:54 <petern> Has anyone created an issue for the load/save icon? What the heck is a floppy disk?
10:26:07 <nielsm> did anyone ever save transport tycoon games to a floppy during regular play? (I can see copying them over if you want to share with a friend)
10:26:12 <andythenorth> I think that society has had this debate ๐Ÿ˜›
10:26:18 <andythenorth> what is a rotary telephone icon?
10:26:21 <andythenorth> or a steam train?
10:28:11 <DorpsGek> [OpenTTD/OpenTTD] PeterN approved pull request #10356: Fix #10057: FallbackParagraphLayout fails to properly wrap https://github.com/OpenTTD/OpenTTD/pull/10356#pullrequestreview-1249181530
10:28:54 <andythenorth> ok my game now has a GS
10:29:02 <andythenorth> roundtrip .sav .scn again
10:29:13 <andythenorth> now ... how do GS work?
10:31:04 <andythenorth> how do I reload the thing?
10:31:09 <andythenorth> I have changed the GS code
10:31:21 <andythenorth> I appreciate this is a mad question
10:36:14 <andythenorth> saveload of the game restarts the GS?
10:36:37 <nielsm> yes
10:36:56 <nielsm> exept the GS gets a chance to fill its data from saved data before starting for real
10:37:05 <nielsm> (AI works the same way)
10:38:13 <andythenorth> how do I find the GS API version in doxygen? https://docs.openttd.org/gs-api/index.html
10:38:20 <andythenorth> needs set in the info nut
10:38:56 <nielsm> it should be the same as the game version, afaik
10:39:18 <andythenorth> thanks
10:39:23 <andythenorth> https://docs.openttd.org/gs-api/ has nothing ๐Ÿ™‚
10:39:35 <nielsm> raise a bug on it
10:39:55 <andythenorth> is it a bug? I don't know what's intended ๐Ÿ™‚
10:40:13 <andythenorth> GS has always been the unloved third child of the APIs ๐Ÿ™‚
10:40:47 <petern> Data Structures is not empty but...
10:41:08 <petern> Same for ai-api.
10:41:52 <andythenorth> let's see what I can break
10:41:56 <andythenorth> usually it's valuators
10:41:58 <andythenorth> which baffle me
10:42:29 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 approved pull request #10358: Codechange: Remove objectspec `enabled` flag and shuffle members. https://github.com/OpenTTD/OpenTTD/pull/10358#pullrequestreview-1249183647
10:43:26 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 merged pull request #10356: Fix #10057: FallbackParagraphLayout fails to properly wrap https://github.com/OpenTTD/OpenTTD/pull/10356
10:43:29 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 closed issue #10057: [Bug]: FallbackLayouter fails to properly wrap during first word after run change. https://github.com/OpenTTD/OpenTTD/issues/10057
10:44:06 <DorpsGek> [OpenTTD/OpenTTD] PeterN approved pull request #10354: Fix #10177: company list password padlock showed after switching to single player https://github.com/OpenTTD/OpenTTD/pull/10354#pullrequestreview-1249184596
10:52:12 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 opened pull request #10359: Fix #10009: bad overflow protection when taking out loans https://github.com/OpenTTD/OpenTTD/pull/10359
10:52:54 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 merged pull request #10354: Fix #10177: company list password padlock showed after switching to single player https://github.com/OpenTTD/OpenTTD/pull/10354
10:52:57 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 closed issue #10177: [Bug]: NetworkCompanyIsPassworded state is not cleared when switching to single player https://github.com/OpenTTD/OpenTTD/issues/10177
10:54:41 <DorpsGek> [OpenTTD/OpenTTD] PeterN approved pull request #10359: Fix #10009: bad overflow protection when taking out loans https://github.com/OpenTTD/OpenTTD/pull/10359#pullrequestreview-1249186443
10:55:19 <petern> Simple fixes = simple reviews = Rubidium commit count++
10:56:10 <Rubidium> and --bugcount :)
10:56:19 <Rubidium> (hopefully)
10:58:07 <DorpsGek> [OpenTTD/OpenTTD] PeterN merged pull request #10358: Codechange: Remove objectspec `enabled` flag and shuffle members. https://github.com/OpenTTD/OpenTTD/pull/10358
11:00:09 *** Etua has joined #openttd
11:04:54 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 merged pull request #10359: Fix #10009: bad overflow protection when taking out loans https://github.com/OpenTTD/OpenTTD/pull/10359
11:04:57 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 closed issue #10009: [Bug]: Ineffective overflow protection in CmdIncreaseLoan https://github.com/OpenTTD/OpenTTD/issues/10009
11:25:31 <DorpsGek> [OpenTTD/OpenTTD] SamuXarick commented on pull request #10227: Fix 3c047b1: AIGroup.GetProfitLastYear could get values different than those displayed in GUI https://github.com/OpenTTD/OpenTTD/pull/10227#pullrequestreview-1249194317
11:30:37 <Samu> how do i create a sub group as an ai, need to test something
11:33:29 <Samu> got it, nvm
11:41:09 <Samu> okay, there is still a problem, or maybe not, depending on how you view it
11:41:24 <petern> Rename for clarity is terrifying coming from you
11:42:09 <Samu> if i have a parent group and a child group, on the GUI side of things, the last_year profit of the parent group, includes the profit of itself + the child group
11:43:00 <Samu> if i have 1 vehicle in parent group and 0 in child group, the profit last year is -ยฃ400 or wtv
11:43:32 <Samu> for the parent group
11:44:06 <Samu> if i have 1 vehicle in child group, and 0 in parent group, the profit last year is still -ยฃ400 for the parent group
11:44:20 <Samu> for the AI side of things, however, it's ยฃ0'
11:45:17 <Samu> I may be biased, but I prefer it that way
11:45:29 <Samu> but it certainly doesn't match that of the GUI
11:46:46 <Samu> should I solve this?
11:50:20 <nielsm> Samu: I believe it does match the GUI, just not in the place you expect
11:50:35 <nielsm> you see how in the GUI there is a grey/red/yellow/green dot next to each group?
11:51:22 <Samu> yes
11:51:42 <nielsm> that indicates whether that group had a profit last year (as relevant to the company score calculation) that is not present (grey), negative (red), under 10k (yellow) or above 10k (green)
11:52:05 <Samu> that's the profit last year min age
11:52:16 <Samu> I'm refering to profit last year only
11:53:10 <nielsm> you are saying that the info you get from the function does not exist in the gui, I'm saying that it does just not in the way you expect
11:54:36 <nielsm> I would recommend documenting what the function actually does, and leave the functionality alone
11:56:50 *** Wolf01 has joined #openttd
11:59:57 <Xarick> https://cdn.discordapp.com/attachments/1008473233844097104/1064151956668559381/Unnamed_1978-05-26.png
11:59:57 <Xarick> Group 0 is parent, has no vehicle, Group 1 is child, has bus in it with negative last year profit.
12:00:41 <Samu> From the script side of things, however, things don't seem to be coherent
12:00:55 <Samu> it says num of vehicles in group 0 is 1
12:01:21 <Samu> in that function, it includes vehicles in child groups
12:01:48 <Samu> but in the one that gets profit last year, it doesn't include the profit of that vehicle
12:11:47 *** Etua has quit IRC (Quit: Etua)
12:27:22 <andythenorth> on the plus side, compiling FIRS GS is almost instant
12:27:32 <andythenorth> on the negative side, much else ๐Ÿ™‚
12:27:44 <Eddi|zuHause> petern: "use one engineID for all articulated parts" is problematic because each switch can only branch in 256 ways, and you can only have 256 concurrent IDs for branch targets/spritesets
12:28:23 <Samu> okay, i know how to fix this, but then GetProfitThisYear would also need to be changed, I rather have them both relate with the same criteria
12:28:48 <Eddi|zuHause> plus var61 has some limitations within cb36
12:29:09 <Eddi|zuHause> because of potential circular dependencies
12:29:11 <Samu> I'm on the opinion of improving documentation
12:29:36 <Samu> to reflect that it does not include child groups
12:30:15 *** WormnestAndroid has joined #openttd
12:31:04 <andythenorth> ok there are 2 things mixed up here, (1) I have no clue how to GS (2) I am unclear on what I want to do with GS
12:31:13 <andythenorth> I do love the first stage of any project like this ๐Ÿ˜›
12:31:27 <andythenorth> stumbling cluelessly towards an uncertain goal, with unfamiliar tools
12:42:14 *** TROILUS has quit IRC (Quit: Leave)
12:48:34 <andythenorth> hmm
12:48:45 <andythenorth> probably the first thing to do is figure out how limited GS is
12:49:14 <andythenorth> got no concept of how the opcodes limit relates to what can actually be done
12:50:26 <andythenorth> will it make a log entry if I exceed opcodes?
12:55:33 <andythenorth> the MinimalGS boilerplate only loops every 5 game days
12:55:44 <andythenorth> hmm
12:55:51 <andythenorth> maybe I just try flooding it and see what happens
12:59:05 <michi_cc[d]> If a scripts exceeds the opcode limit, it will just be suspended until the next game tick. Nothing more and nothing less.
13:09:56 <glx[d]> Every command also delay for a tick
13:25:38 <LordAro> been a while sincr we had a "RB fixes everything" commit spree
13:32:23 <DorpsGek> [OpenTTD/OpenTTD] LordAro approved pull request #10357: Fix #9865: removing files with the console always failed https://github.com/OpenTTD/OpenTTD/pull/10357#pullrequestreview-1249229982
13:34:15 <Pruple> pre-release cleanout?
13:35:04 <DorpsGek> [OpenTTD/OpenTTD] LordAro commented on pull request #10355: Change #10077: make maximum loan a positive multiple of the loan interval https://github.com/OpenTTD/OpenTTD/pull/10355#pullrequestreview-1249230600
13:35:52 <michi_cc[d]> Well, RC2 is somewhat overdue. But life.
13:36:29 <LordAro> or actual release?
13:41:21 <andythenorth> is there a way I can detect suspension?
13:41:35 <andythenorth> I'm not obsessed by this, just don't understand the execution environment at all
13:41:39 <glx[d]> Suspension of ?
13:41:43 <michi_cc[d]> No, it is transparent to the script.
13:42:11 <andythenorth> so I have no way to know if I'm trying to do unachievable things, but I could write my own logging framework?
13:42:25 <michi_cc[d]> It is conceptutally the same as when your OS multi-threads and switches threads.
13:42:33 <andythenorth> I will know the tick, or the date etc, and could compare if it changed?
13:42:36 <andythenorth> before a task completed
13:44:05 <michi_cc[d]> Suspension is on the actual interpreter level. The script could even be suspendend in the middle of comparing the tick. The opcode limit simply decides how many "MHz" your script CPU has.
13:44:08 <glx[d]> Scripts are supposed to be event driven
13:44:55 <michi_cc[d]> I.e. with a low opcode limit you have a slow "CPU", and a high opcode limits means a faster "CPU".
13:45:03 <andythenorth> ok thanks
13:45:24 <andythenorth> glx[d]: I know, but all the ones I've seen just run on scheduled loops
13:45:33 <andythenorth> there may be others
13:45:58 <glx[d]> Scheduled loop is a kind of event
13:46:03 <michi_cc[d]> And just like on the computer itself, a complicated algorithm will take a long time on a slow CPU, so the amount of work a script can do in a given game time is limited.
13:46:06 <nielsm> ideally the AI and GS scripts should have a queue of "things to do" where each thing to do is very small, and game events get to skip the queue and get handled ASAP
13:46:46 <nielsm> so they can re-evaluate the situation often and react to game events fast
13:46:54 <andythenorth> ideally I would get the confusion stage as fast as possible and start trying things
13:46:55 <andythenorth> ๐Ÿ˜›
13:46:57 <andythenorth> GS is weird
13:47:24 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 merged pull request #10357: Fix #9865: removing files with the console always failed https://github.com/OpenTTD/OpenTTD/pull/10357
13:47:27 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 closed issue #9865: [Bug]: `rm` (and by extension `del`) always fails https://github.com/OpenTTD/OpenTTD/issues/9865
13:47:40 <nielsm> you can think of it as the game simulation keeps running in the background of your script all the time
13:47:47 <michi_cc[d]> The added complication is that anything that causes a Command to be executed immediately ends the current time slice as it has to wait for the game loop to process the event, which takes until the next game tick.
13:48:33 <michi_cc[d]> So any command action (e.g. building something, giving orders, setting town growth, changing a goal) is quite costly.
13:48:49 <nielsm> another thing for GS is that you should handle game saving and loading, ideally as fast as possible
13:49:30 <nielsm> while I haven't actually written any real GS myself (Eternal Love doesn't count) I think the approach I would take is store all internal data in a form ready to save, so nothing has to be converted on load or save
13:50:10 <andythenorth> GS is quite uncanny valley
13:50:12 <michi_cc[d]> Going by random comments on the internet, the save/load opcode limit seems to be somewhat low. It might the same as the usual NewGRF things that apprently everybody knows that but nobody ever bothered to do any kind of proper report for it.
13:50:22 <andythenorth> superficially GS is really approachable, but eh, nope
13:50:33 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 commented on pull request #10355: Change #10077: make maximum loan a positive multiple of the loan interval https://github.com/OpenTTD/OpenTTD/pull/10355#pullrequestreview-1249234151
13:51:04 <andythenorth> so I have no real way to know how many opcodes I'm consuming?
13:51:31 <andythenorth> maybe there's a tick counter I can use as a proxy
13:51:47 <Rubidium> andythenorth: can't be more than a few lines of C++ code in the right place
13:51:48 <nielsm> you can probably count opcodes from the squirrel code structure, more or less
13:52:23 <andythenorth> it's not that I think there's a problem BTW ๐Ÿ™‚
13:52:28 <andythenorth> it's more that there's no way to know ๐Ÿ˜›
13:52:43 <andythenorth> I don't know if I can write e.g. a monthly loop that looks at every town
13:52:52 <andythenorth> unless I write some kind of performance monitor
13:53:04 <Rubidium> it will have counted them, so just dump that value each time the script execution is done. But alas, that's 33+ lines of debug per second
13:53:06 <andythenorth> Flash games this used to be simple, there was an FPS counter ๐Ÿ˜›
13:53:40 <andythenorth> and then we had to write an async network sendload handler
13:53:40 <michi_cc[d]> The thing that will probably limit you at lot more is the one commend per tick limit, from which you can easily calculate how many town actions you can do at most per month.
13:54:19 <andythenorth> so is every GS method a command?
13:54:22 <petern> It's not like co-operative multitasking on RISC OS.
13:54:24 <andythenorth> or just SetX()
13:54:32 <petern> That might be a concept familiar to you ๐Ÿ™‚
13:54:58 <michi_cc[d]> 74 ticks per day * 30 days a month -> at most 2220 commands per month.
13:55:06 <andythenorth> hmm
13:55:37 <michi_cc[d]> A command is anything that is transmitted over the (network) command system, i.e. mostly write actions that need to sync game state over network.
13:55:48 <andythenorth> it was noticeable that when dP wrote the electricity pylon placer it took months to place a full chain of pylons
13:56:08 <andythenorth> although it was instant if run before gamestart ๐Ÿ˜›
13:56:21 <nielsm> command = things that affect the game state and must be visible by all players
13:56:39 <michi_cc[d]> Yeah, because the command tick limit doesn't apply during world generation as there is no network sync there.
13:56:54 <andythenorth> ok so just plain squirrel isn't a command, e.g. just creating objects etc?
13:57:01 <andythenorth> declaring vars
13:57:04 <michi_cc[d]> No.
13:57:26 <petern> Querying game state isn't either.
13:57:26 <michi_cc[d]> Commands are the stuff that is in *_cmd.cpp basically.
13:58:04 <michi_cc[d]> So buy a vehicle, clear a tile, plant a tree, terraform land, set town growth, change manager name, place sign and a lot more actions like this.
13:58:34 <andythenorth> is there anything in the API docs that indicates a command? https://docs.openttd.org/gs-api/classGSTown.html#a3d4f59e3a19bec8a8b5c5e6253998b64
13:58:46 <andythenorth> or does it have to be by reference to ottd src?
13:59:23 <nielsm> actually there isn't, and that probably ought to be there
13:59:35 <DorpsGek> [OpenTTD/OpenTTD] rubidium42 updated pull request #10355: Change #10077: make maximum loan a positive multiple of the loan interval https://github.com/OpenTTD/OpenTTD/pull/10355
14:00:03 <michi_cc[d]> Rule of thumb would be almost all SetXXX, and in this case also Perform/Expand/Found.
14:00:13 <petern> Could do with async stuff tbh ๐Ÿ™‚
14:04:34 <andythenorth> I don't have super fancy ideas right now
14:05:20 <andythenorth> but the ideas I do have likely require walking all towns and all industries multiple times within a monthly loop, or every 7 days or so
14:06:33 <petern> Might be a problem on a 4kx4k map, but then what isn't?
14:10:08 <andythenorth> 16k maps in JGRPP though
14:10:51 <petern> What's that?
14:12:46 <andythenorth> also does it really matter if the GS is behind?
14:12:55 <Pruple> I once started writing a gamescript that renamed towns based on their location. It really didn't work well on any but the smallest maps...
14:13:08 <petern> Behind what?
14:13:24 <andythenorth> behind the gameplay
14:13:35 <andythenorth> if there's supposed to be e.g. a monthly loop
14:13:38 <andythenorth> but things aren't getting done
14:13:42 <andythenorth> maybe fine?
14:15:03 <petern> Oh. Well if it takes longer than a month that could be a problem.
14:15:22 <andythenorth> ah
14:15:31 <andythenorth> ok so it could just run through everything
14:15:56 <andythenorth> I'm taking design cues from MinimalGS, which is the boilerplate example Zuu made, and has a single MonthEnd loop
14:16:31 <andythenorth> ok so if all towns could be visited over the course of a month, it doesn't all have to happen at once on last day
14:17:04 * andythenorth wonders how all these citybuilder scripts work
14:17:30 <petern> They give up and build it into their own server.
14:18:04 <andythenorth> every time I look at GS, I consider requesting an extension to grf spec ๐Ÿ˜›
14:19:45 <andythenorth> โœ… wouldn't have to manage saveload state
14:19:58 <andythenorth> โœ… performance would just work, no opcodes to worry about
14:20:07 <andythenorth> โœ… events are handled on callbacks
14:20:28 <andythenorth> โœ… better debugging and developer tools
14:20:50 <andythenorth> โœ… every problem looks like a nail, if you all understand is hammers
14:22:07 <frosch> did you ask chatgpt about that? "better debugging and developer tools" is lolz ๐Ÿ™‚
14:22:48 <andythenorth> it's quite a low bar in both cases ๐Ÿ˜›
14:23:10 <andythenorth> reload_newgrfs is a thing though
14:23:11 <Pruple> andythenorth: I think this is correct. GS is for gametypes, not for extending NewGRF functionality.
14:25:37 <frosch> andythenorth: i don't know "printf debugging + break points + directly interpreted code" vs "internal variables + no break points + manual reverse engineering from nfo errors to nml to pynml to template..."
14:25:57 <Pruple> I also, incidentally, enjoy the way the rail sprites in action 3 cargo 2 are in a completely different order from the base sprites ๐Ÿ™‚
14:26:32 <andythenorth> frosch: also as an author GS log is quite useful
14:27:27 <andythenorth> oh I did have an idea for making GS better to work with
14:27:37 <andythenorth> storybook can have buttons?
14:27:48 <andythenorth> I think I can write a custom debugger / dev tool in the storybook
14:29:06 <petern> 2% health in Doom is not a good idea.
14:29:25 <andythenorth> my Doom isn't working any more
14:29:26 <andythenorth> M1 issues
14:31:08 <andythenorth> ok so is there any reason in principle we couldn't extend town grf spec?
14:31:28 <andythenorth> there was a long and silly discussion many years ago about GS replacing grf for things like that, with people who are no longer here
14:31:45 <andythenorth> well Pruple is still here
14:32:08 <Pruple> extend town grf spec to do what?
14:32:38 <supermop_Home> power
14:32:45 <andythenorth> have a monthly callback, instead of managing it from a stupid industry loop, like I currently do
14:33:03 <andythenorth> and also to be able to put text into the town window
14:33:23 <andythenorth> some of the gameplay things I want to do, I already did in grf, it's just weird
14:33:36 <andythenorth> also grf callback for company town rating
14:34:12 <Pruple> actually, thinking about towns the other day, there are two variables I'd quite like (tm) for towns; the count of towns, and the global population. basically in order to figure out how relatively large the town is.
14:34:26 <supermop_Home> google is basically worthless these days
14:34:44 <andythenorth> map global storage ๐Ÿ˜›
14:35:54 <andythenorth> wonder if I deleted my FIRS town effects branch
14:36:36 <supermop_Home> "godox jr flash not firiring FE2" just gives you a bunch of boilerplate affiliate marketing site reviews of the flash, not any forum discussion of people having issues with their flash not firing, or people using the flash on an FE2
14:37:08 <andythenorth> https://github.com/andythenorth/firs/blob/advanced_town_economy/src/templates/monthly_town_loop.pynml
14:37:37 <Pruple> "influence town behaviour"... towns have behaviour?
14:38:32 <supermop_Home> growing is a behavior i guess
14:38:36 <andythenorth> building houses and stuff
14:39:03 <andythenorth> grf can't control growth directly, but building choice can be driven from a town register that FIRS can write to
14:39:28 <andythenorth> and industries in the town can change production based on town 'happiness'
14:39:48 <andythenorth> I abandoned it because I can't write to the town window
14:40:04 <andythenorth> so there has to be a weird 'Plaza' industry to tell the player about town
14:40:06 <andythenorth> but
14:40:14 <andythenorth> the only way to get a Plaza into every town is...
14:40:15 <andythenorth> ...GS
14:40:22 <Pruple> "town happiness" sounds like something that should be a gamescript. and possibly newgrf agnostic. ๐Ÿ™‚
14:40:25 <andythenorth> all roads lead to GS, but it just sucks
14:40:31 <petern> Pruple: Sorry ๐Ÿ˜ฆ
14:40:55 <andythenorth> but GS basically we don't know if it works or not
14:41:20 <andythenorth> ok, so now that's all sorted, I need a GS timer
14:41:39 <andythenorth> and a 'restart the GS' button in storybook
14:42:18 <supermop_Home> pruple i'd also like the nature of the growth to be specific to type of town, where type is somehow related to the industries it has nearby, which means you'd want grfs to have more influence on towns?
14:42:41 <andythenorth> FIRS GS knows about all the FIRS industries
14:42:46 <andythenorth> that's not agnostic but eh
14:43:16 <glx[d]> There have been discussions about one script per town
14:43:25 <andythenorth> it detects the economies as well, because it's not allowed to read GRF parameters currently https://github.com/andythenorth/firs/blob/gs-is-real/src/gs/firs.pynut
14:43:55 <andythenorth> I am unclear about the 'multiple GS' thing
14:44:01 <andythenorth> what opportunity does it unlock?
14:44:06 <andythenorth> more smaller GS being written?
14:44:10 <Pruple> supermop_Home: I think, typically, most towns will have most industries nearby, so that's not very useful. Unless you're limiting your industries by town, which is something your houses can mirror by simply using the same town categorisation. ๐Ÿ™‚
14:44:47 <supermop_Home> like a well served town that doesn't have industries nor a central, well connected location might grow as a bedroom community with lots of residences, but wouldn't grow a a large central business district
14:45:20 <supermop_Home> Pruple i guess that depends on what you consider 'nearby'
14:45:48 <supermop_Home> but usually on a steeltown type game i might only have a handful of blast furnaces across the map
14:45:53 <supermop_Home> not one per each town
14:48:36 <andythenorth> if I write the GS to do it, you might get one blast furnace, near the middle ๐Ÿ˜›
14:48:38 <andythenorth> dunno
14:52:44 <supermop_Home> i'd be down with one furnace per 512*512 chunk
14:52:56 <supermop_Home> as long as its not on top of a mountain
14:54:32 <supermop_Home> andythenorth making big grey solid slabs for walls then pasting them into another psd where i add layer effects and noise, clamp to pallet, and paste back
14:54:51 <supermop_Home> i worry its a little too shaded though
14:55:39 <petern> Campfires are better for cooking food in early game, tho
14:56:17 <supermop_Home> petern: FIRS: Paleolithic Basic economy?
14:57:37 <petern> FIRS: Minecraft economy. Where gold is uselsss...
14:57:57 <andythenorth> we should have a second currency though
14:58:00 <andythenorth> now you mention it
14:58:08 <andythenorth> because money is too easy
14:58:22 <petern> OpenNFT?
15:01:21 <FLHerne> petern: at least it's not Copper
15:01:50 <DorpsGek> [OpenTTD/OpenTTD] SamuXarick updated pull request #10330: Codechange: Rework 'start_date' parameter for AIs as a game setting https://github.com/OpenTTD/OpenTTD/pull/10330
15:02:08 <petern> That gives you the ability to zoom in.
15:06:24 <Samu> https://github.com/OpenTTD/OpenTTD/pull/10227#discussion_r1070364864 help me here, how do i reorder this struct in a manner that makes sense
15:06:48 <Samu> and memory friendly or soemthing
15:07:00 <Samu> didn't quite understood
15:07:06 <Samu> understand*
15:15:45 <andythenorth> GS I have to use special MP-safe random, not squirrel random?
15:16:29 <DorpsGek> [OpenTTD/OpenTTD] SamuXarick commented on pull request #10227: Fix 3c047b1: AIGroup.GetProfitLastYear could get values different than those displayed in GUI https://github.com/OpenTTD/OpenTTD/pull/10227#pullrequestreview-1249264907
15:17:01 <petern> Have I started a trend by shuffling ObjectSpec about? :p
15:17:02 <andythenorth> what's the point of RandItem()?
15:17:07 <andythenorth> it does same as Rand()?
15:17:26 <andythenorth> both return "A random value between 0 and MAX(uint32)."
15:17:59 <andythenorth> is there nothing for lists like python's random.choice() ?
15:18:12 <Samu> includes 0 but does not include the max(uint32)
15:18:21 <andythenorth> I don't mean "what's the point?" ๐Ÿ™‚
15:18:24 <Samu> max(uint32) - 1
15:18:27 <andythenorth> I mean "it is confusing, why both?"
15:18:40 <petern> /* static */ uint32 ScriptBase::RandItem(int unused_param)
15:18:40 <petern> {
15:18:40 <petern> return ScriptBase::Rand();
15:18:40 <petern> }
15:18:56 <petern> I suspect RandItem() is a compatibility function for something that was removed.
15:19:23 <Samu> it's for valuators
15:20:19 <Samu> my_list.Valuate(GSBase.RandItem) i think
15:20:41 <Samu> my_list.Valuate(GSBase.RandItem())
15:21:29 <andythenorth> not even going to try and understand valuators today ๐Ÿ™‚
15:21:40 <andythenorth> every time I read about them, I abandon my GS project
15:22:24 <andythenorth> how do I get a random number? `GSBase.Rand()` is an invalid expression
15:23:58 <Samu> local random_number = GSBase.Rand()
15:24:03 <andythenorth> thanks
15:24:44 <andythenorth> do I have to type convert to string to use as string arg?
15:24:50 <andythenorth> ` local cabbage = GSText(GSText.STR_CABBAGE, GSBase.Rand());
15:24:50 <andythenorth> GSTown.SetText(town, cabbage);`
15:24:54 <andythenorth> is invalid expression
15:25:15 <andythenorth> string code is `STR_CABBAGE :The random number is {YELLOW}{COMMA}`
15:26:30 <andythenorth> hmm it's working though
15:26:45 <andythenorth> how can it work, i.e. town window shows correct result
15:26:52 <andythenorth> but script crashes at that line
15:27:11 <Samu> https://docs.openttd.org/gs-api/classGSText.html
15:29:08 <andythenorth> I am baffled ๐Ÿ™‚
15:29:09 <Samu> you are putting a GSBase.Rand() for the value of {COMMA}? im not sure, i don't work with strings on my gs
15:29:18 <andythenorth> yes
15:29:24 <andythenorth> that should generate an integer no?
15:30:30 <andythenorth> https://cdn.discordapp.com/attachments/1008473233844097104/1064204941469700106/image.png
15:31:30 <Samu> doesn't even compile?
15:32:01 <Samu> such a small screenshot, can't see whole error
15:32:08 <andythenorth> the screenshot includes the full path
15:32:19 <andythenorth> which includes my username which is one half of the auth creds, so nope
15:33:25 <andythenorth> https://cdn.discordapp.com/attachments/1008473233844097104/1064205677536477254/image.png
15:33:48 <andythenorth> ach I frigging hate GS ๐Ÿ™‚
15:33:51 <andythenorth> I am going to play tanks
15:34:20 <andythenorth> it's soooo hard and it makes me feel so stupid
15:34:38 <andythenorth> it is the most complex programming language I have ever tried to use
15:37:50 <Samu> i actually don't know what's wrong, let me dig my own GS that used strings
15:38:34 <andythenorth> it's not actually the worst language I have ever tried to use
15:38:46 <andythenorth> 2000 era javascript was
15:39:20 <andythenorth> the only debugger was window.alert() iirc
15:42:34 <andythenorth> ok, 'expression expected'
15:42:38 <andythenorth> what does it mean?
15:42:51 <andythenorth> google does not find anything relevant for squirrel language
15:44:06 <andythenorth> ok `Log.Info(GSBase.Rand());` does not work
15:44:16 <andythenorth> so how is GSBase.Rand() used?
15:45:00 <Samu> strange, let me test that here
15:45:51 <andythenorth> ok, the issue is incorrectly formatted comment, several lines away
15:46:00 <andythenorth> */ instead of /*
15:47:15 <Samu> works for me, I tried AIBase.Rand() though
15:48:20 <nielsm> andythenorth: you should be able to get extensions for various programming text editors to do syntax highlighting of squirrel code
15:48:37 <nielsm> to make that kind of issues easier to spot
15:48:40 <andythenorth> yeah it works, I'm just not reading the errors correctly Samu
15:49:20 <andythenorth> jfs-: I'd have to write my own for Squirrel ๐Ÿ™‚
15:49:24 <andythenorth> or change editor
15:49:29 <andythenorth> Squirrel is basically dead
15:49:52 <Samu> i also like a syntax highliter
15:49:55 <Samu> need one
15:50:11 <andythenorth> in my editor, lua highlighter seems to pick up some of squirrel entities
15:50:17 <nielsm> one new (or "new") use that popped up recently was in team fortress 2, they added support for map scripting via squirrel
15:51:11 <nielsm> there are definitely multiple extensions for VSCode to support squirrel syntax
15:52:18 <andythenorth> there's a Valve guide to it
15:52:52 <andythenorth> ok on a 256x512 map, it seems I can set town window text per month
15:53:28 <andythenorth> I'll try a bigger map
15:54:05 <Samu> i dont use VSCode, i have Notepad++ and Visual Studio 2022 :(
15:54:17 <Samu> is VSCode worth using over Visual Studio?
15:54:36 <nielsm> vscode is worth using over NPP
15:54:47 <Samu> uhm, ok
15:54:49 <nielsm> but I'd say it's complement to Visual Studio
15:54:57 <andythenorth> slow 4k x 4k map is very slow
15:55:09 <andythenorth> maybe I crashed it on river gen
15:55:23 <andythenorth> yeah ottd has hung
15:55:49 <glx[d]> I use vscode for nml
15:55:53 <scrubbles> https://upload.wikimedia.org/wikipedia/commons/6/68/Harringay_West_station_Gresley_J50_0-6-0T_geograph-2888613-by-Ben-Brooksbank.jpg
15:55:54 <scrubbles> tanks
15:56:23 <andythenorth> such
15:56:44 <andythenorth> game has hung again
15:56:52 <andythenorth> https://cdn.discordapp.com/attachments/1008473233844097104/1064211579672985680/image.png
15:58:18 <petern> Again?
15:58:23 <andythenorth> https://cdn.discordapp.com/attachments/1008473233844097104/1064211959765020672/image.png
15:58:23 <andythenorth> and again
15:58:37 <petern> It's changed, that's not hung.
15:59:22 <andythenorth> I've turned off rivers
15:59:35 <andythenorth> ^ that's two separate attempts with a restart between them
16:00:13 <andythenorth> hmm are towns limited by name generator?
16:00:13 <andythenorth> I asked for 9999, but I don't seem to have 9999
16:00:36 <nielsm> yes
16:00:51 <nielsm> if the name generator runs out of names you just don't get any more towns
16:01:06 <andythenorth> ok
16:01:19 <andythenorth> so I need to work around that for testing GS
16:01:30 <andythenorth> can we make ffwd faster on 4k^2 maps?
16:01:37 <andythenorth> it's practically 1x game speed
16:01:59 <nielsm> https://github.com/OpenTTD/OpenTTD/issues/8088
16:02:04 <andythenorth> ok it's 8x ๐Ÿ˜›
16:03:10 <petern> Hmm, did I reorder original HouseSpecs properly...
16:03:24 <petern> Shame c++ doesn't have named initialization.
16:03:30 <andythenorth> fuck me, even scrolling the map to the corner takes 20 seconds on 4k^2
16:03:39 <andythenorth> this is lolz
16:04:12 <andythenorth> ok I've made the GS monthly loop fail
16:04:19 <petern> Yeah, and players pick 4kx4k by default because bigger is better, naturally...
16:05:15 <andythenorth> ok so now I have a data point
16:05:24 <andythenorth> making GS fail is trivial
16:05:42 <andythenorth> I was hoping it might just be false concerns
16:06:40 <andythenorth> ok so if it fails every month
16:06:44 <Rubidium> petern: https://en.cppreference.com/w/cpp/language/aggregate_initialization#Designated_initializers
16:06:56 <andythenorth> why do some towns get updated some months, and others in other months?
16:06:56 <andythenorth> it's one foreach loop
16:07:08 <andythenorth> if the loop exits early, it should restart next month no?
16:08:10 <andythenorth> it seems to be resuming the foreach, like it was suspended?
16:08:28 <andythenorth> but this means the monthly loop isn't being called fresh at least once per month
16:09:17 <andythenorth> this is why every time someone has to explain to me what 'event driven' means?
16:09:24 <andythenorth> but why isn't there a monthly loop event?
16:10:53 <andythenorth> ๐Ÿง 
16:12:45 <andythenorth> ok one step at a time, how do I increase the number of opcodes?
16:14:05 <andythenorth> found it in settings ๐Ÿ™‚
16:14:27 <andythenorth> woah max is only 250k
16:17:12 <andythenorth> ok that gets through all towns on the map in about 4 months
16:17:22 <andythenorth> so if it was maybe 1m opcodes, that might be enough?
16:17:24 <andythenorth> or maybe 2m
16:18:17 <andythenorth> found the ini file
16:19:36 <petern> So when do we require C++20? ๐Ÿ™‚
16:21:20 <andythenorth> script_max_opcode_till_suspend is used for GS as well as AI?
16:21:32 <andythenorth> I set `max = 10000000` and recompiled
16:21:36 <andythenorth> then changed the setting
16:21:47 <andythenorth> still 4 months to so to walk all the towns on a 4k^2 map
16:22:22 <Samu> isn't it only 2500 ops?
16:22:34 <Samu> on game script initialization
16:22:40 <andythenorth> dunno ๐Ÿ™‚
16:22:55 <andythenorth> but my change has made no difference to my very crude test
16:23:15 <Samu> but yeah, 2500, in no way that would be able to deal with 10k towns
16:23:30 <andythenorth> it's only 5k towns, OpenTTD limits the setting
16:23:41 <andythenorth> you can enter 9999, but then it adjusts the value
16:23:47 <Samu> hmm
16:23:50 <andythenorth> 5k towns is not many
16:24:15 <Samu> you can have more than 5k towns if you use very high number of towns and 4k map size
16:24:37 <andythenorth> I am entering 'custom' for the number
16:24:41 <andythenorth> that's capped to 5k
16:24:52 <andythenorth> also capped in JGRPP ๐Ÿ˜ฆ
16:25:07 <andythenorth> /me generates 16k^2 map
16:25:16 <Samu> custom is capped to 5k because... they didn't like me adjusting that to 20k
16:25:19 <andythenorth> oh it's building 64k towns ๐Ÿ™‚
16:25:23 <Samu> kek
16:25:24 <andythenorth> JGRPP ftw
16:25:53 <andythenorth> this is so slow
16:25:58 <andythenorth> it really needs to be a lot faster
16:26:17 <andythenorth> it's been running 2 mins or so
16:26:19 <FLHerne> the generation?
16:26:21 <andythenorth> just to make a map
16:26:30 <FLHerne> an impractically huge map
16:26:48 <Samu> i dont think you can get all towns have added extra text via GS
16:26:59 <Samu> with newGRF however, that's possible
16:27:10 <andythenorth> grf can't do it, not in the spec
16:27:19 <andythenorth> still waiting for this map
16:27:22 <Samu> oh :(
16:27:26 <andythenorth> 3 mins now
16:27:31 <andythenorth> this is silly
16:27:39 <andythenorth> why is it so slow?
16:28:16 <andythenorth> ok done, ~4 mins
16:28:23 <Samu> oh, well newgrf can add extra text to industries at least, i thought they could do it for towns too
16:28:28 <Eddi|zuHause> depends on various settings
16:28:44 <andythenorth> ugh GS factor 0.5
16:28:50 <andythenorth> this is not going to be viable for testing
16:29:36 <Samu> you want to update 5000 towns at every month, all at once?
16:30:07 <andythenorth> 64k
16:30:43 <andythenorth> but the first problem is that the game is only running at 0.6x even if I put the map in the corner and close everything except FPS
16:31:30 <andythenorth> Samu: do I want to? no
16:31:43 <andythenorth> does the game support players making 16k^2 maps with 64k towns? yes
16:31:46 <Samu> on my Company Value GS, when i try to update goal texts for the 15 companies, it's not instant at all...
16:32:40 <Samu> it's over time, it sends multiple DoCommands, one for each company text i wanna update... GS's aren't really all that good
16:32:53 <andythenorth> ok so maybe only use GS at game start, when it has free opcodes
16:32:59 <Samu> 15 is still manageable
16:33:09 <Samu> 5000 however.... that's just unfeasible
16:33:19 <andythenorth> but it needs to be feasible
16:33:59 <andythenorth> if the base game can update the town stats for that number of towns, then it's clearly not impossible
16:34:17 <JGR> If the town already has the right text, you don't have to "update" it, just doing that alone nets you a very large saving on most maps
16:34:32 <JGR> Likewise for other things to set like town growth
16:35:49 <JGR> Vanilla doesn't support 16k^2 maps so they're not going to be moved by arguments about those ๐Ÿ˜›
16:36:19 <andythenorth> no but the JGRPP playerbase is significant
16:36:30 <JGR> It also isn't the end of the world if "monthly" processes take longer than a calendar month
16:36:57 <andythenorth> no, but then gameplay shouldn't be designed on the assumption that things will complete in a month
16:36:58 <JGR> The 16k^2 subset of that is effectively 0
16:38:27 <andythenorth> it's interesting to try
16:38:36 <andythenorth> 4k^2 5k towns is ... slow
16:38:52 <andythenorth> 16k^2 64k towns is...pathological
16:39:05 <andythenorth> but the 4k^2 case is unsupportable anyway
16:40:17 <andythenorth> 2048^2 is also slow
16:40:18 <JGR> For most players the number of towns isn't linear with the map area
16:40:33 <andythenorth> ok, GS really is quite unworkable in this format
16:40:47 <JGR> With bigger maps you can have much more space between towns instead of just having more of them
16:41:32 <andythenorth> agreed, I'm just trying to find the limits ๐Ÿ™‚
16:41:38 <Eddi|zuHause> absurd number of towns could use some early exit in case of a) town name generator runs out of names, or b) map runs out of space
16:42:29 <Eddi|zuHause> both are kinda fuzzy to check
16:43:06 <andythenorth> ok with ~3k towns, GS can get through them all in about 5 game days
16:43:09 <JGR> Players trying to do extreme size maps just have to accept that things will be a bit slower
16:43:28 <andythenorth> trying to do everything in a single month-end check doesn't work
16:44:02 <andythenorth> ah the 5 days is because MinimalGS boilerplates that
16:44:12 <andythenorth> ` // Loop with a frequency of five days
16:44:12 <andythenorth> local ticks_used = GSController.GetTick() - loop_start_tick;
16:44:12 <andythenorth> GSController.Sleep(max(1, 5 * 74 - ticks_used));
16:44:12 <andythenorth> `
16:44:23 <andythenorth> let's remove that
16:45:28 <andythenorth> hmm quite hard to test, my test consists of randomly sampling by opening some town windows
16:45:37 <andythenorth> very unreliable
16:45:49 <andythenorth> I could just log the loop instead
16:46:05 <JGR> Also, are you using release/non-debug builds for this?
16:46:20 <andythenorth> no, but it's a good question ๐Ÿ™‚
16:46:37 <andythenorth> cmake -DCMAKE_BUILD_TYPE=Release ..
16:46:44 <andythenorth> is what I used
16:46:53 <JGR> That should be fine
16:48:17 <andythenorth> ok still using random sampling, but it's actually about a month to do 3k towns
16:48:21 <andythenorth> even with the sleeps removed
16:49:06 <andythenorth> how many ticks in a month?
16:49:14 <andythenorth> 2220?
16:49:25 <andythenorth> probably more than a month to do 3k then
16:53:02 *** Wormnest has joined #openttd
16:55:16 <andythenorth> lol 'town happiness', but measured biannually? ๐Ÿ˜›
16:55:43 <andythenorth> (biennially)
16:56:27 <JGR> You only need to use a command if the happiness is different to the last measurement interval's
16:56:44 <andythenorth> ah so I could just keep an internal representation of state?
16:57:57 <andythenorth> "or the town window text could just be a grf callback"
16:59:06 <JGR> Not much chance of getting that into v13, so it depends how long you're prepared to wait
17:02:18 <andythenorth> a long time
17:02:34 <andythenorth> v13 is all about variants and all the other things ๐Ÿ™‚
17:02:43 <andythenorth> this GS vs GRF thing is a long-standing puzzle
17:04:16 <Samu> Setting text requiring a DoCommand is the issue imo
17:04:52 <Samu> or just DoCommand DC_EXEC in general
17:05:22 <petern> Required for network games though.
17:05:23 <JGR> GSs are only run on the server, not the clients
17:08:28 <petern> In theory the server might be able to do magic for GS commands, but... it doesn't.
17:11:01 <andythenorth> also fixing one symptom won't address the general case
17:11:12 <andythenorth> even if town window text was set differently
17:11:29 <andythenorth> there might be 5k industries that I try to set a production flag for each month
17:12:04 <andythenorth> NotGRFTowns then?
17:12:30 <glx[d]> Even vanilla game loop doesn't check every thing each month
17:12:51 <glx[d]> Don't expect GS to be able to handle it
17:13:08 <petern> Maybe if GS could batch up commands it would help, if that was possible.
17:14:01 <glx[d]> But command may depend on the result of previous one
17:14:32 <petern> But not always.
17:15:09 <andythenorth> glx[d]: I know, but some things are ~guaranteed, like industry production and town pax production ๐Ÿ™‚
17:16:26 <petern> I can batch commands to an API and it can either execute until the first fails, or execute all ignoring failures.
17:16:49 <petern> And then it can return a result that gives the status of each command.
17:16:55 <petern> But that's just web stuff...
17:17:08 <JGR> The GS execution model makes this fairly difficult
17:18:20 <JGR> It'd probably be easier to add commands which take an array of townID and value pairs
17:21:49 <andythenorth> or not try and do things that require that ๐Ÿ™‚
17:21:53 <andythenorth> I guess
17:22:11 <andythenorth> FWIW, my goal is to make town cargos have an effect ๐Ÿ˜›
17:22:20 <andythenorth> which is remarkably difficult currently
17:23:41 <petern> What's a town cargo and what's the effect you are looking for?
17:25:05 <andythenorth> e.g. deliver goods to town, get an effect ๐Ÿ™‚
17:25:24 <andythenorth> it's so instinctive, the wiki used to literally explain that it didn't work that way
17:25:55 <andythenorth> the effect ideally would be open to interpretation by house grfs
17:25:59 <andythenorth> and industries in the town
17:26:39 <petern> The cargo TE_* stuff was meant to do some things, but I think it doesn't....
17:26:41 <andythenorth> for goods substitute any other cargo, with possibly different effects
17:26:54 <andythenorth> cargo TE_ is just one of those historical messes ๐Ÿ™‚
17:27:00 <andythenorth> shows CS was considering the whole idea
17:27:06 <andythenorth> nearly works
17:27:25 <andythenorth> currently I can use town registers to store a happiness value
17:27:40 <andythenorth> I can only count cargos delivered to actual industries, not houses
17:27:49 <andythenorth> industries and houses can then read that
17:28:01 <andythenorth> I have a weird fake town monthly loop using industries
17:28:20 <petern> I don't think TE_ was an original thing.
17:30:01 <Samu> Im testing this GS on a 4k map 12k towns https://gist.githubusercontent.com/SamuXarick/48ab15372743278759902a7493fe7903/raw/646cd1d43c3ec1718357b78d3aaf123e1d12d45e/gistfile1.txt
17:31:29 <andythenorth> effect of food and water was in TTD I think
17:31:32 <petern> https://github.com/OpenTTD/OpenTTD/commit/99577265deda433fa0ea7cd29ed26b82743e3762
17:31:34 <andythenorth> which TE is supposed to extend
17:31:43 <andythenorth> well you'd know then ๐Ÿ™‚
17:32:02 <petern> Before TE_, the code literally just tested the cargo type.
17:32:18 <petern> So anything that moved to using cargo type instead of TE is missing the point.
17:32:30 <petern> TE_ is intended to be fleshed out with new ideas and effects.
17:32:44 <petern> Whatever that might be ๐Ÿ˜‰
17:32:53 <andythenorth> currently FIRS just turns it all off, because then it disappears from arctic / desert town window
17:32:57 <andythenorth> which is at least nice
17:33:04 <petern> Well that's grand.
17:33:15 <petern> for passengers, TE_PASSENGERS should be set, etc...
17:33:34 <petern> TE_PASSENGERS can also be set for say tourists...
17:34:05 <andythenorth> town_growth_effect, town_growth_multiplier
17:34:10 <petern> But it looks like the code was either never implemented, or someone though it was wrong and reverted it.
17:34:15 <andythenorth> yeah passengers has passengers
17:34:29 <andythenorth> when was it reverted?
17:34:42 <petern> t->supplied[CT_PASSENGERS].new_act += MoveGoodsToStation(CT_PASSENGERS, amt, ST_TOWN, t->index, stations.GetStations());
17:34:50 <petern> yeah, hardcoded as CT_PASSENGERS still...
17:36:40 <petern> Well I have a new project now.
17:37:40 <Xarick> https://cdn.discordapp.com/attachments/1008473233844097104/1064236946169266257/Unnamed_1950-12-06.png
17:37:40 <Xarick> 158 days
17:38:08 <petern> if (FindFirstCargoWithTownEffect(TE_FOOD) != nullptr) t->goal[TE_FOOD] = TOWN_GROWTH_DESERT;
17:38:17 <petern> That kinda does things...
17:38:43 <andythenorth> is t->supplied determined only by houses? or also industries?
17:38:47 * andythenorth could read the code
17:39:18 <petern> House production only I think.
17:39:52 <andythenorth> ah it's `t->received[TE_FOOD]` etc I need to read
17:44:57 *** Flygon has quit IRC (Quit: A toaster's basically a soldering iron designed to toast bread)
17:46:52 <andythenorth> ok so DeliverGoods()
17:47:48 <TallTyler> As I understand it, town_growth_multiplier was a TTDPatch thing. There was some sort of โ€œimprovedโ€ town growth algorithm thatโ€™s way too โ€œgame designโ€ for OpenTTD.
17:47:59 <petern> Yes of course that pile of pre-dead shotgunners means an archvile is about to spawn...
17:48:02 <TallTyler> Itโ€™s described on a wiki somewhere
17:48:06 <andythenorth> petern: err...what if every cargo was just tracked in town->received rather than tracking the town effect?
17:48:14 <andythenorth> or some backwards compatible equivalent
17:48:21 <andythenorth> then expose the cargo amounts as a grf var on the town
17:48:39 <andythenorth> I know that 'how?' is a bad way to design spec
17:48:47 <andythenorth> but sometimes it's basic infrastructure needed ๐Ÿ˜›
17:56:32 <andythenorth> hmm https://github.com/OpenTTD/OpenTTD/discussions/8635
17:56:38 <andythenorth> continue there?
17:57:01 <andythenorth> it's been Zorged, so I'm kind of not wanting to touch it
17:58:44 <Pruple> I think there's still a lack of clarity about what anyone's trying to achieve by extending the town spec
17:58:50 <andythenorth> +
17:59:01 <petern> "Why do you not have feature requests?" "Zorg"
17:59:16 <andythenorth> we have been here before a few times with spec ๐Ÿ˜›
17:59:31 <andythenorth> I usually frame my goals around tweaking what's possible ๐Ÿ˜›
17:59:34 <andythenorth> as it seems more likely
17:59:41 <andythenorth> but it's a bad way to get a spec
17:59:46 <petern> Yes
18:00:14 <andythenorth> working within the constraints is a game in itself ๐Ÿ˜›
18:03:30 <andythenorth> FML https://weblogs.openttd.org/openttd/2010/08/03.html#204417-704
18:03:34 <JGR> andythenorth: You don't have to read all his posts
18:03:58 <JGR> If you've got more stuff to add I'd just add it
18:04:07 *** gelignite has joined #openttd
18:04:23 <JGR> It'll get lost if it's only in here
18:04:48 <Samu> im getting API compatibility script not found on 13.0-RC1
18:04:58 <Samu> if i set API requirements to 13
18:05:02 <Samu> am i doing it wrong?
18:09:44 <andythenorth> "Peter's TownGrowthChallenge" or something ๐Ÿ˜„ https://wiki.openttd.org/en/Development/Design%20Drafts/NewGRF/Town%20Control
18:09:56 <Rubidium> Samu: it's missing in 13.0-RC1
18:10:05 <petern> Eh, delete that
18:10:14 <petern> Wasn't even my idea, heh
18:10:29 <petern> GS replace that
18:11:00 <Rubidium> Samu: but it has already been fixed in the 13 branch
18:11:11 <Samu> ah, nice
18:13:51 *** andythenorth is now known as Guest1423
18:13:52 *** Guest1423 is now known as andythenorth[d]
18:22:43 <Xarick> https://cdn.discordapp.com/attachments/1008473233844097104/1064248282014040156/Unnamed_1950-01-0115.png
18:22:43 <Xarick> Steeltown FIRS cargo info i could gather via GS
18:23:50 <andythenorth[d]> you don't need to do that ๐Ÿ˜›
18:24:00 <andythenorth[d]> you can just know what the cargos are via the compile
18:24:16 <andythenorth[d]> * certain assumptions were made
18:26:04 <Samu> CC_NOAVAILABLE feels wrong
18:26:18 <Samu> seems that there's a class that is not yet named
18:26:31 <andythenorth[d]> ๐Ÿ™‚
18:26:34 <Samu> 1024, 2048, 4096
18:26:53 <andythenorth[d]> probably countable bulk, covered, hazardous
18:26:55 <andythenorth[d]> or something
18:26:59 <andythenorth[d]> look them up ๐Ÿ™‚
18:28:26 <petern> <https://www.teslarati.com/wyoming-phase-out-evs-2035/> lol 'merica
18:33:30 <dP> https://cdn.discordapp.com/attachments/1008473233844097104/1064250997167362138/Screenshot_from_2023-01-15_22-25-11.png
18:33:30 <dP> ๐Ÿ˜†
18:34:13 <Samu> https://github.com/OpenTTD/OpenTTD/blob/master/src/script/api/script_cargo.hpp#L26-L38
18:34:21 <Samu> are there more CC's than those?
18:34:27 <dP> gs could execute commands instantly if game didn't try to delay the server for "fairness" or smth
18:36:05 <Samu> oh, there are
18:36:06 <Samu> https://github.com/OpenTTD/OpenTTD/blob/master/src/cargotype.h#L38-L52
18:36:08 <dP> having the server one or two ticks ahead doesn't seem like a big enough deal worth crippling gamescripts
18:36:31 <petern> It still needs to send them to the clients though, so still can't do a huge number.
18:36:32 <glx[d]> GS has same limitations as AIs
18:36:49 <glx[d]> because it's the same framework
18:36:56 <petern> It does, but it GS doesn't need the same limiations.
18:37:30 <dP> petern: on command is just a few bytes, it will take hundres if not more to become a problem
18:37:41 <glx[d]> but yeah GS could be less limited
18:37:58 <petern> andy wants to do 3000 ๐Ÿ™‚
18:38:29 <glx[d]> will trigger opcode limit at some point ๐Ÿ™‚
18:39:01 <Samu> can there be more custom cargo classes between 1 << 10 and 1 << 14?
18:39:23 <Samu> FIRS seem to have set something in that interval
18:39:53 <glx[d]> I can count 4 ๐Ÿ™‚
18:44:57 <glx[d]> but the best is to look at the spec <https://newgrf-specs.tt-wiki.net/wiki/Action0/Cargos#CargoClasses_.2816.29 >
18:45:06 <DorpsGek> [OpenTTD/OpenTTD] DorpsGek pushed 1 commits to master https://github.com/OpenTTD/OpenTTD/commit/750d89d37b372b808e616091913f7e48f6d4d0ea
18:45:07 <DorpsGek> - Update: Translations from eints (by translators)
18:48:26 <Samu> ah, why aren't they in openttd enums?
18:49:06 <petern> Because they're custom...
18:49:42 <Samu> but newgrfs are speccing them
18:51:51 <andythenorth[d]> no
18:52:19 <andythenorth[d]> newgrfs are using a bitmask that is conventionally defined in the spec
18:52:38 <andythenorth[d]> does OpenTTD even know about classes, other than the bitmask?
18:53:38 <Pruple> outside a few specific cases I don't think so
18:53:58 <Pruple> eg, passenger class cargos use bus stops instead of truck stops
18:55:09 <Pruple> unless you're doing some flavour thing, I don't see why AIs need to know about them either
18:55:12 <andythenorth[d]> hmm is GS writing to log a command?
18:55:20 * andythenorth[d] doesn't want to abandon GS :P
18:55:33 <andythenorth[d]> partly because I made FIRS compile one and I think that's neat
18:56:17 <andythenorth[d]> there are unexplored bits of the spec, like having GS mess with industries
18:56:59 <glx[d]> maybe 3 CC_XX need to be added
18:57:24 <glx[d]> logging is not a command andy
18:57:35 <glx[d]> you can do it as much as you want ๐Ÿ™‚
18:58:02 <glx[d]> commands are usually what a player could do
18:58:59 <glx[d]> with an effect on the world of course
19:02:29 <petern> I just powered on my laptop... it's got Edge opened on the OpenTTD download page, showing the latested download is 1.11.1
19:02:43 <DorpsGek> [OpenTTD/OpenTTD] ldpl commented on pull request #10355: Change #10077: make maximum loan a positive multiple of the loan interval https://github.com/OpenTTD/OpenTTD/pull/10355#issuecomment-1383226208
19:03:07 <FLHerne> sounds like you might as well sell the laptop :p
19:03:29 <petern> I don't think it's worth anything
19:05:13 <andythenorth[d]> wonder if I could write a GS that says "You have too many towns / industries, I'm taking my toys home"
19:05:37 <andythenorth[d]> if my GS is trying to do stuff like manage industry amounts and roleplay towns a bit
19:05:52 <andythenorth[d]> and player has 3k towns and 5k industries....why bother?
19:06:07 <andythenorth[d]> plausible?
19:07:27 <FLHerne> alternatively, ignore towns/industries the player isn't interested in?
19:07:47 <andythenorth[d]> how would we know?
19:07:53 <andythenorth[d]> measure presence there?
19:13:33 <Pruple> but "When you start to use >4k*4k, you can't go back" D:
19:14:18 <petern> Oh no, this trackpad doesn't support 2-finger scrolling
19:17:16 <FLHerne> andythenorth[d]: yeah, whether serviced or within the town zone of a station that's serviced or something
19:17:53 <FLHerne> although I can get behind the "just don't have 5000 pointless industries" thing
19:17:58 <petern> Hmm, did at least put an SSD in it at some point.
19:23:28 <andythenorth[d]> Pruple: official wiki? ๐Ÿ˜›
19:23:47 <Pruple> Discord channel #openttd: , same thing
19:24:11 <andythenorth[d]> I guess it's because once you've invested that long in generating the fricking map ๐Ÿ™‚
19:24:13 <andythenorth[d]> you don't want to lose it
19:24:27 <andythenorth[d]> not that I want to tell people how to play, but eh
19:24:42 <andythenorth[d]> doesn't minecraft have some kind of infinite map thing?
19:38:55 <FLHerne> technically it's not unlimited anymore
19:39:10 <FLHerne> just so unreasonably huge that no-one could ever notice
19:55:50 <Samu> dumpinfo cargotypes
19:56:13 <Samu> doesn't mention those above 1 << 9
20:02:30 <Xarick> https://cdn.discordapp.com/attachments/1008473233844097104/1064273394884952165/Unnamed_1950-01-0116.png
20:14:44 <andythenorth[d]> some industry sets require pax / workers at secondaries?
20:20:51 <TallTyler> Some of mine, but I'm phasing that out
20:20:57 <TallTyler> It's pretty grindy
20:31:22 <glx[d]> Samu: probably because they were "added" to the spec after the introduction in openttd source, and nobody updated
20:32:21 <glx[d]> and even if there are not in the enum everything still works fine
20:32:48 <glx[d]> (internally)
20:43:54 <andythenorth[d]> ok so one useful grf thing would be the ability to force an industry to be built in x% of towns
20:44:05 <andythenorth[d]> without massively skewing the rest of the industry counts
20:44:35 <andythenorth[d]> shops, builders yards etc
20:51:47 <Samu> why isn't Xarick account logged off when I leave discord webpage?
20:54:06 <andythenorth[d]> hmm I need to tokenise all the FIRS industry IDs in my GS
20:54:17 <andythenorth[d]> maybe I can put them in table slots or something
20:54:53 <andythenorth[d]> oh I did already ๐Ÿ˜›
20:57:37 <petern> Discord accounts don't leave the server, they just get marked offline.
20:57:41 <petern> "server"
20:58:28 <Xarick> https://cdn.discordapp.com/attachments/1008473233844097104/1064287477604569108/image.png
20:58:28 <Xarick> got a crash when using the preview
20:58:47 <Samu> #10355 preview
20:59:13 <petern> Works for me.
20:59:26 <petern> Unless you mean it crashed after doing something.
20:59:31 <reldred> You can check out, but you can never leave.
20:59:42 <andythenorth[d]> is reload_gs a thing?
20:59:55 <reldred> *such a lovely place*
21:00:08 <andythenorth[d]> floppy disk icon -> load savegame -> ? icon -> open AI/GS debug
21:00:10 <andythenorth[d]> every time ๐Ÿ˜›
21:00:29 <Samu> let me test locally
21:00:30 <andythenorth[d]> maybe I can hotkey something
21:03:45 <andythenorth[d]> ok alt+D
21:03:48 <andythenorth[d]> opens debug
21:03:52 <andythenorth[d]> QoL improvement
21:04:34 <Samu> where do i find the local browser openttd install folder or something, wanna see if there's a crash report there
21:07:15 <andythenorth[d]> hmm still have to detect the industry type by fingerprinting cargo I think
21:07:19 <andythenorth[d]> can't just query it
21:07:34 <andythenorth[d]> lol shave that yak gud
21:08:19 <andythenorth[d]> nope, we can https://github.com/OpenTTD/OpenTTD/commit/b8a8891a8656c0482a045505e531c812c60026df
21:13:53 *** HerzogDeXtEr has quit IRC (Read error: Connection reset by peer)
21:14:38 *** nielsm has quit IRC (Ping timeout: 480 seconds)
21:17:52 <glx[d]> there are no crash reports for browser version (and it's somewhere in browser db I guess)
21:18:42 <glx[d]> it's just a webpage
21:19:01 <Samu> think it's the autosave, it crashes
21:19:29 <andythenorth[d]> https://cdn.discordapp.com/attachments/1008473233844097104/1064292768253497444/image.png
21:19:29 <andythenorth[d]> ok
21:19:44 <andythenorth[d]> if I can just learn GS syntax and debugging
21:19:47 <andythenorth[d]> and stop feeling stupid
21:19:50 <andythenorth[d]> it has a lot of potential
21:20:21 <andythenorth[d]> I don't really understand the table slots model
21:20:32 <andythenorth[d]> it seems like everything is one giant dict, except when it isn't
21:20:43 <andythenorth[d]> but I can do stuff like
21:20:43 <andythenorth[d]> ` local farm_id = GSIndustryType.ResolveNewGRFID(firs.grfid, firs.industries.farm.numeric_id);`
21:20:59 <andythenorth[d]> where I've built a big table copying all the FIRS industry properties into the GS
21:32:04 <andythenorth[d]> there's no industry equivalent of GSTown.GetTownCount() yes/no? https://docs.openttd.org/gs-api/classGSTown.html#ade6b8722b62f9f0a1209e321e5737c4a
21:32:19 <andythenorth[d]> I can write my own, just checking my eyes here
21:32:44 <glx[d]> https://docs.openttd.org/gs-api/classGSIndustry.html#acb1e59fbad0e4b7eecbd40f21066126a
21:32:57 <glx[d]> would be the direct equivalent
21:33:17 <andythenorth[d]> yup
21:33:23 <andythenorth[d]> that's total, whole map?
21:33:29 <andythenorth[d]> no type parameter?
21:34:40 <andythenorth[d]> seems not
21:36:36 <andythenorth[d]> writing my own ๐Ÿ™‚
21:37:06 <petern> Urgh, too many branches & stashes.
21:37:58 <andythenorth[d]> hmm can GS prospect even if prospecting is off in settings ๐Ÿ˜›
21:38:22 <andythenorth[d]> yes
21:38:35 <petern> Should be able to, yea.
21:38:57 <andythenorth[d]> yup all good
21:39:07 <andythenorth[d]> I am building 1 farm for every 2 towns
21:39:10 <andythenorth[d]> to see what it looks like ๐Ÿ˜›
21:39:42 <andythenorth[d]> hmm I just had a really stupid idea
21:39:45 <petern> I had a branch with some interface scaling fixes...
21:40:11 <andythenorth[d]> I usually turn trees invisible because they're irritating when trying to build
21:40:19 <andythenorth[d]> but they look nice when watching the map
21:40:39 <CplBurdenR3294> Same
21:40:41 <andythenorth[d]> I've played some game recently where there's a circle round the cursor and trees are invisible in that radius
21:40:55 <CplBurdenR3294> Cities Skylines?
21:41:07 <CplBurdenR3294> I think that did that. I know i've played a game that did that too
21:41:57 <andythenorth[d]> ok rely on prospecting to spread farms around?
21:42:12 <andythenorth[d]> or write my own random and check for nearby town, other farms etc?
21:43:12 * andythenorth[d] uses the lower effort solution
21:43:23 <Eddi|zuHause> i just press X a lot
21:43:33 <Eddi|zuHause> to hide the trees
21:44:48 <andythenorth[d]> hmm callback 22 (industry availability) has a var 18 which is the reason the industry is being built (map gen, player etc)
21:45:00 <andythenorth[d]> can that be extended with a value for "GS is building"?
21:45:22 <andythenorth[d]> https://newgrf-specs.tt-wiki.net/wiki/Callbacks#Industry_availability_.2822.29
21:45:41 <Eddi|zuHause> possible, but you have to differentiate GS and AI building
21:45:57 <andythenorth[d]> oh wrong cb
21:45:59 <andythenorth[d]> it's 28 I want
21:46:28 <andythenorth[d]> https://newgrf-specs.tt-wiki.net/wiki/Callbacks#Industry_location_permissibility_.2828.29
21:46:31 <dP> it's not hard to differentiate, gs builds as OWNER_DEITY
21:48:03 <andythenorth[d]> grf doesn't know that though?
21:48:26 <dP> yeah, I mean between ai and gs
21:49:05 <andythenorth[d]> I think currently it's building as player
21:49:21 <andythenorth[d]> FIRS has much more relaxed location restrictions for player, compared to map gen
21:49:37 <andythenorth[d]> https://cdn.discordapp.com/attachments/1008473233844097104/1064300350925979658/image.png
21:49:37 <andythenorth[d]> so it's doing crap like this
21:49:38 <dP> to build as player it needs a company
21:49:39 <andythenorth[d]> overlapping 2 farms
21:50:01 <andythenorth[d]> well let's read the src
21:50:22 <andythenorth[d]> FIRS sometimes has bugs with this specific location logic
21:50:42 <petern> industry founder will be OWNER_DEITY for GS, no?
21:51:11 <andythenorth[d]> well yes, but in cb 28?
21:51:13 <andythenorth[d]> ๐Ÿ™‚
21:52:23 <Eddi|zuHause> why exactly does the GRF need to know whether TTD's builtin code places the industry or the GS does?
21:53:20 <petern> I think he wants to know if the player has done it, vs the GS.
21:53:29 <andythenorth[d]> it doesn't need to know, I want to know if this is a FIRS bug or an OpenTTD bug
21:54:02 <andythenorth[d]> GS is derived from AI, yes?
21:54:08 <andythenorth[d]> so AI will build as company?
21:54:15 <andythenorth[d]> but GS isn't a company
21:54:25 <glx[d]> AI are companies, GS is god
21:54:28 <andythenorth[d]> right
21:54:41 <andythenorth[d]> but the grf API seems to think it's a company player
21:54:44 <glx[d]> but GS can impersonate companies too
21:54:57 <andythenorth[d]> do I need to put it into DEITY mode or something?
21:55:33 <petern> Check if lower 8 bits of var 0x45 are 0x12.
21:55:41 <andythenorth[d]> does doxygen hide a search somewhere?
21:55:57 <petern> It'll be deity normally.
21:55:58 <Eddi|zuHause> andythenorth[d]: so can you debug which value Var18 is at that moment?
21:56:03 <andythenorth[d]> google has given up and gone home and now only shows youtube reviews of useless things
21:56:13 <andythenorth[d]> and searching doxygen requires knowing what's already there
21:56:40 <petern> Hmm, or var 0xA7, heh multples.
21:57:12 <andythenorth[d]> Eddi|zuHause: seems like it would be easier just read the src
21:57:20 <andythenorth[d]> debugging a combination of GS and grf?
21:57:21 <Eddi|zuHause> petern: 4x variables are not available during the callback
21:57:22 <andythenorth[d]> with no real tools?
21:57:27 <andythenorth[d]> on something that's random?
21:57:27 <petern> Ok
21:58:07 <andythenorth[d]> oh it did it again though ๐Ÿ˜„
21:58:09 <andythenorth[d]> https://cdn.discordapp.com/attachments/1008473233844097104/1064302498816471111/image.png
21:58:11 <andythenorth[d]> what are the chances
21:58:13 <Eddi|zuHause> andythenorth[d]: for example denying construction outright if value is 1
21:58:18 <andythenorth[d]> currently chance is 1/8
21:58:20 <andythenorth[d]> or something
21:58:28 <petern> I guess special casing because it doesn't exactly exist yet.
21:59:05 <petern> We used to try to implement vars where possible. Oh well.
22:00:17 <petern> andythenorth[d]: Use recent OpenTTD with more deterministic script random ๐Ÿ™‚
22:00:23 <andythenorth[d]> ha
22:00:39 <andythenorth[d]> I think prospecting _might_ not be affected by that? ๐Ÿ™‚
22:00:42 <andythenorth[d]> job for Samu?
22:00:50 <andythenorth[d]> deterministic prospecting
22:00:55 <andythenorth[d]> no save scumming for you
22:01:39 <andythenorth[d]> ok GS builds as player, as far as grf is concerned
22:01:49 <petern> Is bed time?
22:02:04 <andythenorth[d]> depends how crap I want 6.45 tomorrow to be
22:03:34 <andythenorth[d]> wonder if I can reimplement prospecting in GS
22:03:42 <andythenorth[d]> probably quite a lot of commands used
22:04:29 <petern> Eddi|zuHause: Bit awkward as the callback sets up an industry with founder in it, and then it's not available in the callback...
22:05:07 <andythenorth[d]> does GS have the equivalent of holding shift?
22:05:08 <Eddi|zuHause> petern: also pack owner in extra callback info 2?
22:05:16 <petern> Why?
22:05:18 <andythenorth[d]> can I test locations for an industry without actually using commands?
22:05:34 <petern> founder is already available as a variable
22:06:05 <andythenorth[d]> is the var created, but then banned in the callback? ๐Ÿ˜ฎ ๐Ÿ™‚
22:06:12 <petern> (Just not during the location callback)
22:06:18 <petern> Basically yes.
22:06:20 <glx[d]> _current_company == OWNER_DEITY ? IACT_RANDOMCREATION : IACT_PROSPECTCREATION
22:06:28 <glx[d]> GS don't prospect it seems
22:06:31 <andythenorth[d]> it's nice, no hour should pass without lolz
22:06:43 <andythenorth[d]> oh what's IACT_RANDOMCREATION?
22:06:49 <andythenorth[d]> is that the same as map gen?
22:07:01 <glx[d]> even when prospecting
22:07:14 *** gelignite has quit IRC (Quit: Stay safe!)
22:07:32 <Xarick> https://cdn.discordapp.com/attachments/1008473233844097104/1064304859014250566/Unnamed_1950-01-10.png
22:07:32 <Xarick> do these numbers make sense to you andythenorth[d]
22:07:49 <Eddi|zuHause> andythenorth[d]: that's the "create random industry" button in the scenario editor, i think
22:07:51 <andythenorth[d]> well afaik, this GS is in deity mode
22:08:13 <andythenorth[d]> but when I banned construction on IND_CREATION_PROSPECT and IND_CREATION_PROSPECT no industries were built
22:08:31 <andythenorth[d]> which is usually interpreted as 'player is prospecting or funding'
22:08:45 <glx[d]> enum IndustryAvailabilityCallType {
22:08:45 <glx[d]> IACT_MAPGENERATION, ///< during random map generation
22:08:45 <glx[d]> IACT_RANDOMCREATION, ///< during creation of random ingame industry
22:08:45 <glx[d]> IACT_USERCREATION, ///< from the Fund/build window
22:08:45 <glx[d]> IACT_PROSPECTCREATION, ///< from the Fund/build using prospecting
22:08:46 <glx[d]> };
22:08:52 <andythenorth[d]> Xarick: what are they? Counts of industries?
22:09:00 <andythenorth[d]> or ID translations?
22:09:46 <andythenorth[d]> Xarick: that's FIRS Basic Temperate, yes/no?
22:09:53 <Samu> yes
22:09:59 <Samu> it's https://docs.openttd.org/gs-api/classGSIndustryType.html#a7cdbedb10cb796376841d433188f2f04
22:10:24 <Samu> 240 is for invalid industry, i ignored the 240's
22:10:30 <andythenorth[d]> yes
22:10:36 <andythenorth[d]> what was the question?
22:10:48 <Samu> i wonder what they are too
22:10:56 <andythenorth[d]> they're ID translations
22:11:10 <andythenorth[d]> grf local ID is different to the industry type id in GS
22:11:13 <andythenorth[d]> read the commit ๐Ÿ™‚
22:11:39 <Samu> so, the resulting value is an industry_type ?
22:11:45 <Samu> i can get the name of them?
22:11:46 <andythenorth[d]> https://github.com/OpenTTD/OpenTTD/commit/b8a8891a8656c0482a045505e531c812c60026df
22:11:58 *** keikoz has quit IRC (Ping timeout: 480 seconds)
22:12:07 <petern> Hang on... what code says that 4x vars aren't available in the location callback?
22:12:22 <andythenorth[d]> is it just a docs thing?
22:12:22 <Samu> ah, i see @return the industry-type ID, local to the current game
22:12:28 <Samu> i'm dumb, can't read
22:12:28 <Eddi|zuHause> petern: dunno, but the specs say that
22:12:31 <glx[d]> basically when GS builds an industry it's like if the game decided to do it
22:12:49 <glx[d]> definitely not a player action
22:12:49 <petern> CBID_INDUSTRY_LOCATION is specially handled, but that only overrides some variables, it doesn't stop all the rest.
22:12:52 <glx[d]> in var18
22:13:02 <andythenorth[d]> oh is the lolz where canonical grf spec is the wiki, except it's not ๐Ÿ™‚
22:13:07 <andythenorth[d]> because reasons
22:13:34 <petern> It's probably the usual rule that some var 4x aren't available or don't make sense.
22:13:50 <petern> But in this case they should be available.
22:13:54 <andythenorth[d]> is it just easier to write blanket 'does not work'?
22:14:12 <petern> Test var A7 and it should contain the founder.
22:14:24 <andythenorth[d]> oo
22:14:39 <petern> You can also test var 45 which also contains the founder, but that's also mixed in with colour stuff, so that is slower.
22:15:19 <andythenorth[d]> wonder if that's founder or founder_type in nml
22:15:23 <glx[d]> hmm but CB22 doc feels wrong as we use 4 values in openttd, not 3
22:15:25 <andythenorth[d]> I could look ๐Ÿ˜›
22:15:37 <andythenorth[d]> glx[d]: looks like it hasn't changed for years
22:15:42 <andythenorth[d]> says 'TTD'
22:16:01 <glx[d]> but GS is 1 in all cases
22:16:11 <glx[d]> while player is 2 or 3
22:16:16 <andythenorth[d]> for founder?
22:16:22 <glx[d]> for var18
22:16:24 <petern> No, var18.
22:16:34 <glx[d]> founder is not a good check ๐Ÿ™‚
22:16:42 <petern> :0
22:16:44 <andythenorth[d]> nml founder_type says `PLAYERTYPE_HUMAN, PLAYERTYPE_AI, PLAYERTYPE_HUMAN_IN_AI (human managing AI company) or PLAYERTYPE_AI_IN_HUMAN (AI managing human company). OpenTTD only uses PLAYERTYPE_HUMAN and PLAYERTYPE_AI. If you cheat yourself to be part of an AI company OpenTTD will still report PLAYERTYPE_AI for the company with yourself and the AI and it'll report PLAYERTYPE_HUMAN for the now uncontrolled company.`
22:17:23 <andythenorth[d]> {'var': 0x45, 'start': 16, 'size': 2},
22:17:47 <glx[d]> not available during callback maybe
22:17:50 <glx[d]> need to check
22:18:13 <andythenorth[d]> founder is A7 in nml
22:18:37 <andythenorth[d]> `Company number of the industry founder. It will be FOUNDER_GAME (=16) if the industry was generated randomly. TTDPatch only supports up to 8 companies (0..7).`
22:18:53 <petern> Just test var 18
22:20:10 <petern> Actually how do you create an industry with GS?
22:21:03 <glx[d]> <https://github.com/OpenTTD/OpenTTD/blob/master/src/newgrf_industries.cpp#L163-L196>
22:21:05 <andythenorth[d]> https://docs.openttd.org/gs-api/classGSIndustryType.html#a93f829d0a8482889ddefd1d215cb34a7
22:21:45 <petern> glx[d]: , yes but there's no exit if it doesn't match any of those, it carries on to the normal vars.
22:22:30 <glx[d]> there is if (this->industry == nullptr) {
22:23:18 <andythenorth[d]> hmm how am I picking the founder out of var 18?
22:23:32 <petern> Okay
22:23:37 <glx[d]> oh but we pass a fake industry
22:24:13 <petern> We pass a fake industry for CB 28, but not CB 22.
22:24:19 <petern> I've been looking at 28, but maybe 22 is the one.
22:24:34 <petern> Andy, which CB were you on? :p
22:25:08 <andythenorth[d]> 28
22:25:23 <andythenorth[d]> 22 puts it in the menu or not
22:25:54 <andythenorth[d]> shift and mask is correct? `var[0x80, 0, 0xFFFFFFFF]`
22:25:56 <petern> Basically that extra section checking variables for CB 28 probably isn't needed...
22:26:03 <petern> But maybe some things are a bit different.
22:26:04 <andythenorth[d]> oops no
22:26:05 <andythenorth[d]> lol
22:26:13 <andythenorth[d]> 'mistakes were made'
22:26:15 <andythenorth[d]> copy-paste
22:26:17 <petern> You don't get founder from var18
22:26:23 <andythenorth[d]> thanks ๐Ÿ™‚
22:26:31 <petern> You do get founding type.
22:26:47 <petern> ``` IACT_MAPGENERATION, ///< during random map generation
22:26:47 <petern> IACT_RANDOMCREATION, ///< during creation of random ingame industry
22:26:47 <petern> IACT_USERCREATION, ///< from the Fund/build window
22:26:47 <petern> IACT_PROSPECTCREATION, ///< from the Fund/build using prospecting```
22:26:54 <petern> 0, 1, 2, 3
22:27:04 <petern> So var18 will be 1 for random in game stuff.
22:27:19 <andythenorth[d]> `switch (FEAT_INDUSTRIES, SELF,${industry.id}_check_location_allow_player_founding,
22:27:19 <andythenorth[d]> var[0x18, 0, 0xFFFFFFFF]
22:27:19 <andythenorth[d]> ) {
22:27:19 <andythenorth[d]> 1: return CB_RESULT_LOCATION_DISALLOW;
22:27:19 <andythenorth[d]> ${industry.id}_check_location_CABBAGE;
22:27:20 <andythenorth[d]> }
22:27:20 <andythenorth[d]> `
22:27:24 <petern> And 2 or 3 for player stuff. Not sure if it's set to 2 or 3 for AI though.
22:27:44 <andythenorth[d]> ^^ that does not disallow GS
22:27:57 <andythenorth[d]> if I set the var to just be '1' then GS can't build
22:28:32 <andythenorth[d]> going to double check
22:29:29 <andythenorth[d]> `switch (FEAT_INDUSTRIES, SELF,${industry.id}_check_location_allow_player_founding,
22:29:29 <andythenorth[d]> var[0x18, 0, 0xFFFFFFFF]
22:29:29 <andythenorth[d]> ) {
22:29:29 <andythenorth[d]> 2: return CB_RESULT_LOCATION_DISALLOW;
22:29:29 <andythenorth[d]> 3: return CB_RESULT_LOCATION_DISALLOW;
22:29:30 <andythenorth[d]> ${industry.id}_check_location_CABBAGE;
22:29:30 <andythenorth[d]> }
22:29:32 <andythenorth[d]> `
22:29:32 <andythenorth[d]> GS cannot build
22:29:51 <petern> Figures, so GS building is separate from random building.
22:30:01 <andythenorth[d]> GS is more fun than I though ๐Ÿ™‚
22:30:08 <andythenorth[d]> now it's a puzzle
22:30:33 <petern> Test A7 for 12, but don't use it in production because if we add more players...
22:31:24 <andythenorth[d]> hmm
22:31:25 <petern> Those invalid IDs would be better mapped at the upper end, but then if you use them as array indices you get massive arays.
22:31:33 <andythenorth[d]> A7 == 12 doesn't block GS
22:31:36 <petern> "invalid" -> "non player"
22:31:38 <petern> lo
22:31:42 <andythenorth[d]> what's my company ID in single player? 0 or 1?
22:31:42 <petern> bed time
22:31:53 <petern> 0
22:32:01 *** Wormnest has quit IRC (Ping timeout: 480 seconds)
22:32:05 <petern> What's the GS command to build an industry?
22:32:07 <DorpsGek> [OpenTTD/OpenTTD] George-VB commented on issue #10334: [Crash]: https://github.com/OpenTTD/OpenTTD/issues/10334
22:32:45 <andythenorth[d]> I am doing GSIndustryType.ProspectIndustry(industry_type)
22:33:14 <glx[d]> you know var18 is extra_callback_info2
22:33:17 <petern> Ah, I was just looking in script_industry.
22:33:41 <andythenorth[d]> yes
22:34:03 <andythenorth[d]> I just couldn't bothered to look up the nml ๐Ÿ˜›
22:34:07 <petern> ``` const bool deity = ScriptObject::GetCompany() == OWNER_DEITY;
22:34:07 <petern> if (!deity && !::GetIndustrySpec(industry_type)->IsRawIndustry()) return false;
22:34:07 <petern> if (::GetIndustryProbabilityCallback(industry_type, deity ? IACT_RANDOMCREATION : IACT_USERCREATION, 1) == 0) return false;```
22:34:11 <petern> It looks okay...
22:34:45 <petern> Oh wrong function haha
22:34:56 <andythenorth[d]> ok I haven't figured out which company value is being used yet
22:34:58 <andythenorth[d]> but `switch (FEAT_INDUSTRIES, SELF,${industry.id}_check_location_allow_player_founding,
22:34:58 <andythenorth[d]> var[0xA7, 0, 0xFFFFFFFF]
22:34:58 <andythenorth[d]> ) {
22:34:58 <andythenorth[d]> 0: return CB_RESULT_LOCATION_ALLOW;
22:34:58 <andythenorth[d]> return CB_RESULT_LOCATION_DISALLOW;
22:35:00 <andythenorth[d]> }
22:35:00 <andythenorth[d]> `
22:35:02 <andythenorth[d]> prevents GS builting
22:35:13 <andythenorth[d]> might be 16
22:35:20 <glx[d]> prevents GS and player
22:35:38 <glx[d]> only allowed during map generation
22:35:41 <andythenorth[d]> ^ that code above I can build
22:35:46 <andythenorth[d]> it's checking founder now
22:36:05 <glx[d]> oh A7
22:36:53 <petern> Yeah var18 should still be 1 for GS prospecting. Hmm.
22:37:09 <andythenorth[d]> lol I just tried to STORE_PERM in cb 28
22:37:11 <andythenorth[d]> silly me
22:37:18 <andythenorth[d]> wanted to read the value
22:37:25 <glx[d]> just use `founder`
22:37:26 <petern> ```/* Prospected industries are build as OWNER_TOWN to not e.g. be build on owned land of the founder */```
22:37:47 <glx[d]> most vars are name in nml no need to use the deprecated syntax
22:37:47 <petern> Maybe that messes up the _current_company == OWNER_DEITY check?
22:37:55 <andythenorth[d]> oh good find
22:38:22 <andythenorth[d]> it's just easier to stick to var numbers with peter's nfo brain ๐Ÿ˜„
22:38:37 <andythenorth[d]> so what founder ID is OWNER_TOWN?
22:38:45 <andythenorth[d]> nml does not have any constant for it
22:38:59 <petern> Because you should use it ๐Ÿ™‚
22:39:40 <glx[d]> ah yes the test is wrong
22:40:10 <andythenorth[d]> 'all I wanted was to put more fields on the map' ๐Ÿ™‚
22:40:14 <glx[d]> it should use deity_prospect I guess
22:40:27 <andythenorth[d]> I dunno, we seem to get more out of trying things than designing specs in abstract eh ๐Ÿ˜›
22:41:22 <andythenorth[d]> fields: 500% more expensive to build tracks on
22:41:37 <andythenorth[d]> "more ways FIRS ruins the game"
22:41:48 *** WormnestAndroid has quit IRC (Ping timeout: 480 seconds)
22:43:27 <andythenorth[d]> wonder if I can prospect non-prospectable industry types
22:44:29 <DorpsGek> [OpenTTD/OpenTTD] PeterN opened pull request #10360: Fix: Switch to OWNER_TOWN prevented OWNER_DEITY test during industry prospecting. https://github.com/OpenTTD/OpenTTD/pull/10360
22:44:35 <petern> Maybe? ๐Ÿคท
22:44:48 <andythenorth[d]> seems I can prospect any industry type ๐Ÿ˜„
22:44:50 <andythenorth[d]> this is ideal
22:44:55 <Xarick> https://cdn.discordapp.com/attachments/1008473233844097104/1064314266674536479/Unnamed_1950-03-26.png
22:44:55 <Xarick> making some sense of those NewGRF stuff
22:45:59 <andythenorth[d]> now I need a way to restrict prospecting to an xy region ๐Ÿ˜›
22:46:16 <andythenorth[d]> /me has ideas
22:46:36 <petern> Oh no.
22:46:43 <andythenorth[d]> 1) build it, check the location, delete it if it's wrong
22:47:09 <andythenorth[d]> 2) grf can refuse prospecting if conditions not met, but GS can't tell grf what the conditions are
22:47:48 <andythenorth[d]> 3) GS could build an industry type in specific location to act as a node for prospecting near
22:47:59 <andythenorth[d]> I had this idea for FIRS v1, 'survey camps'
22:48:24 <andythenorth[d]> prospecting is nice, but sometimes it would be nice to prospect within constraints
22:49:37 <andythenorth[d]> https://cdn.discordapp.com/attachments/1008473233844097104/1064315449355010048/image.png
22:49:37 <andythenorth[d]> it has been busy
22:49:46 <Samu> prospecting as OWNER_TOWN was such that it wouldn't clear infrastructure, like unused roads, etc
22:50:51 <Samu> OWNER_DEITY will... destroy company infrastructures of any player, i bet
22:51:01 <Samu> while trying to place industry
22:51:07 <petern> Okay, how does one draw a sprite font?
22:51:37 <petern> I guess change the palette while drawing because magenta on magenta on blue is impossible to see...
22:53:13 <DorpsGek> [OpenTTD/OpenTTD] glx22 commented on pull request #10360: Fix: Switch to OWNER_TOWN prevented OWNER_DEITY test during industry prospecting. https://github.com/OpenTTD/OpenTTD/pull/10360#pullrequestreview-1249376852
22:54:53 <Samu> nevermind, it's still building as owner_town
22:54:56 <Samu> i cant read
22:54:58 <andythenorth[d]> petern: draw in white and post process it ๐Ÿ˜›
23:00:05 *** Wormnest has joined #openttd
23:00:58 <Samu> you're making so that deity no longer prospects?
23:01:03 <Samu> confused
23:01:04 <glx[d]> I don't know which option is better, changing the test in the call keeps the syntax similar to the other call but using a variable for the calltype allows to keep the test as it was
23:01:28 <glx[d]> it still prospect, it's just the info for newgrf
23:01:49 <petern> I moved it because I originally kept the _current_company check...
23:02:18 <Samu> it becomes RANDOMCREATION now, seems wrong
23:02:18 <petern> Huh
23:02:19 <petern> No
23:02:34 <petern> Looks like I didn't push the updated version, oops.
23:02:40 <glx[d]> no it just means it's a decision from openttd and not a player
23:02:52 <glx[d]> that's newgrf stuff
23:04:30 <petern> It's also fixing a hug as it's intended to be this way
23:04:39 <petern> And a bug
23:05:17 <Samu> viewing git blame
23:05:30 <andythenorth[d]> mouse in my house
23:05:34 <andythenorth[d]> failed to catch it
23:05:39 <glx[d]> it probably always been wrong
23:06:16 <LordAro> andythenorth[d]: have you tried a comicly large mallet?
23:06:24 <andythenorth[d]> not yet
23:06:31 <andythenorth[d]> I tried a colander
23:06:35 <andythenorth[d]> which has worked once before
23:06:38 <glx[d]> or an hypercomplex trap
23:06:50 <andythenorth[d]> to be honest, squashing their head with the traditional trap works best
23:07:16 <andythenorth[d]> but I have baited a humane trap, which also works usually
23:09:07 <DorpsGek> [OpenTTD/OpenTTD] glx22 approved pull request #10360: Fix: Switch to OWNER_TOWN prevented OWNER_DEITY test during industry prospecting. https://github.com/OpenTTD/OpenTTD/pull/10360#pullrequestreview-1249380222
23:09:09 <Rubidium> Samu: for #10227 I still got hesitations about the cache consistency, so I'm trying to get a cache checker for that working but it's not working how I want it yet. And fixing that will be a task for another day
23:09:44 <andythenorth[d]> oh approved, not merged ๐Ÿ™‚
23:09:49 * andythenorth[d] pulled
23:10:16 <glx[d]> at least with the move of the test it should be a little more future proof
23:12:03 <glx[d]> can't merge before checks are finished
23:12:12 <andythenorth[d]> ๐Ÿ‘
23:13:18 <glx[d]> (well I could)
23:14:44 <Samu> thx Rubidium - appreciated
23:14:55 <Samu> i'm off to bed now, cyas goodnight
23:14:59 *** Samu has quit IRC (Quit: Leaving)
23:16:46 <andythenorth[d]> [RENDER GS] render_gs.py
23:16:46 <andythenorth[d]> 0.02s
23:16:51 <andythenorth[d]> that is quite lolz
23:17:17 <andythenorth[d]> effectively instant compile ๐Ÿ˜›
23:26:44 *** sla_ro|master has quit IRC ()
23:30:26 *** Wolf01 has quit IRC (Quit: Once again the world is quick to bury me.)
23:30:56 <andythenorth[d]> oh corrupted my savegame with bad squirrel ๐Ÿ˜ฎ
23:31:00 <andythenorth[d]> didn't know that happened
23:31:28 <andythenorth[d]> nah, just a confusing shell message
23:34:21 <glx[d]> squirrel should not be able to corrupt the savegame
23:35:34 <andythenorth[d]> no I misunderstood the crash message ๐Ÿ™‚
23:36:24 <andythenorth[d]> it was bad syntax, squirrel segfaulted
23:36:40 <andythenorth[d]> then the crash handler couldn't save the savegame, I just read it wrong
23:36:48 <LordAro> ...that's definitely still a bug
23:36:52 <LordAro> pls report
23:38:56 <andythenorth[d]> let me repro
23:39:03 <andythenorth[d]> I did a python # comment prefix instead of //
23:39:11 <andythenorth[d]> and that hangs OpenTTD
23:42:08 <DorpsGek> [OpenTTD/OpenTTD] andythenorth opened issue #10361: [Crash]: GS crashes OpenTTD with malformed comment prefix https://github.com/OpenTTD/OpenTTD/issues/10361
23:46:53 <petern> When was OpenGFX last updated...?
23:48:03 <petern> Hmm, a while ago.
23:48:08 <andythenorth[d]> Sep 25, 2021
23:48:14 <andythenorth[d]> excluding translations tc
23:48:29 <andythenorth[d]> ok I am going to sleep before I start losing ๐Ÿ˜›
23:48:35 <andythenorth[d]> right now GS is doing funny things
23:48:59 <andythenorth[d]> but writing a do..while loop which might not close, and will potentially hang openttd at map gen
23:49:02 <andythenorth[d]> is not funny
23:49:21 <andythenorth[d]> watching it build extra industries is quite good though
23:51:03 <andythenorth[d]> ๐Ÿ’ค
23:51:29 <petern> Mixing WSL and windows checkouts is messy :p
23:51:35 <petern> Good idea.
23:51:41 <andythenorth[d]> hmm maybe if you deliver cargo to a town GS rewards you by building a scrap yard
23:51:49 <petern> > /bin/bash: ./findversion.sh: /bin/sh^M: bad interpreter: No such file or directory
23:52:08 <andythenorth[d]> entire map becomes scrap yards
23:52:46 *** Wormnest has quit IRC (Ping timeout: 480 seconds)
23:57:44 <glx[d]> ah yes CRLF and bash