This repository has been archived on 2022-12-03. You can view files and clone it, but cannot push or open issues or pull requests.
texty/lib/game.py
2022-01-26 09:23:30 +01:00

82 lines
3.2 KiB
Python

import yaml
from yaml.loader import SafeLoader
from colorama import Fore, Back, Style
import re
from .ascii import AsciiAnimation
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 = AsciiAnimation()
animation.load_ascii(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