Browse Source

Add ECS skeleton

entity-components
Garrit Franke 3 years ago
parent
commit
3ab16b6b36
  1. 259
      Cargo.lock
  2. 4
      Cargo.toml
  3. 22
      src/components/mod.rs
  4. 2
      src/entities/mod.rs
  5. 2
      src/inventory.rs
  6. 41
      src/main.rs
  7. 11
      src/map.rs
  8. 2
      src/traits.rs

259
Cargo.lock generated

@ -12,6 +12,12 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]]
name = "ahash"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
[[package]]
name = "aho-corasick"
version = "0.7.15"
@ -56,6 +62,18 @@ dependencies = [
"num-traits",
]
[[package]]
name = "arrayvec"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]]
name = "atom"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9ff149ed9780025acfdb36862d35b28856bb693ceb451259a7164442f22fdc3"
[[package]]
name = "autocfg"
version = "1.0.1"
@ -272,6 +290,12 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "const_fn"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6"
[[package]]
name = "core-foundation"
version = "0.7.0"
@ -329,11 +353,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e"
dependencies = [
"cfg-if 0.1.10",
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-epoch",
"crossbeam-channel 0.4.4",
"crossbeam-deque 0.7.3",
"crossbeam-epoch 0.8.2",
"crossbeam-queue",
"crossbeam-utils",
"crossbeam-utils 0.7.2",
]
[[package]]
@ -342,21 +366,42 @@ version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
dependencies = [
"crossbeam-utils",
"crossbeam-utils 0.7.2",
"maybe-uninit",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
dependencies = [
"cfg-if 1.0.0",
"crossbeam-utils 0.8.1",
]
[[package]]
name = "crossbeam-deque"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
"crossbeam-epoch 0.8.2",
"crossbeam-utils 0.7.2",
"maybe-uninit",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
dependencies = [
"cfg-if 1.0.0",
"crossbeam-epoch 0.9.1",
"crossbeam-utils 0.8.1",
]
[[package]]
name = "crossbeam-epoch"
version = "0.8.2"
@ -365,10 +410,24 @@ checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
dependencies = [
"autocfg",
"cfg-if 0.1.10",
"crossbeam-utils",
"crossbeam-utils 0.7.2",
"lazy_static",
"maybe-uninit",
"memoffset",
"memoffset 0.5.6",
"scopeguard",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d"
dependencies = [
"cfg-if 1.0.0",
"const_fn",
"crossbeam-utils 0.8.1",
"lazy_static",
"memoffset 0.6.1",
"scopeguard",
]
@ -379,7 +438,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
dependencies = [
"cfg-if 0.1.10",
"crossbeam-utils",
"crossbeam-utils 0.7.2",
"maybe-uninit",
]
@ -394,6 +453,17 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
dependencies = [
"autocfg",
"cfg-if 1.0.0",
"lazy_static",
]
[[package]]
name = "deflate"
version = "0.8.6"
@ -436,6 +506,12 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
[[package]]
name = "either"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
[[package]]
name = "flate2"
version = "1.0.19"
@ -605,6 +681,35 @@ dependencies = [
"gl_generator 0.14.0",
]
[[package]]
name = "hashbrown"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96282e96bfcd3da0d3aa9938bedf1e50df3269b6db08b4876d2da0bb1a0841cf"
dependencies = [
"ahash",
"autocfg",
]
[[package]]
name = "hermit-abi"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
dependencies = [
"libc",
]
[[package]]
name = "hibitset"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93a1bb8316a44459a7d14253c4d28dd7395cbd23cc04a68c46e851b8e46d64b1"
dependencies = [
"atom",
"rayon",
]
[[package]]
name = "image"
version = "0.23.12"
@ -787,11 +892,22 @@ dependencies = [
"autocfg",
]
[[package]]
name = "memoffset"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"
dependencies = [
"autocfg",
]
[[package]]
name = "midgard"
version = "0.1.0"
dependencies = [
"rltk",
"specs",
"specs-derive",
]
[[package]]
@ -856,6 +972,12 @@ dependencies = [
"ws2_32-sys",
]
[[package]]
name = "mopa"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915"
[[package]]
name = "ndk"
version = "0.1.0"
@ -911,6 +1033,16 @@ dependencies = [
"void",
]
[[package]]
name = "nom"
version = "5.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
dependencies = [
"memchr",
"version_check",
]
[[package]]
name = "num-integer"
version = "0.1.44"
@ -952,6 +1084,16 @@ dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "num_enum"
version = "0.4.3"
@ -1196,6 +1338,31 @@ dependencies = [
"libc",
]
[[package]]
name = "rayon"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
dependencies = [
"autocfg",
"crossbeam-deque 0.8.0",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
dependencies = [
"crossbeam-channel 0.5.0",
"crossbeam-deque 0.8.0",
"crossbeam-utils 0.8.1",
"lazy_static",
"num_cpus",
]
[[package]]
name = "redox_syscall"
version = "0.1.57"
@ -1310,6 +1477,26 @@ dependencies = [
"libc",
]
[[package]]
name = "shred"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5f08237e667ac94ad20f8878b5943d91a93ccb231428446c57c21c57779016d"
dependencies = [
"arrayvec",
"hashbrown",
"mopa",
"rayon",
"smallvec 1.6.1",
"tynm",
]
[[package]]
name = "shrev"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5752e017e03af9d735b4b069f53b7a7fd90fefafa04d8bd0c25581b0bff437f"
[[package]]
name = "slab"
version = "0.4.2"
@ -1353,6 +1540,33 @@ dependencies = [
"wayland-protocols",
]
[[package]]
name = "specs"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fff28a29366aff703d5da8a7e2c8875dc8453ac1118f842cbc0fa70c7db51240"
dependencies = [
"crossbeam-queue",
"hashbrown",
"hibitset",
"log",
"rayon",
"shred",
"shrev",
"tuple_utils",
]
[[package]]
name = "specs-derive"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e23e09360f3d2190fec4222cd9e19d3158d5da948c0d1ea362df617dd103511"
dependencies = [
"proc-macro2 1.0.24",
"quote 1.0.8",
"syn",
]
[[package]]
name = "stb_truetype"
version = "0.3.1"
@ -1388,7 +1602,7 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671"
dependencies = [
"crossbeam-utils",
"crossbeam-utils 0.7.2",
"futures",
]
@ -1398,7 +1612,7 @@ version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296"
dependencies = [
"crossbeam-utils",
"crossbeam-utils 0.7.2",
"futures",
"slab",
"tokio-executor",
@ -1413,6 +1627,21 @@ dependencies = [
"serde",
]
[[package]]
name = "tuple_utils"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44834418e2c5b16f47bedf35c28e148db099187dd5feee6367fb2525863af4f1"
[[package]]
name = "tynm"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4df2caa2dc9c3d1f7641ba981f4cd40ab229775aa7aeb834c9ab2850d50623d"
dependencies = [
"nom",
]
[[package]]
name = "ultraviolet"
version = "0.4.6"
@ -1434,6 +1663,12 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
[[package]]
name = "version_check"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
[[package]]
name = "void"
version = "1.0.2"

4
Cargo.toml

@ -7,4 +7,6 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rltk = "0.8.1"
rltk = "0.8.1"
specs = "0.16.1"
specs-derive = "0.4.1"

22
src/components/mod.rs

@ -0,0 +1,22 @@
use rltk::RGB;
use specs::prelude::*;
use specs_derive::Component;
#[derive(Component)]
pub struct Renderable {
pub glyph: rltk::FontCharType,
pub fg: RGB,
pub bg: RGB,
}
#[derive(Component)]
pub struct Position {
pub x: i32,
pub y: i32,
}
#[derive(Component)]
pub struct Chunk {
pub x: i32,
pub y: i32,
}

2
src/entities/mod.rs

@ -0,0 +1,2 @@
use crate::components;
use specs::prelude::*;

2
src/inventory.rs

@ -89,7 +89,7 @@ pub struct Item {
}
impl Render for InventoryView {
fn render(&mut self, _gs: &mut State, ctx: &mut Rltk) {
fn render(&self, _gs: &State, ctx: &mut Rltk) {
let mut draw_batch = DrawBatch::new();
ctx.cls();

41
src/main.rs

@ -1,15 +1,24 @@
extern crate rltk;
extern crate specs;
extern crate specs_derive;
mod components;
mod crypto;
mod entities;
mod inventory;
mod map;
mod traits;
use crate::inventory::Inventory;
use crate::inventory::InventoryView;
use crate::map::Chunk;
use crate::specs::Builder;
use crate::specs::Join;
use crate::specs::WorldExt;
use crate::traits::Render;
use map::TileType;
use rltk::prelude::*;
use specs::EntityBuilder;
use specs::World;
use std::collections::HashMap;
#[derive(Clone)]
@ -18,10 +27,10 @@ enum DisplayMode {
Inventory,
}
#[derive(Clone)]
pub struct State {
mode: DisplayMode,
view: Chunk,
world: World,
loaded_chunks: Box<HashMap<(i32, i32), Chunk>>,
world_pos: (i32, i32),
seed: u64,
@ -39,6 +48,20 @@ impl State {
}
pub fn seeded(seed: u64) -> State {
let mut chunks: HashMap<(i32, i32), Chunk> = HashMap::new();
let mut world = World::new();
world.register::<components::Position>();
world.register::<components::Renderable>();
world
.create_entity()
.with(components::Position { x: 40, y: 25 })
.with(components::Renderable {
glyph: rltk::to_cp437('@'),
bg: RGB::from_f32(1.0, 1.0, 0.0),
fg: RGB::from_f32(0., 0., 0.),
})
.build();
// Coordinates of the current and surrounding chunks
let keys: Vec<(i32, i32)> = [
@ -74,6 +97,7 @@ impl State {
let state = State {
mode: DisplayMode::Game,
world_pos: (0, 0),
world: World::new(),
view: chunks.get(&(0, 0)).unwrap().to_vec(),
loaded_chunks: Box::new(chunks),
seed,
@ -211,11 +235,18 @@ impl GameState for State {
self.select_object(Point::from(mouse_pos));
}
// CLEANUP: We shouldn't be cloning the state on each frame
match self.mode {
DisplayMode::Game => self.view.render(&mut self.clone(), ctx),
DisplayMode::Inventory => self.player_inventory.render(&mut self.clone(), ctx),
let positions = self.world.read_storage::<components::Position>();
let renderables = self.world.read_storage::<components::Renderable>();
for (pos, render) in (&positions, &renderables).join() {
ctx.set(pos.x, pos.y, render.fg, render.bg, render.glyph);
}
// CLEANUP: We shouldn't be cloning the state on each frame
match &self.mode {
DisplayMode::Game => self.view.render(&self, ctx),
DisplayMode::Inventory => self.player_inventory.render(&self, ctx),
};
}
}

11
src/map.rs

@ -24,14 +24,11 @@ impl Display for TileType {
}
impl Render for Chunk {
fn render(&mut self, gs: &mut State, ctx: &mut rltk::Rltk) {
fn render(&self, gs: &State, ctx: &mut rltk::Rltk) {
// We'll use batched drawing
let mut draw_batch = DrawBatch::new();
// Set all tiles to not visible
for v in gs.visible.iter_mut() {
*v = false;
}
let mut visible: Vec<bool> = gs.visible.iter().map(|tile| false).collect();
// Obtain the player's visible tile set, and apply it
let player_position = gs.index_to_point2d(gs.player_position);
@ -40,7 +37,7 @@ impl Render for Chunk {
// Note that the steps above would generally not be run every frame!
for idx in fov.iter() {
let point = gs.point2d_to_index(*idx);
gs.visible[point] = true;
visible[point] = true;
}
// Clear the screen
@ -63,7 +60,7 @@ impl Render for Chunk {
glyph = "#";
}
}
if !gs.visible[i] {
if !visible[i] {
fg = fg.to_greyscale();
}

2
src/traits.rs

@ -4,5 +4,5 @@ use rltk::Rltk;
// TODO: Add update trait
pub trait Render {
fn render(&mut self, gs: &mut State, ctx: &mut Rltk);
fn render(&self, gs: &State, ctx: &mut Rltk);
}

Loading…
Cancel
Save