- Learn
- Build a Game
- Pacific Wings
- 7 The Route
7 The Route
The sea below fills up. A gray carrier, a jungle atoll, a coral reef and a bank of white cloud slide by under the Fighter. Each one comes around again ahead, so the sea never runs out. Hidden milestones move the mission on, stage by stage. Reinforcements join the waves.
The game as it is at the end of this chapter. Click the game, then press Enter to start.
If your game and this chapter part ways, here is the chapter’s finished project. Open it and compare, or start Chapter 8 from it.
To open it, start Myth Engine, choose File › Open Project... and pick the downloaded file.
7.1 The Idea
Since Chapter 1, your Fighter has flown over open water, deep blue at the top and lighter below. Nothing else. The enemies come down in their waves, and between them the route is empty.
Now picture it full. A long gray carrier sits low on the water as the mission begins. It slides down the screen and out of sight. A round island goes by, with palm trees and a sandy beach. Then a ring of coral around a blue lagoon, and a white bank of cloud that drifts slowly sideways. A little later, the carrier is back, ahead of you, somewhere new.
It’s the same carrier. There are only four pieces of scenery in the whole game. When one passes below the view, it’s picked up and set down again ahead. It’s like crossing a stream on four stepping stones: you lift the one behind you and put it down in front.
The route gains a second thing you can’t see. Three milestones wait along it, markers that report when the camera reaches them. Each one moves the mission on a stage. Stage 1 is the start, and every milestone adds one.
The stage decides the reinforcements, planes that join the placed waves from above. Pairs of Enemy Fighters come from the start. Aces join them at stage 2, and the slow Heavy Bombers at stage 3. When the last milestone is gone, they stop. Something big is coming, and the Fighter will meet it alone. That waits for Chapter 11.
7.2 The Plan
Here’s how the pieces work together, one chain to a line. The message names are new, and each comes back in its own part. Skim them now, and look again at the end.
- A piece of scenery leaves the view -> Move Ahead When Passed sets it down ahead, and sends movedAhead to its own piece.
- The Cloud Bank is made, or moved ahead -> Drift Sideways sends startDrifting, and the cloud drifts toward its far side.
- The route begins -> Stages sets $stage to 1 and sends stageReached.
- A milestone comes into view -> Report Milestone sends milestoneReached, and removes itself. Stages adds one to $stage and sends stageReached.
- stageReached arrives at a Squadron whose stage it is -> Reinforcements starts its timer, and each ring sends a group of planes.
- The last milestone is gone -> Stages shakes the camera and sends commandBomberApproaching. Every Squadron stops.
7.3 Set Up
Four pictures join the game this chapter: the carrier, the atoll, the reef and the cloud bank. The fifth, Hit Area Marker, is the milestones’ picture for now. All five are in your project already.
GLOBAL VARIABLES has two new rows. Make them the way you made $planes, from the Globals card of any Logic Component, with New Global…. Both are Numbers that start at 0, so all you type is the name: stage for the first, furthestSceneryY for the second.
PLACE THESE waits until its Objects exist, and each part of this chapter places its own.
7.4 Scenery
The first job is the sea.
7.4.1 Move Ahead When Passed
From a piece of scenery’s point of view, there’s one moment that matters: the moment it leaves the view at the bottom. Chapter 2’s tracers met the same moment, and Leave View cleared them away. Leave View runs only once the whole piece is out of the view, so the cloud’s sideways drift never sets it off. Scenery isn’t cleared away. It’s moved ahead, to the far side of the view.
Where, exactly? Two rules decide. It must land well past the top of the view, so you never see it arrive. And it must land beyond the piece that’s furthest ahead. Two pieces never pile up in one spot.
The first rule is a spot in the sky, 17.5 meters past the middle of the view. The piece works that spot out for itself, and keeps it in leadY, a value that lasts one run of the Event. The second rule needs a number every piece can read: how far north the furthest piece is. That’s $furthestSceneryY, one of the two new Globals.
The piece starts from $furthestSceneryY. But if leadY is further north, leadY wins, and the piece goes from there instead. That’s the If. $furthestSceneryY starts at 0 and learns only of pieces that have moved, so the first time, leadY wins. By then it’s already further north than every piece you placed. The piece adds a random gap, picks a random spot across the route, and it’s there, all at once. Then it becomes the furthest piece itself, and last of all, it tells its own Object movedAhead. Nothing on the carrier listens. The cloud will.
When this piece of scenery has passed below the view, moves it ahead again: gapMin to gapMax meters beyond the scenery furthest ahead, and at least leadMeters above the middle of the view.
Any Object- Name
leadY- Value
0
- Variable
leadY- Value
$viewMiddleY + @self.leadMeters
$furthestSceneryY < leadY- Variable
$furthestSceneryY- Value
leadY
- Action Name
gap- Minimum
@self.gapMin- Maximum
@self.gapMax
- Variable
$furthestSceneryY- Operator
+=- Value
gap.value
- Action Name
newX- Minimum
@self.xMin- Maximum
@self.xMax
- X
newX.value- Y
$furthestSceneryY
- Custom Event
movedAhead
Make it as an Empty Logic Component, with its five Shared Variables. The middle of the view comes from $viewMiddleY, the Global Track the View keeps for you since Chapter 4.
Leave View comes from Add Event, as on Remove When Out of View. Its first step is a Declare Variable, as in Chapter 6: the Name leadY, the Value 0. The Change Variable after it sets leadY. The If after that asks $furthestSceneryY < leadY, and its one step goes on its True line with Add Inside Then.
The rest go after the whole If, on the main line. Here’s how they get there. A block you add from the Action List never lands inside an If. It lands beside the main line, and Connect to Sequence joins it to the end of that line, below the If, where the True line comes back. Only the If’s own menu puts a step inside. So add the rest from the Action List.
Type gap and newX over the two Action Names of Generate Random Number. The second Change Variable for $furthestSceneryY, the one after the If, wants += · Add in its Operator list. Set Position moves an Object at once, with no glide: it has an X box and a Y box, and it starts on World, which is what the card wants. Last, Trigger Custom Event on Object. It starts on Self, so type movedAhead into its Custom Event box.
7.4.2 The Carrier, the Atoll, the Reef and the Cloud
Now the four pieces.
X 7.8, Y 7.8Off-20Aircraft Carrier ArtX 7.8, Y 7.8OffSpriteX 7.8, Y 7.8X 7, Y 7Off-30Tropical Atoll ArtX 7, Y 7OffSpriteX 7, Y 7X 7.2, Y 7.2Off-40Coral Reef ArtX 7.2, Y 7.2OffSpriteX 7.2, Y 7.2X 7.4, Y 7.4Off10Cloud Bank ArtX 7.4, Y 7.4OffSpriteX 7.4, Y 7.4Drift SidewaysDrift Sideways DataEach has a Collider, so each is a 2D Object. Go down its card from the top.
Look at the Scene Depth numbers. The carrier, the atoll and the reef are all below zero, so they lie under everything else, flat on the sea. The reef is lowest of all. The Cloud Bank is at 10. It floats above the islands, but under the planes at 30, so your Fighter flies over it.
The Collider has a new Shape, Sprite: the shape follows the picture. With Collision Off, nothing bumps into an island. The Collider stays only to give the piece its size. Up on the Transform, Physics > Physics Object is Off, so nothing can shove a piece. Its own Logic can still move it, as the cloud’s will.
Each piece carries Move Ahead When Passed, so attach it to all four. The Cloud Bank’s card names one more, Drift Sideways, and a Data Structure that comes with it. That’s next.
7.4.3 Drift Sideways
The cloud bank does one more thing. It drifts sideways, at 0.4 meters a second, so slowly you might miss it, and turns back at each side.
Here’s the trick. The cloud never checks where it is while it drifts. It works out how long the trip will take, and sets a timer for that moment. When the timer rings, it has arrived, so it turns back.
There are two kinds of trip. The first goes from wherever the cloud is now to the far side. The ones after go all the way across, from leftX to rightX and back. So the first ring comes after distanceToGo / driftSpeed seconds, and every ring after it is the time to cross.
When does a first trip start? Twice. Once when the cloud is made, and again each time Move Ahead When Passed sets it down somewhere new. Both send the same message to the cloud itself, startDrifting, so the work is written once.
Object Data of Logic "Drift Sideways" (its state that lasts between Events).
Drifts sideways at driftSpeed between leftX and rightX, turning back at each on the driftTurn timer. It starts at Create and again whenever the Object is moved ahead.
Any Objectself.driftSidewaysData- Custom Event
startDrifting
- Custom Event
startDrifting
self.transform.position.x < ((@self.leftX + @self.rightX) / 2)- Component Value
self.driftSidewaysData.driftSide- Value
1
- Component Value
self.driftSidewaysData.distanceToGo- Value
@self.rightX - self.transform.position.x
- Component Value
self.driftSidewaysData.driftSide- Value
-1
- Component Value
self.driftSidewaysData.distanceToGo- Value
self.transform.position.x - @self.leftX
- X Velocity
@self.driftSpeed * self.driftSidewaysData.driftSide
- Timer Name
"driftTurn"- Repeat Every (s)
(@self.rightX - @self.leftX) / @self.driftSpeed- First Delay (s)
self.driftSidewaysData.distanceToGo / @self.driftSpeed
- Component Value
self.driftSidewaysData.driftSide- Operator
*=- Value
-1
- X Velocity
@self.driftSpeed * self.driftSidewaysData.driftSide
Make it with its three Shared Variables. Its Data Structure comes from New Data Structure on the Data Structures card, as Weave Data did. Drift Sideways Data has two Number fields this time. driftSide’s Value is 1, and distanceToGo’s stays 0.
It has four Events. Create runs once, when the cloud comes into being, as on Show While in Reserve. Its one step sends startDrifting, typed in. In the Add Event list, movedAhead is there already, since Move Ahead When Passed sends it. startDrifting is there too, because the step you made a moment ago sends it.
Under startDrifting, the If has a True line and an Else line, each with two Change Component Value steps. Set Velocity and Start Recurring Timer go after the whole If, on the main line, from the Action List as before. Type "driftTurn" into Timer Name, with its quote marks. The old timer may still be running when the cloud is moved ahead. That’s fine. Starting a timer by a name that’s already running starts it over, with the new time. For the last Event, pick Recurring Timer in Add Event, choose Type a timer name…, and type driftTurn.
When that timer rings, the cloud turns around. Its Change Component Value’s Operator is *= · Multiply, as in Weave, with -1 in the Value. Times -1 turns 1 into -1, and -1 back into 1.
Attach Drift Sideways to the Cloud Bank, after Move Ahead When Passed. Drift Sideways Data arrives with it. Its Shared Variables need nothing typed: each starts at the Logic’s own value.
7.4.4 Four Pieces on the Sea
Open Route and place the four, from PLACE THESE: the Aircraft Carrier, the Tropical Atoll, the Cloud Bank and the Coral Reef, each at its World Position.
Run the game, and press Enter. The carrier is right there, beside your Fighter, long and gray. It slides away down the screen. The atoll follows it, then the cloud, sliding sideways as it goes. Keep flying. Some time after the carrier leaves the bottom of the view, it comes back in at the top, somewhere new.
7.5 Milestones
Now the route learns to count.
7.5.1 Report Milestone
A milestone is a marker with one job. When the camera reaches it, it says so, and then it’s gone.
It doesn’t know which stage it starts. It doesn’t need to. It only shouts milestoneReached, and Game Rules decides what that means.
There’s one small catch. In the Scene, you want to see the markers, so you can place them. In play, you don’t. Hiding the picture won’t work, because Myth’s Enter View looks at the picture an Object shows, and a hidden one never enters the view. So the marker goes see-through instead: the moment it’s made, Set Alpha sets its Alpha to 0. Invisible. Still there.
A marker placed along the route: when it comes into view it tells Game Rules milestoneReached, then removes itself.
Any Object- Alpha
0
- Custom Event
milestoneReached
Make it as an Empty Logic Component. It needs no Shared Variables at all. Its two Events and three steps are all on the card.
X 0.6975, Y 1.7325901Hit Area MarkerX 0.6975, Y 1.7325The Milestone has a picture and no Collider. So make it an Empty Object, and click Sprite in the toolbox’s Rendering group. Its picture is the Hit Area Marker, a small pale capsule that the Fighter will put to other work in Chapter 10. Here it marks a spot. Copy its Z Index Within Object, 1, from the card. With one picture, it changes nothing you’ll see. Attach Report Milestone in Logic.
7.5.2 Stages
Stages sits on Game Rules, and it keeps $stage.
Think of $stage as a page number. The route opens on page 1, and each milestone turns one page. Each time, Stages tells everyone, with stageReached.
The last part is the one to watch. How does Game Rules know that the last of the milestones has gone? It doesn’t count them. Myth has an Event for exactly this, No Instances Left. It runs by itself when the last Milestone in the game is removed. Place three markers, or ten. The last one is always the warning.
That warning is a light shiver of the camera, 0.012 for 0.35 seconds, and a message, commandBomberApproaching. Nothing in the game has a Command Bomber yet. But the Squadrons will hear the message, and stop.
Starts $stage at 1 when the route begins and raises it by one at each milestone, announcing stageReached each time; when no milestones are left it shakes the camera lightly and announces commandBomberApproaching.
Any Object- Variable
$stage- Value
1
- Custom Event
stageReached
- Variable
$stage- Operator
+=- Value
1
- Custom Event
stageReached
- Intensity
@self.shakeIntensity- Seconds
@self.shakeSeconds
- Custom Event
commandBomberApproaching
Its milestone is a Shared Variable, an Object starting at None, and the two Numbers follow it. No step reads milestone. It’s there so that anyone who opens Stages sees, in its Shared Variables, which Object it watches. The watching itself is done by the Event.
Scene Start is in the Add Event list. It runs each time the route begins. milestoneReached is in the list already, since Report Milestone sends it. Its Change Variable wants += · Add again. For No Instances Left, Add Event opens no second window. Its Object is a list on the Event’s own block, so pick Milestone there.
FighterMilestoneAttach Stages to Game Rules. Under Variables, its milestone Value is a button that reads None until you press it. Press it, and pick Milestone.
Open Route and place the three Milestones from PLACE THESE. In the Scene, each one is a pale capsule standing on the route. In play, they’re gone.
You won’t see much yet, so run the game and fly on. The stages go by in silence. Nothing reads $stage yet. The first milestone comes into view with the first Aces of Wave 2. The second comes with the Heavy Bomber at the heart of Wave 3, and the last waits past the final approach, beyond the last bomber. When it comes, the screen shivers. The route has been counting, quietly, from the moment you took off.
7.6 Reinforcements
Now the stages bring planes.
7.6.1 Reinforcement Orders
Each kind of enemy joins in its own way. Enemy Fighters come often, in pairs. Aces come one at a time, from stage 2, and Heavy Bombers rarely, from stage 3. Every number for that goes in one table.
One row of the "Reinforcement Orders" Data Table.
10.753.851422.58.19.420.357.291012.817.2030.451013513.7516.250This table keeps the Data Structure it makes. Make the table, Reinforcement Orders, and it makes Reinforcement Orders Entry under Data Structures. Leave its Entry Type on that Entry. Open the Entry, and add its nine fields from its card, each a Number at 0. Each field becomes a column of the table.
Add Row three times. Then double-click each row’s name in the Entry column, and type its own. Use Enemy Types’ very names: Enemy Fighter, Enemy Ace, Heavy Bomber. Both tables are read with one name, so one wrong letter, and that kind never comes.
7.6.2 Reinforcements
A Squadron has no picture. It’s a sender. It waits for its stage, then sends planes on a timer until it’s told to stop.
Which planes? The answer is small. There’s one Reinforcements, and three Squadrons in the Scene. Each Squadron’s placement says which enemy it sends, by name, in its kind. That name is the Object to make, and the row to read in both tables. One piece of Logic, three jobs.
Picture the Enemy Fighters’ Squadron. The route begins, and stageReached arrives at every Squadron at once. This one’s row says fromStage 1. Its turn. So it starts its reinforcements timer, set to ring once, very soon.
The timer rings, and a pair of Enemy Fighters goes out. Each plane goes only if there’s room, with fewer of its kind in the sky than its row allows. Each gets a lane, a random spot across the route. The second of the pair comes in 9.4 meters further across, so the two fly side by side. All of those numbers are columns of the Squadron’s row.
Each plane is made aboveCameraMeters above the middle of the view, 11.25 meters, out of sight. It’s launched south at its own speed from Enemy Types. By the time you see it, it’s already flying. The Squadron picks a random wait from its row, and starts the timer again.
When commandBomberApproaching arrives, the timer stops. That’s all.
Object Data of Logic "Reinforcements" (its state that lasts between Events).
Sends one enemy kind in from above the view on the reinforcements timer, from the stage in its Reinforcement Orders row until the Command Bomber approaches; each one only while fewer than cap of that kind are alive.
Any Objectself.reinforcementsData$stage == data('Reinforcement Orders', self.kind, 'fromStage')- Timer Name
"reinforcements"- Repeat Every (s)
data('Reinforcement Orders', self.kind, 'firstSeconds')- Ring Once
Yes
- Name
waitSeconds- Value
0
data('Reinforcement Orders', self.kind, 'perWave')times- Action Name
roomForMore- Object
self.kind- Operator
<- Value
data('Reinforcement Orders', self.kind, 'cap')
roomForMore.value == true- Action Name
laneRoll- Minimum
data('Reinforcement Orders', self.kind, 'xMin')- Maximum
data('Reinforcement Orders', self.kind, 'xMax')
- Component Value
self.reinforcementsData.laneX- Value
laneRoll.value
- Component Value
self.reinforcementsData.laneX- Operator
+=- Value
local.index * data('Reinforcement Orders', self.kind, 'laneStepMeters')
- Component Value
self.reinforcementsData.launchSpeed- Value
data('Enemy Types', self.kind, 'speed')
- Object to Create
self.kind- X
self.reinforcementsData.laneX- Y
$viewMiddleY + @self.aboveCameraMeters- Launch Speed
self.reinforcementsData.launchSpeed- Launch Angle
-90
- Action Name
waitRoll- Minimum
data('Reinforcement Orders', self.kind, 'secondsMin')- Maximum
data('Reinforcement Orders', self.kind, 'secondsMax')
- Variable
waitSeconds- Value
waitRoll.value
- Timer Name
"reinforcements"- Repeat Every (s)
waitSeconds- Ring Once
Yes
- Timer Name
"reinforcements"
Make it as an Empty Logic Component. Its one Shared Variable is aboveCameraMeters. Its kind is a Per Instance Variable, a Text starting at Enemy Fighter: each placed Squadron keeps its own.
Reinforcements Data comes from New Data Structure, with two Number fields at 0, laneX and launchSpeed. The wait, waitSeconds, lasts one run of the timer’s Event, so it’s a Declare Variable at the start of that Event.
stageReached is in the Add Event list already. Its If’s condition is typed as the card has it, data() and all. data() reads one cell of a Data Table. It takes the table’s name first, then the row, then the column. Here the row is self.kind. Each Squadron reads its own. The reinforcements timer’s Event is a Recurring Timer, with reinforcements typed as its timer name. A named timer in Myth is always a Recurring Timer. Ring Once Yes makes it ring a single time, then stop, until something starts it again.
Under it, after the Declare Variable, comes a Repeat. Its Count box is on the block. Right-click the Repeat and choose Add Inside Repeat for Check Instance Count, and again for the If after it. Inside that If go the next five steps, each from the If’s Add Inside Then. local.index counts the times round the Repeat, from 0. So the first plane of a pair is 0 steps across, and the second is one step.
Check Instance Count’s Object is self.kind, the Squadron’s own name for its enemy. So is Create Instance’s Object to Create. Create Instance starts on World, so type its X and Y, then Launch Speed and Launch Angle.
The last three steps go after the whole Repeat, on the main line. A Repeat works like an If here. Add each from the Action List, and Connect to Sequence joins it below the whole Repeat, never inside it. Their Applies to starts on Self, the Squadron, which is what the card wants. The Create Instance before them is inside the Repeat, not on their line, so it doesn’t count. The timer belongs to the Squadron, not to a plane it sent.
Last comes the commandBomberApproaching Event. Its Stop Recurring Timer takes "reinforcements", with its quote marks, like every Timer Name.
ReinforcementsReinforcements DataSquadron is an Empty Object, with Reinforcements in its Logic. Reinforcements Data arrives with it. Its kind waits for the placements.
7.6.3 Three Squadrons
Open Route, and place three Squadrons from PLACE THESE, each at 0, 0. A Squadron has no picture, so it’s hard to click in the Scene. Click it in the Scene Explorer on the right instead, where the three are listed. Set up each one before you place the next.
The card’s with lines are each placement’s own values, as with the Reserve Plane Icons’ slots in Chapter 4. They’re in the Properties, near the bottom, under Logic, in Reinforcements’ Per Instance Variables. The Kind box shows Enemy Fighter already. That’s right for the first, so its card has no with line. Type Enemy Ace over it on the second, and Heavy Bomber on the third, spelled exactly as the Objects are named.
7.6.4 Room for Everyone
From now on, planes come in crowds. A new Enemy Fighter can arrive right where a placed one is flying, and two solid planes would shove each other off course. So each enemy learns to pass through the others.
The change is the same on all three planes, in the Collider’s Tags and Interactions. Pick Never Collide With in its Interactions list. Then press Search to add…, and pick Tagged Enemy Aircraft. Now every plane that wears that Tag passes straight through the others, as if they were cloud. Your Fighter’s tracers still hit them, and they still hit you. Only enemies ignore each other.
On the three cards below, look for the marked lines. They’re the only new ones. The rest is each plane as you left it in Chapter 6.
X 2.48, Y 2.4830Enemy Fighter ArtX 2.48, Y 2.48Z -180EllipseX 1.453, Y 1.046Never Collide WithTagged Enemy AircraftEnemy StatsData TableEnemy TypesEnemy FighterFire When SeenFire When Seen DataGun MuzzleX 0, Y -0.94Enemy Aircraft, Enemy ThreatEnemy TracerExpressionobjectComponentProperty("self","enemyStats","tracerSpeed")ExpressionobjectComponentProperty("self","enemyStats","firstShotSeconds")ExpressionobjectComponentProperty("self","enemyStats","shotSecondsMin")ExpressionobjectComponentProperty("self","enemyStats","shotSecondsMax")FighterExpressionobjectComponentProperty("self","enemyStats","aimConeDegrees")ExpressionobjectComponentProperty("self","enemyStats","speed")X 2.56, Y 2.5630Enemy Ace ArtX 2.56, Y 2.56Z -180EllipseX 1.6, Y 1.04Never Collide WithTagged Enemy AircraftGun MuzzleX 0, Y -0.94Enemy StatsData TableEnemy TypesEnemy AceWeaveWeave DataFire When SeenFire When Seen DataEnemy Aircraft, Enemy ThreatEnemy TracerExpressionobjectComponentProperty("self","enemyStats","tracerSpeed")ExpressionobjectComponentProperty("self","enemyStats","firstShotSeconds")ExpressionobjectComponentProperty("self","enemyStats","shotSecondsMin")ExpressionobjectComponentProperty("self","enemyStats","shotSecondsMax")FighterExpressionobjectComponentProperty("self","enemyStats","aimConeDegrees")ExpressionobjectComponentProperty("self","enemyStats","weaveSpeed")ExpressionobjectComponentProperty("self","enemyStats","weaveSeconds")ExpressionobjectComponentProperty("self","enemyStats","weaveAngle")ExpressionobjectComponentProperty("self","enemyStats","speed")X 3.36, Y 3.3630Heavy Bomber ArtX 3.36, Y 3.36Z -180EllipseX 2.468, Y 1.733Never Collide WithTagged Enemy AircraftGun MuzzleX 0, Y -0.932Enemy StatsData TableEnemy TypesHeavy BomberWeaveWeave DataFire When SeenFire When Seen DataEnemy Aircraft, Enemy ThreatEnemy TracerExpressionobjectComponentProperty("self","enemyStats","tracerSpeed")ExpressionobjectComponentProperty("self","enemyStats","firstShotSeconds")ExpressionobjectComponentProperty("self","enemyStats","shotSecondsMin")ExpressionobjectComponentProperty("self","enemyStats","shotSecondsMax")FighterExpressionobjectComponentProperty("self","enemyStats","aimConeDegrees")ExpressionobjectComponentProperty("self","enemyStats","weaveSpeed")ExpressionobjectComponentProperty("self","enemyStats","weaveSeconds")ExpressionobjectComponentProperty("self","enemyStats","weaveAngle")ExpressionobjectComponentProperty("self","enemyStats","speed")Save, and run the game.
The carrier slides away beside you as you climb north. Two Enemy Fighters drop in from the top, side by side, and then two more. Fly on past the first Aces, and single red-orange Aces start arriving too. Later come the slow bombers, rocking as they crawl. Near the end, the screen shivers. Then the sky goes quiet.
Watch for each of these, one at a time.
- The Aircraft Carrier sits beside your Fighter as the mission begins. It slides down and away.
- Each piece that leaves the bottom of the view comes back at the top, somewhere new across the route. You never see one appear.
- The Cloud Bank drifts sideways, slowly, at 0.4 meters a second, and turns back at the sides. It floats over the islands and under your Fighter.
- From the start, Enemy Fighters arrive in pairs, side by side, on top of the placed waves.
- Once Wave 2’s first Aces are in view, single Aces start arriving too. Once Wave 3’s Heavy Bomber is in view, Heavy Bombers join them.
- After the last milestone, the camera shivers once. No more reinforcements come.
- Enemies fly right through each other, with never a bump between them.
Four stones on the water, and three markers along the route. Three Squadrons share one piece of Logic.
The scenery is placed once, and set down ahead again and again. The milestones are placed once, and each removes itself when its job is done. Only the reinforcements are new planes, and each Squadron sends only what its row says, while there’s room.
And nobody counts anything they don’t own. A milestone reports. Game Rules decides what the report means. When the last one goes, Myth itself notices, with No Instances Left. One piece of Logic, three Squadrons: the Scene says which is which, and the table says how.
7.7 If It Didn’t Work
This chapter has many pieces, and most of them work out of sight. So run the game, and watch the sea first. Then the sky.
Press Play, and a window called Can’t run yet opens? Its message names the piece and what’s wrong with it, so fix that, and press Play again.
A piece of scenery leaves and never comes back? Open that piece and pick Logic. Move Ahead When Passed should be in its Attached Logic.
The scenery comes back too close, or piles up? Look at the If in Move Ahead When Passed, where the condition compares $furthestSceneryY with leadY, with a < between them.
The cloud doesn’t drift? Look for Drift Sideways in the Cloud Bank’s Logic, and check startDrifting, spelled the same in all three places.
The cloud drifts off one side and never comes back? Look at the two timer names. Start Recurring Timer’s driftTurn and the Event’s driftTurn must match, letter for letter.
Pale capsules float by while you fly? Those are the milestones. Look at Report Milestone’s Create Event, where Set Alpha should hold 0.
No reinforcements at all? Click each Squadron in the Scene Explorer. Its Kind must be spelled like a row in Reinforcement Orders, and like the Object it sends. Last, Stages belongs on Game Rules. Its stageReached starts everything.
The first group of reinforcements comes, and then no more? Look at the last three steps of the reinforcements timer’s Event. They belong below the whole Repeat, not inside it, and Start Recurring Timer’s Applies to should read Self.
Enemy Fighters come, but never Aces or bombers? Perhaps the Milestones aren’t placed, or not where the card says they go. Each one has to come into view for the stage to rise.
Planes shove each other sideways, or bounce? Look at their Colliders’ Tags and Interactions, on all three kinds.
Each of these is one fix. Make it, run the game again, and you’re back with the chapter. The catch-up download in the Goal is this chapter’s game, finished, if you’d like to compare.
Make the sea your own. Place a second Tropical Atoll the way you placed the first, anywhere ahead. Move Ahead When Passed takes care of it, with no new Logic. Or open Reinforcement Orders, and give Enemy Ace a fromStage of 1, so Aces come from the very start. How does the mission feel now? Put the row back, and take the extra atoll out, before Chapter 8.
Still stuck? Search the manual, or ask in the Myth Engine Discord (opens a new tab).
Your route is a long way from an empty sea. It counts its stages, sends its reinforcements, and keeps the islands coming, one stepping stone at a time. In Chapter 8, the sky starts leaving gifts behind.
