PageRenderTime 56ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/Tests/mud/game.py

https://gitlab.com/leoDumontier/OnVerraPlusTard
Python | 128 lines | 104 code | 21 blank | 3 comment | 14 complexity | 7ad2c85bc4f61ea47a7b4b8087458361 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2014 Denys Duchier, IUT d'Orléans
  3. #==============================================================================
  4. import os, os.path, yaml, glob
  5. import mud.server
  6. from mud.engine import Engine
  7. from mud.world import World
  8. from mud.db.transcript import TranscriptDB
  9. from mud.db.user import UserDB
  10. from mud.models.mixins.evented import Evented
  11. class Game:
  12. GAMES_DIR = os.path.join(os.path.dirname(__file__), "games")
  13. SAVES_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), ".games")
  14. def yaml_initial_glob(self):
  15. return os.path.join(self.GAMES_DIR, self.name, "*initial*.yml")
  16. def yaml_static_glob(self):
  17. return os.path.join(self.GAMES_DIR, self.name, "*static*.yml")
  18. def yaml_current_filename(self):
  19. return os.path.join(self.SAVES_DIR, self.name, "current.yml")
  20. def transcripts_filename(self):
  21. return os.path.join(self.SAVES_DIR, self.name, "transcripts")
  22. def users_filename(self):
  23. return os.path.join(self.SAVES_DIR, self.name, "users")
  24. def __init__(self, name=None, initial=None, current=None, static=None):
  25. for path in glob.glob("mud/games/projet/*new*.yml"):
  26. os.remove(path)
  27. self._for_reset = {"name" : name ,
  28. "initial": initial,
  29. "current": current,
  30. "static" : static }
  31. self.name = name
  32. self.world = World()
  33. self.static = {}
  34. self.transcripts = TranscriptDB(self.transcripts_filename())
  35. self.users = UserDB(self.users_filename())
  36. self.players = {}
  37. self.engine = None
  38. self._initial = initial
  39. self._current = current
  40. self._static = static
  41. if initial is None:
  42. self._initial = self.yaml_load_all_glob(self.yaml_initial_glob())
  43. if current is None:
  44. self._current = self.yaml_load_all(self.yaml_current_filename())
  45. if static is None:
  46. self._static = self.yaml_load_glob(self.yaml_static_glob())
  47. def yaml_load_all_glob(self, pattern):
  48. l = []
  49. for filename in glob.glob(pattern):
  50. l.extend(self.yaml_load_all(filename))
  51. return l
  52. def yaml_load_all(self, filename):
  53. try:
  54. return list(yaml.load_all(open(filename)))
  55. except FileNotFoundError:
  56. return []
  57. def yaml_load(self, filename):
  58. try:
  59. return yaml.load(open(filename))
  60. except FileNotFoundError:
  61. return {}
  62. def yaml_load_glob(self, pattern):
  63. d = {}
  64. for filename in glob.glob(pattern):
  65. d.update(self.yaml_load(filename))
  66. return d
  67. def game_module_load(self):
  68. import importlib
  69. self.module = importlib.import_module("mud.games.%s" % self.name)
  70. def load(self):
  71. self.game_module_load()
  72. self.users.load()
  73. self.transcripts.load()
  74. self.static.update(self._static)
  75. self.users.create_avatars()
  76. self.world.load(self._initial, self._current)
  77. del self._initial
  78. del self._current
  79. del self._static
  80. def save(self):
  81. contents = self.world.save()
  82. with open(self.yaml_current_filename(), "w") as stream:
  83. yaml.dump_all(contents, stream)
  84. self.transcripts.save()
  85. self.users.save()
  86. def start_for_player(self, player):
  87. init = self.static["start"]
  88. return self.world[init]
  89. def remove(self, filename):
  90. try:
  91. os.remove(filename)
  92. except FileNotFoundError:
  93. pass
  94. def remove_glob(self, filename):
  95. for path in glob.glob(filename):
  96. self.remove(path)
  97. def reset(self):
  98. self.users.reset_avatars()
  99. self.transcripts.reset_players()
  100. self.remove(self.yaml_current_filename())
  101. self.remove_glob(self.transcripts_filename() + ".*")
  102. self.__init__(**self._for_reset)
  103. self.load()
  104. def start(self):
  105. self.engine = Engine()
  106. self.engine.start()
  107. mud.server.main()