Room levels 2 and 3, researched in the library: a quarter better each, brighter, with gold trim
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f7b550a6b1
commit
9b49bc2c9d
23 files changed
+171
-10
No files matched your search
+72
-1
@@ -46,6 +46,26 @@ pub const RESEARCH: &[(usize, f32)] = &[
|
||||
(51, 1000.0), // catapult
|
||||
];
|
||||
|
||||
// room levels, researched once everything else is known: (index in ROOM_KINDS, level, points)
|
||||
pub const UPGRADES: &[(usize, u8, f32)] = &[
|
||||
(1, 2, 500.0), // lair
|
||||
(2, 2, 500.0), // mushroom garden
|
||||
(0, 2, 550.0), // treasury
|
||||
(4, 2, 600.0), // library
|
||||
(3, 2, 600.0), // training hall
|
||||
(8, 2, 650.0), // forge
|
||||
(6, 2, 650.0), // temple
|
||||
(7, 2, 650.0), // aerie
|
||||
(1, 3, 1000.0), // lair
|
||||
(2, 3, 1000.0), // mushroom garden
|
||||
(0, 3, 1100.0), // treasury
|
||||
(4, 3, 1200.0), // library
|
||||
(3, 3, 1200.0), // training hall
|
||||
(8, 3, 1300.0), // forge
|
||||
(6, 3, 1300.0), // temple
|
||||
(7, 3, 1300.0), // aerie
|
||||
];
|
||||
|
||||
// known from the start in free play
|
||||
pub const BASE_TOOLS: &[usize] = &[0, 1, 2, 3, 4, 6, 7, 8, 9, 14, 17, 20, 45, 46, 49];
|
||||
|
||||
@@ -92,13 +112,45 @@ impl Game {
|
||||
!self.known(tool) && self.researchable.get(tool).copied().unwrap_or(false) && RESEARCH.iter().any(|&(t, _)| t == tool)
|
||||
}
|
||||
|
||||
// the room level being researched once no tool is left: index in UPGRADES
|
||||
pub fn upgrade_target(&self) -> Option<usize> {
|
||||
if self.research_target().is_some() || self.known.is_empty() {
|
||||
return None;
|
||||
}
|
||||
UPGRADES.iter().position(|&(r, lv, _)| self.room_level.get(r).copied().unwrap_or(1).max(1) < lv)
|
||||
}
|
||||
|
||||
pub(crate) fn add_research(&mut self, points: f32) {
|
||||
if self.research_target().is_some() {
|
||||
if self.research_target().is_some() || self.upgrade_target().is_some() {
|
||||
self.research += points;
|
||||
}
|
||||
}
|
||||
|
||||
// a room kind reached level `lv` (the map keeps it for the look of the rooms)
|
||||
pub fn set_room_level(&mut self, r: usize, lv: u8) {
|
||||
if self.room_level.len() < crate::game::N_ROOMS {
|
||||
self.room_level.resize(crate::game::N_ROOMS, 1);
|
||||
}
|
||||
self.room_level[r] = lv;
|
||||
let side = self.me_side;
|
||||
self.map.upgrades.retain(|u| !(u.0 == side && u.1 as usize == r));
|
||||
if lv > 1 {
|
||||
self.map.upgrades.push((side, r as u8, lv));
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn update_research(&mut self) {
|
||||
if let Some(u) = self.upgrade_target() {
|
||||
let (r, lv, cost) = UPGRADES[u];
|
||||
if self.research >= cost {
|
||||
self.research -= cost;
|
||||
self.set_room_level(r, lv);
|
||||
let roman = if lv == 2 { "II" } else { "III" };
|
||||
self.msg("msg.room_upgraded", vec![format!("@{}", crate::game::ROOM_NAMES[r]), roman.to_string()]);
|
||||
self.sfx_ui(Sfx::LevelUp);
|
||||
}
|
||||
return;
|
||||
}
|
||||
let Some(k) = self.research_target() else { return };
|
||||
let (tool, cost) = RESEARCH[k];
|
||||
if self.research >= cost {
|
||||
@@ -154,4 +206,23 @@ mod tests {
|
||||
assert!(g.can_research(10), "heal comes soon and can be researched");
|
||||
assert!(!g.can_research(31), "magic doors are far away");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn once_everything_is_known_the_library_raises_room_levels() {
|
||||
let mut g = Game::new(9, 64, 64);
|
||||
assert!(g.upgrade_target().is_none(), "tools first");
|
||||
for v in g.known.iter_mut() {
|
||||
*v = true;
|
||||
}
|
||||
let u = g.upgrade_target().expect("a room level to research");
|
||||
let (r, lv, cost) = UPGRADES[u];
|
||||
assert_eq!(lv, 2);
|
||||
let before = g.room_bonus(ROOM_KINDS[r]);
|
||||
g.research = cost + 1.0;
|
||||
g.update_research();
|
||||
assert_eq!(g.room_level_of(ROOM_KINDS[r]), 2);
|
||||
assert!(g.room_bonus(ROOM_KINDS[r]) > before);
|
||||
assert!(g.map.upgrades.iter().any(|x| x.1 as usize == r && x.2 == 2), "the map shows it");
|
||||
assert_ne!(g.upgrade_target(), Some(u), "the next one");
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user