diff --git a/DOCS_fr.md b/DOCS_fr.md index 9a5561c..dd4d7f1 100644 --- a/DOCS_fr.md +++ b/DOCS_fr.md @@ -48,6 +48,25 @@ map0 = """ ######################################################## """ +animations = { + "replace_animations": { + '-': { + "frames": ['=', '-'], + "animation_frame": 0 + }, + '=': { + "frames": ['-', '='], + "animation_frame": 0 + } + }, + "coords_animations": { + "4, 4": { + "frames": ['^', ' '], + "animation_frame": 0 + } + } +} + world = { "dmode": STICKY, "map_num": 0, @@ -56,7 +75,8 @@ world = { "layers": [ { "data": map0, - "transp_char": None + "transp_char": None, + "animations": animations } ], "jumps": [ @@ -105,18 +125,25 @@ world = { * `STICKYBLOCKS` : La carte s'affiche comme dans `BLOCKS`, mais elle remplit toujours l'écran. * `map_num` : Le numéro de la carte sur laquelle on va démarrer le jeu. * `maps` : Une liste de plusieurs cartes, chacune constituée de : - * `layers` : les différentes couches qui contituent les maps. Ces layers sont dessinés du premier au dernier. + * `layers` : les différentes couches qui constituent les maps. Ces layers sont dessinés du premier au dernier. * `data` : Une string qui contient le layer (`map0` dans l'exemple). * `transp_char` : Le caractère qui ne sera pas affiché : permet de voir le layer d'en dessous. Si il est à `None`, aucun caractère ne sera enlevé. + * `animations` (**Optionnel**) : Dictionnaire qui permet d'ajouter des animations à la map constitué de : + * `replace_animations` : Dictionnaire pour les animations où un caractère est remplacé par un autre sur toute la map. Pour chaque caractère qui doit être animé, il faut y ajouter un autre dictionnaire où le nom est le caractère qui doit être animé. Ces dictionnaires sont constitués de : + * `frames` : Liste qui contient les différent caractères qui constituent l'animation. + * `animation_frame` : Quel caractère de l'animation va être affiché. C'est une position dans `frames`. + * `coords_animations` : Dictionnaire pour les animations où un caractère est remplacé par un autre uniquement à une position bien précise. Pour chaque position qui doit être animée, il faut y ajouter un autre dictionnaire où le nom est `"x, y"` où x doit être remplacé par l'abscisse et y par l'ordonnée du caractère qui doit être animé. Ces dictionnaires sont constitués de : + * `frames` : Liste qui contient les différent caractères qui constituent l'animation. + * `animation_frame` : Quel caractère de l'animation va être affiché. C'est une position dans `frames`. * `jumps` : Liste des endroits où le joueur peut sauter d'une map à l'autre et/ou d'une position à l'autre. Cette liste est constituée de dictionnaires constituées de : * `x` et `y` : La position de départ. * `to_x` et `to_y` : La position de d'arrivée. * `to_map` : La map de l'arrivée. - * `isactive` : Bolléen : est ce que ce jump peut téléporter le joueur ? + * `isactive` : Booléen : est ce que ce jump peut téléporter le joueur ? * `npc` : Liste des pnj qui sont des dictionnaires constituée de : * `x` et `y` : Leur position sur la map. * `isvisible` : est ce qu'ils sont visibles. - * `collision_check` : Bolléen : est ce qu'on peut entrer en collision avec eux. + * `collision_check` : Booléen : est ce qu'on peut entrer en collision avec eux. * `layer` : Au dessus de quel layer ils s'affichent. * `map` : Sur quelle map ils sont. * `char` : Quel caractère est utilisé pour les afficher. @@ -141,7 +168,7 @@ player = { * `x` et `y` : Sa position sur la map. * `isvisible` : est ce qu'il est visible. -* `collision_check` : Bolléen : est ce qu'il est stoppé par les objets durs et les pnj. +* `collision_check` : Booléen : est ce qu'il est stoppé par les objets durs et les pnj. * `layer` : Au dessus de quel layer ils s'affiche. La map sur laquelle il est est déjà définie dans `map_num` de `world`. @@ -151,19 +178,19 @@ La map sur laquelle il est est déjà définie dans `map_num` de `world`. `self` est la classe `Scii`. * `mainloop(self)` : Lance la boucle du jeu. -* Déjà uilisés dans mainloop : +* Déjà utilisés dans mainloop : * `get_map_width(self, map_data)` : Retourne la largeur de la map. * `map_data` : dictionnaire de la map comme il est dans `world["maps"]` * `get_map_height(self, map_data)` : Retourne la hauteur de la map. * `map_data` : dictionnaire de la map comme il est dans `world["maps"]` * `draw_map(self, mode, show_player)` * `mode` : Mode de dessin de la map (`STICKY`, `CENTERED`, `BLOCKS` ou `STICKYBLOCKS`) - * `show_player` : Bolléen : est ce que le joueur doit être affiché. + * `show_player` : Booléen : est ce que le joueur doit être affiché. * `def show_text(self, text)` : Affiche du texte. L'historique du texte affiché est disponible en appuyant sur `scii_keys["old_messages"]` ou en appelant `show_old_messages(self)`. * `text` : Texte à afficher. * `portrait` (**Optionnel**) : Affiche un portrait à côté du texte. * `show_old_messages(self)` : Affiche les anciennes conversations. * `ask_choice(self, text, choices)` : Demande à l'utilisateur de faire un choix parmi les choix proposés dans `choices`. Retourne le choix fait. Le premier choix est le numéro 1, et les prochains sont à chaque fois de 1 plus grands : dans `["Oui", "Non", "Je ne sais pas"]` "Oui" est le choix numéro 1, "Non" est le choix numéro 2 et "Je ne sais pas" est le choix numéro 3. * `text` : Texte à afficher avant de demander à l'utilisateur quel proposition il fait. Les choix seront affichés en dessous. - * `choices` : Liste de chaines de caractères des choix que l'utilisateur. - * `portrait` (**Optionnel**) : Affiche un portrait à côté du texte. \ No newline at end of file + * `choices` : Liste de chaînes de caractères des choix que l'utilisateur. + * `portrait` (**Optionnel**) : Affiche un portrait à côté du texte. diff --git a/LIBSCII.py b/LIBSCII.py index 6e288db..5cf4002 100644 --- a/LIBSCII.py +++ b/LIBSCII.py @@ -173,11 +173,22 @@ class Scii: while("" in data): data.remove("") map_width = self.get_map_width(map_data) map_height = self.get_map_height(map_data) + if "animations" in i: + animations = 1 + replace_animations = i["animations"]["replace_animations"] + coords_animations = i["animations"]["coords_animations"] + else: + animations = 0 for y in range(self.screen_height): for x in range(self.screen_width): try: if sx+x >= 0 and sx+x < map_width and sy+y >= 0 and sy+y < map_height: c = data[sy+y][sx+x] + if animations: + if c in replace_animations: + c = replace_animations[c]["frames"][replace_animations[c]["animation_frame"]] + if "{}, {}".format(sx+x, sy+y) in coords_animations: + c = coords_animations["{}, {}".format(sx+x, sy+y)]["frames"][coords_animations["{}, {}".format(sx+x, sy+y)]["animation_frame"]] if c != i["transp_char"]: self._setc(x, y, c) except: pass @@ -185,6 +196,15 @@ class Scii: if npc["layer"] == layerc and npc["map"] == self.map_num and npc["isvisible"]: self._setc(px + (npc["x"] - osx), py + (npc["y"] - osy), npc["char"]) if layerc == self.player["layer"] and show_player: self._setc(px, py, self.player["playerc"]) + if animations: + for key in i["animations"]["replace_animations"]: + i["animations"]["replace_animations"][key]["animation_frame"] += 1 + if i["animations"]["replace_animations"][key]["animation_frame"] >= len(i["animations"]["replace_animations"][key]["frames"]): + i["animations"]["replace_animations"][key]["animation_frame"] = 0 + for key in i["animations"]["coords_animations"]: + i["animations"]["coords_animations"][key]["animation_frame"] += 1 + if i["animations"]["coords_animations"][key]["animation_frame"] >= len(i["animations"]["coords_animations"][key]["frames"]): + i["animations"]["coords_animations"][key]["animation_frame"] = 0 layerc += 1 self._dvram() def show_text(self, text, portrait = None): diff --git a/SCIITEST.py b/SCIITEST.py index 7caadc1..9f8905b 100644 --- a/SCIITEST.py +++ b/SCIITEST.py @@ -19,6 +19,25 @@ portrait = """ / \\ """ +animations = { + "replace_animations": { + '-': { + "frames": ['=', '-'], + "animation_frame": 0 + }, + '=': { + "frames": ['-', '='], + "animation_frame": 0 + } + }, + "coords_animations": { + "4, 4": { + "frames": ['^', ' '], + "animation_frame": 0 + } + } +} + def npc_collision(self, npc): global portrait if npc["name"] == "lephenixnoir": @@ -39,7 +58,8 @@ world = { "layers": [ { "data": map0, - "transp_char": None + "transp_char": None, + "animations": animations } ], "jumps": [ diff --git a/TODO.md b/TODO.md index 60ad35b..340bb53 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,4 @@ # ToDo -- [ ] Animated maps -- [ ] Bigger tiles than one char \ No newline at end of file +* [x] Animated maps +- [ ] Bigger tiles than one char