Simon blogs

Started by Simon, October 18, 2015, 06:05:44 AM

Previous topic - Next topic

0 Members and 3 Guests are viewing this topic.

Simon

Ancient Treasure Chest

I'll be busy over the weekend. Here are some old pictures for your enjoyment.





We start with some screenshots from Cheapo, the old Lemmings clone from 20 years ago. It's guaranteed unoriginal, and that's very very good. Isn't the man as happy as we are! Well, he was, until I rotated the mouth.




Some toying with sprites from Lemmings 2. I used those lemmings as a forum avatar here around 2005.



One day, I put the lemming onto the chamaeleon, and this is the natural result.



I included this picture in a rant about time limits. Back in the day, level authors customarily reduced the time limit to the lowest possible minute that kept the level beatable. Lix still had time limits and NeoLemmix didn't allow unlimited time.



When I sprited the first few frames of the Lix platformer around 2010, I had this unused Lix sprite. Instead of not using it for anything, I made this little image.



Remix by geoo. Clones didn't like uneven terrain. It's only a mild exaggeration!

-- Simon

chaos_defrost

Awwwwww Cheapo Copycat Game, good memories. I still have it on my computer but for like my last 10-15 years of computers it always runs way slower that on the computers I had when it first came out for some reason.
"こんなげーむにまじになっちゃってどうするの"

~"Beat" Takeshi Kitano

mobius

amazingly Cheapo works 80-90% on my current PC running windows 10. Its a bit slow but not terribly slow. I easily get more frustrated from lack of Lix/NL ease features than old bugs. I contacted Peter Spada last year for a question about Cheapo and he responded promptly. I didn't ask at the time but I wonder if he made any other games?

Every now and then I try to play Clones again and it's just... awful. Nothing about it feels intuitive. A Game of this nature that doesn't always allow you to pause or pausing that doesn't work correctly should be illegal. Sorry to the creator, I know they at one time were present on this forum but this game sucks.

I attached a recent Windows 10 home screen pic.
everything by me: https://www.lemmingsforums.net/index.php?topic=5982.msg96035#msg96035

"Not knowing how near the truth is, we seek it far away."
-Hakuin Ekaku

"I have seen a heap of trouble in my life, and most of it has never come to pass" - Mark Twain


Simon

That's a Tamandua, a small anteater. It's not a Tapir. Very much lovely still. :lix-grin:
See also Gronklink's post about tamanduas.

Still so much work on Lix in my free time, I'm beginning to lose sleep over it. I'm 50:50 on whether the endorphines break even with health, or whether the Lix work is getting detrimental. I should probably schedule a day where I don't look at the source at all, don't play Lix, and don't check Lemmings Forums. Some time after 0.10.5 is out, which should release in the next few days.

-- Simon

okmot

Quote from: mobius on January 14, 2023, 11:44:33 PM
Every now and then I try to play Clones again and it's just... awful. Nothing about it feels intuitive. A Game of this nature that doesn't always allow you to pause or pausing that doesn't work correctly should be illegal. Sorry to the creator, I know they at one time were present on this forum but this game sucks.

Greetings! Nice to see Clones still being mentioned :)  The reason we limited pausing was to prevent super-human actions, because pausing makes playing levels easier and can bypass the intended challenge.  However to account for this we added a 2nd type of pausing called "Freeze Time" (default keyboard key is U) which you can use as often as you want to do super-human moves, but each Freeze Time use will incur a timeclock penalty so that players who don't Freeze Time will obtain a higher score for the leaderboard rankings, which we felt was fair.  You can even assign actions to clones when the game is paused via Freeze Time.

Here is Freeze Time in action - https://drive.google.com/file/d/1-777IGQDBmT1AWB_i_iRc4YQwNm4yTFe/view

In terms of not being intuitive, my only regret is that the "beautification" of my levels went a bit overboard I think. We hired someone and they added too many background graphics which I think make the levels a bit cluttered sometimes and hard to tell if something is land or background. I would have preferred a simpler clean look. You can however disable these graphics in the options menu: Disable Background and Sky. Oh and also the "Clones Belt" for gestures to give actions isn't practical I felt, I would have liked to make the keyboard bindings the default method - but this can also be changed in the options menu.

Otherwise I'm all ears for adjustments to include in future patches to improve the game! Multiplayer was always the focus, and I haven't played in a while so I'd be up for a match should anyone want to play.  That one "capture the star clone" map was really fun.

mobius

Quote from: okmot on February 17, 2023, 05:50:19 PM
Quote from: mobius on January 14, 2023, 11:44:33 PM
Every now and then I try to play Clones again and it's just... awful. Nothing about it feels intuitive. A Game of this nature that doesn't always allow you to pause or pausing that doesn't work correctly should be illegal. Sorry to the creator, I know they at one time were present on this forum but this game sucks.

Greetings! Nice to see Clones still being mentioned :)  The reason we limited pausing was to prevent super-human actions, because pausing makes playing levels easier and can bypass the intended challenge.  However to account for this we added a 2nd type of pausing called "Freeze Time" (default keyboard key is U) which you can use as often as you want to do super-human moves, but each Freeze Time use will incur a timeclock penalty so that players who don't Freeze Time will obtain a higher score for the leaderboard rankings, which we felt was fair.  You can even assign actions to clones when the game is paused via Freeze Time.

Here is Freeze Time in action - https://drive.google.com/file/d/1-777IGQDBmT1AWB_i_iRc4YQwNm4yTFe/view

In terms of not being intuitive, my only regret is that the "beautification" of my levels went a bit overboard I think. We hired someone and they added too many background graphics which I think make the levels a bit cluttered sometimes and hard to tell if something is land or background. I would have preferred a simpler clean look. You can however disable these graphics in the options menu: Disable Background and Sky. Oh and also the "Clones Belt" for gestures to give actions isn't practical I felt, I would have liked to make the keyboard bindings the default method - but this can also be changed in the options menu.

Otherwise I'm all ears for adjustments to include in future patches to improve the game! Multiplayer was always the focus, and I haven't played in a while so I'd be up for a match should anyone want to play.  That one "capture the star clone" map was really fun.

ah yes now I remember vaguely, this freeze time function.... One has to wonder; why not just make pause behave this way? Why have essentially two different types of pause buttons?? Can't it do everything freeze time can, including incurring the penalty, without *failing to pause*? I get the points thing; that's just not my kind of challenge.

The other major roadblock was how you assign skills. NeoLemmix has a similar "follow lemming" feature, but as a side option. Selecting a skill then selecting the target lemming just seems to work better most of the time. Especially if you're new to the game and clones may often be spilling out in different directions suddenly you didn't intend, you want to click quickly to get them under control. From being a lemmings player this just felt totally backwards.

The other issue I can't recall very well but had something to do with physics and how clones moved around. Maybe it was just another issue of differences from being a Lemming player.
everything by me: https://www.lemmingsforums.net/index.php?topic=5982.msg96035#msg96035

"Not knowing how near the truth is, we seek it far away."
-Hakuin Ekaku

"I have seen a heap of trouble in my life, and most of it has never come to pass" - Mark Twain


okmot

Quote from: mobius on February 23, 2023, 01:13:49 AM
ah yes now I remember vaguely, this freeze time function.... One has to wonder; why not just make pause behave this way? Why have essentially two different types of pause buttons?? Can't it do everything freeze time can, including incurring the penalty, without *failing to pause*?

No they can't be merged [edit: well maybe :) see below], because the two pauses serve different functions. The original pause was for actual legit pausing which shouldn't incur any penalty (initial level overview, phone ringing, bathroom break, dinner burning, etc) but we found this could be abused to get higher leaderboard scores, especially on larger (wider) levels by eliminating scrolling time and morph-click accuracy, which would ultimately lead to all high-level players being forced to abuse pause just to have a chance to get the #1 spot, because it would certainly be exploited. I didn't think that was a good direction for competitive play, so we added a few seconds of "recharge" to that pause which shouldn't be an issue for regular pause use and would prevent "cheating".
However I did appreciate that exploiting pause can make the level easier and perhaps more fun for non-competitive players, and so we added "Freeze Time" to encourage that and even allowed giving morphs while time was frozen to lean into that use case. 
Although.... in thinking about it just now I wonder if we could have auto-transitioned from one to the other silently behind the scenes.. so that pausing a few seconds apart would not incur a penalty but pausing any quicker than that would. But giving morphs while paused was only allowed in one not the other so not sure.. hmm..

Quote from: mobius on February 23, 2023, 01:13:49 AM
The other major roadblock was how you assign skills. NeoLemmix has a similar "follow lemming" feature, but as a side option. Selecting a skill then selecting the target lemming just seems to work better most of the time. Especially if you're new to the game and clones may often be spilling out in different directions suddenly you didn't intend, you want to click quickly to get them under control. From being a lemmings player this just felt totally backwards.

Yes Simon had the same thought during beta (gamma?) testing and we implemented a "Morph On Click" option in the Options menu that allows for this.  In that mode you select a morph first (keyboard or click) and then click on a clone to give the action right away.  The reason we reversed this by default was because Clones started as a multiplayer game and in that use case it's more common to want to select a single clone and then issue a bunch of morphs in quick succession, i.e. a sabotage or pathfinding clone lone wolf, possibly wearing a cool decoration :)  Also by selecting the clone first you can be sure which clone you are going to give the action to, which can be important due to there being dark clones and light clones, "fistfight" game mode, or clones with 2x speed, or tiny/large clones or clones at different gravities (4 ways). I feel selecting the clone first enables better multiplayer success, but the option is there so everyone can choose their preference.

Quote from: mobius on February 23, 2023, 01:13:49 AM
The other issue I can't recall very well but had something to do with physics and how clones moved around. Maybe it was just another issue of differences from being a Lemming player.

Yes the clones are a bit bulky. Originally they started out as thin grey aliens but they chubbed up when the graphics was outsourced. The Light clones are directly controllable like a mario character, but due to the pixel-perfect nature of clones/lemmings they walk a bit odd sometimes. It did take great programming effort to get them to walk on rotating/moving land but I was satisfied with the result and the flexibility of the level editor in general. Moving land can give momentum to clones or crush them allowing for a lot of level design possibilities.  I think it was CCX that created a working minesweeper mini game level, which really impressed me!

Light clone: https://drive.google.com/file/d/1Zta4JI3T0xQJN8QFVA6n-n-VzP3FWRDg/view

I was just watching my step-son play Quantum Connection the other day and we saw the leaderboards had a 5 morph solution which seemed impossible, but after some thinking we figured out how they were doing it!  It's an exploit of the entangled clones where you give a morph to a falling clone that they can't do so they queue it up, but meanwhile the entangled clone performs the morph, then you cancel the morph on the first clone before they hit the ground so they never actually use the morph so it doesn't get counted. Not sure how the top 3 players on that map figured that out but kudos to them!
The leaderboards have never been reset so it's gotten increasingly difficult over the years to get #1 on any level.

Simon

Welcome back! Happy to see that you're still pondering Clones UI.

Yeah, modern Lemmings and Lix abolish execution difficulty wherever possible. Coming from this, it's natural for mobius to expect the regular pause to behave like freeze-time.

Quoteauto-transitioned from one to the other silently behind the scenes
But giving morphs while paused was only allowed in one not the other so not sure.. hmm..

Gut reaction: Yes, merging the the two pauses feels like the right direction. Penalize assignment during pause with 1 second. Still penalize rapid pausing with 1 second. Count and explain all incurred penalties on the results screen. Offer an option for whether the engine should allow such penalized input during pause, and allow it by default.

The biggest danger with this idea is that you're explaining the penalties too late, in the sense that highscore hunters stumble into new types of penalties during serious solution attempts.

-- Simon

Simon

UI

Collection of bad error messages from 1996-2000. Klopt niet!

Also a link to the homepage of Isys Information Architects, the site that hosts that collection. Has several other lovely pages about bad UI.

Makes me wonder how to word the confirmation box when overwriting or deleting a Lix level:
Really delete this level? [Delete] [No]
Would it be better to use "Cancel" than "No"? Or "Keep"?

-- Simon

Dullstar

I think any of No, Cancel, or Delete work fine in this case.

The "Delete" option is already likely as clear as it possibly can be, and conveniently, that's the important one. From context, it's easy enough to deduce that "No" means "Don't Delete" (although I suppose "Don't Delete" is another wording you could consider; a bit lengthier, but abundantly clear), and I don't think anyone's going to say "Hmmm, I definitely don't want to delete this level, but I'm a little unsure of what "No" means here, so I'm going to push the button that says "Delete". That said, thinking about it, "No" is probably the least good option here (out of what has been presented), but least good != bad.

Simon

Hmm, thanks. I think I'll put "Delete" and "Cancel". I also like "Don't Delete", but it's more text to read, and it contains the word that we don't want to do, making it hard to skim.

Lix never writes "Yes" onto a button, it always re-spells the verb. That's good already. I searched the codebase for where "No" appears, and it only appears in these two boxes:

Really delete this level? (Level name), (filename), Delete, No.
Really overwrite the level? (Level name), (filename), Overwrite, No.

I'll replace both "No" with "Cancel".

-- Simon

Simon

#356
GUI

GUI code is both very nice and annoying at the same time. Very nice because I get to define and use lots of OO interfaces and have lots of good static checking. GUI and games are excellent applications for OO.

Annoying because it's practically impossible to unittest. The logic one or two levels beneath is more meaningfully tested independently from the GUI. But the GUI should still look nice and the buttons should all call the right logic. You chance 1-2 lines of code, recompile, run the game by hand, plow through the menus, look at it, change 1-2 more lines of code, ...

Wisdom

Some wisdom from hand-rolling Lix's UI years ago that has stood the test of 7-8 years.

GUI elements are nested tree-like. A window has buttons as its children, and a button has a text label or an image as child.

Define geometry relative to the parent. I want this button to be drawn 20 units from the left edge of me (the parent), and its width shall be 1/4 of my width.

Children calculate first, then the parent calculates. Reason: The parent is interested in any state change of the children, therefore the children should already bring their own new state to the party. The children, on the other hand, don't even need to know their parent, even though they must know the parent's geometry.

If the parent has information to pass to a child, that can still happen during calculation of the parent (after the child has finished its normal calculation), and trigger more code to run in the child separately from the child's regular calculation. All of this must still happen before anybody paints to the screen, thus separate calculation and painting completely.

Callbacks are handy for buttons. Give the parent a choice whether to hook a callback to the button (in OO code, everything happens elsewhere), or whether to query the button's state (soviet style: the central government knows best). Sometimes callbacks are nicer, sometimes soviet style is nicer. As the button, offer both.

Make stuff idempotent and avoid unnecessaary work, e.g., extra painting if it's already painted as you want. Push this logic down into the childmost GUI element. As a parent, don't { ask your button if it's already on, and if not, set it on }. The parent should write the simplest possible code: { set the button on }. The parent should trust that the button doesn't do unnecessary work, i.e., the parent should trust that the button is implemented roughly like this:

void Button::switchOn()
{
    if already on {
        return;
    }
    _on = true;
    require to be repainted (scheduled for the next round of painting);
    call your callbacks (that react to you getting switched on);
}


Outside of GUI, you rarely want to write setters, you'd usually prefer immutable objects that you discard and replace. But in GUI, setter-like methods are common and feel correct. As above, they tend to have more logic than setting one field.

Parent paints firsts, then the childrens paint. This is the inverse order in which they're calculated. Reason: You want the text label in front of the button, not behind the button (where the button's flat surface would obscure it entirely). You want the button in front of the window.

When a parent must repaint itself, all children must recursively repaint.

-- Simon

Simon

#357
What Simon does on Friday night

Plow the internet for classic board and card games, of course.

You're playing Yahtzee (identical rules and identical scoring as German Kniffel, except for how mutiple yahtzees score). You're going first, and on your first turn you roll 3-4-5-6-6. You have two more rolls to improve these dice. For your second roll, what do you keep?
  • Keep 3-4-5-6 and reroll the extra 6, aiming at large sraight (40 points). Even if we fail twice at rolling the wanted 2, we can score small straight (30 points) as a guaranteed fallback.
  • Keep 6-6 and reroll the 3-4-5 for more sixes. If we can enter 18 or even 24 as sixes, we'll be doing well for the upper section bonus (35 points), and there's a remote chance of yahtzee (50 points).
I kept the 3-4-5-6. The Yahtzee Proficiency Test scolded me:

# Game State        Tot Roll       You  Expect SD   OSYP  Expect SD  Delta
- ----------------- --- -------  -----  ------ --  -----  ------ --  -----
1 123456TFHSLYC;63-   0 34566;2  3456_  251.13 58  66___  253.94 59   2.80 **


Keeping the 6-6 would have been optimal. It's better than keeping 3-4-5-6 by an expected overall game total of 2.8 points. Even the eccentric choice of keeping 6-6-x and rerolling two dice would have been marginally better.

Nonetheless, it's nuanced. We keep the 3-4-5-6, reroll the extra 6, and again it's 6. Now, for third roll, keeping 3-4-5-6 is suddenly optimal! It's better than the second-best choice of keeping 6-6 by an expected overall game total of 1.3 points.

Optimal choices for other first rolls:
  • First roll 2-3-4-5-5, keep 2-3-4-5. It's a two-sided draw.
  • First roll 1-2-3-4-4, keep 4-4.
  • First roll 1-2-3-3-4, keep 3-3.
  • First roll 1-2-2-3-4, keep 1-2-3-4.
I've known Kniffel since elementary school. There is cute theroy here, but it's not earth-shattering. Lowering your expected game total by 3 points still leaves multiplayer largely a game of chance.

But I've never played Gin Rummy before. It's completely unknown to German kids. Gin Rummy looks like a reasonably deep game, and the rules are easy to boot. Good two-player card games with the standard 52-card deck are rare. I'll see with whom I can try it.

-- Simon

Silken Healer

Does Yahtzee count as a board/card game? No boards and no cards ;P

chaos_defrost

(At least in the US) Yahtzee comes with a notepad with scorecards and a cup to roll the dice in, which if you're being a bit cheeky about it, can count as the board, so you could argue that it has both cards and boards ;)

Also checked out the Yahtzee analyzer for a bit and got a Yahtzee first try ah hahahaha, not sure if that's scripted or not but sure, you take those.
"こんなげーむにまじになっちゃってどうするの"

~"Beat" Takeshi Kitano