package wow.doge.mygame import monix.bio.Task import cats.effect.Resource import io.odin.syntax._ import cats.effect.ExitCode import cats.implicits._ import com.softwaremill.macwire._ import scala.concurrent.duration._ import monix.bio.BIOApp import monix.bio.UIO import monix.bio.IO import io.odin._ import wow.doge.mygame.implicits._ import wow.doge.mygame.game.GameAppResource import io.odin.json.Formatter object Main extends BIOApp with MainModule { import java.util.logging.{Logger => JLogger, Level} JLogger.getLogger("").setLevel(Level.SEVERE) def appResource = for { logger <- consoleLogger().withAsync(timeWindow = 1.milliseconds) |+| fileLogger( "application-log-1.log", Formatter.json ).withAsync(timeWindow = 1.milliseconds) jmeScheduler <- jMESchedulerResource // consoleTextArea <- Resource.liftF(Task(new TextArea())) // consoleStream <- wireWith(JFXConsoleStream.textAreaStream _) (gameApp, gameAppFib) <- { // new BulletAppState() // bas.setThreadingType(Thr) // gameAppResource(new StatsAppState()) wire[GameAppResource].make } // _ <- Resource.liftF(IO(JMERunner.runner = gameApp)) // _ <- Resource.liftF(IO { // new ActorSystemModule {} // }) actorSystem <- wireWith(actorSystemResource _) _ <- Resource.liftF( gameApp.enqueueT(actorSystem ! RootActor.Start(actorSystem.scheduler)) ) // _ <- Resource.liftF { // Task { // implicit val sched = actorSystem.scheduler // implicit val timeout = Timeout(2.seconds) // // val module = new EventsModule {} // } // } // actorSystem <- wireWith(actorSystemResource2 _) // (tickEventBus, playerMovementEventBus) <- wireWith(eventBusesResource _) // rootActor <- wireWith(rootActorResource _) // inputSystemHandler <- { // inputHandlerSystemResource( // GameInputHandler.Props(gameApp.inputManager, playerMovementEventBus) // ) // } // gameSystemsInitializer <- // gameSystemsResource(actorSystem, inputSystemHandler) // _ <- Resource.liftF( // gameApp.enqueueT(rootActor ! RootActor.Start(actorSystem.scheduler)) // ) // _ <- Resource.liftF { // IO(gameApp.start()) // .executeOn(jmeScheduler) // } // (_ => IO(gameApp.stop(() => actorSystem ! RootActor.Stop))) } yield (gameAppFib) def run(args: List[String]): UIO[ExitCode] = { // Console.withOut( // new JFXConsoleStream( // new scalafx.scene.control.TextArea(), // new ByteArrayOutputStream(35) // ) // )(()) appResource .use(_.join) .onErrorHandle(_.printStackTrace()) .as(ExitCode.Success) } }