#programmers-off-topic

1 messages · Page 30 of 1

rotund violet
#

Shows what I know. I've only done GLSL and some other domain-specific shader languages.

#

(WGSL uses vec4 too, I just checked to make sure I wasn't totally insane)

#

So yeah, ignore everything I just said/asked. Never happened. If you bring it up tomorrow, I'll deny it.

safe dragon
#

imma do integer arithmetic with an 8bit float

rotund violet
#

Yeah, that's precisely the "wtf" that was going on my head.

#

But I am a mere grasshopper when it comes to graphics, I just figured there was something very strange and mysterious about how GPUs worked under the hood.

safe apex
#

I'm unsure why they opted for their own syntax, though, when both GLSL and HLSL have been around for decades.

rotund violet
#

Seems like they all do that? Like, Skia has SKSL too. Creating your own shader language is all the rage these days.

#

I think slang also uses something that is "like HLSL" but not exactly HLSL.

leaden marsh
#

¯_(ツ)_/¯

#

As long as it can be compiled to SPIR-V, I'm fine with whatever shading language of choice

rotund violet
#

Which means any shading language that works with Vulkan, no? Or has SPIR-V expanded to other frameworks?

leaden marsh
#

I guess so, though not necessarily designed to work with vulkan

#

SPIR-V cross for instance supports HLSL and MSL (Apple's Metal) which is pretty cool

#

And OpenGL has some extensions to use SPIR-V shader programs

raw pelican
#

Is there a way to "clean" code? I write a lot until something works and then I wonder how many lines are just taking up space. Sometimes intellisense puts those dots under something that says "this isn't getting used at all" but then a lot is so contextual to how the code runs it takes a long time to try to see what isn't needed.

safe dragon
#

to me it sounds like the actual problem here is that the code is too difficult/complex to reason about to know what is or isn't necessary

#

normally it would be relatively straight forward to know whether a line of code is actually doing something useful or not

#

barring some exceptions like dealing with an odd poorly documented external api

raw pelican
#

Well it's C# that I am in the process of learning, so yes, too difficult relative to my knowledge of it.

rain apex
#

you can always step through with debugger

safe apex
rain apex
#

intellisense is limited to obviously unreachable code, there might be fancier code analysers you can use but im not that familiar with C# either

safe dragon
#

there's many code analysis tools for c# but most aren't free...

leaden marsh
raw pelican
#

debugger would let me do a lot of tests at once. So flag a lot of sections, then playtest until I am moderately confident it has hit all the things it's going to hit, then comment out the unused portions and playtest again to see if errors appear.

rain apex
#

oh i was thinking you just drop a breakpoint on possibly not needed code

safe apex
pliant snow
#

I would argue that if it's too difficult to even reason if blocks of code are even being executed at all, then it's too convoluted

safe dragon
raw pelican
#

I also have worked with code like that where it's my own SQL from 4 years ago. I have started added copious comments to everything since.

safe dragon
#

In an ideal world you'd have a full unit test suite testing every expected usecase for that code but that is not a world I have ever experienced

rain apex
#

if you have a test suite that truly covers all cases then your software is prob not user facing

safe dragon
#

or not used in general

#

👌

raw pelican
#

You think you got every use case but someone will surprise you.

#

Path of Exile devs said once that the first hour of a league going life was orders of magnitude more live testing than the three months of development playtesting which makes sense when you have 100k players and less than 20 devs/testers. So when people complained about bugs when doing some weird specific thing it was not surprising, since testers would not be going into edge cases until they appear.

safe dragon
#

in the case of games also very crucial is that it's impossible to test with every hardware configuration

#

people are going to be running your game on the strangest setups known to man

#

for a lot of software though... clients just seem to want to do things that just make no sense sometimes

raw pelican
#

Fit the tech to the business process and not the other way around yeah.

safe dragon
#

I work for a company where pretty much anything gets built as long as some client pays for it to be built which has resulted in a very messy codebase with the weirdest usecases all trying to simultaneously continue working

#

even today

raw pelican
#

Oracle?

safe dragon
#

working on something so strange even the product owner started doubting himself several times trying to explain it and then leaving for a bit to check

#

I don't work for a company you'd know the name of no

#

doubt oracle has an office in my country

#

damn, they do

pliant snow
#

like a disease

safe dragon
#

there's only 2 oracle jobs available in my country rn

#

a sales representative job and a consultant job

raw pelican
#

sounds like they're trying to expand in

leaden marsh
#

Or that recent bug that we got with a third-party game cube controller causing the game to crash because of its rumble driver

#

(Not even particularly a stardew issue too; like it causes crashes on the SDL level)

#

Really cannot anticipate every single config that your players will play on

crystal wren
#

As in... a custom driver? The fact it has a custom driver is itself weird enough to me!

leaden marsh
#

I don't really know the particulars

#

Let me find the thread

crystal wren
#

Wow, yeah. That's... huh.

leaden marsh
#

Very luckily, the .dll name popped up in the Windows Event Viewer, and I found this thread + an old Stardew thread where Atra troubleshooted the issue

crystal wren
#

That sounds like Atra. SDVkrobusgiggle

leaden marsh
#

I say "luckily" because it was otherwise popping up either "Stardew Valley.exe" or "StardewModdingAPI.exe"

#

Updating to the monogame fix beta somehow got the faulting module to move to the actual problematic .dll

safe dragon
#

possibly by pure chance

leaden marsh
#

More than likely by pure chance

safe dragon
#

luckily the company I work for makes it easy to figure out what is causing things to break cause the answer is just always watchguard

#

watchguard blocked my webcam cause it thought it was an image server for some reason

leaden marsh
#

i... guess it does serve a continuous stream of images

#

very loosely matches the definition i guess

safe dragon
#

watchguard had to be completely removed from the servers because it was breaking essentially every single service we run

#

the build pipelines stopped working, applications were crashing

#

good stuff

leaden marsh
#

sounds fun

safe dragon
#

I thought it was pretty amusing yes

#

others seemed to think differently

rotund violet
#

You learn the common wisdom that select ain't broken, and it serves you well, and then you hit that one weird day when select actually is broken.

safe apex
#

I've been considering using FASTER in SM. Nooot sure if it would be beneficial - probably not.

safe dragon
#

what's that

rotund violet
#

Although I cannot quite grok how it would fit into something like SM.

safe dragon
#

what does SM stand for...

rotund violet
#

SpriteMaster? I think? Someone mentioned it in the modding channel. (Unless, again, there's a different SM; I've been misinterpreting a whole lot of acronyms lately.)

rain apex
#

super mario

safe dragon
#

o

sand frost
#

yeah if it's Ameise talking it's spritemaster

cinder karma
#

Exceeding in memory structures? I've got to see this

rotund violet
#

So they say. I was skeptical when I first read that claim. I gather they must be comparing it to specific reference structures like ConcurrentDictionary, or Dictionary with a lock. But I haven't read the white paper.

safe apex
#

One in particular is read a lot.

rotund violet
#

I guess you're... caching upscales or something?

safe apex
#

And original date, and kv lookups for objects

bitter kiln
#

I'm having trouble articulating this, but I'm tackling a problem semi-related to SDV for fishing:
From my understanding, the chance I catch a fish depends on a randomly shuffled list of fish location data for a region, starting the mini-game if the random num is < p and continuing to the next if it isn't. So, to model this a bit more simply, I just take in a list of probabilities, such as:
[0.25, 0.5, 1], and I try to get the average chance any given fish is reeled in. In this case, the results end up being approx.
[0.104166.., 0.22916.., 0.66666..], which is good, but.. my implementation is of O(!n) and I'm trying to do better than that.

def get_probs(prob_list:list):
    sum_probs = [0]*len(prob_list)
    for permutation in itertools.permutations(range(len(prob_list)), len(prob_list)):
        real_numbers = [prob_list[i] for i in permutation]
        total_prob = 0
        for iter, i in enumerate(permutation):
            current_prob = real_numbers[iter] * (1 - total_prob)
            total_prob += current_prob
            sum_probs[i] += current_prob

    total_permutations = factorial(len(prob_list))
    final_sums = [i/total_permutations for i in sum_probs]
    return final_sums

First mistake is arguably using python, but I'm kind of already doing the rest of this and it wasn't supposed to involve performance-critical code like this.
Main thing is, is there a more obvious / better algorithm to use for this kind of situation? I feel like there has to be.

#

I tried to look this up myself, but my attempt at searching "getting sum of probabilities for shuffled list" has not been helpful

cinder karma
#

Hmmm

#

I think you want probability theory more than anything else

bitter kiln
#

Most experience I have is one stats class

#

Which I half understood, despite trying my best SDVpufferwaaah

cinder karma
#

Unfortunately I don't recall this clearly enough rn

bitter kiln
#

That's ok! I was just throwing this out there into the server to see if anyone has some insight. thank you for looking at it SDVpufferheart

cinder karma
#

(For example, I'm now trying to justify to myself if

[A, B, C] and [B, A, C]

Shadow C equally.)

#

While having only my phone on me so

#

Not even scratch paper

bitter kiln
#

I could def short circuit some things if there's something of prob 1 that gets hit

#

but thats minor

cinder karma
#

Yeah

#

I'm looking for big symmetries that let you reduce the amount of work you need to do

bitter kiln
#

Yeahh

#

Random thing I think im noticing is the lowest common denominator is equal to multiplying all the denominators of all numbers times the number of permutations, its 24 for [0.5, 0.5, 1] and 48 for [0.25, 0.5, 1], and 60 for [0.1, 1, 1]

rain apex
bitter kiln
#

I wouldn't know what prng stands for

rain apex
#

Pseudo random number generator

bitter kiln
#

I care moderately about queries but mostly for the sake of excluding legendary fish, qi quest stuff, etc

rain apex
#

As u know most programs don't use real rng

bitter kiln
#

mm i would find it interesting at the least

#

right now there is no actual random for the algo im using, it just gets the avg assuming the numbers are true random

#

is sdv prng significantly different from what would be considered 'truly random'? like is it biasing results

#

if so i might as well run n simulations with sdv prng and use that

cinder karma
#

It should not be

#

Stardew uses the normal c# random

#

Which should be fine for video game purposes

bitter kiln
#

oh ok yeah i should be fine then

#

but yeah practical problem, i haven't implemented filtering down fish in a sublocation by season so one place in particular (the beach, it's the beach) has 21 different catchables

rain apex
#

Did fishing use daily luck

bitter kiln
#

for treasure chests

#

and woodskip on the forest farm, for w/e reason

rain apex
#

Ig it's probably fine as long as there's no seeded randoms Bolb

bitter kiln
#

but im kind of ignoring both because 🙈

rain apex
#

Fine to ignore I mean

bitter kiln
#

even if i get within a few coins of what could be expected with the assumptions i am making im happy

#

but i need to be able to calculate this within one year from now

#

a list of length 10 takes 3.64s with this

#

painful

#

if i did my eyeball math right it would take over 1000 years for that (len 21). lol

#

i love python

rain apex
#

Back when I was in skool the tuition paid for access to a supercomputer AquaThumbsup

rotund violet
#

Yikes, 4 seconds for 10 elements? That's even worse than O(N!)

worn remnant
#

i would think the multiplications by (1-p) are commutative, so if you have a good (fast) way to calculate the chance that a given other entry precedes the one you are looking at, you maybe could multiply that by the hook chance and not bother actually doing permutations. i think that would still be n^2 but that is better than factorial

rotund violet
#

Mainly what I remember from my perms and combs is that they generally are factorial complexity and there's not much you can do about it other than... don't do perms and combs.

bitter kiln
#

Yea

worn remnant
#

i don't know the solution for the ordering question but there's probably a k-choose-n or something that can get it quickly

bitter kiln
#

I could also make it wicked fast in a language like rust or c but.. its still O(N!)

rotund violet
#

I mean, you can calculate nCr as a scalar pretty quickly, but if you're dealing with the set itself then it's going to be slow.

#

I may have to reread the problem a few times but I'm wondering if this should be modeled as an interval tree.

bitter kiln
#

If it helps I can elaborate on the problem itself

#

I tried to keep it concise but I may have lost a few details along the way

rotund violet
#

Rather than "a list of probabilities", think of it as "mutually exclusive ranges between 0..1 that each fish occupies given a random choice in that range"

cinder karma
#

And was what I was getting at with "shadowing"

#

After that. You need "every possible position a fish can be in the list" (equal probability)

bitter kiln
#

Yes, I want to do whatever ichor mentioned but unfortunately I don't understand what's being put together there. I am going to dissect that, but it's taking me time

cinder karma
#

And the kcr ways the other fishes can be before or after

worn remnant
#

to use your initial example, [0.25, 0.5, 1]: to hook the .25, you have to fail all the checks before it and then hit p=0.25. if e.g. 0.5 comes after 0.25 in the shuffle, then you don't check it, so multiply (1-0.5) * the chance that it is actually in front of 0.25 in the shuffle, and do the same thing with p=1

cinder karma
#

Possible savings there too but I'm too tired to figure that out

bitter kiln
#

hmm

rain apex
#

Is it like a tree then

#

Dfs but stop traversal under certain conditions

rotund violet
#

That's an interval tree, isn't it?

#

You can precompute all the ranges based on the probabilities.

#

If the first element has 5% probability, then the remainder of the elements occupy 0.05-1.0

cinder karma
#

(I don't see it.)

bitter kiln
#

like sort of have some of the answers which were already encountered saved? so if im doing like
[0.1, 0.2, 0.3, 0.4]
and im at 0.1, 0.2, and about to do 0.1, 0.2, 0.3, 0.4 / 0.1, 0.2, 0.4, 0.3, I save what the result was for getting up to that point and just re-use that

rain apex
#

dynamic programming DokkanStare

bitter kiln
rotund violet
#

I don't know, maybe I'm starting to get more tired at night, but it seems like you are treating the problem as a series of "gates" (roll once; return A if less than X; roll again; return B if less than Y; roll again; return C if less than Z, etc.)

worn remnant
#

that is how the fishing function works, yes

rotund violet
#

Which is how these RNG tests are normally implemented in games, and that's fine, but the whole thing can also be precomputed as intervals along a single random axis.

#

(requiring only 1 random roll)

#

(don't read too much into the "random axis", I wasn't trying to sound clever, I just mean continuous ranges along a 1-D line)

cinder karma
#

they're running into issues because they want to do this for every possible shuffled combination

#

which hits permutations

#

so you want to get out permutations asap

#

you can do that by folding cases together, ichor pointed out the symmetry

rotund violet
#

I'm probably confused about the what and when of the shuffling.

bitter kiln
#

It shuffles the list of fish locations each time you cast and then goes through the list one by one

rotund violet
#

The entire series of tests changes on every roll? Is that it?

bitter kiln
#

if it hits the end, you get trash

rain apex
#

How does that one fishing info mod work think

cinder karma
#

so basically:

For each fish:

  • has equal chance of being any position in the shuffle (hush, don't mention priorities.)
rain apex
#

Is it just monte carlo

rotund violet
#

Is this a hypothetical problem that's just similar to Stardew? Because SV's fishing doesn't shuffle like that.

cinder karma
#

The relative probability that a specific type of fish (including algae and seaweed) in a location will spawn during a specific time and weather is: {relative spawn probability} = {base spawn probability} * POWER( ({all fish failure rate} - {this fish failure rate}) / ({number of fish} - 1}), ({fish queue position} - 1)), where all fish and number of fish are all other fish present at the same location during the same time and weather conditions. This calculation is repeated for each possible position in the spawning order (fish queue position) for a type of fish, and then averaged. The total added relative spawn probability for all fish at a location at a certain time and weather will always be under 100%, with any remaining difference under 100% being the relative probability of catching trash: {trash probability} = 100% - {total relative spawn probability}.

worn remnant
cinder karma
#

this is what the wiki says, interesting

rotund violet
#

The wiki can say what it wants, I've read the GameLocation code.

cinder karma
#

I'm actually not sure what the wiki means here

rotund violet
#

(Well, the decompile, anyway)

cinder karma
#

"all fish failure rate" what

bitter kiln
#

presumably the chance that the prob for all catches fail and you get junk?

rain apex
#

(atra weren't u gonna sleep)

bitter kiln
#

i dunno..

cinder karma
#

(nerdsniping happens)

#

I'm quite sure there is a simplification off what ichor did

#

but I'm not quite sure where and need actual pen and paper XD

#

or a whiteboard

rotund violet
#

I really don't get it either, there's no "all fail" chance, except the "chance" that all individual fish tests fail.

bitter kiln
rotund violet
#

Trash is just the last priority item set if nothing else matches.

cinder karma
#

ah, yes

rotund violet
#

But Stardew's matching order is deterministic. Or should be. Location data doesn't change per cast.

#

Not that it's not an interesting problem to solve if shuffling is ongoing, but it's a different problem than the one in the game.

cinder karma
#

let's say the item is in position n out of m. Then there is a (n - 1)/(m - 1) chance any other fish is before.

#

focustense,

#

that's what that orderby does

#

[Precedence] takes precedence, but then it shuffles.

rotund violet
#

I see, yeah. My solution would be: clone Game1.random so you know the next value.

cinder karma
rotund violet
#

But I guess that's solving a different sort of problem ("which fish is next" as opposed to "give me a global distribution")

bitter kiln
#

yep

cinder karma
#

Sum that up for all fishes, it's a n^2 problem

rotund violet
#

I remember that now from the cave jelly spelunk, that's what I had planned to do before I lost the thread.

cinder karma
#

(note that this assumes equal precedence, you'll need to break out the seperate precedences)

#

you will also need to ignore the weird seeded random for the jellies

rotund violet
#

Yeah, you do it for each priority separately.

#

The loop also repeats twice for some reason, so... there's that.

leaden marsh
#

You mean the loop to catch fish or?

rotund violet
#

No, in GetFishFromLocationData

#

There's literally a 2-iteration loop to determine the fish

leaden marsh
#

Yeah that's what I think I'm referring to

cinder karma
#

it's subtle but that's for a specific bait

#

(stardew is Like That)

leaden marsh
#

^^

cinder karma
bitter kiln
#

im not thinking about specific bait for a while lol

cinder karma
#

(Mr. CA likes messing with the loop variable.)

#

drives the rest of us mad

#

sorry, Myuu

#

but it's true

bitter kiln
#

the most basic version of this problem is a headache as is x.x

leaden marsh
#

I actually don't know if that's what the actual code says

cinder karma
#

for my sanity.

#

Please. Myuu

#

Tell me lies.

#

"The actual code is not like that, of course, atra!"

bitter kiln
#

I think I'm going to spend a long time reading and re-reading everything everyone said here and figuring out what i can do with it, I'll be back within 1 to n days with what I got

cinder karma
#

targeted bait is fucking weird what

#

okay, that will really fuck with any mathematical prediction, it says "ignore shadow twice"

leaden marsh
#

Yes it is

#

It is very weird

rotund violet
#

Told ya.

cinder karma
#

tbh the part of targeted bait that does other things I recall being more sensible

bitter kiln
#

assumptions:

  • not using targeted bait
    SDVpufferwow
rotund violet
#

Heh... in 1.6 I rarely fish without targeted bait.

cinder karma
#

have you noticed the targeted bait multiplier

leaden marsh
#

I know what the code says and that it has 2 loops

#

In any case it's not just targeted bait that loops twice

#

It's literally any bait that isn't normal bait basically

cinder karma
#

BUT IT INCREMENTS THE LOOP INDEX IF IT ISN'T SPECIAL BAIT

leaden marsh
#

Or I guess, magnets

cinder karma
#

I forgot which bait it was

#

wait, it's everything but magnetis

#

yeah that's weird

leaden marsh
#

No of course not Atra! It's written as a break in the actual code!!

cinder karma
#

it loops twice for most things

rotund violet
#

According to the code, good bait is just bait.

#

Oh wait

leaden marsh
#

No

rotund violet
#

Inverted condition. Every bait that's not just bait.

leaden marsh
#

Yes

#

So nvm I guess magnets do count as good bait?

#

Funny

#

I'm sure fish really love that

rotund violet
#

Is this in the lv50 repo? How do I request access so I can stop making silly assumptions from decompile?

cinder karma
#

Myuu, I have a stupid question

leaden marsh
#

I'm pretty sure the repo is just the decompile

#

I don't have access to it either, though

cinder karma
#

is SpecificBaitMultiplier set for any vanilla fish

#

or SpecificBaitBuff

rotund violet
#

Oh well. At least I can start adding meme bot commands.

leaden marsh
#

I actually don't know, since that's defined in a content file I'm assuming

cinder karma
#

this means NOT USING BAIT is good bait

#

that feels...incorrect

leaden marsh
#

Not using the normal bait yeah

cinder karma
#

null is not equal to (O)685

#

no, not using bait at all. bait is null then

#

null is not equal to (O)685

leaden marsh
#

Oh wait

cinder karma
#

at all

leaden marsh
#

Fuck

#

That's really funny actually

cinder karma
#

also, that's why I asked about the specific bait

#

do you want to do the honors of bug reporting that?

fleet wren
leaden marsh
#

I really thought this condition was handled somewhere else but I genuinely think that's just it

rotund violet
#

Balance-wise, still probably better to use bait because baitless is insanely slow. But... yeah.

cinder karma
#

is the last time I unpacked before 1.6 released

#

Myuu, because I think it's a bug here too

#

SpecificBaitMultipler defaults to 0

fleet wren
#

actually it defaults to 1.66

cinder karma
#

it does? Where?

leaden marsh
#

I'm pretty sure Selph is right

fleet wren
#

StardewValley.GameData.cs

cinder karma
#

ahh okay I'm blaming ilspy

#

shows it correctly if I go to the class

leaden marsh
#

I'll fix the null bait condition, assuming CA doesn't say otherwise

rotund violet
#

I don't even have this field... where is StardewValley.GameData?

fleet wren
#

it's a separate DLL, contains the definitions for SDV's Content data fields

rotund violet
#

Oh, I see it.

cinder karma
#

magnets flavor text says they be bad for fish bites but they're strictly better than normal bait rn

leaden marsh
#

Good point

#

Are they at least... Slower than normal bait?

rotund violet
#

Must abuse this in playthrough before it's fixed. I don't think I've ever even tried using a magnet.

leaden marsh
#

Not nearly as good as any of the other bait types, like the deluxe bait which is already pretty cheap

cinder karma
#

I will note that in 1.5.6 it was hilariously exploitable.

leaden marsh
#

They... Really probably should be

rotund violet
#

Wait a minute, magnet isn't bait, it's tackle.

#

Isn't it?

cinder karma
#

you just...went to the casino. Stuck an autoclicker on the slots machine

#

went off to make lunch

#

came back, bought near infinite magnets

fleet wren
#

there's a magnet bait and a Treasure Hunter tackle

cinder karma
#

anyways

#

that got patched

#

anyways

#

we're hilariously on topic

#

My bad

#

can we go back to the math?

rotund violet
#

And you're still awake.

bitter kiln
#

math

fleet wren
#

my only contribution is to point out that this fish chance calculation will also be relevant for a bunch of other places that use shuffling probabilities list such as animal produce or machine output

bitter kiln
#

yep

rotund violet
#

I think you do have to account for the fact that the PRNG is not true RNG, and the multiple loops effectively act as a remapping which changes the random distribution to be less uniform.

#

Depends on the goal obviously, I'm not sure if we are trying to accurately predict something or just post some kind of vague stat that may or may not be of interest in decision-making...

bitter kiln
#

im not interested in predicting the immediate future in game, im interested in finding out that, say, i will catch a sunfish n out of 100 times in the town river on a sunny spring morning or w/e, or i will get an average of n xp fishing on the beach during a rainy summer at noon

fleet wren
#

does SDV use PRNG or actual pseudorandom distribution? since if the former then I don't think it's particularly relevant

rotund violet
#

It's just .NET random. Xoshiro256 I think.

#

If it was doing fancy Poisson distributions then the RNG wouldn't feel so sucky half the time.

#

(er... no offense to myuu and the rest)

#

Anyway, I guess the reason I was asking is that I'm skeptical of how accurately this offline prediction will track with what happens in game, precisely because everything RNG-based is so streaky and bursty.

worn remnant
#

(real random numbers also tend to clump, if memory serves)

cinder karma
#

(for what it's worth:

#

stardew does not use xoshiro256

#

like

#

at all

rotund violet
#

They do ichor, which is why many games focus on the distribution.

cinder karma
#

has to do with how the net 6 random works

bitter kiln
#

🤷‍♀️ it's probably random enough that I'm willing to ignore it over worrying about calculating a step above monte carlo

rotund violet
#

Game1.random is nonseeded.

cinder karma
#

it's seeded

rotund violet
#

Ok Mr. Smarty Pants, here's what debugger says.

cinder karma
#

in both loading and new day

bitter kiln
#

..what does either matter if in the long run, it's evenly distributed? i don't get this

rotund violet
#

It's not evenly distributed.

#

"Random" and "uniform" are not precisely the same.

bitter kiln
#

hm

#

is it possible to keep a distribution for it somewhere, then?

#

i suppose the current algo would rely on a standard distribution, though i have to admit im approaching more detrimental levels of tired

cinder karma
#

Entry would see an unseeded random

#

it's the only place you would

#

except in special orders, huh

#

Game1.random is reassigned in the middle of save loading to a seeded value

#

oh nevermind I misread that's deterministic

rotund violet
#

Confirmed that it's Net5CompatSeed at some point later on. (Don't know the exact timings.)

#

Interestingly, I'm reading that Xoshiro256 actually has a good uniform distribution: https://prng.di.unimi.it/#quality

But I don't think the net5 impl has the same track record.

bitter kiln
#

i mean, if we want to confirm this im sure theres a way to code in some debug tool that simulates getting a bunch of random nums from random and builds a distribution from it

cinder karma
#

(you're doing expected value)

#

(you're fine.)

bitter kiln
#

yeah but now im double nerd sniped

cinder karma
#

Anyways. I actually have to do actual work tomorrow, lol.

bitter kiln
#

mhm, i would like to sleep too its midnight

#

im going to see what i can make of this. cheers and thank you all! SDVpufferheart

sonic mirage
#

@bitter kiln Just FYI, I think a couple months back the main (current) dev for UIInfoSuite2 (goes by drewhoener on the GitHub) was working on comprehensively modeling fishing probabilities. I can't remember their username in here, though, but they frequent #making-mods-general and have the same profile pic they do on the GitHub for UIIS2 (ref an issue they wrote there: https://github.com/Annosz/UIInfoSuite2/issues/442). I think they have "UIInfoSuite2" in their name on here, too. Hope that helps; I think they'd spent a decent amount of time testing performance of running simulations in-game and things so they were getting pretty in-depth with it.

GitHub

Ongoing maintenance for the original UI Info Suite mod for Stardew Valley. - Issues · Annosz/UIInfoSuite2

rotund violet
#

You're talking about abs0rbed (not including @ to avoid a ping).

sonic mirage
#

Ah found them, it's ab..

#

Yes, focus beat me to it SDVkrobusgiggle

#

Here's the last post they mention the fish mod in (from June), where they summarize the fish mod and the issues they were tackling with it: #making-mods-general message

Looks like they were last really working on it in April, though, based on messages with "fish" in them, though

bitter kiln
#

Ok so, I think I've thought of a plan for this. Since it should be commutative as ichor mentioned, I can just do one permutation for the elements leading up to some element in the list rather than each permutation. So like for [0.1, 0.2, 0.3, 0.4], I can just operate on [0.1, 0.2, 0.3] to get the result for 4 at the end of the list. That way, I can go back to front, iterating through each element in the list and recursing to operate on itself minus that specific element, and then have that result be summed up for that specific element. I think that's it, anyway

#

Most difficult part so far has been digesting all this information but its maybe starting to make sense

bitter kiln
#

But yeah since the calculation for checking the prob of the last element in the list gets selected is just inverting the chance of all elements and getting the product, it's not too bad

#

Though I say all this, I do not have a working algorithm SDVpufferwaaah

bitter kiln
#

For the original problem I do get 2/3 values correct though, im this close 🤏

pliant snow
#

@gaunt wadi what do you know about esphome? People seem to sing its praises, but im not sure of its usecases

#

Idk if its just diy stuff without implementing your own protocol

gaunt wadi
# pliant snow <@316476612633690113> what do you know about esphome? People seem to sing its pr...

I haven't used esphome, but I've used a bunch of esp32s before. My understanding is esphome is for implementing your own smart home devices, whether that be just because you enjoy it or there's no device available for purchase that does what you want. I've toyed with the idea of building my own smart blinds that upgrade my existing non-smart blinds, since I have an esp32 and motors lying around and that plus some 3d printed parts is everything I need, but I already have too many projects on my todo list

or in short: seems neat, especially if you're into hardware, I personally haven't had a desire to use it

#

As far as I understand, smart home devices are just micro controllers + sensors/etc + firmware industrially packaged together and esphome would let you build the identical thing diy

pliant snow
#

Hmmmm

#

Ah right

cinder karma
#

I am "I'm not sure why my back is angry at me today" years old

ivory shadow
#

I know exactly why my back is angry at me. Sadly the knowing doesn't help with the problem.

bitter kiln
#
def get_probs(prob_list:np.ndarray):
    sum_probs = [0]*len(prob_list)
    for i, element in enumerate(prob_list):
        n_permutations_e = factorial(len(prob_list)-1)
        without_e = np.delete(prob_list, i)
        chance_all_others_fail = np.prod(1 - without_e)
        sum_probs[i] = element * chance_all_others_fail * n_permutations_e
    return sum_probs

at the very least, this works for the elements at the end of the array..
Input: [0.25, 0.5, 1]
Output: [0, 0, 0.75]

#

I feel like i tried this this morning but maybe I didn't, just got to recurse a bit, I think

bitter kiln
#

Yeah I'm hitting a roadblock here, I don't know what to do

#

I've gotten to this point repeatedly and then I keep failing to go through the rest of the cases properly

timid breach
#

Is anyone else's NexusMods not connecting rn?

tranquil grove
#

yep, random 503 errors, though it loads occasionally; not seeing anything relevant on the status page

#

SDVkrobusgiggle and then the same minute I say that:

Investigating - We are investigating reports of connection issues to the main website

gusty venture
#

Idk if this is the right place to ask but

#

Can somebody by any chance help me with this

cinder karma
bitter kiln
#

Oh hm, precedence might make this easier? It seems to essentially divvy up fish location lists

#

I suppose ill ask in #making-mods-general though if anyone wants to definitively point to me which channel is best for discussing making a python script which interfaces with game data, let me know... its SDV, but not quite a mod

candid pilot
#

i might be able to help?

bitter kiln
candid pilot
#

so this is about how the game decides what fish to pull?

#

like it checks for rand < .25 and then rand < .5 and then rand < 1 (100%)

candid pilot
bitter kiln
#

Sorry that I can't chat too much right now, I have to set up to DM for a campaign in an hour

candid pilot
#

got it! have fun!!

bitter kiln
bitter kiln
#

hmm, i will try that tonight/tomorrow morning

candid pilot
#

?

def r_norm_prob(probs: list[float], part: float = 1):
  if len(probs) == 1:
    return probs[0] * part
  return [probs[0] * part] + r_norm_prob(probs[1:], part * (1 - probs[0]))
#

recursive bit. sorry if i’ve completely misunderstood

#

but like [.25, .5, 1] -> [.25, .375, .375]

#

and O(n) for n = probs ?

#

i don’t know stats though sorry

#

oh god randomly shuffled i didnt realize

bitter kiln
#

Yeahh

rotund violet
#

Yeah that orderby random is easy to miss (why CA... just why)

bitter kiln
#

Its a bit less rough in practice because its sorted by precedence, and then sorted by random

#

The main test i've used is [0.25, 0.5, 1] -> [0.104166.., 0.22916.., 0.66666..] since i calculated that by hand initially

candid pilot
#

yeahh

#

5/48, 11/48, 2/3 i went and calculated by hand too

#

im working on smth with caching an hopefully it’ll be better than 1k years 😭😭

safe dragon
#

I have no idea what is going on here but I believe in y'all

#

my understanding of statistics is nearly zero

candid pilot
#

literally

safe dragon
#

who knew you'd need a course in statistics to make stardew valley mods

sand frost
#

Have you tried just calling getFish() a lot? I theoretically could do the stats I guess but it sounds easier to just getFish() to me. Obviously this does make it harder to do out-of-game, so you could use this also as a means of checking your calcs once you have a method.

cinder karma
#

Someone remind me to code what I mean on Sunday

#

(I don't see why a tree structure needs to be involved at all.)

rotund violet
#

(Technically, it goes a couple steps farther and actually "catches" the fish with a fake rod)

sand frost
#

It sounded vaguely like the goal was something external to the game

#

but theoretically you could just translate getFish() to python maybe

rotund violet
#

(I think translating getFish to python is sorta the deal here, except actually running that logic has crazy slow factorial complexity)

cinder karma
#

Yeah, as I said, if you assume the prng is "good" (not a bad assumption) and you just want expected value there are pretty good ways to simplify the problem

#

I'm clearly not making myself clear

#

So I guess I need to code it lol

#

It is at worst n^2

#

And I think we can still simplify

rotund violet
#

One thing you can see with the overlay mod doing its slow simulations is that the distribution really does change (very subtly) from moment to moment. From which I infer that any static simplification would also be an approximation. But also, the changes are in the order of like, fluctuation between a 12% and 13% distribution, so I wonder if it's really important.

cinder karma
#

Yeah. It samples 100 per tick

#

So it's not surprising to see that

rotund violet
#

Guess I'm bringing over my work habit of dissecting stakeholder requirements, but I keep wondering if we really need to care about the precedence randomization. Yes, it affects the result, but only to a very subtle degree compared to just assuming an equal distribution of everything with the same precedence. Doing it the latter way is not accurate; but I'm also quite sure that the most accurate possible factorial-complexity computation is still not going to translate to an exact replication of results in the game, because a "fishing day" in the game is a very small sample size compared to what it takes to observe uniform distribution with these PRNGs.

#

This all boils down to goals for my nitpicky self. If we're not predicting catches with high accuracy, then what exactly are we predicting and why? What's the "good enough" point?

ivory shadow
#

At a certain point, you're precise enough to show numbers to a user. It's not like someone is going to catch 100,000,000 fish and then complain that the results were slightly off.

rotund violet
#

Yes, and that's what I'm getting at, it may very well be precise enough to yeet the random-precedence entirely and make a few simplifying assumptions.

#

If you're just trying to show an approximate distribution, then the static priorities are not that far off.

#

If fishes A, B and C are all at precedence X, and precedence X has Y% chance, then just assign them all equal conditional chance - all individually Y/3.

cinder karma
#

(I would take the shareholder argument more seriously if ichor and I didn't solve it yesterday lol.)

ivory shadow
#

I'm glad I haven't bothered calculating fishing percentages for Almanac at all.

#

Just "where can you catch this"

rain apex
#

so do you think this algo would be faster than the sampling done in fishing overlays think

rotund violet
#

Hard to imagine being slower than 100x per tick. But on the other hand it's python.

rain apex
#

well i imagine you would rewrite it in C#

cinder karma
#

Nah, I'm writing it in the NI flavor of assembly

safe dragon
#

python is very good at being impressively slow at the simple act of looping over something

cinder karma
#

No

#

Everyone is slow once O(n!) Is involved

#

It's not pythons fault here

safe dragon
#

I will defy mathematics itself

fleet wren
#

a fish's catch chance is 50/50, you either catch it or you don't

cinder karma
#

I imagine in three or so years they'll drag me off to the insane aslym

#

Mumbling stuff about symmetries and collapsing cases together

safe dragon
#

you'll get through this

#

Hopefully

#

whatever "this" is

#

who was the one who was in pain due to having to migrate from Microsoft access again

cinder karma
#

Not me!!!!!

safe dragon
#

a job I interviewed for today apparently involves a big Microsoft Access thing they really want to migrate away from

#

well it doesn't seem to be the main database at least so it's something

cinder karma
#

So how are we doing this Thursday?

austere comet
#

Too late to ask; it's already Friday here 😔

rotund violet
#

Microsoft Access

Well, it's better than Excel...

ivory shadow
#

Microsoft Access still exists? Oh no

cinder karma
#

Times I have used stupid sed scripts to edit latex files += 1

safe dragon
ivory shadow
rotund violet
#

If Microsoft killed Access, I think half of all small businesses would die overnight.

#

My experience - no business with more than 1000 employees would be caught dead using Access for anything important, and no business with less than 100 employees knows how to do anything more sophisticated.

#

(Except tech startups, but they obviously don't count here)

cinder karma
#

(I'm laughing because I'm not gonna bet on the tech savvy of tech companies.)

rain apex
#

cant they just put their stuff in a sqlite db somewhere

fleet wren
#

that's already two words too complicated for a usual mom-and-pop shop owner

rain apex
#

i xkcd 2501 myself huh

cinder karma
#

Chu/e, what about having everything on your HD

fleet wren
#

(ok they probably use Excel. maybe something slightly bigger)

cinder karma
#

In excel

#

Verislned controlled the lawyer way

#

_v2

#

_v3

#

_final_for_real

#

_final_for_real_seriously_jerry

rain apex
#

i suspect its nda stuff rather than not knowing what a cdn is though

raw pelican
ivory shadow
#

Somewhere out there is a billion dollar company still using Microsoft Access for huge important things because the dev was foolish enough to declare "this is just a temporary implementation"

sand frost
fleet wren
#

yes the rocks one

cinder karma
#

Raise your hand if you trust AI to read a datasheet

ivory shadow
#

You didn't say correctly so...

rotund violet
#

And they've been responsible for some notorious outages.

cinder karma
#

sigh

raw pelican
#

look, if it works it works (until it doesn't)

candid pilot
#

making progress sorta

#

i've got a surprisingly nice form for 3 fish

#

and some of how it's structured has me hoping to find a more generalizable example tomorrow

#

but um

#
from math import factorial
from time import perf_counter
#from functools import lru_cache

#fac = lru_cache(maxsize=512)(factorial)

_t = perf_counter()

inp = [.25, .5, 1]
inp_len = len(inp)
#fac_coeff = fac(inp_len - 1)
fac_coeff = factorial(inp_len - 1)

def loop_get(ind: int) -> object:
    return inp[ind % len(inp)]

def three_fish_solve(ind: int) -> float:
    c1, c2, c3 = map(loop_get, range(ind, 3 + ind))

    k1 = fac_coeff * c1
    k2 = c1 * (2 - c2 - c3)
    k3 = 2 * c1 * (1 - c2) * (1 - c3)

    return k1 + k2 + k3

def sol() -> list[float]:
    out_list = [*map(three_fish_solve, range(inp_len))]
    out_sum = sum(out_list)

    return [i / out_sum for i in out_list]

print(sol())

print("Time:", perf_counter() - _t)
#

not good python, sorry! i wrote this after spending like 2 hours just doing math on paper (related and unrelated to this problem)

safe dragon
candid pilot
#

i can share more of what i learned tomorrow! i've got to sleep rn though

bitter kiln
#

Nice!! fwiw I get similar values for 3 elements, so im curious to see how it goes with something like 10

#

good chance that the reason i get a similar time is just hardware diff though :P

#

ah yeah. running it in mine I get 0.0001476..., yours is faster by default. nice SDVpufferheart

#

fwiw, out_sum could also be factorial(len(out_list)), though that doesnt matter for performance here

bitter kiln
#

hmm

#

might it be true that any other given element o will appear before a given element n ((m!)/2) times? (where m is the total amount of elements)

bitter kiln
#

mmm even if so i have no clue where id go with that

#

i genuinely have to give up on trying with this 🥲 i get headaches trying. good luck yall, im just going to finish sorting into sublists by precedence

candid pilot
#

promising progress on a simpler form

candid pilot
#

yay math

bitter kiln
#

yepp SDVpufferwaaah

safe dragon
#

i have no idea what that even means

#

why is there set theory in my math formulas

#

what does the delta and then a vector mean

#

or is that a binomial

crystal wren
#

So I discovered something about the new 2.8K Framework display.

#

Thing supports FreeSync, which I don't think I've seen advertised or mentioned anywhere. So that's nice.

devout vault
#

What's FreeSync again? Is that an AMD thing?

crystal wren
#

It's a VESA standard!

#

Nvidia supports it too now, and I think newer Intel things?

devout vault
#

What does it do?

crystal wren
safe dragon
#

reverse vsync essentially. Instead of your game trying to match your monitor's refresh rate (or some clean division of it) your monitor adjusts its own refresh rate to match the game frame rate(or some clean division of it)

pliant snow
safe dragon
#

adaptive sync tech basically allows you to avoid tearing and give a smoother experience without needing to use vsync which has a lot of drawbacks

devout vault
#

Interesting

safe dragon
#

been around for like a decade

devout vault
#

It's probably been a decade since I did much standalone game stuff, still thought vsync was the way to go

rain apex
#

freesync is pretty common now

#

even my 100 bux 🥔 monitor has it

safe dragon
#

freesync monitors don't generally really cost much more which is a big benefit

#

gsync (nvidia's proprietary offering) requires special hardware to be installed and a license fee so those monitors are expensive as hell

pliant snow
#

yeah I think gsync kinda died off

safe dragon
#

my monitors have the barebones original freesync protocol which isn't too great

ivory shadow
#

I heard recently that Nvidia is letting some display chip manufacturer include gsync compatibility to make gsync monitors cheaper.

#

Or... something like that.

#

I assume because gsync is stupid and expensive compared to every monitor just having freesync, which also works

#

Sure, gsync could be better but I think most gamers think it isn't hundreds of dollars better. And I have absolutely seen that kind of price difference for gsync monitors before.

safe dragon
#

in the original iteration of freesync, gsync genuinely had enough features to warrant costing extra for people

#

but nowadays I would never spend that premium

#

I mean I wouldn't in general cause I have an amd gpu but in a hypothetical scenario

crystal wren
#

Yeah, the original iterations, Gsync was just objectively better ignoring price.

rotund violet
#

My G-sync capable monitors weren't that expensive, did the cost go up in the last year or something?

candid pilot
rotund violet
#

It's generally great for games but both freesync and G-sync can bug out with some apps and cause weird screen flickering, so I'm sometimes having to turn it on and off.

candid pilot
#

&& set theory is badass that’s why

devout vault
#

Hmm, Project Fluent's identifiers only support [A-Z0-9\-_] (case insensitive). I wish it allowed . or : or something else too

#

I could just use _ I guess...

safe dragon
#

been meaning to look into project fluent

#

localization solutions have always felt very inadequate

devout vault
#

It looks like the way Linguini (this C# project fluent implementation) works, it keeps comments, so I might be able to achieve what I want by using a postprocessor and having something like #context module.id

candid pilot
#

@bitter kiln sorry if you don't like pings. do you have a 100% working version? (even if slow!)

#

in python. because i'm close

#

ignore the test/success bits

bitter kiln
#

Yeah! and it's fine, I mention in my status that im fine w/ pings

def get_probs(prob_list:np.ndarray):
    sum_probs = [0]*len(prob_list)
    prob_list_inverted = 1 - prob_list

    for permutation in itertools.permutations(range(len(prob_list))):
        for iter, i in enumerate(permutation):
            if iter == 0:
                sum_probs[i] += prob_list[i]
                continue
            values_before_element = permutation[0:iter]
            inverted_before_element = [prob_list_inverted[e] for e in values_before_element]
            current_prob = prob_list[i] * np.prod(inverted_before_element)
            sum_probs[i] += current_prob

    total_permutations = factorial(len(prob_list))
    final_sums = [i/total_permutations for i in sum_probs]
    return final_sums

this is the working O(N!) version

candid pilot
#

thanks!!

bitter kiln
#

np! SDVpufferheart

candid pilot
#

im so close to getting this working

bitter kiln
#

Oh i was at that at some point

#

and then I realized after adding in some other numbers that I was overadjusting for those values

#

try this one

#

sum is 0.983125 (0...1 for floating point error too, most likely)

candid pilot
#

i get [0.042619766940008644, 0.10951661631419941, 0.3736512731981011, 0.47421234354769104]

#

hm

#

infuriatingly close 😭

bitter kiln
#

yeahh, getting very close! at the very least, its a fast approximation

#

i've been going at the code for the whole thing in the meanwhile, and im getting decent results so long as i limit things to small chunks below 10

#

Takes around 0.75s to run for the basic areas, fairly inflexible for other areas though

#

and of course, looks terrible due to the lack of being anything besides debug output. but it's there once more

#

yeah like issue #1 im counting trash stuff as 25 coins from sum and not avg. woops

#

alright, already patched that one up

candid pilot
#

this is the n! one?

bitter kiln
#

yes

#

its just barely able to work because im forcefully processing the chances as individual lists by precedence and then stitching them back together

candid pilot
#

Hz: 67.32
Time: 0.01486495

i got this with 15 items yay

bitter kiln
#

nice!! (what's the hz stand for?)

candid pilot
#

hertz! actions per second (based off of the time it took to run)

bitter kiln
#

ahh, i read it as frequency but thought that surely couldnt be right. neat

#

i havent seen i/s shown as Hz, that makes sense

candid pilot
#

i don't know if it's something other people use but like

#

hz is actions/sec to me so

bitter kiln
#

i would imagine so, its not a stat i tend to look at but i dont usually get myself into performance besides for enjoyment/learning 😅

#

still need to filter out stuff like qi beans and squidfest with params, getting there though

#

oh woop, average coins/xp needs to consider the weight

#

mainly i need real data to compare against

rain apex
#

i thought secret notes are 0g

bitter kiln
#

its price is listed as 1 in objects.json, which is where im getting that from

#

same for qi beans

#

ah, yeah, and just realized that the proportion values reported are within the lists segmented by precedence and have yet to be adjusted

#

oh, wait, nope, this whole thing was me being foolish. this cant work anyway

#

i need the whole list. cant believe it took me that long to realize. im just gonna rest

#

at the very least i have the framework ready to plug in some other given algo as long as it takes in an nparray and outputs one with the results in the same indices

candid pilot
#

thought i fixed it

bitter kiln
#

yeahh its tough

#

been driving me wild too

#

im basically just going to keep on improving the code from as it is now tomorrow, its a mess and id like to standardize it and add some saving of the loaded json data as py objects / the result data, and show it graphically, add a exe, etc

candid pilot
#

exe?

#

why

bitter kiln
#

double click go brr, people dont need to open a cli 🤷‍♀️ also, its trivial to do

#

thats last priority, but i tend to do it for the projects i like along with other things to improve qol in whatever ways

candid pilot
#

very os based

rain apex
#

r u do py to c type things

bitter kiln
#

easy

candid pilot
#

is there like a terminal script that's univeral. prob not idk

bitter kiln
# candid pilot very os based

🤷‍♀️ you are right, though just by setting up the ability to make the exe it would be easy for anyone else to make it. but at that point they can just run the program

#

at least some people benefit

rain apex
#

if you install git for windows then u would have bash

#

prob covers most ppl who would run this

bitter kiln
#

current instructions to run is just invoking python

#

as far as im concerned anyway SDVpufferthumbsup

#

but yes i do things the way i do. im more concerned about making the code less terrible and more bug-free before any of that

candid pilot
#

i can dm you what i have rn if you want

#

(not accurate? but)

bitter kiln
#

u can but imma be asleep

indigo mistBOT
#

@bitter kiln You leveled up to Cowpoke. You can now speak in our voice channels and share images in all channels!

bitter kiln
#

grr bot

bitter kiln
#

hmm maybe my splitting works / still was the right move after all?
if i instead model some list of probs by precedence as 2d lists, if i have like
[[0.5], [0.25, 0.5, 1]],
which gets
[[0.5], [0.10416.., 0.022916.., 0.6666..]]
when done individually for all the avg. proportions, each array after the previous should need each element to be multiplied by (1 - sum(prev)) to account for the chance the previous one fails overall

#

makes sense since if the lists were reversed, the sum of the 0.25/0.5/1 array would be 1, and 0.5 would then turn to 0 as its impossible to get to it

bitter kiln
#

yeah i think that does it

#

it at least ~= 100%

#

though in some places lke here it suggests trash is impossible to catch, which is false

#

where's that mod that does the monte carlo method? id like to see what the real proportions are..

#

oh wait its right

#

smallmouth bass is 100% for some reason

#

does... do general requirements also have a chance that's checked against?

#

huh, no. so what in the world is going on here

#

yeah, fishing mod samples trash at a 5% chance. IDEK. guess its back to code-diving..

#

oh of course it does another random check for fish in fish.json. ok, here we go again...

bitter kiln
#

there, that's a little bit better

#

before i go any further im going to revamp the code as a whole

#

because this is going to be straight up unmaintainable in 5 days when i forget what it does. but hey, it almost works™️

safe dragon
#

nothing quite like arrays of arrays of arrays of arrays

bitter kiln
#

999d arrays SDVpuffersquee

#

what do you mean you dont know how to traverse it? all you need to do is key by string, and then by string, and then by int, and then by float, and then by object, and then by string...

safe dragon
#

I have seen worse code in my life

#

I have written worse code in my life

bitter kiln
#

We all have SDVkrobusgiggle id like to read this tomorrow though, so here i go

#

ive been extracting everything into functions to try and split the logic but it mostly just buries complexity. not to mention jumping through levels of abstraction as it does

bitter kiln
#

ive just been doing some off track things like pickling relevant data, the time save shown is kind of moot but it's nice to see (and the code quality gets improved along the way, more importantly!)

#

this is it being called from unpickled files vs. above, the json directly

#

(and for context again, the results above are exaggerated -- this is the time from calling main() 50 times, which loads objects from Object.json, Locations.json, and Fish.json)

bitter kiln
#

LOL to the N! complexity function being cheaper than unpickling the objects

candid pilot
#

probably faster to use json?

bitter kiln
# candid pilot probably faster to use json?

Definitely, the reason I use objects is that I prefer the variable access and the types already being established -- I also read less in file contents overall as I ignore a lot of variables in the JSON that aren't necessary to this program

#

I could have done either, and the total time would be still under a second, but the way I wrote it currently feels cleanest

uncut seal
#

I'm starting to hate C#, it feels like there's no way to do what I need. I'm trying to create a wrapper for all my property parsers, the wrapper has a generic type T because I have a class for every property I want to wrap in it. The wrapper need to be able to either:

  • call a constructor of T with arguments.
  • call a static function of T that would return an instance of T containing the parsed data.
    Both need to have the raw data passed as arguments to properly initialise T.

I spent 2 hours googling variations of this, finding results about factories, interfaces and factory interfaces, but I still don't understand how i could do this:

  • calling a constructor with arguments on a generic type is a big no no, even with a constraint because constructors can't be abstract or inherited from what I understand.
  • having a static method in an interface is a big no no, so I can't ensure that my property parser classes have this static method.
#

Any C# connoisseur can help me with this?

ivory shadow
#

Interface with a static abstract method for construction the each class overrides to construct itself?

#

Static abstract methods on interfaces should work in .net 6 and up, I think? Unless I'm being an idiot because I'm still waking up

cinder karma
#

Godddd docstrings suck

#

You wouldn't have needed your own damn syntax if you used a common one, python

ivory shadow
#

Python: Explicit is better than implicit.

Also Python: if the first thing inside a method is a multi line string that isn't assigned to a variable, treat it like a help string for the method and save it

uncut seal
#

Adding <EnablePreviewFeatures>True</EnablePreviewFeatures> to the <PropertyGroup> of the .csproj (and restarting VSC) does not fix this error.

crystal wren
#

Language version set to preview too?

uncut seal
#

no, I have this:

    <PropertyGroup>
        <LangVersion>11</LangVersion>
        <TargetFramework>net6.0</TargetFramework>
        <EnablePreviewFeatures>True</EnablePreviewFeatures>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <GamePath>$(SVPATH)</GamePath>
        <GameModsPath>$(GamePath)/Mods (dev)</GameModsPath>
        <EnableHarmony>true</EnableHarmony>
    </PropertyGroup>

The link given in the error doesn't show anything else than setting TargetFramework and EnablePreviewFeatures

#

Here's the whole code for now, the issue is the declaration of make in the IProperty and its call at the end: apparently, I have to cast it to T, and it doesn't feel right...

using Newtonsoft.Json.Linq;

namespace FurnitureFramework
{
    interface IProperty
    {
        static abstract IProperty make(string UID, JObject data, string rot_name);
    }

    class DirectionalField<T> where T: IProperty 
    {
        List<string> rot_names;
        JObject data;
        string UID;
        List<T?> values = new();

        public DirectionalField(string UID, JObject data, List<string> rot_names)
        {
            this.UID = UID;
            this.data = data;
            this.rot_names = rot_names;
            values.Capacity = rot_names.Count;
        }

        public T this[int i]
        {
            get {
                if (values[i] is null)
                {
                    values[i] = T.make(UID, data, rot_names[i]);
                }
                return values[i];
            }
        }
    }
}
#

it's setup to do some lazy loading too, but it's still pretty simple

crystal wren
#

Testing it on my end, and yeah, even setting the language version to preview and adding the allow preview features setting, and it's still not happy with it.

uncut seal
#

Alright, I have to go sleep, I'll try again tomorrow with other methods.

safe dragon
#

honestly I'd already be miserable developing C# code in vscode

#

most of the time I can't even get it to work on any of my real projects

#

it's usually unusably slow even when it does kind of ish work sometimes

#

the reason you're still using .NET 6 is cause of sdv right

#

if at all possible I'd just go for an empty constructor and then having an initialize method it calls that does what the constructor would otherwise do

#

you would allow for a moment of invalid state though

#

I've never actually done this before interestingly

cinder karma
#

At this point I would prefer a compiled language

#

Where the fuck are you even finding that version of the file, python??????

#

deletes a pile of cached files

pliant snow
#

you have some cursed issues

cinder karma
#

Ugh. Python is not the right language to use for this lol

#

(But the alternative is labview so I suffer on. )

bitter kiln
#

improved the terminal view and overall code SDVpufferheart thats all for today i think

#

the values are probably still off, but they're better than when i woke up

#

(or maybe not, considering some of the heavily coupling i enabled between classes)

#

the main big thing is that the total values now consider element proportions before getting the average coin/xp

#

Oh, it might actually be close, too..? chances are the fish overlays mod ive been using reports 5% trash by reporting river jellies as trash.. not sure

rotund violet
# uncut seal Here's the whole code for now, the issue is the declaration of `make` in the `IP...

Not sure about this feature preview and have not attempted to use abstract statics, but the (relatively simple) workaround in older language versions would have been to simply pass a delegate into the DirectionalField constructor. Are there a huge number of IProperty implementations and/or is DirectionalField being created by reflection or some external deserializer, or do you have control over their construction?

candid pilot
somber aspen
safe apex
#

Why do I end up needing to do work work over the weekend instead of my own work :(

cinder karma
#

I would say something about work life balance

#

But my work life balance is that work lets me knit in meetings

cinder karma
#

well I don't know why I expected google to read my mind here

safe apex
#

20% done in completion. Most are partially complete.

#

very low level Unreal C++ stuff along with rendering

cinder karma
#

Spooky stuff

safe apex
#

not really; main annoyance is maintaining compatibility.

#

well, spooky stuff maybe for people who aren't me. I'm weird.

cinder karma
#

Well, I find it spooky and impresive

safe apex
#

I enjoy low-level C++. I very much enjoyed writing a bootloader in C++. I also enjoyed writing a toolchain wrapper so that I could compile the bootloader and partial kernel in MSVC.

cinder karma
safe apex
#

Have you considered expanding the week to accomodate?

cinder karma
#

Lol

#

To be fair it's not like I need much

uncut seal
uncut seal
# rotund violet Not sure about this feature preview and have not attempted to use abstract stati...

Oh god, delegate is a keyword I saw Yesterday but forgot to look into...
I would have 6 or 7 IProperties, they already exist but I'm trying to do some generalized code to make it more readable for me and others. I can do whatever with constructors and stuff, but as I said, I'd very much like to have a single constructor with arguments to make sure there's a single initialization and no empty IProperty instance.

rotund violet
#

Delegate's just the older version of Func that lets you actually name it. Which typically I do once Func starts exceeding 3 or more generic args.

bitter kiln
candid pilot
#

oh alright!!

bitter kiln
#

Anyone wanting to use it for mods, if it ever is the better option, is welcome to over the monte carlo method SDVpufferheart I did put it onto a repo for that

#

I hope it can be useful in some way to people that are not me

rain apex
#

hm the main thing is obtain fish list right bolbthinking

#

could just use the game's function for that one at start of day

rotund violet
#

Technically that is not a fish list, it is a spawn list which includes a mess of conditions, item queries and other madness.

candid pilot
#

it is written in python

stoic gazelle
#

In C# is there a way to tell if a method that is being called has the override modifier? Like if Rectangle has a GetArea method and Square overrides that GetArea method and then code calls something like shape.GetArea(), is it possible for my code to notice that we're in an overridden method (and maybe but not necessarily that it's specifically Square's version)? (yes, this is SDV related, but figured I'd ask this one here since it's much more generic)

rotund violet
#

I guess you could use StackTrace/StackFrame but you really shouldn't do things like that. Where this is a little less sketchy/dangerous is when you're using reflection to get a particular method and can use BindingFlags.DeclaredOnly to filter out any inherited methods (meaning you'd only get a result if it's overridden).

It makes sense in reflection because you're actually dealing with types. To check that during the actual overridden method call you would have to unwind the stack. If you're trying to attach specific behavior to a specific override then a better way is to patch that override (prefix, postfix or transpiler, all are OK).

rain apex
#

Tbh i am bit confused about why you want this, maybe it's better to talk about the specific application in #making-mods-general

stoic gazelle
#

Thanks - that's useful enough. I'm brainstorming how to deal with an unlikely edge case but I'm probably better off focusing my energy on other parts of my code for now.

uncut seal
#

The abstract static issue has been resolved, I had to annotate my methods apparently:

using System.Runtime.Versioning;
using Newtonsoft.Json.Linq;

namespace FurnitureFramework
{
    [RequiresPreviewFeatures]
    interface IProperty<T>
    {
        public abstract static T make(string UID, JObject data, string rot_name);
    }

    [RequiresPreviewFeatures]
    class DirectionalField<T> where T: notnull, IProperty<T>
    {
        List<string> rot_names;
        JObject data;
        string UID;
        List<T?> values = new();

        public DirectionalField(string UID, JObject data, List<string> rot_names)
        {
            this.UID = UID;
            this.data = data;
            this.rot_names = rot_names;
            values.Capacity = rot_names.Count;
        }

        public T this[int i]
        {
            get {
                T? value = values[i];
                if (value is null)
                {
                    value = T.make(UID, data, rot_names[i]);
                    values[i] = value;
                }
                return value;
            }
        }
    }
}

I also fixed the warning about values[i] being potentially null in the getter.

devout vault
#

Wait, abstract static is a thing now? SDVpuffereyes

uncut seal
#

yeah, but you have to fight for it

crystal wren
#

...they need to be annotated!?

#

Well that explains it being unhappy for me.

uncut seal
#

Huh, now every class implementing IProperty<T> and classes having these implementations as attributes have to be similarly annotated.

uncut seal
# crystal wren ...they need to be *annotated*!?

well, even the docs says that setting EnablePreviewFeatures to true in the csproj should be enough. Now that I've annotated, it compiles event with the csproj reverted to remove the preview features mention.

ivory shadow
#

I wonder if a targets file you were including somewhere has preview features turned off and that's why it didn't work

safe dragon
#

why is it considered a preview feature

#

is it cause you're using a .net 7 thing in .net 6?

#

I've never tried to use a C# version newer than the dotnet version

thin estuary
#

i don't think you'll be able to use it at all

rotund violet
safe dragon
#

rust in general sometimes makes you want to punch a hole in the wall

#

the polonius borrow checker will help

#

which should arrive with the new rust edition being released early next year

#

should stop complaining about a few situation where you aren't borrowing something twice but it thinks you are

pliant snow
#

Which is considered better behavior in Rust -- if I have a function that takes in, say, any u8 value and does some operation on it, should that be a u8 Trait for just a regular function

#

I'm not sure using a Trait has any advantage what so ever, but it does feel fancy

rotund violet
worn remnant
#

Real Soon Now™️ is a classic vaporware timeline

safe dragon
#

I'd go for the "definitely totally" interpretation

rotund violet
# pliant snow Which is considered better behavior in Rust -- if I have a function that takes i...

I have used num_traits, for example for a lerp type function that can work with any primitive. But I wouldn't use this just to implement lerp, only if I also wanted a Lerp trait which was built into some larger system of traits, etc.

If you look at .NET's Random you'll see a similar thing between Xoshiro128 and Xoshiro256; could easily be done with a numeric trait, both implementations are effectively identical except for the data type.

Basically, you'll know if you need a numeric trait vs. just the numeric type.

safe dragon
#

from what I can find the closest to a "this will happen" thing I can find is that bringing polonius to nightly is on the 2024H2 roadmap

rotund violet
#

Ah well. At least we're used to disappointment by now.

safe dragon
#

we'll have it, eventually

rotund violet
#

Polonius is operating on Duke Nukem Forever time and we'll just have to deal with it.

safe dragon
#

let's hope it's better than duke nukem forever

rotund violet
#

Hope, yes. Plan? Mmm...

safe dragon
#

polonius releases and it actually just makes the borrow checker worse

rotund violet
#

Haha, but that I actually do not expect from the Rust community. When they release something, it works.

safe dragon
#

yeah I don't think they often release something that doesn't work

#

it's not like... was it zig?

#

I know there's some competing language that has often has pretty serious bugs in stable

rotund violet
#

I can't think of anything other than Zig that claims to be a Rust alternative.

#

Nim, maybe? But I think it's just a transpiler.

pliant snow
#

I have used num_traits, for example for a lerp type function that can work with any primitive. But I wouldn't use this just to implement lerp, only if I also wanted a Lerp trait which was built into some larger system of traits, etc.
Yeah, that's fair. This would be a trait that could easily be a function and wasn't using any traity benefits. I'll just make it a function

safe dragon
#

I don't think Nim attempts to compete with rust or zig

#

luckily aquo is here, our local expert on nim

rotund violet
#

(Fwiw, I eventually ditched num_traits for that particular use case in favor of a macro implementation, because of the orphan rule and ambiguous trait implementations and yadda yadda... basically, as soon as you provide a blanket implementation you close the door to any custom implementations, maybe Polonius will fix that.)

pliant snow
#

Nim is the future

#

maybe

safe dragon
#

just gotta figure out the future of what

pliant snow
#

Nim I think wants to be a compiled Python more than anything

#

It kinda wants to live in the same space as like C++

#

but not entirely

safe dragon
#

julia wants to be python but fast and nim wants to be python but compiled(and fast)

pliant snow
#

and sometimes JS

#

when it feels like it

safe dragon
#

oh and there's mojo which also wants to be python but fast

#

how many languages are there that want to be python but fast

rotund violet
#

Do we count python in that list?

#

Or does python not even want to be fast.

safe dragon
#

if python has any goals of being fast then I'm surprised

pliant snow
#

Sometimes python doesn't even want to be python

rotund violet
#

I would say "nobody wants to be python" but apparently some do.

pliant snow
safe dragon
#

no one wants to be python but everyone wants python's users

pliant snow
#

It's literally just a get_bit function for both u8 and u16. It just needs to take a bit index and return a boolean (I'm more surprised this isn't a built-in trait tbh). I could write the same function twice, but I feel like there should be a fancier way...

safe dragon
#

the standard answer all programmers love

#

there's a library for that

#

add a new dependency just for that one thing

pliant snow
#

That seems to be the rust way

#

but i refuse

rotund violet
#

I think there are two factors in Rust's defense here: first, often the crate for it is really small, it literally does the exact thing you're looking for and nothing else and there's no downside to using it; and second, you're pulling in the actual source so you're not creating DLL hell (although package version conflicts can bite you if it isn't semver'ed properly).

#

But there definitely are bloated packages out there that I would refuse to use to solve a minor problem.

#

As for bitfields in particular... yeah, I use the bitfield crate.

bitter kiln
#

paid for the whole cpu im gonna use the whole cpu

#

I really should just have the algorithm in rust or smth at this point but surely its fine

#

the beach is the only place that seems to have a length of 10, which is basically the breaking point for this alg

safe dragon
#

you should never build something in rust cause then you deny yourself the satisfaction or rebuilding it in rust

bitter kiln
#

true

#

just the pain of getting my way in lower level languages where i (deservedly) need more lines of code for the same thing

safe dragon
#

I've been asked before by my boss whether it'd be good to judge people's performance by the number of lines of code they've written

#

in this scenario rust is clearly superior

#

and C# is brilliant

#

haskell people crying with their dum little concise code smh should've written more lines

bitter kiln
#

any boss that does that... eugh. im sure ill end up having to deal with someone who would say or do that at some point too

bitter kiln
safe dragon
#

true

bitter kiln
#

local random sampling mod cant handle sea jelly (this randomly pops up as 18%, which is very not true)

#

but anyways ye, this is what i have compared to letting the fishing info mod gather information for a few minutes in the beach, same time/place/weather

#

excluding the last 3 on my list (which the info mod seems to not want to report), seeing everything be +-1% from random sampling is amazing to me

candid pilot
#

yayy :)

bitter kiln
#

this is with hardcoded assumptions for like, lv10, so im going to real quick just write up a player obj and see what i can do

rotund violet
bitter kiln
#

🤷‍♀️ i'm here because the thing im making isnt technically a stardew valley mod, but if it counts enough, I can move it to #making-mods-general

#

im just not sure which channel is more appropriate

rain apex
#

Off topic implies not stardew

bitter kiln
#

fair enuff

rotund violet
#

I'm not trying to play topic police, just being mindful that the majority (or at least a significant number) who frequent this channel don't even play SDV, never mind mod it.

safe dragon
#

that's me

rain apex
#

Crumble are u going to play haunted chocolatier when that comes out

safe dragon
#

I am in the haunted chocolatier server so I will

#

though I joined cause my friends were there

#

I'm not particularly excited about hc but I'll play it

cinder karma
#

Which I like

somber aspen
#

Much like stardew

#

He wants it to be a surprise

#

Plus then we get 2 games for life for the price of one fairweather double A game

#

Since our ape and savior is the type who just never finishes a, project (one of us)

somber aspen
# safe dragon and C# is brilliant

I love c#, it was my first love (winforms represent lmfao), and even tho I'm a python architect/lead now, God c# slaps the eberloving crap out if it, python just has all the libs I need for my job and I value my time too much to port 38 diff api modules.

#

In c# I know what's broken BEFORE I launch it

#

If you want that in python u always end up u turning on type checking for 4 seconds before turning it back off again cuz it's so bad

#

So in python I'm there launching the bot/program some psychotic number of times while adjusting code/break pointing /stepping thru

safe dragon
somber aspen
#

No ty

#

Lmao

#

I respect rust and all (I ❤️ paru)

#

But I finally am coming to terms with OOP as I took on the responsibility of giving out tasks/sprints

safe dragon
#

because pretty much all C# frameworks use runtime reflection there's actually a pretty significant number of runtime exceptions that would not occur with compile time "reflection"

#

my biggest gripe

somber aspen
#

That's true

#

The good ol try catch

#

The try and who gives a F

safe dragon
#

I've used C# professionally for a few years now and probably will continue to for many more years cause it just kinda dominates the market here I feel like

somber aspen
#

In the USA?

safe dragon
#

netherlands

somber aspen
#

Imo dot net core is the best api framework

safe dragon
somber aspen
#

Ofc

#

And dot net just dominates backend

safe dragon
#

probably the only product they've really nailed

somber aspen
#

For real, so clean

#

And fast asf

safe dragon
#

and then it get progressively worse down to fuckin .NET MAUI at the bottom my beloathed

somber aspen
#

I've been using fastAPI but man the scalability just ain't there

#

Maui rip

#

Mowie

#

Ouch owie

#

Blazor

#

But we got avalonia to clean up that mess

safe dragon
#

blazor is... well I use blazor professionally I have very mixed feelings about it

somber aspen
safe dragon
#

blazor is incredibly powerful and versatile but you fuckin look at it wrong and it's footgun that destroys your site's performance

somber aspen
#

Community is miniscule for avalonia

somber aspen
#

Regrettis*

#

I tried

#

So you're a cross platform Dev,

#

What do you honestly think of winforms

safe dragon
#

I actually only develop for windows really

somber aspen
#

I really think for mock ups for like, companies stuck in the past

#

It's really good

safe dragon
#

fuckin winforms can burn in the deepest pits of hell

somber aspen
#

And I think there's ab insane market for it that's not tapped into kinda

safe dragon
#

lmao

somber aspen
#

Lmfao

#

It is pretty awful

#

But for a mockup desktop app done in 2 hours

#

Way better than wpf

safe dragon
#

we have a gigantic old visual basic .net WinForms application

somber aspen
#

But any scalability, fuck winforms

safe dragon
#

wysiwyg frameworks are nice till they very much are not

somber aspen
#

The net core winforms Def better but still trash

#

Yep when you're trying to convert it to cross platform

#

Mfw my one project is like oh yeah this'll be a breeze np

#

Oh wait, you used that class? Nvm lmao

#

"this will be a significant amount of work"

#

498 red errors

#

That project ain't ever getting updated

#

But yeah the nightmares with scale, resolution

#

Etc, it's like coding css that doesn't use percentages or VH

#

Except omfg those fucking buttons are not lined up I swear to christ

#

I pressed the line up thingy! How the hell are they different sizes. Bring to front. Wait where did my panel go

#

Yeah you know what you're right, fuck winforms lmfao

safe dragon
#

lmao

#

part of our services use telerik reporting which is essentially a winforms style wysiwyg thing. We generate labels and reports with it and man the struggle with labels where everything needs to be in the correct spot by the millimeter. Everything secretly decides to slightly more to the side or do all sorts of nonsense and it's miserable. But then when you actually want something that's responsive to size changes it doesn't work

somber aspen
#

But I will say it absolutely got me into coding at the age of 34 and I'm literally obsessed with programming now, at the onset of covid was trying to help some guy with his oculus quest sideloader application and suggested some changes cuz he was ESL, he told me to get VS, thought he was being sarcastic/mean, but I did it, and it blew me away to see an actual program with wysiwyg designer, and then the event viewer blew me away, oh I want to auto clear this search bar with escape? Just click in search bar head over to events double click on key down event, check for esc. Of course all this is doable with wpf or blazor or avalonia but like, it was so huge to me as a new programmer, lifelong scripter, to see the hard code for the visual immediately after the double click

safe dragon
#

it's very cool at the start

#

the bitterness comes later

somber aspen
#

Yeah exactly

#

Yep when you then are attached to this freak of a creation u hate so much but cannot murder

safe dragon
#

now I just want a text based template I can directly edit

somber aspen
#

Exactly, with uniformity

rain apex
#

im allergic to wysiwyg ui things

#

mostly bc it is usually a lie

somber aspen
#

Winforms should be left behind if you actually take it seriously

#

Coding, that is

#

Yeah it's usually hiding a terrible mess

#

Once you're so deep that you're making new threads for every api call you're fed up

safe dragon
#

still waiting for that perfect converter from a figma concept to a functional application

somber aspen
#

It's called gpt 4o

#

And it's terrible

safe dragon
#

and it always will be

somber aspen
#

Am I the only one who literally yells at gtp?

#

Gpt*

#

Umm like "bro you just completely destroyed the entire thing, like why are you so extra, I fixed it myself I just had to change max height to 60 percent meanwhile you're over here doing advanced trig and completely destroying my heat map for no fckin reason man what the hell "

#

It's weird how blind it gets to glaring solutions

#

It gets very one track minded

#

So you throw another thing at it while it's doing one thing, sometimes it gets most of it right and it's gorgeous, other times it just omits entire functions and shoots itself in the dick

#

New coders are rough, tho, cuz they don't understand why it ever worked, why it's broken now, how to break down what it's doing to fix it with simple, clean code

#

My buddy had this insanely advanced script for making firmware

#

And he thought method parameters were actually return variables

raw pelican
#

chat gpt?

somber aspen
#

Yep

#

had to make fun of him for a good hour or two before showing him what his own code actually did lol

raw pelican
#

I use it for error messages to get a quick explanation but I never trust its psuedocode, it's so bad when being given novel ideas.

somber aspen
#

I think gpt is just so bad at completing anything because it's pulling from a bunch of one-offs

#

No one ever writes a whole ass program in stack exchange comments

#

Yeah it's also great at like Linux issues

raw pelican
#

and yeah makes sense, glorified auto complete is only reasonable in boilerplate code that you can pull from anywhere, ask for it for something new and it immediately fumbles.

somber aspen
#

Yeah or anything big in scale or feature complete

#

It just breaks down so fabulously and has no clue how to look at the code line by line and spot the glaring issues

safe dragon
#

I've seen a fair few people in this server come in with chatgpt generated sdv mods which as far as I can tell are never even close to anything that'd make sense

somber aspen
#

Yeah but you bet your ass I started mine with 4o and it was hideous and I deleted most of it but hey, it showed me how amazing smapi and you guys are and that it is in c# and that was good enough go get me Goin

#

Bur yeah it kept suggesting button. Pressed

#

And I'm like bro I am using key combos

#

Oh you're right you need button changed, 1 min later it forgets all over again

#

There's always that breaking point tho where I just go nah fuck u gpt u just wasted 9 hours of mky time for something that has a beautiful class function right fckin there what is your problem

#

A la Just Pressed

#

Still trying to wrap my head around blocking standard input but only if input is a chosen key combo for my bind combos to slots mod

#

So far it's pretty damn useful for me already, I set L3 + square to sword, then l3 + R1 to pickaxe, l3 + L1 to bomb, and then l3 + x to food, so if I'm about to die I just hit l3+x and in that Case I forgo the suppress because bam, we eating salad at 1 hp

#

Play on controller with gf on couch so it's ideal

#

Inventory management while those dbag dragons flying at u drives me up a wall

#

I don't know if anyone else will care for the mod, but I think as with all things with code the more versatile and customizable I make it the more useful to others Itll become tbh

#

Everyone has ideas it's all about the impl

#

no matter where i go, i stray off topic

#

in the off topic chat, talking about the topic this is off topic from lmao

safe dragon
#

smh

rain apex
#

so programming amirite

#

does anyone happen to know about jemalloc and other malloc implementations

safe dragon
#

all I know about jemalloc is that it used to be in the rust standard library and was then removed

fleet wren
#

Fandom what the actual flying fuck
20% of the screen gone for some fucking irrelevant stats thing

#

Everytime I though they couldn't possibly ruin their site more than it already had been ruined they pull this shit

safe dragon
#

I see the problem. You can still see the wiki text

#

this need an autoplay video popover

#

preferably about some random different game unrelated to the article

fleet wren
safe dragon
#

that's perfect

rain apex
#

u see i am build a cpp library for work

#

and it was explode with free() invalid pointer until i stopped linking to jemalloc

#

for some reason it hasnt had a release since 2022 even tho there's been commits as recent as 5 days ago

safe dragon
#

gotta build it yourself

#

good luck

rain apex
#

oh i did build jemalloc too

#

well, coworker did

#

i dont really know what jemalloc even does beyond "malloc faster"

somber aspen
#

I feel like I've used your mods before, all of you lmao

fleet wren
#

I may also be stupid, but I feel like jemalloc vs malloc is one of those things that's like "if you have to ask, probably don't"

somber aspen
#

Yeah I don't know what malloc is and at this point I don't actually care

#

I'm sure it's something that will make me feel stupid