{"id":9246,"date":"2026-10-12T13:56:57","date_gmt":"2026-10-12T18:56:57","guid":{"rendered":"https:\/\/bsm.edu.co\/?page_id=9246"},"modified":"2026-10-15T18:48:28","modified_gmt":"2026-10-15T23:48:28","slug":"videojuego","status":"publish","type":"page","link":"https:\/\/bsm.edu.co\/en\/videojuego\/","title":{"rendered":"videojuego blas\u00f3n"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><div class=\"vc_row wpb_row vc_row-fluid\"><div class=\"wpb_column vc_column_container vc_col-sm-12\"><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\">\n\t<div class=\"wpb_raw_code wpb_raw_html wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n<meta charset=\"utf-8\" \/>\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" \/>\r\n<title>Paloma - Animaci\u00f3n SVG<\/title>\r\n<style>\r\n  html, body {\r\n    height: 100%;\r\n    margin: 0;\r\n    font-family: Arial, Helvetica, sans-serif;\r\n    background: #eaf6ff;\r\n    overflow-x: hidden;\r\n    touch-action: manipulation;\r\n  }\r\n  \r\n  #wrap {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    justify-content: flex-start;\r\n    min-height: 100vh;\r\n    padding: 10px 0;\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  #game-container {\r\n    position: relative;\r\n    display: inline-block;\r\n    width: 92vw;\r\n    max-width: 420px;\r\n    aspect-ratio: 1080 \/ 1720;\r\n  }\r\n\r\n  @media (min-width: 851px) and (pointer: fine) {\r\n    #wrap {\r\n      justify-content: center;\r\n      padding: 0;\r\n    }\r\n    #game-container {\r\n      width: auto;\r\n      height: 88vh;\r\n      max-width: none;\r\n      max-height: 900px;\r\n    }\r\n  }\r\n\r\n  canvas {\r\n    background: #fff;\r\n    border: 2px solid #0b5f8a;\r\n    border-radius: 6px;\r\n    width: 100%;\r\n    height: 100%;\r\n    display: block;\r\n    object-fit: contain; \r\n  }\r\n\r\n  \/* --- ESTILOS DEL MEN\u00da INICIAL Y CONFIGURACI\u00d3N --- *\/\r\n  #start-menu {\r\n    position: absolute;\r\n    top: 50%; \r\n    left: 50%;\r\n    transform: translate(-50%, -50%);\r\n    width: 80%; \r\n    max-width: 320px; \r\n    padding: 25px 20px; \r\n    background-color: #174679; \r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    justify-content: center;\r\n    z-index: 30; \r\n    border-radius: 16px; \r\n    box-shadow: 0 10px 30px rgba(0,0,0,0.6); \r\n  }\r\n  \r\n  #btnStartGame {\r\n    background-color: #F4D78F; \r\n    color: #174679; \r\n    border: none;\r\n    padding: 16px 36px;\r\n    font-size: 24px;\r\n    font-weight: 900;\r\n    border-radius: 8px;\r\n    cursor: pointer;\r\n    box-shadow: 0 6px 15px rgba(0,0,0,0.3);\r\n    text-transform: uppercase;\r\n    transition: transform 0.1s;\r\n    margin-bottom: 15px;\r\n  }\r\n  \r\n  #btnStartGame:active {\r\n    transform: scale(0.95);\r\n  }\r\n\r\n  .volume-setting {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: center;\r\n    width: 100%;\r\n    color: #fff;\r\n    font-size: 13px;\r\n    font-weight: bold;\r\n    margin-top: 8px;\r\n  }\r\n\r\n  .volume-setting label {\r\n    margin-bottom: 4px;\r\n  }\r\n\r\n.volume-setting input[type=range] {\r\n  all: revert;\r\n  width: 85%;\r\n  cursor: pointer;\r\n  accent-color: #F4D78F;\r\n}\r\n  \/* -------------------------------------- *\/\r\n\r\n  #hud, #pause-icon {\r\n    position: absolute;\r\n    top: 15px;\r\n    background: rgba(255,255,255,0.85);\r\n    padding: 6px 14px;\r\n    border-radius: 6px;\r\n    border: 2px solid #0b5f8a;\r\n    z-index: 10;\r\n    cursor: pointer;\r\n    user-select: none;\r\n  }\r\n  #hud {\r\n    left: 15px;\r\n    font-weight: 700;\r\n    font-size: 18px;\r\n    color: #08324a; \r\n    transition: transform 0.1s; \r\n    pointer-events: none;\r\n  }\r\n  #pause-icon {\r\n    right: 15px;\r\n    display: none; \r\n    align-items: center;\r\n    justify-content: center;\r\n  }\r\n  #message {\r\n    position: fixed; left: 50%; top: 50%; transform: translate(-50%,-50%);\r\n    display: none; z-index: 40; background: rgba(255,255,255,0.95);\r\n    padding: 20px 40px; border-radius: 8px; text-align: center;\r\n    border: 2px solid #0b5f8a; box-shadow: 0 4px 10px rgba(0,0,0,0.2);\r\n  }\r\n  #btnRestartMsg {\r\n    background: #0b5f8a; color: white; border: none; padding: 10px 20px;\r\n    font-size: 16px; font-weight: bold; border-radius: 4px; cursor: pointer;\r\n    margin-top: 10px;\r\n  }\r\n  #btnRestartMsg:hover { background: #08324a; }\r\n\r\n  #mobile-controls {\r\n    display: none; \r\n    gap: 10px;\r\n    margin-top: 12px;\r\n    width: 92vw;\r\n    max-width: 420px;\r\n    box-sizing: border-box;\r\n    align-items: center;\r\n  }\r\n\r\n  @media (max-width: 850px), (pointer: coarse) {\r\n    #mobile-controls { display: flex; }\r\n  }\r\n\r\n  .mob-btn {\r\n    flex: 2; background: #0b5f8a; color: white; border: none; padding: 12px;\r\n    font-size: 24px; font-weight: bold; border-radius: 8px; cursor: pointer;\r\n    box-shadow: 0 4px 6px rgba(0,0,0,0.1); user-select: none;\r\n    -webkit-tap-highlight-color: transparent; text-align: center;\r\n  }\r\n  .mob-pause-btn {\r\n    flex: 1; max-width: 54px; height: 52px; border-radius: 50% !important;\r\n    padding: 0; display: flex; align-items: center; justify-content: center;\r\n  }\r\n  .mob-btn:active, .mob-pause-btn:active { background: #08324a; transform: scale(0.95); }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div id=\"wrap\">\r\n  <div id=\"game-container\">\r\n    \r\n    <div id=\"start-menu\">\r\n      <button id=\"btnStartGame\">Iniciar Juego<\/button>\r\n      <div class=\"volume-setting\">\r\n        <label for=\"sfxVolume\">Volumen de Efectos:<\/label>\r\n        <input type=\"range\" id=\"sfxVolume\" min=\"0\" max=\"1\" step=\"0.05\" value=\"0.5\">\r\n      <\/div>\r\n      <div class=\"volume-setting\">\r\n        <label for=\"bgmVolume\">Volumen de M\u00fasica:<\/label>\r\n        <input type=\"range\" id=\"bgmVolume\" min=\"0\" max=\"1\" step=\"0.05\" value=\"0.3\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div id=\"hud\"><span id=\"score\">0<\/span><\/div>\r\n    \r\n    <div id=\"pause-icon\">\r\n      <svg width=\"14\" height=\"20\" viewBox=\"0 0 14 20\" fill=\"#08324a\">\r\n        <rect x=\"0\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/>\r\n        <rect x=\"10\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/>\r\n      <\/svg>\r\n    <\/div>\r\n\r\n    <canvas id=\"game\" width=\"1080\" height=\"1720\"><\/canvas>\r\n  <\/div>\r\n\r\n  <div id=\"mobile-controls\">\r\n    <button class=\"mob-btn\" id=\"btnLeft\">\u25c0<\/button>\r\n    <button class=\"mob-btn mob-pause-btn\" id=\"btnPauseMobile\">\r\n      <svg width=\"12\" height=\"18\" viewBox=\"0 0 14 20\" fill=\"#ffffff\">\r\n        <rect x=\"0\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/>\r\n        <rect x=\"10\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/>\r\n      <\/svg>\r\n    <\/button>\r\n    <button class=\"mob-btn\" id=\"btnRight\">\u25b6<\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div id=\"message\"><\/div>\r\n\r\n<script>\r\n(() => {\r\n  try {\r\n    const canvas = document.getElementById('game');\r\n    if(!canvas) throw new Error('Canvas con id \"game\" no encontrado');\r\n    const ctx = canvas.getContext('2d');\r\n\r\n    const scoreEl = document.getElementById('score');\r\n    const hudEl = document.getElementById('hud');\r\n    const pauseEl = document.getElementById('pause-icon');\r\n    const msgEl = document.getElementById('message');\r\n    const startMenu = document.getElementById('start-menu'); \r\n    \r\n    const volumeSlider = document.getElementById('sfxVolume');\r\n    const bgmVolumeSlider = document.getElementById('bgmVolume');\r\n\r\n    \/\/ Controles de volumen\r\n    let sfxVolumeSetting = parseFloat(volumeSlider.value);\r\n    volumeSlider.addEventListener('input', (e) => {\r\n      sfxVolumeSetting = parseFloat(e.target.value);\r\n    });\r\n\r\n    let bgmVolumeSetting = parseFloat(bgmVolumeSlider.value);\r\n    bgmVolumeSlider.addEventListener('input', (e) => {\r\n      bgmVolumeSetting = parseFloat(e.target.value);\r\n      bgmAudio.volume = bgmVolumeSetting;\r\n    });\r\n\r\n    const W = canvas.width, H = canvas.height;\r\n    const LANES = 4;\r\n    const laneWidth = Math.floor(W \/ LANES);\r\n\r\n    const PLAYER_SIZE = 100;\r\n    const player = { lane:1, w: PLAYER_SIZE, h: PLAYER_SIZE, originalY: H - 200, y: H - 200, invincible:false, invTime:0, dead:false };\r\n\r\n         \/\/ ==========================================\r\n    \/\/ SISTEMA DE ANIMACI\u00d3N SVG PARA LA PALOMA\r\n    \/\/ ==========================================\r\n    \/\/ NOTA: Pega tus c\u00f3digos SVG completos reemplazando los comentarios adentro de las comillas invertidas (`)\r\n\r\nconst pigeonSVGs = [\r\n     `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -7.619,-4.232 -13.223,-9.153c-9.42,-8.271 -16.671,-18.731 -16.671,-18.731c0,0 -9.266,46.425 27.57,53.566Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 7.619,-4.232 13.223,-9.153c9.42,-8.271 16.671,-18.731 16.671,-18.731c0,0 9.266,46.425 -27.57,53.566Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,-0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,-0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -7.514,-4.354 -13.223,-9.153c-10.459,-8.79 -22.257,-12.306 -22.257,-12.306c0,0 -3.68,39.999 33.156,47.14Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 7.514,-4.354 13.223,-9.153c10.459,-8.79 22.257,-12.306 22.257,-12.306c0,0 3.68,39.999 -33.156,47.14Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -7.027,-5.001 -13.223,-9.153c-7.838,-5.252 -23.699,-4.228 -23.699,-4.228c0,0 -2.238,31.922 34.597,39.063Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 7.027,-5.001 13.223,-9.153c7.838,-5.252 23.699,-4.228 23.699,-4.228c0,0 2.238,31.922 -34.597,39.063Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-7.157,-10.062 -37.408,-6.344 -37.408,-6.344c0,0 -1.753,24.885 35.083,32.026Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c7.157,-10.062 37.408,-6.344 37.408,-6.344c0,0 1.753,24.885 -35.083,32.026Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/g><\/svg>`,\r\n     `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><g><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.089,-5.571 -17.155,-4.086c-11.892,2.499 -20.747,10.744 -20.747,10.744c0,0 7.575,15.651 35.577,19.025Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><g><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.089,-5.571 17.155,-4.086c11.892,2.499 20.747,10.744 20.747,10.744c0,0 -7.575,15.651 -35.577,19.025Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M36.491,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.312,-6.389 -17.155,-4.086c-16.309,5.487 -19.455,21.137 -19.455,21.137c0,0 20.962,2.53 34.285,8.631Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.509,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.312,-6.389 17.155,-4.086c16.309,5.487 19.455,21.137 19.455,21.137c0,0 -20.962,2.53 -34.285,8.631Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M43.961,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.082\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.954,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.165,-5.897 -17.155,-4.086c-23.194,6.007 -17.388,31.529 -17.388,31.529c0,0 9.672,-6.303 32.218,-1.76Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.165,-5.897 17.155,-4.086c23.194,6.007 17.388,31.529 17.388,31.529c0,0 -9.672,-6.303 -32.218,-1.76Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`,\r\n     `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M43.496,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"49.616\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.489,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><path d=\"M36.026,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.165,-5.897 -17.155,-4.086c-23.194,6.007 -15.064,40.012 -15.064,40.012c0,0 7.348,-14.786 29.894,-10.244Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.127,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.165,-5.897 17.155,-4.086c23.194,6.007 16.349,38.544 16.349,38.544c0,0 -8.633,-13.318 -31.179,-8.775Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`,\r\n     `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.165,-5.897 -17.155,-4.086c-23.194,6.007 -10.751,44.39 -10.751,44.39c0,0 8.361,-15.916 25.581,-14.621Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,55.845c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.165,-5.897 17.155,-4.086c23.194,6.007 10.751,44.39 10.751,44.39c0,0 -8.631,-15.916 -25.581,-14.621Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`,\r\n\/\/ --- SECUENCIA DE REGRESO ---\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M43.496,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"49.616\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.489,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><path d=\"M36.026,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.165,-5.897 -17.155,-4.086c-23.194,6.007 -15.064,40.012 -15.064,40.012c0,0 7.348,-14.786 29.894,-10.244Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.127,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.165,-5.897 17.155,-4.086c23.194,6.007 16.349,38.544 16.349,38.544c0,0 -8.633,-13.318 -31.179,-8.775Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.165,-5.897 -17.155,-4.086c-23.194,6.007 -17.388,31.529 -17.388,31.529c0,0 9.672,-6.303 32.218,-1.76Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.165,-5.897 17.155,-4.086c23.194,6.007 17.388,31.529 17.388,31.529c0,0 -9.672,-6.303 -32.218,-1.76Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M36.491,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.312,-6.389 -17.155,-4.086c-16.309,5.487 -19.455,21.137 -19.455,21.137c0,0 20.962,2.53 34.285,8.631Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.509,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.312,-6.389 17.155,-4.086c16.309,5.487 19.455,21.137 19.455,21.137c0,0 -20.962,2.53 -34.285,8.631Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M43.961,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.082\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.954,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><g><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -10.089,-5.571 -17.155,-4.086c-11.892,2.499 -20.747,10.744 -20.747,10.744c0,0 7.575,15.651 35.577,19.025Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><g><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 10.089,-5.571 17.155,-4.086c11.892,2.499 20.747,10.744 20.747,10.744c0,0 -7.575,15.651 -35.577,19.025Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-7.157,-10.062 -37.408,-6.344 -37.408,-6.344c0,0 -1.753,24.885 35.083,32.026Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c7.157,-10.062 37.408,-6.344 37.408,-6.344c0,0 1.753,24.885 -35.083,32.026Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/g><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -7.027,-5.001 -13.223,-9.153c-7.838,-5.252 -23.699,-4.228 -23.699,-4.228c0,0 -2.238,31.922 34.597,39.063Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 7.027,-5.001 13.223,-9.153c7.838,-5.252 23.699,-4.228 23.699,-4.228c0,0 2.238,31.922 -34.597,39.063Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><\/svg>`,\r\n      `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><path d=\"M43.885,15.761c2.768,-1.097 9.463,-1.097 12.231,0c0.878,0.348 1.131,1.549 1.088,1.688c-0.652,2.067 -0.931,3.87 -1.005,5.373c-0.112,2.558 0.664,5.077 2.196,7.129c4.194,5.606 8.087,15.008 1.155,33.573c-0.112,0.299 -0.213,0.595 -0.316,0.883c-1.924,5.354 7.22,16.607 7.22,16.607c0,0 -6.046,15.959 -16.517,15.959c-10.471,-0 -16.389,-15.959 -16.389,-15.959c0,0 9.144,-11.252 7.22,-16.607c-0.103,-0.288 -0.205,-0.584 -0.316,-0.883c-6.489,-17.379 -3.492,-26.729 0.336,-32.468c2.669,-4.001 3.379,-8.996 1.932,-13.582c0.079,-0.025 0.079,-0.025 0.079,-0.025c-0.044,-0.139 0.21,-1.34 1.088,-1.688Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><ellipse cx=\"50.005\" cy=\"17.281\" rx=\"7.206\" ry=\"8.787\" style=\"fill:#174679;\"\/><path d=\"M47.877,8.955l2.127,-5.928l1.989,5.928l-1.989,5.007l-2.127,-5.007Z\" style=\"fill:#174679;\"\/><path d=\"M36.414,56.763c-3.67,-14.509 -0.711,-21.882 2.325,-25.682c-3.394,-4.831 -7.514,-4.354 -13.223,-9.153c-10.459,-8.79 -22.257,-12.306 -22.257,-12.306c0,0 -3.68,39.999 33.156,47.14Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M63.586,56.763c3.67,-14.509 0.711,-21.882 -2.325,-25.682c3.394,-4.831 7.514,-4.354 13.223,-9.153c10.459,-8.79 22.257,-12.306 22.257,-12.306c0,0 3.68,39.999 -33.156,47.14Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/svg>`,\r\n    ];\r\n\r\n    const pigeonFrames = pigeonSVGs.map(svgString => {\r\n      const img = new Image();\r\n      img.src = 'data:image\/svg+xml;charset=utf-8,' + encodeURIComponent(svgString);\r\n      return img;\r\n    });\r\n\r\n    let currentFrame = 0;\r\n    let frameTimer = 0;\r\n    const FRAME_DURATION = 80; \r\n    \r\n    \/\/ ==========================================\r\n    \/\/ SVGs PARA BSM, \u00cdTEM DE ESCUDO Y PALOMA ESCUDO\r\n    \/\/ ==========================================\r\n\r\n    const svgBSM = `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 90 32\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M54.641,21.962c0,1.802 -0.464,3.421 -1.392,4.857c-0.928,1.437 -2.287,2.561 -4.075,3.374c-1.788,0.813 -3.909,1.22 -6.361,1.22c-2.941,0 -5.366,-0.555 -7.276,-1.667c-1.355,-0.799 -2.456,-1.866 -3.303,-3.201c-0.847,-1.334 -1.27,-2.632 -1.27,-3.892c0,-0.732 0.254,-1.358 0.762,-1.88c0.508,-0.522 1.155,-0.783 1.941,-0.783c0.637,0 1.175,0.203 1.616,0.61c0.44,0.406 0.816,1.01 1.128,1.809c0.379,0.948 0.789,1.741 1.229,2.378c0.44,0.637 1.06,1.162 1.86,1.575c0.799,0.414 1.85,0.62 3.15,0.62c1.789,0 3.242,-0.417 4.359,-1.25c1.118,-0.834 1.677,-1.873 1.677,-3.12c0,-0.989 -0.301,-1.792 -0.904,-2.408c-0.603,-0.616 -1.382,-1.087 -2.337,-1.413c-0.955,-0.325 -2.233,-0.671 -3.831,-1.036c-2.141,-0.501 -3.933,-1.087 -5.375,-1.758c-1.443,-0.67 -2.588,-1.585 -3.435,-2.744c-0.847,-1.159 -1.27,-2.598 -1.27,-4.319c0,-1.639 0.447,-3.096 1.341,-4.37c0.894,-1.273 2.188,-2.253 3.882,-2.937c1.694,-0.684 3.685,-1.026 5.975,-1.026c1.829,0 3.411,0.227 4.746,0.681c1.334,0.454 2.442,1.057 3.323,1.809c0.881,0.752 1.524,1.541 1.931,2.368c0.407,0.827 0.61,1.633 0.61,2.419c0,0.718 -0.254,1.365 -0.762,1.941c-0.508,0.576 -1.141,0.864 -1.9,0.864c-0.691,0 -1.216,-0.173 -1.575,-0.518c-0.359,-0.346 -0.749,-0.911 -1.169,-1.697c-0.542,-1.124 -1.193,-2.002 -1.951,-2.632c-0.759,-0.63 -1.979,-0.945 -3.658,-0.945c-1.558,0 -2.815,0.342 -3.77,1.026c-0.955,0.684 -1.433,1.508 -1.433,2.47c0,0.596 0.163,1.111 0.488,1.545c0.325,0.434 0.772,0.806 1.341,1.118c0.569,0.311 1.145,0.555 1.727,0.731c0.583,0.176 1.545,0.434 2.886,0.772c1.68,0.393 3.201,0.827 4.563,1.301c1.362,0.474 2.52,1.05 3.475,1.728c0.955,0.678 1.7,1.535 2.236,2.571c0.535,1.037 0.803,2.307 0.803,3.811\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M86.425,31.4c-1.652,0 -2.991,-1.339 -2.991,-2.991l0,-15.834c-2.558,1.9 -5.674,2.967 -8.979,2.967l-0.039,0c-3.289,-0.008 -6.386,-1.071 -8.931,-2.958l0,15.825c0,1.652 -1.339,2.991 -2.991,2.991c-1.652,0 -2.991,-1.339 -2.991,-2.991l0,-24.829c0,-1.397 0.967,-2.608 2.329,-2.917c1.363,-0.309 2.757,0.365 3.36,1.625l0.886,1.85c1.621,3.386 4.744,5.412 8.354,5.421l0.024,0c3.598,0 6.719,-2.008 8.353,-5.377l0.926,-1.908c0.608,-1.254 2.003,-1.922 3.361,-1.61c1.359,0.312 2.322,1.522 2.322,2.915l0,24.829c0,1.652 -1.339,2.991 -2.991,2.991\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M18.055,11.13c-0.448,0.825 -1.094,1.384 -1.939,1.677c-0.846,0.294 -2.044,0.44 -3.596,0.44l-4.176,0c-0.843,0 -1.526,-0.683 -1.526,-1.526l0,-4.894c0,-0.843 0.683,-1.526 1.526,-1.526l3.527,0c2.264,0 3.948,0.255 5.053,0.765c1.104,0.51 1.656,1.541 1.656,3.092c0,0.727 -0.175,1.384 -0.524,1.971m2.013,3.962c3.075,-1.425 4.613,-3.676 4.613,-6.751c0,-0.894 -0.147,-1.743 -0.44,-2.547c-0.294,-0.804 -0.72,-1.537 -1.279,-2.201c-0.559,-0.664 -1.202,-1.212 -1.929,-1.646c-0.853,-0.517 -1.817,-0.867 -2.893,-1.048c-1.077,-0.181 -2.348,-0.273 -3.816,-0.273l-12.074,0c-0.916,0 -1.659,0.743 -1.659,1.659l0,13.892c0,0.848 0.688,1.536 1.536,1.536l11.169,0c2.166,0 3.795,0.349 4.885,1.048c1.09,0.699 1.635,1.824 1.635,3.376c0,3.033 -2.104,4.55 -6.311,4.55l-10.584,0c-1.291,0 -2.338,1.047 -2.338,2.338c0,1.291 1.047,2.338 2.338,2.338l10.836,0c1.621,0 3.04,-0.08 4.256,-0.241c1.216,-0.161 2.292,-0.437 3.228,-0.828c1.496,-0.657 2.684,-1.674 3.564,-3.051c0.881,-1.376 1.321,-2.925 1.321,-4.644c0,-3.718 -2.02,-6.22 -6.059,-7.506\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`;\r\n    \r\n    \/\/ 1. SVG para el \u00cdTEM de escudo que flota en el carril\r\n    const svgEscudoItem = `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M81.447,24.803l0,6.061l0,30.852c0,25.069 -31.447,37.604 -31.447,37.604c0,0 -31.447,-12.535 -31.447,-37.604l0,-8.675l0,-28.238l62.894,0Z\" style=\"fill:#174679;\"\/><path d=\"M80.158,17.691l-4.464,-16.827c-3.951,0.864 -5.204,0.753 -6.699,0.831c-4.417,0.231 -5.502,3.942 -2.351,4.723c1.317,0.326 2.718,1.061 2.633,2.024c-0.11,1.247 -1.764,1.956 -4.822,2.215c-5.748,0.486 -3.33,-4.847 -3.277,-5.022c1.142,-3.783 -2.848,-5.702 -5.214,-3.371c0,0 -1.576,1.427 -3.024,-0.34c-1.044,-1.273 -2.94,-1.243 -2.94,-1.243c0,0 -1.896,-0.03 -2.94,1.243c-1.448,1.767 -3.024,0.34 -3.024,0.34c-2.365,-2.331 -6.355,-0.411 -5.213,3.371c0.053,0.175 2.471,5.508 -3.277,5.022c-3.058,-0.259 -4.711,-0.968 -4.822,-2.215c-0.085,-0.963 1.316,-1.698 2.633,-2.024c3.151,-0.781 2.066,-4.492 -2.351,-4.723c-1.494,-0.078 -2.748,0.033 -6.699,-0.831l-4.464,16.827l60.316,0Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M19.056,20.592l-0.503,1.898l62.893,0l-0.504,-1.898l-61.886,0Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`;\r\n\r\n    \/\/ 2. SVG para la PALOMA TRANSFORMADA dentro del escudo\r\n    const svgPalomaEscudo = `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" xml:space=\"preserve\" xmlns:affinity=\"https:\/\/www.affinity.studio\/\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;\"><g><path d=\"M19.977,52.349c2.579,6.519 7.913,11.688 14.671,13.984c0.044,0.015 0.456,0.093 1.431,0.381c8.407,2.475 3.233,15.805 -5.231,18.332c-5.925,-5.836 -10.871,-13.592 -10.871,-23.23l0,-9.467Zm61.74,-21.65l0,-6.113c0,0 -5.115,8.358 -11.993,15.128c-4.092,4.028 -7.366,3.753 -9.763,7.614c2.5,2.788 4.012,8.239 3.665,14.415c-0.107,1.902 -0.342,3.55 -0.752,5.223c8.467,-1.903 14.417,-7.668 17.15,-14.625l0,9.475c0,21.674 -24.919,33.805 -29.916,36.016l-0.104,0.048l-0.108,-0.048c-0.245,-0.109 -0.54,-0.242 -0.875,-0.399l10.249,-28.814c3.301,-11.904 -1.224,-18.672 -1.985,-19.697c-0.133,-0.18 -0.26,-0.362 -0.374,-0.554c-0.478,-0.805 -1.403,-2.68 -1.164,-4.809c0.551,-4.908 5.421,-4.287 5.421,-4.287c-1.138,-1.944 -3.759,-2.044 -3.759,-2.044c0,0 -0.766,-2.94 -5.666,-2.467c-7.036,0.679 -9.947,16.79 -9.947,16.79c-2.437,-8.554 -6.317,-6.716 -11.519,-11.836c-6.878,-6.77 -11.993,-15.128 -11.993,-15.128l0,37.23c0,25.284 31.717,37.927 31.717,37.927c0,0 31.717,-12.642 31.717,-37.927l0,-31.117l-0.001,0Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M80.417,17.413l-4.502,-16.972c-3.985,0.871 -5.249,0.76 -6.756,0.838c-4.455,0.233 -5.549,3.976 -2.371,4.763c1.328,0.329 2.741,1.07 2.655,2.042c-0.111,1.258 -1.779,1.973 -4.863,2.234c-5.798,0.49 -3.359,-4.889 -3.306,-5.065c1.151,-3.815 -2.873,-5.751 -5.258,-3.4c0,0 -1.589,1.439 -3.05,-0.342c-1.053,-1.284 -2.965,-1.254 -2.965,-1.254c0,0 -1.913,-0.031 -2.965,1.254c-1.461,1.782 -3.05,0.342 -3.05,0.342c-2.385,-2.351 -6.409,-0.415 -5.258,3.4c0.053,0.176 2.492,5.555 -3.306,5.065c-3.084,-0.261 -4.752,-0.976 -4.863,-2.234c-0.086,-0.972 1.327,-1.712 2.655,-2.042c3.178,-0.787 2.083,-4.531 -2.371,-4.763c-1.507,-0.079 -2.772,0.033 -6.756,-0.838l-4.502,16.972l60.834,0Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><path d=\"M18.791,20.34l-0.508,1.915l63.433,-0l-0.508,-1.915l-62.417,0Z\" style=\"fill:#174679;fill-rule:nonzero;\"\/><\/g><\/svg>`;       \r\n    const imgBSM = new Image();\r\n    imgBSM.src = 'data:image\/svg+xml;charset=utf-8,' + encodeURIComponent(svgBSM);\r\n\r\n    const imgEscudoItem = new Image();\r\n    imgEscudoItem.src = 'data:image\/svg+xml;charset=utf-8,' + encodeURIComponent(svgEscudoItem);\r\n\r\n    const imgPalomaEscudo = new Image();\r\n    imgPalomaEscudo.src = 'data:image\/svg+xml;charset=utf-8,' + encodeURIComponent(svgPalomaEscudo);\r\n    \r\n    \/\/ ==========================================\r\n    \/\/ --- SISTEMA DE TINTADO DIN\u00c1MICO DE SVGs ---    \r\n    const tintCanvas = document.createElement('canvas');\r\n    const tintCtx = tintCanvas.getContext('2d');\r\n\r\n    function getSvgColor(s) {\r\n      if (s >= 3000) return '#F4D78F'; \/\/ Beige\r\n      if (s >= 2000) return '#FFFFFF'; \/\/ Blanco\r\n      return '#174679'; \/\/ Tu color azul original exacto\r\n    }\r\n\r\n    function drawSprite(targetCtx, img, x, y, w, h, currentScore) {\r\n      if (!img || !img.complete || img.naturalWidth === 0) return;\r\n      const targetColor = getSvgColor(currentScore);\r\n      \r\n      if (!targetColor) {\r\n        targetCtx.drawImage(img, x, y, w, h);\r\n      } else {\r\n        if (tintCanvas.width !== w || tintCanvas.height !== h) {\r\n          tintCanvas.width = w;\r\n          tintCanvas.height = h;\r\n        } else {\r\n          tintCtx.clearRect(0, 0, w, h);\r\n        }\r\n        \r\n        tintCtx.globalCompositeOperation = 'source-over';\r\n        tintCtx.drawImage(img, 0, 0, w, h);\r\n        \r\n        tintCtx.globalCompositeOperation = 'source-in';\r\n        tintCtx.fillStyle = targetColor;\r\n        tintCtx.fillRect(0, 0, w, h);\r\n        \r\n        targetCtx.drawImage(tintCanvas, x, y, w, h);\r\n      }\r\n    }\r\n\r\n    let obstacles = [];\r\n    let shieldItem = null;\r\n    let bsmItem = null;\r\n    let score = 0;\r\n    \r\n    let lastMilestone = 0;\r\n    let milestoneEffectTimer = 0;\r\n    let last500Milestone = 0;\r\n    let scoreBlinkTimer = 0;\r\n\r\n    let particles = [];\r\n    let deathParticles = []; \r\n    let floatingTexts = []; \r\n    let milestoneParticles = []; \r\n    \r\n    let baseSpeed = 200; \r\n    let obstacleSpeed = baseSpeed;\r\n\r\n    let running = false;\r\n    let isPaused = false; \r\n    let lastTime = 0;\r\n\r\n    let ROW_HEIGHT = 130;\r\n    const MOVES_REQUIRED = 2.5; \r\n    const MOVE_TIME_PER_LANE = 0.25; \r\n\r\n    let obstacleCounter = 0;\r\n    let nextShieldAt = 10; \r\n\r\n    const MAX_SCORE = 3333360;\r\n\r\n    \/\/ ==========================================\r\n    \/\/ MOTOR DE AUDIO 8-BIT Y COMBO ASCENDENTE\r\n    \/\/ ==========================================\r\n    const AudioContext = window.AudioContext || window.webkitAudioContext;\r\n    let actx = null;\r\n\r\n    const powerUpNotes = [\r\n      261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, \r\n      523.25, 587.33, 659.25, 698.46, 783.99, 880.00\r\n    ];\r\n    let powerUpComboCount = 0;\r\n\r\n    const SFX = {\r\n      init: function() { \r\n        if(!actx) actx = new AudioContext(); \r\n        if(actx.state === 'suspended') actx.resume(); \r\n      },\r\n      playTone: function(freq, type, duration, vol=0.1, slide=0) {\r\n        if(!actx) return;\r\n        const finalVol = vol * sfxVolumeSetting;\r\n        if(finalVol <= 0) return;\r\n\r\n        const osc = actx.createOscillator();\r\n        const gain = actx.createGain();\r\n        osc.type = type;\r\n        osc.frequency.setValueAtTime(freq, actx.currentTime);\r\n        if(slide !== 0) osc.frequency.exponentialRampToValueAtTime(Math.max(1, freq + slide), actx.currentTime + duration);\r\n        gain.gain.setValueAtTime(finalVol, actx.currentTime);\r\n        gain.gain.exponentialRampToValueAtTime(0.001, actx.currentTime + duration);\r\n        osc.connect(gain); gain.connect(actx.destination);\r\n        osc.start(); osc.stop(actx.currentTime + duration);\r\n      },\r\n      noise: function(duration, vol=0.1) {\r\n        if(!actx) return;\r\n        const finalVol = vol * sfxVolumeSetting;\r\n        if(finalVol <= 0) return;\r\n\r\n        const bufferSize = actx.sampleRate * duration;\r\n        const buffer = actx.createBuffer(1, bufferSize, actx.sampleRate);\r\n        const data = buffer.getChannelData(0);\r\n        for(let i=0; i<bufferSize; i++) data[i] = Math.random() * 2 - 1;\r\n        const noiseSource = actx.createBufferSource();\r\n        noiseSource.buffer = buffer;\r\n        const gain = actx.createGain();\r\n        gain.gain.setValueAtTime(finalVol, actx.currentTime);\r\n        gain.gain.exponentialRampToValueAtTime(0.001, actx.currentTime + duration);\r\n        noiseSource.connect(gain); gain.connect(actx.destination);\r\n        noiseSource.start();\r\n      },\r\n      move: () => SFX.playTone(300, 'square', 0.08, 0.03, 100), \r\n      pause: () => SFX.playTone(550, 'square', 0.12, 0.05, -150),\r\n      bsm: () => { \r\n        SFX.playTone(987, 'square', 0.1, 0.05); \r\n        setTimeout(() => SFX.playTone(1318, 'square', 0.2, 0.05), 100); \r\n      },\r\n      shield: () => SFX.playTone(400, 'square', 0.4, 0.08, 600), \r\n      destroy: () => {\r\n        let noteIndex = Math.min(powerUpComboCount, powerUpNotes.length - 1);\r\n        let freq = powerUpNotes[noteIndex];\r\n        \r\n        SFX.playTone(freq, 'triangle', 0.12, 0.06); \r\n        SFX.playTone(freq \/ 2, 'square', 0.12, 0.03);\r\n        SFX.noise(0.12, 0.04); \r\n        \r\n        powerUpComboCount++;\r\n      }, \r\n      milestoneSlide: function(duration = 2.0) {\r\n        if(!actx) return;\r\n        const finalVol = 0.07 * sfxVolumeSetting;\r\n        if(finalVol <= 0) return;\r\n\r\n        const osc = actx.createOscillator();\r\n        const gain = actx.createGain();\r\n        osc.type = 'triangle'; \r\n        osc.frequency.setValueAtTime(880, actx.currentTime);\r\n        osc.frequency.exponentialRampToValueAtTime(150, actx.currentTime + duration);\r\n        \r\n        gain.gain.setValueAtTime(finalVol, actx.currentTime);\r\n        gain.gain.exponentialRampToValueAtTime(0.001, actx.currentTime + duration);\r\n        \r\n        osc.connect(gain); \r\n        gain.connect(actx.destination);\r\n        osc.start(); \r\n        osc.stop(actx.currentTime + duration);\r\n      },\r\n      milestoneExplosion: () => { \r\n        SFX.playTone(100, 'sawtooth', 0.35, 0.08, -70);\r\n        SFX.noise(0.25, 0.08);\r\n      },\r\n      death: () => { \r\n        SFX.playTone(150, 'sawtooth', 0.8, 0.08, -100);\r\n        SFX.noise(0.5, 0.12);\r\n      },\r\n      milestone: () => { \r\n        [523, 659, 783, 1046].forEach((f, i) => setTimeout(() => SFX.playTone(f, 'square', 0.15, 0.04), i * 120));\r\n      }\r\n    };\r\n\r\n    \/\/ ==========================================\r\n    \/\/ M\u00daSICA DE FONDO CON ARCHIVO DE AUDIO (MP3)\r\n    \/\/ ==========================================\r\n    const bgmAudio = new Audio('https:\/\/bsm.edu.co\/wp-content\/uploads\/2026\/10\/musica-blason-benedictino-definitiva.mp3');\r\n    bgmAudio.loop = true; \r\n\r\n    function startBGM() {\r\n      bgmAudio.currentTime = 0; \r\n      bgmAudio.volume = bgmVolumeSetting;\r\n      bgmAudio.play().catch(err => {\r\n        console.log(\"El navegador bloque\u00f3 la reproducci\u00f3n autom\u00e1tica, se reproducir\u00e1 al interactuar:\", err);\r\n      });\r\n    }\r\n    \r\n    function stopBGM() {\r\n      bgmAudio.pause();\r\n    }\r\n    \/\/ ==========================================\r\n\r\n    function getColorsByScore(s) {\r\n      let bg1, bg2, joint;\r\n      if (s < 1000) {\r\n        bg1 = '#80BEE9'; bg2 = '#65ADDE'; joint = '#C49D85';\r\n      } else if (s < 2000) {\r\n        bg1 = '#3496D2'; bg2 = '#268AC7'; joint = '#C49D85';\r\n      } else if (s < 3000) {\r\n        bg1 = '#256CAB'; bg2 = '#195F9E'; joint = '#C49D85';\r\n      } else if (s < 6000) {\r\n        bg1 = '#1C5289'; bg2 = '#0F467F'; joint = '#C49D85';\r\n      } else {\r\n        bg1 = '#163050'; bg2 = '#0F2745'; joint = '#C49D85';\r\n      }\r\n      return { bg1, bg2, brick: '#E0AF92', joint };\r\n    }\r\n\r\n    window.togglePause = function() {\r\n      if (running) {\r\n        isPaused = !isPaused;\r\n        SFX.pause(); \r\n        const mobilePauseSvg = document.querySelector('#btnPauseMobile svg');\r\n        \r\n        if (isPaused) {\r\n          stopBGM(); \r\n          pauseEl.style.display = 'flex'; \r\n          if(mobilePauseSvg) mobilePauseSvg.innerHTML = '<polygon points=\"0,0 14,10 0,20\" fill=\"#ffffff\"\/>';\r\n        } else {\r\n          startBGM(); \r\n          pauseEl.style.display = 'none'; \r\n          lastTime = 0; \r\n          if(mobilePauseSvg) mobilePauseSvg.innerHTML = '<rect x=\"0\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/><rect x=\"10\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/>';\r\n        }\r\n      }\r\n    };\r\n    \r\n    pauseEl.addEventListener('click', window.togglePause);\r\n    pauseEl.addEventListener('touchstart', (e) => { e.preventDefault(); window.togglePause(); }, {passive: false});\r\n\r\n    function movePlayer(dir) {\r\n      if (!running || isPaused) return;\r\n      const oldLane = player.lane;\r\n      if (dir === 'left') {\r\n        player.lane = Math.max(0, player.lane - 1);\r\n      } else {\r\n        player.lane = Math.min(LANES - 1, player.lane + 1);\r\n      }\r\n      if (oldLane !== player.lane) SFX.move(); \r\n    }\r\n\r\n    function forcePause() {\r\n      if (running && !isPaused) window.togglePause();\r\n    }\r\n\r\n    document.addEventListener(\"visibilitychange\", () => { if (document.hidden) forcePause(); });\r\n    window.addEventListener(\"blur\", () => { forcePause(); });\r\n\r\n    window.addEventListener('keydown', e => {\r\n      const k = e.key.toLowerCase();\r\n      if(e.code === 'Space' || e.key === ' ') {\r\n        e.preventDefault(); \r\n        window.togglePause();\r\n        return;\r\n      }\r\n      if (isPaused) return;\r\n      if(k === 'arrowleft' || k === 'a') movePlayer('left');\r\n      if(k === 'arrowright' || k === 'd') movePlayer('right');\r\n    });\r\n\r\n    const btnLeft = document.getElementById('btnLeft');\r\n    const btnRight = document.getElementById('btnRight');\r\n    const btnPauseMobile = document.getElementById('btnPauseMobile');\r\n\r\n    ['click', 'touchstart'].forEach(evt => {\r\n      btnLeft.addEventListener(evt, (e) => { if(evt === 'touchstart') e.preventDefault(); movePlayer('left'); }, {passive: false});\r\n      btnRight.addEventListener(evt, (e) => { if(evt === 'touchstart') e.preventDefault(); movePlayer('right'); }, {passive: false});\r\n      btnPauseMobile.addEventListener(evt, (e) => { if(evt === 'touchstart') e.preventDefault(); window.togglePause(); }, {passive: false});\r\n    });\r\n\r\n    function randInt(min,max){ return Math.floor(Math.random()*(max-min+1))+min; }\r\n\r\n    let rowTimer = 0;\r\n    \r\n    function spawnRow(){\r\n      const widthInLanes = randInt(1,3);\r\n      const maxStart = LANES - widthInLanes;\r\n      const startLane = randInt(0, maxStart);\r\n      \r\n      const margin = Math.floor(laneWidth * 0.025); \r\n      const x = (startLane * laneWidth) + margin;\r\n      const w = (widthInLanes * laneWidth) - (margin * 2);\r\n      \r\n      const h = ROW_HEIGHT;\r\n      const y = -h - 6;\r\n      \r\n      obstacles.push({ x,y,w,h,startLane,widthInLanes,speed:obstacleSpeed });\r\n      obstacleCounter++;\r\n\r\n      if (!shieldItem && obstacleCounter >= nextShieldAt) {\r\n        trySpawnShield();\r\n      }\r\n    }\r\n\r\n    function trySpawnShield() {\r\n      let availableLanes = [];\r\n      for (let i = 0; i < LANES; i++) {\r\n        let isLaneBlocked = false;\r\n        for (let ob of obstacles) {\r\n          if (ob.y < 150) {\r\n            let obLeftLane = ob.startLane;\r\n            let obRightLane = ob.startLane + ob.widthInLanes - 1;\r\n            if (i >= obLeftLane && i <= obRightLane) { isLaneBlocked = true; break; }\r\n          }\r\n        }\r\n        if (!isLaneBlocked) availableLanes.push(i);\r\n      }\r\n\r\n      if (availableLanes.length > 0) {\r\n        const chosenLane = availableLanes[randInt(0, availableLanes.length - 1)];\r\n        shieldItem = { lane: chosenLane, y: -80, size: 90, active: true, speed: obstacleSpeed };\r\n        nextShieldAt = obstacleCounter + 40; \r\n      }\r\n    }\r\n\r\n    function spawnBSM(){ \r\n      if(bsmItem) return false; \r\n      let availableLanes = [];\r\n      for (let i = 0; i < LANES; i++) {\r\n        let isLaneBlocked = false;\r\n        for (let ob of obstacles) {\r\n          if (ob.y < 150) { \r\n            let obLeftLane = ob.startLane;\r\n            let obRightLane = ob.startLane + ob.widthInLanes - 1;\r\n            if (i >= obLeftLane && i <= obRightLane) { isLaneBlocked = true; break; }\r\n          }\r\n        }\r\n        if (!isLaneBlocked) availableLanes.push(i);\r\n      }\r\n\r\n      let spawnChance = (availableLanes.length === 3) ? 0.25 : (availableLanes.length === 2) ? 0.15 : (availableLanes.length === 1) ? 0.02 : 0;\r\n      if (availableLanes.length > 0 && Math.random() < spawnChance) {\r\n        const chosenLane = availableLanes[randInt(0, availableLanes.length - 1)];\r\n        bsmItem = { lane: chosenLane, y: -80, w: 157, h: 55, active: true };\r\n        return true;\r\n      }\r\n      return false;\r\n    }\r\n\r\n    function spawnTick(dt){\r\n      rowTimer += dt;\r\n      const minPhysicalGap = player.h + 150; \r\n      const timeForReaction = MOVES_REQUIRED * MOVE_TIME_PER_LANE; \r\n      const distanceForReaction = obstacleSpeed * timeForReaction;\r\n      const actualGapDistance = Math.max(minPhysicalGap, distanceForReaction);\r\n      const interval = ((ROW_HEIGHT + actualGapDistance) \/ obstacleSpeed) * 1000;\r\n\r\n      if(rowTimer >= interval){\r\n        rowTimer = 0;\r\n        spawnRow();\r\n        spawnBSM();\r\n      }\r\n    }\r\n\r\n    function playerRect(){ const px = player.lane * laneWidth + (laneWidth - player.w)\/2; return { x:px, y:player.y, w:player.w, h:player.h }; }\r\n    \r\n    function checkCollision(a, b, marginX = 0, marginTop = 0, marginBottom = 0){ \r\n      return a.x + marginX < b.x + b.w && \r\n             a.x + a.w - marginX > b.x && \r\n             a.y + marginTop < b.y + b.h && \r\n             a.y + a.h - marginBottom > b.y; \r\n    }\r\n\r\n    function getBaseSpeed(){\r\n      let speed = baseSpeed; \r\n      if(score >= 1000 && score < 1050) speed += 75; \r\n      else if(score >= 1050 && score < 2000) speed += 150; \r\n      else if(score >= 2000 && score < 2050) speed += 225; \r\n      else if(score >= 2050 && score < 3000) speed += 300; \r\n      else if(score >= 3000 && score < 3050) speed += 375; \r\n      else if(score >= 3050 && score < 4000) speed += 450; \r\n      else if(score >= 4000 && score < 4050) speed += 525; \r\n      else if(score >= 4050 && score < 5000) speed += 600; \r\n      else if(score >= 5000 && score < 5050) speed += 750; \r\n      else if(score >= 5050 && score < 6000) speed += 900; \r\n      else if(score >= 6000 && score < 6050) speed += 1125; \r\n      else if(score >= 6050 && score < 8000) speed += 1350; \r\n      else if(score >= 8000 && score < 8050) speed += 1550; \r\n      else if(score >= 8050 && score < 11000) speed += 1750; \r\n      else if(score >= 11000 && score < 11050) speed += 1825; \r\n      else if(score >= 11050) speed += 1900; \r\n      return speed;\r\n    }\r\n\r\n    function createExplosion(cx, cy, obW, obH, currentScore) {\r\n      const theme = getColorsByScore(currentScore);\r\n      for (let i = 0; i < 25; i++) {\r\n        particles.push({\r\n          x: cx + (Math.random() - 0.5) * obW,\r\n          y: cy + (Math.random() - 0.5) * obH,\r\n          vx: (Math.random() - 0.5) * 800, \r\n          vy: (Math.random() - 0.5) * 800 + (obstacleSpeed * 0.5), \r\n          life: 400 + Math.random() * 600, \r\n          maxLife: 1000, \r\n          size: 6 + Math.random() * 12,\r\n          color: Math.random() > 0.2 ? theme.brick : theme.joint \r\n        });\r\n      }\r\n    }\r\n\r\n    function createPlayerDeathParticles(cx, cy, currentScore) {\r\n      const pColor = getSvgColor(currentScore);\r\n      for (let i = 0; i < 90; i++) { \r\n        deathParticles.push({\r\n          x: cx, y: cy,\r\n          vx: (Math.random() - 0.5) * 900,\r\n          vy: (Math.random() - 0.5) * 900,\r\n          life: 800 + Math.random() * 600,\r\n          maxLife: 1400,\r\n          size: 4 + Math.random() * 10,\r\n          color: pColor\r\n        });\r\n      }\r\n    }\r\n\r\n    function update(dt){\r\n      frameTimer += dt;\r\n      if (pigeonFrames.length > 0 && frameTimer >= FRAME_DURATION) {\r\n        currentFrame = (currentFrame + 1) % pigeonFrames.length;\r\n        frameTimer = 0;\r\n      }\r\n\r\n      spawnTick(dt);\r\n\r\n      for(let i=obstacles.length-1;i>=0;i--){\r\n        const ob = obstacles[i];\r\n        ob.speed = obstacleSpeed;\r\n        ob.y += ob.speed * (dt\/1000);\r\n        if(ob.y > H + 200) obstacles.splice(i,1);\r\n      }\r\n\r\n      for (let i = particles.length - 1; i >= 0; i--) {\r\n        let p = particles[i];\r\n        p.x += p.vx * (dt \/ 1000);\r\n        p.y += p.vy * (dt \/ 1000);\r\n        p.life -= dt;\r\n        if (p.life <= 0) particles.splice(i, 1);\r\n      }\r\n\r\n      for (let i = deathParticles.length - 1; i >= 0; i--) {\r\n        let dp = deathParticles[i];\r\n        dp.x += dp.vx * (dt \/ 1000);\r\n        dp.y += dp.vy * (dt \/ 1000);\r\n        dp.life -= dt;\r\n        if (dp.life <= 0) deathParticles.splice(i, 1);\r\n      }\r\n\r\n      if(shieldItem && shieldItem.active){\r\n        shieldItem.speed = obstacleSpeed;\r\n        shieldItem.y += shieldItem.speed * (dt\/1000);\r\n        if(shieldItem.y > H + 50) shieldItem = null;\r\n      }\r\n      \r\n      if(bsmItem && bsmItem.active){\r\n        bsmItem.y += obstacleSpeed * (dt\/1000); \r\n        if(bsmItem.y > H + 60) bsmItem = null;\r\n      }\r\n\r\n      const pRect = playerRect();\r\n      \r\n      if(shieldItem && shieldItem.active){\r\n        const sx = shieldItem.lane * laneWidth + (laneWidth - shieldItem.size)\/2;\r\n        const sRect = { x:sx, y:shieldItem.y, w:shieldItem.size, h:shieldItem.size };\r\n        if(checkCollision(pRect, sRect, 0, 0, 0)){ \r\n          shieldItem = null; \r\n          player.invincible = true; \r\n          player.invTime = 7000; \r\n          powerUpComboCount = 0; \r\n          SFX.shield(); \r\n        }\r\n      }\r\n\r\n      if(bsmItem && bsmItem.active){\r\n        const bx = bsmItem.lane * laneWidth + laneWidth\/2;\r\n        const bRect = { x: bx - bsmItem.w\/2, y: bsmItem.y, w: bsmItem.w, h: bsmItem.h };\r\n        if(checkCollision(pRect, bRect, 0, 0, 0)){ \r\n          bsmItem = null; \r\n          score += 50; \r\n          SFX.bsm(); \r\n          floatingTexts.push({ text: \"+50\", x: pRect.x + pRect.w \/ 2, y: pRect.y - 80, hoverTime: 1000, flyTime: 400, maxFlyTime: 400, startX: 0, startY: 0 });\r\n        }\r\n      }\r\n\r\n      for(let i = obstacles.length - 1; i >= 0; i--){\r\n        const ob = obstacles[i];\r\n        const obRect = { x: ob.x, y: ob.y, w: ob.w, h: ob.h };\r\n        \r\n        if(checkCollision(pRect, obRect, 5, 7, 22.3)){\r\n          if(player.invincible) {\r\n            score += 10; \r\n            SFX.destroy(); \r\n            createExplosion(ob.x + ob.w \/ 2, ob.y + ob.h \/ 2, ob.w, ob.h, score); \r\n            floatingTexts.push({ text: \"+10\", x: pRect.x + pRect.w \/ 2, y: pRect.y - 80, hoverTime: 1000, flyTime: 400, maxFlyTime: 400, startX: 0, startY: 0 });\r\n            obstacles.splice(i, 1);\r\n          } else { \r\n            endGame(false); \r\n            return; \r\n          }\r\n        }\r\n      }\r\n\r\n      for (let i = floatingTexts.length - 1; i >= 0; i--) {\r\n        let ft = floatingTexts[i];\r\n        if (ft.hoverTime > 0) {\r\n          ft.hoverTime -= dt;\r\n          ft.y -= (40 * dt \/ 1000); \r\n          if (ft.hoverTime <= 0) { ft.startX = ft.x; ft.startY = ft.y; }\r\n        } else if (ft.flyTime > 0) {\r\n          ft.flyTime -= dt;\r\n          let progress = 1 - (ft.flyTime \/ ft.maxFlyTime);\r\n          progress = progress * progress * progress; \r\n          ft.x = ft.startX + (100 - ft.startX) * progress;\r\n          ft.y = ft.startY + (60 - ft.startY) * progress;\r\n        } else {\r\n          floatingTexts.splice(i, 1);\r\n        }\r\n      }\r\n\r\n      let currentBaseSpeed = getBaseSpeed();\r\n      \r\n      if(player.invincible){\r\n        player.invTime -= dt;\r\n        let speedBoostMax = 700; \r\n\r\n        if (player.invTime > 6000) {\r\n          let t = (7000 - player.invTime) \/ 1000; \r\n          player.y = player.originalY - (player.originalY - 636) * t;\r\n          obstacleSpeed = currentBaseSpeed + (speedBoostMax * t); \r\n        } else if (player.invTime > 2000) {\r\n          player.y = 636;\r\n          obstacleSpeed = currentBaseSpeed + speedBoostMax;\r\n        } else if (player.invTime > 0) {\r\n          let t = (2000 - player.invTime) \/ 2000; \r\n          player.y = 636 + (player.originalY - 636) * t;\r\n          obstacleSpeed = currentBaseSpeed + speedBoostMax * (1 - t);\r\n        } else {\r\n          player.invincible = false; \r\n          player.invTime = 0; \r\n          player.y = player.originalY; \r\n          obstacleSpeed = currentBaseSpeed; \r\n          powerUpComboCount = 0; \r\n        }\r\n      } else {\r\n        obstacleSpeed = currentBaseSpeed;\r\n      }\r\n\r\n      score += dt * 0.01;\r\n      \r\n      let currentMilestone = Math.floor(score \/ 1000);\r\n      if (currentMilestone > lastMilestone) {\r\n        if(currentMilestone > 0) SFX.milestone(); \r\n        \r\n        const themeAnterior = getColorsByScore((currentMilestone * 1000) - 1);\r\n        const themeNuevo = getColorsByScore(currentMilestone * 1000);\r\n        if (themeAnterior.bg1 !== themeNuevo.bg1 && currentMilestone * 1000 <= 6000) {\r\n          milestoneEffectTimer = 2000; \r\n          SFX.milestoneSlide(2.0); \r\n        }\r\n        lastMilestone = currentMilestone;\r\n      }\r\n      \r\n      if (milestoneEffectTimer > 0) {\r\n        milestoneEffectTimer -= dt;\r\n        if (milestoneEffectTimer <= 0) {\r\n          SFX.milestoneExplosion(); \r\n          for (let i = 0; i < 30; i++) {\r\n            milestoneParticles.push({\r\n              x: Math.random() * W, y: H,\r\n              vx: (Math.random() - 0.5) * 8, vy: (Math.random() * -8) - 4,\r\n              life: 1, decay: Math.random() * 0.03 + 0.01,\r\n              color: Math.random() > 0.5 ? '#00f3ff' : '#ffffff',\r\n              size: Math.random() * 3 + 2\r\n            });\r\n          }\r\n        }\r\n      }\r\n\r\n      for (let i = milestoneParticles.length - 1; i >= 0; i--) {\r\n        let p = milestoneParticles[i];\r\n        let timeScale = dt \/ 16; \r\n        p.x += p.vx * timeScale;\r\n        p.y += p.vy * timeScale;\r\n        p.vy += 0.4 * timeScale; \r\n        p.life -= p.decay * timeScale;\r\n        if (p.life <= 0) milestoneParticles.splice(i, 1);\r\n      }\r\n\r\n      let current500Milestone = Math.floor(score \/ 500);\r\n      if (current500Milestone > last500Milestone && current500Milestone > 0) {\r\n        last500Milestone = current500Milestone;\r\n        scoreBlinkTimer = 1000; \r\n      }\r\n\r\n      if (scoreBlinkTimer > 0) {\r\n        scoreBlinkTimer -= dt;\r\n        let isVisible = Math.floor(scoreBlinkTimer \/ 200) % 2 !== 0; \r\n        hudEl.style.transform = \"scale(1.35)\"; \r\n        hudEl.style.transformOrigin = \"top left\"; \r\n        hudEl.style.opacity = isVisible ? \"1\" : \"0\"; \r\n      } else {\r\n        hudEl.style.transform = \"scale(1)\";\r\n        hudEl.style.opacity = \"1\";\r\n        scoreEl.textContent = Math.floor(score).toLocaleString('en-US');\r\n      }\r\n\r\n      if(score >= MAX_SCORE) {\r\n        score = MAX_SCORE; \r\n        scoreEl.textContent = MAX_SCORE.toLocaleString('en-US');\r\n        endGame(true);\r\n      }\r\n    }\r\n\r\n    function draw8BitBricks(ctx, x, y, w, h, brickColor, jointColor) {\r\n      ctx.fillStyle = jointColor;\r\n      ctx.fillRect(x, y, w, h);\r\n      const brickW = 32, brickH = 16, jointSize = 4;\r\n      for (let by = 0; by < h; by += brickH + jointSize) {\r\n        let isOffset = (Math.floor(by \/ (brickH + jointSize)) % 2 !== 0);\r\n        let startX = isOffset ? -(brickW \/ 2) : 0;\r\n        for (let bx = startX; bx < w; bx += brickW + jointSize) {\r\n          let drawX = x + bx, drawY = y + by, drawW = brickW, drawH = brickH;\r\n          if (drawX < x) { drawW -= (x - drawX); drawX = x; }\r\n          if (drawX + drawW > x + w) drawW = (x + w) - drawX;\r\n          if (drawY + drawH > y + h) drawH = (y + h) - drawY;\r\n          if (drawW > 0 && drawH > 0) {\r\n            ctx.fillStyle = brickColor;\r\n            ctx.fillRect(drawX, drawY, drawW, drawH);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    function draw(){\r\n      ctx.clearRect(0, 0, W, H);\r\n      \r\n      const theme = getColorsByScore(score);\r\n      const prevTheme = getColorsByScore(score - 1);\r\n      \r\n      for(let i = 0; i < LANES; i++){\r\n        const x = i * laneWidth;\r\n        ctx.fillStyle = i % 2 === 0 ? prevTheme.bg1 : prevTheme.bg2;\r\n        ctx.fillRect(x, 0, laneWidth, H);\r\n      }\r\n      \r\n      if (typeof milestoneEffectTimer !== 'undefined' && milestoneEffectTimer > 0) {\r\n        let progress = 1 - (milestoneEffectTimer \/ 2000); \r\n        progress = Math.max(0, Math.min(1, progress)); \r\n        let curtainHeight = H * progress; \r\n        const prevTheme = getColorsByScore((lastMilestone * 1000) - 1);\r\n        \r\n        ctx.save();\r\n        ctx.beginPath();\r\n        ctx.rect(0, curtainHeight, W, H - curtainHeight);\r\n        ctx.clip();\r\n        \r\n        for(let i = 0; i < LANES; i++){\r\n          const x = i * laneWidth;\r\n          ctx.fillStyle = i % 2 === 0 ? prevTheme.bg1 : prevTheme.bg2;\r\n          ctx.fillRect(x, 0, laneWidth, H);\r\n        }\r\n        ctx.restore();\r\n\r\n        if (progress > 0 && progress < 1) {\r\n          ctx.save();\r\n          ctx.beginPath();\r\n          ctx.moveTo(0, curtainHeight); ctx.lineTo(W, curtainHeight);\r\n          ctx.strokeStyle = 'rgba(0, 243, 255, 0.4)'; ctx.lineWidth = 12; ctx.stroke();\r\n          ctx.strokeStyle = '#ffffff'; ctx.lineWidth = 2; ctx.stroke();\r\n          ctx.restore();\r\n        }\r\n      }\r\n\r\n      for(let ob of obstacles){\r\n        draw8BitBricks(ctx, ob.x, ob.y, ob.w, ob.h, theme.brick, theme.joint);\r\n      }\r\n      \r\n      if(shieldItem && shieldItem.active){\r\n        const sx = shieldItem.lane * laneWidth + (laneWidth - shieldItem.size)\/2;\r\n        drawSprite(ctx, imgEscudoItem, sx, shieldItem.y, shieldItem.size, shieldItem.size, score);\r\n      }\r\n      \r\n      if(bsmItem && bsmItem.active){\r\n        const bx = bsmItem.lane * laneWidth + (laneWidth - bsmItem.w)\/2;\r\n        drawSprite(ctx, imgBSM, bx, bsmItem.y, bsmItem.w, bsmItem.h, score);\r\n      }\r\n\r\n      for (let i = 0; i < particles.length; i++) {\r\n        let p = particles[i];\r\n        ctx.save();\r\n        ctx.globalAlpha = Math.max(0, p.life \/ p.maxLife);\r\n        ctx.fillStyle = p.color;\r\n        ctx.fillRect(p.x, p.y, p.size, p.size);\r\n        ctx.restore();\r\n      }\r\n\r\n      for (let i = 0; i < deathParticles.length; i++) {\r\n        let dp = deathParticles[i];\r\n        ctx.save();\r\n        ctx.globalAlpha = Math.max(0, dp.life \/ dp.maxLife);\r\n        ctx.fillStyle = dp.color;\r\n        ctx.fillRect(dp.x, dp.y, dp.size, dp.size);\r\n        ctx.restore();\r\n      }\r\n      \r\n      if (!player.dead) {\r\n        const px = player.lane * laneWidth + (laneWidth - player.w)\/2;\r\n        drawPigeon(px, player.y, player.w, player.h);\r\n      }\r\n\r\n      for (let ft of floatingTexts) {\r\n        ctx.save();\r\n        let scale = 1, alpha = 1;\r\n        if (ft.flyTime > 0 && ft.hoverTime <= 0) {\r\n          let p = ft.flyTime \/ ft.maxFlyTime;\r\n          scale = 0.5 + 0.5 * p; \r\n          alpha = p;               \r\n        }\r\n        ctx.globalAlpha = alpha;\r\n        ctx.translate(ft.x, ft.y);\r\n        ctx.scale(scale, scale);\r\n        ctx.font = '900 64px Arial, sans-serif'; \r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        ctx.lineWidth = 8;\r\n        ctx.strokeStyle = '#174679'; \r\n        ctx.fillStyle = (score >= 3000) ? '#FFDA0B' : '#F4D78F';\r\n        ctx.strokeText(ft.text, 0, 0);\r\n        ctx.fillText(ft.text, 0, 0);\r\n        ctx.restore();\r\n      }\r\n\r\n      if (milestoneEffectTimer > 0) {\r\n        ctx.save();\r\n        let timeElapsed = 2000 - milestoneEffectTimer;\r\n        let pulseProgress = (timeElapsed % 500) \/ 500;\r\n        let beamHeight = H * 0.4, startY = H, endY = -beamHeight;   \r\n        let currentY = startY - (startY - endY) * pulseProgress;\r\n\r\n        ctx.globalCompositeOperation = 'lighter'; \r\n        let grd = ctx.createLinearGradient(0, currentY, 0, currentY + beamHeight);\r\n        grd.addColorStop(0, 'rgba(0, 240, 255, 0)');         \r\n        grd.addColorStop(0.2, 'rgba(0, 240, 255, 0.8)');     \r\n        grd.addColorStop(0.5, '#ffffff');                    \r\n        grd.addColorStop(0.8, 'rgba(0, 240, 255, 0.8)');     \r\n        grd.addColorStop(1, 'rgba(0, 240, 255, 0)');         \r\n\r\n        ctx.fillStyle = grd;\r\n        ctx.fillRect(0, currentY, 20, beamHeight);\r\n        ctx.fillRect(W - 20, currentY, 20, beamHeight);\r\n        ctx.restore();\r\n      }\r\n\r\n      if (milestoneParticles.length > 0) {\r\n        ctx.save();\r\n        ctx.globalCompositeOperation = 'lighter'; \r\n        for (let i = 0; i < milestoneParticles.length; i++) {\r\n          let p = milestoneParticles[i];\r\n          ctx.globalAlpha = Math.max(0, p.life);\r\n          ctx.fillStyle = p.color;\r\n          ctx.beginPath();\r\n          ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\r\n          ctx.fill();\r\n        }\r\n        ctx.restore();\r\n      }\r\n    }\r\n\r\n    function drawPigeon(x, y, w, h){\r\n      ctx.save(); \r\n      ctx.translate(x, y); \r\n      \r\n      if(player.invincible) {\r\n        ctx.shadowColor = '#F4D78F';\r\n        ctx.shadowBlur = 25;\r\n        if (player.invTime <= 2000 && Math.floor(player.invTime \/ 300) % 2 === 0) {\r\n          ctx.globalAlpha = 0.3; \r\n        }\r\n        const scale = 1.3, drawW = w * scale, drawH = h * scale;\r\n        const offsetX = (w - drawW) \/ 2, offsetY = (h - drawH) \/ 2;\r\n        if (imgPalomaEscudo.complete) {\r\n          drawSprite(ctx, imgPalomaEscudo, offsetX, offsetY, drawW, drawH, score);\r\n        }\r\n      } else {\r\n        const img = pigeonFrames[currentFrame];\r\n        if (img && img.complete) {\r\n          drawSprite(ctx, img, 0, 0, w, h, score);\r\n        }\r\n      }\r\n      ctx.restore();\r\n    }\r\n\r\n    function endGame(isWin) {\r\n      running = false;\r\n      stopBGM(); \r\n      \r\n      if (!isWin) {\r\n        player.dead = true; \r\n        SFX.death(); \r\n        const pRect = playerRect();\r\n        createPlayerDeathParticles(pRect.x + pRect.w \/ 2, pRect.y + pRect.h \/ 2, score);\r\n        draw();\r\n\r\n        \/\/ Mostrar letrero de \"Te estrellaste\" y regresar autom\u00e1ticamente al men\u00fa a los 2 segundos\r\n        msgEl.style.display = 'block';\r\n        msgEl.innerHTML = `<h2>\u00a1Te estrellaste!<\/h2>`;\r\n        \r\n        setTimeout(() => {\r\n          msgEl.style.display = 'none';\r\n          startMenu.style.display = 'flex';\r\n        }, 2000);\r\n\r\n      } else {\r\n        msgEl.style.display = 'block';\r\n        msgEl.innerHTML = `<h2>\u00a13,333,360 Puntos!<br>\u00a1Puntuaci\u00f3n Perfecta Arcade!<\/h2><button id=\"btnRestartMsg\">Reiniciar<\/button>`;\r\n        document.getElementById('btnRestartMsg').addEventListener('click', startGame);\r\n      }\r\n    }\r\n\r\n    function loop(ts){\r\n      if(!running) {\r\n        if (deathParticles.length > 0) {\r\n          const dt = ts - (lastTime || ts);\r\n          lastTime = ts;\r\n          for (let i = deathParticles.length - 1; i >= 0; i--) {\r\n            let dp = deathParticles[i];\r\n            dp.x += dp.vx * (dt \/ 1000);\r\n            dp.y += dp.vy * (dt \/ 1000);\r\n            dp.life -= dt;\r\n            if (dp.life <= 0) deathParticles.splice(i, 1);\r\n          }\r\n          draw();\r\n          requestAnimationFrame(loop);\r\n        }\r\n        return;\r\n      }\r\n      \r\n      if(!lastTime) lastTime = ts;\r\n      const dt = ts - lastTime;\r\n      lastTime = ts;\r\n\r\n      if (!isPaused) update(dt);\r\n      draw();\r\n      \r\n      requestAnimationFrame(loop);\r\n    }\r\n\r\n    function startGame(){\r\n      obstacles = []; shieldItem = null; bsmItem = null; score = 0;\r\n      particles = [];\r\n      deathParticles = []; \r\n      floatingTexts = []; \r\n      milestoneParticles = []; \r\n      powerUpComboCount = 0; \r\n      \r\n      lastMilestone = 0;\r\n      milestoneEffectTimer = 0;\r\n      last500Milestone = 0;\r\n      scoreBlinkTimer = 0;\r\n      hudEl.style.transform = \"scale(1)\";\r\n      hudEl.style.opacity = \"1\";\r\n\r\n      player.lane = 1; player.invincible = false; player.invTime = 0; player.dead = false; \r\n      player.y = player.originalY; \r\n      currentFrame = 0; frameTimer = 0;\r\n\r\n      obstacleSpeed = baseSpeed; rowTimer = 0;\r\n      obstacleCounter = 0; nextShieldAt = 10; \r\n      \r\n      isPaused = false;\r\n      pauseEl.style.display = 'none';\r\n\r\n      const mobilePauseSvg = document.querySelector('#btnPauseMobile svg');\r\n      if (mobilePauseSvg) {\r\n        mobilePauseSvg.innerHTML = '<rect x=\"0\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/><rect x=\"10\" y=\"0\" width=\"4\" height=\"20\" rx=\"1\"\/>';\r\n      }\r\n\r\n      msgEl.style.display = 'none'; \r\n      scoreEl.textContent = '0';\r\n      \r\n      running = true; lastTime = 0;\r\n      startBGM(); \r\n      requestAnimationFrame(loop);\r\n    }\r\n\r\n    document.getElementById('btnStartGame').addEventListener('click', () => {\r\n      startMenu.style.display = 'none';\r\n      SFX.init(); \r\n      startGame();\r\n    });\r\n\r\n  } catch (err) {\r\n    console.error('Error cr\u00edtico en script:', err);\r\n    alert('Error en el script: ' + err.message);\r\n  }\r\n})();\r\n<\/script>\r\n<\/body>\r\n<\/html>\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><!-- Row Backgrounds --><div class=\"upb_color\" data-bg-override=\"full\" data-bg-color=\"#CEE8FF\" data-fadeout=\"\" data-fadeout-percentage=\"30\" data-parallax-content=\"\" data-parallax-content-sense=\"30\" data-row-effect-mobile-disable=\"true\" data-img-parallax-mobile-disable=\"true\" data-rtl=\"false\"  data-custom-vc-row=\"\"  data-vc=\"8.7.2\"  data-is_old_vc=\"\"  data-theme-support=\"\"   data-overlay=\"false\" data-overlay-color=\"\" data-overlay-pattern=\"\" data-overlay-pattern-opacity=\"\" data-overlay-pattern-size=\"\"    ><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Paloma &#8211; Animaci\u00f3n SVG Iniciar Juego Volumen de Efectos: Volumen de M\u00fasica: 0 \u25c0 \u25b6<\/p>","protected":false},"author":272175875,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"footnotes":"","big_sky_generated":false},"class_list":["post-9246","page","type-page","status-publish","hentry","description-off"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>videojuego blas\u00f3n - Colegio Benedictino<\/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:\/\/bsm.edu.co\/en\/videojuego\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"videojuego blas\u00f3n - Colegio Benedictino\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bsm.edu.co\/en\/videojuego\/\" \/>\n<meta property=\"og:site_name\" content=\"Colegio Benedictino\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/colegiobenedictino?tsid=0.28463760125801607&amp;source=result\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-15T23:48:28+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/videojuego\\\/\",\"url\":\"https:\\\/\\\/bsm.edu.co\\\/videojuego\\\/\",\"name\":\"videojuego blas\u00f3n - Colegio Benedictino\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/#website\"},\"datePublished\":\"2026-10-12T18:56:57+00:00\",\"dateModified\":\"2026-10-15T23:48:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/videojuego\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/bsm.edu.co\\\/videojuego\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/videojuego\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/bsm.edu.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"videojuego blas\u00f3n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/#website\",\"url\":\"https:\\\/\\\/bsm.edu.co\\\/\",\"name\":\"Colegio Benedictino\",\"description\":\"Colegio Benedictino de Santa Mar\u00eda\",\"publisher\":{\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/bsm.edu.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/#organization\",\"name\":\"Colegio Benedictino de Santa Mar\u00eda\",\"alternateName\":\"Colegio Biling\u00fce Benedictino en Envigado\",\"url\":\"https:\\\/\\\/bsm.edu.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/bsm.edu.co\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Mesa-de-trabajo-1.png\",\"contentUrl\":\"https:\\\/\\\/bsm.edu.co\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Mesa-de-trabajo-1.png\",\"width\":851,\"height\":851,\"caption\":\"Colegio Benedictino de Santa Mar\u00eda\"},\"image\":{\"@id\":\"https:\\\/\\\/bsm.edu.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/colegiobenedictino?tsid=0.28463760125801607&source=result\",\"https:\\\/\\\/www.instagram.com\\\/benedictinos\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"videojuego blas\u00f3n - Colegio Benedictino","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:\/\/bsm.edu.co\/en\/videojuego\/","og_locale":"en_US","og_type":"article","og_title":"videojuego blas\u00f3n - Colegio Benedictino","og_url":"https:\/\/bsm.edu.co\/en\/videojuego\/","og_site_name":"Colegio Benedictino","article_publisher":"https:\/\/www.facebook.com\/colegiobenedictino?tsid=0.28463760125801607&source=result","article_modified_time":"2026-10-15T23:48:28+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/bsm.edu.co\/videojuego\/","url":"https:\/\/bsm.edu.co\/videojuego\/","name":"videojuego blas\u00f3n - Colegio Benedictino","isPartOf":{"@id":"https:\/\/bsm.edu.co\/#website"},"datePublished":"2026-10-12T18:56:57+00:00","dateModified":"2026-10-15T23:48:28+00:00","breadcrumb":{"@id":"https:\/\/bsm.edu.co\/videojuego\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bsm.edu.co\/videojuego\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/bsm.edu.co\/videojuego\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/bsm.edu.co\/"},{"@type":"ListItem","position":2,"name":"videojuego blas\u00f3n"}]},{"@type":"WebSite","@id":"https:\/\/bsm.edu.co\/#website","url":"https:\/\/bsm.edu.co\/","name":"Benedictine School","description":"St Mary Benedictine School","publisher":{"@id":"https:\/\/bsm.edu.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bsm.edu.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/bsm.edu.co\/#organization","name":"St Mary Benedictine School","alternateName":"Colegio Biling\u00fce Benedictino en Envigado","url":"https:\/\/bsm.edu.co\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bsm.edu.co\/#\/schema\/logo\/image\/","url":"https:\/\/bsm.edu.co\/wp-content\/uploads\/2026\/03\/Mesa-de-trabajo-1.png","contentUrl":"https:\/\/bsm.edu.co\/wp-content\/uploads\/2026\/03\/Mesa-de-trabajo-1.png","width":851,"height":851,"caption":"Colegio Benedictino de Santa Mar\u00eda"},"image":{"@id":"https:\/\/bsm.edu.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/colegiobenedictino?tsid=0.28463760125801607&source=result","https:\/\/www.instagram.com\/benedictinos\/"]}]}},"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PgQAXK-2p8","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/pages\/9246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/users\/272175875"}],"replies":[{"embeddable":true,"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/comments?post=9246"}],"version-history":[{"count":17,"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/pages\/9246\/revisions"}],"predecessor-version":[{"id":9333,"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/pages\/9246\/revisions\/9333"}],"wp:attachment":[{"href":"https:\/\/bsm.edu.co\/en\/wp-json\/wp\/v2\/media?parent=9246"}],"curies":[{"name":"well played","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}