diff --git a/src/main/scala/wow/doge/mygame/game/entities/player/PlayerActor.scala b/src/main/scala/wow/doge/mygame/game/entities/player/PlayerActor.scala index 25dfc2e..325c2b4 100644 --- a/src/main/scala/wow/doge/mygame/game/entities/player/PlayerActor.scala +++ b/src/main/scala/wow/doge/mygame/game/entities/player/PlayerActor.scala @@ -40,7 +40,7 @@ object PlayerActor { case object Dead extends Status } - sealed trait Command + sealed trait Command extends Product with Serializable final case class TakeDamage( value: CharacterStats.DamageHealth, replyTo: ActorRef[Unit] @@ -57,8 +57,15 @@ object PlayerActor { replyTo: ActorRef[UIO[Observable[CharacterStats]]] ) extends Command - sealed trait Movement extends Command - final case class MoveLeft(pressed: Boolean) extends Movement + final case class MoveLeft(pressed: Boolean) extends Command + final case class MoveUp(pressed: Boolean) extends Command + final case class MoveRight(pressed: Boolean) extends Command + final case class MoveDown(pressed: Boolean) extends Command + case object Jump extends Command + private[player] final case class HandleMovement( + b: CharacterStats, + pressed: Boolean + ) extends Command private[player] case object Die extends Command private[player] final case class StatsResponse( @@ -102,7 +109,6 @@ object PlayerActor { Behaviors .supervise( new PlayerMovementEventListener.Props( - playerMovementActor, ctx.self, scheduler ).behavior diff --git a/src/main/scala/wow/doge/mygame/game/entities/player/PlayerController.scala b/src/main/scala/wow/doge/mygame/game/entities/player/PlayerController.scala index 3e324ab..0e0238d 100644 --- a/src/main/scala/wow/doge/mygame/game/entities/player/PlayerController.scala +++ b/src/main/scala/wow/doge/mygame/game/entities/player/PlayerController.scala @@ -18,6 +18,8 @@ import wow.doge.mygame.AppError import wow.doge.mygame.executors.Schedulers import wow.doge.mygame.executors.Schedulers.AsyncScheduler import wow.doge.mygame.game.GameApp +import wow.doge.mygame.game.entities.CharacterStats +import wow.doge.mygame.game.entities.StatsActor import wow.doge.mygame.implicits._ import wow.doge.mygame.math.ImVector3f import wow.doge.mygame.subsystems.events.EventsModule.GameEventBus @@ -26,8 +28,6 @@ import wow.doge.mygame.subsystems.events.TickEvent import wow.doge.mygame.subsystems.movement.ImMovementActor import wow.doge.mygame.types._ import wow.doge.mygame.utils.wrappers.jme._ -import wow.doge.mygame.game.entities.StatsActor -import wow.doge.mygame.game.entities.CharacterStats object PlayerController { sealed trait Error diff --git a/src/main/scala/wow/doge/mygame/game/entities/player/PlayerEventListeners.scala b/src/main/scala/wow/doge/mygame/game/entities/player/PlayerEventListeners.scala index d61754f..0549a8c 100644 --- a/src/main/scala/wow/doge/mygame/game/entities/player/PlayerEventListeners.scala +++ b/src/main/scala/wow/doge/mygame/game/entities/player/PlayerEventListeners.scala @@ -2,12 +2,13 @@ package wow.doge.mygame.game.entities.player import scala.concurrent.duration._ -import akka.actor.typed.ActorRef import akka.actor.typed.Behavior import akka.actor.typed.LogOptions import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.AskPattern._ import akka.actor.typed.scaladsl.Behaviors import akka.util.Timeout +import cats.syntax.eq._ import com.typesafe.scalalogging.Logger import monix.eval.Task import monix.execution.CancelableFuture @@ -17,14 +18,11 @@ import wow.doge.mygame.executors.Schedulers import wow.doge.mygame.game.entities.CharacterStats import wow.doge.mygame.implicits._ import wow.doge.mygame.subsystems.events.PlayerMovementEvent -import wow.doge.mygame.subsystems.movement.ImMovementActor -import cats.syntax.eq._ object PlayerMovementEventListener { final case class State(keysPressed: Int, staminaTimer: CancelableFuture[Unit]) class Props( - val movementActor: ActorRef[ImMovementActor.Command], val playerActor: PlayerActor.Ref, val asyncScheduler: Schedulers.AsyncScheduler ) { @@ -97,16 +95,22 @@ class PlayerMovementEventListener( props.playerActor ! PlayerActor.MoveLeft(pressed) receive(handleStamina(pressed)) case PlayerMovedRight(pressed) => - props.movementActor ! ImMovementActor.MoveRight(pressed) + props.playerActor ! PlayerActor.MoveRight(pressed) receive(handleStamina(pressed)) case PlayerMovedForward(pressed) => - props.movementActor ! ImMovementActor.MoveUp(pressed) + props.playerActor ! PlayerActor.MoveUp(pressed) receive(handleStamina(pressed)) case PlayerMovedBackward(pressed) => - props.movementActor ! ImMovementActor.MoveDown(pressed) + props.playerActor ! PlayerActor.MoveDown(pressed) receive(handleStamina(pressed)) case PlayerJumped => - props.movementActor ! ImMovementActor.Jump + props.playerActor ! PlayerActor.Jump + // props.playerActor + // ctx.ask( + // props.playerActor, + // PlayerActor + // .ConsumeStamina(CharacterStats.DamageStamina(1), _) + // )(_ => ()) Behaviors.same // case PlayerTurnedRight => // movementActor ! ImMovementActor.RotateRight diff --git a/src/main/scala/wow/doge/mygame/game/entities/player/behaviors/IdleBehavior.scala b/src/main/scala/wow/doge/mygame/game/entities/player/behaviors/IdleBehavior.scala index fd6c34b..f6cea97 100644 --- a/src/main/scala/wow/doge/mygame/game/entities/player/behaviors/IdleBehavior.scala +++ b/src/main/scala/wow/doge/mygame/game/entities/player/behaviors/IdleBehavior.scala @@ -23,7 +23,6 @@ class IdleBehaviorFactory( deadState: Behavior[PlayerActor.Command], consumptionMultiplier: Int => Int )(implicit timeout: Timeout) { - import IdleBehaviorFactory.IdleBehavior import env._ implicit val sched = ctx.system.scheduler @@ -32,11 +31,46 @@ class IdleBehaviorFactory( IdleBehavior( Behaviors .receiveMessage[PlayerActor.Command] { + + case PlayerActor.HandleMovement(curStats, pressed) => + if (curStats.stamina.toInt > 0) { + children.movementActor ! ImMovementActor.MoveLeft(pressed) + if (pressed) nextStateFn(AliveSubstate.Moving(Walking)) + else nextStateFn(AliveSubstate.Idle) + } else Behaviors.same + case PlayerActor.MoveLeft(pressed) => - children.movementActor ! ImMovementActor.MoveLeft(pressed) - if (pressed) - nextStateFn(AliveSubstate.Moving(Walking)) + implicit val ec = props.scheduler.value + for { + curStats <- children.statsActor.ask(StatsActor.CurrentStats) + res <- Future.successful( + ctx.self ! PlayerActor.HandleMovement(curStats, pressed) + ) + } yield res + Behaviors.same + + case PlayerActor.MoveRight(pressed) => + children.movementActor ! ImMovementActor.MoveRight(pressed) + if (pressed) nextStateFn(AliveSubstate.Moving(Walking)) else nextStateFn(AliveSubstate.Idle) + + case PlayerActor.MoveUp(pressed) => + children.movementActor ! ImMovementActor.MoveUp(pressed) + if (pressed) nextStateFn(AliveSubstate.Moving(Walking)) + else nextStateFn(AliveSubstate.Idle) + + case PlayerActor.MoveDown(pressed) => + children.movementActor ! ImMovementActor.MoveDown(pressed) + if (pressed) nextStateFn(AliveSubstate.Moving(Walking)) + else nextStateFn(AliveSubstate.Idle) + + case PlayerActor.Jump => + children.movementActor ! ImMovementActor.Jump + ctx.self.ask( + PlayerActor.ConsumeStamina(CharacterStats.DamageStamina(10), _) + ) + Behaviors.same + case PlayerActor.TakeDamage(value, replyTo) => implicit val ec = props.scheduler.value for { @@ -47,6 +81,7 @@ class IdleBehaviorFactory( ) } yield () Behaviors.same + case PlayerActor.ConsumeStamina(value, replyTo) => implicit val ec = props.scheduler.value val newValue = @@ -60,15 +95,19 @@ class IdleBehaviorFactory( .StatsResponse(response, replyTo) } yield () Behaviors.same + case PlayerActor.CurrentStats(replyTo) => children.statsActor ! StatsActor.CurrentStats(replyTo) Behaviors.same + case PlayerActor.Heal(value) => children.statsActor ! StatsActor.HealResult(value) Behaviors.same + case PlayerActor.GetStatus(replyTo) => replyTo ! PlayerActor.Status.Alive Behaviors.same + case PlayerActor.GetStatsObservable(replyTo) => import monix.{eval => me} replyTo ! @@ -82,6 +121,7 @@ class IdleBehaviorFactory( ) Behaviors.same + case PlayerActor.StatsResponse(response, replyTo) => response match { case (dead, stats) => @@ -94,8 +134,9 @@ class IdleBehaviorFactory( }(props.scheduler.value) } Behaviors.same - // nextStateFn(InCombat(Moving(Walking))) + case PlayerActor.Die => deadState + case PlayerActor.LogError(ex) => ctx.log.error(ex.getMessage) Behaviors.same @@ -108,8 +149,4 @@ class IdleBehaviorFactory( ) } -object IdleBehaviorFactory { - final case class IdleBehavior( - value: Behavior[PlayerActor.Command] - ) -} +final case class IdleBehavior(value: Behavior[PlayerActor.Command])