{"id":342,"date":"2026-10-20T05:12:55","date_gmt":"2026-10-20T05:12:55","guid":{"rendered":"https:\/\/saburnet.ir\/?page_id=342"},"modified":"2026-10-20T05:43:33","modified_gmt":"2026-10-20T05:43:33","slug":"%d8%b3%d8%b1%da%af%d8%b1%d9%85%db%8c","status":"publish","type":"page","link":"https:\/\/saburnet.ir\/?page_id=342","title":{"rendered":"\u0633\u0631\u06af\u0631\u0645\u06cc"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"342\" class=\"elementor elementor-342\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d3bec6d e-flex e-con-boxed e-con e-parent\" data-id=\"d3bec6d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5ab2441 elementor-widget elementor-widget-html\" data-id=\"5ab2441\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\r\n<div id=\"sps-crash-game\" dir=\"rtl\">\r\n  <style>\r\n    #sps-crash-game {\r\n      --cg-bg: #07111f;\r\n      --cg-card: #0d1b2b;\r\n      --cg-line: #1c3448;\r\n      --cg-green: #26f2a0;\r\n      --cg-text: #e8f2ff;\r\n      font-family: Vazirmatn, Tahoma, sans-serif;\r\n      color: var(--cg-text);\r\n      width: 100%;\r\n      margin: 20px auto;\r\n      box-sizing: border-box;\r\n    }\r\n    #sps-crash-game * { box-sizing: border-box; }\r\n    #sps-crash-game .cg-shell {\r\n      position: relative;\r\n      overflow: hidden;\r\n      padding: clamp(14px, 3vw, 28px);\r\n      border: 1px solid #25425b;\r\n      border-radius: 24px;\r\n      background:\r\n        radial-gradient(ellipse at 50% -20%, #164b50 0, transparent 55%),\r\n        linear-gradient(145deg, #0a1727, #050b14 80%);\r\n      box-shadow: 0 22px 70px #02060c66;\r\n    }\r\n    #sps-crash-game .cg-top {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      gap: 12px;\r\n      flex-wrap: wrap;\r\n      margin-bottom: 22px;\r\n    }\r\n    #sps-crash-game .cg-brand {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 12px;\r\n    }\r\n    #sps-crash-game .cg-logo {\r\n      width: 46px;\r\n      height: 46px;\r\n      display: grid;\r\n      place-items: center;\r\n      border-radius: 15px;\r\n      color: #04150f;\r\n      font-size: 24px;\r\n      background: linear-gradient(145deg, #6dffbc, #12d88a);\r\n      box-shadow: 0 0 24px #26f2a033;\r\n    }\r\n    #sps-crash-game .cg-brand h3 {\r\n      margin: 0 0 5px;\r\n      color: #f3f8ff;\r\n      font-size: 19px;\r\n      font-weight: 900;\r\n    }\r\n    #sps-crash-game .cg-brand p {\r\n      margin: 0;\r\n      color: #8199b2;\r\n      font-size: 12px;\r\n    }\r\n    #sps-crash-game .cg-status {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 9px 12px;\r\n      border: 1px solid #24523f;\r\n      border-radius: 50px;\r\n      background: #0c3026;\r\n      color: #79ffc2;\r\n      font-size: 12px;\r\n      white-space: nowrap;\r\n    }\r\n    #sps-crash-game .cg-dot {\r\n      width: 7px;\r\n      height: 7px;\r\n      border-radius: 50%;\r\n      background: var(--cg-green);\r\n      box-shadow: 0 0 10px var(--cg-green);\r\n    }\r\n    #sps-crash-game .cg-history {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      overflow-x: auto;\r\n      padding: 3px 0 13px;\r\n      margin-bottom: 8px;\r\n      scrollbar-width: thin;\r\n    }\r\n    #sps-crash-game .cg-history-label {\r\n      color: #8199b2;\r\n      font-size: 11px;\r\n      flex-shrink: 0;\r\n    }\r\n    #sps-crash-game .cg-chip {\r\n      flex-shrink: 0;\r\n      padding: 7px 11px;\r\n      border-radius: 9px;\r\n      background: #172436;\r\n      color: #b5c7dc;\r\n      font-size: 12px;\r\n      font-weight: 800;\r\n    }\r\n    #sps-crash-game .cg-chip.good {\r\n      color: #5effb5;\r\n      background: #103629;\r\n    }\r\n    #sps-crash-game .cg-chip.bad {\r\n      color: #ff8292;\r\n      background: #3b202d;\r\n    }\r\n    #sps-crash-game .cg-stage {\r\n      position: relative;\r\n      min-height: 300px;\r\n      height: clamp(300px, 43vw, 410px);\r\n      overflow: hidden;\r\n      border: 1px solid #1d354b;\r\n      border-radius: 19px;\r\n      background-color: #081522;\r\n      background-image:\r\n        linear-gradient(#1b3448 1px, transparent 1px),\r\n        linear-gradient(90deg, #1b3448 1px, transparent 1px),\r\n        radial-gradient(ellipse at 20% 100%, #0d5745 0%, transparent 60%);\r\n      background-size: 35px 35px, 35px 35px, auto;\r\n    }\r\n    #sps-crash-game .cg-stage:after {\r\n      content: \"\";\r\n      position: absolute;\r\n      inset: 0;\r\n      pointer-events: none;\r\n      background: linear-gradient(180deg, #08152222, transparent 70%, #07111f77);\r\n    }\r\n    #sps-crash-game .cg-round {\r\n      position: absolute;\r\n      z-index: 2;\r\n      top: 23px;\r\n      left: 22px;\r\n      color: #8da7c0;\r\n      font-size: 11px;\r\n    }\r\n    #sps-crash-game .cg-multiplier {\r\n      position: absolute;\r\n      z-index: 3;\r\n      top: 36%;\r\n      left: 50%;\r\n      transform: translate(-50%, -50%);\r\n      width: 100%;\r\n      text-align: center;\r\n      font-size: clamp(46px, 9vw, 84px);\r\n      line-height: 1.2;\r\n      letter-spacing: -3px;\r\n      font-weight: 1000;\r\n      color: var(--cg-green);\r\n      text-shadow: 0 0 35px #26f2a044;\r\n      transition: color .2s;\r\n      font-variant-numeric: tabular-nums;\r\n    }\r\n    #sps-crash-game .cg-message {\r\n      position: absolute;\r\n      z-index: 3;\r\n      top: calc(36% + 53px);\r\n      left: 0;\r\n      width: 100%;\r\n      padding: 0 12px;\r\n      text-align: center;\r\n      color: #a4b9ce;\r\n      font-size: 13px;\r\n    }\r\n    #sps-crash-game .cg-message.win { color: #72ffc1; }\r\n    #sps-crash-game .cg-message.loss { color: #ff8492; }\r\n    #sps-crash-game .cg-canvas {\r\n      position: absolute;\r\n      z-index: 1;\r\n      inset: 0;\r\n      width: 100%;\r\n      height: 100%;\r\n    }\r\n    #sps-crash-game .cg-plane {\r\n      position: absolute;\r\n      z-index: 4;\r\n      left: 14%;\r\n      bottom: 11%;\r\n      font-size: 30px;\r\n      transform: rotate(-16deg);\r\n      filter: drop-shadow(0 0 12px #26f2a066);\r\n      transition: opacity .2s;\r\n      pointer-events: none;\r\n    }\r\n    #sps-crash-game .cg-controls {\r\n      display: grid;\r\n      grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);\r\n      gap: 14px;\r\n      margin-top: 16px;\r\n    }\r\n    #sps-crash-game .cg-panel {\r\n      min-width: 0;\r\n      padding: 18px;\r\n      border: 1px solid var(--cg-line);\r\n      border-radius: 17px;\r\n      background: linear-gradient(145deg, #102034, #0a1624);\r\n    }\r\n    #sps-crash-game .cg-label {\r\n      display: block;\r\n      margin-bottom: 10px;\r\n      color: #9cb1c8;\r\n      font-size: 12px;\r\n    }\r\n    #sps-crash-game .cg-input-wrap {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      border: 1px solid #29435b;\r\n      border-radius: 12px;\r\n      padding: 0 12px;\r\n      background: #071320;\r\n    }\r\n    #sps-crash-game .cg-input-wrap input {\r\n      width: 100%;\r\n      min-width: 0;\r\n      height: 45px;\r\n      padding: 0;\r\n      border: 0;\r\n      outline: none;\r\n      background: transparent;\r\n      box-shadow: none;\r\n      color: white;\r\n      font: inherit;\r\n      font-size: 16px;\r\n      font-weight: 800;\r\n    }\r\n    #sps-crash-game .cg-input-wrap input:focus { outline: none; }\r\n    #sps-crash-game .cg-unit {\r\n      color: #6f8aa4;\r\n      font-size: 11px;\r\n      white-space: nowrap;\r\n    }\r\n    #sps-crash-game .cg-presets {\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      gap: 6px;\r\n      margin-top: 10px;\r\n    }\r\n    #sps-crash-game .cg-presets button {\r\n      flex: 1;\r\n      min-width: 45px;\r\n      padding: 7px 5px;\r\n      border: 1px solid #2b435a;\r\n      border-radius: 8px;\r\n      background: #15273a;\r\n      color: #c6d8ea;\r\n      font: inherit;\r\n      font-size: 11px;\r\n      cursor: pointer;\r\n    }\r\n    #sps-crash-game .cg-presets button:hover {\r\n      border-color: #26f2a0;\r\n      color: #7dffc4;\r\n    }\r\n    #sps-crash-game .cg-main-btn {\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: center;\r\n      gap: 8px;\r\n      width: 100%;\r\n      min-height: 53px;\r\n      margin-top: 17px;\r\n      border: 0;\r\n      border-radius: 12px;\r\n      background: linear-gradient(100deg, #12d98b, #52ffb4);\r\n      color: #052317;\r\n      font: inherit;\r\n      font-size: 15px;\r\n      font-weight: 900;\r\n      cursor: pointer;\r\n      box-shadow: 0 7px 22px #18e89b20;\r\n      transition: transform .2s, filter .2s, opacity .2s;\r\n    }\r\n    #sps-crash-game .cg-main-btn:hover:not(:disabled) {\r\n      transform: translateY(-2px);\r\n      filter: brightness(1.08);\r\n    }\r\n    #sps-crash-game .cg-main-btn:disabled {\r\n      cursor: not-allowed;\r\n      opacity: .55;\r\n    }\r\n    #sps-crash-game .cg-main-btn.cashout {\r\n      background: linear-gradient(100deg, #ffb82e, #ffe36b);\r\n      color: #392300;\r\n      animation: spscg-pulse .9s infinite alternate;\r\n    }\r\n    #sps-crash-game .cg-stats {\r\n      display: grid;\r\n      grid-template-columns: repeat(2, minmax(0,1fr));\r\n      gap: 10px;\r\n      margin-top: 15px;\r\n    }\r\n    #sps-crash-game .cg-stat {\r\n      padding: 13px;\r\n      border: 1px solid #20374b;\r\n      border-radius: 12px;\r\n      background: #091522;\r\n    }\r\n    #sps-crash-game .cg-stat span {\r\n      display: block;\r\n      color: #819ab3;\r\n      font-size: 11px;\r\n      margin-bottom: 7px;\r\n    }\r\n    #sps-crash-game .cg-stat strong {\r\n      display: block;\r\n      color: #edf6ff;\r\n      font-size: 19px;\r\n      font-weight: 900;\r\n      overflow-wrap: anywhere;\r\n    }\r\n    #sps-crash-game .cg-stat strong.green { color: var(--cg-green); }\r\n    #sps-crash-game .cg-note {\r\n      margin: 15px 0 0;\r\n      color: #71879e;\r\n      font-size: 11px;\r\n      line-height: 2;\r\n      text-align: center;\r\n    }\r\n    #sps-crash-game .cg-reset {\r\n      display: block;\r\n      margin: 10px auto 0;\r\n      padding: 8px 12px;\r\n      border: 1px solid #294157;\r\n      border-radius: 9px;\r\n      background: transparent;\r\n      color: #9db2c7;\r\n      font: inherit;\r\n      font-size: 11px;\r\n      cursor: pointer;\r\n    }\r\n    #sps-crash-game .cg-reset:hover { color: white; border-color: #6d8499; }\r\n    @keyframes spscg-pulse {\r\n      from { box-shadow: 0 0 0 #ffcf4a00; }\r\n      to { box-shadow: 0 0 25px #ffcf4a44; }\r\n    }\r\n    @media (max-width: 600px) {\r\n      #sps-crash-game .cg-shell { padding: 13px; border-radius: 17px; }\r\n      #sps-crash-game .cg-brand h3 { font-size: 16px; }\r\n      #sps-crash-game .cg-logo { width: 40px; height: 40px; }\r\n      #sps-crash-game .cg-stage { min-height: 270px; height: 320px; }\r\n      #sps-crash-game .cg-controls { grid-template-columns: 1fr; gap: 10px; }\r\n      #sps-crash-game .cg-panel { padding: 14px; }\r\n      #sps-crash-game .cg-multiplier { font-size: 58px; }\r\n      #sps-crash-game .cg-message { font-size: 12px; }\r\n    }\r\n    @media (prefers-reduced-motion: reduce) {\r\n      #sps-crash-game *, #sps-crash-game *:before, #sps-crash-game *:after {\r\n        animation-duration: .01ms !important;\r\n        transition-duration: .01ms !important;\r\n      }\r\n    }\r\n  <\/style>\r\n\r\n  <div class=\"cg-shell\">\r\n    <div class=\"cg-top\">\r\n      <div class=\"cg-brand\">\r\n        <div class=\"cg-logo\">\u2708<\/div>\r\n        <div>\r\n          <h3>\u0628\u0627\u0632\u06cc \u0627\u0646\u0641\u062c\u0627\u0631<\/h3>\r\n          <p>Crash Challenge \u00b7 \u0646\u0633\u062e\u0647 \u0633\u0631\u06af\u0631\u0645\u06cc<\/p>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"cg-status\"><span class=\"cg-dot\"><\/span><span data-role=\"status\">\u0622\u0645\u0627\u062f\u0647 \u0634\u0631\u0648\u0639<\/span><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"cg-history\">\r\n      <span class=\"cg-history-label\">\u062f\u0648\u0631\u0647\u0627\u06cc \u0642\u0628\u0644:<\/span>\r\n      <div data-role=\"history\" style=\"display:flex;gap:7px\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"cg-stage\" data-role=\"stage\">\r\n      <canvas class=\"cg-canvas\" data-role=\"canvas\"><\/canvas>\r\n      <div class=\"cg-round\">ROUND <span data-role=\"round\">1<\/span><\/div>\r\n      <div class=\"cg-multiplier\" data-role=\"multiplier\">\u06f1\u066b\u06f0\u06f0x<\/div>\r\n      <div class=\"cg-message\" data-role=\"message\">\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc \u0622\u0645\u0627\u062f\u0647\u200c\u0627\u06cc\u061f<\/div>\r\n      <div class=\"cg-plane\" data-role=\"plane\">\u2708<\/div>\r\n    <\/div>\r\n\r\n    <div class=\"cg-controls\">\r\n      <div class=\"cg-panel\">\r\n        <label class=\"cg-label\" for=\"spscg-points\">\u0627\u0645\u062a\u06cc\u0627\u0632 \u0641\u0631\u0636\u06cc \u0627\u06cc\u0646 \u062f\u0648\u0631<\/label>\r\n        <div class=\"cg-input-wrap\">\r\n          <input id=\"spscg-points\" data-role=\"stake\" type=\"number\"\r\n            min=\"10\" max=\"10000\" step=\"10\" value=\"100\"\r\n            inputmode=\"numeric\" aria-label=\"\u0627\u0645\u062a\u06cc\u0627\u0632 \u0641\u0631\u0636\u06cc\">\r\n          <span class=\"cg-unit\">\u0627\u0645\u062a\u06cc\u0627\u0632<\/span>\r\n        <\/div>\r\n        <div class=\"cg-presets\">\r\n          <button type=\"button\" data-preset=\"50\">\u06f5\u06f0<\/button>\r\n          <button type=\"button\" data-preset=\"100\">\u06f1\u06f0\u06f0<\/button>\r\n          <button type=\"button\" data-preset=\"250\">\u06f2\u06f5\u06f0<\/button>\r\n          <button type=\"button\" data-preset=\"500\">\u06f5\u06f0\u06f0<\/button>\r\n        <\/div>\r\n        <button type=\"button\" class=\"cg-main-btn\" data-role=\"start\">\u25b6 \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"cg-panel\">\r\n        <span class=\"cg-label\">\u0648\u0636\u0639\u06cc\u062a \u0627\u06cc\u0646 \u062f\u0648\u0631<\/span>\r\n        <div class=\"cg-stats\">\r\n          <div class=\"cg-stat\">\r\n            <span>\u0627\u0645\u062a\u06cc\u0627\u0632 \u062b\u0628\u062a\u200c\u0634\u062f\u0647<\/span>\r\n            <strong data-role=\"result\">\u06f0<\/strong>\r\n          <\/div>\r\n          <div class=\"cg-stat\">\r\n            <span>\u0636\u0631\u06cc\u0628 \u0641\u0639\u0644\u06cc<\/span>\r\n            <strong class=\"green\" data-role=\"current\">\u06f1\u066b\u06f0\u06f0x<\/strong>\r\n          <\/div>\r\n          <div class=\"cg-stat\">\r\n            <span>\u0628\u0647\u062a\u0631\u06cc\u0646 \u0636\u0631\u06cc\u0628<\/span>\r\n            <strong data-role=\"best\">\u2014<\/strong>\r\n          <\/div>\r\n          <div class=\"cg-stat\">\r\n            <span>\u0628\u0631\u062f\u0647\u0627\u06cc \u0645\u0648\u0641\u0642<\/span>\r\n            <strong data-role=\"wins\">\u06f0<\/strong>\r\n          <\/div>\r\n        <\/div>\r\n        <button type=\"button\" class=\"cg-main-btn\" data-role=\"cashout\" disabled>\r\n          \u062b\u0628\u062a \u0627\u0645\u062a\u06cc\u0627\u0632 \u0648 \u062e\u0631\u0648\u062c\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <p class=\"cg-note\">\r\n      \u0627\u06cc\u0646 \u0628\u0627\u0632\u06cc \u0635\u0631\u0641\u0627\u064b \u0628\u0631\u0627\u06cc \u0633\u0631\u06af\u0631\u0645\u06cc \u0648 \u0628\u0627 \u0627\u0645\u062a\u06cc\u0627\u0632 \u0645\u062c\u0627\u0632\u06cc \u0627\u0633\u062a\u061b \u0647\u06cc\u0686 \u067e\u0648\u0644 \u0648\u0627\u0642\u0639\u06cc\u060c\r\n      \u0634\u0631\u0637\u200c\u0628\u0646\u062f\u06cc \u06cc\u0627 \u067e\u0631\u062f\u0627\u062e\u062a\u06cc \u062f\u0631 \u0622\u0646 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.\r\n    <\/p>\r\n    <button type=\"button\" class=\"cg-reset\" data-role=\"reset\">\u0634\u0631\u0648\u0639 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648 \u067e\u0627\u06a9\u200c\u06a9\u0631\u062f\u0646 \u0631\u06a9\u0648\u0631\u062f \u0645\u062d\u0644\u06cc<\/button>\r\n  <\/div>\r\n\r\n  <script>\r\n  (() => {\r\n    const root = document.getElementById('sps-crash-game');\r\n    if (!root || root.dataset.ready === '1') return;\r\n    root.dataset.ready = '1';\r\n\r\n    const $ = name => root.querySelector('[data-role=\"' + name + '\"]');\r\n    const canvas = $('canvas');\r\n    const ctx = canvas.getContext('2d');\r\n    const stakeInput = $('stake');\r\n    const startBtn = $('start');\r\n    const cashBtn = $('cashout');\r\n    const historyBox = $('history');\r\n\r\n    let state = 'idle';\r\n    let multiplier = 1;\r\n    let crashAt = 0;\r\n    let startedAt = 0;\r\n    let lastTime = 0;\r\n    let raf = 0;\r\n    let round = 1;\r\n    let wins = 0;\r\n    let best = 0;\r\n    let history = [];\r\n    let points = [];\r\n    let roundStake = 100;\r\n    let lastResult = 0;\r\n    let message = '\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc \u0622\u0645\u0627\u062f\u0647\u200c\u0627\u06cc\u061f';\r\n\r\n    const fa = n => Math.round(n).toLocaleString('fa-IR');\r\n    const fmt = n => n.toFixed(2) + 'x';\r\n\r\n    try {\r\n      best = Number(localStorage.getItem('spscg_best') || 0);\r\n      wins = Number(localStorage.getItem('spscg_wins') || 0);\r\n      history = JSON.parse(localStorage.getItem('spscg_history') || '[]');\r\n      if (!Array.isArray(history)) history = [];\r\n    } catch (_) {}\r\n\r\n    function sizeCanvas() {\r\n      const rect = canvas.getBoundingClientRect();\r\n      const dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n      canvas.width = Math.max(1, Math.floor(rect.width * dpr));\r\n      canvas.height = Math.max(1, Math.floor(rect.height * dpr));\r\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n      draw();\r\n    }\r\n\r\n    function draw() {\r\n      const w = canvas.clientWidth;\r\n      const h = canvas.clientHeight;\r\n      if (!w || !h) return;\r\n      ctx.clearRect(0, 0, w, h);\r\n\r\n      const pad = 22;\r\n      const base = h - 22;\r\n      const maxX = w - pad;\r\n      const maxY = 20;\r\n      const progress = state === 'running'\r\n        ? Math.min(1, Math.max(.05, (performance.now() - startedAt) \/ 8500))\r\n        : (state === 'idle' ? .08 : 1);\r\n\r\n      const count = Math.max(2, Math.floor(24 + progress * 50));\r\n      const endX = pad + (maxX - pad) * progress;\r\n      const height = (base - maxY) * Math.min(.88, .12 + progress * .75);\r\n\r\n      ctx.beginPath();\r\n      ctx.moveTo(pad, base);\r\n      for (let i = 0; i <= count; i++) {\r\n        const t = i \/ count;\r\n        const x = pad + (endX - pad) * t;\r\n        const y = base - height * Math.pow(t, 1.7) +\r\n          Math.sin(t * 8 + startedAt \/ 500) * (state === 'running' ? 2.5 : 0);\r\n        if (i === 0) ctx.moveTo(x, y);\r\n        else ctx.lineTo(x, y);\r\n      }\r\n\r\n      const grad = ctx.createLinearGradient(0, 0, 0, h);\r\n      grad.addColorStop(0, state === 'crashed' ? '#ff506b66' : '#26f2a044');\r\n      grad.addColorStop(1, '#26f2a000');\r\n      ctx.lineTo(endX, base);\r\n      ctx.lineTo(pad, base);\r\n      ctx.closePath();\r\n      ctx.fillStyle = grad;\r\n      ctx.fill();\r\n\r\n      ctx.beginPath();\r\n      for (let i = 0; i <= count; i++) {\r\n        const t = i \/ count;\r\n        const x = pad + (endX - pad) * t;\r\n        const y = base - height * Math.pow(t, 1.7) +\r\n          Math.sin(t * 8 + startedAt \/ 500) * (state === 'running' ? 2.5 : 0);\r\n        if (i === 0) ctx.moveTo(x, y);\r\n        else ctx.lineTo(x, y);\r\n      }\r\n      ctx.lineWidth = 3;\r\n      ctx.lineCap = 'round';\r\n      ctx.lineJoin = 'round';\r\n      ctx.strokeStyle = state === 'crashed' ? '#ff6177' : '#26f2a0';\r\n      ctx.shadowBlur = 12;\r\n      ctx.shadowColor = ctx.strokeStyle;\r\n      ctx.stroke();\r\n      ctx.shadowBlur = 0;\r\n\r\n      const px = endX;\r\n      const py = base - height * Math.pow(progress, 1.7);\r\n      $('plane').style.left = Math.min(84, Math.max(6, px \/ w * 100)) + '%';\r\n      $('plane').style.bottom = Math.min(78, Math.max(8, (h - py) \/ h * 100)) + '%';\r\n      $('plane').style.opacity = state === 'crashed' ? '.25' : '1';\r\n    }\r\n\r\n    function updateUI() {\r\n      $('multiplier').textContent = fmt(multiplier);\r\n      $('current').textContent = fmt(multiplier);\r\n      $('result').textContent = fa(lastResult);\r\n      $('best').textContent = best ? fmt(best) : '\u2014';\r\n      $('wins').textContent = fa(wins);\r\n      $('round').textContent = fa(round);\r\n      $('status').textContent = ({\r\n        idle: '\u0622\u0645\u0627\u062f\u0647 \u0634\u0631\u0648\u0639',\r\n        running: '\u0628\u0627\u0632\u06cc \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627',\r\n        crashed: '\u0627\u0646\u0641\u062c\u0627\u0631!',\r\n        cashed: '\u0627\u0645\u062a\u06cc\u0627\u0632 \u062b\u0628\u062a \u0634\u062f'\r\n      })[state] || '\u0622\u0645\u0627\u062f\u0647';\r\n      $('message').textContent = message;\r\n      $('message').className = 'cg-message' +\r\n        (state === 'cashed' ? ' win' : state === 'crashed' ? ' loss' : '');\r\n      $('multiplier').style.color = state === 'crashed' ? '#ff6177' : '#26f2a0';\r\n      startBtn.disabled = state === 'running';\r\n      cashBtn.disabled = state !== 'running';\r\n      cashBtn.style.display = state === 'running' ? 'flex' : 'none';\r\n      startBtn.style.display = state === 'running' ? 'none' : 'flex';\r\n    }\r\n\r\n    function save() {\r\n      try {\r\n        localStorage.setItem('spscg_best', String(best));\r\n        localStorage.setItem('spscg_wins', String(wins));\r\n        localStorage.setItem('spscg_history', JSON.stringify(history.slice(0, 8)));\r\n      } catch (_) {}\r\n    }\r\n\r\n    function renderHistory() {\r\n      historyBox.replaceChildren();\r\n      history.slice(0, 8).forEach(item => {\r\n        const chip = document.createElement('span');\r\n        chip.className = 'cg-chip ' + (item >= 2 ? 'good' : 'bad');\r\n        chip.textContent = fmt(item);\r\n        historyBox.appendChild(chip);\r\n      });\r\n      if (!history.length) {\r\n        const empty = document.createElement('span');\r\n        empty.className = 'cg-chip';\r\n        empty.textContent = '\u0647\u0646\u0648\u0632 \u062f\u0648\u0631\u06cc \u062b\u0628\u062a \u0646\u0634\u062f\u0647';\r\n        historyBox.appendChild(empty);\r\n      }\r\n    }\r\n\r\n    function finishCrash() {\r\n      state = 'crashed';\r\n      multiplier = crashAt;\r\n      lastResult = 0;\r\n      message = '\u0627\u0646\u0641\u062c\u0627\u0631 \u062f\u0631 \u0636\u0631\u06cc\u0628 ' + fmt(crashAt) + ' \u0631\u062e \u062f\u0627\u062f!';\r\n      history.unshift(crashAt);\r\n      history = history.slice(0, 8);\r\n      save();\r\n      renderHistory();\r\n      updateUI();\r\n      draw();\r\n      round++;\r\n    }\r\n\r\n    function tick(now) {\r\n      if (state !== 'running') return;\r\n      const elapsed = (now - startedAt) \/ 1000;\r\n      multiplier = Math.max(1, Math.exp(elapsed * .22));\r\n      if (multiplier >= crashAt) {\r\n        finishCrash();\r\n        return;\r\n      }\r\n      if (now - lastTime > 40) {\r\n        updateUI();\r\n        draw();\r\n        lastTime = now;\r\n      }\r\n      raf = requestAnimationFrame(tick);\r\n    }\r\n\r\n    function startGame() {\r\n      if (state === 'running') return;\r\n      const amount = Number(stakeInput.value);\r\n      if (!Number.isFinite(amount) || amount < 10 || amount > 10000) {\r\n        message = '\u0627\u0645\u062a\u06cc\u0627\u0632 \u0628\u0627\u06cc\u062f \u0628\u06cc\u0646 \u06f1\u06f0 \u062a\u0627 \u06f1\u06f0\u066c\u06f0\u06f0\u06f0 \u0628\u0627\u0634\u062f.';\r\n        updateUI();\r\n        return;\r\n      }\r\n      roundStake = Math.floor(amount);\r\n      multiplier = 1;\r\n      lastResult = 0;\r\n      points = [];\r\n      \/\/ \u0636\u0631\u06cc\u0628 \u0627\u0646\u0641\u062c\u0627\u0631 \u0635\u0631\u0641\u0627\u064b \u062a\u0635\u0627\u062f\u0641\u06cc \u0648 \u0628\u0631\u0627\u06cc \u0633\u0631\u06af\u0631\u0645\u06cc \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u0634\u0648\u062f.\r\n      const r = Math.random();\r\n      crashAt = r < .08 ? 1.05 + Math.random() * .35\r\n        : Math.min(12, 1.1 + (-Math.log(1 - Math.random()) * 2.1));\r\n      startedAt = performance.now();\r\n      lastTime = 0;\r\n      state = 'running';\r\n      message = '\u0642\u0628\u0644 \u0627\u0632 \u0627\u0646\u0641\u062c\u0627\u0631\u060c \u0627\u0645\u062a\u06cc\u0627\u0632\u062a \u0631\u0627 \u062b\u0628\u062a \u06a9\u0646!';\r\n      cancelAnimationFrame(raf);\r\n      updateUI();\r\n      raf = requestAnimationFrame(tick);\r\n    }\r\n\r\n    function cashOut() {\r\n      if (state !== 'running') return;\r\n      cancelAnimationFrame(raf);\r\n      const score = Math.floor(roundStake * multiplier);\r\n      lastResult = score;\r\n      wins++;\r\n      best = Math.max(best, multiplier);\r\n      history.unshift(multiplier);\r\n      history = history.slice(0, 8);\r\n      state = 'cashed';\r\n      message = '\u0622\u0641\u0631\u06cc\u0646! ' + fa(score) + ' \u0627\u0645\u062a\u06cc\u0627\u0632 \u062b\u0628\u062a \u06a9\u0631\u062f\u06cc.';\r\n      save();\r\n      renderHistory();\r\n      updateUI();\r\n      draw();\r\n      round++;\r\n    }\r\n\r\n    startBtn.addEventListener('click', startGame);\r\n    cashBtn.addEventListener('click', cashOut);\r\n\r\n    root.querySelectorAll('[data-preset]').forEach(btn => {\r\n      btn.addEventListener('click', () => {\r\n        if (state !== 'running') stakeInput.value = btn.dataset.preset;\r\n      });\r\n    });\r\n\r\n    $('reset').addEventListener('click', () => {\r\n      cancelAnimationFrame(raf);\r\n      state = 'idle';\r\n      multiplier = 1;\r\n      lastResult = 0;\r\n      message = '\u0631\u06a9\u0648\u0631\u062f \u0645\u062d\u0644\u06cc \u067e\u0627\u06a9 \u0634\u062f\u061b \u0622\u0645\u0627\u062f\u0647 \u0634\u0631\u0648\u0639\u06cc \u062a\u0627\u0632\u0647 \u0647\u0633\u062a\u06cc\u061f';\r\n      best = 0;\r\n      wins = 0;\r\n      history = [];\r\n      try {\r\n        localStorage.removeItem('spscg_best');\r\n        localStorage.removeItem('spscg_wins');\r\n        localStorage.removeItem('spscg_history');\r\n      } catch (_) {}\r\n      renderHistory();\r\n      updateUI();\r\n      draw();\r\n    });\r\n\r\n    if ('ResizeObserver' in window) {\r\n      new ResizeObserver(sizeCanvas).observe($('stage'));\r\n    } else {\r\n      window.addEventListener('resize', sizeCanvas);\r\n    }\r\n\r\n    renderHistory();\r\n    updateUI();\r\n    sizeCanvas();\r\n  })();\r\n  <\/script>\r\n<\/div>\r\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-84b2575 e-flex e-con-boxed e-con e-parent\" data-id=\"84b2575\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5987eb7 elementor-widget elementor-widget-html\" data-id=\"5987eb7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\r\n<div id=\"sps-tower-game\" dir=\"rtl\">\r\n<style>\r\n#sps-tower-game{\r\n  font-family:Vazirmatn,Tahoma,sans-serif;\r\n  color:#f4f7ff;\r\n  width:100%;\r\n  margin:20px auto;\r\n  --tg-line:#283b60;\r\n  --tg-green:#9dffbd;\r\n}\r\n#sps-tower-game *{box-sizing:border-box}\r\n#sps-tower-game .tg-shell{\r\n  position:relative;overflow:hidden;padding:clamp(12px,3vw,25px);\r\n  border:1px solid #30476e;border-radius:24px;\r\n  background:radial-gradient(ellipse at 50% 0%,#2b4e84 0%,transparent 55%),\r\n  linear-gradient(155deg,#111c39,#080e20 80%);\r\n  box-shadow:0 20px 60px #050b1b55;\r\n}\r\n#sps-tower-game .tg-header{\r\n  display:flex;align-items:center;justify-content:space-between;\r\n  flex-wrap:wrap;gap:12px;margin-bottom:17px;\r\n}\r\n#sps-tower-game .tg-title{\r\n  display:flex;align-items:center;gap:11px;\r\n}\r\n#sps-tower-game .tg-icon{\r\n  width:45px;height:45px;border-radius:14px;display:grid;\r\n  place-items:center;background:linear-gradient(140deg,#ffcf72,#ff8b78);\r\n  font-size:24px;box-shadow:0 6px 20px #ff9b7040;\r\n}\r\n#sps-tower-game .tg-title h3{\r\n  color:#fff;font-size:19px;font-weight:900;margin:0 0 4px;\r\n}\r\n#sps-tower-game .tg-title p{\r\n  margin:0;color:#9aafd0;font-size:11px;\r\n}\r\n#sps-tower-game .tg-level{\r\n  border:1px solid #3e4f7a;border-radius:30px;padding:8px 13px;\r\n  background:#1a2948;color:#d9e6ff;font-size:12px;\r\n}\r\n#sps-tower-game .tg-level strong{color:#ffcf72}\r\n#sps-tower-game .tg-stage{\r\n  position:relative;overflow:hidden;border:1px solid #31456a;\r\n  border-radius:18px;background:#101b38;\r\n  height:clamp(360px,65vw,540px);min-height:360px;\r\n}\r\n#sps-tower-game .tg-canvas{\r\n  display:block;width:100%;height:100%;touch-action:manipulation;\r\n}\r\n#sps-tower-game .tg-hint{\r\n  position:absolute;top:14px;left:50%;transform:translateX(-50%);\r\n  width:max-content;max-width:90%;padding:9px 13px;\r\n  border:1px solid #ffffff26;border-radius:30px;\r\n  background:#0b1535a8;color:#e7edff;font-size:11px;\r\n  pointer-events:none;text-align:center;backdrop-filter:blur(8px);\r\n}\r\n#sps-tower-game .tg-overlay{\r\n  position:absolute;inset:0;z-index:4;display:flex;\r\n  align-items:center;justify-content:center;padding:20px;\r\n  background:#07112788;backdrop-filter:blur(5px);\r\n}\r\n#sps-tower-game .tg-overlay[hidden]{display:none}\r\n#sps-tower-game .tg-modal{\r\n  width:min(100%,330px);padding:23px 18px;text-align:center;\r\n  border:1px solid #6579a766;border-radius:20px;\r\n  background:linear-gradient(145deg,#202f54f2,#101a35f5);\r\n  box-shadow:0 20px 60px #03091b88;\r\n}\r\n#sps-tower-game .tg-modal-icon{font-size:42px;margin-bottom:8px}\r\n#sps-tower-game .tg-modal h4{font-size:21px;margin:0 0 9px;color:white}\r\n#sps-tower-game .tg-modal p{font-size:12px;color:#bdcbe7;line-height:2;margin:0 0 16px}\r\n#sps-tower-game .tg-btn{\r\n  min-height:48px;padding:12px 18px;border:0;border-radius:12px;\r\n  background:linear-gradient(100deg,#ffb45c,#ffe18a);\r\n  color:#2b1b08;font:inherit;font-weight:900;font-size:14px;\r\n  cursor:pointer;transition:transform .2s,filter .2s;\r\n}\r\n#sps-tower-game .tg-btn:hover{transform:translateY(-2px);filter:brightness(1.08)}\r\n#sps-tower-game .tg-btn:focus-visible{outline:3px solid white;outline-offset:3px}\r\n#sps-tower-game .tg-btn.secondary{\r\n  background:#202f4c;color:#e5edff;border:1px solid #425577;\r\n}\r\n#sps-tower-game .tg-controls{\r\n  display:grid;grid-template-columns:1fr 1.1fr;gap:12px;margin-top:14px;\r\n}\r\n#sps-tower-game .tg-card{\r\n  padding:15px;border:1px solid var(--tg-line);border-radius:15px;\r\n  background:linear-gradient(145deg,#172442,#101a32);\r\n}\r\n#sps-tower-game .tg-card-label{color:#9aafd0;font-size:11px;margin-bottom:9px}\r\n#sps-tower-game .tg-score{\r\n  color:#ffcf72;font-size:30px;line-height:1.2;font-weight:1000;\r\n  font-variant-numeric:tabular-nums;\r\n}\r\n#sps-tower-game .tg-record{color:#a5ffc2;font-size:17px;font-weight:900}\r\n#sps-tower-game .tg-meter{\r\n  height:6px;border-radius:9px;background:#0b142a;overflow:hidden;margin-top:13px;\r\n}\r\n#sps-tower-game .tg-meter span{\r\n  display:block;height:100%;width:0%;\r\n  background:linear-gradient(90deg,#76e8ff,#a7ffbb);\r\n  border-radius:9px;transition:width .25s;\r\n}\r\n#sps-tower-game .tg-action{\r\n  display:flex;flex-direction:column;justify-content:center;gap:9px;\r\n}\r\n#sps-tower-game .tg-action .tg-btn{width:100%;font-size:14px}\r\n#sps-tower-game .tg-action-note{font-size:10px;color:#92a7c9;text-align:center;line-height:1.8}\r\n#sps-tower-game .tg-footer{\r\n  display:flex;gap:8px;flex-wrap:wrap;justify-content:space-between;\r\n  margin-top:12px;color:#8297b9;font-size:10px;line-height:1.9;\r\n}\r\n#sps-tower-game .tg-footer button{\r\n  border:0;background:transparent;color:#9eb3d4;\r\n  font:inherit;text-decoration:underline;cursor:pointer;\r\n}\r\n@media(max-width:520px){\r\n  #sps-tower-game .tg-shell{padding:11px;border-radius:17px}\r\n  #sps-tower-game .tg-title h3{font-size:16px}\r\n  #sps-tower-game .tg-icon{width:39px;height:39px}\r\n  #sps-tower-game .tg-stage{height:430px;min-height:360px}\r\n  #sps-tower-game .tg-controls{grid-template-columns:1fr 1fr;gap:8px}\r\n  #sps-tower-game .tg-card{padding:12px}\r\n  #sps-tower-game .tg-score{font-size:25px}\r\n  #sps-tower-game .tg-action .tg-btn{padding:10px 6px;font-size:12px}\r\n}\r\n@media(prefers-reduced-motion:reduce){\r\n  #sps-tower-game *,#sps-tower-game *:before,#sps-tower-game *:after{\r\n    transition:none!important;animation:none!important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<div class=\"tg-shell\">\r\n  <div class=\"tg-header\">\r\n    <div class=\"tg-title\">\r\n      <div class=\"tg-icon\">\ud83e\uddf1<\/div>\r\n      <div>\r\n        <h3>\u0628\u0631\u062c\u200c\u0633\u0627\u0632<\/h3>\r\n        <p>TOWER BUILDER \u00b7 \u0628\u0627\u0632\u06cc \u0645\u0647\u0627\u0631\u062a \u0648 \u062f\u0642\u062a<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"tg-level\">\u0645\u0631\u062d\u0644\u0647 <strong data-tg=\"level\">\u06f1<\/strong><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"tg-stage\" data-tg=\"stage\">\r\n    <canvas class=\"tg-canvas\" data-tg=\"canvas\" aria-label=\"\u0645\u062d\u06cc\u0637 \u0628\u0627\u0632\u06cc \u0628\u0631\u062c \u0633\u0627\u0632\u06cc\"><\/canvas>\r\n    <div class=\"tg-hint\" data-tg=\"hint\">\u0628\u0631\u0627\u06cc \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0628\u0644\u0648\u06a9\u060c \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0628\u0632\u0646 \u06cc\u0627 \u062f\u06a9\u0645\u0647 \u0631\u0627 \u0641\u0634\u0627\u0631 \u0628\u062f\u0647<\/div>\r\n    <div class=\"tg-overlay\" data-tg=\"overlay\">\r\n      <div class=\"tg-modal\">\r\n        <div class=\"tg-modal-icon\">\ud83c\udfd7\ufe0f<\/div>\r\n        <h4 data-tg=\"modal-title\">\u0628\u0631\u062c \u0631\u0648\u06cc\u0627\u0647\u0627\u062a \u0631\u0648 \u0628\u0633\u0627\u0632!<\/h4>\r\n        <p data-tg=\"modal-text\">\u0628\u0644\u0648\u06a9 \u0645\u062a\u062d\u0631\u06a9 \u0631\u0627 \u0631\u0648\u06cc \u0628\u0631\u062c \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646. \u0647\u0631\u0686\u0647 \u062f\u0642\u06cc\u0642\u200c\u062a\u0631 \u0628\u0627\u0634\u06cc\u060c \u0628\u0631\u062c \u0628\u0644\u0646\u062f\u062a\u0631 \u0645\u06cc\u200c\u0634\u0648\u062f. \u0642\u0633\u0645\u062a\u200c\u0647\u0627\u06cc \u0628\u06cc\u0631\u0648\u0646\u200c\u0632\u062f\u0647 \u0633\u0642\u0648\u0637 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f!<\/p>\r\n        <button class=\"tg-btn\" type=\"button\" data-tg=\"start\">\u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc<\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"tg-controls\">\r\n    <div class=\"tg-card\">\r\n      <div class=\"tg-card-label\">\u0627\u0645\u062a\u06cc\u0627\u0632 \u0627\u06cc\u0646 \u062f\u0648\u0631<\/div>\r\n      <div class=\"tg-score\" data-tg=\"score\">\u06f0<\/div>\r\n      <div class=\"tg-meter\"><span data-tg=\"meter\"><\/span><\/div>\r\n      <div class=\"tg-card-label\" style=\"margin-top:12px\">\u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u06a9\u0648\u0631\u062f<\/div>\r\n      <div class=\"tg-record\" data-tg=\"record\">\u06f0 \u0628\u0644\u0648\u06a9<\/div>\r\n    <\/div>\r\n    <div class=\"tg-card tg-action\">\r\n      <button class=\"tg-btn\" type=\"button\" data-tg=\"drop\">\u2b07 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0628\u0644\u0648\u06a9<\/button>\r\n      <button class=\"tg-btn secondary\" type=\"button\" data-tg=\"restart\">\u0634\u0631\u0648\u0639 \u0645\u062c\u062f\u062f<\/button>\r\n      <div class=\"tg-action-note\" data-tg=\"status\">\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0622\u0645\u0627\u062f\u0647\u200c\u0627\u06cc\u061f<\/div>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"tg-footer\">\r\n    <span>\ud83c\udfaf \u0647\u062f\u0641: \u0633\u0627\u062e\u062a \u0628\u0644\u0646\u062f\u062a\u0631\u06cc\u0646 \u0628\u0631\u062c \u0645\u0645\u06a9\u0646<\/span>\r\n    <button type=\"button\" data-tg=\"sound\" aria-pressed=\"false\">\ud83d\udd07 \u0635\u062f\u0627\u06cc \u0628\u0627\u0632\u06cc: \u062e\u0627\u0645\u0648\u0634<\/button>\r\n    <span>\u0627\u0645\u062a\u06cc\u0627\u0632\u0647\u0627 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0633\u0631\u06af\u0631\u0645\u06cc\u200c\u0627\u0646\u062f<\/span>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(() => {\r\n  const root = document.getElementById('sps-tower-game');\r\n  if (!root || root.dataset.initialized === '1') return;\r\n  root.dataset.initialized = '1';\r\n  const $ = name => root.querySelector('[data-tg=\"' + name + '\"]');\r\n  const canvas = $('canvas');\r\n  const ctx = canvas.getContext('2d');\r\n\r\n  let w = 0, h = 0, dpr = 1;\r\n  let blocks = [], moving = null, particles = [];\r\n  let score = 0, level = 1, best = 0;\r\n  let mode = 'intro', raf = 0, last = 0;\r\n  let cameraY = 0, targetCameraY = 0;\r\n  let soundOn = false, audio = null;\r\n  let clouds = [];\r\n  let shake = 0;\r\n  let colors = ['#73e5ff','#9dffb7','#ffd477','#ff9bc5','#b5a0ff','#ff9b78'];\r\n  const fa = n => Math.floor(n).toLocaleString('fa-IR');\r\n\r\n  try { best = Number(localStorage.getItem('sps_tower_best') || 0); } catch(e) {}\r\n\r\n  function resize() {\r\n    const r = canvas.getBoundingClientRect();\r\n    w = r.width; h = r.height;\r\n    dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n    canvas.width = Math.max(1, Math.floor(w * dpr));\r\n    canvas.height = Math.max(1, Math.floor(h * dpr));\r\n    ctx.setTransform(dpr,0,0,dpr,0,0);\r\n    if (!clouds.length) {\r\n      clouds = Array.from({length:8},(_,i)=>({\r\n        x:Math.random()*w,y:30+Math.random()*h*.72,\r\n        s:18+Math.random()*30,v:4+Math.random()*9\r\n      }));\r\n    }\r\n    draw();\r\n  }\r\n\r\n  function newGame() {\r\n    cancelAnimationFrame(raf);\r\n    score = 0; level = 1; cameraY = 0; targetCameraY = 0;\r\n    particles = []; shake = 0; mode = 'playing';\r\n    const bw = Math.min(150, w * .36);\r\n    blocks = [{\r\n      x:(w-bw)\/2, y:0, width:bw, height:24,\r\n      color:'#7e8cff', depth:12\r\n    }];\r\n    moving = {\r\n      x:15, y:0, width:bw, height:24, depth:12,\r\n      dir:1, speed:105, color:colors[0], phase:0\r\n    };\r\n    $('overlay').hidden = true;\r\n    $('status').textContent = '\u0628\u0644\u0648\u06a9 \u0631\u0627 \u0631\u0648\u06cc \u0628\u0631\u062c \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646';\r\n    $('hint').textContent = '\u0628\u0631\u0627\u06cc \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0646 \u0628\u0644\u0648\u06a9 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646 \u06cc\u0627 \u062f\u06a9\u0645\u0647 \u067e\u0627\u06cc\u06cc\u0646 \u0631\u0627 \u0628\u0632\u0646';\r\n    updateUI();\r\n    last = performance.now();\r\n    cancelAnimationFrame(raf);\r\n    raf = requestAnimationFrame(loop);\r\n  }\r\n\r\n  function updateUI() {\r\n    $('score').textContent = fa(score);\r\n    $('level').textContent = fa(level);\r\n    $('record').textContent = fa(best) + ' \u0628\u0644\u0648\u06a9';\r\n    $('meter').style.width = (score % 10) * 10 + '%';\r\n    $('drop').disabled = mode !== 'playing';\r\n  }\r\n\r\n  function playTone(freq=440, duration=.08, type='sine') {\r\n    if (!soundOn) return;\r\n    try {\r\n      audio = audio || new (window.AudioContext || window.webkitAudioContext)();\r\n      if (audio.state === 'suspended') audio.resume();\r\n      const osc = audio.createOscillator();\r\n      const gain = audio.createGain();\r\n      osc.type = type; osc.frequency.value = freq;\r\n      gain.gain.setValueAtTime(.07,audio.currentTime);\r\n      gain.gain.exponentialRampToValueAtTime(.001,audio.currentTime+duration);\r\n      osc.connect(gain); gain.connect(audio.destination);\r\n      osc.start(); osc.stop(audio.currentTime+duration);\r\n    } catch(e) {}\r\n  }\r\n\r\n  function addParticles(x,y,color,count=12) {\r\n    for (let i=0;i<count;i++) {\r\n      const a = Math.random()*Math.PI*2, sp=30+Math.random()*150;\r\n      particles.push({\r\n        x,y,vx:Math.cos(a)*sp,vy:Math.sin(a)*sp-40,\r\n        life:.45+Math.random()*.55,size:2+Math.random()*5,color\r\n      });\r\n    }\r\n  }\r\n\r\n  function dropBlock() {\r\n    if (mode !== 'playing' || !moving) return;\r\n    const top = blocks[blocks.length-1];\r\n    const left = Math.max(top.x,moving.x);\r\n    const right = Math.min(top.x+top.width,moving.x+moving.width);\r\n    const overlap = right-left;\r\n\r\n    if (overlap < 8) {\r\n      addParticles(moving.x+moving.width\/2, h*.65, moving.color, 28);\r\n      playTone(110,.3,'sawtooth');\r\n      gameOver();\r\n      return;\r\n    }\r\n\r\n    const cutLeft = moving.x < top.x ? top.x-moving.x : 0;\r\n    const cutRight = moving.x+moving.width > top.x+top.width\r\n      ? moving.x+moving.width-(top.x+top.width) : 0;\r\n\r\n    if (cutLeft > 0) addParticles(moving.x+cutLeft\/2, h*.55, moving.color, 10);\r\n    if (cutRight > 0) addParticles(right+cutRight\/2, h*.55, moving.color, 10);\r\n\r\n    const newBlock = {\r\n      x:left,y:top.y+top.height+2,width:overlap,\r\n      height:Math.max(17,24-Math.min(7,score*.12)),\r\n      color:moving.color,depth:12\r\n    };\r\n    blocks.push(newBlock);\r\n    score++;\r\n    level = 1 + Math.floor(score\/5);\r\n    addParticles(left+overlap\/2, h*.5, moving.color, 6);\r\n    playTone(420+Math.min(score,20)*18,.08);\r\n    targetCameraY = Math.max(0, (blocks.length-5)*27);\r\n    if (overlap < moving.width*.3) {\r\n      \/\/ \u0628\u0644\u0648\u06a9 \u0628\u0627\u0631\u06cc\u06a9\u200c\u062a\u0631 \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0627\u0646\u062f \u0648 \u0628\u0627\u0632\u06cc \u062f\u0634\u0648\u0627\u0631\u062a\u0631 \u0645\u06cc\u200c\u0634\u0648\u062f.\r\n      $('status').textContent = '\u062e\u0648\u0628 \u0628\u0648\u062f! \u062d\u0627\u0644\u0627 \u062f\u0642\u06cc\u0642\u200c\u062a\u0631 \u0628\u0627\u0634';\r\n    } else {\r\n      $('status').textContent = '\u0639\u0627\u0644\u06cc! \u0628\u0644\u0648\u06a9 \u0628\u0639\u062f\u06cc \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a';\r\n    }\r\n    moving = {\r\n      x: Math.random()<.5 ? 5 : w-newBlock.width-5,\r\n      y:newBlock.y+newBlock.height+2,\r\n      width:newBlock.width,height:newBlock.height,depth:12,\r\n      dir:Math.random()<.5 ? 1 : -1,\r\n      speed:Math.min(290,105+score*8),\r\n      color:colors[score%colors.length],phase:Math.random()*6\r\n    };\r\n    updateUI();\r\n  }\r\n\r\n  function gameOver() {\r\n    mode = 'over'; moving = null;\r\n    if (score > best) {\r\n      best = score;\r\n      try { localStorage.setItem('sps_tower_best',String(best)); } catch(e) {}\r\n    }\r\n    updateUI();\r\n    $('status').textContent = '\u0627\u06cc\u0646 \u062f\u0648\u0631 \u062a\u0645\u0627\u0645 \u0634\u062f';\r\n    $('modal-title').textContent = score ? '\u0628\u0631\u062c\u062a \u0641\u0631\u0648 \u0631\u06cc\u062e\u062a!' : '\u06cc\u0647 \u0628\u0627\u0631 \u062f\u06cc\u06af\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646!';\r\n    $('modal-text').textContent = '\u062a\u0639\u062f\u0627\u062f \u0628\u0644\u0648\u06a9\u200c\u0647\u0627\u06cc \u062a\u0648: ' + fa(score) +\r\n      ' . \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u06a9\u0648\u0631\u062f\u062a: ' + fa(best) +\r\n      ' \u0628\u0644\u0648\u06a9 \u0627\u0633\u062a. \u062f\u0648\u0628\u0627\u0631\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646 \u0648 \u0631\u06a9\u0648\u0631\u062f\u062a \u0631\u0627 \u0628\u0647\u062a\u0631 \u06a9\u0646!';\r\n    $('start').textContent = '\u0628\u0627\u0632\u06cc \u062f\u0648\u0628\u0627\u0631\u0647';\r\n    $('overlay').hidden = false;\r\n  }\r\n\r\n  function drawBlock(b, screenY) {\r\n    const x=b.x, y=screenY, bw=b.width, bh=b.height, d=b.depth||12;\r\n    ctx.save();\r\n    \/\/ \u0633\u0637\u062d \u0628\u0627\u0644\u0627\u06cc\u06cc\r\n    ctx.beginPath();\r\n    ctx.moveTo(x,y); ctx.lineTo(x+d,y-d*.65);\r\n    ctx.lineTo(x+bw+d,y-d*.65); ctx.lineTo(x+bw,y);\r\n    ctx.closePath();\r\n    ctx.fillStyle=lighten(b.color,25); ctx.fill();\r\n    \/\/ \u0646\u0645\u0627\u06cc \u062c\u0644\u0648\u06cc\u06cc\r\n    ctx.beginPath();\r\n    ctx.rect(x,y,bw,bh);\r\n    ctx.fillStyle=b.color; ctx.fill();\r\n    \/\/ \u0646\u0645\u0627\u06cc \u062c\u0627\u0646\u0628\u06cc\r\n    ctx.beginPath();\r\n    ctx.moveTo(x+bw,y); ctx.lineTo(x+bw+d,y-d*.65);\r\n    ctx.lineTo(x+bw+d,y+bh-d*.65); ctx.lineTo(x+bw,y+bh);\r\n    ctx.closePath();\r\n    ctx.fillStyle=lighten(b.color,-25); ctx.fill();\r\n    ctx.strokeStyle='#ffffff55'; ctx.lineWidth=1;\r\n    ctx.strokeRect(x+.5,y+.5,bw-1,bh-1);\r\n    ctx.restore();\r\n  }\r\n\r\n  function lighten(hex,amount) {\r\n    const c=hex.replace('#','');\r\n    const n=parseInt(c,16);\r\n    let r=(n>>16)&255,g=(n>>8)&255,b=n&255;\r\n    r=Math.max(0,Math.min(255,r+amount*2));\r\n    g=Math.max(0,Math.min(255,g+amount*2));\r\n    b=Math.max(0,Math.min(255,b+amount*2));\r\n    return 'rgb('+r+','+g+','+b+')';\r\n  }\r\n\r\n  function drawBackground(dt) {\r\n    const grad=ctx.createLinearGradient(0,0,0,h);\r\n    grad.addColorStop(0,'#19294e');\r\n    grad.addColorStop(.6,'#253a65');\r\n    grad.addColorStop(1,'#101a36');\r\n    ctx.fillStyle=grad;ctx.fillRect(0,0,w,h);\r\n\r\n    \/\/ \u0645\u0627\u0647 \u0648 \u0647\u0627\u0644\u0647\r\n    const mx=w*.78,my=h*.17;\r\n    const glow=ctx.createRadialGradient(mx,my,2,mx,my,65);\r\n    glow.addColorStop(0,'#ffe9ad55');glow.addColorStop(1,'#ffe9ad00');\r\n    ctx.fillStyle=glow;ctx.fillRect(mx-65,my-65,130,130);\r\n    ctx.beginPath();ctx.arc(mx,my,19,0,Math.PI*2);\r\n    ctx.fillStyle='#ffe8b4';ctx.fill();\r\n\r\n    clouds.forEach(c=>{\r\n      c.x-=c.v*dt;\r\n      if(c.x+c.s*2<0){c.x=w+c.s;c.y=25+Math.random()*h*.65;}\r\n      ctx.fillStyle='#ffffff0c';\r\n      ctx.beginPath();\r\n      ctx.ellipse(c.x,c.y,c.s*1.6,c.s*.42,0,0,Math.PI*2);\r\n      ctx.fill();\r\n    });\r\n\r\n    \/\/ \u0634\u0647\u0631 \u062f\u0631 \u062f\u0648\u0631\u062f\u0633\u062a\r\n    const ground=h-20;\r\n    ctx.fillStyle='#0a1530';\r\n    for(let x=0;x<w;x+=24){\r\n      const bh=28+Math.abs(Math.sin(x*12.2))*58;\r\n      ctx.fillRect(x,ground-bh,18,bh);\r\n      ctx.fillStyle='#b3d7ff1a';\r\n      for(let yy=ground-bh+9;yy<ground-5;yy+=12)\r\n        ctx.fillRect(x+5,yy,3,4);\r\n      ctx.fillStyle='#0a1530';\r\n    }\r\n    ctx.fillStyle='#0b132a';ctx.fillRect(0,ground,w,h-ground);\r\n  }\r\n\r\n  function draw() {\r\n    if (!w || !h) return;\r\n    ctx.clearRect(0,0,w,h);\r\n    drawBackground(0);\r\n    const baseY=h-55;\r\n    \/\/ \u067e\u0627\u06cc\u0647 \u0628\u0631\u062c\r\n    blocks.forEach((b,i)=>{\r\n      const screenY=baseY-(b.y-cameraY);\r\n      if(screenY>-60 && screenY<h+60) drawBlock(b,screenY);\r\n    });\r\n    if(moving && mode==='playing'){\r\n      const top=blocks[blocks.length-1];\r\n      const screenY=baseY-(moving.y-cameraY);\r\n      \/\/ \u062e\u0637 \u0631\u0627\u0647\u0646\u0645\u0627\r\n      ctx.save();ctx.setLineDash([4,6]);\r\n      ctx.strokeStyle='#ffffff44';ctx.lineWidth=1;\r\n      ctx.beginPath();ctx.moveTo(moving.x+moving.width\/2,screenY-28);\r\n      ctx.lineTo(moving.x+moving.width\/2,baseY-(top.y-cameraY)+top.height+2);\r\n      ctx.stroke();ctx.restore();\r\n      drawBlock(moving,screenY);\r\n    }\r\n    particles.forEach(p=>{\r\n      ctx.globalAlpha=Math.max(0,p.life);\r\n      ctx.fillStyle=p.color;\r\n      ctx.fillRect(p.x,p.y,p.size,p.size);\r\n    });\r\n    ctx.globalAlpha=1;\r\n  }\r\n\r\n  function loop(now) {\r\n    if(mode!=='playing') { draw(); return; }\r\n    const dt=Math.min(.035,(now-last)\/1000 || .016);\r\n    last=now;\r\n    if(moving){\r\n      moving.x+=moving.dir*moving.speed*dt;\r\n      if(moving.x+moving.width>w-5){moving.x=w-5-moving.width;moving.dir=-1;}\r\n      if(moving.x<5){moving.x=5;moving.dir=1;}\r\n    }\r\n    cameraY += (targetCameraY-cameraY)*Math.min(1,dt*4);\r\n    particles=particles.filter(p=>p.life>0);\r\n    particles.forEach(p=>{\r\n      p.x+=p.vx*dt;p.y+=p.vy*dt;p.vy+=210*dt;p.life-=dt;\r\n    });\r\n    draw();\r\n    raf=requestAnimationFrame(loop);\r\n  }\r\n\r\n  $('start').addEventListener('click',newGame);\r\n  $('restart').addEventListener('click',newGame);\r\n  $('drop').addEventListener('click',dropBlock);\r\n  canvas.addEventListener('pointerdown',e=>{\r\n    if(mode==='playing'){\r\n      e.preventDefault();\r\n      dropBlock();\r\n    }\r\n  });\r\n  $('sound').addEventListener('click',()=>{\r\n    soundOn=!soundOn;\r\n    $('sound').textContent=soundOn?'\ud83d\udd0a \u0635\u062f\u0627\u06cc \u0628\u0627\u0632\u06cc: \u0631\u0648\u0634\u0646':'\ud83d\udd07 \u0635\u062f\u0627\u06cc \u0628\u0627\u0632\u06cc: \u062e\u0627\u0645\u0648\u0634';\r\n    $('sound').setAttribute('aria-pressed',String(soundOn));\r\n    if(soundOn) playTone(520,.08);\r\n  });\r\n  window.addEventListener('keydown',e=>{\r\n    if(!root.contains(document.activeElement) && document.activeElement!==document.body)return;\r\n    if((e.code==='Space'||e.code==='ArrowDown') && mode==='playing'){\r\n      e.preventDefault();dropBlock();\r\n    }\r\n  });\r\n\r\n  if('ResizeObserver' in window) new ResizeObserver(resize).observe($('stage'));\r\n  else window.addEventListener('resize',resize);\r\n  resize();\r\n  updateUI();\r\n})();\r\n<\/script>\r\n<\/div>\r\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u2708 \u0628\u0627\u0632\u06cc \u0627\u0646\u0641\u062c\u0627\u0631 Crash Challenge \u00b7 \u0646\u0633\u062e\u0647 \u0633\u0631\u06af\u0631\u0645\u06cc \u0622\u0645\u0627\u062f\u0647 \u0634\u0631\u0648\u0639 \u062f\u0648\u0631\u0647\u0627\u06cc \u0642\u0628\u0644: ROUND 1 \u06f1\u066b\u06f0\u06f0x \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc \u0622\u0645\u0627\u062f\u0647\u200c\u0627\u06cc\u061f \u2708 \u0627\u0645\u062a\u06cc\u0627\u0632 \u0641\u0631\u0636\u06cc \u0627\u06cc\u0646 \u062f\u0648\u0631 \u0627\u0645\u062a\u06cc\u0627\u0632 \u06f5\u06f0 \u06f1\u06f0\u06f0 \u06f2\u06f5\u06f0 \u06f5\u06f0\u06f0 \u25b6 \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc \u0648\u0636\u0639\u06cc\u062a \u0627\u06cc\u0646 \u062f\u0648\u0631 \u0627\u0645\u062a\u06cc\u0627\u0632 \u062b\u0628\u062a\u200c\u0634\u062f\u0647 \u06f0 \u0636\u0631\u06cc\u0628 \u0641\u0639\u0644\u06cc \u06f1\u066b\u06f0\u06f0x \u0628\u0647\u062a\u0631\u06cc\u0646 \u0636\u0631\u06cc\u0628 \u2014 \u0628\u0631\u062f\u0647\u0627\u06cc \u0645\u0648\u0641\u0642 \u06f0 \u062b\u0628\u062a \u0627\u0645\u062a\u06cc\u0627\u0632 \u0648 \u062e\u0631\u0648\u062c \u0627\u06cc\u0646 \u0628\u0627\u0632\u06cc \u0635\u0631\u0641\u0627\u064b \u0628\u0631\u0627\u06cc [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-342","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/saburnet.ir\/index.php?rest_route=\/wp\/v2\/pages\/342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/saburnet.ir\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/saburnet.ir\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/saburnet.ir\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/saburnet.ir\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=342"}],"version-history":[{"count":22,"href":"https:\/\/saburnet.ir\/index.php?rest_route=\/wp\/v2\/pages\/342\/revisions"}],"predecessor-version":[{"id":374,"href":"https:\/\/saburnet.ir\/index.php?rest_route=\/wp\/v2\/pages\/342\/revisions\/374"}],"wp:attachment":[{"href":"https:\/\/saburnet.ir\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}