assets | ||
src | ||
tavern_macros | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
db.md | ||
readme.md | ||
reqs.md | ||
table_data.md |
WTF how do i implement a game???
Things you need from a game
Characters and character sheet:
[x] Stats and items: get/set/display
[ ] Actions (broken into different tabs, aka: (&self) -> Vec<InteractionDefinition>
)
[ ] Token status: status icons (with tooltip ffs)/light produced/vision distance(in light level)
[ ] Apply Action (&mut self, InteractionResult) -> ()
Spells and items
[ ]Turn based combat callbakcs:
[ ] Start of turn - (&mut self) -> Vec<Message>
[ ] End of turn
InteractionDef -> Player uses -> Interaction in chat (with actions) -> Rolls some dice -> Interaction
Shoot arrow def -> player A shoots B (rolls attack) -> I nteraction in chat (with Roll damage button) -> InteractionResult (damage/double/block/heal actions) -> Apply InteractionResult ()
trait Action {}
trait CS<A: Action> {
fn can_use_action(&self, action: &A) -> bool;
}
struct Game<'dec, 'dea, C: CS<A> + Serialize + Deserialize<'dec>, A: Action + Serialize + Deserialize<'dea>> {
_a: std::marker::PhantomData<&'dea A>,
_c: std::marker::PhantomData<&'dec C>,
}
impl<'dec, 'dea, C: CS<A> + Serialize + Deserialize<'dec>, A: Action + Serialize + Deserialize<'dea>> Game<'dec, 'dea, C, A> {
fn read_spell(s: &'dea str) -> A {
serde_json::de::from_str::<A>(s).unwrap()
}
}
#[derive(Serialize, Deserialize)]
struct Spell {
pub mana: i32,
}
impl Action for Spell {}
#[derive(Serialize, Deserialize)]
struct Sheet;
impl CS<Spell> for Sheet {
fn can_use_action(&self, action: &Spell) -> bool {
action.mana > 10
}
}
fn stupid() {
let game = Game::<'_, '_, Sheet, Spell>::read_spell("aaaaaaaa");
}
^^^ this looks mad isnt it, but it defines 3 traits, Action, Character sheet and game(which should be a trait actually)
-
Player connects
-
Player gets character data (including all the relevant actions and such)
-
Player acts
-
Player does action
-
Action is printed to chat (with rolls and such)
-
Action button is pressed (optional rolls)
fn use_action(&mut self, entry: &Entry, action: &Action) -> ChatMessage
struct Action {
pub name: String,
pub roll_result: i32,
}