- Learn
- Tutorials
- Physics Labs
- Push Lab
- Appendices
- A Logic Reference
Appendix A — Logic Reference
Every Logic Component and Function in Push Lab - Discovery Workshop, as it is in the finished game. Each entry stands on its own: read what it does, see what it needs, and build it from its card into your own game. A card’s Shared Variables and Per Instance Variables are the values you can change. A Shared Variable holds one value for the whole Object, under Variables in its Properties. A Per Instance Variable holds one for each placement in the Scene.
A.1 Listen for Control Press
Built in Chapter 2, Place the carts.
Remembers the exact control pressed, before the pointer can move. Responses run in native Mouse Press Events.
Any Object- Timer Name
"controlInputReady"- Repeat Every (s)
0.02- Ring Once
Yes
- Script
Capture Control Press
- Script
Capture Control Press
A.2 Place Cart on Rail
Built in Chapter 2, Place the carts.
Place one exact cart along its rail with the pointer, release it from rest, or return it home.
Any ObjectCollider- Timer Name
"cartInputReady"- Repeat Every (s)
0.02- Ring Once
Yes
- Script
Capture Cart Press
self.pressSelected == true && dataFind("Workshop Weights","cart",-1) < 0- X Velocity
0- Y Velocity
0
- Component Value
self.collider.fixed- Value
true
- Event
While the Left Mouse Button Is Held- Mode
Holding
- Variable
handX- Value
valueMember(event.position,"x") - self.grabOffset
- X
clamp(self.handX, @self.leftLimit, @self.rightLimit)- Y
@self.laneY
- cart
self
- Event
While the Left Mouse Button Is Held- Mode
Released
- cart
self
- Event
While the Left Mouse Button Is Held- Mode
Released
- cart
self
- Event
While the Left Mouse Button Is Held- Mode
Released
- cart
self
- Event
While the Left Mouse Button Is Held- Mode
Released
- Script
Capture Cart Press
- cart
self- homeX
@self.homeX- laneY
@self.laneY
- Event
While the Left Mouse Button Is Held- Mode
Released
- cart
self- homeX
@self.homeX- laneY
@self.laneY
- Event
While the Left Mouse Button Is Held- Mode
Released
$detailsOpen- cart
self
- Event
While the Left Mouse Button Is Held- Mode
Released
A.3 Play Workshop Click (Function)
Built in Chapter 2, Place the carts.
Plays the quiet workshop click for an accepted input request. Reset, setup import and canceled hands stay silent.
accepted == true- Sound
Workshop Click
A.4 Release Cart (Function)
Built in Chapter 2, Place the carts.
Returns a held cart to native physics without throwing it. Released carts keep their existing velocity.
StructuraltransformTransformcolliderCollidercart.collider.fixed == true- Applies to
cart- X Velocity
0- Y Velocity
0
- Applies to
cart- Spin
0
- Applies to
cart- Component Value
cart.collider.fixed- Value
false
A.6 Return Cart Home (Function)
Built in Chapter 2, Place the carts.
Stops one cart and returns it to its chosen lane start without changing mass.
StructuraltransformTransformcolliderCollider- cart
cart
- Applies to
cart- X Velocity
0- Y Velocity
0
- Applies to
cart- X
homeX- Y
laneY
A.7 Apply Cart Impulse (Function)
Built in Chapter 3, Deliver an impulse.
Measures native mass and velocity, applies one signed impulse, then measures the immediate new velocity. Outputs describe this push, not later motion.
- Name
mass- Value
param:cart.transform.mass
- Name
before- Value
param:cart.transform.velocity.x
- Applies to
cart- Strength
impulse- Direction
0
- Name
after- Value
param:cart.transform.velocity.x
- mass
mass- before
before- after
after
A.8 Choose Impulse Direction
Built in Chapter 3, Deliver an impulse.
Click the lever to reverse the next push direction. Carts and old readings keep their current state.
Any Objectself.pressSelected == true- Variable
$impulseDirection- Operator
*=- Value
-1
- accepted
Yes
- Degrees
$impulseDirection * 24
- Degrees
$impulseDirection * 24
- Degrees
$impulseDirection * 24
A.9 Choose Next Impulse
Built in Chapter 3, Deliver an impulse.
Arrow keys choose the shared next impulse and its direction. End chooses the maximum; 0 chooses zero.
Any Object- magnitude
$impulseMagnitude + data("Impulse Settings","Shared","increment")
- magnitude
$impulseMagnitude - data("Impulse Settings","Shared","increment")
- magnitude
data("Impulse Settings","Shared","maximum")
- magnitude
0
- Variable
$impulseDirection- Value
-1
- Variable
$impulseDirection- Value
1
- magnitude
$impulseMagnitude
- magnitude
$impulseMagnitude
- magnitude
$impulseMagnitude
A.10 Identify Workshop Cart
Built in Chapter 3, Deliver an impulse.
Registers the first valid cart in each workshop slot once. A later copy never replaces an original that has disappeared.
Any ObjectCollider@self.cartNumber == 1 && $blueCartRegistered == false$blueCart.count == 0- Instance Set
$blueCart- To
self
$blueCart.count == 1- Variable
$blueCartRegistered- Value
true
@self.cartNumber == 2 && $copperCartRegistered == false$copperCart.count == 0- Instance Set
$copperCart- To
self
$copperCart.count == 1- Variable
$copperCartRegistered- Value
true
A.11 Open Workshop Readings
Built in Chapter 3, Deliver an impulse.
H or the bench Help control opens and closes the optional live readings and instructions without changing physics.
Any Objectself.pressSelected == trueA.12 Prepare Impulse Settings (Function)
Built in Chapter 3, Deliver an impulse.
Repairs a missing Shared tuning row or a nonpositive range/increment. A step larger than the range becomes one whole-range step.
- Action Name
sharedRow- Table
Impulse Settings- Row
"Shared"
sharedRow.valuedata("Impulse Settings","Shared","maximum") <= 0- Table
Impulse Settings- Row
"Shared"- Column
"maximum"- Value
40
data("Impulse Settings","Shared","increment") <= 0- Table
Impulse Settings- Row
"Shared"- Column
"increment"- Value
0.1
data("Impulse Settings","Shared","increment") > data("Impulse Settings","Shared","maximum")- Table
Impulse Settings- Row
"Shared"- Column
"increment"- Value
data("Impulse Settings","Shared","maximum")
- Action Name
addedRow- Table
Impulse Settings- Row
"Shared"- Values > maximum
40- Values > increment
0.1
A.14 Push Workshop Pair (Function)
Built in Chapter 3, Deliver an impulse.
Pushes the released original pair, records their immediate measurements, then checks that exact pair against the selected optional goal.
param:blue.count == 1 && param:copper.count == 1param:blue.collider.fixed == false && param:copper.collider.fixed == false && dataFind("Workshop Weights","cart",-1) < 0- Action Name
bluePush- cart
blue- impulse
blueImpulse
- Variable
$blueMass- Value
bluePush.mass
- Variable
$blueBefore- Value
bluePush.before
- Variable
$blueAfter- Value
bluePush.after
- Variable
$blueAppliedImpulse- Value
blueImpulse
- Variable
$blueDelta- Value
$blueAfter - $blueBefore
- Action Name
copperPush- cart
copper- impulse
copperImpulse
- Variable
$copperMass- Value
copperPush.mass
- Variable
$copperBefore- Value
copperPush.before
- Variable
$copperAfter- Value
copperPush.after
- Variable
$copperAppliedImpulse- Value
copperImpulse
- Variable
$copperDelta- Value
$copperAfter - $copperBefore
- Variable
$blueReadingValid- Value
true
- Variable
$copperReadingValid- Value
true
- Variable
$pushBatch- Operator
+=- Value
1
- Variable
$pushStatus- Value
'Impulse applied to both carts.'
- accepted
Yes
- Variable
$pushStatus- Value
'Release the apparatus before pushing.'
- Variable
$pushStatus- Value
'Both workshop carts are needed for Push Both.'
A.15 Request Pair Push
Built in Chapter 3, Deliver an impulse.
Routes keyboard and button push requests to the exact workshop pair, with a visible missing-cart response.
Any ObjectA.17 Set Reading Visibility (Function)
Built in Chapter 3, Deliver an impulse.
Shows a genuine measured push only in the optional reading sheet; zero impulse is a measurement, the opening workshop is not.
$inspectedPush == 0 && ($detailsOpen && $pushBatch > 0 && valid)- Applies to
caption- Visible
true
- Applies to
caption- Visible
false
A.18 Show Measured Reading
Built in Chapter 3, Deliver an impulse.
Refreshes measurement visibility when the workshop opens, captures a push or finishes Load.
Any Object- caption
self- valid
(@self.readingCartNumber == 1 && $blueReadingValid) || (@self.readingCartNumber == 2 && $copperReadingValid)
- caption
self- valid
(@self.readingCartNumber == 1 && $blueReadingValid) || (@self.readingCartNumber == 2 && $copperReadingValid)
- caption
self- valid
(@self.readingCartNumber == 1 && $blueReadingValid) || (@self.readingCartNumber == 2 && $copperReadingValid)
- caption
self- valid
(@self.readingCartNumber == 1 && $blueReadingValid) || (@self.readingCartNumber == 2 && $copperReadingValid)
- caption
self- valid
(@self.readingCartNumber == 1 && $blueReadingValid) || (@self.readingCartNumber == 2 && $copperReadingValid)
- caption
self- valid
(@self.readingCartNumber == 1 && $blueReadingValid) || (@self.readingCartNumber == 2 && $copperReadingValid)
- caption
self- valid
(@self.readingCartNumber == 1 && $blueReadingValid) || (@self.readingCartNumber == 2 && $copperReadingValid)
A.19 Show Workshop Detail
Built in Chapter 3, Deliver an impulse.
Shows either a bench label or a reading-sheet element in its chosen view.
Any Object- Visible
$detailsOpen == @self.showOnOpen
- Visible
$detailsOpen == @self.showOnOpen
- Visible
$detailsOpen == @self.showOnOpen
A.20 Toggle Workshop Readings (Function)
Built in Chapter 3, Deliver an impulse.
Toggles only the saved reading-sheet view. The experiment continues unchanged.
$detailsOpen- Variable
$detailsOpen- Value
false
- Variable
$detailsOpen- Value
true
$detailsOpen- Variable
$inspectedPush- Value
0
A.21 Turn Impulse Dial
Built in Chapter 3, Deliver an impulse.
Drag the dial horizontally to select from zero to the tuned maximum (40 N s by default). Release, cancellation, focus loss and Load end the hand.
Any Objectself.pressSelected == true- magnitude
(valueMember(event.position,"x") - @self.dialLeft) / @self.dialWidth * data("Impulse Settings","Shared","maximum")
- Event
When the Left Mouse Button Is Pressed- Mode
Turning
- magnitude
(valueMember(event.position,"x") - @self.dialLeft) / @self.dialWidth * data("Impulse Settings","Shared","maximum")
- Event
When the Left Mouse Button Is Pressed- Mode
Released
- Event
When the Left Mouse Button Is Pressed- Mode
Released
- Event
When the Left Mouse Button Is Pressed- Mode
Released
- Event
When the Left Mouse Button Is Pressed- Mode
Released
- Degrees
135 - $impulseMagnitude / data("Impulse Settings","Shared","maximum") * 270
- Degrees
135 - $impulseMagnitude / data("Impulse Settings","Shared","maximum") * 270
- Degrees
135 - $impulseMagnitude / data("Impulse Settings","Shared","maximum") * 270
$detailsOpen == false && (abs(valueMember(event.position,"x") - self.transform.position.x) <= @self.dialWidth / 2 && abs(valueMember(event.position,"y") - self.transform.position.y) <= @self.dialWidth / 2)- magnitude
$impulseMagnitude + 5 * data("Impulse Settings","Shared","increment")
$detailsOpen == false && (abs(valueMember(event.position,"x") - self.transform.position.x) <= @self.dialWidth / 2 && abs(valueMember(event.position,"y") - self.transform.position.y) <= @self.dialWidth / 2)- magnitude
$impulseMagnitude - 5 * data("Impulse Settings","Shared","increment")
- Degrees
135 - $impulseMagnitude / data("Impulse Settings","Shared","maximum") * 270
$detailsOpen- Event
When the Left Mouse Button Is Pressed- Mode
Released
- Event
When the Left Mouse Button Is Pressed- Mode
Released
- Event
When the Left Mouse Button Is Pressed- Mode
Released
A.22 Calculate Cart Load (Function)
Built in Chapter 4, Load and measure.
Returns the base cart mass plus registered weights attached to cartNumber. A nonpositive base uses 1 kg. Callers decide whether to retain motion or start a new comparison.
- Name
loadedMass- Value
baseMass
loadedMass <= 0- Variable
loadedMass- Value
1
- Table
Workshop Weights- Variable Name
"load"
load.cart == cartNumber- Variable
loadedMass- Operator
+=- Value
load.mass
- Value
loadedMass
A.23 Calibrate Recorded Gauge (Function)
Built in Chapter 4, Load and measure.
Chooses the scale for one real paired observation, or the selected starting impulse when no observation exists. This never changes motion or a measurement.
- Name
observedSpeed- Value
0
cartNumber == 1$pushBatch > 0- Variable
observedSpeed- Value
max(abs($blueBefore), abs($blueAfter))
- Variable
observedSpeed- Value
$impulseMagnitude / max(0.001, $blueCart.transform.mass)
$pushBatch > 0- Variable
observedSpeed- Value
max(abs($copperBefore), abs($copperAfter))
$copperImpulseLinked- Variable
observedSpeed- Value
$impulseMagnitude / max(0.001, $copperCart.transform.mass)
- Variable
observedSpeed- Value
$copperNextImpulse / max(0.001, $copperCart.transform.mass)
- Action Name
recordedScale- speed
observedSpeed- minimumRange
minimumRange- headroom
headroom
- Value
recordedScale.value
A.24 Change Native Cart Load
Built in Chapter 4, Load and measure.
Changes this exact native cart mass and stops its affected comparison; the other cart and historical records stay unchanged.
Any Object- Action Name
changedMass- cartNumber
@self.cartNumber- baseMass
@self.baseMass
- Component Value
self.transform.mass- Value
changedMass.value
- X Velocity
0- Y Velocity
0
@self.cartNumber == 1- Variable
$blueReadingValid- Value
false
- Variable
$copperReadingValid- Value
false
A.25 Choose Gauge Calibration (Function)
Built in Chapter 4, Load and measure.
Chooses a signed velocity scale from the readable 1, 2, 5 sequence, with headroom above the measured speed. All inputs and the result are m/s except the headroom ratio.
- Name
wantedRange- Value
max(0.5, minimumRange, abs(speed) * max(1, headroom))
- Name
decade- Value
pow(10, floor(log(wantedRange) / log(10)))
- Name
calibration- Value
decade
calibration < wantedRange - 0.000000001- Variable
calibration- Value
decade * 2
calibration < wantedRange - 0.000000001- Variable
calibration- Value
decade * 5
calibration < wantedRange - 0.000000001- Variable
calibration- Value
decade * 10
- Value
calibration
A.26 Choose Historical Ticket
Built in Chapter 4, Load and measure.
T opens the oldest pinned reading, then cycles through the retained three. H closes the sheet; reopening Help returns to the latest page.
Any ObjectdataCount("Push Readings") > 0- Name
ticketIndex- Value
dataFind("Push Readings","batch",$inspectedPush) + 1
ticketIndex < max(0,dataCount("Push Readings") - 3) || ticketIndex >= dataCount("Push Readings")- Variable
ticketIndex- Value
max(0,dataCount("Push Readings") - 3)
- batch
data("Push Readings",ticketIndex,"batch")
A.27 Choose Next Weight
Built in Chapter 4, Load and measure.
N selects the next remaining generated weight in creation order using Workshop Weights, wrapping at the end. Destroy removes a weight from the list; Load restores it. An empty bench gives clear feedback.
Any Object- Name
nextNumber- Value
0
- Name
firstNumber- Value
0
- Table
Workshop Weights- Variable Name
"weight"
- Name
candidateNumber- Value
weight.number
firstNumber == 0 || candidateNumber < firstNumber- Variable
firstNumber- Value
candidateNumber
candidateNumber > $selectedWeightNumbernextNumber == 0 || candidateNumber < nextNumber- Variable
nextNumber- Value
candidateNumber
nextNumber > 0- Variable
$selectedWeightNumber- Value
nextNumber
- Variable
$selectedWeightNumber- Value
firstNumber
firstNumber == 0- Variable
$pushStatus- Value
'No workshop weights remain.'
A.28 Drag Workshop Weight
Built in Chapter 4, Load and measure.
Grabs the exact weight with its pointer offset. A held weight leaves its old load; release chooses the nearest available seat, and interruptions restore the previous place.
Any Objectself.pressSelected == true && dataFind("Workshop Weights","cart",-1) < 0 && ($blueCart.count == 0 || $blueCart.collider.fixed == false) && ($copperCart.count == 0 || $copperCart.collider.fixed == false)- Variable
previousCart- Value
data("Workshop Weights","Weight " + self.weightNumber,"cart")
- Variable
previousSeat- Value
data("Workshop Weights","Weight " + self.weightNumber,"seat")
- Name
startX- Value
self.transform.position.x
- Name
startY- Value
self.transform.position.y
- Action Name
transferWorkshopWeightResult- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
0
- Table
Workshop Weights- Row
"Weight " + self.weightNumber- Column
"cart"- Value
-1
- X
startX- Y
startY
- Event
While the Left Mouse Button Is Held- Mode
Holding
- X
clamp(valueMember(event.position,"x") - self.weightGrabOffsetX,.6,23.4)- Y
clamp(valueMember(event.position,"y") - self.weightGrabOffsetY,.6,15.4)
data("Workshop Weights","Weight " + self.weightNumber,"cart") == -1- Name
dropCart- Value
0
- Name
dropSeat- Value
0
$blueCart.count == 1 && abs(valueMember(event.position,"x") - $blueCart.transform.position.x) < data("Cart Load Settings","cart","dropHalfWidth") && abs(valueMember(event.position,"y") - $blueCart.transform.position.y - data("Cart Load Settings","cart","dropRise")) < data("Cart Load Settings","cart","dropHalfHeight")- Variable
dropCart- Value
1
- Variable
dropSeat- Value
clamp(round((valueMember(event.position,"x") - $blueCart.transform.position.x - data("Cart Load Settings","cart","firstSeatX")) / data("Cart Load Settings","cart","spacing")) + 1,1,data("Cart Load Settings","cart","capacity"))
$copperCart.count == 1 && abs(valueMember(event.position,"x") - $copperCart.transform.position.x) < data("Cart Load Settings","cart","dropHalfWidth") && abs(valueMember(event.position,"y") - $copperCart.transform.position.y - data("Cart Load Settings","cart","dropRise")) < data("Cart Load Settings","cart","dropHalfHeight")- Variable
dropCart- Value
2
- Variable
dropSeat- Value
clamp(round((valueMember(event.position,"x") - $copperCart.transform.position.x - data("Cart Load Settings","cart","firstSeatX")) / data("Cart Load Settings","cart","spacing")) + 1,1,data("Cart Load Settings","cart","capacity"))
- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
dropCart- preferredSeat
dropSeat- previousCart
self.previousCart- previousSeat
self.previousSeat- playClick
Yes
- Variable
$selectedWeightNumber- Value
self.weightNumber
- Event
While the Left Mouse Button Is Held- Mode
Released
- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
self.previousCart- preferredSeat
self.previousSeat- previousCart
self.previousCart- previousSeat
self.previousSeat- playClick
No
- Event
While the Left Mouse Button Is Held- Mode
Released
- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
self.previousCart- preferredSeat
self.previousSeat- previousCart
self.previousCart- previousSeat
self.previousSeat- playClick
No
- Event
While the Left Mouse Button Is Held- Mode
Released
- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
self.previousCart- preferredSeat
self.previousSeat- previousCart
self.previousCart- previousSeat
self.previousSeat- playClick
No
- Event
While the Left Mouse Button Is Held- Mode
Released
- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
self.previousCart- preferredSeat
self.previousSeat- previousCart
self.previousCart- previousSeat
self.previousSeat- playClick
No
- Event
While the Left Mouse Button Is Held- Mode
Released
- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
self.previousCart- preferredSeat
self.previousSeat- previousCart
self.previousCart- previousSeat
self.previousSeat- playClick
No
- Event
While the Left Mouse Button Is Held- Mode
Released
$detailsOpen- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
self.previousCart- preferredSeat
self.previousSeat- previousCart
self.previousCart- previousSeat
self.previousSeat- playClick
No
- Event
While the Left Mouse Button Is Held- Mode
Released
A.29 Follow Native Velocity
Built in Chapter 4, Load and measure.
Shows one exact workshop cart's signed native velocity on its stationary calibrated instrument face. Native Text shows live speed and scale values; only its named needle rotates. Reads continuously because native velocity changes continuously.
Any ObjectSprite@self.cartNumber == 1- Action Name
followBlueCalibration- cart
$blueCart- gauge
self- oldRange
self.gaugeRange- minimumRange
@self.minimumRange- needleSweep
@self.needleSweep- headroom
@self.scaleHeadroom
- Variable
gaugeRange- Value
followBlueCalibration.value
- Action Name
followCopperCalibration- cart
$copperCart- gauge
self- oldRange
self.gaugeRange- minimumRange
@self.minimumRange- needleSweep
@self.needleSweep- headroom
@self.scaleHeadroom
- Variable
gaugeRange- Value
followCopperCalibration.value
- Action Name
calibrateOpeningScale- cartNumber
@self.cartNumber- minimumRange
@self.minimumRange- headroom
@self.scaleHeadroom
- Variable
gaugeRange- Value
calibrateOpeningScale.value
- Action Name
calibratePushScale- cartNumber
@self.cartNumber- minimumRange
@self.minimumRange- headroom
@self.scaleHeadroom
- Variable
gaugeRange- Value
calibratePushScale.value
A.30 Inspect Recorded Push (Function)
Built in Chapter 4, Load and measure.
Opens the retained push identified by its batch number. Missing or trimmed rows leave the current sheet unchanged.
- Action Name
recordedPush- Table
Push Readings- Row
"Push " + batch
recordedPush.value- Variable
$inspectedPush- Value
batch
- Variable
$detailsOpen- Value
true
A.31 Move Selected Weight
Built in Chapter 4, Load and measure.
Moves this weight only when its saved number is selected. Keys 1 and 2 choose a cart; Delete returns it to the rack.
Any ObjectSprite$selectedWeightNumber > 0 && $selectedWeightNumber == self.weightNumber && dataFind("Workshop Weights","cart",-1) < 0- Action Name
blueWeightRequest1- weight
self- number
self.weightNumber- destination
1- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight
- accepted
blueWeightRequest1.value
$selectedWeightNumber > 0 && $selectedWeightNumber == self.weightNumber && dataFind("Workshop Weights","cart",-1) < 0- Action Name
copperWeightRequest2- weight
self- number
self.weightNumber- destination
2- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight
- accepted
copperWeightRequest2.value
$selectedWeightNumber > 0 && $selectedWeightNumber == self.weightNumber && dataFind("Workshop Weights","cart",-1) < 0- Action Name
rackWeightRequest3- weight
self- number
self.weightNumber- destination
0- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight
- accepted
rackWeightRequest3.value
- Name
oldCart- Value
data("Workshop Weights","Weight " + self.weightNumber,"cart")
- Action Name
addedRow- Operation
Remove- Table
Workshop Weights- Row
"Weight " + self.weightNumber
oldCart == 1- Applies to
$blueCart- Custom Event
cartLoadChanged
oldCart == 2- Applies to
$copperCart- Custom Event
cartLoadChanged
A.32 Place Weight From Hand (Function)
Built in Chapter 4, Load and measure.
Places a released weight at its requested seat or restores its previous place. Only a deliberate drop opts into the quiet click; interruption recovery is silent.
data("Workshop Weights","Weight " + number,"cart") == -1- Action Name
placedWeightRequest1- weight
weight- number
number- destination
destination- rackX
rackX- rackY
rackY- height
height- preferredSeat
preferredSeat
- accepted
placedWeightRequest1.value && playClick
data("Workshop Weights","Weight " + number,"cart") == -1- Action Name
placedWeightRequest2- weight
weight- number
number- destination
previousCart- rackX
rackX- rackY
rackY- height
height- preferredSeat
previousSeat
- accepted
placedWeightRequest2.value && playClick
data("Workshop Weights","Weight " + number,"cart") == -1- Action Name
rackWeightRequest3- weight
weight- number
number- destination
0- rackX
rackX- rackY
rackY- height
height- preferredSeat
0
- accepted
rackWeightRequest3.value && playClick
A.33 Prepare Reading Tickets
Built in Chapter 4, Load and measure.
Creates the three regularly spaced paper controls once. Native Load restores them and their saved slot identities without creating more.
Any Object3times- Variable
$preparingTicketSlot- Value
local.index + 1
- Object to Create
data("Reading Ticket Settings","papers","object")- X
data("Reading Ticket Settings","papers","firstX") + data("Reading Ticket Settings","papers","spacing") * local.index- Y
data("Reading Ticket Settings","papers","paperY")
A.34 Prepare Workshop Weights
Built in Chapter 4, Load and measure.
Starts the workshop weight pattern once after the placed exact carts have registered. Saved generated weights are restored by native Load, so Load never generates a second set.
Any Object- Timer Name
"weightPatternReady"- Repeat Every (s)
0.02- Ring Once
Yes
- Action Name
seatSettings- Table
Cart Load Settings- Row
"cart"
seatSettings.value- Table
Cart Load Settings- Row
"cart"- Column
"capacity"- Value
round(data("Cart Load Settings","cart","capacity"))
data("Cart Load Settings","cart","capacity") < 1- Table
Cart Load Settings- Row
"cart"- Column
"capacity"- Value
1
data("Cart Load Settings","cart","capacity") > 4- Table
Cart Load Settings- Row
"cart"- Column
"capacity"- Value
4
- Action Name
addedRow- Table
Cart Load Settings- Row
"cart"- Values > capacity
4- Values > firstSeatX
-1.125- Values > spacing
0.75- Values > cartTop
0.35- Values > dropHalfWidth
2.1- Values > dropHalfHeight
1.3- Values > dropRise
0.7
- Name
seatsUsed- Value
0
- Table
Weight Pattern- Variable Name
"denomination"
- Name
copyCount- Value
round(denomination.copies)
copyCount < 0- Variable
copyCount- Value
0
copyCount > @self.stackCopyLimit- Variable
copyCount- Value
@self.stackCopyLimit
- Table
Weight Pattern- Row
denomination.index- Column
"copies"- Value
copyCount
- Name
placedCount- Value
0
- Name
loadCount- Value
round(denomination.initialCopper)
loadCount < 0- Variable
loadCount- Value
0
loadCount > copyCount- Variable
loadCount- Value
copyCount
loadCount > data("Cart Load Settings","cart","capacity") - seatsUsed- Variable
loadCount- Value
data("Cart Load Settings","cart","capacity") - seatsUsed
denomination.mass <= 0- Table
Weight Pattern- Row
denomination.index- Column
"mass"- Value
1
denomination.copiestimes- Variable
$preparingWeightMass- Value
denomination.mass
- Variable
$preparingRackX- Value
denomination.rackX
- Variable
$preparingRackY- Value
denomination.rackY + (copyCount - 1 - local.index) * denomination.stackRise
- Variable
$preparingHeight- Value
denomination.height
- Object to Create
denomination.object- X
denomination.rackX- Y
denomination.rackY + (copyCount - 1 - local.index) * denomination.stackRise- Variable Name
newWeight
- Action Name
weightExists- Applies to
newWeight
weightExists.value && local.index < loadCount && $copperCart.count == 1- Applies to
newWeight- Parent
$copperCart- Keep World Position
No- Local X
data("Cart Load Settings","cart","firstSeatX") + seatsUsed * data("Cart Load Settings","cart","spacing")- Local Y
data("Cart Load Settings","cart","cartTop") + denomination.height / 2- Destroy with Parent
No
- Table
Workshop Weights- Row
"Weight " + $weightCount- Column
"cart"- Value
2
- Table
Workshop Weights- Row
"Weight " + $weightCount- Column
"seat"- Value
seatsUsed + 1
- Variable
seatsUsed- Operator
+=- Value
1
- Variable
placedCount- Operator
+=- Value
1
weightExists.value == false- Variable
$pushStatus- Value
'A weight is unavailable; check Weight Pattern.'
- Table
Weight Pattern- Row
denomination.index- Column
"initialCopper"- Value
placedCount
- Custom Event
weightsPrepared
A.35 Read Latest Print
Built in Chapter 4, Load and measure.
Prints the latest retained numerical measurement on the printer paper; an exact press opens its optional enlarged reading.
Any Object- Visible
$detailsOpen == false && dataCount("Push Readings") > 0
- Visible
$detailsOpen == false && dataCount("Push Readings") > 0
- Visible
$detailsOpen == false && dataCount("Push Readings") > 0
- Visible
$detailsOpen == false && dataCount("Push Readings") > 0
self.pressSelected == true$detailsOpen == false && dataCount("Push Readings") > 0- batch
data("Push Readings",dataCount("Push Readings") - 1,"batch")
- Visible
$detailsOpen == false && dataCount("Push Readings") > 0
A.36 Read Pinned Ticket
Built in Chapter 4, Load and measure.
Prints one of the three newest immutable numerical measurements on its pinned paper; an exact press opens its optional enlarged reading.
Any Object- Variable
ticketSlot- Value
$preparingTicketSlot
- Depth Amount
25
- Visible
$detailsOpen == false && self.ticketSlot <= dataCount("Push Readings")
- Visible
$detailsOpen == false && self.ticketSlot <= dataCount("Push Readings")
- Visible
$detailsOpen == false && self.ticketSlot <= dataCount("Push Readings")
- Visible
$detailsOpen == false && self.ticketSlot <= dataCount("Push Readings")
self.pressSelected == true$detailsOpen == false && self.ticketSlot <= dataCount("Push Readings")- batch
data("Push Readings",max(0,dataCount("Push Readings") - 3) + self.ticketSlot - 1,"batch")
- Visible
$detailsOpen == false && self.ticketSlot <= dataCount("Push Readings")
A.37 Record Pair Reading (Function)
Built in Chapter 4, Load and measure.
Records one complete pair measurement, trims the oldest excess rows and reports how many are kept. Project Global readingCapacity (default 40) takes effect on the next accepted push.
$readingCapacity < 1- Variable
$readingCapacity- Value
1
- Variable
$readingCapacity- Value
round($readingCapacity)
- Action Name
addedRow- Table
Push Readings- Row
"Push " + $pushBatch- Values > batch
$pushBatch- Values > blueMass
$blueMass- Values > blueAppliedImpulse
$blueAppliedImpulse- Values > blueBefore
$blueBefore- Values > blueAfter
$blueAfter- Values > blueDelta
$blueDelta- Values > copperMass
$copperMass- Values > copperAppliedImpulse
$copperAppliedImpulse- Values > copperBefore
$copperBefore- Values > copperAfter
$copperAfter- Values > copperDelta
$copperDelta
dataCount("Push Readings") > $readingCapacitydataCount("Push Readings") - $readingCapacitytimes- Action Name
addedRow2- Operation
Remove- Table
Push Readings- Row
0
- Variable
$pushStatus- Value
"Impulse " + $pushBatch + " recorded (" + dataCount("Push Readings") + " kept)."
A.38 Select Workshop Weight
Built in Chapter 4, Load and measure.
Selects the exact pressed generated weight and shows the same saved selection on the bench. Selection does not change cart mass, motion or readings.
Any ObjectSprite- Variable
$weightCount- Operator
+=- Value
1
- Variable
weightNumber- Value
$weightCount
- Action Name
addedRow- Table
Workshop Weights- Row
"Weight " + self.weightNumber- Values > number
self.weightNumber- Values > cart
0- Values > seat
0- Values > mass
$preparingWeightMass
- Variable
rackX- Value
$preparingRackX
- Variable
rackY- Value
$preparingRackY
- Variable
weightHeight- Value
$preparingHeight
self.pressSelected == true- Variable
$selectedWeightNumber- Value
self.weightNumber
- weight
self- number
self.weightNumber- mass
data("Workshop Weights","Weight " + self.weightNumber,"mass")
- weight
self- number
self.weightNumber- mass
data("Workshop Weights","Weight " + self.weightNumber,"mass")
$selectedWeightNumber == self.weightNumber- Variable
$selectedWeightNumber- Value
0
- Variable
$pushStatus- Value
'Selected weight removed. N selects another weight.'
A.39 Set Starting Cart Load
Built in Chapter 4, Load and measure.
Derives native mass from baseMass and the saved live load arrangement at opening and after Load; keeps restored velocity.
Any Object- Action Name
startingMass- cartNumber
@self.cartNumber- baseMass
@self.baseMass
- Component Value
self.transform.mass- Value
startingMass.value
- Action Name
restoredMass- cartNumber
@self.cartNumber- baseMass
@self.baseMass
- Component Value
self.transform.mass- Value
restoredMass.value
A.40 Show Reading Page
Built in Chapter 4, Load and measure.
Shows a latest-page or historical-page caption inside the optional reading sheet. historyPage chooses the historical page.
Any Object- Visible
$detailsOpen && $inspectedPush >= 0 && (($inspectedPush > 0) == @self.historyPage)
- Visible
$detailsOpen && $inspectedPush >= 0 && (($inspectedPush > 0) == @self.historyPage)
- Visible
$detailsOpen && $inspectedPush >= 0 && (($inspectedPush > 0) == @self.historyPage)
- Visible
$detailsOpen && $inspectedPush >= 0 && (($inspectedPush > 0) == @self.historyPage)
A.41 Show Weight Selection (Function)
Built in Chapter 4, Load and measure.
Shows one saved weight selection with a tunable Sprite tint and native status caption.
StructuraltransformTransformspriteSprite$selectedWeightNumber == number && number > 0- Applies to
weight- Component Value
weight.sprite.tint- Value
selectedTint
- Variable
$pushStatus- Value
"Selected " + mass + " kg weight " + number + "."
- Applies to
weight- Component Value
weight.sprite.tint- Value
"#ffffff"
A.42 Transfer Workshop Weight (Function)
Built in Chapter 4, Load and measure.
Moves the exact weight to its requested cart or original rack place. A free preferred seat wins; otherwise the first free seat is used. Full or missing destinations leave its current place unchanged. Returns whether the requested placement was accepted; callers choose the feedback.
- Name
accepted- Type
Boolean- Value
false
- Name
oldCart- Value
data("Workshop Weights","Weight " + number,"cart")
- Name
freeSeat- Value
0
- Name
seatCount- Value
round(data("Cart Load Settings","cart","capacity"))
destination == 0- Variable
freeSeat- Value
-1
seatCounttimes- Name
candidateSeat- Value
local.index + 1
- Name
occupied- Value
0
- Table
Workshop Weights- Variable Name
"occupant"
occupant.cart == destination && occupant.seat == candidateSeat- Variable
occupied- Value
1
occupied == 0 && (freeSeat == 0 || candidateSeat == preferredSeat)- Variable
freeSeat- Value
candidateSeat
oldCart == destination- Variable
$pushStatus- Value
'That weight is already there.'
- Variable
accepted- Value
true
freeSeat != 0 && (destination == 0 || (destination == 1 && $blueCart.count == 1) || (destination == 2 && $copperCart.count == 1))- Applies to
weight
destination == 0- Applies to
weight- X
rackX- Y
rackY
destination == 1- Applies to
weight- Parent
$blueCart- Keep World Position
false- Local X
data("Cart Load Settings","cart","firstSeatX") + (freeSeat - 1) * data("Cart Load Settings","cart","spacing")- Local Y
data("Cart Load Settings","cart","cartTop") + height / 2- Destroy with Parent
false
- Applies to
weight- Parent
$copperCart- Keep World Position
false- Local X
data("Cart Load Settings","cart","firstSeatX") + (freeSeat - 1) * data("Cart Load Settings","cart","spacing")- Local Y
data("Cart Load Settings","cart","cartTop") + height / 2- Destroy with Parent
false
- Table
Workshop Weights- Row
"Weight " + number- Column
"cart"- Value
destination
destination == 0- Table
Workshop Weights- Row
"Weight " + number- Column
"seat"- Value
0
- Table
Workshop Weights- Row
"Weight " + number- Column
"seat"- Value
freeSeat
oldCart == 1- Applies to
$blueCart- Custom Event
cartLoadChanged
oldCart == 2- Applies to
$copperCart- Custom Event
cartLoadChanged
destination == 1- Applies to
$blueCart- Custom Event
cartLoadChanged
destination == 2- Applies to
$copperCart- Custom Event
cartLoadChanged
- Variable
$pushStatus- Value
'Load changed. Push for a fresh comparison.'
- Variable
accepted- Value
true
- Variable
$pushStatus- Value
'That cart is full or unavailable.'
- Value
accepted
A.43 Update Velocity Gauge (Function)
Built in Chapter 4, Load and measure.
Updates one live velocity instrument from an exact native cart, preserving historical readings. Calibration and speed are m/s; needleSweep is degrees.
StructuraltransformTransformspriteSprite- Name
calibration- Value
oldRange
- Action Name
cartExists- Applies to
cart
cartExists.value- Applies to
gauge- Visible
$detailsOpen == false
calibration < minimumRange- Variable
calibration- Value
minimumRange
calibration <= 0- Variable
calibration- Value
1
abs(param:cart.transform.velocity.x) > calibration- Action Name
expandedScale- speed
param:cart.transform.velocity.x- minimumRange
minimumRange- headroom
headroom
- Variable
calibration- Value
expandedScale.value
- Component Value
gauge.sprite.transform.rotation.z- Value
-param:cart.transform.velocity.x / calibration * needleSweep
- Applies to
gauge- Visible
false
- Value
calibration
A.44 Validate Inspected Push (Function)
Built in Chapter 4, Load and measure.
Returns to the latest reading if the inspected historical row was removed or trimmed.
$inspectedPush > 0- Action Name
inspectedRow- Table
Push Readings- Row
"Push " + $inspectedPush
inspectedRow.value == false- Variable
$inspectedPush- Value
0
A.45 Apply Starting Setup (Function)
Built in Chapter 5, Compare and remix.
Validates every imported field before returning from rest and restoring arrangement/controls. Values must survive numeric staging unchanged; incomplete or incompatible files leave the apparatus unchanged.
- Table
Starting Setup Values- Row
"weightCount"- Column
"maximum"- Value
dataCount("Workshop Weights")
- Variable
$setupEmptyFields- Value
1
- Script
Check Setup Fields
- Name
setupValid- Type
Boolean- Value
$setupEmptyFields == 0
- Table
Starting Setup Values- Variable Name
"setupField"
- Action Name
setupValue- Key
"pushSetup." + setupField.name- Default
-999
- Name
fieldValue- Value
setupValue.value
- Table
Starting Setup Values- Row
setupField.name- Column
"value"- Value
fieldValue
setupValue.value != fieldValue || (fieldValue < setupField.minimum || fieldValue > setupField.maximum)- Variable
setupValid- Value
false
data("Starting Setup Values","weightCount","value") != dataCount("Workshop Weights") || data("Starting Setup Values","maximum","value") != data("Impulse Settings","Shared","maximum") || data("Starting Setup Values","increment","value") != data("Impulse Settings","Shared","increment") || data("Starting Setup Values","capacity","value") != data("Cart Load Settings","cart","capacity")- Variable
setupValid- Value
false
(data("Starting Setup Values","impulseDirection","value") != -1 && data("Starting Setup Values","impulseDirection","value") != 1) || (data("Starting Setup Values","copperLinked","value") != 0 && data("Starting Setup Values","copperLinked","value") != 1) || data("Starting Setup Values","impulseMagnitude","value") > data("Starting Setup Values","maximum","value") || abs(data("Starting Setup Values","copperImpulse","value")) > data("Starting Setup Values","maximum","value")- Variable
setupValid- Value
false
- Table
Starting Weight Setup
- Table
Workshop Weights- Variable Name
"openWeight"
- Action Name
addedRow- Table
Starting Weight Setup- Row
openWeight.name- Values > number
openWeight.number
- Action Name
loadedcart- Key
"pushSetup.weight." + openWeight.number + ".cart"- Default
-999
- Table
Starting Weight Setup- Row
openWeight.name- Column
"cart"- Value
loadedcart.value
loadedcart.value != data("Starting Weight Setup",openWeight.name,"cart")- Variable
setupValid- Value
false
- Action Name
loadedseat- Key
"pushSetup.weight." + openWeight.number + ".seat"- Default
-999
- Table
Starting Weight Setup- Row
openWeight.name- Column
"seat"- Value
loadedseat.value
loadedseat.value != data("Starting Weight Setup",openWeight.name,"seat")- Variable
setupValid- Value
false
- Action Name
loadedmass- Key
"pushSetup.weight." + openWeight.number + ".mass"- Default
-999
- Table
Starting Weight Setup- Row
openWeight.name- Column
"mass"- Value
loadedmass.value
loadedmass.value != data("Starting Weight Setup",openWeight.name,"mass")- Variable
setupValid- Value
false
- Table
Starting Weight Setup- Variable Name
"checkWeight"
- Name
cart- Value
checkWeight.cart
- Name
seat- Value
checkWeight.seat
cart != round(cart) || cart < 0 || cart > 2 || seat != round(seat) || (cart == 0 && seat != 0) || (cart > 0 && (seat < 1 || seat > data("Starting Setup Values","capacity","value"))) || checkWeight.mass != data("Workshop Weights",checkWeight.name,"mass")- Variable
setupValid- Value
false
- Name
seatUses- Value
0
- Table
Starting Weight Setup- Variable Name
"otherWeight"
cart > 0 && otherWeight.cart == cart && otherWeight.seat == seat- Variable
seatUses- Operator
+=- Value
1
cart > 0 && seatUses != 1- Variable
setupValid- Value
false
setupValid && $blueCart.count == 1 && $copperCart.count == 1- Custom Event
setupWeightsToRack
- Custom Event
setupWeightsToSeats
- Custom Event
setupCartPosition
- Variable
$impulseMagnitude- Value
data("Starting Setup Values","impulseMagnitude","value")
- Variable
$impulseDirection- Value
data("Starting Setup Values","impulseDirection","value")
- Variable
$copperNextImpulse- Value
data("Starting Setup Values","copperImpulse","value")
- Variable
$copperImpulseLinked- Value
data("Starting Setup Values","copperLinked","value") == 1
- Variable
$setupStatus- Value
'Setup opened from rest. Previous observations cleared.'
- Variable
$setupStatus- Value
'Setup does not match this project or is incomplete. Nothing changed.'
A.46 Choose Copper Impulse
Built in Chapter 5, Compare and remix.
V stores the selected dial and lever value for Copper; L links both carts to the dial again. These controls change only the next push.
Any ObjectA.47 Choose Workshop Goal
Built in Chapter 5, Compare and remix.
C chooses Match, B chooses Brake, G chooses Target, X clears the goal and O opens its optional page. Each recorded push checks the selected task before the next push.
Any Object- goal
"Match"
- goal
"Brake"
- goal
"Target"
A.48 Clear Workshop Goal (Function)
Built in Chapter 5, Compare and remix.
Ends optional observation without changing settings, measurements or motion.
- Variable
$workshopGoal- Value
""
- Variable
$goalResult- Value
""
- Variable
$goalStartBatch- Value
$pushBatch
A.49 Complete Workshop Goal (Function)
Built in Chapter 5, Compare and remix.
Keeps the selected optional goal complete while later exploration continues.
- Variable
$goalResult- Value
'Complete'
A.50 Evaluate Workshop Goal (Function)
Built in Chapter 5, Compare and remix.
Reads one fresh paired impulse snapshot. Match compares velocity changes, Brake requires an opposing impulse, and Target uses the immediate signed after-speed. Later native motion cannot create a success.
$goalResult == "Waiting" && $pushBatch > $goalStartBatch && $blueReadingValid && $copperReadingValid$workshopGoal == "Match"max($blueMass,$copperMass) / min($blueMass,$copperMass) >= data("Goal Settings","Rules","minimumRatio") && abs($blueDelta - $copperDelta) <= data("Goal Settings","Rules","changeTolerance") && abs($blueDelta) >= data("Goal Settings","Rules","minimumChange")$workshopGoal == "Brake"(abs($blueBefore) >= data("Goal Settings","Rules","minimumBefore") && abs($blueAfter) <= data("Goal Settings","Rules","stopTolerance") && $blueAppliedImpulse * $blueBefore < 0) || (abs($copperBefore) >= data("Goal Settings","Rules","minimumBefore") && abs($copperAfter) <= data("Goal Settings","Rules","stopTolerance") && $copperAppliedImpulse * $copperBefore < 0)$workshopGoal == "Target"abs($blueAfter - data("Goal Settings","Rules","targetVelocity")) <= data("Goal Settings","Rules","targetTolerance") || abs($copperAfter - data("Goal Settings","Rules","targetVelocity")) <= data("Goal Settings","Rules","targetTolerance")A.51 Link Workshop Impulses (Function)
Built in Chapter 5, Compare and remix.
Makes both carts use the dial and lever again. No physical push occurs and existing observations stay unchanged.
- Variable
$copperImpulseLinked- Value
true
A.52 Open Starting Setup (Function)
Built in Chapter 5, Compare and remix.
Asks for a portable setup. Missing or incompatible fields are refused before changing apparatus. The native file completion Event validates and applies it.
- Action Name
persistentWriteResult- Key
"pushSetup.version"- Value
-999
- Action Name
persistentWriteResult2- Key
"pushSetup.weightCount"- Value
-999
- Action Name
persistentWriteResult3- Key
"pushSetup.impulseMagnitude"- Value
-999
- Action Name
persistentWriteResult4- Key
"pushSetup.impulseDirection"- Value
-999
- Action Name
persistentWriteResult5- Key
"pushSetup.copperLinked"- Value
-999
- Action Name
persistentWriteResult6- Key
"pushSetup.copperImpulse"- Value
-999
- Action Name
persistentWriteResult7- Key
"pushSetup.blueX"- Value
-999
- Action Name
persistentWriteResult8- Key
"pushSetup.copperX"- Value
-999
- Action Name
persistentWriteResult9- Key
"pushSetup.maximum"- Value
-999
- Action Name
persistentWriteResult10- Key
"pushSetup.increment"- Value
-999
- Action Name
persistentWriteResult11- Key
"pushSetup.capacity"- Value
-999
- Table
Workshop Weights- Variable Name
"clearWeight"
- Action Name
persistentWriteResult12- Key
"pushSetup.weight." + clearWeight.number + ".cart"- Value
-999
- Action Name
persistentWriteResult13- Key
"pushSetup.weight." + clearWeight.number + ".seat"- Value
-999
- Action Name
persistentWriteResult14- Key
"pushSetup.weight." + clearWeight.number + ".mass"- Value
-999
- Variable
$setupStatus- Value
'Choose a starting setup file. The experiment continues until it opens.'
- Key Prefix
"pushSetup."
A.53 Open Starting Setup Page (Function)
Built in Chapter 5, Compare and remix.
Opens optional starting setup instructions without changing the experiment.
- Variable
$inspectedPush- Value
-2
- Variable
$detailsOpen- Value
true
A.54 Open Workshop Goals (Function)
Built in Chapter 5, Compare and remix.
Opens the optional goal page without changing the experiment. Negative inspectedPush selects goals; zero selects latest readings; positive values select a retained reading.
- Variable
$inspectedPush- Value
-1
- Variable
$detailsOpen- Value
true
A.55 Press Copper Impulse Control
Built in Chapter 5, Compare and remix.
The exact optional sheet label stores Copper's next impulse or links both carts. Keyboard and pointer routes call the same Functions.
Any Objectself.pressSelected == true$detailsOpen && $inspectedPush == 0@self.linksImpulsesA.56 Press Experiment Reset
Built in Chapter 5, Compare and remix.
The exact Reset or Defaults label chooses one operation. Commands and pointer controls share the same native reset Function.
Any Objectself.pressSelected == true && $detailsOpen@self.restoresDefaultsA.57 Press Goal Page
Built in Chapter 5, Compare and remix.
Opens optional goals from the visible link on the latest reading sheet.
Any Objectself.pressSelected == true$detailsOpen && $inspectedPush == 0A.58 Press Setup Control
Built in Chapter 5, Compare and remix.
The exact visible setup label calls the same native Function as its keyboard Command.
Any Objectself.pressSelected == true$detailsOpen && $inspectedPush == -2@self.opensSetupA.59 Press Setup Page
Built in Chapter 5, Compare and remix.
Opens starting setup files from the optional latest Readings page.
Any Objectself.pressSelected == true$detailsOpen && $inspectedPush == 0A.60 Press Workshop Goal
Built in Chapter 5, Compare and remix.
Starts or stops an optional goal from the exact visible sheet label. Keyboard and pointer routes share the same Functions.
Any Objectself.pressSelected == true$detailsOpen && $inspectedPush == -1@self.goalChoice == ""- goal
@self.goalChoice
A.61 Push Selected Impulses (Function)
Built in Chapter 5, Compare and remix.
Chooses the next signed impulse for each cart, then asks the exact pair to perform one measured native push.
- Name
nextCopperImpulse- Value
$impulseMagnitude * $impulseDirection
$copperImpulseLinked == false- Variable
nextCopperImpulse- Value
$copperNextImpulse
- blue
$blueCart- copper
$copperCart- blueImpulse
$impulseMagnitude * $impulseDirection- copperImpulse
nextCopperImpulse
A.62 Reset Experiment Controls
Built in Chapter 5, Compare and remix.
R resets observations and returns the apparatus with chosen settings. D restarts from the authored defaults. Both end held input and leave exploration usable.
Any ObjectA.63 Reset Workshop Experiment (Function)
Built in Chapter 5, Compare and remix.
Returns the apparatus from rest and clears observations. Keeps the selected impulse, load arrangement, weight selection and edited tuning; Restore Defaults starts from the authored setup.
- Custom Event
returnCarts
- Table
Push Readings
- Variable
$inspectedPush- Value
0
- Variable
$detailsOpen- Value
false
- Variable
$pushBatch- Value
0
- Variable
$blueReadingValid- Value
false
- Variable
$copperReadingValid- Value
false
- Variable
$blueMass- Value
0
- Variable
$blueAppliedImpulse- Value
0
- Variable
$blueBefore- Value
0
- Variable
$blueAfter- Value
0
- Variable
$blueDelta- Value
0
- Variable
$copperMass- Value
0
- Variable
$copperAppliedImpulse- Value
0
- Variable
$copperBefore- Value
0
- Variable
$copperAfter- Value
0
- Variable
$copperDelta- Value
0
- Variable
$pushStatus- Value
'Experiment reset. Your settings and loads are kept.'
A.64 Restore Setup Position
Built in Chapter 5, Compare and remix.
Places this released cart at the validated starting X. The rail and native rest state are retained; this is a deliberate setup operation, not motion integration.
Any Object@self.cartNumber == 1- X
data("Starting Setup Values","blueX","value")- Y
self.transform.position.y
- X
data("Starting Setup Values","copperX","value")- Y
self.transform.position.y
A.65 Restore Weight Setup
Built in Chapter 5, Compare and remix.
Moves this exact weight through the shared native transfer rule after a complete setup file is validated. First all weights go to rack, then preferred seats are applied.
Any Object- Action Name
transferWorkshopWeightResult- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
0- preferredSeat
data("Starting Weight Setup","Weight " + self.weightNumber,"seat")
- Action Name
transferWorkshopWeightResult2- weight
self- number
self.weightNumber- rackX
self.rackX- rackY
self.rackY- height
self.weightHeight- destination
data("Starting Weight Setup","Weight " + self.weightNumber,"cart")- preferredSeat
data("Starting Weight Setup","Weight " + self.weightNumber,"seat")
A.66 Save Starting Setup (Function)
Built in Chapter 5, Compare and remix.
Downloads committed controls and the exact cart/weight arrangement as a portable Myth values file. It does not stop motion or save observations. Finish any cart or weight hand first.
$blueCart.count == 1 && $copperCart.count == 1 && $blueCart.collider.fixed == false && $copperCart.collider.fixed == false && dataFind("Workshop Weights","cart",-1) < 0 && dataCount("Workshop Weights") == $weightCount- Action Name
persistentWriteResult- Key
"pushSetup.version"- Value
1
- Action Name
persistentWriteResult2- Key
"pushSetup.weightCount"- Value
dataCount("Workshop Weights")
- Action Name
persistentWriteResult3- Key
"pushSetup.impulseMagnitude"- Value
$impulseMagnitude
- Action Name
persistentWriteResult4- Key
"pushSetup.impulseDirection"- Value
$impulseDirection
- Action Name
persistentWriteResult5- Key
"pushSetup.copperLinked"- Value
$copperImpulseLinked
- Action Name
persistentWriteResult6- Key
"pushSetup.copperImpulse"- Value
$copperNextImpulse
- Action Name
persistentWriteResult7- Key
"pushSetup.blueX"- Value
$blueCart.transform.position.x
- Action Name
persistentWriteResult8- Key
"pushSetup.copperX"- Value
$copperCart.transform.position.x
- Action Name
persistentWriteResult9- Key
"pushSetup.maximum"- Value
data("Impulse Settings","Shared","maximum")
- Action Name
persistentWriteResult10- Key
"pushSetup.increment"- Value
data("Impulse Settings","Shared","increment")
- Action Name
persistentWriteResult11- Key
"pushSetup.capacity"- Value
data("Cart Load Settings","cart","capacity")
- Table
Workshop Weights- Variable Name
"saveWeight"
- Action Name
persistentWriteResult12- Key
"pushSetup.weight." + saveWeight.number + ".cart"- Value
saveWeight.cart
- Action Name
persistentWriteResult13- Key
"pushSetup.weight." + saveWeight.number + ".seat"- Value
saveWeight.seat
- Action Name
persistentWriteResult14- Key
"pushSetup.weight." + saveWeight.number + ".mass"- Value
saveWeight.mass
- Action Name
setupFile- File Name
"push-lab-starting-setup"- Key Prefix
"pushSetup."
setupFile.ok- Variable
$setupStatus- Value
'Setup saved. Open it in another copy of this project.'
- Variable
$setupStatus- Value
'Setup could not be saved. Try again.'
- Variable
$setupStatus- Value
'Finish the hand; both carts and all weights must be available.'
A.67 Show Impulse Setting Label
Built in Chapter 5, Compare and remix.
Shows either the shared dial readout or the independent Blue/Copper readout on the ordinary bench.
Any Object- Visible
$detailsOpen == false && $copperImpulseLinked == @self.showLinked
- Visible
$detailsOpen == false && $copperImpulseLinked == @self.showLinked
- Visible
$detailsOpen == false && $copperImpulseLinked == @self.showLinked
- Visible
$detailsOpen == false && $copperImpulseLinked == @self.showLinked
A.68 Show Setup Page
Built in Chapter 5, Compare and remix.
Shows setup instructions and controls only on the optional setup page. U reopens it; H returns to readings.
Any Object- Visible
$detailsOpen && $inspectedPush == -2
- Visible
$detailsOpen && $inspectedPush == -2
- Visible
$detailsOpen && $inspectedPush == -2
- Visible
$detailsOpen && $inspectedPush == -2
A.69 Show Workshop Goal
Built in Chapter 5, Compare and remix.
Shows choices on the optional Goals page (caption kind 0), selected rules (1), or a selected result (2) or idle Goals link (3) on the optional latest Readings page. captionGoal selects the matching rule caption.
Any Object@self.goalCaptionKind == 0- Visible
$detailsOpen && $inspectedPush == -1
@self.goalCaptionKind == 1- Visible
$detailsOpen && $inspectedPush == -1 && $workshopGoal == @self.captionGoal
@self.goalCaptionKind == 2- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal != ""
@self.goalCaptionKind == 3- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal == ""
@self.goalCaptionKind == 0- Visible
$detailsOpen && $inspectedPush == -1
@self.goalCaptionKind == 1- Visible
$detailsOpen && $inspectedPush == -1 && $workshopGoal == @self.captionGoal
@self.goalCaptionKind == 2- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal != ""
@self.goalCaptionKind == 3- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal == ""
@self.goalCaptionKind == 0- Visible
$detailsOpen && $inspectedPush == -1
@self.goalCaptionKind == 1- Visible
$detailsOpen && $inspectedPush == -1 && $workshopGoal == @self.captionGoal
@self.goalCaptionKind == 2- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal != ""
@self.goalCaptionKind == 3- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal == ""
@self.goalCaptionKind == 0- Visible
$detailsOpen && $inspectedPush == -1
@self.goalCaptionKind == 1- Visible
$detailsOpen && $inspectedPush == -1 && $workshopGoal == @self.captionGoal
@self.goalCaptionKind == 2- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal != ""
@self.goalCaptionKind == 3- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal == ""
@self.goalCaptionKind == 0- Visible
$detailsOpen && $inspectedPush == -1
@self.goalCaptionKind == 1- Visible
$detailsOpen && $inspectedPush == -1 && $workshopGoal == @self.captionGoal
@self.goalCaptionKind == 2- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal != ""
@self.goalCaptionKind == 3- Visible
$detailsOpen && $inspectedPush == 0 && $workshopGoal == ""
A.70 Start Workshop Goal (Function)
Built in Chapter 5, Compare and remix.
Starts an optional goal from the next paired reading. Old successful observations remain available but cannot satisfy this request.
- Variable
$workshopGoal- Value
goal
- Variable
$goalStartBatch- Value
$pushBatch
- Variable
$goalResult- Value
'Waiting'
A.71 Starting Setup Controls
Built in Chapter 5, Compare and remix.
U opens optional setup help. E saves committed choices and arrangement; I opens a setup with this same project tuning. Native file Events report success, failure or cancellation.
Any Object- Variable
$setupStatus- Value
'The setup file could not be opened. Nothing changed.'
- Variable
$setupStatus- Value
'Setup opening canceled. Nothing changed.'
A.72 Store Copper Impulse (Function)
Built in Chapter 5, Compare and remix.
Stores the dial and lever setting as Copper's next impulse. The dial can then change Blue independently. Existing motion and observations stay unchanged.
- Variable
$copperNextImpulse- Value
$impulseMagnitude * $impulseDirection
- Variable
$copperImpulseLinked- Value
false
