feat(kampf): Inventar im Kampf erreichbar
'i' oeffnet denselben Screen wie draussen. `rejects` hat `UseItem` im Kampf nie verboten — es fehlte nur die Tuer in der UI. Dabei: Ein Gegenstand traf `Enemy(0)`, auch wenn der schon tot war. Jetzt der erste lebende. Dass er den Zielcursor ignoriert, steht als TODO — es faellt erst mit dem ersten Wurfgegenstand auf.
This commit is contained in:
@@ -892,10 +892,13 @@ impl Game {
|
||||
let Some(def) = reg.items.get(&inst.def) else { return };
|
||||
|
||||
let name = self.item_label(&inst, reg);
|
||||
let target = if self.enemies.is_empty() {
|
||||
CreatureRef::Player
|
||||
} else {
|
||||
CreatureRef::Enemy(0)
|
||||
// TODO(M5): Ein Gegenstand trifft immer den ersten Gegner. Seit der
|
||||
// Kampf-Screen einen Zielcursor hat, ist das eine Luecke —
|
||||
// sie faellt erst auf, wenn `core` den ersten Wurfgegenstand
|
||||
// bekommt. Dann traegt `UseItem` ein Ziel wie `UseAbility`.
|
||||
let target = match self.enemies.iter().position(|e| e.is_alive()) {
|
||||
Some(i) => CreatureRef::Enemy(i),
|
||||
None => CreatureRef::Player,
|
||||
};
|
||||
for action in &def.actions {
|
||||
self.apply(action, CreatureRef::Player, target, reg);
|
||||
@@ -1749,4 +1752,23 @@ mod tests {
|
||||
assert!(game.enemies.is_empty());
|
||||
assert!(game.journal.iter().any(|z| z.contains("geräumt")), "{:?}", game.journal);
|
||||
}
|
||||
|
||||
/// Im Kampf trinken zu koennen ist eine Entscheidung — Zug gegen Leben.
|
||||
/// Der Spielkern hat es immer erlaubt, nur der Kampf-Screen hatte keine
|
||||
/// Taste dafuer; der Test haelt fest, dass die Erlaubnis echt ist.
|
||||
#[test]
|
||||
fn ein_trank_im_kampf_kostet_einen_zug() {
|
||||
let (mut game, reg) = zwergenkrieger();
|
||||
let ratte = reg.creatures.get("core:rat").expect("Riesenratte");
|
||||
game.enemies = vec![Creature::from_def(ratte)];
|
||||
game.give(ItemInstance::stack("core:health_potion", 2), ®);
|
||||
let platz = game.player.inventory.len() - 1;
|
||||
game.player.health = 10.0;
|
||||
|
||||
let vorher = game.turn;
|
||||
assert!(matches!(game.execute(Command::UseItem(platz), ®), Outcome::TurnPassed));
|
||||
assert!(game.player.health > 10.0, "der Trank wirkt auch im Kampf");
|
||||
assert_eq!(game.turn, vorher + 1, "und er kostet den Zug");
|
||||
assert_eq!(game.count_of("core:health_potion"), 1);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user