soulik icon

Untitled

soulik | PRO | 07/01/14 08:30:12 PM UTC | 0 ⭐ | 400 👁️ | Never ⏰ | []
Lua |

6.28 KB

|

None

|

0 👍

/

0 👎

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 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
 
    return {
        resist = resist,
        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,
 
 
 
        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,
 
 
 
        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,
    }
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()

Comments