From b146131a342d32a0bdac80d9130ae28ca3299c9d Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 24 Apr 2016 20:37:00 +0200 Subject: [PATCH] Second commits. This contains the changes to item_attack.dm Obj/attackby() now follows a similar structure as mob/living/attackby. It calls attack_obj() (like attack() but for obj) which calls attacked_by (just like attack() does) The use of the NOBLUDGEON flag changes a bit, it is now used to signify the item cannot be used as a melee weapon at all. No attack animation, no attack message. I've given this bitflag to many items that have an afterattack() so as to not both attack and do the special action (among those items: the rcd) There's also the code changes to attacking machines: attacking any machine now give a proper message and a sound. And with this, I made more machines breakable (using a health var and the very little used BROKEN stat). Most notably, tables can now be attacked when on harm intent and be destroyed. The newly destroyable machines have a take_damage() proc used by all sorts of attack (weapon, xeno, animal, hulk, mech melee, gun projectile, thrown items). There's some more stuff in there, see the PR's description and comments. --- code/_onclick/item_attack.dm | 135 ++++++----- code/game/gamemodes/gang/dominator.dm | 126 ++++------ code/game/machinery/PDApainter.dm | 75 ++++-- code/game/machinery/announcement_system.dm | 27 +-- code/game/machinery/camera/camera.dm | 88 ++++--- code/game/machinery/computer/computer.dm | 82 +++---- code/game/machinery/droneDispenser.dm | 80 ++++--- code/game/machinery/firealarm.dm | 34 ++- code/game/machinery/machinery.dm | 61 ++++- code/game/machinery/newscaster.dm | 160 +++++++------ code/game/machinery/requests_console.dm | 39 ++-- code/game/machinery/shieldgen.dm | 216 +++++++++--------- code/game/machinery/teleporter.dm | 48 ++-- code/game/machinery/vending.dm | 34 +-- .../atmospherics/machinery/atmosmachinery.dm | 55 ++--- .../components/binary_devices/passive_gate.dm | 14 +- .../components/binary_devices/pump.dm | 13 +- .../components/binary_devices/volume_pump.dm | 14 +- .../components/unary_devices/cryo.dm | 7 +- .../unary_devices/portables_connector.dm | 8 +- .../components/unary_devices/thermomachine.dm | 1 + .../components/unary_devices/vent_pump.dm | 10 +- .../components/unary_devices/vent_scrubber.dm | 13 +- .../machinery/portable/canister.dm | 54 ++--- .../portable/portable_atmospherics.dm | 64 +++--- .../kitchen machinery/processor.dm | 23 +- .../kitchen machinery/smartfridge.dm | 42 ++-- code/modules/hydroponics/biogenerator.dm | 72 +++--- code/modules/hydroponics/seed_extractor.dm | 36 ++- code/modules/mining/equipment_locker.dm | 27 ++- .../suit/n_suit_verbs/energy_net_nets.dm | 91 ++++---- code/modules/paperwork/paperbin.dm | 22 +- code/modules/power/antimatter/control.dm | 33 ++- code/modules/power/antimatter/shielding.dm | 27 ++- code/modules/power/lighting.dm | 131 +++++------ code/modules/power/singularity/collector.dm | 48 ++-- code/modules/power/solar.dm | 96 +++++--- .../chemistry/machinery/chem_dispenser.dm | 69 +++--- .../chemistry/machinery/chem_heater.dm | 22 +- .../chemistry/machinery/chem_master.dm | 52 +---- code/modules/recycling/conveyor2.dm | 19 +- .../recycling/disposal-construction.dm | 14 +- code/modules/recycling/disposal-structures.dm | 94 +++----- code/modules/recycling/disposal-unit.dm | 81 ++++--- code/modules/recycling/sortingmachinery.dm | 2 + code/modules/research/circuitprinter.dm | 112 ++++----- code/modules/research/destructive_analyzer.dm | 35 +-- code/modules/research/experimentor.dm | 43 +--- code/modules/research/protolathe.dm | 88 +++---- code/modules/research/rdmachines.dm | 56 ++++- code/modules/research/server.dm | 21 +- code/modules/shuttle/emergency.dm | 49 ++-- code/modules/telesci/telepad.dm | 27 ++- icons/obj/machines/research.dmi | Bin 19007 -> 19008 bytes 54 files changed, 1480 insertions(+), 1410 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 0c49e41078a..e392d3ee432 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -7,10 +7,8 @@ /atom/proc/attackby(obj/item/W, mob/user, params) return -/atom/movable/attackby(obj/item/W, mob/living/user, params) - user.do_attack_animation(src) - if(W && !(W.flags & NOBLUDGEON)) - visible_message("[user] has hit [src] with [W]!") +/obj/attackby(obj/item/I, mob/living/user, params) + return I.attack_obj(src, user) //phil235 /mob/living/attackby(obj/item/I, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) @@ -21,42 +19,54 @@ playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) if(do_mob(user, src, 80/sharpness)) harvest(user) - return - I.attack(src, user) + return 1 + return I.attack(src, user) //phil235 should we return 1 if successful special attack() so we don't call afterattack? + //see the attack() procs if it'd be useful. -/mob/living/proc/attacked_by(obj/item/I, mob/living/user, def_zone) - apply_damage(I.force, I.damtype, def_zone) - if(I.damtype == "brute") - if(prob(33) && I.force) - var/turf/location = get_turf(src) - location.add_blood_floor(src) - var/message_verb = "" - if(I.attack_verb && I.attack_verb.len) - message_verb = "[pick(I.attack_verb)]" - else if(I.force) - message_verb = "attacked" +/obj/item/proc/attack(mob/living/M, mob/living/user, def_zone) + if(flags & (NOBLUDGEON|ABSTRACT)) //phil235 check that no abstract item uses attack or attack_obj + return + if(!force) + playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1) + else if(hitsound) + playsound(loc, hitsound, get_clamped_volume(), 1, -1) - var/attack_message = "[src] has been [message_verb] with [I]." - if(user) + user.lastattacked = M + M.lastattacker = user + + M.attacked_by(src, user, def_zone) + + add_logs(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") + add_fingerprint(user) + + +//the equivalent of the standard version of attack() but for object targets. +/obj/item/proc/attack_obj(obj/O, mob/living/user) + if(flags & (NOBLUDGEON|ABSTRACT)) //phil235 + return + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(O) + O.attacked_by(src, user) + + + +/atom/movable/proc/attacked_by() + return + +/obj/attacked_by(obj/item/I, mob/living/user) + if(I.force) + user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!") + +/mob/living/attacked_by(obj/item/I, mob/living/user, def_zone) + if(user != src) user.do_attack_animation(src) - if(user in viewers(src, null)) - attack_message = "[user] has [message_verb] [src] with [I]!" - if(message_verb) - visible_message("[attack_message]", - "[attack_message]") - -/mob/living/simple_animal/attacked_by(var/obj/item/I, var/mob/living/user) - if(!I.force) - user.visible_message("[user] gently taps [src] with [I].",\ - "This weapon is ineffective, it does no damage!") - else if(I.force >= force_threshold && I.damtype != STAMINA) - ..() - else - visible_message("[I] bounces harmlessly off of [src].",\ - "[I] bounces harmlessly off of [src]!") - - + if(send_item_attack_message(I, user, def_zone)) + if(apply_damage(I.force, I.damtype, def_zone)) + if(I.damtype == BRUTE) + if(prob(33)) + var/turf/location = get_turf(src) + location.add_blood_floor(src) // Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person. // Click parameters is the params string from byond Click() code, see that documentation. @@ -65,30 +75,35 @@ /obj/item/proc/get_clamped_volume() - if(src.force && src.w_class) - return Clamp((src.force + src.w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 - else if(!src.force && src.w_class) - return Clamp(src.w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 + if(w_class) + if(force) + return Clamp((force + w_class) * 4, 30, 100)// Add the item's force to its weight class and multiply by 4, then clamp the value between 30 and 100 + else + return Clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 -/obj/item/proc/attack(mob/living/M, mob/living/user, def_zone) - - if (!istype(M)) // not sure if this is the right thing... - return - - if (hitsound && force > 0) //If an item's hitsound is defined and the item's force is greater than zero... - playsound(loc, hitsound, get_clamped_volume(), 1, -1) //...play the item's hitsound at get_clamped_volume() with varying frequency and -1 extra range. - else if (force == 0)//Otherwise, if the item's force is zero... - playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1)//...play tap.ogg at get_clamped_volume() - ///////////////////////// - user.lastattacked = M - M.lastattacker = user - - //spawn(1800) // this wont work right - // M.lastattacker = null - ///////////////////////// - M.attacked_by(src, user, def_zone) - - add_logs(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") - add_fingerprint(user) +/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area) + var/message_verb = "attacked" + if(I.attack_verb.len) + message_verb = "[pick(I.attack_verb)]" + else if(!I.force) + return 0 + var/message_hit_area = "" + if(hit_area) + message_hit_area = " in the [hit_area]" + var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]." + if(user in viewers(src, null)) + attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!" + visible_message("[attack_message]", + "[attack_message]") return 1 + +/mob/living/simple_animal/send_item_attack_message(obj/item/I, mob/living/user, hit_area) + if(!I.force) + user.visible_message("[user] gently taps [src] with [I].",\ + "This weapon is ineffective, it does no damage!") + else if(I.force < force_threshold || I.damtype == STAMINA) + visible_message("[I] bounces harmlessly off of [src].",\ + "[I] bounces harmlessly off of [src]!") + else + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index 6f32e5c427c..83f6da190fe 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -9,8 +9,9 @@ var/maxhealth = 200 var/health = 200 var/datum/gang/gang - var/operating = 0 //-1=broken, 0=standby, 1=takeover + var/operating = 0 //0=standby or broken, 1=takeover var/warned = 0 //if this device has set off the warning at <3 minutes yet + var/datum/effect_system/spark_spread/spark_system /obj/machinery/dominator/tesla_act() qdel(src) @@ -19,10 +20,12 @@ ..() SetLuminosity(2) poi_list |= src + spark_system = new + spark_system.set_up(5, 1, src) /obj/machinery/dominator/examine(mob/user) ..() - if(operating == -1) + if(stat & BROKEN) user << "It looks completely busted." return @@ -52,30 +55,31 @@ else SSmachine.processing -= src -/obj/machinery/dominator/proc/healthcheck(damage) - var/iconname = "dominator" - if(gang) - iconname += "-[gang.color]" - SetLuminosity(3) - - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - +/obj/machinery/dominator/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(src, 'sound/effects/bang.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + else + return health -= damage if(health > (maxhealth/2)) if(prob(damage*2)) - sparks.set_up(5, 1, src) - sparks.start() - else if(operating >= 0) - sparks.set_up(5, 1, src) - sparks.start() + spark_system.start() + else if(!(stat & BROKEN)) + spark_system.start() overlays += "damage" - if(operating != -1) + if(!(stat & BROKEN)) if(health <= 0) set_broken() - else - icon_state = iconname if(health <= -100) new /obj/item/stack/sheet/plasteel(src.loc) @@ -107,17 +111,19 @@ SetLuminosity(0) icon_state = "dominator-broken" overlays.Cut() - operating = -1 + operating = 0 + stat |= BROKEN SSmachine.processing -= src /obj/machinery/dominator/Destroy() - if(operating != -1) + if(!(stat & BROKEN)) set_broken() poi_list.Remove(src) + qdel(spark_system) return ..() /obj/machinery/dominator/emp_act(severity) - healthcheck(100) + take_damage(100, BURN, 0) ..() /obj/machinery/dominator/ex_act(severity, target) @@ -128,31 +134,26 @@ if(1) qdel(src) if(2) - healthcheck(120) + take_damage(120, BRUTE, 0) if(3) - healthcheck(30) + take_damage(30, BRUTE, 0) return -/obj/machinery/dominator/bullet_act(obj/item/projectile/Proj) - if(Proj.damage) - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - var/damage = Proj.damage - if(Proj.forcedodge) - damage *= 0.5 - playsound(src, 'sound/effects/bang.ogg', 50, 1) - visible_message("[src] was hit by [Proj].") - healthcheck(damage) - ..() +/obj/machinery/dominator/bullet_act(obj/item/projectile/P) + . = ..() + if(P.damage) + var/damage_amount = P.damage + if(P.forcedodge) + damage_amount *= 0.5 + visible_message("[src] was hit by [P].") + take_damage(damage_amount, P.damage_type, 0) + /obj/machinery/dominator/blob_act() - healthcheck(110) - -/obj/machinery/dominator/attackby(obj/I, mob/user, params) - - return + take_damage(110, BRUTE, 0) /obj/machinery/dominator/attack_hand(mob/user) - if(operating) + if(operating || (stat & BROKEN)) examine(user) return @@ -185,8 +186,9 @@ priority_announce("Network breach detected in [locname]. The [gang.name] Gang is attempting to seize control of the station!","Network Alert") gang.domination() src.name = "[gang.name] Gang [src.name]" - healthcheck(0) operating = 1 + icon_state = "dominator-[gang.color]" + SetLuminosity(3) SSmachine.processing += src gang.message_gangtools("Hostile takeover in progress: Estimated [time] minutes until victory.[gang.dom_attempts ? "" : " This is your final attempt."]") @@ -194,46 +196,14 @@ if(G != gang) G.message_gangtools("Enemy takeover attempt detected in [locname]: Estimated [time] minutes until our defeat.",1,1) -/obj/machinery/dominator/attack_alien(mob/living/user) - user.do_attack_animation(src) - playsound(src, 'sound/effects/bang.ogg', 50, 1) - user.visible_message("[user] smashes against [src] with its claws.",\ - "You smash against [src] with your claws.",\ - "You hear metal scraping.") - healthcheck(15) - -/obj/machinery/dominator/attack_animal(mob/living/user) - if(!isanimal(user)) - return - var/mob/living/simple_animal/M = user - M.do_attack_animation(src) - if(M.melee_damage_upper <= 0) - return - healthcheck(M.melee_damage_upper) - -/obj/machinery/dominator/mech_melee_attack(obj/mecha/M) - if(M.damtype == "brute") - playsound(src, 'sound/effects/bang.ogg', 50, 1) - visible_message("[M.name] has hit [src].") - healthcheck(M.force) - return - /obj/machinery/dominator/attack_hulk(mob/user) - playsound(src, 'sound/effects/bang.ogg', 50, 1) user.visible_message("[user] smashes [src].",\ "You punch [src].",\ "You hear metal being slammed.") - healthcheck(5) + take_damage(5) + +/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user) + add_fingerprint(user) + ..() + -/obj/machinery/dominator/attackby(obj/item/weapon/I, mob/living/user, params) - if(istype(I, /obj/item/weapon)) - add_fingerprint(user) - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - if( (I.flags&NOBLUDGEON) || !I.force ) - return - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - visible_message("[user] has hit \the [src] with [I].") - if(I.damtype == BURN || I.damtype == BRUTE) - healthcheck(I.force) - return diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index fce5479c697..4ff95775e70 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -7,6 +7,7 @@ anchored = 1 var/obj/item/device/pda/storedpda = null var/list/colorlist = list() + var/health = 100 /obj/machinery/pdapainter/update_icon() @@ -45,7 +46,7 @@ power_change() return - if(istype(O, /obj/item/device/pda)) + else if(istype(O, /obj/item/device/pda)) if(storedpda) user << "There is already a PDA inside!" return @@ -59,27 +60,65 @@ P.add_fingerprint(user) update_icon() + else if(istype(O, /obj/item/weapon/weldingtool) && user.a_intent != "harm") + var/obj/item/weapon/weldingtool/WT = O + if(stat & BROKEN) + if(WT.remove_fuel(0,user)) + user.visible_message("[user] is repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + playsound(loc, 'sound/items/Welder.ogg', 40, 1) + if(do_after(user,40/WT.toolspeed, 1, target = src)) + if(!WT.isOn() || !(stat & BROKEN)) + return + user << "You repair [src]." + playsound(loc, 'sound/items/Welder2.ogg', 50, 1) + stat &= ~BROKEN + health = initial(health) + update_icon() + else + user << "[src] does not need repairs." + else + return ..() + +/obj/machinery/pdapainter/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + if(!(stat & BROKEN)) + health -= damage + if(health <= 0) + stat |= BROKEN + update_icon() /obj/machinery/pdapainter/attack_hand(mob/user) - ..() + if(..()) + add_fingerprint(user) - src.add_fingerprint(user) + if(storedpda) + var/obj/item/device/pda/P + P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist + if(!P) + return + if(!in_range(src, user)) + return + if(!storedpda)//is the pda still there? + return + storedpda.icon_state = P.icon_state + storedpda.desc = P.desc + ejectpda() - if(storedpda) - var/obj/item/device/pda/P - P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist - if(!P) - return - if(!in_range(src, user)) - return - if(!storedpda)//is the pda still there? - return - storedpda.icon_state = P.icon_state - storedpda.desc = P.desc - ejectpda() - - else - user << "The [src] is empty." + else + user << "The [src] is empty." /obj/machinery/pdapainter/verb/ejectpda() diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index e83bff6774a..29af1ab1e18 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -73,26 +73,19 @@ var/list/announcement_systems = list() /obj/machinery/announcement_system/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + panel_open = !panel_open if(!panel_open) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You open the maintenance hatch of [src]." - panel_open = 1 - else - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - user << "You close the maintenance hatch of [src]." - panel_open = 0 + user << "You [panel_open ? "open" : "close"] the maintenance hatch of [src]." update_icon() + else if(default_deconstruction_crowbar(P)) return - - if(panel_open) - default_deconstruction_crowbar(P) - if(istype(P, /obj/item/device/multitool) && broken) - user << "You reset [src]'s firmware." - broken = 0 - update_icon() - return - - return ..() + else if(istype(P, /obj/item/device/multitool) && panel_open && broken) + user << "You reset [src]'s firmware." + broken = 0 + update_icon() + else + return ..() /obj/machinery/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. str = replacetext(str, "%PERSON", "[user]") diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 600f0793715..648339bcbf7 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -63,7 +63,7 @@ if(assembly) qdel(assembly) assembly = null - if(istype(bug)) + if(bug) bug.bugged_cameras -= src.c_tag if(bug.current == src) bug.current = null @@ -110,9 +110,13 @@ /obj/machinery/camera/ex_act(severity, target) if(src.invuln) return - else - ..() - return + switch(severity) + if(1) + qdel(src) + if(2) + take_damage(50, BRUTE, 0) + else + take_damage(rand(30,60), BRUTE, 0) /obj/machinery/camera/proc/setViewRange(num = 7) src.view_range = num @@ -123,17 +127,6 @@ return user.electrocute_act(10, src) -/obj/machinery/camera/attack_paw(mob/living/carbon/alien/humanoid/user) - if(!istype(user)) - return - user.do_attack_animation(src) - add_hiddenprint(user) - visible_message("\The [user] slashes at [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - health = max(0, health - 30) - if(!health && status) - toggle_cam(user, 0) - /obj/machinery/camera/attackby(obj/W, mob/living/user, params) var/msg = "You attach [W] into the assembly's inner circuits." var/msg2 = "[src] already has that upgrade!" @@ -173,6 +166,7 @@ user << "[msg]" else user << "[msg2]" + return else if(istype(W, /obj/item/stack/sheet/mineral/plasma)) if(!isEmpProof()) @@ -181,6 +175,8 @@ qdel(W) else user << "[msg2]" + return + else if(istype(W, /obj/item/device/assembly/prox_sensor)) if(!isMotion()) upgradeMotion() @@ -188,6 +184,7 @@ qdel(W) else user << "[msg2]" + return // OTHER if((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user)) @@ -220,34 +217,52 @@ else if (O.client && O.client.eye == src) O << "[U] holds \a [itemname] up to one of the cameras ..." O << browse(text("[][]", itemname, info), text("window=[]", itemname)) + return - else if (istype(W, /obj/item/device/camera_bug)) - if (!src.can_use()) + else if(istype(W, /obj/item/device/camera_bug)) + if(!can_use()) user << "Camera non-functional." return - if(istype(src.bug)) + if(bug) user << "Camera bug removed." - src.bug.bugged_cameras -= src.c_tag - src.bug = null + bug.bugged_cameras -= src.c_tag + bug = null else user << "Camera bugged." - src.bug = W - src.bug.bugged_cameras[src.c_tag] = src + bug = W + bug.bugged_cameras[src.c_tag] = src + return + + else if(istype(W, /obj/item/weapon/pai_cable)) + var/obj/item/weapon/pai_cable/cable = W + cable.plugin(src, user) + return else if(istype(W, /obj/item/device/laser_pointer)) var/obj/item/device/laser_pointer/L = W L.laser_act(src, user) + return + return ..() - else - if(W.force >= 10) //fairly simplistic, but will do for now. - user.changeNext_move(CLICK_CD_MELEE) - visible_message("[user] hits [src] with [W]!", "You hit [src] with [W]!") - health = max(0, health - W.force) - user.do_attack_animation(src) - if(!health && status) - triggerCameraAlarm() - toggle_cam(user, 1) - return +/obj/machinery/camera/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(src, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + if(damage < 10) //camera has a damage resistance threshold + return + health = max(0, health - damage) + if(!health && status) + triggerCameraAlarm() + toggle_cam(null, 0) /obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1) status = !status @@ -373,12 +388,9 @@ else src.SetLuminosity(0) -/obj/machinery/camera/bullet_act(obj/item/projectile/proj) - if(proj.damage_type == BRUTE) - health = max(0, health - proj.damage) - if(!health && status) - triggerCameraAlarm() - toggle_cam(null, 1) +/obj/machinery/camera/bullet_act(obj/item/projectile/P) + . = ..() + take_damage(P.damage, P.damage_type, 0) /obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets. var/turf/prev_turf diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index c67b1b2f56b..a6f8eb6eb01 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -12,6 +12,7 @@ var/brightness_on = 2 var/icon_keyboard = "generic_key" var/icon_screen = "generic" + var/computer_health = 25 /obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C) ..(location) @@ -32,7 +33,10 @@ return 1 /obj/machinery/computer/emp_act(severity) - if(prob(20/severity)) set_broken() + if(severity == 1) + take_damage(rand(15,30), BRUTE, 0) + else + take_damage(rand(15,25), BRUTE, 0) ..() /obj/machinery/computer/ex_act(severity, target) @@ -42,25 +46,17 @@ switch(severity) if(1) qdel(src) - return if(2) - if (prob(25)) + if(prob(25)) qdel(src) - return - if (prob(50)) - verbs.Cut() - set_broken() + else + take_damage(rand(20,30), BRUTE, 0) if(3) - if (prob(25)) - verbs.Cut() - set_broken() - else - return + take_damage(rand(10,30), BRUTE, 0) -/obj/machinery/computer/bullet_act(obj/item/projectile/Proj) - if(prob(Proj.damage)) - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - set_broken() + +/obj/machinery/computer/bullet_act(obj/item/projectile/P) + take_damage(P.damage, P.damage_type, 0) ..() /obj/machinery/computer/update_icon() @@ -83,24 +79,19 @@ update_icon() return -/obj/machinery/computer/proc/set_broken() - if(circuit) //no circuit, no breaking - stat |= BROKEN - update_icon() - return - /obj/machinery/computer/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/screwdriver) && circuit && !(flags&NODECONSTRUCT)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << " You start to disconnect the monitor..." if(do_after(user, 20/I.toolspeed, target = src)) + deconstruction() var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc ) A.circuit = circuit A.anchored = 1 circuit = null for (var/obj/C in src) C.loc = src.loc - if (src.stat & BROKEN) + if (stat & BROKEN) user << "The broken glass falls out." new /obj/item/weapon/shard( src.loc ) A.state = 3 @@ -110,30 +101,25 @@ A.state = 4 A.icon_state = "4" qdel(src) - return + else + return ..() -/obj/machinery/computer/attack_paw(mob/living/user) - user.do_attack_animation(src) - if(circuit) - if(prob(10)) - user.visible_message("[user.name] smashes the [src.name] with its paws.",\ - "You smash the [src.name] with your paws.",\ - "You hear a smashing sound.") - set_broken() +/obj/machinery/computer/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(stat & BROKEN) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + else + playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else return - user.visible_message("[user.name] smashes against the [src.name] with its paws.",\ - "You smash against the [src.name] with your paws.",\ - "You hear hear a clicking sound.") - -/obj/machinery/computer/attack_alien(mob/living/user) - user.do_attack_animation(src) - if(circuit) - if(prob(80)) - user.visible_message("[user.name] smashes the [src.name] with its claws.",\ - "You smash the [src.name] with your claws.",\ - "You hear a smashing sound.") - set_broken() - return - user.visible_message("[user.name] smashes against the [src.name] with its claws.",\ - "You smash against the [src.name] with your claws.",\ - "You hear a clicking sound.") + computer_health = max(computer_health - damage, 0) + if(circuit) //no circuit, no breaking + if(!computer_health && !(stat & BROKEN)) + playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1) + stat |= BROKEN + update_icon() diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 159e115888a..c2743105444 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -172,7 +172,7 @@ visible_message("[src] [end_create_message]") icon_state = icon_recharging sleep(cooldownTime) - if(stat != BROKEN) + if(!(stat & BROKEN)) icon_state = icon_on else icon_state = icon_off @@ -210,36 +210,50 @@ user << "You insert [stack] sheet[stack > 1 ? "s" : ""] to [src]." if((O && O.loc == src) || !stack) qdel(O) - return - if(istype(O, /obj/item/weapon/weldingtool) && (stat & BROKEN)) - var/obj/item/weapon/weldingtool/WT = O - if(!WT.isOn()) + else if(istype(O, /obj/item/weapon/weldingtool)) + if(stat & BROKEN) + var/obj/item/weapon/weldingtool/WT = O + if(!WT.isOn()) + return + if(WT.get_fuel() < 1) + user << "You need more fuel to complete this task!" + return + playsound(src, 'sound/items/Welder.ogg', 50, 1) + user.visible_message("[user] begins patching up [src] with [WT].", \ + "You begin restoring the damage to [src]...") + if(!do_after(user, 40/O.toolspeed, target = src)) + return + if(!src || !WT.remove_fuel(1, user)) return + user.visible_message("[user] fixes [src]!", \ + "You restore [src] to operation.") + stat &= ~BROKEN + health = max_health + if(!stat) + icon_state = icon_on + else + user << "[src] doesn't need repairs." + else + return ..() + +/obj/machinery/droneDispenser/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + else return - if(WT.get_fuel() < 1) - user << "You need more fuel to complete this task!" - return - playsound(src, 'sound/items/Welder.ogg', 50, 1) - user.visible_message("[user] begins patching up [src] with [WT].", \ - "You begin restoring the damage to [src]...") - if(!do_after(user, 40/O.toolspeed, target = src)) - return - if(!src || !WT.remove_fuel(1, user)) return - user.visible_message("[user] fixes [src]!", \ - "You restore [src] to operation.") - stat -= BROKEN - icon_state = icon_on - return - if(O.force && stat != BROKEN) - user.visible_message("[user] hits [src] with [O]!", \ - "You hit [src] with [O]!") - playsound(src, O.hitsound, 50, 1) - health = Clamp(health - O.force, 0, max_health) - if(health <= 0) - if(break_message) - audible_message("[src] [break_message]") - if(break_sound) - playsound(src, break_sound, 50, 1) - stat = BROKEN - icon_state = icon_off - return - ..() + health = max(health - damage, 0) + if(!health && !(stat & BROKEN)) + if(break_message) + audible_message("[src] [break_message]") + if(break_sound) + playsound(src, break_sound, 50, 1) + stat |= BROKEN + icon_state = icon_off + diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 0965843654a..95276267b3b 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -21,6 +21,7 @@ power_channel = ENVIRON var/detecting = 1 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone + var/health = 50 /obj/machinery/firealarm/New(loc, dir, building) ..() @@ -61,9 +62,9 @@ else overlays += "overlay_fire" -/obj/machinery/firealarm/bullet_act(BLAH) - if(prob(50)) - alarm() +/obj/machinery/firealarm/bullet_act(obj/item/projectile/P) + . = ..() + take_damage(P.damage, P.damage_type, 0) /obj/machinery/firealarm/emp_act(severity) if(prob(50 / severity)) @@ -74,11 +75,11 @@ emagged = 1 if(user) user.visible_message("Sparks fly out of the [src]!", - "You emag the [src], disabling its thermal sensors.") + "You emag [src], disabling its thermal sensors.") playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1) /obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume) - if(!emagged && detecting && temperature > T0C + 200) + if(!emagged && detecting && !stat && temperature > T0C + 200) alarm() /obj/machinery/firealarm/proc/alarm() @@ -200,4 +201,25 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) qdel(src) return - return ..() \ No newline at end of file + return ..() + +/obj/machinery/firealarm/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + if(!(stat & BROKEN)) + health -= damage + if(health <= 0) + stat |= BROKEN + update_icon() + else if(prob(33)) + alarm() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 1c32cd0aeee..12e87f98ee9 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -137,10 +137,6 @@ Class Procs: dropContents() return ..() -/obj/machinery/attackby(obj/item/weapon/W, mob/user, params) - user.changeNext_move(CLICK_CD_MELEE) - ..() - /obj/machinery/proc/locate_machinery() return @@ -243,6 +239,61 @@ Class Procs: //////////////////////////////////////////////////////////////////////////////////////////// +/obj/machinery/mech_melee_attack(obj/mecha/M) + if(M.damtype == BRUTE || M.damtype == BURN) + visible_message("[M.name] has hit [src].") + take_damage(M.force*2, M.damtype) // multiplied by 2 so we can hit machines hard but not be overpowered against mobs. + return 1 + return 0 + +/obj/machinery/attacked_by(obj/item/I, mob/living/user) + ..() + take_damage(I.force, I.damtype, 1) + +/obj/machinery/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + +//phil235 + + + +/obj/machinery/attack_alien(mob/living/carbon/alien/humanoid/user) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + add_hiddenprint(user) + visible_message("\The [user] slashes at [src]!") + playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) + take_damage(20, BRUTE, 0) + +/obj/machinery/attack_animal(mob/living/simple_animal/M) + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + if(M.melee_damage_upper > 0) // phil235 use M.attack_text verb? + M.visible_message("[M.name] smashes against \the [src.name].",\ + "You smash against the [src.name].") + take_damage(M.melee_damage_upper, M.melee_damage_type, 1) + + +/obj/machinery/attack_paw(mob/living/user) + if(user.a_intent != "harm") + return attack_hand(user) + else + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + user.visible_message("[user.name] smashes against \the [src.name] with its paws.",\ + "You smash against the [src.name] with your paws.") + take_damage(4, BRUTE, 1) + + /obj/machinery/attack_ai(mob/user) if(isrobot(user))// For some reason attack_robot doesn't work var/mob/living/silicon/robot/R = user @@ -251,8 +302,6 @@ Class Procs: else return attack_hand(user) -/obj/machinery/attack_paw(mob/user) - return attack_hand(user) //set_machine must be 0 if clicking the machinery doesn't bring up a dialog /obj/machinery/attack_hand(mob/user, check_power = 1, set_machine = 1) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 3eedfeec907..4005154672f 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -175,8 +175,6 @@ var/list/obj/machinery/newscaster/allCasters = list() verb_say = "beeps" verb_ask = "beeps" verb_exclaim = "beeps" - var/isbroken = 0 - var/ispowered = 1 var/screen = 0 var/paper_remaining = 15 var/securityCaster = 0 @@ -188,11 +186,12 @@ var/list/obj/machinery/newscaster/allCasters = list() var/obj/item/weapon/photo/photo = null var/channel_name = "" var/c_locked=0 - var/hitstaken = 0 + var/health = 60 var/datum/newscaster/feed_channel/viewing_channel = null var/allow_comments = 1 luminosity = 0 anchored = 1 + var/hitstaken = 0 //phil235 to be removed, it's used in a map var edit. /obj/machinery/newscaster/security_unit name = "security newscaster" @@ -217,32 +216,35 @@ var/list/obj/machinery/newscaster/allCasters = list() return ..() /obj/machinery/newscaster/update_icon() - if(!ispowered || isbroken) - icon_state = "newscaster_off" - if(isbroken) - overlays.Cut() - overlays += image(icon, "crack3") - return overlays.Cut() - if(news_network.wanted_issue.active) - icon_state = "newscaster_wanted" - return - if(alert) - overlays += "newscaster_alert" - if(hitstaken > 0) - overlays += image(icon, "crack[hitstaken]") - icon_state = "newscaster_normal" + if(stat & (NOPOWER|BROKEN)) + icon_state = "newscaster_off" + else + if(news_network.wanted_issue.active) + icon_state = "newscaster_wanted" + else + icon_state = "newscaster_normal" + if(alert) + overlays += "newscaster_alert" + switch(health) + if(45 to 60) + return + if(30 to 45) + overlays += "crack1" + if(15 to 30) + overlays += "crack2" + else + overlays += "crack3" + /obj/machinery/newscaster/power_change() - if(isbroken) + if(stat & BROKEN) return if(powered()) - ispowered = 1 stat &= ~NOPOWER update_icon() else spawn(rand(0, 15)) - ispowered = 0 stat |= NOPOWER update_icon() @@ -251,21 +253,18 @@ var/list/obj/machinery/newscaster/allCasters = list() if(1) qdel(src) if(2) - isbroken=1 if(prob(50)) qdel(src) else - update_icon() + take_damage(rand(40,80), BRUTE, 0) else - if(prob(50)) - isbroken=1 - update_icon() + take_damage(rand(20,40), BRUTE, 0) /obj/machinery/newscaster/attack_ai(mob/user) return attack_hand(user) /obj/machinery/newscaster/attack_hand(mob/user) - if(!ispowered || isbroken) + if(stat & (NOPOWER|BROKEN)) return if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) ) var/mob/living/human_or_robot_user = user @@ -327,11 +326,11 @@ var/list/obj/machinery/newscaster/allCasters = list() if(6) dat+="ERROR: Could not submit Feed story to Network.

" if(channel_name=="") - dat+="•Invalid receiving channel name.
" + dat+="?Invalid receiving channel name.
" if(scanned_user=="Unknown") - dat+="•Channel author unverified.
" + dat+="?Channel author unverified.
" if(msg == "" || msg == "\[REDACTED\]") - dat+="•Invalid message body.
" + dat+="?Invalid message body.
" dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" @@ -342,18 +341,18 @@ var/list/obj/machinery/newscaster/allCasters = list() else existing_authors += FC.author if(scanned_user in existing_authors) - dat+="•There already exists a Feed channel under your name.
" + dat+="?There already exists a Feed channel under your name.
" if(channel_name=="" || channel_name == "\[REDACTED\]") - dat+="•Invalid channel name.
" + dat+="?Invalid channel name.
" var/check = 0 for(var/datum/newscaster/feed_channel/FC in news_network.network_channels) if(FC.channel_name == channel_name) check = 1 break if(check) - dat+="•Channel name already in use.
" + dat+="?Channel name already in use.
" if(scanned_user=="Unknown") - dat+="•Channel author unverified.
" + dat+="?Channel author unverified.
" dat+="
Return
" if(8) var/total_num=length(news_network.network_channels) @@ -472,11 +471,11 @@ var/list/obj/machinery/newscaster/allCasters = list() if(16) dat+="ERROR: Wanted Issue rejected by Network.

" if(channel_name=="" || channel_name == "\[REDACTED\]") - dat+="•Invalid name for person wanted.
" + dat+="?Invalid name for person wanted.
" if(scanned_user=="Unknown") - dat+="•Issue author unverified.
" + dat+="?Issue author unverified.
" if(msg == "" || msg == "\[REDACTED\]") - dat+="•Invalid description.
" + dat+="?Invalid description.
" dat+="
Return
" if(17) dat+="Wanted Issue successfully deleted from Circulation
" @@ -724,39 +723,66 @@ var/list/obj/machinery/newscaster/allCasters = list() user << "You start [anchored ? "un" : ""]securing [name]..." playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 60/I.toolspeed, target = src)) - user << "You [anchored ? "un" : ""]secure [name]." - new /obj/item/wallframe/newscaster(loc) playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1) - qdel(src) - return - if(isbroken) - playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1) - audible_message("[user.name] further abuses the shattered [name].", null, 5 ) - else - if(istype(I, /obj/item/weapon)) - user.do_attack_animation(src) - var/obj/item/weapon/W = I - if(W.damtype == STAMINA) - return - if(W.force <15) - audible_message("[user.name] hits the [name] with the [W.name] with no visible effect.", null , 5 ) - playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) + if(stat & BROKEN) + user << "The broken remains of [src] fall on the ground." + new /obj/item/stack/sheet/metal(loc, 5) + new /obj/item/weapon/shard(loc) + new /obj/item/weapon/shard(loc) else - hitstaken++ - if(hitstaken==3) - audible_message("[user.name] smashes the [name]!", null, 5 ) - isbroken=1 - playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1) - else - audible_message("[user.name] forcefully slams the [name] with the [I.name]!", null, 5 ) - playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) + user << "You [anchored ? "un" : ""]secure [name]." + new /obj/item/wallframe/newscaster(loc) + qdel(src) + else if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent != "harm") + var/obj/item/weapon/weldingtool/WT = I + if(stat & BROKEN) + if(WT.remove_fuel(0,user)) + user.visible_message("[user] is repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + playsound(loc, 'sound/items/Welder.ogg', 40, 1) + if(do_after(user,40/WT.toolspeed, 1, target = src)) + if(!WT.isOn() || !(stat & BROKEN)) + return + user << "You repair [src]." + playsound(loc, 'sound/items/Welder2.ogg', 50, 1) + stat &= ~BROKEN + update_icon() else - user << "This does nothing!" - update_icon() + user << "[src] does not need repairs." + else + return ..() + +/obj/machinery/newscaster/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(stat & BROKEN) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1) + else + playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + if(damage < 15) //so it can't be broken with a small weapon. + return + if(!(stat & BROKEN)) + health -= damage + if(health <= 0) + stat |= BROKEN + playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1) + update_icon() + /obj/machinery/newscaster/attack_paw(mob/user) - user << "The newscaster controls are far too complicated for your tiny brain!" - return + if(user.a_intent != "harm") + user << "The newscaster controls are far too complicated for your tiny brain!" + else + take_damage(5) + +//phil235 missing attack_alien, attack_animal, bullet_act, etc... /obj/machinery/newscaster/proc/AttachPhoto(mob/user) if(photo) @@ -895,7 +921,7 @@ var/list/obj/machinery/newscaster/allCasters = list() switch(screen) if(0) //Cover dat+="
The Griffon
" - dat+="
Nanotrasen-standard newspaper, for use on Nanotrasen© Space Facilities

" + dat+="
Nanotrasen-standard newspaper, for use on Nanotrasen? Space Facilities

" if(isemptylist(news_content)) if(wantedAuthor) dat+="Contents:
" @@ -1022,4 +1048,6 @@ var/list/obj/machinery/newscaster/allCasters = list() return scribble_page = curr_page scribble = s - attack_self(user) \ No newline at end of file + attack_self(user) + else + return ..() \ No newline at end of file diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index f367cb641b5..aa169ff97b6 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -64,7 +64,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() /obj/machinery/requests_console/update_icon() if(open) - if(hackState == 0) + if(!hackState) icon_state="req_comp_open" else icon_state="req_comp_rewired" @@ -135,7 +135,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() dat += "" dat += "[dpt]" dat += "Normal High" - if (hackState == 1) + if(hackState) dat += "EXTREME" dat += "" dat += "" @@ -150,7 +150,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() dat += "" dat += "[dpt]" dat += "Normal High" - if (hackState == 1) + if(hackState) dat += "EXTREME" dat += "" dat += "" @@ -165,7 +165,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() dat += "" dat += "[dpt]" dat += "Normal High" - if (hackState == 1) + if(hackState) dat += "EXTREME" dat += "" dat += "" @@ -479,34 +479,29 @@ var/list/obj/machinery/requests_console/allConsoles = list() SetLuminosity(2) /obj/machinery/requests_console/attackby(obj/item/weapon/O, mob/user, params) - if (istype(O, /obj/item/weapon/crowbar)) + if(istype(O, /obj/item/weapon/crowbar)) if(open) user << "You close the maintenance panel." open = 0 - icon_state="req_comp0" else user << "You open the maintenance panel." open = 1 - if(hackState == 0) - icon_state="req_comp_open" - else if(hackState == 1) - icon_state="req_comp_rewired" - if (istype(O, /obj/item/weapon/screwdriver)) + update_icon() + return + if(istype(O, /obj/item/weapon/screwdriver)) if(open) - if(hackState == 0) + hackState = !hackState + if(hackState) user << "You modify the wiring." - hackState = 1 - icon_state="req_comp_rewired" - else if(hackState == 1) + else user << "You reset the wiring." - hackState = 0 - icon_state="req_comp_open" + update_icon() else - user << "You can't do much with that!" - update_icon() + user << "You must open the maintenance panel first!" + return var/obj/item/weapon/card/id/ID = O.GetID() - if (ID) + if(ID) if(screen == 9) msgVerified = "Verified by [ID.registered_name] ([ID.assignment])" updateUsrDialog() @@ -517,9 +512,11 @@ var/list/obj/machinery/requests_console/allConsoles = list() announceAuth = 0 user << "You are not authorized to send announcements!" updateUsrDialog() + return if (istype(O, /obj/item/weapon/stamp)) if(screen == 9) var/obj/item/weapon/stamp/T = O msgStamped = "Stamped with the [T.name]" updateUsrDialog() - return + return + return ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index a00cbf3d205..a26b66350de 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -33,35 +33,25 @@ /obj/machinery/shield/CanAtmosPass(turf/T) return !density -/obj/machinery/shield/attackby(obj/item/weapon/W, mob/user, params) - ..() - if(W.damtype == BRUTE || W.damtype == BURN) - take_damage(W.force) - -/obj/machinery/shield/bullet_act(obj/item/projectile/Proj) - ..() - take_damage(Proj.damage) +/obj/machinery/shield/bullet_act(obj/item/projectile/P) + . = ..() + take_damage(P.damage, P.damage_type) /obj/machinery/shield/ex_act(severity, target) switch(severity) if(1) - if (prob(75)) - qdel(src) + take_damage(rand(180,260), BRUTE, 0) if(2) - if (prob(50)) - qdel(src) + take_damage(rand(150,230), BRUTE, 0) if(3) - if (prob(25)) - qdel(src) - return + take_damage(rand(80,150), BRUTE, 0) /obj/machinery/shield/emp_act(severity) switch(severity) if(1) qdel(src) if(2) - if(prob(50)) - qdel(src) + take_damage(50, BRUTE, 0) /obj/machinery/shield/blob_act() qdel(src) @@ -77,14 +67,21 @@ ..() take_damage(tforce) -/obj/machinery/shield/proc/take_damage(damage) - playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1) +/obj/machinery/shield/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BURN) + if(sound_effect) + playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1) + if(BRUTE) + if(sound_effect) + playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1) + else + return opacity = 1 spawn(20) opacity = 0 health -= damage if(health <= 0) - visible_message("[src] dissipates.") qdel(src) /obj/machinery/shieldgen @@ -100,9 +97,7 @@ var/const/max_health = 100 var/health = max_health var/active = 0 - var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate var/list/deployed_shields = list() - var/is_open = 0 //Whether or not the wires are exposed var/locked = 0 var/shield_range = 4 @@ -114,20 +109,22 @@ /obj/machinery/shieldgen/proc/shields_up() - if(active) return 0 //If it's already turned on, how did this get called? + if(active) + return 0 //If it's already turned on, how did this get called? - src.active = 1 + active = 1 update_icon() for(var/turf/target_tile in range(shield_range, src)) if (istype(target_tile,/turf/open/space) && !(locate(/obj/machinery/shield) in target_tile)) - if (malfunction && prob(33) || !malfunction) + if(!(stat & BROKEN) || prob(33)) deployed_shields += new /obj/machinery/shield(target_tile) /obj/machinery/shieldgen/proc/shields_down() - if(!active) return 0 //If it's already off, how did this get called? + if(!active) + return 0 //If it's already off, how did this get called? - src.active = 0 + active = 0 update_icon() for(var/obj/machinery/shield/shield_tile in deployed_shields) @@ -135,66 +132,70 @@ deployed_shields.Cut() /obj/machinery/shieldgen/process() - if(malfunction && active) + if((stat & BROKEN) && active) if(deployed_shields.len && prob(5)) qdel(pick(deployed_shields)) - return -/obj/machinery/shieldgen/proc/checkhp() - if(health <= 30) - src.malfunction = 1 - if(health <= 0) - qdel(src) - update_icon() - return +/obj/machinery/shieldgen/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(loc, 'sound/items/Welder.ogg', 40, 1) + else + return + health = max(health - damage, 0) + if(health <= 0 && !(stat && BROKEN)) + stat |= BROKEN + update_icon() /obj/machinery/shieldgen/ex_act(severity, target) switch(severity) if(1) - src.health -= 75 - src.checkhp() + qdel(src) if(2) - src.health -= 30 - if (prob(15)) - src.malfunction = 1 - src.checkhp() + if(prob(33)) + qdel(src) + else + take_damage(rand(80,120), BRUTE, 0) if(3) - src.health -= 10 - src.checkhp() - return + take_damage(rand(40,80), BRUTE, 0) /obj/machinery/shieldgen/emp_act(severity) switch(severity) if(1) - src.health /= 2 //cut health in half - malfunction = 1 + health = 0 + stat |= BROKEN locked = pick(0,1) + update_icon() if(2) - if(prob(50)) - src.health *= 0.3 //chop off a third of the health - malfunction = 1 - checkhp() + take_damage(rand(80,120), BRUTE, 0) /obj/machinery/shieldgen/attack_hand(mob/user) if(locked) user << "The machine is locked, you are unable to use it!" return - if(is_open) + if(panel_open) user << "The panel must be closed before operating this machine!" return - if (src.active) + if (active) user.visible_message("[user] deactivated \the [src].", \ "You deactivate \the [src].", \ "You hear heavy droning fade out.") - src.shields_down() + shields_down() else if(anchored) user.visible_message("[user] activated \the [src].", \ "You activate \the [src].", \ "You hear heavy droning.") - src.shields_up() + shields_up() else user << "The device must first be secured to the floor!" return @@ -202,14 +203,12 @@ /obj/machinery/shieldgen/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/screwdriver)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - if(is_open) - user << "You close the panel." - is_open = 0 - else + panel_open = !panel_open + if(panel_open) user << "You open the panel and expose the wiring." - is_open = 1 - - else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) + else + user << "You close the panel." + else if(istype(W, /obj/item/stack/cable_coil) && (stat & BROKEN) && panel_open) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) user << "You need one length of cable to repair [src]!" @@ -220,7 +219,7 @@ return coil.use(1) health = max_health - malfunction = 0 + stat &= ~BROKEN user << "You repair \the [src]." update_icon() @@ -237,31 +236,30 @@ user << "You unsecure \the [src] from the floor!" if(active) user << "\The [src] shuts off!" - src.shields_down() + shields_down() anchored = 0 - - else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) - if(src.allowed(user)) - src.locked = !src.locked - user << "You [src.locked ? "lock" : "unlock"] the controls." + else if(W.GetID()) + if(allowed(user)) + locked = !locked + user << "You [locked ? "lock" : "unlock"] the controls." else user << "Access denied." else - ..() + return ..() /obj/machinery/shieldgen/emag_act() - if(!malfunction) - malfunction = 1 + if(!(stat & BROKEN)) + stat |= BROKEN + health = 0 update_icon() /obj/machinery/shieldgen/update_icon() if(active) - src.icon_state = malfunction ? "shieldonbr":"shieldon" + icon_state = (stat & BROKEN) ? "shieldonbr":"shieldon" else - src.icon_state = malfunction ? "shieldoffbr":"shieldoff" - return + icon_state = (stat & BROKEN) ? "shieldoffbr":"shieldoff" ////FIELD GEN START //shameless copypasta from fieldgen, powersink, and grille #define maxstoredpower 500 @@ -273,6 +271,8 @@ anchored = 0 density = 1 req_access = list(access_teleporter) + flags = CONDUCT + use_power = 0 var/active = 0 var/power = 0 var/steps = 0 @@ -280,8 +280,6 @@ var/check_delay = 10 var/recalc = 0 var/locked = 1 - var/destroyed = 0 -// var/maxshieldload = 200 var/obj/structure/cable/attached // the attached cable var/storedpower = 0 flags = CONDUCT @@ -312,8 +310,6 @@ if(PN) //runtime errors fixer. They were caused by PN.newload trying to access missing network in case of working on stored power. storedpower += shieldload PN.load += shieldload //uses powernet power. -// message_admins("[PN.load]") -// use_power(250) //uses APC power /obj/machinery/shieldwallgen/attack_hand(mob/user) if(!anchored) @@ -326,21 +322,21 @@ user << "\The [src] needs to be powered by wire underneath!" return 1 - if(src.active >= 1) - src.active = 0 + if(active >= 1) + active = 0 icon_state = "Shield_Gen" user.visible_message("[user] turned \the [src] off.", \ "You turn off \the [src].", \ "You hear heavy droning fade out.") - src.cleanup() + cleanup() else - src.active = 1 + active = 1 icon_state = "Shield_Gen +a" user.visible_message("[user] turned \the [src] on.", \ "You turn on \the [src].", \ "You hear heavy droning.") - src.add_fingerprint(user) + add_fingerprint(user) /obj/machinery/shieldwallgen/process() power() @@ -350,28 +346,26 @@ storedpower = maxstoredpower if(storedpower <= 0) storedpower = 0 -// if(shieldload >= maxshieldload) //there was a loop caused by specifics of process(), so this was needed. -// shieldload = maxshieldload - if(src.active == 1) + if(active == 1) if(!anchored) - src.active = 0 + active = 0 return setup_field(1) setup_field(2) setup_field(4) setup_field(8) src.active = 2 - if(src.active >= 1) - if(src.power == 0) - src.visible_message("The [src.name] shuts down due to lack of power!", \ + if(active >= 1) + if(power == 0) + visible_message("The [src.name] shuts down due to lack of power!", \ "You hear heavy droning fade out.") icon_state = "Shield_Gen" - src.active = 0 - src.cleanup(1) - src.cleanup(2) - src.cleanup(4) - src.cleanup(8) + active = 0 + cleanup(1) + cleanup(2) + cleanup(4) + cleanup(8) /obj/machinery/shieldwallgen/proc/setup_field(NSEW = 0) var/turf/T = src.loc @@ -436,16 +430,16 @@ anchored = 0 return - if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (src.allowed(user)) - src.locked = !src.locked + if(W.GetID()) + if (allowed(user)) + locked = !locked user << "You [src.locked ? "lock" : "unlock"] the controls." else user << "Access denied." else add_fingerprint(user) - ..() + return ..() /obj/machinery/shieldwallgen/proc/cleanup(NSEW) var/obj/machinery/shieldwall/F @@ -466,15 +460,16 @@ break /obj/machinery/shieldwallgen/Destroy() - src.cleanup(1) - src.cleanup(2) - src.cleanup(4) - src.cleanup(8) + cleanup(1) + cleanup(2) + cleanup(4) + cleanup(8) return ..() -/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/Proj) - storedpower -= Proj.damage - ..() +/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/P) + . = ..() + storedpower -= P.damage + //////////////Containment Field START @@ -525,16 +520,15 @@ gen_secondary.storedpower -=10 -/obj/machinery/shieldwall/bullet_act(obj/item/projectile/Proj) +/obj/machinery/shieldwall/bullet_act(obj/item/projectile/P) + . = ..() if(needs_power) var/obj/machinery/shieldwallgen/G if(prob(50)) G = gen_primary else G = gen_secondary - G.storedpower -= Proj.damage - ..() - return + G.storedpower -= P.damage /obj/machinery/shieldwall/ex_act(severity, target) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 86d8993b928..27dc7cba695 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -47,8 +47,7 @@ locked = L user << "You insert the GPS device into the [name]'s slot." else - ..() - return + return ..() /obj/machinery/computer/teleporter/attack_ai(mob/user) src.attack_hand(user) @@ -299,11 +298,11 @@ /obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, params) if(default_deconstruction_screwdriver(user, "tele-o", "tele0", W)) return - if(exchange_parts(user, W)) return - - default_deconstruction_crowbar(W) + if(default_deconstruction_crowbar(W)) + return + return ..() /obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T) var/obj/machinery/computer/teleporter/com = power_station.teleporter_console @@ -405,34 +404,37 @@ return ..() /obj/machinery/teleport/station/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/device/multitool) && !panel_open) + if(istype(W, /obj/item/device/multitool)) var/obj/item/device/multitool/M = W - if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src) - if(linked_stations.len < efficiency) - linked_stations.Add(M.buffer) - M.buffer = null - user << "You upload the data from the [W.name]'s buffer." - else - user << "This station can't hold more information, try to use better parts." - if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) + if(panel_open) + M.buffer = src + user << "You download the data to the [W.name]'s buffer." + else + if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src) + if(linked_stations.len < efficiency) + linked_stations.Add(M.buffer) + M.buffer = null + user << "You upload the data from the [W.name]'s buffer." + else + user << "This station can't hold more information, try to use better parts." + return + else if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) update_icon() return - if(exchange_parts(user, W)) + else if(exchange_parts(user, W)) return - default_deconstruction_crowbar(W) + else if(default_deconstruction_crowbar(W)) + return - if(panel_open) - if(istype(W, /obj/item/device/multitool)) - var/obj/item/device/multitool/M = W - M.buffer = src - user << "You download the data to the [W.name]'s buffer." - return - if(istype(W, /obj/item/weapon/wirecutters)) + else if(istype(W, /obj/item/weapon/wirecutters)) + if(panel_open) link_console_and_hub() user << "You reconnect the station to nearby machinery." return + else + return ..() /obj/machinery/teleport/station/attack_paw() src.attack_hand() diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 756f07068ee..cbc30cb5ede 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -179,9 +179,8 @@ user << "You insert [W] into [src]'s chef compartment." else user << "[src]'s chef compartment does not accept junk food." - return - if(istype(W, /obj/item/weapon/storage/bag/tray)) + else if(istype(W, /obj/item/weapon/storage/bag/tray)) if(!compartment_access_check(user)) return var/obj/item/weapon/storage/T = W @@ -203,7 +202,8 @@ updateUsrDialog() return - ..() + else + return ..() /obj/machinery/vending/snack/proc/compartment_access_check(user) req_access_txt = chef_compartment_access @@ -237,16 +237,20 @@ if(default_unfasten_wrench(user, W, time = 60)) return - if(component_parts && istype(W, /obj/item/weapon/crowbar)) - default_deconstruction_crowbar(W) + if(component_parts) + if(default_deconstruction_crowbar(W)) + return - if(istype(W, /obj/item/weapon/screwdriver) && anchored) - panel_open = !panel_open - user << "You [panel_open ? "open" : "close"] the maintenance panel." - overlays.Cut() - if(panel_open) - overlays += image(icon, "[initial(icon_state)]-panel") - updateUsrDialog() + if(istype(W, /obj/item/weapon/screwdriver)) + if(anchored) + panel_open = !panel_open + user << "You [panel_open ? "open" : "close"] the maintenance panel." + overlays.Cut() + if(panel_open) + overlays += image(icon, "[initial(icon_state)]-panel") + updateUsrDialog() + else + user << "You must first secure [src]." return else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters)) if(panel_open) @@ -273,14 +277,14 @@ user << "You loaded [transfered] items in \the [name]." else user << "The [name] is fully stocked." - return; + return else user << "You should probably unscrew the service panel first." else - ..() + return ..() -/obj/machinery/vending/default_deconstruction_crowbar(obj/item/O) +/obj/machinery/vending/deconstruction() var/product_list = list(product_records, hidden_records, coin_records) for(var/i=1, i<=3, i++) for(var/datum/data/vending_product/machine_content in product_list[i]) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index a84f002506a..7997c832e00 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -122,40 +122,43 @@ Pipelines + Other Objects -> Pipe network return /obj/machinery/atmospherics/attackby(obj/item/weapon/W, mob/user, params) - if(can_unwrench && istype(W, /obj/item/weapon/wrench)) - var/turf/T = get_turf(src) - if (level==1 && isturf(T) && T.intact) - user << "You must remove the plating first!" - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - add_fingerprint(user) + if(istype(W, /obj/item/weapon/wrench)) + if(can_unwrench(user)) + var/turf/T = get_turf(src) + if (level==1 && isturf(T) && T.intact) + user << "You must remove the plating first!" + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + add_fingerprint(user) - var/unsafe_wrenching = FALSE - var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() + var/unsafe_wrenching = FALSE + var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "You begin to unfasten \the [src]..." - if (internal_pressure > 2*ONE_ATMOSPHERE) - user << "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?" - unsafe_wrenching = TRUE //Oh dear oh dear + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "You begin to unfasten \the [src]..." + if (internal_pressure > 2*ONE_ATMOSPHERE) + user << "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?" + unsafe_wrenching = TRUE //Oh dear oh dear - if (do_after(user, 20/W.toolspeed, target = src) && !qdeleted(src)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src].", \ - "You hear ratchet.") - investigate_log("was REMOVED by [key_name(usr)]", "atmos") - - //You unwrenched a pipe full of pressure? Let's splat you into the wall, silly. - if(unsafe_wrenching) - unsafe_pressure_release(user, internal_pressure) - Deconstruct() + if (do_after(user, 20/W.toolspeed, target = src) && !qdeleted(src)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "You unfasten \the [src].", \ + "You hear ratchet.") + investigate_log("was REMOVED by [key_name(usr)]", "atmos") + //You unwrenched a pipe full of pressure? Let's splat you into the wall, silly. + if(unsafe_wrenching) + unsafe_pressure_release(user, internal_pressure) + Deconstruct() else return ..() +/obj/machinery/atmospherics/proc/can_unwrench(mob/user) + return can_unwrench + // Throws the user when they unwrench a pipe with a major difference between the internal and environmental pressure. /obj/machinery/atmospherics/proc/unsafe_pressure_release(mob/user, pressures = null) if(!user) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 7ddc1f518c9..7e5074c6388 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -166,10 +166,10 @@ Passive gate is similar to the regular pump except: ..() update_icon() -/obj/machinery/atmospherics/components/binary/passive_gate/attackby(obj/item/weapon/W, mob/user, params) - if(!istype(W, /obj/item/weapon/wrench)) - return ..() - if(on) - user << "You cannot unwrench this [src], turn it off first!" - return 1 - return ..() +/obj/machinery/atmospherics/components/binary/passive_gate/can_unwrench(mob/user) + if(..()) + if(on) + user << "You cannot unwrench this [src], turn it off first!" + else + return 1 + diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 1304c1b12ca..a500b3841de 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -173,11 +173,10 @@ Thus, the two variables affect pump operation are set in New(): ..() update_icon() -/obj/machinery/atmospherics/components/binary/pump/attackby(obj/item/weapon/W, mob/user, params) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first!" - return 1 - return ..() +/obj/machinery/atmospherics/components/binary/pump/can_unwrench(mob/user) + if(..()) + if(!(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first!" + else + return 1 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 8a09e99b93e..6b4bc164574 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -169,10 +169,10 @@ Thus, the two variables affect pump operation are set in New(): ..() update_icon() -/obj/machinery/atmospherics/components/binary/volume_pump/attackby(obj/item/weapon/W, mob/user, params) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first!" - return 1 - return ..() +/obj/machinery/atmospherics/components/binary/volume_pump/can_unwrench(mob/user) + if(..()) + if(!(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first!" + else + return 1 + diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 91a7a2d8ad0..d896d93a9a3 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -164,17 +164,17 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/reagent_containers/glass)) - if(isrobot(user)) + . = 1 //no afterattack + if(!user.drop_item()) return if(beaker) user << "A beaker is already loaded into [src]!" return - if(!user.drop_item()) - return beaker = I I.loc = src user.visible_message("[user] places [I] in [src].", \ "You place [I] in [src].") + return if(!on && !occupant && !state_open) if(default_deconstruction_screwdriver(user, "cell-o", "cell-off", I)) return @@ -186,6 +186,7 @@ return if(default_deconstruction_crowbar(I)) return + return ..() /obj/machinery/atmospherics/components/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = notcontained_state) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index e4b9622b481..8d1c435b10c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -27,12 +27,12 @@ connected_device.disconnect() return ..() -/obj/machinery/atmospherics/components/unary/portables_connector/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/wrench)) +/obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user) + if(..()) if(connected_device) - user << "You cannot unwrench this [src], dettach [connected_device] first!" + user << "You cannot unwrench this [src], detach [connected_device] first!" + else return 1 - return ..() /obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir() return connected_device.portableConnectorReturnAir() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 3ac314d3b6b..ed142bbf4ed 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -85,6 +85,7 @@ return if(default_deconstruction_crowbar(I)) return + return ..() /obj/machinery/atmospherics/components/unary/thermomachine/default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W) if(!..()) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index f00c99897d1..55ac2266861 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -244,9 +244,6 @@ return /obj/machinery/atmospherics/components/unary/vent_pump/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/weapon/wrench)&& !(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first!" - return 1 if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) @@ -267,6 +264,13 @@ else return ..() +/obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user) + if(..()) + if(!(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first!" + else + return 1 + /obj/machinery/atmospherics/components/unary/vent_pump/examine(mob/user) ..() if(welded) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index cdefd24e240..b9c727da0a6 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -310,12 +310,15 @@ update_icon() pipe_vision_img = image(src, loc, layer = 20, dir = dir) return 0 - if (!istype(W, /obj/item/weapon/wrench)) + else return ..() - if (!(stat & NOPOWER) && on) - user << "You cannot unwrench this [src], turn it off first!" - return 1 - return ..() + +/obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user) + if(..()) + if (!(stat & NOPOWER) && on) + user << "You cannot unwrench this [src], turn it off first!" + else + return 1 /obj/machinery/atmospherics/components/unary/vent_scrubber/can_crawl_through() return !welded diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 212e1ccef37..00d7fab4602 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -149,14 +149,25 @@ /obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > temperature_resistance) - health -= 5 - healthcheck() + take_damage(5, BRUTE, 0) -/obj/machinery/portable_atmospherics/canister/proc/healthcheck() +/obj/machinery/portable_atmospherics/canister/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return if(stat & BROKEN) return - - if(health <= 10) + health = max( health - damage, 0) + if(!health) disconnect() var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) var/turf/T = get_turf(src) @@ -193,42 +204,33 @@ update_icon() /obj/machinery/portable_atmospherics/canister/blob_act() - health = 0 - healthcheck() + take_damage(100, BRUTE, 0) /obj/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/P) - if((P.damage_type == BRUTE || P.damage_type == BURN)) - if(P.damage) - health -= round(P.damage / 2) - healthcheck() - ..() + . = ..() + take_damage(P.damage / 2, P.damage_type, 0) /obj/machinery/portable_atmospherics/canister/ex_act(severity, target) switch(severity) if(1) if((stat & BROKEN) || prob(30)) qdel(src) - return else - health = 0 + take_damage(100, BRUTE, 0) if(2) if(stat & BROKEN) qdel(src) - return else - health -= rand(40, 100) + take_damage(rand(40, 110), BRUTE, 0) if(3) - health -= rand(15, 40) - healthcheck() + take_damage(rand(15, 40), BRUTE, 0) -/obj/machinery/portable_atmospherics/canister/attackby(obj/item/weapon/W, mob/user, params) - if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda)) - investigate_log("was smacked with \a [W] by [key_name(user)].", "atmos") - health -= W.force - add_fingerprint(user) - healthcheck() - playsound(loc, 'sound/weapons/smash.ogg', 60, 1) - ..() +/obj/machinery/portable_atmospherics/canister/attacked_by(obj/item/I, mob/user) + if(I.force) + user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!") + investigate_log("was smacked with \a [I] by [key_name(user)].", "atmos") + add_fingerprint(user) + take_damage(I.force, I.damtype, 1) /obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = physical_state) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index f2b12e19c45..44f59644a2f 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -69,38 +69,40 @@ return air_contents /obj/machinery/portable_atmospherics/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/tank) && !(stat & BROKEN)) - var/obj/item/weapon/tank/T = W - if(holding || !user.drop_item()) - return - T.loc = src - holding = T - update_icon() - else if(istype(W, /obj/item/weapon/wrench) && !(stat & BROKEN)) - if(connected_port) - disconnect() - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user.visible_message( \ - "[user] disconnects [src].", \ - "You unfasten [src] from the port.", \ - "You hear a ratchet.") - update_icon() - return - else - var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/components/unary/portables_connector) in loc - if(!possible_port) - user << "Nothing happens." + if(istype(W, /obj/item/weapon/tank)) + if(!(stat & BROKEN)) + var/obj/item/weapon/tank/T = W + if(holding || !user.drop_item()) return - if(!connect(possible_port)) - user << "[name] failed to connect to the port." - return - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user.visible_message( \ - "[user] connects [src].", \ - "You fasten [src] to the port.", \ - "You hear a ratchet.") + T.loc = src + holding = T update_icon() - else if((istype(W, /obj/item/device/analyzer)) && Adjacent(user)) + else if(istype(W, /obj/item/weapon/wrench)) + if(!(stat & BROKEN)) + if(connected_port) + disconnect() + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user.visible_message( \ + "[user] disconnects [src].", \ + "You unfasten [src] from the port.", \ + "You hear a ratchet.") + update_icon() + return + else + var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/components/unary/portables_connector) in loc + if(!possible_port) + user << "Nothing happens." + return + if(!connect(possible_port)) + user << "[name] failed to connect to the port." + return + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user.visible_message( \ + "[user] connects [src].", \ + "You fasten [src] to the port.", \ + "You hear a ratchet.") + update_icon() + else if(istype(W, /obj/item/device/analyzer) && Adjacent(user)) atmosanalyzer_scan(air_contents, user) else - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm index 46cbf39ef83..afbb781a6e1 100644 --- a/code/modules/food&drinks/kitchen machinery/processor.dm +++ b/code/modules/food&drinks/kitchen machinery/processor.dm @@ -170,7 +170,8 @@ if(default_unfasten_wrench(user, O)) return - default_deconstruction_crowbar(O) + if(default_deconstruction_crowbar(O)) + return var/atom/movable/what = O if(istype(O, /obj/item/weapon/grab)) @@ -183,15 +184,17 @@ what = G.affecting var/datum/food_processor_process/P = select_recipe(what) - if (!P) - user << "That probably won't blend!" - return 1 - - user.visible_message("[user] put [what] into [src].", \ - "You put the [what] into [src].") - user.drop_item() - what.loc = src - return + if(P) + user.visible_message("[user] put [what] into [src].", \ + "You put the [what] into [src].") + user.drop_item() + what.loc = src + else + if(user.a_intent != "harm") + user << "That probably won't blend!" + return 1 + else + return ..() /obj/machinery/processor/attack_hand(mob/user) if (src.stat != 0) //NOPOWER etc diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food&drinks/kitchen machinery/smartfridge.dm index 7c312cbf91f..1eac74d44c7 100644 --- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm +++ b/code/modules/food&drinks/kitchen machinery/smartfridge.dm @@ -66,7 +66,9 @@ power_change() return - default_deconstruction_crowbar(O) + if(default_deconstruction_crowbar(O)) + updateUsrDialog() + return if(stat) return 0 @@ -81,38 +83,36 @@ updateUsrDialog() return 1 - var/loaded = 0 - if(istype(O, /obj/item/weapon/storage/bag)) var/obj/item/weapon/storage/P = O + var/loaded = 0 for(var/obj/G in P.contents) if(contents.len >= max_n_of_items) break if(accept_check(G)) load(G) loaded++ - else + updateUsrDialog() + + if(loaded) + if(contents.len >= max_n_of_items) + user.visible_message("[user] loads \the [src] with \the [O].", \ + "You fill \the [src] with \the [O].") + else + user.visible_message("[user] loads \the [src] with \the [O].", \ + "You load \the [src] with \the [O].") + if(O.contents.len > 0) + user << "Some items are refused." + else + user << "There is nothing in [O] to put in [src]!" + return 0 + + else if(user.a_intent != "harm") user << "\The [src] smartly refuses [O]." updateUsrDialog() return 0 - - // this is a little backwards but it avoids duplication. - // this code follows storage items and trays only. - if(loaded) - if(contents.len >= max_n_of_items) - user.visible_message("[user] loads \the [src] with \the [O].", \ - "You fill \the [src] with \the [O].") - else - user.visible_message("[user] loads \the [src] with \the [O].", \ - "You load \the [src] with \the [O].") - if(O.contents.len > 0) - user << "Some items are refused." else - user << "There is nothing in [O] to put in [src]!" - return 0 - - updateUsrDialog() - return 1 + return ..() diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 48a05c0bd27..978c4d191d9 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -54,40 +54,59 @@ return /obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/weapon/reagent_containers/glass) && !panel_open) - if(beaker) - user << "A container is already loaded into the machine." - else - user.unEquip(O) - O.loc = src - beaker = O - user << "You add the container to the machine." - updateUsrDialog() - else if(processing) + if(processing) user << "The biogenerator is currently processing." + return + + if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O)) + if(beaker) + var/obj/item/weapon/reagent_containers/glass/B = beaker + B.loc = loc + beaker = null + update_icon() + return + + if(exchange_parts(user, O)) + return + + if(default_deconstruction_crowbar(O)) + return + + if(istype(O, /obj/item/weapon/reagent_containers/glass)) + if(!panel_open) + if(beaker) + user << "A container is already loaded into the machine." + else + user.unEquip(O) + O.loc = src + beaker = O + user << "You add the container to the machine." + update_icon() + updateUsrDialog() + return 1 //no afterattack + else if(istype(O, /obj/item/weapon/storage/bag/plants)) + var/obj/item/weapon/storage/bag/plants/PB = O var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) user << "The biogenerator is already full! Activate it." else - for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) + for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in PB.contents) if(i >= max_items) break - G.loc = src + PB.remove_from_storage(G, src) i++ if(iYou empty the plant bag into the biogenerator." - else if(O.contents.len == 0) + else if(PB.contents.len == 0) user << "You empty the plant bag into the biogenerator, filling it to its capacity." else user << "You fill the biogenerator to its capacity." + return 1 //no afterattack - - else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) - user << "You cannot put this in [src.name]!" - else + else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ @@ -97,21 +116,12 @@ user.unEquip(O) O.loc = src user << "You put [O.name] in [src.name]" + return 1 //no afterattack - if(!processing) - if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O)) - if(beaker) - var/obj/item/weapon/reagent_containers/glass/B = beaker - B.loc = loc - beaker = null - - if(exchange_parts(user, O)) - return - - default_deconstruction_crowbar(O) - - update_icon() - return + else if(user.a_intent != "harm") + user << "You cannot put this in [src.name]!" + else + return ..() /obj/machinery/biogenerator/interact(mob/user) if(stat & BROKEN || panel_open) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 7e479069c3c..d30378251f5 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -6,12 +6,16 @@ else t_max = rand(1,4) + var/seedloc = O.loc + if(extractor) + seedloc = extractor.loc + if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/)) var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O if(F.seed) while(t_amount < t_max) var/obj/item/seeds/t_prod = F.seed.Copy() - t_prod.loc = O.loc + t_prod.loc = seedloc t_amount++ qdel(O) return 1 @@ -21,19 +25,12 @@ if(F.seed) while(t_amount < t_max) var/obj/item/seeds/t_prod = F.seed.Copy() - t_prod.loc = O.loc + t_prod.loc = seedloc t_amount++ qdel(O) return 1 - /*else if(istype(O, /obj/item/stack/tile/grass)) - var/obj/item/stack/tile/grass/S = O - new /obj/item/seeds/grassseed(O.loc) - S.use(1) - return 1*/ - - else - return 0 + return 0 /obj/machinery/seed_extractor @@ -75,9 +72,7 @@ if(default_unfasten_wrench(user, O)) return - default_deconstruction_crowbar(O) - - if(isrobot(user)) + if(default_deconstruction_crowbar(O)) return if (istype(O,/obj/item/weapon/storage/bag/plants)) @@ -87,7 +82,7 @@ if(contents.len >= max_seeds) break ++loaded - add(G) + add_seed(G) if (loaded) user << "You put the seeds from \the [O.name] into [src]." else @@ -98,19 +93,18 @@ user << "\The [O] is stuck to your hand, you cannot put it in the seed extractor!" return - if(O && O.loc) - O.loc = src.loc - - if(seedify(O,-1)) + else if(seedify(O,-1, src)) user << "You extract some seeds." return else if (istype(O,/obj/item/seeds)) - add(O) + add_seed(O) user << "You add [O] to [src.name]." updateUsrDialog() return - else + else if(user.a_intent != "harm") user << "You can't extract any seeds from \the [O.name]!" + else + return ..() /datum/seed_pile var/name = "" @@ -187,7 +181,7 @@ src.updateUsrDialog() return -/obj/machinery/seed_extractor/proc/add(obj/item/seeds/O) +/obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/O) if(contents.len >= 999) usr << "\The [src] is full." return 0 diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 12ec53f1011..7d52a164b8c 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -93,7 +93,7 @@ if (!powered()) return if(istype(W,/obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/I = usr.get_active_hand() + var/obj/item/weapon/card/id/I = user.get_active_hand() if(istype(I) && !istype(inserted_id)) if(!user.drop_item()) return @@ -112,12 +112,13 @@ if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W)) updateUsrDialog() return - if(panel_open) - if(istype(W, /obj/item/weapon/crowbar)) - empty_content() - default_deconstruction_crowbar(W) - return 1 - ..() + if(default_deconstruction_crowbar(W)) + return + + return ..() + +/obj/machinery/mineral/ore_redemption/deconstruction() + empty_content() /obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O) if(O.refined_type) @@ -407,11 +408,9 @@ if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) updateUsrDialog() return - if(panel_open) - if(istype(I, /obj/item/weapon/crowbar)) - default_deconstruction_crowbar(I) - return 1 - ..() + if(default_deconstruction_crowbar(I)) + return + return ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/weapon/mining_voucher/voucher, mob/redeemer) var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Two Survival Capsules", "Resonator", "Mining Drone", "Advanced Scanner") @@ -767,8 +766,8 @@ icon_state = "door_electronics" icon = 'icons/obj/module.dmi' -/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user) - if(!istype(M)) +/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity) + if(!istype(M) || !proximity) return upgrade_bot(M, user) diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index 9a3849e202e..a2b9add6e23 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -20,20 +20,29 @@ It is possible to destroy the net by the occupant or someone else. -/obj/effect/energy_net/proc/healthcheck() +/obj/effect/energy_net/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) + else + return + health -= damage if(health <=0) - density = 0 - if(affecting) - var/mob/living/carbon/M = affecting - M.anchored = 0 - for(var/mob/O in viewers(src, 3)) - O.show_message("[M.name] was recovered from the energy net!", 1, "You hear a grunt.", 2) - if(!isnull(master))//As long as they still exist. - master << "ERROR: unable to initiate transport protocol. Procedure terminated." qdel(src) - return - +/obj/effect/energy_net/Destroy() + if(affecting) + var/mob/living/carbon/M = affecting + M.anchored = 0 + for(var/mob/O in viewers(src, 3)) + O.show_message("[M.name] was recovered from the energy net!", 1, "You hear a grunt.", 2) + if(master)//As long as they still exist. + master << "ERROR: unable to initiate transport protocol. Procedure terminated." + return ..() /obj/effect/energy_net/process(mob/living/carbon/M) var/check = 30//30 seconds before teleportation. Could be extended I guess. @@ -98,53 +107,39 @@ It is possible to destroy the net by the occupant or someone else. /obj/effect/energy_net/bullet_act(obj/item/projectile/Proj) - health -= Proj.damage - healthcheck() - ..() + . = ..() + take_damage(Proj.damage, Proj.damage_type) /obj/effect/energy_net/ex_act(severity, target) switch(severity) if(1) - health-=50 + qdel(src) if(2) - health-=50 + qdel(src) if(3) - health-=prob(50)?50:25 - healthcheck() - return - - + take_damage(rand(10,25), BRUTE, 0) /obj/effect/energy_net/blob_act() - health-=50 - healthcheck() - return + qdel(src) - - -/obj/effect/energy_net/hitby(AM as mob|obj) +/obj/effect/energy_net/hitby(atom/movable/AM) ..() var/tforce = 0 if(ismob(AM)) tforce = 10 - else - tforce = AM:throwforce - playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) - health = max(0, health - tforce) - healthcheck() - ..() - return - + else if(isobj(AM)) + var/obj/O = AM + tforce = O.throwforce + take_damage(tforce) /obj/effect/energy_net/attack_hulk(mob/living/carbon/human/user) ..(user, 1) user.visible_message("[user] rips the energy net apart!", \ "You easily destroy the energy net.") - health-=50 - healthcheck() + qdel(src) @@ -155,25 +150,17 @@ It is possible to destroy the net by the occupant or someone else. /obj/effect/energy_net/attack_alien(mob/living/user) user.do_attack_animation(src) - if (islarva(user)) - return + user.changeNext_move(CLICK_CD_MELEE) playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) - health -= rand(10, 20) - if(health > 0) - user.visible_message("[user] claws at the energy net!", \ - "\green You claw at the net.") - else - user.visible_message("[user] slices the energy net apart!", \ + user.visible_message("[user] slices the energy net apart!", \ "\green You slice the energy net to pieces.") - healthcheck() - return + qdel(src) -/obj/effect/energy_net/attackby(obj/item/weapon/W, mob/user, params) - var/aforce = W.force - health = max(0, health - aforce) - healthcheck() +/obj/effect/energy_net/attacked_by(obj/item/weapon/W, mob/user) ..() - return + take_damage(W.force, W.damtype) + + diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index d21ac7a912c..71117b114db 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -78,19 +78,19 @@ add_fingerprint(user) -/obj/item/weapon/paper_bin/attackby(obj/item/weapon/paper/i, mob/user, params) - if(!istype(i)) +/obj/item/weapon/paper_bin/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/paper)) + var/obj/item/weapon/paper/P = I + if(!user.unEquip(P)) + return + P.loc = src + user << "You put [P] in [src]." + papers.Add(P) + amount++ + update_icon() + else return ..() - if(!user.unEquip(i)) - return - i.loc = src - user << "You put [i] in [src]." - papers.Add(i) - amount++ - update_icon() - - /obj/item/weapon/paper_bin/examine(mob/user) ..() if(amount) diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 985247e2203..3f10566dde8 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -127,9 +127,10 @@ /obj/machinery/power/am_control_unit/bullet_act(obj/item/projectile/Proj) + . = ..() if(Proj.flag != "bullet") stability -= Proj.force - return 0 + check_stability() /obj/machinery/power/am_control_unit/power_change() @@ -158,15 +159,14 @@ else if(!linked_shielding.len > 0) playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] unsecures the [src.name].", \ - "YYou remove the anchor bolts.", \ + "You remove the anchor bolts.", \ "You hear a ratchet.") src.anchored = 0 disconnect_from_network() else user << "Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" - return - if(istype(W, /obj/item/weapon/am_containment)) + else if(istype(W, /obj/item/weapon/am_containment)) if(fueljar) user << "There is already a [fueljar] inside!" return @@ -179,20 +179,29 @@ user.visible_message("[user.name] loads an [W.name] into the [src.name].", \ "You load an [W.name].", \ "You hear a thunk.") - return + else + return ..() - if(W.force >= 20) - stability -= W.force/2 +/obj/machinery/power/am_control_unit/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + if(damage >= 20) + stability -= damage/2 check_stability() - ..() - - /obj/machinery/power/am_control_unit/attack_hand(mob/user) if(anchored) interact(user) - return - /obj/machinery/power/am_control_unit/proc/add_shielding(obj/machinery/am_shielding/AMS, AMS_linking = 0) if(!istype(AMS)) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 1fa86b2fb12..f4cc4163c7d 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -112,9 +112,10 @@ /obj/machinery/am_shielding/bullet_act(obj/item/projectile/Proj) + . = ..() if(Proj.flag != "bullet") stability -= Proj.force/2 - return 0 + check_stability() /obj/machinery/am_shielding/update_icon() @@ -132,11 +133,22 @@ shutdown_core() -/obj/machinery/am_shielding/attackby(obj/item/W, mob/user, params) - if(W.force > 10) - stability -= W.force/2 +/obj/machinery/am_shielding/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + if(damage >= 10) + stability -= damage/2 check_stability() - ..() //Call this to link a detected shilding unit to the controller @@ -219,6 +231,5 @@ if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) new/obj/machinery/am_shielding(src.loc) qdel(src) - return - ..() - return \ No newline at end of file + else + return ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index bb6b4f5fd45..47b0d481de9 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -114,7 +114,7 @@ transfer_fingerprints_to(newlight) qdel(src) return - ..() + return ..() /obj/machinery/light_construct/small @@ -148,6 +148,7 @@ // this is used to calc the probability the light burns out var/rigged = 0 // true if rigged to explode + var/health = 20 // the smaller bulb light fixture @@ -158,6 +159,7 @@ brightness = 4 desc = "A small lighting fixture." light_type = /obj/item/weapon/light/bulb + health = 15 /obj/machinery/light/Move() @@ -276,16 +278,12 @@ //Light replacer code if(istype(W, /obj/item/device/lightreplacer)) var/obj/item/device/lightreplacer/LR = W - if(isliving(user)) - var/mob/living/U = user - LR.ReplaceLight(src, U) - return + LR.ReplaceLight(src, user) // attempt to insert light - if(istype(W, /obj/item/weapon/light)) + else if(istype(W, /obj/item/weapon/light)) if(status != LIGHT_EMPTY) user << "There is a [fitting] already inserted!" - return else src.add_fingerprint(user) var/obj/item/weapon/light/L = W @@ -306,28 +304,6 @@ explode() else user << "This type of light requires a [fitting]!" - return - - // attempt to break the light - //If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N - - else if(status != LIGHT_BROKEN && status != LIGHT_EMPTY) - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - if(W.damtype == STAMINA) - return - if(prob(1+W.force * 5)) - - user.visible_message("[user.name] smashed the light!", \ - "You hit the light, and it smashes!", \ - "You hear a tinkle of breaking glass.") - if(on && (W.flags & CONDUCT)) - if (prob(12)) - electrocute_mob(user, get_area(src), src, 0.3) - broken() - - else - user.visible_message("[user.name] hits the light!") // attempt to stick weapon into light socket else if(status == LIGHT_EMPTY) @@ -348,15 +324,43 @@ newlight.stage = 2 transfer_fingerprints_to(newlight) qdel(src) - return + else + user << "You stick \the [W] into the light socket!" + if(has_power() && (W.flags & CONDUCT)) + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(3, 1, src) + s.start() + if (prob(75)) + electrocute_mob(user, get_area(src), src, rand(0.7,1.0)) + else + return ..() - user << "You stick \the [W] into the light socket!" - if(has_power() && (W.flags & CONDUCT)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() - if (prob(75)) - electrocute_mob(user, get_area(src), src, rand(0.7,1.0)) +/obj/machinery/light/attacked_by(obj/item/I, mob/living/user) + ..() + if(status == LIGHT_BROKEN || status == LIGHT_EMPTY) + if(on && (I.flags & CONDUCT)) + if(prob(12)) + electrocute_mob(user, get_area(src), src, 0.3) + +/obj/machinery/light/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + switch(status) + if(LIGHT_EMPTY) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + if(LIGHT_BROKEN) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 90, 1) + else + playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + health -= damage + if(health <= 0) + broken() // returns whether this light has power @@ -385,28 +389,20 @@ src.flicker(1) return -// Aliens smash the bulb but do not get electrocuted./N -/obj/machinery/light/attack_alien(mob/living/carbon/alien/humanoid/user)//So larva don't go breaking light bulbs. - if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) - user << "\green That object is useless to you." - return - else if (status == LIGHT_OK||status == LIGHT_BURNED) - user.do_attack_animation(src) - visible_message("[user.name] smashed the light!", "You hear a tinkle of breaking glass.") - broken() - return +/obj/machinery/light/bullet_act(obj/item/projectile/P) + . = ..() + take_damage(P.damage, P.damage_type, 0) + +/obj/machinery/light/hitby(AM as mob|obj) + ..() + var/tforce = 0 + if(ismob(AM)) + tforce = 40 + else if(isobj(AM)) + var/obj/item/I = AM + tforce = I.throwforce + take_damage(tforce) -/obj/machinery/light/attack_animal(mob/living/simple_animal/M) - if(M.melee_damage_upper == 0) - return - if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) - M << "That object is useless to you." - return - else if (status == LIGHT_OK||status == LIGHT_BURNED) - M.do_attack_animation(src) - visible_message("[M.name] smashed the light!", "You hear a tinkle of breaking glass.") - broken() - return // attack with hand - remove tube/bulb // if hands aren't protected and the light is on, burn the player @@ -584,8 +580,8 @@ brightness = 4 /obj/item/weapon/light/throw_impact(atom/hit_atom) - ..() - shatter() + if(!..()) //not caught by a mob + shatter() // update the icon state and description of the light @@ -625,17 +621,12 @@ ..() return -// called after an attack with a light item -// shatter light, unless it was an attempt to put it in a light socket -// now only shatter if the intent was harm - -/obj/item/weapon/light/afterattack(atom/target, mob/user,proximity) - if(!proximity) return - if(istype(target, /obj/machinery/light)) - return - if(user.a_intent != "harm") - return +/obj/item/weapon/light/attack(mob/living/M, mob/living/user, def_zone) + ..() + shatter() +/obj/item/weapon/light/attack_obj(obj/O, mob/living/user) + ..() shatter() /obj/item/weapon/light/proc/shatter() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 304e5a37a1f..60a44a6f8bc 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -10,7 +10,7 @@ var/global/list/rad_collectors = list() density = 1 req_access = list(access_engine_equip) // use_power = 0 - var/obj/item/weapon/tank/internals/plasma/P = null + var/obj/item/weapon/tank/internals/plasma/loaded_tank = null var/last_power = 0 var/active = 0 var/locked = 0 @@ -25,13 +25,13 @@ var/global/list/rad_collectors = list() return ..() /obj/machinery/power/rad_collector/process() - if(P) - if(!P.air_contents.gases["plasma"]) + if(loaded_tank) + if(!loaded_tank.air_contents.gases["plasma"]) investigate_log("out of fuel.","singulo") eject() else - P.air_contents.gases["plasma"][MOLES] -= 0.001*drainratio - P.air_contents.garbage_collect() + loaded_tank.air_contents.gases["plasma"][MOLES] -= 0.001*drainratio + loaded_tank.air_contents.garbage_collect() return @@ -43,7 +43,7 @@ var/global/list/rad_collectors = list() toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ "You turn the [src.name] [active? "on":"off"].") - investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.gases["plasma"][MOLES]/0.29)]%":"It is empty"].","singulo") + investigate_log("turned [active?"on":"off"] by [user.key]. [loaded_tank?"Fuel: [round(loaded_tank.air_contents.gases["plasma"][MOLES]/0.29)]%":"It is empty"].","singulo") return else user << "The controls are locked!" @@ -55,26 +55,26 @@ var/global/list/rad_collectors = list() if(istype(W, /obj/item/device/multitool)) user << "The [W.name] detects that [last_power]W were recently produced." return 1 - else if(istype(W, /obj/item/device/analyzer) && P) - atmosanalyzer_scan(P.air_contents, user) + else if(istype(W, /obj/item/device/analyzer) && loaded_tank) + atmosanalyzer_scan(loaded_tank.air_contents, user) else if(istype(W, /obj/item/weapon/tank/internals/plasma)) - if(!src.anchored) + if(!anchored) user << "The [src] needs to be secured to the floor first!" return 1 - if(src.P) + if(loaded_tank) user << "There's already a plasma tank loaded!" return 1 if(!user.drop_item()) return 1 - src.P = W + loaded_tank = W W.loc = src update_icons() else if(istype(W, /obj/item/weapon/crowbar)) - if(P && !src.locked) + if(loaded_tank && !src.locked) eject() return 1 else if(istype(W, /obj/item/weapon/wrench)) - if(P) + if(loaded_tank) user << "Remove the plasma tank first!" return 1 if(!anchored && !isinspace()) @@ -91,20 +91,18 @@ var/global/list/rad_collectors = list() "You unsecure the external bolts.", \ "You hear a ratchet.") disconnect_from_network() - else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (src.allowed(user)) + else if(W.GetID()) + if(allowed(user)) if(active) - src.locked = !src.locked - user << "You [src.locked ? "lock" : "unlock"] the controls." + locked = !locked + user << "You [locked ? "lock" : "unlock"] the controls." else - src.locked = 0 //just in case it somehow gets locked user << "The controls can only be locked when \the [src] is active!" else user << "Access denied." return 1 else - ..() - return 1 + return ..() /obj/machinery/power/rad_collector/ex_act(severity, target) @@ -116,20 +114,20 @@ var/global/list/rad_collectors = list() /obj/machinery/power/rad_collector/proc/eject() locked = 0 - var/obj/item/weapon/tank/internals/plasma/Z = src.P + var/obj/item/weapon/tank/internals/plasma/Z = src.loaded_tank if (!Z) return Z.loc = get_turf(src) Z.layer = initial(Z.layer) - src.P = null + src.loaded_tank = null if(active) toggle_power() else update_icons() /obj/machinery/power/rad_collector/proc/receive_pulse(pulse_strength) - if(P && active) - var/power_produced = P.air_contents.gases["plasma"] ? P.air_contents.gases["plasma"][MOLES] : 0 + if(loaded_tank && active) + var/power_produced = loaded_tank.air_contents.gases["plasma"] ? loaded_tank.air_contents.gases["plasma"][MOLES] : 0 power_produced *= pulse_strength*20 add_avail(power_produced) last_power = power_produced @@ -139,7 +137,7 @@ var/global/list/rad_collectors = list() /obj/machinery/power/rad_collector/proc/update_icons() overlays.Cut() - if(P) + if(loaded_tank) overlays += image('icons/obj/singularity.dmi', "ptank") if(stat & (NOPOWER|BROKEN)) return diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 836cfc8853a..9b953b22373 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -12,7 +12,7 @@ idle_power_usage = 0 active_power_usage = 0 var/id = 0 - var/health = 10 + var/health = 20 var/obscured = 0 var/sunfrac = 0 var/adir = SOUTH // actual dir @@ -66,24 +66,46 @@ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.") qdel(src) - return - else if (W) - src.add_fingerprint(user) - src.health -= W.force - src.healthcheck() + else + return ..() + +/obj/machinery/power/solar/bullet_act(obj/item/projectile/P) + . = ..() + take_damage(P.damage, P.damage_type) + +/obj/machinery/power/solar/hitby(AM as mob|obj) ..() + var/tforce = 0 + if(ismob(AM)) + tforce = 20 + else if(isobj(AM)) + var/obj/item/I = AM + tforce = I.throwforce + take_damage(tforce) -/obj/machinery/power/solar/proc/healthcheck() - if (src.health <= 0) - if(!(stat & BROKEN)) - set_broken() +/obj/machinery/power/solar/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(stat & BROKEN) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 60, 1) + else + playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1) + if(BURN) + if(sound_effect) + playsound(loc, 'sound/items/Welder.ogg', 100, 1) else - new /obj/item/weapon/shard(src.loc) - new /obj/item/weapon/shard(src.loc) - qdel(src) return - return - + health -= damage + if(health <= 0) + playsound(src, "shatter", 70, 1) + new /obj/item/weapon/shard(src.loc) + new /obj/item/weapon/shard(src.loc) + qdel(src) + else if(health <= 10) + if(!(stat & BROKEN)) + playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1) + set_broken() /obj/machinery/power/solar/update_icon() ..() @@ -132,7 +154,6 @@ stat |= BROKEN unset_control() update_icon() - return /obj/machinery/power/solar/ex_act(severity, target) @@ -140,11 +161,9 @@ if(!qdeleted(src)) switch(severity) if(2) - if(prob(50)) - set_broken() + take_damage(rand(10,20), BRUTE, 0) if(3) - if(prob(25)) - set_broken() + take_damage(rand(5,15), BRUTE, 0) /obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S) ..(loc, S, 0) @@ -255,7 +274,7 @@ tracker = 0 user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.") return 1 - ..() + return ..() // // Solar Control Computer @@ -270,6 +289,7 @@ density = 1 use_power = 1 idle_power_usage = 250 + var/health = 25 var/icon_screen = "solar" var/icon_keyboard = "power_key" var/id = 0 @@ -443,9 +463,33 @@ A.icon_state = "4" A.anchored = 1 qdel(src) - else + else if(user.a_intent != "harm" && !(I.flags & NOBLUDGEON)) src.attack_hand(user) - return + else + return ..() + +/obj/machinery/power/solar_control/bullet_act(obj/item/projectile/P) + . = ..() + take_damage(P.damage, P.damage_type) + +/obj/machinery/power/solar_control/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(stat & BROKEN) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + else + playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + health -= damage + if(health <= 0 && !(stat & BROKEN)) + playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1) + stat |= BROKEN + update_icon() /obj/machinery/power/solar_control/process() lastgen = gen @@ -489,11 +533,9 @@ if(!qdeleted(src)) switch(severity) if(2) - if(prob(50)) - set_broken() + take_damage(rand(20,30), BRUTE, 0) if(3) - if(prob(25)) - set_broken() + take_damage(rand(10,20), BRUTE, 0) /obj/machinery/power/solar_control/blob_act() if (prob(75)) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 7a3c9eb472f..758a41d0d64 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -147,28 +147,28 @@ if(default_unfasten_wrench(user, I)) return - if(isrobot(user)) - return + if(istype(I, /obj/item/weapon/reagent_containers) && (I.flags & OPENCONTAINER)) + var/obj/item/weapon/reagent_containers/B = I + . = 1 //no afterattack + if(beaker) + user << "A container is already loaded into the machine!" + return - var/obj/item/weapon/reagent_containers/B = I // Get a beaker from it? - if(!istype(B)) - return // Not a beaker? + if(!user.drop_item()) // Can't let go? + return - if(beaker) - user << "A beaker is already loaded into the machine!" - return + beaker = B + beaker.loc = src + user << "You add \the [B] to the machine." - if(!user.drop_item()) // Can't let go? - return - - beaker = B - beaker.loc = src - user << "You add the beaker to the machine." - - if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) - overlays += icon_beaker + if(!icon_beaker) + icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10,5) + overlays += icon_beaker + else if(user.a_intent != "harm") + user << "You can't load \the [I] into the machine!" + else + return ..() /obj/machinery/chem_dispenser/constructable name = "portable chem dispenser" @@ -252,7 +252,7 @@ dispensable_reagents |= dispensable_reagent_tiers[i] dispensable_reagents = sortList(dispensable_reagents) -/obj/machinery/chem_dispenser/constructable/attackby(var/obj/item/I, var/mob/user, params) +/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params) ..() if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) return @@ -260,13 +260,14 @@ if(exchange_parts(user, I)) return - if(panel_open) - if(istype(I, /obj/item/weapon/crowbar)) - if(beaker) - beaker.loc = loc - beaker = null - default_deconstruction_crowbar(I) - return 1 + if(default_deconstruction_crowbar(I)) + return + return ..() + +/obj/machinery/chem_dispenser/constructable/deconstruction() + if(beaker) + beaker.loc = loc + beaker = null /obj/machinery/chem_dispenser/drinks name = "soda dispenser" @@ -296,20 +297,6 @@ "lemonjuice" ) -/obj/machinery/chem_dispenser/drinks/attackby(obj/item/I, mob/user) - if(default_unfasten_wrench(user, I)) - return - - if(istype(I, /obj/item/weapon/reagent_containers) && (I.flags & OPENCONTAINER)) - if (beaker) - return 1 - else - if(!user.drop_item()) - return 1 - src.beaker = I - beaker.loc = src - update_icon() - return /obj/machinery/chem_dispenser/drinks/beer name = "booze dispenser" diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 092953d1243..edd2c9dd055 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -39,10 +39,17 @@ beaker.reagents.handle_reactions() /obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params) - if(isrobot(user)) + if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)) + return + + if(exchange_parts(user, I)) + return + + if(default_deconstruction_crowbar(I)) return if(istype(I, /obj/item/weapon/reagent_containers) && (I.flags & OPENCONTAINER)) + . = 1 //no afterattack if(beaker) user << "A beaker is already loaded into the machine!" return @@ -53,18 +60,11 @@ I.loc = src user << "You add the beaker to the machine." icon_state = "mixer1b" - - if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)) return + return ..() - if(exchange_parts(user, I)) - return - - if(panel_open) - if(istype(I, /obj/item/weapon/crowbar)) - eject_beaker() - default_deconstruction_crowbar(I) - return 1 +/obj/machinery/chem_heater/deconstruction() + eject_beaker() /obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = default_state) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 9d6337baf4a..3343bee85cd 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -37,10 +37,12 @@ return if(istype(I, /obj/item/weapon/reagent_containers) && (I.flags & OPENCONTAINER)) - if(isrobot(user)) + . = 1 // no afterattack + if(panel_open) + user << "You can't use the [src.name] while its panel is opened!" return if(beaker) - user << "A beaker is already loaded into the machine!" + user << "A container is already loaded in the machine!" return if(!user.drop_item()) return @@ -62,8 +64,8 @@ bottle.loc = src user << "You add the pill bottle into the dispenser slot." src.updateUsrDialog() - - return + else + return ..() /obj/machinery/chem_master/Topic(href, href_list) if(..()) @@ -341,7 +343,6 @@ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) /obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params) - if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B)) if(beaker) beaker.loc = src.loc @@ -352,40 +353,9 @@ bottle = null return - if(exchange_parts(user, B)) + else if(exchange_parts(user, B)) return - - if(panel_open) - if(istype(B, /obj/item/weapon/crowbar)) - default_deconstruction_crowbar(B) - return 1 - else - user << "You can't use the [src.name] while it's panel is opened!" - return 1 - - if(istype(B, /obj/item/weapon/reagent_containers) && (B.flags & OPENCONTAINER)) - if(beaker) - user << "A beaker is already loaded into the machine!" - return - if(!user.drop_item()) - return - - beaker = B - beaker.loc = src - user << "You add the beaker to the machine." - src.updateUsrDialog() - icon_state = "mixer1" - - else if(!condi && istype(B, /obj/item/weapon/storage/pill_bottle)) - if(bottle) - user << "A pill bottle is already loaded into the machine!" - return - if(!user.drop_item()) - return - - src.bottle = B - B.loc = src - user << "You add the pill bottle into the dispenser slot." - src.updateUsrDialog() - - return + else if(default_deconstruction_crowbar(B)) + return + else + return ..() \ No newline at end of file diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 2e12d38cbf6..c15e48ea344 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -122,22 +122,19 @@ transfer_fingerprints_to(C) user << "You remove the conveyor belt." qdel(src) - return - if(istype(I, /obj/item/weapon/wrench)) + + else if(istype(I, /obj/item/weapon/wrench)) if(!(stat & BROKEN)) playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) dir = turn(dir,-45) update_move_direction() user << "You rotate [src]." - return - if(isrobot(user)) - return //Carn: fix for borgs dropping their modules on conveyor belts - if(!user.drop_item()) - user << "\The [I] is stuck to your hand, you cannot place it on the conveyor!" - return - if(I && I.loc) - I.loc = src.loc - return + + else if(user.a_intent != "harm") + if(user.drop_item()) + I.loc = src.loc + else + return ..() // attack with hand, move pulled object onto conveyor /obj/machinery/conveyor/attack_hand(mob/user) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 74e52fc92c8..dd7ae2b0f36 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -27,7 +27,7 @@ dir = direction // update iconstate and dpdir due to dir and type -/obj/structure/disposalconstruct/proc/update() +/obj/structure/disposalconstruct/update_icon() var/flip = turn(dir, 180) var/left = turn(dir, 90) var/right = turn(dir, -90) @@ -87,7 +87,7 @@ // change visibility status and force update of icon /obj/structure/disposalconstruct/hide(var/intact) invisibility = (intact && level==1) ? 101: 0 // hide if floor is intact - update() + update_icon() // flip and rotate verbs @@ -104,7 +104,7 @@ return dir = turn(dir, -90) - update() + update_icon() /obj/structure/disposalconstruct/AltClick(mob/user) ..() @@ -138,7 +138,7 @@ if(DISP_SORTJUNCTION_FLIP) ptype = DISP_SORTJUNCTION - update() + update_icon() // returns the type path of disposalpipe corresponding to this item dtype /obj/structure/disposalconstruct/proc/dpipetype() @@ -210,7 +210,7 @@ return else if(CP) - update() + update_icon() var/pdir = CP.dpdir if(istype(CP, /obj/structure/disposalpipe/broken)) pdir = CP.dir @@ -223,7 +223,7 @@ density = 0 user << "You attach the [nicetype] to the underfloor." playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) - update() + update_icon() else if(istype(I, /obj/item/weapon/weldingtool)) if(anchored) @@ -235,7 +235,7 @@ if(!loc || !W.isOn()) return user << "The [nicetype] has been welded in place." - update() // TODO: Make this neat + update_icon() // TODO: Make this neat if(ispipe) var/pipetype = dpipetype() diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index b13585f9c1d..3f00548adba 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -358,24 +358,27 @@ //weldingtool: unfasten and convert to obj/disposalconstruct /obj/structure/disposalpipe/attackby(obj/item/I, mob/user, params) - var/turf/T = src.loc if(T.intact) return // prevent interaction with T-scanner revealed pipes - src.add_fingerprint(user) + add_fingerprint(user) if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/W = I + if(can_be_deconstructed(user)) + if(W.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + user << "You start slicing the disposal pipe..." + // check if anything changed over 2 seconds + if(do_after(user,30, target = src)) + if(!src || !W.isOn()) return + Deconstruct() + user << "You slice the disposal pipe." + else + return ..() - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the disposal pipe..." - // check if anything changed over 2 seconds - if(do_after(user,30, target = src)) - if(!src || !W.isOn()) return - Deconstruct() - user << "You slice the disposal pipe." - else - return +//checks if something is blocking the deconstruction (e.g. trunk with a bin still linked to it) +/obj/structure/disposalpipe/proc/can_be_deconstructed() + . = 1 // called when pipe is cut with welder /obj/structure/disposalpipe/Deconstruct() @@ -386,7 +389,7 @@ stored.dir = dir stored.density = 0 stored.anchored = 1 - stored.update() + stored.update_icon() ..() /obj/structure/disposalpipe/singularity_pull(S, current_size) @@ -514,9 +517,6 @@ return /obj/structure/disposalpipe/sortjunction/attackby(obj/item/I, mob/user, params) - if(..()) - return - if(istype(I, /obj/item/device/destTagger)) var/obj/item/device/destTagger/O = I @@ -528,6 +528,8 @@ sortTypes |= O.currTag user << "Added \"[TAGGERLOCATIONS[O.currTag]]\" filter." playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1) + else + return ..() // next direction to move @@ -635,47 +637,11 @@ update() return - // Override attackby so we disallow trunkremoval when somethings ontop -/obj/structure/disposalpipe/trunk/attackby(obj/item/I, mob/user, params) - - //Disposal bins or chutes - /* - These shouldn't be required - var/obj/machinery/disposal/D = locate() in src.loc - if(D && D.anchored) - return - - //Disposal outlet - var/obj/structure/disposaloutlet/O = locate() in src.loc - if(O && O.anchored) - return - */ - - //Disposal constructors - var/obj/structure/disposalconstruct/C = locate() in src.loc - if(C && C.anchored) - return - - var/turf/T = src.loc - if(T.intact) - return // prevent interaction with T-scanner revealed pipes - src.add_fingerprint(user) - if(istype(I, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/W = I - - if(linked) - user << "You need to deconstruct disposal machinery above this pipe!" - return - - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) - user << "You start slicing the disposal pipe..." - if(do_after(user,30/I.toolspeed, target = src)) - if(!src || !W.isOn()) return - Deconstruct() - user << "You slice the disposal pipe." - else - return +/obj/structure/disposalpipe/trunk/can_be_deconstructed(mob/user) + if(linked) + user << "You need to deconstruct disposal machinery above this pipe!" + else + . = 1 // would transfer to next pipe segment, but we are in a trunk // if not entering from disposal bin, @@ -781,20 +747,17 @@ return /obj/structure/disposaloutlet/attackby(obj/item/I, mob/user, params) - if(!I || !user) - return - src.add_fingerprint(user) + add_fingerprint(user) if(istype(I, /obj/item/weapon/screwdriver)) if(mode==0) mode=1 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You remove the screws around the power connection." - return else if(mode==1) mode=0 playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You attach the screws around the power connection." - return + else if(istype(I,/obj/item/weapon/weldingtool) && mode==1) var/obj/item/weapon/weldingtool/W = I if(W.remove_fuel(0,user)) @@ -805,13 +768,12 @@ user << "You slice the floorweld off \the [src]." stored.loc = loc src.transfer_fingerprints_to(stored) - stored.update() + stored.update_icon() stored.anchored = 0 stored.density = 1 qdel(src) - return - else - return + else + return ..() diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index d71557e4518..b2296e9c746 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -34,7 +34,7 @@ air_contents = new/datum/gas_mixture() //gas.volume = 1.05 * CELLSTANDARD - update() + update_icon() /obj/machinery/disposal/proc/trunk_check() trunk = locate() in src.loc @@ -66,11 +66,8 @@ trunk_check() /obj/machinery/disposal/attackby(obj/item/I, mob/user, params) - if(stat & BROKEN || !I || !user) - return - add_fingerprint(user) - if(mode<=0) // It's off + if(mode<=0) if(istype(I, /obj/item/weapon/screwdriver)) if(contents.len > 0) user << "Eject the items first!" @@ -96,7 +93,21 @@ user << "You slice the floorweld off \the [src]." Deconstruct() return - return 1 + + if(user.a_intent != "harm") + if(!user.drop_item() || (I.flags & ABSTRACT)) + return + place_item_in_disposal(I, user) + update_icon() + return 1 //no afterattack + else + return ..() + +/obj/machinery/disposal/proc/place_item_in_disposal(obj/item/I, mob/user) + I.loc = src + user.visible_message("[user.name] places \the [I] into \the [src].", \ + "You place \the [I] into \the [src].") + // mouse drop another mob or self @@ -133,7 +144,7 @@ "[user] has placed [target] in [src].") add_logs(user, target, "stuffed", addition="into [src]") target.LAssailant = user - update() + update_icon() // can breath normally in the disposal /obj/machinery/disposal/alter_health() @@ -157,7 +168,7 @@ user.loc = src.loc user.reset_perspective(null) - update() + update_icon() return @@ -166,7 +177,7 @@ if(stat & BROKEN) return flush = !flush - update() + update_icon() // ai as human but can't flush /obj/machinery/disposal/attack_ai(mob/user) @@ -198,10 +209,10 @@ for(var/atom/movable/AM in src) AM.forceMove(T) AM.pipe_eject(0) - update() + update_icon() // update the icon & overlays to reflect mode & status -/obj/machinery/disposal/proc/update() +/obj/machinery/disposal/update_icon() return /obj/machinery/disposal/proc/flush() @@ -222,12 +233,6 @@ flushing = 0 flush = 0 -/obj/machinery/disposal/bin/flush() - ..() - if(mode == 2) - mode = 1 - update() - /obj/machinery/disposal/proc/newHolderDestination(obj/structure/disposalholder/H) for(var/obj/item/smallDelivery/O in src) H.tomail = 1 @@ -239,7 +244,7 @@ // called when area power changes /obj/machinery/disposal/power_change() ..() // do default setting/reset of stat NOPOWER bit - update() // update icon + update_icon() // update icon return @@ -267,7 +272,7 @@ src.transfer_fingerprints_to(stored) stored.anchored = 0 stored.density = 1 - stored.update() + stored.update_icon() ..() //How disposal handles getting a storage dump from a storage object @@ -294,26 +299,15 @@ // attack by item places it in to disposal /obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params) - if(!..()) - return - if(istype(I, /obj/item/weapon/storage/bag/trash)) var/obj/item/weapon/storage/bag/trash/T = I user << "You empty the bag." for(var/obj/item/O in T.contents) T.remove_from_storage(O,src) T.update_icon() - update() - return - - if(!user.drop_item() || I.flags & ABSTRACT) // Dunno why this wasn't here before? - return - - I.loc = src - user.visible_message("[user.name] places \the [I] into \the [src].", \ - "You place \the [I] into \the [src].") - - update() + update_icon() + else + return ..() // user interaction /obj/machinery/disposal/bin/interact(mob/user, ai=0) @@ -373,11 +367,11 @@ mode = 1 else mode = 0 - update() + update_icon() if(href_list["handle"]) flush = text2num(href_list["handle"]) - update() + update_icon() if(href_list["eject"]) eject() @@ -391,14 +385,20 @@ if(prob(75)) I.loc = src visible_message("\the [I] lands in \the [src].") - update() + update_icon() else visible_message("\the [I] bounces off of \the [src]'s rim!") return 0 else return ..(mover, target, height) -/obj/machinery/disposal/bin/update() +/obj/machinery/disposal/bin/flush() + ..() + if(mode == 2) + mode = 1 + update_icon() + +/obj/machinery/disposal/bin/update_icon() overlays.Cut() if(stat & BROKEN) mode = 0 @@ -473,7 +473,7 @@ // if full enough, switch to ready mode if(air_contents.return_pressure() >= SEND_PRESSURE) mode = 2 - update() + update_icon() return /obj/machinery/disposal/bin/get_remote_view_fullscreens(mob/user) @@ -498,6 +498,11 @@ if(trunk) trunk.linked = src // link the pipe trunk to self +/obj/machinery/disposal/deliveryChute/place_item_in_disposal(obj/item/I, mob/user) + if(I.disposalEnterTry()) + ..() + flush() + /obj/machinery/disposal/deliveryChute/Bumped(atom/movable/AM) //Go straight into the chute if(!AM.disposalEnterTry()) return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 77e9d350cd3..ec75e1a1d75 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -44,6 +44,8 @@ icon_state = "gift[icon_state]" else user << "You need more paper!" + else + return ..() /obj/structure/bigDelivery/relay_container_resist(mob/living/user, obj/O) if(istype(loc, /atom/movable)) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 3b40c550c27..86a65b89bbf 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -74,71 +74,55 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). /obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials() return g_amount + gold_amount + diamond_amount -/obj/machinery/r_n_d/circuit_imprinter/attackby(obj/item/O, mob/user, params) - if (shocked) - shock(user,50) - if (default_deconstruction_screwdriver(user, "circuit_imprinter_t", "circuit_imprinter", O)) - if(linked_console) - linked_console.linked_imprinter = null - linked_console = null - return +//we drop the minerals in the machine onto the ground when deconstructed. +/obj/machinery/r_n_d/circuit_imprinter/deconstruction() + for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) + reagents.trans_to(G, G.reagents.maximum_volume) + if(g_amount >= MINERAL_MATERIAL_AMOUNT) + var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc) + G.amount = round(g_amount / MINERAL_MATERIAL_AMOUNT) + if(gold_amount >= MINERAL_MATERIAL_AMOUNT) + var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc) + G.amount = round(gold_amount / MINERAL_MATERIAL_AMOUNT) + if(diamond_amount >= MINERAL_MATERIAL_AMOUNT) + var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc) + G.amount = round(diamond_amount / MINERAL_MATERIAL_AMOUNT) + ..() - if(exchange_parts(user, O)) - return +/obj/machinery/r_n_d/circuit_imprinter/Insert_Item(obj/item/O, mob/user) - if (panel_open) - if(istype(O, /obj/item/weapon/crowbar)) - for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) - reagents.trans_to(G, G.reagents.maximum_volume) - if(g_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc) - G.amount = round(g_amount / MINERAL_MATERIAL_AMOUNT) - if(gold_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc) - G.amount = round(gold_amount / MINERAL_MATERIAL_AMOUNT) - if(diamond_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc) - G.amount = round(diamond_amount / MINERAL_MATERIAL_AMOUNT) - default_deconstruction_crowbar(O) - return - else - user << "You can't load the [src.name] while it's opened!" - return - if (disabled) - return - if (!linked_console) - user << "The [name] must be linked to an R&D console first!" + if (O.is_open_container()) //inserting reagents into the machine return 1 - if (O.is_open_container()) - return - if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond)) + + if (istype(O, /obj/item/stack/sheet/glass) || istype(O, /obj/item/stack/sheet/mineral/gold) || istype(O, /obj/item/stack/sheet/mineral/diamond)) + . = 1 + if(!is_insertion_ready(user)) + return + var/obj/item/stack/sheet/stack = O + if ((TotalMaterials() + stack.perunit) > max_material_amount) + user << "The [name] is full! Please remove glass from the protolathe in order to insert more." + return + + var/amount = round(input("How many sheets do you want to add?") as num) + if(amount <= 0 || stack.amount <= 0) + return + if(amount > stack.amount) + amount = min(stack.amount, round((max_material_amount-TotalMaterials())/stack.perunit)) + + busy = 1 + use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount/10))) + user << "You add [amount] sheets to the [src.name]." + if(istype(stack, /obj/item/stack/sheet/glass)) + g_amount += amount * MINERAL_MATERIAL_AMOUNT + else if(istype(stack, /obj/item/stack/sheet/mineral/gold)) + gold_amount += amount * MINERAL_MATERIAL_AMOUNT + else if(istype(stack, /obj/item/stack/sheet/mineral/diamond)) + diamond_amount += amount * MINERAL_MATERIAL_AMOUNT + stack.use(amount) + busy = 0 + src.updateUsrDialog() + + else if(user.a_intent != "harm") user << "You cannot insert this item into the [name]!" - return - if (stat) - return - if (busy) - user << "The [name] is busy! Please wait for completion of previous operation." - return - var/obj/item/stack/sheet/stack = O - if ((TotalMaterials() + stack.perunit) > max_material_amount) - user << "The [name] is full! Please remove glass from the protolathe in order to insert more." - return - - var/amount = round(input("How many sheets do you want to add?") as num) - if(amount <= 0 || stack.amount <= 0) - return - if(amount > stack.amount) - amount = min(stack.amount, round((max_material_amount-TotalMaterials())/stack.perunit)) - - busy = 1 - use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount/10))) - user << "You add [amount] sheets to the [src.name]." - if(istype(stack, /obj/item/stack/sheet/glass)) - g_amount += amount * MINERAL_MATERIAL_AMOUNT - else if(istype(stack, /obj/item/stack/sheet/mineral/gold)) - gold_amount += amount * MINERAL_MATERIAL_AMOUNT - else if(istype(stack, /obj/item/stack/sheet/mineral/diamond)) - diamond_amount += amount * MINERAL_MATERIAL_AMOUNT - stack.use(amount) - busy = 0 - src.updateUsrDialog() + else + return 0 \ No newline at end of file diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 6fef356857b..76a65f9015d 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -11,7 +11,6 @@ Note: Must be placed within 3 tiles of the R&D Console name = "Destructive Analyzer" desc = "Learn science by destroying things!" icon_state = "d_analyzer" - var/obj/item/weapon/loaded_item = null var/decon_mod = 0 /obj/machinery/r_n_d/destructive_analyzer/New() @@ -36,30 +35,11 @@ Note: Must be placed within 3 tiles of the R&D Console temp_list[O] = text2num(temp_list[O]) return temp_list - -/obj/machinery/r_n_d/destructive_analyzer/attackby(obj/item/O, mob/user, params) - if (shocked) - shock(user,50) - if (default_deconstruction_screwdriver(user, "d_analyzer_t", "d_analyzer", O)) - if(linked_console) - linked_console.linked_destroy = null - linked_console = null - return - - if(exchange_parts(user, O)) - return - - default_deconstruction_crowbar(O) - - if (disabled) - return - if (!linked_console) - user << "The [src.name] must be linked to an R&D console first!" - return - if (busy) - user << "The [src.name] is busy right now." - return - if (istype(O, /obj/item) && !loaded_item) +/obj/machinery/r_n_d/destructive_analyzer/Insert_Item(obj/item/O, mob/user) + if(user.a_intent != "harm") + . = 1 + if(!is_insertion_ready(user)) + return if(!O.origin_tech) user << "This doesn't seem to have a tech origin!" return @@ -75,7 +55,4 @@ Note: Must be placed within 3 tiles of the R&D Console O.loc = src user << "You add the [O.name] to the [src.name]!" flick("d_analyzer_la", src) - spawn(10) - icon_state = "d_analyzer_l" - busy = 0 - return + diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index d37f8715f1f..7ae08a0338b 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -25,7 +25,6 @@ var/recentlyExperimented = 0 var/mob/trackedIan var/mob/trackedRuntime - var/obj/item/loaded_item = null var/badThingCoeff = 0 var/resetTime = 15 var/cloneMode = FALSE @@ -111,36 +110,14 @@ return FALSE return TRUE -/obj/machinery/r_n_d/experimentor/attackby(obj/item/O, mob/user, params) - if (shocked) - shock(user,50) - - if (default_deconstruction_screwdriver(user, "h_lathe_maint", "h_lathe", O)) - if(linked_console) - linked_console.linked_destroy = null - linked_console = null - return - - if(exchange_parts(user, O)) - return - - if(panel_open && istype(O, /obj/item/weapon/crowbar)) - default_deconstruction_crowbar(O) - return - - if(!checkCircumstances(O)) - user << "The [O] is not yet valid for the [src] and must be completed!" - return - - if (disabled) - return - if (!linked_console) - user << "The [src] must be linked to an R&D console first!" - return - if (loaded_item) - user << "The [src] is already loaded." - return - if (istype(O, /obj/item)) +/obj/machinery/r_n_d/experimentor/Insert_Item(obj/item/O, mob/user) + if(user.a_intent != "harm") + . = 1 + if(!is_insertion_ready(user)) + return + if(!checkCircumstances(O)) + user << "The [O] is not yet valid for the [src] and must be completed!" + return if(!O.origin_tech) user << "This doesn't seem to have a tech origin!" return @@ -158,7 +135,7 @@ user << "You add the [O.name] to the machine." flick("h_lathe_load", src) - return + /obj/machinery/r_n_d/experimentor/default_deconstruction_crowbar(obj/item/O) ejectItem() @@ -640,7 +617,7 @@ spawn(cooldownMax) cooldown = FALSE else - user << "You aren't quite sure what to do with this yet." + user << "You aren't quite sure what to do with this, yet." //////////////// RELIC PROCS ///////////////////////////// diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 0d390b517de..428ee5947a4 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -72,61 +72,45 @@ Note: Must be placed west/left of and R&D console to function. A = A / max(1, (being_built.materials[M])) return A -/obj/machinery/r_n_d/protolathe/attackby(obj/item/O, mob/user, params) - if (shocked) - shock(user,50) - if (default_deconstruction_screwdriver(user, "protolathe_t", "protolathe", O)) - if(linked_console) - linked_console.linked_lathe = null - linked_console = null - return +//we eject the materials upon deconstruction. +/obj/machinery/r_n_d/protolathe/deconstruction() + for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) + reagents.trans_to(G, G.reagents.maximum_volume) + materials.retrieve_all() + ..() - if(exchange_parts(user, O)) - return +/obj/machinery/r_n_d/protolathe/Insert_Item(obj/item/O, mob/user) - if (panel_open) - if(istype(O, /obj/item/weapon/crowbar)) - for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) - reagents.trans_to(G, G.reagents.maximum_volume) - materials.retrieve_all() - default_deconstruction_crowbar(O) + if(O.is_open_container()) //inserting reagents into the machine + return 1 + + if(istype(O,/obj/item/stack/sheet)) + . = 1 + if(!is_insertion_ready(user)) + return + if(!materials.has_space( materials.get_item_material_amount(O) )) + user << "The [src.name]'s material bin is full! Please remove material before adding more." + return 1 + + var/obj/item/stack/sheet/stack = O + var/amount = round(input("How many sheets do you want to add?") as num)//No decimals + if(!in_range(src, stack) || !user.Adjacent(src)) + return + var/amount_inserted = materials.insert_stack(O,amount) + if(!amount_inserted) return 1 else - user << "You can't load the [src.name] while it's opened!" - return 1 - if (disabled) - return - if (!linked_console) - user << "The [src.name] must be linked to an R&D console first!" - return 1 - if (busy) - user << "The [src.name] is busy! Please wait for completion of previous operation." - return 1 - if (O.is_open_container()) - return - if (stat) - return 1 - if(!istype(O,/obj/item/stack/sheet)) - return 1 + var/stack_name = stack.name + busy = 1 + use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount_inserted/10))) + user << "You add [amount_inserted] sheets to the [src.name]." + overlays += "protolathe_[stack_name]" + sleep(10) + overlays -= "protolathe_[stack_name]" + busy = 0 + updateUsrDialog() - if(!materials.has_space( materials.get_item_material_amount(O) )) - user << "The [src.name]'s material bin is full! Please remove material before adding more." - return 1 - - var/obj/item/stack/sheet/stack = O - var/amount = round(input("How many sheets do you want to add?") as num)//No decimals - if(!in_range(src, stack) || !user.Adjacent(src)) - return - var/amount_inserted = materials.insert_stack(O,amount) - if(!amount_inserted) - return 1 + else if(user.a_intent != "harm") + user << "You cannot insert this item into the [name]!" else - var/stack_name = stack.name - busy = 1 - use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount_inserted/10))) - user << "You add [amount_inserted] sheets to the [src.name]." - overlays += "protolathe_[stack_name]" - sleep(10) - overlays -= "protolathe_[stack_name]" - busy = 0 - updateUsrDialog() + return 0 \ No newline at end of file diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index db4337bf670..7fb6e811822 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -14,6 +14,7 @@ var/disabled = 0 var/shocked = 0 var/obj/machinery/computer/rdconsole/linked_console + var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer) /obj/machinery/r_n_d/New() ..() @@ -39,9 +40,62 @@ /obj/machinery/r_n_d/attack_hand(mob/user) if(shocked) - shock(user,50) + if(shock(user,50)) + return if(panel_open) wires.interact(user) +/obj/machinery/r_n_d/attackby(obj/item/O, mob/user, params) + if (shocked) + if(shock(user,50)) + return 1 + if (default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), O)) + if(linked_console) + linked_console.linked_lathe = null + linked_console = null + return + if(exchange_parts(user, O)) + return + if(default_deconstruction_crowbar(O)) + return + if(Insert_Item(O, user)) + return 1 + else + return ..() + +//proc used to handle inserting items or reagents into r_n_d machines +/obj/machinery/r_n_d/proc/Insert_Item(obj/item/I, mob/user) + return + +//whether the machine can have an item inserted in its current state. +/obj/machinery/r_n_d/proc/is_insertion_ready(mob/user) + if(panel_open) + user << "You can't load the [src.name] while it's opened!" + return + if (disabled) + return + if (!linked_console) + user << "The [name] must be linked to an R&D console first!" + return + if (busy) + user << "The [src.name] is busy right now." + return + if(stat & BROKEN) + user << "The [src.name] is broken." + return + if(stat & NOPOWER) + user << "The [src.name] has no power." + return + if(loaded_item) + user << "The [src] is already loaded." + return + return 1 + + +//we eject the loaded item when deconstructing the machine +/obj/machinery/r_n_d/deconstruction() + if(loaded_item) + loaded_item.loc = loc + ..() \ No newline at end of file diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index d60c092f25e..9377ac45165 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -124,20 +124,10 @@ env.merge(removed) air_update_turf() -/obj/machinery/r_n_d/server/attackby(obj/item/O, mob/user, params) - if (disabled) - return - if (shocked) - shock(user,50) - if (default_deconstruction_screwdriver(user, "server_o", "server", O)) - return - if(exchange_parts(user, O)) - return - if (panel_open) - if(istype(O, /obj/item/weapon/crowbar)) - griefProtection() - default_deconstruction_crowbar(O) - return 1 +//called when the server is deconstructed. +/obj/machinery/r_n_d/server/deconstruction() + griefProtection() + ..() /obj/machinery/r_n_d/server/attack_hand(mob/user as mob) // I guess only exists to stop ninjas or hell does it even work I dunno. See also ninja gloves. if (disabled) @@ -323,9 +313,8 @@ return /obj/machinery/computer/rdservercontrol/attackby(obj/item/weapon/D, mob/user, params) - ..() + . = ..() src.updateUsrDialog() - return /obj/machinery/computer/rdservercontrol/emag_act(mob/user) if(!emagged) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 764f3d3fa45..1a12c3eb759 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -7,46 +7,31 @@ var/list/authorized = list() -/obj/machinery/computer/emergency_shuttle/attackby(obj/item/weapon/card/W, mob/user, params) - if(stat & (BROKEN|NOPOWER)) - return - if(!istype(W, /obj/item/weapon/card)) - return - if(SSshuttle.emergency.mode != SHUTTLE_DOCKED) - return - if(!user) - return - if(SSshuttle.emergency.timeLeft() < 11) - return - if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (istype(W, /obj/item/device/pda)) - var/obj/item/device/pda/pda = W - W = pda.id - if (!W:access) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " +/obj/machinery/computer/emergency_shuttle/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/ID = I + if(stat & (BROKEN|NOPOWER)) return - - var/list/cardaccess = W:access - if(!istype(cardaccess, /list) || !cardaccess.len) //no access - user << "The access level of [W:registered_name]\'s card is not high enough. " + if(SSshuttle.emergency.mode != SHUTTLE_DOCKED) + return + if(SSshuttle.emergency.timeLeft() < 11) + return + if(!(access_heads in ID.access)) //doesn't have this access + user << "The access level of [ID.registered_name]\'s card is not high enough. " return - - if(!(access_heads in W:access)) //doesn't have this access - user << "The access level of [W:registered_name]\'s card is not high enough. " - return 0 var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort") - if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != W) - return 0 + if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != ID) + return var/seconds = SSshuttle.emergency.timeLeft() if(seconds <= 10) - return 0 + return switch(choice) if("Authorize") - if(!authorized.Find(W:registered_name)) - authorized += W:registered_name + if(!authorized.Find(ID.registered_name)) + authorized += ID.registered_name if(auth_need - authorized.len > 0) message_admins("[key_name_admin(user.client)](?) (FLW) has authorized early shuttle launch ",0,1) log_game("[key_name(user)] has authorized early shuttle launch in ([x],[y],[z])") @@ -58,13 +43,15 @@ SSshuttle.emergency.setTimer(100) if("Repeal") - if(authorized.Remove(W:registered_name)) + if(authorized.Remove(ID.registered_name)) minor_announce("[auth_need - authorized.len] authorizations needed until shuttle is launched early") if("Abort") if(authorized.len) minor_announce("All authorizations to launch the shuttle early have been revoked.") authorized.Cut() + else + return ..() /obj/machinery/computer/emergency_shuttle/emag_act(mob/user) if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED) diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 45d0a39adf9..8e640ed006d 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -40,7 +40,10 @@ if(exchange_parts(user, I)) return - default_deconstruction_crowbar(I) + if(default_deconstruction_crowbar(I)) + return + + return ..() //CARGO TELEPAD// @@ -64,7 +67,7 @@ else if(!anchored) anchored = 1 user << "\The [src] is now secured." - if(istype(W, /obj/item/weapon/screwdriver)) + else if(istype(W, /obj/item/weapon/screwdriver)) if(stage == 0) playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) user << "You unscrew the telepad's tracking beacon." @@ -73,12 +76,20 @@ playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) user << "You screw in the telepad's tracking beacon." stage = 0 - if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) - playsound(src, 'sound/items/Welder.ogg', 50, 1) - user << "You disassemble the telepad." - new /obj/item/stack/sheet/metal(get_turf(src)) - new /obj/item/stack/sheet/glass(get_turf(src)) - qdel(src) + else if(istype(W, /obj/item/weapon/weldingtool) && stage == 1) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0,user)) + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + user << "You start disassembling [src]..." + if(do_after(user,20/WT.toolspeed, target = src)) + if(!WT.isOn()) + return + user << "You disassemble [src]." + new /obj/item/stack/sheet/metal(get_turf(src)) + new /obj/item/stack/sheet/glass(get_turf(src)) + qdel(src) + else + return ..() ///TELEPAD CALLER/// /obj/item/device/telepad_beacon diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index de0b2780af913dd55f4cbdfd458fff27cd83d940..741f770f68641540b296a16d1f8ba187f310646c 100644 GIT binary patch delta 84 zcmV-a0IUDMlmWn$0gxmCZ?Ppe0YKKn{TZC