И так, полноценный отчёт, я выбираю тебя!
Начнём с того, что мало помалу, кое как, разработка возвращается на круги своя(ага, когда-то я сидел в мейкере каждый день). На данный момент была проделана не очень большая, но весьма старательная работа над улучшением и доработкой геймплейной части.
Не малыми трудами мне обернулось введение возможности активации не сразу событий выходящих из-за дверей, но я, в конце-концов, одолел это препятствие! Теперь, когда вы открываете одну из дверей и видите как на вас из неё выходит монстр - не стоит боятся, что немедленно начнётся бой, ведь остались ещё две не открытые двери. Однако, не смотря на это, открыть все три двери для обновления комнаты - не достаточно.
И всё? Спросите вы? А я отвечу - конечно же нет! Как и обещал, веду активную работу над рандомом. На данный момент, всё не так радужно как хотелось бы, но уже есть некие подвижки в сторону улучшения. Во первых, мной был использован найденный в сети скрипт:
#Dice.roll(x,y) or Dice.roll("xdy")
#
#Rolls x y-sided dice and returns their total. You may replace x and y with "vx" (with quotation marks) #to use a variable instead.
#
#For instance, Dice.roll("v3","v6") and Dice.roll("v3dv6") will both roll a score of (variable 3) #(variable 6)-sided dice.
#
#
#
#Dice.rolls(x,y) or Dice.rolls("xdy")
#
#Returns an array with all the results of rolling x y-sided dice. You may use operators, for instance #Dice.rolls("3d6").max will give you the best out of 3 rolls with 6-sided dice. You may use variables as #with Dice.roll.
#
#
#
#Dice.saverolls(z,x,y) or Dice.saverolls(z,"xdy")
#
#Rolls x y-sided dice and stores each result in a variable, starting with variable z. Dice.saverolls(11, #"3d20") will roll three 20-sided dice and store the results in variables 11, 12 and 13 respectively.
#
#
#
#a.weaponroll
#
#You may use this in damage formulae to call for a roll on the actor's weapon Dice Damage.
#
#To assign a dice roll to a weapon, add to its notetags:
#
#DiceDamage:xdy
#
#
#
#Example:
#
#Eric has 16 Attack, and has a Lumber Axe equipped, which in its notes has DiceDamage:2d6
#
#The regular attack formula has been edited to a.weaponroll + (a.atk-10)/2 - b.def
#
#Thus, a regular attack from Eric to a target with no defense will do 2d6+3 damage, or between 5 and 15 #damage.
module Dice
def self.roll_the_dice(dice,value)
rolls = []
if value == nil
n = dice.index(/d/i)
x = dice.slice!(0, n)
dice.slice!("d")
y = dice
else
x = dice
y = value
end
if x.is_a?(String) and x.slice(/v/i) != nil
x = $game_variables[x.slice(1,x.size - 1).to_i]
else
x = x.to_i
end
if y.is_a?(String) and y.slice(/v/i) != nil
y = $game_variables[y.slice(1,y.size - 1).to_i]
else
y = y.to_i
end
if x == 0
x = 1
end
while x > 0
roll = y == 0 ? 0 : rand(y) + 1
rolls.push(roll)
x-=1
end
return rolls
end
def self.roll(dice, value = nil)
result = 0
rolls = roll_the_dice(dice,value)
return rolls.inject{|sum, n| sum + n}
end
def self.rolls(dice, value = nil)
return roll_the_dice(dice,value)
end
def self.saverolls(var, dice, value = nil)
rolls = roll_the_dice(dice,value)
z = var
rolls.each do |i|
$game_variables[z] = i
z +=1
end
end
end
class Game_Battler < Game_BattlerBase
def weaponroll
if !actor?
dicedamage1 = $data_enemies[enemy_id].note.to_s.slice(/^DiceDamage:v?[0-9]+dv?[0-9]+$/i)
dicedamage1 = dicedamage1.slice(/v?[0-9]+dv?[0-9]+/i)
dicedamage1 = Dice.roll(dicedamage1)
return dicedamage1
end
if actor?
if weapons[0] != nil
dicedamage1 = weapons[0].note.to_s.slice(/^DiceDamage:v?[0-9]+dv?[0-9]+$/i)
dicedamage1 = dicedamage1.slice(/v?[0-9]+dv?[0-9]+/i)
dicedamage1 = Dice.roll(dicedamage1)
else
dicedamage1 = 0
end
if weapons[1] != nil
dicedamage2 = weapons[1].note.to_s.slice(/^DiceDamage:[0-9]+d[0-9]+$/i)
dicedamage2 = dicedamage2.slice(/v?[0-9]+dv?[0-9]+/i)
dicedamage2 = Dice.roll(dicedamage2)
else
dicedamage2 = 0
end
return dicedamage1 + dicedamage2
end
end
end
Если я всё верно понял, он имитирует бросок Х количества дайсов(сиречь игральных кубиков) с Y-ом граней, тому кто опишет насколько эффективно работает этот скрипт печеньку в не очереди!
Так же, я оптимизировал всё что было сделано до этого - превратив кучу вложенных друг в друга ветвлений условий, в аккуратный вызов скрипта. И уже было не мог нарадоваться на своё творение, как вдруг, по не совсем мне ясным причинам, а скорее всего глупой облачной синхронизации, проект откатился до состояния предшествовавшего данным изменениям. Но ничего, это не значит что я заброшу проект! :3
После того, как я вновь верну всё на свои места, прибравшись в ивентовом ужасе, начнётся дальнейшая работа над улучшением рандома в игре. Мне пришла в голову идея о том как лучше реализовать рандомный лут из сундуков. Я планирую создать несколько массивов, в каждом из которых будут храниться значения с айди итимов из нужных категорий. Всего три(оружие, броня и предметы). В момент, когда открывается сундук, идёт бросок дайса(при помощи скрипта выше) 1d4, по цифре выпвашей на дайсе определяется что получит игрок - славу/броню/оружие или же предмет. Если со славой всё просто и решается дополнительным броском d10, то в плане остального всё чуть сложнее.
По какой-то, не совсем ясной даже мне, причине. Мой мозг проще представляет всё на основе настольных игр(что можно понять из описаний выше). В большинстве же настольных игр, какой предмет найдёт игрок - решается при помощи карточки, из определённой колоды.
Таким образом, после броска 1d4, цифры выше двух отвечают за порядковый номер нужного массива. Из этого массива берётся первое значение и по нему игроку выдаётся необходимый предмет из соответствующей категории. Дабы предметы не сыпались на игрока по порядку и не было повторов, вначале игры все массивы перемешиваются, а айди итемов что уже были выданы удаляются из них.
В дальнейшем это позволит улучшить систему предметов, введя редкость таковых добавлением новых бросков, новых граней и новых массивов.
P.S. Вот такая, от части лекционная(наверно) запись у меня вышла. Надеюсь, что найдутся те кто через дебри моего сознания доберутся до конца и осознают всё описанное. :3 Так же, буду рад любой помощи в плане освоения работы с массивами, или хотя бы намёков на то насколько реализуема моя идея да в какую сторону стоит копать.