Sketch out tile game.
This commit is contained in:
parent
a87b4efaf0
commit
d07135b3c6
212
sketching/september_2026/tiles.md
Normal file
212
sketching/september_2026/tiles.md
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
# Deimos in a Game of Tiles
|
||||||
|
|
||||||
|
```deimos
|
||||||
|
pub int TileGameMod
|
||||||
|
mut fn init(s: mut TileGameState) -> Void
|
||||||
|
mut fn tick(s: mut TileGameState) -> Void
|
||||||
|
end
|
||||||
|
|
||||||
|
pub extern class TileGameState
|
||||||
|
pub extern fn tiles() -> List<Tile>
|
||||||
|
|
||||||
|
pub extern mut fn tilesMut() -> mut List<Title>
|
||||||
|
|
||||||
|
pub extern fn player() -> Player
|
||||||
|
end
|
||||||
|
|
||||||
|
pub int Tile
|
||||||
|
fn x() -> Size
|
||||||
|
fn y() -> Size
|
||||||
|
fn walkingSpeed() -> Speed
|
||||||
|
fn runningSpeed() -> Speed
|
||||||
|
fn draw(s: TileGameState) -> TileDraw
|
||||||
|
end
|
||||||
|
|
||||||
|
pub record Color(red: Float, green: Float, blue: Float) end
|
||||||
|
|
||||||
|
pub val-class Brightness
|
||||||
|
brightness: Double
|
||||||
|
|
||||||
|
pub ctor(brightness: Double)
|
||||||
|
if brightness >= 0 && brightness <= 1 then
|
||||||
|
self.brightness = brightness
|
||||||
|
else
|
||||||
|
throw IllegalArgumentException("Cannot have a brightness outside of 0.0-1.0 range; given ${brightness}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
pub record TileDraw(color: Color, brightness: Brightness) end
|
||||||
|
|
||||||
|
pub record Speed(speed: Double) end
|
||||||
|
|
||||||
|
pub extern class Player
|
||||||
|
pub extern fn isRunning() -> Boolean
|
||||||
|
end
|
||||||
|
|
||||||
|
pub class GrassTile(x: Size, y: Size) : Tile
|
||||||
|
pub enum Season
|
||||||
|
Green, Brown
|
||||||
|
end
|
||||||
|
|
||||||
|
mut season: Season
|
||||||
|
|
||||||
|
pub mut fn flipSeason() -> Void
|
||||||
|
match self.season
|
||||||
|
Season::Green => self.season = Season::Brown,
|
||||||
|
Season::Brown => self.season = Season::Green
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
pub fn x() -> Size = self.size
|
||||||
|
|
||||||
|
pub fn y() -> Size = self.size
|
||||||
|
|
||||||
|
pub fn walkingSpeed() -> Speed = Speed(2.5)
|
||||||
|
|
||||||
|
pub fn runningSpeed() -> Speed = Speed(4.0)
|
||||||
|
|
||||||
|
fn getColor() -> Color
|
||||||
|
if self.season == Season::Green
|
||||||
|
Color(0.0F, 1.0F, 0.0F)
|
||||||
|
else
|
||||||
|
Color(0.6F, 0.3F, 0.0F)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
pub fn draw(s: TileGameState) -> TileDraw
|
||||||
|
let color = self.getColor()
|
||||||
|
if s.player().isRunning() then
|
||||||
|
TileDraw(color, Brightness(0.9))
|
||||||
|
else
|
||||||
|
TileDraw(color, Brightness(0.7))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
pub class CoreMod : TileGameMod
|
||||||
|
mut tickCount = 0
|
||||||
|
|
||||||
|
pub mut fn init(s: mut TileGameState) -> Void
|
||||||
|
for x in 0..10 do
|
||||||
|
for y in 0..10 do
|
||||||
|
s.tilesMut() << GrassTile(x, y)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
pub mut fn tick(s: mut TileGameState) -> Void
|
||||||
|
self.tickCount++
|
||||||
|
if tickCount == 16 * 10 then
|
||||||
|
self.tickCount = 0
|
||||||
|
let randomX = std::num::randomSize(0, 10)
|
||||||
|
let randomY = std::num::randomSize(0, 10)
|
||||||
|
let tileNumber = randomX * 10 + randomY
|
||||||
|
let tile = s.tilesMut().getMut(tileNumber)
|
||||||
|
if tile is GrassTile then
|
||||||
|
tile.flipSeason()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
```rust
|
||||||
|
struct TileGameState {
|
||||||
|
tiles: Gc<Object>,
|
||||||
|
player: Gc<Player>
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Player {
|
||||||
|
running: bool,
|
||||||
|
x: f64,
|
||||||
|
y: f64
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Color {
|
||||||
|
r: f32,
|
||||||
|
g: f32,
|
||||||
|
b: f32
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Brightness(f64);
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut dvm_context = load_context_with_mods();
|
||||||
|
let mut dvm_state = DvmState::new();
|
||||||
|
|
||||||
|
dvm_context.add_platform_function("TileGameState::tiles", |args: &[Value]| {
|
||||||
|
let this: Gc<TileGameState> = args[0].unwrap_native_object().downcast::<TileGameState>();
|
||||||
|
Value::Object(this.tiles)
|
||||||
|
});
|
||||||
|
|
||||||
|
dvm_context.add_platform_function("TileGameState::player", |args: &[Value]| {
|
||||||
|
let this: Gc<TileGameState> = args[0].unwrap_native_object().downcast::<TileGameState>();
|
||||||
|
Value::Object(this.player)
|
||||||
|
});
|
||||||
|
|
||||||
|
dvm_context.add_platform_function("Player::isRunning", |args: &[Value]| {
|
||||||
|
let this: Gc<Player> = args[0].unwrap_native_object().downcast::<Player>();
|
||||||
|
if this.running && is_in_bounds(this) {
|
||||||
|
Value::Boolean(true)
|
||||||
|
} else {
|
||||||
|
Value::Boolean(false)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let core_mod: Gc<Object> = construct_object(&mut dvm_state, &dvm_context, "CoreMod");
|
||||||
|
let tile_game_state: GcAny = construct_native_object(&mut dvm_state, &dvm_context, "TileGameState", TileGameState {
|
||||||
|
tiles: construct_object(&mut dvm_state, &dvm_context, "std::collections::List"),
|
||||||
|
player: construct_native_object(&mut dvm_state, &dvm_context, "Player", Player {
|
||||||
|
running: false,
|
||||||
|
}).downcast::<Player>()
|
||||||
|
});
|
||||||
|
|
||||||
|
call(&mut dvm_state, &dvm_context, "TileGameMod::init", &[
|
||||||
|
Value::Object(core_mod),
|
||||||
|
Value::NativeObject(tile_game_state),
|
||||||
|
]);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if tick() {
|
||||||
|
call(&mut dvm_state, &dvm_context, "TileGameMod::tick", &[
|
||||||
|
Value::Object(core_mod),
|
||||||
|
Value::NativeObject(tile_game_state)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
if frame() {
|
||||||
|
let tile_game_state: TileGameState = tile_game_state.downcast::<TileGameState>();
|
||||||
|
let tiles: Array<Gc<Object>> = call(
|
||||||
|
&mut dvm_state,
|
||||||
|
&dvm_context,
|
||||||
|
"std::collections::List::toArray",
|
||||||
|
&[Value::Object(tile_game_state)]
|
||||||
|
).unwrap_array();
|
||||||
|
|
||||||
|
for tile in tiles {
|
||||||
|
let x: usize = call(&mut dvm_state, &dvm_context, "Tile::x", &[
|
||||||
|
Value::Object(tile)
|
||||||
|
]).unwrap_size();
|
||||||
|
let y: usize = call(&mut dvm_state, &dvm_context, "Tile::y", &[
|
||||||
|
Value::Object(tile)
|
||||||
|
]).unwrap_size();
|
||||||
|
|
||||||
|
let tile_draw: Gc<Object> = call(&mut dvm_state, &dvm_context, "Tile::draw", &[
|
||||||
|
Value::Object(tile),
|
||||||
|
Value::NativeObject(tile_game_state)
|
||||||
|
]).unwrap_object();
|
||||||
|
let r: f32 = read_field_path(&tile_draw, "color.r").unwrap_float();
|
||||||
|
let g: f32 = read_field_path(&tile_draw, "color.g").unwrap_float();
|
||||||
|
let b: f32 = read_field_path(&tile_draw, "color.b").unwrap_float();
|
||||||
|
let color = Color {
|
||||||
|
r,
|
||||||
|
g,
|
||||||
|
b
|
||||||
|
};
|
||||||
|
let brightness = Brightness(read_field_path(&tile_draw, "brightness.brightness").unwrap_double());
|
||||||
|
draw_tile(x, y, color, brightness);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
Loading…
Reference in New Issue
Block a user