From f8a9cc5d758dfe44fe4a3fa2257df850ab85e92e Mon Sep 17 00:00:00 2001 From: Alex Csengery Date: Tue, 16 Jan 2024 22:29:34 -0500 Subject: [PATCH] Initial-ish commit The first commit following this tutorial. My plan was to commit and push after each section, but I've already done two. Ooops. I'll be better from here on out, I promise. --- .gitignore | 2 + Cargo.lock | 64 ++++++++++++++++ Cargo.toml | 9 +++ arial10x10.png | Bin 0 -> 14870 bytes src/main.rs | 195 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 arial10x10.png create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f419dc7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.idea +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b26e0c6 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,64 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bitflags" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a6577517ecd0ee0934f48a7295a89aaef3e6dfafeac404f94c0b3448518ddfe" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "lazy_static" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417" + +[[package]] +name = "libc" +version = "0.2.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "pkg-config" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" + +[[package]] +name = "roguelike" +version = "0.1.0" +dependencies = [ + "tcod", +] + +[[package]] +name = "tcod" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44e518b0661949712e8dbc6d6d9d7c00a405dd88bc539102c1edfc2d22e5e144" +dependencies = [ + "bitflags", + "lazy_static", + "tcod-sys", +] + +[[package]] +name = "tcod-sys" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730fb27d2261f7c860ae7a61c3ae70277f0836173ceeccb594193abb4fa5f4aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9d52f34 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "roguelike" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tcod = "0.15" \ No newline at end of file diff --git a/arial10x10.png b/arial10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..64691f1bbd47ca4f7346f8d502efccfb8a325ece GIT binary patch literal 14870 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 xcMxV@m& bool { + use tcod::input::Key; + use tcod::input::KeyCode::*; + + let key = tcod.root.wait_for_keypress(true); + match key { + // toggle fullscreen + Key { + code: Enter, + alt: true, + .. + } => { + let fullscreen = tcod.root.is_fullscreen(); + tcod.root.set_fullscreen(!fullscreen); + } + // exit game + Key { code: Escape, .. } => return true, + // movement keys + Key { code: Up, .. } => player.move_by(0, -1, game), + Key { code: Down, .. } => player.move_by(0, 1, game), + Key { code: Left, .. } => player.move_by(-1, 0, game), + Key { code: Right, .. } => player.move_by(1, 0, game), + + _ => {} + } + + false +} + +fn render_all(tcod: &mut Tcod, game: &Game, objects: &[Object]) { + // draw all objects in the list + for object in objects { + object.draw(&mut tcod.con); + } + + // go through all tiles and set their background color + for y in 0..MAP_HEIGHT { + for x in 0..MAP_WIDTH { + let wall = game.map[x as usize][y as usize].block_sight; + if wall { + tcod.con + .set_char_background(x, y, COLOR_DARK_WALL, BackgroundFlag::Set); + } else { + tcod.con + .set_char_background(x, y, COLOR_DARK_GROUND, BackgroundFlag::Set); + } + } + } + blit( + &tcod.con, + (0, 0), + (SCREEN_WIDTH, SCREEN_HEIGHT), + &mut tcod.root, + (0, 0), + 1.0, + 1.0, + ); +} +// This is a generic object: the player, a monster, an item, the stairs... +// It's always represented by a character on screen. +#[derive(Debug)] +struct Object { + x: i32, + y: i32, + char: char, + color: Color, +} + +impl Object { + pub fn new(x: i32, y: i32, char: char, color: Color) -> Self { + Object { x, y, char, color } + } + + // move by the given amount, if the destination is not blocked + pub fn move_by(&mut self, dx: i32, dy: i32, game: &Game) { + if !game.map[(self.x + dx) as usize][(self.y + dy) as usize].blocked { + self.x += dx; + self.y += dy; + } + } + + // set the color and then draw the character that represents this object at its position + pub fn draw(&self, con: &mut dyn Console) { + con.set_default_foreground(self.color); + con.put_char(self.x, self.y, self.char, BackgroundFlag::None); + } +} + +// A tile of the map and its properties +#[derive(Clone, Copy, Debug)] +struct Tile { + blocked: bool, + block_sight: bool, +} + +impl Tile { + pub fn empty() -> Self { + Tile { + blocked: false, + block_sight: false, + } + } + + pub fn wall() -> Self { + Tile { + blocked: true, + block_sight: true, + } + } +} + +type Map = Vec>; + +struct Game { + map: Map, +} + +fn make_map() -> Map { + // fill map with "unblocked" tiles + let mut map = vec![vec![Tile::empty(); MAP_HEIGHT as usize]; MAP_WIDTH as usize]; + + // place two pillars to test the map + map[30][22] = Tile::wall(); + map[50][22] = Tile::wall(); + + map +}