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 ... 10 11 [12] 13 14 ... 18
166
Lix Levels / Scripts for level maintainers
« on: June 29, 2016, 06:13:39 AM »
Are you on Linux? Make your life easy with scripts de luxe!

Windows users: If you're cmd-savvy, a Powershellist, or use Python, please share your Windows scripts, too.

Strip level from replays

You maintain replays for your awesome level pack. Replays may include a copy of their level. Lix has weird rules on whether to run the replay against the included level, or against the pointed-to level. To guarantee that Lix uses the pointed-to level at any time, strip the level from each replay file.

Both of the following solutions rely on how all levels' first lines begin with $BUILT<space>. The editor consistently saves like this, but it's not specced anywhere.
  • geoo's solution: The Python script is attached to this post. It creates new replay files without the levels.
  • Alternatively, the following Bash one-liner modifies replays in place. It doesn't keep backups. It recurses through subdirectories.
    find . -name \*.txt -exec sed -i '/\$BUILT /Q' {} \;
Sum initial lix

From all levels recursively found within the current directory, we extract the number of lix, then compute the sum.

find . -name '*.txt' -exec grep "\#INITIAL " {} \; | awk '{s+=$2}END{print s}'

Mass-verify replays

Verify all levels recursively found in the given directory replays/path/to/your/dir. Lix will check all replays against their pointed-to level, then output which replays solve, or don't solve.

This command is the same in any Windows or Linux shell:

lix --coverage replays/path/to/your/dir

-- Simon

167
Closed / [FIXED] Glider in 1-pixel-shaft ignores updraft [BUG]
« on: June 25, 2016, 03:35:16 AM »
Porcupine reads glider code, porcupine quills go up, porcupine carves out test map to prove hunch.

You have plastered the entire map with updrafts.
You have a n-pixel-wide vertical shaft of air, with vertical walls at each sides, for n > 0.
You have a glider in this shaft.

Observed: The glider ascendes in each shaft of thickness 2, 3, 4, ..., and descends in the 1-pixel-wide shaft.
Expected: The glider ascends in each such shaft.

-- Simon

168
Closed / Highlight-assign to lemming in hatch
« on: June 21, 2016, 04:08:37 PM »
1. Let lemming spawn from hatch.
2. Highlight the lemming. (Arrow shown over its head.)
3. Framestep-back to a time when the lemming is still in the hatch. It doesn't matter whether it would spawn in exactly 1 frame from now, or if the spawn will happen in several frames only.
4. Highlight-skill-assign floater. (This means: You hold the highlight key, and meanwhile, click the floater icon in the panel.) Observe how the skill sound plays, and a floater is deducted from the panel. You can assign many floaters.
5. Highlight-skill-assign exploder. Sound plays, you can assign many exploders.
6. Highlight-skill-assign climber. The game blocks these assignments, nothing deducted in the panel, no sound.
7. Unpause and let play. Observe how the lemming is neither floater nor exploder.
8. Framestep back and forth. "INVALID" flashes in the panel where the current activity of hovered lemming would be shown.

Expected instead: No assignments go through while lemming in hatch. INVALID never shown in panel.

Tested in the no-fading build, which shows 1.44n in the main menu.

-- Simon

169
Lix Main / Singleplayer migration
« on: June 18, 2016, 11:33:59 AM »
Hi level designers,

Edit 2016-08: The lemforum pack is in good shape for D Lix. I don't ship Clam's and Rubix's levels until they too have good replay coverage. Clam and Rubix, ask me if you need help. I'll walk you through replay verification!

let's migrate singleplayer levels to D Lix.

Ideally, we should work to make all levels solvable in D Lix, possibly with slight changes from the C++ levels. Then, to guarantee solvability, we should prepare solving replays of all levels in D Lix.

Maybe a few odd levels can't be made solvable. Let's work out any problems together.

Get D Lix

:lix-cool: Download for Windows <-- download
:lix: Download for Linux 64-bit (needs Allegro 5 runtime)
:lix-evil: Source code
:8(): Changelog
:8:()[: Bug tracker.

Keep D Lix separate from C++ Lix.

What to do

Lemforum pack: D Lix comes with the levels as they are in geoo's github repository by 2016-04-14. Only difference to geoo's repository: Proxima is called Michael S. Repton, not Michael. geoo knows best how to proceeed from here. Wait for geoo's instructions.

Clam's and Rubix's levels: D Lix comes with the version of your levels that C++ Lix has. You can check manually which levels are still solvable. Or run D Lix's automatic replay checker over your C++ replays: If you've kept solving replays in C++ Lix, copy your C++ replay collection into D Lix's replay directory. Then run lix.exe --verify=replays/path/to/your/dir > output.txt. Ask me in IRC for help!

Differences of D physics compared to C++
  • Spawn interval is fixed during play.
  • Time is unlimited in singleplayer.
  • Trampolines don't exist. Please remove all trampolines from levels. To help migration, the standard trampoline is still in the image tree, but it acts as a triggered trap that kills. I'd like to remove that tile within the next months.
  • Basher mask is longer by 2 hi-res pixels.
  • The builder gets closer to walls by 2 hi-res pixels before she stops and turns. You can now always build up to a vertical wall, then mine into the wall, no matter where you have started the builder.
  • The imploder mask is wider by 2 hi-res pixels, therefore symmetric now.
Coming later

Screen start is automatic for now. Nonetheless, the D Lix editor reads and saves back to file existing manual screen starts. The value is merely ignored during play. I should probably implement custom screen starts, where you can choose a midpoint.

Hints and tutorial texts are preserved, but never shown. I have yet to implement hints. I'd like to improve their user interface from C++ Lix.

Report bugs! :-)

Roadmap
  • Automatic replay checking. Done.
  • Editor. Done.
  • Declare the D port to be the standard version for singleplayer. Expect level designers to build against this engine, and expect all singleplayer replays to use a recent D port version. This also means that physics should not change erratically from here, at least in the master branch. Done: Since 2016-08-03, we have 100 % coverage for the lemforum pack.
  • Work on stuff that level designers suddenly need/miss, to easen the switch. Tell me what bugs you most!
  • Netplay, including the server code.
  • Declare the D port to be standard Lix in every regard. Retire C++ codebase.
  • Continue fixing bugs. I don't strive to make the D port as well-debugged as the C++ port before making it standard overall. Migrate early, expose bugs together, and fix them quickly.
-- Simon

170
Lix Main / Algorithm: Smallest container on torus
« on: May 24, 2016, 06:53:38 PM »
Hi,

what is a smart algorithm for this?

Input data: List L of rectangles. Rectangle is 4 ints: (x, y) of top-left corner, (xl, yl) the two lengths. Also input data is exactly one torus map M -- this is a large rectangle, it's larger than any single rectangle in L.

Wanted output: Rectangle O that surrounds all the listed rectangles. This rectangle should be as small as possible. It's allowed to move the rectangles in L by integer multiples of the length of M. The output rectangle O should account for O-minimizing optimal shifts of the rectangles in L. (To clarify after NaOH's question: I want to minimize the lengths of O. You may shift the rectangles of L as often as you wish to minimize the length of O.)

I know: You can separate this problem by dimension: Consider only x and x-length first, then y and y-length.

Existing algorithms: I have an algorithm to find the smallest container on a non-torus map -- when you're not allowed to move the rectangles in L by the length of M.

For example, if the rectangles are denoted as Rect(x, y, xl, yl), the non-torus algorithm computes the correct smallest container for the following list of three rectangles:

    [ Rect(3, 5, 10, 10), Rect(5, 5, 9, 9), Rect(1, 1, 1, 1) ]
    .reduce!smallestContainer == Rect(1, 1, 13, 14)


I also have an exptime algorithm for the torus-smallest container: For each rectangle in the input list, try whether to set its top-left point in the range [0, M.xl[ or into [M.xl, 2 * M.xl[ instead. With an input list of length n, we have 2n choices to try. For each choice, measure with the non-torus algorithm. Use the choice that minimizes the non-torus algorithm target value.

Can I do it in less than exptime?

-- Simon

171
BitBucket: https://bitbucket.org/namida42/neolemmixplayer/issues/26/crashes-on-replay-saving-in-certain



Repro:
  • Put the nxp file in ~/softw/win/neolem/nepsterlems/packs/
  • Put the NL exe in ~/softw/win/neolem/nepsterlems/
  • Be in the exe's directory
  • Start the pack with wine NeoLemmix.exe ./packs/seb-1.00.nxp
  • Win the first level
Instead of showing the results screen, game shows the above error, then exits after I click OK.

The bug doesn't manifest when I do either one of these:
  • Go into the pack's dir, run the game with wine ../NeoLemmix.exe seb-1.00.nxp
  • Move the pack into the exe's dir, run with wine NeoLemmix.exe seb-1.00.nxp
On Windows, when you drag a file from a different dir on an executable, what is the working directory?

[05:50] <SimonN> it is the build without the fading
[05:50] <SimonN> let me check version
[05:50] <SimonN> 1.44
[05:50] <namida42> the no fading build is based off V1.43n-F

-- Simon

172
Tech & Research / L2 assignment debunked
« on: May 08, 2016, 08:52:07 PM »
Hi,

DMA released Lemmings 2 in 1992. For 24 years now, the assignment priority has tormented L2 players: You have a cluster of lemmings in a digger pit. You would like to assign to the digger among the walkers. But instead, the game assigns to a walker.

Challenge: Save 40/60 lemmings in Two's Company, Egyptian 1, using at most 3 skills.

Solution: Merge the two hatches at the top with a basher (skill 1). With a right-facing lemming, dig down the right-hand side of the column (skill 2). One pixel before breakthrough to the bottom, assign the to the digger a fencer. He will fence through both remaining pillars in a single go.



Trick: Assign precisely to the digger in a crowded digger pit! Here's how to do it.



Incoming...



Naive attempt: Hover the mouse cursor right on the digger in the pit. A sensible game would recognize this obvious desire to assign to the digger, right?



Nope, L2 thinks you'd love to assign to walker here. The digger keeps digging happily. The solution attempt is flunked.



The correct method is to move the cursor as far away to the left from the digger as possible. If we move the cursor farther than this, it would close. This alludes to the blinking cursor trick in L1, to select right-facing walkers. If the digger were alone in the pit, I don't believe the mouse would even open here!



This is guaranteed to select the digger. Try it!

I can't reproduce this with the cursor at the right instead of at the left. Maybe it depends on the direction of the digger. Maybe you have to offset towards the left independently of the digger's direction.

Don't let the assignment priority play tricks on you. Instead, you should perform tricks with assignment priority!

Not applicable to Sports 1: If your worker enjoys the company of stunners instead of walkers, you can't profit form this research. The stunners eat the click and don't delegate the click to the worker. You can't save more than 58 in Ceci n'est pas une pipe, Sports 1, with assignment research only.

-- Simon

173
Lix Main / Keys <--n:m--> game functions
« on: May 07, 2016, 03:18:49 PM »
Hi,



I've implemented this today in D Lix. It's a hack: You can map two buttons to pause. The game has hackish two-key support for exactly this function. Nothing else allows for multiple keys.

▱▰▱ means middle mouse button. Right mouse button, wheel-up, and wheel-down are all bindable as hotkeys. I felt fancy and I have unicode support. Probably ▱▰▱ is too hard to recognize as middle mouse button, but I don't think "MMB" is better. "Middle mouse button" is too long for the UI widget.

Main problem now:

For each game function, I want to allow many keybindings.
For each key or mouse button, I want to allow many game functions.

I don't know whether "many" shall mean up to 2, or up to 3, or arbitrarily many.

My first ideas -- I would like to avoid the dialog
namida's ideas -- button divides into several buttons on mouseover

Would you like to bind 3 or more keys or mouse buttons to a function?

-- Simon

174
Lix Main / D Lix 0.6.19, the big picture
« on: May 01, 2016, 01:17:31 AM »
Hi folks,

Lix 0.6 is obsolete -- instead, get the most recent Lix version. It has singleplayer and multiplayer!



You're encouraged to play around with the D Lix browsers and the editor. Keep D Lix separate from C++ Lix, the stable release. C++ Lix has working multiplayer, D Lix doesn't have multiplayer yet. Download C++ Lix.

Where are we?
  • Singleplayer is physics-complete. I lack eye candy: flying pickaxes and explosion debris.
  • Menu structure is more fun already than in C++: Scroll the level list by mouse wheel. :lix-cool:
  • The editor works as good as the C++ level editor. You can group tiles!
  • No multiplayer.
Where is the ship sailing?

I would like to finish the editor and fix bugs.
In 2 months,
Now, in late June 2016, I'd like to migrate all singleplayer activity from C++ Lix to D Lix.
Now, in November 2016, singleplayer levels are fit for D Lix.

Multiplayer is set aside for later. After the singleplayer migration, until D Lix multiplayer becomes usable, we will fall back to C++ Lix for multiplayer. Since late September 2016, I've been working on the networking.

I will keep optional manual screen starting position, even though I recommend to rely on automatic screen start positioning.

I would like to cull variable spawn interval, time limits, and trampolines. I am hesitant to decide for good here, but I want to be honest with level designers about the probable decision. I could imagine a big, fat warning for time limits. But I love the simplicity of no time limits whatsoever.

I want to replace no-overwrite with tile-grouping. Grouped tiles become a new tile. I expect higher performance and versatility from tile-grouping than from no-overwrite. I'd love to convert no-overwrite-using levels on the fly. geoo is pondering smart algorithms for that conversion.

Triggered traps shall have two rows of animation: One that loops while idle, and one cycle of killing animation, during which the trap is harmless. I have to decide on the image format. I'd like to have the idling animation in the first row, because frame (0, 0) is the best preview frame for all other gadget types. This idling animation format needs a separate thread.

-- Simon

175
Lix Main / Body parts in trigger areas
« on: April 27, 2016, 06:27:50 AM »
Hi,



We have a fat buzzsaw buzzing. Zzzzzssss. And a lix.
Should the lix die if she touches the saw with her foot?
Should the lix die if she touches the saw with her head?
Should the lix die if she touches the saw with her body? She would pass through small terrain gaps.
What happens when she's a climber? The climber's head has a different x-coordinate than the foot.
What happens when she's a platformer? A platformer's head is lower than a walker's.

If we check at the head at all, should mechanics depend on the spritesheet? C++ Lix examines the spritesheet for the eye, then checks there. The examination happens at program start, not at compile time. You affect physics when you alter the spritesheet. In total, C++ Lix checks for traps at (foot), (4 hi-res pixels above the foot), and (eye).

I'm considering to check at (n hi-res pixels above the foot) for n = 0, 4, 8, 12, or even for n = 0, 2, 4, 6, 8, 10, 12. The check would be independent of the lix's job. Both ideas catch the thin laser beams, these beams have a thickness of 4 hi-res pixels.

12 hi-res pixels over the foot is slightly lower than a walker's eye. Walker's eyes are bopping up and down at 13 and 14 hi-res pixels above the foot. The lix in the image would still burn. 12 pixels is considerably higher than a platformer's eye at 7 to 10 pixels. In a minority of platformer frames, even the hair is below 12 pixels.

Earlier discussion with geoo, beginning right after the colorful github pushes.
<geoo> I'm not sure what's best here, really. Maybe make a thread.

-- Simon

176
BitBucket: https://bitbucket.org/namida42/neolemmixplayer/issues/23/less-variation-in-skill-counts

When you have 0 of a skill, the skill bar shows empty field, 0, or 00.
When you have n of a skill, 0 < n < 10,  the skill bar shows n or 0n.

Pack designer chooses leading zeroes in the Flexi toolkit. Player cannot change the display in the game. Yet leading zeroes distract the player from important information.

Expected instead: Game doesn't display leading zeroes by default. On 0 skills, game shows empty field. The game may allow to opt into leading zeroes, I don't care if some people want them.

-- Simon

177
Closed / Pickup skills: trigger area, coloring [CONTENT]
« on: April 22, 2016, 09:20:01 AM »
BitBucket: https://bitbucket.org/namida42/neolemmixplayer/issues/21/pickup-skill-trigger-areas-too-small

Brain dump on pickup skills from when Nepster was here in 2016-03. From Icho, Nepster, and me.

Coloring: In the L1 crystal and ONML rock set, the pickup skills have a white bg. This clashes with the lemming skin. Maybe there are other sets with the same problem, Nepster doesn't remember them.

Trigger area (TA): The TA is too far down within the pickup skill gadget. We all agreed how this is problematic. Lemmings don't collect the pickup, even though the pickup overlaps more than 50 % of the lemming body.

Icho: Move the image, not the TA! Moving the TA breaks replays for almost no benefit.

Simon: The TA's lower border is okay, but it doesn't extend far enough upwards. Increase the TA's vertical size. When the new TA contains the old TA as a subset, you can't break replays.

Nepster: There should be less TA near the bottom, and there should be more towards the top, but add more area than you remove. (= Move the image as Icho has suggested, then make the new TA a superset of the implemented TA, as Simon has suggested.)

-- Simon

178
Lix Main / VSI & time limits: Mumble digest 2016-04-21
« on: April 22, 2016, 04:59:07 AM »
I had a longer discussion with Icho in Mumble yesterday. Topics: Culling variable spawn interval (VSI) from Lix, culling time limits from Lix, culling fake & invisible gadget flags from NL.

Selected parts look like I'm making a fool of Icho. I want to write down my thoughts as raw as possible, for reference. This was late at night, Icho was desperate for sleep. I'll be happy if Icho comes in and clarifies.

I: I want Lix to become good, otherwise I wouldn't spend all this time.

I: By culling VSI and time limits, you'll shoot yourself in the foot.

I: My favorite level of all time is Nick of Time by Pieuw. That relies both on VSI and a time limit. All action comes together beautifully.

S: I want to cull singleplayer time limits.
I: People will play Lix, realize there are no time limits, and leave.
S: There are no time limits in most NL levels. People have stayed.
I: They realize that the feature is nonetheless in NL.
S: How do they realize that?
I: I don't know.
S: People play levels before building their own levels in the editor.
I: They would leave in Lix when they can't set time limits in the editor.

I: VSI is a tool for the player.
S: It's a new game rule that is unlike everything else.
I: New tricks are good, I love learning new tricks and their interactions.
S: This is not a trick, but a rule.
I: Yes, even extra rules are good. There's a limit to how many are bearable, but you're way below that.

S: What enables more levels, VSI or time limits?
I: Hard to estimate. About equal.

S: Fake and invisible should be culled from NL.
I: Only-on-terrain is important, that makes for good decoration.
S: I'm not concerned with only-on-terrain.
I: You need fake and only-on-terrain to make Pieuw's lamp.
S: Why fake? Do you want to put the animated deco right in the solution path?
I: You're confusing.

S: What levels would be affected by fake and invisible?
I: namida has posted a list. Even if they're only a few levels, they should be preserved.
S: Most of that is spurious design or can be fixed after culling the flags. The minesweeper level is probably the strongest level that needs invisible.
S: What happens when we only cull fake? That's the more problematic flag anyway.
I: I don't know. Look at namida's list.
S: That list is for fake or invisible, not merely for fake.

I: Every time I hear the word 'cull', I have to jump in and prevent that.
S: By never culling any features, you'll end up like C++. A ton of supposedly simpler languages have spawned, aiming to replace C++. The point of culling is to prevent simpler replacements from overtaking.

-- Simon

179
Lix Main / Rant: We're too used to crappy UI
« on: April 19, 2016, 12:49:38 PM »
Climbers and floaters should be painted differently from non-permanents on the game board. They must immediately jump to eye in a crowd. Even with good cursor priority that prefers climbable walkers over non-permanented walkers, it's a pain to locate climbers. L2 did it well, L2 inverted hair and body color on permanent-skillers. Everybody should roar and demand this in any IRS.

No, that should not be an option. Nobody in their right mind will ever switch off good, nonintrusive marking.

There should be a word for (rodent that has at least one permanent ability). Athlete is already taken for (climber and floater), but NL has overriden the meaning already. There should be a word, like plain, for (rodent that has no permanent abilities).

L2 had horrible assignment priority. L2 prefers young stunners over old workers. WTF. If Dullstar were correct asserting the L2 assignment have an RNG, the resulting algo would blow L2's assignment out of the water.

Screens should never fade in and out. Precious time wasted at critical moments. Fading is for music: Anything that runs along without gobbling 100 % of your attention. Screens should pop in, ready to go.

Leading zeroes contain no information and should be culled from most UI. When the quantity is zero, printing 0 is a leading zero. When you have 0 of something, and that something is not 0 over 90 % of the time, fine, print the single-digit zero. Otherwise, leave the gap, but don't print in-your-face-attention-whoring digits. L2 did it horribly wrong, L2 presented 00 on empty skills. Two leading zeroes! In the glaring orange font!

People will not read manuals. Present on screen what they can do. When that would clutter the screen too much, you can hide rare options in a menu. Cut blah-blah text and put options on the screen instead.

Some level designers clamor for level titles spanning two rows. Go write a novel instead. Names must be short. Naming is hard.

The simple text file is the best way to store information. Surprisingly, all text-based formats suck. We're in a dark age where XML is crap, and it's simultaneously replaced by Json, Sdlang, Yaml, Toml, Wurstml, Longacronyml. CSV is for rectangular tables, not for writing the contents of a class to file. Ini lacks standardization, lacks nesting, and "thing001 = this, thing002 = that, thing003 = ..." is idiotic to represent collection of thing.

Lix, both C++ and D, has the I-don't-care-just-die hotkey [Shift] + [Esc] that cannot be remapped. This is nowhere documented. Everybody should learn it and pester me to document it, and make it remappable.

Hotkey-binding dialogs are hard:
  • You can map keys to functions, that's bad, you must now list all keys where 70 % of them do nothing. And cohesion is horrible: When mapping a key, I don't get a feeling where related game functions are mapped. I see nearby keys only.
  • You can map functions to keys, that's bad, you want to map pause to two keys. Pause goes to [Space] for normal two-handed play, and pause goes to MMB, or at least [Numpad-Enter] near the mouse, so you can hit it comfortably while you're scratching your butt.
  • You can map functions to a set of keys. That's ugly, now you must have a UI to maintain the set. This UI will take awful wide loads of space. Otherwise: I want this function mapped to [A], and now I want it mapped to [E] instead. Should the UI add that, or replace [A]? Ah no, before pressing [E], I changed my mind altogether, so I hit [Esc] or RMB to cancel the assignment. The oh-so-helpful UI will now either clear [A] too, which we wanted to keep, or bind the function to [A] and [Esc].
-- Simon

180
Lix Main / Backwards frameskip eats replay, C++ 2016-01-09
« on: April 14, 2016, 05:26:03 AM »
C++/A4 stable 2016-01-09.

I cannot repro this:

1. If you use backwards frameksip one frame at a time, it erases any actions you've made once you go past them. On the other hand, if you were to go back one second, any actions that happen during that second are not erased.

I've attempted this repro that doesn't work:
  • Linux, map back-one-frame to [2], map ahead-one-frame to [3]
  • Assign stuff in frame B
  • Go back from frame C > B to frame A < B by pressing [2] several times. This activates pause.
  • Go back from frame A < B to frame C' > B by pressing [3] several times. The assignment is replayed as I expect.
If I hold [2], [3] instead of tapping them repeatedly, or LMB on the panel buttons instead of tapping [2] and [3], I get the same expected result.

namida: How do you trigger the bug?

-- Simon

Pages: 1 ... 10 11 [12] 13 14 ... 18