|
|
@ -7,7 +7,6 @@ import akka.actor.typed.scaladsl.Behaviors |
|
|
|
import cats.Show |
|
|
|
import cats.kernel.Eq |
|
|
|
import io.estatico.newtype.macros.newtype |
|
|
|
import wow.doge.mygame.game.entities.CharacterStats.HealHealth |
|
|
|
|
|
|
|
final case class CharacterStats( |
|
|
|
hp: CharacterStats.Health, |
|
|
@ -39,17 +38,32 @@ object CharacterStats { |
|
|
|
} |
|
|
|
|
|
|
|
object StatsActor { |
|
|
|
import CharacterStats._ |
|
|
|
|
|
|
|
sealed trait Status |
|
|
|
object Status { |
|
|
|
case object Alive extends Status |
|
|
|
case object Dead extends Status |
|
|
|
} |
|
|
|
|
|
|
|
sealed trait Command |
|
|
|
final case class TakeDamageResult( |
|
|
|
value: CharacterStats.DamageHealth, |
|
|
|
replyTo: ActorRef[(Boolean, CharacterStats)] |
|
|
|
replyTo: ActorRef[(Status, CharacterStats)] |
|
|
|
) extends Command |
|
|
|
final case class ConsumeStaminaResult( |
|
|
|
value: CharacterStats.DamageStamina, |
|
|
|
replyTo: ActorRef[(Boolean, CharacterStats)] |
|
|
|
replyTo: ActorRef[(Status, CharacterStats)] |
|
|
|
) extends Command |
|
|
|
final case class HealHealthResult( |
|
|
|
value: HealHealth, |
|
|
|
replyTo: ActorRef[CharacterStats] |
|
|
|
) extends Command |
|
|
|
|
|
|
|
final case class HealStaminaResult( |
|
|
|
value: HealStamina, |
|
|
|
replyTo: ActorRef[CharacterStats] |
|
|
|
) extends Command |
|
|
|
final case class HealResult(value: HealHealth) extends Command |
|
|
|
final case class CurrentStats(replyTo: ActorRef[CharacterStats]) |
|
|
|
extends Command |
|
|
|
|
|
|
@ -88,27 +102,35 @@ class StatsActor( |
|
|
|
case TakeDamageResult(value, replyTo) => |
|
|
|
val nextState = if ((state.stats.hp - value).toInt <= 0) { |
|
|
|
val s = state.modify(_.stats.hp).setTo(Health(0)) |
|
|
|
replyTo ! true -> s.stats |
|
|
|
replyTo ! Status.Dead -> s.stats |
|
|
|
s |
|
|
|
} else { |
|
|
|
val s = state.modify(_.stats.hp).using(_ - value) |
|
|
|
replyTo ! false -> s.stats |
|
|
|
replyTo ! Status.Alive -> s.stats |
|
|
|
s |
|
|
|
} |
|
|
|
receive(nextState) |
|
|
|
case ConsumeStaminaResult(value, replyTo) => |
|
|
|
val nextState = if ((state.stats.stamina - value).toInt <= 0) { |
|
|
|
val s = state.modify(_.stats.stamina).setTo(Stamina(0)) |
|
|
|
replyTo ! false -> s.stats |
|
|
|
replyTo ! Status.Alive -> s.stats |
|
|
|
s |
|
|
|
} else { |
|
|
|
val s = state.modify(_.stats.stamina).using(_ - value) |
|
|
|
replyTo ! false -> s.stats |
|
|
|
replyTo ! Status.Alive -> s.stats |
|
|
|
s |
|
|
|
} |
|
|
|
receive(nextState) |
|
|
|
case HealResult(value) => |
|
|
|
receive(state.modify(_.stats.hp).using(_ :+ value)) |
|
|
|
case HealHealthResult(value, replyTo) => |
|
|
|
val nextState = receive(state.modify(_.stats.hp).using(_ :+ value)) |
|
|
|
replyTo ! state.stats |
|
|
|
nextState |
|
|
|
|
|
|
|
case HealStaminaResult(value, replyTo) => |
|
|
|
val nextState = receive(state.modify(_.stats.stamina).using(_ :+ value)) |
|
|
|
replyTo ! state.stats |
|
|
|
nextState |
|
|
|
|
|
|
|
case CurrentStats(replyTo) => |
|
|
|
replyTo ! state.stats |
|
|
|
Behaviors.same |
|
|
|