This page is out of date

You've reached a page on the Ren'Py wiki. Due to massive spam, the wiki hasn't been updated in over 5 years, and much of the information here is very out of date. We've kept it because some of it is of historic interest, but all the information relevant to modern versions of Ren'Py has been moved elsewhere.

Some places to look are:

Please do not create new links to this page.


# Éste es el molesto comando de releer. Lo he implementado
# porque la gente lo solicitó, no porque me guste.
# Preferiría que uses rollback, que es mucho mejor en todos
# los sentidos.

# Para usar relectura, inserta este archivo en tu directorio del
# juego. Releer te regresa a puntos donde rollback no funciona,
# así que también tendrás que reducir el límite de la variable
# config.hard_rollback_limit o cambiar config.rollback_enabled a
# valor = false

init -100:
     $ config.rollback_enabled = False

# Releer funciona al reemplazar el personaje default y los objetos
# del menú con unos que graben lo que se dijo en buffer de relectura
# El usuario entonces puede volver, y todo lo que se haya dicho se
# va a mostrar de nuevo. Imágenes y opciones no cambiarán, si eso es
# lo que necesitas ¡entonces usa rollback!
# El número de líneas de relectura puede cambiarse asignando un
# número entero a la variable readback_limit
# Dejándola en None dejará el juego completo en el buffer. Como esto
# puede resultar más eficiente, posiblemente lo debas dejar en None

# Releer usa dos estilos, readback_dialogue y readback_thought.
# Cámbialos para que aparezca en distinto color y estilo el texto
# cuando hagas una relectura

# Si quieres agregar tu propio mensaje, como narración, al releer,
# puedes hacerlo llamando la funcion readback o por medio del
# personaje readback que lo diga:

#    $ readback('Mensaje para relecturas solamente.')
#    readback "Mensaje similar."

# Nota: Cuando usas Readback, no puedes usar cadenas para un nombre
# de personaje. Todo el dialogo debe ser relativo a objetos de
# personaje para que se muestren en el buffer de readback. Esta
# limitacion será corregida en versiones futuras de Ren'Py.

init -100:

    python:

        # El límite del número de readbacks a mantener. None quiere
        # decir que no hay límite.
        readback_limit = None

        # Set this to true to print out the contents of the readback
        # buffer when it is saved. 
        readback_debug = False

        # Estilos de Readback.
        style.create('readback_dialogue', 'say_dialogue', '')
        style.create('readback_thought', 'say_thought', '')

        style.readback_dialogue.color = (255, 128, 128, 255)
        style.readback_thought.color = (255, 128, 128, 255)


        # No user-servicable parts below this line. ######################

        # The readback buffer is a doubly-linked list of readback
        # objects. 
        class Readback(object):
            def __init__(self, obj, args):
                self.older = None
                self.newer = None
                self.obj = obj
                self.args = args

            def show(self):
                self.obj.readback(*self.args)


        readback_oldest = None
        readback_newest = None
        readback_count = 0


        # This saves a readback entry to the readback buffer.
        def readback_save(obj, *args):

            store.readback_count += 1

            if readback_limit and readback_count > readback_limit:
                store.readback_count -= 1
                readback_oldest.newer.older = None
                store.readback_oldest = readback_oldest.newer
            
            rb = Readback(obj, args)

            
            if readback_newest:
                readback_newest.newer = rb
            else:
                store.readback_oldest = rb
                
            rb.older = readback_newest

            store.readback_newest = rb


            if readback_debug:

                print "---- Readback Buffer ----"

                rb = readback_oldest
                while rb:
                    print rb.obj, rb.args
                    rb = rb.newer
                

        # The rest of this file is replacing the default objects and
        # functions with versions that save things in the readback
        # buffer.
        
        # Save the old character object.
        readback_OldCharacter = Character
        readback_oldmenu = menu

        class Character(readback_OldCharacter):

            def __init__(self, who,
                         readback_style='readback_dialogue',
                         **kwargs):
                
                readback_OldCharacter.__init__(self, who, **kwargs)
                self.readback_style = readback_style
                
            def __call__(self, what, **kwargs):

                if not self.check_condition():
                    return

                readback_OldCharacter.__call__(self, what, **kwargs)

            def store_readback(self, who, what):
                readback_save(self, who, what)

            def readback(self, who, what):
                self.function(who, what,
                              who_style=self.who_style,
                              what_style=self.readback_style,
                              window_style=self.window_style,
                              interact=False,
                              all_at_once=True,
                              **self.properties)
    
        class Sayer(object):
            def __call__(self, who, what):
                renpy.display_say(who, what)
                readback_save(self, who, what)

            def readback(self, who, what):
                renpy.display_say(who, what,
                                  what_style='readback_dialogue',
                                  all_at_once=True,
                                  interact=False)
                
        
        narrator = Character(None, what_style='say_thought')
        say = Sayer()

        def readback(what):
            narrator.store_readback(None, what)
            
        def menu(menuitems):
            rv = readback_oldmenu(menuitems)

            text = '\n'.join([ l for l, v in menuitems
                               if v is None or v == rv ])

            readback(text)

            return rv

        # This stuff is involved in entering the readback mode.
        
        def readback_mode():
            # Try rollback, first.
            renpy.rollback()

            # If we made it here, we're into readback mode. So let's
            # go there now. 
            
            renpy.call_in_new_context("readback")

        # Add in the readback function.
        config.underlay.append(renpy.Keymap(rollback=readback_mode))


# This label is called in a new context, when the user succesfully
# enters Readback mode.
label readback:

    # If we have an empty readback buffer, go home.
    if not readback_newest:
        return

    python hide:

        rb = readback_newest

        while True:
            
            rb.show()

            ui.add(renpy.Keymap(rollback=lambda : "older",
                                rollforward=lambda : "newer",
                                dismiss=lambda : "dismiss",
                                ))

            res = ui.interact()

            if res == "newer":
                rb = rb.newer
                if not rb:
                    break

            elif res == "older":
                if rb.older:
                    rb = rb.older

            elif res == "dismiss":
                break

    return