Lemmini - Lemmings for Java - public Alpha

Started by 0xdeadbeef, February 21, 2006, 06:37:50 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

0xdeadbeef

Quote from: ccexplore link=1140547071/195#209 date=1142776680
Sounds like maybe I just misread what you are doing.  Anyway, yes, in DOS/Amiga versions they just apply the mask and move the lemming down, and a gap of only one pixel in height would stop the digger.
Since I'd move down 2 hires pixels at once, this means that only 1 hires pixel gaps can be detected that are by chance on the same as the digger foot's Y coordinate. If the gap is 1 pixel off, the digger will jump over it. Else the digger would have to go down pixel by pixel and each time check for a gap.

0xdeadbeef

Lots of changes this time with lots of chances to have messed something. Give it a try.

Fixes/changes 0.63 -> 0.64
#  Reworked skill assignment. Assignment request is buffered and applied at the beginning
   and if that fails at the end of the lemmings movement update. This should make skill assignment
   generally better to apply.
#  Reworked main loop. Usually missing animation updates are caught up if possible to maintain
   game time. However, under special cirumstances (high system load for a second or so) this led to a
   kind of forced "fast forward" mode until the game time was synchronous with the real time again. To avoid this,
   any time difference larger than 5 frames (165ms) will now be skipped instead of being caught up.
#  Reworked function key assignment: F1 to decrease RR, F2 to increase RR, F3 - F10 for the skill assignments,
   F11 to pause and F12 to nuke.
#  Removed check that considered one pixel walls/gaps as artifacts. So Lemmings are reflected by one hires pixel
   walls and fall through one pixel gaps now.
#  Made main cursor a little thinner (there are issues though, since obviously, the cursor is scaled up to some system default)
#  Put "load level" feature back in to load a single level file (INI or LVL). It's still a little unstable though (quick hack),
   so use it on your own risk ;)
#  Added the 4 "Tame" levels 17..20 missing in the windows version
#  Reworked break conditions for miners, diggers and bashers when hitting an indestructible pixel (e.g. steel).
   Now they all use an additional mask which should improve the behaviour.
#  When a digger, miner or basher hits steel, the "chink" sound is played.
#  Changed the way the digger works. Now he will move 2 pixels down at each animation cycle instead of falling down
   digging. Now a digger can be stopped by a vertical gap just one hires pixel in height. However, as he moves down 2 hires
   pixels at once, he will "jump" over such a line with a probability of 50%. Only if the gap is 2 hires pixels
   high, he will be stopped for sure.  
#  Added the dreaded horns to the fire exit. May need some rework, but for the start, it's ok.
#  Renamed "squasher" to "marble"


BTW: since I changed resouces quite a little, it might be a good idea to remove your resource directories from time to time to force an extraction and have a "clean" resource directory again. Just don't remove players.ini and the players directory if you want to keep your player stats.

JM

Lemini seems quite cool. Keep it up Oxdeadbeef. Some good stuff there. Can you end up putting your own levels into the game?

Proxima

Excellent!

* The skill selection seems much, much smoother now.

* The thinner cursor looks a lot nicer, as well as making the flickering much less annoying -- indeed, I hardly noticed it.

* For some reason the cursor sometimes displays walker lemmings as FALLER even when there are no fallers around.

0xdeadbeef

Quote from: JM link=1140547071/210#212 date=1142871640Lemini seems quite cool. Keep it up Oxdeadbeef. Some good stuff there. Can you end up putting your own levels into the game?
You can already load and play own LVL files. Additionally, it's possible to create whole own levelpacks and styles. Then again, there's no documentation on this yet. However, if you look closely at the ini files in the resource directory, you'll see that this is no rocket science. The only part missing right now is a full featured LVL->INI converter (Lemmini loads levels from INI files which are more or less ASCII versions of LVL files). If there's demand, I could quickly hack a converter together. Anyway, there's a trick right now: if you load a LVL file, Lemmini will actually write a file "test.ini" in you resource directory and then load this file as level.
If you copy this file and rename it, you have your LVL converted to an INI file.

0xdeadbeef

Quote from: Ahribar link=1140547071/210#213 date=1142875165
* The skill selection seems much, much smoother now.
Ah, at least something ;)

Quote
* The thinner cursor looks a lot nicer, as well as making the flickering much less annoying -- indeed, I hardly noticed it.
Maybe I'll go back to software cursor anyway. A drawback of the system cursor (apart from flickering under win98) is, that its size is changed to some system default. That makes e.g. the yellow dot in the middle larger than it should be. Then again, the system cursor moves much smoother as it's not bound to the 33ms screen update of the rest of the game. Tricky...

Quote
* For some reason the cursor sometimes displays walker lemmings as FALLER even when there are no fallers around.
Actually, this happens ALWAYS, not only sometimes  :-[
I simply forgot to swap the strings as I cleaned lemming.ini. Will be fixed in the next update.

0xdeadbeef

While I'm at it: what are your expectations regarding action replay? How do you like the action replay in WinLemm? Should action replay in lemmini be similar or different?

Key points:
- Should the cursor/playfield move around or do you want to control the cursor/scrolling?
- Should this be just a passive replay to show how you did this level or do you want to take over the action like in WinLemm?
- Is storing/loading stored action replays a needed feature?

Any other ideas/comments about action replay?

Jazzem

Yeah, action replay should be identical to that of Winlemm: A replay of all your moves, but should the player come in and make a change not done before commence the end of the replay.

Oh, and storing/loading action replays would be pretty nifty, but by no means necessary.

ccexplore

Quote from: 0xdeadbeef link=1140547071/210#216 date=1142889718- Should the cursor/playfield move around or do you want to control the cursor/scrolling?
I have only experienced Action Replay as implemented in Cheapo (though I suspect it is modeled closely after WinLemm's action replay).  There, the player retains full control of cursor and playfield; the program does nothing on its own with those.  I haven't found that to be a problem during my uses of Cheapo.

On the other hand, if action replay is being used to demonstrate a solution to someone who has no idea how the solution goes (which never happens in Cheapo since you can't save and reload action replays), I can see how it might be useful to have the game automatically adjust the playfield whenever it's about to replay a skill assignment to a lemming outside the current view of the level.

Perhaps the two behavior can be user-selected thru the menu or something.


Quote- Should this be just a passive replay to show how you did this level or do you want to take over the action like in WinLemm?
Allowing the user to take over is much preferred, although I can live without it.

I would also note that even if the user is not allowed to interrupt at midpoint and take over, the user should at least be able to pause and fast-forward the action replay.


Quote- Is storing/loading stored action replays a needed feature?
I would certainly like that feature very much.

ccexplore

Quote from: 0xdeadbeef link=1140547071/210#216 date=1142889718Any other ideas/comments about action replay?
Just some comments:

1) Nuking should be recorded by action replay.  Some levels (none in Lemmings/ONML, but there's actually one in Xmas Lemmings 94, as well as some custom levels) actually make use of nuking as part of the solution, so it needs to be recorded.

2) Pauses/fast forwards should not be recorded by action replay.  Increase in RR that occurs when paused can be played back by abruptedly jumping to the final RR value which was attained when unpaused.

3) Assignment of climbers and floaters are not easily noticed in an action replay if the cursor doesn't shift to the lemming being assigned.  As a way to compensate that doesn't involve programmatically moving the cursor (which is still one valid possibility), one method is to display (only during playback of action replay) a "C", "F" or "A" over the head of the lemming being assigned, essentially at the same place where you would normally display the explosion countdown.

0xdeadbeef

Quote from: ccexplore link=1140547071/210#219 date=1142893535
Just some comments:

1) Nuking should be recorded by action replay.  Some levels (none in Lemmings/ONML, but there's actually one in Xmas Lemmings 94, as well as some custom levels) actually make use of nuking as part of the solution, so it needs to be recorded.
Sure. There are even fun levels which at least are usually finished by nuking.

Quote
2) Pauses/fast forwards should not be recorded by action replay.  Increase in RR that occurs when paused can be played back by abruptedly jumping to the final RR value which was attained when unpaused.
Sure. I never actually planned to record plause/FF anyway since the replay needs to be animation frame based to be sure that it's 100% accurate.

Quote
3) Assignment of climbers and floaters are not easily noticed in an action replay if the cursor doesn't shift to the lemming being assigned.  As a way to compensate that doesn't involve programmatically moving the cursor (which is still one valid possibility), one method is to display (only during playback of action replay) a "C", "F" or "A" over the head of the lemming being assigned, essentially at the same place where you would normally display the explosion countdown.
Hm, for the very first go, I think the change will not be marked, just like it WinLemm. For the future, it might be nice to have some gfx effect on any Lemming that's assigned a skill (like changing colour or having a box around it or whatever). You can see which skill by either checking the lemming with the cursor or by looking which icon is pressed and which counter decreased.

Mindless

Just a thought: maybe saved ARs should move the cursor around but shouldn't be interruptable?  and unsaved should be the opposite?
It would limit the user and be more work to program, so I'm not sure that it's really a good idea.

ccexplore

Quote from: Mindless link=1140547071/210#221 date=1142902400Just a thought: maybe saved ARs should move the cursor around but shouldn't be interruptable? &#A0;and unsaved should be the opposite?
That idea implicitly assumes that saved ARs are only used for communicating solutions.  But it could potentially be used for other things as well.  If we think of unsaved ARs as a sort of savestate, then I have definitely run into cases where to execute a very tricky solution on a version of Lemmings that runs on a console emulator, I might create multiple savestates along the way.  And so if I ran across such a situation in Lemmini I would probably be wanting saved ARs that are interruptible.

Proxima

Quote from: ccexplore link=1140547071/210#219 date=11428935353) Assignment of climbers and floaters are not easily noticed in an action replay if the cursor doesn't shift to the lemming being assigned.  As a way to compensate that doesn't involve programmatically moving the cursor (which is still one valid possibility), one method is to display (only during playback of action replay) a "C", "F" or "A" over the head of the lemming being assigned, essentially at the same place where you would normally display the explosion countdown.[/color]
I don't really see why this is so important. If the player sees a lemming climb or float, he'll know he's meant to make it a climber or floater at some point prior to that. There isn't a specific point when it's essential to assign the skill, unlike with the other skills.

covox

Tried to run under Linux (Ubuntu Dapper). Case-sensitive file/directories are somewhat ignored, so none of the levels will convert from LVL to INI if your export directory contains a capital letter. (interestingly, the graphics still convert without a hitch)

After picking a path that's entirely lowercase, the conversion process works fine for a while, but keels over when trying to patch the first level ("CRC of source differs from that in patch header"). One guess is that during the LVL2INI conversion process, the file I/O methods in UNIX Java translate "\n" into just a linefeed character (i.e. the civilized way), whereas under Windows Java it may instead give a carriage-return + linefeed (2 characters, a nasty relic from DOS and the norm for Windows text editing).

If this were the case it would certainly throw off the binary diff. Of course this is all guesswork, I haven't got a working Windows machine to litmus-test the theory on. Just for fun, here's my extracted copy of lvl1000.ini:
# LVL extracted by Lemmini # lvl1000.lvl
releaseRate = 1
numLemmings = 80
numToRecue = 80
timeLimit = 3
numClimbers = 0
numFloaters = 0
numBombers = 0
numBlockers = 0
numBuilders = 12
numBashers = 0
numMiners = 0
numDiggers = 0
xPos = 1216
style = brick

# Objects
# id, xpos, ypos, paint mode (), upside down (0,1)
# paint modes: 8=VIS_ON_TERRAIN, 4=NO_OVERWRITE, 0=FULL (only one value possible)
object_0 = 1, 1344, 128, 4, 0
object_1 = 1, 1408, 64, 4, 0
object_2 = 1, 1472, 0, 4, 0
object_3 = 0, 1376, 232, 4, 0
object_4 = 9, 1376, 264, 4, 0

# Terrain
# id, xpos, ypos, modifier
# modifier: 8=NO_OVERWRITE, 4=UPSIDE_DOWN, 2=REMOVE (combining allowed, 0=FULL)
terrain_0 = 24, 1376, 198, 0
terrain_1 = 24, 1440, 198, 0
terrain_2 = 24, 1436, 128, 0
terrain_3 = 24, 1500, 128, 0
terrain_4 = 24, 1500, 64, 0
terrain_5 = 24, 1564, 64, 0
terrain_6 = 31, 1508, 262, 0
terrain_7 = 31, 1568, 198, 0
terrain_8 = 31, 1632, 124, 0
terrain_9 = 30, 1508, 278, 0
terrain_10 = 30, 1508, 310, 0
terrain_11 = 30, 1568, 214, 0
terrain_12 = 30, 1568, 246, 0
terrain_13 = 30, 1568, 278, 0
terrain_14 = 30, 1568, 310, 0
terrain_15 = 30, 1632, 140, 0
terrain_16 = 30, 1632, 172, 0
terrain_17 = 30, 1632, 204, 0
terrain_18 = 30, 1632, 236, 0
terrain_19 = 30, 1632, 268, 0
terrain_20 = 30, 1632, 300, 0
terrain_21 = 30, 1696, 288, 0
terrain_22 = 30, 1696, 256, 0
terrain_23 = 30, 1696, 224, 0
terrain_24 = 30, 1696, 192, 0
terrain_25 = 30, 1696, 160, 0
terrain_26 = 30, 1696, 128, 0
terrain_27 = 30, 1696, 96, 0
terrain_28 = 30, 1696, 64, 0
terrain_29 = 30, 1696, 32, 0
terrain_30 = 30, 1696, 0, 0
terrain_31 = 2, 1432, 302, 0
terrain_32 = 2, 1368, 302, 0
terrain_33 = 2, 1304, 302, 0
terrain_34 = 19, 1714, 0, 4
terrain_35 = 19, 1778, 0, 4
terrain_36 = 20, 1834, -8, 4
terrain_37 = 20, 1834, 8, 4
terrain_38 = 20, 1850, -8, 4
terrain_39 = 19, 1714, 288, 8
terrain_40 = 19, 1778, 288, 8
terrain_41 = 20, 1834, 302, 8
terrain_42 = 20, 1834, 286, 8
terrain_43 = 20, 1850, 302, 8
terrain_44 = 19, 1240, 288, 8
terrain_45 = 19, 1208, 288, 8
terrain_46 = 19, 1208, 0, 12
terrain_47 = 19, 1272, 0, 12
terrain_48 = 19, 1336, 0, 12
terrain_49 = 19, 1368, 0, 4
terrain_50 = 20, 1424, 8, 4
terrain_51 = 20, 1440, -8, 4
terrain_52 = 20, 1424, -8, 4
terrain_53 = 20, 1296, 286, 0
terrain_54 = 20, 1312, 302, 0
terrain_55 = 20, 1296, 302, 0
terrain_56 = 42, 1216, 0, 0
terrain_57 = 42, 1248, 0, 0
terrain_58 = 35, 1234, 32, 0
terrain_59 = 42, 1250, 160, 0
terrain_60 = 42, 1218, 160, 0
terrain_61 = 42, 1232, 192, 0
terrain_62 = 42, 1752, 288, 0
terrain_63 = 42, 1784, 288, 0
terrain_64 = 35, 1768, 160, 0
terrain_65 = 42, 1752, 128, 0
terrain_66 = 42, 1784, 128, 0
terrain_67 = 42, 1766, 96, 0
terrain_68 = 20, 1200, 286, 0
terrain_69 = 20, 1200, 302, 0
terrain_70 = 20, 1200, 8, 12
terrain_71 = 20, 1198, -6, 12

#Steel
# id, xpos, ypos, width, height

#Name
name =  It's all a matter of timing