|
|
@ -14,11 +14,8 @@ import akka.actor.typed.scaladsl.Behaviors |
|
|
|
import akka.util.Timeout |
|
|
|
import cats.syntax.show._ |
|
|
|
import com.typesafe.scalalogging.Logger |
|
|
|
import monix.eval.Coeval |
|
|
|
import monix.execution.AsyncQueue |
|
|
|
import monix.reactive.Observable |
|
|
|
import monix.reactive.OverflowStrategy |
|
|
|
import monix.reactive.subjects.ConcurrentSubject |
|
|
|
import org.slf4j.event.Level |
|
|
|
import wow.doge.mygame.Dispatchers |
|
|
|
import wow.doge.mygame.executors.Schedulers.AsyncScheduler |
|
|
@ -30,6 +27,8 @@ import wow.doge.mygame.subsystems.events.PlayerEvent |
|
|
|
import wow.doge.mygame.subsystems.events.TickEvent |
|
|
|
import wow.doge.mygame.subsystems.events.TickEvent.RenderTick |
|
|
|
import wow.doge.mygame.subsystems.movement.ImMovementActor |
|
|
|
import wow.doge.mygame.executors.Schedulers |
|
|
|
import monix.bio.UIO |
|
|
|
object PlayerActorSupervisor { |
|
|
|
|
|
|
|
type Ref = ActorRef[PlayerActorSupervisor.Command] |
|
|
@ -54,7 +53,7 @@ object PlayerActorSupervisor { |
|
|
|
extends Command |
|
|
|
final case class GetStatus(replyTo: ActorRef[Status]) extends Command |
|
|
|
final case class GetStatsObservable( |
|
|
|
replyTo: ActorRef[Observable[CharacterStats]] |
|
|
|
replyTo: ActorRef[UIO[Observable[CharacterStats]]] |
|
|
|
) extends Command |
|
|
|
|
|
|
|
private case object Die extends Command |
|
|
@ -62,13 +61,13 @@ object PlayerActorSupervisor { |
|
|
|
response: (Boolean, CharacterStats), |
|
|
|
replyTo: ActorRef[Unit] |
|
|
|
) extends Command |
|
|
|
// private final case class InternalTakeDamage(old: Int, value: Int) extends Command |
|
|
|
private final case class LogError(ex: Throwable) extends Command |
|
|
|
class Props( |
|
|
|
val playerEventBus: GameEventBus[PlayerEvent], |
|
|
|
val tickEventBus: GameEventBus[TickEvent], |
|
|
|
val imMovementActorBehavior: Behavior[ImMovementActor.Command], |
|
|
|
val scheduler: AsyncScheduler |
|
|
|
val scheduler: AsyncScheduler, |
|
|
|
val fxScheduler: Schedulers.FxScheduler |
|
|
|
) { |
|
|
|
def behavior = |
|
|
|
Behaviors.logMessages( |
|
|
@ -142,12 +141,6 @@ object PlayerActorSupervisor { |
|
|
|
ctx, |
|
|
|
this, |
|
|
|
Children(playerMovementActor, playerStatsActor), |
|
|
|
ConcurrentSubject.publish( |
|
|
|
OverflowStrategy.DropOldAndSignal( |
|
|
|
50, |
|
|
|
dropped => Coeval.pure(None) |
|
|
|
) |
|
|
|
)(scheduler.value), |
|
|
|
AsyncQueue.bounded(10)(scheduler.value) |
|
|
|
).aliveState |
|
|
|
} |
|
|
@ -164,7 +157,6 @@ class PlayerActorSupervisor( |
|
|
|
ctx: ActorContext[PlayerActorSupervisor.Command], |
|
|
|
props: PlayerActorSupervisor.Props, |
|
|
|
children: PlayerActorSupervisor.Children, |
|
|
|
statsSubject: ConcurrentSubject[CharacterStats, CharacterStats], |
|
|
|
statsQueue: AsyncQueue[CharacterStats] |
|
|
|
) { |
|
|
|
import PlayerActorSupervisor._ |
|
|
@ -173,11 +165,6 @@ class PlayerActorSupervisor( |
|
|
|
Behaviors |
|
|
|
.receiveMessage[Command] { |
|
|
|
case TakeDamage(value, replyTo) => |
|
|
|
// children.movementActor ! ImMovementActor.MovedDown(true) |
|
|
|
// ctx.ask(children.statsActor, StatsActor.CurrentStats(_)) { |
|
|
|
// case Success(status) => InternalTakeDamage(status.hp, value) |
|
|
|
// case Failure(ex) => LogError(ex) |
|
|
|
// } |
|
|
|
ctx.ask(children.statsActor, StatsActor.TakeDamageResult(value, _)) { |
|
|
|
case Success(response) => DamageResponse(response, replyTo) |
|
|
|
case Failure(ex) => LogError(ex) |
|
|
@ -193,7 +180,6 @@ class PlayerActorSupervisor( |
|
|
|
} |
|
|
|
Behaviors.same |
|
|
|
case CurrentStats(replyTo) => |
|
|
|
// ctx.ask(children.statsActor, StatsActor.CurrentStats()) |
|
|
|
children.statsActor ! StatsActor.CurrentStats(replyTo) |
|
|
|
Behaviors.same |
|
|
|
case Heal(value) => |
|
|
@ -202,18 +188,18 @@ class PlayerActorSupervisor( |
|
|
|
case GetStatus(replyTo) => |
|
|
|
replyTo ! Status.Alive |
|
|
|
Behaviors.same |
|
|
|
// case _ => Behaviors.unhandled |
|
|
|
// case InternalTakeDamage(hp, damage) => |
|
|
|
// if (hp - damage <= 0) dead |
|
|
|
// else { |
|
|
|
// children.statsActor ! StatsActor.TakeDamage(damage) |
|
|
|
// Behaviors.same |
|
|
|
// } |
|
|
|
case GetStatsObservable(replyTo) => |
|
|
|
import monix.{eval => me} |
|
|
|
replyTo ! Observable.repeatEvalF( |
|
|
|
me.Task.deferFuture(statsQueue.poll()) |
|
|
|
) |
|
|
|
replyTo ! |
|
|
|
UIO( |
|
|
|
Observable |
|
|
|
.repeatEvalF( |
|
|
|
me.Task.deferFuture(statsQueue.poll()) |
|
|
|
) |
|
|
|
.publish(props.fxScheduler.value) |
|
|
|
.refCount |
|
|
|
) |
|
|
|
|
|
|
|
Behaviors.same |
|
|
|
case DamageResponse(response, replyTo) => |
|
|
|
response match { |
|
|
@ -235,7 +221,6 @@ class PlayerActorSupervisor( |
|
|
|
.receiveSignal { |
|
|
|
case (_, PostStop) => |
|
|
|
ctx.log.infoP("stopped") |
|
|
|
statsSubject.onComplete() |
|
|
|
Behaviors.same |
|
|
|
} |
|
|
|
val deadState = Behaviors |
|
|
@ -262,7 +247,6 @@ class PlayerActorSupervisor( |
|
|
|
.receiveSignal { |
|
|
|
case (_, PostStop) => |
|
|
|
ctx.log.infoP("stopped") |
|
|
|
statsSubject.onComplete() |
|
|
|
Behaviors.same |
|
|
|
} |
|
|
|
} |