add diceroller

This commit is contained in:
Arthur Poulet 2016-03-21 16:30:10 +01:00
parent 4480cabf5a
commit 9826602375
7 changed files with 269 additions and 0 deletions

View File

@ -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
View 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
View 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
View 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
View 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
View 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
View 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