<?xml version='1.0'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
	<title><![CDATA[Catatan Harian: Membangun jembatan dengan cost dan bahan yang digunakan}]]></title>
	<link>https://sharka.site/3blog/blog/view/101/membangun-jembatan-dengan-cost-dan-bahan-yang-digunakan</link>
	<atom:link href="https://sharka.site/3blog/blog/view/101/membangun-jembatan-dengan-cost-dan-bahan-yang-digunakan" rel="self" type="application/rss+xml" />
	<description><![CDATA[}]]></description>
		<item>
	<guid isPermaLink="true">https://sharka.site/3blog/blog/view/101/membangun-jembatan-dengan-cost-dan-bahan-yang-digunakan</guid>
	<pubDate>Thu, 13 Nov 2025 17:44:38 +0800</pubDate>
	<link>https://sharka.site/3blog/blog/view/101/membangun-jembatan-dengan-cost-dan-bahan-yang-digunakan</link>
	<title><![CDATA[Membangun jembatan dengan cost dan bahan yang digunakan]]></title>
	<description><![CDATA[<p>&lt;!doctype html&gt;<br />&lt;html lang="id" class="h-full"&gt;<br />&lt;head&gt;<br />&nbsp;&lt;meta charset="UTF-8"&gt;<br />&nbsp;&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;<br />&nbsp;&lt;title&gt;Simulasi Membangun Jembatan&lt;/title&gt;<br />&nbsp;&lt;script src="/_sdk/element_sdk.js"&gt;&lt;/script&gt;<br />&nbsp;&lt;script src="https://cdn.tailwindcss.com"&gt;&lt;/script&gt;<br />&nbsp;&lt;style&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;body {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;box-sizing: border-box;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.bridge-canvas {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: linear-gradient(to bottom, #87CEEB 0%, #87CEEB 60%, #8FBC8F 60%, #228B22 100%);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: relative;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;overflow: hidden;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.water {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: absolute;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bottom: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;left: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;right: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;height: 40%;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: linear-gradient(to bottom, #4682B4, #1E90FF);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: wave 3s ease-in-out infinite;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes wave {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0%, 100% { transform: translateY(0px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;50% { transform: translateY(-5px); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.bridge-part {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: absolute;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cursor: pointer;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transition: all 0.3s ease;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.bridge-part:hover {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transform: scale(1.05);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;filter: brightness(1.1);<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.material-card {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transition: all 0.3s ease;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cursor: pointer;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.material-card:hover {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transform: translateY(-2px);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;box-shadow: 0 8px 25px rgba(0,0,0,0.15);<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.material-card.selected {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;border: 3px solid #3B82F6;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: #EBF8FF;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.test-animation {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: testBridge 2s ease-in-out;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes testBridge {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0% { transform: translateY(0); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;25% { transform: translateY(-10px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;50% { transform: translateY(5px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;75% { transform: translateY(-5px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;100% { transform: translateY(0); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.success-glow {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: successGlow 1s ease-in-out;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes successGlow {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0%, 100% { box-shadow: 0 0 0 rgba(34, 197, 94, 0.4); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;50% { box-shadow: 0 0 30px rgba(34, 197, 94, 0.8); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.failure-shake {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: failureShake 0.5s ease-in-out;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes failureShake {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0%, 100% { transform: translateX(0); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;25% { transform: translateX(-10px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;75% { transform: translateX(10px); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.collapse-animation {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: bridgeCollapse 2s ease-in forwards;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes bridgeCollapse {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0% { transform: translateY(0) rotate(0deg); opacity: 1; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;30% { transform: translateY(10px) rotate(-2deg); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;60% { transform: translateY(30px) rotate(5deg); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;100% { transform: translateY(100px) rotate(-10deg); opacity: 0.3; }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.crack-effect {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: relative;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.crack-effect::after {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;content: '';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: absolute;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;top: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;left: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;right: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bottom: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: linear-gradient(45deg, transparent 40%, #ff0000 50%, transparent 60%);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;opacity: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: crackAppear 1s ease-in-out forwards;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes crackAppear {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0% { opacity: 0; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;100% { opacity: 0.8; }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp;&lt;/style&gt;<br />&nbsp;&lt;style&gt;@view-transition { navigation: auto; }&lt;/style&gt;<br />&nbsp;&lt;script src="/_sdk/data_sdk.js" type="text/javascript"&gt;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body class="h-full bg-gradient-to-br from-blue-50 to-green-50 font-sans"&gt;<br />&nbsp;&lt;div class="h-full flex flex-col"&gt;&lt;!-- Header --&gt;<br />&nbsp; &lt;header class="bg-white shadow-lg p-4"&gt;<br />&nbsp; &nbsp;&lt;div class="max-w-6xl mx-auto flex justify-between items-center"&gt;<br />&nbsp; &nbsp; &lt;h1 id="gameTitle" class="text-3xl font-bold text-blue-800"&gt;🌉 Simulasi Membangun Jembatan&lt;/h1&gt;<br />&nbsp; &nbsp; &lt;div class="flex items-center space-x-6"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="text-right"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p id="budgetLabel" class="text-sm text-gray-600"&gt;Anggaran Tersedia&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p id="budget" class="text-2xl font-bold text-green-600"&gt;Rp 500.000&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="text-right"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p class="text-sm text-gray-600"&gt;Biaya Terpakai&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p id="usedBudget" class="text-2xl font-bold text-red-600"&gt;Rp 0&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &lt;/header&gt;<br />&nbsp; &lt;main class="flex-1 flex"&gt;&lt;!-- Material Selection Panel --&gt;<br />&nbsp; &nbsp;&lt;aside class="w-80 bg-white shadow-lg p-6 overflow-y-auto"&gt;<br />&nbsp; &nbsp; &lt;h2 id="materialsHeader" class="text-xl font-bold text-gray-800 mb-4"&gt;🔧 Pilih Material&lt;/h2&gt;<br />&nbsp; &nbsp; &lt;div class="space-y-4"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-yellow-50 border-2 border-yellow-200 rounded-lg p-4" data-material="kayu"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-yellow-800"&gt;🪵 Kayu&lt;/h3&gt;&lt;span class="text-yellow-700 font-bold"&gt;Rp 50.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-yellow-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-gray-50 border-2 border-gray-200 rounded-lg p-4" data-material="beton"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-gray-800"&gt;🧱 Beton&lt;/h3&gt;&lt;span class="text-gray-700 font-bold"&gt;Rp 100.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-gray-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-blue-50 border-2 border-blue-200 rounded-lg p-4" data-material="baja"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-blue-800"&gt;🔩 Baja&lt;/h3&gt;&lt;span class="text-blue-700 font-bold"&gt;Rp 150.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-blue-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-green-50 border-2 border-green-200 rounded-lg p-4" data-material="bambu"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-green-800"&gt;🎋 Bambu&lt;/h3&gt;&lt;span class="text-green-700 font-bold"&gt;Rp 30.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-green-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &lt;div class="mt-6 space-y-3"&gt;&lt;button id="buildButton" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-4 rounded-lg transition-colors"&gt; 🔨 Bangun Jembatan &lt;/button&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="bg-orange-50 border border-orange-200 rounded-lg p-4 mb-3"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;h3 class="font-bold text-orange-800 mb-2"&gt;⚖️ Beban Uji&lt;/h3&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center space-x-2 mb-2"&gt;&lt;label class="text-sm text-orange-700 font-medium"&gt;Berat:&lt;/label&gt; &lt;input type="range" id="loadSlider" min="1" max="10" value="3" class="flex-1"&gt; &lt;span id="loadValue" class="text-orange-800 font-bold min-w-[60px]"&gt;3 ton&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-orange-600"&gt;&lt;span id="loadDescription"&gt;Beban Ringan - Mobil kecil&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;button id="testButton" class="w-full bg-green-600 hover:bg-green-700 text-white font-bold py-3 px-4 rounded-lg transition-colors" disabled&gt; 🚛 Uji Jembatan &lt;/button&gt; &lt;button id="resetButton" class="w-full bg-gray-600 hover:bg-gray-700 text-white font-bold py-3 px-4 rounded-lg transition-colors"&gt; 🔄 Reset &lt;/button&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &lt;div id="infoPanel" class="mt-6 p-4 bg-blue-50 border border-blue-200 rounded-lg"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-blue-800 mb-2"&gt;💡 Tips:&lt;/h3&gt;<br />&nbsp; &nbsp; &nbsp;&lt;p class="text-sm text-blue-700"&gt;Pilih material untuk setiap bagian jembatan. Pertimbangkan kekuatan, biaya, dan kondisi lingkungan!&lt;/p&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp;&lt;/aside&gt;&lt;!-- Bridge Building Area --&gt;<br />&nbsp; &nbsp;&lt;section class="flex-1 p-6"&gt;<br />&nbsp; &nbsp; &lt;div class="bridge-canvas h-full rounded-lg relative border-4 border-blue-300"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="water"&gt;&lt;/div&gt;&lt;!-- Bridge Foundation Left --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="foundation-left" class="bridge-part w-16 h-32 bg-gray-400 border-2 border-gray-600 rounded-t-lg" style="bottom: 40%; left: 10%; cursor: pointer;" data-part="foundation-left"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center mt-1 font-bold"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Pondasi Kiri<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Bridge Foundation Right --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="foundation-right" class="bridge-part w-16 h-32 bg-gray-400 border-2 border-gray-600 rounded-t-lg" style="bottom: 40%; right: 10%; cursor: pointer;" data-part="foundation-right"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center mt-1 font-bold"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Pondasi Kanan<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Bridge Deck --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="deck" class="bridge-part h-8 bg-gray-400 border-2 border-gray-600 rounded" style="bottom: 45%; left: 18%; right: 18%; cursor: pointer;" data-part="deck"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center mt-1 font-bold"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Lantai Jembatan<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Bridge Support Cables --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="cables" class="bridge-part" style="bottom: 53%; left: 35%; right: 35%; height: 30px; cursor: pointer;" data-part="cables"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;svg width="100%" height="100%" class="absolute"&gt;&lt;line x1="0%" y1="100%" x2="50%" y2="0%" stroke="#666" stroke-width="3" /&gt; &lt;line x1="100%" y1="100%" x2="50%" y2="0%" stroke="#666" stroke-width="3" /&gt; &lt;line x1="25%" y1="75%" x2="75%" y2="75%" stroke="#666" stroke-width="2" /&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/svg&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center font-bold" style="margin-top: 25px;"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Kabel Penyangga<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Test Truck --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="testTruck" class="absolute hidden" style="bottom: 53%; left: -100px; transition: left 3s ease-in-out;"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-4xl"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;🚛<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Results Display --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="resultDisplay" class="absolute top-4 left-4 right-4 text-center hidden"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div id="resultMessage" class="inline-block px-6 py-3 rounded-lg font-bold text-lg"&gt;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp;&lt;/section&gt;<br />&nbsp; &lt;/main&gt;<br />&nbsp;&lt;/div&gt;<br />&nbsp;&lt;script&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;// Configuration object for editable features<br />&nbsp; &nbsp; &nbsp; &nbsp;const defaultConfig = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;game_title: "🌉 Simulasi Membangun Jembatan",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;budget_label: "Anggaran Tersedia",&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;materials_header: "🔧 Pilih Material",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;build_button: "🔨 Bangun Jembatan",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;test_button: "🚛 Uji Jembatan"<br />&nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Game state<br />&nbsp; &nbsp; &nbsp; &nbsp;let gameState = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;budget: 500000,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;usedBudget: 0,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selectedMaterial: null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bridgeParts: {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-left': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-right': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'deck': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'cables': null<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;},<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isBuilt: false,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testLoad: 3,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isCollapsed: false<br />&nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Material properties<br />&nbsp; &nbsp; &nbsp; &nbsp;const materials = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kayu: { name: 'Kayu', cost: 50000, strength: 3, flexibility: 4, waterResistance: 2, color: '#D2691E', emoji: '🪵' },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;beton: { name: 'Beton', cost: 100000, strength: 5, flexibility: 2, waterResistance: 5, color: '#696969', emoji: '🧱' },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;baja: { name: 'Baja', cost: 150000, strength: 5, flexibility: 5, waterResistance: 3, color: '#708090', emoji: '🔩' },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bambu: { name: 'Bambu', cost: 30000, strength: 2, flexibility: 5, waterResistance: 2, color: '#228B22', emoji: '🎋' }<br />&nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Initialize the game<br />&nbsp; &nbsp; &nbsp; &nbsp;function initGame() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateDisplay();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setupEventListeners();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateLoadValue(); // Initialize load slider display<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function updateDisplay() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('budget').textContent = `Rp ${gameState.budget.toLocaleString('id-ID')}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('usedBudget').textContent = `Rp ${gameState.usedBudget.toLocaleString('id-ID')}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update test button state<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const testButton = document.getElementById('testButton');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const allPartsBuilt = Object.values(gameState.bridgeParts).every(part =&gt; part !== null);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testButton.disabled = !allPartsBuilt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testButton.classList.toggle('opacity-50', !allPartsBuilt);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function setupEventListeners() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Material selection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.material-card').forEach(card =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;card.addEventListener('click', () =&gt; selectMaterial(card.dataset.material));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Bridge part selection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.addEventListener('click', () =&gt; buildPart(part.dataset.part));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Load slider<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('loadSlider').addEventListener('input', updateLoadValue);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Control buttons<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('buildButton').addEventListener('click', buildBridge);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').addEventListener('click', testBridge);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('resetButton').addEventListener('click', resetGame);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function updateLoadValue() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const slider = document.getElementById('loadSlider');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const loadValue = document.getElementById('loadValue');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const loadDescription = document.getElementById('loadDescription');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.testLoad = parseInt(slider.value);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loadValue.textContent = `${gameState.testLoad} ton`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const descriptions = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: "Beban Sangat Ringan - Sepeda motor",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2: "Beban Ringan - Mobil kecil",&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3: "Beban Sedang - Mobil sedan",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4: "Beban Menengah - SUV",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5: "Beban Berat - Truk kecil",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6: "Beban Sangat Berat - Truk sedang",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;7: "Beban Ekstrem - Truk besar",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8: "Beban Berbahaya - Truk trailer",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;9: "Beban Kritis - Truk kontainer",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10: "Beban Maksimal - Truk gandeng"<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loadDescription.textContent = descriptions[gameState.testLoad];<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function selectMaterial(materialType) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.selectedMaterial = materialType;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update UI<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.material-card').forEach(card =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;card.classList.remove('selected');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelector(`[data-material="${materialType}"]`).classList.add('selected');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel(`Material ${materials[materialType].name} dipilih! Klik bagian jembatan untuk membangunnya.`);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function buildPart(partName) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!gameState.selectedMaterial) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Pilih material terlebih dahulu!', 'warning');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const material = materials[gameState.selectedMaterial];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const cost = material.cost;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (gameState.usedBudget + cost &gt; gameState.budget) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Anggaran tidak cukup! Pilih material yang lebih murah.', 'error');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update game state<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.bridgeParts[partName] = gameState.selectedMaterial;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.usedBudget += cost;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update visual<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const partElement = document.getElementById(partName);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;partElement.style.backgroundColor = material.color;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;partElement.style.borderColor = material.color;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Add material emoji<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const existingEmoji = partElement.querySelector('.material-emoji');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (existingEmoji) existingEmoji.remove();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const emojiSpan = document.createElement('span');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;emojiSpan.className = 'material-emoji absolute top-0 right-0 text-lg';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;emojiSpan.textContent = material.emoji;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;partElement.appendChild(emojiSpan);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateDisplay();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel(`${material.name} dipasang pada ${getPartDisplayName(partName)}! Biaya: Rp ${cost.toLocaleString('id-ID')}`);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function buildBridge() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const allPartsBuilt = Object.values(gameState.bridgeParts).every(part =&gt; part !== null);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!allPartsBuilt) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Lengkapi semua bagian jembatan terlebih dahulu!', 'warning');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.isBuilt = true;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Jembatan selesai dibangun! Sekarang Anda bisa mengujinya.', 'success');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Enable test button<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').disabled = false;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').classList.remove('opacity-50');<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function testBridge() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!gameState.isBuilt || gameState.isCollapsed) return;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Calculate bridge strength<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalStrength = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalFlexibility = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalWaterResistance = 0;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Object.values(gameState.bridgeParts).forEach(materialType =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const material = materials[materialType];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;totalStrength += material.strength;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;totalFlexibility += material.flexibility;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;totalWaterResistance += material.waterResistance;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const averageStrength = totalStrength / 4;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const averageFlexibility = totalFlexibility / 4;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const averageWaterResistance = totalWaterResistance / 4;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Calculate load capacity vs test load<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const bridgeCapacity = averageStrength * 2; // Each strength point = 2 ton capacity<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const loadStress = gameState.testLoad / bridgeCapacity;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Animate truck crossing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const truck = document.getElementById('testTruck');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.classList.remove('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.style.left = '-100px';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update truck size based on load<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const truckEmoji = truck.querySelector('div');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (gameState.testLoad &lt;= 3) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truckEmoji.textContent = '🚗';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else if (gameState.testLoad &lt;= 6) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truckEmoji.textContent = '🚛';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truckEmoji.textContent = '🚚';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.style.left = 'calc(100% + 50px)';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 100);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Add bridge animation based on load stress<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (loadStress &gt; 1.2) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Overloaded - show cracks first<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('crack-effect');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('test-animation');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Determine test result<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const success = loadStress &lt;= 1.0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const catastrophicFailure = loadStress &gt; 1.5;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (catastrophicFailure) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Bridge collapses<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.isCollapsed = true;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('test-animation', 'crack-effect');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('collapse-animation');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showTestResult(false, averageStrength, averageFlexibility, averageWaterResistance, true, loadStress);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showTestResult(success, averageStrength, averageFlexibility, averageWaterResistance, false, loadStress);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Reset animations<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('test-animation', 'crack-effect');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (success) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('success-glow');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('failure-shake');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.classList.add('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!gameState.isCollapsed) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('success-glow', 'failure-shake');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 2000);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 3000);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function showTestResult(success, strength, flexibility, waterResistance, collapsed, loadStress) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const resultDisplay = document.getElementById('resultDisplay');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const resultMessage = document.getElementById('resultMessage');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const capacity = strength * 2;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (collapsed) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.className = 'inline-block px-6 py-3 rounded-lg font-bold text-lg bg-red-100 text-red-800 border border-red-300';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.innerHTML = `<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;💥 JEMBATAN RUNTUH! 💥&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;span class="text-sm"&gt;Beban ${gameState.testLoad} ton terlalu berat untuk kapasitas ${capacity.toFixed(1)} ton!&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Stress: ${(loadStress * 100).toFixed(0)}% | Kekuatan: ${strength.toFixed(1)} | Fleksibilitas: ${flexibility.toFixed(1)}&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else if (success) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.className = 'inline-block px-6 py-3 rounded-lg font-bold text-lg bg-green-100 text-green-800 border border-green-300';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.innerHTML = `<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;🎉 JEMBATAN AMAN! 🎉&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;span class="text-sm"&gt;Beban ${gameState.testLoad} ton berhasil dilalui!&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Kapasitas: ${capacity.toFixed(1)} ton | Stress: ${(loadStress * 100).toFixed(0)}% | Kekuatan: ${strength.toFixed(1)}&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.className = 'inline-block px-6 py-3 rounded-lg font-bold text-lg bg-yellow-100 text-yellow-800 border border-yellow-300';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.innerHTML = `<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;⚠️ JEMBATAN RETAK! ⚠️&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;span class="text-sm"&gt;Beban ${gameState.testLoad} ton menyebabkan kerusakan!&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Kapasitas: ${capacity.toFixed(1)} ton | Stress: ${(loadStress * 100).toFixed(0)}% | Berbahaya!&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultDisplay.classList.remove('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultDisplay.classList.add('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 5000);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function resetGame() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;budget: 500000,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;usedBudget: 0,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selectedMaterial: null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bridgeParts: {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-left': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-right': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'deck': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'cables': null<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;},<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isBuilt: false,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testLoad: 3,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isCollapsed: false<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Reset visual elements<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.backgroundColor = '#9CA3AF';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.borderColor = '#6B7280';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.transform = '';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.opacity = '';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('collapse-animation', 'crack-effect', 'success-glow', 'failure-shake', 'test-animation');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const emoji = part.querySelector('.material-emoji');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (emoji) emoji.remove();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.material-card').forEach(card =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;card.classList.remove('selected');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Reset load slider<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('loadSlider').value = 3;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateLoadValue();</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateDisplay();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Game direset! Mulai membangun jembatan baru.');<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function updateInfoPanel(message, type = 'info') {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const infoPanel = document.getElementById('infoPanel');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const colors = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;info: 'bg-blue-50 border-blue-200 text-blue-700',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success: 'bg-green-50 border-green-200 text-green-700',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;warning: 'bg-yellow-50 border-yellow-200 text-yellow-700',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error: 'bg-red-50 border-red-200 text-red-700'<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;infoPanel.className = `mt-6 p-4 border rounded-lg ${colors[type]}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;infoPanel.innerHTML = `&lt;h3 class="font-bold mb-2"&gt;💡 Info:&lt;/h3&gt;&lt;p class="text-sm"&gt;${message}&lt;/p&gt;`;<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function getPartDisplayName(partName) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const names = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-left': 'Pondasi Kiri',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-right': 'Pondasi Kanan',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'deck': 'Lantai Jembatan',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'cables': 'Kabel Penyangga'<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return names[partName] || partName;<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Element SDK implementation<br />&nbsp; &nbsp; &nbsp; &nbsp;async function onConfigChange(config) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('gameTitle').textContent = config.game_title || defaultConfig.game_title;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('budgetLabel').textContent = config.budget_label || defaultConfig.budget_label;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('materialsHeader').textContent = config.materials_header || defaultConfig.materials_header;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('buildButton').innerHTML = `${config.build_button || defaultConfig.build_button}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').innerHTML = `${config.test_button || defaultConfig.test_button}`;<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function mapToCapabilities(config) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;recolorables: [],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;borderables: [],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fontEditable: undefined,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fontSizeable: undefined<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function mapToEditPanelValues(config) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new Map([<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["game_title", config.game_title || defaultConfig.game_title],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["budget_label", config.budget_label || defaultConfig.budget_label],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["materials_header", config.materials_header || defaultConfig.materials_header],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["build_button", config.build_button || defaultConfig.build_button],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["test_button", config.test_button || defaultConfig.test_button]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;]);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Initialize Element SDK<br />&nbsp; &nbsp; &nbsp; &nbsp;if (window.elementSdk) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;window.elementSdk.init({<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;defaultConfig,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;onConfigChange,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mapToCapabilities,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mapToEditPanelValues<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Start the game<br />&nbsp; &nbsp; &nbsp; &nbsp;initGame();<br />&nbsp; &nbsp;&lt;/script&gt;<br />&lt;script&gt;(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'99dd500fa600229b',t:'MTc2MzAyNjg4MC4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;<br />&lt;/html&gt;</p>]]></description>
	<dc:creator>Muh.Taqiuddin.S</dc:creator>		</item>
</channel>
</rss>
