<!-- RUBY-BACKUP · part 254 -->
    lavaTex = window._lavaTex;
      }catch(e){}
      var lavaTopMat = lavaTex ?
        new THREE.MeshStandardMaterial({map: lavaTex, roughness: 0.85, emissive: 0x331100, emissiveIntensity: 0.3}) :
        new THREE.MeshStandardMaterial({color: 0x222222, roughness: 0.9});
      var darkSideMat = new THREE.MeshStandardMaterial({color: 0x1a1a1a, roughness: 0.95});
      var darkDirtMat = new THREE.MeshStandardMaterial({color: 0x0d0d0d, roughness: 1.0});
      var lmats = [darkSideMat, darkSideMat, lavaTopMat, darkDirtMat, darkSideMat, darkSideMat];
      var lblock = new THREE.Mesh(new THREE.BoxGeometry(size, size, size), lmats);
      lblock.position.set(lx, ly + size/2, lz);
      lblock.userData.solid = true;
      lblock.userData.lavaBlock = true;
      scene.add(lblock);
      if(!window._solidBlocks) window._solidBlocks = [];
      window._solidBlocks.push(lblock);
      /* Rolling rocks — dark black and dark gray, ruby-sized, rolling block to block */
      if(!window._rollingRocks) window._rollingRocks = [];
      var rockGeoS = new THREE.DodecahedronGeometry(0.5, 0); /* ruby-sized */
      var blackMat = new THREE.MeshStandardMaterial({color: 0x111111, roughness: 0.7, flatShading: true});
      var grayMat = new THREE.MeshStandardMaterial({color: 0x444444, roughness: 0.8, flatShading: true});
      for(var ri = 0; ri < 5; ri++){
        var rmat = ri % 2 === 0 ? blackMat : grayMat;
        var rock = new THREE.Mesh(rockGeoS, rmat);
        var startX = lx + (Math.random()-0.5) * 4;
        var startZ = lz + (Math.random()-0.5) * 4;
        rock.position.set(startX, ly + size + 0.5, startZ);
        rock.userData.rolling = true;
        rock.userData.homeX = lx; rock.userData.homeZ = lz;
        rock.userData.homeY = ly + size + 0.5;
        rock.userData.phase = Math.random() * Math.PI * 2;
        rock.userData.speed = 0.5 + Math.random() * 0.5;
        scene.add(rock);
        window._rollingRocks.push(rock);
      }
      /* Animate the rolling */
      if(!window._rockRoller){
        window._rockRoller = true;
        setInterval(function(){
          if(!window._rollingRocks) return;
          var t = Date.now() / 1000;
          window._rollingRocks.forEach(function(r){
            if(!r.userData.rolling) return;
            var ph = r.userData.phase;
            var sp = r.userData.speed;
            /* Roll in a circle around the home block */
            var rx = r.userData.homeX + Math.cos(t * sp + ph) * 3;
            var rz = r.userData.homeZ + Math.sin(t * sp + ph) * 3;
            r.position.x = rx;
            r.position.z = rz;
            r.position.y = r.userData.homeY + Math.abs(Math.sin(t * sp * 2 + ph)) * 0.3;
            /* Tumble as it rolls */
            r.rotation.x += 0.05 * sp;
            r.rotation.z += 0.03 * sp;
          });
        }, 50);
      }
      if(typeof window.trackNewThing === 'function')
        window.trackNewThing('lava block', lx, ly + size/2, lz);
      if(typeof codeStatus === 'function') codeStatus('lava block raised — the land is rough now');
    }catch(e){ if(typeof codeStatus === 'function') codeStatus('lava failed: ' + e.message); }
    return;
  }
  if(tl==='grassblock'){
    /* Green grass block — solid like the brown, but grass */
    try{
      var gx = mePos.x, gz = mePos.z;
      var gy = fortifiedGroundY(gx, gz);
      var size = 6;
      /* Grass block: green top, dirt sides — like the earth itself */
      /* AI grass texture — seamless, no visible seams between blocks */
      var grassTex = null;
      try{
        if(!window._grassTex){
          var _gt = new THREE.TextureLoader().load('/ruby2/grass-top.png');
          _gt.wrapS = THREE.RepeatWrapping;
          _gt.wrapT = THREE.RepeatWrapping;
          _gt.repeat.set(1, 1);
          window._grassTex = _gt;
        }
        grassTex = window._grassTex;
      }catch(e){}
      var topMat = grassTex ?
        new THREE.MeshStandardMaterial({map: grassTex, roughness: 0.9}) :
        new THREE.MeshStandardMaterial({color: 0x4aaa4a, roughness: 0.9});
      var sideMat = new THREE.MeshStandardMaterial({color: 0x6b4a2a, roughness: 0.95});
      var dirtMat = new THREE.MeshStandardMaterial({color: 0x4a2e15, roughness: 1.0});
      var mats = [sideMat, sideMat, topMat, dirtMat, sideMat, sideMat];
      var block = new THREE.Mesh(new THREE.BoxGeometry(size, size, size), mats);
      /* Grass blades on top */
      var bladeGeo = new THREE.ConeGeometry(0.15, 0.8, 4);
      var bladeMat = new THREE.MeshStandardMaterial({color: 0x5bbb5b, roughness: 0.9});
      for(var bi = 0; bi < 12; bi++){
        var blade = new THREE.Mesh(bladeGeo, bladeMat);
        blade.position.set((Math.random()-0.5)*5, size/2 + 0.4, (Math.random()-0.5)*5);
        blade.rotation.z = (Math.random()-0.5) * 0.3;
        block.add(blade);
      }
      block.position.set(gx, gy + size/2, gz);
      block.userData.solid = true;
      block.userData.grassBlock = true;
      scene.ad