From f48c9dbc31a4e84d15089e920934c4f25da9b5c1 Mon Sep 17 00:00:00 2001 From: Fisher <72705185+fisherjacobc@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:42:20 -0400 Subject: [PATCH] Add "Kilroy Saves the Game" (#1946) * Create kilroy_saves_the_game.js * Add files via upload * Rename kilroy339.png to kilroy_saves_the_game.png.png * Rename kilroy_saves_the_game.png.png to kilroy_saves_the_game.png * feat: Update metadata - kilroy_saves_the_game.js --------- Co-authored-by: graham Co-authored-by: Marios Mitsios --- games/img/kilroy_saves_the_game.png | Bin 0 -> 7684 bytes games/kilroy_saves_the_game.js | 1350 +++++++++++++++++++++++++++ 2 files changed, 1350 insertions(+) create mode 100644 games/img/kilroy_saves_the_game.png create mode 100644 games/kilroy_saves_the_game.js diff --git a/games/img/kilroy_saves_the_game.png b/games/img/kilroy_saves_the_game.png new file mode 100644 index 0000000000000000000000000000000000000000..5be3b175666ca4679bbc106402e98e734d7e8ccd GIT binary patch literal 7684 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 H``P~kXDjf* literal 0 HcmV?d00001 diff --git a/games/kilroy_saves_the_game.js b/games/kilroy_saves_the_game.js new file mode 100644 index 0000000000..49d05cf54b --- /dev/null +++ b/games/kilroy_saves_the_game.js @@ -0,0 +1,1350 @@ +/** +@title: Kilroy Saves the Game! +@author: Jacob Fisher +@tags: ['kilroy', 'frc'] +@addedOn: 2024-07-08 +*/ +const quick = false +const speed = quick ? 0.25 : 1.0 +const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay * speed)) + +/* Sprites */ +const blank = "_" +const blankDark = "-" +const player = "kLry" +const robot = "R" +const robot2 = "T" +const brokenRobot = "/" +const note = "N" +const sidewaysNote = "s" +const npc = "npc" +const bolts = "bolt" +const correctBolt = "C" +const drill = "d" +const checkeredBackground = "x" +const drawer = "Dwa" +const mousePointer = "^" +const brain = "B" + +setLegend( + [ blank, bitmap` +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222 +2222222222222222` ], + [ blankDark, bitmap` +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000` ], + [ mousePointer, bitmap` +......00........ +.....0220....... +.....0220....... +.....0220....... +.....0220000.... +.....022020200.. +..00.0220202020. +.02200222222220. +.02220222222220. +..0222222222220. +...022222222220. +...02222222220.. +....0222222220.. +.....02222220... +......0222020... +......0000.00...` ], + [ player[0], bitmap` +................ +................ +................ +................ +................ +................ +................ +..............00 +.............066 +............0666 +...........06666 +...........06666 +..........066666 +..........066666 +..........000666 +..0000000.022066` ], + [ player[1], bitmap` +................ +................ +................ +................ +................ +................ +................ +00.............. +660............. +6660............ +66660........... +66660........... +666660.......... +666660.......... +666000.......... +660220.0000000..` ], + [ player[2], bitmap` +..0606060.020066 +0006060600000066 +..0606000....066 +..00060......066 +....000......066 +.............066 +.............066 +.............066 +..............06 +...............0 +................ +................ +................ +................ +................ +................`], + [ player[3], bitmap` +660020.0606060.. +6600000060606000 +660....0006060.. +660......06000.. +660......000.... +660............. +660............. +660............. +60.............. +0............... +................ +................ +................ +................ +................ +................`], + [ brain, bitmap` +................ +.......0000..... +...0000118000... +.00808888808800. +.01088080808010. +0118081188808110 +0188880108008810 +0800888011880080 +0801180881888880 +.008800180888000 +..00110101100810 +....000808088880 +.......00000000. +..........0180.. +...........0810. +............000.` ], + [ robot, bitmap` +................ +................ +....1........... +..1..1.......... +..11..1......... +..1.1F.1........ +..1..19.1....... +..1...19.1...... +..1....19.1..... +..1.....19.1.... +..1......111.... +..1......111.... +5555555555555557 +5555252525255557 +5555555555555557 +.00.........00..`], + [ robot2, bitmap` +................ +................ +...........1.... +..........1..1.. +.........1..11.. +........1.F1.1.. +.......1.91..1.. +......1.91...1.. +.....1.91....1.. +....1.91.....1.. +....111......1.. +....111......1.. +C333333333333333 +C333323232323333 +C333333333333333 +..00.........00.`], + [ brokenRobot, bitmap` +................ +................ +................ +...........3.... +............3... +.......1....93.. +.....99.1..3993. +....9.19.1.39663 +..1....19.396663 +..1.....1.396663 +..1......113663. +..1......11133.. +5555555555555557 +5555252525255557 +5555555555555557 +.00.........00..`], + [ note, bitmap` +.....000000..... +....09999990.... +..009999999900.. +..099900009990.. +.09900....00990. +0990........0990 +0990........0990 +0990........0990 +0990........0990 +0990........0990 +0990........0990 +.09900....00990. +..099900009990.. +..009999999900.. +....09999990.... +.....000000.....`], + [ sidewaysNote, bitmap` +................ +................ +....0000........ +..0099990000.... +.099999999990... +09990009999990.. +0990...00099990. +0990......009990 +099900......0990 +.09999000...0990 +..09999990009990 +...0999999999990 +....00009999000. +........0000.... +................ +................`], + [ npc[0], bitmap` +................ +.....00000...... +....0222220..... +....0202020..... +....0202020..... +....0222220..... +.....02220...... +...001777100.... +...011777110.... +..00177777100... +.0220777770220.. +.0220777770220.. +..000FFFFF000... +....0FF0FF0..... +....0FF0FF0..... +.....00.00......`], + [ npc[1], bitmap` +................ +.....00000...... +....0CCCCC0..... +....0C0C0C0..... +....0C0C0C0..... +....0CCCCC0..... +.....0CCC0...... +...001444100.... +...011444110.... +..00144444100... +.0CC0444440CC0.. +.0CC0444440CC0.. +..000FFFFF000... +....0FF0FF0..... +....0FF0FF0..... +.....00.00......`], + [ npc[2], bitmap` +................ +..44400000444... +..44022222044... +...402020204.... +...402020204.... +....0222220..... +.....02220...... +...00H888H00.... +...0HH888HH0.... +..00H88888H00... +.0220888880220.. +.0220888880220.. +..000LLLLL000... +....0LL0LL0..... +....0LL0LL0..... +.....00.00......` ], + [ drill, bitmap` +................ +...........00... +....00FFFFFFFFFF +...2L0666666666F +LLL10066666F6F6F +...LL0666666666F +....00FFFFF666FF +.........LFFFFLL +..........L06L.. +..........L06L.. +..........L06L.. +..........L06L.. +..........L06L.. +.........L111L.. +........L66666L. +.......L000000L.` ], + [ bolts[0], bitmap` +........L....... +.......L2L...... +......L211L..... +.....L21111L.... +......L2111LL... +.......L11LL0L.. +......L21LL000L. +.....L211L00000L +....L21110L000L. +...L21110L.L0L.. +..L21110L...L... +.L21110L........ +.L1110L......... +.L000L.......... +..LLL........... +................`], + [ bolts[1], bitmap` +.......L........ +......L2L....... +.....L112L...... +....L11112L..... +...LL1112L...... +..L0LL11L....... +.L000LL12L...... +L00000L112L..... +.L000L01112L.... +..L0L.L01112L... +...L...L01112L.. +........L01112L. +.........L0111L. +..........L000L. +...........LLL.. +................`], + [ bolts[2], bitmap` +................ +...LLLLLLLLLL... +..L22111LL000L.. +..L221111L000L.. +..L2221110000L.. +...LLL2110LLL... +.....L2110L..... +.....L2110L..... +.....L2110L..... +.....L2110L..... +.....L2110L..... +.....L2110L..... +.....L2110L..... +......L00L...... +.......LL....... +................`], + [ bolts[3], bitmap` +................ +...L222222222... +...L111111112... +..L11111111112.. +..L11111111112.. +.L1111111111112. +.L1111111111112. +L111111LL1111112 +L111111LL1111112 +.L1111111111112. +.L1111111111112. +..L11111111112.. +..L11111111112.. +...L111111112... +...LLLLLLLLL2... +................` ], + [ correctBolt, bitmap` +........7....... +.......727...... +......72HH7..... +.....72HHHH7.... +......72HHH77... +.......7HH7757.. +......72H775557. +.....72HH7555557 +....72HHH575557. +...72HHH57.757.. +..72HHH57...7... +.72HHH57........ +.7HHH57......... +.75557.......... +..777........... +................`], + [ checkeredBackground, bitmap` +2222....2222.... +2222....2222.... +2222....2222.... +2222....2222.... +....2222....2222 +....2222....2222 +....2222....2222 +....2222....2222 +2222....2222.... +2222....2222.... +2222....2222.... +2222....2222.... +....2222....2222 +....2222....2222 +....2222....2222 +....2222....2222`], + [ drawer[0], bitmap` +0000000000000000 +0333333333333333 +0333333333333333 +0332222222222222 +033LLLLLLLLLLLLL +033LLLLLLLLLLLLL +0333333333333333 +0332222222222222 +033LLLLLLLLLLLLL +033LLLLLLLLLLLLL +0333333333333333 +0332222222222222 +033LLLLLLLLLLLLL +033LLLLLLLLLLLLL +0333333333333333 +0000000000000000` ], + [ drawer[1], bitmap` +0000000000000000 +3333333333333333 +3333333333333333 +2222222222222222 +LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLL +3333333333333333 +2222222222222222 +LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLL +3333333333333333 +2222222222222222 +LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLL +3333333333333333 +0000000000000000` ], + [ drawer[2], bitmap` +0000000000000000 +3333333333333330 +3333333333333330 +2222222222222330 +LLLLLLLLLLLLL330 +LLLLLLLLLLLLL330 +3333333333333330 +2222222222222330 +LLLLLLLLLLLLL330 +LLLLLLLLLLLLL330 +3333333333333330 +2222222222222330 +LLLLLLLLLLLLL330 +LLLLLLLLLLLLL330 +3333333333333330 +0000000000000000` ] +) + +setSolids([...player, mousePointer, brain, checkeredBackground, blankDark, note, sidewaysNote, robot, robot2, brokenRobot, drill, npc[0]]) + +setPushables({ + [player[0]]: [] +}) + +const drawers = [ + [{x:1,y:1}, {x:2,y:1}], + [{x:1,y:2}, {x:2,y:2}], + [{x:1,y:3}, {x:2,y:3}], + [{x:4,y:1}, {x:5,y:1}], + [{x:4,y:2}, {x:5,y:2}], + [{x:4,y:3}, {x:5,y:3}], +] +const randomDrawerNumber = Math.floor(Math.random() * 6); +const correctDrawer = drawers[randomDrawerNumber]; +const drillDrawer = drawers[randomDrawerNumber === 0 ? 5 : randomDrawerNumber - 1]; + +let phase = "I" +onInput("w", () => { + if (phase === "III" || phase === "III.iv") { + getFirst(mousePointer).y -= 1 + } else if (phase === "III.ii") { + getFirst(brain).y -= 1 + } else if (phase === "IV.ii") { + getFirst(player[0]).y -= 1 + getFirst(player[1]).y -= 1 + getFirst(player[2]).y -= 1 + getFirst(player[3]).y -= 1 + } +}) +onInput("s", () => { + if (phase === "III" || phase === "III.iv") { + getFirst(mousePointer).y += 1 + } else if (phase === "III.ii") { + getFirst(brain).y += 1 + } else if (phase === "IV.ii") { + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + } +}) +onInput("a", () => { + if (phase === "III" || phase === "III.iv") { + getFirst(mousePointer).x -= 1 + } else if (phase === "III.ii") { + getFirst(brain).x -= 1 + } else if (phase === "IV.ii") { + getFirst(player[0]).x -= 1 + getFirst(player[2]).x -= 1 + getFirst(player[1]).x -= 1 + getFirst(player[3]).x -= 1 + } +}) +onInput("d", () => { + if (phase === "III" || phase === "III.iv") { + getFirst(mousePointer).x += 1 + } else if (phase === "III.ii") { + getFirst(brain).x += 1 + } else if (phase === "IV.ii") { + getFirst(player[1]).x += 1 + getFirst(player[3]).x += 1 + getFirst(player[0]).x += 1 + getFirst(player[2]).x += 1 + } +}) + +const maps = { + blankIntermission: map` +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +-------------------- +--------------------`, + opener: map` +..... +.pcn. +..... +.....`, + introduceKilroy: map` +.......... +.......... +....kL.... +....ry.... +.......... +.......... +.......... +..........`, + movingRobotIn: map` +__________ +__________ +.......... +.......... +.......... +........kL +....Rcpnry +..........`, + pickADrawer: map` +Da.Da +Da.Da +Da^Da +.....`, + emptyDrawer: map` +---------- +-........- +-........- +-........- +-........- +-........- +-........- +----------`, + boltMaze: map` +--------------- +-.-......-....- +-.-.----.-.--.- +-......-...-..- +-.-.----.-.-.-- +-.-.-.--.-.-.-- +-.-....-.-..-.C +-.-.----.----.- +B.-..-.-......- +-.----.-------- +-.............- +---------------`, + pickABolt: map` +---------- +-boltbtol- +-lttotlbt- +-otblobto- +-tolbtolt- +-lbotlbot- +-tltbttlb- +----------`, + drawerWithDrill: map` +---------- +-...s....- +-..N...N.- +-.....N..- +-...d..s.- +-.s...N..- +-..s.....- +----------`, + practiceField: map` +NNxxNxxx/n +NxsxNxsx.. +xT.....R.. +xx.....d.. +sN..N..... +xR..d..... +kL..xxsxNx +ry..NTxNNN`, + waitForPassingRobot: map` +----kL---- +----ry---- +----..---- +----..---- +T......... +----..---- +----..---- +----..----` +}; + +let oldKilroyPos = [] + +let inputKDebounce = false; +onInput("k", async () => { + if (inputKDebounce) return; + inputKDebounce = true; + + if (phase === "III") { + const tile = tilesWith(mousePointer)[0][0] + const drawerIsCorrect = (tile.x + 1 === correctDrawer[0].x && tile.y + 1 === correctDrawer[0].y) || (tile.x + 1 === correctDrawer[1].x && tile.y + 1 === correctDrawer[1].y) + clearText() + + if (drawerIsCorrect) { + setMap(maps.pickABolt) + phase = "III.i" + + await sleep(500) + addText("I found the bolts!", { + x: 2, + y: 1, + color: color`2` + }) + + await sleep(1_500) + addText("But which bolt??", { + x: 2, + y: 15, + color: color`2` + }) + + await sleep(2_000) + phase = "III.ii" + clearText() + setMap(maps.boltMaze) + addText("Find the bolt!", { + x: 3, + y: 15, + color: color`2` + }) + } else { + setMap(maps.emptyDrawer) + addText("Wrong Drawer ):", { + x: 3, + y: 6, + color: color`0` + }) + await sleep(3_000) + + setMap(maps.pickADrawer) + clearText() + addText("Look for the right", { + x: 1, + y: 13, + color: color`0` + }) + addText("drawer and press K", { + x: 1, + y: 14, + color: color`0` + }) + } + } else if (phase === "III.iv") { + const tile = tilesWith(mousePointer)[0][0] + const drawerIsCorrect = (tile.x + 1 === drillDrawer[0].x && tile.y + 1 === drillDrawer[0].y) || (tile.x + 1 === drillDrawer[1].x && tile.y + 1 === drillDrawer[1].y) + clearText() + + if (drawerIsCorrect) { + setMap(maps.drawerWithDrill) + + await sleep(500) + addText("There it is!", { + x: 2, + y: 1, + color: color`2` + }) + + await sleep(3_000) + phase = "IV" + clearText() + setMap(maps.blankIntermission) + addText("Let's get this to", { + x: 1, + y: 6, + color: color`2` + }) + addText("the team!", { + x: 3, + y: 7, + color: color`2` + }) + + await sleep(1_500) + clearText() + setMap(maps.waitForPassingRobot) + phase = "IV.i" + + await sleep(1_000) + getFirst(robot2).x += 1 + + await sleep(Math.floor(Math.random()) + 1) + getFirst(robot2).x += 1 + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(1_000) + getFirst(robot2).x += 1 + + await sleep(Math.floor(Math.random() * 1_000) + 1_000) + getFirst(robot2).x += 1 + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(1_000) + getFirst(robot2).x += 1 + + await sleep(Math.floor(Math.random() * 1_000) + 1_000) + getFirst(robot2).x += 1 + + await sleep(1_000) + getFirst(robot2).x += 1 + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(Math.floor(Math.random() * 1_000) + 1_000) + getFirst(robot2).x += 1 + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(1_000) + getFirst(robot2).x += 1 + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(Math.floor(Math.random() * 1_000) + 1_000) + clearTile(getFirst(robot2).x, getFirst(robot2).y) + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(1_000) + clearTile(getFirst(player[2]).x, getFirst(player[2]).y) + clearTile(getFirst(player[3]).x, getFirst(player[3]).y) + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(1_000) + clearTile(getFirst(player[0]).x, getFirst(player[0]).y) + clearTile(getFirst(player[1]).x, getFirst(player[1]).y) + + setMap(maps.blankIntermission) + await sleep(500) + setMap(maps.practiceField) + phase = "IV.ii" + oldKilroyPos = [ + {x: getFirst(player[0]).x, y: getFirst(player[0]).y}, + {x: getFirst(player[1]).x, y: getFirst(player[1]).y}, + {x: getFirst(player[2]).x, y: getFirst(player[2]).y}, + {x: getFirst(player[3]).x, y: getFirst(player[3]).y}, + ] + } else { + setMap(maps.emptyDrawer) + addText("Wrong Drawer ):", { + x: 3, + y: 6, + color: color`0` + }) + await sleep(3_000) + + setMap(maps.pickADrawer) + clearText() + addText("I forgot the drill!", { + x: 1, + y: 13, + color: color`0` + }) + addText("Look for the drawer", { + x: 1, + y: 14, + color: color`0` + }) + } + } + inputKDebounce = false; +}) + +afterInput(async () => { + if (phase === "III.ii") { + if (tilesWith(brain)[0][1]?.type !== correctBolt) return; + phase = "III.iii" + + setMap(maps.blankIntermission) + clearText() + + addText("You found it!", { + x: 3, + y: 6, + color: color`2` + }) + + await sleep(2_000) + + setMap(maps.pickADrawer) + clearText() + addText("I forgot the drill!", { + x: 1, + y: 13, + color: color`0` + }) + addText("Look for the drawer", { + x: 1, + y: 14, + color: color`0` + }) + phase = "III.iv" + } else if (phase === "IV.ii") { + let stayedSame = false; + oldKilroyPos.forEach((pos, index) => { + if (getFirst(player[index]).x === pos.x && getFirst(player[index]).y === pos.y) stayedSame = true; + }) + + if (stayedSame) { + oldKilroyPos.forEach((pos, index) => { + getFirst(player[index]).x = pos.x + getFirst(player[index]).y = pos.y + }) + } else { + oldKilroyPos = [ + {x: getFirst(player[0]).x, y: getFirst(player[0]).y}, + {x: getFirst(player[1]).x, y: getFirst(player[1]).y}, + {x: getFirst(player[2]).x, y: getFirst(player[2]).y}, + {x: getFirst(player[3]).x, y: getFirst(player[3]).y}, + ] + } + + if (!(getFirst(player[1]).x === 9 && getFirst(player[1]).y === 1)) return; + phase = "IV.iii" + + await sleep(500) + setMap(maps.movingRobotIn) + getFirst(robot).type = brokenRobot + + await sleep(1_000) + clearText() + addText("Student 1:", { + x: 1, + y: 1 + }) + addText("You got the bolt!", { + x: 1, + y: 2 + }) + + await sleep(2_000) + clearText() + addText("Student 3:", { + x: 1, + y: 1 + }) + addText("Hooray!!", { + x: 1, + y: 2 + }) + + await sleep(2_000) + clearText() + addText("Student 2:", { + x: 1, + y: 1 + }) + addText("Ok, let's do this!", { + x: 1, + y: 2 + }) + + playTune(tune` +291.2621359223301, +291.2621359223301: A5^291.2621359223301 + B5/291.2621359223301, +291.2621359223301: B5/291.2621359223301 + A5^291.2621359223301, +291.2621359223301: B5/291.2621359223301 + A5^291.2621359223301, +291.2621359223301: B5/291.2621359223301 + A5^291.2621359223301, +291.2621359223301: B5/291.2621359223301 + A5^291.2621359223301, +7572.8155339805835`) + await sleep(2_000) + getFirst(brokenRobot).type = robot + + await sleep(1_000) + getFirst(npc[1]).y += 1 + getFirst(npc[2]).y -= 1 + getFirst(npc[0]).y += 1 + await sleep(250) + getFirst(npc[1]).y -= 1 + getFirst(npc[2]).y += 1 + getFirst(npc[0]).y -= 1 + await sleep(250) + getFirst(npc[1]).y -= 1 + getFirst(npc[2]).y += 1 + getFirst(npc[0]).y -= 1 + await sleep(250) + getFirst(npc[1]).y += 1 + getFirst(npc[2]).y -= 1 + getFirst(npc[0]).y += 1 + + clearText() + addText("Student 1:", { + x: 1, + y: 1 + }) + addText("Let's play!!", { + x: 1, + y: 2 + }) + + await sleep(2_000) + setMap(maps.blankIntermission) + clearText() + addText("They would go on", { + x: 1, + y: 6, + color: color`2` + }) + addText("to win the game", { + x: 1, + y: 7, + color: color`2` + }) + + await sleep(3_000) + clearText() + addText("THE END!", { + x: 3, + y: 6, + color: color`2` + }) + } +}) + +setBackground(checkeredBackground) +setMap(maps.opener) +addText("Welcome!", { + x: 6, + y: 10, + color: color`0` +}) + +async function start() { + await sleep(2_000) + clearText() + + addText("FIRST Robotics is a", { + x: 1, + y: 10, + color: color`0` + }) + addText("youth STEM org that", { + x: 1, + y: 11, + color: color`0` + }) + addText("inspires children", { + x: 1, + y: 12, + color: color`0` + }) + addText("of all ages to", { + x: 1, + y: 13, + color: color`0` + }) + addText("build and program", { + x: 1, + y: 14, + color: color`0` + }) + addText("ROBOTS!", { + x: 1, + y: 15, + color: color`7` + }); + + await sleep(8_000) + clearText() + + addText("FRC is a divison of", { + x: 1, + y: 10, + color: color`0` + }) + addText("High Schoolers, and", { + x: 1, + y: 11, + color: color`0` + }) + addText("has more complex", { + x: 1, + y: 12, + color: color`0` + }) + addText("game mechanics.", { + x: 1, + y: 13, + color: color`0` + }) + + await sleep(4_000) + clearText() + + addText("Now, let's begin!", { + x: 2, + y: 12, + color: color`5` + }) + + await sleep(1_000) + getFirst(npc[1]).y += 1 + getFirst(npc[2]).y -= 1 + getFirst(npc[0]).y += 1 + await sleep(250) + getFirst(npc[1]).y -= 1 + getFirst(npc[2]).y += 1 + getFirst(npc[0]).y -= 1 + await sleep(250) + getFirst(npc[1]).y -= 1 + getFirst(npc[2]).y += 1 + getFirst(npc[0]).y -= 1 + await sleep(250) + getFirst(npc[1]).y += 1 + getFirst(npc[2]).y -= 1 + getFirst(npc[0]).y += 1 + + playTune(tune` +400: A5^400, +400: A5^400, +400: A5^400, +11600`) + await sleep(500) + clearText() + setMap(maps.introduceKilroy) + + addText("Who's here?", { + x: 5, + y: 10, + color: color`9` + }) + await sleep(1000) + clearText() + addText("KILROY IS HERE!!!", { + x: 2, + y: 10, + color: color`9` + }) + getFirst(player[0]).y -= 1 + getFirst(player[1]).y -= 1 + getFirst(player[2]).y -= 1 + getFirst(player[3]).y -= 1 + await sleep(250) + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + await sleep(250) + getFirst(player[0]).y -= 1 + getFirst(player[1]).y -= 1 + getFirst(player[2]).y -= 1 + getFirst(player[3]).y -= 1 + await sleep(250) + getFirst(player[2]).y += 1 + getFirst(player[3]).y += 1 + getFirst(player[0]).y += 1 + getFirst(player[1]).y += 1 + + await sleep(1_000) + clearText() + setMap(maps.movingRobotIn) + + addText("Student 1:", { + x: 1, + y: 1 + }) + addText("Are you guys ready?", { + x: 1, + y: 2 + }) + await sleep(750) + getFirst(robot).x -= 1 + getFirst(npc[2]).x -= 1 + getFirst(npc[1]).x -= 1 + getFirst(npc[0]).x -= 1 + getFirst(player[0]).x -= 1 + getFirst(player[2]).x -= 1 + getFirst(player[1]).x -= 1 + getFirst(player[3]).x -= 1 + + await sleep(750) + getFirst(robot).x -= 1 + getFirst(npc[2]).x -= 1 + getFirst(npc[1]).x -= 1 + getFirst(npc[0]).x -= 1 + getFirst(player[0]).x -= 1 + getFirst(player[2]).x -= 1 + getFirst(player[1]).x -= 1 + getFirst(player[3]).x -= 1 + + clearText() + addText("Student 2:", { + x: 1, + y: 1 + }) + addText("Heck yeah!", { + x: 1, + y: 2 + }) + + await sleep(750) + getFirst(robot).x -= 1 + getFirst(npc[2]).x -= 1 + getFirst(npc[1]).x -= 1 + getFirst(npc[0]).x -= 1 + getFirst(player[0]).x -= 1 + getFirst(player[2]).x -= 1 + getFirst(player[1]).x -= 1 + getFirst(player[3]).x -= 1 + + await sleep(750) + getFirst(robot).x -= 1 + getFirst(npc[2]).x -= 1 + getFirst(npc[1]).x -= 1 + getFirst(npc[0]).x -= 1 + getFirst(player[0]).x -= 1 + getFirst(player[2]).x -= 1 + getFirst(player[1]).x -= 1 + getFirst(player[3]).x -= 1 + + // Some horrible tune + playTune(tune` +61.224489795918366, +61.224489795918366: E4/61.224489795918366 + F4/61.224489795918366 + G4/61.224489795918366 + A4/61.224489795918366 + D4~61.224489795918366, +61.224489795918366: A4/61.224489795918366 + B4/61.224489795918366 + G4/61.224489795918366 + F4/61.224489795918366 + E4/61.224489795918366, +61.224489795918366: E4/61.224489795918366 + F4/61.224489795918366 + G4/61.224489795918366 + A4/61.224489795918366 + B4/61.224489795918366, +61.224489795918366: G4/61.224489795918366 + A4/61.224489795918366 + B4/61.224489795918366 + C5/61.224489795918366 + D4~61.224489795918366, +61.224489795918366: B4/61.224489795918366 + A4/61.224489795918366 + C5/61.224489795918366 + D5/61.224489795918366 + E5/61.224489795918366, +61.224489795918366: E5/61.224489795918366 + F5/61.224489795918366 + D5/61.224489795918366 + F4~61.224489795918366 + G4~61.224489795918366, +61.224489795918366: E5/61.224489795918366 + D5/61.224489795918366 + C5/61.224489795918366 + F5/61.224489795918366 + G5/61.224489795918366, +1469.3877551020407`) + getFirst(robot).type = brokenRobot + phase = "II" + await sleep(1000) + + clearText() + addText("...", { + x: 1, + y: 1 + }) + + await sleep(2_000) + + clearText() + addText("Student 3:", { + x: 1, + y: 1 + }) + addText("What was that...", { + x: 1, + y: 2 + }) + + await sleep(2_000) + + clearText() + addText("Student 2:", { + x: 1, + y: 1 + }) + addText("A bolt fell off!", { + x: 1, + y: 2 + }) + + await sleep(2_000) + + clearText() + addText("Student 3:", { + x: 1, + y: 1 + }) + addText("Uh oh....what now??", { + x: 1, + y: 2 + }) + + await sleep(2_750) + + clearText() + addText("Student 1:", { + x: 1, + y: 1 + }) + addText("We need to get a", { + x: 1, + y: 2 + }) + await sleep(1_000) + clearText() + addText("new bolt. AND FAST!", { + x: 1, + y: 1 + }) + + await sleep(2_000) + clearText() + addText("Kilroy:", { + x: 1, + y: 1 + }) + addText("I'm on it!", { + x: 1, + y: 2 + }) + + await sleep(1_000) + getFirst(player[1]).x += 1 + getFirst(player[3]).x += 1 + getFirst(player[0]).x += 1 + getFirst(player[2]).x += 1 + + await sleep(500) + getFirst(player[1]).x += 1 + getFirst(player[3]).x += 1 + getFirst(player[0]).x += 1 + getFirst(player[2]).x += 1 + + await sleep(500) + getFirst(player[1]).x += 1 + getFirst(player[3]).x += 1 + getFirst(player[0]).x += 1 + getFirst(player[2]).x += 1 + + await sleep(500) + getFirst(player[1]).x += 1 + getFirst(player[3]).x += 1 + getFirst(player[0]).x += 1 + getFirst(player[2]).x += 1 + + await sleep(500) + clearTile(getFirst(player[1]).x, getFirst(player[1]).y) + clearTile(getFirst(player[3]).x, getFirst(player[3]).y) + getFirst(player[0]).x += 1 + getFirst(player[2]).x += 1 + + await sleep(500) + clearTile(getFirst(player[0]).x, getFirst(player[0]).y) + clearTile(getFirst(player[2]).x, getFirst(player[2]).y) + + await sleep(750) + clearText() + setMap(maps.blankIntermission) + addText("30 seconds and one", { + x: 1, + y: 5, + color: color`2` + }) + addText("count of being told", { + x: 1, + y: 6, + color: color`2` + }) + addText("\"UNSAFE\" as you run", { + x: 1, + y: 7, + color: color`2` + }) + addText("in the pits later", { + x: 1, + y: 8, + color: color`2` + }) + + await sleep(3_000) + clearText() + setMap(maps.pickADrawer) + phase = "III" + addText("Look for the right", { + x: 1, + y: 13, + color: color`0` + }) + addText("drawer and press K", { + x: 1, + y: 14, + color: color`0` + }) +} +start()