Browse Source
Many changes
Many changes
Add player actor substates Added color logic to hud stats barsdevelopment
Rohan Sircar
3 years ago
10 changed files with 301 additions and 152 deletions
-
11src/main/resources/main.css
-
50src/main/scala/wow/doge/mygame/MainApp.scala
-
28src/main/scala/wow/doge/mygame/game/entities/CharacterStats.scala
-
31src/main/scala/wow/doge/mygame/game/entities/character/CharacterStates.scala
-
147src/main/scala/wow/doge/mygame/game/entities/player/PlayerActorSupervisor.scala
-
8src/main/scala/wow/doge/mygame/game/entities/player/PlayerController.scala
-
45src/main/scala/wow/doge/mygame/game/entities/player/PlayerEventListeners.scala
-
115src/main/scala/wow/doge/mygame/game/entities/player/behaviors/IdleBehavior.scala
-
17src/main/scala/wow/doge/mygame/game/subsystems/movement/MovementActor.scala
-
1src/main/scala/wow/doge/mygame/utils/controls/JFXProgressBar.scala
@ -0,0 +1,11 @@ |
|||
.red-bar > .bar { |
|||
-fx-background-color: red; |
|||
} |
|||
|
|||
.green-bar > .bar { |
|||
-fx-background-color: green; |
|||
} |
|||
|
|||
.yellow-bar > .bar { |
|||
-fx-background-color: yellow; |
|||
} |
@ -0,0 +1,31 @@ |
|||
package wow.doge.mygame.game.entities.character |
|||
|
|||
import cats.Show |
|||
import cats.kernel.Eq |
|||
|
|||
object CharacterStates { |
|||
sealed trait AliveSubstate |
|||
object AliveSubstate { |
|||
final case class InCombat(substate: CombatSubstate) extends AliveSubstate |
|||
final case class Moving(substate: MovementSubstate) extends AliveSubstate |
|||
case object Idle extends AliveSubstate |
|||
implicit val eq = Eq.fromUniversalEquals[AliveSubstate] |
|||
implicit val show = Show.fromToString[AliveSubstate] |
|||
} |
|||
|
|||
sealed trait CombatSubstate |
|||
object CombatSubstate { |
|||
final case class Moving(substate: MovementSubstate) extends CombatSubstate |
|||
final case class Attacking(victimName: String) extends CombatSubstate |
|||
} |
|||
|
|||
sealed trait MovementSubstate |
|||
case object Walking extends MovementSubstate |
|||
case object Running extends MovementSubstate |
|||
|
|||
sealed trait DeadSubstate |
|||
object DeadSubstate { |
|||
implicit val eq = Eq.fromUniversalEquals[DeadSubstate] |
|||
implicit val show = Show.fromToString[DeadSubstate] |
|||
} |
|||
} |
@ -0,0 +1,115 @@ |
|||
package wow.doge.mygame.game.entities.player.behaviors |
|||
|
|||
import scala.concurrent.Future |
|||
|
|||
import akka.actor.typed.Behavior |
|||
import akka.actor.typed.PostStop |
|||
import akka.actor.typed.scaladsl.AskPattern._ |
|||
import akka.actor.typed.scaladsl.Behaviors |
|||
import akka.util.Timeout |
|||
import cats.syntax.show._ |
|||
import monix.bio.UIO |
|||
import monix.reactive.Observable |
|||
import wow.doge.mygame.game.entities.CharacterStats |
|||
import wow.doge.mygame.game.entities.StatsActor |
|||
import wow.doge.mygame.game.entities.character.CharacterStates._ |
|||
import wow.doge.mygame.game.entities.player.PlayerActorSupervisor |
|||
import wow.doge.mygame.implicits._ |
|||
import wow.doge.mygame.subsystems.movement.ImMovementActor |
|||
|
|||
class IdleBehaviorFactory( |
|||
env: PlayerActorSupervisor.Env, |
|||
nextStateFn: AliveSubstate => Behavior[PlayerActorSupervisor.Command], |
|||
deadState: Behavior[PlayerActorSupervisor.Command], |
|||
consumptionMultiplier: Int => Int |
|||
)(implicit timeout: Timeout) { |
|||
import IdleBehaviorFactory.IdleBehavior |
|||
import env._ |
|||
|
|||
implicit val sched = ctx.system.scheduler |
|||
|
|||
def behavior = |
|||
IdleBehavior( |
|||
Behaviors |
|||
.receiveMessage[PlayerActorSupervisor.Command] { |
|||
case PlayerActorSupervisor.MoveLeft(pressed) => |
|||
children.movementActor ! ImMovementActor.MoveLeft(pressed) |
|||
if (pressed) |
|||
nextStateFn(AliveSubstate.Moving(Walking)) |
|||
else nextStateFn(AliveSubstate.Idle) |
|||
case PlayerActorSupervisor.TakeDamage(value, replyTo) => |
|||
implicit val ec = props.scheduler.value |
|||
for { |
|||
res <- |
|||
children.statsActor.ask(StatsActor.TakeDamageResult(value, _)) |
|||
_ <- Future.successful( |
|||
ctx.self ! PlayerActorSupervisor.StatsResponse(res, replyTo) |
|||
) |
|||
} yield () |
|||
Behaviors.same |
|||
case PlayerActorSupervisor.ConsumeStamina(value, replyTo) => |
|||
implicit val ec = props.scheduler.value |
|||
val newValue = |
|||
CharacterStats.DamageStamina(consumptionMultiplier(value.toInt)) |
|||
for { |
|||
response <- children.statsActor.ask( |
|||
StatsActor.ConsumeStaminaResult(newValue, _) |
|||
) |
|||
_ = |
|||
ctx.self ! PlayerActorSupervisor |
|||
.StatsResponse(response, replyTo) |
|||
} yield () |
|||
Behaviors.same |
|||
case PlayerActorSupervisor.CurrentStats(replyTo) => |
|||
children.statsActor ! StatsActor.CurrentStats(replyTo) |
|||
Behaviors.same |
|||
case PlayerActorSupervisor.Heal(value) => |
|||
children.statsActor ! StatsActor.HealResult(value) |
|||
Behaviors.same |
|||
case PlayerActorSupervisor.GetStatus(replyTo) => |
|||
replyTo ! PlayerActorSupervisor.Status.Alive |
|||
Behaviors.same |
|||
case PlayerActorSupervisor.GetStatsObservable(replyTo) => |
|||
import monix.{eval => me} |
|||
replyTo ! |
|||
UIO( |
|||
Observable |
|||
.repeatEvalF( |
|||
me.Task.deferFuture(props.statsQueue.poll()) |
|||
) |
|||
.publish(props.fxScheduler.value) |
|||
.refCount |
|||
) |
|||
|
|||
Behaviors.same |
|||
case PlayerActorSupervisor.StatsResponse(response, replyTo) => |
|||
response match { |
|||
case (dead, stats) => |
|||
if (dead) ctx.self ! PlayerActorSupervisor.Die |
|||
props.statsQueue |
|||
.offer(stats) |
|||
.foreach { _ => |
|||
pprint.log(show"Published stats $stats") |
|||
replyTo ! () |
|||
}(props.scheduler.value) |
|||
} |
|||
Behaviors.same |
|||
// nextStateFn(InCombat(Moving(Walking))) |
|||
case PlayerActorSupervisor.Die => deadState |
|||
case PlayerActorSupervisor.LogError(ex) => |
|||
ctx.log.error(ex.getMessage) |
|||
Behaviors.same |
|||
} |
|||
.receiveSignal { |
|||
case (_, PostStop) => |
|||
ctx.log.infoP("stopped") |
|||
Behaviors.same |
|||
} |
|||
) |
|||
} |
|||
|
|||
object IdleBehaviorFactory { |
|||
final case class IdleBehavior( |
|||
value: Behavior[PlayerActorSupervisor.Command] |
|||
) |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue