#!/bin/env ruby # encoding: utf-8 module Jekyll class WeightTag < Liquid::Tag def initialize(tag_name, text, tokens) super @weight = text.to_f end def render(context) strength = (@weight / 1.1).round if (strength < 1) then strength = 1 end return "Вес | #{@weight}\nМинимальная Сила | #{strength}" end end class WeaponTag < Liquid::Tag def dmg_min(dmg) dmg.sub!(/(\d)d\d+/, '\1') #2d62 -> 2 dmg.sub!(/Рукопашный Урон|РУ/, '1') return eval(dmg).to_i end def dmg_max(dmg) dmg.sub!(/(\d)d(\d+)/, '\1 * \2') #2d62 -> 62*2 dmg.sub!(/Рукопашный Урон|РУ/, '5') return eval(dmg).to_i end end class MeleeWeaponTag < WeaponTag def initialize(tag_name, text, tokens) super values = text.split(',') @AP_hit = values[0].to_i @AP_aim = values[1].to_i @dmg = values[2] end def render(context) value = "ОД на удар | #{@AP_hit}\nОД на прицельный удар | #{@AP_aim}\nПовреждения | #{@dmg}\nДальность | 1\n" fic_min = (10 / @AP_aim).round * dmg_min(@dmg.clone) fic_max = (10 / @AP_hit).round * dmg_max(@dmg.clone) value = value + "НЁХ (удар) | #{fic_min}-#{fic_max}" return value end end class ThrowingWeaponTag < WeaponTag def initialize(tag_name, text, tokens) super values = text.split(',') @AP_hit = values[0].to_i @AP_aim = values[1].to_i @dmg = values[2] @distance = values[3] end def render(context) value = "ОД на бросок | #{@AP_hit}\nОД на прицельный бросок | #{@AP_aim}\nПовреждения (бросок) | #{@dmg}\n" if (@distance) then value = value + "Эффективная дальность (бросок) | #{@distance}\n" end fic_min = (10 / @AP_aim).round * dmg_min(@dmg.clone) fic_max = (10 / @AP_hit).round * dmg_max(@dmg.clone) value = value + "НЁХ (бросок) | #{fic_min}-#{fic_max}" return value end end class FirearmWeaponTag < WeaponTag def initialize(tag_name, text, tokens) super values = text.split(',') @ammo = values[0] @ammo_count = values[1].to_i # ёмкость @AP_reload = values[2].to_i @AP_hit = values[3].to_i @AP_aim = values[4].to_i @dmg = values[5] @distance = values[6].to_i end def damage(ammo_type) case ammo_type when '.30' return '1d6' when '.31' return '1d6' when '.35' return '1d8' when '.45' return '1d10' when '.52' return '1d10' when '.58' return '1d12' when 'Стрела' return '1d4' when 'Арбалетная стрела' return '1d6' end end def render(context) value = "ОД на перезарядку | #{@AP_reload}\nОД на выстрел (одиночный) | #{@AP_hit}\n" value = value + "ОД на выстрел (прицельный) | #{@AP_aim}\nПовреждения | #{@dmg}\n" if (@ammo_count) then value = value + "Ёмкость | #{@ammo_count}\n" end if (@ammo && @ammo != 'Стрела' && @ammo != 'Арбалетная стрела') then value = value + "Калибр | #{@ammo}\n" end if (@distance) then value = value + "Дальность, м | #{@distance}\n" end shots = (10 / @AP_aim).round if (shots > @ammo_count) then # не могу придумать ничего умного, проще смоделировать бой shots = 0 reloads = 0 count = @ammo_count ap = 10 while (ap > @AP_aim) #puts "\nAP: #{ap}\nПатронов:#{count}" if (count > 0) then #puts "Выстрел на #{@AP_aim} ОД\n" shots = shots + 1 count = count - 1 ap = ap - @AP_aim else #puts "Перезарядка\n" if (ap < @AP_reload) then break end reloads = reloads + 1 count = @ammo_count ap = ap - @AP_reload end end end fic_min = shots * dmg_min(@dmg.clone + damage(@ammo)) shots = (10 / @AP_hit).round if (shots > @ammo_count) then shots = 0 reloads = 0 count = @ammo_count ap = 10 while (ap > @AP_hit) if (count > 0) then shots = shots + 1 count = count - 1 ap = ap - @AP_hit else if (ap < @AP_reload) then break end reloads = reloads + 1 count = @ammo_count ap = ap - @AP_reload end end end fic_max = shots * dmg_max(@dmg.clone + damage(@ammo)) value = value + "НЁХ (выстрел) | #{fic_min}-#{fic_max}" return value end end end Liquid::Template.register_tag('weight', Jekyll::WeightTag) Liquid::Template.register_tag('melee', Jekyll::MeleeWeaponTag) Liquid::Template.register_tag('throwing', Jekyll::ThrowingWeaponTag) Liquid::Template.register_tag('firearm', Jekyll::FirearmWeaponTag)