screenshot club: share your game dev!

6 Likes

is this the right thread for this idk anyway i released a new(ish) game about driving a truck.

it requires one of those gamer mice to play and it’s pretty obtuse but hopefully some of u will like it.

11 Likes

hey this rocks

2 Likes

made it real easy for myself to change level themes by plopping one (1) object into a stage

7 Likes

This is so good

1 Like

tysm :face_holding_back_tears:

Wizardry dungeon

12 Likes

i made this:

as the description says, it’s a pile of old (and not-so-old) project files. i needed to put them somewhere and i figured maybe others would be interested in them, so here you go.

7 Likes

Recently I’ve been working on a musical sequencer, so far using curses (video—the forum software’s being a little fussy about me embedding video directly in this post, maybe because there’s several images). The colors there do change in accordance with the music although I know it’s a little hard to tell—it’s just because I have the framerate turned down low in the program to protect myself from accidental blinkiness.

Anyway, the audio you hear in this case is generated through a procedural method using oscillators and delays and all that—the actual code that produces the audio is pretty short, it’s described at kind of an abstract level. It’s kind of neat that way because small variations in the code can produce large variations in the output (video). EDIT: I forgot to mention, the waveforms you see in the two boxes in these videos are visualizations of those used to generate the sound, via wavetable synthesis. The program includes a plotter that can produce those sorts of visualizations, and a set of wavetable-generating routines. :stuck_out_tongue:

I recently reached a big milestone with this project in that I figured out how to represent the whole chain of modules or doodads or whatnot doing the audio and graphics synthesis and I/O and such as a directed graph, and learned enough about graph traversal that the program can visit each module from the input side through the processing over to the output side every frame in the right order, given any arbitrary set of modules or connections. I was extremely pleased when I got that working. :smile_cat: You can define your own arbitrary modules easily in the program by inheriting from a template (it’s C++).

Now I need to write the actual sequencer interface. :stuck_out_tongue: My idea to develop this program has been to write some interesting procedural music first, by hand, and then gradually abstract it out more and more until it it’s somehow represented as a data file the program can parse and run. At this point it’s actually fairly close to that…you can create, destroy, connect, and disconnect any kind of module through a DSL, which is ready to be connected to an interpreter (I might just stick with doing the module-connecting stuff like that, using an interactive CLI, instead of making a graphical interface, at least for now, and just give it support for rendering parts of the module graph as static images on command since that’s less work :stuck_out_tongue: ). Aaaanyway, I realized a nice way to do the actual sequencer part would be to represent a sequencer within the program as “just another module,” that just outputs like handwritten signals of whatever sort you like at certain points in time, so that you as the user can make up what the sequencer data means for audio/visual synthesis purposes. I’m planning to provide a tracker-style interface to edit the data of a module like that through…you can see a bit of that mocked-up in the background of those videos. :stuck_out_tongue:

One thing I’m on the fence about with it right now is whether to keep going in curses or to switch over to doing the graphics in SDL. curses has the upside of keeping me from getting too overambitious with the graphics, but it also imposes a certain amount of annoying busywork on you if you want to write portable curses applications, and also it lacks certain features that would be really nice (most notably the ability to detect key-up and mouse events). If I switch to doing graphics with SDL, though, I’ll have to replicate some of the work the terminal emulator is taking care of myself when I do that, on top of the potential for endless graphical yak-shaving it invites. I keep going back-and-forth about this.

As a secret side note, since this program has a concept of both audio and graphical synthesis and can respond to input events in realtime, it could actually turn out to be a secret game engine instead of just an audio sequencer. Maybe. I’m curious to investigate that as I keep going.

On a totally different note, here’s some dungeon hallway experiments riffing on the model set down by Koei’s Dungeon, generated through a small custom graphics engine using SDL and cairo:



I wrote the code for this a little while back when Lily was pining for a Wizardry-style engine. I did get it to the point of rendering side paths and things, in a more traditional vein:

At the time I felt a bit sheepish about how the bricks look kinda screwy in the far distance, but as I’ve seen more games from the early-mid '80s in this style since I wrote this, I’ve realized that many of them have various graphical eccentricities of this sort, so perhaps it’s just getting into the spirit. :relieved: This is still just a graphics renderer…there’s not really any internal concept of a game environment, it just draws random dungeon views when you press the spacebar. :stuck_out_tongue:

As a side note, of course in the traditional Wizardry-style model, it’s mechanically significant how far ahead you can see, so just showing all the paths ahead into the distance like this wouldn’t necessarily be desirable (like in the sense of the mechanics of MILWA and so on). I think it looks cool drawn like this with everything in view :stuck_out_tongue: but the effect of only drawing 1–4 tiles ahead or w/e depending on the current status is easy to achieve with this algorithm, thankfully, if does end up coming in handy.

Lily and I were just talking a few hours ago about this program and I was thinking of returning to it, since Lily still thinks a lot about making like “classic” Wizardry-esque games with just a brick texture like this everywhere and the entire world conveyed otherwise through text, with external-raster-image static sprite blitting on top of the maze view available for “encounters” of whatever sort. There’s still a lot of work I would need to do to build this up into a whole engine like that though…right now it’s written as a sketchy prototype in Ruby but this would probably be a good point at which to port it to C++, it needs some kind of map editing support, it needs an actual internal representation of the map, it needs to understand the idea of the player having a position on the map and show the right view on the screen accordingly, and it needs to do the sprite blitting and text rendering (although I don’t think that will be too much trouble actually). Then it needs like, some sort of mechanics or gameplay possibilities or whatnot :stuck_out_tongue: and perhaps scripting support on that basis. I’m also personally interested in some of the directions suggested by the first three images…so I’ll have to think about that and what that might imply for the engine.

It would be cool to me if I could somehow bring these two projects together, like if I could set up this environment within the sequencer/engine I was talking about before. That…might be a long way away still, but it would be neat. For a long time I’ve been into the idea of a “meta-engine” that you can kind of mold into your own custom engine and set of dev tools easily for each game you want to make, as an alternative to the mindset behind “monolithic”-style engines like Unity and Godot.

8 Likes

have you seen Bespoke? it mostly works with MIDI or WAV but your destination can do what it likes with those inputs

I…don’t think I’ve seen it before but I might have at some point since I regularly wander around online and look at modular-synth-type programs. It looks cool!! If nothing else, I’m definitely kind of inspired by similar things, like stuff like that in Max/MSP and also like analog hardware sequencers (neither of which I actually have much firsthand experience with honestly but I’ve watched videos and read manuals and things :stuck_out_tongue: ). In general maybe most of all though I’m strongly influenced by Csound which has been a major part of how I make music for years, and that lets you pass floats and strings around and work with them as you please—it’s just not a graphical environment.

One thing that is maybe a little different about my approach…although I don’t know, maybe it’s not so different from other things despite my efforts :stuck_out_tongue: but in any case…in my codebase the ports on a module can carry data of any C++ type you want, in a way that imposes almost no intrinsic work on the module implementor. The data can be of a traditional built-in type like double or some elaborate custom message-passing type the implementor defines or anything in-between. The ports themselves are generic, and the machinery in the codebase that supports the module template even takes care of type-checking between input and output ports at connection time, keeping them efficiently type-safe without you having to do any extra work. :wink: So, it’s kind of a more programmer-friendly environment I guess, at least if you want to define your own modules, one that maybe supplies a more convenient kind of flexibility for a developer than just using MIDI or floats everywhere or that sort of thing. Conceivably if there was already a robust collection of existing modules, users who don’t code could still make things by connecting them up of course, and benefit from the fancy port stuff without having to know anything about it.

I’ve found it really fun to work in this environment so far at the very least—even in the current program I have ports that carry audio samples, digital pulses, buffer indices, and time points, and as I go on I’ll probably have some carrying graphics-rendering commands and others carrying various kinds of input events and that sort of thing. This can make for really clean and simple logic within the module definitions—the types can have whatever interface you want, and you can define conversions between them etc., so you can leave a lot of the heavy lifting to them and code the modules in a kind of high-level declarative style.

It also means that it’s easy to have sequencer commands mean anything that can be expressed with the types you have for ports to carry: if you have a type that encapsulates cannonball-launching commands for some sort of pirate cannon module, and another that can describe the production of a trombone sound to some sort of trombone synth you’ve created, you should be able to decide that entering “woooooo” and “wawawa” on a line in a certain sequencer’s score should cause both of those things to happen at once, and pretty rapidly spawn and connect the modules that will facilitate that. I don’t have types or modules quite like those two yet of course :stuck_out_tongue: but the fundamental machinery needed to do that sort of thing is there (including the sequencer module actually…I just don’t have the graphical interface to it set up yet, but a sequencer currently stores the notes for the two chords the existing program switches back-and-forth between, for example).

Also, taking some inspiration from hardware, the sequencer’s “read head,” like its idea of where the piece is in time, is exposed to the rest of the program via a duration-carrying input port, so you can either just connect it to the main clock module if you want it to work normally (note that the main clock is exposed directly in the module environment like with hardware, as a side note, there’s no “hidden global time”) or you can connect the “read head” port to something else that will move it around manually (or modulate the clock signal somehow before it reaches the port or whatever). The existing program switches back-and-forth between the two chords in the sequencer using a latch module connected to the chord sequencer’s “read head” instead of the main clock, for example, and the latch is triggered through a small digital circuit using a pulse train and delay (carrying bool for pulse, not audio, as an example of a place where the arbitrary port data types can ease programming).

One of my major goals, although perhaps it’s hard to detect in all that :stuck_out_tongue: , is actually to facilitate the sequencing of more “tactile” musical commands, more akin to what you might naturally do on an acoustic instrument, like organic and higher-level rising and falling patterns in the dynamics, fluid rubato, complex articulations, etc., in a way that you can specify from within a score as you want to express them without arbitrary limitations or needless awkwardness. (I play acoustic instruments too and I always feel a little let down by how far away the compositional language of most DAWs feels from that.) There’s a sense in which the sequencer here is almost like a little “DSL module” where you can kind of make up a miniature programming language for the other modules to respond to, with built-in support for common sorts of statements (like right now it already has a built-in text format and parser for musical pitch in 53-EDO). The contents of a sequencer’s score in this environment is more akin to a Csound or tracker score than like a piano roll or drum machine pattern or something, in that it’s like rows of text separated into columns, but its format is more up to the user than a Csound or typical tracker score. :wink: Phew okay <takes a deep breath> it’s time for me to go to sleep :sweat_smile:

2 Likes

By the way, now that I’ve slept, I just want to note, I’m not at all trying to dismiss Bespoke, it does genuinely look really cool to me…I would totally try it out but it looks like it might be too blinky?

I think like, I always feel kind of terrified of accidentally reinventing the wheel—I try to avoid that but there’s no way to ever truly rule it out—so I got a little scared and defensive I think. :sweat: Sorry, I know you probably weren’t expecting six paragraphs of text.

2 Likes

you can turn off the lissajous visualization in the background and there’s a built in motion blur you can turn on for everything else. might still be too blinky with all the component sending and receiving signals though!

i use bespoke a bit and really love it so lmk if you have questions, although i’m not exactly an expert either!

1 Like

Oh neat! If the motion blur is across the whole screen of the program and strong enough, it’s basically guaranteed to be okay; I was basing my evaluation on stepping through frames of the demo video on the front page of its site so nothing more thorough than that. It did look like there was a lot of random things in the UI that could conceivably do it but aggressive temporal blur can fix basically any blinkiness. (Though sometimes what programs call “motion blur” isn’t really that effect—I guess like, just to be sure, I mean where the entire last frame is continuously blended with the current frame, so that blinking turns into gentle pulsing and everything leaves streaks and that sort of thing.) I’m still a little afraid to actually try it :weary: maybe Lily would be interested in investigating it later…that might be enough for us to get an idea.

Thank you! If I can use it in the end and do have questions, I’ll get back with you about that.

I guess like, as a side note, if you like modular-synth-type stuff, you might also enjoy Csound, to extend the reciprocal offer :smile_cat: I would be happy to answer any questions you might have or give advice about it or the like if you feel interested. It can be a little clunky to code in :stuck_out_tongue: but it’s really powerful, it has over 1500 “modules” (though it calls them “opcodes,” showing its age :stuck_out_tongue_winking_eye: ). It’s also easy to extend; you can write your own opcodes if the built-in ones don’t fit your use case, either with Csound’s normal instrument-definition language or using a C API if you have stringent performance requirements. The most frustrating thing about it, maybe, is that its score format is not very expressive, but I have a kind of sprawling Ruby library I add onto now and again that generates Csound scores and allows you to be more articulate, which I would be happy to share although I should probably improve its docs. :stuck_out_tongue: Other people in the Csound world have written their own things like that too, also, going in their own directions of interest—and you can also just use MIDI.

1 Like

ive decided to go for a grotesque 3DO game aesthetic for my seinfeld jrpg

21 Likes

working on a game for procjam

need to get my colors straight

8 Likes

9 Likes


nothing’s quite clicked but having fun fucking around in rpgmaker again, I have a lot of ideas but as always who knows what’ll actually come out. making some awful bricklined dungeon that mixes Hasbro’s The Game of Life + Wizardry IV, the characters level is replaced with “Age” as in Hoshi Wo Miru Hito. As you age your character develops according to Erik Erikson’s stages of psychosocial development, I think the idea of experiencing an entire lifetime as a series of annoying random encounters and textboxes feels fitting for the form.

The first challenge is getting out of the menu. There’s dozens of nested menus, that open up and change as your character ages and develops. When you die there is a bardo-esque gauntlet of encounters that determines rebirth. I haven’t finished it yet but if you successfully get through it I want to make a nice afterlife you can hang out in until you get bored. I posted screenshots of this area like a year ago but I think it might make a nice location for it.

I’ve felt incredibly burnt out by making games to the point it’s made me just break down in tears the last few months when I’ve tried, but I am determined to make at least one cryptic dungeon crawler before I totally give up. I haven’t bought a game in almost a decade and am totally out of the loop but in 2022 I managed to get on a kick playing random gamejolt/itch hobbyist RPGs and their 40-year old home computer equivalents. One of the few things that still draws me towards games is the disconnect between the fantasy its supposed to embody and the reality of its constraints. Something like Hydlide II is supposed to be this passionate living breathing fantasy world, adding towns, people with dialogue, a morality system, on top of the first games colorful diorama world- but in the end they’re all still constrained to the template of the first game, the morality is a stat, there is a “talk” mode along “attack” and “defend” but the citizens are still just interacted with by bumping- I always kill the farmer guys for the first few levels because they’re harmless, but then the shopkeeps won’t talk to you, so I kill zombies for 20 minutes and everything’s good. The strange effect this has I still find hilariously compelling.

I feel like the stuff I want out of games feels really contrary to where they’re actually at, but I do still really love the weirdness of this aspect, a bunch of value systems moving up and down with whatever materials from life pinned on top of them, repetitively working itself out via some dinky ruleset- I don’t know if I’ll ever actually finish this game but I guess the fantasy of it is one of the last things that makes me actually want to try and “make a game”. we’ll see!!



23 Likes

finchsmall

finches

11 Likes

Playing with mesh generation, quite enjoying seeing all sorts of weird stuff pop up





11 Likes