Compare commits

..

No commits in common. "3f39a3dcc3d67566b9261885566c6d7a9d2f7e3c" and "0e65343712e16e742fa83ee62f1674f2ba93e30d" have entirely different histories.

4 changed files with 41 additions and 405 deletions

View file

@ -1,197 +0,0 @@
use crate::billy_objects::Weapons::*;
use crate::sheet::CharacteristicType;
use crate::sheet::CharacteristicType::*;
use serde::{Deserialize, Serialize};
pub trait GenericObject {
fn add_armor(&self) -> u32 {
0
}
fn add_critique(&self) -> u32 {
0
}
fn add_damage(&self) -> u32 {
0
}
fn add_materiel(&self, in_type: &CharacteristicType) -> i32;
}
#[derive(Debug, Serialize, Deserialize, Hash, Eq, PartialEq, Clone)]
pub enum Weapons {
Sword,
Lance,
Morgenstern,
Bow,
}
#[derive(Debug, Serialize, Deserialize, Hash, Eq, PartialEq, Clone)]
pub enum Equipments {
Chainmail,
CookingPot,
PamphletTourist,
MedicKit,
}
#[derive(Debug, Serialize, Deserialize, Hash, Eq, PartialEq, Clone)]
pub enum Tools {
Fourche,
Dagger,
RockClimbingKit,
SackOfGrain,
}
#[derive(Debug, Serialize, Deserialize, Hash, Eq, PartialEq, Clone)]
pub enum Objects {
Weapons(Weapons),
Equipments(Equipments),
Tools(Tools),
}
impl GenericObject for Weapons {
fn add_damage(&self) -> u32 {
if let Morgenstern = &self {
1
} else {
0
}
}
fn add_materiel(&self, in_type: &CharacteristicType) -> i32 {
match self {
Sword => {
if let Skill(_) = &in_type {
4
} else {
0
}
}
Lance => match in_type {
Address(_) => 1,
Skill(_) => 3,
_ => 0,
},
Morgenstern => match in_type {
Stamina(_) | Skill(_) => 1,
_ => 0,
},
Bow => match in_type {
Address(_) => 1,
Skill(_) => 3,
_ => 0,
},
}
}
}
impl GenericObject for Equipments {
fn add_armor(&self) -> u32 {
match self {
Equipments::Chainmail => 2,
Equipments::CookingPot => 1,
_ => 0,
}
}
fn add_materiel(&self, in_type: &CharacteristicType) -> i32 {
match self {
Equipments::Chainmail => match in_type {
Address(_) | Skill(_) => -1,
Stamina(_) => 1,
_ => 0,
},
Equipments::CookingPot => {
if let Stamina(_) = in_type {
2
} else {
0
}
}
Equipments::PamphletTourist => {
if let Luck(_) = in_type {
4
} else {
0
}
}
Equipments::MedicKit => {
if let Luck(_) = in_type {
1
} else {
0
}
}
}
}
}
impl GenericObject for Tools {
fn add_critique(&self) -> u32 {
if let Tools::Dagger = &self {
6
} else {
0
}
}
fn add_materiel(&self, in_type: &CharacteristicType) -> i32 {
match self {
Tools::Fourche => match in_type {
Stamina(_) => 3,
Skill(_) => 1,
_ => 0,
},
Tools::Dagger => {
if let Skill(_) = in_type {
1
} else {
0
}
}
Tools::RockClimbingKit => {
if let Address(_) = in_type {
1
} else {
0
}
}
Tools::SackOfGrain => match in_type {
Stamina(_) | Luck(_) => 2,
_ => 0,
},
}
}
}
impl GenericObject for Objects {
fn add_armor(&self) -> u32 {
match self {
Objects::Weapons(a) => a.add_armor(),
Objects::Equipments(a) => a.add_armor(),
Objects::Tools(a) => a.add_armor(),
}
}
fn add_critique(&self) -> u32 {
match self {
Objects::Weapons(a) => a.add_critique(),
Objects::Equipments(a) => a.add_critique(),
Objects::Tools(a) => a.add_critique(),
}
}
fn add_damage(&self) -> u32 {
match self {
Objects::Weapons(a) => a.add_damage(),
Objects::Equipments(a) => a.add_damage(),
Objects::Tools(a) => a.add_damage(),
}
}
fn add_materiel(&self, in_type: &CharacteristicType) -> i32 {
match self {
Objects::Weapons(a) => a.add_materiel(in_type),
Objects::Equipments(a) => a.add_materiel(in_type),
Objects::Tools(a) => a.add_materiel(in_type),
}
}
}

View file

@ -1,3 +1,2 @@
pub mod billy_objects;
pub mod gui; pub mod gui;
pub mod sheet; pub mod sheet;

View file

@ -2,7 +2,7 @@ use std::path::PathBuf;
use eframe::egui; use eframe::egui;
use eframe::egui::KeyboardShortcut; use eframe::egui::KeyboardShortcut;
use log::{error, info, warn}; use log::{info, warn, error};
use billy_sheet::gui::SheetGui; use billy_sheet::gui::SheetGui;

View file

@ -1,26 +1,9 @@
use crate::billy_objects::{Equipments::*, GenericObject, Objects, Tools::*, Weapons::*}; use eframe::egui::widgets::DragValue;
use crate::gui::SheetGui; use eframe::egui::Ui;
use eframe::egui::{widgets::DragValue, Ui};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::hash_set;
use std::io::Write as _; use std::io::Write as _;
const ALL_OBJECTS: [Objects; 12] = [ use crate::gui::SheetGui;
Objects::Weapons(Sword),
Objects::Weapons(Lance),
Objects::Weapons(Morgenstern),
Objects::Weapons(Bow),
Objects::Equipments(Chainmail),
Objects::Equipments(CookingPot),
Objects::Equipments(PamphletTourist),
Objects::Equipments(MedicKit),
Objects::Tools(Fourche),
Objects::Tools(Dagger),
Objects::Tools(RockClimbingKit),
Objects::Tools(SackOfGrain),
];
const MAX_OBJ: usize = 3;
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub enum Classe { pub enum Classe {
@ -31,11 +14,11 @@ pub enum Classe {
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub enum CharacteristicType { enum CharacteristicType {
Address(Characteristic), Address,
Stamina(Characteristic), Stamina,
Luck(Characteristic), Luck,
Skill(Characteristic), Skill,
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
@ -43,94 +26,15 @@ pub struct CharacterSheet {
character_class: Classe, character_class: Classe,
/// Field to write the personality/ /// Field to write the personality/
pub character: String, pub character: String,
address: CharacteristicType, address: Characteristic,
stamina: CharacteristicType, stamina: Characteristic,
luck: CharacteristicType, luck: Characteristic,
skill: CharacteristicType, skill: Characteristic,
objects: hash_set::HashSet<Objects>,
health: u32, health: u32,
armor: u32, armor: u32,
damage: u32, damage: u32,
glory: u32, glory: u32,
money: u32, money: u32,
critique: u32,
nb_weapons: u8,
nb_equipments: u8,
nb_tools: u8,
}
#[derive(Debug)]
pub struct SheetRuler {
pub available_objects: hash_set::HashSet<Objects>,
}
impl Default for SheetRuler {
fn default() -> Self {
Self {
available_objects: hash_set::HashSet::from_iter(ALL_OBJECTS),
}
}
}
impl SheetRuler {
fn change_carac(
object: &Objects,
sheet: &mut CharacterSheet,
operation: impl Fn(u32, i32) -> u32,
) {
sheet.address_mut().materiel = operation(
sheet.address_mut().materiel,
object.add_materiel(&sheet.address),
);
sheet.skill_mut().materiel = operation(
sheet.skill_mut().materiel,
object.add_materiel(&sheet.skill),
);
sheet.luck_mut().materiel =
operation(sheet.luck_mut().materiel, object.add_materiel(&sheet.luck));
sheet.stamina_mut().materiel = operation(
sheet.stamina_mut().materiel,
object.add_materiel(&sheet.stamina),
);
sheet.armor = operation(sheet.armor, object.add_armor() as i32);
sheet.damage = operation(sheet.armor, object.add_damage() as i32);
sheet.critique = operation(sheet.critique, object.add_critique() as i32);
}
pub fn insert_object(&mut self, sheet: &mut CharacterSheet, object: Objects) -> bool {
if self.available_objects.len() >= MAX_OBJ || sheet.objects.contains(&object) {
false
} else {
Self::change_carac(&object, sheet, |a, b| a + b as u32);
let remove = self.available_objects.remove(&object);
let r = sheet.objects.insert(object.clone()) && remove;
if r {
match object {
Objects::Weapons(_) => sheet.nb_weapons += 1,
Objects::Equipments(_) => sheet.nb_equipments += 1,
Objects::Tools(_) => sheet.nb_tools += 1,
}
}
r
}
}
pub fn erase_object(&mut self, sheet: &mut CharacterSheet, object: Objects) -> bool {
if sheet.objects.contains(&object) {
Self::change_carac(&object, sheet, |a, b| a - b as u32);
let remove = sheet.objects.remove(&object);
let r = self.available_objects.insert(object.clone()) && remove;
if r {
match object {
Objects::Weapons(_) => sheet.nb_weapons -= 1,
Objects::Equipments(_) => sheet.nb_equipments -= 1,
Objects::Tools(_) => sheet.nb_tools -= 1,
}
}
r
} else {
false
}
}
} }
pub fn write_sheet(path: &std::path::Path, sheet: &CharacterSheet) -> std::io::Result<()> { pub fn write_sheet(path: &std::path::Path, sheet: &CharacterSheet) -> std::io::Result<()> {
@ -147,61 +51,16 @@ impl CharacterSheet {
&self.character &self.character
} }
pub fn address(&self) -> &Characteristic { pub fn address(&self) -> &Characteristic {
if let CharacteristicType::Address(addr) = &self.address { &self.address
addr
} else {
unreachable!()
}
}
fn address_mut(&mut self) -> &mut Characteristic {
if let CharacteristicType::Address(addr) = &mut self.address {
addr
} else {
unreachable!()
}
} }
pub fn stamina(&self) -> &Characteristic { pub fn stamina(&self) -> &Characteristic {
if let CharacteristicType::Stamina(sta) = &self.stamina { &self.stamina
sta
} else {
unreachable!()
}
}
fn stamina_mut(&mut self) -> &mut Characteristic {
if let CharacteristicType::Stamina(sta) = &mut self.stamina {
sta
} else {
unreachable!()
}
} }
pub fn luck(&self) -> &Characteristic { pub fn luck(&self) -> &Characteristic {
if let CharacteristicType::Luck(luck) = &self.luck { &self.luck
luck
} else {
unreachable!()
}
}
fn luck_mut(&mut self) -> &mut Characteristic {
if let CharacteristicType::Luck(luck) = &mut self.luck {
luck
} else {
unreachable!()
}
} }
pub fn skill(&self) -> &Characteristic { pub fn skill(&self) -> &Characteristic {
if let CharacteristicType::Skill(sk) = &self.skill { &self.skill
sk
} else {
unreachable!()
}
}
fn skill_mut(&mut self) -> &mut Characteristic {
if let CharacteristicType::Skill(sk) = &mut self.skill {
sk
} else {
unreachable!()
}
} }
pub fn health(&self) -> u32 { pub fn health(&self) -> u32 {
self.health self.health
@ -220,17 +79,6 @@ impl CharacterSheet {
} }
} }
impl CharacteristicType {
fn check(&self) {
match self {
CharacteristicType::Address(_) => todo!("Rules for address"),
CharacteristicType::Stamina(_) => todo!("Rules for stamina"),
CharacteristicType::Luck(_) => todo!("Rules for luck"),
CharacteristicType::Skill(_) => todo!("Rules for skill"),
}
}
}
impl SheetGui for CharacterSheet { impl SheetGui for CharacterSheet {
fn shortcut( fn shortcut(
&self, &self,
@ -259,39 +107,27 @@ impl SheetGui for CharacterSheet {
fn gui_address(&mut self, ui: &mut Ui) { fn gui_address(&mut self, ui: &mut Ui) {
let workaround = self as &CharacterSheet; let workaround = self as &CharacterSheet;
( (self.address.base, self.address.carac, self.address.materiel) =
self.address_mut().base, self.shortcut(ui, "Adresse", workaround.address());
self.address_mut().carac,
self.address_mut().materiel,
) = self.shortcut(ui, "Adresse", workaround.address());
ui.label("Ne peut dépasser 5"); ui.label("Ne peut dépasser 5");
} }
fn gui_stamina(&mut self, ui: &mut Ui) { fn gui_stamina(&mut self, ui: &mut Ui) {
let workaround = self as &CharacterSheet; let workaround = self as &CharacterSheet;
( (self.stamina.base, self.stamina.carac, self.stamina.materiel) =
self.stamina_mut().base, self.shortcut(ui, "Endurance", workaround.stamina());
self.stamina_mut().carac,
self.stamina_mut().materiel,
) = self.shortcut(ui, "Endurance", workaround.stamina());
} }
fn gui_luck(&mut self, ui: &mut Ui) { fn gui_luck(&mut self, ui: &mut Ui) {
let workaround = self as &CharacterSheet; let workaround = self as &CharacterSheet;
( (self.luck.base, self.luck.carac, self.luck.materiel) =
self.luck_mut().base, self.shortcut(ui, "Chance", workaround.luck());
self.luck_mut().carac,
self.luck_mut().materiel,
) = self.shortcut(ui, "Chance", workaround.luck());
} }
fn gui_skill(&mut self, ui: &mut Ui) { fn gui_skill(&mut self, ui: &mut Ui) {
let workaround = self as &CharacterSheet; let workaround = self as &CharacterSheet;
( (self.skill.base, self.skill.carac, self.skill.materiel) =
self.skill_mut().base, self.shortcut(ui, "Habileté", workaround.skill());
self.skill_mut().carac,
self.skill_mut().materiel,
) = self.shortcut(ui, "Habileté", workaround.skill());
} }
fn secondary_stats(&mut self, ui: &mut Ui) { fn secondary_stats(&mut self, ui: &mut Ui) {
@ -310,13 +146,12 @@ impl SheetGui for CharacterSheet {
ui.add(DragValue::new(&mut armor)); ui.add(DragValue::new(&mut armor));
}); });
ui.label("Critique"); ui.label("Critique");
self.damage = damage;
self.armor = armor;
} }
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct Characteristic { pub struct Characteristic {
characteristic_type: CharacteristicType,
pub base: u32, pub base: u32,
pub carac: u32, pub carac: u32,
pub materiel: u32, pub materiel: u32,
@ -328,40 +163,39 @@ impl Default for CharacterSheet {
Self { Self {
character_class: Classe::Warrior, character_class: Classe::Warrior,
character: "Billy".to_string(), character: "Billy".to_string(),
address: CharacteristicType::Address(Characteristic { address: Characteristic {
base: 1, characteristic_type: CharacteristicType::Address,
base: 0,
carac: 0, carac: 0,
materiel: 0, materiel: 0,
additional: 0, additional: 1,
}), },
stamina: CharacteristicType::Stamina(Characteristic { stamina: Characteristic {
characteristic_type: CharacteristicType::Stamina,
base: 2, base: 2,
carac: 0, carac: 0,
materiel: 0, materiel: 0,
additional: 0, additional: 0,
}), },
luck: CharacteristicType::Luck(Characteristic { luck: Characteristic {
characteristic_type: CharacteristicType::Luck,
base: 3, base: 3,
carac: 0, carac: 0,
materiel: 0, materiel: 0,
additional: 0, additional: 0,
}), },
skill: CharacteristicType::Skill(Characteristic { skill: Characteristic {
characteristic_type: CharacteristicType::Skill,
base: 2, base: 2,
carac: 0, carac: 0,
materiel: 0, materiel: 0,
additional: 0, additional: 0,
}), },
objects: hash_set::HashSet::default(),
health: 0, health: 0,
armor: 0, armor: 0,
damage: 0, damage: 0,
glory: 0, glory: 0,
money: 0, money: 0,
critique: 0,
nb_weapons: 0,
nb_equipments: 0,
nb_tools: 0,
} }
} }
} }