Portlligat [7DRL devlog]

Make games! Discuss those games here.

Moderators: Bob the Hamster, marionline, SDHawk

Post Reply
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Portlligat [7DRL devlog]

Post by TMC »

Portlligat
A Dalí-esque surreal post-apocalyptic survival-exploration roguelike

It's that time of year again, the Seven Day Roguelike gamejam! (Note: each start/end times are up to each contestant; we started 80min ago). I'm once again putting together a game with Seilburg (aka Anaximander/Jabbercat) in Godot. Last year I was learning Godot during the week, which cost a few days, but I don't regret it. Next year we plan to use the OHRRPGCE, after some engine improvements!

I'll be crossposting a daily dev-log here and to the itch.io page.

In Portlligat you can expect to:
• Delve into a psychoanalytic worldscape influenced by the sights, colours, and themes of (in)famous artist Salvador Dalí;
• Explore the wilderness, picking through the ruins of an unfathomable apocalypse;
• Craft tools out of junk, or magical scraps of godtech, you know, whichever;
• Sneak around or run from aberrations of reality that you don't understand, or smash them;
• Refute fantasy, or discover innate abilities and lose yourself to your hidden desires;
• Progress your character by levelling-up your skills as you use them;
• Deal, plead for, or steal tools, goods and information from dogged survivors and alien post-humans;
• Die by novel means!
Last edited by TMC on Sun Mar 07, 2021 6:02 am, edited 3 times in total.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Day 0 (crossposted)

An hour in and so far we've written a blurb, and accidentally rm -rf'd an empty git repository!

We are far better prepared this time, both with tools and design, and this will be a unique RL which I'm excited about. Details will leak out over the week. And yet the 36 page design doc feels very incomplete; we'll be designing much as we go.

For this game we will once again be using Godot, as we did for our 7drl 2020 entry, Slumber. Some code will be reused from the previous game, plus other preexisting utility code, in particular Schemat, an ontology language and inference framework I've been working on to help describe properties and interactions between objects -- still completely nonfunctional, and written in the wrong programming language! More on that later.
Last edited by TMC on Sat Mar 06, 2021 11:24 pm, edited 4 times in total.
User avatar
Bob the Hamster
Lord of the Slimes
Posts: 7658
Joined: Tue Oct 16, 2007 2:34 pm
Location: Hamster Republic (Ontario Enclave)
Contact:

Post by Bob the Hamster »

You had my attention at Dalí-esque, but you won my heart at Schemat being non-functional and written in the wrong language
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Day 1 - Object initialisation tomatoes (dis)order (crossposted)

(Writing this hours late but only covering day one.)

Even though this is all I have to show for it...

Code: Select all

What a barren landscape...
You exist!
You moved to (0, 1)
You moved to (-1, 1)
You moved to (-2, 1)
...I'm not terribly dissatisfied with the first day. I knew it would be a slow start but am nearly up to speed now.

I attempted to write GDscript without reading docs to check what I was doing, and it didn't work out so well, since I haven't used Godot for a year. Object initialisation order in Godot is a real headache and I still don't understand my find_node() problems. So I spent part of the first day re-reading documentation, though far less lost time than last year.

I picked through code from Slumber and salvaged a few lines here and there, barely anything in total. If had known what I was doing it would have been much faster to write all the code from scratch. We also spent a while discussing how we should better organise the code and files. Last time was a disastrous mess.

After getting a basic message log working (luckily someone else did the graphical side) I put together the most pathetically minimal Entity and Player classes at the 24 hour mark, so that I could post the above.

Didn't really do anything on Schemat, aside from a lot of thinking about it while picking tomatoes. There are many more tomatoes to be picked on day two.

Seilburg's devlog: Day 1 - Memories
(Includes Slumber - a (slightly) esoteric 7DRL: Port-mortem)
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Day 2 - Schedule inversion anomaly (crossposted)


Day 2 started out with me feeling quite productive, but looking back I can't find much I achieved. Largely I just copied some more marginally-useful code from Slumber.

That was before the accident happened.

After a chance trigger, I found myself reading the Godot shaders documentation and working on a feature that had been scheduled for day 6: a painterly effect with random colouration. I've never written a shader before (aside from some minor modifications to shadertoy ones), though OpenCL is basically the same thing. Shader programming is something I've been really looking forward to for years! It was fun.

But there were two massive time sinks: firstly was blindly writing and testing shader code to get the effects I wanted: random colouration and not-obviously-repeating tiling of an input texture. Secondly, creating a texture from a photo of an (actual Dalí) painting which had brushstrokes, was not too uneven, and tiled well. I never quite achieved any of those, despite endless experimenting. It's been a recurring lesson I've learnt in my life, if you don't know how to do what you want, trial and error is a waste of time.

The effect so far could mostly have been achieved without a shader by blending some textures onto the map.

And there are seams due to an unfortunate shortcoming of 2D shaders and TileMaps in Godot which I've got to work around.

<img src="https://img.itch.zone/aW1nLzUzODg0NTkuc ... 8mi8PH.png" width="600">

Here's another of the numerous textures I produced and threw away, with some more extreme shader parameters.

<img src="https://img.itch.zone/aW1nLzUzODg0NjQuc ... BxU%2B.png" width="600">

Well, that was the day gone in a bad way (and much of day 3 too). At least I was alone in wasting time.

The plan for [s]tomorrow[/s] today is to implement the most basic elements of a RL. The player doesn't even have a (moving) sprite yet.


Seilburg's devlog:
Day 0 - Beginnings / Day 2 - Dream it, and it will be so
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Day 3 - Bitter reality (crossposted)

(Covers day 3 only although half a day late again)

Many hours of the shader nonsense detailed in my previous entry bled into day 3 too.

Afterwards, I finally implemented display of objects/entities with sprites, and movement with collision detection (but not with walls yet!). There will be multi-tile objects and entities too. I'm shocked that how long something so simple took me; I reworked the code multiple times. It's humbling; I thought I had experience coding RLs, but clearly not enough if I couldn't get that right easily.

I spent a few minutes on Schemat too, but not enough to progress. Only the most basic version of it could possibly be done in time to be used, and it seems unlikely.

That was an exceptionally boring devlog, so instead, time to take stock.

I'm so focused on whatever I'm working on, and see only the nonfunctional skeleton of the game that is, that it's becoming hard to remember what the completed game is meant to be. It requires effort to imagine it emerging!

So far, most of the completed features are bog standard and unscreenshotable RL fare. (Many 7drl games start with all of this already written!) It's alarming that of the features intended to set Portlligat apart from other RLs, the only one implemented so far is the crafting interface, and that's still just an interface**.

Looking at the Trello kanban board (six fully completed cards day 1, three on day 2, one on day 3) on day 2 we seemed OK. Now I can see the slip. But I think half the actual tasks needing to be done are missing from it! And without time estimates on cards I don't know how far off track we are. (It's still helpful though. Never used kanban before.)

Now for some optimism:

Of those 3 days I think I've only spent ~1 day on the "actual" game if you exclude time spent reading docs, wasted on shader fluff, and picking through code from Slumber (a way of refamiliarising myself with Godot), therefore I still have almost all of my contribution still ahead of me!

**As of day 3 :)

Seilburg's devlog:
None! I beat him for once!
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Seilburg's eventual devlog:
Day 3 - It's not like chrome
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Day 4 - The mortal danger of weapons (crossposted)

This devlog entry is now almost a day late. The reason for that is that I wanted to make some improvements to the crafting GUI so that it could actually visualise what I was working on. But that didn't happen. My devlog has been woefully short on screenshots! Unfortunate, as they're so important.

I had less free time on Day 4, and shockingly only worked on one thing, which I didn't finish, and which I definitely shouldn't have been working on at all. And that was calculating the properties of a weapon the player has put together from components (see Seilburg's Day 2​).

Despite repeatedly warning Seilburg about the time-pressure dangers of the crafting system (and originally being skeptical of the idea because it seemed distant to the themes of the game before being sold on the potential) I stabbed myself in the foot when I decided to start working on it myself after he implemented the initial version (and created the GUI). I had so many ideas about physical-correct calculations. I made some ludicrous claim that calculating the moment of inertia of a weapon and making use of it would be "simple". Well, after a whole lot of code to calculate weight, centre of mass, most suitable handle position, reach, torque on the handle due to the weight of the weapon (taking into account chain components and balance), and moment of inertia, turning those numbers into the numbers actually needed (damage, etc) is still ongoing. Unfortunately I need to make some changes to the GUI, but Godot's GUI Controls are so complicated that I don't understand them.

On the positive side, we did start slashing features. Schemat is relegated to a future release (now I'm forced to keep working on the game after the 7drl!). There will be no indoor maps or programmatically generated rock formations.

(SS Bonus content)

Meanwhile SwordPlay has been posting gifs in Discord showing off the OHRRPGCE 7drl game he's working on, and he's got it all, mapgen, extremely fancy inventory system, usable items, attacks, destructible terrain, everything and anything we haven't done! I don't know how he did it, maybe by using a better engine.

Seilburg's devlog:
I win again! Guess he's busy with something else.
Last edited by TMC on Thu Mar 11, 2021 3:14 pm, edited 1 time in total.
User avatar
Bob the Hamster
Lord of the Slimes
Posts: 7658
Joined: Tue Oct 16, 2007 2:34 pm
Location: Hamster Republic (Ontario Enclave)
Contact:

Post by Bob the Hamster »

I truly enjoy reading your devlogs :D

If you could have seen the look on my face when I read
TMC in hubris wrote: I made some ludicrous claim that calculating the moment of inertia of a weapon and making use of it would be "simple"
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Seilburg's devlog for yesterday:
Day 4 - Something's not right.

Day 5 - Pretend this is day 1 (crossposted)

​24 hours passed in a flash! Because I decided writing the dev log at the end of the day is better than a day late.

I actually implemented some important basics. First I implemented a turn queue (meaning each Entity's action can cause a different length of time until the next turn). With ever-unchecked optimism I declared "the turn queue took me longer than expected, but bump-to-attack is going to be like 3 lines of code; it's basically already implemented!"

Later in the day... well, sure, it indeed took about three lines to call Entity.attack(defender), but what about all the rest of it? After the turn queue I was basically connecting a whole lot of existing code together with plumbing, and fixing the problems and unimplemented bits that exposed. Which is quite satisfying; progress is fast.

But taking stock it only added up to:
-attack by moving into Entities marked hostile
-bump into other MapObjects to interact
-the attacks actually prints messages and does a fixed amount of damage
-MapObjects can be destroyed, Entity.die() works
-bugfixes

I think I only got done about 30% of what I'd hoped to.

But there are two days left, and as you know you can create a whole game in 48 hours!
​
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Seilburg's previous devlog:
Day 5 - Plumbing


Day 6.5 - Fluffy rocks (crossposted)


As you read the fantastic progress preoccupation with fluff in this devlog entry you would be forgiven for thinking this must be day 65... think again. Fractional days are simply easier: no hard deadlines! Why didn't we do this before?

Day 6 would have been a good day... if this weren't a 7drl. Free time and focus were in short supply.

I finally implemented some mapgen. Simple Perlin-noise based mapgen with random placement of extras. We had so much better planned. We were going to use a fancy Wang-tile map generator we (mostly Seilburg) ported from Java before the contest, except that we never got the port to work.

But first, I implemented a "ChunkedMap", basically reimplementing my own tilemap. Godot's tileset system is totally bonkers. Intuitiveness and ease of use were not design goals. No keyboard shortcuts? It's a bit painful from a script too. I'm glad to hear they've apparently rewritten it in the upcoming version.

Anyway when I went to actually write the mapgen I had no idea how to place groups of tiles on the map. Finally I decided I had to draw up templates using Godot's tilemap editor, giving each template its own tilemaps, and not actually really use my ChunkedMap for much.

I also implemented items laying on the map. No, they aren't generated on the map, you have to drop them. No, you can't pick them up. But you can see them.

And various bugfixes, tiny features, and polish (it is the last day!)

Perlin noise is so boring. What's more interesting are rocks! As you might know, procedural rock generation was scrapped from the 7drl roadmap a couple days back, which is why I didn't tell Seilburg that I was blowing most of a day playing with shaders again. But, he *did* insist that "looking at funny-shaped rocks" was a real feature of the game, not a joke bullet point! Many of Dalí's paintings feature forms that are based on actual rock formations he visited. Maybe you too will perceive these rocks as works of art.

Image

The rocks are rendered to a texture by a shader. The parameters get more extreme the further you wander.

Image

I spent untold hours tweaking the equations and parameters, starting from Sculpture II by iq. Once again it was largely a very time consuming blind search. Of course I only worked on this because I thought I'd get it working in an hour or two and then exert incredible willpower to move on to something else.

"Fluff feature" is how Seilburg might describe it. That's too kind.
Last edited by TMC on Sat Mar 13, 2021 11:29 am, edited 1 time in total.
User avatar
Bob the Hamster
Lord of the Slimes
Posts: 7658
Joined: Tue Oct 16, 2007 2:34 pm
Location: Hamster Republic (Ontario Enclave)
Contact:

Post by Bob the Hamster »

Those rocks are beautiful. I love them!

I suggest dropping other goals and just making the rocks wieldable as weapons
Last edited by Bob the Hamster on Sat Mar 13, 2021 12:18 pm, edited 1 time in total.
User avatar
SwordPlay
Chemical Slime
Posts: 966
Joined: Sun Jan 22, 2017 9:32 am
Location: London, England
Contact:

Post by SwordPlay »

really getting that Dali vibe
"Imagination. Life is your creation."
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Day 8.5 - Ominous silence (crossposted)

I (and devs in general) often claim I'll keep working on a game after the end of the contest/jam without ever doing so, but this time we mean it. See, we've blown past the seven day deadline and are still working on it!

Leading up to the deadline was a flurry of activity and we kept going past it for some hours in grim determination, neither of us admitting what had happened, and got a lot done, yet still lacking the laser focus needed to reach a release.

Although it's embarassing to say that we missed the deadline by more than a little bit, what I hate even more is releasing a game that's a trainwreck to meet a deadline, as I've done quite a few times in the past. Once you admit that a deadline is gone and not coming back, when do you release? As soon as possible regardless of state? Once it's playable? Once it's fun? We're aiming to have at least an element of fun, and we're getting close!

Features

In the last two days things I worked on included:

-Rocks are obstructions

-Let you walk behind buildings and rocks. A dumb use of time; in hindsight should have instead removed the over-tall building templates. It only causes more problems...

-Added random choice of alternatives to my sentence former/generator

-Added random messages for bumping into rocks. A lot of messages. I joked that we now have gameplay, because there are also (invisible) side effects...

-Improved Examine mode

-Helped implement equipment... only weapons for now

-Improved sentence former's plurisation rules, support multiple verbs ("It swings but misses" becomes "You swing but miss")

-Drew some outlaw sprites (simple variants). Simplistic low-colour, single frame 16x16 sprites are such a breeze to draw. And yet I put in those rocks and painting textures in a stylistic contradiction.

-Made sentence former's a/an handling more general

-Wrote a ripple effect shader for the titlescreen because I'm now on the hook for writing shaders. (Being lazy, I personally favour omitting titlescreens to save on work.)

-NPC placement, and more templates for mapgen

-And the last thing I did, finally put in some NPC AI. Combat is very one-sided without it.

I also dealt with the folly of buildings you can walk behind with another effect, which revealed a surprise. No feature goes unpunished...

Image

Bugs

However there were a lot of chores and sleep to catch up on, so progress has been slow for the last day. But even worse are the bugs! We've hit some horrible bugs today, at once of them in Godot itself.

When Godot's error reporting and debugger work they are wonderful, when they don't, they're almost worse than no error reporting at all: they oft report misleading or nonexistent errors. Godot sure has some glitchy error reporting. (Another thing improved in Godot 4.0 apparently.) I often run the game from within Emacs because I get more error messages that way! But today it really was bad; it refused to load a code module without explanation. Restarting the editor didn't help, but making some changes and then reverting them did. Not possible!

Object initialisation fiasco redux, aka More sentence features

Another serious bug was certain types of objects only appearing at 0,0. I couldn't work out why, so I did the next best thing and made the sentence former use pronouns like "he" instead of "the guard" in more contexts. But was surprised that humans had the "it" pronoun.

I tracked that bug down to calling the base class's Noun._init() from the derived class's Entity._init(). I didn't realise that in a very C++-like fashion this actually re-initialises instance variables to their default values (from the base class). Unexpected. Fixing that made me realise it was also the cause of the sprite position bug. No sentence former feature goes unrewarded.
Post Reply