# Этот файл содержит код, демонстрирующий работу функций UI.

init:
    # Переменная, где будет храниться имя пользователя.
    $ povname = u"Аноним"

    # И DynamicCharacter с именем, содержащимся в povname.
    $ pov = DynamicCharacter("povname", color=(192, 64, 64, 255))

    
    # Это код своего рода планировщика распорядка на день. Честно
    # говоря, код в демо-игре dse несколько лучше. Считайте это
    # примером того, ещё Ren'Py умеет.
    python:
        def day_planner():

            periods = [ u'Утром', u'В полдень', u'Вечером' ]
            choices = [ u'Учёба', u'Спорт',
                        u'Еда ', u'Сон ', u'Игры' ]

            plan = { u'Утром' : u'Еда ',
                     u'В полдень' : u'Сон ',
                     u'Вечером' : u'Игры' }

            day = u'25ое Марта'

            stats = [
                (u'Сила', 100, 10),
                (u'Ум', 100, 25),
                (u'Настроение', 100, 100),
                (u'Энергия', 100, 75),
                ]

            editing = None

            def button(text, selected, returns, **properties):
                    
                if selected:
                    role='selected_'
                else:
                    role=''

                ui.button(clicked=ui.returns(returns),
                          style='button', role=role, **properties)
                ui.text(text, style='button_text')


            while True:

                # Окно параметров
                ui.frame(xpos=0,
                         ypos=0,
                         xanchor='left',
                         yanchor='top',
                         xfill=True,
                         )

                ui.vbox()

                ui.text(u'Параметры')
                ui.null(height=20)

                for name, range, value in stats:

                    ui.hbox()
                    ui.text(name, minwidth=150)
                    ui.bar(range, value, ypos=0.5, yanchor='center')
                    ui.close()

                ui.close()
                
                # Окно выбора периода.
                ui.frame(xpos=0,
                         ypos=200,
                         xanchor='left',
                         yanchor='top',
                         xfill=False,
                         xminimum=300
                         )
                
                ui.vbox(xpos=0.5, xanchor='center')
                ui.text(day, xpos=0.5, xanchor='center', textalign=0.5)
                ui.null(height=20)
                
                for i in periods:
                    face = i + ": " + plan[i]
                    button(face, editing == i, ("edit", i), xminimum=250)

                ui.null(height=20)
                ui.textbutton(u"Продолжить", clicked=ui.returns(("done", True)), xminimum=250)
                ui.null(height=20)
                ui.close()


                # Окно выбора действия.
                if editing:
                    ui.frame(xpos=300,
                              ypos=200,
                              xanchor='left',
                              yanchor='top',
                              xfill=False,
                              xminimum=500
                              )
                
                    ui.vbox()
                    ui.text(u"Чем займётесь %s?" % editing.lower())
                    ui.null(height=20)

                    for i in choices:
                        button(i, plan[editing] == i, ("set", i),
                               xpos=0, xanchor='left')

                    ui.close()

                # Window at the bottom.
                ui.window()
                ui.vbox()
                ui.text(u"Чтобы перейти на следующий экран, нажмите кнопку 'Продолжить'.")
                ui.close()

                type, value = ui.interact()

                if type == "done":
                    break

                if type == "edit":
                    editing = value

                if type == "set":
                    plan[editing] = value
                    editing = None

            return plan

init python:

    def stats_frame(name, level, hp, maxhp, **properties):

        ui.frame(xfill=False, yminimum=None, **properties)

        ui.hbox() # (name, "HP", bar) from (level, hp, maxhp)
        ui.vbox() # name from ("HP", bar)

        ui.text(name, size=20)

        ui.hbox() # "HP" from bar
        ui.text(u"ОЗ", size=20)
        ui.bar(maxhp, hp,
               xmaximum=150,
               left_bar=Frame(im.Twocolor("_roundrect/rrslider_full.png", "#fff", "#fff"), 12, 0),
               right_bar=Frame(im.Twocolor("_roundrect/rrslider_empty.png", "#fff", "#fff"), 12, 0),
               thumb=None,
               thumb_shadow=None)

        ui.close()
        ui.close()

        ui.vbox() # Level from (hp/maxhp)

        ui.text(u"Ур. %d" % level, xalign=0.5, size=20)
        ui.text(u"%d/%d" % (hp, maxhp), xalign=0.5, size=20)

        ui.close()
        ui.close()

label fight(ename, elevel, ehp, pname=u"Каквастам", plevel=4, php=40):
    $ stats_frame(pname, plevel, int(php * .73), php, xalign=.02, yalign=.05)
    $ stats_frame(ename, elevel, ehp, ehp, xalign=.98, yalign=.05)

    return
    
label demo_ui:

    e "Ren'Py предоставляет ряд способов взаимодействия с игроком."

    e "Вы уже видели реплики и меню."

    menu:

        e "Но знали ли Вы, что реплика и меню могут быть на экране одновременно?"

        "Да.":

            show eileen vhappy

            e "Хорошо!"

            show eileen happy

        "Нет.":

            e "Что ж, теперь знаете."

    e "Также мы можем попросить игрока ввести текст."

    $ povname = renpy.input(u"Как вас зовут?") or u"Аноним"

    pov "Зовите меня %(povname)s."

    
    e "{i}Imagemap{/i}ы позволяют игроку сделать выбор нажатием на определённый участок изображения. К примеру, попробуйте выбрать чем заняться после школы:"

    # Это imagemap. Он состоит из двух изображений и списка активных
    # областей. Для каждой активной области задаются координаты левой,
    # верхней, правой, и нижней сторон, и возвращаемое при выборе значение.

    $ result = renpy.imagemap("ground.jpg", "hover.jpg", [
        (8, 200, 86, 278, "swimming"),
        (204, 50, 282, 128, "science"), 
        (452, 79, 530, 157, "art"),
        (602, 316, 680, 394, "go home"),
        ], focus="imagemap")

    # Мы присвоили возвращённое значение переменной result.
    # Мы можем использовать конструкцию if чтобы менять ход игры
    # в зависимости от решения пользователя.

    if result == "swimming":

        e "Вы выбрали посещение секции плавания."
        
        e "Конечно, поплавать было бы весело, но я, к сожалению, не захватила купальник."

    elif result == "science":

        e "Вы решили зайти в научный кружок."
        
        e "Я слышала, в некоторых школах ведутся соревнавательные исследования, но для меня наука - это не то, что терпит спешки."
    
    elif result == "art":
        
        e "Вы решили провести время за мольбертом в художественном клубе."
        
        e "По-настоящему хорошее фоновое изображение трудно создать, поэтому во многих играх и используются отфильтрованные фотографии. Быть может, Вы - тот, кто изменит это."

    elif result == "go home":

        e "Вы решили пойти домой."

    e "В любом случае..."
    
    e "Также мы поддерживаем обзорные окна, позволяющие отображать вещи, большие по размеру, чем экран."

    e "Перемещаться в них можно, потянув мышью любой участок, покрутив колёсико мыши или с помощью полос прокрутки."
    
    show eileen happy at right
    with move
    
    python hide:

        ui.side(('c', 'b', 'r'), xpos=100, ypos=50, spacing=5)
        
        vp = ui.viewport(draggable=True, mousewheel=True, xmaximum=400, ymaximum=400)
        ui.image("mainmenu.jpg")
        ui.bar(adjustment=vp.xadjustment, style='scrollbar')
        ui.bar(adjustment=vp.yadjustment, style='vscrollbar')

        ui.close()
        
        ui.textbutton(u"Продолжить", xpos=300, xanchor=0.5, ypos=550, yanchor=0.5, clicked=ui.returns(True))
        ui.interact()

    show eileen happy at center
    with move
        
    e "Хотя этих конструкций обычно более чем достаточно для создания визуальной новеллы, симуляторы отношений будут посложнее."

    e "Функции ui позволяют создавать весьма сложные интерфейсы."

    e "К примеру, взгляните на следующий экран планирования и параметров, который может быть применён в симуляторе отношений на основе параметров."

    $ day_planner()

    e "Подобное лучше реализовано в движке для симуляторов отношений ({i}DSE{/i}) на основе Ren'Py (найти можно на страничке http://www.renpy.org/wiki/renpy/Frameworks)."

    call fight(u"Эйлин", 10, 99, pname=povname) from _call_fight_1

    e "Функции ui также могут быть использованы для отображения параметров, необходимых в боевой ситуации."

    call fight(u"Эйлин", 10, 99, pname=povname) from _call_fight_2
    
    e "Надеюсь, функции ui помогут Вам написать любую визуальную новеллу или симулятор отношений, какие пожелаете."

    return
