diff --git a/asci.py b/asci.py index a21e5b3..f1c6491 100644 --- a/asci.py +++ b/asci.py @@ -1,9 +1,12 @@ -# Asci (1.9.1) +# Asci (1.9.2) from math import floor, ceil +SCREEN_WIDTH = 21 +SCREEN_HEIGHT = 7 + class Asci: - def __init__(self, maps, entities, events_mapping, keys_mapping, behaviors=None, screen_width=21, screen_height=7): + def __init__(self, maps, entities, events_mapping, keys_mapping, behaviors=None): # Load maps and entities self.maps = [Map(*i) for i in maps] self.entities = {} @@ -27,7 +30,7 @@ class Asci: for i in behaviors: self._behaviors[i] = behaviors[i] # Screen initialisation - self.screen = Screen(screen_width, screen_height) + self.screen = Screen() self.current_map = None def _looked_case(self, direction): @@ -184,7 +187,7 @@ class Asci: data_copy = self.data[:] for entity in self.current_map.entities.values(): self._behaviors[entity.behavior](entity, data_copy, self.stat, self.screen, walkable) - if entity.map_id == self.data[1] and (0 <= entity.pos_x - self.data[2] + self.screen.pos_player[0] < self.screen.screen_width) and (0 <= entity.pos_y - self.data[3] + self.screen.pos_player[1] < self.screen.screen_height): + if entity.map_id == self.data[1] and (0 <= entity.pos_x - self.data[2] + self.screen.pos_player[0] < SCREEN_WIDTH) and (0 <= entity.pos_y - self.data[3] + self.screen.pos_player[1] < SCREEN_HEIGHT): self.screen.set_cell(entity.pos_x, entity.pos_y, entity.symbol) self.screen.set_cell(self.data[2], self.data[3], player) @@ -219,12 +222,10 @@ class Asci: # Classes used by Asci class Screen: - def __init__(self, screen_width=21, screen_height=7): + def __init__(self): # Screen configuration - self.screen_width = screen_width - self.screen_height = screen_height - self.pos_player = (screen_width // 2, screen_height // 2) - self._on_screen = [[" " for _ in range(screen_width)] for _ in range(screen_height)] + self.pos_player = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2) + self._on_screen = [[" " for _ in range(SCREEN_WIDTH)] for _ in range(SCREEN_HEIGHT)] self._asci_data = [] def load_data(self, data): @@ -240,8 +241,8 @@ class Screen: def set_screen(self): x = self._asci_data[2] - self.pos_player[0] ; y = self._asci_data[3] - self.pos_player[1] - for x_map in range(x, x + self.screen_width): - for y_map in range(y, y + self.screen_height): + for x_map in range(x, x + SCREEN_WIDTH): + for y_map in range(y, y + SCREEN_HEIGHT): self._on_screen[y_map - y][x_map - x] = " " if 0 <= x_map < self.map_width and 0 <= y_map < self.map_height: try: self._on_screen[y_map - y][x_map - x] = self._world[y_map][x_map] @@ -250,7 +251,7 @@ class Screen: def display(self, return_input=True, low_bar=None): for line_no in range(len(self._on_screen)): line = "".join(self._on_screen[line_no]) - if line_no + 1 == self.screen_height and return_input: + if line_no + 1 == SCREEN_HEIGHT and return_input: if not low_bar: line = line[:-6] + ">" else: line = low_bar + ">" print(line, end="") @@ -259,10 +260,10 @@ class Screen: print(line) def clear(self): - print("\n" * self.screen_height) + print("\n" * SCREEN_HEIGHT) def display_text(self, string): - paragraphs = [i for i in text_formater(string, self.screen_width, self.screen_height) if i] + paragraphs = [i for i in text_formater(string, SCREEN_WIDTH, SCREEN_HEIGHT) if i] nb_par = len(paragraphs) for index in range(nb_par): self.clear() @@ -273,13 +274,13 @@ class Screen: def set_cell(self, x, y, value): x = x - (self._asci_data[2] - self.pos_player[0]) y = y - (self._asci_data[3] - self.pos_player[1]) - if 0 <= x < self.screen_width and 0 <= y < self.screen_height: + if 0 <= x < SCREEN_WIDTH and 0 <= y < SCREEN_HEIGHT: self._on_screen[y][x] = value def get_cell(self, x, y): x = x - (self._asci_data[2] - self.pos_player[0]) y = y - (self._asci_data[3] - self.pos_player[1]) - if 0 <= x < self.screen_width and 0 <= y < self.screen_height: + if 0 <= x < SCREEN_WIDTH and 0 <= y < SCREEN_HEIGHT: return self._on_screen[y][x] else: return " " @@ -326,34 +327,35 @@ def convert(string, force_int=False): else: return string -def text_formater(string, screen_width=21, screen_height=6): +def text_formater(string): + screen_displayable_height = SCREEN_HEIGHT - 1 - def line_formater(string, screen_width): + def line_formater(string): string_result = "" - while len(string) > screen_width: - stop_index = screen_width + while len(string) > SCREEN_WIDTH: + stop_index = SCREEN_WIDTH while stop_index > 0 and not string[stop_index].isspace(): stop_index -= 1 - if not stop_index: stop_index = screen_width + if not stop_index: stop_index = SCREEN_WIDTH string_result += string[:stop_index].strip() + "\n" string = string[stop_index:].strip() return string_result + string - def paragraph_formater(lines, screen_height): + def paragraph_formater(lines): paragraphs = "" - while len(lines) >= screen_height: - paragraphs += "\n".join(lines[:screen_height]) + "\n\n" - lines = lines[screen_height:] + while len(lines) >= screen_displayable_height: + paragraphs += "\n".join(lines[:screen_displayable_height]) + "\n\n" + lines = lines[screen_displayable_height:] return paragraphs + "\n".join(lines) lines = [] for line in string.split("\n"): - for formated_line in line_formater(line, screen_width).split("\n"): + for formated_line in line_formater(line).split("\n"): lines.append(formated_line) - return paragraph_formater(lines, screen_height).split("\n\n") + return paragraph_formater(lines).split("\n\n") def read_event(data, event, quest): @@ -473,8 +475,8 @@ def _walk_engine(entity, frame): # Extra functions -def print_text(text, min_value=0, max_value=0, default_value=0, screen_width=21, screen_height=7): - paragraphs = [i for i in text_formater(text, screen_width, screen_height) if i] +def print_text(text, min_value=0, max_value=0, default_value=0): + paragraphs = [i for i in text_formater(text) if i] nb = len(paragraphs) for index in range(nb): print("\n" * 7) @@ -499,4 +501,4 @@ def center(string, total_length, symbol): def enumerate(data): - return [(i, data[i]) for i in range(len(data))] \ No newline at end of file + return [(i, data[i]) for i in range(len(data))]