<!DOCTYPE html>
<!-- Created with https://packager.turbowarp.org/ -->
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <!-- We only include this to explicitly loosen the CSP of various packager environments. It does not provide any security. -->
  <meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: blob:">
  <title>Worst Case Scenario</title>
  <style>
    body {
      color: #ffffff;
      font-family: sans-serif;
      overflow: hidden;
      margin: 0;
      padding: 0;
    }
    :root, body.is-fullscreen {
      background-color: #000000;
    }
    [hidden] {
      display: none !important;
    }
    h1 {
      font-weight: normal;
    }
    a {
      color: inherit;
      text-decoration: underline;
      cursor: pointer;
    }

    #app, #loading, #error, #launch {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
    }
    .screen {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      text-align: center;
      cursor: default;
      user-select: none;
      -webkit-user-select: none;
      background-color: #000000;
    }
    #launch {
      background-color: rgba(0, 0, 0, 0.7);
      cursor: pointer;
    }
    .green-flag {
      width: 80px;
      height: 80px;
      padding: 16px;
      border-radius: 100%;
      background: rgba(255, 255, 255, 0.75);
      border: 3px solid hsla(0, 100%, 100%, 1);
      display: flex;
      justify-content: center;
      align-items: center;
      box-sizing: border-box;
    }
    #loading {
      
    }
    .progress-bar-outer {
      border: 1px solid currentColor;
      height: 10px;
      width: 200px;
      max-width: 200px;
    }
    .progress-bar-inner {
      height: 100%;
      width: 0;
      background-color: currentColor;
    }
    .loading-text, noscript {
      font-weight: normal;
      font-size: 36px;
      margin: 0 0 16px;
    }
    .loading-image {
      margin: 0 0 16px;
    }
    #error-message, #error-stack {
      font-family: monospace;
      max-width: 600px;
      white-space: pre-wrap;
      user-select: text;
      -webkit-user-select: text;
    }
    #error-stack {
      text-align: left;
      max-height: 200px;
      overflow: auto;
    }
    .control-button {
      width: 2rem;
      height: 2rem;
      padding: 0.375rem;
      margin-top: 0.5rem;
      margin-bottom: 0.5rem;
      user-select: none;
      -webkit-user-select: none;
      cursor: pointer;
      border: 0;
      border-radius: 4px;
    }
    .control-button-highlight:hover {
      background: #ff4c4c26;
    }
    .control-button-highlight.active {
      background: #ff4c4c59;
    }
    .fullscreen-button {
      background: white;
    }
    .standalone-fullscreen-button {
      position: absolute;
      top: 0;
      right: 0;
      background-color: rgba(0, 0, 0, 0.5);
      border-radius: 0 0 0 4px;
      padding: 4px;
      cursor: pointer;
    }
    .sc-canvas {
      cursor: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAw0lEQVRYhe3WwQ3CMAyF4QT1zgiMABt0FEZhhLIBbEI3YARG6Ag/hyoClZKmxokP5B2jyP4OiWXnamomATpgAI5WgPd01gCAizUA4A5sLQHlEBEAwAPYWwJg/CH5EAmAgGgtASH6s2IlQB8hAIDmrBAC9BA/AEAwKzYq6lcOzrl+DUIbEBDX1Mt+egCgofDef9SeSyOo3SfcOQvqjll4ZPmXlEjzU/bmEUC5pUTjb2sCBmBXrPkMIO/y8QVwK/roav4+T/4PlJjbQinnAAAAAElFTkSuQmCC) 16 16, auto;
    }
    .sc-monitor-root[data-opcode^="data_"] .sc-monitor-value-color {
      background-color: #ff8c1a;
    }
    .sc-monitor-row-value-outer {
      background-color: #fc662c;
    }
    .sc-monitor-row-value-editing .sc-monitor-row-value-outer {
      background-color: #e25b27;
    }
    
  </style>
  <meta name="theme-color" content="#000000">
  <link rel="icon" href="data:image/png;base64,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">
</head>
<body>
  <div id="app"></div>

  <div id="launch" class="screen" hidden title="Click to start">
    <div class="green-flag">
      <svg viewBox="0 0 16.63 17.5" width="42" height="44">
        <defs><style>.cls-1,.cls-2{fill:#4cbf56;stroke:#45993d;stroke-linecap:round;stroke-linejoin:round;}.cls-2{stroke-width:1.5px;}</style></defs>
        <path class="cls-1" d="M.75,2A6.44,6.44,0,0,1,8.44,2h0a6.44,6.44,0,0,0,7.69,0V12.4a6.44,6.44,0,0,1-7.69,0h0a6.44,6.44,0,0,0-7.69,0"/>
        <line class="cls-2" x1="0.75" y1="16.75" x2="0.75" y2="0.75"/>
      </svg>
    </div>
  </div>

  <div id="loading" class="screen">
    <noscript>Enable JavaScript</noscript>
    
    <div class="loading-image"><img src="data:image/png;base64,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"></div>
    <div class="progress-bar-outer"><div class="progress-bar-inner" id="loading-inner"></div></div>
  </div>

  <div id="error" class="screen" hidden>
    <h1>Error</h1>
    <details>
      <summary id="error-message"></summary>
      <p id="error-stack"></p>
    </details>
  </div>

  <script src="script.js"></script>
  <script>
    const appElement = document.getElementById('app');
    const launchScreen = document.getElementById('launch');
    const loadingScreen = document.getElementById('loading');
    const loadingInner = document.getElementById('loading-inner');
    const errorScreen = document.getElementById('error');
    const errorScreenMessage = document.getElementById('error-message');
    const errorScreenStack = document.getElementById('error-stack');

    const handleError = (error) => {
      console.error(error);
      if (!errorScreen.hidden) return;
      errorScreen.hidden = false;
      errorScreenMessage.textContent = '' + error;
      let debug = error && error.stack || 'no stack';
      debug += '\nUser agent: ' + navigator.userAgent;
      errorScreenStack.textContent = debug;
    };
    const setProgress = (progress) => {
      if (loadingInner) loadingInner.style.width = progress * 100 + '%';
    };
    const interpolate = (a, b, t) => a + t * (b - a);

    try {
      setProgress(0.1);

      const scaffolding = new Scaffolding.Scaffolding();
      scaffolding.width = 480;
      scaffolding.height = 360;
      scaffolding.resizeMode = "preserve-ratio";
      scaffolding.editableLists = false;
      scaffolding.usePackagedRuntime = true;
      scaffolding.setup();
      scaffolding.appendTo(appElement);

      const vm = scaffolding.vm;
      window.scaffolding = scaffolding;
      window.vm = scaffolding.vm;
      window.Scratch = {
        vm,
        renderer: vm.renderer,
        audioEngine: vm.runtime.audioEngine,
        bitmapAdapter: vm.runtime.v2BitmapAdapter,
        videoProvider: vm.runtime.ioDevices.video.provider
      };

      scaffolding.setUsername("player####".replace(/#/g, () => Math.floor(Math.random() * 10)));
      scaffolding.setAccentColor("#ff4c4c");

      try {
        scaffolding.addCloudProvider(new Scaffolding.Cloud.WebSocketProvider(["wss://clouddata.turbowarp.org","wss://clouddata.turbowarp.xyz"], "p4-@Worst Case Scenario.sb3"));
      } catch (error) {
        console.error(error);
      }

      vm.setTurboMode(false);
      if (vm.setInterpolation) vm.setInterpolation(true);
      if (vm.setFramerate) vm.setFramerate(30);
      if (vm.renderer.setUseHighQualityRender) vm.renderer.setUseHighQualityRender(true);
      if (vm.setRuntimeOptions) vm.setRuntimeOptions({
        fencing: true,
        miscLimits: false,
        maxClones: 9999999999,
      });
      if (vm.setCompilerOptions) vm.setCompilerOptions({
        enabled: true,
        warpTimer: false
      });
      if (vm.renderer.setMaxTextureDimension) vm.renderer.setMaxTextureDimension(2048);

      // enforcePrivacy threat model only makes sense in the editor
      if (vm.runtime.setEnforcePrivacy) vm.runtime.setEnforcePrivacy(false);

      if (typeof ScaffoldingAddons !== 'undefined') {
        ScaffoldingAddons.run(scaffolding, {"gamepad":true,"pointerlock":false,"specialCloudBehaviors":false,"unsafeCloudBehaviors":false,"pause":false});
      }

      scaffolding.setExtensionSecurityManager({
        getSandboxMode: () => 'unsandboxed',
        canLoadExtensionFromProject: () => true
      });
      for (const extension of []) {
        vm.extensionManager.loadExtensionURL(extension);
      }

      vm.runtime.on('PROJECT_RUN_STOP', () => {
        if (!vm.isPaused || !vm.isPaused()) {
          window.close();
        }
      });

    } catch (e) {
      handleError(e);
    }
  </script>
  
  
    <script>
      const getProjectData = (function() {
        const storage = scaffolding.storage;
        storage.onprogress = (total, loaded) => {
          setProgress(interpolate(0.2, 0.98, loaded / total));
        };
        
        storage.addWebStore(
          [
            storage.AssetType.ImageVector,
            storage.AssetType.ImageBitmap,
            storage.AssetType.Sound,
            storage.AssetType.Font
          ].filter(i => i),
          (asset) => new URL('./assets/' + asset.assetId + '.' + asset.dataFormat, location).href
        );
        return () => new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.onload = () => {
          resolve(xhr.response);
        };
        xhr.onerror = () => {
          if (location.protocol === 'file:') {
            reject(new Error('Zip environment must be used from a website, not from a file URL.'));
          } else {
            reject(new Error('Request to load project data failed.'));
          }
        };
        xhr.onprogress = (e) => {
          if (e.lengthComputable) {
            setProgress(interpolate(0.1, 0.2, e.loaded / e.total));
          }
        };
        xhr.responseType = 'arraybuffer';
        xhr.open('GET', "./assets/project.json");
        xhr.send();
      });
      })();
    </script>
  <script>
    const run = async () => {
      const projectData = await getProjectData();
      await scaffolding.loadProject(projectData);
      setProgress(1);
      loadingScreen.hidden = true;
      if (true) {
        scaffolding.start();
      } else {
        launchScreen.hidden = false;
        launchScreen.addEventListener('click', () => {
          launchScreen.hidden = true;
          scaffolding.start();
        });
        launchScreen.focus();
      }
    };
    run().catch(handleError);
  </script>
</body>
</html>
