Guest User

Untitled

a guest
Oct 1st, 2018
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.26 KB | None | 0 0
  1. init python:
  2.     # окно игры в центре экрана
  3.     import os
  4.     os.environ['SDL_VIDEO_CENTERED'] = '1'
  5.     # автоматическое объявление изображений
  6.     config.automatic_images_minimum_components = 1
  7.     config.automatic_images = [' ', '_', '/']
  8.     config.automatic_images_strip = ['images']
  9.  
  10.     # размеры сетки с инвентарем настраиваются
  11.     columns = 3
  12.     rows = 3
  13.     # размеры иконок в инвентаре
  14.     side = 64
  15.  
  16.     # сам инвентарь
  17.     inventory = {}
  18.     # текущее положение скролла инвентаря
  19.     from_i = 0
  20.  
  21.     # получить количество предметов
  22.     def get_count(str):
  23.         s = str.split(":")
  24.         if len(s) > 0:
  25.             return int(s[0])
  26.         return 0
  27.     # получить подсказку по предмету
  28.     def get_hint(str):
  29.         s = str.split(":")
  30.         if len(s) > 1:
  31.             return s[1]
  32.         return ""
  33.     # получить описание предмета
  34.     def get_about(str):
  35.         s = str.split(":")
  36.         if len(s) > 2:
  37.             return s[2]
  38.         return "Описание отсутствует."
  39.  
  40.     # изменение количества предметов в ячейке на plus единиц
  41.     # если не было, то будут созданы
  42.     # если количество < 1, то удалены вовсе
  43.     def iplus(item_name, plus = 1, hint = None, about = None):
  44.         if plus:
  45.             global inventory
  46.             i = get_count(inventory.get(item_name, "0"))
  47.             if hint == None:
  48.                 hint = get_hint(inventory.get(item_name, "0"))
  49.             if about == None:
  50.                 about = get_about(inventory.get(item_name, "0"))
  51.             i += plus
  52.             if i < 1:
  53.                 # предметы количеством < 1 удаляются из инвентаря
  54.                 i = 0
  55.                 if item_name in inventory:
  56.                     inventory.pop(item_name)
  57.             else:
  58.                 inventory[item_name] = str(i) + ":" + hint + ":" + about
  59.         else:
  60.             # если plus == None, то уничтожаем все единицы предмета
  61.             if item_name in inventory:
  62.                 inventory.pop(item_name)
  63.         # изменения на экран
  64.         renpy.restart_interaction()
  65.         # вручную сохраняем измененные данные инвентаря
  66.         # так как renpy сохраняет данные только
  67.         # при смене текста в текстбоксе
  68.         renpy.retain_after_load()
  69.  
  70.     # скролл вверх
  71.     class iUp(Action, DictEquality):
  72.         def __call__(self):
  73.             global from_i
  74.             from_i -= columns
  75.             if from_i < 0:
  76.                 from_i = 0
  77.             from_i = (from_i / columns) * columns
  78.             renpy.restart_interaction()
  79.         # кликабельность кнопки
  80.         def get_sensitive(self):
  81.             return from_i >= columns
  82.     # скролл вниз
  83.     class iDn(Action, DictEquality):
  84.         def __call__(self):
  85.             global from_i
  86.             from_i += columns
  87.             if from_i < 0:
  88.                 from_i = 0
  89.             from_i = (from_i / columns) * columns
  90.             renpy.restart_interaction()
  91.         # кликабельность кнопки
  92.         def get_sensitive(self):
  93.             return from_i + columns * rows < len(inventory)
  94.  
  95.     # обработчик кликов,
  96.     # чтобы не пихать гору кода в action кнопок
  97.     def iclick(i):
  98.         # например, вызовем окно применения предмета
  99.         renpy.show_screen("scr_use", i)
  100.         renpy.restart_interaction()
  101.  
  102.     # кнопка применения предмета
  103.     def accept(i):
  104.         # уменьшаем количество предметов на 1
  105.         iplus(inventory.keys()[i], -1)
  106.  
  107.     # превращаем функции в action
  108.     iClick = renpy.curry(iclick)
  109.     Accept = renpy.curry(accept)
  110.  
  111. init:
  112.     image empty = Null(side, side)
  113.  
  114. # необязательное окно прменения предмета
  115. screen scr_use(i):
  116.     modal True
  117.     frame:
  118.         background "#100b"
  119.         align(.5, .5)
  120.         xminimum 500
  121.         has vbox:
  122.             xalign .5
  123.         text " "
  124.         add inventory.keys()[i] xalign .5
  125.         text get_hint(inventory.values()[i]) xalign .5
  126.         text get_about(inventory.values()[i]) xalign .5
  127.         text " "
  128.         hbox:
  129.             xminimum 500
  130.             textbutton "Применить" xalign .5 xminimum 150 action [Hide("scr_use"), Accept(i)]
  131.             textbutton "Отмена"    xalign .5 xminimum 150 action Hide("scr_use")
  132.         text " "
  133.  
  134. # сам экран инвентаря
  135. screen scr_inventory:
  136.     zorder 111
  137.     default tt = Tooltip(" ")
  138.     button:
  139.         align (.95, .05)
  140.         background "#0018" # фон инвентаря
  141.         action NullAction()
  142.         # заполняем ячейки
  143.         vbox:
  144.             text "Инвентарь" xalign .5
  145.             textbutton _("↑") xminimum side*columns action iUp() # скролл вверх
  146.             for y in range(0, rows):
  147.                 hbox:
  148.                     for x in range(0, columns):
  149.                         # индекс ячейки
  150.                         $ i = from_i + x + y * columns
  151.                         # если не за грницами списка предметов
  152.                         if i < len(inventory):
  153.                             button:
  154.                                 # размеры предмета
  155.                                 minimum (side, side)
  156.                                 maximum (side, side)
  157.                                 background inventory.keys()[i] # картинка предмета
  158.                                 hovered tt.Action(get_hint(inventory.values()[i]))
  159.                                 # количество
  160.                                 text "{size=16}" + str(get_count(inventory.values()[i])) align(1.0, 1.0)
  161.                                 action iClick(i) # действе по клику
  162.                         else:
  163.                             # пустые ячейки
  164.                             button:
  165.                                 minimum (side, side)
  166.                                 background "empty"
  167.                                 text " "
  168.                                 action NullAction()
  169.             textbutton _("↓") xminimum side*columns action iDn() # скролл вниз
  170.             text tt.value xalign .5
  171.  
  172. # чтобы использовать инвентарь нужно только
  173. # доработать под себя фунцию для обработки клика по предмету в инвентаре iclick
  174. label start:
  175.     # если сначала объявить переменную прямо в скрипте,
  176.     # то renpy будет сам сохранять ее содержимое
  177.     $ inventory = {}
  178.     scene bg
  179.     # заполним инвентарь всеми доступными пузырьками в 1 экземпляре
  180.     $ i = 1
  181.     while i <= 12:
  182.         # вторым параметром можно указать стартовое количество хреновин
  183.         # третьим - подсказку, появляющуюся при наведении курсора
  184.         # а можно ничего не указывать, только имя картинки - 1й параметр
  185.         $ iplus('pot' + str(i), 1, "Хреновина №" + str(i))
  186.         $ i += 1
  187.     # покажем экран инвентаря
  188.     show screen scr_inventory
  189.     "Можно кликнуть по хреновинам в инвентаре."
  190.     # пример изменения инвентаря из скрипта
  191.     # iplus(спрайт, [количество, подсказка, описание])
  192.     $ iplus('pot9', 2)
  193.     "{image=pot9} Добавлено еще 2 вот таких хреновины."
  194.     return
Advertisement
Add Comment
Please, Sign In to add comment