devlog

Hi. There’s been some posting recently about wanting to cultivate more visibility and conversation around game development and our many ongoing projects. There are already many individual threads where people talk about their projects, but I thought a thread where we can cross-post updates from those threads could help bring awareness to our projects and increase conversation among ourselves, creating a little intersection for traffic to flow to and through. So treat this thread however you’d like; share links to existing threads, leave an update about how it’s going, post a compliment or reaction no matter how big or small.

If you consider yourself a game developer or you’re “just” a writer, a player, if you are a hobbyist of some kind, or an academic, a critic – come on! join us and just post already.

15 Likes

Doolittle suggested that we make replies to the OP with links to threads for individual game projects to help build a searchable network.

Pro tip: this only works when you paste a link to the thread in its whole form, not embedded.

In the Quake thread I post about my ongoing level design education and Quake map making work. I’m just a newby working on the second iteration of his third unreleased ‘first map’ which I am now calling InchRevision. I have a larger update blog post about my recent work that I’ll share maybe end of this week, but I’d like to share a snippit of that post to get things going.

So I abandoned Nameless Revenge in its alpha state to start a map project which I called InchPractice.

My number one goal with this project was to work as much within a process that would be sustainable. To me this meant that the process which would carry me to completion must be able to accommodate the incremental pace that I am relegated to due to having a full-time job and also must involve as little monotony as possible so as to remain fun enough for me to desire working on the thing for as long as it takes me. To this end I reflected on things I did wrong or outright did not do with Nameless Revenge.

The first thing that I decided to change was to build into my process a period for pre-production. What does this mean with level design? Well, according to my research (Yang & co-author; Steve Lee) it differs for each level designer, some focus more on architectural sketching while others only need a sense of experiential narrative to begin with. I needed something between the two just to get going, so I drew sketches for a while trying to discover an emotion that I could make into some kind of adventure. This was something I actually did with Nameless Revenge, as well as many of the ttrpg games I’ve acted as GM for, and it’s a tool that I by this point trust quite a bit to help me discover a direction.

After only staring at that image for about a week I noticed myself no longer exploring its emotion but thinking instead through the logistics of drawing out the space in brushes. It was time, then, to transition from an early-early dreamy interval to drawing my level layouts as a step in the direction of finally creating something stable and solid-seeming. I suspected that setting down my design early on would have made finishing Nameless Revenge much quicker. It was good to wander but always proved incredibly challenging, and destructive, when I felt satisfied by my whims and then had to stitch portions of my level together and integrate them into the adhoc design I was continuously updating. So in the last weeks of 2023 I ended pre-production on InchPractice after pushing myself to sketch out the entire map in a detailed but still usefully abstract level of fidelity.

In the larger post I’ll talk about how I actually left InchPractice behind and started up a second iteration called InchRevision. The last picture I shared from that project was from more than a month ago and its come a long way since then, so I am excited to be show off some of what I’ve done in hopefully just a couple days.

6 Likes

I work on this intermittently when I’m not happy with video game projects. It’s an OSR TTRPG. I should probably play more OSR TTRPGs like Mausritter and Cairn and Bastionland and Blackhack or whatever, but… yeah. I think I’m mostly fascinated with giving it cool names. At one point it was called DNGN FLDS, Heavy Armor, PRSTSS or whatever. Right now it’s called Kill Demons, Make Money. I should probably put some actual substance in this but whatever. Here’s the character sheet

4 Likes

Well, I posted a thread about a Godot 4 shader I wrote recently called rennet. I posted about it in the screenshots thread a little while back but I didn’t really explain much about it, and since we’ve been talking about discussing game development directly more, I thought maybe I ought to post a proper explanation of how it works. I also went into some aspects how I made the demo video (although I realize I left out how I actually got the clips themselves…it was using Godot’s new video rendering feature, and stitching the frames together with ffmpeg).

1 Like

Gonna peruse this later, but yknow ive always been sort of uncertain about what a shader eve is. I know what shaders can achieve sometimes, but that’s it.

1 Like

To quote my 3/4s of a first draft of a Vulkan book,

We’ve mentioned shaders here and there, but what actually is a shader? Speaking in general, a shader is a computer program written in a shading language, which is a programming language used to write shaders. Tautological? You betcha. It’s hard to give a rigorous general definition of the term “shader” these days because although shaders usually run on GPUs, they don’t have to, and although they’re often used in the production of visual imagery, they aren’t always. One thing that does stand out about them compared to other kinds of programs is that they’re mainly intended to be run with hundreds or thousands of invocations operating in parallel, with synchronization between these invocations generally being the programmer’s responsibility.

Of course, Vulkan is more specific about what a shader is. The spec describes shaders as “[specifications of] programmable operations that execute for each vertex, control point, tessellated vertex, primitive, fragment, or workgroup in the corresponding stage(s) of the graphics and compute pipelines” (see 9. “Shaders”). So, a vertex shader in Vulkan would be run for every vertex submitted to a graphics pipeline (see “Drawing” under “Command Buffers”).

:stuck_out_tongue_winking_eye:

Shading languages usually have strong support for linear algebra types and operations compared to non-shading languages, so, that’s another thing about them. Linear algebra tends to be very amenable to parallelization, and also applications that want to use it (for things like graphics or scientific computing) tend to need to do huge amounts of it, which is basically what motivated the creation of GPUs.

3 Likes

you get to swizzle! it’s great!

3 Likes

Yeaaaa I love to swizzle! It’s so fun honestly that I feel like it’s worth adding in to vector types in languages that don’t have it if you can.

A couple years ago I wrote a mixin to facilitate this in Ruby, if anyone has use for that:

module Swizzleable
  module ClassMethods
    def swizz_masks
      [
        [:r, :g, :b, :a],
        [:x, :y, :z, :w],
        [:s, :t, :p, :q],
      ]
    end
  end

  def self.included(klass)
    klass.extend(ClassMethods)

    min_max_swizz_len = 4
    max_swizz_len = klass.swizz_masks.map(&:length).max
    max_swizz_len = min_max_swizz_len if max_swizz_len < min_max_swizz_len

    klass.swizz_masks.each do |comp_set|
      1.upto(max_swizz_len) do |n|
        comp_set.repeated_permutation(n).each do |comps|
          klass.define_method(comps.join.to_sym) do
            out = comp_set.zip(swizz_vals).to_h.fetch_values(*comps)
            if klass.public_method_defined? :post_swizz
              post_swizz(out)
            else
              out
            end
          end
        end

        comp_set.permutation(n).each do |comps|
          klass.define_method((comps.join + '=').to_sym) do |args|
            comps.map(&comp_set.method(:index)).zip(args).each do |ndx, arg|
              if klass.public_method_defined? :swizz_assign
                swizz_assign(ndx, arg)
              else
                send(:[]=, ndx, arg)
              end
            end
          end
        end
      end
    end
  end
end

The code might look a little crazy but it’s easy to use—you just include the module in your class and define a method swizz_vals that returns an array with the components in xyzw order (up to the dimension of the vector, it’s okay if it’s less than 4). By default swizzling returns the components in a plain array, but you can also define post_swizz if you like, which will receive this array and can transform it before it gets passed back to the user. Likewise, by default assigning new values to components via swizzle assumes that the class supports normal array subscripting assignment for the object’s components ([]=), but if that doesn’t work well for your class, you can define swizz_assign, which receives the component index and new value and can do whatever is appropriate with it.

If you’re feeling saucy, you can monkey-patch the stdlib Vector with this:

require 'matrix'

class Vector
  include Swizzleable

  def swizz_vals
    (0...[4, size].min).map { self[_1] }
  end

  def post_swizz(arr)
    self.class[*arr]
  end
end

v = Vector[1, 2, 3, 4]

v.xy
#=> Vector[1, 2]

v.argb
#=> Vector[4, 1, 2, 3]

v.ptq
#=> Vector[3, 2, 4]

v.yz = [10, 12]
v.wzyx
#=> Vector[4, 12, 10, 1]

I feel like this is a nice demonstration of ZA POWAH of Ruby, and kind of underscores why I feel like it’s a bit underrated for game development maybe.

Also, if you’d rather swazzle than swizzle, this video might help.

1 Like

my last housemate suggested i learn ruby coz it was a very trans language and i have no idea what he meant by that

1 Like

resorting to broad stereotype about rail and gems :pensive:

2 Likes

this post feels too stupid for the price of flight thread but im mad that there’s no way for me to legally use artville’s business characters, a 1997 stock image series that was sold on cd. getty images acquired artville, shut them down in 2000 and destroyed their stock of CDs, the copyright for artville’s images was sold to PictureArts under their Brand X Pictures division, Picture Arts was acquired by Jupiter Media in 2005, annnnd Jupiter Media was acquired by Getty Images in 2008 (lol!). Getty Images is of course not selling the rights but that wouldn’t stop them from copyright trolling usage of the images because that is most of what the company exists to do (i mean the chances are low but not justifiable). it’s both thematically appropriate and really depressing to me specifically that Susan LeVan’s Corel Painter Corporate Nightmare World would be consigned into oblivion by business alchemy.

image

what am i going to do without the Money Cube… or the computer science graduate TF art…

6 Likes

I finally managed to finish and post my latest update on how my level design work is proceeding. The gist is that I have abandoned some cumbersome projects in favor of pursuing a work process that lets me make things, iterate on them, and learn from the whole thing much much quicker. I’ve abandoned two map projects and started on a separate iteration of the last one, which is progressing excellently. The post is long so I’ll let you chose if you want to read it or not, but I’ll share pictures of my map and an excerpt as well.

This is from my year-long map project, Nameless Revenge. It was the last bit of progress I made on it after reaching alpha. This bit is a bridge that the player would have been able to return to so they could access powerful weapons with keys they retrieved much further into the level than when they initially arrive to this bridge/castle. My inspiration was something like Yarnham bridge and Mensis Nightmare from Bloodborne, which was always the inspiration for this project from the very very beginning.

After that was completed the only thing to do was begin blocking the level. The first session was promising a refreshing break from bad habits and a grappling with new challenges as well as my known limitations. Establishing a sense of scale was the first thing to really push me. Somehow I never had to fuss over it while making Nameless Revenge, probably because I lacked the level of care I am now trying to instill with my practice. I also left that session with my mind set on tangible problems that I could mull over while away and which I could jump right back into. Terminating a day’s work with a sense of what to work on next has proven very helpful in any ongoing project I’ve taken up. Working on Nameless Revenge only confirmed this, but through the negative. Too frequently would I start work on that map without any clear goal, merely hoping that I’d have a productive day, only to walk away having accomplished not too much at all. By correcting that habit I hope to establish as much as I reasonably can a sort of rhythm for the work that is ever ahead of me.


And just when my blockout was cohering into something that may one day possess the quality of a place, and scale, perspective and the dynamics of movement were finally implicating each other and I was beginning to register during my playtests the first pleasurable impressions of space, I had to learn a lot about a problematic thing called off-grid geometry.

Instead allowing myself to let time pass and a valuable learning opportunity, after researching ways I could avoid creating off-grid geometry, I committed almost immediately ending this project to start a new one where I would redo all my work but quicker, better, and with more joy.


Thus I abandoned InchPractice and became a newby working on the second iteration of his fourth or fifth unreleased first map, which I called InchRevision. And things are going extremely well. All the work I’ve redone is better, more viable as a Quake level, and looks nicer too. It only took a week or two to catch up to where I was in InchPractice, and now I am approaching having a third of my initial design playable in-game. Though there’s still lots of work ahead of me, it seems the care I am affording through this practice is paying off in just the ways I hoped.

InchRevision is designed to be a semi- non-linear experience with a central Hyrule Field kind of hub with three dungeons connected to it. The third dungeon is locked by a key set in the house that’s in the hub, which is locked by a process that will require the player complete two other dungeons. The design totally works and the work is coming along great.



6 Likes

I’m still making the TTRPG. Some rules I am writing up.

For flexible dungeon item-ing. This is cribbed from Blades in the Dark, but I just found DURF which does a similar thing w/ their supply.

And this is d6 OSR style combat. A lot of the game is “arguing that you moved somewhere or have something that gives you an advantage”. Then rolling on that advantage and still failing I guess.

8 Likes

Is advantage a +2 or a reroll?

Advantage/disadvantage is rolling an extra die and taking the high/lower respectively

1 Like

I wrote synthesizers to generate both the waterfall and musical intrument sounds; I’m planning on doing a writeup on how they both work later for anyone who’s interested in digital audio synthesis. The music itself is my composition, and I also did the shading effects, lighting, texture animations, materials, etc., as well as the rig animation of the spectral opabinia and camera and the 3D models of the tools and purple substance in the urns. @townmap did the textures, all the other 3D models, and the rig animation of the character sitting on the machine. We arranged the environment under the waterfall together. This is in Godot 4.2, for a freelance project.

3 Likes

Wow your work here has created a spectacular sense of atmosphere. Impressive!

1 Like

Awww thank you ^^