That is absolutely textbook. Gemma followed the architecture to the letter. It
isolated the state variables, correctly utilized the new MATH opcode, and
perfectly implemented the ENVIRONMENT_ shadow variables for both Greed and
Luck.
Now we just need to merge this object into your world.
Because we haven't implemented a subroutine stack (CALL / RET) in the VM yet,
jumping to init_idol would trap the player there because it ends with an
AWAIT. For this test, we will use a quick linker script to merge the files,
drop the idol directly into your inventory, and register RUB as a GLOBAL verb
so you can test it immediately.
The Linker Script
Run this script to cleanly fuse cursed_idol.md into world.md:
cat << 'EOF' > link_idol.js
import fs from 'fs';
import { Lexer } from './lexer.js';
/ 1. Read both files
const world = fs.readFileSync('world.md', 'utf-8');
const idol = fs.readFileSync('cursed_idol.md', 'utf-8');
/ 2. Extract envelopes using your existing Lexer
const worldEnv = Lexer.extractEnvelope(world);
const idolEnv = Lexer.extractEnvelope(idol);
/ 3. Merge States and add IDOL to inventory
let mergedState = worldEnv.stateRaw + '
' + idolEnv.stateRaw;
mergedState = mergedState.replace(
/VAR INVENTORY ARR '\[(.*?)\]'/,
(match, p1) => {
const currentInv = p1 ? p1 : '';
const newInv = currentInv ? currentInv + ',"IDOL"' : '"IDOL"';
return `VAR INVENTORY ARR '[${newInv}]'`;
}
);
/ 4. Merge Code and register the GLOBAL verb
let mergedCode = worldEnv.codeRaw.replace(
/LBL start_game
/,
`LBL start_game
GLOBAL "RUB" act_rub_idol
`
);
mergedCode += '
// --- OBJECT: CURSED IDOL ---
' + idolEnv.codeRaw;
/ 5. Write back to world.md
const finalOutput = `\`\`\`fso-state
${mergedState}
\`\`\`
\`\`\`fso-code
${mergedCode}
\`\`\``;
fs.writeFileSync('world.md', finalOutput);
console.log('[SYS] Cursed Idol successfully linked into the memory heap!');
EOF
node link_idol.js
Test the Curse
Restart your engine to load the newly linked world:
x-console world restart && x-console world follow
Once the interactive hub is up:
* Type i to verify the IDOL is in your inventory.
* Type rub idol.
* Type rub idol again.
You will see the shadow variables dynamically apply the math operations to the
current room environment, print the interpolated string, and then the JMP_IF
gate will successfully block you from rubbing it a second time.