Ludum Dare 48 April 24–27, 2021

Help request

The event is slowly but surely approaching and I can't make an executable that isn't detected as a virus from Windows Defender.. I tried a lot of methods but none worked out I use pygame and python 3.9, I create the exe with the latest installation of PyInstaller but it's still recognized as a virus from Microsoft.. if any python/pygame developer knows how to help I'd love to hear them..

I'm In!

This will be my first LD event! I wanted to do the ones in 2020, but I lost track of when they were gonna happen, and missed both of them. Now, I have an account setup and can't wait!

Use Our Code #1: Better Errors for Shader Compilation

Our team is using WebGL and Javascript for this jam, and to that end I am writing an improved version of the custom engine we used last time. The spirit of LudumDare is about collaboration and sharing, and in that spirit, we invite you to use our code!

First off, here is some code to pretty-print the content of gl.getShaderInfoLog. Why's it so great to pretty-print compilation errors? Well, the default messages I get from the browser are bare oneliners like ERROR: 0:10: 'x' : syntax error. Last jam, I had to hunt through the line numbers manually, which was inconvenient when the shader source was burred inside a script tag in an HTML file. Having learned that this was a problem, today I wrote a simple regex parser that prints much more helpful messages, like this:

```

When compiling vertex shader "a":

gl_Position = vec4(vertex,0.0,1.0); 
world_coord = (inverse_view * vec3(vertex,1.0)).xy ◀◀◀ MISSING SOMETHING?
daytime = dot(world_coord,solar_vector);
▀▀▀▀▀▀▀

ERROR: 0:10: 'daytime' : syntax error``` It's even so nice as to try and find the line where the semicolon is missing. (Heuristically of course, I am not parsing GLSL.)

If you think that's cool, well, hopefully your driver/browser/whatever produces raw errors that textually look like my computer's. If so, then the following code may help you:

```javascript // WebGL shader compilation errors don't provide a lot of context. // This pretty-printer extracts line numbers from the message, and // formats a helpful report on the site of the issue. // My driver can return several errors on several lines, so first let's split them. function prettyPrintShaderErrors(name,source,message) { const errors = message.split(/ ? /); const readouts = []; for (const error of errors) { if (error.length == 0) continue; readouts.push(prettyPrintShaderError(name,source,error)); } return readouts.join(" "); }

// Pretty-print a single error. function prettyPrintShaderError(name,source,error) { const lowEffortMessage = When compiling ${name}: ${error}; const lines = source.split(/ ? /); // An OpenGL compilation error will look like: // "ERROR: 0:11: 'daytime' : syntax error" // So, the first thing we do is split at the : const errorParts = error.split(":"); if (errorParts[0] !== "ERROR" || errorParts.length < 3) { // Give up if it doesn't look like we're expecting. return lowEffortMessage; } const [part,line] = [ parseInt(errorParts[1],10), parseInt(errorParts[2],10) - 1 // OpenGL starts at line 1 ]; if (part !== 0) return lowEffortMessage; // 'part' is an OpenGL thing that webGL shouldn't have. If it isn't zero, then we aren't properly parsing the error. if (line >= lines.length) return lowEffortMessage; // Attempt to find the error-triggering string in the bad line // Strip whitespace and wrapping quotes const triggering = errorParts[3].replace(/^\s+['|"]|['|"]\s+$/g, ''); const triggeringindex = lines[line].search(triggering); // Probe for missing semicolons, a common error. // This regex-based heuristic is NOT PERFECT, but it can work sometimes. let semicolonmissingat = null; // Semicolons, { and } can all go before a statement. const goodLine = /[;|{|}]\s*(\/\/.*)?$/; const emptyLine = /^\s*(\/\/.*)?$/; for (let i=line-1; i>=0; --i) { if (goodLine.test(lines[i])) break; // We found line that terminates right. if (!emptyLine.test(lines[i])) { // If the line has stuff on it... semicolonmissingat = i; // then since we haven't found a good one... break; // it must be a bad one. We're done! } } // Decide whether or not we suspect a missing semicolon/brace let suspectedmissingsemicolon = false; if (semicolonmissingat !== null && triggeringindex >= 0) { // If the triggering string appears after nothing but whitespace if (/\s*/.test(lines[line].slice(0,triggeringindex))) { suspectedmissingsemicolon = true; } } // Select context for error from source lines const contextend = line+1; // Our context must include the triggering line! const contextstart = contextend - 3; // 3 lines of context by default if (semicolonmissingat !== null && contextstart > semicolonmissingat) { contextstart = semicolonmissingat; // Always include the suspected line } if (contextstart <= 0) contextstart = 0; const context = lines.slice(contextstart,contextend); // Assemble the message if (suspectedmissingsemicolon) { const locincontext = semicolonmissingat - contextstart; context[locincontext] += " ◀◀◀ MISSING SOMETHING?"; } const message = [When compiling ${name}: ].concat(context); if (triggeringindex >= 0) { message.push(' '.repeat(triggering_index) + '▀'.repeat(triggering.length)); } message.push(error); let longest = 0; for (const l of message) if (l.length > longest) longest = l.length; message.unshift('='.repeat(longest+1)); return message.join(' '); }```

LD48 Warm-up Game

If you have time on your hands, here's a simple HTML adventure game I made for practice:

Sorrow, Hope, Hunger

Made using home-baked JavaScript and HTML. Enjoy!

shh-screenshot.png

Credits:

Textures: https://cc0textures.com

Artwork: Various Project Gutenberg books, and the 1918 Sears catalog (for Iris, the protagonist)

Sound: Leshy SFMaker

Warming up today a little

Oh yeah! I'm definitely in for LD48. Looking forward to it! Will probably be using Phaser/JavaScript for the build although I am experimenting with boardgame.io/React today for a little card game. Could be fun to use that or Xstate FSMs for more chilled games. I've also seen so much great stuff being done with Rust gamedev, it is tempting too...

First Ludum Dare!

Getting ready for my first Ludum Dare! I only started learning game dev in the last year or so with really focusing on learning in the last couple of months. Throwing myself in to the deep end for the Compo. It will be a crash course but I am excited to see what I get on the other side.

I guess people are doing this:

Engine: Godot Art: Aseprite or Pixelmator Audio/Music: Ableton Live, Teenage Engineering PO-16

Excited For Ludum Dare!!

This is my first game jam for LudumDare. I have some GameDev experience and I want to put it to test. I make small games with unity and i like making pixel art. Looking forward for LudumDare 48!!

Locked in for LD48!

Hi all!

Name is Hex,I love game jams it has been a few years (3 to be precise) when I last participated in Ludum Dare. This year I plan to actually complete and submit a game. I am pretty excited to see what everyone comes up with! I will be streaming the event as much as possible

Good luck to all of you out there!

My Toolkit

  • Godot Game Engine
  • Aseprite, Pyxel Edit (If tile edit is not out yet for Aseprite)
  • 1 Bit Dragon/ Chiptone for Audio & SFX

Stream and Links

Twitch Stream - Plan to start the stream a little earlier than the keynote

YouTube LD Postmortem - My Game Dev You Tube Channel, I will post my postmortem and the games I reviewed from others during the jam!

Stay safe, stay Awesome!

For LD48 I'll be a teacher

Oh boy oh man, Ludum Dare is back soon. This time things are gonna be a little different for me.

I've been teaching the Godot game engine to a friend of mine for a few weeks now, and we've decided to make LD48 be our first big project working together. It will be his first time making a game under the pressure of time so this will probably be a good way to learn to be more efficient.

I've enjoyed a lot of using game jams to learn game dev, and it's a big pleasure to be able to pass this on! See you all on the 23rd!

I'm In

Hi everyone!

Just wanted to say that I'm going to try to participate in this Ludum Dare. I tried a couple years back but failed because of... uh reasons, and I want to at least have completed a single Ludum Dare game jam.

Tools:

Unity 2019.2.x

Blender

Gimp

My last LD game ended up on Steam, hoping LD48 will go the same way :)

The last Ludum Dare (47) actually turned out pretty nicely and I ended up following through to release the game on Steam a few months later, which I definitely recommend to everyone who finds their LD creation fun! You can do it :)

For anyone interested, here's the previous LD post https://ldjam.com/events/ludum-dare/47/hell-loop and the steam page a few months later https://store.steampowered.com/app/1473870/Hell_Loop/. The funny part is that most of the game was actually done during the first day of the jam, and the rest was just polishing things up. It's amazing how much time the last 20% takes.

Check out the before and after screenshots:

  • This is from LD 47

36d30.gif

  • And this is the final version

ss_f43e89a61055a4a01e9fd133995fd187bd0b5d27.1920x1080.jpg

ready for LD48!

planning to join-in for LD48, this time making my own game with my library/engine once more. or so, that's the goal. a little over two weeks to get it to a working state in haxe/flashdevelop, but i think i can manage as long as my life stays out of the way!

i also caught this early enough to submit themes for the first time ever!

Use Our Code #2: WebGL Type Info (and some bad engineering)

Our team is making a custom WebGL engine for this jam, and we hope that you can benefit from our work. Today, I'd like to share a little file that may save you some time if you're working with shaders.

The Code

Last jam, I spent a lot of time trying to manually synchronize uniform and attribute names between shaders and my webgl engine code. I was always forgetting names and making typos. So, this time, I would like to auto-generate and auto-verify uniform and attribute types.

With webgl functions like getActiveUniform and getActiveAttrib, you can inspect shaders to find out what types of uniforms and attributes should be attached to them. Unfortunately for anyone planning to use that information, the types of those variables are returned in opaque OpenGL codes like 0x8B51. So, I made a JS file containing an object with entries like this:

javascript GL_TYPES = { ... 0x8B51:{ TypedArray : Float32Array, name : "FLOAT_VEC3", nbytes : 12, nelements : 3, uniformv : "uniform3fv", }, ... }

With GL_TYPES[mysterious_opaque_code], you can get a typed array constructor appropriate for the data type, a human-readable name (which happens to comply with WebGL nomenclature), the number of bytes per item, the number of primitive elements per instance, and the name of the uniform upload function that should be called to upload an instance of the type to a shader. As a bonus, there's another object GL_TYPE_CODES, which maps names to codes (superfluously if you have a webgl context, but helpfully if you don't.) If you're writing code to dynamically read info from shaders, this file might save you a lot of typing, and even more spec-reading. Again, here's a link to the file. I hope that it saves you some time.

The Bad Engineering

From a wellspring of laziness, I wrote a python script to generate the file from some tabular data cut-and-pasted from MDN. Humorously, the code-generating script comes in at 175 lines: producing a 212-line file, saving little typing... and costing a lot of thinking. Now, I'm all for laziness and replacing typing with thinking, but in retrospect it may have been better to generate the object in Javascript on page load. Having a python script that generates javascript code that gets put in the repo alongside the generator seems over-complicated.

Secondly, it turns out that integers can't be used as keys in a Javascript object. Implicitly, they're getting converted to strings. That shouldn't cause any problems (because they will also get implicitly converted on lookup), but it does poke a hole in my plans for a super-efficient lookup table; and it severely weakens the case for static code generation. In retrospect I should have used a Map, or maybe a sparse array.

I'm In

It is time for Ludum Dare again !

I'm in this time with the same tools as before.

  1. Haxe/Heaps
  2. Using my additional base library https://gitlab.com/ZwodahS/haxe-zf
  3. If I decided to make a Traditional Roguelike, would also use https://gitlab.com/ZwodahS/ren as the base engine.
  4. Aseprite for graphics
  5. ChipTone for sound effects.

While waiting for LD, why not check out my game https://zwodahs.itch.io/abyss which was made for 7DRL just a few weeks ago.

I'm in

I'm in for this year

Maybe I use Unity3D or MonoGame My language is C# ;)

If you are designer and if you search team contact me ;) (Discord MaximeMazet#3102)

I'm french developper

Looking for team

Hey dudes, i'm new in game dev and wanna try yourself like game designer

Hey people

I am a game developer and I would like to find a team with which to participate together in this ludum dare. In my day to day I program in c ++ but I also know unity and c#.

You can contact me by discord: Astain#7790

Cheers!

Looking for a game please help me

In one of the 3 past LD jams there was a game about a wolf with a balloon I don't think it was finished or published but it looked amazing in a preview, I really wanna follow the guy or gal who made that game to see what he's working on these days, does anyone know this game?