Testing out JmonkeyEngine to make a game in Scala with Akka Actors within a pure FP layer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.5 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
  1. package wow.doge.mygame.subsystems.scriptsystem
  2. import akka.actor.typed.ActorRef
  3. import akka.actor.typed.Scheduler
  4. import akka.actor.typed.SpawnProtocol
  5. import akka.util.Timeout
  6. import monix.bio.Task
  7. import wow.doge.mygame.scriptsystem.ScriptCachingActor
  8. import wow.doge.mygame.utils.AkkaUtils
  9. /**
  10. * Scripts can either be searched and compiled at startup (Eager mode)
  11. * or compiled on demand (Lazy mode)
  12. */
  13. sealed trait ScriptInitMode
  14. object ScriptInitMode {
  15. case object Eager extends ScriptInitMode
  16. case object Lazy extends ScriptInitMode
  17. }
  18. class ScriptSystemResource(
  19. path: os.Path,
  20. mode: ScriptInitMode = ScriptInitMode.Lazy
  21. )(implicit
  22. spawnProtocol: ActorRef[SpawnProtocol.Command],
  23. timeout: Timeout,
  24. scheduler: Scheduler
  25. ) {
  26. val init = for {
  27. scriptFiles <- Task(
  28. findScriptFiles(os.pwd / "assets" / "scripts")
  29. ).hideErrors
  30. scriptCacheActor <- AkkaUtils.spawnActorL(
  31. ScriptCachingActor(),
  32. "scriptCachingActor"
  33. )
  34. } yield scriptCacheActor
  35. def findScriptFiles(wd: os.Path) =
  36. os.walk
  37. .stream(wd)
  38. .filter(p =>
  39. os.isFile(p) &&
  40. (p.ext == "sc" || (p.baseName + "." + p.ext)
  41. .contains(".main.kts") || p.ext == "groovy")
  42. )
  43. .toList
  44. // def findExternalScriptFiles =
  45. // findScriptFiles(os.pwd / "assets" / "scripts")
  46. // def findInternalScriptFiles =
  47. // findScriptFiles((os.resource / "assets" / "scripts"))
  48. // def finalInternalScriptFiles =
  49. }
  50. // pwd / 'src / 'main / 'resources / 'assets / 'scripts