armor shop
This commit is contained in:
parent
80f50c49cc
commit
514e18fff3
219
data/shops/barrier.toml
Normal file
219
data/shops/barrier.toml
Normal file
@ -0,0 +1,219 @@
|
||||
[[barrier]]
|
||||
level = 0
|
||||
[[barrier.item]]
|
||||
item = "Barrier"
|
||||
probability = 34
|
||||
|
||||
[[barrier.item]]
|
||||
item = "Shield"
|
||||
probability = 34
|
||||
|
||||
[[barrier.item]]
|
||||
item = "CoreShield"
|
||||
probability = 15
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GigaShield"
|
||||
probability = 15
|
||||
|
||||
[[barrier.item]]
|
||||
item = "BraveBarrier"
|
||||
probability = 2
|
||||
|
||||
|
||||
[[barrier]]
|
||||
level = 10
|
||||
[[barrier.item]]
|
||||
item = "Barrier"
|
||||
probability = 5
|
||||
|
||||
[[barrier.item]]
|
||||
item = "Shield"
|
||||
probability = 10
|
||||
|
||||
[[barrier.item]]
|
||||
item = "CoreShield"
|
||||
probability = 14
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GigaShield"
|
||||
probability = 18
|
||||
|
||||
[[barrier.item]]
|
||||
item = "SoulBarrier"
|
||||
probability = 18
|
||||
|
||||
[[barrier.item]]
|
||||
item = "HardShield"
|
||||
probability = 14
|
||||
|
||||
[[barrier.item]]
|
||||
item = "BraveBarrier"
|
||||
probability = 10
|
||||
|
||||
[[barrier.item]]
|
||||
item = "SolidShield"
|
||||
probability = 5
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FlameBarrier"
|
||||
probability = 2
|
||||
|
||||
[[barrier.item]]
|
||||
item = "PlasmaBarrier"
|
||||
probability = 2
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FreezeBarrier"
|
||||
probability = 2
|
||||
|
||||
|
||||
[[barrier]]
|
||||
level = 25
|
||||
[[barrier.item]]
|
||||
item = "GigaShield"
|
||||
probability = 6
|
||||
|
||||
[[barrier.item]]
|
||||
item = "SoulBarrier"
|
||||
probability = 10
|
||||
|
||||
[[barrier.item]]
|
||||
item = "HardShield"
|
||||
probability = 15
|
||||
|
||||
[[barrier.item]]
|
||||
item = "BraveBarrier"
|
||||
probability = 19
|
||||
|
||||
[[barrier.item]]
|
||||
item = "SolidShield"
|
||||
probability = 18
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FlameBarrier"
|
||||
probability = 14
|
||||
|
||||
[[barrier.item]]
|
||||
item = "PlasmaBarrier"
|
||||
probability = 9
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FreezeBarrier"
|
||||
probability = 4
|
||||
|
||||
[[barrier.item]]
|
||||
item = "PsychicBarrier"
|
||||
probability = 3
|
||||
|
||||
[[barrier.item]]
|
||||
item = "ProtectBarrier"
|
||||
probability = 2
|
||||
|
||||
|
||||
[[barrier]]
|
||||
level = 42
|
||||
[[barrier.item]]
|
||||
item = "SoulBarrier"
|
||||
probability = 5
|
||||
|
||||
[[barrier.item]]
|
||||
item = "HardShield"
|
||||
probability = 5
|
||||
|
||||
[[barrier.item]]
|
||||
item = "BraveBarrier"
|
||||
probability = 5
|
||||
|
||||
[[barrier.item]]
|
||||
item = "SolidShield"
|
||||
probability = 10
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FlameBarrier"
|
||||
probability = 14
|
||||
|
||||
[[barrier.item]]
|
||||
item = "PlasmaBarrier"
|
||||
probability = 15
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FreezeBarrier"
|
||||
probability = 14
|
||||
|
||||
[[barrier.item]]
|
||||
item = "PsychicBarrier"
|
||||
probability = 11
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GeneralShield"
|
||||
probability = 9
|
||||
|
||||
[[barrier.item]]
|
||||
item = "ProtectBarrier"
|
||||
probability = 6
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GloriousShield"
|
||||
probability = 4
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GuardianShield"
|
||||
probability = 2
|
||||
|
||||
|
||||
[[barrier]]
|
||||
level = 60
|
||||
[[barrier.item]]
|
||||
item = "HardShield"
|
||||
probability = 4
|
||||
|
||||
[[barrier.item]]
|
||||
item = "BraveBarrier"
|
||||
probability = 5
|
||||
|
||||
[[barrier.item]]
|
||||
item = "SolidShield"
|
||||
probability = 5
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FlameBarrier"
|
||||
probability = 8
|
||||
|
||||
[[barrier.item]]
|
||||
item = "PlasmaBarrier"
|
||||
probability = 11
|
||||
|
||||
[[barrier.item]]
|
||||
item = "FreezeBarrier"
|
||||
probability = 13
|
||||
|
||||
[[barrier.item]]
|
||||
item = "PsychicBarrier"
|
||||
probability = 13
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GeneralShield"
|
||||
probability = 14
|
||||
|
||||
[[barrier.item]]
|
||||
item = "ProtectBarrier"
|
||||
probability = 14
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GloriousShield"
|
||||
probability = 9
|
||||
|
||||
[[barrier.item]]
|
||||
item = "ImperialBarrier"
|
||||
probability = 2
|
||||
|
||||
[[barrier.item]]
|
||||
item = "GuardianShield"
|
||||
probability = 1
|
||||
|
||||
[[barrier.item]]
|
||||
item = "DivinityBarrier"
|
||||
probability = 1
|
||||
|
||||
|
251
data/shops/frame.toml
Normal file
251
data/shops/frame.toml
Normal file
@ -0,0 +1,251 @@
|
||||
[[frame]]
|
||||
level = 0
|
||||
[[frame.item]]
|
||||
item = "Frame"
|
||||
probability = 33
|
||||
|
||||
[[frame.item]]
|
||||
item = "Armor"
|
||||
probability = 33
|
||||
|
||||
[[frame.item]]
|
||||
item = "PsyArmor"
|
||||
probability = 15
|
||||
|
||||
[[frame.item]]
|
||||
item = "GigaFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "SoulFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "SolidFrame"
|
||||
probability = 4
|
||||
|
||||
|
||||
[[frame]]
|
||||
level = 10
|
||||
[[frame.item]]
|
||||
item = "Frame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "Armor"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "PsyArmor"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "GigaFrame"
|
||||
probability = 15
|
||||
|
||||
[[frame.item]]
|
||||
item = "SoulFrame"
|
||||
probability = 19
|
||||
|
||||
[[frame.item]]
|
||||
item = "CrossArmor"
|
||||
probability = 19
|
||||
|
||||
[[frame.item]]
|
||||
item = "SolidFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "BraveArmor"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "HyperFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "KingsFrame"
|
||||
probability = 2
|
||||
|
||||
|
||||
[[frame]]
|
||||
level = 25
|
||||
[[frame.item]]
|
||||
item = "SoulFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "CrossArmor"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "SolidFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "BraveArmor"
|
||||
probability = 15
|
||||
|
||||
[[frame.item]]
|
||||
item = "HyperFrame"
|
||||
probability = 19
|
||||
|
||||
[[frame.item]]
|
||||
item = "GrandArmor"
|
||||
probability = 19
|
||||
|
||||
[[frame.item]]
|
||||
item = "ShockFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "KingsFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "DragonFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "GeneralArmor"
|
||||
probability = 2
|
||||
|
||||
|
||||
[[frame]]
|
||||
level = 42
|
||||
[[frame.item]]
|
||||
item = "SolidFrame"
|
||||
probability = 2
|
||||
|
||||
[[frame.item]]
|
||||
item = "BraveArmor"
|
||||
probability = 4
|
||||
|
||||
[[frame.item]]
|
||||
item = "HyperFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "GrandArmor"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "ShockFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "KingsFrame"
|
||||
probability = 12
|
||||
|
||||
[[frame.item]]
|
||||
item = "DragonFrame"
|
||||
probability = 14
|
||||
|
||||
[[frame.item]]
|
||||
item = "AbsorbArmor"
|
||||
probability = 14
|
||||
|
||||
[[frame.item]]
|
||||
item = "ProtectFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "GeneralArmor"
|
||||
probability = 9
|
||||
|
||||
[[frame.item]]
|
||||
item = "PerfectFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "ValiantFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "ImperialArmor"
|
||||
probability = 3
|
||||
|
||||
[[frame.item]]
|
||||
item = "HolinessArmor"
|
||||
probability = 2
|
||||
|
||||
|
||||
[[frame]]
|
||||
level = 60
|
||||
[[frame.item]]
|
||||
item = "BraveArmor"
|
||||
probability = 2
|
||||
|
||||
[[frame.item]]
|
||||
item = "HyperFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "GrandArmor"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "ShockFrame"
|
||||
probability = 5
|
||||
|
||||
[[frame.item]]
|
||||
item = "KingsFrame"
|
||||
probability = 6
|
||||
|
||||
[[frame.item]]
|
||||
item = "DragonFrame"
|
||||
probability = 10
|
||||
|
||||
[[frame.item]]
|
||||
item = "AbsorbArmor"
|
||||
probability = 13
|
||||
|
||||
[[frame.item]]
|
||||
item = "ProtectFrame"
|
||||
probability = 14
|
||||
|
||||
[[frame.item]]
|
||||
item = "GeneralArmor"
|
||||
probability = 14
|
||||
|
||||
[[frame.item]]
|
||||
item = "PerfectFrame"
|
||||
probability = 14
|
||||
|
||||
[[frame.item]]
|
||||
item = "ValiantFrame"
|
||||
probability = 7
|
||||
|
||||
[[frame.item]]
|
||||
item = "ImperialArmor"
|
||||
probability = 3
|
||||
|
||||
[[frame.item]]
|
||||
item = "HolinessArmor"
|
||||
probability = 1
|
||||
|
||||
[[frame.item]]
|
||||
item = "GuardianArmor"
|
||||
probability = 1
|
||||
|
||||
|
||||
[[slot_rate]]
|
||||
slot = 0
|
||||
probability = 75
|
||||
|
||||
[[slot_rate]]
|
||||
slot = 1
|
||||
probability = 18
|
||||
|
||||
[[slot_rate]]
|
||||
slot = 2
|
||||
probability = 6
|
||||
|
||||
[[slot_rate]]
|
||||
slot = 3
|
||||
probability = 1
|
||||
|
||||
[[slot_rate]]
|
||||
slot = 4
|
||||
probability = 0
|
||||
|
300
data/shops/unit.toml
Normal file
300
data/shops/unit.toml
Normal file
@ -0,0 +1,300 @@
|
||||
[[unit]]
|
||||
level = 10
|
||||
[[unit.item]]
|
||||
item = "KnightPower"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "PriestMind"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "MarksmanArm"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ThiefLegs"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "DiggerHp"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "WarriorBody"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFire"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistCold"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistShock"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistLight"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistDark"
|
||||
probability = 5
|
||||
|
||||
|
||||
[[unit]]
|
||||
level = 25
|
||||
[[unit.item]]
|
||||
item = "KnightPower"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "PriestMind"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "MarksmanArm"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ThiefLegs"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "DiggerHp"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "WarriorBody"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFire"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistCold"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistShock"
|
||||
probability = 10
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistLight"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistDark"
|
||||
probability = 5
|
||||
|
||||
|
||||
[[unit]]
|
||||
level = 42
|
||||
[[unit.item]]
|
||||
item = "KnightPower"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "PriestMind"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "MarksmanArm"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ThiefLegs"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "DiggerHp"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "WarriorBody"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFire"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistCold"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistShock"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistLight"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistDark"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralPower"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralMind"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralArm"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralLegs"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralHp"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralBody"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFlame"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFreeze"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistThunder"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistSaint"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistEvil"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "HpRestorate"
|
||||
probability = 1
|
||||
|
||||
[[unit.item]]
|
||||
item = "TpRestorate"
|
||||
probability = 1
|
||||
|
||||
[[unit.item]]
|
||||
item = "PbAmplifier"
|
||||
probability = 1
|
||||
|
||||
|
||||
[[unit]]
|
||||
level = 60
|
||||
[[unit.item]]
|
||||
item = "KnightPower"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "PriestMind"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "MarksmanArm"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "ThiefLegs"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "DiggerHp"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "WarriorBody"
|
||||
probability = 3
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFire"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistCold"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistShock"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistLight"
|
||||
probability = 4
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistDark"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralPower"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralMind"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralArm"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralLegs"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralHp"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "GeneralBody"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFlame"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistFreeze"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistThunder"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistSaint"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "ResistEvil"
|
||||
probability = 5
|
||||
|
||||
[[unit.item]]
|
||||
item = "HpRestorate"
|
||||
probability = 2
|
||||
|
||||
[[unit.item]]
|
||||
item = "TpRestorate"
|
||||
probability = 2
|
||||
|
||||
[[unit.item]]
|
||||
item = "PbAmplifier"
|
||||
probability = 2
|
||||
|
||||
|
259
src/ship/shops/armor.rs
Normal file
259
src/ship/shops/armor.rs
Normal file
@ -0,0 +1,259 @@
|
||||
use std::collections::HashMap;
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::path::PathBuf;
|
||||
use serde::Deserialize;
|
||||
use rand::{Rng, SeedableRng};
|
||||
use rand::distributions::{WeightedIndex, Distribution};
|
||||
use rand::seq::{SliceRandom, IteratorRandom};
|
||||
use crate::entity::character::SectionID;
|
||||
use crate::ship::room::Difficulty;
|
||||
use crate::entity::item::armor::ArmorType;
|
||||
use crate::entity::item::shield::ShieldType;
|
||||
use crate::entity::item::unit::UnitType;
|
||||
|
||||
|
||||
enum ShopArmor {
|
||||
Frame(ArmorType, usize),
|
||||
Barrier(ShieldType),
|
||||
Unit(UnitType),
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
struct FrameTierItem {
|
||||
item: ArmorType,
|
||||
probability: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
struct FrameTier {
|
||||
level: usize,
|
||||
item: Vec<FrameTierItem>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct SlotRate {
|
||||
slot: usize,
|
||||
probability: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct FrameTable {
|
||||
frame: Vec<FrameTier>,
|
||||
slot_rate: Vec<SlotRate>,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
struct BarrierTierItem {
|
||||
item: ShieldType,
|
||||
probability: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
struct BarrierTier {
|
||||
level: usize,
|
||||
item: Vec<BarrierTierItem>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct BarrierTable {
|
||||
barrier: Vec<BarrierTier>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
struct UnitTierItem {
|
||||
item: UnitType,
|
||||
probability: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
struct UnitTier {
|
||||
level: usize,
|
||||
item: Vec<UnitTierItem>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct UnitTable {
|
||||
unit: Vec<UnitTier>,
|
||||
}
|
||||
|
||||
|
||||
|
||||
fn load_frame_table() -> FrameTable {
|
||||
let path = PathBuf::from("data/shops/frame.toml");
|
||||
let mut f = File::open(path).unwrap();
|
||||
let mut s = String::new();
|
||||
f.read_to_string(&mut s).unwrap();
|
||||
|
||||
let table: FrameTable = toml::from_str(s.as_str()).unwrap();
|
||||
table
|
||||
}
|
||||
|
||||
fn load_barrier_table() -> BarrierTable {
|
||||
let path = PathBuf::from("data/shops/barrier.toml");
|
||||
let mut f = File::open(path).unwrap();
|
||||
let mut s = String::new();
|
||||
f.read_to_string(&mut s).unwrap();
|
||||
|
||||
let table: BarrierTable = toml::from_str(s.as_str()).unwrap();
|
||||
table
|
||||
}
|
||||
|
||||
fn load_unit_table() -> UnitTable {
|
||||
let path = PathBuf::from("data/shops/unit.toml");
|
||||
let mut f = File::open(path).unwrap();
|
||||
let mut s = String::new();
|
||||
f.read_to_string(&mut s).unwrap();
|
||||
|
||||
let table: UnitTable = toml::from_str(s.as_str()).unwrap();
|
||||
table
|
||||
}
|
||||
|
||||
|
||||
fn number_of_frames_to_generate(character_level: usize) -> usize {
|
||||
if character_level <= 10 {
|
||||
4
|
||||
}
|
||||
else if character_level <= 25 {
|
||||
6
|
||||
}
|
||||
else if character_level <= 42 {
|
||||
7
|
||||
}
|
||||
else {
|
||||
8
|
||||
}
|
||||
}
|
||||
|
||||
fn number_of_barriers_to_generate(character_level: usize) -> usize {
|
||||
if character_level <= 10 {
|
||||
4
|
||||
}
|
||||
else if character_level <= 25 {
|
||||
5
|
||||
}
|
||||
else if character_level <= 42 {
|
||||
6
|
||||
}
|
||||
else {
|
||||
7
|
||||
}
|
||||
}
|
||||
|
||||
fn number_of_units_to_generate(character_level: usize) -> usize {
|
||||
if character_level <= 10 {
|
||||
0
|
||||
}
|
||||
else if character_level <= 25 {
|
||||
3
|
||||
}
|
||||
else if character_level <= 42 {
|
||||
5
|
||||
}
|
||||
else {
|
||||
6
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct ArmorShop<R: Rng + SeedableRng> {
|
||||
frame: FrameTable,
|
||||
barrier: BarrierTable,
|
||||
unit: UnitTable,
|
||||
rng: R,
|
||||
}
|
||||
|
||||
impl<R: Rng + SeedableRng> ArmorShop<R> {
|
||||
pub fn new() -> ArmorShop<R> {
|
||||
ArmorShop {
|
||||
frame: load_frame_table(),
|
||||
barrier: load_barrier_table(),
|
||||
unit: load_unit_table(),
|
||||
rng: R::from_entropy(),
|
||||
}
|
||||
}
|
||||
|
||||
fn generate_frame_list(&mut self, character_level: usize) -> Vec<ShopArmor> {
|
||||
let tier = self.frame.frame.iter()
|
||||
.filter(|t| t.level <= character_level)
|
||||
.last()
|
||||
.cloned()
|
||||
.unwrap();
|
||||
|
||||
let frame_choice = WeightedIndex::new(tier.item.iter().map(|f| f.probability)).unwrap();
|
||||
let slot_choice = WeightedIndex::new(self.frame.slot_rate.iter().map(|sr| sr.probability)).unwrap();
|
||||
(0..number_of_frames_to_generate(character_level))
|
||||
.map(|_| {
|
||||
let frame_detail = tier.item.get(frame_choice.sample(&mut self.rng)).unwrap();
|
||||
let slot = self.frame.slot_rate.get(slot_choice.sample(&mut self.rng)).unwrap();
|
||||
|
||||
ShopArmor::Frame(frame_detail.item, slot.slot)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn generate_barrier_list(&mut self, character_level: usize) -> Vec<ShopArmor> {
|
||||
let tier = self.barrier.barrier.iter()
|
||||
.filter(|t| t.level <= character_level)
|
||||
.last()
|
||||
.cloned()
|
||||
.unwrap();
|
||||
|
||||
let barrier_choice = WeightedIndex::new(tier.item.iter().map(|b| b.probability)).unwrap();
|
||||
(0..number_of_barriers_to_generate(character_level))
|
||||
.map(|_| {
|
||||
let barrier_detail = tier.item.get(barrier_choice.sample(&mut self.rng)).unwrap();
|
||||
|
||||
ShopArmor::Barrier(barrier_detail.item)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn generate_unit_list(&mut self, character_level: usize) -> Vec<ShopArmor> {
|
||||
self.unit.unit.iter()
|
||||
.filter(|t| t.level <= character_level)
|
||||
.last()
|
||||
.cloned()
|
||||
.map(|tier| {
|
||||
let unit_choice = WeightedIndex::new(tier.item.iter().map(|u| u.probability)).unwrap();
|
||||
(0..number_of_units_to_generate(character_level))
|
||||
.map(|_| {
|
||||
let unit_detail = tier.item.get(unit_choice.sample(&mut self.rng)).unwrap();
|
||||
|
||||
ShopArmor::Unit(unit_detail.item)
|
||||
})
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or(Vec::new())
|
||||
}
|
||||
|
||||
pub fn generate_armor_list(&mut self, character_level: usize) -> Vec<ShopArmor> {
|
||||
self.generate_frame_list(character_level).into_iter()
|
||||
.chain(self.generate_barrier_list(character_level).into_iter())
|
||||
.chain(self.generate_unit_list(character_level).into_iter())
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_loading_tool_shop() {
|
||||
ArmorShop::<rand_chacha::ChaCha20Rng>::new();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_generating_some_armor() {
|
||||
let mut fs = ArmorShop::<rand_chacha::ChaCha20Rng>::new();
|
||||
for i in 0..200 {
|
||||
fs.generate_armor_list(i);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,2 +1,3 @@
|
||||
pub mod weapon;
|
||||
pub mod tool;
|
||||
pub mod armor;
|
||||
|
@ -265,4 +265,12 @@ mod test {
|
||||
fn test_loading_tool_shop() {
|
||||
ToolShop::<rand_chacha::ChaCha20Rng>::new();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_generating_some_tools() {
|
||||
let mut ts = ToolShop::<rand_chacha::ChaCha20Rng>::new();
|
||||
for i in 0..200 {
|
||||
ts.generate_tool_list(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -401,4 +401,11 @@ mod test {
|
||||
fn test_loading_weapon_shop() {
|
||||
WeaponShop::<rand_chacha::ChaCha20Rng>::new(Difficulty::Ultimate, SectionID::Pinkal);
|
||||
}
|
||||
#[test]
|
||||
fn test_generating_some_weapons() {
|
||||
let mut ws = WeaponShop::<rand_chacha::ChaCha20Rng>::new(Difficulty::Ultimate, SectionID::Pinkal);
|
||||
for i in 0..200 {
|
||||
ws.generate_weapon(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user