From 37779acf01aeb5cbcad7f39ee1cb42281f3db686 Mon Sep 17 00:00:00 2001 From: Cameron Lennox Date: Thu, 21 Aug 2025 17:08:10 -0400 Subject: [PATCH] Gets rid of hasvar usage and moves up some vars (#18262) * Gets rid of hasvar usage * thiiis * moves damtype to /obj/item * throwing * Move vars moved * matter as well Pretty much only used for the robot lathe and when crafting...When you could only smelt down obj/item for its materials * Update floor_light.dm * exploitable * this can be moved up... * move persist to /item you can't ever place /obj in storage anyway...It would imply you can store the supermatter, which I think we don't want. * gets rid of being_used I added this for xenoarch, that was a mistake * move these * move these to the base file * Makes floorlight autolathe recipe not shit * Update floor_light.dm * Update floor_light.dm * Mechs no longer gib when hitting things --------- Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com> --- code/_helpers/unsorted.dm | 12 +++-- code/datums/autolathe/autolathe.dm | 4 +- code/datums/autolathe/general.dm | 2 +- .../components/crafting/tool_quality.dm | 3 -- code/datums/vending/stored_item.dm | 8 ++- code/game/machinery/camera/camera.dm | 4 +- code/game/machinery/deployable.dm | 4 +- code/game/machinery/floor_light.dm | 16 +++++- code/game/machinery/partslathe_vr.dm | 2 +- code/game/mecha/combat/combat.dm | 26 +++++----- code/game/mecha/combat/fighter.dm | 4 +- code/game/mecha/combat/phazon.dm | 8 +-- code/game/mecha/mecha.dm | 8 +-- code/game/mecha/mecha_actions.dm | 18 +++---- code/game/mecha/micro/micro.dm | 20 ++++---- code/game/objects/explosion_recursive.dm | 3 -- code/game/objects/items.dm | 39 +++++++++++++-- code/game/objects/items/devices/flashlight.dm | 4 +- code/game/objects/items/stacks/sandbags.dm | 4 +- code/game/objects/items/stacks/stack.dm | 17 +++---- .../objects/items/weapons/cigs_lighters.dm | 4 +- .../objects/items/weapons/surgery_tools.dm | 6 +-- .../items/weapons/tools/weldingtool.dm | 4 +- code/game/objects/items_vr.dm | 5 -- code/game/objects/micro_structures.dm | 4 -- code/game/objects/objs.dm | 15 ++---- code/game/objects/structures/barricades.dm | 4 +- .../structures/ghost_pods/antagonist.dm | 10 ++-- code/game/objects/structures/grille.dm | 4 +- code/game/objects/structures/low_wall.dm | 4 +- code/game/objects/weapons.dm | 6 --- code/modules/blob/blob.dm | 4 +- code/modules/client/stored_item.dm | 10 +--- code/modules/clothing/head/misc_special.dm | 4 +- code/modules/identification/item_procs.dm | 6 --- .../modules/materials/materials/_materials.dm | 4 +- code/modules/mining/mine_items.dm | 2 +- .../equipment_vendor.dm | 2 +- code/modules/mob/inventory.dm | 37 ++++++++------ .../mob/living/carbon/human/human_defense.dm | 46 ++++++++---------- code/modules/mob/living/living_defense.dm | 20 +++----- code/modules/mob/mob.dm | 6 +-- code/modules/organs/internal/augment.dm | 5 -- .../overmap/disperser/disperser_console.dm | 2 +- code/modules/power/tesla/tesla_act.dm | 3 -- code/modules/radiation/radiation.dm | 3 -- .../reagents/reactions/instant/instant.dm | 10 ++-- .../recycling/disposal-construction.dm | 1 - code/modules/tools/tool_quality.dm | 3 -- code/modules/vehicles/vehicle.dm | 6 +-- code/modules/vore/eating/contaminate_vr.dm | 7 --- code/modules/vore/eating/digest_act_vr.dm | 7 --- code/modules/vore/eating/living_vr.dm | 3 -- .../tools/artifact_analyser.dm | 6 +-- .../tools/artifact_harvester.dm | 8 +-- icons/obj/machines/floor_light.dmi | Bin 22197 -> 22474 bytes 56 files changed, 223 insertions(+), 254 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index f933726020..e1823914b8 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -604,11 +604,13 @@ Turf and target are seperate in case you want to teleport some distance from a t cant_pass = 1 return cant_pass +/* //If you uncomment and use this I will assimilate you. -C.L. //Takes: Anything that could possibly have variables and a varname to check. //Returns: 1 if found, 0 if not. /proc/hasvar(var/datum/A, var/varname) if(A.vars.Find(lowertext(varname))) return 1 else return 0 +*/ //Returns: all the areas in the world /proc/return_areas() @@ -1065,8 +1067,8 @@ GLOBAL_LIST_INIT(common_tools, list( return 0 //Whether or not the given item counts as sharp in terms of dealing damage -/proc/is_sharp(obj/O as obj) - if(!O) +/proc/is_sharp(obj/item/O) + if(!isitem(O)) return FALSE if(O.sharp) return TRUE @@ -1075,8 +1077,8 @@ GLOBAL_LIST_INIT(common_tools, list( return FALSE //Whether or not the given item counts as cutting with an edge in terms of removing limbs -/proc/has_edge(obj/O as obj) - if(!O) +/proc/has_edge(obj/item/O) + if(!isitem(O)) return FALSE if(O.edge) return TRUE @@ -1624,7 +1626,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) * * multiplier - multiplier passed to set_custom_materials * * [target_object][atom] - the target object who's custom materials we are trying to modify */ -/proc/split_materials_uniformly(list/custom_materials, multiplier, obj/target_object) +/proc/split_materials_uniformly(list/custom_materials, multiplier, obj/item/target_object) target_object.set_custom_materials(custom_materials) // if(!length(target_object.contents)) //most common case where the object is just 1 thing diff --git a/code/datums/autolathe/autolathe.dm b/code/datums/autolathe/autolathe.dm index a586c83454..6684c9404d 100644 --- a/code/datums/autolathe/autolathe.dm +++ b/code/datums/autolathe/autolathe.dm @@ -4,8 +4,8 @@ if(path) I = new path() - if(!I) // Something has gone horribly wrong, or right. - log_debug("[name] created an Autolathe design without an assigned path.") + if(!isitem(I)) // Something has gone horribly wrong, or right. + log_debug("[name] created an Autolathe design without an assigned path or illegal item. Item = [I]") return if(I.matter && !resources) diff --git a/code/datums/autolathe/general.dm b/code/datums/autolathe/general.dm index 610a27bc98..68240f10b0 100644 --- a/code/datums/autolathe/general.dm +++ b/code/datums/autolathe/general.dm @@ -55,7 +55,7 @@ /datum/category_item/autolathe/general/floor_light name = "floor light" - path =/obj/machinery/floor_light + path =/obj/item/floor_light /datum/category_item/autolathe/general/extinguisher name = "extinguisher" diff --git a/code/datums/components/crafting/tool_quality.dm b/code/datums/components/crafting/tool_quality.dm index 5950cf72f4..e36fd5b3e8 100644 --- a/code/datums/components/crafting/tool_quality.dm +++ b/code/datums/components/crafting/tool_quality.dm @@ -1,6 +1,3 @@ -/obj/item - var/list/tool_qualities - /// Used to check for a specific tool quality on an item. /// Returns TRUE or FALSE depending on whether `tool_quality` is found. /obj/item/proc/has_tool_quality(tool_quality) diff --git a/code/datums/vending/stored_item.dm b/code/datums/vending/stored_item.dm index 7704801b8b..3d6a9b7a8a 100644 --- a/code/datums/vending/stored_item.dm +++ b/code/datums/vending/stored_item.dm @@ -42,11 +42,9 @@ var/atom/movable/product = instances[instances.len] // Remove the last added product instances -= product product.forceMove(product_location) - //VOREStation Addition Start - if(istype(product, /obj)) - var/obj/item = product - item.persist_storable = FALSE - //VOREStation Addition End + if(istype(product, /obj/item)) + var/obj/item/our_item = product + our_item.persist_storable = FALSE return product /datum/stored_item/proc/add_product(var/atom/movable/product) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 9d0b7939e2..9eb9dea09f 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -124,8 +124,8 @@ /obj/machinery/camera/hitby(AM as mob|obj) ..() if (istype(AM, /obj)) - var/obj/O = AM - if (O.throwforce >= src.toughness) + var/obj/item/O = AM + if(O.throwforce >= src.toughness) visible_message(span_boldwarning("[src] was hit by [O].")) take_damage(O.throwforce) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index b7f8ed5eb3..c3848234ff 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -61,9 +61,9 @@ Deployable items return else switch(W.damtype) - if("fire") + if(BURN) health -= W.force * 0.75 - if("brute") + if(BRUTE) health -= W.force * 0.5 playsound(src, 'sound/weapons/smash.ogg', 50, 1) CheckHealth() diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 9768de95c0..c1bde9ad35 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -1,5 +1,20 @@ var/list/floor_light_cache = list() +/obj/item/floor_light + name = "floor light kit" + desc = "A backlit floor panel, ready for installation!" + icon = 'icons/obj/machines/floor_light.dmi' + icon_state = "item" + matter = list(MAT_STEEL = 2500, MAT_GLASS = 2750) + +/obj/item/floor_light/attack_self(mob/user) + var/turf/T = get_turf(user) + if(!T) + to_chat(user, span_warning("You need to be on a floor to install this.")) + return + new /obj/machinery/floor_light(T) + qdel(src) + /obj/machinery/floor_light name = "floor light" icon = 'icons/obj/machines/floor_light.dmi' @@ -11,7 +26,6 @@ var/list/floor_light_cache = list() idle_power_usage = 2 active_power_usage = 20 power_channel = LIGHT - matter = list(MAT_STEEL = 2500, MAT_GLASS = 2750) var/on var/damaged diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm index cc573d188e..138378519b 100644 --- a/code/game/machinery/partslathe_vr.dm +++ b/code/game/machinery/partslathe_vr.dm @@ -196,7 +196,7 @@ /obj/machinery/partslathe/proc/build(var/datum/category_item/partslathe/D) for(var/M in D.resources) materials[M] = max(0, materials[M] - CEILING((D.resources[M] * mat_efficiency), 1)) - var/obj/new_item = D.build(loc); + var/obj/item/new_item = D.build(loc); if(new_item) new_item.loc = loc if(mat_efficiency < 1) // No matter out of nowhere diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 4632df4101..4f0d724943 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -44,7 +44,7 @@ var/mob/living/M = T if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) //Brains cannot change intents; Exo-piloting brains lack any form of physical feedback for control, limiting the ability to 'play nice'. playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1) - if(damtype == "brute") + if(damage_type == BRUTE) step_away(M,src,15) /* if(M.stat>1) @@ -61,19 +61,19 @@ var/obj/item/organ/external/temp = H.get_organ(pick(BP_TORSO, BP_TORSO, BP_TORSO, BP_HEAD)) if(temp) var/update = 0 - switch(damtype) - if("brute") + switch(damage_type) + if(BRUTE) H.Paralyse(1) update |= temp.take_damage(rand(force/2, force), 0) - if("fire") + if(BURN) update |= temp.take_damage(0, rand(force/2, force)) - if("tox") + if(TOX) if(H.reagents) if(H.reagents.get_reagent_amount(REAGENT_ID_CARPOTOXIN) + force < force*2) H.reagents.add_reagent(REAGENT_ID_CARPOTOXIN, force) if(H.reagents.get_reagent_amount(REAGENT_ID_CRYPTOBIOLIN) + force < force*2) H.reagents.add_reagent(REAGENT_ID_CRYPTOBIOLIN, force) - if("halloss") + if(HALLOSS) H.stun_effect_act(1, force / 2, BP_TORSO, src) else return @@ -81,13 +81,13 @@ H.updatehealth() else - switch(damtype) - if("brute") + switch(damage_type) + if(BRUTE) M.Paralyse(1) M.take_overall_damage(rand(force/2, force)) - if("fire") + if(BURN) M.take_overall_damage(0, rand(force/2, force)) - if("tox") + if(TOX) if(M.reagents) if(M.reagents.get_reagent_amount(REAGENT_ID_CARPOTOXIN) + force < force*2) M.reagents.add_reagent(REAGENT_ID_CARPOTOXIN, force) @@ -112,15 +112,15 @@ if(istype(T, /obj/machinery/disposal)) // Stops mechs from climbing into disposals return if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) // Don't smash unless we mean it - if(damtype == "brute") + if(damage_type == BRUTE) src.occupant_message("You hit [T].") src.visible_message(span_bolddanger("[src.name] hits [T]")) playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1) if(istype(T, /obj/structure/girder)) - T:take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four punches, girders take (with this value-mod) two, girders took five without. + T.take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four punches, girders take (with this value-mod) two, girders took five without. else - T:take_damage(force) + T.take_damage(force) melee_can_hit = 0 diff --git a/code/game/mecha/combat/fighter.dm b/code/game/mecha/combat/fighter.dm index 3bb4fbd15b..252c04c124 100644 --- a/code/game/mecha/combat/fighter.dm +++ b/code/game/mecha/combat/fighter.dm @@ -182,7 +182,7 @@ stop_hover() else if(moved && gravity && !ground_capable) occupant_message("Collision alert! Vehicle not rated for use in gravity!") - take_damage(NOGRAV_FIGHTER_DAMAGE, "brute") + take_damage(NOGRAV_FIGHTER_DAMAGE, BRUTE) playsound(src, 'sound/effects/grillehit.ogg', 50, 1) /obj/mecha/combat/fighter/get_step_delay() @@ -238,7 +238,7 @@ . = ..() if(istype(obstacle, /obj) || istype(obstacle, /turf)) occupant_message(span_bolddanger(span_large("COLLISION ALERT!"))) - take_damage(20, "brute") + take_damage(20, BRUTE) playsound(src, 'sound/mecha/fighter/fighter_collision.ogg', 50) ////////////// Gunpod ////////////// diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 6183d53040..4b70f0d2fd 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -148,12 +148,12 @@ return switch(new_damtype) if("Force") - damtype = "brute" + damage_type = BRUTE if("Energy") - damtype = "fire" + damage_type = BURN if("Stun") - damtype = "halloss" - src.occupant_message("Melee damage type switched to [new_damtype]") + damage_type = HALLOSS + occupant_message("Melee damage type switched to [new_damtype]") return //Meant for random spawns. diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b4b937fa21..f8a151d9b6 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -44,6 +44,7 @@ var/lights = 0 var/lights_power = 6 var/force = 0 + var/damage_type = BRUTE var/mech_faction = null var/firstactivation = 0 //It's simple. If it's 0, no one entered it yet. Otherwise someone entered it at least once. @@ -997,7 +998,7 @@ //////// Health related procs //////// //////////////////////////////////////// -/obj/mecha/take_damage(amount, type="brute") +/obj/mecha/take_damage(amount, type=BRUTE) update_damage_alerts() if(amount) var/damage = absorbDamage(amount,type) @@ -1146,10 +1147,9 @@ if(isliving(A)) var/mob/living/M = A M.take_organ_damage(10) - else if(istype(A, /obj)) - var/obj/O = A + else if(istype(A, /obj/item)) + var/obj/item/O = A if(O.throwforce) - var/pass_damage = O.throwforce var/pass_damage_reduc_mod if(pass_damage <= temp_damage_minimum)//Too little to go through. diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index d3d5b1bd72..3e69b9af18 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -230,9 +230,7 @@ /datum/action/innate/mecha/mech_switch_damtype/Activate() - - - button_icon_state = "mech_damtype_[chassis.damtype]" + button_icon_state = "mech_damtype_[chassis.damage_type]" playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1) build_all_button_icons() chassis.query_damtype() @@ -416,15 +414,15 @@ return switch(new_damtype) if("Brute") - damtype = "brute" - src.occupant_message("Your exosuit's hands form into fists.") + damage_type = BRUTE + occupant_message("Your exosuit's hands form into fists.") if("Fire") - damtype = "fire" - src.occupant_message("A torch tip extends from your exosuit's hand, glowing red.") + damage_type = BURN + occupant_message("A torch tip extends from your exosuit's hand, glowing red.") if("Toxic") - damtype = "tox" - src.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") - src.occupant_message("Melee damage type switched to [new_damtype]") + damage_type = TOX + occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.") + occupant_message("Melee damage type switched to [new_damtype]") return diff --git a/code/game/mecha/micro/micro.dm b/code/game/mecha/micro/micro.dm index 95950320c6..445589a203 100644 --- a/code/game/mecha/micro/micro.dm +++ b/code/game/mecha/micro/micro.dm @@ -30,7 +30,7 @@ var/mob/living/M = target if(src.occupant.a_intent == I_HURT) playsound(src, 'sound/weapons/punch4.ogg', 50, 1) - if(damtype == "brute") + if(damage_type == BRUTE) step_away(M,src,15) if(ishuman(target)) @@ -40,12 +40,12 @@ var/obj/item/organ/external/temp = H.get_organ(pick(BP_TORSO, BP_TORSO, BP_TORSO, BP_HEAD)) if(temp) var/update = 0 - switch(damtype) - if("brute") + switch(damage_type) + if(BRUTE) update |= temp.take_damage(rand(force/2, force), 0) - if("fire") + if(BURN) update |= temp.take_damage(0, rand(force/2, force)) - if("tox") + if(TOX) if(H.reagents) if(H.reagents.get_reagent_amount(REAGENT_ID_CARPOTOXIN) + force < force*2) H.reagents.add_reagent(REAGENT_ID_CARPOTOXIN, force) @@ -57,13 +57,13 @@ H.updatehealth() else - switch(damtype) - if("brute") + switch(damage_type) + if(BRUTE) M.Paralyse(1) M.take_overall_damage(rand(force/2, force)) - if("fire") + if(BURN) M.take_overall_damage(0, rand(force/2, force)) - if("tox") + if(TOX) if(M.reagents) if(M.reagents.get_reagent_amount(REAGENT_ID_CARPOTOXIN) + force < force*2) M.reagents.add_reagent(REAGENT_ID_CARPOTOXIN, force) @@ -85,7 +85,7 @@ return else - if(damtype == "brute") + if(damage_type == BRUTE) for(var/target_type in src.destroyable_obj) if(istype(target, target_type) && hascall(target, "attackby")) src.occupant_message(span_attack("You hit [target].")) diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 3b9d2ebc31..5d72e6e79f 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -3,9 +3,6 @@ var/turf/T = get_turf(src.mob) explosion(T, power) -/obj - var/explosion_resistance - /turf var/explosion_resistance diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 43f545efe3..3d60661cc8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,6 +1,6 @@ /obj/item name = "item" - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/weapons.dmi' //'icons/obj/items.dmi' //It was accidentally set to weapons.dmi 11 months ago...leaving it as is until further analysis w_class = ITEMSIZE_NORMAL blocks_emissive = EMISSIVE_BLOCK_GENERIC @@ -13,7 +13,7 @@ var/health = null var/burn_point = null var/burning = null - var/hitsound = null + var/hitsound = "swing_hit" var/usesound = null // Like hitsound, but for when used properly and not to kill someone. var/storage_cost = null var/slot_flags = 0 //This is used to determine on which slots an item can fit. @@ -25,8 +25,15 @@ var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants. var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/force = 0 + var/damtype = BRUTE + var/throwforce = 0 + var/sharp = FALSE // whether this object cuts + var/edge = FALSE // whether this object is more likely to dismember + var/armor_penetration = 0 + var/catchable = TRUE var/can_cleave = FALSE // If true, a 'cleaving' attack will occur. - + var/pry = 0 //Used in attackby() to open doors + var/list/matter var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, UPPER_TORSO, LOWER_TORSO, etc. flags. See setup.dm var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags @@ -115,6 +122,32 @@ var/digestable = TRUE var/item_tf_spawn_allowed = FALSE var/list/ckeys_allowed_itemspawn = null + var/datum/weakref/exploit_for //if this obj is an exploit for somebody, this points to them + var/preserve_item = 0 //whether this object is preserved when its owner goes into cryo-storage, gateway, etc + var/persist_storable = TRUE //If this is true, this item can be stored in the item bank. + //This is automatically set to false when an item is removed from storage + + var/list/possessed_voice //Allows for items to be possessed/inhabited by voices. + var/list/warned_of_possession //Checks to see who has been informed this item is possessed. + var/cleaving = FALSE // Used to avoid infinite cleaving. + var/list/tool_qualities + var/destroy_on_drop = FALSE // Used by augments to determine if the item should destroy itself when dropped, or return to its master. + var/obj/item/organ/my_augment = null // Used to reference the object's host organ. + var/datum/identification/identity = null + var/identity_type = /datum/identification + var/init_hide_identity = FALSE // Set to true to automatically obscure the object on initialization. + + //Vorestuff + var/trash_eatable = TRUE + var/digest_stage = null + var/d_mult_old = 1 //digest stage descriptions + var/d_mult = 1 //digest stage descriptions + var/d_stage_overlay //digest stage effects + var/gurgled = FALSE + var/oldname + var/cleanname + var/cleandesc + var/gurgled_color /obj/item/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 325c3c8668..905ee3df7f 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -448,14 +448,14 @@ if(.) user.visible_message(span_notice("[user] activates the flare."), span_notice("You pull the cord on the flare, activating it!")) src.force = on_damage - src.damtype = "fire" + src.damtype = BURN START_PROCESSING(SSobj, src) /obj/item/flashlight/flare/proc/ignite() //Used for flare launchers. on = !on update_brightness() force = on_damage - damtype = "fire" + damtype = BURN START_PROCESSING(SSobj, src) return 1 diff --git a/code/game/objects/items/stacks/sandbags.dm b/code/game/objects/items/stacks/sandbags.dm index 37e8c82bac..aa370dc766 100644 --- a/code/game/objects/items/stacks/sandbags.dm +++ b/code/game/objects/items/stacks/sandbags.dm @@ -75,8 +75,8 @@ if (use(required)) var/atom/O = new recipe.result_type(user.loc, bag_material) - if(istype(O, /obj)) - var/obj/Ob = O + if(istype(O, /obj/item)) + var/obj/item/Ob = O if(LAZYLEN(Ob.matter)) // Law of equivalent exchange. Ob.matter.Cut() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 7b1985f34b..604e627bdb 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -196,8 +196,8 @@ if(recipe.use_material) O = new recipe.result_type(user.loc, recipe.use_material) - if(istype(O, /obj)) - var/obj/Ob = O + if(istype(O, /obj/item)) + var/obj/item/Ob = O if(LAZYLEN(Ob.matter)) // Law of equivalent exchange. Ob.matter.Cut() @@ -213,8 +213,8 @@ O = new recipe.result_type(user.loc) if(recipe.matter_material) - if(istype(O, /obj)) - var/obj/Ob = O + if(istype(O, /obj/item)) + var/obj/item/Ob = O if(LAZYLEN(Ob.matter)) // Law of equivalent exchange. Ob.matter.Cut() @@ -228,16 +228,13 @@ O.set_dir(user.dir) O.add_fingerprint(user) - //VOREStation Addition Start - Let's not store things that get crafted with materials like this, they won't spawn correctly when retrieved. - if (isobj(O)) - var/obj/P = O - P.persist_storable = FALSE - //VOREStation Addition End if (istype(O, /obj/item/stack)) var/obj/item/stack/S = O S.amount = produced S.add_to_stacks(user) - + if (isitem(O)) + var/obj/item/P = O + P.persist_storable = FALSE if (istype(O, /obj/item/storage)) //BubbleWrap - so newly formed boxes are empty for (var/obj/item/I in O) qdel(I) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index a713527b23..452319df02 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -71,7 +71,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/flame/match/proc/burn_out() lit = 0 burnt = 1 - damtype = "brute" + damtype = BRUTE icon_state = "match_burnt" item_state = "cigoff" name = "burnt match" @@ -168,7 +168,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!src.lit) src.lit = 1 playsound(src, 'sound/items/cigs_lighters/cig_light.ogg', 75, 1, -1) - damtype = "fire" + damtype = BURN if(reagents.get_reagent_amount(REAGENT_ID_PHORON)) // the phoron explodes when exposed to fire var/datum/effect/effect/system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount(REAGENT_ID_PHORON) / 2.5, 1), get_turf(src), 0, 0) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 2227038ea0..9f7c316422 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -117,7 +117,7 @@ name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." icon_state = "scalpel_laser1" - damtype = "fire" + damtype = BURN hitsound = 'sound/weapons/blade1.ogg' clamp_chance = 75 @@ -125,7 +125,7 @@ name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced." icon_state = "scalpel_laser2" - damtype = "fire" + damtype = BURN hitsound = 'sound/weapons/blade1.ogg' force = 12.0 clamp_chance = 85 @@ -134,7 +134,7 @@ name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!" icon_state = "scalpel_laser3" - damtype = "fire" + damtype = BURN hitsound = 'sound/weapons/blade1.ogg' force = 15.0 clamp_chance = 95 diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index c72af9e232..031f41a486 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -276,7 +276,7 @@ T.visible_message(span_danger("\The [src] turns on.")) playsound(src, acti_sound, 50, 1) src.force = 15 - src.damtype = "fire" + src.damtype = BURN src.w_class = ITEMSIZE_LARGE src.hitsound = 'sound/items/welder.ogg' welding = 1 @@ -298,7 +298,7 @@ T.visible_message(span_warning("\The [src] turns off.")) playsound(src, deac_sound, 50, 1) src.force = 3 - src.damtype = "brute" + src.damtype = BRUTE src.w_class = initial(src.w_class) src.welding = 0 src.hitsound = initial(src.hitsound) diff --git a/code/game/objects/items_vr.dm b/code/game/objects/items_vr.dm index bb2d3dfc14..891329a740 100644 --- a/code/game/objects/items_vr.dm +++ b/code/game/objects/items_vr.dm @@ -1,8 +1,3 @@ -/obj/item - var/list/possessed_voice //Allows for items to be possessed/inhabited by voices. - var/list/warned_of_possession //Checks to see who has been informed this item is possessed. - - /obj/item/proc/inhabit_item(var/mob/candidate, var/candidate_name, var/mob/living/candidate_original_form, var/is_item_tf = FALSE) //This makes it so that any object in the game can have something put in it like the cursed sword! //This means the proc can also be manually called by admin commands. diff --git a/code/game/objects/micro_structures.dm b/code/game/objects/micro_structures.dm index 6e769f1c30..257d754ac9 100644 --- a/code/game/objects/micro_structures.dm +++ b/code/game/objects/micro_structures.dm @@ -278,10 +278,6 @@ GLOBAL_LIST_EMPTY(micro_tunnels) /obj/structure/micro_tunnel/magic magic = TRUE -/obj - var/micro_accepted_scale = 0.5 - var/micro_target = FALSE - /obj/Initialize(mapload) . = ..() if(micro_target) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 190815adad..fcb92e7dfd 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -3,26 +3,21 @@ plane = OBJ_PLANE vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. //Used to store information about the contents of the object. - var/list/matter var/w_class // Size of the object. var/unacidable = FALSE //universal "unacidabliness" var, here so you can use it in any obj. animate_movement = 2 - var/throwforce = 1 - var/catchable = 1 // can it be caught on throws/flying? - var/sharp = FALSE // whether this object cuts - var/edge = FALSE // whether this object is more likely to dismember - var/pry = 0 //Used in attackby() to open doors var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/damtype = "brute" - var/armor_penetration = 0 var/show_messages - var/preserve_item = 0 //whether this object is preserved when its owner goes into cryo-storage, gateway, etc var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak. var/show_examine = TRUE // Does this pop up on a mob when the mob is examined? var/redgate_allowed = TRUE //can we be taken through the redgate, in either direction? - var/being_used = 0 + var/rad_resistance = 0 // Allow overriding rad resistance + var/being_shocked = FALSE + var/micro_accepted_scale = 0.5 + var/micro_target = FALSE + var/explosion_resistance /obj/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/structures/barricades.dm b/code/game/objects/structures/barricades.dm index 209cc0cf79..46ff726786 100644 --- a/code/game/objects/structures/barricades.dm +++ b/code/game/objects/structures/barricades.dm @@ -45,9 +45,9 @@ return else switch(W.damtype) - if("fire") + if(BURN) health -= W.force * 1 - if("brute") + if(BRUTE) health -= W.force * 0.75 if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) diff --git a/code/game/objects/structures/ghost_pods/antagonist.dm b/code/game/objects/structures/ghost_pods/antagonist.dm index 226826c659..c5b9e73f26 100644 --- a/code/game/objects/structures/ghost_pods/antagonist.dm +++ b/code/game/objects/structures/ghost_pods/antagonist.dm @@ -36,9 +36,9 @@ /obj/structure/ghost_pod/automatic/xenomorph_egg/attackby(obj/item/W as obj, mob/user as mob) user.setClickCooldown(user.get_attack_speed(W)) switch(W.damtype) - if("fire") + if(BURN) health -= W.force * 1.25 //It really doesn't like fire - if("brute") + if(BRUTE) health -= W.force * 0.75 //Bit hard to cut playsound(src, 'sound/effects/attackblob.ogg', 50, 1) healthcheck() @@ -46,10 +46,10 @@ return /obj/structure/ghost_pod/automatic/xenomorph_egg/bullet_act(var/obj/item/projectile/Proj) - switch(damtype) - if("fire") + switch(Proj.damtype) + if(BURN) health -= Proj.damage * 1.5 //It burns! - if("brute") + if(BRUTE) health -= Proj.damage //It hurts a bit more then a sharp stick healthcheck() ..() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 9db92d8065..2376f07635 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -155,9 +155,9 @@ user.do_attack_animation(src) playsound(src, 'sound/effects/grillehit.ogg', 80, 1) switch(W.damtype) - if("fire") + if(BURN) health -= W.force - if("brute") + if(BRUTE) health -= W.force * 0.1 healthcheck() ..() diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index e339a5fc0c..f8bcf03e0f 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -263,8 +263,8 @@ if(ismob(AM)) // All mobs have a multiplier and a size according to mob_defines.dm var/mob/I = AM tforce = I.mob_size * (speed/THROWFORCE_SPEED_DIVISOR) - else - var/obj/O = AM + else if(isitem(AM)) + var/obj/item/O = AM tforce = O.throwforce * (speed/THROWFORCE_SPEED_DIVISOR) if (tforce < 15) return diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index 536ce05cbf..22a47955b9 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -1,9 +1,3 @@ -/obj/item - name = "weapon" - icon = 'icons/obj/weapons.dmi' - hitsound = "swing_hit" - var/cleaving = FALSE // Used to avoid infinite cleaving. - /obj/item/Bump(mob/M as mob) spawn(0) ..() diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index 879a4db6e7..5b19deb456 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -139,11 +139,11 @@ visible_message(span_danger("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]")) var/damage = 0 switch(W.damtype) - if("fire") + if(BURN) damage = (W.force / fire_resist) if(istype(W, /obj/item/weldingtool)) playsound(src, W.usesound, 100, 1) - if("brute") + if(BRUTE) damage = (W.force / brute_resist) take_damage(damage) diff --git a/code/modules/client/stored_item.dm b/code/modules/client/stored_item.dm index 6d02be37d6..6c45950f7a 100644 --- a/code/modules/client/stored_item.dm +++ b/code/modules/client/stored_item.dm @@ -100,7 +100,7 @@ busy_bank = FALSE icon_state = "item_bank" return - var/obj/N = new I(get_turf(src)) + var/obj/item/N = new I(get_turf(src)) log_admin("[key_name_admin(user)] retrieved [N] from the item bank.") visible_message(span_notice("\The [src] dispenses the [N] to \the [user].")) user.put_in_hands(N) @@ -138,7 +138,7 @@ if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open) busy_bank = FALSE return - for(var/obj/check in O.contents) + for(var/obj/item/check in O.contents) if(!check.persist_storable) to_chat(user, span_warning("\The [src] buzzes. \The [O] contains [check], which cannot be stored. Please remove this item before attempting to store \the [O]. As a reminder, any contents of \the [O] will be lost if you store it with contents.")) busy_bank = FALSE @@ -162,12 +162,6 @@ /////STORABLE ITEMS AND ALL THAT JAZZ///// //I am only really intending this to be used for single items. Mostly stuff you got right now, but can't/don't want to use right now. //It is not at all intended to be a thing that just lets you hold on to stuff forever, but just until it's the right time to use it. - -/obj - - var/persist_storable = TRUE //If this is true, this item can be stored in the item bank. - //This is automatically set to false when an item is removed from storage - /////LIST OF STUFF WE DON'T WANT PEOPLE STORING///// /obj/item/pda diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index e9f549052f..d9a0bfdf22 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -147,12 +147,12 @@ onfire = !(onfire) if (onfire) force = 3 - damtype = "fire" + damtype = BURN icon_state = "cake1" START_PROCESSING(SSobj, src) else force = null - damtype = "brute" + damtype = BRUTE icon_state = "cake0" return diff --git a/code/modules/identification/item_procs.dm b/code/modules/identification/item_procs.dm index 16ac7fd4b0..c6472989b2 100644 --- a/code/modules/identification/item_procs.dm +++ b/code/modules/identification/item_procs.dm @@ -1,9 +1,3 @@ -// This is on the base /item so badmins can play with it by calling hide_identity(). -/obj/item - var/datum/identification/identity = null - var/identity_type = /datum/identification - var/init_hide_identity = FALSE // Set to true to automatically obscure the object on initialization. - /obj/item/Initialize(mapload) if(init_hide_identity) identity = new identity_type(src) diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm index 022cf6a765..d4de8e8ff7 100644 --- a/code/modules/materials/materials/_materials.dm +++ b/code/modules/materials/materials/_materials.dm @@ -61,7 +61,7 @@ var/list/name_to_material * Arguments: * - breakdown_flags: A set of flags determining how exactly the materials are broken down. (unused) */ -/obj/proc/get_material_composition(breakdown_flags=NONE) +/obj/item/proc/get_material_composition(breakdown_flags=NONE) . = list() for(var/mat in matter) var/datum/material/M = GET_MATERIAL_REF(mat) @@ -78,7 +78,7 @@ var/list/name_to_material else .[M] = matter[mat] -/obj/proc/set_custom_materials(list/materials, multiplier = 1) +/obj/item/proc/set_custom_materials(list/materials, multiplier = 1) SHOULD_NOT_OVERRIDE(TRUE) if(!LAZYLEN(materials)) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index ea8506a869..6886f8e370 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -120,7 +120,7 @@ icon_state = "plasmacutter" item_state = "plasmacutter" w_class = ITEMSIZE_NORMAL //it is smaller than the pickaxe - damtype = "fire" + damtype = BURN digspeed = 18 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/light thermite on fire origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) matter = list(MAT_STEEL = 3000, MAT_PLASTEEL = 1500, MAT_DIAMONDS = 500, MAT_PHORON = 500) diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index acee17e44e..8d469b7d2c 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -263,7 +263,7 @@ return remove_points(inserted_id, prize.cost) - var/obj/I = new prize.equipment_path(loc) + var/obj/item/I = new prize.equipment_path(loc) I.persist_storable = FALSE flick(icon_vend, src) else diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 956022867f..530e26db4a 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -240,24 +240,31 @@ var/list/slot_equipment_priority = list( \ //Outdated but still in use apparently. This should at least be a human proc. /mob/proc/get_equipped_items() - var/list/items = new/list() + var/list/items = list() - if(hasvar(src,"back")) if(src:back) items += src:back - if(hasvar(src,"belt")) if(src:belt) items += src:belt - if(hasvar(src,"l_ear")) if(src:l_ear) items += src:l_ear - if(hasvar(src,"r_ear")) if(src:r_ear) items += src:r_ear - if(hasvar(src,"glasses")) if(src:glasses) items += src:glasses - if(hasvar(src,"gloves")) if(src:gloves) items += src:gloves - if(hasvar(src,"head")) if(src:head) items += src:head - if(hasvar(src,"shoes")) if(src:shoes) items += src:shoes - if(hasvar(src,"wear_id")) if(src:wear_id) items += src:wear_id - if(hasvar(src,"wear_mask")) if(src:wear_mask) items += src:wear_mask - if(hasvar(src,"wear_suit")) if(src:wear_suit) items += src:wear_suit - if(hasvar(src,"w_uniform")) if(src:w_uniform) items += src:w_uniform + return items - if(hasvar(src,"l_hand")) if(src:l_hand) items += src:l_hand - if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand +/mob/living/get_equipped_items() + var/list/items = ..() + if(back) items += back + if(l_hand) items += l_hand + if(r_hand) items += r_hand + if(wear_mask) items += wear_mask + return items +/mob/living/carbon/human/get_equipped_items() + var/list/items = ..() + + if(belt) items += belt + if(l_ear) items += l_ear + if(r_ear) items += r_ear + if(glasses) items += glasses + if(gloves) items += gloves + if(head) items += head + if(shoes) items += shoes + if(wear_id) items += wear_id + if(wear_suit) items += wear_suit + if(w_uniform) items += w_uniform return items /mob/proc/delete_inventory() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 10cf0bf289..dab1b036f7 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -423,14 +423,13 @@ emp_act return //VORESTATION EDIT END - Allows for thrown vore! - if(istype(AM,/obj/)) - var/obj/O = AM - if(stat != DEAD && istype(O,/obj/item) && trash_catching && vore_selected) //Ported from chompstation - var/obj/item/I = O - if(adminbus_trash || is_type_in_list(I, GLOB.edible_trash) && I.trash_eatable && !is_type_in_list(I, GLOB.item_vore_blacklist)) - visible_message(span_vwarning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) - I.throwing = 0 - I.forceMove(vore_selected) + if(istype(AM,/obj/item)) + var/obj/item/O = AM + if(stat != DEAD && trash_catching && vore_selected) + if(adminbus_trash || is_type_in_list(O, GLOB.edible_trash) && O.trash_eatable && !is_type_in_list(O, GLOB.item_vore_blacklist)) + visible_message(span_vwarning("[O] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) + O.throwing = 0 + O.forceMove(vore_selected) return if(in_throw_mode && speed <= THROWFORCE_SPEED_DIVISOR) //empty active hand and we're in throw mode if(canmove && !restrained() && !src.is_incorporeal()) @@ -441,7 +440,6 @@ emp_act throw_mode_off() return - var/dtype = O.damtype var/throw_damage = O.throwforce*(speed/THROWFORCE_SPEED_DIVISOR) if(species && species.throwforce_absorb_threshold >= throw_damage) @@ -491,34 +489,30 @@ emp_act var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here if(armor < 100) - apply_damage(throw_damage, dtype, zone, armor, soaked, is_sharp(O), has_edge(O), O) + apply_damage(throw_damage, O.damtype, zone, armor, soaked, is_sharp(O), has_edge(O), O) //thrown weapon embedded object code. - if(dtype == BRUTE && istype(O,/obj/item)) - var/obj/item/I = O - if (!is_robot_module(I)) - var/sharp = is_sharp(I) + if(O.damtype == BRUTE) + if (!is_robot_module(O)) + var/sharp = is_sharp(O) var/damage = throw_damage - if (soaked) + if(soaked) damage -= soaked - if (armor) + if(armor) damage /= armor+1 //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = sharp? damage/I.w_class : damage/(I.w_class*3) - var/embed_threshold = sharp? 5*I.w_class : 15*I.w_class + var/embed_chance = sharp? damage/O.w_class : damage/(O.w_class*3) + var/embed_threshold = sharp? 5*O.w_class : 15*O.w_class //Sharp objects will always embed if they do enough damage. //Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold - if((sharp && prob(damage/(10*I.w_class)*100)) || (damage > embed_threshold && prob(embed_chance))) - affecting.embed(I) + if((sharp && prob(damage/(10*O.w_class)*100)) || (damage > embed_threshold && prob(embed_chance))) + affecting.embed(O) // Begin BS12 momentum-transfer code. - var/mass = 1.5 - if(istype(O, /obj/item)) - var/obj/item/I = O - mass = I.w_class/THROWNOBJ_KNOCKBACK_DIVISOR + var/mass = O.w_class/THROWNOBJ_KNOCKBACK_DIVISOR var/momentum = speed*mass if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED && !buckled) @@ -539,7 +533,9 @@ emp_act src.pinned += O // This does a prob check to catch the thing flying at you, with a minimum of 1% -/mob/living/carbon/human/proc/can_catch(var/obj/O) +/mob/living/carbon/human/proc/can_catch(var/obj/item/O) + if(!isitem(O)) + return FALSE if(!get_active_hand()) // If active hand is empty var/obj/item/organ/external/temp = organs_by_name[BP_R_HAND] if (hand) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index db7c4d6974..55e23936a9 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -263,14 +263,13 @@ /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve if(is_incorporeal()) return - if(istype(AM,/obj/)) - var/obj/O = AM - if(stat != DEAD && istype(O,/obj/item) && trash_catching && vore_selected) //ported from chompstation - var/obj/item/I = O - if(adminbus_trash || is_type_in_list(I, GLOB.edible_trash) && I.trash_eatable && !is_type_in_list(I, GLOB.item_vore_blacklist)) - visible_message(span_vwarning("[I] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) - I.throwing = 0 - I.forceMove(vore_selected) + if(istype(AM,/obj/item)) + var/obj/item/O = AM + if(stat != DEAD && trash_catching && vore_selected) + if(adminbus_trash || is_type_in_list(O, GLOB.edible_trash) && O.trash_eatable && !is_type_in_list(O, GLOB.item_vore_blacklist)) + visible_message(span_vwarning("[O] is thrown directly into [src]'s [lowertext(vore_selected.name)]!")) + O.throwing = 0 + O.forceMove(vore_selected) return var/dtype = O.damtype var/throw_damage = O.throwforce*(speed/THROWFORCE_SPEED_DIVISOR) @@ -302,10 +301,7 @@ ai_holder.react_to_attack(O.thrower) // Begin BS12 momentum-transfer code. - var/mass = 1.5 - if(istype(O, /obj/item)) - var/obj/item/I = O - mass = I.w_class/THROWNOBJ_KNOCKBACK_DIVISOR + var/mass = O.w_class/THROWNOBJ_KNOCKBACK_DIVISOR var/momentum = speed*mass if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3db25d8e24..a3b4942024 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1166,10 +1166,6 @@ /mob/proc/is_muzzled() return 0 -//Exploitable Info Update -/obj - var/datum/weakref/exploit_for //if this obj is an exploit for somebody, this points to them - /mob/proc/amend_exploitable(var/obj/item/I) if(istype(I)) exploit_addons |= I @@ -1178,7 +1174,7 @@ I.exploit_for = WEAKREF(src) -/obj/Destroy() +/obj/item/Destroy() if(exploit_for) var/mob/exploited = exploit_for.resolve() exploited?.exploit_addons -= src diff --git a/code/modules/organs/internal/augment.dm b/code/modules/organs/internal/augment.dm index db2fc661d3..23b684b659 100644 --- a/code/modules/organs/internal/augment.dm +++ b/code/modules/organs/internal/augment.dm @@ -84,11 +84,6 @@ */ // Attaches to the end of dropped items' code. - -/obj/item - var/destroy_on_drop = FALSE // Used by augments to determine if the item should destroy itself when dropped, or return to its master. - var/obj/item/organ/my_augment = null // Used to reference the object's host organ. - /obj/item/dropped(mob/user) . = ..(user) if(src) diff --git a/code/modules/overmap/disperser/disperser_console.dm b/code/modules/overmap/disperser/disperser_console.dm index ae3f38eb42..662ddca800 100644 --- a/code/modules/overmap/disperser/disperser_console.dm +++ b/code/modules/overmap/disperser/disperser_console.dm @@ -199,7 +199,7 @@ middle.update_idle_power_usage(strength * range * 100) . = TRUE - if("fire") + if(BURN) fire(ui.user) . = TRUE diff --git a/code/modules/power/tesla/tesla_act.dm b/code/modules/power/tesla/tesla_act.dm index ede7a52a75..16a5669ac2 100644 --- a/code/modules/power/tesla/tesla_act.dm +++ b/code/modules/power/tesla/tesla_act.dm @@ -2,9 +2,6 @@ // Vars and Default tesla_act behavior //////////////////////////////////////// -/obj - var/being_shocked = FALSE - /obj/proc/tesla_act(var/power) being_shocked = TRUE var/power_bounced = power / 2 diff --git a/code/modules/radiation/radiation.dm b/code/modules/radiation/radiation.dm index f0f38ae54e..32db1b7a69 100644 --- a/code/modules/radiation/radiation.dm +++ b/code/modules/radiation/radiation.dm @@ -59,9 +59,6 @@ cached_rad_resistance = 60 //Three times that of a steel wall. Rock is less dense than steel, but this is assuming that a normal wall isn't just solid steel all the way through like rock turfs are. return -/obj - var/rad_resistance = 0 // Allow overriding rad resistance - // If people expand the system, this may be useful. Here as a placeholder until then /atom/proc/rad_act(var/severity) return 1 diff --git a/code/modules/reagents/reactions/instant/instant.dm b/code/modules/reagents/reactions/instant/instant.dm index c8108b1816..37b531f377 100644 --- a/code/modules/reagents/reactions/instant/instant.dm +++ b/code/modules/reagents/reactions/instant/instant.dm @@ -784,16 +784,18 @@ for(var/mob/living/carbon/M in viewers(world.view, location)) switch(get_dist(M, location)) if(0 to 3) - if(hasvar(M, "glasses")) - if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) + if(ishuman(M)) + var/mob/living/carbon/human/target = M + if(istype(target.glasses, /obj/item/clothing/glasses/sunglasses)) continue M.flash_eyes() M.Weaken(15) if(4 to 5) - if(hasvar(M, "glasses")) - if(istype(M:glasses, /obj/item/clothing/glasses/sunglasses)) + if(ishuman(M)) + var/mob/living/carbon/human/target = M + if(istype(target.glasses, /obj/item/clothing/glasses/sunglasses)) continue M.flash_eyes() diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 0cabe6b44f..a0a00181e4 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -10,7 +10,6 @@ anchored = FALSE density = FALSE pressure_resistance = 5*ONE_ATMOSPHERE - matter = list(MAT_STEEL = 1850) level = 2 var/sortType = "" var/ptype = 0 diff --git a/code/modules/tools/tool_quality.dm b/code/modules/tools/tool_quality.dm index b1de248fac..baaf7fdb1f 100644 --- a/code/modules/tools/tool_quality.dm +++ b/code/modules/tools/tool_quality.dm @@ -1,6 +1,3 @@ -/obj/item - var/list/tool_qualities = list() - /obj/item/examine(mob/user) . = ..() for(var/qual in tool_qualities) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 64bf8cca5d..0fcc5d43d9 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -123,12 +123,12 @@ else to_chat(user, span_notice("Unable to repair while [src] is off.")) - else if(hasvar(W,"force") && hasvar(W,"damtype")) + else if(W.force && W.damtype) user.setClickCooldown(user.get_attack_speed(W)) switch(W.damtype) - if("fire") + if(BURN) health -= W.force * fire_dam_coeff - if("brute") + if(BRUTE) health -= W.force * brute_dam_coeff ..() healthcheck() diff --git a/code/modules/vore/eating/contaminate_vr.dm b/code/modules/vore/eating/contaminate_vr.dm index 8788fb4061..5b85791ee1 100644 --- a/code/modules/vore/eating/contaminate_vr.dm +++ b/code/modules/vore/eating/contaminate_vr.dm @@ -16,13 +16,6 @@ var/list/gurgled_overlays = list( "pink" = image('icons/effects/sludgeoverlay_vr.dmi', icon_state = "pink") ) -/obj/item - var/gurgled = FALSE - var/oldname - var/cleanname - var/cleandesc - var/gurgled_color - /obj/item/proc/gurgle_contaminate(atom/movable/item_storage = null, contamination_flavor = "Generic", contamination_color = "green") if(!can_gurgle()) return FALSE diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index e4429a3619..5c424e7bd3 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -241,10 +241,3 @@ return FALSE //moved prot organ digest to their appropriate file - -// Gradual damage measurement -/obj/item - var/digest_stage = null - var/d_mult_old = 1 //digest stage descriptions - var/d_mult = 1 //digest stage descriptions - var/d_stage_overlay //digest stage effects diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index a52cb6e0e9..7461ed0ca8 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -785,9 +785,6 @@ if(new_color) glow_color = new_color -/obj/item - var/trash_eatable = TRUE - /mob/living/proc/get_digestion_nutrition_modifier() return 1 diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm index 96708cf548..15acbdccff 100644 --- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm +++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm @@ -80,11 +80,11 @@ continue if(istype(O, /obj/machinery/artifact)) var/obj/machinery/artifact/A = O - if(A.being_used) + if(A.in_use) artifact_in_use = 1 else A.anchored = TRUE - A.being_used = 1 + A.in_use = 1 if(artifact_in_use) atom_say("Cannot scan. Too much interference.") @@ -134,7 +134,7 @@ if(scanned_object && istype(scanned_object, /obj/machinery/artifact)) var/obj/machinery/artifact/A = scanned_object A.anchored = FALSE - A.being_used = 0 + A.in_use = 0 scanned_object = null //hardcoded responses, oh well diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm index 12dfc81c0c..2ceb69d098 100644 --- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm @@ -123,7 +123,7 @@ inserted_battery.battery_effect.ToggleActivate() harvesting = 0 cur_artifact.anchored = FALSE - cur_artifact.being_used = 0 + cur_artifact.in_use = 0 cur_artifact = null atom_say("Energy harvesting interrupted.") icon_state = "incubator" @@ -173,7 +173,7 @@ atom_say("Cannot harvest. No noteworthy energy signature isolated.") return - if(analysed && analysed.being_used) + if(analysed && analysed.in_use) atom_say("Cannot harvest. Source already being harvested.") return @@ -236,7 +236,7 @@ harvesting = 1 update_use_power(USE_POWER_ACTIVE) cur_artifact.anchored = TRUE - cur_artifact.being_used = 1 + cur_artifact.in_use = 1 icon_state = "incubator_on" atom_say("Beginning energy harvesting.") @@ -268,7 +268,7 @@ update_use_power(USE_POWER_IDLE) harvesting = 0 cur_artifact.anchored = FALSE - cur_artifact.being_used = 0 + cur_artifact.in_use = 0 cur_artifact = null src.visible_message(span_bold("[name]") + " states, \"Battery is full.\"") icon_state = "incubator" diff --git a/icons/obj/machines/floor_light.dmi b/icons/obj/machines/floor_light.dmi index c23864928067f2e0ec9fd342300b23bad13c1c21..31cb03e20385ebb4b0a45b104377504972171ceb 100644 GIT binary patch delta 20264 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