package wow.doge.mygame.game import akka.actor.typed.ActorRef import akka.actor.typed.SpawnProtocol import cats.effect.Resource import com.jme3.app.StatsAppState import com.jme3.system.AppSettings import io.odin.Logger import monix.bio.Fiber import monix.bio.IO import monix.bio.Task import monix.execution.Scheduler import wow.doge.mygame.executors.Schedulers import wow.doge.mygame.game.subsystems.input.GameInputHandler class GameAppResource( logger: Logger[Task], jmeScheduler: Scheduler, schedulers: Schedulers ) { def get2: Resource[Task, (GameApp2, Fiber[Throwable, Unit])] = Resource.make( for { _ <- logger.info("Creating game app") app <- Task(new GameApp(schedulers, new StatsAppState())) app2 <- Task { val settings = new AppSettings(true) settings.setVSync(true) settings.setUseInput(true) // new FlyCamAppState // settings.setFrameRate(250) app.setSettings(settings) // JMERunner.runner = app // app new GameApp2(app) } fib <- app2.start.executeOn(jmeScheduler).start } yield (app2 -> fib) )(logger.info("Closing game app") >> _._2.cancel) def get: Resource[Task, GameApp2] = Resource.make( for { _ <- logger.info("Creating game app") app <- Task(new GameApp(schedulers, new StatsAppState())) app2 <- Task { val settings = new AppSettings(true) settings.setVSync(true) /** * disables the launcher * We'll be making our own launcher anyway */ app.setShowSettings(false) app.setSettings(settings) // JMERunner.runner = app new GameApp2(app) } // fib <- app2.start.executeOn(jmeScheduler).start } yield (app2) )(_ => logger.info("Closing game app")) } trait GameModule { def gameAppResource( logger: Logger[Task], jmeScheduler: Scheduler, schedulers: Schedulers ): Resource[Task, (GameApp, Fiber[Throwable, Unit])] = Resource.make( (for { _ <- logger.info("Creating game app") app <- Task(new GameApp(schedulers)) _ <- Task { val settings = new AppSettings(true) settings.setVSync(true) // settings.setFrameRate(250) app.setSettings(settings) // JMERunner.runner = app app } fib <- Task(app.start()).executeOn(jmeScheduler).start } yield (app -> fib)) )(_._2.cancel) def inputHandlerSystemResource( props: GameInputHandler.Props ): Resource[Task, Task[Unit]] = Resource.liftF { Task.evalAsync(props.begin) } def gameSystemsResource( spawnProtocol: ActorRef[SpawnProtocol.Command], gameSystems: Task[Unit]* ): Resource[Task, List[Unit]] = Resource.liftF(IO.defer(Task.parSequence(gameSystems))) }