Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

main.rs 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. use rand::{ distributions:: {Distribution, Standard}, Rng };
  2. use std::fmt::Debug;
  3. //use dict::{ Dict, DictIface };
  4. //use std::collections::HashMap;
  5. const DBG_LVL: u32 = 0;
  6. fn dbg_print(msg: &impl Debug, lvl: u32) {
  7. if lvl <= DBG_LVL {
  8. println!("{:?}", msg);
  9. }
  10. }
  11. #[derive(Debug, Copy, Clone)]
  12. enum Cls {
  13. Artificer = 0,
  14. Barbarian,
  15. Bard,
  16. Cleric,
  17. Druid,
  18. Fighter,
  19. Monk,
  20. Paladin,
  21. Ranger,
  22. Rogue,
  23. Sorcerer,
  24. Warlock,
  25. Wizard
  26. }
  27. impl Default for Cls {
  28. fn default() -> Self { Cls::Fighter }
  29. }
  30. impl Distribution<Cls> for Standard {
  31. fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Cls {
  32. match rng.gen_range(0..=12) {
  33. 0 => Cls::Artificer,
  34. 1 => Cls::Barbarian,
  35. 2 => Cls::Bard,
  36. 3 => Cls::Cleric,
  37. 4 => Cls::Druid,
  38. 5 => Cls::Fighter,
  39. 6 => Cls::Monk,
  40. 7 => Cls::Paladin,
  41. 8 => Cls::Ranger,
  42. 9 => Cls::Rogue,
  43. 10 => Cls::Sorcerer,
  44. 11 => Cls::Warlock,
  45. 12 => Cls::Wizard,
  46. _ => Cls::Fighter
  47. }
  48. }
  49. }
  50. #[derive(Debug, Default, Copy, Clone)]
  51. struct Character {
  52. class: Cls,
  53. strength: u32,
  54. dexterity: u32,
  55. constitution: u32,
  56. intelligence: u32,
  57. wisdom: u32,
  58. charisma: u32,
  59. }
  60. impl Character {
  61. fn pick_class(&mut self) {
  62. self.class = rand::random();
  63. }
  64. fn gen_stats(&mut self) {
  65. let associated_stats = vec!(
  66. [0,4,3,5,1,2], // Artificer
  67. [5,3,4,0,1,2], // Barbarian
  68. [0,4,1,3,2,5], // Bard
  69. [3,0,4,2,5,1], // Cleric
  70. [1,2,4,3,5,0], // Druid
  71. [5,3,4,2,1,0], // Fighter
  72. [2,5,3,1,4,0], // Monk
  73. [5,1,3,0,2,4], // Paladin
  74. [3,5,2,1,4,0], // Ranger
  75. [1,5,2,4,0,3], // Rogue
  76. [0,1,4,3,2,5], // Sorcerer
  77. [0,1,4,3,2,5], // Warlock
  78. [0,1,3,5,4,2] // Wizard
  79. );
  80. let cls = self.class as u32;
  81. let statblock = associated_stats[cls as usize];
  82. dbg_print(&statblock, 2);
  83. let mut rolled_stats = Vec::new();
  84. while rolled_stats.len() < 6 {
  85. rolled_stats.push(roll_stat());
  86. }
  87. dbg_print(&rolled_stats, 2);
  88. rolled_stats.sort();
  89. dbg_print(&rolled_stats, 2);
  90. self.strength = rolled_stats[statblock[0]];
  91. self.dexterity = rolled_stats[statblock[1]];
  92. self.constitution = rolled_stats[statblock[2]];
  93. self.intelligence = rolled_stats[statblock[3]];
  94. self.wisdom = rolled_stats[statblock[4]];
  95. self.charisma = rolled_stats[statblock[5]];
  96. }
  97. }
  98. fn roll_stat() -> u32 {
  99. let mut rolls = Vec::new();
  100. while rolls.len()<4 {
  101. let mut roll = rand::thread_rng().gen_range(1..=6);
  102. if roll == 1 {
  103. roll = rand::thread_rng().gen_range(1..=6);
  104. }
  105. rolls.push(roll);
  106. }
  107. rolls.sort_by(|a,b| b.cmp(a));
  108. rolls.pop();
  109. rolls.iter().sum()
  110. }
  111. fn main() {
  112. let mut chr: Character = Default::default();
  113. chr.pick_class();
  114. chr.gen_stats();
  115. println!("{:?}", chr);
  116. dbg_print(&(chr.class as u32), 2);
  117. }