Birdoggydog's Builds

Modeling the crawl grille and cyberpunk lifts in Godot

The crawl's vent grille is now a themed model that parts at the waist, worn doors show up on flat floors, and every lift in the game is cyberpunk.

This is the second batch of dungeon doors, and it clears the list I left open after the first one. The vent grille in the crawl is a real model now, in all four themes. Doors on floors that aren’t built from pieces wear like the others. Every lift is cyberpunk, whatever floor it’s on.

87 seconds: a cyberpunk lift car and its amber readout, a worn door beside a newer one, the four grilles parting, the crawl’s lid, the steampunk blast door, the eldritch bone lock and the steampunk valve lamp.

Why did the lifts need to change?

I drew a note in the game while standing in a lift car on floor 2 of the Breakout Site: “all the lifts have the wrong textures. they should all be cyberpunk”. A lift was dressed in whatever its floor was, or in the plain rusty plate when its floor had no theme. I took the note as every lift on every floor.

So one constant, LiftDress.THEME, is cyberpunk, and LiftDress.looks_of() answers it for every stop. The wall around the mouth is the cyberpunk wall, cut down to the narrow door’s width. The door is the interior kit’s narrow door, the car is the kit’s lift piece, and the housing and shaft are kit wall pieces, one course each, 4.1 m tall. Every closed side of a stop is a shaft wall too, so the car never shows a floor’s painted wall. The plain plate look isn’t used by any lift.

What went wrong inside the car?

The judging agent rode the lifts in the film and found three things, one per round.

First, a flat yellow quad covered half the car’s wall while it rode, with cyan strips sweeping past. They were a landing’s lamp panel and the cyan strips of the stops showing through the car’s one-sided walls, plus a ceiling lamp that hung in the column the car rides through. Now no lamp hangs on a shaft square, and lamps near a door sit 1.2 m off its line.

Second, red meat fronds hung inside the car at floor 2’s stop. I first checked whether the car had no back wall. It does have one, so the meat was growing into the column, up to 1.39 m of the 1.43 m the test checks. DungeonMeat.placed() now lays no wall growth on a shaft square, and no upper course or ceiling growth either.

The test that should have caught this passed because a headless MultiMesh keeps no box and no instance transforms, so the meat was invisible to it. The test now puts the meat where placed() would lay it and checks that at least two shaft squares have meat. With the fix off it fails, 172 passed and 2 failed. With it on, 174 pass and none fail.

Third, the top of every console shot read near black. I assumed the car’s ceiling, but that reads RGB 70 to 100. It was the top 0.35 m of the stop’s wall going past while the car rides, baked at RGB 7 to 11. I found it by hiding the stop and then the shaft. Pieces seen only from the shaft now get their own material with the wall’s panel gray in place of the bake, and the band reads RGB 48 to 64. I also changed the console’s “moving” readout from pale lemon (253, 251, 158) to amber, 255, 175, 2 in the film.

Why is the vent grille a model now?

The crawl’s vent grate was still bars drawn in code. I built grillehalf, one piece for each of the four themes, new and worn, so eight models. Like the blast door it is two halves and the upper half is the lower one turned about the way through, so it parts at the waist. DoorLook.grille() hangs the two halves, and DungeonCover uses them for a grate, with the old bars kept behind a switch for before and after shots.

The cyberpunk grille has a hazard strip on its outer band, and the steampunk one has a brass strap with 3 cm bolts, so each looks like its theme from 3 m. The portcullis rails were crossing in front of the bars from the sheet’s camera, so I moved them behind.

In the film the raised half of the grille hung in open air above the crawl’s side walls. I gave the crawl’s mouth a hood so the half rises behind the room’s wall and above the crawl’s lid. The lid itself looked like black void from inside, so a dim cool light under the floor of a mouth square is turned up onto it, and it looks like a ceiling at RGB 40 or more.

A contact sheet of twelve game frames with captions. Lift cars in gray plate with yellow posts, a worn steampunk door, a barred vent grille in a corridor, a red fleshy corridor with bone fangs and a purple door lock with a gray bone plate.

Twelve frames of the film: the lift, a worn door, the cyberpunk grille, the eldritch maw and the eldritch lock.

Why were floor 2’s doors never worn?

Floors made of flat faces have no interior, so no square was ever marked worn and every door on them was new. DoorLook.state_for() now asks worn_flat() when there’s no interior. It takes the interior’s share of worn squares and multiplies it by one minus the floor’s lamp upkeep, then tests that against a hash of the square. A floor with poor upkeep gets more worn doors. I wrote tests/door_wear for it.

Also done

  • The eldritch lock is gray bone with a small violet eye. It was gold-yellow like the hazard keypad.
  • The steampunk valve lamp sits 0.15 m lower, clear of the hanging lamp above it.
  • The steampunk industrial blast door’s brass is lifted like its door’s, and the blast teeth have a 15 degree bevel.
  • A fantasy door’s stain is moss gray now, with soft edges. It was nearly black, with its dark pixels averaging RGB 60, 55, 51.
  • The eldritch maw’s lower half sinks further when it opens, so its fangs don’t stand across the walk.
  • 16 door and grille models were built or rebuilt, plus 7 fantasy doors with new grime. They went through six judged rounds, and I approved them all on the review page.
  • map_lift_head still has 2 failures that aren’t from this work. I didn’t rerun the whole suite after the last change, so a clean run is still on my list.