This fixes CCLP5 level 25 (and I think one or two others) by introducing
a new item, the dormant bomb, which turns into a regular bomb when
something moves off of it.
Other accumulated tileset touchups that snuck in:
- Recolored the canopy to hopefully look more like a tent
- Lightened slime by one shade
- Made the custom green floor colors clash less, and lightened the
yellow floor grout
- Removed the shadow from the pause stopwatch, and lightened the other
two, to better distinguish their different behavior
- Added little rivets to steel walls
- Made the symbols on the sokoban blocks easier to see
- Lightened the blue and red keys to match the shade of the other two,
and also hopefully make them easier to see atop water and thieves
- Shrank the railroad crossing sign slightly
- Added laces to the hiking boots
- Added shading to the bowling ball
- Removed the shadows from the actor versions of the bowling ball and
dynamite
- Darkened the dynamite item to better distinguish it from active
dynamite
- Lightened the blue teleporter exit so it doesn't look too much like an
inactive red teleporter
- Improved the gradient on the beetle
- Made the hint tile look recessed like CC2, to better convey that it
blocks some actors
- Added art for some possible tiles: rainbow teleporter, toll gate, nega
heart, phantom ring, feather
The default is now what I /think/ is the Lynx behavior: try to push the
block first, and only give it a pending direction if the push fails.
CC2 always uses the pending mechanism.
Not sure the latter one is even correct at all; it completely breaks
ICEHOUSE, for one. I guess it made more sense with the previous hacky
implementation of force floors applying at the start of the game.
- On small screens, the top two headers (with the pack + level names)
are now removed; instead the pack and level name are shown when
starting each level, and the buttons from those headers are moved into
a pause menu.
- The options, compat, and level browser dialogs were all reworked to
fit better on narrow screens.
- The level overlay has a more consistent layout and tries harder to not
draw in the middle, where the player generally is (except that the
mobile pause menu goes there, but oh well).
- The score tally at the end of a level is now less of a small table and
more of... more numbers, I guess?
- Links to the music source and author now open in a new window to
reduce risk of accidentally clicking them and losing your progress.
- A few obituaries were shortened, and several more were added.
- The game ending screen is now accessible on a touchscreen (oops).
- The pause and rewind buttons visually indicate when you're in that
mode, suggesting you can hit them again to switch to normal play.
- Touch controls are now relative to the player and only apply within
the game viewport.
- Disabled buttons look a bit less janky.
Still some work to do on this, but it's a pretty solid start.
Eliminates a number of annoying little hacks by getting rid of
`slide_mode` and instead trusting the terrain, live, like CC2 seems to
do (and Lynx definitely does).
- Players and monsters do, in fact, block each other. The helmet only
prevents death.
- Death happens during collision check, which is the entire reason items
don't save you: you're collided with first! This allows removing
several special cases.
- Spring mining is prevented almost incidentally, by virtue of collision
being checked both at decision time and movement time. It /can/
happen to actors other than the player, but seemingly not blocks.
- Some monsters, whose movement is essentially forced anyway, skip the
decision time collision check. This includes doppelgangers, which is
why they always spring mine.
Also expand the blue key MS compat flag to make keys never block
monsters; allow rovers to pass through score flags; and allow
doppelgängers to pause the clock.
This better matches CC2 behavior and also makes some very common
operations, like grabbing a cell's actor or terrain, way faster.
It also allows me to efficiently implement CC2's layer order when
checking for collisions; thin walls are checked before terrain, and
actors only afterwards. The upshot is that bowling balls no longer
destroy stuff on the other side of a thin wall!
I also did some minor optimizing, mostly by turning loops over an entire
cell's contents into checks for a single layer; Chromium now performs a
bulk test about 30% faster.
Downsides of this change:
- All kinds of stuff may have broken!
- It'll be a little difficult to ever emulate MSCC's curious behavior
when stacking terrain on top of items or other terrain. But not
impossible.
- It'll be far more difficult to emulate buggy Lynx (or maybe it's just
Tile World?) behavior where some combination of cloners and teleports
allow a ton of monsters to accumulate in a few cells. I guess I
wasn't planning on doing that anyway.
Collision now uses bits and masks. The main upshot is that ghost and
ice/directional blocks collide much more correctly, now. And turtles
block fireballs.
Also, monsters can now move over "no" signs, and can trample the player
if she's standing on top of an item.
While I was at it, I finished implementing the "bestowal bow", an item
mod (same layer as the "no" sign) that allows any actor to pick up the
item in that tile.