diff options
author | Zefram <zefram@fysh.org> | 2014-04-26 20:02:19 +0100 |
---|---|---|
committer | ShadowNinja <shadowninja@minetest.net> | 2014-04-27 14:43:00 -0400 |
commit | e748af927a0ec2b593fa3775b17bd40864ba6f60 (patch) | |
tree | 2877b0b81cb7d4110079f323ad1343801a009357 | |
parent | 04c6f5bea38d7c3ac2d09760534e6405102a61c2 (diff) |
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.
-rw-r--r-- | technic/tools/mining_drill.lua | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/technic/tools/mining_drill.lua b/technic/tools/mining_drill.lua index e3a01de..0471c71 100644 --- a/technic/tools/mining_drill.lua +++ b/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 @@ local function drill_dig_it4 (pos,player) 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 @@ local function drill_dig_it(pos, player, drill_type, mode) 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 @@ local function mining_drill_mk2_handler(itemstack, user, pointed_thing) 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 @@ local function mining_drill_mk3_handler(itemstack, user, pointed_thing) 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 @@ minetest.register_tool("technic:mining_drill", { 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 @@ minetest.register_tool("technic:mining_drill_mk2", { 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 @@ minetest.register_tool("technic:mining_drill_mk3", { 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", |