simonn / lixd Goto Github PK
View Code? Open in Web Editor NEWLix: Lemmings-like game with puzzles, editor, multiplayer
Home Page: https://www.lixgame.com
Lix: Lemmings-like game with puzzles, editor, multiplayer
Home Page: https://www.lixgame.com
Version 0.2.19
Ramond can play with hardware fullscreen. The game didn't run on his laptop otherwise, neither in windowed mode nor in software fullscreen (= a window the size of the screen without a title bar). The command-line switch lix --hardfull=1600x900
accesses hardware fullscreen right now, where the resolution can be arbitrary.
This should get a nice user option, so Ramond doesn't have to run the game with command-line arguments all the time.
Version 0.1.28.
This bug is also in C++ Lix 2016-01-09.
How to repro: Load a user savestate from the very future, with lots of assignments in that savestate/replay, while having no effects in the EffectManager recorded. Then framestep back continuously.
Observed: Replay arrows are shown during the on-the-fly forward recalculation.
Expected: These arrows should not be shown during framestepping back. They should only be visible while going forward.
Enter a level with water. We start at update 45, because it's singleplayer: Spawn 1 second = 15 frames after start, and we always spawn at 60.
In the first visible frame, the water is animated like it should be for frame 0, not 45. In the next frame, it jumps to how it should look for frame 46.
Play a small non-torus level. It will center horizontally on the screen, and be vertically aligned at the bottom, right over the skill icons.
Expected instead: Centered vertically too, expected by both namida and Ramond.
Small maps could be auto-zoomed to fill the space. That brings an inconsistency with it, how default zoom is chosen. What should default zoom be, anyway?
Version 0.1.26.
Unknown circumstances, this bug is elusive right now. It should be investigated once replays can be loaded from disk.
Effect of the bug: The assert in lix.skill.tumbler is triggered:
final Collision collision()
{
[...]
// No collisions found at this pixel.
if (isSolid(0, 1))
assert (false, "copy more from tumbler.cpp:213, v2015-09-02.");
Run the game -w for windowed mode. While no freeze direction is called in hardware.mouse, move the mouse around very fast. The OS cursor will be shown outside the window occasionally. Holding RMB to freeze directions prevents this.
Expected: Cursor should be prevented from leaving even without freezing directions.
Left-click a framestepping button or press its primary hotkey. It performs its function. Keep the key/button held. The button will perform continuously after a little while.
Right-click a framestepping button or press its secondary hotkey. It will perform once, and any further activation requires a fresh press. Holding is not enough.
Expected: Only the fast-forward button should behave like the second paragraph above. The framestepping buttons should behave like the first paragraph, no matter which of their two functions is activated.
Version 0.1.30.
Enter the replay browser, navigate to a directory with many replays. The browser lists all replays, and labels them with the level name.
This is done by indirection: open replay file -> read level filename -> open this level as another file -> print name of level. This might be a little slow.
Maybe beef up the replay code to handle level names, in case the level is included. In most cases, the level is included. In most cases, it's wanted to play the included level rather than the pointed-to level.
Version: 0.2.5
Apparently, I don't check for traps well enough, despite porting the C++ logic pretty accurately in this regard. Framestep back and forth in the attached replay. Sometimes, the basher bashes underneath the flame, sometimes, she doesn't.
There is a topic on Lemmings Forums, basher/miner❤blocker interaction, which describes this issue in detail. We have discussed a few possible solutions.
D Lix should get one of those solutions, or reconsider the problem.
Ramond: hm is it intended there is a 2 second delay before "ying ying ying"?
Simon: 2 second delay is: First spawn is at 60 updates. C++ lix starts singleplayer at 30 updates
Ramond: and no time counter :(
Simon: D lix doesn't speed up the start, but should. Time counter is important for debugging.
I've done something for it, test if it's good on most resolutions. You can test arbitrary windowed resolutions: bin/lix --resol=800x600
Very tall resolutions (higher y/x quotient) will generate too small font sizes, but such resolutions probably won't be used.
Original bug: geoo has a widescreen and the fonts were way too small. The relative font size seemed OK, but both font sizes were small.
Version 0.1.22.
Assign runner to a walker (not to a worker). The lix will not start running immediately. It will run once activity has changed away from walker and then back to walker/runner.
Expected instead: Walker starts running immediately after the assignment.
To reproduce: Compile A5 without ogg support (libvorbis missing during A5 ./configure). Link Lix against this. Load/play ogg samples from existing ogg files.
Experienced: The log message is "file not found", even though the ogg files are present.
Expected instead: I should stat the files to see if they're present, and give the correct message. If they exist, the game should say that Lix was compiled without ogg support.
For now, this seems to be the most sensible structure. Implement ASAP.
When that is done, I should ask level authors to check their replays with the D port. It's important to get more feedback on the D port in general. By providing the most wanted features for level/replay handling, I would like to encourage level authors to test and give feedback.
Right now (August 2015), it aborts the game with assertion failure in the method stub. In the near future, it will only write to the log file.
Eventually, no-overwrite drawing should be implemented, even if it's costly.
Version 0.1.30
Assign exploder or imploder. A replay arrow flashes up for one hardware frame (not update), i.e., for 1/60 of a second.
Expected instead: No arrow, but the normal explosion. Possibly with flying pixels. ❤️
Version: 0.1.28
Run the game at resolution 960x480, or 960x600. The text on GUI buttons will be correctly sized, and seems reasonably well positioned.
Run the game at 2x or 3x the latter resolution above, i.e., 1920x1200, or 2280x1800. The text will still be correctly sized, but be displayed a little bit too low.
Run the game at 1000x1000. The text is very low, not centered on the buttons.
Version 0.2.10.
Assign builder to a non-floatable lix. Queue several more builders. Hover over her, the panel should claim > 12 bricks left to build. Assign floater to her. The panel claims <= 12 bricks left to build, and the queued builders are returned to the player's skill reserves.
Expected: Assigning permanent skills doesn't cancel queued builders.
Version 0.2.10.
Nepster has reported how drawing dark terrain is slow, and no-overwrite isn't even implemented properly. No-overwrite is already in the bugtracker (#1).
This will either not come at all, or be implemented very late in the port. Since I like Lix as my main tool to play legacy Lemmings levels, it'll come probably.
Set the mouse speed to 20 or 30, I repro'd this with both. Enter a torus level. Move the mouse, then stop moving the mouse. Hold RMB without moving the mouse. The map scrolls slowly in a direction dependent on the most recent mouse movement.
Expected: The map RMB-scrolls only when RMB is held and the mouse is moved simultaneously.
Version 0.1.16.
Assign blocker to a lix. Then assign walker.
Observed: Blocker remains blocker.
Expected: Blocker becomes walker again after the blocker-to-walker animation.
Reported by namida, version 1015-08-24 on Windows.
During the test, typing UTF8 characters did not work - although I had Korean IME activated, it still took normal ASCII input. (eg. if I pushed the F key, it typed F, whereas if it was taking this input correctly, it should instead type ㄹ).
Version: 0.1.29
How to repro: Framestep backwards. The game will use the close-by saved states to recalculate. At some time, there will not be a nice close-by state. The game will load an old state, recalculate, and save finer-grained, more close-by, states, along the way. This takes some time, and produces a visible pause on my 9-year-old laptop.
Problem: Many of these states will be tossed right during the very same long recalculation. If we save every 10 frames a state that, with hope, is close-by, we don't have to save this 25 times when recalculating from the 250-frame-old step. Only the last two 10-frame-old states will end up in the state mangager.
Possible solution: In the updating logic, keep info about what state ultimately to end up at. Pass that to the savestate manager along with the current update proposal.
Framestepping is important! ❗ Bad performance is a bug! 💤 Mediocre performance is a subtle bug! 🐌 We want the cutting edge in backwards interactive rodent simulation! ⚡⚡⚡
Assign a basher or miner where it has earth to work through. Have it hit steel during the normal work.
Expected: Worker is cancelled, steel portion of the swing is not removed, earth portion of the swing is removed.
Observed instead: The worker doesn't have a check to cancel on steel, and cuts through it happily. The steel is removed, like earth, from the drawn image. The earth-only portions are removed properly from the physics mask. In the steel portion of a swing, neither earth nor steel is removed from the physics mask: Other lix walk across the now-transparent steel.
Ideas for fix: Either use Allegro 5.1 blenders for drawing the land, or re-draw the steel back onto the land (snapshot the steel at beginning of level, possibly slow).
On my 9-year-old graphics card, the game can't load very large graphics as video bitmaps: amanda/tar.W.png and amanda/occult/hatch_tentacle.H.png were both over 4,096 pixels wide. Currently, I skip over them and let the level have a missing-image error. See the log file if you get missing-image errors despite having the image.
4,096 is a reasonable max image size to expect. I should not expect the user to have a graphics card that can handle more than this. I should do something to make larger images load properly.
On Debian 6, without pulseaudio installed, with ALSA installed, each sound playback is delayed by about 0.5 seconds. When it finally starts, the sound plays back well.
Workaround: Compile Allegro 5 yourself, and edit the source so that it uses OpenAL or OSS instead of Alsa. The sound is still delayed by 0.1 seconds or so with OpenAL.
Bash through a perfectly rectangular block. The last swing will always leave relics (unless the last swing's relic-leaving portion doesn't intersect with the solid block any more).
Expected: Don't leave relics on the last swing, if nothing more to bash is ahead anymore.
Also examine how far the swing goes. Maybe it's going further than in C++ Lix. This may well be desired, but affects the relic-leaving code assumptions.
Version: 0.1.30
Assign the last skill of a certain type, such that the panel button goes from 1 to 0 skills, thereby deactivating. Framestep back, to get to a position before using the last skill. The button remains de-selected. Clicks on lixes don't assign the skill.
Expected instead: Re-select the skill once it gets replenished while framestepping back. (Unless other skills were selected in the meantime.)
The file listing sould parse the _order.X.txt file for the current directory.
The dir listing should parse it too, to order subdirectories.
Empty username should not be possible. The game should ask on startup and not allow an empty name.
Empty name doesn't save options right now. I am unsure if this is to be changed, or allowing the empty username is to be changed.
Idea to speed up level rendering:
Each terrain tile has its physics mask computed at load-from-disk time. To render a level, the tile isn't fetched from VRAM into RAM anymore. Instead, the physics mask is generated from the tiles' physics masks, and the level image is generated from the VRAM bitmaps.
Look into dark tiles. Can we render the level image with blending from a white copy? Can we render the level image with blending from the original tile? (Probably yes and yes -- very promising.)
Haven't tested whether it's universal. Will either upload full test case (Second Testing Level + replay) or fix within upcoming days.
core.exception.AssertError@src/lix/lixxie.d(216): Assertion failure
----------------
??:? _d_assert [0x66e927]
??:? void lix.lixxie.__assert(int) [0x647003]
src/lix/lixxie.d:216 const(basics.matrix.XY function()) lix.lixxie.Lixxie.getFuseXY [0x64550f]
src/lix/lixxie.d:229 void lix.lixxie.Lixxie.addEncountersFromHere() [0x64562a]
src/lix/lixxie.d:254 @property int lix.lixxie.Lixxie.ey(const(int)) [0x645838]
src/lix/lixxie.d:278 void lix.lixxie.Lixxie.moveDown(int) [0x6459b9]
src/lix/lixxie.d:285 void lix.lixxie.Lixxie.moveUp(const(int)) [0x645a27]
src/lix/skill/ascender.d:39 void lix.skill.ascender.Ascender.onBecome() [0x647b14]
src/lix/lixxie.d:612 void lix.lixxie.Lixxie.become!(false).become(const(lix.enums.Ac)) [0x646f90]
src/lix/skill/climber.d:126 bool lix.skill.climber.Climber.ascendHoistableLedge() [0x64b144]
src/lix/skill/climber.d:106 void lix.skill.climber.Climber.perform() [0x64b085]
src/lix/perform.d:20 void lix.perform.performUseGadgets(lix.lixxie.Lixxie) [0x6470e4]
Version 0.2.25. Corollary of issue #43.
Old checkmarks (e.g. imported via user file from C++ Lix) are displayed properly. The game doesn't generate new checkmarks on winning. It should generate new ones.
Version 0.1.36.
How to repro:
Expected instead: The cube should be shown as solid completely, because it is solid completely.
Alternate repro: Perform steps 1-4, then restart the level and press turbo-fast-forward. This makes the cube look as described in 6, even though it is solid, as explained in expected-instead.
Speculation: When we draw after each update, physics and graphics match. When we don't draw after each update (framestepping back + recalculation, or turbo-fast-forward), the bug manifests.
Version 0.1.9. Assign a builder close to a wall, facing the wall. They will build bricks overlapping existing terrain.
Expected: Only the portion of the brick that does not overlap terrain is drawn. The expectation matches what's happening in terms of physics, but not in visuals.
I don't believe this can be fixed with blenders, without changing the target bitmap. I should look into Allegro 5.1 at some time, which doesn't build on my old home machine, and use its shaders. Alternatively, I should cache the land whenever necessary, and blit the cached land to the land, to remove overlapping bricks.
Reported by ccx, version 1015-08-24, on Windows.
In windowed mode, the mouse is okay, but it fails to retain mouse capture once I switched out to another window via Alt+Tab. And I kind of have to always do that at the start because for some reason, when launched lixd insists on positioning the window off to the lower-right corner of the screen instead of centering it like one would expect. And since it starts off with working mouse capture, I can't move the window without using Alt+Tab first to switch out first (which turns off the mouse capture, allowing mouse to reach the title bar of the window to drag).
In C++ Lix when I do this sort of thing, as soon as I switch focus back to the Lix window, mouse capture will work correctly again.
In D Lix, it seems to permanently lose mouse capture, so the system mouse cursor (ie. the arrow) remains visible at all times after the switch out, and mouse is no longer confined to the window when the window has focus. The system-mouse-cursor remains visible actually also happens if I Alt+Tab in fullscreen mode.
Version: 0.1.23
Fling a lix, e.g., by batter, or by (not pushed to master yet) flingploder, to make her a tumbler.
Expected: Choice of displayed tumbler frame is as in C++ Lix, mostly depending on angle of flight.
Observed: Tumbler alternates between the first 2 frames only.
Play and beat a level. Go back to the menu. No checkmark is shown at the level.
Expected instead: Menu displays checkmark at every beaten level.
Game terminates with assert fail: _targetDescLixxie exists, but _targetDescNumber == 0.
In Nepster's words:
Enlarging the preview is only one possibility to improve screen usage.
If you have too much space that needs filling, then I would suggest adding a scroll-bar in the level/replay list for fast movement within the list. Not as lovely as larger previews, but much more useful. ;-)
Version 0.1.8. Definition: Land is the bitmap holding the visual representation of the terrain. It's not queried for physics (lix walking across terrain, builder hitting their head), that's what the lookup map is for.
How to repro: Build several longer staircases. Click and hold the button to framestep back. The builders will move backwards. At some time during continued holding of the button, a rather old savestate is loaded for framestepping. More recent bridges are shown for a frame, then disappear. The lookup map is correct though: The invisible bridges are solid.
Speculation: When doing lots of intermediate savestating happens before the land is rendered during Game.draw(), the savestates don't save the correctly updated land. Savestates save land during calc(), but land is only rendered during draw().
Version 0.1.29
Have a level with a black background. It renders as black correctly in preview and Game.draw().
Have a level with a non-black background, e.g. one of Clam's Flingsane levels using the beach set. It renders correcty as blue in preview. It renders with a white background instead in the game.
Expected: Same color, blue, in game and preview.
The level background (not the terrain) should indicate where a torus seam is. E.g., by colored bars.
This has not been in C++ Lix, but was an immediate reaction by IchoTolot. People should not be confused when the same portion of the level is drawn more than once.
D Lix 0.1.7
The map rectangle should be drawn exactly where the panel is not. Apparently, the drawn map image is larger sometimes. This can be checked with the empty corner in the panel: The panel doesn't draw to a rectangular area right now. If the map image is drawn too large, the panel doesn't overwrite all of the extraneous map parts.
Observed in map:
Let's go Spelunking (Clam's adaption with the goldmine terrain) at resolution 1280x1024, zoom level x2 (click zoom button button once). This map has both torus directions. Not repro'd at zoom levels x1 or x4.
Version 0.1.25
Assign builder to a lix. Assign exploder before she is finished.
Expected: Normal explosion, possibly returning builders.
Observed: Assertion failure, outsideWorld is null.
Should introduce a separate function in class Lix to become Exploder. That function should take a pointer to set outsideWorld. Class Ploder should then call that function instead of calling Lix.become directly.
Reports by several people: Nepster's crash, reported on LF.net: Lix version 0.2.11, Windows cross-build, crashed after (skipping ahead, then framestepping back).
Clam's crash:
Lix version: 0.1.40 (Windows cross-build too)
64.37 Access Violation
64.37 0x6CB5A6B0 in al_convert_bitmap_data
0x7716DFA1 in RtlpUnWaitCriticalSection
0x6CB5E8E7 in al_get_joystick_state
0x6CB5EB3E in al_get_joystick_state
0x6CB05ED8 in al_lock_bitmap_region
SimonN: okay, how do you watch this replay to make it crash? Immediately hit turbo and never disable turbo?
Clam: yes; you may have to move the cursor around as well
Facts: I never call al_get_joystick_state
from the Lix code in either version. I wasn't able to repro the crash on Linux.
Even though Clam had a debugging version, there was no informative entry in the logfile. The output quoted above was everything.
Speculations: Most likely, al_lock_bitmap_region checks al_get_joystick_state for whatever obscure reason. Examine the A5.0 source. -- Otherwise, ABI mismatch? I have no clue. Maybe try with more modern versions of A5.0 or A5.1?
Maybe try to repro the crash with Ichotolot?
A button that reverts all options back to their defaults.
This is good to have at least for hotkeys. Probably useful for everything, or only for the current options tab, or to give the choice.
The current workaround is to create the new user, then delete everything in their user file.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.