use crate::game::fingerer::FINGERERS;
use crate::game::powerup::PowerupKind;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Op {
AddPercent,
MulFactor,
FlatAdd,
CostMul,
SpawnRateMul,
EffectMul,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Target {
Fingerer(u8),
AllFingerers,
Click,
PowerupSpawn(PowerupKind),
PowerupReward(PowerupKind),
PowerupDuration(PowerupKind),
Prestige,
GreenCoinStrength,
}
impl Target {
pub fn from_index(idx: usize) -> Self {
let nf = FINGERERS.len();
let kinds = PowerupKind::ALL;
if idx < nf {
return Target::Fingerer(idx as u8);
}
let i = idx - nf;
if i == 0 {
return Target::AllFingerers;
}
if i == 1 {
return Target::Click;
}
if (2..6).contains(&i) {
return Target::PowerupSpawn(kinds[i - 2]);
}
if (6..10).contains(&i) {
return Target::PowerupReward(kinds[i - 6]);
}
if (10..14).contains(&i) {
return Target::PowerupDuration(kinds[i - 10]);
}
if i == 14 {
return Target::Prestige;
}
Target::GreenCoinStrength
}
pub fn target_count() -> usize {
FINGERERS.len() + 16
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Primitive {
pub op: Op,
pub target: Target,
pub magnitude: f64,
}
impl Primitive {
pub fn is_bane(self) -> bool {
match self.op {
Op::AddPercent | Op::FlatAdd => self.magnitude < 0.0,
Op::MulFactor | Op::EffectMul | Op::SpawnRateMul => self.magnitude < 1.0,
Op::CostMul => self.magnitude > 1.0,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn target_from_index_covers_full_range() {
let n = Target::target_count();
let mut seen_fingerer = 0;
let mut seen_all = 0;
let mut seen_click = 0;
let mut seen_prestige = 0;
for i in 0..n {
match Target::from_index(i) {
Target::Fingerer(_) => seen_fingerer += 1,
Target::AllFingerers => seen_all += 1,
Target::Click => seen_click += 1,
Target::Prestige => seen_prestige += 1,
_ => {}
}
}
assert_eq!(seen_fingerer, FINGERERS.len());
assert_eq!(seen_all, 1);
assert_eq!(seen_click, 1);
assert_eq!(seen_prestige, 1);
}
#[test]
fn is_bane_sign_semantics() {
assert!(
!Primitive {
op: Op::AddPercent,
target: Target::Click,
magnitude: 0.10
}
.is_bane()
);
assert!(
Primitive {
op: Op::AddPercent,
target: Target::Click,
magnitude: -0.05
}
.is_bane()
);
assert!(
!Primitive {
op: Op::MulFactor,
target: Target::Click,
magnitude: 2.0
}
.is_bane()
);
assert!(
Primitive {
op: Op::MulFactor,
target: Target::Click,
magnitude: 0.5
}
.is_bane()
);
assert!(
!Primitive {
op: Op::CostMul,
target: Target::Fingerer(0),
magnitude: 0.8
}
.is_bane()
);
assert!(
Primitive {
op: Op::CostMul,
target: Target::Fingerer(0),
magnitude: 1.5
}
.is_bane()
);
assert!(
!Primitive {
op: Op::SpawnRateMul,
target: Target::PowerupSpawn(PowerupKind::Lucky),
magnitude: 1.10
}
.is_bane()
);
assert!(
Primitive {
op: Op::SpawnRateMul,
target: Target::PowerupSpawn(PowerupKind::Lucky),
magnitude: 0.91
}
.is_bane()
);
}
}