init commit
This commit is contained in:
commit
8677e05fe1
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
3694
Cargo.lock
generated
Normal file
3694
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
10
Cargo.toml
Normal file
10
Cargo.toml
Normal file
@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "minibaldur"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
bevy = "0.11.2"
|
||||
rand = "0.8.5"
|
22
src/characters.rs
Normal file
22
src/characters.rs
Normal file
@ -0,0 +1,22 @@
|
||||
use bevy::prelude::Commands;
|
||||
|
||||
use crate::components::*;
|
||||
use crate::util::*;
|
||||
|
||||
pub fn spawn_player_character(mut commands: Commands) {
|
||||
let (hp, _) = roll("1d6 + 3");
|
||||
commands.spawn(Creature {
|
||||
health: Health {
|
||||
hp,
|
||||
max: hp,
|
||||
},
|
||||
armor: Armor {
|
||||
ac: 10,
|
||||
},
|
||||
position: Position {
|
||||
x: 0.0,
|
||||
y: 0.0,
|
||||
},
|
||||
})
|
||||
.insert(PlayerCharacter);
|
||||
}
|
32
src/components.rs
Normal file
32
src/components.rs
Normal file
@ -0,0 +1,32 @@
|
||||
use std::collections::HashMap;
|
||||
use bevy::prelude::*;
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Health {
|
||||
pub hp: u32,
|
||||
pub max: u32,
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Armor {
|
||||
pub ac: u32,
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Position {
|
||||
pub x: f32,
|
||||
pub y: f32,
|
||||
}
|
||||
|
||||
#[derive(Bundle)]
|
||||
pub struct Creature {
|
||||
pub health: Health,
|
||||
pub armor: Armor,
|
||||
pub position: Position,
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct PlayerCharacter;
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct Battle(pub HashMap<u32, Entity>);
|
17
src/main.rs
Normal file
17
src/main.rs
Normal file
@ -0,0 +1,17 @@
|
||||
use bevy::prelude::*;
|
||||
|
||||
pub mod util;
|
||||
pub mod components;
|
||||
pub mod systems;
|
||||
pub mod characters;
|
||||
|
||||
use crate::characters::*;
|
||||
|
||||
fn main() {
|
||||
App::new()
|
||||
.add_plugins(DefaultPlugins)
|
||||
// Add systems, whatnot
|
||||
.add_systems(Startup, spawn_player_character)
|
||||
.add_systems(Startup, spawn_player_character)
|
||||
.run();
|
||||
}
|
15
src/systems.rs
Normal file
15
src/systems.rs
Normal file
@ -0,0 +1,15 @@
|
||||
use std::collections::HashMap;
|
||||
use bevy::prelude::*;
|
||||
|
||||
use crate::components::*;
|
||||
use crate::util::roll;
|
||||
|
||||
pub fn initiate_battle(query: Query<Entity, With<PlayerCharacter>>, mut commands: Commands) {
|
||||
let order: HashMap<u32, Entity> = query.iter().map(|ent| {
|
||||
let (total, _rolls) = roll("1d20");
|
||||
(total, ent)
|
||||
}).collect();
|
||||
|
||||
commands.spawn(Battle(order));
|
||||
}
|
||||
|
62
src/util.rs
Normal file
62
src/util.rs
Normal file
@ -0,0 +1,62 @@
|
||||
use rand::prelude::*;
|
||||
|
||||
enum Tok {
|
||||
Roll(u32),
|
||||
Flat(u32),
|
||||
}
|
||||
|
||||
use Tok::*;
|
||||
|
||||
/// Rolls dice corresponding to a ttrpg dice specifier
|
||||
/// ```
|
||||
/// assert_eq!(roll("4d6 + 1d4 + 1").1.len(), 2)
|
||||
/// ```
|
||||
pub fn roll(spec: &str) -> (u32, Vec<u32>) {
|
||||
let mut toks = spec.split_whitespace();
|
||||
let mut rolls = vec![];
|
||||
let mut total = 0;
|
||||
|
||||
let first = toks.next().unwrap();
|
||||
match parse_tok(first) {
|
||||
Roll(v) => {
|
||||
total += v;
|
||||
rolls.push(v);
|
||||
}
|
||||
Flat(v) => total += v,
|
||||
};
|
||||
let toks : Vec<&str> = toks.collect();
|
||||
let mut toks = toks.chunks(2);
|
||||
while let Some(&[op, tok]) = toks.next() {
|
||||
let val = match parse_tok(tok) {
|
||||
Roll(v) => {
|
||||
rolls.push(v);
|
||||
v
|
||||
}
|
||||
Flat(v) => v,
|
||||
};
|
||||
if op == "-" {
|
||||
total -= val;
|
||||
} else {
|
||||
total += val;
|
||||
}
|
||||
}
|
||||
(total, rolls)
|
||||
}
|
||||
|
||||
fn parse_tok(tok: &str) -> Tok {
|
||||
let mut rng = thread_rng();
|
||||
match *tok.split('d')
|
||||
.map(|x| x.parse().unwrap())
|
||||
.collect::<Vec<_>>()
|
||||
.as_slice() {
|
||||
[v] => Flat(v),
|
||||
[n, d] => {
|
||||
let mut total = 0;
|
||||
for _ in 0..n {
|
||||
total += rng.gen_range(1..=d)
|
||||
}
|
||||
Roll(total)
|
||||
}
|
||||
_ => panic!()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user