Source code for lab.views.jardim

#! /usr/bin/env python
# -*- coding: UTF8 -*-
# Este arquivo é parte do programa Vittolino
# Copyright 2011-2017 Carlo Oliveira <carlo@nce.ufrj.br>,
# `Labase <http://labase.selfip.org/>`__, `GPL <http://is.gd/3Udt>`__.
#
# Vittolino é um software livre, você pode redistribuí-lo e/ou
# modificá-lo dentro dos termos da Licença Pública Geral GNU como
# publicada pela Fundação do Software Livre (FSF), na versão 2 da
# Licença.
#
# Este programa é distribuído na esperança de que possa ser útil,
# mas SEM NENHUMA GARANTIA, sem uma garantia implícita de ADEQUAÇÃO
# a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU
# junto com este programa, se não, veja em <http://www.gnu.org/licenses/>
"""

ROTEIRO DO GAME JARDIM RADICAL.
=====================================

.. module:: JardimRadical
   :platform: Web
   :synopsis: Aventura no Jardim Botânico.

.. moduleauthor:: Carlo Oliveira <carlo@ufrj.br>

Gerador de labirintos e jogos tipo *'novel'*.


Sequência de forma lógica para o funcionamento do jogo, ou seja, “costurar” as histórias das cenas.

.. seealso::
    `Vitollino em Github <https://github.com/carlotolla/vitollino>`_

"""
from _spy.vitollino.vitollino import STYLE, INVENTARIO, Cena
from _spy.vitollino.vitollino import JOGO

Cena._cria_divs = lambda *_: None
STYLE['width'] = 800
STYLE['min-height'] = "800px"
INVENTARIO.elt.style.width = 800
ACTIV = "https://activufrj.nce.ufrj.br/studio/labase/{}.jpg?disp=inline&size=G"
QUADROS = [list(range(1, 3)), list(range(1, 9)), [1]]

LOCAIS = ['abrico', 'academia', 'aleiapalmeiras', 'bambus', 'bambuzal', 'bromeliario', 'cascata', 'clarisse', 'comoro',
          'entrada', 'gruta', 'guarita', 'herborizada', 'insetivoras', 'jambeiros', 'japones', 'lago', 'macaco',
          'mexicano', 'mirante', 'narciso', 'orquidario', 'ossanha', 'palmeiras', 'pesquisa', 'portal', 'portao',
          'relogio', 'serpabrandao', 'tartarugas', 'tetis', 'tomjobim', 'vitoriaregia', 'xochipili']
MOMENTOS = lz = {l: ["#".join([l, z, l, z]), True, dict(left=0, top=0, width=100, height=100)]
                 for l, z in zip(LOCAIS, LOCAIS[1:])}


[docs]class Config: """ **CONFIGURA** Dicionário de configuração das cenas. :: CONFIGURA = dict(origem=["vestiário#armário#Asseio#Por o avental", True, dict(left=429)) =============================== ============== ========= Origem, Destino, Título e Texto Com Popup Hot Spot =============================== ============== ========= "Origem#Destino#Título#Texto" True or False {"top":1} =============================== ============== ========= **Origem, Destino, Título e Texto** String com partes separadas por **#** **Origem** Nome da cena de origem, precisa ser uma chave de **CONFIGURA** **Destino** Nome da cena de destino, precisa ser uma chave de **CONFIGURA** **Título** Título do popup de texto **Texto** Texto do popup de texto **Com Popup** Determina se vai aparecer o popup de texto na transição de cenas **Hot Spot** Dicionário com as dimensões do hot spot que vai receber o click :: dict(left=429, top=112, width=109, height=300) """ CONFIGURA = { 'origem': ['abrico#academia#abrico#academia', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'abrico': ['abrico#academia#abrico#academia', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'academia': ['academia#aleiapalmeiras#academia#aleiapalmeiras', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'aleiapalmeiras': ['aleiapalmeiras#bambus#aleiapalmeiras#bambus', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'bambus': ['bambus#bambuzal#bambus#bambuzal', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'bambuzal': ['bambuzal#bromeliario#bambuzal#bromeliario', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'bromeliario': ['bromeliario#cascata#bromeliario#cascata', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'cascata': ['cascata#clarisse#cascata#clarisse', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'clarisse': ['clarisse#comoro#clarisse#comoro', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'comoro': ['comoro#entrada#comoro#entrada', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'entrada': ['entrada#gruta#entrada#gruta', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'gruta': ['gruta#guarita#gruta#guarita', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'guarita': ['guarita#herborizada#guarita#herborizada', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'herborizada': ['herborizada#insetivoras#herborizada#insetivoras', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'insetivoras': ['insetivoras#jambeiros#insetivoras#jambeiros', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'jambeiros': ['jambeiros#japones#jambeiros#japones', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'japones': ['japones#lago#japones#lago', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'lago': ['lago#macaco#lago#macaco', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'macaco': ['macaco#mexicano#macaco#mexicano', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'mexicano': ['mexicano#mirante#mexicano#mirante', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'mirante': ['mirante#narciso#mirante#narciso', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'narciso': ['narciso#orquidario#narciso#orquidario', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'orquidario': ['orquidario#ossanha#orquidario#ossanha', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'ossanha': ['ossanha#palmeiras#ossanha#palmeiras', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'palmeiras': ['palmeiras#pesquisa#palmeiras#pesquisa', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'pesquisa': ['pesquisa#portal#pesquisa#portal', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'portal': ['portal#portao#portal#portao', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'portao': ['portao#relogio#portao#relogio', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'relogio': ['relogio#serpabrandao#relogio#serpabrandao', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'serpabrandao': ['serpabrandao#tartarugas#serpabrandao#tartarugas', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'tartarugas': ['tartarugas#tetis#tartarugas#tetis', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'tetis': ['tetis#tomjobim#tetis#tomjobim', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'tomjobim': ['tomjobim#vitoriaregia#tomjobim#vitoriaregia', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}], 'vitoriaregia': ['vitoriaregia#xochipili#vitoriaregia#xochipili', True, {'left': 0, 'top': 0, 'width': 100, 'height': 100}]}
[docs]class PreviaDoMomento: """ Cria um proxi para a cena que ativa os portais somente quando é montrada pelo comando vai. **self.destino** nome da cena que surge ao clicar no portal. **self._destino** objeto cena referente à cena destino, recuperada como atributo da classe Cena. :param jogo: Instância da classe JogoMarcela :param destino: nome da cena destino """ def __init__(self, jogo, destino): """ """ self.destino, self.jogo = destino, jogo self._destino = getattr(JOGO.c, destino) self.nome = self._destino.nome
[docs] def vai(self, *_, **__): """ Mostra a cena destino e configura o portal nela. :param _: captura lista de argumento para evitar erros :param __: captura dicionário de argumento para evitar erros :return: Nenhum """ self.jogo.configura_momentos(self.destino) self._destino.vai(*_, **__)
[docs]class JogoJardim: """ Constroi o jogo completo do Jardim. :param legendas: lista contendo nomes das cenas *[<nome da cena>, ...]* """ def __init__(self, legendas=LOCAIS): self.quadros = legendas telas = {nome: ACTIV.format(nome) for nome in legendas} print({te: ur[-18:] for te, ur in telas.items()}) self._cria_cenas(telas) self._inicia_jogo()
[docs] def configura_momentos(self, cena): """ Configura a cena do momento para ativar seu portal segundo os dados em **CONFIGURA**. **configura_portal_com_texto** Portal decorado com texto. **@JOGO.n.texto** decorador que adiciona um popup de texto. A ação do portal acontece quando se fecha o popup. .. code-block:: python um_portal = configura_portal_com_texto("vestiário", "armário", hot_spot=dict(left=10, top=90)): :param cena: Nome do momento a ser configurado, tem que ser chave de **CONFIGURA**. :return: Proxi da cena construída pela classe interna **PreviaDoMomento**. """ origem_destino_titulo_texto, com_texto, hot = Config.CONFIGURA[cena] origem, destino, titulo, texto = origem_destino_titulo_texto.split("#") origem = getattr(JOGO.c, origem) debug = False @JOGO.n.texto(titulo, texto) def configura_portal_com_texto(origem_, destino_, hot_spot=hot): """ Portal decorado com texto. @JOGO.n.texto decorador que adiciona um popup de texto. A ação do portal acontece quando se fecha o popup. .. code-block:: python um_portal = configura_portal_com_texto("vetiário", "armário", hot_spot=dict(left=10, top=90)): :param origem_: A cena que vai conter o portal. :param destino_: A cena que vai surgir da ação do portal. :param hot_spot: Dicionário que vai configurar o hot spot clicável :return: Portal criado """ return origem_.portal(L=destino_, style=hot_spot, debug_=debug) def configura_portal_sem_texto(origem_, destino_, hot_spot=hot): """ Portal sem texto. .. code-block:: python um_portal = configura_portal_sem_texto("vestiário", "armário", hot_spot=dict(left=10, top=90)): :param origem_: A cena que vai conter o portal. :param destino_: A cena que vai surgir da ação do portal. :param hot_spot: Dicionário que vai configurar o hot spot clicável :return: Portal criado """ return origem_.portal(L=destino_, style=hot_spot) previo_destino = PreviaDoMomento(self, destino) if com_texto: portal_decorado = configura_portal_com_texto(origem, previo_destino) else: portal_decorado = configura_portal_sem_texto(origem, previo_destino) if debug: self._decorador_do_vai_do_texto(portal_decorado) return previo_destino
[docs] @staticmethod def _decorador_do_vai_do_texto(port): """ Decorador do texto para refinamento, publica as dimensões do cursor no popup de texto. :param port: portal que vai ser decorado :return: Nenhum """ formato_do_texto_no_popup = "dict(left={left}, top={top}, width={width}, height={height})" metodo_vai_original = port.texto.vai def decorador_do_metodo_vai_do_texto(*a): """ Intercepta o método vai original, adicionando as dimensões no texto do popup. :param a: Argumentos originais do vai :return: Nenhum """ port.texto.txt = formato_do_texto_no_popup.format( **{k: v[:-2] for k, v in dict(left=port.elt.style.left, top=port.elt.style.top, width=port.elt.style.width, height=port.elt.style.minHeight).items()}) metodo_vai_original(*a) port.texto.vai = lambda *a: decorador_do_metodo_vai_do_texto(*a)
[docs] def _inicia_jogo(self): """ Configura o momento inicial e ativa a primeira tela. :return: Nenhum """ t = JOGO.n(JOGO.c.academia,"oi", "aisawagv iv svjfoj w") print("_inicia_jogo", t) self.configura_momentos("origem").vai() t.esconde = lambda *_: print("aisawagv iv svjfoj w", t.POP.optou) t.mostra("oi", "aisawagv iv svjfoj w", A="eu", B="tu", C="ele")
[docs] @staticmethod def _cria_cenas(cenas): """ Cria um conjunto de objetos **Cena** a partir de um dicionário. Usa a função cria de criar cenas do Vitollino: *JOGO.c.c* :param cenas:dicionário contendo *<nome da cena>: <url da imagem>* :return: cenário, uma lista de quadros criados """ JOGO.c.c(**cenas)
[docs]def main(*_): """ Chamada do jogo, feita a partir do HTML. :param _: Parametros recebidos do HTML :return: Instância do Jogo da Marcela """ return JogoJardim()