{"id":9505,"date":"2026-05-17T14:21:27","date_gmt":"2026-05-17T18:21:27","guid":{"rendered":"https:\/\/montrealtips.com\/cone-dodger\/"},"modified":"2026-05-17T15:03:20","modified_gmt":"2026-05-17T19:03:20","slug":"cone-dodger","status":"publish","type":"page","link":"https:\/\/montrealtips.com\/fr\/cone-dodger\/","title":{"rendered":"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos"},"content":{"rendered":"<style>\n\/* ===== Hide sidebar + maximize content width on this page only ===== *\/\n.page-id-9505 .sidebar, .page-id-9505 #right_sidebar, .page-id-9505 #left_sidebar,\n.page-id-9505 .av-sidebar-page, .page-id-9505 #sidebar { display: none !important; }\n.page-id-9505 .content, .page-id-9505 .post_content, .page-id-9505 .av-content-full,\n.page-id-9505 #main .container .content,\n.page-id-9505 .entry-content-wrapper .content { width: 100% !important; max-width: 100% !important; padding-right: 0 !important; border: 0 !important; }\n.page-id-9505 .container { max-width: 1200px !important; }<\/p>\n<p>\/* ===== Page styling ===== *\/\n.cd-hero { background: linear-gradient(135deg, #0a0a0d 0%, #1a1820 100%); color: #fff; padding: 40px 30px; border-radius: 12px; margin-bottom: 28px; text-align: center; }\n.cd-hero h1 { color: #ff9333 !important; font-size: 42px !important; margin: 0 0 12px !important; font-weight: 800 !important; line-height: 1.1 !important; letter-spacing: -1px !important; }\n.cd-hero p { font-size: 17px; color: #ccc; max-width: 720px; margin: 0 auto; line-height: 1.55; }\n.cd-hero .play-cta { display: inline-block; background: #ff9333; color: #000; padding: 12px 28px; border-radius: 8px; font-weight: 700; font-size: 15px; margin-top: 16px; text-decoration: none; }\n.cd-hero .play-cta:hover { background: #ffae5a; color: #000; }<\/p>\n<p> @keyframes cdPulse { 0%,100% { box-shadow: 0 4px 14px rgba(255,147,51,0.5); } 50% { box-shadow: 0 4px 28px rgba(255,147,51,0.9); transform: scale(1.04); } }\n.cd-fullscreen-btn:hover { background: #ffae5a; transform: scale(1.05); }<\/p>\n<p>.cd-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 24px; margin: 32px 0; }\n.cd-col { background: #f6f4ee; border-radius: 10px; padding: 22px 24px; border: 1px solid #e8e4d8; }\n.cd-col h3 { color: #cc4f1a !important; font-size: 18px !important; margin: 0 0 12px !important; font-weight: 700 !important; }\n.cd-col ul { margin: 0; padding-left: 18px; line-height: 1.7; color: #333; }\n.cd-col li { margin: 4px 0; font-size: 14px; }\n.cd-col code { background: #fff; padding: 1px 8px; border-radius: 4px; font-family: monospace; color: #cc4f1a; font-size: 13px; border: 1px solid #e0dccf; }<\/p>\n<p>.cd-section { margin: 36px 0; }\n.cd-section h2 { color: #1a1820 !important; font-size: 26px !important; margin: 0 0 14px !important; font-weight: 700 !important; border-bottom: 3px solid #ff9333 !important; padding-bottom: 8px !important; display: inline-block !important; }\n.cd-section p { font-size: 15px; line-height: 1.7; color: #444; margin: 0 0 14px; }<\/p>\n<p>.cd-features { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; margin: 18px 0; }\n.cd-feature { background: #fff; border: 1px solid #e8e4d8; padding: 16px 18px; border-radius: 8px; }\n.cd-feature .ico { font-size: 24px; margin-bottom: 6px; }\n.cd-feature h4 { color: #1a1820 !important; font-size: 14px !important; margin: 0 0 4px !important; font-weight: 700 !important; }\n.cd-feature p { font-size: 13px; color: #666; margin: 0; line-height: 1.5; }<\/p>\n<p>.cd-note { background: #fff7e6; border-left: 4px solid #ff9333; padding: 14px 18px; border-radius: 0 6px 6px 0; margin: 24px 0; font-size: 14px; color: #6a4a18; line-height: 1.6; }\n.cd-note b { color: #cc4f1a; }<\/p>\n<p>@media (max-width: 720px) {\n  .cd-hero h1 { font-size: 28px !important; }\n  .cd-hero { padding: 26px 18px; }\n  .cd-game-frame iframe { height: 70vh; min-height: 450px; }\n}<\/p>\n<p>.cd-frame { background: #14202a; border-radius: 14px; overflow: hidden; box-shadow: 0 8px 32px rgba(0,0,0,0.28); margin-bottom: 32px; border: 1px solid #222; }\n.cd-frame-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; background: linear-gradient(180deg, #1c2730 0%, #161e25 100%); border-bottom: 1px solid #222; }\n.cd-frame-title { color: #ddd; font-size: 13px; font-weight: 600; display: flex; align-items: center; gap: 8px; }\n.cd-dot { width: 9px; height: 9px; background: #1ec76d; border-radius: 50%; box-shadow: 0 0 8px #1ec76d; animation: cdDot 2s ease-in-out infinite; }\n@keyframes cdDot { 0%,100% { opacity: 0.6; } 50% { opacity: 1; } }\n.cd-frame-meta { color: #777; font-size: 11px; font-family: monospace; }\n.cd-frame-body { background: #14202a; line-height: 0; }\n.cd-frame-body iframe { width: 100%; height: 75vh; min-height: 580px; border: 0; display: block; background: #14202a; }\n.cd-frame-toolbar { display: flex; align-items: center; gap: 10px; padding: 12px 16px; background: #161e25; border-top: 1px solid #222; flex-wrap: wrap; }\n.cd-tb-btn { display: inline-flex; align-items: center; gap: 6px; background: rgba(255,255,255,0.06); color: #fff; border: 1px solid rgba(255,255,255,0.12); padding: 9px 16px; border-radius: 8px; font-size: 13px; font-weight: 600; cursor: pointer; text-decoration: none; transition: all 0.12s; font-family: inherit; }\n.cd-tb-btn:hover { background: rgba(255,147,51,0.15); border-color: #ff9333; color: #fff; transform: translateY(-1px); }\n.cd-tb-primary { background: #ff9333; color: #000; border-color: #ff9333; font-weight: 800; padding: 10px 20px; font-size: 14px; }\n.cd-tb-primary:hover { background: #ffae5a; color: #000; border-color: #ffae5a; }\n.cd-tb-btn kbd { background: rgba(0,0,0,0.3); color: inherit; border: 1px solid rgba(0,0,0,0.2); border-radius: 4px; padding: 1px 6px; font-family: monospace; font-size: 11px; margin-left: 4px; }\n.cd-tb-primary kbd { background: rgba(0,0,0,0.18); color: #000; border-color: rgba(0,0,0,0.25); }\n.cd-tb-spacer { flex: 1; }\n.cd-tb-tip { color: #888; font-size: 12px; font-style: italic; }\n@media (max-width: 700px) {\n  .cd-frame-toolbar { padding: 10px 12px; }\n  .cd-tb-tip { display: none; }\n  .cd-frame-meta { display: none; }\n  .cd-frame-body iframe { height: 65vh; min-height: 460px; }\n}\n<\/style>\n<div class=\"cd-hero\">\n<h1>Montr\u00e9al Cone Dodger<\/h1>\n<p>50 levels of Montr\u00e9al driving chaos. Survive construction season, navigate around BIXI riders and STM buses, dodge the SPVM, and listen to locals yell tabarnak. A love letter to the city&#8217;s eternal orange-cone season.<\/p>\n<p>  <a href=\"#game\" class=\"play-cta\">&#x25b6; Play now<\/a>\n<\/div>\n<div id=\"game\" class=\"cd-frame\">\n<div class=\"cd-frame-header\">\n<div class=\"cd-frame-title\"><span class=\"cd-dot\"><\/span> Montr\u00e9al Cone Dodger \u00b7 50 levels<\/div>\n<div class=\"cd-frame-meta\">v4 \u00b7 made in MTL<\/div>\n<\/p><\/div>\n<div class=\"cd-frame-body\">\n    <iframe id=\"cd-iframe\" src=\"https:\/\/montrealtips.com\/wp-content\/uploads\/2026\/05\/montreal-cone-dodger-v4.html\" loading=\"lazy\" allow=\"fullscreen *\" allowfullscreen title=\"Montreal Cone Dodger\"><\/iframe>\n  <\/div>\n<div class=\"cd-frame-toolbar\">\n    <button class=\"cd-tb-btn cd-tb-primary\" onclick=\"cdToggleFullscreen()\" title=\"Press F for fullscreen\">\u26f6 Fullscreen <kbd>F<\/kbd><\/button><br \/>\n    <button class=\"cd-tb-btn\" onclick=\"document.getElementById('cd-iframe').contentWindow.location.reload(); return false;\" title=\"Restart game\">\u21bb Restart<\/button><br \/>\n    <a class=\"cd-tb-btn\" href=\"#how-to-play\" title=\"Jump to controls\">&#x2b07; Controls<\/a><\/p>\n<div class=\"cd-tb-spacer\"><\/div>\n<div class=\"cd-tb-tip\">Tip: click inside the game first, then use the keyboard<\/div>\n<\/p><\/div>\n<\/div>\n<div class=\"cd-cols\" id=\"how-to-play\">\n<div class=\"cd-col\">\n<h3>&#x1f3ae; Controls<\/h3>\n<ul>\n<li><code>\u2191\u2193\u2190\u2192<\/code> or <code>WASD<\/code> \u2014 drive<\/li>\n<li><code>Space<\/code> \u2014 brake<\/li>\n<li><code>H<\/code> \u2014 honk (annoys locals &#x1f3ba;)<\/li>\n<li><code>R<\/code> \u2014 reset the level<\/li>\n<li><code>U<\/code> \u2014 unstick the car<\/li>\n<li><code>Esc<\/code> \u2014 back to level menu<\/li>\n<\/ul><\/div>\n<div class=\"cd-col\">\n<h3>&#x26a0;&#xfe0f; What to avoid<\/h3>\n<ul>\n<li>Orange cones (eternal construction)<\/li>\n<li>Nids-de-poule (potholes)<\/li>\n<li>STM buses + traffic cars<\/li>\n<li>BIXI cyclists (you&#8217;ll get yelled at)<\/li>\n<li>Bike lanes (cyclists will yell)<\/li>\n<li>The SPVM at high wanted level<\/li>\n<\/ul><\/div>\n<div class=\"cd-col\">\n<h3>&#x1f3c6; Stars (per level)<\/h3>\n<ul>\n<li>&#x2b50;&#x2b50;&#x2b50; \u2014 clean, fast, low-damage run<\/li>\n<li>&#x2b50;&#x2b50; \u2014 solid finish<\/li>\n<li>&#x2b50; \u2014 survived, somehow<\/li>\n<li>Cops 1 cop catches = arrested<\/li>\n<li>Outrun cops 750m for 5s to lose them<\/li>\n<\/ul><\/div>\n<\/div>\n<div class=\"cd-section\">\n<h2>About the game<\/h2>\n<p>You drive a red taxi across an island-shaped map of Montr\u00e9al, from a starting point like Old Port or Schwartz&#8217;s to a destination like Mont Royal or the Stade Olympique. Each of the 50 levels has its own start, end, and difficulty \u2014 more cones, more cops, faster traffic, and tighter time limits as you climb.<\/p>\n<p>The map is studded with Montr\u00e9al landmarks rendered in pixel form: the Centre Bell flying a Habs flag, St-Viateur Bagels, La Banquise poutine truck, the Biosph\u00e8re, Habitat 67, the Olympic Stadium&#8217;s leaning tower, Notre-Dame&#8217;s twin spires, March\u00e9 Jean-Talon, Bota Bota spa, BIXI stations, d\u00e9panneurs, and Schwartz&#8217;s smoked meat. Honk near a sidewalk and Quebec slang erupts in speech bubbles overhead.<\/p>\n<\/div>\n<div class=\"cd-section\">\n<h2>Why this game exists<\/h2>\n<p>Montr\u00e9al is one of the most charming and infuriating cities in North America to drive in. The orange cones never leave, the potholes have their own ecosystem, the bike lanes are sacred, and someone is always yelling. This game is a tribute to all of that \u2014 playable in your browser, no download needed.<\/p>\n<div class=\"cd-features\">\n<div class=\"cd-feature\">\n<div class=\"ico\">&#x1f6a7;<\/div>\n<h4>Eternal construction<\/h4>\n<p>Cones scattered across every street, with extra in the worst zones.<\/p>\n<\/div>\n<div class=\"cd-feature\">\n<div class=\"ico\">&#x1f6b2;<\/div>\n<h4>Bike-lane irony<\/h4>\n<p>Drive on the bike lane and the cyclists will let you know.<\/p>\n<\/div>\n<div class=\"cd-feature\">\n<div class=\"ico\">&#x1f68c;<\/div>\n<h4>STM + traffic AI<\/h4>\n<p>Buses and cars actually drive their lanes. Don&#8217;t broadside them.<\/p>\n<\/div>\n<div class=\"cd-feature\">\n<div class=\"ico\">&#x1f46e;<\/div>\n<h4>SPVM wanted system<\/h4>\n<p>Hit too many cones, the police chase. Escape 750m for 5 sec to lose them.<\/p>\n<\/div>\n<div class=\"cd-feature\">\n<div class=\"ico\">&#x1f5e3;&#xfe0f;<\/div>\n<h4>Quebec slang<\/h4>\n<p>Drive past NPCs and they yell TABARNAK, C\u00c2LISSE, BONJOUR-HI\u2026<\/p>\n<\/div>\n<div class=\"cd-feature\">\n<div class=\"ico\">&#x1f3d2;<\/div>\n<h4>GO HABS GO<\/h4>\n<p>Centre Bell rendered downtown with a CH flag flying.<\/p>\n<\/div><\/div>\n<\/div>\n<div class=\"cd-note\">\n  <b>Heads up:<\/b> the game is built for desktop\/laptop with a keyboard. Mobile and tablet may work but touch controls aren&#8217;t implemented yet \u2014 use a real keyboard for the full experience.\n<\/div>\n<div class=\"cd-section\">\n<h2>50 levels \u2014 a sampling<\/h2>\n<p>From <em>Tabarnak Test Drive<\/em> (Level 1) through evergreen routes like <em>Old Port to Mont Royal<\/em>, <em>Bagel Run St-Viateur<\/em>, <em>Habs Game Day Rush<\/em>, and themed challenges like <em>Pothole Apocalypse<\/em>, <em>Construction Season<\/em>, <em>BIXI Battle Royal<\/em>, <em>Jazz Fest Frenzy<\/em>, all the way up to the brutally difficult <em>ULTIMATE TABARNAK FINAL<\/em> at Level 50. Each level has its own start and end across the island and earns up to &#x2b50;&#x2b50;&#x2b50;.<\/p>\n<\/div>\n<div class=\"cd-section\">\n<h2>About Montr\u00e9al Tips<\/h2>\n<p>This game is part of <a href=\"https:\/\/montrealtips.com\/\">Montr\u00e9al Tips<\/a>, a local guide to the city&#8217;s neighbourhoods, parks, hikes, food, and life. If you enjoyed the game, check out the actual guides for things to do in Montr\u00e9al \u2014 minus the cops, minus the cones, plus the chocolate.<\/p>\n<\/div>\n<p><script>\n\/\/ ===== Cone Dodger gamification patch (loaded by parent page) =====\n(function() {\n  var iframe = document.getElementById('cd-iframe');\n  if (!iframe) return;\n  iframe.addEventListener('load', function() {\n    var win, doc;\n    try { win = iframe.contentWindow; doc = iframe.contentDocument; } catch(e) { return; }\n    if (!win || !doc) return;\n    var tryPatch = setInterval(function() {\n      if (typeof win.loadLevel === 'function' && win.car && win.STREETS_H) {\n        clearInterval(tryPatch);\n        patchGame(win, doc);\n      }\n    }, 100);\n    setTimeout(function() { clearInterval(tryPatch); }, 15000);\n  });<\/p>\n<p>  function patchGame(win, doc) {\n    \/\/ --- 1. Spawn fix: snap to nearest road intersection if stuck ---\n    var origLoad = win.loadLevel;\n    win.loadLevel = function(idx) {\n      origLoad.call(win, idx);\n      var stuck = !!win.inBuilding(win.car.x, win.car.y);\n      if (!stuck && !win.onRoad(win.car.x, win.car.y)) stuck = true;\n      if (stuck) {\n        var best = null, bestD = Infinity;\n        for (var i=0;i<win.STREETS_H.length;i++) for (var j=0;j<win.STREETS_V.length;j++) {\n          var sx = win.STREETS_V[j].x, sy = win.STREETS_H[i].y;\n          if (win.inBuilding(sx, sy) || !win.pointInIsland(sx, sy)) continue;\n          var d = Math.hypot(win.car.x - sx, win.car.y - sy);\n          if (d < bestD) { bestD = d; best = { x: sx, y: sy }; }\n        }\n        if (best) {\n          win.car.x = best.x; win.car.y = best.y;\n          win.car.angle = Math.atan2(win.levelEnd.y - win.car.y, win.levelEnd.x - win.car.x);\n          win.cameraX = best.x; win.cameraY = best.y;\n        }\n      }\n      \/\/ Reset gamification state for new level\n      GS.combo = 0; GS.comboTime = Date.now();\n      GS.bonusPoints = 0; GS.zonesVisited = {};\n      GS.lastHits = 0; GS.lastCrashes = 0; GS.lastPotholes = 0;\n      GS.lastEventTime = Date.now() + 6000;\n      GS.honks = 0;\n    };\n\n    \/\/ --- 2. Game state ---\n    var GS = win.GS = {\n      combo: 0, comboTime: Date.now(), bonusPoints: 0,\n      zonesVisited: {}, honks: 0,\n      lastHits: 0, lastCrashes: 0, lastPotholes: 0,\n      lastEventTime: Date.now() + 6000\n    };\n\n    \/\/ --- 3. Bonus toast overlay (injected into iframe doc) ---\n    function showBonus(msg, color, big) {\n      var t = doc.createElement('div');\n      t.textContent = msg;\n      var size = big ? 19 : 15;\n      t.style.cssText = 'position:fixed;top:' + (110 + Math.random()*80) + 'px;right:30px;background:rgba(0,0,0,0.9);color:' + color + ';padding:11px 20px;border-radius:8px;font-size:' + size + 'px;font-weight:700;z-index:999;border:1px solid ' + color + ';pointer-events:none;transition:all 0.45s cubic-bezier(0.2,0.8,0.2,1);transform:translateX(140%);font-family:-apple-system,BlinkMacSystemFont,sans-serif;text-shadow:1px 1px 0 #000;';\n      doc.body.appendChild(t);\n      setTimeout(function(){ t.style.transform = 'translateX(0)'; }, 30);\n      setTimeout(function(){ t.style.transform = 'translateX(140%)'; t.style.opacity = '0'; }, 2700);\n      setTimeout(function(){ if(t.parentNode) t.remove(); }, 3500);\n    }\n\n    \/\/ --- 4. Combo system tracking ---\n    setInterval(function() {\n      if (!win.currentLevel || win.won || win.lost) return;\n      var h = win.hits || 0, c = win.crashCount || 0, p = win.potholeHits || 0;\n      if (h > GS.lastHits || c > GS.lastCrashes || p > GS.lastPotholes) {\n        if (GS.combo >= 1) showBonus('Combo lost!', '#ff5a5a');\n        GS.combo = 0; GS.comboTime = Date.now();\n      } else {\n        var sec = (Date.now() - GS.comboTime) \/ 1000;\n        var nc = Math.min(4, Math.floor(sec \/ 6));\n        if (nc > GS.combo) {\n          GS.combo = nc;\n          showBonus('Combo \u00d7' + (GS.combo + 1) + '!', '#ffd83d');\n          GS.bonusPoints += 80 * GS.combo;\n        }\n      }\n      GS.lastHits = h; GS.lastCrashes = c; GS.lastPotholes = p;\n    }, 1000);<\/p>\n<p>    \/\/ --- 5. Zone-based bonuses (visit landmarks for points + jokes) ---\n    var ZONES = [\n      { id:'mcgill', x:1500, y:760, r:80, msg:'McGill \u226b Concordia. +200 prestige', pts:200 },\n      { id:'concordia', x:1350, y:860, r:55, msg:'Concordia... McGill still > you &#x1f60f;', pts:50 },\n      { id:'bell', x:1500, y:900, r:90, msg:'GO HABS GO! +300', pts:300 },\n      { id:'oldport', x:1750, y:1430, r:120, msg:'Vieux-Port nostalgia +100', pts:100 },\n      { id:'olympic', x:2700, y:950, r:110, msg:'Loup Olympique +150', pts:150 },\n      { id:'biosphere', x:2500, y:1750, r:80, msg:'Geodesic dome vibes +120', pts:120 },\n      { id:'mountain', x:1700, y:540, r:220, msg:'Mont Royal energy +180', pts:180 },\n      { id:'schwartz', x:1620, y:540, r:55, msg:'Schwartz\\'s smoked meat +150', pts:150 },\n      { id:'bagel', x:1750, y:480, r:55, msg:'St-Viateur bagel buff +130', pts:130 },\n      { id:'tamtams', x:1700, y:680, r:100, msg:'Tam-Tams Sunday +120', pts:120 },\n      { id:'jt', x:1850, y:380, r:80, msg:'March\u00e9 Jean-Talon +100', pts:100 },\n      { id:'casino', x:2000, y:1280, r:60, msg:'Casino jackpot +250', pts:250 },\n      { id:'verdun', x:1100, y:1280, r:110, msg:'Verdun riverside +100', pts:100 },\n      { id:'jazz', x:1800, y:1310, r:60, msg:'Jazz Fest energy +180', pts:180 },\n      { id:'banquise', x:1900, y:680, r:55, msg:'La Banquise 24h poutine +140', pts:140 },\n      { id:'westmount', x:1200, y:700, r:90, msg:'Westmount old money +80', pts:80 },\n      { id:'plateau', x:1850, y:700, r:120, msg:'Plateau brunch boost +110', pts:110 },\n      { id:'mileend', x:2100, y:540, r:100, msg:'Mile End cool points +120', pts:120 }\n    ];\n    setInterval(function() {\n      if (!win.currentLevel || win.won || win.lost) return;\n      for (var i=0;i<ZONES.length;i++) {\n        var z = ZONES[i];\n        if (GS.zonesVisited[z.id]) continue;\n        var d = Math.hypot(win.car.x - z.x, win.car.y - z.y);\n        if (d < z.r) {\n          GS.zonesVisited[z.id] = true;\n          GS.bonusPoints += z.pts;\n          showBonus(z.msg, '#1ec76d', true);\n        }\n      }\n    }, 500);\n\n    \/\/ --- 6. Random surprise events (Quebec taxes + good news) ---\n    var EVENTS = [\n      { m:'TAXE DE BIENVENUE! \u2212300', d:-300, c:'#ff5a5a' },\n      { m:'TPS + TVQ! \u2212150', d:-150, c:'#ff5a5a' },\n      { m:'Hydro-Qu\u00e9bec rebate +200', d:200, c:'#1ec76d' },\n      { m:'CAQ surprise bill \u2212250', d:-250, c:'#ff5a5a' },\n      { m:'BIXI tip jar +100', d:100, c:'#1ec76d' },\n      { m:'SAAQ refund +180', d:180, c:'#1ec76d' },\n      { m:'PEQ approval bonus +250', d:250, c:'#1ec76d' },\n      { m:'CAA renewal fee \u2212120', d:-120, c:'#ff5a5a' },\n      { m:'Bonjour-Hi compliance +150', d:150, c:'#1ec76d' },\n      { m:'Bill 96 paperwork \u2212200', d:-200, c:'#ff5a5a' },\n      { m:'STM tap-tap bonus +90', d:90, c:'#1ec76d' },\n      { m:'Sugar shack maple bonus +220', d:220, c:'#1ec76d' },\n      { m:'SQDC discount +130', d:130, c:'#1ec76d' },\n      { m:'Property tax due \u2212280', d:-280, c:'#ff5a5a' },\n      { m:'Snow removal fee \u221290', d:-90, c:'#ff5a5a' },\n      { m:'Tim Hortons rewards +60', d:60, c:'#1ec76d' },\n      { m:'TPS rebate cheque +170', d:170, c:'#1ec76d' },\n      { m:'Welcome to Quebec! \u22121$ for chocolate', d:-1, c:'#888' }\n    ];\n    setInterval(function() {\n      if (!win.currentLevel || win.won || win.lost) return;\n      if (Date.now() < GS.lastEventTime) return;\n      var ev = EVENTS[Math.floor(Math.random() * EVENTS.length)];\n      GS.bonusPoints += ev.d;\n      showBonus(ev.m, ev.c);\n      GS.lastEventTime = Date.now() + 16000 + Math.random() * 22000;\n    }, 1000);\n\n    \/\/ --- 7. Honk milestones ---\n    win.addEventListener('keydown', function(e) {\n      var k = (e.key || '').toLowerCase();\n      if (k === 'h') {\n        GS.honks++;\n        if (GS.honks === 5) { showBonus('&#x1f3c6; 5 honks!', '#ffd83d'); GS.bonusPoints += 100; }\n        if (GS.honks === 15) { showBonus('&#x1f3c6; HONK MASTER!', '#ffd83d', true); GS.bonusPoints += 300; }\n      }\n    });\n\n    \/\/ --- 8. Combo indicator in HUD ---\n    var comboEl = doc.createElement('div');\n    comboEl.id = 'cd-combo';\n    comboEl.style.cssText = 'position:fixed;top:330px;left:14px;background:rgba(255,216,61,0.95);color:#000;padding:8px 16px;border-radius:8px;font-weight:800;font-size:18px;display:none;pointer-events:none;font-family:-apple-system,sans-serif;z-index:50;box-shadow:0 2px 8px rgba(0,0,0,0.3);';\n    doc.body.appendChild(comboEl);\n    setInterval(function() {\n      if (GS.combo >= 1 && win.currentLevel && !win.won && !win.lost) {\n        comboEl.style.display = 'block';\n        comboEl.textContent = '&#x1f525; COMBO \u00d7' + (GS.combo + 1);\n      } else {\n        comboEl.style.display = 'none';\n      }\n    }, 250);<\/p>\n<p>    \/\/ --- 9. Bonus points indicator ---\n    var bpEl = doc.createElement('div');\n    bpEl.id = 'cd-bp';\n    bpEl.style.cssText = 'position:fixed;top:380px;left:14px;background:rgba(0,0,0,0.85);color:#1ec76d;padding:6px 14px;border-radius:6px;font-weight:700;font-size:14px;pointer-events:none;font-family:-apple-system,sans-serif;z-index:50;border:1px solid rgba(30,199,109,0.4);';\n    bpEl.textContent = 'Bonus: 0';\n    doc.body.appendChild(bpEl);\n    setInterval(function() {\n      if (win.currentLevel && !win.won && !win.lost) {\n        bpEl.style.display = 'block';\n        bpEl.textContent = 'Bonus: ' + (GS.bonusPoints >= 0 ? '+' : '') + GS.bonusPoints + ' \u00b7 Zones: ' + Object.keys(GS.zonesVisited).length + '\/' + ZONES.length;\n        bpEl.style.color = GS.bonusPoints >= 0 ? '#1ec76d' : '#ff5a5a';\n      } else {\n        bpEl.style.display = 'none';\n      }\n    }, 500);<\/p>\n<p>    \/\/ --- 10. Hook into showEnd to add bonus to score + breakdown ---\n    var origShowEnd = win.showEnd;\n    win.showEnd = function(badEnding, reason) {\n      origShowEnd.call(win, badEnding, reason);\n      setTimeout(function() {\n        var scoreEl = doc.getElementById('end-score');\n        if (!scoreEl) return;\n        var base = parseInt(scoreEl.textContent.replace(\/[^0-9]\/g, '')) || 0;\n        var comboBonus = Math.round(base * GS.combo * 0.08);\n        var total = Math.max(0, base + comboBonus + GS.bonusPoints);\n        scoreEl.textContent = total.toLocaleString();\n        var overlay = doc.getElementById('overlay');\n        if (overlay && !doc.getElementById('cd-bonus-breakdown')) {\n          var div = doc.createElement('div');\n          div.id = 'cd-bonus-breakdown';\n          div.style.cssText = 'margin-top:10px;font-size:13px;color:#ccc;text-align:center;max-width:520px;line-height:1.5;';\n          div.innerHTML = 'Base <b style=\"color:#fff\">' + base.toLocaleString() + '<\/b> \u00b7 Combo bonus <b style=\"color:#ffd83d\">+' + comboBonus.toLocaleString() + '<\/b> \u00b7 Surprise events <b style=\"color:' + (GS.bonusPoints>=0?'#1ec76d':'#ff5a5a') + '\">' + (GS.bonusPoints>=0?'+':'') + GS.bonusPoints.toLocaleString() + '<\/b> \u00b7 Zones <b style=\"color:#fff\">' + Object.keys(GS.zonesVisited).length + '\/' + ZONES.length + '<\/b> \u00b7 Honks <b style=\"color:#fff\">' + GS.honks + '<\/b>';\n          var actions = overlay.querySelector('.actions');\n          if (actions) overlay.insertBefore(div, actions);\n        }\n      }, 60);\n    };<\/p>\n<p>    console.log('\u2713 Cone Dodger gamification patch loaded');\n  }\n})();\n<\/script><br \/>\n<script>\n\/\/ ===== Cone Dodger BRIDGES + ISLANDS patch (loaded by parent page) =====\n(function() {\n  var iframe = document.getElementById('cd-iframe');\n  if (!iframe) return;\n  iframe.addEventListener('load', function() {\n    var win, doc;\n    try { win = iframe.contentWindow; doc = iframe.contentDocument; } catch(e) { return; }\n    if (!win || !doc) return;\n    var tryPatch = setInterval(function() {\n      if (typeof win.pointInIsland === 'function' && typeof win.draw === 'function' && win.STREETS_H) {\n        clearInterval(tryPatch);\n        patchBridges(win, doc);\n      }\n    }, 100);\n    setTimeout(function() { clearInterval(tryPatch); }, 15000);\n  });<\/p>\n<p>  function patchBridges(win, doc) {\n    \/\/ ===== Extended drivable areas (the small islands + Cit\u00e9-du-Havre + bridge corridors) =====\n    var origInIsland = win.pointInIsland;\n    win.pointInIsland = function(x, y) {\n      if (origInIsland(x, y)) return true;\n      \/\/ \u00cele Sainte-H\u00e9l\u00e8ne\n      var ax = (x - 2500) \/ 230, ay = (y - 1750) \/ 80;\n      if (ax*ax + ay*ay <= 1) return true;\n      \/\/ \u00cele Notre-Dame\n      ax = (x - 2200) \/ 190; ay = (y - 1850) \/ 60;\n      if (ax*ax + ay*ay <= 1) return true;\n      \/\/ Cit\u00e9-du-Havre strip (where Habitat 67 lives)\n      if (x > 1830 && x < 1990 &#038;&#038; y > 1525 && y < 1680) return true;\n\n      \/\/ Bridge corridors - allow driving on them\n      \/\/ Pont Jacques-Cartier (Old Port \u2192 \u00cele Ste-H\u00e9l\u00e8ne \u2192 Longueuil)\n      if (Math.abs(x - 2350) < 14 &#038;&#038; y > 1480 && y < 1850) return true;\n      \/\/ Pont de la Concorde (Old Port \u2192 Cit\u00e9-du-Havre\/\u00cele Ste-H\u00e9l\u00e8ne)\n      if (Math.abs(x - 1900) < 14 &#038;&#038; y > 1510 && y < 1660) return true;\n      \/\/ Pont des \u00celes (\u00cele Ste-H\u00e9l\u00e8ne \u2192 \u00cele Notre-Dame)\n      if (x > 2180 && x < 2520 &#038;&#038; Math.abs(y - 1800) < 14) return true;\n      \/\/ Pont Samuel-De Champlain (Saint-Henri \u2192 \u00cele des S\u0153urs \u2192 Brossard)\n      if (Math.abs(x - 1350) < 14 &#038;&#038; y > 1470 && y < 1750) return true;\n      \/\/ Pont Victoria (downtown \u2192 Saint-Lambert)\n      if (Math.abs(x - 1620) < 12 &#038;&#038; y > 1470 && y < 1750) return true;\n      \/\/ Pont Mercier (LaSalle \u2192 Kahnawake)\n      if (Math.abs(x - 950) < 12 &#038;&#038; y > 1380 && y < 1700) return true;\n      \/\/ Pont M\u00e9d\u00e9ric-Martin (A-15 to Laval) - north\n      if (Math.abs(x - 1700) < 14 &#038;&#038; y > 100 && y < 290) return true;\n      \/\/ Pont Pie-IX (to Laval)\n      if (Math.abs(x - 2800) < 12 &#038;&#038; y > 130 && y < 290) return true;\n      \/\/ Pont Papineau-Leblanc (A-19 to Laval)\n      if (Math.abs(x - 2300) < 12 &#038;&#038; y > 130 && y < 290) return true;\n      \/\/ Pont Charles-De Gaulle (A-40 east, to Repentigny)\n      if (x > 3050 && x < 3200 &#038;&#038; Math.abs(y - 900) < 12) return true;\n      \/\/ Pont-tunnel La Fontaine area (east)\n      if (x > 2950 && x < 3150 &#038;&#038; Math.abs(y - 1300) < 12) return true;\n\n      return false;\n    };\n\n    \/\/ Also extend river push-back to push toward sensible center based on car location\n    \/\/ (helps if car is on a small island it shouldn't auto-jump back to mainland)\n    \/\/ We do this by overriding the in-update push but only when far from any drivable area\n    \/\/ Easier: just leave existing push-back which uses pointInIsland \u2014 since we extended that,\n    \/\/ the car can now stay on small islands without getting pushed back.\n\n    \/\/ ===== Add MORE visible bridges to the map (hook into draw) =====\n    var origDraw = win.draw;\n    win.draw = function() {\n      origDraw.call(win);\n      if (!win.currentLevel) return;\n      var ctx = win.ctx, W = win.W, H = win.H;\n      var ox = -win.cameraX + W\/2, oy = -win.cameraY + H\/2;\n      ctx.fillStyle = '#46464e';\n\n      \/\/ Pont Victoria (downtown south to Saint-Lambert)\n      ctx.fillRect(1614 + ox, 1485 + oy, 12, 260);\n      \/\/ Pont Mercier (LaSalle south)\n      ctx.fillRect(944 + ox, 1380 + oy, 12, 310);\n      \/\/ Pont des \u00celes (between \u00cele Ste-H\u00e9l\u00e8ne and \u00cele Notre-Dame, horizontal)\n      ctx.fillRect(2180 + ox, 1794 + oy, 340, 12);\n      \/\/ Pont Charles-De Gaulle (east, A-40)\n      ctx.fillRect(3050 + ox, 894 + oy, 150, 12);\n      \/\/ Pont-tunnel La Fontaine (east)\n      ctx.fillRect(2950 + ox, 1294 + oy, 200, 12);\n      \/\/ Pont M\u00e9d\u00e9ric-Martin (A-15 north)\n      ctx.fillRect(1694 + ox, 100 + oy, 12, 200);\n      \/\/ Pont Pie-IX north\n      ctx.fillRect(2794 + ox, 130 + oy, 12, 170);\n      \/\/ Pont Papineau-Leblanc north (A-19)\n      ctx.fillRect(2294 + ox, 130 + oy, 12, 180);\n\n      \/\/ Add bridge labels in faded text\n      ctx.fillStyle = 'rgba(255,255,255,0.35)';\n      ctx.font = '10px sans-serif';\n      ctx.textAlign = 'center';\n      ctx.save();\n      ctx.translate(1620 + ox, 1610 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('Pont Victoria', 0, 0); ctx.restore();\n      ctx.save(); ctx.translate(950 + ox, 1530 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('Pont Mercier', 0, 0); ctx.restore();\n      ctx.fillText('Pont des \u00celes', 2350 + ox, 1788 + oy);\n      ctx.fillText('A-40 \u2192 Repentigny', 3120 + ox, 888 + oy);\n      ctx.fillText('Tunnel L-H-La Fontaine', 3030 + ox, 1288 + oy);\n      ctx.save(); ctx.translate(1700 + ox, 200 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('A-15 \u2192 Laval', 0, 0); ctx.restore();\n      ctx.save(); ctx.translate(2800 + ox, 215 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('Pont Pie-IX \u2192 Laval', 0, 0); ctx.restore();\n      ctx.save(); ctx.translate(2300 + ox, 220 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('A-19 \u2192 Laval', 0, 0); ctx.restore();\n\n      \/\/ Also label the existing three bridges that were missing names\n      ctx.save(); ctx.translate(2350 + ox, 1600 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('Pont Jacques-Cartier', 0, 0); ctx.restore();\n      ctx.save(); ctx.translate(1900 + ox, 1580 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('Pont de la Concorde', 0, 0); ctx.restore();\n      ctx.save(); ctx.translate(1350 + ox, 1600 + oy); ctx.rotate(-Math.PI\/2);\n      ctx.fillText('Pont Champlain', 0, 0); ctx.restore();\n    };\n\n    console.log('\u2713 Cone Dodger bridges + islands patch loaded');\n  }\n})();\n<\/script><\/p>\n<p><script>\n(function() {\n  function getFsEl() { return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement; }\n  window.cdToggleFullscreen = function() {\n    var iframe = document.getElementById('cd-iframe');\n    var wrap = document.querySelector('.cd-frame') || (iframe && iframe.parentElement);\n    if (getFsEl()) {\n      var ex = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;\n      if (ex) { try { ex.call(document); } catch(e) {} }\n      return;\n    }\n    var targets = [wrap, iframe].filter(Boolean);\n    function tryNext(i) {\n      if (i >= targets.length) { console.warn('CD: fullscreen unavailable, try F11'); return; }\n      var el = targets[i];\n      var req = el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen || el.msRequestFullscreen;\n      if (!req) return tryNext(i + 1);\n      try {\n        var p = req.call(el);\n        if (p && typeof p.then === 'function') {\n          p.then(function(){}, function(){ tryNext(i + 1); });\n        }\n      } catch(e) {\n        tryNext(i + 1);\n      }\n    }\n    tryNext(0);\n  };\n  document.addEventListener('keydown', function(e) {\n    var ae = document.activeElement;\n    var typing = ae && \/^(input|textarea|select)$\/i.test(ae.tagName);\n    if ((e.key === 'f' || e.key === 'F') && !typing) {\n      var iframe = document.getElementById('cd-iframe');\n      if (iframe && iframe.getBoundingClientRect().bottom > 0 && iframe.getBoundingClientRect().top < window.innerHeight) {\n        e.preventDefault();\n        window.cdToggleFullscreen();\n      }\n    }\n  });\n  function applyFsClass() {\n    var wrap = document.querySelector('.cd-frame');\n    if (!wrap) return;\n    if (getFsEl() === wrap) wrap.classList.add('cd-fullscreen-active');\n    else wrap.classList.remove('cd-fullscreen-active');\n  }\n  document.addEventListener('fullscreenchange', applyFsClass);\n  document.addEventListener('webkitfullscreenchange', applyFsClass);\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Montr\u00e9al Cone Dodger 50 levels of Montr\u00e9al driving chaos. Survive construction season, navigate around BIXI riders and STM buses, dodge the SPVM, and listen to locals yell tabarnak. A love letter to the city&#8217;s eternal orange-cone season. &#x25b6; Play now Montr\u00e9al Cone Dodger \u00b7 50 levels v4 \u00b7 made in MTL \u26f6 Fullscreen F \u21bb [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-9505","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos - Montreal Tips<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/montrealtips.com\/fr\/cone-dodger\/\" \/>\n<meta property=\"og:locale\" content=\"fr_CA\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos - Montreal Tips\" \/>\n<meta property=\"og:description\" content=\"Montr\u00e9al Cone Dodger 50 levels of Montr\u00e9al driving chaos. Survive construction season, navigate around BIXI riders and STM buses, dodge the SPVM, and listen to locals yell tabarnak. A love letter to the city&#8217;s eternal orange-cone season. &#x25b6; Play now Montr\u00e9al Cone Dodger \u00b7 50 levels v4 \u00b7 made in MTL \u26f6 Fullscreen F \u21bb [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/montrealtips.com\/fr\/cone-dodger\/\" \/>\n<meta property=\"og:site_name\" content=\"Montreal Tips\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/mtltips\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-17T19:03:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/montrealtips.com\/wp-content\/uploads\/2017\/04\/Downtown-Church-Photo-From-Mont-Royal.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1869\" \/>\n\t<meta property=\"og:image:height\" content=\"1246\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@mtltips\" \/>\n<meta name=\"twitter:label1\" content=\"Estimation du temps de lecture\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/montrealtips.com\\\/cone-dodger\\\/\",\"url\":\"https:\\\/\\\/montrealtips.com\\\/cone-dodger\\\/\",\"name\":\"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos - Montreal Tips\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/montrealtips.com\\\/#website\"},\"datePublished\":\"2026-05-17T18:21:27+00:00\",\"dateModified\":\"2026-05-17T19:03:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/montrealtips.com\\\/cone-dodger\\\/#breadcrumb\"},\"inLanguage\":\"fr-CA\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/montrealtips.com\\\/cone-dodger\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/montrealtips.com\\\/cone-dodger\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/montrealtips.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/montrealtips.com\\\/#website\",\"url\":\"https:\\\/\\\/montrealtips.com\\\/\",\"name\":\"Montreal Tips\",\"description\":\"Montreal Updates, Features and Articles\",\"publisher\":{\"@id\":\"https:\\\/\\\/montrealtips.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/montrealtips.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-CA\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/montrealtips.com\\\/#organization\",\"name\":\"Montreal Tips\",\"url\":\"https:\\\/\\\/montrealtips.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-CA\",\"@id\":\"https:\\\/\\\/montrealtips.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/montrealtips.com\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/Untitled-2.jpg\",\"contentUrl\":\"https:\\\/\\\/montrealtips.com\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/Untitled-2.jpg\",\"width\":1206,\"height\":1084,\"caption\":\"Montreal Tips\"},\"image\":{\"@id\":\"https:\\\/\\\/montrealtips.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/mtltips\\\/\",\"https:\\\/\\\/x.com\\\/mtltips\",\"https:\\\/\\\/www.instagram.com\\\/mtltips\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/montreal-tips\\\/\",\"https:\\\/\\\/www.pinterest.ca\\\/mtltips\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos - Montreal Tips","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/montrealtips.com\/fr\/cone-dodger\/","og_locale":"fr_CA","og_type":"article","og_title":"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos - Montreal Tips","og_description":"Montr\u00e9al Cone Dodger 50 levels of Montr\u00e9al driving chaos. Survive construction season, navigate around BIXI riders and STM buses, dodge the SPVM, and listen to locals yell tabarnak. A love letter to the city&#8217;s eternal orange-cone season. &#x25b6; Play now Montr\u00e9al Cone Dodger \u00b7 50 levels v4 \u00b7 made in MTL \u26f6 Fullscreen F \u21bb [&hellip;]","og_url":"https:\/\/montrealtips.com\/fr\/cone-dodger\/","og_site_name":"Montreal Tips","article_publisher":"https:\/\/www.facebook.com\/mtltips\/","article_modified_time":"2026-05-17T19:03:20+00:00","og_image":[{"width":1869,"height":1246,"url":"https:\/\/montrealtips.com\/wp-content\/uploads\/2017\/04\/Downtown-Church-Photo-From-Mont-Royal.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@mtltips","twitter_misc":{"Estimation du temps de lecture":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/montrealtips.com\/cone-dodger\/","url":"https:\/\/montrealtips.com\/cone-dodger\/","name":"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos - Montreal Tips","isPartOf":{"@id":"https:\/\/montrealtips.com\/#website"},"datePublished":"2026-05-17T18:21:27+00:00","dateModified":"2026-05-17T19:03:20+00:00","breadcrumb":{"@id":"https:\/\/montrealtips.com\/cone-dodger\/#breadcrumb"},"inLanguage":"fr-CA","potentialAction":[{"@type":"ReadAction","target":["https:\/\/montrealtips.com\/cone-dodger\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/montrealtips.com\/cone-dodger\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/montrealtips.com\/"},{"@type":"ListItem","position":2,"name":"Play: Montreal Cone Dodger \u2014 50 Levels of MTL Driving Chaos"}]},{"@type":"WebSite","@id":"https:\/\/montrealtips.com\/#website","url":"https:\/\/montrealtips.com\/","name":"Conseils pour Montr\u00e9al","description":"Actualit\u00e9s, reportages et articles sur Montr\u00e9al","publisher":{"@id":"https:\/\/montrealtips.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/montrealtips.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-CA"},{"@type":"Organization","@id":"https:\/\/montrealtips.com\/#organization","name":"Conseils pour Montr\u00e9al","url":"https:\/\/montrealtips.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-CA","@id":"https:\/\/montrealtips.com\/#\/schema\/logo\/image\/","url":"https:\/\/montrealtips.com\/wp-content\/uploads\/2018\/08\/Untitled-2.jpg","contentUrl":"https:\/\/montrealtips.com\/wp-content\/uploads\/2018\/08\/Untitled-2.jpg","width":1206,"height":1084,"caption":"Montreal Tips"},"image":{"@id":"https:\/\/montrealtips.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/mtltips\/","https:\/\/x.com\/mtltips","https:\/\/www.instagram.com\/mtltips\/","https:\/\/www.linkedin.com\/company\/montreal-tips\/","https:\/\/www.pinterest.ca\/mtltips\/"]}]}},"_links":{"self":[{"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/pages\/9505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/comments?post=9505"}],"version-history":[{"count":8,"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/pages\/9505\/revisions"}],"predecessor-version":[{"id":9514,"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/pages\/9505\/revisions\/9514"}],"wp:attachment":[{"href":"https:\/\/montrealtips.com\/fr\/wp-json\/wp\/v2\/media?parent=9505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}