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 [4] 5 6 ... 18
46
Lix Main / Lix 0.10.21 released
« on: October 22, 2022, 07:24:13 AM »
Get the newest Lix:

Download Lix -- for Windows, pick 64-bit version
:lix-evil: Source code
:8(): Changelog
:8:()[: Issue tracker

Lix 0.10.0 released:





The big new feature: Lix 0.10 offers handicapping in multiplayer games. If you're too strong for your group, consider to click the handicap icon with the unbalanced scales in the game room. You can choose fewer initial lix, fewer skills, a spawn delay, fewer points per lix saved, or any combination of these four handicap types.

It's up to our sessions to fine-tune the options! Let's see what's reasonable and what's less exciting.

Networking:
  • The server allows 0.9 and 0.10 in separate rooms. Decide with your friends whether and when to update as a group to Lix 0.10.
  • Both 0.9 and 0.10 players can chat with each other in the server's lobby. The 0.10 client will see both 0.9 and 0.10 rooms, and print a console error when you attempt to join a 0.9 room. Since 0.9 has no such functionality, the server will not show 0.10 rooms to 0.9 players at all; instead, the server will write a chat message to those 0.9 players in the lobby if any 0.10 rooms exist, suggesting to update to 0.10.
  • Renamed the server executable from server to lixserv.
The networking fixes are the silent star of the show this year. The server will now continue to support older Lix versions (0.9.x) in separate rooms from Lix 0.10. I won't have to force everybody to adopt a new physics release (this 0.10, or a future 0.11, 0.12, ...)

Let's give the 0.10 physics a good shot. :lix-grin: Besides handicapping, many small physics fixes made it into 0.10:

Physics:
  • Fix #265: Allow simultaneous exiting. When you're playing a race map and reach the exit at the same time as one or more different teams, all teams will score. Before, only the red team would score.
  • Fix #311: Top and bottom of maps are hollow. Terrain checks beyond those edges will not behave as if the edge row's terrain extended infinitely. Now, only the left and right edges of the level extend terrain in this way, not all four edges. Staircases built to the deadly ceiling will kill the builder as before, but now all following walkers will also leave the level and die.
  • Allow ability assignments (climber, floater, runner) to blockers. For now, these assignments have low priority; we can raise the priority after playtesting as a UI change without changing physics.
  • Fix blocker dancing: Now, walkers (and other non-blockers) don't move when they're both in a left-forcing blocker field and in a (different blocker's) right-forcing blocker field. Before, walkers would move sideways through the fields, turning each phyu. This looked like dancing.
  • Fix #266: Grant batters extra backwards range against blockers. We keep forward batter range vs. blockers as in 0.9, even though it's a lot of forward range so the batter sprite needn't overlap the blocker to still bat the blocker. Nobody has complained so far, and it's nice to bat blockers without awkward precision. We keep the batter range against other activities.
  • Half-fixed #397: The faller's distance in pixels fallen will not overflow the 32-bit int anymore. I didn't fix the overflow for physics updates yet, you can still play longer than what fits into the 32-bit int that counts physics updates (4.5 years at normal speed, or 46 days at turbo-fast-forward).
  • Moved the frogs' trigger areas downward by 1 pixel, so that the coordinates are divisble by 2. No levels broke from this, not even geoo's Las Ranas Hermanas in Hopeless.
  • Fix #410: Removed spike at top of both matt/beach/04 tiles (day and night). Before, both tiles had identical masks; now, both tiles still have identical masks, although the mask is different than before. There is no odd prong at the top right of those tiles anymore.
  • Fix #414: Fixed transparency/air pixels in earth.png from the Oriental set. The top row of pixels was not fully transparent (that would be 0 % alpha); it had an estimated 5 % alpha. Lix treats that as solid. Walkers were walking over solid, nearly invisible pixels. Now, earth.png has full transparency above the earth. No levels broke from this change.
  • Fixed #322: Don't wrap during tile group construction: Now, when you load a tile group on a small torus map, Lix will construct the group without wrongly wrapping the group's elements before grouping. Only when Lix has fully constructed the group tile, Lix will insert the group into the torus level.
Other:
  • Adapted the singleplayer levels Cry for Me (from lemforum), Baywatch (by RubiX), and Walking in a Winter Wonderland (also by RubiX) to work well with the always-hollow ceiling.
All levels are proven solvable in 0.10.

-- Simon

47
Lix Multiplayer Dates / Lix Multiplayer Sat, Oct 29th
« on: October 16, 2022, 07:37:08 PM »
Hi,

Flopsy and I have time to playtest Lix 0.10 (it's now released) on Saturday, October 29th, 2022. We can have a big session or a small one, it's no problem.

I still prefer to start at 16:00 UTC, but Icho prefers to later in general. What time of day suits you all? 16:00, 17:00, or 18:00 UTC seem to be reasonable candidates.

-- Simon

48
NeoLemmix 12.4.4 in Wine 7.15 on x86_64 Arch Linux.

1. I had NL 12.4.4 already set up, it wasn't a fresh installation.
2. I put Armani's pack Lemmings Uncharted inside NL.
3. I played some levels from Lemmings Uncharted, having NL download missing tiles successfully per level.

Then:

4. Run NeoLemmix (or have it already running).
5. In the main menu, click Settings.
6. In the settings dialog, click Style Manager.
7. Optional: In the style manager, click one of the styles to select.
8. Click Update All.

We get an error box: "Division by zero."

9. Click OK (the only button) on that error box.

Now, Download Selected and Update All are greyed out in the style manager. I can only click Cancel. I have not received any new styles that I didn't have in the list before.

See attached video for a demo of this.



Expected instead: The goal of the whole operation was to avoid getting the prompt to download missing tiles before every level. NL should fetch all styles from namida's central style collection, or at least everything from that collection that I need for my installed packs.

I have no idea what exactly you want to happen on Update All.

Per-level style download works fine. When I preview a level with missing tiles, NL offers me to downloads missing tiles from the net. When I accept, NL downloads the tiles, then reloads the map. Now, I see the map with all intended tiles correctly.

Fresh installation: The bug doesn't reproduce (or is different?) on a fresh extract of NL 12.4.4 from the big download button on neolemmix.com: Here, when I attempt step 8 in the repro above, I can't click Update All because it's greyed out. All lines (one line per style) are already green in the style manager. But I don't seem to have every style yet in a fresh installation.

I don't see how I can download all styles on a fresh NL installation. What is the intended way to download all styles (from your central style collection) in one shot?

-- Simon

49
Lix Multiplayer Dates / Lix Campfire, Sun, Sep 25th, 16:00 UTC
« on: September 24, 2022, 01:16:48 AM »
Hi,

this Sunday will be too short a notice for an organized multiplayer Lix session. Instead, let's meet on Mumble for a loose discussion, without playing. I'll call it a campfire discussion.

Possible topics to discuss:
  • Physics on 0.10,
  • user interface for handicap,
  • neutral Lix, experimental physics to try in December,
  • really long-term concerns, e.g., level maintenance N years after an author leaves,
  • general Lemmings culture,
  • ...anything you like. Bring your own topics!
This Sunday, September 25th, I'll sit in Mumble from 16:00 UTC onwards. Join me anytime on Mumble voicechat, very much like you would for a Lix session. (If you don't know my server, send me a private message on the forum here, I'll tell you.)

-- Simon

50
Lix Multiplayer Dates / Lix Multiplayer Sun, 16th, 16:00 UTC
« on: September 24, 2022, 12:40:31 AM »
Hi,

this is the next suitable weekend that suits both Flopsy and me: Saturday or Sunday, October 15th or 16th.

I can play either Saturday or Sunday. What's everybody else's preferred day for that weekend? I recommend to start again at 16:00 UTC, you can join later.

There's a chance that Lix 0.10.0 is released by then. But I'll play it safe and say that we'll be using Lix 0.9.x one more time for this session. (Current is 0.9.47, but any 0.9.x will do.) I'm still aiming to release 0.10.0 before November 2022.

-- Simon

51
Tech & Research / C++ with Simon
« on: June 28, 2022, 10:56:23 PM »
These are the C++-only posts from Simon blogs.



Apropos uniform initialization syntax. :8():

I've used C++ for 16 years now and I still don't know every case of where the language guarantees a zero initialization and when it may leave something uninitialized.

Everybody learns early on that this int is uninitialized:

void foo() {
    int a1;
}


And that's about as far as "everybody knows" goes, I'd wager. :lix-evil: Only many people, including me, know that these two are zero-initialized (although I'd still add the explicit = 0):

int a2; // at global scope
void bar() {
    static int a3;
}


The design reason behind this is that these ints live in "static land" instead of going on the stack where the zero initialization would cost runtime: The BSS section is a memory region that comes preinitialized for free when the operating system loads your executable and has to copy all of the executable code into memory anyway.

But I have no clue of the following, although I see this occasionaly in the day job, usually in C code that somebody renamed to .cpp later:

void baz() {
    int arr1[5] = {};
// Is anything zero?
    int arr2[5] = {0}; // Are the subsequent four ints also zero?
}

And do those initializations mean something different in C and in C++? Does it depend on the version of the C standard?

Here are some fun ways to initialize a single int, most of which only arise in theory. This is perfectly legal code that compiles. Are they all zero, are only some zero, are they all possibly uninitialized? I don't know.

void blub() {
    int a4{};
    int a5 = {};
    int a6 = int{};
    int a7 = int();
    int a8{int()};
    int a9 = {int()};
    int* p1 = new int;
    int* p2 = new int{};
    int* p3 = new int();
}


The two cases I should look up for definitive clarification are a4{}; and a5 = {};. The others might also be enlightening eventually, but expressions such as int() come up rarely enough that you can deem those esoteric.

And it doesn't end with ints where you have a chance at initializing them explicitly with zero. Occasionally useful in real life: You have std::vector<int> and you want to enlarge it by calling resize(). Does it zero-initialize the new values?



I have dark memories of possible nonequivalence of the following. It might be a false memory from early learner days in 2006, but I've never clarified it. Assume X is a class with a custom default constructor, and no other constructors (in particular, X doesn't define a constructor that takes a std::initializer_list). Do all of these run the default constructor? Quick reality check with g++ --std=c++17 tells me: Yes, all of them run the default constructor. But does the language really guarantee it, ever since C++98? I assume so, then...

void blip() {
    X x1;
    X x2{};
    X x3 = {};
    X x4 = X();
    X x5 = X{};
    X* x6 = new X;
    X* x7 = new X();
}


I should really read the standard directly more.

-- Simon

52
Hi,

On Saturdays or Sundays, what would be the best time of day for you to start a Lix session? Sessions usually run for 2-4 hours after this starting time.

Rampoina suggested: Our current time of 17:00 UTC (European evening) was suitable for him, but he prefers an earlier time of day, possibly right in the middle of European afternoon. For me, it's fine to play in the afternoon instead of the evening, but maybe the afternoon won't work for others?

The poll offers only the hours possible for myself. Happily complain in a post if sometime else is even better.

-- Simon

53
Lix Main / Handicap in Multiplayer
« on: May 16, 2022, 06:48:08 PM »
Hi,

(This has github issue #391: Handicaps in Multiplayer.)



If you're a brand-new player at golf, go, or chess, it's already an achievement when you beat a strong opponent at queen odds, or at nine stones, or at three more strokes per hole. Next time, can you do it at rook odds? You can easily see your personal progress in how the handicap shrinks over time. I'd like to have this in Lix.

Per game: In Lix's networking lobby, I'd like to offer handicap options next to the color picker. Between games, you can adjust the handicap. The default is no handicap for either side.

Choosing a handicap puts you at a disadvantage. The stronger side should handicap itself and thus start with a weaker position. I'd like the new player to start with the level's normal, unhandicapped-but-also-unimproved position; this makes it easier for him to learn how the map usually plays. Also, as I wrote in 2017: A strong player with 50 lix can beat a novice with 500, but a strong player with 5 lix must play enourmously well to beat a novice with 50 on a map with batters.



In IRC, geoo and I have considered some types of handicap.

Divisor handicap: You pick a number ≥ 1. Your initial number of lix is divided by it, and every skill count in your panel is divided by it. Options for divisor handicap could be 1 (= no handicap), 1.2, 1.5, 2, 3.3, 5, 7, and 10.

We'll always round up non-integer results. If the map gives 2 builders, you'll start with 2 builders at handicap 1.2 or 1.5, and you'll start with 1 builder at any bigger handicap.

Previously, I've expressed this as a multiplier handicap, and values were 100% (= no handicap), 70%, 50%, ..., but this design has a downside: Lower numbers mean stronger handicaps. It's nice when higher numbers mean stronger handicaps, to avoid confusion when people say "high handicap" or "you can lower it".

If you're in a team, the team's total divisor handicap can be the average of the team's players. Should "average" be the arithmetic mean or the harmonic mean? I'll have to ponder, and Proxima will be happy. Harmonic makes sense because it's a divisor handicap.



Delay handicap. You pick a number of seconds ≥ 0. Your first lix spawns later than other players' first lix, at this delay. Afterwards, your remaining lix continue to spawn at the normal spawn interval after each previous lix. Options for delay handicap could be 0, 5, 10, 20, 30 seconds. Anything more than 30 seconds is probably too boring for the experienced player.

Again, if you're in a team, the team's total delay is the average of the individual player's delay.

Asymmetric levels. If you choose a divisor and/or delay handicap, you always start in the first seat, and other players are randomly distributed amongst the remaining seats. This doesn't matter in a symmetric level, but if the author wants to build an asymmetric map, the author can put the seat-to-be-disadvantaged always in the first position. As long as we have any kind of handicap option, or even just a checkbox, we can add this seating rule at little exta UI cost in the lobby dialog -- it needs an explanation, but no extra pickers.

Level-specific handicap. Instead of offering concrete values to pick, you merely have a checkbox: Do you want to be handicapped or not? Or you have a choice of handicap strengths; which handicap strength do you want? It's the task of the level author to define the handicap in terms of delays or divisors or seats.

The downside of such level-specific handicap is that most authors won't bother to define handicaps for their levels. The few levels that have author-defined handicaps won't be consistent, e.g., you can play at strength 1 on this map, but it's hard to win against strength 3 on that other map. If it's not consistent anyway, I feel it's better to just offer concrete values, and let the players pick.

Ideas?

-- Simon

54
Lix Main / High-level two-player replays
« on: April 02, 2022, 07:03:30 PM »
Hi,

Rampoina asked on IRC: Are there replays of two-player Lix games between strong players? How can we learn more about multiplayer strategy?

I've attached two replays:
  • Stepping Stones 2v2. It shows a common principle in multiplayer: Higher and faster routes are better. Even though the purple team loses, pay attention to purple's initial relentless attacking of the orange bunch. The orange bunch is weakest while the top route is nearly prepared, but not completely done, and the bunch hasn't yet ascended to the top level.
  • A close and eventually drawn endgame at the bottom of the towers: Both geoo and I want to fight for a win in a drawn position. This shows micromanagement of single lixes that have to attack a bunched enemy crowd.
To watch replays:
  • Either put them into your replay directory, then navigate there from Lix's replay browser.
  • Or, on Windows, drag them on the Lix icon.
  • Or, on all OSes, run Lix with the replay filename as a command-line argument.
Ah, if you watch these replays: Lix versions since mid-2021 have a bug: Lix will re-save a watched multiplayer replay, even though you haven't changed it. This is a regression of the new end-of-game dialog. I'll fix this in the next version, 0.9.44.

-- Simon

55
Lix Main / Differences between D debug and release builds
« on: March 28, 2022, 06:02:06 PM »
Hi,

things that I told Dullstar in voicechat about the March 27 sporadic client-side crash.

Debug buildRelease build
in/out contractchecked, like assert(x)not compiled, they have no effects
array bounds checkThrows Error if outsidememory-unsafe access
(I could enable bounds check)
enforce(x)Throws Exception if not xThrows Exception if not x
assert(x)Throws Error if not xnot compiled, statement has no effect
assert(false)Throws Error if not xhalts the application, e.g., segfault

You're supposed to catch Exception but not Error. I still catch both in the main loop, log them, then re-throw them to terminate the application.

assert(x) with a value x only known at runtime: In D, this is deliberately different than assert(false) or assert(0) with a statically known false value. assert(false) marks code that you shouldn't reach. (I'm not sure if the compiler is also allowed to optimize on this assumption in release builds.)

-- Simon

56
Lix Multiplayer Dates / Lix Multiplayer Sun, April 3rd, 17:00 UTC
« on: March 28, 2022, 06:11:46 AM »
Hi,

let's test and play more! April 3rd, starting 17:00 UTC, let's play more Lix. Any 0.9.x will do, 0.9.42 is the newest, but they're all good.

I'll run an experimental server again as the central server.



Dullstar and I will connect with debugging builds. Either the session will go fine without problems whatsoever, or we get a chance to catch the sporadic March 27 client-side crash.

(Outside these sessions where I can closely watch, I'll run the ancient 0.9.20 server as the central server. That 0.9.20 server hasn't made 0.9.x clients crash in many years; it should also be practically identical to a server built from the 0.9.42 codebase.)

-- Simon

57
Lix Multiplayer Dates / Lix Multiplayer Sun, March 27th, 17:00 UTC
« on: March 24, 2022, 10:19:27 PM »
Hi,

who's up for Lix multiplayer this Sunday, March 27th, starting 17:00 UTC?

(Mind daylight savings. In Germany, 17:00 UTC will be 19:00 local time.)



I've been a busy mole, I've pushed lots of earth deep inside the server. The goal is to support both 0.9.x and the future 0.10.x on the same server, in different rooms. Let's test if I broke anything. For this Sunday's session, I'll run the reworked server as the central server. Ideally, you won't notice anything at all. :lix-grin:

For you, everything is as usual:
  • No need to update Lix. 0.9.42 is the most recent, but any 0.9.x works.
  • In Lix: "Network game" -> "Play on the central server" -> "Okay".
-- Simon

58
Site Discussion / One SuperLemmini board for all 3 forks is still OK
« on: March 14, 2022, 06:39:29 PM »
WillLem and Charles are now moderators of the SuperLemmini board.

I stickied the build instructions for SuperLemminiToo.

Reworded SuperLemmini board's flavor text to name Lemmini, SuperLemmini, SuperLemminiToo.

In early 2022, most discussion there is about SLToo. If two of those forks become active at the same time, we can still split the board.

The downside of the un-split board, even if only one fork is active, is that you're inclined to pre-/postfix all your topic titles with the particular fork name. Hmm. Tell me if you want something different.

-- Simon

59
Site Discussion / Wrong escape: &amp;amp instead of &amp;
« on: February 16, 2022, 08:10:05 PM »
Hi,

Lix Levels topic title:
Maps & insights from February 2022 session

Renders correctly in topic view.
Renders correctly in the list of 30 recent topics.
Renders incorrectly in board list that shows recent topic per board.
Renders incorrectly in last-post display in forum stats.

The wrong rendering is:
Maps &amp insights from Fe... on 2022-02-15, 20:01 UTC

Ampersand is wrongly escaped. Here is the raw HTML of that link in the recent-post line in the board list:

Code: [Select]
<p><strong>Last post</strong> by
<a href="https://www.lemmingsforums.net/index.php?action=profile;u=4">Simon</a>
<br> in
<a href="https://www.lemmingsforums.net/index.php?topic=5940.msg95604#new"
title="Maps &amp; insights from February 2022 session">
Maps &amp;amp insights from Fe...</a>
<br> on 2022-02-15, 20:01 UTC</p>

Within this HTML, we see:
Maps &amp;amp insights from Fe...

Expected instead in the HTML:
Maps &amp; insights from Fe...

Probably bug in the forum software. Is custom fix worth it? Is upstream report worth it? >_>

-- Simon

60
Lix Levels / Maps & insights from February 2022 session
« on: February 15, 2022, 08:01:27 PM »
Hi,

Flopsy and Lana created several maps for our recent session in early February 2022. Please post them here, then I can include them in the next release. :lix-grin:

Flopsy: My Eyelids for Holes (4 players): You found that it's much easier going left than going right. Consider to move the exit further left to incentivize going right?



Insights about spreading the love from that session.

BadBlocker said: He loves 2-player Lemmings, but multiplayer Lix brings the interaction too quickly, contemporary map culture doesn't nail the essence of 2-player Lemmings for him. He suggests more route building in isolation before confrontation. He considers not joining every single session, but still to occasionally join.

I replied ad hoc: Yes, either we should split into fewer players, or wait for handicap (physics change) later in 2022.

In hindsight, the large sessions are the main events, and we had 4-8 players every time. This is much different from L1 2-player. It's conceivable to play more 2-team maps, where new players can focus on route building.

Maybe new players like multiplayer solitaire? I.e., maps with no/very little interaction. This is unpopular with the strong players, but if it's a way of onboarding... hmm.

Or warmly suggest 1v1 with either another new(ish) player. Or 1v1 against a strong player who plays at a handicap (later in 2022). I don't know how much handicaps will really help with the situation, we'll have to see. Links: Handicap on LF, #391 on github

(Also mantha16 can't get to grips with Lix, I'll ask in more detail tomorrow.)

-- Simon

Pages: 1 2 3 [4] 5 6 ... 18