<<set $theme to "light">>
<<set $playerName to "">>
<<set $confidence to 10>>
<<set $max_confidence to 10>>
<<set $inventory to []>>
<<set $vocab_list to []>>
<<set $score to 0>>
<<set $mistakes to 0>>
<<set $day to 1>>
<<set $last_roll to 0>>
<<set $roll_needed to "">>
<<set $review_init to false>>
<<set $city to "Paris">>
<<set $gameVersion to 1>><<if $theme == "dark">>
<<run $('body').addClass('theme-dark').removeClass('theme-light')>>
<<else>>
<<run $('body').addClass('theme-light').removeClass('theme-dark')>>
<</if>>
<<set $confidence to Math.clamp($confidence, 0, $max_confidence)>><<nobr>>
<div class="sidebar-panel">
<div class="tracker-card">
<div class="card-header">📅 Day</div>
<div class="day-row">
<<for _d range [1,2,3]>>
<<if _d < $day>>
<div class="day-dot day-past"><<print _d>></div>
<<elseif _d == $day>>
<div class="day-dot day-current"><<print _d>></div>
<<else>>
<div class="day-dot day-future"><<print _d>></div>
<</if>>
<</for>>
</div>
</div>
<div class="tracker-card">
<div class="card-header">
<span>
<<if $confidence <= 3>>⚠️ Confidence
<<elseif $confidence <= 6>>😬 Confidence
<<else>>😊 Confidence
<</if>>
</span>
<span class="conf-score"><<print $confidence>>/<<print $max_confidence>></span>
</div>
<div class="conf-bar-bg">
<<set _confClass to "conf-bar-fill " + ($confidence <= 3 ? "conf-low" : ($confidence <= 6 ? "conf-med" : "conf-high"))>>
<<set _confWidth to Math.round(($confidence / Math.max($max_confidence, 1)) * 100) + "%">>
<div @class="_confClass" @style="'width:' + _confWidth + ';'"></div>
</div>
<div class="conf-text">
<<if $confidence <= 3>>Stay calm — Paris can wait one more minute.
<<elseif $confidence <= 6>>You're doing fine — keep going.
<<else>>Feeling confident — you've got this.
<</if>>
</div>
</div>
<div class="tracker-card score-card">
<div class="card-header" style="margin: 0;">⭐ Score</div>
<div class="score-badge"><<print $score>> pts</div>
</div>
<!-- 3D VIRTUAL DICE -->
<div class="tracker-card dice-card">
<div class="card-header">🎲 VIRTUAL DICE</div>
<div class="dice-container">
<div class="dice-box">
<div id="cube" class="cube">
<div class="front">1</div><div class="back">2</div>
<div class="right">3</div><div class="left">4</div>
<div class="top">5</div><div class="bottom">6</div>
</div>
</div>
<div id="dice-roll-ui" class="dice-button <<if $roll_needed == ''>>disabled<</if>>">
<<link "ROLL DIE">>
<<if $roll_needed != "">>
<<set $last_roll to random(1, 6)>>
<<run $('#dice-roll-ui').addClass('disabled')>>
<<run window.rollDice($last_roll)>>
<<timed 1.2s>>
<<set $roll_needed to "">>
<<run SugarCube.Engine.play(SugarCube.State.passage)>>
<</timed>>
<</if>>
<</link>>
</div>
</div>
</div>
<div class="tracker-card">
<div class="card-header">🎒 Inventory</div>
<<if $inventory.length == 0>>
<div class="empty-state">Empty — go explore Paris!</div>
<<else>>
<<for _item range $inventory>>
<div class="item-pill"><<print _item>></div>
<</for>>
<</if>>
</div>
<div class="tracker-card">
<div class="card-header">
<span>📒 Vocab</span>
<span class="vocab-count"><<print $vocab_list.length>> words</span>
</div>
<<if $vocab_list.length == 0>>
<div class="empty-state">Click blue words to learn!</div>
<<else>>
<div class="vocab-list">
<<for _word range $vocab_list>>
<div class="vocab-word">
<span class="vocab-icon">▸</span>
<span><<print _word>></span>
</div>
<</for>>
</div>
<</if>>
</div>
<div id="theme-toggle-container">
<<button "🌓 Thème (Clair/Sombre)">>
<<if $theme == "dark">>
<<set $theme to "light">>
<<run $('body').addClass('theme-light').removeClass('theme-dark')>>
<<else>>
<<set $theme to "dark">>
<<run $('body').addClass('theme-dark').removeClass('theme-light')>>
<</if>>
<</button>>
</div>
</div>
<</nobr>><h1>Welcome to Paris!</h1>
Ready for the adventure? What's your name?
<div style="margin: 20px 0;">
<<textbox "$playerName" "Traveler" "IntroPage" autofocus>>
</div>
<div style="text-align: center; margin-top: 30px;">
<<button "Continue">>
<<if $playerName.trim() is "">>
<<set $playerName to "Traveler">>
<</if>>
<<goto "IntroPage">>
<</button>>
</div><h1>How this game works 🎓</h1>
Welcome to <strong>A Weekend in Paris</strong>! 🇫🇷
An interactive 3-day story to practise your English in real Parisian situations — cafés, museums, the métro, dinner.
🔹 <strong>Blue words</strong> (like <<linkreplace "this one">><span class="vocab-reveal">this one (<span class="french-trans">celui-ci</span>)</span><</linkreplace>>) are <strong>clickable</strong>. Click to reveal the French translation and add the word to your vocabulary list.
Watch the <strong>left sidebar</strong> for your live stats:
📅 Day · ⚠️ Confidence · ⭐ Score · 🎒 Inventory · 🎲 Dice · 🧠 Vocab
A Twine game by <strong>The English Workshop</strong> · Pau & Bordeaux · Learn English, the real-life way.
<div style="text-align:center;margin-top:30px;">
<<button "Let's go">><<goto "NameInput">><</button>>
</div><h1>Paris, <span class="player-name">$playerName</span> — Day 1</h1>
You've just stepped off the Eurostar at Gare du Nord. The trip from London was smooth, but you barely slept. Now it's 9:00 AM, your shoulders ache from your backpack, and you have no idea which way your hotel is.
You need three things urgently: <em>a coffee</em>, <em>a map</em>, and <em>a metro ticket</em>.
<div class="signage">
💡 <strong>Pro tip:</strong> Parisians speak fast and hate small talk. Be direct, polite, and always start with <em>"Hello"</em> before asking anything.
</div>
[[Try to navigate to your hotel by phone — fail|HotelConfused]]
[[Head straight for the café on the corner|CafeArrival]]
[[Brave the metro|MetroStation]]
<div class="tew-footer">
Made for you by <a href="https://the-english-workshop.com/">The English Workshop</a> · Pau & Bordeaux, France
</div>You pull out your phone. The screen is <strong>dead</strong>. Of course you forgot to charge it on the train.
You stare at the carousel in confusion. A friendly <<linkreplace "concierge">><span class="vocab-reveal">concierge (<span class="french-trans">person who helps guests at a hotel</span>)</span><<run $vocab_list.push("Concierge : person who helps guests at a hotel")>><<set $score += 1>><</linkreplace>> walks past. You hesitate...
<div class="pedagogy pedagogy-info">
🎯 <strong>How to ask for help politely:</strong><br>
- "Excuse me, could you help me?"<br>
- "I'm a bit lost, sorry."<br>
- "Could you point me to the RER B platform, please?"
</div>
[[Ask him politely|HelpPolite]]
[[Pretend you know where you're going|HotelConfused2]]
[[Skip and grab a coffee first|CafeArrival]]<h1>He smiles. 🤝</h1>
"Excuse me, sir? Could you help me? I'm looking for the RER B to Châtelet-Les Halles."
He smiles. "Of course. Follow the yellow signs, third corridor on your right. Have a lovely stay in Paris!"
<div class="pedagogy pedagogy-success">
✅ <strong>Perfect politeness!</strong><br>
"Excuse me" + "could you" = the royal way to ask in English. +2 confidence, +1 score.
</div>
<<set $confidence += 2>><<set $score += 1>>
<<inventory_alert "💪" "Confidence +2! The concierge smiled. Paris is friendly.">>
He even tells you there's a <<linkreplace "shorter">><span class="vocab-reveal">shorter (<span class="french-trans">plus court</span>)</span><<run $vocab_list.push("Shorter : plus court (comparatif)")>><<set $score += 1>><</linkreplace>> route via a side exit.
[[Take the metro to your hotel|Day1HotelArrival]]<h1>You pretend to know</h1>
You walk straight ahead — into a closed service door. A cleaner looks at you with a mix of pity and amusement.
The concierge is still there. His smile is now <em>kind</em>, but condescending.
<div class="pedagogy pedagogy-error">
❌ <strong>Common mistake.</strong><br>
Saying "I'm lost" or "I need help" is not a sign of weakness — it's what real travellers do. Confidence -1, but you learn.
</div>
<<set $confidence -= 1>><<set $mistakes += 1>>
<<inventory_alert "😬" "Confidence -1. Pretending to know is rarely the move.">>
He still gives you directions, but more <<linkreplace "tersely">><span class="vocab-reveal">tersely (<span class="french-trans">laconiquement, en peu de mots</span>)</span><<run $vocab_list.push("Tersely : laconiquement, en peu de mots")>><<set $score += 1>><</linkreplace>> this time.
[[Follow his directions|Day1HotelArrival]]<h1>☕ The café on the corner</h1>
A small café with red velvet seats. The owner, an older man with a white moustache, looks up.
"Hello! What can I get you?"
He's a bit brusque. You need a coffee, but the menu has 12 types and you don't know the vocabulary.
<div class="pedagogy pedagogy-info">
☕ <strong>Café vocabulary in Paris:</strong><br>
- ''espresso'' (a small black coffee)<br>
- ''double espresso'' (for the rush)<br>
- ''café allongé'' (espresso diluted with hot water)<br>
- ''café crème'' (espresso + cream)<br>
- ''noisette'' (espresso + a drop of milk = "hazelnut")<br>
- ''thé'' / ''tea'' (English breakfast, Earl Grey, green, mint)
</div>
[[Order "a coffee, please"|CafeOrderCoffee]]
[[Order "an espresso, please"|CafeOrderEspresso]]
[[Ask for the menu first|CafeAskMenu]]<h1>"A coffee, please."</h1>
"A coffee, please."
The owner raises an eyebrow. "A coffee? That is... not specific. What KIND of coffee?"
You blush. He sighs and makes you a noisy <<linkreplace "noisette">><span class="vocab-reveal">noisette (<span class="french-trans">espresso + a dash of milk — literally "hazelnut"</span>)</span><<run $vocab_list.push("Noisette : espresso + a dash of milk")>><<set $score += 1>><</linkreplace>> anyway. 1,80€.
<div class="pedagogy pedagogy-error">
⚠️ Saying "a coffee" in France is too vague. The waiter expects: espresso? allongé? crème?
</div>
<<set $confidence -= 1>>
[[Pay and head to the metro|Day1HotelArrival]]<h1>"An espresso, please."</h1>
"An espresso, please."
The owner nods, satisfied. "Coming up." He <<linkreplace "whips">><span class="vocab-reveal">whips up (<span class="french-trans">prepares quickly, improvises</span>)</span><<run $vocab_list.push("Whip up : préparer vite, improviser")>><<set $score += 1>><</linkreplace>> a tiny black coffee with a twist of lemon peel on the saucer. 1,40€.
<div class="pedagogy pedagogy-success">
✅ Short, polite, precise. +1 confidence, +1 score.
</div>
<<set $confidence += 1>><<set $score += 1>>
[[Pay and head to the metro|Day1HotelArrival]]<h1>"Could I see the menu?"</h1>
"Could I see the menu, please?"
The owner brings you a small black menu. You spot: espresso, double espresso, allongé, crème, noisette, thé, chocolat, etc. You just learned 8 new words!
<div class="pedagogy pedagogy-success">
🧠 "Could I see the menu?" = open a goldmine of vocabulary. +2 score.
</div>
<<set $score += 2>>
[[Order an espresso|CafeOrderEspresso]]
[[Order a noisette|CafeOrderCoffee]]
[[Just have tap water|CafeTapWater]]<h1>"Tap water, please."</h1>
"Just a glass of tap water, please."
The owner snorts. Water-only customers get no <<linkreplace "pastry">><span class="vocab-reveal">pastry (<span class="french-trans">viennoiserie, pâtisserie</span>)</span><<run $vocab_list.push("Pastry : viennoiserie, pâtisserie")>><<set $score += 1>><</linkreplace>>, no smile. You saved 1,40€, but lost a teaching moment.
<<set $confidence -= 1>>
[[Head to the metro|Day1HotelArrival]]<h1>🚇 The metro station</h1>
You wander down to the metro. Confusingly, there are TWO entrances: the RER (suburban train) and the Métro (city metro). They have different tickets.
You approach the machine. It's all in French. A teenager next to you is buying a ticket.
[[Tap her on the shoulder and ask for help|MetroPolite]]
[[Try to figure it out yourself|MetroAlone]]
[[Roll the dice to see if you guess right|MetroDiceSetup]]<h1>"Excuse me, could you help me?"</h1>
"Excuse me, could you help me, please? I'm a tourist."
She smiles and explains: "You need a ''t+'' ticket (2,10€) for the métro. Or a ''Mobilis'' day pass (8,45€) if you take the metro more than 4 times today. Which do you want?"
<div class="pedagogy pedagogy-success">
✅ <strong>"Excuse me, could you..."</strong> = the universal magic phrase. +2 confidence, +1 score.
</div>
<<set $confidence += 2>><<set $score += 1>>
<<run $vocab_list.push("Ticket : billet")>><<set $score += 1>>
[[Buy a t+ for the metro|Day1HotelArrival]]
[[Buy a Mobilis day pass|Day1HotelArrival]]<h1>Try it yourself</h1>
You stare at the machine. You press random buttons. The screen flashes red. The teenager looks over, sighs, and helps you anyway — in French, much faster than you can follow.
You buy a ticket but you're not sure if it's the right one.
<<set $confidence -= 1>>
[[Head to the platform|Day1HotelArrival]]<h1>🎲 Leave it to luck</h1>
You decide this is a game of luck. You press random buttons and roll a virtual die to see if you guessed right.
<<if $last_roll == 0>>
<<set $roll_needed to "MetroDiceSetup">>
<div class="pedagogy pedagogy-info">
🎲 <strong>Roll the die in the sidebar!</strong> Your metro ticket depends on it.
</div>
<<else>>
<<set _dice to $last_roll>>
<<set $last_roll to 0>>
<<if _dice gte 5>>
<div class="pedagogy pedagogy-success">
🎲 <strong>Lucky you!</strong> You happened to choose exactly what you needed. Score +1!
</div>
<<set $score += 1>>
<<else>>
<div class="pedagogy pedagogy-error">
🎲 <strong>Drat.</strong> You bought the wrong ticket. A guard checks it 2 stops later. 50€ fine. Confidence -2.
</div>
<<set $confidence -= 2>>
<</if>>
[[Step onto the metro|Day1HotelArrival]]
<</if>><h1>🏨 Hotel du Petit Châtelet</h1>
You arrive at the small hotel in the Latin Quarter. The receptionist is a young woman typing on a laptop.
"Hello and welcome. Do you have a reservation?"
"Yes, I have a reservation. It's under the name $playerName, for one person, three nights."
She checks. "Ah yes. Here is your key. Room 12, third floor. The lift is on your right."
<div class="pedagogy pedagogy-info">
🔑 <strong>Check-in phrases:</strong><br>
- "I have a reservation under the name..."<br>
- "It's for one person, three nights."<br>
- "Could I have the wifi password, please?"<br>
- "Is breakfast included?"
</div>
<<set $score += 1>>
[[Ask for the wifi password|HotelWifi]]
[[Ask about breakfast|HotelBreakfast]]
[[Just take the key and head up|HotelRoomQuick]]<h1>📶 Wifi password</h1>
"Could I have the wifi password, please?"
"Sure. Network: ''HotelDuPetit12''. Password: ''bienvenue2026''. Sorry, no 4G booster."
You notice her ''we don't have'' — a negative construction in English.
<<run $vocab_list.push("Wifi password : mot de passe wifi")>><<set $score += 1>>
<<run $vocab_list.push("Sorry : désolé (formule de politesse universelle)")>><<set $score += 1>>
[[Take the key|HotelRoomQuick]]<h1>🥐 Is breakfast included?</h1>
"Is breakfast included?"
"Breakfast is 12€ per person. We serve from 7:00 to 10:00. It's a continental breakfast: croissant, pain au chocolat, baguette, butter, jam, orange juice, coffee, tea."
<div class="pedagogy pedagogy-success">
🥐 You just learned 4 new words in one sentence! <em>continental breakfast, croissant, pain au chocolat, baguette</em>. Score +3.
</div>
<<set $score += 3>>
<<run $vocab_list.push("Continental breakfast : petit-déjeuner à la française")>><<set $score += 1>>
[[Pay now and head up|HotelRoomQuick]]<h1>🛏️ Your Parisian hotel room</h1>
The room is tiny but <<linkreplace "charming">><span class="vocab-reveal">charming (<span class="french-trans">charmant, plein de cachet</span>)</span><<run $vocab_list.push("Charming : charmant, plein de cachet")>><<set $score += 1>><</linkreplace>>. You drop your bag, lie on the bed, exhale.
You made it. Day 1 is done.
Tomorrow: the Louvre, the Seine, a real French bistro...
<div class="signage">
🛏️ Tired. Your first instinct: bed. Your brain: vocabulary. What now?
</div>
<<set $day to 2>>
[[🧠 Take the Daily Vocab Review|VocabReview]] <<set $review_init to true>>
[[Skip to Day 2|Day2Morning]]<h1>🌙 End of Day 1</h1>
You're back in your hotel room. What a first day! You lie on the bed and think about everything that happened:
✈️ You arrived at Gare du Nord.
🛂 You passed through Immigration.
🚇 You took the metro to your hotel near Châtelet.
🏨 You checked into Hotel du Petit Châtelet.
Your English is already getting better. Before falling asleep, you open your phone and quickly review the words in your <<linkreplace "vocabulary notebook">><span class="vocab-reveal">vocabulary notebook (<span class="french-trans">carnet de vocabulaire</span>)</span><<run $vocab_list.push("Vocabulary notebook : carnet de vocabulaire")>><<set $score += 1>><</linkreplace>>.
📊 <strong>Day 1 Summary:</strong>
- Words learned: <<print $vocab_list.length>>
- Score: <<print $score>> ⭐
- Mistakes: <<print $mistakes>>
- Confidence: <<print $confidence>> / <<print $max_confidence>>
<<if $confidence lte 0>>
[[...|GameOver]]
<<else>>
<<set $day to 2>>
Tomorrow is a new day in Paris. What adventures await?
🌙 ''You close your eyes and fall asleep to the distant sound of the city...''
[[🧠 Take the Daily Vocab Review|VocabReview]] <<set $review_init to true>>
[[☀️ Day 2: the Louvre and a bistro|Day2Morning]]
<</if>><div class="pedagogy pedagogy-error">
😰 <strong>GAME OVER — Confidence Meltdown!</strong><br><br>
❌ <strong>It's not the end of the world!</strong><br><br>
Everyone makes mistakes when learning a language. The important thing is to regain confidence and try again!<br><br>
💡 <strong>Tips:</strong><br>
- Re-read the words in your vocabulary list<br>
- Pay attention to the explanations after each mistake<br>
- Don't be afraid to make mistakes
</div>
<strong>Your final stats:</strong>
- Words learned: <<print $vocab_list.length>>
- Score: <<print $score>> ⭐
- Mistakes: <<print $mistakes>>
[[🔄 Start the adventure again from the beginning.|Start]]<h1>☀️ Day 2: Museums & Métro</h1>
You wake up at 8:30 AM. Paris is already buzzing. Today: the Louvre, then maybe the Musée d'Orsay.
You grab a croissant at the bakery next door (the owner calls you "Monsieur" and smiles — you've earned it). Head to the metro.
The Louvre is on Line 1 (yellow). You have a ''Mobilis'' day pass from yesterday.
[[Take Line 1 to the Louvre|LouvreArrival]]
[[Stop at the info desk first|LouvreAskInfo]]<h1>An info desk agent</h1>
An info desk agent is smiling. You approach.
"Excuse me, could you tell me how to get to the Louvre, please?"
She points you to Line 1, direction ''Château de Vincennes''. 5 stops.
<div class="pedagogy pedagogy-success">
🗺️ "Excuse me, could you tell me how to get to..." = the asking-directions phrase. +2 score.
</div>
<<set $score += 2>>
<<run $vocab_list.push("Could you tell me how to get to... : pourriez-vous m'indiquer comment aller à...")>><<set $score += 1>>
[[Board the train|LouvreArrival]]<h1>🛕 The Louvre</h1>
You arrive at the Louvre-Pyramides station. The entrance is a glass pyramid in the courtyard. You join the queue.
A tourist next to you is reading the signs and <<linkreplace "mutters">><span class="vocab-reveal">mutters (<span class="french-trans">marmonne, dit à mi-voix</span>)</span><<run $vocab_list.push("Mutter : marmonner")>><<set $score += 1>><</linkreplace>>: "Where on earth is the Mona Lisa?"
A guard walks by. You decide to approach him.
[[Ask the guard for help|LouvreAsk]]
[[Try to find it yourself|LouvreWander]]<h1>"Where is the Mona Lisa?"</h1>
"Excuse me, sir. Could you tell me where the Mona Lisa is, please?"
He points: "Take the escalator up. Turn left. Wing Denon, room 6. You'll see the queue. Have a nice visit!"
<div class="pedagogy pedagogy-success">
🏛️ "Excuse me, could you tell me where... is?" = the magic phrase. +2 score, +1 confidence.
</div>
<<set $score += 2>><<set $confidence += 1>>
[[Head to the Mona Lisa|LouvreMonaLisa]]<h1>Lost in the museum</h1>
You wander for 35 minutes and end up in ancient Greek <<linkreplace "pottery">><span class="vocab-reveal">pottery (<span class="french-trans">poterie, céramiques</span>)</span><<run $vocab_list.push("Pottery : poterie")>><<set $score += 1>><</linkreplace>>. Beautiful, but not the Mona Lisa. You give up and ask a guard.
<div class="pedagogy pedagogy-error">
⏱️ You lost 35 minutes! Asking right away = saving time. Confidence -1.
</div>
<<set $confidence -= 1>>
[[Head to the Mona Lisa|LouvreMonaLisa]]<h1>🎨 The Mona Lisa</h1>
She's smaller than you expected. You stand in line for 15 minutes and finally arrive in front of her. Behind bulletproof glass, she smiles — <em>enigmatically</em>, of course.
You take out your phone. A guard says: "No photos, sir."
[[Ask politely if photos are allowed|LouvrePhotoPolite]]
[[Take the photo quickly|LouvrePhotoQuick]]
[[Respect the rule and enjoy|LouvreEnjoy]]<h1>"Are photos allowed?"</h1>
"Excuse me, sir. Are photos allowed here?"
He shakes his head. "Sorry, no. You're welcome to take a photo of the wing, though."
You take a photo of the wing. Everyone is happy.
<div class="pedagogy pedagogy-success">
📸 "Are photos allowed?" = clear question, clear answer. +1 confidence.
</div>
<<set $confidence += 1>>
<<run $vocab_list.push("No, sorry : non, désolé (refus poli)")>><<set $score += 1>>
[[Continue the visit|LouvreEnjoy]]<h1>Sneaky photo</h1>
You sneak a quick photo. The guard catches you.
"Sir! No photos. Please delete that, now."
You delete it, embarrassed. A tourist next to you gives you a sympathetic <<linkreplace "glance">><span class="vocab-reveal">glance (<span class="french-trans">coup d'œil, regard bref</span>)</span><<run $vocab_list.push("Glance : coup d'œil")>><<set $score += 1>><</linkreplace>>.
<div class="pedagogy pedagogy-error">
😬 Caught by a Louvre guard = -2 confidence. You still learn "delete that, please".
</div>
<<set $confidence -= 2>>
<<run $vocab_list.push("Please delete that : veuillez supprimer ça")>><<set $score += 1>>
[[Move on, red-faced|LouvreEnjoy]]<h1>The bistro evening</h1>
You spend the afternoon in the museum. By 6 PM, your feet are <<linkreplace "aching">><span class="vocab-reveal">aching (<span class="french-trans">qui fait mal, endolori</span>)</span><<run $vocab_list.push("Aching : endolori")>><<set $score += 1>><</linkreplace>>. You find a small bistro near Saint-Germain-des-Prés.
The waiter hands you a menu in French. You can read a few items but not everything. Tonight is your chance.
[[Order the duck confit|DinnerOrderDuck]]
[[Order the safer option: steak-frites|DinnerOrderSteak]]
[[Ask the waiter for a recommendation|DinnerAskReco]]<h1>"I'll have the duck confit."</h1>
"I'll have the duck confit, please. And a glass of red wine — nothing too expensive."
The waiter smiles. "Excellent choice. The confit is from the southwest. Would you like a Cahors?"
You beam. "Anything not too expensive" worked perfectly.
<div class="pedagogy pedagogy-success">
🍷 "Nothing too expensive, please" = the magic formula for ordering wine. +2 score, +1 confidence.
</div>
<<set $score += 2>><<set $confidence += 1>>
<<run $vocab_list.push("Duck confit : canard confit")>><<set $score += 1>>
<<run $vocab_list.push("Nothing too expensive : pas trop cher")>><<set $score += 1>>
[[Enjoy your meal|Day2End]]<h1>"Steak-frites, medium-rare."</h1>
"I'll have the steak-frites, please. Medium-rare."
The waiter notes it. "How would you like it cooked?"
You blush. "Sorry, I just said medium-rare."
He smiles. "Oh, ''saignant''! Yes, in France we say ''saignant'' — but I understand your English. Coming up."
<div class="pedagogy pedagogy-info">
🥩 <strong>Steak doneness in English:</strong><br>
- ''rare'' (saignant)<br>
- ''medium-rare'' (à point -)<br>
- ''medium'' (à point)<br>
- ''medium-well'' (à point +)<br>
- ''well-done'' (bien cuit)
</div>
<<run $vocab_list.push("Steak-frites : steak-frites")>><<set $score += 1>>
<<run $vocab_list.push("Medium-rare : à point - ('saignant' en France)")>><<set $score += 1>>
[[Enjoy|Day2End]]<h1>"What would you recommend?"</h1>
"What would you recommend tonight?"
The waiter lights up. He describes the chef's special: roasted lamb with herbs from Provence. 26€, but he says it's worth every <<linkreplace "penny">><span class="vocab-reveal">penny (<span class="french-trans">centime (mais 'penny' au singulier = 'ça vaut le coup')</span>)</span><<run $vocab_list.push("Worth every penny : vaut chaque centime")>><<set $score += 1>><</linkreplace>>.
You try it. It's incredible.
<div class="pedagogy pedagogy-success">
🌟 "What would you recommend?" = the phrase that opens every door at the bistro. +2 score.
</div>
<<set $score += 2>>
<<run $vocab_list.push("Recommend : recommander")>><<set $score += 1>>
[[Walk back to your hotel|Day2End]]<h1>🌙 End of Day 2</h1>
You walk back to the hotel, feeling the cool evening air. Day 2 is over. You've walked many miles and spoken to many different people.
🏨 You're back in Room 12. You sit on the bed and check your stats:
<div class="pedagogy pedagogy-info">
📊 <strong>Day 2 Summary:</strong><br>
- Words learned: <<print $vocab_list.length>><br>
- Total Score: <<print $score>> ⭐<br>
- Mistakes today: <<print $mistakes>><br>
- Confidence Level: <<print $confidence>> / <<print $max_confidence>>
</div>
<<if $confidence lte 0>>
[[...|GameOver]]
<<else>>
<<set $day to 3>>
<<inventory_alert "🌙" "Confidence +1! Your brain is consolidating all those new words while you sleep.">>
<<set $confidence += 1>>
Tomorrow is <em>Day 3</em>. You're starting to feel quite at home in Paris!
[[🧠 Take the Daily Vocab Review|VocabReview]] <<set $review_init to true>>
[[☀️ Day 3: Final day, Eiffel Tower|Day3Morning]]
<</if>><h1>☀️ Day 3: Last day in Paris</h1>
You check out of the hotel at 11 AM. Your train back isn't until 8 PM. All day free.
Options:
- Walk along the Seine to the Eiffel Tower area.
- Visit Montmartre and the Sacré-Cœur.
- Wander the Marais.
You choose the Seine.
[[Start walking|SeineWalk]]
[[Take a quick metro|SeineMetroShortcut]]<h1>The Seine quays</h1>
You start walking along the <<linkreplace "quays">><span class="vocab-reveal">quays (<span class="french-trans">les quais de Seine — prononcer 'keys'</span>)</span><<run $vocab_list.push("Quay : quai (prononcer 'key')")>><<set $score += 1>><</linkreplace>>. The morning sun is gorgeous. Street artists are selling tiny <<linkreplace "sketches">><span class="vocab-reveal">sketches (<span class="french-trans">croquis, dessins rapides</span>)</span><<run $vocab_list.push("Sketch : croquis")>><<set $score += 1>><</linkreplace>> of the Eiffel Tower.
A young artist approaches you: "Would you like a portrait, sir? Only 25 euros. Five minutes."
[[Politely decline|SeineDecline]]
[[Accept and pose|SeineAccept]]<h1>"No, thank you."</h1>
"No, thank you. I'm just looking."
He smiles. "Have a good day, sir."
<div class="pedagogy pedagogy-success">
🎨 "No, thank you. I'm just looking." = the phrase to know to NOT get pulled in. +1 confidence.
</div>
<<set $confidence += 1>>
<<run $vocab_list.push("I'm just looking : je regarde juste (refus commercial poli)")>><<set $score += 1>>
[[Continue along the Seine|SeineContinue]]<h1>The portrait</h1>
You sit on his little stool. He draws quickly. 4 minutes later: a beautifully accurate portrait of you in front of the Seine.
"Excellent. Twenty-five euros, please."
You pay. He's happy. You have a memory.
<div class="pedagogy pedagogy-success">
🎨 Discovering a local artist live = +3 score and an unforgettable memory.
</div>
<<set $score += 3>>
<<run $inventory.push("Portrait sketch by a Seine artist (€25)")>>
[[Continue along the Seine|SeineContinue]]<h1>Quick metro</h1>
You take the métro to Concorde and walk the last 20 minutes. Faster, but you miss the bookshops (bouquinistes) along the river.
You arrive at the same spot as the walkers.
[[Same route as the walkers|SeineContinueSkipArt]]<h1>The bouquinistes</h1>
You pass the bouquinistes (green book-boxes on the wall). One calls out: "Would you like a vintage book, monsieur? Only 5 euros!"
[[Buy a vintage paperback|SeineBuyBook]]
[[Keep walking|SeineKeepWalking]]
[[Stop and ask what kind of books|SeineAskBooks]]<h1>A worn Hemingway</h1>
You buy a worn Hemingway novel for 5€. It's <<linkreplace "water-stained">><span class="vocab-reveal">water-stained (<span class="french-trans">taché par l'eau (livre qui a pris l'humidité)</span>)</span><<run $vocab_list.push("Water-stained : taché par l'eau")>><<set $score += 1>><</linkreplace>> but charming. He throws in a free Paris map.
<<run $inventory.push("Vintage Hemingway paperback (€5)")>><<set $score += 1>>
[[Continue|SeineEiffelApproach]]You smile and keep walking. He tips his hat.
[[Continue|SeineEiffelApproach]]<h1>"What kind of books?"</h1>
"What kind of books do you have?"
He shows you his collection: French classics, Hemingway in English, vintage Tintin, beat-up poetry books.
You pick a Hemingway novel for 5€.
<<run $inventory.push("Hemingway paperback (€5)")>><<set $score += 1>>
<<run $vocab_list.push("Vintage : ancien, vintage")>><<set $score += 1>>
[[Continue|SeineEiffelApproach]]You reach the same spot without the encounter with the artist or the bouquinistes. Slightly faster, slightly less rich.
[[Continue|SeineEiffelApproach]]<h1>🗼 The Eiffel Tower</h1>
You see it. Photographers everywhere. A couple next to you is asking the photographer: "Could you take a photo of us with the tower?"
You decide to ask a stranger for a photo.
"Excuse me, could you take a photo of me, please?"
[[Smile and hand them your phone|PhotoStranger]]
[[Try a selfie instead|PhotoSelfie]]<h1>The stranger's photo</h1>
The stranger takes 3 photos. One is perfect.
You say: "Thank you so much!"
<<run $vocab_list.push("Could you take a photo of me? : pourriez-vous me prendre en photo ?")>><<set $score += 1>>
<<run $vocab_list.push("Thank you so much : merci beaucoup")>><<set $score += 1>>
<div class="pedagogy pedagogy-success">
📸 You learned 2 key phrases for solo travel. +2 confidence.
</div>
<<set $confidence += 2>>
[[Head to the Trocadéro|Day3End]]<h1>The selfie</h1>
You take a selfie. It works, but the tower is mostly behind your head.
<div class="pedagogy pedagogy-info">
📱 Asking a stranger is better than a selfie. Selfie = OK as a last resort.
</div>
[[Head to the Trocadéro|Day3End]]<h1>🚄 Heading home</h1>
You catch the métro back to Gare du Nord. The train at 8 PM.
<div class="pedagogy pedagogy-info">
📊 <strong>Final stats:</strong><br>
- Total words: <<print $vocab_list.length>><br>
- Score: <<print $score>> ⭐<br>
- Confidence: <<print $confidence>> / <<print $max_confidence>><br>
- Inventory: <<print $inventory.length>> items
</div>
<<if $confidence lte 0>>
[[...|GameOver]]
<<elseif $score gte 25>>
Your French weekend was a triumph. You speak the language. You blend in.
[[See your full results|GameCompleted]]
<<else>>
You survived. Real life is harder than the game, but this was a good rehearsal.
[[See your full results|GameCompleted]]
<</if>>🎉 <strong>CONGRATULATIONS! YOU COMPLETED YOUR WEEKEND IN PARIS!</strong> 🎉
You have successfully navigated one of the most beautiful cities in the world!
<div class="pedagogy pedagogy-info">
📊 <strong>--- FINAL STATS ---</strong><br>
⭐ <strong>Total Score:</strong> <<print $score>> points<br>
💪 <strong>Final Confidence:</strong> <<print $confidence>> / <<print $max_confidence>><br>
📝 <strong>Mistakes Made:</strong> <<print $mistakes>><br>
</div>
<div class="signage">
🎒 <strong>YOUR INVENTORY</strong><br>
<<if $inventory.length == 0>>
Nothing? You travelled very light!
<<else>>
<ul>
<<for _i to 0; _i lt $inventory.length; _i++>>
<li><<print $inventory[_i]>></li>
<</for>>
</ul>
<</if>>
</div>
<div class="signage">
🇫🇷 <strong>YOUR PARISIAN VOCABULARY</strong><br>
You learned <strong><<print $vocab_list.length>></strong> new words and expressions!<br><br>
<ul>
<<for _i to 0; _i lt $vocab_list.length; _i++>>
<li><<print $vocab_list[_i]>></li>
<</for>>
</ul>
</div>
<<if $score gte 30>>
<h2 style="color:#10b981;">🏆 RANK: HONORARY PARISIAN</h2>
Bravo! You almost speak French like a local. Paris will be sad without you!
<<elseif $score gte 18>>
<h2 style="color:#fbbf24;">⭐ RANK: TRAVELLER</h2>
Not bad! You're getting by, and each trip will be easier.
<<else>>
<h2 style="color:#94a3b8;">🌱 RANK: BEGINNER</h2>
You started — that's the essential part. Your next trips will be easier thanks to this vocabulary list.
<</if>>
<br>
<div class="tew-footer" style="margin-top:30px;">
🇫🇷 Want more? Try <strong><a href="a-week-in-london.html">A Week in London</a></strong> or <strong><a href="a-day-at-the-office.html">A Day at the Office</a></strong>.
<br><br>
A Twine game by <a href="https://the-english-workshop.com/">The English Workshop</a> · Pau & Bordeaux
</div><<nobr>>
<<if $review_init is true>><<set $review_init to false>><<set $review_score to 0>><<set $review_total to Math.min($vocab_list.length, 5)>><<set $review_queue to [].concat($vocab_list).sort(() => Math.random() - 0.5).slice(0, $review_total)>><<set $review_index to 0>><<set $review_feedback to "">><</if>>
<<if $review_total == 0>><div class="quiz-container"><div class="quiz-feedback">No words collected yet! Click the blue words in the story first, then come back.</div></div><<else>><<set _currentRaw to $review_queue[$review_index]>><<set _splitIdx to _currentRaw.indexOf(" : ")>><<set _english to _currentRaw.slice(0, _splitIdx)>><<set _french to _currentRaw.slice(_splitIdx + 3)>>
<<set _sentence to window.getFillBlank(_english)>>
<<set _type to random(1, 3)>>
<<if _type == 3 and _sentence is null>><<set _type to random(1, 2)>><</if>>
<div class="quiz-container">
<div class="card-header">Question <<print $review_index + 1>> / <<print $review_total>></div>
<<if _type == 1>>
<div class="quiz-question">How do you say "''<<print _english>>''" in French?</div>
<div class="quiz-options"><<set _options to window.getQuizOptions(_currentRaw, $vocab_list)>><<for _opt range _options>><<capture _opt>><<set _optParts to window.vocabSplit(_opt)>><div class="quiz-option"><<link _optParts[1]>><<if _opt == _currentRaw>><<set $review_score += 1>><<set $score += 2>><<set $review_feedback to "✅ Correct! " + _english + " means " + _french + ".">><<run SugarCube.Engine.play("VocabReviewNext")>><<else>><<set $mistakes += 1>><<set $review_feedback to "❌ Not quite. " + _english + " means " + _french + ".">><<run SugarCube.Engine.play("VocabReviewNext")>><</if>><</link>></div><</capture>><</for>></div>
<<elseif _type == 2>>
<div class="quiz-question">Which English word means "''<<print _french>>''"?</div>
<div class="quiz-options"><<set _options to window.getQuizOptions(_currentRaw, $vocab_list)>><<for _opt range _options>><<capture _opt>><<set _optParts to window.vocabSplit(_opt)>><div class="quiz-option"><<link _optParts[0]>><<if _opt == _currentRaw>><<set $review_score += 1>><<set $score += 2>><<set $review_feedback to "✅ Correct! " + _english + " is the right word.">><<run SugarCube.Engine.play("VocabReviewNext")>><<else>><<set $mistakes += 1>><<set $review_feedback to "❌ Wrong one. The correct word was " + _english + ".">><<run SugarCube.Engine.play("VocabReviewNext")>><</if>><</link>></div><</capture>><</for>></div>
<<else>>
<div class="quiz-question">Fill in the blank:<br>''<<print _sentence.replace("___", "<span style='color:#f59e0b;font-size:1.2em'>______</span>")>>''
<br><span style="font-size:0.85em;color:#94a3b8">(<<print _french>>)</span></div>
<div class="quiz-options"><<set _options to window.getQuizOptions(_currentRaw, $vocab_list)>><<for _opt range _options>><<capture _opt>><<set _optParts to window.vocabSplit(_opt)>><div class="quiz-option"><<link _optParts[0]>><<if _opt == _currentRaw>><<set $review_score += 1>><<set $score += 2>><<set $review_feedback to "✅ Correct! The sentence is: " + _sentence.replace("___", _english) + ".">><<run SugarCube.Engine.play("VocabReviewNext")>><<else>><<set $mistakes += 1>><<set $review_feedback to "❌ Not quite. The answer was: " + _english + ".">><<run SugarCube.Engine.play("VocabReviewNext")>><</if>><</link>></div><</capture>><</for>></div>
<</if>>
</div>
<</if>>
<</nobr>><<nobr>>
<div class="quiz-container">
<div class="quiz-feedback"><<print $review_feedback>></div>
<<set $review_index += 1>>
<<if $review_index < $review_total>>
[[Next Question|VocabReview]]
<<else>>
<h3>Review Complete!</h3>
<p>You got <<print $review_score>> / <<print $review_total>> correct.</p>
<<if $review_score == $review_total and $review_total > 0>>
<div class="perfect-score">
🌟 PERFECT REVIEW! 🌟<br>
<<if $confidence == $max_confidence>><<set $max_confidence += 1>><<set $confidence += 1>>Max Confidence increased to <<print $max_confidence>>!
<<else>><<set $confidence += 1>>Confidence increased!
<</if>>
</div>
<</if>>
<<link "Go to sleep...">><<goto `"Day" + $day + "Morning"`>><</link>>
<</if>>
</div>
<</nobr>><<widget "inventory_alert">>
<<run window.showNotification(_args[0], _args[1])>>
<</widget>>