Log In  


Cart #drcreep-2 | 2021-11-08 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
13

Recreation of a C64 classic: Castles of Dr. Creep.
Compared to the original there are some changes, on the one hand because the layout is different (40x24 vs 16x16), on the other hand because I have defused some "backtracking" and death traps. Nevertheless, please note, the levels are from 1984 - there you have something different design.

Story


So, you're looking for a place to work? Something special, challenging, with a good salary? Well, we have just the thing for you.
Many different options open for your inspection. Just step inside ... Oh? You want to leave already? I'm afraid that's simply not possible ... not until you have taken the complete tour.
You'll notice that we have all the modern conveniences. Electrostatic energy generators to warm things up. Piped-in music which I'm sure you will find quite haunting. Doors galore, and you never know what you will find on the other side. Once the death rays start lining up behind you, however, I know you will be eager to find out.
You may want to step lively over trap doors and through the force fields - we've lost several potential applicants that way. Over there, of course, is mummy's room. Mummy seems to be all wrapped up at the moment, but probably not for long. And a break room? At the Laboratories, all the rooms are restful, although many of the occupants are not.
Neighbours, you ask? I Know you will love them. Frankenstein's Monster just seems to pop up whenever you least expect him.
Well, I really must be leaving now. I'm sure you can find your way around. Don't be alarmed. There's a key in here somewhere. You will find your way out eventually... and if not, Doctor Creep will be back shortly and you can help him with his, ah, experiments.
Goodbye now ... and good luck.

Playing the game


You are captured in a Laboratories and your goal is to escape.
Open a map with 🅾️.
In the pause menu you can save a game state. Note that the status is stored before entering the room.

Obstacles

Player

[8x8]

Doors and Doorbells

[24x16]

One way to open a door is to use the doorbell. Operate the doorbell by standing in front of it and pressing the ❎ button. To go out an open door, stand in front of the door and press ⬆️ or ❎.

Ladders

[16x16]

To get on a ladder, stand directly behind it and push ⬆️ or ⬇️. You can get off of a ladder whenever your feet are even with the front of a walkway.

Sliding Poles

[16x16]

To get on a sliding pole, stand directly in front of it and pull ⬇️. you cannot climb up the sliding poles. You can get off of a pole whenever your feet are even with the middle of a walkway.

Lightning Machine

[16x16]

Turn the sparks on or off by standing in front of the switch and push ⬆️,⬇️,❎.

Force Field

[16x16]

Turn off the force field by standing in front of the control and pushing ❎. The force field will remain off for a few seconds after the button is released.

Mummy

[32x16]

When you run in front of the ankh, the mummy slides out of its tomb. Mummies are
too stiff to use ladders or sliding poles.

Locks and Keys

[16x16]

To pick up a key, stand in front of it and push ❎. You can open a lock only after you have picked up a key of matching color. Stand in front of the lock and push ❎.

Ray Gun

[16x16]

Operate the gun by standing in front of the control and using ⬆️ and ⬇️ to aim and ❎ to fire. The gun fires automatically when it is at the same level as a player.

Matter Transmitter

[24x16]

Stand in the booth and hold ⬆️ until the color in the booth matches the color of the desired receiver oval. Push ❎ to transmit.

Trapdoor

[16x16]

The trapdoor opens or closes whenever anyone runs in front of the control.

Frankensteins Monster

[16x16]

When you walk in front of his coffin, frankensteins monster awakens and begins to chase you. frankensteins monster is able to use the ladders and sliding poles.

Conveyor Belt

[16x16]

To change the motion of the conveyor belt, stand in front of the control and push ❎.

The exit Door

[16x16]

The door at the right leads out of the laboratory. When you go out this door you have escaped.

Editor


https://github.com/GPIforGit/The-Laboratories-of-Dr.-Creep/releases - download the assets

There is a editor, splitted in several files:
creep.p8 - the game - stand-alone
creepbuild.p8 - pack all the data and store it in creep.p8
creepedit.p8 - the level-editor

And some data - no lua code here. Also only parts of the p8 are packed from this files:
creep_endscreen.p8 - the End-Screen, must be placed completely in the shared gfx rom!
creep_levels.p8 - the level-data
creep_mainback.p8 - the main-menu background, must be placed completely in the shared gfx rom
creep_music.p8 - main-menu music.
creep_sprites_sound.p8 - gfx (only 0x0000-0x1000), gfx-flags and sfx are used from here.

You need all the files to edit levels, for playing only the creep.p8

Note that when you save the level data, it is stored in "creep_levels.p8". When you want to test your level, you must run creepbuild.p8 or choose in the pause-menu "build".

There is a limit of 31 rooms and 15 of every object. First select a object with the keys, than place it with the left mouse button.

A switch can operate more than one machine. After placing a switch you can link the switch to a machine by simple click left on the machine. Right-click will quit link mode. To relink right click on a switch.

Doorbells and locks work the same, link them with doors.

When you place a door, you must set an connected door. Move the room with + - < > or switch room over the map (tab) and place there the second door. When you place the second door in the same room you create an exit-door.

With tab you enter map mode. Move the cursor over one map and press tab again to enter the room. With left-click on a room you can move it, right click to resize it.

The best way to edit the labs is to open pico8 twice, once the editor and once the game. If you want to try something out, select "build" in the editor pause menu and then ctrl+r in the game to reload the changes.

Working with the editor


Important - keyboard is only detected, when the pico8-window is activ and the mouse cursor is in the window!

left mouse button --- set object or move the object under the cursor

right mouse button --- change size of object under the cursor or go through a door or start/stop linking object (switches, door bells or locks)

0-9 * / . , --- change state/color of the object, for example the color of the walk ways, active/deactivate, change direction and so on

backspace --- delete the active selected object. Important, when you delete a lightning machine or a door, you should check every machine, switch and doorbells - they may be invalid.

space -- walk through door

w -- walkway
l -- ladder
s -- sliding poles
d -- door
b -- doorbell
o -- lock
k -- key
c -- conver belts
m -- lightning machine
i -- switch for lightning machine
f -- force field
t -- trapdoor
x -- matter transmitter booth
v -- transmitter destination
u -- mummy
r -- frankenstein monster
g -- ray gun

  • > -- next room
  • < -- previous room

shift+r -- rename lab when you empty the name, the lab will be deleted.

shift+s -- save (but not build!) the level data.

shift+e shift+1 -- start position player 1

shift+w shift+2 -- start position player 2

tab -- enter map mode

ctrl+c shift+c -- export lab as clipboard-string

ctrl+v shift+v -- import lab from clipboard

behind the scenes


Some may have guessed it already, the game is a "The Castle of Dr. Creep" clone. A classic on the C64 from 1984 and was quite unique at the time.

The original game is relatively complex and uses a complete floppy disk. The problem here is that I wanted to insert as many of the castles as possible. To put them "classically" in the map data does not work, much too large, so a level editor had to be created. Writing it in Pico8 was not so easy, it is almost more complex than the game.

A special feature of the level data is that I do not save byte wise, but bit wise. For example, to save the status of a trapdoor, I need exactly one bit. This method is also used for the game saves, otherwise it would be partly impossible to accommodate this in 256 bytes. However, I had to cheat a bit, for example, a round position of the creatures is stored. It is possible that a loaded game does not always remain solvable. But I think I've solved the problem.

In addition, I use the lzw logarithm to store even more data. it is possible to place data in source code via string, but somehow I find that inelegant. The packed data also has the advantage that it can be edited more easily with tools without changing the lua code.

Compared to the original castle, there are some changes, on the one hand because the layout is different (40x24 vs 16x16), on the other hand because I have defused some "backtracking" and death traps. Nevertheless, please note, the levels are from 1984 - there you have something different design.

The game should be similar to the original, but not just copy it. I've made some changes. The monsters, for example, always go at the closer player (in the original it was always player one). Likewise the map, in the original it appears after each level and you have to confirm it, I immediately switch here to the next room. This increases the game speed enormously.

The story text is a variant of the text on the back of the box. The object descriptions are variants of original tutorial.

sources

13


All Comments

WOW, @GPI ! Just wow.

Everyone else Try out the Tutorial which shows everything you can expect to find in this game. And that's a lot ! Superb thinking platformer. Gold star medal.


Thanks, and sometimes it is really useful to play a tutorial :)

I updated the cart in the first post.

  • The minimap-door-indicators should now align more nicely
  • There is an "easy mode". When you die in easy-mode, the room will reload.
  • Frankensteins Monster moving code changed, should not change direction on sliding poles end or when a leader is on the end of the walkway.
  • Update of the editor

This update include my version of "Alternation" (Original: http://moon.descentforum.net/creep/Alternation.html ), a new 14 room laboratory.


New update with a new lab
Teasdale - 16 new rooms to explore

  • some minor bugfixes and changes.

1

Was just reading the book "The Making of Prince of Persia" today and they mentioned a game The Castle of Dr. Creep. Never heard of it and then I come across this. Very well done.


This is very impressive!


@GPI +1 to very impressive. Got too hard for me a few rooms after I left the tutorial, but that's on me.

@GPI Edit: Thankyou for taking the time to explain your table-stringify function to me. I was able to create my own from scratch cause of your help, and I have since updated everything I have made to use it instead. I deleted my posts to cleanup your thread, and made notes of anything you taught to me so your posts can be deleted as well if you so choose. Thanks again.


@Cerb043_4

you can send me a e-mail:
<removed>


strange the e-mail is correct.. can you delete it from your post?
b is not only a table, it contains tables
so b[#b] will return the last table in the b-table and this table you can get a size #b[#b] increase by 1.

also see a table more than an reference as a table

a={}
b=a -- reference to the same table as in a!
a[1]=99
print( b[1] ) -- will return 99!

for example

str = [[
u=10
v={
20
30
40
}
duck
]]

b is at the beginning

b = { 
  {} 
}

first line:
u=10
will add u=10 in the last table inside b

b = { 
  {u = 10} 
}

v={
-- create a new table and set insert it with the "v"-Key in the top table of b
-- also reference the same table as new top entry in b

b = { 
  {u = 10, v = {}},
  {}, -- <- this table is the same as the v={} !
}

20
-- here we have no key value, so we look at the last table in b (b[2]), get the size #b[2] of 0, add 1
-- and the new generated key "1"
-- add [1]=20 to the top element of the b. (this will also change v, because it has the same reference)

b = {
  {u = 10, v = {[1] = 20}},
  { [1] = 20 },
}

30

b = {
  {u = 10, v = {[1] = 20, [2] = 30}},
  { [1] = 20, [2] = 30 },
}

40

b = {
  {u = 10, v = {[1] = 20, [2] = 30, [3] = 40}},
  { [1] = 20, [2] = 30, [3] = 40 },
}

}
-- now we have a end of table
-- we only need to drop the last table inside b

b = {
  {u = 10, v = {[1] = 20, [2] = 30, [3] = 40}},
}

duck

b = {
  {u = 10, v = {[1] = 20, [2] = 30, [3] = 40}, [1]=duck},
}

B is a table which contains table. the last table here is always a reference of the active element, where to add new values.
Thats why the code return b[1] - the first table in the table.


you should read

 #b[#b]+1

as

( # ( b[ ( #b ) ] ) ) +1

Sure. Thats why I post the code :)


This is one of the truly iconic c64 games everyone got and played
back in the days. But like with all vintage only a few mainstream
things are remembered in the major public.
I cannot give you enough kudos for done this fantastic and very
accurate conversion.



[Please log in to post a comment]