# Preferences P softerChecks on # Macros = cornucopia n [ a cornucopia At [ { gain crystal*{n}; deactivate } ] ] = haveCrystal n [ A set crystal*{n} n has: crystal*{n} ] = deathRevert [ E death R ] = corruptNode [ gd corruptNode ] = _jaunt where [ p {where} g jaunt ] = bossDoor name [ o {name} gt bossDoor q Apino ] = boss who level [ oa fight{who} gt bossFight e [ { <{level}>sum(combat, {who}){ gain defeated{who}; save; deactivate }{ goto endings//death } } ] ] = failBossRevert who [ !ta fight{who}%f R ] = beatBoss who [ ta fight{who}%s # This means that further 'At's after > beatBoss will correctly only # be available if you beat the boss: a claimReward{who} q defeated{who} At deactivate gt trigger ] = useSavePoint [ a save At save ] = enemy which [ gd enemy{which} ] = seeSwitch [ m switch:unhit oa hitSwitch q Apino e { set switch:hit; deactivate } ] = switch [ m switch:unhit a hitSwitch q Apino At { set switch:hit; deactivate } ] = namedSwitch name [ m switch{name}:unhit a hitSwitch{name} q Apino At { set switch{name}:hit; deactivate } ] = seeNamedSwitch name [ m switch{name}:unhit oa hitSwitch{name} q Apino e { set switch{name}:hit; deactivate } ] = recessedSwitch [ m switch:unhit a hitSwitch q Apino&ClawsOfBelial At { set switch:hit; deactivate } ] = snakeConsole [ m console:inactive oa console q ?snakeConsoles e { set console:active; deactivate } ] = console color [ m console:inactive oa console q ?{color}Consoles e { set console:active; deactivate } ] = multiSnakeConsole name [ m console{name}:inactive oa console{name} q ?snakeConsoles e { set console{name}:active; deactivate } ] = multiConsole color name [ m console{name}:inactive oa console{name} q ?{color}Consoles e { set console{name}:active; deactivate } ] = combat enemy level [ m combat:unresolved oa fight e [ { <{level}>sum(combat,{enemy}){ set combat:victory; deactivate }{ set combat:defeat; goto endings//death } } ] ] = lose [ !ta fight%f ] = win [ ta fight%s ] = grab what [ a grab At { gain {what}; deactivate } ] = quest which [ g quest{which} active At gain quest{which}Progress*1 ] = questProgress which [ g quest{which} advanced At gain quest{which}Progress*1 ] = questComplete which [ g quest{which} complete At gain quest{which}Complete ] = upgradeMenu who [ # TODO: Should this be a v? o talkTo{who} {who}UpgradeMenu::menu backTo{__zone__} e gain cameFrom{__zone__} qr cameFrom{__zone__} er lose cameFrom{__zone__} gb virtual t talkTo{who} n at: {who}UpgradeMenu::menu gd menu ] = leaveMenu zone [ t backTo{zone} n at: {zone}::main ] = logVisits [ a visit e { gain visited{__zone__}; deactivate } gt trigger ] = poisonHere [ # Using oa means we don't trigger it immediately but we will if a # second or subsequent action ends up in this position. This makes # sense (although is not precise) because the poison does have a timer # before it actually hurts us. oa poisoned q !?poisonResist e lose health*30 gt trigger ] # Note: we can't add '!poison:suppressed' to the normal poison macro, # because mechanism search would find distant poison mechanisms and read # their state. But using this one in a zone where a 'poison' mechanism # has been set up is safe. = suppressiblePoisonHere [ oa poisoned q !?poisonResist&!poison:suppressed e lose health*30 gt trigger ] = heatHere [ # See poisonHere oa heated q !?heatResist e lose health*50 gt trigger ] = suppressibleHeatHere [ oa heated q !?heatResist&!heat:suppressed e lose health*50 gt trigger ] = darkSlate [ m darkSlate:intact oa breakDarkSlate q ?canBreakDarkSlate e { set darkSlate:broken; deactivate } ] = darkSlateObverse [ oa breakDarkSlate q ?canBreakDarkSlate e { set darkSlate:broken; deactivate } ] # Needed if the obverse alone would be ambiguous: = darkSlateObverseTo where [ oa breakDarkSlate q ?canBreakDarkSlate e { set {where}::darkSlate:broken; deactivate } ] # Set up decision points for goto effects domain endings @ death @ @ @ curseDispelled @ @ # Journal g time: 2024-2-12:15:20 n [ Nine years ago, a curse spread from the castle, stealing color from the world and bringing sorrow. ] domain main S SnakeElevatorRoom::main zz unknownRegion > logVisits m leftDoor:closed o left qb leftDoor:open o right o up upper down q ?flight|?wallJump @ SnakeElevatorRoom::upper o right # visible on the map @ @ xt right LightningCorridor::main left x right JumpTutorial::bottom left o up top down o right qb ?shimmeringDoor xt up n at: JumpTutorial::top m topLeftDoor:closed o left qb topLeftDoor:open x right SwarmersHallway::main left > enemy Swarmer x right LeafyStaircase::bottom left x up top down o right qb ?shimmeringDoor x left CrystalChamber::main right a examine n [ Crystal mentions Amfibis, Pethiko, and Capra, three ancient gods/titans? ] x left OrbStairs::top right o down bottom up x left HiddenCornucopia::main right gt hidden > cornucopia 24 > haveCrystal 36 t right n at: OrbStairs::top xt down n at: OrbStairs::bottom o right qb ?shimmeringDoor n [ Upon attempting to attack the door, I get text saying that dark crystals can only be destroyed by light. ] o left gt hidden n [ Having this exit both appear on the map and also require breaking through the wall helps set the expectation that secrets will be scattered around. Very Super-Metroid-like. ] xt left UpperLightningHallway::rightSide right m chase:ongoing qr chase:over A save n [ There's a chase sequence here. ] x left leftSide right qr chase:over gt forced x left SnakeElevatorRoom::upper right qr chase:over gt forced n [ Here I tried to attack the apparition and touched it which killed me. ] > deathRevert n at: UpperLightningHallway::rightSide t left n at: UpperLightningHallway::leftSide t left n at: SnakeElevatorRoom::upper t down n at: SnakeElevatorRoom::main n level: combat^0 n level: BlueDemon^0 > boss BlueDemon -1 > beatBoss BlueDemon n [ We lose to the unavoidable beam attack but PLOT happens. Apino shows up. We right-click to hug the teddy bear, and our wounds are healed + color is restored! ] At gain Apino At set UpperLightningHallway::rightSide::chase:over @t right # TODO: Any special syntax for a revision that's known to be an # alteration? q ?shimmeringDoor @ @ F Apino ?shimmeringDoor zz SectorA_TalosEntrance t right n at: LightningCorridor::main t right n at: JumpTutorial::bottom xt right TutorialPiano::main left > useSavePoint n can: Apino g time: 2024-2-12:16:00 n [ Time for my meeting. ] w g time: 2024-2-16:22:39 n [ A bit of time to play before bed... ] t left t up t right n at: SwarmersHallway::main > enemy Flappy t right n at: LeafyStaircase::bottom > enemy Flappy t up n at: LeafyStaircase::top > enemy Flappy xt right FloatingPlatformsAscent::main left o bottomRight > enemy Shooter o midLeft x up top down > switch o topLeft q switch:hit x left TowerBugsJunction::rightSide right > enemy TowerBug > cornucopia 24 > haveCrystal 93 x aroundAbove midRight aroundRight qr ?higherJump|?wallJump o left n [ I think this might be a boss or miniboss, so I back off... ] n [ ...only to find that I can't! I can't jump high enough to get back. So let's revise a bit. ] xt left midChamber right qr combat:victory > enemy AxeArmor n [ Super easy miniboss; really just a tutorial. ] n level: combat^0 > combat AxeArmor -1 > win x left bottomLeft right q combat:victory o up n [ This path has beams going on. ] o left gt music n [ This path has golden music notes driftin out. A save point? ] xt left TrumpetRoom::main right a talkToWynton At deactivate n [ We meet the trumpet player from an orchestra who was hiding here. They're here to play a concert, but got separated. There's a guard with a giant hammer; if we take care of it he'll make it worth our while. His name is Wynton. ] > quest ThePathToBravery t right n [ Now that I'm pretty sure this is progress I regret that I can't go back to the FloatingPlatformsAscent... Hopefully I'll get the power to go back there soon? ] n at: TowerBugsJunction::bottomLeft xt up topLeft down o right topMid left qb ?greenZoom x left CorkscrewWall::main right > enemy TowerBug > enemy Flappy o left qb ?greenZoom x up DistortionHallway::rightSide down > switch x left mid right q switch:hit > enemy Flappy > enemy SwordKnight > combat SwordKnight 1 > lose n [ I was really stupid and used all my health shooting then walked into it. Supposed to be a dodging tutorial T_T ] R n at: TutorialPiano::main n [ Our money fully reverts, as does our map. ] n can: Apino # our capabilities don't revert, right? n [ I'm not that sad since I get to re-explore the FloatingPlatformsAscent forks. ] t left JumpTutorial::bottom g jauntStart t ? JumpTutorial::top t ? SwarmersHallway::main t ? LeafyStaircase::bottom t ? LeafyStaircase::top t right FloatingPlatformsAscent::main g jauntEnd xt bottomRight DimTheaterFoyer::main left m door:closed o right qb door:open t left n at: FloatingPlatformsAscent::main xt midLeft CrystalNook::rightSide right o overLeft leftSide overRight q ?wallJump|?flameBoost @ CrystalNook::leftSide oa crystal @ @ t right n at: FloatingPlatformsAscent::main t ? FloatingPlatformsAscent::top g jauntStart t ? TowerBugsJunction::rightSide t ? midRight t ? TowerBugsJunction::midChamber g jauntEnd > win t left t left n at: TrumpetRoom::main ta talkToWynton # TODO: Quest state that can be reset by a death? > quest ThePathToBravery t ? TowerBugsJunction::bottomLeft g jauntStart t ? topLeft t ? CorkscrewWall::main t ? DistortionHallway::rightSide ta hitSwitch t ? DistortionHallway::mid g jauntEnd A gain combat^1 n level: combat^1 > win n [ It's a near thing but I did learn about dodging! Also apparenlty attacking enemies refreshes lullaby charges pretty quickly? Health seems very flexible in this game. ] x left leftSide right q combat:victory n [ I actually did try to iframes past the knight but failed. Thankfully I still beat it. ] x left SnakeElevatorFloor2::main bottomRight > logVisits o topRight o topLeft o bottomLeft n [ My quest marker indicates that the upper-left here is a boss fight. Let's look for a save point on one of the other doors first! # TODO: Formal notation for this sort of thing! ] n [ From the future: that wasn't a boss fight!... T_T ] @t topLeft gd destination:ThePathToBravery @ @ n [ This quest desitation notation is actually... not correct. The pink color is because it's a theater. In fact, quest destinations are NOT marked on the map at all... ] > snakeConsole n [ Note that this console looks like the JumpTutorial::top one; I hope I ended up implementing fulfillment for mechanism states... ] xt topRight LonelyCrystal left o right a breakCrystal At { gain blueNote*1; deactivate } n has: blueNote*1 xt right BlueNotePiano::main left > useSavePoint n [ I'm mystified as to what the blue note actually does... It said "Relic acquired" but what does that mean? ] t left t left n at: SnakeElevatorFloor2::main xt bottomLeft FloatingCrystalsHall::main right > enemy EvilCrystal > namedSwitch A x down LasersVertical::top up qb switchA:hit o downRight n [ Lasers this way, let's wait. ] x downLeft bottomLeft up o left @ LasersVertical::bottomRight > seeNamedSwitch B @ @ qb switchB:hit # TODO: This won't activate it since we're in relative mode, right? # TODO: Prevent 'A' from triggering effects in relative mode! # n can: !switchB:hit t up n at: LasersVertical::top xt downRight bottomRight up ta hitSwitchB o zoomRight qb ?greenZoom o zoomLeft qb ?greenZoom t up t downLeft n at: LasersVertical::bottomLeft xt left ZoomyJunction::rightSide topRight > enemy EvilCrystal @ LasersVertical::bottomRight Xt zoomLeft o zoomLeft ZoomyJunction::rightSide zoomRight qb ?greenZoom @ @ o zoomThrough topAndLeft zoomThrough qb ?greenZoom o bottomRight > enemy AxeArmor > snakeConsole n [ Not sure what this one activates... ] x up topAndLeft down > snakeConsole o up qb console:active > enemy Shooter > enemy TowerBug > enemy EvilCrystal > switch o bottomLeft qb switch:hit t down xt bottomRight LeafyStudy::main left a shatterGlobe At { gain CartographersJournal; deactivate } n [ A map of this area. Quite nice! ] t left n at: ZoomyJunction::rightSide t up n at: ZoomyJunction::topAndLeft xt bottomLeft SnakeWaterfalls::top right x down main up qr ?flight|?swimUp o midRight o bottomRight o left n [ Map helps me decide here! Mid right is only one square, as is bottom left (and that's yellow). ] xt midRight BigCrystalRoom::main left > grab WhirlwindStrike n [ Sweet we got charge beam! :P ] n [ Between this and getting good; I'm better now. ] A gain combat^1 n level: combat^2 t left n at: SnakeWaterfalls::main x bottomLeft AnotherDimTheaterFoyer::main right m door:closed o left qb door:open t right n at: SnakeWaterfalls::main xt bottomRight GoldenBath::top left > enemy Flappy o down q ?swimUnder x right NarrowWindowsJunction::top left > enemy Flappy > enemy GreenShooty > enemy SwordKnight > combat SwordKnight 1 > win x right rightSide topLeft q combat:victory o topRight o bottomRight # looks like a boss door maybe? gt toBoss q Apino > multiSnakeConsole A m midNookDoor:closed o midUp midNook down qb midNookDoor:open @ NarrowWindowsJunction::midNook > multiSnakeConsole B @ @ m leftDoor:closed o left bottomLeft right q leftDoor:open @ NarrowWindowsJunction::bottomLeft > multiSnakeConsole C o left # via the map @ @ xt topRight AreaMidPiano::main left > useSavePoint t left n at: NarrowWindowsJunction::rightSide xt bottomRight SwordPilesChamber::main left > boss SwordAndShieldKnight 1 > beatBoss SwordAndShieldKnight n [ Weird fight. It blocks everything except high attacks over the shield, but only uses one easily dodgable sword attack? Felt like most of the tools I've been learning were useless here. ] o right q defeatedSwordAndShieldKnight t left t topRight ta save t left t bottomRight n at: SwordPilesChamber::main xt right GreenCrystalChamber::leftSide left x right rightSide left > snakeConsole @t left q console:active @ @ > grab GraceOfZeus F GraceOfZeus ?snakeConsoles ta console