Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- player = {
- name = 'Global player',
- health = 1000,
- mana = 1000,
- fire = function(self)
- self.health = self.health - 10
- print(self.name, 'Health', self.health)
- end,
- }
- function math.randomReal(min, max)
- return math.random()*(max-min)+min
- end
- function math.round(value)
- return math.floor(value+0.5)
- end
- function math.dice(dice,side)
- local x = 0
- for i=1,dice do
- x = x + math.random(1,side)
- end
- return x
- end
- function math.chance(chance)
- local x = math.random()
- if x <= chance then
- return true
- else
- return false
- end
- end
- function graph()
- local a = {}
- local x = 333
- local calc
- local s=''
- for i=1, 1000 do
- a[i] = 0
- end
- for i=1, x do
- --y = math.random(1,50)
- --calc = math.round(math.dice(3,y)/3)
- calc = math.dice(5,5)
- a[calc] = a[calc] + 1
- end
- for i=1, x do
- if a[i]>0 then
- --for y=1, a[i] do
- s=string.rep('#',a[i])
- --end
- print(("%d\t: %s"):format(i,s))
- s=''
- end
- end
- return
- end
- playerEx = function(name)
- local obj = {}
- local health = 1000
- local health_max = health
- local mana = 100
- local mana_max = mana
- local armor = 10
- local shield = 6
- local shield_blocking = true
- local shield_block_chance = 0.25
- local shield_mana = 20 -- fueled by mana
- local shield_mana_ratio = 2.0 -- 0.5 = 1 mana ochrani pred 2 dmg
- local evasion = 0.01
- local miss = 0.03
- local pain_chance = 0.5 -- pohyb nemeni, len sa prida duration do sekvencie co prebieha, aka mini-stun
- local pain_threshold = 12 -- dmg pod tuto hranicu bude sanca na pain deleno 4, (napr. berserk +50, alebo berserk znizi sancu?)
- local attribute = {
- str = 5,
- vit = 10,
- agi = 5,
- dex = 5,
- int = 5,
- pow = 5,
- }
- local resist = {
- normal = 0,
- spell = 0,
- fire = 0,
- explosive = 0,
- energy = 0,
- acid = 0,
- mental = 0,
- disease = 0,
- rad = 0,
- gas = 0,
- }
- local name = name or 'Default player name'
- local race = 'human' -- human, alien, undead, cyborg, robot, natural, unnatural
- obj.resist = resist
- obj.attribute_vit = function() -- priklad funkcie ktora bude menit staty podla vitality
- local x = attribute['vit']
- health_max = 1000 + x*5
- health = health_max
- pain_threshold = math.round(5 + x*0.85)
- resist['disease'] = 0 + x*0.5
- end
- obj.test = function(damage_input,ranged,weapon_type)
- --local weapon_type = 'energy' -- normal, heavy, energy, exotic
- local damage_output = damage_input*0.01
- if ranged then
- --if weapon_type = 'normal' then
- -- return damage_output*attribute['dex']
- --end
- --if weapon_type = 'heavy' then
- -- return damage_output*attribute['dex']*0.5
- --end
- --if weapon_type = 'energy' then
- -- return damage_output*attribute['pow']
- --end
- --if weapon_type = 'exotic' then
- -- return damage_output*attribute['int']*2
- --end
- else
- return damage_output*attribute['str']*2
- end
- return 0
- end
- obj.fire = function(damage_input,damage_type,ranged)
- local damage_type = damage_type or 'normal'
- local ranged = ranged or false
- local shield_mana_calc = math.randomReal(shield_mana*0.66,shield_mana)
- shield_mana_calc = math.min(shield_mana_calc,mana/shield_mana_ratio)
- local mana_decrease = shield_mana_calc*shield_mana_ratio --math.min(shield_mana_calc,damage_input)*shield_mana_ratio
- --print(mana_decrease)
- --if mana*shield_mana_ratio < shield_mana_calc then
- --if mana<=0 then
- -- shield_mana_calc = 0
- --end
- if mana-mana_decrease<0 then
- --shield_mana_calc = shield_mana_calc - (mana_decrease-mana)*shield_mana_ratio
- --shield_mana_calc = shield_mana_calc - mana*shield_mana_ratio
- mana = 0
- else
- mana = mana - mana_decrease
- end
- if shield_mana_calc<0 then
- shield_mana_calc = 0
- end
- local shield_calc = 0
- local pain_threshold_bonus = 0
- if shield_blocking then
- if math.chance(shield_block_chance) then
- shield_calc = 1000 -- 'chance to block'
- else
- shield_calc = math.randomReal(shield*0.5, shield) -- if blocking
- end
- else
- shield_calc = math.randomReal(shield*0.15, shield) -- if not blocking with shield activelly
- end
- local armor_calc = math.randomReal(armor*0.5, armor)
- local damage_output = math.max(damage_input - shield_mana_calc - shield_calc - armor_calc,1)
- local pain_bool = math.chance(pain_chance)
- damage_output = damage_output - (damage_output*resist[damage_type])
- --if math.random() <= 0.33 then damage_output = damage_output * 1.525 end -- critical
- damage_output = math.max(math.floor(damage_output),1)
- --if damage < 1 then damage = 1 end
- health = health - damage_output
- if pain_bool then
- if shield_blocking then pain_threshold_bonus = shield_calc + math.dice(3,shield)/3 end -- krasne to berie do uvahy aj 'chance to block'
- if damage_output < (pain_threshold + pain_threshold_bonus) then
- pain_bool = math.chance(pain_chance/4)
- print(("---> Pain treshold %0.2f"):format(pain_threshold_bonus))
- end
- end
- --print(name, 'Health:',health,'damage_input:',damage_input,'armor_calc:',armor_calc,'damage_output:',damage_output)
- print(("Name: %s\tHealth: %d\tMana: %d \tDMG_input: %d\tarmor_calc: %0.2f\tshield_calc: %0.2f\tshield_mana_calc: %0.2f\t\tDMG_output: %d\t\tPain: %s"):format(name, health, mana, damage_input, armor_calc, shield_calc, shield_mana_calc, damage_output, pain_bool))
- end
- return obj
- end
- function hitChance()
- local chance = 1.0 -- 80% ze trafi
- local result = math.random()
- if result <= chance then
- return true
- else
- return false
- end
- end
- math.randomseed(os.time())
- dmg_base = 10
- dmg_dice = 9
- dmg_side = 6
- local player1 = playerEx('John')
- local player2 = playerEx('Hrac 2')
- --player1.fire()
- --player2.fire()
- player1.attribute_vit()
- for i=1,20 do
- local result = math.chance(1.0) --hitChance()
- local dice = math.dice(dmg_dice,dmg_side)
- local dmg_bonus = player1.test(dmg_base+dice,false,'exotic')
- print(("#%d\tHit: %s\t\t\t\tDMG_input: %d+%d+%d"):format(i,result,dmg_base,dice,dmg_bonus))
- -- if result then player1.fire(math.random(50,60)) end
- if result then player1.fire(dmg_base+dice+dmg_bonus) end
- end
- --player:fire()
- --player.fire(player)
- graph()
Advertisement
Add Comment
Please, Sign In to add comment