Advertisement
FluttyProger

loki

Sep 19th, 2015
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --==Божество Локи==
  2.  
  3. --=====Подключение библиотек--
  4. local event = require('event')
  5. local fs = require('filesystem')
  6. local computer = require('computer')
  7. local com = require('component')
  8. local term = require('term')
  9. local thread = require('thread')
  10. local pref = require('pref')
  11. local serial = require('serialization')
  12. local unicode = require('unicode')
  13. local gl = com.openperipheral_bridge
  14. local sensor = com.openperipheral_sensor
  15. local inet = com.internet
  16. local cb = com.command_block
  17. local dc = com.debug
  18. local modem = com.modem
  19. local pim=com.pim
  20. local gpu = com.gpu
  21. gpu.setDepth(4)
  22.  
  23. -- инициализирует многозадачный режим.
  24. thread.init()
  25. term.clear()
  26. --=======Константы--
  27. local KEY  = 'b64ffb4a11de3a6f77e09719d76d0a3f'
  28. local CHEST_SIDE = 'south'
  29. local GIFT_SLOT = 1
  30. local logLevel = 6
  31.  
  32. local TIME_ZONE = 2  
  33. local t_correction = TIME_ZONE * 3600
  34. local f =   {   path_user_data  = '/Loki/Users/',
  35.                 path_user_log_gift  = '/Loki/Usersgift/',
  36.                 path_sys_data  = '/Loki/Sys/',
  37.                 path_Loki_logs  = '/Loki/Logs/',
  38.                 path_bad_users  = '/Loki/BadUser/',
  39.                 path_debug  = '/Loki/Debug/',
  40.             }
  41. local lokifile = f.path_sys_data..'skill_Loki.loc'
  42. local x_max, y_max = 100,24
  43. gpu.setResolution(x_max, y_max)
  44. local array_action = {}
  45. local tableBadBoy = {}
  46.  
  47.  
  48. local col = {
  49.   red = 0xff0000,
  50.   blue = 0x0000ff,
  51.   green = 0x00a600,
  52.   yellow = 0xffff00,
  53.   white = 0xffffff,
  54.   black = 0x000000,
  55.   grey =0x878787
  56. }
  57.  
  58. array_action = {
  59. newbeliever = 'Новый верующий: За недавнее время никто не выбрал путь Цифровой религии!',
  60. say = 'Локи сказал: неизвестно',
  61. action = 'Последний божественный акт: неизвестно',
  62. desire ='Желание: неизвестно',
  63. datasave = 'Последнее сохранение базы данных: неизвестно'
  64. }
  65.  
  66.     --Скилы:
  67. local good = 5000       --1 Доброта
  68. local generosity = 5000 --2 Щедрость
  69. local freak = 1000      --3 Чудачество
  70. local trick = 1000      --4 Хитрость
  71. local cunning = 500     --5 Коварство
  72. local thirst = 1000     --6 Жажда
  73. local hunger = 1000     --7 Голод
  74. local t_saturation = 0  -- коефициет насыщения питья
  75. local h_saturation = 0  -- коефициет насыщения еды
  76. local global_saturation = 0 --  коефициет глобального насыщения
  77.     -- Делишки Локи:
  78. local totat_gift_money = 0  -- всего подарил $ игрокам Локи
  79. local totat_gift_UU = 0  -- всего подарил UU игрокам Локи
  80. local totat_good_action = 0  -- всего хороших дел
  81. local totat_bad_action = 0 -- всего плохих дел
  82. local totat_kills = 0  -- всего убийств
  83. local totat_exclusive_gift = 0  -- всего эксклюзивных подарков
  84.  
  85. -- =========Конфигурация========================================
  86. local good_sleep = 2 --скорость уменьшения доброты
  87. local generosity_sleep = 27 --скорость уменьшения щедрости
  88. local freak_sleep = 44 -- скорость увеличения чудачества
  89. local trick_sleep = 89 -- скорость увеличения хитрости
  90. local cunning_sleep = 49-- скорость увеличения коварства
  91. local thirst_sleep  = 52 -- скорость жажды + 0.01%
  92. local hunger_sleep  = 105 -- скорость голода + 0.01%
  93. --local findMaxKarma_sleep = 60 --скорость обновления верующих
  94. local findBadBoy_sleep = 25 --скорость обновления мучеников
  95. local glob_action_sleep1 = 20  -- нижний предел между актами 900
  96. local glob_action_sleep2 = 40 -- верхний предел между актами 3600
  97. local say_never_visit_sleep = 300 -- пауза при напоминании игроку о том, что он ни разу не был у Локи
  98. local PIM_sleep = 60 --пауза меджу принятием даров (не спамить)
  99. local reset_saturation_sleep = 60 -- пауза между одним тактом уменьшения разных видов насыщений.
  100. --==============================================================
  101. local last_user_gift = 'Никого не было еще :('
  102. local last_gift ='?'
  103. local last_gift_count = '?'
  104. local total_user_in_base = 0
  105. local nick_max_karma  = '?'
  106. local current_max_karma = '?'
  107. local nick_max_luck  = '?'
  108. local current_max_luck = '?'
  109.  
  110.  
  111. local function createFolders()
  112.     for _, folder in pairs(f) do
  113.         if not fs.exists(folder) then
  114.             fs.makeDirectory(folder)
  115.         end
  116.     end
  117. end
  118.  
  119.  
  120.  
  121. local function getTimeHost()
  122.     local file = io.open('UNIX.tmp', 'w')
  123.     file:write('')
  124.     file:close()
  125.     local lastmod = tonumber(string.sub(fs.lastModified('UNIX.tmp'), 1, -4)) + t_correction
  126.     local dt = os.date('%Y.%m.%d %H:%M:%S', lastmod)
  127.     return dt
  128. end
  129.  
  130. function setBar (x, y, str, col_bar, col_bg, col_text, value, max_value, width)
  131. local len = math.ceil(width * (value/max_value))
  132.     gpu.setBackground (col_bg)
  133.     gpu.fill(x, y, width, 1, ' ')
  134.     gpu.setBackground(col_bar)
  135.     gpu.fill(x, y, len, 1, ' ')
  136.    
  137.     local dx = width/2 - #str/2
  138.   gpu.setForeground (col_text)
  139.   if len >= dx and len <= dx+#str then
  140.     local mid = len-dx+1
  141.     gpu.setBackground(col_bar)
  142.     gpu.set(x+dx, y, str:sub(1, mid))
  143.     gpu.setBackground(col_bg)
  144.     gpu.set(x+dx+mid, y, str:sub(mid+1, #str))
  145.   else
  146.     if len < dx then gpu.setBackground(col_bg)
  147.     else gpu.setBackground(col_bar) end
  148.     gpu.set(x+dx, y, str)  
  149.   end
  150. end
  151.  
  152.  
  153.  
  154.  
  155. -- получение случайного числа в диапазоне А B
  156. local function rd(a,b)
  157.     return math.random(a,b)
  158. end
  159.  
  160. -- функция логирования программы и ее десйствий
  161. local function logToFile(str, file, method, level)
  162.     local dt = getTimeHost()
  163.     --- при наступлении новых суток в папке создается новый файл лога ./Logs/2015.06.14_logs.log
  164.     if logLevel >= level then
  165.         local file = io.open(file..string.sub(dt,1,10)..'_logs.log', method)
  166.         file:write(string.sub(dt,12,19)..' - '.. str ..'\r\n')
  167.         file:close()
  168.     end
  169. end
  170.  
  171. --- функция отладки программы, запись значений и параметров Локи для отладки конфигурации
  172. local function logDebud(str, stat)
  173.     local dt = getTimeHost()
  174.     if stat then
  175.         local file = io.open(f.path_debug..string.sub(dt,1,10)..'_debugLoki.log', 'a')
  176.         file:write(string.sub(dt,12,19)..' - '.. str ..'\r\n')
  177.         file:close()
  178.     end
  179. end
  180.  
  181. -- выполнение экшенов на КБ
  182. local function runCommand(command_string)  
  183.   cb.setCommand(command_string)
  184.   cb.executeCommand()
  185. end
  186.  
  187. local desire = {
  188.     drink = false,
  189.     eat = false,
  190.     gift = false
  191. }
  192.  
  193. --['Название предмета'] ={1 Доброта, 2 Щедрость, 3 Чудачество, 4 Хитрость, 5 Коварство, 6 Жажда, 7 Голод, 8 карма, 9 удача, 10 макс. стак
  194. -- 1~9 - вероятность изменить скилл в процентах, 11~19 - коэффициенты изменения скилов, положительные или отрицательные}
  195. --Каждый айтем обладает определенными свойствами и влияет(может изменить) на те или иные параметры с определенной вероятностью
  196. item_skill = {
  197.     --['Алмаз'] = {good=90,generosity=0,freak=0,trick=0,cunning=0,thirst=0,hunger=0,karma=25,goodluck=90, max_stack = 64,_good=20,_generosity=5,_freak=0,_trick=0,_cunning=0,_thirst=0,_hunger=-200,_karma=1,_goodluck=5}
  198.     ['алмаз'] = {generosity=95, karma=25, goodluck=25, _max_stack = 64, _generosity=50, _karma=1, _goodluck=5, _type_item = 'jewel', _bucket = false},
  199.     ['жареная курица'] = {hunger=40, karma=25, _max_stack = 64, _hunger = -80, _karma=5, _type_item = 'food', _bucket = false},
  200.     ['ведро воды'] = {good=20, thirst=100, karma=35, _max_stack = 1, _good= 10, _thirst = -500, _karma=1, _type_item = 'drink', _bucket = true}
  201. }
  202.  
  203.  
  204.  
  205. -- изменение скилов Локи и игроков
  206. function addskill(label, count, path)
  207.     logDebud(label..' '..count..' '..path, true)
  208.     local table = pref.load(path)
  209.     local skill = tonumber(table[label])
  210.     if skill + count < 10000 then
  211.         skill = skill + count
  212.         if skill < 0 then
  213.             skill = 0
  214.         end
  215.     table[label] = skill
  216.     else
  217.         table[label] = 10000
  218.     end
  219.     pref.save(table)
  220.     loadFeatureLoki()
  221.  
  222. end
  223.  
  224. -- функция плавного уменьшения разных видов насыщения. Скорость сброса разная
  225. local function resetSaturation()
  226.     while true do
  227.         os.sleep(reset_saturation_sleep)               
  228.         if t_saturation ~= 0 or h_saturation ~=0 or global_saturation ~= 0 then
  229.             -- коэффициент насыщения питья
  230.             t_saturation = t_saturation - 4
  231.             if t_saturation < 0 then
  232.                 t_saturation = 0
  233.             end
  234.             -- коэффициент насыщения едой
  235.             h_saturation = h_saturation - 2
  236.             if h_saturation < 0 then
  237.                 h_saturation = 0
  238.             end
  239.             -- коэффициент глобального насыщения
  240.             global_saturation = global_saturation - 1
  241.             if global_saturation < 0 then
  242.                 global_saturation = 0
  243.             end
  244.         end
  245.     end
  246. end
  247.  
  248.  
  249. ----=== Функция отработки изменения скилла Локи и игрока. У каждого айтема свои свойтва
  250. function cheackChanceChangeskills(nick, label, count)
  251.     -- знает ли Локи данный предмет?
  252.     if not item_skill[label] then
  253.         --мы не обрабатываем ничего, так как данного айтема нет в базе и мы не знаем его божественных свойств
  254.         logDebud('Подарен игроком ' ..nick..' неизвестный предмет без свойств: '..label..' - '..count..' шт.', true)
  255.         return
  256.     end
  257.     -- если айтем ведерный, гиваем пустое ведро верующему назад
  258.     if item_skill[label]._bucket then
  259.         runCommand('give '..nick..' 325 1' )
  260.     end
  261.    
  262.  
  263.     local rusSkill = {['good'] = 'Доброта', ['generosity']='Щедрость', ['freak']='Чудачество', ['trick']='Хитрость', ['cunning']='Коварство', ['thirst']='Жажда', ['hunger']='Голод', ['karma']='Карма', ['goodluck']='Удача'}
  264.     -- генерим шанс
  265.    
  266.     local check_saturation = false
  267.     for key, v in pairs(item_skill[label]) do
  268.            
  269.            
  270.             -- ========= флаги насыщения ===============
  271.            
  272.             -- ========= коэффициет насыщения питья ===============
  273.             if item_skill[label]._type_item == 'drink' and not check_saturation then
  274.                 t_saturation = t_saturation + 4
  275.                 check_saturation = true
  276.                 if t_saturation > 30 then t_saturation = 30 end
  277.                 -- отказ от питья!
  278.                 if t_saturation > 20  or thirst < 100 then
  279.                     -- сказать, что пить больше не могу!
  280.                     local say_list_thirst = {' Больше пить не могу пока!',
  281.                         ' Э-э-э, '.. nick..'! Хватит в меня лить жидкость, у меня уже из ушей течет! Хард уже промок!',
  282.                         ' Выпей '..label..' сам. Я уже сейчас лопну!'
  283.                         }
  284.                         runCommand('tell ' ..nick..say_list_thirst[rd(1, #say_list_thirst)])
  285.                         return
  286.                     else
  287.                         if desire.drink then
  288.                         --генерим шанс и благодарим игрока
  289.                         --дописать шансогивалку
  290.                         runCommand('give '..nick.. ' 264 5')
  291.                         local say_list_thirst = {' О, питьё. Спасибо!',
  292.                         ' '..nick..'! Спасибо, дружище. Я чуть не сдох, пить хотел!'
  293.                         }
  294.  
  295.                         runCommand('tell ' ..nick..say_list_thirst[rd(1, #say_list_thirst)])
  296.                         else
  297.                         -- просто пьем в обычном режиме и благодарим
  298.                         local say_list_thirst = {' Спасибо за питье!',
  299.                         ' Попить впрок не помешает!'
  300.                         }
  301.                         runCommand('tell ' ..nick..say_list_thirst[rd(1, #say_list_thirst)])   
  302.                         end
  303.  
  304.                 end
  305.                 -- проверим, хотел ли Локи именно в это время сильно пить
  306.                
  307.  
  308.             end
  309.             -- ========= коэффициет насыщения едой =============
  310.             if item_skill[label]._type_item == 'food'  and not check_saturation then
  311.                 h_saturation = h_saturation + 2
  312.                 check_saturation = true
  313.                 if h_saturation > 30 then h_saturation = 30 end
  314.                 -- отказ от еды!
  315.                 if h_saturation > 30  or hunger < 500 then
  316.                     -- сказать, что пить больше не могу!
  317.                     local say_list_hunger = {' Больше есть не могу пока!',
  318.                     ' Э-э-э, '.. nick..'! Я сейчас тресну уже:)!',
  319.                     ' Ешь дар '..label..' сам. Я хочу креветок и пива!;)'
  320.                     }
  321.                     runCommand('tell ' ..nick..say_list_hunger[rd(1, #say_list_hunger)])
  322.                     return
  323.                 end
  324.             end
  325.             -- ====== коэффициет глобального насыщения =======
  326.  
  327.  
  328.             -- дописать!!!
  329.  
  330.  
  331.  
  332.             --=================================================
  333.  
  334.             if string.sub(key,0,1) ~= '_' then  --убираем из итерации значения не скиллы
  335.                 local add_bonus_rul, add_skill, add_bonus_skill
  336.                 --- получаем бонус к шансу от размера стака (количесва подаренных предметов)
  337.                     if item_skill[label]._max_stack == 1 then
  338.                         add_bonus_rul = 0
  339.                             logDebud('Бонус для айтема 1-слотника на рулетке: '..add_bonus_rul, true)
  340.                     elseif item_skill[label]._max_stack == 16 then
  341.                         add_bonus_rul = math.floor(count/16*item_skill[label][key]/5)  -- + до 20% за полный стак от дефолтной вероятности
  342.                             logDebud('Бонус для айтем 16-слотника на рулетке: '..add_bonus_rul, true)
  343.                     elseif item_skill[label]._max_stack == 64 then
  344.                         add_bonus_rul = math.floor (count/64*item_skill[label][key]/4)   -- + до 25% за полный стак от дефолтной вероятности
  345.                             logDebud('Бонус для айтема 64-слотника на рулетке: '..add_bonus_rul, true)
  346.                     end
  347.                 local n = item_skill[label][key] + add_bonus_rul
  348.                 logDebud('Сумарная вероятность у айтема в % на рулетке: '..n, true)
  349.                
  350.                 -- проверяем, не вышли ли за предел (от 0 до 100)
  351.                 if n > 100 then n = 100 end
  352.                
  353.                 -- генерим шанс
  354.                 local rand = rd(0, 100)
  355.                 if rand >= 100 - n and rand <= 100 then   -- если шанс выпал и нам повезло - изменить скилл
  356.                     --изменяем i-й скилл
  357.                     if key == 'karma' or key == 'goodluck' then
  358.                         logDebud('--изменяем i-й скилл '..rand..' >= '.. (100-n)..' and '..rand..' <=100', true)
  359.                         --изменяем скилл на дефолтное значение при вероятностном совпадении
  360.                         addskill(key, item_skill[label]['_'..key], f.path_user_data..nick)
  361.                         runCommand('tell ' ..nick..' Изменился Ваш скилл : '..rusSkill[key]..' на '..item_skill[label]['_'..key]..' ед.')
  362.                     else
  363.                         logDebud('--изменяем i-й скилл '..rand..' >= '.. (100-n)..' and '..rand..' <=100', true)
  364.                            
  365.                             -- + бонус к дефолтному изменению скилла в зависимости от размера дара 
  366.                                 local temp = math.abs(item_skill[label]['_'..key])
  367.                                 if item_skill[label]._max_stack == 1 then
  368.                                     add_bonus_skill = 0   -- за нестакающиеся предметы 0% бонуса к величине изменения скилла
  369.                                         logDebud('Бонус на айтем 1-слотник: '..add_bonus_skill, true)
  370.                                 elseif item_skill[label]._max_stack == 16 then
  371.                                     add_bonus_skill = math.floor (count/16*temp/5)    -- 20% за полный стак
  372.                                         logDebud('Бонус на айтем 16-слотник: '..add_bonus_skill, true)
  373.                                 elseif item_skill[label]._max_stack == 64 then
  374.                                     add_bonus_skill = math.floor (count/64*temp/4)   -- 25% за полный стак
  375.                                         logDebud('Бонус на айтем 64-слотник на изменения скилла: '..add_bonus_skill, true)
  376.                                 end
  377.  
  378.                         -- вычисляем случайную надбавку от дефолтного значения на изменение скилла (0~20%) + до 20% надбавку за полный стак
  379.                         if item_skill[label]['_'..key] > 0 then
  380.                              add_skill = item_skill[label]['_'..key] + rd(0, math.floor(item_skill[label]['_'..key]/5)) + add_bonus_skill
  381.                         else
  382.                              add_skill = item_skill[label]['_'..key]  - rd(0, math.abs(math.floor(item_skill[label]['_'..key]/5))) - add_bonus_skill
  383.                         end
  384.                         -- изменяем скилл
  385.                         addskill(key, add_skill , f.path_sys_data..'skill_Loki.loc')
  386.                         runCommand('tell ' ..nick..' Изменился скилл Локи: '..rusSkill[key]..' на '..(add_skill/100)..' %')
  387.                     end
  388.                 else
  389.                     --не повезло. Данный скилл не изменился
  390.                     logDebud('--не попали в предел '..rand..' >=' .. (100-n)..' and '..rand..' <=100', true)
  391.                     runCommand('tell ' ..nick..' Скилл: '..rusSkill[key]..' не изменился. Не повезло')
  392.                 end
  393.  
  394.             end
  395.     end
  396.  
  397.     if thirst < 7000 then desire.drink = false array_action.desire = 'Больше верующих!' end
  398.     if hunger < 8500 then desire.eat = false array_action.desire = 'Больше верующих!' end
  399. end
  400.  
  401. function loadFeatureLoki()
  402.     if not fs.exists(f.path_sys_data..'skill_Loki.loc') then
  403.         --создаем дефолтный файл Локи
  404.         local table = pref.create(lokifile)
  405.         table['good'] = good
  406.         table['generosity'] = generosity
  407.         table['freak'] = freak
  408.         table['trick'] = trick
  409.         table['cunning'] = cunning
  410.         table['thirst'] = thirst
  411.         table['hunger'] = hunger
  412.         --===================================
  413.         table['totat_gift_money'] = totat_gift_money
  414.         table['totat_gift_UU'] = totat_gift_UU
  415.         table['totat_good_action'] = totat_good_action
  416.         table['totat_bad_action'] = totat_bad_action
  417.         table['totat_kills'] = totat_kills
  418.         table['totat_exclusive_gift'] = totat_exclusive_gift
  419.         --logDebud('создаем дефолтный файл Локи, если его нет', false)
  420.         pref.save(table)
  421.     else
  422.         -- загружаем скилы из файла
  423.         local table = pref.load(lokifile)
  424.         good = tonumber(table['good'] )
  425.         generosity = tonumber(table['generosity'])
  426.         freak = tonumber(table['freak'])
  427.         trick = tonumber(table['trick'])
  428.         cunning = tonumber(table['cunning'])
  429.         thirst = tonumber(table['thirst'])
  430.         hunger = tonumber(table['hunger'])
  431.         --===================================
  432.         totat_gift_money = tonumber(table['totat_gift_money'])
  433.         totat_gift_UU = tonumber(table['totat_gift_UU'])
  434.         totat_good_action = tonumber(table['totat_good_action'])
  435.         totat_bad_action = tonumber(table['totat_bad_action'])
  436.         totat_kills = tonumber(table['totat_kills'])
  437.         totat_exclusive_gift = tonumber(table['totat_exclusive_gift'])
  438.         --logDebud('загружаем скилы Локи из файла', false)
  439.     end
  440. end
  441.  
  442. function get(url)
  443.   -- делаем запрос
  444.   local request, reason = inet.request(url)
  445.   -- если нет ответа - возвращаем nil
  446.   if not request then return '' end
  447.  
  448.   -- если ответ есть - читаем данные
  449.   local text = ''
  450.   while true do
  451.     local data, reason = request.read()
  452.     if not data then
  453.       request.close()
  454.       break
  455.     elseif #data > 0 then
  456.       text = text..data
  457.     end
  458.   end
  459.   return text
  460. end
  461.  
  462. function addMoney(nickname, amount)
  463.   return get('http://computercraft.ru/ccbalanceupd.php?type=balance&auth='..KEY..'&nick='..nickname..'&action=add&value='..amount)
  464. end
  465.  
  466. function getMoney(nickname)
  467.   return get('http://computercraft.ru/ccbalanceupd.php?type=balance&auth='..KEY..'&nick='..nickname..'&action=get')
  468. end
  469.  
  470. function addUU(nickname, amount)
  471.   return get('http://computercraft.ru/ccbalanceupd.php?type=voice&auth='..KEY..'&nick='..nickname..'&action=add&value='..amount)
  472. end
  473.  
  474. function getUU(nickname)
  475.   return get('http://computercraft.ru/ccbalanceupd.php?type=voice&auth='..KEY..'&nick='..nickname..'&action=get')
  476. end
  477.  
  478. function getVoice(nickname)
  479.   return get('http://computercraft.ru/ccbalanceupd.php?type=absvoice&auth='..KEY..'&nick='..nickname..'&action=get')
  480. end
  481.  
  482. --Функция создания нового игрока
  483. local function createNewPlayer(nick)
  484.     local table = pref.create(f.path_user_data..nick)
  485.     table['data'] = getTimeHost()
  486.     table['karma'] = 0
  487.     table['goodluck'] = 0
  488.     table['sum_gift'] = 0
  489.     pref.save(table)
  490. end
  491.  
  492. --====   тестовый юзер =========
  493. --createNewPlayer('Bob')
  494.  
  495. local last_save = 'неизвестно'
  496. --==============ИЗМЕНЕНИЕ СКИЛОВ БОЖЕСТВА===============
  497.  
  498. function saveLoki()
  499.     while true do
  500.         event.pull('save_loki')
  501.         local table = pref.load(lokifile)
  502.         table['good'] = good
  503.         table['generosity'] = generosity
  504.         table['freak'] = freak
  505.         table['trick'] = trick
  506.         table['cunning'] = cunning
  507.         table['thirst'] = thirst
  508.         table['hunger'] = hunger
  509.         --===================================
  510.         table['totat_gift_money'] = totat_gift_money
  511.         table['totat_gift_UU'] = totat_gift_UU
  512.         table['totat_good_action'] = totat_good_action
  513.         table['totat_bad_action'] = totat_bad_action
  514.         table['totat_kills'] = totat_kills
  515.         table['totat_exclusive_gift'] = totat_exclusive_gift
  516.         last_save = getTimeHost()
  517.         pref.save(table)           
  518.     end
  519. end
  520.  
  521.  
  522.  
  523. -- процесс уменьшения доброты
  524. function goodProcess()
  525.     while true do      
  526.             os.sleep(good_sleep)
  527.             if good > 0 then
  528.                 good  = good - 1
  529.                 computer.pushSignal('save_loki')
  530.                 --сказать что-то в чат
  531.  
  532.             end
  533.            
  534.             if good < 2500 then
  535.                 --сказать что-то в чат         
  536.             end
  537.     end
  538. end
  539.  
  540. -- процесс уменьшения щедрости
  541. function generosityProcess()
  542.     while true do      
  543.             os.sleep(generosity_sleep)
  544.             if generosity > 0 then
  545.                 generosity  = generosity - 1
  546.                 computer.pushSignal('save_loki')
  547.                 --сказать что-то в чат
  548.             end
  549.            
  550.             if generosity < 1000 then
  551.                 --сказать что-то в чат         
  552.             end
  553.     end
  554. end
  555.  
  556. -- процесс роста голода
  557. function hungerProcess()
  558.     while true do      
  559.             os.sleep(hunger_sleep)
  560.             if hunger < 10000 then
  561.                 hunger  = hunger + 1
  562.                 computer.pushSignal('save_loki')
  563.                 --сказать что-то в чат
  564.             end
  565.            
  566.             if hunger > 8500 then
  567.                 desire.eat = true
  568.                 array_action.desire = 'Желание: Хочу есть!'
  569.                 --сказать что-то в чат         
  570.             else
  571.                 desire.eat = false
  572.             end
  573.     end
  574. end
  575.  
  576. -- процесс роста жажды
  577. function thirstProcess()
  578.     while true do      
  579.             os.sleep(thirst_sleep)
  580.             if thirst < 10000 then
  581.                 thirst  = thirst + 1
  582.                 computer.pushSignal('save_loki')
  583.                 --сказать что-то в чат
  584.             end
  585.            
  586.             if thirst > 7000 then
  587.                 --сказать что-то в чат
  588.                 desire.drink = true
  589.                 array_action.desire = 'Желание: Хочу пить'
  590.             else
  591.                 desire.drink = false
  592.             end
  593.     end
  594. end
  595.  
  596. -- процесс роста чудачества
  597. function freakProcess()
  598.     while true do      
  599.             os.sleep(freak_sleep)
  600.             if freak < 10000 then
  601.                 freak  = freak + 1
  602.                 computer.pushSignal('save_loki')
  603.                 --сказать что-то в чат
  604.             end
  605.            
  606.             if freak > 8000 then
  607.                 --сказать что-то в чат         
  608.             end
  609.     end
  610. end
  611.  
  612. -- процесс роста хитрости
  613. function trickProcess()
  614.     while true do      
  615.             os.sleep(trick_sleep)
  616.             if trick < 10000 then
  617.                 trick  = trick + 1
  618.                 computer.pushSignal('save_loki')
  619.                 --сказать что-то в чат
  620.             end
  621.            
  622.             if trick > 9000 then
  623.                 --сказать что-то в чат         
  624.             end
  625.     end
  626. end
  627.  
  628. -- процесс роста коварства
  629. function cunningProcess()
  630.     while true do      
  631.             os.sleep(cunning_sleep)
  632.             if cunning < 10000 then
  633.                 cunning  = cunning + 1
  634.                 computer.pushSignal('save_loki')
  635.                 --сказать что-то в чат
  636.             end
  637.            
  638.             if trick > 7500 then
  639.                 --сказать что-то в чат         
  640.             end
  641.     end
  642. end
  643.  
  644.  
  645. -- получение данных по игроку
  646. local function getUsers(nick)
  647.     if fs.exists(f.path_user_data..nick) then
  648.         return  pref.load(f.path_user_data..nick)
  649.     else
  650.         return nil
  651.     end
  652. end
  653.  
  654. local function itemRus(label)
  655.     item_rus = {
  656.     ['Apple'] = 'яблоко',
  657.     ['Cooked Chicken'] = 'жареная курица',
  658.     ['Pumpkin Pie'] = 'тыквенный пирог',
  659.     ['Steak'] = 'стейк',
  660.     ['Baked Potato'] = 'печеный картофель',
  661.     ['Cooked Salmon'] = 'приготовленый лосось',
  662.     ['Raw Porkchop'] = 'сырая свинина',
  663.     ['Raw Beef'] = 'сырая говядина',
  664.     ['Raw Chicken'] = 'курятина',
  665.     ['Carrot'] = 'морковь',
  666.     ['Cooked Porkchop'] = 'жареная свинина',
  667.     ['Golden Apple'] = 'золотое яблоко',
  668.     ['Cookie'] = 'печенье',
  669.     ['Cake'] = 'торт',
  670.     ['Melon'] = 'арбуз',
  671.     ['Glistering Melon'] = 'сверкающий арбуз',
  672.     ['Bread'] = 'Хлеб',
  673.     ['Gold Ingot'] = 'золотой слиток',
  674.     ['Diamond'] = 'алмаз',
  675.     ['Emerald'] = 'изумруд',
  676.     ['Nether Star'] = 'адская звезда',
  677.     ['Ender Pearl'] = 'жемчуг Эндера',
  678.     ['Eye of Ender'] = 'око Эндера',
  679.     ['Water Bucket'] = 'ведро воды',
  680.     ['Lava Bucket'] = 'ведро лавы',
  681.     [''] = '',
  682.     [''] = '',
  683.     [''] = '',
  684.     [''] = '',
  685.     [''] = '',
  686.     [''] = '',
  687.     [''] = '',
  688.     [''] = '',
  689.     [''] = '',
  690.     [''] = '',
  691.     [''] = '',
  692.     [''] = '', 
  693.     [''] = ''
  694.     }
  695.     if item_rus[label] then
  696.         return item_rus[label]
  697.     else
  698.         return
  699.         label
  700.     end
  701. end
  702.  
  703.  
  704. -- поиск количества верующих, игрока с максимальной кармой и удачей
  705. local function findMaxKarmaAndMaxLuck()
  706.         total_user_in_base = 0
  707.         current_max_karma = 0
  708.         current_max_luck = 0
  709.         for name in fs.list(f.path_user_data) do
  710.             total_user_in_base = total_user_in_base + 1
  711.             local table = pref.load(f.path_user_data..name)
  712.             if current_max_karma <= tonumber(table['karma']) then
  713.                     current_max_karma = tonumber(table['karma'])
  714.                     nick_max_karma = name
  715.             end
  716.             if current_max_luck <= tonumber(table['goodluck']) then
  717.                     current_max_luck = tonumber(table['goodluck'])
  718.                     nick_max_luck = name
  719.             end
  720.  
  721.         end    
  722. end
  723.  
  724. function totalBadBoy()
  725.     while true  do
  726.     os.sleep(findBadBoy_sleep)
  727.     tableBadBoy ={}
  728.         for name in fs.list(f.path_bad_users) do
  729.             table.insert(tableBadBoy, name)
  730.         end
  731.     end
  732. end
  733.  
  734. --если был брошен подарок в алтарь
  735. local function addGift(nick, name_gift, count)
  736.     if not fs.exists(f.path_user_data..nick) then
  737.         createNewPlayer(nick)
  738.         --Сказать, что Локи приветствует нового игрока!
  739.  
  740.         logToFile('Создан новый игрок: '..nick, f.path_Loki_logs, 'a', 1)
  741.         array_action.newbeliever = 'Новый верующий: Локи рад новому верующему! Локи запомнил '..nick
  742.     end
  743.     --========оброботка подарка Игрок================
  744.  
  745.     local table = pref.load(f.path_user_data..nick)
  746.     last_user_gift = nick
  747.     last_gift =name_gift
  748.     last_gift_count = count
  749.     table['data'] = getTimeHost()
  750.     table['sum_gift'] = tonumber(table['sum_gift']) + 1
  751.     --пишем в именную папку логи по датам-дням, что кидал игрок
  752.     if not fs.exists(f.path_user_log_gift..nick..'/') then
  753.             fs.makeDirectory(f.path_user_log_gift..nick..'/')
  754.     end
  755.     logToFile(itemRus(name_gift)..' --> '..count..' шт.', f.path_user_log_gift..nick..'/', 'a', 1)
  756.     pref.save(table)
  757.     cheackChanceChangeskills(nick, itemRus(name_gift), count)
  758.     findMaxKarmaAndMaxLuck()
  759. end
  760.  
  761. local function sayNeverVisit()
  762.     while true do
  763.         os.sleep(say_never_visit_sleep)
  764.         local players_online = dc.getPlayers()
  765.         logDebud('Онлайн: '..#players_online, true)
  766.             for i=1, #players_online do
  767.                 local name = players_online[math.random(1,#players_online)]
  768.                 if not fs.exists(f.path_user_data..name) then
  769.                     array_action.say = 'Локи сказал: '..name..'! Вы еще никогда меня не посещали!'
  770.                     break
  771.                 end
  772.                 array_action.say = 'Мммм! Все, кто онлайн - примерные прихожане. Это радует!:)'
  773.             end
  774.     end
  775. end
  776.  
  777. -- === Главная функция действий Локи ===========
  778. function  reductionFeature()
  779.     players_online = dc.getPlayers()
  780.     logToFile('Локи что-то отчебучил', f.path_Loki_logs, 'a', 1)
  781.     array_action.action = 'Последний божественный акт: ЗАГЛУШКА'
  782.     array_action.desire = 'Желание: Больше верующих!'
  783. end
  784.  
  785.  
  786.  
  787. -- функция отображения статистики и таймаут между божествеными актами
  788. local function timeoutActiveLoki()
  789.     gpu.setResolution(x_max, y_max)
  790.     timer_no_active = 0
  791.     max_long_no_active = math.random(glob_action_sleep1,glob_action_sleep2)
  792.    
  793.     --синий экран
  794.     gpu.setBackground(col.blue)
  795.     gpu.fill(1,1,x_max,x_max,' ')
  796.    
  797.     -- заголовки
  798.     gpu.setBackground(0x3c3c3c)
  799.     gpu.setForeground(col.yellow)
  800.     gpu.fill(1,1,x_max,1,'=')
  801.     gpu.fill(1,19,x_max,1,'=')
  802.     gpu.setForeground(col.yellow)
  803.     gpu.set(32,1,'│Данные Божества Локи! ver.0.2.1b│')
  804.     gpu.set(37,19,'│Действия Божества Локи│')
  805.      
  806.     while true do
  807.         timer_no_active = timer_no_active + 1
  808.         local online = dc.getPlayers().n
  809.         local pl = #sensor.getPlayers()
  810.         local fm = math.floor(computer.freeMemory()/1024)
  811.         os.sleep(1)
  812.         t = computer.uptime()
  813.         hours = math.floor(t/3600)
  814.         minutes = math.floor((t - hours*3600)/60)
  815.         array_action.datasave = 'Последнее сохранение базы данных: '..last_save..' / Локи не спит уже: '..hours..' час. '..minutes..' мин.'
  816.         gpu.setBackground(col.blue)
  817.         gpu.setForeground(col.white)
  818.         -- чистим верхнее окно
  819.         gpu.fill(1,2,x_max,17,' ')
  820.         -- чистим нижнее окно
  821.         gpu.fill(1,20,x_max,5,' ')
  822.        
  823.         ---- Инфо бары
  824.         gpu.set(1,3,  ' Доброта:    ')
  825.         gpu.set(1,5,  ' Щедрость:   ')
  826.         gpu.set(1,7,  ' Чудачество: ')
  827.         gpu.set(1,9,  ' Хитрость:   ')
  828.         gpu.set(1,11, ' Коварство:  ')
  829.         gpu.set(1,13, ' Жажда:      ')
  830.         gpu.set(1,15, ' Голод:      ')
  831.         gpu.set(1,17, ' ОЗУ:        ')
  832.         -- прогресс бары
  833.         setBar (14,3, (good/100)..'%', col.green, col.grey, col.black, good, 10000, 20)
  834.         setBar (14,5, (generosity/100)..'%', col.green, col.grey, col.black, generosity, 10000, 20)
  835.         setBar (14,7, (freak/100)..'%', col.green, col.grey, col.black, freak, 10000, 20)
  836.         setBar (14,9, (trick/100)..'%', col.green, col.grey, col.black, trick, 10000, 20)
  837.         setBar (14,11, (cunning/100)..'%', col.green, col.grey, col.black, cunning, 10000, 20)
  838.         setBar (14,13, (thirst/100)..'%', col.green, col.grey, col.black, thirst, 10000, 20)
  839.         setBar (14,15, (hunger/100)..'%', col.green, col.grey, col.black, hunger, 10000, 20)
  840.         setBar (14,17, fm..' Kб', col.green, col.grey, col.black, fm, 4192, 20)
  841.         --возврат к основным цветам
  842.         gpu.setBackground(col.blue)
  843.         gpu.setForeground(col.white)
  844.  
  845.         --Инфо справа, игроки:
  846.         gpu.set(36,3,  'С последнего акта:   '..timer_no_active..' сек.')
  847.         gpu.set(36,4,  'До следуюющего акта: '..(max_long_no_active-timer_no_active)..' сек.')
  848.         gpu.set(68,3,  'Под наблюдением: '..online..' игроков')  
  849.         gpu.set(68,4,  'Поблизости:      '..pl..' верующих')
  850.         -- статистика игроков
  851.         gpu.setForeground(col.yellow)
  852.         gpu.set(63,5,  'Верующие:')
  853.         gpu.setForeground(col.white)
  854.         gpu.set(36,6,  'Всего верующих: '..total_user_in_base..' чел.')
  855.         gpu.set(36,7,  'Игрок с самой хорошей кармой: '..nick_max_karma..' ('..current_max_karma..')')
  856.         gpu.set(36,8,  'Игрок с самой большей удачей: '..nick_max_luck..' ('..current_max_luck..')')
  857.         gpu.set(36,9,  'Всего мучеников, которых постигла кара Локи: '..#tableBadBoy..' чел.')
  858.         -- ===========статистика Локи===============
  859.         gpu.setForeground(col.yellow)
  860.         gpu.set(60,10, 'Статистика Локи:')
  861.         gpu.setForeground(col.white)
  862.         gpu.set(40,11, 'Всего подарил Локи $/UU:           '..totat_gift_money..'/'..totat_gift_UU)
  863.         gpu.set(40,12, 'Всего хороших/плохих дел:          '..totat_good_action..'/'..totat_bad_action)       
  864.         gpu.set(40,13, 'Всего эклюзивных подарков/убийств: '..totat_exclusive_gift..'/'..totat_kills)
  865.         -- =============алтарь=======================
  866.         gpu.setForeground(col.yellow)
  867.         gpu.set(55,14, 'Последнее действие на алтаре:')
  868.         gpu.setForeground(col.white)
  869.         gpu.setForeground(col.white)
  870.         gpu.set(36,15, 'Кто принес дар:         '..last_user_gift)
  871.         gpu.set(36,16, 'Название дара (кол-во): '..itemRus(last_gift)..' - '..last_gift_count..' шт.')
  872.         gpu.set(36,17, 'Свойства предмета:      ')
  873.         -- рисуем оперативную табличку дейтсвий
  874.         i = 1
  875.         for _,v in pairs(array_action) do
  876.             if v then
  877.                 gpu.set(1,i + 19 ,  v)
  878.                 i = i + 1
  879.             end
  880.         end
  881.         -- пауза между тактами
  882.         if timer_no_active == max_long_no_active then
  883.             reductionFeature()
  884.             timer_no_active = 0
  885.             max_long_no_active = rd(glob_action_sleep1, glob_action_sleep2)
  886.         end
  887.         gl.clear()
  888.         box = gl.addGradientBox(5, 5, 100, 10, 0x00ff00, 0.9, 0xff0000, 0.9, 2)
  889.         gl.addText(5+(good/100),5,'|',0x000000).setScale(1)
  890.         gl.addText(5,5,'Доброта: '..(good/100)..'%',0x000000).setAlpha(0.4)--.setScale(0.7).
  891.         --bar_good = gl.addBox(10,15,50,5,0xff0000,0.9)--.setGradient(2)--.setZIndex(10)
  892.        
  893.         --[[for k,v in pairs(er) do
  894.             print(k,' ',v)
  895.             io.read()
  896.         end]]
  897.         gl.sync()
  898.         --error()
  899.  
  900.     end
  901. end
  902.  
  903. -- мост с опенпериферал
  904. local  function glassesDraw()
  905.     gl.clear()
  906.     gl.addBox(1,1,400,#chat_buffer*10,0x000000,0.5)
  907.     for i=1, #chat_buffer do
  908.         gl.addText(3,10*i-8,chat_buffer[i], 0xFFF700)
  909.     end
  910.     gl.sync()
  911. end
  912.  
  913. -- проверка онлайн для безопасности и правильности указания имен игроков для Локи. Оффлайн бан и оффлайн мученики специально не реализованы!
  914. local  function  cheackOnline(name)
  915.     local online = dc.getPlayers()
  916.     for i=1,#online do
  917.         if name == online[i] then
  918.             return true
  919.         end
  920.     end
  921.     return false
  922. end
  923.  
  924. -- список команд (экранированные сообщения $$msg, регистр не важен)
  925.  
  926. admins = {['AlexCC']=true, ['1Ridav']=true,['cyber01']=true,['Fingercomp']=true}
  927.  
  928. command_list = {
  929.     ['карма'] = function(nick)  -- проверка своих верований
  930.                     local table = getUsers(nick)
  931.                      if table then
  932.                         runCommand('tell ' ..nick..' Ваш крайний визит к Локи: '..table['data'])
  933.                         runCommand('tell ' ..nick..' Ваша карма: '..table['karma']..' Ваша удача: '..table['goodluck'])
  934.                         runCommand('tell ' ..nick..' Вы приносили Локи дары '..table['sum_gift']..' раз(а)!')
  935.                     else
  936.                         runCommand('tell ' ..nick..' Извините, но Вы не веруете в Локи и не подносили ему дары! Пока что Вы отлучены от Цифровой религии:)')
  937.                     end
  938.                 end,
  939.     ['баланс'] = function(nick) -- проверка баланса в банке, голосов и UU
  940.                         runCommand('tell ' ..nick..' Ваш счет в Банке: '..getMoney(nick)..' $, '..getUU(nick)..' UU, Ваши голоса: '..getVoice(nick))
  941.                 end,
  942.     ['badboy'] = function(nick,table) -- добавить игрока в список BadBoy (страдальцы и мученики)  Это список игроков, которых Локи будет карать
  943.                     if not table[3] then
  944.                             runCommand('tell ' ..nick..' Используйте /lc badboy <nick> <причина>')
  945.                             return
  946.                     end
  947.                     if cheackOnline(table[3]) then
  948.                        
  949.                         if not fs.exists(f.path_bad_users..table[3]) then
  950.                                     local data = pref.create(f.path_bad_users..table[3])
  951.                                     data['data'] = getTimeHost()
  952.                                     data['whoadded'] = nick
  953.                                     local reason = ''
  954.                                         if table[4] then
  955.                                             for i=4, #table do
  956.                                                 reason = reason..' '..table[i]
  957.                                             end
  958.                                             else reason = 'Причина не указана!'
  959.                                         end
  960.                                     data['reason'] = reason
  961.                                     pref.save(data)
  962.                                     runCommand('tell ' ..nick..' Игрок '.. table[3]..' добавлен в список мучеников!')
  963.                         else
  964.                                     runCommand('tell ' ..nick..' Игрок '.. table[3]..' уже страдает от кары Локи!')
  965.                         end
  966.                     else
  967.                         runCommand('tell ' ..nick..' Вы не можете добавить игрока в список <badboy> '.. table[3]..', пока он не онлайн!')
  968.                     end
  969.                 end,
  970.     ['help'] = function(nick) -- список команд
  971.                         runCommand('tell ' ..nick..' /lc badboy <nick> <причина> - добавить игрока в список мучеников для кары Локи!')
  972.                         runCommand('tell ' ..nick..' /lc rmbadboy <nick> - избавить игрока от кары Локи!') 
  973.                 end                        
  974.  
  975. }
  976.  
  977. -- разбиваем строку по словам
  978. local function split(line)
  979.   local data = {}
  980.   for word in line:gmatch("%S+") do
  981.     table.insert(data, word) end
  982.   return data
  983. end
  984.  
  985. --unicode.sub(), unicode.upper() unicode.lower(), unicode.len()
  986. -- =====   прослушка ГуглГассес  ======
  987. local  function glasseCommand()
  988.     while true do
  989.         local e,adr,nick,uuid,msg = event.pull("chat_command")
  990.         local msgLow = unicode.lower(msg)
  991.         if command_list[msgLow] then
  992.                 command_list[msgLow](nick)
  993.         end
  994.         if admins[nick] then
  995.             local table = split(msg)
  996.             if table[1] == 'lc' then
  997.                 if command_list[table[2]] then
  998.                     command_list[table[2]](nick, table)
  999.                 else
  1000.                     runCommand('tell ' ..nick..' Ошибка! Наберите команду /lc help')
  1001.                 end
  1002.             end
  1003.         else
  1004.         runCommand('tell ' ..nick..' Ошибка! У Вас нет прав влиять на Божество!')
  1005.         end
  1006.     end
  1007. end
  1008.  
  1009. --Функция принятия подарка от игрока из 9-го слота
  1010. local function eventPIM()
  1011.     while true do
  1012.       --   os.sleep(PIM_sleep)
  1013.       local e, nick, uuid, adr  = event.pull('player_on')
  1014.         if pim.getStackInSlot(GIFT_SLOT) then
  1015.         local name_gift = pim.getStackInSlot(GIFT_SLOT).display_name
  1016.         local count = pim.getStackInSlot(GIFT_SLOT).qty
  1017.         pim.pushItemIntoSlot(CHEST_SIDE, GIFT_SLOT)
  1018.         addGift(nick, name_gift, count)  
  1019.         end
  1020.     end
  1021. end
  1022.  
  1023. createFolders()
  1024. loadFeatureLoki()
  1025. findMaxKarmaAndMaxLuck()
  1026.  
  1027.  
  1028. thread.create(hungerProcess)
  1029. thread.create(thirstProcess)
  1030. thread.create(eventPIM)
  1031. thread.create(timeoutActiveLoki)
  1032. --thread.create(findMaxKarmaAndMaxLuck)
  1033. --thread.create(sayNeverVisit)
  1034. thread.create(goodProcess)
  1035. thread.create(generosityProcess)
  1036. thread.create(freakProcess)
  1037. thread.create(trickProcess)
  1038. thread.create(cunningProcess)
  1039. thread.create(glasseCommand)
  1040. thread.create(totalBadBoy)
  1041. thread.create(resetSaturation)
  1042. thread.create(saveLoki)
  1043.  
  1044.  
  1045. thread.waitForAll()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement