yee
This commit is contained in:
parent
de9c32f776
commit
5b1475e84b
8 changed files with 334 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
target/
|
155
Cargo.lock
generated
Normal file
155
Cargo.lock
generated
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cards"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"rand",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "getrandom"
|
||||||
|
version = "0.2.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"wasi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.153"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ppv-lite86"
|
||||||
|
version = "0.2.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.79"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.35"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"rand_chacha",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_chacha"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||||
|
dependencies = [
|
||||||
|
"ppv-lite86",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.6.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.197"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.197"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.115"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.58"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasi"
|
||||||
|
version = "0.11.0+wasi-snapshot-preview1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "cards"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rand = "0.8.5"
|
||||||
|
serde = { version = "1.0.197", features = ["derive"] }
|
||||||
|
serde_json = "1.0.115"
|
1
data/cah-cards-full.json
Normal file
1
data/cah-cards-full.json
Normal file
File diff suppressed because one or more lines are too long
1
data/test.json
Normal file
1
data/test.json
Normal file
File diff suppressed because one or more lines are too long
17
readme.md
Normal file
17
readme.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Cards
|
||||||
|
|
||||||
|
I guess I'm making an API for card games that can exist in a chat-bot type frontend or a web page frontend
|
||||||
|
|
||||||
|
I aim to support Cards Against Humanity and Blackjack on Discord.
|
||||||
|
|
||||||
|
|
||||||
|
## TODO:
|
||||||
|
* finish CAH
|
||||||
|
* create and maintain own CAH card db to support card editing.. hash every card on the way in and use that as a unique id to prevent duplicating edited cards on a future merge?
|
||||||
|
* ratatui
|
||||||
|
* serenity
|
||||||
|
* make a web ui when discord can't display a hand privately without a DM
|
||||||
|
* telegram?
|
||||||
|
* Blackjack
|
||||||
|
* ...
|
||||||
|
* a lot
|
150
src/main.rs
Normal file
150
src/main.rs
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
use rand::seq::SliceRandom;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_json::Result;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Clone)]
|
||||||
|
struct CAHCardWhite {
|
||||||
|
text: String,
|
||||||
|
pack: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Clone)]
|
||||||
|
struct CAHCardBlack {
|
||||||
|
text: String,
|
||||||
|
pick: u8,
|
||||||
|
pack: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Clone)]
|
||||||
|
struct CAHCardSet {
|
||||||
|
name: String,
|
||||||
|
description: Option<String>,
|
||||||
|
official: bool,
|
||||||
|
white: Option<Vec<CAHCardWhite>>,
|
||||||
|
black: Option<Vec<CAHCardBlack>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
// struct CAHPlayer {
|
||||||
|
// white_cards: Vec<CAHCardWhite>,
|
||||||
|
// black_cards: Vec<CAHCardBlack>,
|
||||||
|
// is_czar: bool,
|
||||||
|
// }
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
struct CAHGame {
|
||||||
|
white_cards: Vec<CAHCardWhite>,
|
||||||
|
black_cards: Vec<CAHCardBlack>,
|
||||||
|
// white_discard: Vec<CAHCardWhite>,
|
||||||
|
// black_discard: Vec<CAHCardBlack>,
|
||||||
|
// game_active: bool,
|
||||||
|
// players: Vec<CAHPlayer>,
|
||||||
|
// czar: Option<*mut CAHPlayer>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CAHGame {
|
||||||
|
fn build_decks(&mut self, cards_json: Vec<CAHCardSet>) {
|
||||||
|
// clear deck before adding cards
|
||||||
|
self.white_cards = Vec::new();
|
||||||
|
self.black_cards = Vec::new();
|
||||||
|
|
||||||
|
for pack in cards_json {
|
||||||
|
if let Some(white_cards) = pack.white {
|
||||||
|
for card in white_cards {
|
||||||
|
self.white_cards.push(card)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(black_cards) = pack.black {
|
||||||
|
for card in black_cards {
|
||||||
|
self.black_cards.push(card)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deck_counts(&self) {
|
||||||
|
println!(
|
||||||
|
"Deck Counts:\n {} White cards\n {} Black cards",
|
||||||
|
self.white_cards.len(),
|
||||||
|
self.black_cards.len()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pick_one_white(&self) {
|
||||||
|
let card = self.white_cards.choose(&mut rand::thread_rng()).unwrap();
|
||||||
|
println!(
|
||||||
|
"{}\n {}",
|
||||||
|
card.pack,
|
||||||
|
card.text,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pick_one_black(&self) {
|
||||||
|
let card = self.black_cards.choose(&mut rand::thread_rng()).unwrap();
|
||||||
|
let div = "--------------------------";
|
||||||
|
println!(
|
||||||
|
"{}\n Pack: {}\n Pick: {}\n Text: {}\n{}",
|
||||||
|
div,
|
||||||
|
card.pack,
|
||||||
|
card.pick.to_string(),
|
||||||
|
card.text,
|
||||||
|
div
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_json(path: &str) -> Result<Vec<CAHCardSet>> {
|
||||||
|
let data: String = fs::read_to_string(path).expect("Error reading file");
|
||||||
|
let jayson: Vec<CAHCardSet> = serde_json::from_str(&data)?;
|
||||||
|
|
||||||
|
Ok(jayson)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn packs_report(json: Vec<CAHCardSet>) {
|
||||||
|
let line = "---------------------------";
|
||||||
|
for pack in json {
|
||||||
|
println!("{}", &line);
|
||||||
|
let name = pack.name;
|
||||||
|
println!("Name: {:?}", name);
|
||||||
|
let desc = pack.description;
|
||||||
|
println!("Description: {:?}", desc);
|
||||||
|
let official = pack.official;
|
||||||
|
println!("Official: {:?}", official);
|
||||||
|
let white = pack.white.unwrap().len();
|
||||||
|
println!("White Cards: {:?}", white);
|
||||||
|
let black = pack.black.unwrap().len();
|
||||||
|
println!("Black Cards: {:?}", black);
|
||||||
|
}
|
||||||
|
println!("{}", line);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<()> {
|
||||||
|
// let cards_input_path: &str = "data/test.json";
|
||||||
|
let cards_input_path: &str = "data/cah-cards-full.json";
|
||||||
|
let cards_json: Vec<CAHCardSet> = load_json(cards_input_path)?;
|
||||||
|
packs_report(cards_json.clone());
|
||||||
|
|
||||||
|
let mut cah_game = CAHGame {
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
cah_game.build_decks(cards_json);
|
||||||
|
|
||||||
|
cah_game.deck_counts();
|
||||||
|
|
||||||
|
cah_game.pick_one_black();
|
||||||
|
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
cah_game.pick_one_white();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue