Compare commits

...

9 Commits

11 changed files with 1275 additions and 260 deletions

205
.datefile.txt Normal file
View File

@ -0,0 +1,205 @@
2021-2-5
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-8
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9
2021-2-9

1
.gamefile.txt Normal file
View File

@ -0,0 +1 @@
{"position":{"x":9,"y":4},"avatar":"🧔","movedToday":true}

7
.gitignore vendored
View File

@ -1,2 +1,9 @@
/node_modules
package-lock.json
.datefile.txt
.gamefile.txt
.dungeonfile.txt
.itemsfile.txt
.nonKittenItems.txt
.inventory.txt

1
.itemsfile.txt Normal file
View File

@ -0,0 +1 @@
[{"name":"random name","symbol":"_","position":{"x":4,"y":1}},{"name":"random name","symbol":"","position":{"x":11,"y":4}}]

701
.nonKittenItems.txt Normal file
View File

@ -0,0 +1,701 @@
50 Years Among the Non-Kitten Items\", by Ann Droyd
Blup, blup, blup\", says the mud pot
Dear robot, you may have already won our 10 MILLION DOLLAR prize...\
I pity the fool who mistakes me for kitten!\", sez Mr. T
Kibo was here\
Kilroy was here\
Mail Routing and the Domain System\" by Craig Partridge
No!\" says the bit
Plexar was here\
Robot may not injure kitten, or, through inaction, ...\
Sure hope we get some rain soon,\" says Farmer Joe
Take a penny, leave a penny.\" You do both
The Theory and Practice of Oligarchical Collectivism\" by Emmanuel Goldstein
There is no kitten!\" cackles the old crone. You are shocked by her blasphemy
Topsoil's all gone, ma,\" weeps Lil' Greg
"Yes!\" says the bit
Twas brillig in the slivey-toves..
...thingy??
3.14159... Pi is all over the place here..
99 bottles of beer are on a wall here
A \"Get Out of Jail Free\" card
A 100 meter long chain of jumbo paper clips
A 256 kilobyte write-only memory chip
A 540Hz tuning fork
A Gregorian date palm, its fronds gently waving
A Mentos wrapper
A Sanrio catalog
A Scooby Snack! Yay
A Swiss-Army knife. All of its appendages are out. (toothpick lost
A Texas Instruments of Destruction calculator
A baboon with a bassoon hoots angrily at you
A baby catapult and a little pile of pebbles
A badly dented high-hat cymbal lies on its side here
A ball of yarn
A bartender growls, \"No robots allowed!\
A big bass drum bearing a hole and suspicious clawmarks
A big chunk of frozen chocolate pudding
A bit of luck
A blank deposit slip
A bobolink is twittering a happy tune here
A book with \"Don't Panic\" in large friendly letters across the cover
A book: Feng Shui, Zen: the art of randomly arranging items that are not kitten
A bottle of ammonia
A bottle of distilled water
A bottle of hair tonic
A bottle of oil! Refreshing
A bottle of smelling salts
A bowl of cherries
A bowling ball with the name \"Bob\" inscribed on it
A box of brand-new nixie tubes
A box of dancing mechanical pencils. They dance! They sing
A brain cell. Oddly enough, it seems to be functioning
A breadbox that's bigger than a breadbox
A briefcase filled with spy stuff
A broken metronome sits here, its needle off to one side
A brown glass vial labeled \"tincture of iodine\"
A caboodle
A camera obscura
A canister of pressurized whipped cream, sans whipped cream
A card sharp sits here, practicing his Faro shuffle. He ignores you
A cardboard box of sheet metal screws
A chain hanging from two posts reminds you of the Gateway Arch
A clay pot with grass growing it in sits here
A claymore mine
A cluster of cattails are growing here
A coat hanger hovers in thin air. Odd
A cockatoo shrieks at you
A compendium of haiku about metals
A coupon for one free steak-fish at your local family diner
A crouton
A crowd of people, and at the center, a popular misconception
A cyclops glowers angrily at you
A dangly thing
A dark-emitting diode
A dead battery
A dead click beetle
A digital clock. It's stuck at 2:17 PM
A discarded bagpipe chanter reed
A discarded pop bottle
A discarded refrigerator in a discarded refrigerator box
A discredited cosmology, relic of a bygone era
A dodecahedron bars your way
A dog dressed in a cheap suit is here
A dogcow moofs at you
A failing unit test
A family of integrals is here integrating
A featureless black monolith
A five-horned rhinoceros beetle with rings on every other horn
A flask of hydrochloric acid is here
A flyer advertising a big sale on flyers
A flyer reads, \"Please donate hydraulic fluid\
A forgotten telephone switchboard operator
A forgotten telephone switchboard
A freshly-baked pumpkin pie
A frosted pink party-cake, half eaten
A gecko clings to the ceiling here
A geyser sprays water high into the air
A giant mechanical octopus spews flames from its tentacles
A glorious fan of peacock feathers
A gold-dipped rose
A gravestone stands here. \"Izchak Miller, ascended.\
A green yo-yo
A grin
A haircut and a real job. Now you know where to get one
A hairless rat
A half empty milk carton. Or is it half full
A half-eaten cheese sandwich
A hammock stretched between a tree and a volleyball pole
A hastily scribbled note reads, \"kitten is the letter Q.\
A hedgehog. It looks like it knows something important
A helicopter has crashed here
A herd of wild coffee mugs slumbers here
A hickory stump
A historical marker showing the actual location of /dev/null
A hollow voice says \"Fool!\
A hollow voice says \"Plugh.\
A homemade Tesla coil, fully charged
A hovercraft full of eels is parked here
A huge pile of pancakes
A jar of Vegemite is playing hopscotch here
A jar of dehydrated water
A jar of lemon curd
A jar of library paste
A ketchup bottle (nearly empty)
A kitten sink, for washing kitten (if only kitten liked water)
A kitten source (to match the kitten sink)
A large Turkish rug, worn threadbare by years of pacing
A large block of dry ice
A large blue eye floats in midair
A large coil of rope is here
A large pile of rubber bands
A large snake bars your way
A largish bath towel
A leather pouch filled with multisided dice
A little glass tub of Carmex. ($.89) Too bad you have no lips
A little teapot, short and stout
A livery stable! Get your livery
A lone, forgotten comma, sits here, sobbing
A lotus. You make an interesting pair
A magic switch
A magical... magic thing
A marijuana brownie
A mason jar lies here open. Its label reads: \"do not open!\"
A meat-scented air-freshener on a string dances in the breeze
A mere collection of pixels
A model of a twin-hulled sailboat
A naked singularity. You avert your eyes
A neat pile of plastic irrigation pipe
A neural net -- maybe it's trying to recognize kitten
A nondescript box of crackers
A noun and a boat bound to the wrong verb
A number of short theatrical productions are indexed 1, 2, 3, ... n
A packet of catnip
A packet of pipe cleaners
A pair of combat boots
A pair of saloon-style doors swing slowly back and forth here
A pangolin
A parade of ants crosses your path
A parrot, kipping on its back
A passing tiger tells you a terrible tale
A patch from the Mammoth Caves
A patch of grape jelly grows here
A patch of mushrooms grows here
A pile of blood-red maple leaves. You do not have time to count them
A pile of coaxial plumbing lies here
A pile of coconuts
A pile of discarded \"no dumping\" signs
A pile of irrigation valves
A pirate joke
A pirate
A pizza, melting in the sun
A plush Chewbacca
A post hole digger is stuck in a pile of dirt here
A puddle of chocolate sauce
A puddle of mud, where the mudskippers play
A puddle of purple semi-gloss latex paint
A punch bowl, filled with punch and lemon slices
A radio hisses away
A rancid corn dog
A realistic toy kitten. Suspended high above is a large steel cage
A river of liquid nitrogen flows through here
A robot comedian performs here. You feel amused
A roll of duct tape
A roll of scratch-and-sniff stickers
A rusted safety pin
A rusted telephone booth
A rusty crowbar
A rusty melon-baller
A rusty slinky. It was such a wonderful toy
A sack of doorknobs
A sack of hammers
A sack of wet mice
A salmon hatchery? Look again. It's merely a single salmon
A saucer of milk
A scrap of parchment bears the single word, \"meow\"
A scratching-post
A screwdriver
A sealed tin bearing only the word \"yummy\"
A section of glowing phosphor cells sings a song of radiation to you
A set of keys to a 2001 Rolls Royce. Worthless
A sheep and a lamp, lounging beneath a myrtle tree
A sign reads \"Don't step on the Mome Raths\"
A sign reads: \"Go home!\
A sign reads: \"Ignore this sign!\
A sign reads: \"No robots allowed!\
A signpost saying \"TO KITTEN\". It points in no particular direction
A singing frog. Useless
A six-wheeled robot sits lifeless, stuck in the dirt
A slightly-used smellovision set
A small box of fishing weights
A small, featureless, white cube
A smoking branding iron shaped like a 24-pin connector
A spindle, and a grindle, and a bucka-wacka-woom
A spiral-bound copy of the Necronomicon
A squirrel contentedly gnaws on a sprinkler head here
A stack of 7 inch floppies wobbles precariously
A statue of a girl holding a goose like the one in Gottingen, Germany
A steam-powered bunnytron
A stegosaurus, escaped from stegosaurusfindsrobot. It finds you
A stony meteorite
A street map of the city of Anaheim
A sub-atomic particle languishes here all alone
A sudden burst of maniaical cackling makes you feel homesick
A team of Arctic explorers is camped here
A technical university in Australia
A tetradrachm dated \"42 B.C.\
A threadbare tweed suit
A tiny robot scuttles across the floor
A tiny velvet pouch
A toenail? What good is a toenail
A toilet bowl occupies this space
A ton of feathers
A toupee
A toy zeppelin
A traffic signal. It appears to have been recently vandalized
A train of thought chugs through here
A trash compactor, compacting away
A travel-sized cyclotron
A tree with some jelly nailed to it
A tube of heat sink grease
A tube of toothpaste. Too bad you have no teeth
A tube of white lithium grease. Perfect for your robotic joints
A twist of lemon
A vacuum cleaner appears to have exploded here
A vanilla pudding pop
A vase full of artificial flowers is stuck to the floor here
A voice booms out \"Onward, kitten soldiers...\
A waffle iron is here and it's still hot
A warranted genuine Snark
A waterlogged grand piano
A willing, ripe tomato bemoans your inability to digest fruit
A wireframe model of a hot dog rotates in space here
A wondrous and intricate golden amulet. Too bad you have no neck
A zorkmid coin
Ah, the skirl of the pipes and the rustle of the silicon..
Ah, the uniform of a Revolutionary-era minuteman
Air
Alien underwear
An Internet chain letter
An abandoned used-car lot
An albatross, around its own neck
An aromatherapy candle burns with healing light
An assortment of highly-nutritious vegetables
An atomic vector plotter
An authentic 1953 veeblefetzer, sadly in need of adjustment
An autographed copy of the works of Anonymous
An automated robot-disdainer. It pretends you're not there
An automated robot-doubter. It doesn't believe in you
An automated robot-hater. It frowns disapprovingly at you
An automated robot-liker. It smiles at you
An electric engraving pencil
An electric fan lies on its side here
An eminently forgettable zahir
An empty Altoids tin
An empty coaxial cable spool
An empty shopping bag. Paper or plastic
An erroneous proof of the Goldbach Conjecture
An expired transistor
An historical marker
An ice cube
An iron meteorite
An obvious metaphor for Sysiphisian futility
An old bootable business card, unfortunately cracked down the middle
An old pattern is here going on and on
An old rusty revolver
An ordinary bust of Beethoven... but why is it painted green
An oven mitt with kittens on it
An overflowing bit bucket
An overturned bottle of rainbow-colored ink
An underwater avocado
An unlicensed nuclear accelerator
An unripe orange
Another rabbit? That's three today
Bars of lard, stacked a mile high
Beef stew
Biscuits
Bits of red construction paper are scattered all about
Blod
Brass tacks
Bright copper kettles
Bronzed baby shoes
Butane!!
Carbonated Water, High Fructose Corn Syrup, Color, Phosphoric Acid, Flavors
Ceci n'est pas un chaton
Chewing gum and baling wire
Colorless green ideas sleep furiously here
Could it be... a big ugly bowling trophy
Diogenes is here, demanding whisky
Dirty socks
Ed Witten sits here, pondering string theory
Empty jewelboxes litter the landscape
Five pounds of flax
For a moment, you feel something in your hands, but it disappears
Grind 'em up, spit 'em out, they're twigs
Haphazard stacks of white uppercase letters
Haven't you touched this before
Heart of Darkness brand pistachio nuts
Heeeeeeeeeeeere's Johnny
Here is no kitten but only rock, rock and no kitten and the sandy road
Here you are, at the behest
Here you are, over the objections
Here you are, under the auspices
Hey, I bet you thought this was kitten
Hey, look, it's war. What is it good for? Absolutely nothing. Say it again
Hey, robot, leave those lists alone
Ho hum. Another synthetic a posteriori
Hydraulic fluid and jagged metal bits. You recoil from the scene of carnage
I don't know what that is, but it's not kitten
IT'S ALIVE! AH HA HA HA HA
If it's not one thing, it's another
If it's one thing, it's not another
In Soviet Russia, kitten finds you. Unfortunately, this isn't Soviet Russia
Insane laughter issues from this vibrating shipping crate
Is that an elephant's head or a winged sandal
It is -- I just feel something wonderful is about to happen
It is a cloud shaped like an ox
It is a marzipan dreadnought that appears to have melted and stuck
It is a set of wind-up chatter teeth
It is an ancient mariner, and he stoppeth one of three
It pleases you to be kind to what appears to be kitten -- but it's not
It seems to be a copy of \"A Tail of Two Kitties\"
It's \"Finding kitten\", published by O'Reilly and Associates
It's \"War and Peace\" (unabridged, very small print)
It's 1000 secrets the government doesn't want you to know
It's Babe Flathead's favorite bat
It's Bach's Mass in B-minor
It's Brian Kernighan
It's Death
It's Dennis Ritchie
It's Grundle, the Green Dragon
It's Jesse James's severed hand and it's still moving
It's KITT, the talking car
It's Lucy Ricardo. \"Aaaah, Ricky!\", she says
It's Mary Poppins
It's Professor Feedlebom
It's Richard Nixon's nose
It's Schrodinger's non-kitten
It's Uncle Doctor Hurkamur
It's a \"HOME ALONE 2: Lost in New York\" novelty cup
It's a Bergenholm drive
It's a Cat 5 cable
It's a DVD of \"Crouching Monkey, Hidden Kitten\", region encoded for the moon
It's a Dvorak keyboard
It's a Franklin Ebookman
It's a Java applet
It's a Linux install CD
It's a MITS Altair 8800
It's a NetBSD install CD
It's a Quaker Oatmeal tube, converted into a drum
It's a U.S. president
It's a banana! Oh, joy
It's a battery-powered brass lantern
It's a big block of ice. Something seems to be frozen inside it
It's a big smoking fish
It's a black hole. Don't fall in
It's a blob of blue goo
It's a blob of grey goo
It's a blob of red goo
It's a bottle of nail polish remover
It's a box of lox
It's a box of pinball machine parts
It's a bucket of water
It's a bug
It's a business plan for a new startup, kitten.net
It's a cardboard box full of 8-track tapes
It's a cat. Are you too late
It's a charcoal briquette, smoking away
It's a child's pull-toy
It's a clue
It's a concatenation of circumstances
It's a continental breakfast
It's a cookie shaped like a kitten
It's a copy editor, reading aloud from the Associated Press Stylebook
It's a copy of \"Zen and The Art of Robot Maintenance\"
It's a copy of Knuth with the chapter on kitten-search algorithms torn out
It's a copy of the Book of Found Kittens
It's a copy of the robotfindskitten EULA
It's a dark, amphorous blob of matter
It's a fleet of mothballs
It's a fly on the wall. Hi, fly
It's a fossil trilobite
It's a fragment of an old Russian spacecraft
It's a free Dmitry Sklyarov
It's a free Jon Johansen
It's a funky beat
It's a groat coated with pocket fluff
It's a grue. Fortunately, they don't like to eat robots
It's a gun of some sort
It's a hanging chad
It's a hologram of a crashed helicopter
It's a hundred-dollar bill
It's a hyperkinetic rabbity thing
It's a large pile of crumpled notepaper
It's a left-handed smoke shifter
It's a limbo bar! How low can you go
It's a list of the zeroes of the Riemann zeta function
It's a merry-go-round (broken down)
It's a mighty zombie talking about some love and prosperity
It's a model of a catamaran
It's a moment of silence
It's a mousetrap, baited with soap
It's a nameless MSX computer from Japan
It's a nasty knife
It's a perpetual immobility machine
It's a pigeon with a TCP/IP packet duct-taped to its leg
It's a pile of wine corks
It's a pool with a straw in it
It's a portable hole. A sign reads: \"Closed for the winter\"
It's a prosthetic wheel, bent out of shape
It's a rapidly oscillating function
It's a recursive recursive recursive recursive recursive..
It's a red staple-remover
It's a red stapler
It's a rhyton. Right on
It's a rim shot. Ba-da-boom
It's a roll of industrial-strength copper wire
It's a rotating potato
It's a rotten old shoe
It's a rousing rendition of \"O Canada.\
It's a segmentation fault. Core dumped, by the way
It's a sleeping lion
It's a solitary vacuum tube
It's a spade
It's a squad of Keystone Kops
It's a square
It's a steaming bowl of homemade gnocci
It's a stone, unturned
It's a stupid mask, fashioned after a beagle
It's a symbol. You see in it a model for all symbols everywhere
It's a synthetic a priori truth! Immanuel would be so pleased
It's a tape of '70s rock. All original hits! All original artists
It's a tribute to fishnet stockings
It's a typewriter, covered in dust
It's a universal Turing machine constructed from LEGO blocks
It's a wallet full of blank credit cards
It's a week-old baloney sandwich
It's a whirly thing of some sort
It's a zen simulation, trapped within an ASCII character
It's an altar to the horse god
It's an argon-filled vault
It's an elongated brown sack, smelling of hot peppers
It's an elvish sword of great antiquity
It's an external dependency
It's an incomplet
It's an inverted billiard ball
It's an oil portrait of you, about to find kitten
It's an old Duke Ellington record
It's an unknown area code
It's another robot, more advanced in design than you but strangely immobile
It's creepy and it's kooky, mysterious and spooky. It's also somewhat ooky
It's cute like a kitten, but isn't a kitten
It's either a mirror, or another robot
It's evidence
It's just an object
It's more money than you'll ever need
It's nothing but a corrupted floppy. Coaster anyone
It's nothing in particular
It's part of a complete breakfast
It's probably nothing
It's scenery for \"Waiting for Godot\"
It's skeuomorphism. Yay, skeuomorphism
It's something fizzy
It's the <blink> tag
It's the ASCII Floating Head of Seth David Schoen
It's the Brass Nodes of the Universe
It's the Capable Prune
It's the Donation of Constantine
It's the Golden Banana of Discord
It's the Maltese Falcon
It's the Queen of Hearts! \"Off with their heads!\", she shouts
It's the Super Bass-O-Matic '76! Mmm, that's good bass
It's the Tiki Room
It's the Will Rogers Highway. Who was Will Rogers, anyway
It's the amazing self-referential thing that's not kitten
It's the astounding meta-object
It's the classification of all finite simple groups
It's the constellation Pisces
It's the cork to someone's lunch
It's the crusty exoskeleton of an arthropod
It's the handheld robotfindskitten game, by Tiger
It's the horizon. Now THAT'S weird
It's the instruction manual for a previous version of this game
It's the local draft board
It's the mark of the beast
It's the missing chapter to \"A Clockwork Orange\"
It's the proverbial wet blanket
It's the set of uninteresting natural numbers
It's the shock of recognition
It's the shortest distance between two points
It's the triangle leg adjacent to an angle divided by the leg opposite it
It's the whites of their eyes
It's the wrong number
It's this message, nothing more
It's wholesale, direct to you
Jacket fluff
Just a big brick wall
Just a box of backscratchers
Just a cage of white mice
Just a moldy loaf of bread
Just a monitor with the blue element burnt out
Just a pincushion
Just an autographed copy of the Kama Sutra
Just some glop of some sort
Just some old play by a Czech playwright, and you can't read Czech
Just some rusted lug nuts and an ancient hub cap
Just some spite
Just some stuff
Just some swamp gas
Just the empty husk of a locust
Just the usual gang of idiots
Keep looking and you will find kitten eventually
Lentil loaf
Long lost needle nose pliers
Look at that, it's the Crudmobile
Look out! Exclamation points
Lysine, an essential amino acid. Well, maybe not for robots
Marvin is complaining about the pain in the diodes down his left side
Mere shells cannot contain these peanuts
More grist for the mill
Mr. Hooper is here, surfing
Ne'er but a potted plant
Not kitten, just a packet of Kool-Aid(tm)
Nothing but some scribbles in crayon
ONE HUNDRED THOUSAND CARPET FIBERS!!!!
Oh boy! Grub! Er, grubs
One liter of fuming nitric acid
One of the few remaining discos
Ooh, shiny
Paul Moyer's necktie
Pieces of broken clay pigeons are scattered all about
Plenty of nothing
Preoccupation with finding kitten prevents you from investigating further
Pumpkin pie spice
Quidquid Latine dictum sit, kitten non est
Rene Descarte is whistling a happy tune here
Robot should not be touching that
Run away! Run away
Seargent Duffy is here
Seven 1/4\" screws and a piece of plastic
Several hackles are here and they appear to be up
Several meters of Cat 5 cable
Sigmund Freud is here, asking about your mother
Slack
Snacky things
So, THAT's what an invisible barrier looks like
Some coconut crabs are milling about here
Some sort of electronic handheld game from the 1970s
Someone dropped a cheap ballpoint pen here
Someone dropped an expensive fountain pen here
Someone has written \"ad aerarium\" on the ground here
Someone's identity disk lies here
Something borrowed, something blue
Something is written here in the dust. You read: \"rJbotf ndQkttten\"
Stimutacs
Sutro Tower is visible at some distance through the fog
TV says donuts are high in fat
Talcum powder
Tea and/or crumpets
Ten yards of avocado-green shag carpet
Thar's Mobius Dick, the convoluted whale. Arrr
That's just a charred human corpse
That's just an old tin can
The Digital Millennium Copyright Act of 1998
The Inform Designer's Manual (4th edition
The Monolith of Spam towers above you
The United States Court of Appeals for the Federal Circuit
The World's Biggest Matzoh Ball
The boom box cranks out an old Ethel Merman tune
The intermission from a 1930s silent movie
The ionosphere seems charged with meaning
The letters O and R
The man page for the UNIX 'find' command
The non-kitten item bites
The non-kitten item like this but with \"false\" and \"true\" switched is true
The non-kitten item like this but with \"true\" and \"false\" switched is false
The object pushes back at you
The pants that Curly died in
The rothe hits! The rothe hits
The rusted gates of an abandoned bemusement park
The score for a Czech composer's \"Kitten-Finding Symphony in C\"
The spectre of Sherlock Holmes wills you onwards
The swampy ground around you seems to stink with disease
There are many coins here
There is a small mailbox here
There is no tea here
There's nothing here; it's just an optical illusion
There's something behind you
These aren't ordinary beans. They're magic beans
This TRS-80 III is eerily silent
This appears to be a rather large stack of trashy romance novels
This appears to be a statue of Perseus
This bouncy castle is filled with helium
This corroded robot is clutching a mitten
This drawer is full of dried out rubber stoppers
This grain elevator towers high above you
This invisible box contains a pantomime horse
This is a Lagrange point. Don't come too close now
This is a disaster area
This is a porcelain kitten-counter. 0, 0, 0, 0, 0..
This is a remote control. Being a robot, you keep a wide berth
This is a tasty-looking banana creme pie
This is a television. On screen you see a robot strangely similar to yourself
This is an anagram
This is only a test of the Emergency Broadcast System
This is the forest primeval
This is the tenth key you've found so far
This is the world-famous Chain of Jockstraps
This isn't the item you're looking for
This jar of pickles expired in 1957
This jukebox has nothing but Cliff Richards albums in it
This kind of looks like kitten, but it's not
This looks like Bradley's \"Appearance and Reality\", but it's really not
This looks like a skateboarding arcade video game
This looks like an umbrella turned inside out
This looks remarkably like last Tuesday
This map is not the territory
This might be the fountain of youth, but you'll never know
This non-kitten item no verb
This non-kitten item was present in a previous version, but has been removed
This object here appears to be Louis Farrakhan's bow tie
This object is like an analogy
This particular monstrosity appears to be ENIAC
This peg-leg is stuck in a knothole
This place is called Antarctica. There is no kitten here
This seems to be junk mail addressed to the finder of the Eye of Larn
This subwoofer was blown out in 1974
This thing appears to be an ancient Roman breastplate
This tiny barbecue is spotlessly clean
This toaster strudel is riddled with bullet holes
This tomography is like, hella axial, man
This vending machine dispenses only coffee grounds
This was no boating accident
Three half-pennies and a wooden nickel
Three lizards lie here, playing Rock-Paper-Scissors
Three mismatched gloves
Tweeting birds
Two crepes, two crepes in a box
Two magnets cling to each other in the darkness
Two vast and trunkless legs of stone
Uh-oh..
Vitriol
Vladimir Lenin's casket rests here
Wait! This isn't the poker chip! You've been tricked! DAMN YOU, MENDEZ
We wish you a merry kitten, and a happy New Year
Welcome back, robot
What in blazes is this
What's that blue thing doing here
Whatever it is, it's circular. Oh, it's a circle
Why are you touching this when you should be finding kitten
You can't touch that
You discover the entrance to a forgotten mine
You disturb a murder of crows
You encounter a cheap knockoff of this game: \"androidfindspuppy.\
You feel strangely unfulfilled
You find a bright shiny penny
You find a fraud scheme in which loans are used as security for other loans
You find a random assortment of dots and dashes
You find an Atari 2600 game cartridge with no label
You found kitten! No, just kidding
You found netkit! Way to go, robot
You found the marble in the oatmeal
You have new mail in /var/spool/robo
You search this barrel thoroughly, but find only dried mango slices
You see a rhinestone-studded dog collar, but no dog
You see a snowflake here, melting slowly
You stumble upon Bill Gates's stand-up act
You stumble upon a digital signature
You suddenly yearn for your distant homeland
You won't believe what this is
You've discovered an enormous pile of socks
You've found a black screen filled with colorful ASCII characters
You've found a precautionary measure
You've found a speed bump
You've found the Gingerbread Man
You've found the fabled America Online disk graveyard
You've found the fish! Not that it does you much good in this game
You've found the snows of yesteryear! So that's where they all went to
Your current score: 3
Your existential dread
Your pal Floyd is here and wants to play Hucka-Bucka-Beanstalk
Your permanent record

204
README.md
View File

@ -1,209 +1,13 @@
# Dungeon of the Day (working title)
7day roguelike 2021
# Devlog
## Day 4
Dungeon of the Day is being produced under the tight constraints of the 2021 7DRL (seven day roguelike challenge).
Did not work as much work in on this today as I would have liked. So it goes. I spent most of the day prepping for teaching and working on my podcast, which I'm as excited about, so it's okay. So I put maybe only an hour and a half or two into coding today.
[devlog](devlog.md)
I was confused why my grids were still not lined up properly in the Terminal. River Smith on Mastodon pointed out that to get consisted full-width characters I could use east asian full-width latin characters, something I wasn't previously familiar with. These are unicode characters (there are so many!) that appear like western latin characters with extra spacing around them, so they will fit in a grid properly with the emojis I think, and my early testing bears this out. I replaced my @ with . Can you tell?
```
@ or
```
Then I went back to looking at emojis for spawning items, and it dawned on me how limiting that is. The brilliance of ascii roguelikes is partly what's so brilliant about reading books for pleasure. Our mind fills in a picture-idea of the environment. I don't fully know how it works, and it's not the same as a visual experience, but I *feel* things that I read, even those that are described. This is why we can almost jump out of our chair when playing rogue and a certain monster appears. I enjoy Brogue but usually can't get past level 10 or 11. I get so thrown off when a purple g appears, and I know it's a goblin conjurer! The emojis are a bit different. They are a representation that's more 1-to-1 with what they symbolize. A tree for example. It's hard to let them to serve as mere symbols rather than the specific object they're depicting perhaps. I'll have to spend more time considering this. I could have particular emoji represent certain types of items. In any case, currently I am spawn emoji terrain and player (or @) and chars as item symbols. It's a strange combo and I've not seen that before. We'll see if it sticks or I move one way or the other or switch to a tileset.
I'm also feeling like I might simplify the mechanics. A small 'tiny village' is spawned each day, and a new one isn't spawned until the next day, replacing the previous. That shouldn't be too bad to do, and perhaps feels not only in scope but also an appropriate amount of gameplay. Less than a coffeebreak, more like an espresso-break. Which is in keeping with the feel I'm going for here. An ambient mini village walking sim that you return to each day, easily, from the command line. But the inventory should be carried over, and perhaps a quest or other things? Maybe just inventory for simplicity at this point. And you collect the items just like the "You are carrying bot" by Andrew Vestal. You can't do anything with them beyond enjoying them. You can drop items and leave behind, or hold onto things you like and read them. Maybe there's a limited size backpack or something, so you have to choose each day what items to keep and what to drop.
[You are Carrying bot on twitter](https://twitter.com/YouAreCarrying/)
Now that I have a particular goal in mind I need to collect a good number of interesting items to be spawned. I read that You are Carrying bot uses a list of items from Infocom classic games like the Zork series, Hitchhiker's Guide to the Galaxy and Planetfall. Unfortunately, I can't seem to find those lists of items readily. It's probably obscured in the source code, but I don't see it in my initial searching.
So next I am checking Darius Kazemi's corpora for ideas.
[There are 450 objects in this file](https://github.com/dariusk/corpora/blob/master/data/objects/objects.json)
[words relating to new technologies](https://github.com/dariusk/corpora/blob/master/data/technology/new_technologies.json)
[a list of appliances](https://github.com/dariusk/corpora/blob/master/data/technology/appliances.json)
[a list of 1000 nouns, though many are ideas rather than objects](https://github.com/dariusk/corpora/blob/master/data/words/nouns.json)
[An article with 151 items to bring camping](https://www.survivaltechshop.com/camping-checklist/)
[List of 181 survival kit items](https://thesurvivaljournal.com/survival-kit-list/)
Maybe these last few can be added to Darius's Corpora. They seem in particular a good fit for the outdoor environment setting, though I do like wacky items generation as well.
I think it would be nice to also add messages in a bottle you find and/or books or poetry.
I'll try to get at the items from Zork and maybe examine the items from robotfindskitten if possible. Perhaps I'll also use a form of Kate Compton's Tracery to develop a grammar. Not sure yet. Depends how ambitious I feel and my time available.
## Day 3
Last night when I solved a vexing (but simple) bug that was causing weird rendering of the dungeon I had decided that I was next ready to work on the actual gameplay mechanics! Well, today I started out actually by implementing the date function instead. My original idea had been to make a game somewhat indebted to the game-ritual Vesper.5 by Michael Brough, which allows the player to only move once a day. So I started out by implementing a function to get the date, check if it's the same as the last date appended to a savedate file, and then report back whether it's a new day or the same day. If it's a new day, you can move the player, otherwise, you can't.
[Vesper.5](http://mightyvision.blogspot.com/2012/08/vesper5.html)
Then I promptly turned this off so I can work on and debug and play the game as I develop it! Maybe I'll turn this back on later, maybe not. Will see how it turns out. The goal would be to turn this back on when I release.
So now I started to go through emojis to look for people, and then after to look for items to add to the game procedurally. I started realizing I don't really want to add monsters. I'm still after a personal quest to make something more like a roguelike walking sim, something that doesn't rely on attacking for its game mechanics. I love wandering in Caves of Qud, exploring, seeing what comes up, and having conversations. Can I make it something more like that? It does have quests, which helps move the action forward, and it has danger/risk.
[Caves of Qud](https://www.cavesofqud.com/)
Simulating a giant ecosystem I think is outside the scope of what I can accomplish or work on in a week, though I could extend this after the 7drl finishes. I started thinking about the almost roguelike Robotfindskitten, by Leonard Richardson, originally from 1997/2000. It's described as "yet another zen simulation."
[robotfindskitten](http://www.robotfindskitten.org/)
The gameplay dynamics are simple. You are a lowly robot wandering around. There are lots of letters (aka objects or maybe other creatures) that you see but can't identify until you bump into them, the same way that you bump into monsters in other roguelikes. And that's it. When you find kitten or quit, then the game ends.
Here's a list of items I came across in my current playthrough just now, and the letters that were representing them, which appears entirely arbitrary:
* . - An unripe orange
* L - For a moment, you find something in your hands. But it disappears.
* Q - This is an anagram.
* g - Ten yards of avocado-green shag carpet.
* l - a traffic signal. It appears to have been recently vandalized.
* o - an aromatherapy candle bright with healing light
* > - a ketchup bottle (nearly empty)
* < - an old bootable business card, unfortunately cracked down the middle
* P - "appears to be" an ancient Roman breastplate
* = - a mere collection of pixels
* P - a warranted genuine Snark
* t - a black screen filled with colorful ASCII characters
* i - a rusty mellon baller
* ) - an oil portrait of you, about to find kitten
* b - he letters O and R
* A - a stupid mask, fashioned after a beagle
* r - robotfindskitten!
A quick animated ascii text of the robot moving to the kitten over a few frames, and then the program ends and quits!
This is a petite game that leverages its procedural algorithm so that the player's goal is really to explore the items just for the satisfaction of seeing what items get generated and how they're described. That's basically the entirety of the experience, and its pretty minimal at that. But it's an occasional thrill.
Likewise, in the Roguelike Caves of Qud, one of my favorite things to do is to go visit the graveyard that lies above Joppa. Reading the tombstone epitaphs brings a thrill, not because it's a serious experience but because of the zaniness of what's written there, and the variety of things that appear. Beyond that, the world of Qud rewards exploration for the lore, books, factions, and histories discovered there.
My own game will likely be more Robotfindskitten-like, but let's see.
Before bed at 3am I started thinking about how being able to make a single move might not be the most compelling. Even if you could amke a single move, then continue to interact with a person or object at that space. What if it was more like you could play in a single section each day, then a gate opens and you can move to the next 'room' or area. I'm thinking about how when you finish enough tasks in untitled goose game it opens the gate to allow you to walk to the next mini area.
I'm also thinking about Tiny Villages. I love the villages in Qud, and even the primitive town maps of roguelikes Larn and Moria. Perhaps I can make small generated outposts and mini towns that can be explored each day, with robotfindskitten items as well as occasional graves or magical items. And a gate or passageway allows one to proceed to the next area (and closes off previous one?) when it's a new day.
```
//----------------create zone---------------
let buildings = ['🏛️','⛺']
let landscapes = ['🏔️''','🌿','🌱','🌾','🌻','🌵']
let plants = ['🌹','🌺','🌻','🌼','🌷','🎋']
let shrines = ['⛩️','🗿']
let items = ['🍄','🌰','
```
I'm wondering if i'll find enough hut, house, stall, building emojis I want to use. Might have to switch to a tileset? But if that's the case, I'll need a different approach to drawing the screen. I guess I'll need to do that anayway. Maybe time for Curses or Blessed.
[Blessed library](https://www.npmjs.com/package/blessed)
Or maybe like the original Robotfindskitten, the individual letter characters can be just as arbitrary, their description when you walk into them doing the work of describing a world (in our mind) much more than the limited graphic representation of the emoji.
## Day 2
I taught, had meetings, cooked and had a nice dinner with friends in my household (we're in a "pod"), spent a few hours actually cleaning up and backing up some hard drives tonight, so I spent less time on this than I had hoped today, but I did get stuff done, and I tracked down an annoying bug.
```
🌲🌲🎄🌲🎄🌳🌲🎄🌳🌲🎄🌳🌳🎄🎄🌳🎄🎄🌲🌳
🌲🌳🎄🎄🌳🌳🌳🎄🌳🌲🌲🌲🎄🌲🌳🎄🌲🌳🎄🌳
🌲🌲👵🎄🌳🌲🌲🌲🌲🎄🌲🎄🌳🌳🎄🌳🌳🎄🌳🌲
🌳🌳🎄🌳🎄🌲🌲🌳🌳🎄🌲🌳🎄🎄🌳🌲🌳🎄🌳🌳
🌲🎄🎄🎄🎄🌲🌳🌳🎄🌳🌳🌲🎄🌳🌲🌲🌲🎄🌲🌲
```
Today I mostly explored terrain. I kind of decided to keep exploring emojis for my tileset. Perhaps this is a mistake. Emojis, at least to me, are often "ugly aesthetic." But I use them! One thing that's nice is that they are probably present on most people's systems. And there are already a variety of clear options for the player avatars, enemy "sprites", terrain, objects.
For example, here's a clear trophy like in Indiana Jones and the Temple of Doom. Very roguelike-y to me, and pretty clear that this would lead to the end of the game or be a big prize to get in any game.
```
🏆
```
So if I proceed with emojis for my tileset, I'm thinking about avatars for the player. Does this get selected by the player? Or does the player select a class like in so many other roguelikes, and that determines the avatar? If the player does end up playing this game over days, weeks and months, it's important that they feel connected to their avatar on screen, and I think that would be aided by the player getting to choose their own avatar. Here's some of the options I'm looking at. Notice that these each speak different vocabularies.
```
const avatars = ['👳','👶','🧛','🤺','🕵','👲','🧕','👵','👧','🧔','👸','☹','☺',🤠','@']
```
Ok, so to just get moving, I now have the program choose a random avatar emoji from this array when a new dungeon-game gets created.And I am testing moving using flags. So for example, to move left currently is:
```
node dotd --left
```
or
```
node dotd -l
```
That's probably a bit silly but i'm going with it for now. I'm using yargs to parse the flags in the CLI.
Just had an interesting idea that perhaps the player submits a short program file like 'right right right up up right' so that you have to program your player-robot, and that you submit that and it runs. Would that be interesting? Rather than turn-based? I get too many ideas but should probably just proceed with standard, and then modify later if I don't have a clear goal other than 'wouldn't it be cool if....".
Tonight after coming back to things I noticed an annoying bug. When opening a saved game file and loading the terrain would be slightly messed up. One char to the left or right of the player wouldn't render correctly, and the player would be a few spots over from where they should actually be. I tried all sorts of things and after some brute force debugging and console.log'ing I realized I was rendering the terrain at the wrong time, moved it until after saving out the terrain/game file (so it doesn't over-write anything in the dungeon permanently). And now it works fine. One question: should i be saving all of the terrain tiles? Quite possibly. So then maybe i should save it out! Or save it to a json table? Seems silly. The issue of why/how to save would come up if tile persistence of terrain is necessary. If a player moves left and walks over a tree, should that same exact tree be there after they walk off? I think so. That's of course the standard course of fare. I mean, I only have different tree terrain not because they act differently but because of 'visual interest'. Would a player notice if the trees were scattered each time they loaded if a day had passed? Maybe? Anyway, I'm tired and will revisit this decision in the next few days. Am assuming I should store all tiles in all positions. It's not particularly computationally difficult.
Next step when I come back is to add gameplay mechanics. I think I'd like to have tents, markets, lore?, conversations? monsters? What else?
## Day 1
i started by creating a an array of arrays (2d array) to 'hold' the level. i looped through it to assign a blank characters, at first a zero, but now a period. it took me some time to figure out how to properly point to a x,y position properly with this method. argh. lots of trial and error and i copy-pasta one line i didn't really understand from stackoverflow but understand what it outputs and worked backwards. actually, here it goes. this is cool. separately, maybe i can revisit making my own processing-derivative drawing parser in ascii. ok ok, that's a later project. anyway, i can now address a grid of text with x,y coordinates. great. proud of myself! lol. i have a grid of periods.
next i pick a random x,y position on the grid for the player. drop an @ there.
now i save to an external file. i think a core mechanic of my game will be that you can only play one move a day. inpsired by michael brough's vesper.5 'ritual'-game where you can (only move one square a day). that game got a lot of notice. oh, but it wasn't ascii. and it was 7 or 8 years ago. argh. anyway. i think i like this idea. and it's doable. and even though the command line and ascii art does not appeal to my 'art' base, my hacker phreaks like this, and i like this too! lol. it's not visual though. michael's work is so appealing because it speaks its own visual language. should i just work in p5 again? i have a half-engine for roguelikes in p5. maybe i could revisit? but way, i like this idea of a "Message of the Day" (Dungeon of the Day?) roguelike where it's in the command line, since that's my primary interface on my computer. i mean i'm typing in the command line now.
the concept is loosely that it's an ambient game. when you open a new terminal window the board (perhaps) is displayed as the message of the day. you can make one move a day. (how?). other than moving, maybe you can also use an item, talk to npc's, buy something at the market? or maybe you can move up to 3 different characters, like Lost Vikings (o.g. nintendo game that i liked that there doesn't seem to be any modern clones of).
okay, need to figure out more core mechanic/compelling gameplay. an ambient game is nice perhaps but needs some juice to make people want to play this and not skip over it.
other roguelike ideas i'd been thinking of but maybe not this time:
- monome teletype-based roguelike for my modular synth. moving/fighting/spells would each play a different sound. i wish i could plug a nintendo/snes controller though instead of a keyboard. i guess i could use a numpad instead. each number to trigger a different script, for each direction and maybe 0 for something.
- use p5.js to make more out-there experimental compelling visuals, a la a Broughlike
- use Lua. which i really enjoy, and there are (brough-like again!) tutorials for
- use pico-8 which i also enjoy, and is a subset of Lua with extended API, and i have some tutorials and previous experience on. i particularly love how it combines a CLI with visuals on same screen. i wish i could do this with p5/js.
- use my PLOGO logo-language to make a roguelike. kind of a funny idea. also, i did built a console into it.
anyway.... no end of (bad) ideas
# Day 1 1/2
What should terrain look like?
Old PETSCII? ZZT? (Can i get this with unicode or do i need to load a special font in the terminal, and then have to package that font? Can node do this?
oh wait, or should i just do this. it's easy. emoji.
```
🎄
🌳
🌲
🌴
🎋
🏡
🌱
🌿
🏕️
```
too cheesy? possibly
-
- code page 437 - (for example in ZZT)
- [page 437 characters translated to unicode](https://wikimili.com/en/Code_page_437)
- [unicode page 437 font](https://github.com/berenddeschouwer/fourthreeseven) to work in linux!
- embedded (copy-pastable) in [this article](https://www.masswerk.at/nowgobang/2020/petscii)
- [petscii to unicode converter](https://style64.org/petscii/)
# License
Items from robotfindskitten GPLv2

35
TODO.md
View File

@ -3,17 +3,28 @@
## Bugs
## Roadmap
- [X] what's the game mechanic / concept? should be one clear concept
- [.] saveFile should actually save json file (as text) with map and all the tiles in each position:
- [X] player position,
- [ ] all monsters,
- [ ] item positions,
- [ ] terrain positions
- [ ] load items from disk
- [ ] generate text for items
- [ ] check collision with item, read out message
- [ ] inventory file to save inventory
- [X] save date and check for today's date (if so, you cannot move, but can you do something else?)
- [ ] instead of creating . for generic terrain, do like createItems and have it save array of objects which terrain symbol and x, y location instead. (buildings, plants, tombs, etc)
- [ ] add tombstones, signs?, books, art? descriptions. what else?
- [ ] curses-like screendraw system
- [ ] - [ ] fixed number of moves limit before you *fall asleep*
- [ ] background of tiles becomes gray (twilight), then black (nightfall) before you fall asleep?
- [ ] create, save and load all monsters,
- [ ] create, save and load terrain positions
- [ ] generate descriptions for items that i'm happy with
- [ ] ability to drop items
- [ ] programmable robot pet? - (you feed it logo commands to retrieve things?)
- [o] check collision with item, read out message
- [X] check collision with item, read out its name
- [ ] add parse (--view?) to look at/read items in inventory (can't be used? just read/looked at?)
- [ ] help system
## CLOSED
## Completed
- [X] inventory file to save inventory
- [X] save date and check for today's date (if so, you cannot move, but can you do something else?)
- [X] load items from disk
- [X] what's the game mechanic / concept? should be one clear concept
- [X] save item positions,
- [X] save player position,
## CLOSED Issues
- [X] not all emoji are same width so different size players cause map row to get off of lined up grid

View File

@ -1,32 +0,0 @@
2021-2-5
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6
2021-2-6

226
devlog.md Normal file
View File

@ -0,0 +1,226 @@
7day roguelike 2021
lee2sman
# Devlog
## Day 4
Did not work as much work in on this today as I would have liked. So it goes. I spent most of the day prepping for teaching and working on my podcast, which I'm as excited about, so it's okay. So I put maybe only an hour and a half or two into coding today.
I was confused why my grids were still not lined up properly in the Terminal. River Smith on Mastodon pointed out that to get consisted full-width characters I could use east asian full-width latin characters, something I wasn't previously familiar with. These are unicode characters (there are so many!) that appear like western latin characters with extra spacing around them, so they will fit in a grid properly with the emojis I think, and my early testing bears this out. I replaced my @ with . Can you tell?
```
@ or
```
Then I went back to looking at emojis for spawning items, and it dawned on me how limiting that is. The brilliance of ascii roguelikes is partly what's so brilliant about reading books for pleasure. Our mind fills in a picture-idea of the environment. I don't fully know how it works, and it's not the same as a visual experience, but I *feel* things that I read, even those that are described. This is why we can almost jump out of our chair when playing rogue and a certain monster appears. I enjoy Brogue but usually can't get past level 10 or 11. I get so thrown off when a purple g appears, and I know it's a goblin conjurer! The emojis are a bit different. They are a representation that's more 1-to-1 with what they symbolize. A tree for example. It's hard to let them to serve as mere symbols rather than the specific object they're depicting perhaps. I'll have to spend more time considering this. I could have particular emoji represent certain types of items. In any case, currently I am spawn emoji terrain and player (or @) and chars as item symbols. It's a strange combo and I've not seen that before. We'll see if it sticks or I move one way or the other or switch to a tileset.
I'm also feeling like I might simplify the mechanics. A small 'tiny village' is spawned each day, and a new one isn't spawned until the next day, replacing the previous. That shouldn't be too bad to do, and perhaps feels not only in scope but also an appropriate amount of gameplay. Less than a coffeebreak, more like an espresso-break. Which is in keeping with the feel I'm going for here. An ambient mini village walking sim that you return to each day, easily, from the command line. But the inventory should be carried over, and perhaps a quest or other things? Maybe just inventory for simplicity at this point. And you collect the items just like the "You are carrying bot" by Andrew Vestal. You can't do anything with them beyond enjoying them. You can drop items and leave behind, or hold onto things you like and read them. Maybe there's a limited size backpack or something, so you have to choose each day what items to keep and what to drop.
[You are Carrying bot on twitter](https://twitter.com/YouAreCarrying/)
Now that I have a particular goal in mind I need to collect a good number of interesting items to be spawned. I read that You are Carrying bot uses a list of items from Infocom classic games like the Zork series, Hitchhiker's Guide to the Galaxy and Planetfall. Unfortunately, I can't seem to find those lists of items readily. It's probably obscured in the source code, but I don't see it in my initial searching.
So next I am checking Darius Kazemi's corpora for ideas.
[There are 450 objects in this file](https://github.com/dariusk/corpora/blob/master/data/objects/objects.json)
[words relating to new technologies](https://github.com/dariusk/corpora/blob/master/data/technology/new_technologies.json)
[a list of appliances](https://github.com/dariusk/corpora/blob/master/data/technology/appliances.json)
[a list of 1000 nouns, though many are ideas rather than objects](https://github.com/dariusk/corpora/blob/master/data/words/nouns.json)
[An article with 151 items to bring camping](https://www.survivaltechshop.com/camping-checklist/)
[List of 181 survival kit items](https://thesurvivaljournal.com/survival-kit-list/)
Maybe these last few can be added to Darius's Corpora. They seem in particular a good fit for the outdoor environment setting, though I do like wacky items generation as well.
I think it would be nice to also add messages in a bottle you find and/or books or poetry.
I'll try to get at the items from Zork and maybe examine the items from robotfindskitten if possible. Perhaps I'll also use a form of Kate Compton's Tracery to develop a grammar. Not sure yet. Depends how ambitious I feel and my time available.
### Later in day...
I downloaded robotfindskitten objects and added to game. I load them externally. I added collision detection and have it read out the robotfindskitten description of the item you're on. I also added the ability to "grab" what you're standing on, and save it to inventory (which gets written to file as well). Hmm. Now that i've implemented, the tone of robotfindskitten doesn't seem to perfectly fit here, though there's something nice going on in a few of them. I think it's possibly too wacky, which doesn't match the emoji tileset/theme.
Rewatched Josh Ge's How To Make a Roguelike talk from Roguelike Celebration a few years ago. It was helpful. Concentrate on core gameplay! That's where I'm at now!
[How To Make a Roguelike talk on Youtube](https://www.youtube.com/watch?v=jviNpRGuCIU)
I now have a pretty big TODO file going on, adding tasks, and checking off ones I've completed and bugs I've solved.
I'm thinking I may want to actually use a cool tileset, or just revert back to ascii. Undecided! But I'm still worried there's not enough emoji, and they're too specific to represent the range of text description I want to hit on. Hmmm.
I've also refined some of my core concepts ideas. Thinking now you'll have a limit of number of moves in a day before you "fall asleep." Perhaps you can extend your action by programming a robot, in a simple LOGO-language. ! (I'm probably adding too much But I'm thinking of this as a stretch goal).
Tomorrow I need to work more on generating the tiny village. I'd like to generate tombstones to read, book titles, probably a more specific good list of random items-objects. They should all be compelling, interesting, that the player cares about being a caretaker/digital owner of. That's the "point" of this game, so the text needs to meaningful. I may need to use Tracery I think.
It's pretty late, time for bed.
## Day 3
Last night when I solved a vexing (but simple) bug that was causing weird rendering of the dungeon I had decided that I was next ready to work on the actual gameplay mechanics! Well, today I started out actually by implementing the date function instead. My original idea had been to make a game somewhat indebted to the game-ritual Vesper.5 by Michael Brough, which allows the player to only move once a day. So I started out by implementing a function to get the date, check if it's the same as the last date appended to a savedate file, and then report back whether it's a new day or the same day. If it's a new day, you can move the player, otherwise, you can't.
[Vesper.5](http://mightyvision.blogspot.com/2012/08/vesper5.html)
Then I promptly turned this off so I can work on and debug and play the game as I develop it! Maybe I'll turn this back on later, maybe not. Will see how it turns out. The goal would be to turn this back on when I release.
So now I started to go through emojis to look for people, and then after to look for items to add to the game procedurally. I started realizing I don't really want to add monsters. I'm still after a personal quest to make something more like a roguelike walking sim, something that doesn't rely on attacking for its game mechanics. I love wandering in Caves of Qud, exploring, seeing what comes up, and having conversations. Can I make it something more like that? It does have quests, which helps move the action forward, and it has danger/risk.
[Caves of Qud](https://www.cavesofqud.com/)
Simulating a giant ecosystem I think is outside the scope of what I can accomplish or work on in a week, though I could extend this after the 7drl finishes. I started thinking about the almost roguelike Robotfindskitten, by Leonard Richardson, originally from 1997/2000. It's described as "yet another zen simulation."
[robotfindskitten](http://www.robotfindskitten.org/)
The gameplay dynamics are simple. You are a lowly robot wandering around. There are lots of letters (aka objects or maybe other creatures) that you see but can't identify until you bump into them, the same way that you bump into monsters in other roguelikes. And that's it. When you find kitten or quit, then the game ends.
Here's a list of items I came across in my current playthrough just now, and the letters that were representing them, which appears entirely arbitrary:
* . - An unripe orange
* L - For a moment, you find something in your hands. But it disappears.
* Q - This is an anagram.
* g - Ten yards of avocado-green shag carpet.
* l - a traffic signal. It appears to have been recently vandalized.
* o - an aromatherapy candle bright with healing light
* > - a ketchup bottle (nearly empty)
* < - an old bootable business card, unfortunately cracked down the middle
* P - "appears to be" an ancient Roman breastplate
* = - a mere collection of pixels
* P - a warranted genuine Snark
* t - a black screen filled with colorful ASCII characters
* i - a rusty mellon baller
* ) - an oil portrait of you, about to find kitten
* b - he letters O and R
* A - a stupid mask, fashioned after a beagle
* r - robotfindskitten!
A quick animated ascii text of the robot moving to the kitten over a few frames, and then the program ends and quits!
This is a petite game that leverages its procedural algorithm so that the player's goal is really to explore the items just for the satisfaction of seeing what items get generated and how they're described. That's basically the entirety of the experience, and its pretty minimal at that. But it's an occasional thrill.
Likewise, in the Roguelike Caves of Qud, one of my favorite things to do is to go visit the graveyard that lies above Joppa. Reading the tombstone epitaphs brings a thrill, not because it's a serious experience but because of the zaniness of what's written there, and the variety of things that appear. Beyond that, the world of Qud rewards exploration for the lore, books, factions, and histories discovered there.
My own game will likely be more Robotfindskitten-like, but let's see.
Before bed at 3am I started thinking about how being able to make a single move might not be the most compelling. Even if you could amke a single move, then continue to interact with a person or object at that space. What if it was more like you could play in a single section each day, then a gate opens and you can move to the next 'room' or area. I'm thinking about how when you finish enough tasks in untitled goose game it opens the gate to allow you to walk to the next mini area.
I'm also thinking about Tiny Villages. I love the villages in Qud, and even the primitive town maps of roguelikes Larn and Moria. Perhaps I can make small generated outposts and mini towns that can be explored each day, with robotfindskitten items as well as occasional graves or magical items. And a gate or passageway allows one to proceed to the next area (and closes off previous one?) when it's a new day.
```
//----------------create zone---------------
let buildings = ['🏛️','⛺']
let landscapes = ['🏔️''','🌿','🌱','🌾','🌻','🌵']
let plants = ['🌹','🌺','🌻','🌼','🌷','🎋']
let shrines = ['⛩️','🗿']
let items = ['🍄','🌰','
```
I'm wondering if i'll find enough hut, house, stall, building emojis I want to use. Might have to switch to a tileset? But if that's the case, I'll need a different approach to drawing the screen. I guess I'll need to do that anayway. Maybe time for Curses or Blessed.
[Blessed library](https://www.npmjs.com/package/blessed)
Or maybe like the original Robotfindskitten, the individual letter characters can be just as arbitrary, their description when you walk into them doing the work of describing a world (in our mind) much more than the limited graphic representation of the emoji.
## Day 2
I taught, had meetings, cooked and had a nice dinner with friends in my household (we're in a "pod"), spent a few hours actually cleaning up and backing up some hard drives tonight, so I spent less time on this than I had hoped today, but I did get stuff done, and I tracked down an annoying bug.
```
🌲🌲🎄🌲🎄🌳🌲🎄🌳🌲🎄🌳🌳🎄🎄🌳🎄🎄🌲🌳
🌲🌳🎄🎄🌳🌳🌳🎄🌳🌲🌲🌲🎄🌲🌳🎄🌲🌳🎄🌳
🌲🌲👵🎄🌳🌲🌲🌲🌲🎄🌲🎄🌳🌳🎄🌳🌳🎄🌳🌲
🌳🌳🎄🌳🎄🌲🌲🌳🌳🎄🌲🌳🎄🎄🌳🌲🌳🎄🌳🌳
🌲🎄🎄🎄🎄🌲🌳🌳🎄🌳🌳🌲🎄🌳🌲🌲🌲🎄🌲🌲
```
Today I mostly explored terrain. I kind of decided to keep exploring emojis for my tileset. Perhaps this is a mistake. Emojis, at least to me, are often "ugly aesthetic." But I use them! One thing that's nice is that they are probably present on most people's systems. And there are already a variety of clear options for the player avatars, enemy "sprites", terrain, objects.
For example, here's a clear trophy like in Indiana Jones and the Temple of Doom. Very roguelike-y to me, and pretty clear that this would lead to the end of the game or be a big prize to get in any game.
```
🏆
```
So if I proceed with emojis for my tileset, I'm thinking about avatars for the player. Does this get selected by the player? Or does the player select a class like in so many other roguelikes, and that determines the avatar? If the player does end up playing this game over days, weeks and months, it's important that they feel connected to their avatar on screen, and I think that would be aided by the player getting to choose their own avatar. Here's some of the options I'm looking at. Notice that these each speak different vocabularies.
```
const avatars = ['👳','👶','🧛','🤺','🕵','👲','🧕','👵','👧','🧔','👸','☹','☺',🤠','@']
```
Ok, so to just get moving, I now have the program choose a random avatar emoji from this array when a new dungeon-game gets created.And I am testing moving using flags. So for example, to move left currently is:
```
node dotd --left
```
or
```
node dotd -l
```
That's probably a bit silly but i'm going with it for now. I'm using yargs to parse the flags in the CLI.
Just had an interesting idea that perhaps the player submits a short program file like 'right right right up up right' so that you have to program your player-robot, and that you submit that and it runs. Would that be interesting? Rather than turn-based? I get too many ideas but should probably just proceed with standard, and then modify later if I don't have a clear goal other than 'wouldn't it be cool if....".
Tonight after coming back to things I noticed an annoying bug. When opening a saved game file and loading the terrain would be slightly messed up. One char to the left or right of the player wouldn't render correctly, and the player would be a few spots over from where they should actually be. I tried all sorts of things and after some brute force debugging and console.log'ing I realized I was rendering the terrain at the wrong time, moved it until after saving out the terrain/game file (so it doesn't over-write anything in the dungeon permanently). And now it works fine. One question: should i be saving all of the terrain tiles? Quite possibly. So then maybe i should save it out! Or save it to a json table? Seems silly. The issue of why/how to save would come up if tile persistence of terrain is necessary. If a player moves left and walks over a tree, should that same exact tree be there after they walk off? I think so. That's of course the standard course of fare. I mean, I only have different tree terrain not because they act differently but because of 'visual interest'. Would a player notice if the trees were scattered each time they loaded if a day had passed? Maybe? Anyway, I'm tired and will revisit this decision in the next few days. Am assuming I should store all tiles in all positions. It's not particularly computationally difficult.
Next step when I come back is to add gameplay mechanics. I think I'd like to have tents, markets, lore?, conversations? monsters? What else?
## Day 1
i started by creating a an array of arrays (2d array) to 'hold' the level. i looped through it to assign a blank characters, at first a zero, but now a period. it took me some time to figure out how to properly point to a x,y position properly with this method. argh. lots of trial and error and i copy-pasta one line i didn't really understand from stackoverflow but understand what it outputs and worked backwards. actually, here it goes. this is cool. separately, maybe i can revisit making my own processing-derivative drawing parser in ascii. ok ok, that's a later project. anyway, i can now address a grid of text with x,y coordinates. great. proud of myself! lol. i have a grid of periods.
next i pick a random x,y position on the grid for the player. drop an @ there.
now i save to an external file. i think a core mechanic of my game will be that you can only play one move a day. inpsired by michael brough's vesper.5 'ritual'-game where you can (only move one square a day). that game got a lot of notice. oh, but it wasn't ascii. and it was 7 or 8 years ago. argh. anyway. i think i like this idea. and it's doable. and even though the command line and ascii art does not appeal to my 'art' base, my hacker phreaks like this, and i like this too! lol. it's not visual though. michael's work is so appealing because it speaks its own visual language. should i just work in p5 again? i have a half-engine for roguelikes in p5. maybe i could revisit? but way, i like this idea of a "Message of the Day" (Dungeon of the Day?) roguelike where it's in the command line, since that's my primary interface on my computer. i mean i'm typing in the command line now.
the concept is loosely that it's an ambient game. when you open a new terminal window the board (perhaps) is displayed as the message of the day. you can make one move a day. (how?). other than moving, maybe you can also use an item, talk to npc's, buy something at the market? or maybe you can move up to 3 different characters, like Lost Vikings (o.g. nintendo game that i liked that there doesn't seem to be any modern clones of).
okay, need to figure out more core mechanic/compelling gameplay. an ambient game is nice perhaps but needs some juice to make people want to play this and not skip over it.
other roguelike ideas i'd been thinking of but maybe not this time:
- monome teletype-based roguelike for my modular synth. moving/fighting/spells would each play a different sound. i wish i could plug a nintendo/snes controller though instead of a keyboard. i guess i could use a numpad instead. each number to trigger a different script, for each direction and maybe 0 for something.
- use p5.js to make more out-there experimental compelling visuals, a la a Broughlike
- use Lua. which i really enjoy, and there are (brough-like again!) tutorials for
- use pico-8 which i also enjoy, and is a subset of Lua with extended API, and i have some tutorials and previous experience on. i particularly love how it combines a CLI with visuals on same screen. i wish i could do this with p5/js.
- use my PLOGO logo-language to make a roguelike. kind of a funny idea. also, i did built a console into it.
anyway.... no end of (bad) ideas
# Day 1 1/2
What should terrain look like?
Old PETSCII? ZZT? (Can i get this with unicode or do i need to load a special font in the terminal, and then have to package that font? Can node do this?
oh wait, or should i just do this. it's easy. emoji.
```
🎄
🌳
🌲
🌴
🎋
🏡
🌱
🌿
🏕️
```
too cheesy? possibly
-
- code page 437 - (for example in ZZT)
- [page 437 characters translated to unicode](https://wikimili.com/en/Code_page_437)
- [unicode page 437 font](https://github.com/berenddeschouwer/fourthreeseven) to work in linux!
- embedded (copy-pastable) in [this article](https://www.masswerk.at/nowgobang/2020/petscii)
- [petscii to unicode converter](https://style64.org/petscii/)

122
dotd.js
View File

@ -7,6 +7,9 @@ const fs = require("fs");
const dungeonFile = "dungeonfile.txt";
const gameFile = "gamefile.txt";
const dateFile = "datefile.txt";
const itemsFile = "itemsfile.txt";
const descriptionsFile = "nonKittenItems.txt";
const inventoryFile = "inventory.txt";
//globals
const width = 20;
@ -14,6 +17,8 @@ const height = 5;
let dungeon;
let roomItems = [];
let today;
let itemDescriptions = [];
let inventory = [];
let player = {"position": {
"x": null,
"y": null,
@ -28,12 +33,16 @@ let parseArgs = () => {
createDungeon();
choosePlayer();
placePlayer();
createItems();
loadTextFiles();
createItems();
} else {
loadDungeon();
//loadItems();
loadItems();
loadPlayer();
loadInventory();
grab();
movePlayer();
checkCollision();
}
}
@ -51,21 +60,35 @@ let loadDungeon = () => {
}
}
let loadItems = () => {
const itemsStr = fs.readFileSync(itemsFile, 'utf8');
roomItems = JSON.parse(itemsStr)
//console.log(roomItems);
}
let loadPlayer = () => {
const playerFile = fs.readFileSync(gameFile,'utf8')
const playerFile = fs.readFileSync(gameFile,'utf8');
player = JSON.parse(playerFile);
}
let loadInventory = () => {
const invFile = fs.readFileSync(inventoryFile,'utf8');
inventory = JSON.parse(invFile);
}
let movePlayer = () => {
//if moving
if (argv.r || argv.right || argv.l || argv.left || argv.u || argv.up || argv.d || argv.down) { //check to see if moving first
if(!player.movedToday){ //check to see if player did not move yet
// if(!player.movedToday){ //check to see if player did not move yet
if (argv.r || argv.right){
if (player.position.x < width-1){
console.log('moved right');
//console.log('moved right');
player.position.x++;
player.movedToday = true;
} else {
@ -73,7 +96,7 @@ let movePlayer = () => {
}
} else if (argv.l || argv.left){
if (player.position.x > 0){
console.log('moved left');
//console.log('moved left');
player.position.x--;
player.movedToday = true;
} else {
@ -81,7 +104,7 @@ let movePlayer = () => {
}
} else if (argv.u || argv.up){
if (player.position.y>0){
console.log('moved up');
//console.log('moved up');
player.position.y--;
player.movedToday = true;
} else {
@ -89,20 +112,50 @@ let movePlayer = () => {
}
} else if (argv.d || argv.down){
if (player.position.y<height-1){
console.log('moved down');
//console.log('moved down');
player.position.y++;
player.movedToday = true;
} else {
console.log("can't go that way");
}
}
} else { //you already moved
console.log("already moved today");
//} else { //you already moved
// console.log("already moved today");
//}
}
}
let checkCollision = () => {
for (let i = 0; i < roomItems.length; i++){
if ((player.position.x == roomItems[i].position.x) && (player.position.y == roomItems[i].position.y)){
//console.log("you collided with "+roomItems[i].name);
console.log(roomItems[i].description);
}
}
}
let grab = () => {
if (argv.g){
for (let i = 0; i < roomItems.length; i++){
if ((player.position.x == roomItems[i].position.x) && (player.position.y == roomItems[i].position.y)){
console.log("you take "+roomItems[i].name);
//add to player inventory
inventory.push(roomItems[i]);
//now remove from room since owned by player now
roomItems.splice(i, 1);
}
}
}
}
//---------------CREATE DUNGEON -----------------------------------
let createDungeon = () => {
@ -117,7 +170,7 @@ let createDungeon = () => {
//---------------CREATE PLAYER ----------------------------------
let choosePlayer = () => {
const avatars = ['👳','👶','🧛','🤺','🕵','👲','🧕','👵','👧','🧔','👸','🤠','']
const avatars = ['👳','👶','🧛','🕵','👲','🧕','👵','👧','🧔','👸','🤠','']
let chooseAvatar = Math.floor(Math.random() * avatars.length);
@ -146,6 +199,10 @@ items = [
}
]
let loadTextFiles = () => {
itemDescriptions = fs.readFileSync(descriptionsFile).toString().split("\n");
}
let createItems = () => {
let numToSpawn = Math.round(Math.random() * 2)
@ -163,10 +220,14 @@ let createItems = () => {
// console.log(items[whichItem]);
let whichItemText = Math.floor(Math.random() * itemDescriptions.length);
itemDescrip = itemDescriptions[whichItemText];
roomItems.push(
{
"name": "random name",
"symbol": items[whichItem],
"description": itemDescrip,
"position":
{
"x":Math.floor(Math.random()*width),
@ -250,12 +311,28 @@ let dungeonToStrings = () => {
let createTerrain = () => {
let forestTerrain = ['🎄', '🌳','🌲']
let buildings = ['🏛️','⛺']
let landscapes = ['🏔️','🌵']
let plants = ['🌹','🌺','🌻','🌼','🌷','🎋','🍄','🌰','🌿','🌱','🌾']
let shrines = ['⛩️','🗿']
for (let y = 0; y < height; y++){
for (let x = 0; x < width; x++){
if (dungeon[y][x] === "."){
//instead of below!, create objects and save to dungeonfile!
//
if (dungeon[y][x] === "."){ //empty space = place forest terrain
let whichTerrain = forestTerrain[Math.floor(Math.random()*forestTerrain.length)];
dungeon[y][x] = whichTerrain;
} else if (dungeon[y][x] === "*"){ //flower
let whichPlant = plants[Math.floor(Math.random()*plants.length)];
dungeon[y][x] = whichPlant;
} else if (dungeon[y][x] === "#"){ //building
let whichBuilding = buildings[Math.floor(Math.random()*buildings.length)];
dungeon[y][x] = whichBuilding;
} else if (dungeon[y][x] === "+"){ //shrine
let whichShrine = shrines[Math.floor(Math.random()*shrines.length)];
dungeon[y][x] = whichShrine;
}
}
}
@ -264,14 +341,14 @@ let createTerrain = () => {
let dungeonWithItemsToStrings = () => {
//specify player location
dungeon[player.position.y][player.position.x] = player.avatar;
//specify item location
for (let i = 0; i < roomItems.length; i++){
dungeon[roomItems[i].position.y][roomItems[i].position.x] = roomItems[i].symbol;
}
//specify player location
dungeon[player.position.y][player.position.x] = player.avatar;
//for (let i = 0; i < items.length; i++){
// dungeon[item[i].position.y][item[i].position.x] = item[i].icon;
//}
@ -289,12 +366,26 @@ let drawDungeon = dungeonStr => {
}
let writeToFile = dungeonStr => { //save to disk
//write board to file, although it's all empty save for .....dots
fs.writeFileSync(dungeonFile, dungeonStr);
//save player info to file
let playerData = JSON.stringify(player);
fs.writeFileSync(gameFile, playerData);
//write dates to dateFile
fs.appendFileSync(dateFile, today+'\n');
//write items in current dungeon to file
let itemsData = JSON.stringify(roomItems);
fs.writeFileSync(itemsFile, itemsData);
//list of items saved to player's inventory
//
console.log(inventory)
let inventoryData = JSON.stringify(inventory);
fs.writeFileSync(inventoryFile, inventoryData);
}
let checkDay = () => {
@ -307,6 +398,7 @@ let checkDay = () => {
console.log("Today: "+today);
//TURN OFF RESTRICTION
if (lastDay === today){
//console.log('already moved today');
} else {

View File

@ -1 +0,0 @@
{"position":{"x":6,"y":4},"avatar":"@","movedToday":false}