82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
import yaml
|
|
from yaml.loader import SafeLoader
|
|
from colorama import Fore, Back, Style
|
|
import re
|
|
from .ascii import ascii_art
|
|
from time import sleep
|
|
from os import system
|
|
|
|
class Game:
|
|
def __init__(self,data:dict):
|
|
self.name = data["meta"]["name"]
|
|
self.author = data["meta"]["creator"]
|
|
self.current = "start"
|
|
self.nodes = {}
|
|
for k in data["game"]:
|
|
self.nodes.update({k:data["game"][k]})
|
|
|
|
def make_selection(self,selection:int) -> bool:
|
|
if(type(selection) != int or selection >= len(self.nodes[self.current]["actions"]) or selection < 0):
|
|
print("Invalid selection")
|
|
return False
|
|
else:
|
|
self.current = self.nodes[self.current]["actions"][selection]
|
|
return True
|
|
|
|
def print_text(self):
|
|
'''
|
|
Used to print out the current prompt with the options
|
|
'''
|
|
animated = re.search(r"(?!{).+(?=})",self.nodes[self.current]["text"]) # find the animated text
|
|
if(animated != None):
|
|
self.print_animated(animated.group(0))
|
|
self.nodes[self.current]["text"] = self.nodes[self.current]["text"].replace("{"+animated.group(0)+"}","") # remove the animated text from the text prompt
|
|
print(self.parse_colors(self.nodes[self.current]["text"]))
|
|
print("")
|
|
ostring = ""
|
|
if("actions" in self.nodes[self.current].keys()):
|
|
for i,option in enumerate(self.nodes[self.current]["actions"]):
|
|
ostring+=f"{i} - {self.nodes[option]['description']}\n"
|
|
print(ostring)
|
|
sel = input("Make a selection (number): ")
|
|
isWrong = self.make_selection(int(sel))
|
|
while isWrong == False:
|
|
sel = input("Make a selection (number): ")
|
|
isWrong = self.make_selection(sel)
|
|
self.print_text()
|
|
|
|
def print_animated(self,animid):
|
|
'''
|
|
Used to print out animated text,
|
|
currently only prints out the first occurence of an animated text
|
|
(in curly braces)
|
|
'''
|
|
animation = ascii_art(animid)
|
|
for frame in animation:
|
|
system("cls||clear")
|
|
print(frame)
|
|
sleep(0.2)
|
|
print()
|
|
|
|
|
|
def parse_colors(self,text:str) -> str:
|
|
'''
|
|
Used to convert color codes in string to colors from the colorama lib
|
|
'''
|
|
newText = text.replace("&b",Fore.CYAN).replace("&c",Fore.RED).replace("&e", Fore.YELLOW).replace("&a",Fore.GREEN).replace("&9",Fore.BLUE).replace("&r",Fore.RESET).replace("&f",Fore.WHITE).replace("&5",Fore.MAGENTA).replace("\n",Fore.RESET + "\n") # replace color codes and newlines with colorama
|
|
newText += Fore.RESET # reset color at the end of the text
|
|
return newText
|
|
|
|
|
|
def load(file_path):
|
|
'''Loads the game from a YAML file to a Game class'''
|
|
try:
|
|
with open(file_path) as f:
|
|
data = yaml.load(f,Loader=SafeLoader)
|
|
g = Game(data)
|
|
return g
|
|
except Exception as e:
|
|
print(f"{Back.RED}{Fore.WHITE}An exception has occured while loading the game from the YAML file:{Fore.RESET}{Back.RESET}")
|
|
print(e)
|
|
return None
|