add diceroller
This commit is contained in:
parent
4480cabf5a
commit
9826602375
|
@ -9,6 +9,12 @@ base:
|
|||
password: toor
|
||||
database: botpop_base
|
||||
|
||||
dice:
|
||||
enable: true
|
||||
|
||||
eip:
|
||||
enable: true
|
||||
|
||||
rootme:
|
||||
enable: false
|
||||
|
||||
|
|
12
plugins/dice/Character.rb
Normal file
12
plugins/dice/Character.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
class Character
|
||||
|
||||
attr_accessor :carac, :skills, :hp, :classes, :bab
|
||||
def initialize(str, dex, con, int, wiz, cha, opt={})
|
||||
@carac = {str: str, dex: dex, con: con, int: int, wiz: wiz, cha: cha}
|
||||
@skills = {}
|
||||
@hp = opt[:hp] || nil
|
||||
@classes = opt[:classes] || {}
|
||||
@bab = opt[:bab] || [0]
|
||||
end
|
||||
|
||||
end
|
98
plugins/dice/Dice.rb
Normal file
98
plugins/dice/Dice.rb
Normal file
|
@ -0,0 +1,98 @@
|
|||
class FrozenDice
|
||||
attr_reader :min, :max, :values, :nb, :faces
|
||||
|
||||
def initialize arg
|
||||
if arg.is_a? String
|
||||
v = arg.match(/^(?<nb>\d+)d(?<faces>\d+)$/i)
|
||||
if v
|
||||
set_rolldice v
|
||||
else
|
||||
raise ArgumentError unless arg.match(/^\d+$/)
|
||||
set_value arg.to_i
|
||||
end
|
||||
elsif arg.is_a? Integer
|
||||
set_value arg
|
||||
else
|
||||
raise ArgumentError
|
||||
end
|
||||
end
|
||||
|
||||
def throw
|
||||
@nb.times.map{ rand(@values) }
|
||||
end
|
||||
|
||||
def test
|
||||
self.throw.inject(&:+)
|
||||
end
|
||||
|
||||
def mean
|
||||
v = values.to_a
|
||||
if v.size % 2 == 0
|
||||
(v[v.size / 2 - 1] + v[v.size / 2]) * 0.5
|
||||
else
|
||||
v[v.size / 2]
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def set_rolldice v
|
||||
@nb, @faces = v[:nb].to_i, v[:faces].to_i
|
||||
@max = @faces
|
||||
@min = 1
|
||||
@values = @min..@max
|
||||
end
|
||||
|
||||
def set_value v
|
||||
@nb = 1
|
||||
@faces = v
|
||||
@min = @faces
|
||||
@max = @faces
|
||||
@values = @min..@max
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class Dice
|
||||
attr_accessor :bonus, :dices
|
||||
|
||||
def initialize *arg
|
||||
@dices = []
|
||||
arg.each do |a1|
|
||||
a1.gsub!(" ", "")
|
||||
a1.split(/[+ ]/).each do |a2|
|
||||
@dices << FrozenDice.new(a2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def min
|
||||
@dices.map do |dice|
|
||||
dice.min
|
||||
end
|
||||
end
|
||||
|
||||
def mean
|
||||
@dices.map do |dice|
|
||||
dice.mean
|
||||
end
|
||||
end
|
||||
|
||||
def max
|
||||
@dices.map do |dice|
|
||||
dice.max
|
||||
end
|
||||
end
|
||||
|
||||
def throw
|
||||
@dices.map do |dice|
|
||||
dice.throw
|
||||
end
|
||||
end
|
||||
|
||||
def test
|
||||
@dices.map do |dice|
|
||||
dice.test
|
||||
end.inject(&:+)
|
||||
end
|
||||
|
||||
end
|
12
plugins/dice/Warrior.rb
Normal file
12
plugins/dice/Warrior.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require_relative 'Character'
|
||||
|
||||
class Warrior < Character
|
||||
|
||||
def initialize str, *arg
|
||||
super(str, 10, 10, 10, 10, 10, *arg)
|
||||
end
|
||||
|
||||
def str; carac[:str]; end
|
||||
def bstr; (str - 10) / 2; end
|
||||
|
||||
end
|
84
plugins/dice/Weapon.rb
Normal file
84
plugins/dice/Weapon.rb
Normal file
|
@ -0,0 +1,84 @@
|
|||
require_relative 'Dice'
|
||||
require_relative 'Warrior'
|
||||
|
||||
class Weapon
|
||||
attr_reader :from, :degats, :opt, :bonus
|
||||
|
||||
def initialize from, degats, opt, bonus, attack_opt={}
|
||||
@from = from
|
||||
@bonus = from.bab.map{|e| e + bonus}
|
||||
@degats = Dice.new(degats + "+#{(from.bstr * 1.5).ceil}")
|
||||
@hands = opt[:hands] || 1
|
||||
@max = attack_opt[:max] || Float::INFINITY
|
||||
end
|
||||
|
||||
def min
|
||||
@degats.min
|
||||
end
|
||||
|
||||
def max
|
||||
@degats.max
|
||||
end
|
||||
|
||||
def mean
|
||||
@degats.mean
|
||||
end
|
||||
|
||||
def test
|
||||
@degats.test
|
||||
end
|
||||
|
||||
def mean_p(ca=20.0)
|
||||
d = @degats.mean.inject(&:+)
|
||||
p(ca).map do |b|
|
||||
(b * d).round(4)
|
||||
end
|
||||
end
|
||||
|
||||
def p(ca=20.0)
|
||||
@bonus.map do |b|
|
||||
((b + from.bstr) / ca.to_f).round(4)
|
||||
end
|
||||
end
|
||||
|
||||
def mean_p_total(ca=20.0)
|
||||
mean_p(ca).inject(&:+).round(4)
|
||||
end
|
||||
|
||||
def to_s(ca=20)
|
||||
"mean: #{mean} * #{p(ca)} => #{mean_p(ca)} = #{mean_p_total(ca)}"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
alteration = 2
|
||||
taille = -2
|
||||
bonus = alteration + taille
|
||||
|
||||
epees = []
|
||||
normal = Warrior.new 18, {bab: [7, 1]}
|
||||
epees << ["normal", Weapon.new(normal, "4d6+2", {hands: 2}, bonus)]
|
||||
|
||||
rage = Warrior.new 19+4, {bab: [7, 1]}
|
||||
epees << ["rage", Weapon.new(rage, "4d6+2", {hands: 2}, bonus)]
|
||||
|
||||
fren = Warrior.new 19+6, {bab: [7, 1]}
|
||||
epees << ["frenesie", Weapon.new(fren, "4d6+2", {hands: 2}, bonus)]
|
||||
|
||||
ra_fr = Warrior.new 19+4+6, {bab: [7, 7, 1]}
|
||||
epees << ["rage+frenesie", Weapon.new(ra_fr, "4d6+2", {hands: 2}, bonus)]
|
||||
|
||||
ra_fr_so = Warrior.new 19+6+4, {bab: [7, 7, 1]}
|
||||
epees << ["rage+frenesie+sorciere", Weapon.new(ra_fr_so, "4d6+2+5+1d6", {hands: 2}, bonus)]
|
||||
|
||||
ra_fr_so_buff = Warrior.new 19+6+4+4, {bab: [7, 7, 1]}
|
||||
epees << ["rage+frenesie+sorciere+taureau+benediction", Weapon.new(ra_fr_so, "4d6+2+5+1d6", {hands: 2}, bonus+1)]
|
||||
|
||||
ra_fr_so_buff_char = Warrior.new 19+6+4+4, {bab: [7, 7]}
|
||||
epees << ["rage+frenesie+sorciere+taureau+benediction+charge", Weapon.new(ra_fr_so, "4d6+2+5+1d6", {hands: 2}, bonus+1+2, {max: 2})]
|
||||
|
||||
epees = Hash[epees]
|
||||
require 'pry'
|
||||
binding.pry
|
||||
end
|
22
plugins/diceroller.rb
Normal file
22
plugins/diceroller.rb
Normal file
|
@ -0,0 +1,22 @@
|
|||
require_relative 'dice/Dice'
|
||||
require_relative 'dice/Weapon'
|
||||
require_relative 'dice/Character'
|
||||
require_relative 'dice/Warrior'
|
||||
|
||||
class Diceroller < Botpop::Plugin
|
||||
include Cinch::Plugin
|
||||
|
||||
match(/!roll (.+)/, use_prefix: false, method: :exec_roll)
|
||||
|
||||
HELP = ["!roll (d20 ...)"]
|
||||
ENABLED = config['enable'].nil? ? false : config['enable']
|
||||
CONFIG = config
|
||||
|
||||
CHARACTER = Warrior.new 10, {bab: [0]}
|
||||
|
||||
def exec_roll(m, roll)
|
||||
val = Weapon.new(CHARACTER, roll, {hands: 1}, 0).test
|
||||
m.reply "Roll ... '#{roll}' ... #{val}"
|
||||
end
|
||||
|
||||
end
|
35
plugins/eip.rb
Normal file
35
plugins/eip.rb
Normal file
|
@ -0,0 +1,35 @@
|
|||
class Eip < Botpop::Plugin
|
||||
include Cinch::Plugin
|
||||
|
||||
match(/!eip add (.*)/, use_prefix: false, method: :exec_add)
|
||||
match(/!eip ls/, use_prefix: false, method: :exec_ls)
|
||||
match(/!eip (\d+)/, use_prefix: false, method: :exec_id)
|
||||
|
||||
HELP = ["!eip add ...", "!eip ls", "!eip id"]
|
||||
ENABLED = config['enable'].nil? ? false : config['enable']
|
||||
CONFIG = config
|
||||
|
||||
def exec_add(m, title)
|
||||
begin
|
||||
Base::DB[:eips].insert(author: m.user.authname,
|
||||
title: title,
|
||||
created_at: Time.now)
|
||||
m.reply "Ok ! #{title} is a new eip"
|
||||
rescue
|
||||
m.reply "Err"
|
||||
end
|
||||
end
|
||||
|
||||
def exec_id(m, id)
|
||||
all = Base::DB[:eips].where(id: Integer(id)).first
|
||||
m.reply all[:title] rescue m.reply("no such id")
|
||||
end
|
||||
|
||||
def exec_ls(m)
|
||||
all = Base::DB[:eips].limit(3).reverse.all
|
||||
all.each{|e| m.reply e[:title]}
|
||||
n = Base::DB[:eips].count
|
||||
m.reply("There is #{n} elements")
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue
Block a user