Zefram
2014-04-26 e748af927a0ec2b593fa3775b17bd40864ba6f60
Fix drill charge usage

The drills weren't taking the variable usage cost into account (either
the per-type base cost or the per-mode multiplier) when deciding whether
they have sufficient charge to use. This could cause them to overshoot in
charge usage, although they would then clamp to zero rather than record
negative charge. Also, for the Mk1 drill where the cost was assessed
correctly, the drill would refuse to discharge to exactly zero charge.
1 files modified
68 ■■■■ changed files
technic/tools/mining_drill.lua 68 ●●●● patch | view | raw | blame | history
technic/tools/mining_drill.lua
@@ -1,9 +1,5 @@
local mining_drill_max_charge      = 50000
local mining_drill_mk2_max_charge  = 200000
local mining_drill_mk3_max_charge  = 650000
local mining_drill_power_usage     = 200
local mining_drill_mk2_power_usage = 500
local mining_drill_mk3_power_usage = 800
local max_charge = {50000, 200000, 650000}
local power_usage_per_node = {200, 500, 800}
local S = technic.getter
@@ -140,9 +136,19 @@
    drill_dig_it0 (pos,player)
end
local function cost_to_use(drill_type, mode)
    local mult
    if mode == 1 then
        mult = 1
    elseif mode <= 4 then
        mult = 3
    else
        mult = 9
    end
    return power_usage_per_node[drill_type] * mult
end
local function drill_dig_it(pos, player, drill_type, mode)
    local charge
local function drill_dig_it(pos, player, mode)
    if mode == 1 then
        drill_dig_it0(pos, player)
    end
@@ -220,18 +226,7 @@
        end
    end
    
    if drill_type==1 then charge=mining_drill_power_usage end
    if drill_type==2 then
        if  mode==1 then charge=mining_drill_mk2_power_usage end
        if (mode==2 or mode==3 or mode==4) then charge=mining_drill_mk2_power_usage*3 end
    end
    if drill_type==3 then
        if  mode==1 then charge=mining_drill_mk3_power_usage end
        if (mode==2 or mode==3 or mode==4) then charge=mining_drill_mk3_power_usage*6 end
        if mode==5 then charge=mining_drill_mk3_power_usage*9 end
    end
    minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
    return charge
end
local function mining_drill_mk2_setmode(user,itemstack)
@@ -293,13 +288,13 @@
    if pointed_thing.type ~= "node" or not meta.charge then
        return
    end
    if meta.charge - mining_drill_power_usage > 0 then
    local charge_to_take = cost_to_use(2, meta.mode)
    if meta.charge >= charge_to_take then
        local pos = minetest.get_pointed_thing_position(pointed_thing, above)
        local charge_to_take = drill_dig_it(pos, user, 2, meta.mode)
        drill_dig_it(pos, user, meta.mode)
        meta.charge = meta.charge - charge_to_take
        meta.charge = math.max(meta.charge, 0)
        itemstack:set_metadata(minetest.serialize(meta))
        technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk2_max_charge)
        technic.set_RE_wear(itemstack, meta.charge, max_charge[2])
    end
    return itemstack
end
@@ -314,18 +309,18 @@
    if pointed_thing.type ~= "node" or not meta.charge then
        return
    end
    if meta.charge - mining_drill_power_usage > 0 then
    local charge_to_take = cost_to_use(3, meta.mode)
    if meta.charge >= charge_to_take then
        local pos = minetest.get_pointed_thing_position(pointed_thing, above)
        local charge_to_take = drill_dig_it(pos, user, 3, meta.mode)
        drill_dig_it(pos, user, meta.mode)
        meta.charge = meta.charge - charge_to_take
        meta.charge = math.max(meta.charge, 0)
        itemstack:set_metadata(minetest.serialize(meta))
        technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk3_max_charge)
        technic.set_RE_wear(itemstack, meta.charge, max_charge[3])
    end
    return itemstack
end
technic.register_power_tool("technic:mining_drill", mining_drill_max_charge)
technic.register_power_tool("technic:mining_drill", max_charge[1])
minetest.register_tool("technic:mining_drill", {
    description = S("Mining Drill Mk%d"):format(1),
@@ -339,12 +334,13 @@
        if not meta or not meta.charge then
            return
        end
        if meta.charge - mining_drill_power_usage > 0 then
        local charge_to_take = cost_to_use(1, 1)
        if meta.charge >= charge_to_take then
            local pos = minetest.get_pointed_thing_position(pointed_thing, above)
            charge_to_take = drill_dig_it(pos, user, 1, 1)
            meta.charge = meta.charge - mining_drill_power_usage
            drill_dig_it(pos, user, 1)
            meta.charge = meta.charge - charge_to_take
            itemstack:set_metadata(minetest.serialize(meta))
            technic.set_RE_wear(itemstack, meta.charge, mining_drill_max_charge)
            technic.set_RE_wear(itemstack, meta.charge, max_charge[1])
        end
        return itemstack
    end,
@@ -359,10 +355,10 @@
    end,
})
technic.register_power_tool("technic:mining_drill_mk2", mining_drill_mk2_max_charge)
technic.register_power_tool("technic:mining_drill_mk2", max_charge[2])
for i = 1, 4 do
    technic.register_power_tool("technic:mining_drill_mk2_"..i, mining_drill_mk2_max_charge)
    technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2])
    minetest.register_tool("technic:mining_drill_mk2_"..i, {
        description = S("Mining Drill Mk%d Mode %d"):format(2, i),
        inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png",
@@ -384,10 +380,10 @@
    end,
})
technic.register_power_tool("technic:mining_drill_mk3", mining_drill_mk3_max_charge)
technic.register_power_tool("technic:mining_drill_mk3", max_charge[3])
for i=1,5,1 do
    technic.register_power_tool("technic:mining_drill_mk3_"..i, mining_drill_mk3_max_charge)
    technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3])
    minetest.register_tool("technic:mining_drill_mk3_"..i, {
        description = S("Mining Drill Mk%d Mode %d"):format(3, i),
        inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png",