Stating to polish the time travel levels...

This commit is contained in:
Sebastian Morr 2020-10-29 15:55:10 +01:00
parent cb7742466b
commit eb4f46e52f
12 changed files with 209 additions and 82 deletions

View file

@ -1,51 +1,85 @@
title = Parallelism
cards = checkout commit-auto reset-hard
title = Branching out
cards = checkout commit-auto reset-hard merge
[description]
In this zoo, we found a some parallel timelines. What's going on here? The ends of the timelines have little tags attached.
You can use these little blue labels to give names to different timelines! This makes it easier to remember what happened where.
Especially the `bad_ending` one needs our attention! Can you travel to the `good_ending` timeline, and make a new commit where everyone involved is happy?
One of your colleagues messed up here - can you help reordering the branches correctly using the "reset" card?
[congrats]
When you do commits or merges while you're on a branch, the branch will grow with you. Try that while you eat that donut.
Whew, good job! This seems like a *much* better outcome.
But our next mission is already waiting...
Finally, merge all timelines together, in a way so that the "main" branch points to the result. That's base reality!
[setup]
git checkout -b bad_ending
echo "A friendly old lady.
Sells delicious baguettes." > mary
mkdir cage
mkdir toy_shop
echo "Looks very hungry." > cage/lion
echo "A rebellious teenager.
Sells good coffee." > larry
echo "A snail. Literally a snail.
Sells donuts with an unspecified, slimy filling." > gary
echo "You do not have a baguette.
You do not have coffee.
You do not have a donut." > you
echo "A small child.
It really loves cats!
It's holding a lollipop." > child
git add .
git commit -m "The beginning"
git commit -m "The Beginning"
mv child cage
git checkout -b coffee
echo "You have a baguette.
You do not have coffee.
You do not have a donut." > you
git add .
git commit -m "The child is curious"
git branch good_ending
git commit -m "You buy a baguette"
git rm cage/child
echo "Looks happy. :)" > cage/lion
echo "You ate a baguette.
You do not have coffee.
You do not have a donut." > you
git add .
git commit -m "Oh no"
git commit -m "You eat the baguette"
git checkout HEAD~2
git checkout -b boring_ending
mv child toy_shop
git checkout -b baguette main
echo "You do not have a baguette.
You have coffee.
You do not have a donut." > you
git add .
git commit -m "The child is distracted"
git commit -m "You buy some coffee"
git checkout bad_ending
echo "You do not have a baguette.
You drank coffee.
You do not have a donut." > you
git add .
git commit -m "You drink the coffee"
git checkout -b donut main
echo "You do not have a baguette.
You do not have coffee.
You have a donut." > you
git add .
git commit -m "You buy a donut"
git checkout --detach main
[win]
# Is the child still there, and do we have a commit that's not in bad_ending?
{ git ls-tree --name-only -r good_ending | grep child; } && { test "$(git log good_ending ^bad_ending --oneline | wc -l)" -gt 0; }
{ git show main:you | grep "You ate a baguette"; } && { git show main:you | grep "You drank coffee"; } && { git show main:you | grep "You ate a donut"; }
[congrats]
Nice! It's often convenient to stay on branches most of the time!

View file

@ -0,0 +1,50 @@
title = Parallelism
cards = checkout commit-auto
[description]
Did you know that creating parallel timelines is perfectly legal and safe? It's true!
Can you find out when things went wrong in this zoo, and create commits that tell a better story?
[setup]
mkdir cage
echo "Looks very hungry." > cage/lion
echo "A small child.
It really loves cats!" > child
git add .
git commit -m "The beginning"
echo "It's holding a lollipop." >> child
git commit -am "The child buys something"
mv child cage
git add .
git commit -m "The child is curious"
git rm cage/child
echo "Looks happy. :)" > cage/lion
git add .
git commit -m "Oh no"
echo "It's sleeping." > cage/lion
git add .
git commit -m "Nap time!"
git checkout --detach
git branch -d main
[win]
# Is the child still there, and is the lion not hungry?
{ git ls-tree --name-only -r HEAD | grep child; } && { git show HEAD:cage/lion | grep -v "very hungry"; }
[congrats]
Whew, good job! This seems like a *much* better outcome.
Feel free to add more parallel timelines, or make them longer.
If you're ready, our next mission is already waiting...

View file

@ -1,15 +1,13 @@
title = Welcome!
cards = checkout commit-auto reset-hard
title = Moving through time
cards = checkout commit-auto
[description]
Welcome, time agent! Good to see you - we could really use your help with fixing some temporal paradoxes!
The yellow boxes are frozen points in time, we call them "commits"! You can travel between them using the "checkout" card! (Try it!)
Each yellow box is a frozen point in time, we call them "commits"! You can travel to one by dragging the "checkout" card to it, and you can go back to the present by dragging it on the blue "main" tag! (Try it!)
The grey panel below shows your current environment - click on an object to inspect or modify it! You can also click on commits to look at their contents.
The grey panel shows your current environment - click on an object to inspect or modify it!
Can you find out what happened here? Then, come back to the present, fix the problem, and make a new commit, using the "commit" card!
Can you find out what happened here? Then, come back to the latest commit, and fix the problem, using the "commit" card!
[setup]
@ -34,9 +32,12 @@ mv room2/little_sister room1
git add .
git commit -m "Little sister walks back"
git checkout --detach
git branch -d main
[win]
{ git show refs/heads/main:room2/piggy_bank | grep "10 coins"; } && { git show refs/heads/main:room1/little_sister | grep -v "10 coins"; }
{ git show HEAD:room2/piggy_bank | grep "10 coins"; } && { git show HEAD:room1/little_sister | grep -v "10 coins"; } && { git rev-parse HEAD^; }
[congrats]

View file

@ -13,26 +13,26 @@ Again, let your finalized timeline be the "main" one.
[setup]
echo "Just woke up. Is hungry." > tom
echo "Just woke up. Is hungry." > sam
git add .
git commit -m "The beginning"
git checkout -b pancakes
echo "Had blueberry pancakes with maple syrup for breakfast." > tom
echo "Had blueberry pancakes with maple syrup for breakfast." > sam
git add .
git commit -m "Pancakes!"
echo "
Is at work." >> tom
Is at work." >> sam
git commit -am "Go to work"
git checkout -b muesli main
echo "Had muesli with oats and strawberries for breakfast." > tom
echo "Had muesli with oats and strawberries for breakfast." > sam
git add .
git commit -m "Muesli!"
echo "
Is at work." >> tom
Is at work." >> sam
git commit -am "Go to work"
git checkout main

22
levels/time-machine/init Normal file
View file

@ -0,0 +1,22 @@
title = Welcome!
cards = init
[description]
Welcome, time agent! Good to see you - we could really use your help with fixing some temporal paradoxes!
Ready to initialize your time machine? Drag the `git init` card into the empty space!
[setup]
rm -rf .git
[win]
test -d .git
[congrats]
Wonderful! Now, let's make sure that your time machine works correctly...
Click on "Next level", as soon as you're ready!

View file

@ -5,22 +5,20 @@ cards = checkout commit-auto reset-hard merge
Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together!
Here, you see three parallel timelines - can you build a reality in the "main" timeline where you have a baguette, a coffee, *and* a donut?
Here, you see three parallel timelines - can you build a situation where you consumed a baguette, a coffee, *and* a donut?
The "merge" card will help you - try it!
[setup]
mkdir bakery coffee_shop donut_shop
echo "A friendly old lady.
Sells delicious baguettes for 5 coins each." > bakery/mary
Sells delicious baguettes." > mary
echo "A rebellious teenager.
Sells good coffee for 2 coins each." > coffee_shop/larry
Sells good coffee." > larry
echo "A snail. Literally a snail.
Sells donuts with an unspecified, slimy filling - for 3 coins each." > donut_shop/gary
Sells donuts with an unspecified, slimy filling." > gary
echo "You do not have a baguette.
@ -31,50 +29,62 @@ You do not have a donut." > you
git add .
git commit -m "The Beginning"
git checkout -b baguette
echo "You have a baguette.
You do not have coffee.
You do not have a donut." > you
git mv you bakery
git add .
git commit -m "You get a baguette"
git mv bakery/you .
git add .
git commit -m "You leave the bakery"
git commit -m "You buy a baguette"
git checkout -b coffee main
echo "You ate a baguette.
You do not have coffee.
You do not have a donut." > you
git add .
git commit -m "You eat the baguette"
git checkout HEAD~2
echo "You do not have a baguette.
You have coffee.
You do not have a donut." > you
git mv you coffee_shop
git add .
git commit -m "You get some coffee"
git mv coffee_shop/you .
git add .
git commit -m "You leave the coffee_shop"
git commit -m "You buy some coffee"
git checkout -b donut main
echo "You do not have a baguette.
You drank coffee.
You do not have a donut." > you
git add .
git commit -m "You drink the coffee"
git checkout HEAD~2
echo "You do not have a baguette.
You do not have coffee.
You have a donut." > you
git mv you donut_shop
git add .
git commit -m "You get a donut"
git mv donut_shop/you .
git add .
git commit -m "You leave the donut shop"
git commit -m "You buy a donut"
git checkout main
echo "You do not have a baguette.
You do not have coffee.
You ate a donut." > you
git add .
git commit -m "You eat a donut"
git checkout HEAD~2
git branch -D main
[win]
{ git show main:you | grep "You have a baguette"; } && { git show main:you | grep "You have coffee"; } && { git show main:you | grep "You have a donut"; }
{ git show HEAD:you | grep "You ate a baguette"; } && { git show HEAD:you | grep "You drank coffee"; } && { git show HEAD:you | grep "You ate a donut"; }
[congrats]

View file

@ -1,6 +1,8 @@
welcome
branches
init
checkout-commit
branching
merge
branches
conflict
pull-push
rebase

View file

@ -1,15 +1,21 @@
[
{
"id": "init",
"command": "git init",
"arg_number": 0,
"description": "Initialize the time machine!"
},
{
"id": "checkout",
"command": "git checkout",
"arg_number": 1,
"description": "Travel to a commit!"
"description": "Drag this card to a commit or to a branch to travel to it!"
},
{
"id": "commit-auto",
"command": "git add .; git commit",
"arg_number": 0,
"description": "Make a new commit!"
"description": "Make a new commit containing your current environment!\nDrag this card anywhere. You'll be asked to enter a short description of what you changed."
},
{
"id": "merge",
@ -45,7 +51,7 @@
"id": "reset-hard",
"command": "git reset --hard",
"arg_number": 1,
"description": "Reset current label to the specified commit."
"description": "Move the branch you're on to the specified commit."
},
{
"id": "cherry-pick",

View file

@ -114,11 +114,13 @@ func dropped_on(other):
func try_play(full_command):
if game.energy >= energy:
var terminal = $"../../../..".terminal
terminal.send_command(full_command)
#yield(terminal, "command_done")
$PlaySound.play()
var particles = preload("res://scenes/card_particles.tscn").instance()
particles.position = position
get_parent().add_child(particles)
$"../../../..".terminal.send_command(full_command)
buuurn()
game.energy -= energy
else:

View file

@ -20,7 +20,7 @@ func load(path):
title = config.get("title", slug)
description = config.get("description", "(no description)")
congrats = config.get("congrats", "Good job, you solved the level!\n\nFeel free to try a few more things or click 'Next Level'.")
congrats = config.get("congrats", "Good job, you solved the level!\n\nFeel free to try a few more things or click 'Next level'.")
cards = Array(config.get("cards", "checkout commit-auto merge rebase rebase-interactive reset-hard cherry-pick").split(" "))
var keys = config.keys()
@ -53,7 +53,7 @@ func load(path):
elif dir.file_exists(path+"/description"):
# This is an old-style level.
description = helpers.read_file(path+"/description", "(no description)")
congrats = helpers.read_file(path+"/congrats", "Good job, you solved the level!\n\nFeel free to try a few more things or click 'Next Level'.")
congrats = helpers.read_file(path+"/congrats", "Good job, you solved the level!\n\nFeel free to try a few more things or click 'Next level'.")
var yours = LevelRepo.new()
yours.setup_commands = helpers.read_file(path+"/start", "")

View file

@ -129,13 +129,13 @@ __meta__ = {
[node name="NextLevelButton" type="Button" parent="Rows/Columns/RightSide/LevelInfo/Menu"]
margin_left = 406.0
margin_right = 516.0
margin_right = 511.0
margin_bottom = 35.0
focus_mode = 0
custom_styles/hover = SubResource( 1 )
custom_styles/normal = ExtResource( 4 )
enabled_focus_mode = 0
text = "Next Level"
text = "Next level"
__meta__ = {
"_edit_use_anchors_": false
}
@ -193,7 +193,7 @@ margin_right = 633.0
margin_bottom = 782.0
size_flags_vertical = 3
size_flags_stretch_ratio = 0.75
title = "Working directory"
title = "Current environment"
[node name="Controls" type="HBoxContainer" parent="Rows"]
margin_top = 790.0

View file

@ -46,14 +46,14 @@ func apply_forces():
var offset = Vector2(-80, 0)
for c in children.keys():
if type == "ref" or type == "head":
offset = Vector2(0, 80)
# if type == "ref" or type == "head":
# offset = Vector2(0, 80)
if repository.objects.has(c):
var other = repository.objects[c]
if other.visible:
var d = other.position.distance_to(position+offset)
var dir = (other.position - (position+offset)).normalized()
var f = (d*0.12)
var f = (d*0.06)
position += dir*f
other.position -= dir*f