Menu

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.

Show posts Menu

Topics - Simon

#1
CE 1.0.1
NL 12.14

Clear Physics Mode shows the silhouettes of all gadgets in rotating colors. There is a global timer, and the color of the silhouettes is that timer modulo N in the circle of fully-saturated colors (red, orange, yellow, ..., cyan, pink, red).

Enough with that! I use Clear Physics Mode when details matter, and I don't want this distracting color clashing.

In 1.0.1 Clear Physics Mode, lemmings are dark-blue (0, 0, FF). Instead, make lemmings medium-blue (80, 80, FF). That's easier to see than dark blue (this alone will be an improvement!) and it will remain sufficiently different from the cyan athletes (0, FF, FF).

Now you can make gadgets dark green (0, 80, 0) and you won't step on any toes.

Pick other colors than what I propose, I'm happy to try other choices.

-- Simon
#2
CE 1.0.1
NL 12.14 and other versions from years ago.
Wine 10.6

  • Start a level.
  • If it's a small level, zoom in until you can scroll.
  • Scroll with the hold-to-scroll feature. E.g., map this to the right mouse button in NL's options, then scroll by holding the right mouse button.
  • While you hold-to-scroll, press a skill hotkey to select a different skill.

Observed: You have a ~50 % chance to select the new skill. Otherwise, the skill key has no effect and the old skill remains selected. (The hold-to-scroll will always continue to scroll correctly, whether the new skill selects or not.)

Expected instead: The new skill gets selected for certain. (And the hold-to-scroll will always continue to scroll.)

-- Simon
#3
NL 12.14 on Ubuntu in Wine 10.0
CE 1.0.1 on Arch Linux in Wine 10.6

The splat ruler lags the entire engine as long as it's active.

Repro:

  • Play different levels in NeoLemmix for 2 hours. (I believe? Some preparatory step here is necessary because I can't repro it here on a fresh program run. Or do I have to screenrecord NL? I doubt it.)
  • Play Turrican's level Space Program 10,000 BC v1.01, it's attached. It's large and it contains many special tiles. The file alone is 400 KB.
  • Scroll around (with right-click scrolling) to get a feel for performance without the splat ruler.
  • Tap the key for the splat ruler.
  • Scroll around (with right-click scrolling) to get a feel for performance with the splat ruler.

CE froze for several seconds. If I hold (not merely tap) the key for the splat ruler in step 4, CE froze for 10 seconds, then stuttered at 1 frame per second. It was severe in my livestream from 2025-05-28:

Video: Splat ruler freezes CE for 5-10 seconds (70 seconds long, 4.4 MB)

NL/CE return to regular performance (= less lag) after we release the key. And if we play more/different levels afterward, the ruler doesn't dent the performance anymore there, even after it had dented performance on Space Program 10,000 BC.

Backgrounds on/off seems to make no difference. Can't test again now because step 1 is hard to guess/repro. So strange that it doesen't reproduce immediately after a fresh game run. So hard to guess what's going on internally ... it's such lag, and only on Turrican's level. And why do other levels run fine afterward even with the ruler?

Quote from: Guigui on June 02, 2025, 11:43:07 PMon my machine, the ruler is a bit laggy. When I press the key it appears correctly, but it stutters when I try to move it accross the screen. To move it, I better make it disappear, then reappear again elsewhere, not very handy.
Is it just me (running NeoLemmix on Ubuntu + Wine) or all NeoLemmix users ?

-- Simon
#4
Players don't remember the exact rules of overtime and nuke. People ask why the overtime doesn't start, or why the nuke doesn't work. I'll treat these questions as bug reports against the nuke/overtime design.

In 0.10, if you nuke, you lose all remaining skills immediately, and overtime starts once you have 1 or more points. This is too complicated. The original design goal in 2010 was (a) to prevent people from nuking before anybody can score, and (b) to challenge other players to beat your score. Yes, the 0.10 nuke solves this, but pays too high a complexity cost (it has too much if-then).

In a 4v4 team game (of 2 teams), if the newbie nukes on your team, all players on that team lose their skills. That must become impossible. The obvious answer -- changing the nuke button into a majority vote, i.e., more than 50 % of the players on your team must push nuke for the nuke to activate -- would pile even more if-then rules onto the existing unrememberable nuking system. We can do better.

But the whole nuke-overtime system is a hard design problem to solve.

I'm contemplating to ditch the loss of skills altogether when you press nuke. Your nuke still triggers overtime, but you keep your skills and continue playing. In 0.10, it's strange that the loss of skills doesn't always go hand-in-hand with the start of overtime: When you nuke and have 0 points, you lose the skills, but overtime doesn't start.

It feels correct to keep the nuke as a game element. It allows you to force the remaining players to bring an almost-over game to a timely conclusion. I don't want to ditch it altogether.

None of this solves the confusing overtime, i.e., when exactly the overtime starts. This is still too confusing to explain to new players. The first hunch is to start overtime immediately when somebody scores 1 point from his own lix (to prevent accidental triggering by others who start near your exit), but that, again, wouldn't be elegant to explain. I have no good answer.

-- Simon
#5
School quiz! This is about the rules of multiplayer Lix. Consider a 4-team game, with teams red, yellow, green, blue. A red lix enters an exit.

Question 1: The exit shows the team colors of red and yellow. Who gets points for the red lix?

Question 2: The exit shows the team colors of green and blue. Who gets points for the red lix?

Question 3: Is Simon happy about this? Why?

Question 4: What design do you think he will propose instead?

Question 5: Why is wrong to implement the design that you think Simon will propose, and what should he implement instead?

Answers to Q1 and Q2
Exit has red and yellow, red lix enters: The red team gets 1 point. The other teams (yellow, green, blue) get nothing.

Exit has green and blue, red lix enters: The green team gets 1 point, and the blue team gets 1 point, too. The other teams (red, yellow) get nothing.

Questions 3-5 don't get a spoiler immediately. I will eventually write down my ideas. But I'd rather not stir the pot before I've seen other people's opinions. There will be no failing grade here; everybody who answers will pass the course.

-- Simon
#6
NL-CE 1.0.1.

Repro:

  • Have a level with climbers, shimmiers, and a ceiling to which we can climb.
  • Make a lemming climb the wall.
  • Select shimmier in the panel.
  • Near the ceiling (but before he reaches it), hover over the climber and click.
  • You'll hear the sound for a failed assignment.
  • Wait for the climber to reach the ceiling.
  • The lemming will shimmy. Edit: You'll also hear the sound for a successful assignment.

Observed: Sound for the failed assignment in step 5 and successful shimmying in step 7.

Expected instead: No sound in step 5 when we click. (Reason: The click produces an effect, it queues a shimmier, therefore it was successful.) Still successful shimmying in step 7.

-- Simon
#7
Hi,

I will livestream the candidates for Level of the Year 2024. The stream will be Saturday, May 10th, starting 16:00 UTC.

Help solve the levels in chat! (Unless you had already known the solution by heart before the stream.)

Stream will be at: https://www.twitch.tv/simonnaar

-- Simon
#8
NL CE 1.0 in Wine 10.2 on Arch Linux.

  • Start CE.
  • Click in the main menu to go to a level preview.
  • Wait for the fade-in to finish or not, it makes no difference.
  • Press Esc to start the level preview's fade-out.
  • Press Esc a second time, either before the level preview has finished fading out, or before the main menu has finished fading in.
  • Watch the main menu fading out.
  • See NL crash. Screenshot of the error box is in the attachment.

20-second video of the crash

Expected instead: No crash. I should get the same result regardless of how often I mash Esc during the fade-outs.

The program quits cleanly when I wait until the main menu has finished fading in before I press Esc the second time.

No data is lost. The program has already saved all user options and level results before it ever tries to quit from the main menu.

-- Simon
#9
Other Projects / NeoLemmixSharp by ∫tan x dx
February 24, 2025, 01:39:14 AM
Hi,

∫tan x dx develops NeoLemmixSharp, a work-in-progress C# port of NeoLemmix.

I don't have a C# toolchain readily installed, therefore I can't tell about any details. Judging only from the size of the codebase (70 % to 80 % of Lix), it looks significantly advanced. But I can't tell if NeoLemmixSharp is already playable. I assume it's not yet, because you haven't announced it yet? I'll see when I get around to install a C# toolchain here on Linux.

Last year, I've met ∫tan x dx in Leeds. You told me about this project, and that we should eventually discuss some implementation details on the forums. :D

-- Simon
#10
Help & Guides / Delphi, understanding the NL/CE codebase
February 08, 2025, 07:12:16 PM
Here are questions from Tuesday, 2025-02-04 when I looked with WillLem at the NL-CE source.

Downcasting in Delphi happens with as, e.g., myDerived := myBase as Derived. This is the equivalent of Java's instanceof or C++'s dynamic_cast<Derived*>(myBase), where I get null if the runtime type isn't Derived. In OO design, it's hackish to force usercode to downcast. Thus:

Does Delphi allow to type-parametrize my own types? Or: What is the closest Delphi equivalent to C++ templates/Java generics? If we have two lists of replay entries (one for assignments, one for RR changes), I want one to be a list of Assignment and the other a list of RrChange, not two lists of Base (the base class of both Assignment and RrChange). Then my callers don't have to downcast.

What is the closest Delphi equivalent to std::span (a slice, a pointer-with-length)? E.g., my object contains the array [0, 1, 2, 3, 4, 5], I would like to return the view [2, 3, 4] to my caller without making a copy of the entries.

I expected the search function (find the assignment for a given physics update) in the list class, not in the replay manager class. The search works purely with that list and it's a natural operation for that list.

The search has at least one near-duplicate.

When your list (of assignments, of ...) is always ordered, you can find elements by binary search instead of by linear search. But this doesn't matter when you have 30 elements in the list and you search it only a few times per second. And this (5 to 100 assignments and RR changes) is the extent of most Lemmings solutions. Don't prioritize rewriting the searches to binary search.

-- Simon
#11
NeoLemmix CE 1.0-RC1 in Wine.

  • Extract to new directory.
  • Copy settings/ from an existing NL into CE. (Should I attach a copy?)
  • Run NeoLemmixCE.exe.

Observed: Main menu appears, and a message box appears: "A NeoLemmix update, V12.14.0, is available. Do you want to download it?"

Expected instead: Main menu appears. No such update box appears. Two reasons: CE 1.0 is newer than NL 12.14. And CE isn't distributed via the NL website.

(After this, CE runs well. Ah, this is wonderful, the zoom bug is fixed and it has the decreed 12.14 physics.)

-- Simon
#12
Dosbox too loud?

mixer master 10:10

Execute this line within Dosbox before you run your game in Dosbox.

E.g., put it in your configuration's autoexec section (see the bottom of dosbox.conf), or type it at the prompt before your game.

What it means

"master" means Dosbox's master mixing device. This affects all sound sources in Dosbox, e.g., Sound Blaster, PC Speaker, ...

"10:10": The two numbers separated by a colon define the two volumes for the two audio channels (left and right). Practically always, you want to put two equal numbers separated by a colon. But you have the option to put different numbers.

You can give each number in one of two formats:

  • You can give a number unadorned, then Dosbox interprets the number as a percentage (popular but nonsensical), where 100 is full scale (the sensible maximum without clipping) and 0 is silence.
  • Or you can write d- in front of the number, then Dosbox interprets your number as negative decibels from full scale. Here, d-0 is full scale, and d-inf is silence.

Fractional values are allowed: mixer master 5.5:5.5 is a volume between 5:5 and 6:6, even though Dosbox will print it rounded to integer. You can put several digits after the decimal point, e.g.: mixer master 1.23:1.23

The percentages really mean the following:

mixer master 100:100  means  mixer master d-0:d-0  (full scale)
mixer master 10:10   means  mixer master d-20:d-20  (a nice volume)
mixer master 1:1   means  mixer master d-40:d-40  (pretty quiet)
mixer master 0.1:0.1   means  mixer master d-60:d-60  (almost silent)
mixer master 0:0   means  mixer master d-inf:d-inf  (absolutely silent)

For −x dBFS, percent(−x) = 100 ⋅ 10^(−x ÷ 20).

For p percent, dBFS(p) = 20 log10(p ÷ 100).

Miscellana

Type mixer without any arguments to see the current volume.

Put /noshow after the command to suppress Dosbox's immediate printing of the new volume levels, e.g.: mixer master 10:10 /noshow

You can choose volumes louder than full scale, e.g: mixer master 120:120 Or: mixer master d+2:d+2 But these volumes clip. You should first consider other means outside Dosbox to make the overall volume louder.

Sources


-- Simon
#13
Lix Main / 2025 Roadmap
January 18, 2025, 01:54:14 AM
2017 -- 2018 -- 2020 -- 2022 -- 2023 -- 2025



UI

Scissors mouse cursor: Change the mouse cursor to scissors when a click will cut the replay. I tried this, and a full scissors cursor was annoying, it made it hard to point at things. Instead, it's now done in 0.10.30 as a small sidekick to the cursor, Github #400.

Add an icon near the mouse cursor that means insert mode. There is no obvious icon for inserting. Done in 0.10.30, source of the idea.

Explain gadgets on mouseover (catapult, steam, trap). This is good newbie onboarding. Newbie onboarding is important; bad UX confuses newbies and they never play again. Done in 0.10.30, Github #494.

Add flying shovel/jackhammer for basher/digger who hits steel. Done in 0.10.29, Github #496.

Upgrade Allegro DLLs in the Windows release to 5.2.10. I forgot why I wanted that. But it's the newest version, updating is good anyway even if I don't remember why.  Done in 0.10.29.



Physics

Fix several of these bugs:

  • #47 The ❤-Bug for Basher/Miner. When a basher or a miner turns at a blocker, the basher/miner won't consider the new terrain that now blocks his path. The basher/miner can clip through walls. Miners can clip through floors.
  • #491: Jumper clips upward through terrain
  • Basher (after lowering) clips forward through terrain. This is the same underlying bug as the ❤-Bug. Again, we put unexpected terrain in front of the basher, and the basher clips through that terrain. Here, we didn't use a blocker; we used the basher's down-stepping.
  • Miner hovers in mid-air when he mines along a builder staircase. You can assign blocker to cancel in mid-air. The lix will then fall and revert to walker.
  • #471: Platformer is inside his first brick. When you assign jumper at a specific time, the lix will be stuck and not jump.
  • Remove unglitching out of wall: Ascenders travel inside the vertical wall. This requires extra code in tumbler.d to move the ascender out of terrain when something is about to fling an ascender. The ascender should take a better path outside the wall.
  • Runners Bypass Exit, Walkers Exit: A moving lix looks for exits or triggered traps only at the end of her entire physics update, not during her path. We want to look during her entire path instead.

Write a manifesto on Lemmings physics. Never should a lix willfully enter terrain, unless we override it explicitly, e.g., for ascender. Never should a lix hover, unless we override it explicitly, e.g., for builder. Replace some physics primitives, e.g., scan at (x in front | y up), e.g., move ahead unconditionally, ... with higher-level commands: "walk ahead" should mean { move ahead iff you're standing on floor and there is air ahead }. Rewrite some physics in these higher-level terms. See how much of the physics will break. We can still decide if all this is too aggressive.

-- Simon
#14
Hi,

Lix test executable for many mouse buttons

This adds support for more than 3 mouse buttons.

Do you have a mouse with extra buttons? Please try this (put it into a full Lix tree, e.g., from a fresh download). Bind your extra mouse buttons to some skills or functions. Will the bound mouse buttons work during play?

Silken, please turn off your external mouse-to-keyboard binding tool for this test. Lix should really see you mouse buttons as-is, not as keyboard keys.

This doesn't yet export the new bindings to the options file. As a result, this version of Lix doesn't remember the extra mouse button bindings after you exit and restart Lix. Before we can merge this, I'll have to decide how exactly to export/import mouse button bindings from the options file.

-- Simon
#15
I've toyed with the zoom behavior in Lix 0.10.26.

Existing rule from Lix 0.9 and Lix 0.10: Generally, preserve mouse-on-land when you zoom. But if you can move the camera to see more land (and less void, i.e., less of the dead area outside the level boundaries), always prefer to shift more land into view over preserving mouse-on-land.

Experimental rule A: Generally (and more often than before), preserve mouse-on-land when you zoom. Only shift more land into view if the camera would center on a void pixel after the zoom. Or, worded in a different way: Eventually, we still shift land into view, but the camera will allow some void (up to 50 % each of left/right/top/bottom may be void) before the camera prefers more land.

Bonus effect of rule A: When we zoom in, we zoom into the mouse cursor, which enlargens (or at least keeps the same amount of) the land on all four sides of the mouse cursor. This can never run into the situation where rule A wants to shift more land into view. (Only zooming out can shift more land into view.)

Downsides of rule A: When we zoom out, the land isn't necessarily anchored at the panel at the bottom any more. I can try to change the rules and re-anchor, but it will come at the cost of less mouse-on-land preservation.

See it animated


Both of these gifs are under this experimental rule A.

  • In the 1st gif, the zoom preserves the mouse-on-land completely.
  • In the 2nd gif, the mouse is close to the corner of the screen. Here, preserving mouse-on-land would eventually shift too much void into view, and rule A tells us to move the camera to avoid more than 50 % void at the left side of the screen. (This can only happen when we zoom out, never when we zoom in.)

Test it yourself: Put lix-0.10.26-halfvoid-camera.exe into your 0.10.26 tree, or build branch camera from my unstable repo. Either way, you'll get experimental rule A.

What do you think? Is this useful or annoying?

Do you want to allow even more void, to preserve mouse-on-land even more often?

When you zoom out so that we could re-focus the camera to show the entire level at once, should we refocus (instead of preserving mouse-on-land) to show the entire level? Or do you prefer to scroll yourself to see it all?

-- Simon
#16
Preformatted inline text with the "tt" tag worked in SMF 2.0, but fails in 2.1:

example

With preformatted text, I mean text in a fixed font that clearly disambiguates lowercase-L from uppercase-i or the digit one, uppercase-o from the digit zero, etc. That's common for code snippets and for command lines that I want others to run.

There is the "pre" tag, which typesets the text preformatted indeed, but it sets the preformatted text into its own
line,


and I don't want
that.



There is "font=Courier New", which works inline, but it has two disadvantages: It's unwieldy to type by hand, and it doesn't produce preformatted text independent of systems, because Courier New isn't necessarily installed everywhere. E.g., in Firefox on Linux, I get a serifed font from "font=Courier New". I want logical formatting, not a specific font.

(In the admin panel, I found a grab-bag of BBCode tags that one can activate or deactivate, and "tt" looks activated there already. I didn't see anything related there other than "tt" and "pre".)

How do I typeset preformatted inline text?

-- Simon
#17
Hi,

This October, I'll visit the UK.

I'll be up for a forum meetup on Saturday, October 26th, 2024 around the area of Manchester or Leeds.

There is nothing specific planned yet for that Saturday, October 26th. I'm staying with WillLem. I expect WillLem or Flopsy to pipe up here soon, but I'm sure others from the UK have good ideas, too. Where should we meet? One loose idea is to meet in Leeds where the UK forumers met in August 2023; after all, many of you had the chance to come together there.

I have the Sunday, October 27th, free, too, and will fly back to Germany on the following Monday. I believe the Saturday is easier for whoever can spend only a single day, therefore I'm proposing to meet on Saturday and keep the Sunday as an optional second day.

Edit after Flopsy's 1st reply: Reason for why I am in the UK in the first place: WillLem, Flopsy, and I will take a road trip to Dundee, to see the Lemmings statue and the DMA office. The meetup on Sat, Oct 26th is after we return; we'll then be back in the Manchester/Leeds area.

-- Simon
#18
Edit Simon: Split off topic: Some ideas.

DanielOakfield wrote:

Visual alert on a match when one of the players has mathematically won, i.e. when the total number of lix still out is not large enough to make win whoever is losing (Team A 100 in, Team B 50 in, and only 49 total lix still out), sometimes we keep playing because we are too focused without realizing the match is actually finished. Maybe it's a matter of changing the color of the winner to green.

Flopsy then wrote:

While it seems like a great idea in games with more than 2 players, I think largely enough we only resign on a map in 2 player mode where it is clear there is not enough Lixes left on the map to overtake the leading team.
I think this feature probably never existed because a lot of the current community are very advanced in Mathematics and we usually know when we are beat and don't need the Lix engine to tell us we are beat.
Usually when we play maps with more than 2 players, we play the map to the end regardless of whether it is clear someone has won. We only leave the match early if someone has disconnected and the overtime timer is too long to wait for the nuke to trigger.


-- Simon
#19
Lix Main / Jumper Clips Through Horizontal Bar
August 18, 2024, 07:57:45 PM


Lix 0.10.26

The green lix (player ID 0) is already a runner-jumper-floater. Here, she becomes a jumper:
! 828 0 ASSIGN_RIGHT=JUMPER 0
Besides this jumper, green assigns no other skills near this time.

Expected: The green lix should not clip through the steel bar because there is at least one full horizontal row of air below the bar. She should bonk against the bar and fall down onto to the big triangle.

Observed: The green lix clips on top of the steel bar.

Replay: 2024-08-18-205947-Simon-6p.txt

This bug on github: Jumper Clips Through Horizontal Bar #491

-- Simon
#20
Split off Simon blogs.

Modern Lemmings

I like to call Lix's/NeoLemmix's predominant playstyle "modern Lemmings" or "contemporary Lemmings". By that, I mean: Solving puzzles in engines that remove execution difficulty and help me turn my imagined solution into level-solving skill assignments with little hassle.

But that name is not precise. It's merely the dominant playstyle these days. There are many more playstyles. Purely by gut feeling, I'd order the playstyles from most popular on Lemmings Forums to least popular:
  • Singleplayer puzzle solving with in-game tool* assistance
  • Real-time competitive multiplayer
  • Real-time singleplayer: pause-free challenges, RTA speedrunning
  • Out-of-game tool**-assisted plays: TAS, research
(*) In-game tools: Frequent pausing, advancing individual physics updates, rewinding mistakes, asynchronous solving in skill-inserting mode a.k.a. the blue R, and assignment tweaking a.k.a. in-game replay-editing.

(**) Out-of-game tools are the typical TAS emulators with savestating, rewinding of the entire emulated machine, input listings, and RAM investigation.

I haven't mentioned hand-editing replay text files. It feels like it's both in-game tooling (the games take human-readable replay files) and out-of-game tooling (it's done in a text editor). In any case, it's so rare that I'll ignore it here.



There is no clear and precise name for the most popluar playstyle, i.e., for singleplayer puzzle solving with in-game tool assistance. I'm tempted to continue to call it "contemporary Lemmings" at the cost of imprecision. After all, each of the above four wildly different playstyles from the above list is a distillation of 1991 Lemmings's mixture of ideas. Each playstyle relies on more modern and contemporary tech than we had in 1991.

-- Simon