diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 6b9d1e8018..defdfd6402 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -217,6 +217,7 @@ /obj/item/stack/medical/gauze/cyborg custom_materials = null is_cyborg = TRUE + source = /datum/robot_energy_storage/medical cost = 250 /obj/item/stack/medical/suture @@ -441,6 +442,7 @@ /obj/item/stack/medical/bone_gel/cyborg custom_materials = null is_cyborg = TRUE + source = /datum/robot_energy_storage/medical cost = 250 /obj/item/stack/medical/aloe diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6a0ed45e30..c0fde9ce73 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ /obj/item/stack/rods/update_icon_state() var/amount = get_amount() - if(amount <= 5) + if(amount <= 5 && amount >= 1) icon_state = "rods-[amount]" else icon_state = "rods" @@ -77,11 +77,8 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ /obj/item/stack/rods/cyborg custom_materials = null is_cyborg = TRUE - cost = 250 - -/obj/item/stack/rods/cyborg/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_blocker) + source = /datum/robot_energy_storage/medical + cost = MINERAL_MATERIAL_AMOUNT * 0.125 /obj/item/stack/rods/ten amount = 10 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 1eb49f350c..929b572e06 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -52,7 +52,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ /obj/item/stack/sheet/glass/cyborg custom_materials = null is_cyborg = TRUE - cost = 500 + source = /datum/robot_energy_storage/glass + cost = MINERAL_MATERIAL_AMOUNT * 0.25 /obj/item/stack/sheet/glass/fifty amount = 50 @@ -179,9 +180,15 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ /obj/item/stack/sheet/rglass/cyborg custom_materials = null is_cyborg = TRUE - var/datum/robot_energy_storage/glasource - var/metcost = 250 - var/glacost = 500 + source = /datum/robot_energy_storage/metal + var/datum/robot_energy_storage/glasource = /datum/robot_energy_storage/glass + var/metcost = MINERAL_MATERIAL_AMOUNT * 0.125 + var/glacost = MINERAL_MATERIAL_AMOUNT * 0.25 + +/obj/item/stack/sheet/rglass/cyborg/prepare_estorage(obj/item/robot_module/module) + . = ..() + if(glasource) + glasource = module.get_or_create_estorage(glasource) /obj/item/stack/sheet/rglass/cyborg/get_amount() return min(round(source.energy / metcost), round(glasource.energy / glacost)) @@ -189,10 +196,12 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ /obj/item/stack/sheet/rglass/cyborg/use(used, transfer = FALSE) // Requires special checks, because it uses two storages source.use_charge(used * metcost) glasource.use_charge(used * glacost) + update_icon() /obj/item/stack/sheet/rglass/cyborg/add(amount) source.add_charge(amount * metcost) glasource.add_charge(amount * glacost) + update_icon() /obj/item/stack/sheet/rglass/get_main_recipes() . = ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 070c5122c4..745fa6a321 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -164,7 +164,8 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ /obj/item/stack/sheet/metal/cyborg custom_materials = null is_cyborg = TRUE - cost = 500 + source = /datum/robot_energy_storage/metal + cost = MINERAL_MATERIAL_AMOUNT * 0.25 /obj/item/stack/sheet/metal/get_main_recipes() . = ..() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 6de1991675..6bf739ab21 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -42,6 +42,9 @@ var/matter_amount = 0 /obj/item/stack/Initialize(mapload, new_amount, merge = TRUE) + if(is_cyborg && istype(loc, /obj/item/robot_module)) + prepare_estorage(loc) + if(new_amount != null) amount = new_amount while(amount > max_amount) @@ -383,7 +386,9 @@ if(check && zero_amount()) return FALSE if (is_cyborg) - return source.use_charge(used * cost) + . = source.use_charge(used * cost) + update_icon() + return if (amount < used) return FALSE amount -= used @@ -539,3 +544,7 @@ /obj/item/stack/microwave_act(obj/machinery/microwave/M) if(istype(M) && M.dirty < 100) M.dirty += amount + +/obj/item/stack/proc/prepare_estorage(obj/item/robot_module/module) + if(source) + source = module.get_or_create_estorage(source) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 836ef04f31..84ccdfb1c5 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -536,7 +536,8 @@ /obj/item/stack/tile/plasteel/cyborg custom_materials = null // All other Borg versions of items have no Metal or Glass - RR is_cyborg = TRUE - cost = 125 + source = /datum/robot_energy_storage/metal + cost = MINERAL_MATERIAL_AMOUNT * 0.0625 /obj/item/stack/tile/material name = "floor tile" diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index c969e2d1d4..953d69dcf7 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -40,6 +40,12 @@ resistance_flags = FLAMMABLE grind_results = list(/datum/reagent/cellulose = 5) +/obj/item/stack/packageWrap/cyborg + custom_materials = null + is_cyborg = TRUE + source = /datum/robot_energy_storage/wrapping_paper + cost = 1 + /obj/item/stack/packageWrap/suicide_act(mob/living/user) user.visible_message("[user] begins wrapping [user.p_them()]self in \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") if(use(3)) diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index d8e54ae322..3ec466dad4 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -31,6 +31,12 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( /obj/item/stack/marker_beacon/thirty //and they're bought in stacks of 1, 10, or 30 amount = 30 +/obj/item/stack/marker_beacon/cyborg + is_cyborg = TRUE + custom_materials = null + source = /datum/robot_energy_storage/beacon + cost = 1 + /obj/item/stack/marker_beacon/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4459bd4413..08aa3dd3e7 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -86,7 +86,7 @@ if(!(m in R.held_items)) . += m -/obj/item/robot_module/proc/get_or_create_estorage(var/storage_type) +/obj/item/robot_module/proc/get_or_create_estorage(storage_type) for(var/datum/robot_energy_storage/S in storages) if(istype(S, storage_type)) return S @@ -95,42 +95,9 @@ /obj/item/robot_module/proc/add_module(obj/item/I, nonstandard, requires_rebuild) rad_flags |= RAD_NO_CONTAMINATE - if(istype(I, /obj/item/stack)) - var/obj/item/stack/S = I - - if(is_type_in_list(S, list(/obj/item/stack/sheet/metal, /obj/item/stack/rods, /obj/item/stack/tile/plasteel))) - if(S.custom_materials?.len && S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]) - S.cost = S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] * 0.25 - S.source = get_or_create_estorage(/datum/robot_energy_storage/metal) - - else if(istype(S, /obj/item/stack/sheet/glass)) - S.cost = 500 - S.source = get_or_create_estorage(/datum/robot_energy_storage/glass) - - else if(istype(S, /obj/item/stack/sheet/rglass/cyborg)) - var/obj/item/stack/sheet/rglass/cyborg/G = S - G.source = get_or_create_estorage(/datum/robot_energy_storage/metal) - G.glasource = get_or_create_estorage(/datum/robot_energy_storage/glass) - - else if(istype(S, /obj/item/stack/medical)) - S.cost = 250 - S.source = get_or_create_estorage(/datum/robot_energy_storage/medical) - - else if(istype(S, /obj/item/stack/cable_coil)) - S.cost = 1 - S.source = get_or_create_estorage(/datum/robot_energy_storage/wire) - - else if(istype(S, /obj/item/stack/marker_beacon)) - S.cost = 1 - S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon) - - else if(istype(S, /obj/item/stack/packageWrap)) - S.cost = 1 - S.source = get_or_create_estorage(/datum/robot_energy_storage/wrapping_paper) - - if(S && S.source) - S.set_custom_materials(null) - S.is_cyborg = 1 + var/obj/item/stack/S = I + if(istype(I, /obj/item/stack) && !S.is_cyborg) // Now handled in the type itself + stack_trace("Non-cyborg variant of /obj/item/stack added to a cyborg's modules.") if(I.loc != src) I.forceMove(src) @@ -935,9 +902,9 @@ /obj/item/gps/cyborg, /obj/item/gripper/mining, /obj/item/cyborg_clamp, - /obj/item/stack/marker_beacon, + /obj/item/stack/marker_beacon/cyborg, /obj/item/destTagger, - /obj/item/stack/packageWrap, + /obj/item/stack/packageWrap/cyborg, /obj/item/card/id/miningborg) emag_modules = list(/obj/item/borg/stun) ratvar_modules = list( @@ -1056,7 +1023,7 @@ /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/bonesetter, - /obj/item/stack/medical/bone_gel, + /obj/item/stack/medical/bone_gel/cyborg, /obj/item/melee/transforming/energy/sword/cyborg/saw, /obj/item/roller/robo, /obj/item/card/emag, @@ -1191,7 +1158,7 @@ /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/bonesetter, - /obj/item/stack/medical/bone_gel, + /obj/item/stack/medical/bone_gel/cyborg, /obj/item/melee/transforming/energy/sword/cyborg/saw, /obj/item/roller/robo, /obj/item/stack/medical/gauze/cyborg, diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 725482117b..c1439e773c 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -517,6 +517,7 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/cyborg is_cyborg = TRUE custom_materials = null + source = /datum/robot_energy_storage/wire cost = 1 /obj/item/stack/cable_coil/cyborg/attack_self(mob/user)