Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Topics - Simon

Pages: [1] 2 3 ... 12
Non-Lemmings Gaming / Zendo: Realizations
« on: Today at 07:01:37 pm »
Realizations about Zendo
Part 1: Different piece sets

I will write several posts about the tabletop game Zendo.

Background knowledge: Rules of Zendo, a game of inductive logic.

In Zendo, you build structures of pieces. Any source of pieces is eligible, but ideally you have many copies of each piece and can compose pieces in many different ways. The structures should be easy to grasp by looking.

Example piece sets

The 2017 Zendo release ("Zendo 2.0") has 3 shapes in 3 colors each. Everything is the same size, there are no pips on any piece.

Icehouse pieces. Everything is a pyramid. The 2001 Zendo boxed set has 4 colors of pyramids in 3 sizes each. Large pyramids had 3 pips, medium pyramids had 2 pips, small pyramids had 1 pip.

Digis, and structures are then natural numbers.

Letters from the alphabet. We played Zendo on Lemmings Forums where structures were finite-length strings over A-Z.

Good piece sets

Above, I've already sorted the piece sets according to how good the resulting game feels. The Zendo 2.0 pieces are the best. Geometric shapes and colors seem to fit the game much better than letters or numbers. Visual pattern recognition is a deep part of Zendo.

I have an irrational soft spot for the Icehouse pieces over the 2.0 pieces. The Icehouse pyramids come in green, the table looks more colorful with red/yellow/green/blue pieces, and still the number of colors is small enough.

I've always thought our Lemmings Forums A-Z game produced insidious problems with harder rules. That will warrant an extra post these days. Until then!

-- Simon

Lix Main / Design history: Hi-res physics
« on: December 04, 2018, 12:49:04 am »

Double resolution

Lemmings 1 and Lemmings 2 were written for 320x200 VGA mode. The playing characters are 8 or 9 pixels high, walk ahead by 1 per frame, and builder bricks are 1 pixel high.

Lix is double-resolution: Characters are about 17 pixels high, walk ahead by 2 hi-res pixels, and builder bricks are 2 pixels high. More precisely, physics work with 2x1-pixel-chunks. All lix' x-coordinate is always divisible by 2. Only the y-coordinate may be any integer. A 2x1-chunk of land counts as solid as long as at least one of its two pixels is solid.

Where does this concocted rule come from?

In early 2003, I scripted levels for the freeware game Gravity Strike, this ran with hardcoded 640x480 fullscreen. In the early 2000s, CRT monitors were widespread and could display any resolution sharply -- up to a point. But every monitor could display 640x480, thus Gravity Strike's author decided to hardcode this size.

I wrote GS Lemmings, a Lua script that ran in Gravity Strike, removed everything that the game normally provides (spaceship, terrain, enemies, status panel) and instead loaded my own graphics and ran my own logic. This is the birth of double resolution: It was easiest to work with what I had.

In Lua, apart from numbers, everything is a reference type, everything is garbage collected. I had no idea what was happening under the hood. Would arguments be passed by value or by reference? What is the difference between calling functions object.func() or object:func()? No idea. Programming was magic. If it failed, I would guess and re-try. I would never search the web for help because I found the technical explanations hard to understand. (Solution: object:func() is equivalent to object.func(object)).

In 2006, I finished my civil service -- back then, it was mandatory for every male German to either serve in the military or work civil service for 9 months. I had some time before university started in fall 2006. What to do?

I learned C++ and began the work on L++, a Lemmings variant with hardcoded 640x480 fullscreen resolution. Why would I do that? It worked in Gravity Strike, and I still had a CRT monitor that could display any resolution well. I kept my rule that the tiles could be anything and need not stick to 2x2-blocks. I would not upscale. I would load the tiles as they came from disk. That was easiest.

The 2x1 physics instead of 1x1 come from the desired walker speed. It was simpler to move always by 2 horizontal pixels than to write a basic walk action for 1 pixel, then call that twice per frame. The walk cycle would look at two pixels and deduce from them together whether the 2x1 chunk was air or solid. I didn't expect any odd cases from the rule.
Of course, there are odd cases (I should link the example gifs).

L++ became Lix in 2010 and got ported to D in 2015. Like Theseus's ship, all code, graphics, etc., got replaced over the years, but really, 2006 L++ was the first version of Lix.

With my own game project at 640x480 fullscreen hardcoded, I spent considerable time on choosing my first laptop in 2007. I wanted 4:3 aspect ratio for my laptop screen, but that was getting unpopular. Laptop computers were booming, and widescreen displays had gotton common. I loved 4:3, why would anybody want 16:10? Documents, websites, code, etc., everything is vertical, but most importantly, 16:10 TFT displays would blur at 640x480 hardware fullscreen.

Lix/L++ is now 12.5 years old and programming been my longest-standing hobby. Now, Lix supports any screen resolution, windowed or fullscreen. The user interface scales smoothly, a major design goal during the 2015 rewrite.

Even with the user interface resolution decoupled from the physics resolution, Lix still has 2x1-hi-res-physics. I don't like how confusing the 2x1-block rule can be. But it has been so deeply ingrained since the beginning. It allows for more graphical details on tiles. On the other hand, it forces tiles to have more details to look good.

tl;dr: It was easiest because of the hardcoded 640x480 resolution in the early versions. And now too much depends on it to get rid of double resolution.

Passage of time

More rambling, because I'm in the mood.

I feel like time is passing much quicker now. In 2003, GS Lemmings was released with 20 levels after maybe 2 months of work, with some bugs of course, some crashes, some reliance on 60 FPS -- Yes, the game would skip some physics logic, but not all physics logic, when the machine was slow! Horrendous bug! -- but it worked well enough to play. The 2-3 regulars on the Gravity Strike forums loved it.

Where GS Lemmings took 2 months, L++ required 3 years before I felt ready to post it on Lemmings Forums including networking mode. A more complicated feature, sure, and I wrote the game engine from scratch instead of relying on a host game.

It's been nearly 4 years since I started the rewrite to D in early Feburary 2015. I'm very very happy with the rewrite, I've pushed the game further, and I'm supporting different operating systems better than ever before. But are there killer features in D Lix that weren't already there in C++ Lix? Did the fundamental game take 2-3 years to implement in 2006 to 2008, and the 10 years after it has been only polishing?

Sometimes, I miss the days where I would implement buggy crap with trial-and-error, but have something cool to show after minimal development time. The 15-year-old kid inside me wants to feature-bloat on some side project. And the 5-year-old inside me wants to play that and get even more wild ideas.

When time passes linearly, memories increase only logarithmically. You remember so much from when you start a new activity. But then you get proficient, and you don't remember as much when you're performing by routine.

Consider the time after my civil service. I learned a good chunk of C++ and wrote a prototype-ish game, L++ with some singleplayer, in half a year. Then, I had nearly no other hobbies, obligations, or girlfriends, and could focus fulltime on L++. Now, 12 years after, I had comparable time after finishing the PhD, but I haven't started a new hobby in that time. But I already have so many hobbies -- games, Lemmings Forums, speedruns, tech projects -- that I've enjoyed in that time. They merely generated less impactful memories than starting a new hobby typically generates. That's why time seems to fly quicker.

At least I've finished xmas2018 on time. :lix-grin:

-- Simon

Lix Levels / xmas2018: Holiday-themed pack with 24 levels
« on: November 30, 2018, 12:32:21 am »

just in time for the festive season, Forestidia and I present xmas2018! This is a holiday-themed singleplayer pack for Lix with 24 levels, including one by Raymanni.

Get it: Download newest version of Lix, xmas2018 has been included since Lix version 0.9.22. Look in the folder levels/single/misc/.

Ideas behind the pack: This season is about love and caring. You don't have to implode, cube, or kill lix: In these levels, all lix must be saved. The 24 levels stand for the 24 days until Christmas. You can play one level per day, or try to solve them all in a single sitting. It's your choice.

Have some hot chocoloate and enjoy the pack!

-- Simon

Advent Calendar
The first level of the pack. 24 little doors with 24 little surprises.

Decorate the Tree
Join us in the homely living room. The holiday porcupine can't wait to see your newest tree stylings.

Home Time for Santa
Santa has delivered all the presents. The cookies were tasty. Let's help him leave the house through the chimney.

Docked at the North Pole
Join the expedition to Santa's home in the icy north.

Three Wise Visitors
Earlier, you've guided the Three Wise (Wo)Men through the desert. Now they must agree where to meet in the shed.

Lix Multiplayer Dates / Lix Multiplayer Saturday 2018-12-01
« on: November 21, 2018, 09:56:39 pm »

Let's play Lix Multiplayer on Sunday, December 2 Saturday, December 1 at 19:00 UTC. Who's in?

New and exciting! At latest 3 hours before the session on December 1, I will release Lix 0.9.22 with:
  • Bugfix against the crashes on huge maps: I'll provide a 64-bit executable that shouldn't crash anymore, and will encourage you to play the multiplayer session with that. Let's test some huge maps that night!
  • Xmas2018: a Holiday-themed Lix singleplayer pack with 24 levels by Forestidia and me. Dedicated topic and preview images will appear next week!
-- Simon


airwalk happens in Lemmings 1 and in Lix. I consider it a physics bug. Here are pictures taken in successive frames:

  • Many clustered walkers are immediately in front of the wall.
  • Assign imploder to one of the walkers. (It doesn't matter if you implode the first, last, or one in the middle.)
  • Physics update begins.
  • The imploder removes therrain. (Physics update terrain removers first, then skills that don't affect the terrain. This is why choice of walker to implode didn't matter.)
  • All walkers see the hole before they update.
  • (No check whether they have ground.)
  • All walkers notice open space ahead, thus walk one step ahead in the air.
  • All walkers notice the lack of ground, thus begin falling.
  • Physics update is finished, and the result is drawn to screen.
  • The fallers will eventually land on the ledge created by the imploder.
Problem: These walkers land on a ledge, but shouldn't be in the space over the ledge in the first place. It's weird that walkers react to the lack of wall immediately (thus can walk forward), but fall due to lack of ground only after airwaking once. It's also inconsistent with the general philosophy that terrain removers should immediately affect everybody in the same frame, in every way.

Proposal: Walkers should check for ground both before and after possibly walking forward. If they hover before the move, they immediately fall and don't move forward anymore.

Downsides of change: Walking is the most ubiquitous activity. If you have walkers in a digger hole, this change affects them as the digger breaks through. I haven't implemented any fix yet, thus haven't run the replay checker on this. Also, other activities might have similar bugs -- fixing only the walker in isolation might be inconsistent.

-- Simon

Lix Levels / Slipping Again: alternative solution?
« on: October 01, 2018, 05:52:20 pm »
Flopsy found:

Has some similarities to the intended route. Looks hard to prevent, merely finnicky.

-- Simon

Lix Multiplayer Dates / Lix multiplayer 2018-09-15
« on: September 06, 2018, 12:27:25 pm »

let's play multiplayer Lix again, and schedule a time nicely in advance. I propose Sunday, September 16th We changed it to Saturday, 15th at 18:00 UTC .

Any game version 0.9.x can join, which is everything released since summer 2017. Current is 0.9.19. Select Multiplayer from the main menu and connect to the central server.

-- Simon

Lix Main / Ceiling, how to check terrain beyond?
« on: August 28, 2018, 07:40:36 pm »

Lix die when they leave the map. I'd certainly like to keep this. But how should the terrain check beyond the ceiling behave?

0.9 ceiling rule: When a lix checks terrain beyond the ceiling, the game answers with the highest pixel still inside the playing area.

Problem (see gif above): Walkers see the final builder brick as an infinitely tall wall and turn at this brick.

One may consider this a logical corollary from a reasonable rule. But many consider this unintuitive. In particular, the builder herself dies because she doesn't check again for terrain after building the infinitely-tall brick.

Here's an alternative to the 0.9 ceiling rule:

Open ceiling rule: When a lix checks terrain beyond the ceiling, the game answers with air.

Problem (see gif above): This thin bar is only 8 hi-res pixels thick. The lix have to climb 12 hi-res pixels to get out of bounds, and they happily do that because they can ascend up to 12 pixels into air.

One may consider this a problem of the level and thicken the steel bar here.

Compared with the 0.9 rule (left gif), the open ceiling rule (right gif) has another downside: Before climbers die, they see a ledge on top of the climbable wall. Instead of peacefully climbing into their death as in 0.9, the open-ceiling-rule climber will now ascend/hoist into death.

One may consider this a cosmetic problem and not care.

Or one could special-case the beyond-ceiling terrain check per skill: Climbers check with the 0.9 ceiling rule, and walkers check with the open-ceiling rule.

What are your opinions?

-- Simon

NL 12.3.0

1. Activate the option to save auto replays of solutions (on by default).
2. Play and solve a level.
3. In the postview screen, click left for the next map.
4. In the preview screen, press arrow-left to return to the map from step 2.
5. Click to enter the map.
6. This replays the solution from 2.
7. In the postview screen, click left for the next map.
8. In the preview screen, hit ESC several times to exit NL.

Look in the replay-autosave dir. The newest 2 replays are identical text files.

Expected: Game doesn't save a replay if this has already been saved.

Bonus report of what works: This bug does not hit when (step 2: playing the map manually) is replaced with (step 2': load an already-saved solving replay and let it run to the end). The game doesn't save any files at all during 1-2'-3-4-5-6-7-8. This is good.

-- Simon

Closed / [Fixed][Player] Smooth resampling, default should be off
« on: August 12, 2018, 04:38:57 pm »
NL 12.3.0

Install freshly. Start game, start a level with small width and small height. Have a huge screen. The map is blurred. To fix, disable smooth resampling, both for menu and for game.

Expected instead: Smooth resampling for game is alrelady off by default.

-- Simon

Lix Levels / Behind Bars (lemforum Hopeless)
« on: August 04, 2018, 06:41:42 pm »
Forestidia and I solved Behind Bars (8/12).

-- Simon

General Discussion / Double date in Berlin, July 2018
« on: July 11, 2018, 09:49:42 pm »

Over the weekend, I visited Forestidia. We have a relationship; some forumers have already guessed that.

Flopsy and Lucia, his girlfriend, spent a week in Berlin for vacation. We decided to meet them!

At their hotel, Forestidia showed the Prince of Persia 1 and Commander Keen 6 speedruns. I gave the couch commentary. Afterwards, we went into town for lunch and smalltalk.

Here is a picture of Flopsy (left) and Simon (me, right).

This picture is confusing in light of the topic title "Double Date"; Flopsy and I are not in a relationship with each other. But the girls preferred not to have their pictures posted on Lemmings Forums.

Forestidia and I went to Tierpark, a large zoo in Berlin.

The Tierpark has porcupines -- both new-world porcupines (these sit in North American trees) and old-world porcupines. The particular old-world porcupine species in Tierpark is the Indian Crested Porcupine, a relative of the African Crested Porcupine that you see in my avatar.

Here's a happy Simon next to 3 porcupines cuddling in the corner. Those 3 porcupines are lying next to each other, touching. The middle porcupine faces leftwards, the othes face rightwards. Such social animals, they don't sting each other with their quills.

Here's a close-up. This porcupine sleeps in the shade, avoiding the afternoon sun. The hair fits along the body, the quills are down in peace. Who wouldn't want to cuddle?

I'm sure Flopsy remembers how much I raved about seeing these porcupines.

-- Simon

Lix Levels / Re: Skulls, Sludge, and Steel (spoiler)
« on: June 12, 2018, 08:16:46 pm »
Top-backroute: Skulls has a backroute by stretching 2 builders over the top, without help from any other skills. This backroute has become possible since 0.7 physics.

But even in 0.6 physics, similar things (that don't solve the map) were possible here:

0.6 Skulls backroute (click to show/hide)

Skulls should be designed much clearer such that these things clearly fail (instead of barely fail or even barely work).

-- Simon

Lix Main / Key of a level: How to map replays/trophies to levels
« on: May 29, 2018, 03:24:59 am »
Lix 0.9.17 has:
  • A level is identified by its full filename (path within levels/ plus the file's basename).
  • Identical level files in different directories are considered different levels for replay-to-level matching and for trophies (checkmarks).
  • Within larger sets of levels, it's popular to have ranks, i.e., one directory per 30-ish levels of that larger set.
Problems of 0.9.17:
  • When a level moves between ranks (e.g., we reorder levels in lemforum), that level's replays will point to nonexistant file and that level's trophies are lost.
  • The level is the unit of culture. The rank or the pack are arbitrary distribution methods and should not count towards level identity.
  • Consider two levels the same when they have the same basename (= the tail of the full filename that is independent of directories) and the levels have identical level titles and authors.
  • This treats the level directory as an associative array (a.k.a. dictionary) where a key is level title plus author plus basename (filename independent of directory). A value is then a level (the data in the file, not the file itself).
  • Store trophies (checkmarks) by key (basename, level title, author) and let replays point to keys instead of to full filenames.
  • Given a level file, it is trivial to determine its key. For each level, it remains fast to retrieve trophies.
  • To match replays back to levels, accept a dent in performance: When you have a key (filename without directory, level title, author), e.g., because a replay points to that key, you must first list the entire tree and then open all listed files with matching basename (usually 1 match but might be a couple more) to compare title and author.
  • To get the performance back, cache the key-to-full-filename resolution. While Lix is running, slowly index all files in the tree in the background. This would also make the search feature faster on Windows (slow harddisks, Windows itself, and Windows's virus scans nuke the search's performance).
  • When do you consider two levels the same for trophies (checkmarks) and replay-to-level-mapping? When only decoration changes, the level should probably still count the same. How about renaming the level file? How about moving the file or changing the level title? How about changing the skillset or number of lix?
  • Should the basename be part of the key? Or should the key consist only of level title and author? Should it consist of other things?
  • Or continue to map replays/trophies to levels by full filename alone, accepting above problems of 0.9.17?
  • For a selected level, I'd like to list all replays that point to this level. How should I implement that? Either I'll have to index the entire replay directory on demand (awfully slow), index the replay tree slowly in the background (feels weird for replays, but maybe okay), or require that replays for a level be put in a certain directory structure (but Nepster complained about Lix's replay directory structure, he wanted to sort replays by level position first, only then by solved/manual/proofs/...).
  • Can we require that a replay's basename should start with the basename of the level? That makes it much nicer to find replays for a given level file.
Older topic: Musings on level culture, 2017-07.

-- Simon


Proxima was visiting his sister in Münster, Germany, for a week. That's a 3-hour drive from Göttingen, but who cares, nice road trip with Icho!

From left to right: Proxima, IchoTolot, Simon.

I gave Proxima the American Family Feud card game. What would annoy Santa when he visits your house? Top answer: No cookies! Icho guessed naughty children, but children weren't on the card at all; mean dog would have given points.

Proxima showed us how to backroute some DROD maps. These backroutes are similarly smart and annoying to the level designer as Lemmings backroutes would be, but you can't fix DROD backroutes once the pack is declared final and got an online highscore board.

Proxima built this Lix multiplayer level. This is the 2-player version, but there are versions for 2 through 8 players. Do you go downwards or upwards to your exit? Standard strategic principles suggest to go downward, but there are splat falls, fire, and limited digging skills.

-- Simon

Pages: [1] 2 3 ... 12