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 ... 18
Lix Main / IRC logs (Nordicbots) are down
« on: December 01, 2023, 05:21:54 AM »

Lix's IRC channel is #lix on, join chat in your browser or use a dedicated IRC client.

The logs are usually at Nordicbots, but the logs are are down. I have seen that error, "At least one service is unavailable at the moment. Please try again later.", several times this year, I don't know if the logs have been up in the meangime.

Also, the logging bot, named Lovely, isn't sitting in #lix. I don't remember when he was there for the last time. From my client-side log, the latest entry for Lovely has been:

2023-08-22 22:42:11 * |Lovely| has quit (Ping timeout)

The following two bots are unrelated to logging: Bot Q is for nickname authentication; to have owner rights and operator rights on #lix, I have to be registered with Q. Bot __ (two underscores) is Mindless's relaying bot for forum posts from Lemmings forums.

I haven't investigated more than this.

-- Simon

Non-Lemmings Gaming / Temporal (action-puzzle game, 2008)
« on: November 29, 2023, 06:08:37 AM »

What? Are we late for something?
On the contrary! We are too EARLY!

Temporal (2008) is a freeware action-puzzle game by renboy.

Watch trailer on Youtube

Download Temporal 1.11
Download Temporal's original soundtrack

On Windows: You can double-click temporal.exe, but then Temporal will force a hardware fullscreen resolution of 1024x768. If you have a wide monitor, run Temporal windowed instead:
temporal.exe -win

On Linux: Temporal runs well in Wine, but the forced fullscreen is even nastier here. To run Temporal windowed:
wine explorer /desktop=1024x768 temporal.exe

Left/right arrows to move.
Up arrow to fly.
Down arrow to use the device in which you're standing.
F1 shows overview of all other hotkeys.

About: You'll solve real-time physics puzzles that first look impossible, but are solvable by going back in time. You can accomplish more things while your earlier instances of yourself are busy elsewhere on the level.

Temporal has 30 main story levels that you must play in order, plus 5 unlockable challenge levels. Even as a dedicated puzzle solver, you'll spend several evenings on the main story. And I haven't solved all challenge levels either.

Most tasks require experimentation and solid route planning. Several tasks require precise execution; if stuff goes wrong near the end, you'll have to repeat 1 to 3 minutes of work. You have infinite lives and there are automatic in-level checkpoints, but you can't quicksave.

I've known Temporal because, back in 2008/2009, I lurked the Allegro 5 forums and saw renboy's release thread. I have versions 1.00, 1.03, and 1.11 lying around; the 1.11 is in the download above and it's the latest that I know.

Temporal doesn't feature level editing or user content, and I don't know any active dedicated websites or communities. renboy eventually lost ownership of his domain around 2010.

Music bug workaround: In level 18, named "Synchronized", if you move away too quickly while the long dialog is still on screen, music won't play for the remainder of the level. If you reach the checkpoint in level 18 and you hear no music, you've run into this bug. The workaround is to restart the level and:
  • Either cancel the long dialog explicitly (press return),
  • or stay around until the last line ("Now, begone!") has disappeared.
-- Simon


I'm back from a 3-week vacation to Vienna.

geoo, Ramond, and Peter live in/near Vienna. I've been there in 2015, and I've always promised them a re-visit. This September, we finally did it. Thanks to Peter and geoo for hosting me for over a week each at their places!

We took long walks, swam in the Danube, rode bicycles, raced Lix singleplayer, cooked Gargantua Blargg's spicy stew, and played a heap of board games. I'll post the stories here after I've got the photos off my laptop computer.

Sneak (card game) already got its own topic for playtesting/development. Nobody of us had played before; we discovered Sneak during my vacation in one of my books.

-- Simon

Non-Lemmings Gaming / Sneak (card game)
« on: September 24, 2023, 08:55:54 AM »

geoo and I are working on Sneak, a card game designed by David Parlett.

3-6 players. One or two standard decks of 52-cards.

Sneak rules on Parlett's website

We started with the above Sneak rules. Technically, we didn't start with the website, but with the Entensuppe book, a German book from 2008 with translations of Parlett's games. But the website and the book appear to agree.

We played with 3 or 4 players and always used 52 cards.

Eventually, we changed some rules:
  • #1: Replace the standard 52-card deck with Five Crowns, but remove the 6 jokers. This new deck contains 110 cards: 3456789TJQK (no aces, no deuces) in 5 suits and 2 copies per card.
  • #2: Rank straight flush higher than matches (a.k.a. tuples, n-lings).
  • #3: Rank flushes higher than straights. (Both still rank below matches.)
The re-rankings feel appropriate for the 5-suited deck, and it's handy that the rankings now agree with Poker.

It's possible that even for the standard double deck of 104 cards, straight flush should be ranked higher than matches, but we didn't playtest that. We went directly from the standard single 52-card deck to the Five Crowns deck.

Longer decks increase the scope of play before the stock runs out. Still, hoarding cards in hand until the end may be too good: Never sneak, rarely challenge other people's plays, and if you challenge, do it only with your very strong hands. At the end of the game, be the one player with cards left in hand and put them into your pile of winnings.

We'd like to encourage a more daring playstyle. Toward that, geoo is considering to change Parlett's endgame rule to:
  • #4: After a player has drawn the last card from the stock, there will be exactly one more round of turns, starting as usual with the player after the drawing player, ending with the drawing player. On your turn, you must flaunt; if you have zero cards in hand, skip your turn. After this final round of turns, leftover cards in hand become worthless. You don't add them to your pile of winnings.
If this proves sensible in playtesting, I'll write down a full ruleset with these adaptions.

-- Simon

Non-Lemmings Projects / Turnierbild Dark, a PySolFC cardset
« on: August 21, 2023, 10:08:10 PM »

What's This

Turnierbild Dark is a cardset for PySolFC, a free-and-open-source solitaire/patience collection written in cross-platform Python 2. A cardset is an alternative skin for the playing cards in PySolFC.

Turnierbild Dark is my modification of the XSkat German cardset that ships with PySolFC. I've recolored the four suits according to the four-color tournament Skat deck, called Turnierbild, which gives my cardset its name. I've changed the card paper from white to dark grey. The face cards are dimmed.

How to Install
  • Install PySolFC. I tested with version 2.21.0.
  • Download the attached .zip.
  • Find your PySolFC user directory. On Linux, it is: ~/.PySolFC/ Maybe you must run PySolFC once to have it create that directory.
  • Extract the .zip into the directory cardsets/ in that user directory. You should now have this directory structure: <your user directory>/cardsets/cardset-turnierbild-dark/01c.gif
  • Run PySolFC.
  • Options -> Cardset..., select: Turnierbild Dark
I recommend a dark table to go with Turnierbild Dark, e.g., the plain black from my screenshot, or the galaxy at night. Choose the table color in Options -> Table tile...


By design, four colors remove the tight coupling between (diamonds and hearts) and bewteen (spades and clubs). That's a problem for games with alternating red-black packing. Look at the screenshot. In the rightmost column, we can grab and move 8-7-6-5-4-3-2 as a unit, but we can't move the entire Q-J-...-2 because the 8 and 9 are both black suits. Ideas to improve the red-black problem are welcome. Although I'll be picky. There is personal taste at stake. I must subjectively like the resulting set.

Face cards have indices only in two corners, not four. Let me know if you find games where that is problematic. Forty Thieves fans the discard pile leftwards, but you can still see the indices at the bottom right.

Graphics for open spaces aren't in dark mode. E.g., in the screenshot, the two empty club foundations are too light, as is the free weaving space on the very left in. Let me know if you find a way to fix that.

-- Simon

Lix Main / Bit pushing in the Lix struct
« on: July 31, 2023, 03:28:05 AM »
Here's some loose rambling from pushing source code around. I don't have concrete plans to rework anything here, but I've re-examined the existing memory layout this weekend. Thus, why not write it down, maybe it's of interest.

A lix (the struct Lixxie that describes a single lix) is 56 bytes long, assuming we're on a 64-bit machine with 64-bit pointers. The layout is roughly like this:

Bytes 0-32: The lix's job, an emplaced subclass of Job. All subclasses fit into 32 bytes.
Bytes 32-36: Position as two 2-byte integers
Bytes 36-38: 2-byte bitset for all the bools such as facing direction, ability to climb, ...
Bytes 38-40: Queued fling speed as two 1-byte integers
Byte 40: Style (color, player affiliation)
Byte 41: Encounters (water, exits, ...) during the current physics update
Byte 42: Exploder timer in multiplayer
Bytes 43-48: unused (5 bytes)
Bytes 48-56: Pointer to the entire physical world. Kitchen sink object, only filled & used during updating.

The first 32 bytes of that are the emplaced Job; in detail, the Job looks like this:

Bytes 0-8: vtable pointer for the Job class object
Bytes 8-16: monitor pointer for the Job class, an unused (?) multithreading D object per class object
Byte 16: Activity (determines vertical frame in the spritesheet)
Byte 17: Horizontal frame in the spritesheet
Bytes 18-32: Subclass payload: Job subclasses define it, e.g., leftover builder bricks, miner anti-shock

Things in the Job subclass are properly aligned. If the first field wants to be 4-byte-aligned (e.g., the common 32-bit int, which has size 4 and alignment 4), it goes at byte 20 in the Job, with bytes 18 and 19 unused padding. In D as in C++, a single-inheriting subclass starts its data after the base class's data, and the base class's data comes after the hidden vtable pointer (and in D the monitor pointer).

| 0-8: vpointer of Job |
| 8-16: monitor of Job |
|Ac|fr|      18-32:    |
+--+--+     subclass   |
|           payload    |
| 32-36:pos|flags|fling|
|st|en|tm|  5 unused   |
| 48-56: world pointer |

Cache lines in most computers are 64 bytes. If you fit into a cache line, you're quick to load.

The lix is 56 bytes long, that fits. Still, I should try to pad it with 8 more unused bytes. The padded lix would then always be 64 bytes long, and it's possible that it'll be even more cache-friendly (even though it's longer!) than the 56-byte lix.

The alternative experiment would be to pack everything into 32 bytes. The bytes will then be as snugly packed as a pile of kittens. We'd have to pass the pointer to the outside world in the methods, or abuse the memory layout and cram it over the (hopefully unused) monitor pointer. I think I could reduce the Job subclass payload from 12 to 8 bytes, and cram the Job-independent fields from 16 bytes into 12. It would be an elaborate experiment.

The elephants in the room are really the pointers. These 64-bit pointers (8 bytes) are fat walruses. You can't herd too many of those in your bathtub at the same time.

-- Simon

Lix Main / Phyu (# of physics updates) is bad word, replace with Tick
« on: June 27, 2023, 10:50:16 PM »

Phyu in Lix is a contraction of "physics update", and denotes the number of physics updates that have passed since 4 seconds before the spawn of the first lix.

Phyu is a bad word:
  • It's a made-up word that appears nowhere else but in technical discussions of Lix.
  • It's nondescriptive, you don't necessarily guess that I use it as a measuring unit.
  • It's a contraction of a verb (we're advancing physics), not of a noun (we have updated physics this often).
  • It's annoying to pronounce.
Replacement ideas:

Frame: I don't like frame because we can confuse physics frames with graphics frames. Lix runs at 60 fps, these frames are graphics frames, and we update physics at normal speed 15 times per second, 15 fps. I'd like two clearly different words instenad.

Age: I like this best. We're at age 100, and soon we'll be at age 101, very nice. Still, it leaves a sour taste: We update at 15 age/s, age(s) per second, huh? Age sounds like it must be far longer than a second.

IGT: An acronym for In-Game Time, as opposed to real time. Lix runs at 15 IGT/s? Sounds strange.

More proposals or arguments please, otherwise I'm sticking with age.

I'm even open to redefine age (or how we call it) to start at the first spawn, not at 4 seconds (= 60 physics updates) before the first spawn. I'll still write replay files as if the first spawn were at phyu 60, not at age 0. The 4 seconds are because networking games, and even singleplayer in old (2007-2010) versions of C++ Lix, start 4 seconds before the first spawn, and blissful teenage 21-year-old Simon immediately baked it into the replay files.

-- Simon

Prompted by the DMA manual's figure of level width 1600, I've re-tested level size and edge behavior on DOS Lemmings 1.

You can scroll around to see 1584 pixels of the official 1600 pixels, i.e., all but the rightmost 16 columns. You can't scroll any further to the right.

The left edge turns lemmings.

The right edge extends even beyond 1600 pixels as extra air, still inaccessible to the game's main camera, but observable on the minimap. There is considerable empty space at the right, certainly more than 16 pixels beyond the visible 1584. On DOS, in Rendezvous at the Mountain (DOS password GKNONNIIJQ), I can build an entire 12-brick bridge into the unscrollable void and I still see lemmings fall off the end of the bridge, dying only in the void at the bottom. With only the first brick visible, the bridge is 22 pixels long, and I sneak in another builder to make it at least 23 pixels long beyond the visible 1584.

So far, this agrees with Proxima's post about L1 edge behavior: Left is solid, right is open on DOS and Mac.

Compare with the Rendezvous Amiga screenshot on Lemmings Encyclopedia, which is 1591 pixels wide. The rightmost 7 pixels in this screenshot are not viewable on DOS. The left edge in the screenshot agrees with the DOS visible left edge.

But, lurking in the darkness, there is more.

New and exciting! There is an eventual solid right edge on DOS Lemmings 1. It's about 2 or 3 bridge-lengths away from the visible section.

You can't hover the mouse over lemmings in the scrolling-incessible section, which is everything beyond the first 1584 pixels. The method to build bridges in the inaccessible section, to eventually reach that solid right edge, is to abuse the right-click bug:
  • Select builder in the panel.
  • Hover over an eligible lemming which you want to build later.
  • Press RMB, holding RMB throughout all remaining steps.
  • Hover over a blocker. (Or any lemming that cannot receive builder.)
  • Wait until the eligible lemming is where you want him to build.
  • Click (press LMB) on the blocker. The eligible lemming will now build.
Repeat this bug 1-3 times with fresh lemmings from the rightmost hatch on Rendezvous. Eventually, you've reached the solid right edge, and lemmings will return to the visible area, as in the screenshot above.

It's so far right that the green points (that mark lemmings on the minimap) are getting on the minimap's red border. There is more to research here about where exactly that solid right edge is. I took a wild guess in that it's around X = 1640; it took me 3 bridges to get there. But I didn't build optimally.

There seems to be nothing special about the DMA manual's figure of 1600 for the level width. Scrolling stops earlier than that (at 1584), but physics stop later (at ~ 1640).

-- Simon

Tech & Research / DMA's Lemmings 1 Editor Manual
« on: June 09, 2023, 12:25:43 AM »

digging through the links on Lemmings Universe (post here on LF), I found Mike Dailly's blog from 2021 through now. There is a page for all Lemmings images of the blog. Among those, there are scans of the

Manual of DMA's Lemmings 1 editor:
Page 1
Page 2
Page 3
Page 4
Page 5

On page 2, we learn that "X Co-ordinate goes from 0-1599, Y Co-ordinate goes from 0-199 although this includes the icons which do not form part of the level. (Not in this Universe anyway.)" Thus we should deduct some space from the Y range, but there is no reservation about the X range.

It follows that Lemmings 1 levels (Amiga at least?) are really 1600 pixels wide. On DOS, we can only see 1584 pixels, the screen cannot scroll all the way to the right. Nonetheless, through x = 1599 and even beyond, the unscrollable emptiness behaves like air until even the right edge eventually becomes solid.

On page 5, we learn what you can do with behind mode a.k.a. no-overwrite mode: "This applies to object mode as well, for such things as hidden exits."

-- Simon

Lix Main / Next Bugs to Prioritize
« on: June 04, 2023, 10:41:31 PM »

Test Release 3 - 20/01/2022, Linux release (probably same for Windows)

The installation of L2Player tells us to extract it into the same directory where our L2 sits. This seems only necessary for the first successful run of L2Player because L2Player now extracts the L2 resources into its own tree that L2 cannot see.

The problem is that both L2Player and L2 contain several files in their root directories, and it's hard to separate the two programs later. E.g., if L2Player gets new files or drops files from its release, it's hard to wipe L2Player and cleanly reinstall. For now, I've duplicated the L2 files into L2Player's directory because I don't trust L2Player yet, it's a new program for me. :-)

I'd like a way to point L2Player to an L2 installation elsewhere for resource extraction. I expect L2Player to only read from that L2 path then, not modify any files in it. It's okay to continue to extract from the working directory if I don't explicitly point L2Player to an L2 installation.

The first idea that comes to mind is a command-line option, e.g.:
$ L2Player --extract-from=/path/to/l2/
or, if you need it more often than only during first run:

But anything is fine for now, e.g., you can ask me at runtime, or you let me edit a line in a config file. Or even declare it low priority. It's not so hard to duplicate L2 into L2Player.

If L2Player has already extracted the resources, I expect to run it later without pointing it to L2 again. In particular, if you don't give me a way to point L2Player elsewhere, I'd like to know how soon I can remove the duplicated L2 files in L2Player's root dir.

-- Simon

Test Release 3 - 20/01/2022, Linux version
  • Download and extract the Linux release to new directory.
  • $ chmod +x L2Player
  • Copy an entire L2 directory over the same directory, so that L2Player and L2.EXE now sit in the same directory.
  • Run L2Player. It extracts many files, then crashes with log below.
  • Look at ./data/music/: This directory contains only one file, Readme.txt.
Code: [Select]
PCMA: Load ./data/cache/sound/sound_77.pcma
PCMA: Load ./data/cache/sound/sound_78.pcma
PCMA: Load ./data/cache/sound/sound_79.pcma
Cached 80 sound(s)
SpriteSheet: Calculated 102 font widths for ./data/cache/font_0.spt
SpriteSheet: Calculated 59 font widths for ./data/cache/panel_2.spt
SpriteSheet: Calculated 102 font widths for ./data/cache/font_0.spt
SpriteSheet: Calculated 102 font widths for ./data/cache/font_0.spt
Starting OpenAL... 1.1 ALSOFT 1.23.0, OpenAL Community, OpenAL Soft
AudioStream: Unable to find file ./data/music/title.mod
PlayStream: Error - Object reference not set to an instance of an object.
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at SharpMik.Player.ModDriver.MikMod_Exit_internal() in C:\Dev\Retro\Lemmings2\SharpMik\SharpMikCore\Player\ModDriver.cs:line 535
   at SharpMik.Player.ModDriver.MikMod_Exit() in C:\Dev\Retro\Lemmings2\SharpMik\SharpMikCore\Player\ModDriver.cs:line 549
   at L2Player.AudioStreamMOD.CloseStream() in C:\Dev\Retro\Lemmings2\L2Player\L2Player\Audio\AudioStreamMOD.cs:line 73
   at L2Player.AudioPlaybackEngine.PlayStream(String fileName) in C:\Dev\Retro\Lemmings2\L2Player\L2Player\Audio\AudioPlaybackEngine.cs:line 118
   at L2Player.Game..ctor() in C:\Dev\Retro\Lemmings2\L2Player\L2Player\Game.cs:line 84
   at L2Player.Program.Main(String[] args) in C:\Dev\Retro\Lemmings2\L2Player\L2Player\Program.cs:line 91
Aborted (core dumped)

Expected instead: If I have no music, I can still play without music.

./data/music/Readme.txt says: "If you don't like the midi versions of the music, you can place .mod or .it (Amiga Tracker) versions here [...]" This sounds as if you want to ship midi music with your release. Do you want to ship midis?

-- Simon

Test Release 3 - 20/01/2022

The Linux release contains OpenAL32.dll and wrap_oal.dll. The Linux executable is a native 64-bit ELF, and it runs as expected even when I delete both DLLs:

Code: [Select]
SpriteSheet: Calculated 102 font widths for ./data/cache/font_0.spt
Starting OpenAL... 1.1 ALSOFT 1.23.0, OpenAL Community, OpenAL Soft

Thus, you can omit OpenAL32.dll and wrap_oal.dll from the Linux release. You already instruct to install OpenAL natively.

-- Simon

NeoLemmix Main / Environment to Build NL
« on: May 01, 2023, 05:13:49 PM »

git clone

The obvious entry point then is Readme.txt, which tells us that we need Delphi XE6, but namida wrote in 2021 that we need "10.3". I assume this is still accurate and it means Delphi 10.3 Rio. This is available as Delphi Community Edition, apparently under some proprietary gratis license, and they want me to make an account, and invent a fake address and fake phone number.

namida, do you recommend this community edition to build NL? Or are there more up-to-date build instructions that I haven't found yet?

Is there a way to compile NL with commonly available tools where we don't have to create accounts?

-- Simon

Lix Multiplayer Dates / Lix Campfire, Sunday, April 30th, 17:00 UTC
« on: April 26, 2023, 12:41:37 AM »

Let's meet in Mumble for loose discussion this Sunday, April 30th, starting 17:00 UTC. Flopsy has time to join this Sunday. Who else is up?

Haven't joined Mumble voicechat before for multiplayer? Ask me for Mumble server details. I'll PM you.

Possible topics:
  • What annoys you in Lix?
  • Singleplayer panel UI: What buttons to show? What buttons to hide in a secondary menu, or possibly a second bar?
  • The 2023 roadmap.
  • Level reorderings in lemforum. It's been a while and I'll have to piece together suggestions from last year's threads. Do you already have concrete ideas?
  • Anything you like. Please bring your own topics!
-- Simon

Pages: [1] 2 3 ... 18