def show(m, k, b): """Affiche un monstre en effacant la case sur laquelle il était auparavant""" x0, y0 = Background.getOrigin(b) ROWS, COLS = Background.getDimension(b) kx, ky = Knil.getPos(k) x, y = getPos(m) mx, my = x - x0, y - y0 # efface la case précédente if 'previous_case' in m.keys() and m['previous_case'] is not None: px, py = m['previous_case'] if (px, py) != (mx, my): case = Background.getCase(b, px, py) if px >= x0 and px < x0 + COLS and py >= y0 and py < y0 + ROWS: bgcolor = Background.getBgcolor(case) if "brightness" in case.keys(): if Item.exist("flashlight") and Flashlight.isActivated( Item.getFlashlight()): highlighted_case_pos = Flashlight.get_highlighted_case_pos( Item.getFlashlight(), b['map'], x0 + kx, y0 + ky) if (px, py) in highlighted_case_pos: case = Background.highlight_case( case, Item.getFlashlight()) bgcolor = Background.getBgcolor(case, False) color(fontcolor=getColor(m), bgcolor=bgcolor) goto((py - y0) + 1, (px - x0) * 2 + 1) for c in case["c"]: if isinstance(c, str): w(c) else: w(Background.special_carac[c])
def show(b, k): """Affiche la zone de la map à afficher à l'écran, en tenant compte des differents cas particuliers comme la luminosité, ou encore les toits des maisons""" x0, y0 = getOrigin(b) kx, ky = Knil.getPos(k) knil_case = getCase(b, kx+x0, ky+y0) ROWS, COLS = getDimension(b) special_attrib = bool("special_case" in knil_case.keys()) if special_attrib: special_ID = knil_case["special_case"]["attrib"]["id"] if Item.exist("flashlight") and Flashlight.isActivated(Item.getFlashlight()): highlighted_case_pos = Flashlight.get_highlighted_case_pos(Item.getFlashlight(), b['map'], x0+kx, y0+ky) for j in range(ROWS): goto((j+1), 1) for i in range(COLS): case = getCase(b, x0+i, y0+j) if "special_case" in case.keys(): if special_attrib: if special_ID != case["special_case"]["attrib"]["id"]: if "object" in case.keys() and case["object"]: caracs = '!!' case = case["special_case"] # Si la case à un "toit", et si Knil n'est pas sous ce "toit" # Alors la case à afficher est ce "toit" et non la case en dessous # Par contre, si Knil est sous le "toit", il faut enlever tous les "toits" correspondants else: case = case["special_case"]
def move(m, k, b): """Fait bouger un monstre dans la direction de Knil s'il est en vue. Sinon le fait érrer aléatoirement.""" mx, my = getPos(m) x, y = Knil.getPos(k) x0, y0 = Background.getOrigin(b) kx, ky = x + x0, y + y0 v = mx - kx, my - ky if is_Knil_in_room(m, k, b): if Item.exist("flashlight") and Flashlight.isActivated( Item.getFlashlight()): highlighted_case_pos = Flashlight.get_highlighted_case_pos( Item.getFlashlight(), b["map"], kx, ky) if (mx, my) in highlighted_case_pos: return None, False if is_Knil_in_sight(m, k, b): if mx != kx and my != ky and Background.isCrossable( Background.getCase(b, mx - v[0] / abs(v[0]), my - v[1] / abs(v[1]))): m['position'] = mx - v[0] / abs(v[0]), my - v[1] / abs(v[1]) elif mx == kx and my != ky: m['position'] = mx, my - v[1] / abs(v[1]) elif mx != kx and my == ky: m['position'] = mx - v[0] / abs(v[0]), my return (mx, my), m["position"] != (mx, my) else: return wander(m, k, b) else: return None, False
def is_case_highlighted(b, k, x, y): """Teste si une case est éclairée par la lampe""" x0, y0 = getOrigin(b) kx, ky = Knil.getPos(k) if Item.exist("flashlight") and Flashlight.isActivated(Item.getFlashlight()): highlighted_case_pos = Flashlight.get_highlighted_case_pos(Item.getFlashlight(), b['map'], x0+kx, y0+ky) return (x, y) in highlighted_case_pos else: return False
def point(k, steer): """Change le sens de Knil""" global translation direction, sens = translation[steer] front = (sens + 1) + int(direction == "y") if front != k["front"]: k["front"] = front # Change le sens k["c"] = k["graphism"][front] # Met à jour le caractère if is_in_inventory(k, "flashlight"): Flashlight.setAlpha(Item.getFlashlight(), -(k["front"] * pi / 2.) - pi) return True
def execute(execution, k, b, d, q, g): """Execute le(s) résultat(s) d'un évènement""" assert isinstance(execution, str) execution = execution.split("_") assert execution[0] == "execute" if execution[1] == "give": item_name = execution[2] values = execution[3:] Knil.add_inventory(k, Item.summon_item(item_name, values), b, d) generate('event_having_{item_name}'.format(item_name=item_name), q, k, b, d, g) elif execution[1] == "dialog": if execution[2] == 'path': path = "_".join(execution[3:]) file = open(path, 'r') txt = file.read() file.close() speaker = '' else: if len(execution) == 4: speaker = execution[2] txt = execution[3] else: txt = execution[2] speaker = '' Dialog.run_dialog(d, txt=txt, speaker=speaker) elif execution[1] == "grid": if execution[2] == "crossable": x, y = int(execution[3]), int(execution[4]) value = int(execution[5]) Background.setCrossable(Background.getCase(b, x, y), value) elif execution[2] == "addObject": x, y = int(execution[3]), int(execution[4]) id = execution[5] Background.add_object(b, x, y, id) elif execution[2] == "removeObject": x, y = int(execution[3]), int(execution[4]) id = execution[5] Background.remove_object(b, x, y, id) elif execution[1] == "upFashlight": t = float(execution[2]) Flashlight.improve(Item.getFlashlight(), t) elif execution[1] == "endGame": Game.end_game(g)
def summon_item(item_name): global items if item_name == "flashlight": item = Flashlight.create(8, 0, pi/4.) else: item = dict() item['name'] = item_name items[item_name] = item return item
def summon_item(item_name, values): """Crée un item""" global items if item_name == "flashlight": item = Flashlight.create(8, 0, pi/4.) else: if exist(item_name): item_name += '@' + str(len([i for i in items.keys() if item_name in i])) item = dict() item['name'] = item_name if values: item['values'] = values items[item_name] = item return item
def update_Flashlight(g, t): """Fait la mise à jour de la batterie de la lampe. Renvoie True si elle s'eteint à cause d'une panne de batterie, afin de mettre à jour l'écran""" if Knil.is_in_inventory(g['knil'], 'flashlight'): f = Item.getFlashlight() if Flashlight.isActivated(f): Flashlight.update(f, t) Flashlight.show(f, 1, g['ROWS'] + 3) return not Flashlight.isActivated(f) else: False else: return False
# -*- coding: utf-8 -*- import Flashlight import Knil import Background import Dialog from math import pi functions = {"flashlight":lambda flashlight, **kwargs:Flashlight.exe(flashlight), "key":lambda key, k, b, d, **kwargs:open_door(key, k, b, d), "bomb":lambda key, k, b, d, **kwargs:explode(key, k, b, d), "powder": lambda key, k, d, **kwargs:uplife(key, k, d)} items = {} def summon_item(item_name, values): """Crée un item""" global items if item_name == "flashlight": item = Flashlight.create(8, 0, pi/4.) else: if exist(item_name): item_name += '@' + str(len([i for i in items.keys() if item_name in i])) item = dict() item['name'] = item_name if values: item['values'] = values items[item_name] = item return item
goto((py - y0) + 1, (px - x0) * 2 + 1) for c in case["c"]: if isinstance(c, str): w(c) else: w(Background.special_carac[c]) # affiche le monstre en tenant compte de la couleur et de la luminosité de la case sur laquelle il se trouve # si et seulement si il se trouve dans l'écran if x >= x0 and x < x0 + COLS and y >= y0 and y < y0 + ROWS: if is_Knil_in_room(m, k, b): goto(my + 1, mx * 2 + 1) case = Background.getCase(b, x, y) bgcolor = Background.getBgcolor(case) if "brightness" in case.keys(): if Item.exist("flashlight") and Flashlight.isActivated( Item.getFlashlight()): highlighted_case_pos = Flashlight.get_highlighted_case_pos( Item.getFlashlight(), b['map'], x0 + kx, y0 + ky) if (x, y) in highlighted_case_pos: case = Background.highlight_case( case, Item.getFlashlight()) bgcolor = Background.getBgcolor(case, False) color(fontcolor=getColor(m), bgcolor=bgcolor) for c in m["c"]: if isinstance(c, str): w(c) else: w(Background.special_carac[c]) def is_Knil_in_room(m, k, b):
# -*- coding: utf-8 -*- import Flashlight from math import pi functions = {"flashlight":lambda flashlight:Flashlight.exe(flashlight)} items = {} def summon_item(item_name): global items if item_name == "flashlight": item = Flashlight.create(8, 0, pi/4.) else: item = dict() item['name'] = item_name items[item_name] = item return item def exe(item): global functions functions[getName(item)](item) def exist(item_name): global items return item_name in items def getName(item): return item["name"] def getItem(item_name):
caracs = '!!' case = case["special_case"] # Si la case à un "toit", et si Knil n'est pas sous ce "toit" # Alors la case à afficher est ce "toit" et non la case en dessous # Par contre, si Knil est sous le "toit", il faut enlever tous les "toits" correspondants else: case = case["special_case"] if "object" in case.keys() and case["object"]: caracs = '!!' # S'il y a au moins un objet sur la case, alors les caractères à afficher sont des points d'exclamations else: caracs = case['c'] # Sinon les caractères normaux fontcolor = getFontcolor(case) # On récupère les couleurs de la case bgcolor = getBgcolor(case) # en tenant compte de la luminosité si besoin if "brightness" in case.keys(): if Item.exist("flashlight") and Flashlight.isActivated(Item.getFlashlight()): if (x0+i, y0+j) in highlighted_case_pos: # Mais si elle est éclairée par la lampe case = highlight_case(case, Item.getFlashlight()) # Alors on augmente la luminosité fontcolor = getFontcolor(case, False) bgcolor = getBgcolor(case, False) if "object" in case.keys() and case["object"]: # Si un objet est présent red, green, blue = fontcolor # On l'affiche en augmentant sa dose de rouge fontcolor = (min(red*3, 255), green, blue) # (proportionnellement à la luminosité) color(fontcolor=fontcolor, bgcolor=bgcolor) for c in caracs: if isinstance(c, int): # Si le caractère à afficher est un nombre et non un chaîne de caractères w(special_carac[c]) # Alors c'est donc un caracère spécial (encodage différent) correspondant au nombre qu'il faut afficher else: w(c)