Compare commits

...

7 Commits

Author SHA1 Message Date
bdfae1562b Add dev containter for building 2025-07-07 12:39:49 +00:00
3220e8fcc8 More yourcroft 2024-09-16 21:47:10 +00:00
a6cff03a70 apostrophe's 2024-09-16 18:38:26 +00:00
3e5734bcf0 Start the yourcroft puzzle sequence 2024-09-16 19:00:49 +01:00
e55ad58419 Wait... 2024-09-15 21:38:11 +01:00
3759b9a6db Moar biscuits 2024-09-12 22:08:35 +00:00
c0dec1a388 Jazzier charset 2024-09-12 21:04:13 +00:00
6 changed files with 453 additions and 25 deletions

99
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,99 @@
# syntax=docker/dockerfile:1
FROM ubuntu:24.04 AS build
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
make \
unzip \
&& rm -rf /var/lib/apt/lists/*
ADD https://github.com/z00m128/sjasmplus.git#v1.21.0 /sjasmplus
RUN cd /sjasmplus && make -j8 && make install
ADD https://boarstone.mcphail.uk/mcphail/spectrum_remload.git /ttttt
RUN cd /ttttt && make ttttt
ADD https://github.com/einar-saukas/ZX0.git /zx0
RUN cd /zx0/src/ \
&& gcc -O2 -o zx0 zx0.c optimize.c compress.c memory.c \
&& gcc -O2 -o dzx0 dzx0.c
ADD https://www.boriel.com/files/zxb/zxbasic-1.18.1-linux64.tar.gz .
RUN tar xf zxbasic*
ADD https://github.com/Mastodon-/inpaws.git /inpaws
RUN cd /inpaws/ \
&& make -j8
FROM build AS z88dk
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
bison \
ca-certificates \
ccache \
cpanminus \
curl \
dos2unix \
flex \
gdb \
git \
libboost-all-dev \
libcapture-tiny-perl \
libclone-perl \
libdata-hexdump-perl \
libfile-slurp-perl \
libgmp3-dev \
liblocal-lib-perl \
libmodern-perl-perl \
libpath-tiny-perl \
libregexp-common-perl \
libtext-table-perl \
libxml2-dev \
libyaml-perl \
m4 \
perl \
pkg-config \
ragel \
re2c \
texi2html \
texinfo \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
ENV Z88DK_PATH="/opt/z88dk"
RUN cpanm -l $HOME/perl5 --no-wget local::lib Template::Plugin::YAML \
&& git clone --depth 1 --recursive https://github.com/z88dk/z88dk.git ${Z88DK_PATH} \
&& cd ${Z88DK_PATH} \
&& eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)" \
&& chmod 777 build.sh \
&& sed -i -e "s/make/make -j8/g" build.sh \
&& BUILD_SDCC=1 BUILD_SDCC_HTTP=1 ./build.sh \
&& make install-clean bins-clean
FROM ubuntu:24.04
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
fuse-emulator-utils \
git \
make \
openssh-client \
pasmo \
python3 \
z80asm \
z80dasm \
zmakebas \
&& rm -rf /var/lib/apt/lists/*
COPY --from=build /usr/local/bin/sjasmplus /bin/sjasmplus
COPY --from=build /ttttt/ttttt /bin/ttttt
COPY --from=build /zx0/src/zx0 /bin/zx0
COPY --from=build /zx0/src/dzx0 /bin/dzx0
COPY --from=build /zxbasic/zxbasm.py /opt/zxbasic/zxbasm
COPY --from=build /zxbasic/zxbc.py /opt/zxbasic/zxbc
COPY --from=build /zxbasic/zxbpp.py /opt/zxbasic/zxbpp
COPY --from=build /zxbasic/src /opt/zxbasic/src
COPY --from=build /inpaws/inpaws /bin/inpaws
COPY --from=z88dk /opt/z88dk/bin /opt/z88dk/bin
COPY --from=z88dk /opt/z88dk/lib /opt/z88dk/lib
COPY --from=z88dk /opt/z88dk/include /opt/z88dk/include
ENV PATH="${PATH}:/opt/z88dk/bin:/opt/zxbasic"
ENV ZCCCFG="/opt/z88dk/lib/config"
USER ubuntu
RUN echo "PATH=$PATH:/opt/z88dk/bin:/opt/zxbasic" >> ~/.profile
RUN echo "export ZCCCFG=/opt/z88dk/lib/config/" >> ~/.profile

View File

@@ -0,0 +1,25 @@
{
"name": "ZX Spectrum dev tools",
//"build": { "dockerfile": "Dockerfile" },
// The Dockerfile takes an age to build due to z88dk, so pull from prebuilt:
"image": "boarstone.mcphail.uk/mcphail/speccydev:stable",
"remoteUser": "ubuntu",
"runArgs": [
"--network=host"
],
"customizations": {
"vscode": {
"extensions": [
"maziac.dezog",
"maziac.asm-code-lens",
"maziac.z80-instruction-set",
"maziac.hex-hover-converter",
"maziac.sna-fileviewer",
"maziac.nex-fileviewer",
"ms-vscode.makefile-tools",
"jsjlogin.zxbasic",
"thenestruo.z80-asm-meter"
]
}
}
}

View File

@@ -0,0 +1,3 @@
#! /bin/bash
# From https://stackoverflow.com/questions/54055666/docker-hub-and-git-submodules/59640438#59640438
git submodule update --init

106
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,106 @@
{
"configurations": [
{
"type": "dezog",
"request": "launch",
"name": "Simulator - ZX81 56k RAM",
"remoteType": "zsim",
"zsim": {
"visualMemory": true,
"preset": "zx81",
"memoryModel": "ZX81-56K"
},
"sjasmplus": [
{
"path": "myprog.sld"
}
],
"commandsAfterLaunch": [],
"history": {
"reverseDebugInstructionCount": 1000000,
"spotCount": 10,
"codeCoverageEnabled": true
},
"startAutomatically": false,
"rootFolder": "${workspaceFolder}",
"load": "myprog.p"
},
{
"type": "dezog",
"request": "launch",
"name": "Simulator - ZX128K Spectrum",
"remoteType": "zsim",
"zsim": {
"visualMemory": true,
"preset": "spectrum",
"memoryModel": "ZX128K"
},
"sjasmplus": [
{
"path": "myprog.sld"
}
],
"commandsAfterLaunch": [],
"history": {
"reverseDebugInstructionCount": 1000000,
"spotCount": 10,
"codeCoverageEnabled": true
},
"startAutomatically": false,
"rootFolder": "${workspaceFolder}",
"load": "myprog.sna",
"topOfStack": "0x5d58"
},
{
"type": "dezog",
"request": "launch",
"name": "CSpect",
"remoteType": "cspect",
"sjasmplus": [
{
"path": "myprog.sld"
}
],
"commandsAfterLaunch": [],
"history": {
"reverseDebugInstructionCount": 1000000,
"spotCount": 10,
"codeCoverageEnabled": false
},
"startAutomatically": false,
"rootFolder": "${workspaceFolder}",
"load": "myprog.sna",
"topOfStack": "0x5d58",
"cspect": {
// Change "host.docker.internal" to "localhost" if running on Linux
"hostname": "host.docker.internal"
}
},
{
"type": "dezog",
"request": "launch",
"name": "Simulator - ZX48K Spectrum",
"remoteType": "zsim",
"zsim": {
"visualMemory": true,
"preset": "spectrum",
"memoryModel": "ZX48K"
},
"sjasmplus": [
{
"path": "myprog.sld"
}
],
"commandsAfterLaunch": [],
"history": {
"reverseDebugInstructionCount": 1000000,
"spotCount": 10,
"codeCoverageEnabled": true
},
"startAutomatically": false,
"rootFolder": "${workspaceFolder}",
"load": "myprog.sna",
"topOfStack": "0x5d58"
}
]
}

123
char.paw
View File

@@ -2,21 +2,21 @@ CHARACTERS
{ {
0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 60, 24, 60, 126, 126, 60, 0, 48, 192, 120, 14, 120, 192, 48, 0,
6, 30, 28, 60, 112, 96, 128, 0, 6, 30, 28, 60, 112, 96, 128, 0,
0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 255, 1, 255,
255, 254, 252, 248, 240, 224, 192, 128, 0, 0, 0, 0, 0, 255, 128, 255,
255, 127, 63, 31, 15, 7, 3, 1, 0, 255, 128, 128, 128, 255, 0, 0,
1, 3, 7, 15, 31, 63, 127, 255, 0, 255, 0, 0, 0, 255, 0, 0,
128, 192, 224, 240, 248, 252, 254, 255, 0, 255, 1, 1, 1, 255, 0, 0,
0, 0, 0, 15, 8, 8, 8, 8, 0, 0, 255, 128, 128, 128, 255, 0,
0, 0, 0, 248, 8, 8, 8, 8, 0, 0, 255, 0, 0, 0, 255, 0,
8, 8, 8, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255,
8, 8, 8, 248, 0, 0, 0, 0, 0, 0, 255, 1, 1, 1, 255, 0,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 170, 85, 0, 0, 31, 31, 31, 31, 0, 0,
16, 8, 16, 8, 16, 8, 16, 8, 24, 28, 254, 255, 255, 254, 28, 24,
170, 85, 170, 85, 170, 85, 170, 85, 170, 85, 170, 85, 170, 85, 170, 85,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
170, 85, 170, 85, 170, 85, 170, 85, 170, 85, 170, 85, 170, 85, 170, 85,
@@ -35,6 +35,103 @@ CHARACTERS
195, 60, 195, 60, 195, 60, 195, 60, 195, 60, 195, 60, 195, 60, 195, 60,
4, 4, 255, 64, 64, 64, 255, 4, 4, 4, 255, 64, 64, 64, 255, 4,
1, 3, 6, 12, 24, 48, 96, 192, 1, 3, 6, 12, 24, 48, 96, 192,
0 1,
0, 0, 0, 0, 0, 0, 0, 0,
24, 24, 24, 24, 24, 0, 24, 0,
0, 54, 54, 36, 0, 0, 0, 0,
108, 108, 254, 108, 254, 108, 108, 0,
24, 62, 88, 62, 26, 124, 24, 0,
0, 198, 204, 24, 48, 102, 198, 0,
56, 108, 56, 118, 220, 204, 118, 0,
24, 24, 48, 0, 0, 0, 0, 0,
12, 24, 48, 48, 48, 24, 12, 0,
48, 24, 12, 12, 12, 24, 48, 0,
0, 108, 56, 16, 56, 108, 0, 0,
0, 24, 24, 126, 24, 24, 0, 0,
0, 0, 0, 0, 0, 24, 24, 48,
0, 0, 0, 60, 60, 0, 0, 0,
0, 0, 0, 0, 0, 24, 24, 0,
6, 12, 24, 48, 96, 192, 128, 0,
124, 198, 206, 214, 230, 198, 124, 0,
24, 56, 24, 24, 24, 24, 126, 0,
60, 102, 6, 60, 96, 102, 126, 0,
60, 102, 6, 28, 6, 102, 60, 0,
24, 56, 88, 152, 254, 24, 60, 0,
126, 98, 96, 124, 6, 102, 60, 0,
60, 102, 96, 124, 102, 102, 60, 0,
126, 126, 6, 12, 24, 24, 24, 0,
60, 102, 102, 60, 102, 102, 60, 0,
60, 102, 102, 62, 6, 102, 60, 0,
0, 0, 24, 24, 0, 24, 24, 0,
0, 0, 24, 24, 0, 24, 24, 48,
0, 0, 12, 24, 48, 24, 12, 0,
0, 0, 0, 126, 0, 126, 0, 0,
0, 0, 48, 24, 12, 24, 48, 0,
60, 102, 6, 12, 24, 0, 24, 0,
124, 198, 222, 214, 222, 192, 124, 0,
60, 102, 102, 126, 102, 102, 102, 0,
252, 102, 102, 124, 102, 102, 252, 0,
62, 98, 96, 96, 96, 98, 62, 0,
248, 108, 102, 102, 102, 108, 248, 0,
254, 98, 104, 120, 104, 98, 254, 0,
254, 98, 104, 120, 104, 96, 240, 0,
60, 102, 192, 192, 206, 102, 62, 0,
102, 102, 102, 126, 102, 102, 102, 0,
126, 24, 24, 24, 24, 24, 126, 0,
30, 12, 12, 12, 204, 204, 120, 0,
230, 102, 108, 120, 108, 102, 230, 0,
240, 96, 96, 96, 98, 102, 254, 0,
198, 238, 254, 254, 214, 198, 198, 0,
198, 230, 246, 222, 206, 198, 198, 0,
124, 198, 198, 198, 198, 198, 124, 0,
252, 102, 102, 124, 96, 96, 240, 0,
124, 198, 198, 214, 202, 196, 118, 0,
252, 102, 102, 124, 108, 102, 230, 0,
60, 102, 96, 60, 6, 102, 60, 0,
126, 90, 24, 24, 24, 24, 60, 0,
102, 102, 102, 102, 102, 102, 60, 0,
102, 102, 102, 102, 102, 60, 24, 0,
198, 198, 198, 214, 254, 238, 198, 0,
102, 126, 60, 24, 60, 126, 102, 0,
102, 102, 102, 60, 24, 24, 24, 0,
126, 70, 14, 28, 56, 114, 126, 0,
60, 48, 48, 48, 48, 48, 60, 0,
192, 96, 48, 24, 12, 6, 2, 0,
60, 12, 12, 12, 12, 12, 60, 0,
24, 60, 126, 24, 24, 24, 24, 0,
0, 0, 0, 0, 0, 0, 0, 255,
60, 102, 96, 248, 96, 102, 254, 0,
0, 0, 60, 6, 62, 102, 58, 0,
224, 224, 124, 102, 102, 102, 188, 0,
0, 0, 60, 102, 96, 102, 60, 0,
28, 12, 124, 204, 204, 204, 118, 0,
0, 0, 60, 102, 126, 96, 60, 0,
28, 54, 48, 120, 48, 48, 120, 0,
0, 0, 62, 102, 102, 62, 6, 124,
112, 48, 60, 54, 54, 54, 118, 0,
24, 0, 56, 24, 24, 24, 60, 0,
6, 0, 30, 6, 6, 6, 102, 60,
224, 96, 102, 108, 120, 108, 230, 0,
56, 24, 24, 24, 24, 24, 60, 0,
0, 0, 108, 254, 214, 214, 198, 0,
0, 0, 220, 102, 102, 102, 102, 0,
0, 0, 60, 102, 102, 102, 60, 0,
0, 0, 220, 102, 102, 124, 96, 240,
0, 0, 118, 204, 204, 124, 12, 30,
0, 0, 220, 118, 96, 96, 240, 0,
0, 0, 60, 96, 60, 6, 124, 0,
48, 48, 124, 48, 48, 54, 28, 0,
0, 0, 102, 102, 102, 102, 60, 0,
0, 0, 102, 102, 102, 60, 24, 0,
0, 0, 198, 214, 214, 254, 108, 0,
0, 0, 198, 108, 56, 108, 198, 0,
0, 0, 102, 102, 102, 62, 6, 124,
0, 0, 126, 76, 24, 50, 126, 0,
14, 24, 24, 112, 24, 24, 14, 0,
24, 24, 24, 24, 24, 24, 24, 0,
112, 24, 24, 14, 24, 24, 112, 0,
118, 216, 0, 0, 0, 0, 0, 0,
56, 68, 186, 162, 186, 68, 56, 60
} }

122
lmtvg.paw
View File

@@ -3,12 +3,17 @@
PROCESS examine; PROCESS examine;
PROCESS help; PROCESS help;
PROCESS crunch; PROCESS crunch;
PROCESS yourcroft_status;
PROCESS yourcroft_parse;
PROCESS say_help;
FLAG crunchvol; FLAG crunchvol;
FLAG yourcroftstate;
FLAG say_help;
DEFAULTS DEFAULTS
{ {
CHARSET: 0; CHARSET: 1;
INK: 9; INK: 9;
PAPER: 0; PAPER: 0;
FLASH: 0; FLASH: 0;
@@ -34,12 +39,12 @@ LOCATION intro
You play as {16}{6}Wimpy{16}{7}, host of the Linux Matters podcast with friends {16}{5}Popey{16}{7} and You play as {16}{6}Wimpy{16}{7}, host of the Linux Matters podcast with friends {16}{5}Popey{16}{7} and
{16}{4}Mark{16}{7}.^^ {16}{4}Mark{16}{7}.^^
In common with the classic adventures, you can control Wimpy by entering simple words and sentences in English. In common with the classic adventures, you can control Wimpy by entering simple words and sentences in English.
A simple example may be {20}{1}GET CAKE{20}{0} whereas a more complex one such as {20}{1}SAY A simple example may be {0}GET CAKE{1} whereas a more complex one such as {0}SAY
TO MARK \"GO NORTH AND QUICKLY RUB THE DEPRESSING FERRET ON THE BALLOON THEN RELEASE IT\"{20}{0} may TO MARK \"GO NORTH AND QUICKLY RUB THE DEPRESSING FERRET ON THE BALLOON THEN RELEASE IT\"{1} may
also be possible. Depending on how well I've programmed the game, either the ferret or the balloon will also be possible. Depending on how well I've programmed the game, either the ferret or the balloon will
be free.^^ be free.^^
Perhaps the first command to enter might be {20}{1}HELP{20}{0}, but it pays to be curious so make sure Perhaps the first command to enter might be {0}HELP{1}, but it pays to be curious so make sure
you always {20}{1}EXAMINE{20}{0} everything you can."; you always {0}EXAMINE{1} everything you can.";
} }
LOCATION scene LOCATION scene
@@ -50,7 +55,7 @@ LOCATION scene
LOCATION trap LOCATION trap
{ {
"Wimpy is trapped in a room with no obvious exits. "Wimpy is trapped in a room with no obvious exits.
He is rather perplexed.^Oh, bother!"; He is rather perplexed.^Oh, bother!^(This is placeholder text)^";
} }
VOCABULARY VOCABULARY
@@ -109,11 +114,23 @@ VOCABULARY
ADVERB 143: "LOUDL"; ADVERB 143: "LOUDL";
ADVERB 144: "CAREF", "SOFTL", "GENTL"; ADVERB 144: "CAREF", "SOFTL", "GENTL";
NOUN: "PASSW", "1234", "HUNTER", "12345"; NOUN 15: "MARK";
NOUN 16: "POPEY", "ALAN";
NOUN 17: "GRAHA", "DEGVI";
NOUN: "PASSW", "1234", "HUNTER", "12345", "BEANS";
NOUN: "BISCU", "PACKE"; NOUN: "BISCU", "PACKE";
NOUN: "MUG", "CUP"; NOUN: "MUG", "CUP";
NOUN: "USBDR", "DRIVE";
ADJECTIVE: "USB";
NOUN: "PORT";
NOUN 18: "YOURC", "LADYC", "COMPU", "ASSIS", "CYLIN", "DEVIC";
NOUN: "FLAP";
NOUN: "DOOR";
VERB: "HELP"; VERB: "HELP";
VERB: "EAT"; VERB: "EAT", "CONSU", "BITE", "CRUNC", "CHOMP", "MUNCH";
VERB: "WAIT";
VERB: "OPEN";
VERB: "CLOSE";
} }
OBJECT notused 0 OBJECT notused 0
@@ -127,7 +144,7 @@ OBJECT notused 0
OBJECT mug 1 OBJECT mug 1
{ {
"A large, chipped mug"; "A large, chipped mug";
INITIALLYAT CARRIED; INITIALLYAT NOTCREATED;
WORDS MUG _; WORDS MUG _;
WEIGHT 1; WEIGHT 1;
PROPERTY CONTAINER; PROPERTY CONTAINER;
@@ -143,14 +160,28 @@ PROCESS examine
OBJECT biscuits OBJECT biscuits
{ {
"An inexhaustible supply of delicious biscuits"; "An inexhaustible supply of delicious biscuits";
INITIALLYAT CARRIED; INITIALLYAT NOTCREATED;
WORDS BISCU _; WORDS BISCU _;
WEIGHT 1; WEIGHT 1;
} }
PROCESS examine PROCESS examine
{ {
_ BISCU: PRESENT biscuits _ BISCU: PRESENT biscuits
MESSAGE "Crunchy and tasty, a supply which will never be exhausted; beloved of all Linux podcasters." MESSAGE "Crunchy and tasty; beloved of all Linux podcasters."
DONE;
}
OBJECT usbdrive
{
"A USB Drive";
INITIALLYAT CARRIED;
WORDS DRIVE USB;
WEIGHT 1;
}
PROCESS examine
{
_ DRIVE: PRESENT usbdrive
MESSAGE "A 16GB 'SpamDisk' USB-A Drive with a handwritten label saying 'Wimpy's leet hacking boot drive'."
DONE; DONE;
} }
@@ -248,7 +279,25 @@ RESPONSE
NOTDONE; NOTDONE;
EAT BISCU: PRESENT biscuits EAT BISCU: PRESENT biscuits
MESSAGE "Wimpy munches loudly on a delicious and nutritious biscuity treat." MESSAGE "Wimpy munches loudly on a delicious and nutritious biscuity treat."
PLUS crunchvol 1; PLUS crunchvol 1
ADVERB LOUDL
MESSAGE "He tries to crunch louder, to no avail. Maybe many mouths make loud work?";
EAT BISCU: PRESENT biscuits
ADVERB QUIET
MESSAGE "He tries to be quiet but they're just too tasty.";
WAIT _: MESSAGE "Wimpy waits for a moment."
DONE;
SAY _: AT trap
PROCESS yourcroft_parse
DONE;
}
PROCESS say_help
{
_ _: ZERO say_help
SET say_help
MESSAGE "(Remember to enclose anything you want Wimpy to say in double quotes, like {0}SAY \"HELLO\"{1}. On a Spectrum, hold {0}SYMBOL-SHIFT{1} and press {0}P{1}. On an emulator, you'll probably need to hold {0}Ctrl{1} and press {0}P{1}.)";
} }
PROCESS 1 PROCESS 1
@@ -269,6 +318,9 @@ PROCESS 1
GOTO trap GOTO trap
DESC; DESC;
* YOURC: AT trap
PROCESS yourcroft_status;
* _: NEWLINE ZERO 0 ABSENT 0 LISTOBJ; * _: NEWLINE ZERO 0 ABSENT 0 LISTOBJ;
* _: PRESENT 0 LISTOBJ; * _: PRESENT 0 LISTOBJ;
} }
@@ -301,3 +353,49 @@ PROCESS crunch
MESSAGE "The whole room buckles under the crunching boom."; MESSAGE "The whole room buckles under the crunching boom.";
_ _: CLEAR crunchvol; _ _: CLEAR crunchvol;
} }
PROCESS yourcroft_status
{
_ _: ZERO yourcroftstate
MESSAGE "A bodged-together cheap-looking plastic cylinder device is perched on the floor."
DONE;
_ _: EQ yourcroftstate 1
MESSAGE "Yourcroft surveys Wimpy with its tacky, green, blinking LED eye and barks 'I'm watching you, mister!'.";
_ _: EQ yourcroftstate 2
MESSAGE "Yourcroft's eye flashes indignantly and burns with shame at its open flap and exposed port.";
_ _: EQ yourcroftstate 3
MESSAGE "Yourcroft's LED eye keeps flicking with rage between Wimpy's face and its new USB appendage.";
_ _: EQ yourcroftstate 4
MESSAGE "The smouldering remains of Yourcroft sparks and fizzles.";
}
PROCESS examine
{
_ CYLIN: ZERO yourcroftstate
MESSAGE "'What you looking at, buddy?', barks the device. 'I'm a Yourcroft(TM) mark 1 cylindrical assistant, and I've been charged with keeping this door closed.'^^'Don't get any bright ideas for escape or I'll zap you!'^^Its voice sounds like a strangely robotic-yet-feminine version of popey's dulcet tones. A cheap LED array is lit to form a green, blinking eye which follows Wimpy's every movement. Below is a flap with a label saying 'USB', which is closed and obscuring any port.^'By the way, please fund our Kickstarter for version 2.0!'"
PLUS yourcroftstate 1
DONE;
_ YOURC: EQ yourcroftstate 1
MESSAGE "'Don't go poking around - I'm password protected you know!'"
DONE;
_ YOURC: EQ yourcroftstate 2
MESSAGE "Yourcroft is clearly annoyed that its USB port and control touch screen are showing."
DONE;
}
PROCESS yourcroft_parse
{
* *: PARSE
MESSAGE "'Keep it simple, buddy - I ain't ChattyJeeps.'"
PROCESS say_help
DONE;
_ PASSW: LT yourcroftstate 2
MESSAGE "'Hey - that's the right password! You some kind of genius hacker? You can't stop me guarding this door, buddy...'.^^The flap drops open, revealing a USB socket and a small touch screen.^^'Do you mind?', admonishes Yourcroft, 'you're exposing my circuits!'."
LET yourcroftstate 2
DONE;
_ _: MESSAGE "'You ain't the boss of me!'"
DONE;
}