// Wanderhome — the scenery counterpart to racing.splash. // // racing.splash is the model answer for GAMEPLAY: the engine drives the cars // and counts the laps, so the file is layout and rules. This one is the model // answer for a PLACE: the engine lays the streets, picks the artwork and makes // it solid, so the file is intent. // // Every prop here is a real model from the stock library. Nothing is a // coloured box, and no model id is written by hand — they all come back from // game.find_model, which returns DIFFERENT models rather than one repeated. let SEED = 11 let ROADS = "kenney/city-kit-roads" let HOUSES = "kenney/city-kit-suburban" game.sky({}) game.sun({time_of_day: 8.0}) // ---- the town: streets with buildings fronting them -------------------- // Junction types are never named here — a crossing produces a crossroad and a // tee produces a T, purely from how the grid connects. let town = game.town({ roads_kit: ROADS, buildings_kit: HOUSES, extent: 18, block: 6, density: 0.7, seed: SEED, }) game.log("town laid") // ---- a wood around it -------------------------------------------------- // Four DIFFERENT conifers, not one conifer four times: `count` is what stops // a wood looking stamped. let trees = game.find_model("pine tree", {count: 4, seed: SEED}) let rocks = game.find_model("rock stone", {count: 3, spread: "variants", seed: SEED}) for i in 0..40 { let a = i * 0.157 let r = 46.0 + (i % 7) * 2.5 game.model(trees[i % 4], { pos: vec3(cos(a) * r, 0.0, sin(a) * r), yaw: a * 2.0, }) } for i in 0..9 { let a = i * 0.7 game.model(rocks[i % 3], { pos: vec3(cos(a) * 38.0, 0.0, sin(a) * 38.0), yaw: a, }) } // ---- somewhere to go --------------------------------------------------- // The same generator gives a crypt, a cavern or a space station depending // only on the kit; every room is reachable by construction. let crypt = game.dungeon({ kit: "kenney/modular-dungeon-kit", extent: 20, min_room: 5, seed: SEED, }) game.log("crypt laid") // ---- someone to be ----------------------------------------------------- let hero = game.character({ pos: vec3(0, 2, 0), size: vec3(0.6, 1.7, 0.6), color: #x4f8fe8, speed: 6.0, }) game.camera({third_person: hero, height: 1.6, boom: 9, pitch: -0.3}) game.text("hint", "Arrows to walk — find the crypt", {anchor: "top"}) game.on_tick(|dt, input| { game.drive(hero, {move_x: input.move_x, move_z: input.move_z, jump: input.jump}) })