Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --==Божество Локи==
- --=====Подключение библиотек--
- local event = require('event')
- local fs = require('filesystem')
- local computer = require('computer')
- local com = require('component')
- local term = require('term')
- local thread = require('thread')
- local pref = require('pref')
- local serial = require('serialization')
- local unicode = require('unicode')
- local gl = com.openperipheral_bridge
- local sensor = com.openperipheral_sensor
- local inet = com.internet
- local cb = com.command_block
- local dc = com.debug
- local modem = com.modem
- local pim=com.pim
- local gpu = com.gpu
- gpu.setDepth(4)
- -- инициализирует многозадачный режим.
- thread.init()
- term.clear()
- --=======Константы--
- local KEY = 'b64ffb4a11de3a6f77e09719d76d0a3f'
- local CHEST_SIDE = 'south'
- local GIFT_SLOT = 1
- local logLevel = 6
- local TIME_ZONE = 2
- local t_correction = TIME_ZONE * 3600
- local f = { path_user_data = '/Loki/Users/',
- path_user_log_gift = '/Loki/Usersgift/',
- path_sys_data = '/Loki/Sys/',
- path_Loki_logs = '/Loki/Logs/',
- path_bad_users = '/Loki/BadUser/',
- path_debug = '/Loki/Debug/',
- }
- local lokifile = f.path_sys_data..'skill_Loki.loc'
- local x_max, y_max = 100,24
- gpu.setResolution(x_max, y_max)
- local array_action = {}
- local tableBadBoy = {}
- local col = {
- red = 0xff0000,
- blue = 0x0000ff,
- green = 0x00a600,
- yellow = 0xffff00,
- white = 0xffffff,
- black = 0x000000,
- grey =0x878787
- }
- array_action = {
- newbeliever = 'Новый верующий: За недавнее время никто не выбрал путь Цифровой религии!',
- say = 'Локи сказал: неизвестно',
- action = 'Последний божественный акт: неизвестно',
- desire ='Желание: неизвестно',
- datasave = 'Последнее сохранение базы данных: неизвестно'
- }
- --Скилы:
- local good = 5000 --1 Доброта
- local generosity = 5000 --2 Щедрость
- local freak = 1000 --3 Чудачество
- local trick = 1000 --4 Хитрость
- local cunning = 500 --5 Коварство
- local thirst = 1000 --6 Жажда
- local hunger = 1000 --7 Голод
- local t_saturation = 0 -- коефициет насыщения питья
- local h_saturation = 0 -- коефициет насыщения еды
- local global_saturation = 0 -- коефициет глобального насыщения
- -- Делишки Локи:
- local totat_gift_money = 0 -- всего подарил $ игрокам Локи
- local totat_gift_UU = 0 -- всего подарил UU игрокам Локи
- local totat_good_action = 0 -- всего хороших дел
- local totat_bad_action = 0 -- всего плохих дел
- local totat_kills = 0 -- всего убийств
- local totat_exclusive_gift = 0 -- всего эксклюзивных подарков
- -- =========Конфигурация========================================
- local good_sleep = 2 --скорость уменьшения доброты
- local generosity_sleep = 27 --скорость уменьшения щедрости
- local freak_sleep = 44 -- скорость увеличения чудачества
- local trick_sleep = 89 -- скорость увеличения хитрости
- local cunning_sleep = 49-- скорость увеличения коварства
- local thirst_sleep = 52 -- скорость жажды + 0.01%
- local hunger_sleep = 105 -- скорость голода + 0.01%
- --local findMaxKarma_sleep = 60 --скорость обновления верующих
- local findBadBoy_sleep = 25 --скорость обновления мучеников
- local glob_action_sleep1 = 20 -- нижний предел между актами 900
- local glob_action_sleep2 = 40 -- верхний предел между актами 3600
- local say_never_visit_sleep = 300 -- пауза при напоминании игроку о том, что он ни разу не был у Локи
- local PIM_sleep = 60 --пауза меджу принятием даров (не спамить)
- local reset_saturation_sleep = 60 -- пауза между одним тактом уменьшения разных видов насыщений.
- --==============================================================
- local last_user_gift = 'Никого не было еще :('
- local last_gift ='?'
- local last_gift_count = '?'
- local total_user_in_base = 0
- local nick_max_karma = '?'
- local current_max_karma = '?'
- local nick_max_luck = '?'
- local current_max_luck = '?'
- local function createFolders()
- for _, folder in pairs(f) do
- if not fs.exists(folder) then
- fs.makeDirectory(folder)
- end
- end
- end
- local function getTimeHost()
- local file = io.open('UNIX.tmp', 'w')
- file:write('')
- file:close()
- local lastmod = tonumber(string.sub(fs.lastModified('UNIX.tmp'), 1, -4)) + t_correction
- local dt = os.date('%Y.%m.%d %H:%M:%S', lastmod)
- return dt
- end
- function setBar (x, y, str, col_bar, col_bg, col_text, value, max_value, width)
- local len = math.ceil(width * (value/max_value))
- gpu.setBackground (col_bg)
- gpu.fill(x, y, width, 1, ' ')
- gpu.setBackground(col_bar)
- gpu.fill(x, y, len, 1, ' ')
- local dx = width/2 - #str/2
- gpu.setForeground (col_text)
- if len >= dx and len <= dx+#str then
- local mid = len-dx+1
- gpu.setBackground(col_bar)
- gpu.set(x+dx, y, str:sub(1, mid))
- gpu.setBackground(col_bg)
- gpu.set(x+dx+mid, y, str:sub(mid+1, #str))
- else
- if len < dx then gpu.setBackground(col_bg)
- else gpu.setBackground(col_bar) end
- gpu.set(x+dx, y, str)
- end
- end
- -- получение случайного числа в диапазоне А B
- local function rd(a,b)
- return math.random(a,b)
- end
- -- функция логирования программы и ее десйствий
- local function logToFile(str, file, method, level)
- local dt = getTimeHost()
- --- при наступлении новых суток в папке создается новый файл лога ./Logs/2015.06.14_logs.log
- if logLevel >= level then
- local file = io.open(file..string.sub(dt,1,10)..'_logs.log', method)
- file:write(string.sub(dt,12,19)..' - '.. str ..'\r\n')
- file:close()
- end
- end
- --- функция отладки программы, запись значений и параметров Локи для отладки конфигурации
- local function logDebud(str, stat)
- local dt = getTimeHost()
- if stat then
- local file = io.open(f.path_debug..string.sub(dt,1,10)..'_debugLoki.log', 'a')
- file:write(string.sub(dt,12,19)..' - '.. str ..'\r\n')
- file:close()
- end
- end
- -- выполнение экшенов на КБ
- local function runCommand(command_string)
- cb.setCommand(command_string)
- cb.executeCommand()
- end
- local desire = {
- drink = false,
- eat = false,
- gift = false
- }
- --['Название предмета'] ={1 Доброта, 2 Щедрость, 3 Чудачество, 4 Хитрость, 5 Коварство, 6 Жажда, 7 Голод, 8 карма, 9 удача, 10 макс. стак
- -- 1~9 - вероятность изменить скилл в процентах, 11~19 - коэффициенты изменения скилов, положительные или отрицательные}
- --Каждый айтем обладает определенными свойствами и влияет(может изменить) на те или иные параметры с определенной вероятностью
- item_skill = {
- --['Алмаз'] = {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}
- ['алмаз'] = {generosity=95, karma=25, goodluck=25, _max_stack = 64, _generosity=50, _karma=1, _goodluck=5, _type_item = 'jewel', _bucket = false},
- ['жареная курица'] = {hunger=40, karma=25, _max_stack = 64, _hunger = -80, _karma=5, _type_item = 'food', _bucket = false},
- ['ведро воды'] = {good=20, thirst=100, karma=35, _max_stack = 1, _good= 10, _thirst = -500, _karma=1, _type_item = 'drink', _bucket = true}
- }
- -- изменение скилов Локи и игроков
- function addskill(label, count, path)
- logDebud(label..' '..count..' '..path, true)
- local table = pref.load(path)
- local skill = tonumber(table[label])
- if skill + count < 10000 then
- skill = skill + count
- if skill < 0 then
- skill = 0
- end
- table[label] = skill
- else
- table[label] = 10000
- end
- pref.save(table)
- loadFeatureLoki()
- end
- -- функция плавного уменьшения разных видов насыщения. Скорость сброса разная
- local function resetSaturation()
- while true do
- os.sleep(reset_saturation_sleep)
- if t_saturation ~= 0 or h_saturation ~=0 or global_saturation ~= 0 then
- -- коэффициент насыщения питья
- t_saturation = t_saturation - 4
- if t_saturation < 0 then
- t_saturation = 0
- end
- -- коэффициент насыщения едой
- h_saturation = h_saturation - 2
- if h_saturation < 0 then
- h_saturation = 0
- end
- -- коэффициент глобального насыщения
- global_saturation = global_saturation - 1
- if global_saturation < 0 then
- global_saturation = 0
- end
- end
- end
- end
- ----=== Функция отработки изменения скилла Локи и игрока. У каждого айтема свои свойтва
- function cheackChanceChangeskills(nick, label, count)
- -- знает ли Локи данный предмет?
- if not item_skill[label] then
- --мы не обрабатываем ничего, так как данного айтема нет в базе и мы не знаем его божественных свойств
- logDebud('Подарен игроком ' ..nick..' неизвестный предмет без свойств: '..label..' - '..count..' шт.', true)
- return
- end
- -- если айтем ведерный, гиваем пустое ведро верующему назад
- if item_skill[label]._bucket then
- runCommand('give '..nick..' 325 1' )
- end
- local rusSkill = {['good'] = 'Доброта', ['generosity']='Щедрость', ['freak']='Чудачество', ['trick']='Хитрость', ['cunning']='Коварство', ['thirst']='Жажда', ['hunger']='Голод', ['karma']='Карма', ['goodluck']='Удача'}
- -- генерим шанс
- local check_saturation = false
- for key, v in pairs(item_skill[label]) do
- -- ========= флаги насыщения ===============
- -- ========= коэффициет насыщения питья ===============
- if item_skill[label]._type_item == 'drink' and not check_saturation then
- t_saturation = t_saturation + 4
- check_saturation = true
- if t_saturation > 30 then t_saturation = 30 end
- -- отказ от питья!
- if t_saturation > 20 or thirst < 100 then
- -- сказать, что пить больше не могу!
- local say_list_thirst = {' Больше пить не могу пока!',
- ' Э-э-э, '.. nick..'! Хватит в меня лить жидкость, у меня уже из ушей течет! Хард уже промок!',
- ' Выпей '..label..' сам. Я уже сейчас лопну!'
- }
- runCommand('tell ' ..nick..say_list_thirst[rd(1, #say_list_thirst)])
- return
- else
- if desire.drink then
- --генерим шанс и благодарим игрока
- --дописать шансогивалку
- runCommand('give '..nick.. ' 264 5')
- local say_list_thirst = {' О, питьё. Спасибо!',
- ' '..nick..'! Спасибо, дружище. Я чуть не сдох, пить хотел!'
- }
- runCommand('tell ' ..nick..say_list_thirst[rd(1, #say_list_thirst)])
- else
- -- просто пьем в обычном режиме и благодарим
- local say_list_thirst = {' Спасибо за питье!',
- ' Попить впрок не помешает!'
- }
- runCommand('tell ' ..nick..say_list_thirst[rd(1, #say_list_thirst)])
- end
- end
- -- проверим, хотел ли Локи именно в это время сильно пить
- end
- -- ========= коэффициет насыщения едой =============
- if item_skill[label]._type_item == 'food' and not check_saturation then
- h_saturation = h_saturation + 2
- check_saturation = true
- if h_saturation > 30 then h_saturation = 30 end
- -- отказ от еды!
- if h_saturation > 30 or hunger < 500 then
- -- сказать, что пить больше не могу!
- local say_list_hunger = {' Больше есть не могу пока!',
- ' Э-э-э, '.. nick..'! Я сейчас тресну уже:)!',
- ' Ешь дар '..label..' сам. Я хочу креветок и пива!;)'
- }
- runCommand('tell ' ..nick..say_list_hunger[rd(1, #say_list_hunger)])
- return
- end
- end
- -- ====== коэффициет глобального насыщения =======
- -- дописать!!!
- --=================================================
- if string.sub(key,0,1) ~= '_' then --убираем из итерации значения не скиллы
- local add_bonus_rul, add_skill, add_bonus_skill
- --- получаем бонус к шансу от размера стака (количесва подаренных предметов)
- if item_skill[label]._max_stack == 1 then
- add_bonus_rul = 0
- logDebud('Бонус для айтема 1-слотника на рулетке: '..add_bonus_rul, true)
- elseif item_skill[label]._max_stack == 16 then
- add_bonus_rul = math.floor(count/16*item_skill[label][key]/5) -- + до 20% за полный стак от дефолтной вероятности
- logDebud('Бонус для айтем 16-слотника на рулетке: '..add_bonus_rul, true)
- elseif item_skill[label]._max_stack == 64 then
- add_bonus_rul = math.floor (count/64*item_skill[label][key]/4) -- + до 25% за полный стак от дефолтной вероятности
- logDebud('Бонус для айтема 64-слотника на рулетке: '..add_bonus_rul, true)
- end
- local n = item_skill[label][key] + add_bonus_rul
- logDebud('Сумарная вероятность у айтема в % на рулетке: '..n, true)
- -- проверяем, не вышли ли за предел (от 0 до 100)
- if n > 100 then n = 100 end
- -- генерим шанс
- local rand = rd(0, 100)
- if rand >= 100 - n and rand <= 100 then -- если шанс выпал и нам повезло - изменить скилл
- --изменяем i-й скилл
- if key == 'karma' or key == 'goodluck' then
- logDebud('--изменяем i-й скилл '..rand..' >= '.. (100-n)..' and '..rand..' <=100', true)
- --изменяем скилл на дефолтное значение при вероятностном совпадении
- addskill(key, item_skill[label]['_'..key], f.path_user_data..nick)
- runCommand('tell ' ..nick..' Изменился Ваш скилл : '..rusSkill[key]..' на '..item_skill[label]['_'..key]..' ед.')
- else
- logDebud('--изменяем i-й скилл '..rand..' >= '.. (100-n)..' and '..rand..' <=100', true)
- -- + бонус к дефолтному изменению скилла в зависимости от размера дара
- local temp = math.abs(item_skill[label]['_'..key])
- if item_skill[label]._max_stack == 1 then
- add_bonus_skill = 0 -- за нестакающиеся предметы 0% бонуса к величине изменения скилла
- logDebud('Бонус на айтем 1-слотник: '..add_bonus_skill, true)
- elseif item_skill[label]._max_stack == 16 then
- add_bonus_skill = math.floor (count/16*temp/5) -- 20% за полный стак
- logDebud('Бонус на айтем 16-слотник: '..add_bonus_skill, true)
- elseif item_skill[label]._max_stack == 64 then
- add_bonus_skill = math.floor (count/64*temp/4) -- 25% за полный стак
- logDebud('Бонус на айтем 64-слотник на изменения скилла: '..add_bonus_skill, true)
- end
- -- вычисляем случайную надбавку от дефолтного значения на изменение скилла (0~20%) + до 20% надбавку за полный стак
- if item_skill[label]['_'..key] > 0 then
- add_skill = item_skill[label]['_'..key] + rd(0, math.floor(item_skill[label]['_'..key]/5)) + add_bonus_skill
- else
- add_skill = item_skill[label]['_'..key] - rd(0, math.abs(math.floor(item_skill[label]['_'..key]/5))) - add_bonus_skill
- end
- -- изменяем скилл
- addskill(key, add_skill , f.path_sys_data..'skill_Loki.loc')
- runCommand('tell ' ..nick..' Изменился скилл Локи: '..rusSkill[key]..' на '..(add_skill/100)..' %')
- end
- else
- --не повезло. Данный скилл не изменился
- logDebud('--не попали в предел '..rand..' >=' .. (100-n)..' and '..rand..' <=100', true)
- runCommand('tell ' ..nick..' Скилл: '..rusSkill[key]..' не изменился. Не повезло')
- end
- end
- end
- if thirst < 7000 then desire.drink = false array_action.desire = 'Больше верующих!' end
- if hunger < 8500 then desire.eat = false array_action.desire = 'Больше верующих!' end
- end
- function loadFeatureLoki()
- if not fs.exists(f.path_sys_data..'skill_Loki.loc') then
- --создаем дефолтный файл Локи
- local table = pref.create(lokifile)
- table['good'] = good
- table['generosity'] = generosity
- table['freak'] = freak
- table['trick'] = trick
- table['cunning'] = cunning
- table['thirst'] = thirst
- table['hunger'] = hunger
- --===================================
- table['totat_gift_money'] = totat_gift_money
- table['totat_gift_UU'] = totat_gift_UU
- table['totat_good_action'] = totat_good_action
- table['totat_bad_action'] = totat_bad_action
- table['totat_kills'] = totat_kills
- table['totat_exclusive_gift'] = totat_exclusive_gift
- --logDebud('создаем дефолтный файл Локи, если его нет', false)
- pref.save(table)
- else
- -- загружаем скилы из файла
- local table = pref.load(lokifile)
- good = tonumber(table['good'] )
- generosity = tonumber(table['generosity'])
- freak = tonumber(table['freak'])
- trick = tonumber(table['trick'])
- cunning = tonumber(table['cunning'])
- thirst = tonumber(table['thirst'])
- hunger = tonumber(table['hunger'])
- --===================================
- totat_gift_money = tonumber(table['totat_gift_money'])
- totat_gift_UU = tonumber(table['totat_gift_UU'])
- totat_good_action = tonumber(table['totat_good_action'])
- totat_bad_action = tonumber(table['totat_bad_action'])
- totat_kills = tonumber(table['totat_kills'])
- totat_exclusive_gift = tonumber(table['totat_exclusive_gift'])
- --logDebud('загружаем скилы Локи из файла', false)
- end
- end
- function get(url)
- -- делаем запрос
- local request, reason = inet.request(url)
- -- если нет ответа - возвращаем nil
- if not request then return '' end
- -- если ответ есть - читаем данные
- local text = ''
- while true do
- local data, reason = request.read()
- if not data then
- request.close()
- break
- elseif #data > 0 then
- text = text..data
- end
- end
- return text
- end
- function addMoney(nickname, amount)
- return get('http://computercraft.ru/ccbalanceupd.php?type=balance&auth='..KEY..'&nick='..nickname..'&action=add&value='..amount)
- end
- function getMoney(nickname)
- return get('http://computercraft.ru/ccbalanceupd.php?type=balance&auth='..KEY..'&nick='..nickname..'&action=get')
- end
- function addUU(nickname, amount)
- return get('http://computercraft.ru/ccbalanceupd.php?type=voice&auth='..KEY..'&nick='..nickname..'&action=add&value='..amount)
- end
- function getUU(nickname)
- return get('http://computercraft.ru/ccbalanceupd.php?type=voice&auth='..KEY..'&nick='..nickname..'&action=get')
- end
- function getVoice(nickname)
- return get('http://computercraft.ru/ccbalanceupd.php?type=absvoice&auth='..KEY..'&nick='..nickname..'&action=get')
- end
- --Функция создания нового игрока
- local function createNewPlayer(nick)
- local table = pref.create(f.path_user_data..nick)
- table['data'] = getTimeHost()
- table['karma'] = 0
- table['goodluck'] = 0
- table['sum_gift'] = 0
- pref.save(table)
- end
- --==== тестовый юзер =========
- --createNewPlayer('Bob')
- local last_save = 'неизвестно'
- --==============ИЗМЕНЕНИЕ СКИЛОВ БОЖЕСТВА===============
- function saveLoki()
- while true do
- event.pull('save_loki')
- local table = pref.load(lokifile)
- table['good'] = good
- table['generosity'] = generosity
- table['freak'] = freak
- table['trick'] = trick
- table['cunning'] = cunning
- table['thirst'] = thirst
- table['hunger'] = hunger
- --===================================
- table['totat_gift_money'] = totat_gift_money
- table['totat_gift_UU'] = totat_gift_UU
- table['totat_good_action'] = totat_good_action
- table['totat_bad_action'] = totat_bad_action
- table['totat_kills'] = totat_kills
- table['totat_exclusive_gift'] = totat_exclusive_gift
- last_save = getTimeHost()
- pref.save(table)
- end
- end
- -- процесс уменьшения доброты
- function goodProcess()
- while true do
- os.sleep(good_sleep)
- if good > 0 then
- good = good - 1
- computer.pushSignal('save_loki')
- --сказать что-то в чат
- end
- if good < 2500 then
- --сказать что-то в чат
- end
- end
- end
- -- процесс уменьшения щедрости
- function generosityProcess()
- while true do
- os.sleep(generosity_sleep)
- if generosity > 0 then
- generosity = generosity - 1
- computer.pushSignal('save_loki')
- --сказать что-то в чат
- end
- if generosity < 1000 then
- --сказать что-то в чат
- end
- end
- end
- -- процесс роста голода
- function hungerProcess()
- while true do
- os.sleep(hunger_sleep)
- if hunger < 10000 then
- hunger = hunger + 1
- computer.pushSignal('save_loki')
- --сказать что-то в чат
- end
- if hunger > 8500 then
- desire.eat = true
- array_action.desire = 'Желание: Хочу есть!'
- --сказать что-то в чат
- else
- desire.eat = false
- end
- end
- end
- -- процесс роста жажды
- function thirstProcess()
- while true do
- os.sleep(thirst_sleep)
- if thirst < 10000 then
- thirst = thirst + 1
- computer.pushSignal('save_loki')
- --сказать что-то в чат
- end
- if thirst > 7000 then
- --сказать что-то в чат
- desire.drink = true
- array_action.desire = 'Желание: Хочу пить'
- else
- desire.drink = false
- end
- end
- end
- -- процесс роста чудачества
- function freakProcess()
- while true do
- os.sleep(freak_sleep)
- if freak < 10000 then
- freak = freak + 1
- computer.pushSignal('save_loki')
- --сказать что-то в чат
- end
- if freak > 8000 then
- --сказать что-то в чат
- end
- end
- end
- -- процесс роста хитрости
- function trickProcess()
- while true do
- os.sleep(trick_sleep)
- if trick < 10000 then
- trick = trick + 1
- computer.pushSignal('save_loki')
- --сказать что-то в чат
- end
- if trick > 9000 then
- --сказать что-то в чат
- end
- end
- end
- -- процесс роста коварства
- function cunningProcess()
- while true do
- os.sleep(cunning_sleep)
- if cunning < 10000 then
- cunning = cunning + 1
- computer.pushSignal('save_loki')
- --сказать что-то в чат
- end
- if trick > 7500 then
- --сказать что-то в чат
- end
- end
- end
- -- получение данных по игроку
- local function getUsers(nick)
- if fs.exists(f.path_user_data..nick) then
- return pref.load(f.path_user_data..nick)
- else
- return nil
- end
- end
- local function itemRus(label)
- item_rus = {
- ['Apple'] = 'яблоко',
- ['Cooked Chicken'] = 'жареная курица',
- ['Pumpkin Pie'] = 'тыквенный пирог',
- ['Steak'] = 'стейк',
- ['Baked Potato'] = 'печеный картофель',
- ['Cooked Salmon'] = 'приготовленый лосось',
- ['Raw Porkchop'] = 'сырая свинина',
- ['Raw Beef'] = 'сырая говядина',
- ['Raw Chicken'] = 'курятина',
- ['Carrot'] = 'морковь',
- ['Cooked Porkchop'] = 'жареная свинина',
- ['Golden Apple'] = 'золотое яблоко',
- ['Cookie'] = 'печенье',
- ['Cake'] = 'торт',
- ['Melon'] = 'арбуз',
- ['Glistering Melon'] = 'сверкающий арбуз',
- ['Bread'] = 'Хлеб',
- ['Gold Ingot'] = 'золотой слиток',
- ['Diamond'] = 'алмаз',
- ['Emerald'] = 'изумруд',
- ['Nether Star'] = 'адская звезда',
- ['Ender Pearl'] = 'жемчуг Эндера',
- ['Eye of Ender'] = 'око Эндера',
- ['Water Bucket'] = 'ведро воды',
- ['Lava Bucket'] = 'ведро лавы',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = '',
- [''] = ''
- }
- if item_rus[label] then
- return item_rus[label]
- else
- return
- label
- end
- end
- -- поиск количества верующих, игрока с максимальной кармой и удачей
- local function findMaxKarmaAndMaxLuck()
- total_user_in_base = 0
- current_max_karma = 0
- current_max_luck = 0
- for name in fs.list(f.path_user_data) do
- total_user_in_base = total_user_in_base + 1
- local table = pref.load(f.path_user_data..name)
- if current_max_karma <= tonumber(table['karma']) then
- current_max_karma = tonumber(table['karma'])
- nick_max_karma = name
- end
- if current_max_luck <= tonumber(table['goodluck']) then
- current_max_luck = tonumber(table['goodluck'])
- nick_max_luck = name
- end
- end
- end
- function totalBadBoy()
- while true do
- os.sleep(findBadBoy_sleep)
- tableBadBoy ={}
- for name in fs.list(f.path_bad_users) do
- table.insert(tableBadBoy, name)
- end
- end
- end
- --если был брошен подарок в алтарь
- local function addGift(nick, name_gift, count)
- if not fs.exists(f.path_user_data..nick) then
- createNewPlayer(nick)
- --Сказать, что Локи приветствует нового игрока!
- logToFile('Создан новый игрок: '..nick, f.path_Loki_logs, 'a', 1)
- array_action.newbeliever = 'Новый верующий: Локи рад новому верующему! Локи запомнил '..nick
- end
- --========оброботка подарка Игрок================
- local table = pref.load(f.path_user_data..nick)
- last_user_gift = nick
- last_gift =name_gift
- last_gift_count = count
- table['data'] = getTimeHost()
- table['sum_gift'] = tonumber(table['sum_gift']) + 1
- --пишем в именную папку логи по датам-дням, что кидал игрок
- if not fs.exists(f.path_user_log_gift..nick..'/') then
- fs.makeDirectory(f.path_user_log_gift..nick..'/')
- end
- logToFile(itemRus(name_gift)..' --> '..count..' шт.', f.path_user_log_gift..nick..'/', 'a', 1)
- pref.save(table)
- cheackChanceChangeskills(nick, itemRus(name_gift), count)
- findMaxKarmaAndMaxLuck()
- end
- local function sayNeverVisit()
- while true do
- os.sleep(say_never_visit_sleep)
- local players_online = dc.getPlayers()
- logDebud('Онлайн: '..#players_online, true)
- for i=1, #players_online do
- local name = players_online[math.random(1,#players_online)]
- if not fs.exists(f.path_user_data..name) then
- array_action.say = 'Локи сказал: '..name..'! Вы еще никогда меня не посещали!'
- break
- end
- array_action.say = 'Мммм! Все, кто онлайн - примерные прихожане. Это радует!:)'
- end
- end
- end
- -- === Главная функция действий Локи ===========
- function reductionFeature()
- players_online = dc.getPlayers()
- logToFile('Локи что-то отчебучил', f.path_Loki_logs, 'a', 1)
- array_action.action = 'Последний божественный акт: ЗАГЛУШКА'
- array_action.desire = 'Желание: Больше верующих!'
- end
- -- функция отображения статистики и таймаут между божествеными актами
- local function timeoutActiveLoki()
- gpu.setResolution(x_max, y_max)
- timer_no_active = 0
- max_long_no_active = math.random(glob_action_sleep1,glob_action_sleep2)
- --синий экран
- gpu.setBackground(col.blue)
- gpu.fill(1,1,x_max,x_max,' ')
- -- заголовки
- gpu.setBackground(0x3c3c3c)
- gpu.setForeground(col.yellow)
- gpu.fill(1,1,x_max,1,'=')
- gpu.fill(1,19,x_max,1,'=')
- gpu.setForeground(col.yellow)
- gpu.set(32,1,'│Данные Божества Локи! ver.0.2.1b│')
- gpu.set(37,19,'│Действия Божества Локи│')
- while true do
- timer_no_active = timer_no_active + 1
- local online = dc.getPlayers().n
- local pl = #sensor.getPlayers()
- local fm = math.floor(computer.freeMemory()/1024)
- os.sleep(1)
- t = computer.uptime()
- hours = math.floor(t/3600)
- minutes = math.floor((t - hours*3600)/60)
- array_action.datasave = 'Последнее сохранение базы данных: '..last_save..' / Локи не спит уже: '..hours..' час. '..minutes..' мин.'
- gpu.setBackground(col.blue)
- gpu.setForeground(col.white)
- -- чистим верхнее окно
- gpu.fill(1,2,x_max,17,' ')
- -- чистим нижнее окно
- gpu.fill(1,20,x_max,5,' ')
- ---- Инфо бары
- gpu.set(1,3, ' Доброта: ')
- gpu.set(1,5, ' Щедрость: ')
- gpu.set(1,7, ' Чудачество: ')
- gpu.set(1,9, ' Хитрость: ')
- gpu.set(1,11, ' Коварство: ')
- gpu.set(1,13, ' Жажда: ')
- gpu.set(1,15, ' Голод: ')
- gpu.set(1,17, ' ОЗУ: ')
- -- прогресс бары
- setBar (14,3, (good/100)..'%', col.green, col.grey, col.black, good, 10000, 20)
- setBar (14,5, (generosity/100)..'%', col.green, col.grey, col.black, generosity, 10000, 20)
- setBar (14,7, (freak/100)..'%', col.green, col.grey, col.black, freak, 10000, 20)
- setBar (14,9, (trick/100)..'%', col.green, col.grey, col.black, trick, 10000, 20)
- setBar (14,11, (cunning/100)..'%', col.green, col.grey, col.black, cunning, 10000, 20)
- setBar (14,13, (thirst/100)..'%', col.green, col.grey, col.black, thirst, 10000, 20)
- setBar (14,15, (hunger/100)..'%', col.green, col.grey, col.black, hunger, 10000, 20)
- setBar (14,17, fm..' Kб', col.green, col.grey, col.black, fm, 4192, 20)
- --возврат к основным цветам
- gpu.setBackground(col.blue)
- gpu.setForeground(col.white)
- --Инфо справа, игроки:
- gpu.set(36,3, 'С последнего акта: '..timer_no_active..' сек.')
- gpu.set(36,4, 'До следуюющего акта: '..(max_long_no_active-timer_no_active)..' сек.')
- gpu.set(68,3, 'Под наблюдением: '..online..' игроков')
- gpu.set(68,4, 'Поблизости: '..pl..' верующих')
- -- статистика игроков
- gpu.setForeground(col.yellow)
- gpu.set(63,5, 'Верующие:')
- gpu.setForeground(col.white)
- gpu.set(36,6, 'Всего верующих: '..total_user_in_base..' чел.')
- gpu.set(36,7, 'Игрок с самой хорошей кармой: '..nick_max_karma..' ('..current_max_karma..')')
- gpu.set(36,8, 'Игрок с самой большей удачей: '..nick_max_luck..' ('..current_max_luck..')')
- gpu.set(36,9, 'Всего мучеников, которых постигла кара Локи: '..#tableBadBoy..' чел.')
- -- ===========статистика Локи===============
- gpu.setForeground(col.yellow)
- gpu.set(60,10, 'Статистика Локи:')
- gpu.setForeground(col.white)
- gpu.set(40,11, 'Всего подарил Локи $/UU: '..totat_gift_money..'/'..totat_gift_UU)
- gpu.set(40,12, 'Всего хороших/плохих дел: '..totat_good_action..'/'..totat_bad_action)
- gpu.set(40,13, 'Всего эклюзивных подарков/убийств: '..totat_exclusive_gift..'/'..totat_kills)
- -- =============алтарь=======================
- gpu.setForeground(col.yellow)
- gpu.set(55,14, 'Последнее действие на алтаре:')
- gpu.setForeground(col.white)
- gpu.setForeground(col.white)
- gpu.set(36,15, 'Кто принес дар: '..last_user_gift)
- gpu.set(36,16, 'Название дара (кол-во): '..itemRus(last_gift)..' - '..last_gift_count..' шт.')
- gpu.set(36,17, 'Свойства предмета: ')
- -- рисуем оперативную табличку дейтсвий
- i = 1
- for _,v in pairs(array_action) do
- if v then
- gpu.set(1,i + 19 , v)
- i = i + 1
- end
- end
- -- пауза между тактами
- if timer_no_active == max_long_no_active then
- reductionFeature()
- timer_no_active = 0
- max_long_no_active = rd(glob_action_sleep1, glob_action_sleep2)
- end
- gl.clear()
- box = gl.addGradientBox(5, 5, 100, 10, 0x00ff00, 0.9, 0xff0000, 0.9, 2)
- gl.addText(5+(good/100),5,'|',0x000000).setScale(1)
- gl.addText(5,5,'Доброта: '..(good/100)..'%',0x000000).setAlpha(0.4)--.setScale(0.7).
- --bar_good = gl.addBox(10,15,50,5,0xff0000,0.9)--.setGradient(2)--.setZIndex(10)
- --[[for k,v in pairs(er) do
- print(k,' ',v)
- io.read()
- end]]
- gl.sync()
- --error()
- end
- end
- -- мост с опенпериферал
- local function glassesDraw()
- gl.clear()
- gl.addBox(1,1,400,#chat_buffer*10,0x000000,0.5)
- for i=1, #chat_buffer do
- gl.addText(3,10*i-8,chat_buffer[i], 0xFFF700)
- end
- gl.sync()
- end
- -- проверка онлайн для безопасности и правильности указания имен игроков для Локи. Оффлайн бан и оффлайн мученики специально не реализованы!
- local function cheackOnline(name)
- local online = dc.getPlayers()
- for i=1,#online do
- if name == online[i] then
- return true
- end
- end
- return false
- end
- -- список команд (экранированные сообщения $$msg, регистр не важен)
- admins = {['AlexCC']=true, ['1Ridav']=true,['cyber01']=true,['Fingercomp']=true}
- command_list = {
- ['карма'] = function(nick) -- проверка своих верований
- local table = getUsers(nick)
- if table then
- runCommand('tell ' ..nick..' Ваш крайний визит к Локи: '..table['data'])
- runCommand('tell ' ..nick..' Ваша карма: '..table['karma']..' Ваша удача: '..table['goodluck'])
- runCommand('tell ' ..nick..' Вы приносили Локи дары '..table['sum_gift']..' раз(а)!')
- else
- runCommand('tell ' ..nick..' Извините, но Вы не веруете в Локи и не подносили ему дары! Пока что Вы отлучены от Цифровой религии:)')
- end
- end,
- ['баланс'] = function(nick) -- проверка баланса в банке, голосов и UU
- runCommand('tell ' ..nick..' Ваш счет в Банке: '..getMoney(nick)..' $, '..getUU(nick)..' UU, Ваши голоса: '..getVoice(nick))
- end,
- ['badboy'] = function(nick,table) -- добавить игрока в список BadBoy (страдальцы и мученики) Это список игроков, которых Локи будет карать
- if not table[3] then
- runCommand('tell ' ..nick..' Используйте /lc badboy <nick> <причина>')
- return
- end
- if cheackOnline(table[3]) then
- if not fs.exists(f.path_bad_users..table[3]) then
- local data = pref.create(f.path_bad_users..table[3])
- data['data'] = getTimeHost()
- data['whoadded'] = nick
- local reason = ''
- if table[4] then
- for i=4, #table do
- reason = reason..' '..table[i]
- end
- else reason = 'Причина не указана!'
- end
- data['reason'] = reason
- pref.save(data)
- runCommand('tell ' ..nick..' Игрок '.. table[3]..' добавлен в список мучеников!')
- else
- runCommand('tell ' ..nick..' Игрок '.. table[3]..' уже страдает от кары Локи!')
- end
- else
- runCommand('tell ' ..nick..' Вы не можете добавить игрока в список <badboy> '.. table[3]..', пока он не онлайн!')
- end
- end,
- ['help'] = function(nick) -- список команд
- runCommand('tell ' ..nick..' /lc badboy <nick> <причина> - добавить игрока в список мучеников для кары Локи!')
- runCommand('tell ' ..nick..' /lc rmbadboy <nick> - избавить игрока от кары Локи!')
- end
- }
- -- разбиваем строку по словам
- local function split(line)
- local data = {}
- for word in line:gmatch("%S+") do
- table.insert(data, word) end
- return data
- end
- --unicode.sub(), unicode.upper() unicode.lower(), unicode.len()
- -- ===== прослушка ГуглГассес ======
- local function glasseCommand()
- while true do
- local e,adr,nick,uuid,msg = event.pull("chat_command")
- local msgLow = unicode.lower(msg)
- if command_list[msgLow] then
- command_list[msgLow](nick)
- end
- if admins[nick] then
- local table = split(msg)
- if table[1] == 'lc' then
- if command_list[table[2]] then
- command_list[table[2]](nick, table)
- else
- runCommand('tell ' ..nick..' Ошибка! Наберите команду /lc help')
- end
- end
- else
- runCommand('tell ' ..nick..' Ошибка! У Вас нет прав влиять на Божество!')
- end
- end
- end
- --Функция принятия подарка от игрока из 9-го слота
- local function eventPIM()
- while true do
- -- os.sleep(PIM_sleep)
- local e, nick, uuid, adr = event.pull('player_on')
- if pim.getStackInSlot(GIFT_SLOT) then
- local name_gift = pim.getStackInSlot(GIFT_SLOT).display_name
- local count = pim.getStackInSlot(GIFT_SLOT).qty
- pim.pushItemIntoSlot(CHEST_SIDE, GIFT_SLOT)
- addGift(nick, name_gift, count)
- end
- end
- end
- createFolders()
- loadFeatureLoki()
- findMaxKarmaAndMaxLuck()
- thread.create(hungerProcess)
- thread.create(thirstProcess)
- thread.create(eventPIM)
- thread.create(timeoutActiveLoki)
- --thread.create(findMaxKarmaAndMaxLuck)
- --thread.create(sayNeverVisit)
- thread.create(goodProcess)
- thread.create(generosityProcess)
- thread.create(freakProcess)
- thread.create(trickProcess)
- thread.create(cunningProcess)
- thread.create(glasseCommand)
- thread.create(totalBadBoy)
- thread.create(resetSaturation)
- thread.create(saveLoki)
- thread.waitForAll()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement