well, if i’m recreating the pit, i first need the earth to dig it in.
i haven’t detailed it anywhere public, but i did mention that my computing situation has been less than ideal for the last half a year.
i am writing this from an uncharacteristically comfortable setup - a tower PC i bought on a flea market for about 50 US dollars, to which i then fed an SSD from one of its predecessors, an incredibly suicidal lenovo fliptop. its nix config currently does not contain steam, or much else optional (because my previous machine could barely run a web browser and had only about 60 Gb of root partition).
it’s still there so i don’t have to open the browser again.
in fact, majority of tools i used but gave up on are still somewhere in the current generation of my nix config, because in a perfect OS a package search must require two separate experimental toggles and 4+ Gb of RAM. such is the vision. apparently.
this tiny bootstrapper is cute in a very jank way. much better than its windows version somehow, despite being functionally identical.
only midway through this i realize i have a perfectly valid (hopefully) copy of rain world 1.5 on a flash drive. oh well, i guess i’m getting file validations for free.
while the grey box of dissociation is working, i can do something else, like sidetrack and check if my game backups are okay. i think last time they got corrupted somehow.
will it even run?
nope.
dxgi, of course. this thing doesn’t like my iGPU, and i don’t exactly have a discrete GPU right now, for stupid cable management reasons of all things. do i have an igpu?..
lshw says i do, and i say i do, so i do have an igpu.
well, this is stupid. i ran it through pure wine and it works, somehow. how is proton a downgrade over wine? who knows. maybe it’s another nixmas miracle or some shit.
as expected, performance is terrible, at least in the main menu, which is actually the heaviest part of the game GPU-wise, because of an unfortunate shader that does parallax, blur and like ten other things all at once in the worst ways possible.
there was a workaround for this built into vanilla 1.5, where placing
a flatmode.txt next to the executable would make it avoid
that shader. but that also broke somewhere before release, and caused
sleep screens to crash. at least that happens after things are
saved to disk.
anyways, i don’t care about that right now, i just launched rain world for the seventhousandth time. good job me
i guess i’ll just play for a while?
..oh, i don’t think these were meant to be bright purple.
this is really funny. the only time i saw this bug happen was on my old old old OLD laptop. that laptop was like, four laptops ago. it was a pretty shitty lenovo thinkpad, which was somehow still better than the netbook i had to hole up in until last week.
similarly to that laptop, this PC can’t really pull off rain world’s intended 40 TPS, although here it’s definitely not a CPU issue.
something i literally always forget is to rebind the grab button. my pinky finger ain’t built for these streets (cuh), but because the eat bind is literally the only one i change, it’s small enough that every fresh install i miss it.
i don’t know where my zxc muscle memory came from, probably some shitty flash games. rain world is, annoyingly, literally one key away from that default resting position.
i cant actually see the shelter. unmatched power of the sun
aaand here’s the crash. something in the sleep screen doesn’t know how to handle flatmode, apparently, and throws an error… which is not caught. because errors in this game aren’t caught. like, at all. there are about 4 try-catch clauses and they are all a silent exit.
first two candidates for modding, i guess? both pretty boring, but also rather immediate annoyances to remove. either way, i’m not writing code this early, so i’ll put up with annoyances.
aaaand first death, as usual through stupidity.
killed this guy for no particular reason. fuck this guy
small chambers like this one are one of my favourite spots in the game. they’re secluded and private, yet temporary to an ache. an incredible overlap of fragility and safety. perfect raw textural coziness. this feeling is probably the main motivation behind making that shelter replacement mod. not that i had the emotional intelligence to properly articulate it back then.
these guys used to trigger my fight or flight pretty reliably. i’m not sure why, it’s not like i’m squeamish about bugs. actually, i’ve been a wide-spectrum bugfucker since time immemorial. but noodleflies were creepy. maybe it’s the fleshy skin color in combination with slappiness of their wing sfx. they don’t really feel like bugs, more like a nasty tiny vertebrate trying to blend in with the bugs. craneflies? probably intended? not to offend the craneflies in the audience, of course, you are real invertebrates.
optimizer brain is hard to get rid of. i cheesed this toll for ~50 rep in a single cycle using the post-fee gift glitch. i have no idea if it’s still there in the modern versions. probably not.
optimizer is a parasite of its own. it targets the wrong metric, and it is harsher than an automated code review on an EPAM Systems internship exam. overlayed on top of general anhedonia, it can suck the life out of anything you could consider a hobby. it will take the pitiful chips of rock you managed to take out of the wall before you, it will scoff, it will throw them in your face and tell you to try better next time.
you can maybe defeat the optimizer without defeating anhedonia. you definitely can’t defeat anhedonia without defeating the optimizer.
many areas in rain world get rain well (duh), but industrial is the best at it. the sky hue produced about quarter of the way fading into the rain palette reminds me of a pollen storm. i don’t have photos of the last one i saw in person, because i was maaaaybe 14 then. even if i had a phone, i doubt it had a camera.
this is not a proper replacement, but it is at least pollen-pilled somewhat.
this. this place.
this place. this place. this place. this is what i’m talking about. this chamber and the shelter under it. this is more home than any home. this is safety. this is impermanence. i could hang posters here. this place has a bedroom and a living room. it has a moat/pool. it even has a bi-nightly neighborhood shootout to keep the rent down.
i have more fond memories of this screen than of any room my body has resided in. that is to say, more than zero.
speaking of shootouts. this guy will probably need to check its hearing later
seriously though, they even have a convenience store right next door. i want to live here instead of whatever it is right now.
somehow i’m replicating all the minute details of that previously mentioned thinkpad. swapped palette aspect colors, fps drops in rooms with too many decals, and now not running the game through steam. although here it’s not due to CPU load but rather because proton doesn’t want to cooperate. signs from above or something.
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
at System.Collections.Generic.List'1[Menu.MenuDepthIllustration].get_Item (Int32 index) [0x00000] in <filename unknown>:0
at Menu.SleepAndDeathScreen.Update () [0x00000] in <filename unknown>:0
at MainLoopProcess.RawUpdate (Single dt) [0x00000] in <filename unknown>:0
at ProcessManager.Update (Single deltaTime) [0x00000] in <filename unknown>:0
at RainWorld.Update () [0x00000] in <filename unknown>:0
(Filename: Line: -1)
after a few hours, this is getting pretty annoying, though. and because im going up, i’ll probably die more.
it’s dnspy time, then. in particular, this dnspy.
oh, funny, this one doesn’t launch through wine.
00f4:err:eventlog:ReportEventW L"Description: The application requested process termination through System.Environment.FailFast.\n"
00f4:err:eventlog:ReportEventW L"Message: Unrecoverable system error.\n"
00f4:err:eventlog:ReportEventW L"Stack:\n"
00f4:err:eventlog:ReportEventW L" at System.Environment.FailFast(System.String)\n"
this looks pretty fucked. validation failing somewhere deep inside stdlib when the app tries to… oh, shit.
at MS.Internal.Shaping.TypefaceMap.MapUnresolvedCharacters
this is because i have a bitmap font set as default, isn’t it.
apparently not.
32 bit version of dnspyex?..
ah, nevermind. WPF (or some dnspy-specific UI element) hard-requires arial, which i didn’t have. weird but okay.
liftoff.
this.scene.depthIllustrations[0].setAlpha = new float?(Mathf.Lerp(1f, 0.2f, this.fadeOutIllustration));
this.scene.depthIllustrations[1].setAlpha = new float?(Mathf.Lerp(0.24f, 0.1f, this.fadeOutIllustration));
this.scene.depthIllustrations[2].setAlpha = new float?(Mathf.Lerp(1f, 0.35f, this.fadeOutIllustration))pretty easy to spot the offender, this doesnt check if there is actually second and third illustrations.
…a bit harder to fix, because trying to edit method bodies inside dnspy gives a more, uh, advanced crash.
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 139 (RENDER)
Minor opcode of failed request: 4 (RenderCreatePicture)
Serial number of failed request: 23642
Current serial number in output stream: 23660
which means, guess what! bepinex time!!!
about 90 minutes later, it is still not bepinex time. because, you’ll never believe it, a crash again:
Unhandled exception: page fault on read access to 0x0000000c in 32-bit code (0x0261d431).
00f4:fixme:dbghelp:elf_search_auxv can't find symbol in module
this is caused directly by loading bepinex’s doorstop.
well, that’s bepinex 5. does bepinex 6 work different?
nope. even worse actually.
does melonloader work?
it does! rustaceans are good for something. sometimes.
i suppose now i make a melon?.. i like that they’re actually called melons.
and a melon obviously needs a c# project. which needs a dotnet sdk. which (on nix) needs a little more than you’d think.
…
nice. and only took like three hours total
to actually do something, i’m gonna need detours. there’s
MonoMod.exe in Melonloader’s core folder, which i already
added, i wonder if it has all the monomod stuff in it? i thought monomod
split everything between like five different DLLs.
actually, the docs only mention harmony, so i guess monomod is only there as a formality. harmony it is.
pretty easy to spot the offender, this doesnt check if there is actually second and third illustrations.
initially i thought flatmode simply doesnt fill the array up properly, but actually, i just realized there’s an entire different list for flatmode illustrations. so the depthillust is always empty. so i can’t bodge around it by adding the first element a few more times.
since there isn’t a illustration object to copy, i have to make my own. and it should probably be small, because i cannot be bothered to clean it properly.
i threw it into a new scene folder and just crossing my fingers the game doesnt actually rely on scene’s scenefolder and the illustration’s path to match.
it doesn’t. it works! i am so proud of myself. good job me.
this is what it took:
20 [HarmonyLib.HarmonyPatch(typeof(Menu.SleepAndDeathScreen), "Update", new System.Type[] {} )]
21 public static class Sleepscreen_GetBackInBounds {
22 private static bool needUndo;
23 private static System.Collections.Generic.List<Menu.MenuDepthIllustration> fakeDepthIllustSwap = new();
24
25 private static void Prefix(Menu.SleepAndDeathScreen __instance) {
26 // update
27 if (fakeDepthIllustSwap.Count == 0 || fakeDepthIllustSwap[0].owner != __instance.scene) {
28 fakeDepthIllustSwap.Clear();
29
30 var fakeIllust = new Menu.MenuDepthIllustration(
31 __instance.scene.menu,
32 __instance.scene,
33 "Scenes" + System.IO.Path.DirectorySeparatorChar + "FAKEMENUSCENE",
34 "zhzh",
35 new UnityEngine.Vector2(0f, 0f),
36 0f,
37 Menu.MenuDepthIllustration.MenuShader.Normal
38 );
39 for (int x = 0; x < 20; x++) {
40 fakeDepthIllustSwap.Add(fakeIllust);
41 }
42 }
43 if (__instance.scene.flatMode && (
44 __instance.IsSleepScreen ||
45 __instance.IsStarveScreen ||
46 __instance.IsDeathScreen)
47 ) {
48 var originalDepthIllusts = __instance.scene.depthIllustrations;
49 __instance.scene.depthIllustrations = fakeDepthIllustSwap;
50 fakeDepthIllustSwap = originalDepthIllusts;
51
52 needUndo = true;
53 }
54
55 }
56
57 private static void Postfix(Menu.SleepAndDeathScreen __instance) {
58 if (needUndo) {
59 var injectedDepthIllusts = __instance.scene.depthIllustrations;
60 __instance.scene.depthIllustrations = fakeDepthIllustSwap;
61 fakeDepthIllustSwap = injectedDepthIllusts;
62
63 }
64 needUndo = false;
65 }
66
67 }
68
honestly? better than some regionkit production code.
between writing this i managed to farm up a vulture mask and reach Shaded. i’m also carrying a hazer in my stomach. yes, you needed to know that.
oops. second death, i think. the coalescipedes’ threat level varies a lot based on terrain, and i didn’t get a rock in time. now the mask is a hindrance.
also, because i fixed the sleep screen, this is the first time i actually got to see my passages:
i should find some valuable and enter total scav overdose. you pretty much get a permanent escort at around 100 rep, and i have not seen that in AGES
yeah the mini spiders are stronger than i remember lol
they’re more effective at being jump mines than active threats.
i might have found another GPU-related bug. shortcuts definitely aren’t supposed to look like this.
one of a few palette bugs. it is both funny and frustrating when a pretty important terrain elements do this. although, this room is scuffed more than in just platforms.
citadel bridges and nearby rooms have possibly the best assembled lighting in the entire game. soft bloom on top of the muted palette and contrast with bright warm glow of handheld lamps give it kind of an ashy look. the closest thing is a weakly smouldering remains of a huge campfire.
unfortunately, i can’t watch the embers for very long, because the bloom shader is driving my framerate into single digits.
wait, hold on. shoreline is going to be just as bad or worse. because of water. fuck my stupid snail life
oh well, then i might as well go back across the bridge and appease some scavs.
you know, having this much mold right next to the bed is probably bad for the hazer, let alone me.
and the chief has been tained. grenade baboons are so easy to amuse.
there is no way this shaft isn’t here to fuck with the players who sort of learned to swim and began to feel safe in the pipes. nothing about this room tells you “hey a vulture can show up here”. yet the vulture do show up, with admirable punctuality. it’s not even a hint or a lesson, i’m pretty sure there is no other room like this.
flooded shelters as a mechanic are so inconsequential they might as well not be there. i don’t know if they were added for any storytelling purpose either. the player character timeline is already clear from many other hints, right? are they there for james’ personal gratification from fucking with people? are they an actual mechanic that was cut down? are they a genuine failed attempt at balancing the game after conditional links got broken?
i would be amused by answers to these and i’d also be damaged by answers to these. bet people did at least seventy five modhole exclusive joar QNAs that are now osmosing across the playerbase in broken out of context misinterpreted snippets. i want to lodge a screwdriver innnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
oh jesus fuck moon’s chamber doesn’t just lag, it takes my entire X11 session with it. what the hell man do i need to lower process priority??
THAT DOESNT HELP MOON STOP YAPPING YOU HAVE NO IDEA WHAT KIND OF METAPHYSICAL PANCAKIFICATION I AM GOING THROUGH RIGHT NOW AAAA
yeah okay being in a room with any sort of lighting effect is going to be a bit torturous, at least until i get to install a GPU in this thing. graffiti seem to worsen the issue, as do unflat light sources. their effects are probably multiplicative. long story short, i am not going to pebbles in this state. no fucking way.
if i’m not going to pebbles, i’m going down. shoreline underground rooms aren’t something i can easily gush about, but they are possibly the largest block of room that can still feel sort-of homey. like, a really shitty, black mold infested, overall dilapidated home, but at least you get to know it well and no one’s there to mess with you. save for an occasional salamander, but i can deal with those.
hey, i just accidentally did a waterhop trying to get through the three leech pits room! i have no conscious memory of movement tech, only random bits etched into my backbrain, such as fast-climbing (which i can’t even do well really).
literally first time noticing that this hose is a bird head tile as a prop. positively fucked up tile choice. i approve
aw man i forgot about this section. goodbye vulture mask you won’t be missed
i think the fix was the first time i actually used melonloader, AND the first time i actually used harmony. i was only vaguely aware of either’s existence and couldn’t compare.
off the bat i think i like harmony patch syntax less, because you
can’t have a variable scope shared over the prefix and the postfix, you
have to add fields for everything. although i can appreciate limiting
patches to “one target per class” on API level, since that’s the closest
C# gets to carbonara prevention. __args and other injected
arguments being optional must be good for limiting scope pollution
(relevant to me because i don’t have a language server) and dealing with
ridiculous function headers (there is a constructor with, like,
41 arguments in this game), but packing everything into an
object[] is very icky. can’t wait to get dogshit downcast
errors because harmony did some automagic conversions in there and
didn’t tell me.
navigating subterranean isssssssssssssssssssssssssssssssssss idk it’s kind of full of nothing. thats a lie its not itfffffffg i have trouble remembering it for some reason. it’s the exact kind of visually hostile. it doesnt feel homeee directly or through contrast dusty asphalt hospital plaster eighty five eighty nine i can smell mold its not the kind i like
i’m pretty sure like half the time i smell what reads as mold it is a hallucination. i checked with someone who’s got a ridiculously keen nose and the someone couldnt sense anything.
i can’t find the exit to drainage for the life of me. not like getting through drainage would be very enjoyable. this part of the game is designed directly out of someone’s ass. the ass probably belongs to an overworked james primate. lower drainage and upper subterranean is a hamfist attempt to keep players out of the “lategame” areas too early that more often than not does the opposite, it keeps you IN the lategame areas you can’t handle. like, imagine being a fresh player, patient enough to go from outskirts to drainage directly, then stumbling down the big pipe and ending up in the leech tunnels, and after leech tunnels you get to the absolute horrorshow that is subterranean, and going back is ANOTHER 5 gate. at this point your stamina is probably running out already, the region is huge, the exits are very specific, the entire west half feels like a dead end, filtration is aneurysm-inducing and the easiest exit is STILL 3-gate with a bunch of big centipedes on the only road there.
everyone would be better off if they just, like, didn’t. have a normal subregion instead of the clusterfuck lower drainage, and a 2-3 gate. no one gets locked out, no one gets locked in. no awkward afterthought funnelling. just you and the map. all you ever needed.
paving it over with melting rubber
narrative override, reflectively applied
first death by rain. i’m bored of looking for the right exit, so i’m just gonna backtrack to shorelineand go to garbage wastes from there.
looks my fireteam escort has arrived. just as i was about to head somewhere notoriously bad for scavs. playing rain world in a room with an actual window is definitely not ideal. i can barely see here, and it’s still just lower shoreline. this game is perfectly optimized for gooncave dwellers and vampires.
something tells me this guy has an ulterior motive.
i get a welcoming party in almost every region now. thats nice.
it’s pretty hard to get me to call an ape cute, but scavengers in particular are consistent. good density of bug vibes i suppose.
realization: they have the same unique skill with regards to their eyes as some real life cats. they are extremely good at looking perfectly focused on nothing at all. indescribably locked in onto being stupid. like this guy:
(wafflephoto courtesy of eden whom i cannot link on the account of it not having socials)
i feel good about these towers. there’s like two of them so they never get old. they are both very pleasant to be in and actually useful if you need to juke a vulture, save for a bit of a hiccup of climbing into them. i wanted to make a lot more of them at some point, i think. actually, i still do. tiny trash towers. hell yes.
the inside of scav fortress is surprisingly desolate considering that the area is the closest thing to a functioning permanent settlement in the entire game. it’s the lack of a ceiling and bright lighting and the overall barren structure of the space, and also the fact that scavengers don’t really hang out here, it’s more of a warehouse and maybe a bulletin board considering the drawings. thinking about it made me put my flannel back on.
bonobos so excited about me they threaten to tear the fabric of reality whenever i try to exit the 3x3 meter bedroom. we’re sleeping stacked on top of each other.
i think that’s enough garbage wastes, i’m heading home.
i’m behind the moat. even scavs are forced to leave me alone for the time being.
