back to iris

nosedive

prev: recontextualize

next: contours

landmarks

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).

screenshot of a bit of configuration.nix opened in micro, with lines adding steam and i just edited to enable it

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.

steam bootstraper X client window

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.

rain world ready to play

will it even run?

oops. the game has crashed

nope.

unity native crash log

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

main menu. wahoo

i guess i’ll just play for a while?

literally the first room, but the plants are colored wrong

..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.

tutorial room with batflies

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.

“this place is safe, stay here to hibernate”

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.

survivor dead in the jaws of a green lizard, somewhere in northeast outskirts

aaaand first death, as usual through stupidity.

survivor standing over a dead green lizard in the same room

killed this guy for no particular reason. fuck this guy

survivor standing inside the tiny maze room with mushrooms in central outskirts, the one right next to the lizard outlook

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.

a family of noodleflies and a survivor staring each other down in the “two maws” room just west of outskirts to industrial gate

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.

survivor at the outskirts scavenger toll

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.

survivor on its way to the first Industrial shelter, and the sky feels like lead

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.

a sunny landscape shot of forest floor in spring, with young grass punching through dead leaves

this is not a proper replacement, but it is at least pollen-pilled somewhat.

survivor in industrial pool room

this. this place.

survivor in the best room in the game

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.

a blue lizard trying to escape a little pile of agitated snails on the pool “diving board”

speaking of shootouts. this guy will probably need to check its hearing later

a slugcat in the pool room shelter, which is filled with loot, including a bunch of explosives and a hazer

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.

dnspyex running in wine

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?

melonloader (working)

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.

melon message from melon “UncrashFoulHarlot” reading “in my slop”

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.

so im gonna use a downscaled version of a random thing from my meme folder

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.

rain world correctly rendering flatmode sleep screen on my desktop.

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.

slugcat dead as hell by spider strangulation

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:

karma ladder with passages, chieftain is >50% full

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.

a room in upper citadel, with a bunch of pipes. the pipe entrances are oddly highlighted in grey

i might have found another GPU-related bug. shortcuts definitely aren’t supposed to look like this.

survivor standing on a passable floor in citadel’s east tower. the lantern makes the platform fade into the wall

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.

far end of the east bridge in citadel, the one leading to shoreline

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.

survivor holding a hazer in the citadel-shoreline shelter

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.

indoors shoreline room, with a vertical haft connecting the top to player-accessible pipe swimming section

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.

screen to the right of the previous one, an enclosed area with several small waterfalls and a hidden pipe to the flooded shelter

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).

survivor in one of the subsurface shoreline rooms, standing on a pole over water, and there is a peculiar hose to the right

literally first time noticing that this hose is a bird head tile as a prop. positively fucked up tile choice. i approve

survivor holding a jetfish next to a long dive and there’s a vulture mask on the floor

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.

survivor with a tamed green lizard in a subterranean shelter

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

survivor dead by drowning next to two handheld lanterns. it is raining

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.

survivor next to three friendly scavs

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.

iggy trying to lead survivor down into the water. a leviathan is very obviously in the water

something tells me this guy has an ulterior motive.

survivor on the wastes toll, surrounded by very excited scavs

i get a welcoming party in almost every region now. thats nice.

a very polite looking scav stepping directly on survivor
a scav party, survivor and two blue overseers in one of the wastes indoor crossroads rooms

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.

a bunch of scavs near a pipe exit, looking extremely concentrated

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:

waffles the orang cat

(wafflephoto courtesy of eden whom i cannot link on the account of it not having socials)

slugcat inside one of those small wastes towers with little windows on the side and a bit of floor

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.

survivor in the scavenger fortress

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.

screenshot of a shelter item list on a sleep screen. the player shelter has 8 (!!!) scavs and their belongings

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.

HI_C04 pool and adjacent shelter

i’m behind the moat. even scavs are forced to leave me alone for the time being.