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.


Messages - Simon

Pages: 1 2 [3] 4 5 ... 281
31
Thanks for the judgements!

I agree, there were no problems on the other maps. Only the double backroute to the two Predicaments was fidgety: The double backroute had to squeeze two pixels of height from the bottom half.

Next stream is tomorrow, Sunday, 16th.

I'm 50:50 on what I want to play tomorrow. Option 1: More of geoo's Crafty. Option 2: The NeoLemmix levels for the current Contest #30. (I already know geoo's Lix entries for Contest #30, I was the pre-release tester.) Edit: I played geoo's Crafty.

-- Simon

32
Where can we talk while we play

I've sent you am PM with all details. See you!

-- Simon

33
I'll play!

-- Simon

34
Lix Levels / Newbie feedback about early Lix singleplayer
« on: June 12, 2024, 12:50:54 PM »
In May, after work, I had a colleague try Lix on his notebook computer. I believe we had a mouse, not only the touchpad. He had played Lemmings ages ago.

Any Way You Want: No problem. A few died, but that's expected. You must save 1/10, he saved several.

Pipe Dream:
  • Unclear what to do. The exit isn't visible at the start of play.
  • Once, he bashed out of the left of the map and had to cancel or restart.
  • He assigned some bashers in the open, without a nearby wall. (This is OK, I expect this with new players.)
  • He repeatedly bashed facing away from the wall instead of facing towards the wall. I told him how to do it right, he said "yes", but his success rate didn't increase.
  • He ran out of basher! Pipe Dream gives you 20 bashers. You need at least 6 to pass. If you squander 15, you're stuck, but you don't know it yet.
For the next Lix release 0.10.24, I'll increase bashers from 20 to 50. Unsure if the other findings are a huge problem. Or, if they are: Unsure how to fix them.

In hindsight, even the L1 devs were wise and gave you 50 bashers in You Need Bashers This Time.

I'm reporting this like a usability test here, and while it produced usability findings, the session wasn't planned as a usability test. In a proper test, I should explain as little as possible. Here, I explained things along the way, which can steal attention.

-- Simon

35
Lemmings Main / Re: How to play Lemmings (1991) on a modern PC
« on: June 10, 2024, 05:31:20 PM »
Happy to add SuperLemmix, but WillLem, your section is too long. Can you cut it to half the size? E.g., to play L1 levels in a remake, we don't need to know about new skills. Or can you hide some parts behind spoilers? Why should a newbie pick SuperLemmix over SuperLemmini? Over NL? What do I have to install? Link directly to the download (or to the page with the download). Minimal extra steps, assume user wants to play L1 (or the remade L1 levels) and nothing else.

Thanks to both of you for the Amiga resources. Yes, if we point to DOS and SNES emulation, we should point to Amiga emulation, too.

I think all of this warrants splitting the OP into two new topics, (1) emulation and (2) remakes, and link from this OP into those two new topics. (Edit 2024-06-15: I don't think that the topic should be split anymore.) I'll get to all of these things over the next days.

-- Simon

36
Lix Main / Miner hovers, can cancel with blocker/batter assignment
« on: June 07, 2024, 06:15:33 PM »


I found this in the current Lix 0.10.23, but this bug must have been in the physics forever, at least since I've presented C++ Lix in 2009 to the Lemmings Forums.

Expected: When you assign blocker to a miner, the lix starts blocking.

Observed: Timed well, on the right terrain, the blocker assignment cancels the miner and makes the lix walk again.

This cancelling works with a batter assignment (instead of a blocker assignment), too.

Explanation: The floor must be shaped like a builder bridge. In the physics, the builder bricks are 2 hi-res pixels high, i.e., 2 units of distance. Naively, this is too high a drop for the miner to continue, therefore the miner has leeway in its code to continue mining along such a bridge. To trigger the bug, assign blocker while the miner is hovering over an air pixel, i.e., while the miner's foot is at Foot1 or Foot3 here:

                          Foot0
                         +--+--+--+--+--+--+--+--+--+--+--+--+
                    Foot1|  |  |  |  |  |  |  |  |  |  |  |  |
                         +--+--+--+--+--+--+--+--+--+--+--+--+
              Foot2      |  |  |  |  |  |  |  |  |  |  |  |  |
             +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
        Foot3|  |  |  |  |  |  |  |  |  |  |  |  |
             +--+--+--+--+--+--+--+--+--+--+--+--+
  Foot4      |  |  |  |  |  |  |  |  |  |  |  |  |
 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 |  |  |  |  |  |  |  |  |  |  |  |  |
 +--+--+--+--+--+--+--+--+--+--+--+--+
 |  |  |  |  |  |  |  |  |  |  |  |  |
 +--+--+--+--+--+--+--+--+--+--+--+--+




Bug! Bug! Bug!

-- Simon

37
Right, I wouldn't worry much about running out of allowed filename length. As you correctly describe, the chance of having even 2 or 3 extra loop iterations is tiny.

It's a good PR now that fixes the original data loss in the vast majority of cases.

-- Simon

38
NewName := ChangeFileExt(NewName, '') + '_' + UniqueTag + '.nxrp';

Assuming we loop 4 times out of the maximum 1,000, this generates names such as:
blah_123_456_789_0AB.nxrp

Do you want this? Appending more and more random chars indeed has a higher chance of finding a free filename.

Probably, we'll stop before we run into Windows's limit of 255 wchars per filename without path. In particular, to run into OP's data loss and thereby into the loop here, you have to give a short prefix that didn't depend on replay names/level names/...

Quote
it shouldn't overwrite, because it will see the existing file and generate a new name, will it not?

Not if the OS takes processor time away from NL exactly after you've tested that X doesn't exist, exactly before you save to X.

I agree, skip it for this PR. The old code didn't even test for existence at all, you haven't made anything worse.

-- Simon

39
No.

The workaround is: Move the topic, then move it back. The move menu offers to change every title.

Better is: Fix title only in OP and in last post. People will usually reply to one of the two, and generate correct titles. This produces correct titles for the big list of recent activity on the homepage.

It's a misfeature anyway that the forum supports individual post titles when the discussion is linear and not a tree.

-- Simon

40
Swap lines 309 and 310, and you'll be able to remove the duplicated line 306.

Theoretically, your loop can be infinite. In practice, I doubt anybody will run into problems because nobody has found the original (serious) data loss behavior in years. It's up to you how much work you want to invest here.

It's good that the code (both yours and the original) first saves the replay, only then removes the replay. Reason: If the computer hangs in between the two, you haven't lost data.

It's surprisingly hard to make this 100 % robust. Here are some concerns and you probably don't want to fix them all these days. They're rabbit holes (compared to your fix candidate) and running into these bugs will be rare.
  • Avoid the infinite loop.
  • You can't expect to find a free filename for certain, regardless of how you generate the filenames. Keep the source replay file (instead of deleting it) after you couldn't find a free filename for renaming.
  • Saving the replay can fail: Disk is full, you're renaming to a write-only media, you're renaming to a removed physical drive, you're renaming to a network drive and the connection dies, ... Keep the source replay file if the saving fails.
  • You have a time-to-check-to-time-of-use bug: You test in NL that filename X is free, then another
    program creates file X, then NL saves the file to X, overwriting the other program's file. Or NL fails to save because the file is still open in the other program.
The time-to-check-to-time-of-use bug is unlikely (NL is not a security attack target) and I'm noting this mainly for completeness. I don't even know a good way to fix time-to-check-to-time-of-use in Delphi. In C, there is fopen("name.txt", "wx"), where the "wx" means that you want the file-opening call to succeed iff the file is nonexistant and writeable. The idea is that you both test and open in a single library call that relies on the operating system to ensure that nobody can do anything to the file in between.

-- Simon

41
Lix Levels / Re: Scripts for level maintainers
« on: June 05, 2024, 08:55:52 PM »
Minimize PNG file size

Lix likes PNG images best. And Git repositories prefer small binary files over large binary files! Let's minimize our file sizes whenever we edit sprites or tiles. My workflow to minimize PNG files is:
  • In Gimp, select File -> Export ... to export as PNG.
  • In the PNG-specific dialog:
    • Uncheck all boxes. In particular, uncheck Exif metadata.
    • Choose compression level 9, the maximum.
    • Choose the automatic pixel format.
  • Exit Gimp.
  • optipng -o 7 myfile.png
  • exiftool -all= myfile.png
Somehow, it's both good to first re-save with Gimp and to then run optipng -o 7 on the same file. I conjecture that optipng compresses better than Gimp, but doesn't change some of the settings that Gimp offered you. If this conjecture is right, you can choose a lower compression level in Gimp to save time because you'll recompress anyway optipng -o 7.

In the above workflow, exiftool -all= should report that it didn't change your file because you had no strippable optional metadata. But if some optional metadata remained, it's now discarded, as you want. The optional metadata can easily be 4 KB, which is a lot when you version many images.

Small PNGs, happy Simon!

Further reading: Limitations of ExifTool when we ask it to discard all optional metadata.

-- Simon

42
General Discussion / Re: Simon blogs
« on: June 04, 2024, 10:13:43 PM »
Cultural Moss
  • namida supports different spritesheets.
  • WillLem draws the lemminas.
  • namida adds the laserer.
Who is responsible to draw the lasering lemmina? Certainly WillLem.
  • Simon writes the game physics.
  • geoo builds a level.
  • Simon merges the level into the main release.
  • Simon changes the physics, breaking the level's solution.
Is geoo still responsible to fix his level? Or is it Simon, who manages its releases?


  • DMA covers the blocks in Steel Works with moss.
  • namida and Simon conspire independently make the moss destructible.
  • DMA chooses not to register on Lemmings Forums to submit an updated level.
Who is responsible to fix Steel Works? What is even the best fix? Should the fix be in the game physics or in the level's moss placement? Oh, the popcorn!
  • You're a compiler writer.
  • You recognize these problems as real-life variants of the Expression Problem.
  • If you have an open class hierarchy and the codebase has subclasses everywhere, it's hard to add new pure virtual methods to the base.
  • If you have a closed class hierarchy with a visitor pattern, you can define visitors everywhere in the codebase, but no new subclasses.
This one is easy. You are responsible. If you run into the problem of adding new expressions often, your language is still young, and you're likely the only compiler writer. Thus, you are responsible to fix the hard-to-fix half of the problem.
  • You're a language designer for a popular language.
  • Other people write software in your language.
  • You want to change the syntax from "int foo()" to "auto foo() -> int".
This is also easy. You must maintain both styles to the end of ages. You push the burden of choice down to developer teams; they can pick a style for the codebase or accept a mix.



The hard variant of this problem is: You're designing an uncommon language and want to change the syntax. In the early days of Zig, you had to write "fn foo() -> i32" to declare a function that returns a signed 32-bit integer. The designers thought that "fn foo() i32" is better. Their Reasoning: foo is the function that maps into the type i32 and foo(), i.e., the call of the function, produces a single i32, but is not itself a mapping of anything into the type i32. Nowadays, it's a hard error to write "fn foo() -> i32". The Zig compiler tells you that it expects a return type, not "->". Thus, early during Zig development, users had take off every zig arrow in all (= the few) of their codebases.

How to handle cultural moss?

Have as few problems of this kind as possible. If you have an ecosystem, you'll probably have at least one such problem, otherwise people can't contribute creatively. Decide if you even want to build an ecosystem in the first place. Maybe your players can only solve levels, not build any? Maybe you don't need a core component (e.g., a computer game) that needs maintenance in the first place?

Find the axis that grows more often (levels) and make it easy to add to this axis. Accept that even small breaking changes the other axis (physics) will be hard.

If you have more than one such problem, avoid overlap. You already have two axes (levels and physics) whose span is hard to fill. You don't want a third axis. E.g., namida absolutely forbids to change existing tiles. In Lix, I allow tile changes in the centrally released tilesets, but I treat them like physics changes, thereby merging two axes (tiles and physics) into one.

Fail noisily. Cover your levels with solution replays. Test the replays after every change to either axis. In software, even though the visitor pattern in classical OOP languages brings boilerplate, it breaks clearly at compile time when a case is missing.

-- Simon

43
General Discussion / Re: geoo visits Simon, May 2024
« on: June 03, 2024, 04:52:01 AM »
option to have coloured Lixes score in addition to neutral Lixes as well?

This was a hacky development version with several features hard-wired:

If there are one or more pre-placed neutrals, scoring was hard-wired to score only neutrals. As you say, it would be nice to choose whether playable lix should count or not. On the other hand, it's bad to have different game modes; this forces players to remember what the winning conditions are. If we make such different modes, the modes need clear UI support, e.g., icons on the goals.

All hatches spawn playable lix. You can't have a neutral hatch. It would be nice to put neutral hatches, too.
 
There is a special gadget type, preplaced neutral lix. You can't pre-place playable lix. Given support for pre-placed neutrals, extending this to pre-placed playable lix sound desirable, more so than the neutral hatch.

Quote
I'm guessing overtime is set to zero in the above gifs but is there an option to not have the level end when a neutral exits also?

Yes, overtime is set to zero for Cage. If you give more overtime, you can score more than one neutral, and when you think you have enough, you can nuke as normal to trigger overtime.

Quote
I am looking forward to seeing this feature in a Lix release build because there could be a groundbreaker for more level creation possibilities :lix-grin:

Lots of things still to do:
  • In the level format, allow explicit distribution of hatches to players. I.e., find a replacement for our cheap-but-easy round-robin hatch/exit distribution in the level format. Reason: I don't want to repeat the mistake with the round-robin hatch distribution for playable pre-placed lix.
  • Maintain backward compatibility: New engine must load old round-robin levels, not only explicit-distribution levels. Maybe save as round-robin if level allows?
  • Decide on exact representation in the level format for pre-placed lix and for neutral hatches.
  • Add sane editor UI. This will be a lot because it must address #1 and #3.
  • Draw a neutral hatch.
-- Simon

44
Lix Main / Re: Lix 0.10.23 released
« on: June 02, 2024, 06:48:12 PM »
Lix 0.10.23 released.
  • Keep visible land in-place when you open or close the replay tweaker. Before, when you opened or closed the tweaker, the land scrolled left or right.
  • Fix #476: Chat messages appear in the chatters' player colors. Observers will continue to chat in white.
  • On Windows, Lix shows a native dialog box when an exception flies out of main, e.g., when you lack important files that Lix needs to run. You can screenshot the dialog box or copy the error from user/log.txt.
  • Move some multiplayer maps: For each player count (2p, 3p, ..., 8p), whenever an author directory held only only one map at player count, that that map is now in a directory other/ at that player count. See topic: Organizing Multiplayer Levels: Folder Structure
  • Add Sunny Day at the Beach, a multiplayer map by Blitz for 2p-5p.


-- Simon

45
Lix Main / Organizing Multiplayer Levels: Folder Structure
« on: June 02, 2024, 05:39:59 PM »
Lix 0.10.23 will release today, and for this release, I'll move some multiplayer levels around, as follows.

For each player count (2p, 3p, ..., 8p), I've looked for authors who have built only a single level for that player count. This produced single-level folders. For Lix 0.10.23, I'll merge the levels from single-level folders into a new folder other/ under that player count.

Example: Yung has built only a single 2-player level, teamattack.txt, and I've moved it from 2p/yung/ to 2p/other/.

Full list of levels that moved (click to show/hide)

I wasn't sure if we should also merge two-level authors or even three-level authors into other/. I haven't done it for now; I've only merged the one-level authors at each player count. You're not stuck one way or another; if you build more levels, I'll move you back into your own folder. :lix-smile:

I'm not sure if sorting by author is useful. It's merely the obvious method, similar to how we sort singleplayer levels into level packs, which typically have one author. See also the 2019 topic: Organizing Multiplayer Levels: Tag System.

-- Simon

Pages: 1 2 [3] 4 5 ... 281