From 09e0bcf9871a2eea69528a221c9a4b98af388acd Mon Sep 17 00:00:00 2001 From: "rastaf.zero@gmail.com" Date: Mon, 3 Jan 2011 01:26:01 +0000 Subject: [PATCH] Stackable items redo. Many improvements, massive code clean up. Metal and related materials now noticeable more user-friendly. Added new canister color: yellow "CAUTION". Used for newly created from metal canisters. Can be relabeled once. Some typos were fixed. dsay verb now uses fakekey in stealth mode. AI cannot remove the cell from the charger. Added alientalk chat prefix: ":a" by Barhandar. Also added keyboard layout independent russian prefixes. Binary translator done by more convenient may by Barhandar. Is possible now to wash bloody hands in sink. Probably fixed bug causes gibbed revheads be not counted as dead. Some other fixes. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@752 316c924e-a436-60f5-8080-3fe189b3f50e --- .../computer2/buildandrepair.dm | 13 +- code/WorkInProgress/recycling/disposal.dm | 2 +- code/defines/obj.dm | 87 ++++ code/defines/obj/assemblies.dm | 4 +- code/defines/obj/radio.dm | 3 +- code/defines/obj/supplypacks.dm | 4 +- code/defines/obj/weapon.dm | 100 +--- code/game/asteroid/turf.dm | 4 +- code/game/atom_procs.dm | 4 +- code/game/gamemodes/revolution/revolution.dm | 2 +- code/game/gamemodes/sandbox/h_sandbox.dm | 4 +- code/game/machinery/atmoalter/canister.dm | 30 +- code/game/machinery/autolathe.dm | 333 +++++++------ code/game/machinery/bots/floorbot.dm | 45 +- code/game/machinery/cell_charger.dm | 11 +- code/game/machinery/computer/AIcore.dm | 10 +- .../game/machinery/computer/buildandrepair.dm | 20 +- code/game/machinery/microwave.dm | 4 +- code/game/machinery/rechargestation.dm | 2 +- code/game/machinery/robot_fabricator.dm | 6 +- code/game/machinery/shieldgen.dm | 1 - code/game/machinery/singularity.dm | 60 +-- code/game/objects/closets.dm | 2 +- code/game/objects/door_assembly.dm | 11 +- code/game/objects/grille.dm | 4 +- code/game/objects/items/apc_frame.dm | 3 +- code/game/objects/items/robot_parts.dm | 15 +- .../objects/items/weapons/flamethrower.dm | 4 +- code/game/objects/items/weapons/glass.dm | 278 ----------- .../game/objects/items/weapons/metals_rods.dm | 466 ------------------ .../objects/items/weapons/table_rack_parts.dm | 6 +- .../game/objects/items/weapons/tiles_wires.dm | 83 ---- code/game/objects/items/weapons/tools.dm | 26 +- code/game/objects/stacks/glass.dm | 137 +++++ code/game/objects/stacks/metal.dm | 130 +++++ code/game/objects/stacks/stack.dm | 203 ++++++++ code/game/objects/stool.dm | 6 +- code/game/objects/structures.dm | 122 +++-- code/game/objects/window.dm | 22 +- code/game/turf.dm | 80 ++- code/modules/admin/verbs/deadsay.dm | 4 +- code/modules/mob/living/carbon/human/life.dm | 7 +- code/modules/mob/living/say.dm | 11 +- .../living/silicon/hivebot/hive_modules.dm | 4 +- .../mob/living/silicon/robot/robot_modules.dm | 4 +- code/modules/mob/mob.dm | 37 ++ code/modules/power/apc.dm | 22 +- icons/obj/atmos.dmi | Bin 16147 -> 18246 bytes maps/tgstation.1.3.1.dmm | 50 +- maps/tgstation.2.0.0.dmm | 50 +- tgstation.dme | 6 +- 51 files changed, 1138 insertions(+), 1404 deletions(-) delete mode 100644 code/game/objects/items/weapons/glass.dm delete mode 100644 code/game/objects/items/weapons/metals_rods.dm create mode 100644 code/game/objects/stacks/glass.dm create mode 100644 code/game/objects/stacks/metal.dm create mode 100644 code/game/objects/stacks/stack.dm diff --git a/code/WorkInProgress/computer2/buildandrepair.dm b/code/WorkInProgress/computer2/buildandrepair.dm index c722bb5c61c..85790260f62 100644 --- a/code/WorkInProgress/computer2/buildandrepair.dm +++ b/code/WorkInProgress/computer2/buildandrepair.dm @@ -20,7 +20,7 @@ var/list/peripherals = list() var/created_icon_state = "aiupload" -/obj/computer2frame/attackby(obj/item/weapon/P as obj, mob/user as mob) +/obj/computer2frame/attackby(obj/item/P as obj, mob/user as mob) switch(state) if(0) if(istype(P, /obj/item/weapon/wrench)) @@ -33,8 +33,7 @@ playsound(src.loc, 'Welder.ogg', 50, 1) if(do_after(user, 20)) user << "\blue You deconstruct the frame." - var/obj/item/weapon/sheet/metal/A = new /obj/item/weapon/sheet/metal( src.loc ) - A.amount = 5 + new /obj/item/stack/sheet/metal( src.loc, 5 ) del(src) if(1) if(istype(P, /obj/item/weapon/wrench)) @@ -118,12 +117,11 @@ src.hd.loc = src.loc src.hd = null - if(istype(P, /obj/item/weapon/sheet/glass)) + if(istype(P, /obj/item/stack/sheet/glass)) if(P:amount >= 2) playsound(src.loc, 'Deconstruct.ogg', 50, 1) if(do_after(user, 20)) - P:amount -= 2 - if(!P:amount) del(P) + P:use(2) user << "\blue You put in the glass panel." src.state = 4 src.icon_state = "4" @@ -133,8 +131,7 @@ user << "\blue You remove the glass panel." src.state = 3 src.icon_state = "3" - var/obj/item/weapon/sheet/glass/A = new /obj/item/weapon/sheet/glass( src.loc ) - A.amount = 2 + new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'Screwdriver.ogg', 50, 1) user << "\blue You connect the monitor." diff --git a/code/WorkInProgress/recycling/disposal.dm b/code/WorkInProgress/recycling/disposal.dm index 7563f1d3bdf..00876122760 100644 --- a/code/WorkInProgress/recycling/disposal.dm +++ b/code/WorkInProgress/recycling/disposal.dm @@ -577,7 +577,7 @@ F.burnt = 1 F.intact = 0 F.levelupdate() - new /obj/item/weapon/tile(H) // add to holder so it will be thrown with other stuff + new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff F.icon_state = "Floor[F.burnt ? "1" : ""]" if(direction) // direction is specified diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 9ba386b94db..8292d17bab8 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -816,3 +816,90 @@ obj/item/brain density = 1 opacity = 1 anchored = 1 + +/obj/item/stack + var/singular_name + var/amount = 1.0 + var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount + +/obj/item/stack/rods + name = "metal rods" + singular_name = "metal rod" + icon_state = "rods" + flags = FPRINT | TABLEPASS| CONDUCT + w_class = 3.0 + force = 9.0 + throwforce = 15.0 + throw_speed = 5 + throw_range = 20 + m_amt = 1875 + max_amount = 60 + +/obj/item/stack/sheet + name = "sheet" +// var/const/length = 2.5 //2.5*1.5*0.01*100000 == 3750 == m_amt +// var/const/width = 1.5 +// var/const/height = 0.01 + flags = FPRINT | TABLEPASS + w_class = 3.0 + max_amount = 50 + +/obj/item/stack/sheet/glass + name = "glass" + singular_name = "glass sheet" + icon_state = "sheet-glass" + force = 5.0 + g_amt = 3750 + throwforce = 5 + throw_speed = 3 + throw_range = 3 + +/obj/item/stack/sheet/rglass + name = "reinforced glass" + singular_name = "reinforced glass sheet" + icon_state = "sheet-rglass" + force = 6.0 + g_amt = 3750 + m_amt = 1875 + throwforce = 5 + throw_speed = 3 + throw_range = 3 + +/obj/item/stack/sheet/metal + name = "metal" + singular_name = "metal sheet" + desc = "A heavy sheet of metal." + icon_state = "sheet-metal" + force = 5.0 + m_amt = 3750 + throwforce = 14.0 + throw_speed = 1 + throw_range = 4 + flags = FPRINT | TABLEPASS | CONDUCT + +/obj/item/stack/sheet/r_metal + name = "reinforced metal" + singular_name = "reinforced metal sheet" + desc = "A very heavy sheet of metal." + icon_state = "sheet-r_metal" + item_state = "sheet-metal" + force = 5.0 + m_amt = 7500 + throwforce = 15.0 + throw_speed = 1 + throw_range = 4 + flags = FPRINT | TABLEPASS | CONDUCT + +/obj/item/stack/tile + name = "steel floor tile" + singular_name = "steel floor tile" + desc = "Those could work as a pretty decent throwing weapon" + icon_state = "tile" + w_class = 3.0 + force = 6.0 + m_amt = 937.5 + throwforce = 15.0 + throw_speed = 5 + throw_range = 20 + flags = FPRINT | TABLEPASS | CONDUCT + max_amount = 10 \ No newline at end of file diff --git a/code/defines/obj/assemblies.dm b/code/defines/obj/assemblies.dm index 4f7967c3a7c..52fcee23789 100644 --- a/code/defines/obj/assemblies.dm +++ b/code/defines/obj/assemblies.dm @@ -127,7 +127,7 @@ icon_state = "welder-rods" item_state = "welder" var/obj/item/weapon/weldingtool/part1 = null - var/obj/item/weapon/rods/part2 = null + var/obj/item/stack/rods/part2 = null status = null flags = FPRINT | TABLEPASS| CONDUCT force = 3.0 @@ -142,7 +142,7 @@ icon_state = "welder-rods-igniter" item_state = "welder" var/obj/item/weapon/weldingtool/part1 = null - var/obj/item/weapon/rods/part2 = null + var/obj/item/stack/rods/part2 = null var/obj/item/device/igniter/part3 = null status = null flags = FPRINT | TABLEPASS| CONDUCT diff --git a/code/defines/obj/radio.dm b/code/defines/obj/radio.dm index 00211b92873..a469a6420c9 100644 --- a/code/defines/obj/radio.dm +++ b/code/defines/obj/radio.dm @@ -52,9 +52,10 @@ icon_state = "headset" item_state = "headset" var/protective_temperature = 0 + var/bintran = 0 /obj/item/device/radio/headset/traitor -// No variables, as everything else it does is handled in human's life.dm + bintran = 1 /obj/item/device/radio/headset/headset_sec // -- TLE name = "Security Radio Headset" diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm index a7c066ea4dc..4f196cb5f78 100644 --- a/code/defines/obj/supplypacks.dm +++ b/code/defines/obj/supplypacks.dm @@ -27,7 +27,7 @@ /datum/supply_packs/metal50 name = "50 Metal Sheets" - contains = list("/obj/item/weapon/sheet/metal") + contains = list("/obj/item/stack/sheet/metal") amount = 50 cost = 15 containertype = "/obj/crate" @@ -35,7 +35,7 @@ /datum/supply_packs/glass50 name = "50 Glass Sheets" - contains = list("/obj/item/weapon/sheet/glass") + contains = list("/obj/item/stack/sheet/glass") amount = 50 cost = 15 containertype = "/obj/crate" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index cac781c5040..6ecad7eeed7 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -135,9 +135,10 @@ w_class = 2.0 flags = FPRINT | TABLEPASS| CONDUCT throwforce = 5 - w_class = 2.0 throw_speed = 4 throw_range = 20 + m_amt = 30 + g_amt = 20 /obj/item/weapon/axe @@ -922,7 +923,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov w_class = 1.0 throw_speed = 7 throw_range = 15 - m_amt = 60 + m_amt = 10 /obj/item/weapon/pen/sleepypen desc = "It's a normal black ink pen with a sharp point." @@ -933,19 +934,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov icon = 'items.dmi' icon_state = "rack_parts" flags = FPRINT | TABLEPASS| CONDUCT - -/obj/item/weapon/rods - name = "rods" - icon = 'items.dmi' - icon_state = "rods" - var/amount = 1.0 - flags = FPRINT | TABLEPASS| CONDUCT - w_class = 3.0 - force = 9.0 - throwforce = 15.0 - throw_speed = 5 - throw_range = 20 - m_amt = 1875 + m_amt = 3750 /obj/item/weapon/rubber_chicken name = "Rubber Chicken" @@ -975,68 +964,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov force = 5.0 throwforce = 15.0 item_state = "shard-glass" - -/obj/item/weapon/sheet - name = "sheet" - icon = 'items.dmi' - var/amount = 1.0 - var/length = 2.5 - var/width = 1.5 - var/height = 0.01 - flags = FPRINT | TABLEPASS - throwforce = 5.0 - throw_speed = 1 - throw_range = 4 - w_class = 4.0 - -/obj/item/weapon/sheet/glass - name = "glass" - icon_state = "sheet-glass" - force = 5.0 g_amt = 3750 - throwforce = 5 - w_class = 3.0 - throw_speed = 3 - throw_range = 3 - -/obj/item/weapon/sheet/rglass - name = "reinforced glass" - icon_state = "sheet-rglass" - item_state = "sheet-rglass" - force = 6.0 - g_amt = 3750 - m_amt = 1875 - throwforce = 5 - w_class = 3.0 - throw_speed = 3 - throw_range = 3 - -/obj/item/weapon/sheet/metal - name = "metal" - icon_state = "sheet-metal" - desc = "A heavy sheet of metal." - throwforce = 14.0 - m_amt = 3750 - throwforce = 10.0 - throw_speed = 1 - throw_range = 4 - w_class = 3.0 - flags = FPRINT | TABLEPASS | CONDUCT - -/obj/item/weapon/sheet/r_metal - name = "reinforced metal" - desc = "A very heavy sheet of metal." - icon_state = "sheet-r_metal" - force = 5.0 - throwforce = 14.0 - item_state = "sheet-metal" - m_amt = 7500 - throwforce = 15.0 - throw_speed = 1 - throw_range = 4 - w_class = 3.0 - flags = FPRINT | TABLEPASS | CONDUCT - /obj/item/weapon/syndicate_uplink name = "station bounced radio" @@ -1101,12 +1029,14 @@ Total SMES charging rate should not exceed total power generation rate, or an ov name = "table parts" icon = 'items.dmi' icon_state = "table_parts" + m_amt = 3750 flags = FPRINT | TABLEPASS| CONDUCT /obj/item/weapon/table_parts/reinforced name = "table parts" icon = 'items.dmi' icon_state = "reinf_tableparts" + m_amt = 7500 flags = FPRINT | TABLEPASS| CONDUCT /obj/item/weapon/tank @@ -1155,19 +1085,6 @@ Total SMES charging rate should not exceed total power generation rate, or an ov w_class = 2.5 force = 4.0 -/obj/item/weapon/tile - name = "steel floor tile" - desc = "... Those could work as a pretty decent throwing weapon" - icon = 'items.dmi' - icon_state = "tile" - var/amount = 1.0 - w_class = 3.0 - throw_speed = 5 - throw_range = 20 - force = 6.0 - throwforce = 15.0 - - /obj/item/weapon/teleportation_scroll name = "Teleportation Scroll" icon = 'items.dmi' @@ -1183,7 +1100,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov name = "weldingtool" icon = 'items.dmi' icon_state = "welder" - var/welding = 0.0 + var/welding = 0 var/status = 0 //flamethrower construction :shobon: flags = FPRINT | TABLEPASS| CONDUCT force = 3.0 @@ -1191,7 +1108,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov throw_speed = 1 throw_range = 5 w_class = 2.0 - m_amt = 30 + m_amt = 70 g_amt = 30 /obj/item/weapon/wire @@ -1247,6 +1164,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov var/charge = 0 // note %age conveted to actual charge in New var/maxcharge = 1000 m_amt = 700 + g_amt = 50 var/rigged = 0 // true if rigged to explode /obj/item/weapon/cell/robotcrate diff --git a/code/game/asteroid/turf.dm b/code/game/asteroid/turf.dm index 3aae72bf291..ddbc8462013 100644 --- a/code/game/asteroid/turf.dm +++ b/code/game/asteroid/turf.dm @@ -13,13 +13,13 @@ /turf/simulated/wall/asteroid/iron icon_state = "asteroid_i" - contains = /obj/item/weapon/sheet/metal + contains = /obj/item/stack/sheet/metal max_amount = 3 min_amount = 1 /turf/simulated/wall/asteroid/silicon icon_state = "asteroid_i" - contains = /obj/item/weapon/sheet/glass + contains = /obj/item/stack/sheet/glass max_amount = 3 min_amount = 1 diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm index efb9afedda3..d3209d848cc 100644 --- a/code/game/atom_procs.dm +++ b/code/game/atom_procs.dm @@ -156,8 +156,8 @@ if (istype (src, /mob/living/carbon)) var/obj/item/source2 = src source2.blood_DNA = null - var/icon/I = new /icon(source2.icon_old, source2.icon_state) - source2.icon = I + //var/icon/I = new /icon(source2.icon_old, source2.icon_state) //doesnt have icon_old + //source2.icon = I if (istype (src, /obj/item)) var/obj/item/source2 = src source2.blood_DNA = null diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index de6440089f7..dc21e2d730a 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -398,7 +398,7 @@ ///////////////////////////// /datum/game_mode/revolution/proc/check_heads_victory() for(var/datum/mind/rev_mind in head_revolutionaries) - if(rev_mind.current.stat != 2) + if(rev_mind && rev_mind.current && rev_mind.current.stat != 2) return 0 return 1 diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 83a0e3d0f7b..94b9166e67a 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -88,11 +88,11 @@ datum/hSB P.back.layer = 20 P.internal = P.back if("hsbmetal") - var/obj/item/weapon/sheet/hsb = new/obj/item/weapon/sheet/metal + var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/metal hsb.amount = 50 hsb.loc = usr.loc if("hsbglass") - var/obj/item/weapon/sheet/hsb = new/obj/item/weapon/sheet/glass + var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/glass hsb.amount = 50 hsb.loc = usr.loc if("hsbairlock") diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index d7c4d8ac090..f82205af0c4 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -1,6 +1,7 @@ /obj/machinery/portable_atmospherics/canister name = "canister" icon = 'atmos.dmi' + icon_state = "yellow" density = 1 var/health = 100.0 flags = FPRINT | CONDUCT @@ -8,7 +9,8 @@ var/valve_open = 0 var/release_pressure = ONE_ATMOSPHERE - var/color = "blue" + var/color = "yellow" + var/labeled = 0 var/filled = 0.5 pressure_resistance = 7*ONE_ATMOSPHERE var/temperature_resistance = 1000 + T0C @@ -18,10 +20,12 @@ name = "Canister: \[N2O\]" icon_state = "redws" color = "redws" + labeled = 1 /obj/machinery/portable_atmospherics/canister/nitrogen name = "Canister: \[N2\]" icon_state = "red" color = "red" + labeled = 1 /obj/machinery/portable_atmospherics/canister/oxygen name = "Canister: \[O2\]" icon_state = "blue" @@ -29,14 +33,17 @@ name = "Canister \[Toxin (Bio)\]" icon_state = "orange" color = "orange" + labeled = 1 /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "Canister \[CO2\]" icon_state = "black" color = "black" + labeled = 1 /obj/machinery/portable_atmospherics/canister/air name = "Canister \[Air\]" icon_state = "grey" color = "grey" + labeled = 1 /obj/machinery/portable_atmospherics/canister/update_icon() src.overlays = 0 @@ -158,7 +165,7 @@ holding_text = {"
Tank Pressure: [holding.air_contents.return_pressure()] KPa
Remove Tank
"} - var/output_text = {"[name]
+ var/output_text = {"[name][!labeled?" relabel":""]
Pressure: [air_contents.return_pressure()] KPa
Port Status: [(connected_port)?("Connected"):("Disconnected")] [holding_text] @@ -195,6 +202,23 @@ Release Pressure: - - max_m_amount) + user << "\red The autolathe is full. Please remove metal from the autolathe in order to insert more." + return 1 + if (src.g_amount + O.g_amt > max_g_amount) + user << "\red The autolathe is full. Please remove glass from the autolathe in order to insert more." + return 1 + if (O.m_amt == 0 && O.g_amt == 0) + user << "\red This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials." + return 1 /* if (istype(O, /obj/item/weapon/grab) && src.hacked) var/obj/item/weapon/grab/G = O @@ -18,79 +39,95 @@ m_amount += 50000 return */ - if (istype(O, /obj/item/weapon/sheet/metal)) - if (src.m_amount < 150000.0) - spawn(16) { - if (O) - flick("autolathe_c",src) - src.m_amount += O:height * O:width * O:length * 100000.0 - O:amount-- - if (O:amount < 1) - del(O) - } - else - user << "The autolathe is full. Please remove metal from the autolathe in order to insert more." - else if (istype(O, /obj/item/weapon/sheet/glass) || istype(O, /obj/item/weapon/sheet/rglass)) - if (src.g_amount < 75000.0) - spawn(16) { - flick("autolathe_c",src) - src.g_amount += O:height * O:width * O:length * 100000.0 - O:amount-- - if (O:amount < 1) - del(O) - } - else - user << "The autolathe is full. Please remove glass from the autolathe in order to insert more." - else if (O.g_amt || O.m_amt) - spawn(16) { - flick("autolathe_c",src) - if(O) - if(O.g_amt) // Added null checks to avoid runtime errors when an item doesn't have an expected variable -- TLE - src.g_amount += O.g_amt - if(O.m_amt) - src.m_amount += O.m_amt - del O - } + var/amount = 1 + var/obj/item/stack/stack + var/m_amt = O.m_amt + var/g_amt = O.g_amt + if (istype(O, /obj/item/stack)) + stack = O + amount = stack.amount + if (m_amt) + amount = min(amount, round((max_m_amount-src.m_amount)/m_amt)) + if (g_amt) + amount = min(amount, round((max_g_amount-src.g_amount)/g_amt)) + stack.use(amount) else - user << "This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials." + usr.before_take_item(O) + O.loc = src + icon_state = "autolathe1" + flick("autolathe_c",src) + busy = 1 + use_power(max(1000, (m_amt+g_amt)*amount/10)) + spawn(16) + icon_state = "autolathe" + flick("autolathe_o",src) + src.m_amount += m_amt * amount + src.g_amount += g_amt * amount + if (O && O.loc == src) + del(O) + busy = 0 + src.updateUsrDialog() -/obj/machinery/autolathe/attack_paw(user as mob) +/obj/machinery/autolathe/attack_paw(mob/user as mob) return src.attack_hand(user) -/obj/machinery/autolathe/attack_hand(user as mob) - var/dat +/obj/machinery/autolathe/attack_hand(mob/user as mob) + user.machine = src + interact(user) + +/obj/machinery/autolathe/proc/wires_win(mob/user as mob) + var/dat as text + dat += "Autolathe Wires:
" + for(var/wire in src.wires) + dat += text("[wire] Wire:
[src.wires[wire] ? "Mend" : "Cut"] Pulse
") + + dat += text("The red light is [src.disabled ? "off" : "on"].
") + dat += text("The green light is [src.shocked ? "off" : "on"].
") + dat += text("The blue light is [src.hacked ? "off" : "on"].
") + user << browse("Autolathe Hacking[dat]","window=autolathe_hack") + onclose(user, "autolathe_hack") + +/obj/machinery/autolathe/proc/regular_win(mob/user as mob) + var/dat as text + dat = text("Metal Amount: [src.m_amount] cm3 (MAX: [max_m_amount])
\nGlass Amount: [src.g_amount] cm3 (MAX: [max_g_amount])
") + var/list/objs = list() + objs += src.L + if (src.hacked) + objs += src.LL + for(var/obj/t in objs) + var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g)" + if (m_amount" + continue + dat += "[title]" + if (istype(t, /obj/item/stack)) + var/obj/item/stack/S = t + var/max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY) + if (max_multiplier>1) + dat += " |" + if (max_multiplier>10) + dat += " x[10]" + if (max_multiplier>25) + dat += " x[25]" + if (max_multiplier>1) + dat += " x[max_multiplier]" + dat += "
" + user << browse("Autolathe Control Panel[dat]", "window=autolathe_regular") + onclose(user, "autolathe_regular") + +/obj/machinery/autolathe/proc/interact(mob/user as mob) if(..()) return if (src.shocked) src.shock(user) if (src.opened) - dat += "Autolathe Wires:
" - var/wire - for(wire in src.wires) - dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
") - - dat += text("The red light is [src.disabled ? "off" : "on"].
") - dat += text("The green light is [src.shocked ? "off" : "on"].
") - dat += text("The blue light is [src.hacked ? "off" : "on"].
") - user << browse("Autolathe Hacking[dat]","window=autolathe_hack") - onclose(user, "autolathe_hack") + wires_win(user) return if (src.disabled) - user << "You press the button, but nothing happens." + user << "\red You press the button, but nothing happens." return - if (src.temp) - dat = text("[]

Clear Screen", src.temp, src) - else - dat = text("Metal Amount: [src.m_amount] cm3 (MAX: 150,000)
\nGlass Amount: [src.g_amount] cm3 (MAX: 75,000)
") - var/list/objs = list() - objs += src.L - if (src.hacked) - objs += src.LL - for(var/obj/t in objs) - dat += text("[t.name] ([t.m_amt] cc metal/[t.g_amt] cc glass)
") - user << browse("Autolathe Control Panel[dat]", "window=autolathe_regular") - onclose(user, "autolathe_regular") + regular_win(user) return /obj/machinery/autolathe/Topic(href, href_list) @@ -98,99 +135,117 @@ return usr.machine = src src.add_fingerprint(usr) - if(href_list["make"]) - var/obj/template = locate(href_list["make"]) - if(src.m_amount >= template.m_amt && src.g_amount >= template.g_amt) - spawn(16) + if (!busy) + if(href_list["make"]) + var/turf/T = get_step(src.loc, get_dir(src,usr)) + var/obj/template = locate(href_list["make"]) + var/multiplier = text2num(href_list["multiplier"]) + if (!multiplier) multiplier = 1 + var/power = max(2000, (template.m_amt+template.g_amt)*multiplier/5) + if(src.m_amount >= template.m_amt*multiplier && src.g_amount >= template.g_amt*multiplier) + busy = 1 + use_power(power) + icon_state = "autolathe1" flick("autolathe_c",src) spawn(16) - flick("autolathe_o",src) + use_power(power) spawn(16) - src.m_amount -= template.m_amt - src.g_amount -= template.g_amt - if(src.m_amount < 0) - src.m_amount = 0 - if(src.g_amount < 0) - src.g_amount = 0 - new template.type(usr.loc) - if(href_list["act"]) - if(href_list["act"] == "pulse") - if (!istype(usr.equipped(), /obj/item/device/multitool)) - usr << "You need a multitool!" - else - if(src.wires[href_list["wire"]]) - usr << "You can't pulse a cut wire." + icon_state = "autolathe" + flick("autolathe_o",src) + use_power(power) + spawn(16) + src.m_amount -= template.m_amt*multiplier + src.g_amount -= template.g_amt*multiplier + if(src.m_amount < 0) + src.m_amount = 0 + if(src.g_amount < 0) + src.g_amount = 0 + var/obj/new_item = new template.type(T) + if (multiplier>1) + var/obj/item/stack/S = new_item + S.amount = multiplier + busy = 0 + src.updateUsrDialog() + if(href_list["act"]) + if(href_list["act"] == "pulse") + if (!istype(usr.equipped(), /obj/item/device/multitool)) + usr << "You need a multitool!" + else + if(src.wires[href_list["wire"]]) + usr << "You can't pulse a cut wire." + else + if(src.hack_wire == href_list["wire"]) + src.hacked = !src.hacked + spawn(100) src.hacked = !src.hacked + if(src.disable_wire == href_list["wire"]) + src.disabled = !src.disabled + src.shock(usr) + spawn(100) src.disabled = !src.disabled + if(src.shock_wire == href_list["wire"]) + src.shocked = !src.shocked + src.shock(usr) + spawn(100) src.shocked = !src.shocked + if(href_list["act"] == "wire") + if (!istype(usr.equipped(), /obj/item/weapon/wirecutters)) + usr << "You need wirecutters!" else if(src.hack_wire == href_list["wire"]) src.hacked = !src.hacked - spawn(100) src.hacked = !src.hacked if(src.disable_wire == href_list["wire"]) src.disabled = !src.disabled src.shock(usr) - spawn(100) src.disabled = !src.disabled if(src.shock_wire == href_list["wire"]) src.shocked = !src.shocked src.shock(usr) - spawn(100) src.shocked = !src.shocked - if(href_list["act"] == "wire") - if (!istype(usr.equipped(), /obj/item/weapon/wirecutters)) - usr << "You need wirecutters!" - else - if(src.hack_wire == href_list["wire"]) - src.hacked = !src.hacked - if(src.disable_wire == href_list["wire"]) - src.disabled = !src.disabled - src.shock(usr) - if(src.shock_wire == href_list["wire"]) - src.shocked = !src.shocked - src.shock(usr) - - if (href_list["temp"]) - src.temp = null - - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) + else + usr << "\red The autolathe is busy. Please wait for completion of previous operation." src.updateUsrDialog() return +var/global/list/autolathe_recipes = list( \ + /* screwdriver removed*/ \ + new /obj/item/weapon/wirecutters(), \ + new /obj/item/weapon/wrench(), \ + new /obj/item/weapon/crowbar(), \ + new /obj/item/weapon/weldingtool(), \ + new /obj/item/clothing/head/helmet/welding(), \ + new /obj/item/device/multitool(), \ + new /obj/item/weapon/airlock_electronics(), \ + new /obj/item/device/flashlight(), \ + new /obj/item/weapon/extinguisher(), \ + new /obj/item/stack/sheet/metal(), \ + new /obj/item/stack/sheet/glass(), \ + new /obj/item/stack/sheet/r_metal(), \ + new /obj/item/stack/sheet/rglass(), \ + new /obj/item/stack/rods(), \ + new /obj/item/weapon/rcd_ammo(), \ + new /obj/item/weapon/scalpel(), \ + new /obj/item/weapon/circular_saw(), \ + new /obj/item/device/t_scanner(), \ + new /obj/item/weapon/reagent_containers/glass/bucket(), \ + new /obj/item/weapon/ammo/shell/blank(), \ + new /obj/item/device/taperecorder(), \ + ) + +var/global/list/autolathe_recipes_hidden = list( \ + new /obj/item/weapon/flamethrower(), \ + new /obj/item/device/igniter(), \ + new /obj/item/device/timer(), \ + new /obj/item/weapon/rcd(), \ + new /obj/item/device/infra(), \ + new /obj/item/device/infra_sensor(), \ + new /obj/item/weapon/handcuffs(), \ + new /obj/item/weapon/ammo/a357(), \ + new /obj/item/weapon/ammo/shell/gauge(), \ + new /obj/item/weapon/ammo/a38(), \ + new /obj/item/weapon/ammo/shell/beanbag(), \ + new /obj/item/weapon/ammo/shell/dart(), \ + /* new /obj/item/weapon/shield/riot(), */ \ + ) /obj/machinery/autolathe/New() ..() - // screwdriver removed - src.L += new /obj/item/weapon/wirecutters(src) - src.L += new /obj/item/weapon/wrench(src) - src.L += new /obj/item/weapon/crowbar(src) - src.L += new /obj/item/weapon/weldingtool(src) - src.L += new /obj/item/clothing/head/helmet/welding(src) - src.L += new /obj/item/device/multitool(src) - src.L += new /obj/item/weapon/airlock_electronics(src) - src.L += new /obj/item/device/flashlight(src) - src.L += new /obj/item/weapon/extinguisher(src) - src.L += new /obj/item/weapon/sheet/metal(src) - src.L += new /obj/item/weapon/sheet/glass(src) - src.L += new /obj/item/weapon/sheet/r_metal(src) - src.L += new /obj/item/weapon/sheet/rglass(src) - src.L += new /obj/item/weapon/rods(src) - src.L += new /obj/item/weapon/rcd_ammo(src) - src.L += new /obj/item/weapon/scalpel(src) - src.L += new /obj/item/weapon/circular_saw(src) - src.L += new /obj/item/device/t_scanner(src) - src.L += new /obj/item/weapon/reagent_containers/glass/bucket(src) - src.L += new /obj/item/weapon/ammo/shell/blank(src) - src.L += new /obj/item/device/taperecorder(src) - src.LL += new /obj/item/weapon/flamethrower(src) - src.LL += new /obj/item/device/igniter(src) - src.LL += new /obj/item/device/timer(src) - src.LL += new /obj/item/weapon/rcd(src) - src.LL += new /obj/item/device/infra(src) - src.LL += new /obj/item/device/infra_sensor(src) - src.LL += new /obj/item/weapon/handcuffs(src) - src.LL += new /obj/item/weapon/ammo/a357(src) - src.LL += new /obj/item/weapon/ammo/shell/gauge(src) - src.LL += new /obj/item/weapon/ammo/a38(src) - src.LL += new /obj/item/weapon/ammo/shell/beanbag(src) - src.LL += new /obj/item/weapon/ammo/shell/dart(src) -// src.LL += new /obj/item/weapon/shield/riot(src) + src.L = autolathe_recipes + src.LL = autolathe_recipes_hidden src.wires["Light Red"] = 0 src.wires["Dark Red"] = 0 src.wires["Blue"] = 0 diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index ea63dd196ed..e67805f0f6e 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -74,21 +74,14 @@ return -/obj/machinery/bot/floorbot/attackby(var/obj/item/weapon/W , mob/user as mob) - if(istype(W, /obj/item/weapon/tile)) - var/obj/item/weapon/tile/T = W +/obj/machinery/bot/floorbot/attackby(var/obj/item/W , mob/user as mob) + if(istype(W, /obj/item/stack/tile)) + var/obj/item/stack/tile/T = W if(src.amount >= 50) return - var/loaded = 0 - if(src.amount + T.amount > 50) - var/i = 50 - src.amount - src.amount += i - T.amount -= i - loaded = i - else - src.amount += T.amount - loaded = T.amount - del(T) + var/loaded = min(50-src.amount, T.amount) + T.use(loaded) + src.amount += loaded user << "\red You load [loaded] tiles into the floorbot. He now contains [src.amount] tiles!" src.updateicon() if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) @@ -162,7 +155,7 @@ floorbottargets += bot.target if(src.amount <= 0 && ((src.target == null) || !src.target)) if(src.eattiles) - for(var/obj/item/weapon/tile/T in view(7, src)) + for(var/obj/item/stack/tile/T in view(7, src)) if(T != src.oldtarget && !(target in floorbottargets)) src.oldtarget = T src.target = T @@ -170,7 +163,7 @@ if(src.target == null || !src.target) if(src.maketiles) if(src.target == null || !src.target) - for(var/obj/item/weapon/sheet/metal/M in view(7, src)) + for(var/obj/item/stack/sheet/metal/M in view(7, src)) if(!(M in floorbottargets) && M != src.oldtarget && M.amount == 1 && !(istype(M.loc, /turf/simulated/wall))) src.oldtarget = M src.target = M @@ -208,7 +201,7 @@ src.target = F break if((!src.target || src.target == null) && src.eattiles) - for(var/obj/item/weapon/tile/T in view(7, src)) + for(var/obj/item/stack/tile/T in view(7, src)) if(!(T in floorbottargets) && T != src.oldtarget) src.oldtarget = T src.target = T @@ -238,9 +231,9 @@ src.path = new() if(src.loc == src.target || src.loc == src.target.loc) - if(istype(src.target, /obj/item/weapon/tile)) + if(istype(src.target, /obj/item/stack/tile)) src.eattile(src.target) - else if(istype(src.target, /obj/item/weapon/sheet/metal)) + else if(istype(src.target, /obj/item/stack/sheet/metal)) src.maketile(src.target) else if(istype(src.target, /turf/)) repair(src.target) @@ -263,7 +256,7 @@ if(istype(target, /turf/space/)) for(var/mob/O in viewers(src, null)) O.show_message(text("\red [src] begins to repair the hole"), 1) - var/obj/item/weapon/tile/T = new /obj/item/weapon/tile + var/obj/item/stack/tile/T = new /obj/item/stack/tile src.repairing = 1 spawn(50) T.build(src.loc) @@ -284,8 +277,8 @@ src.anchored = 0 src.target = null -/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/weapon/tile/T) - if(!istype(T, /obj/item/weapon/tile)) +/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/T) + if(!istype(T, /obj/item/stack/tile)) return for(var/mob/O in viewers(src, null)) O.show_message(text("\red [src] begins to collect tiles."), 1) @@ -306,8 +299,8 @@ src.target = null src.repairing = 0 -/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/weapon/sheet/metal/M) - if(!istype(M, /obj/item/weapon/sheet/metal)) +/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/stack/sheet/metal/M) + if(!istype(M, /obj/item/stack/sheet/metal)) return if(M.amount > 1) return @@ -319,7 +312,7 @@ src.target = null src.repairing = 0 return - var/obj/item/weapon/tile/T = new /obj/item/weapon/tile + var/obj/item/stack/tile/T = new /obj/item/stack/tile T.amount = 4 T.loc = M.loc del(M) @@ -334,8 +327,8 @@ -/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/weapon/tile/T, mob/user as mob) - if(!istype(T, /obj/item/weapon/tile)) +/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/T, mob/user as mob) + if(!istype(T, /obj/item/stack/tile)) ..() return if(src.contents.len >= 1) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 921b9c3ec7a..ecd07debf4e 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -38,13 +38,7 @@ return if(charging) - charging.loc = usr - charging.layer = 20 - if (user.hand ) - user.l_hand = charging - else - user.r_hand = charging - + usr.put_in_hand(charging) charging.add_fingerprint(user) charging.updateicon() @@ -53,6 +47,9 @@ chargelevel = -1 updateicon() +/obj/machinery/cell_charger/attack_ai(mob/user) + return + /obj/machinery/cell_charger/process() //world << "ccpt [charging] [stat]" if(!charging || (stat & (BROKEN|NOPOWER)) ) diff --git a/code/game/machinery/computer/AIcore.dm b/code/game/machinery/computer/AIcore.dm index 1351175728b..950b46c9226 100644 --- a/code/game/machinery/computer/AIcore.dm +++ b/code/game/machinery/computer/AIcore.dm @@ -10,7 +10,7 @@ var/obj/item/brain/brain = null -/obj/AIcore/attackby(obj/item/weapon/P as obj, mob/user as mob) +/obj/AIcore/attackby(obj/item/P as obj, mob/user as mob) switch(state) if(0) if(istype(P, /obj/item/weapon/wrench)) @@ -23,8 +23,7 @@ playsound(src.loc, 'Welder.ogg', 50, 1) if(do_after(user, 20)) user << "\blue You deconstruct the frame." - var/obj/item/weapon/sheet/r_metal/A = new /obj/item/weapon/sheet/r_metal( src.loc ) - A.amount = 4 + new /obj/item/stack/sheet/r_metal( src.loc, 4) del(src) if(1) if(istype(P, /obj/item/weapon/wrench)) @@ -79,7 +78,7 @@ var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc ) A.amount = 5 - if(istype(P, /obj/item/weapon/sheet/rglass)) + if(istype(P, /obj/item/stack/sheet/rglass)) if(P:amount >= 2) playsound(src.loc, 'Deconstruct.ogg', 50, 1) if(do_after(user, 20)) @@ -129,8 +128,7 @@ src.icon_state = "3b" else src.icon_state = "3" - var/obj/item/weapon/sheet/rglass/A = new /obj/item/weapon/sheet/rglass( src.loc ) - A.amount = 2 + new /obj/item/stack/sheet/rglass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'Screwdriver.ogg', 50, 1) user << "\blue You connect the monitor." diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index a1ad3975be5..b95d71d5977 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -105,7 +105,7 @@ -/obj/computerframe/attackby(obj/item/weapon/P as obj, mob/user as mob) +/obj/computerframe/attackby(obj/item/P as obj, mob/user as mob) switch(state) if(0) if(istype(P, /obj/item/weapon/wrench)) @@ -118,8 +118,7 @@ playsound(src.loc, 'Welder.ogg', 50, 1) if(do_after(user, 20)) user << "\blue You deconstruct the frame." - var/obj/item/weapon/sheet/metal/A = new /obj/item/weapon/sheet/metal( src.loc ) - A.amount = 5 + new /obj/item/stack/sheet/metal( src.loc, 5 ) del(src) if(1) if(istype(P, /obj/item/weapon/wrench)) @@ -171,24 +170,21 @@ var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc ) A.amount = 5 - if(istype(P, /obj/item/weapon/sheet/glass)) + if(istype(P, /obj/item/stack/sheet/glass)) if(P:amount >= 2) playsound(src.loc, 'Deconstruct.ogg', 50, 1) if(do_after(user, 20)) - if(P) - P:amount -= 2 - if(!P:amount) del(P) - user << "\blue You put in the glass panel." - src.state = 4 - src.icon_state = "4" + P:use(2) + user << "\blue You put in the glass panel." + src.state = 4 + src.icon_state = "4" if(4) if(istype(P, /obj/item/weapon/crowbar)) playsound(src.loc, 'Crowbar.ogg', 50, 1) user << "\blue You remove the glass panel." src.state = 3 src.icon_state = "3" - var/obj/item/weapon/sheet/glass/A = new /obj/item/weapon/sheet/glass( src.loc ) - A.amount = 2 + new /obj/item/stack/sheet/glass( src.loc, 2 ) if(istype(P, /obj/item/weapon/screwdriver)) playsound(src.loc, 'Screwdriver.ogg', 50, 1) user << "\blue You connect the monitor." diff --git a/code/game/machinery/microwave.dm b/code/game/machinery/microwave.dm index 48704c6bd29..ea98faceb6b 100644 --- a/code/game/machinery/microwave.dm +++ b/code/game/machinery/microwave.dm @@ -172,12 +172,12 @@ /datum/recipe/humankabob humanmeat_amount = 2 - extra_item = /obj/item/weapon/rods + extra_item = /obj/item/stack/rods creates = "/obj/item/weapon/reagent_containers/food/snacks/humankabob" /datum/recipe/monkeykabob monkeymeat_amount = 2 - extra_item = /obj/item/weapon/rods + extra_item = /obj/item/stack/rods creates = "/obj/item/weapon/reagent_containers/food/snacks/monkeykabob" /datum/recipe/tofubread diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f29eef676bd..4f7d511e41e 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -92,7 +92,7 @@ if(istype(O,/obj/item/weapon/rcd)) if(O:matter < 30) O:matter += 1 - if(istype(O,/obj/item/weapon/sheet/metal) || istype(O,/obj/item/weapon/sheet/rglass) || istype(O,/obj/item/weapon/cable_coil)) + if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/weapon/cable_coil)) if(O:amount < 50) O:amount += 1 // Security diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 6b9f7c36a27..7f13c07d54e 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -8,8 +8,8 @@ var/operating = 0 var/obj/item/robot_parts/being_built = null -/obj/machinery/robotic_fabricator/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob) - if (istype(O, /obj/item/weapon/sheet/metal)) +/obj/machinery/robotic_fabricator/attackby(var/obj/item/O as obj, var/mob/user as mob) + if (istype(O, /obj/item/stack/sheet/metal)) if (src.metal_amount < 150000.0) var/count = 0 spawn(15) @@ -17,7 +17,7 @@ if(!O:amount) return while(metal_amount < 150000 && O:amount) - src.metal_amount += O:height * O:width * O:length * 100000.0 + src.metal_amount += O:m_amt /*O:height * O:width * O:length * 100000.0*/ O:amount-- count++ diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 81b80fb8fd3..d926253250e 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -216,7 +216,6 @@ if(src.active >= 1) src.active = 0 icon_state = "Shield_Gen" - user << "You " user.visible_message("[user] turned the shield generator off.", \ "You turn off the shield generator.", \ diff --git a/code/game/machinery/singularity.dm b/code/game/machinery/singularity.dm index 25297b5e833..e2bd4caecd7 100644 --- a/code/game/machinery/singularity.dm +++ b/code/game/machinery/singularity.dm @@ -32,13 +32,14 @@ However people seem to like it for some reason. anchored = !anchored playsound(src.loc, 'Ratchet.ogg', 75, 1) if(anchored) - user.visible_message("[user.name] secure [src.name] to the floor.", \ + user.visible_message("[user.name] secures [src.name] to the floor.", \ "You secure the [src.name] to the floor.", \ "You hear ratchet") else - user.visible_message("[user.name] unsecure [src.name] from the floor.", \ - "You unsecure the [src.name] to the floor.", \ + user.visible_message("[user.name] unsecures [src.name] from the floor.", \ + "You unsecure the [src.name] from the floor.", \ "You hear ratchet") + return return ..() /proc/singularity_is_surrounded(turf/T) @@ -139,7 +140,7 @@ However people seem to like it for some reason. /obj/machinery/the_singularity/proc/notify_collector_controller() var/oldsrc = src - src = 0 //for spawn() working even after Del(), see byond documentation about sleep() -rastaf0 + src = null //for spawn() working even after Del(), see byond documentation about sleep() -rastaf0 for(var/obj/machinery/power/collector_control/myCC in orange(collector_control_range,oldsrc)) spawn() myCC.updatecons() @@ -212,9 +213,6 @@ However people seem to like it for some reason. gain = 2 else if(isturf(A)) - if(istype(A, /turf/space)) - world << "DEBUG: the_singularity tryes to eat space!!!11" - return /*if(!active) if(isturf(A,/turf/simulated/floor/engine)) //here was a bug. But now it's a feature. -rasta0 return*/ @@ -299,19 +297,13 @@ However people seem to like it for some reason. if (istype(X,/turf/simulated/floor) && !istype(X,/turf/simulated/floor/plating)) if(!X:broken) if(prob(80)) - new/obj/item/weapon/tile (X) + new/obj/item/stack/tile (X) X:break_tile_to_plating() else X:break_tile() else if(istype(X,/turf/simulated/wall)) - if (istype(X,/turf/simulated/wall/r_wall)) - new /obj/structure/girder/reinforced( X ) - new /obj/item/weapon/sheet/r_metal( X ) - else - new /obj/structure/girder( X ) - new /obj/item/weapon/sheet/metal( X ) - X:ReplaceWithFloor() + X:dismantle_wall() else X:ReplaceWithFloor() @@ -662,16 +654,16 @@ However people seem to like it for some reason. else if(state == 0) state = 1 playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] secure [src.name] to the floor.", \ - "You secure the external reinforcing bolts to the floor.", \ + user.visible_message("[user.name] secures [src.name] to the floor.", \ + "You secure the external reinforcing bolts.", \ "You hear ratchet") src.anchored = 1 else if(state == 1) state = 0 playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] unsecure [src.name] to the floor.", \ - "You undo the external reinforcing bolts to the floor.", \ + user.visible_message("[user.name] unsecures [src.name] to the floor.", \ + "You undo the external reinforcing bolts.", \ "You hear ratchet") src.anchored = 0 else @@ -691,7 +683,7 @@ However people seem to like it for some reason. playsound(src.loc, 'Welder2.ogg', 50, 1) if(state == 1) - user.visible_message("[user.name] start to weld [src.name] to the floor.", \ + user.visible_message("[user.name] starts to weld [src.name] to the floor.", \ "You start to weld the [src] to the floor.", \ "You hear welding") if (do_after(user,20)) @@ -701,7 +693,7 @@ However people seem to like it for some reason. return 1 else if(state == 3) - user.visible_message("[user.name] start to cut [src.name] to the floor.", \ + user.visible_message("[user.name] starts to cut [src.name] from the floor.", \ "You start to cut the [src] free from the floor.", \ "You hear welding") if (do_after(user,20)) @@ -818,11 +810,11 @@ However people seem to like it for some reason. src.active = !src.active if(src.active) updateicon_on() - user.visible_message("[user.name] turn on the collector array.", \ + user.visible_message("[user.name] turns on the collector array.", \ "You turn on the collector array.") else updateicon_off() - user.visible_message("[user.name] turn off the collector array.", \ + user.visible_message("[user.name] turns off the collector array.", \ "You turn off the collector array.") CU.updatecons() @@ -858,11 +850,11 @@ However people seem to like it for some reason. playsound(src.loc, 'Ratchet.ogg', 75, 1) src.anchored = !src.anchored if(src.anchored == 1) - user.visible_message("[user.name] secure [src.name] reinforcing bolts to the floor.", \ - "You secure the collector reinforcing bolts to the floor.", \ + user.visible_message("[user.name] secures [src.name] reinforcing bolts to the floor.", \ + "You secure the collector reinforcing bolts.", \ "You hear ratchet") else - user.visible_message("[user.name] unsecure [src.name] reinforcing bolts to the floor.", \ + user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ "You undo the external reinforcing bolts.", \ "You hear ratchet") for(var/obj/machinery/power/collector_control/myCC in orange(1,src)) @@ -1042,12 +1034,12 @@ However people seem to like it for some reason. playsound(src.loc, 'Ratchet.ogg', 75, 1) src.anchored = !src.anchored if(src.anchored == 1) - user.visible_message("[user.name] secure [src.name] to the floor.", \ + user.visible_message("[user.name] secures [src.name] to the floor.", \ "You secure the [src.name] to the floor.", \ "You hear ratchet") connect_to_network() else - user.visible_message("[user.name] unsecure [src.name] to the floor.", \ + user.visible_message("[user.name] unsecures [src.name] to the floor.", \ "You undo the [src] securing bolts.", \ "You hear ratchet") disconnect_from_network() @@ -1122,11 +1114,11 @@ However people seem to like it for some reason. if(src.active >= 1) // src.active = 0 // icon_state = "Field_Gen" - user << "You are unable to turn off the [src]r, wait till it powers down." + user << "You are unable to turn off the [src], wait till it powers down." // src.cleanup() return 1 else - user.visible_message("[user.name] turn on [src.name]", \ + user.visible_message("[user.name] turns on [src.name]", \ "You turn on the [src].", \ "You hear heavy droning") turn_on() @@ -1221,7 +1213,7 @@ However people seem to like it for some reason. if(state == 0) state = 1 playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] secure [src.name] to the floor.", \ + user.visible_message("[user.name] secures [src.name] to the floor.", \ "You secure the external reinforcing bolts to the floor.", \ "You hear ratchet") src.anchored = 1 @@ -1229,7 +1221,7 @@ However people seem to like it for some reason. else if(state == 1) state = 0 playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] unsecure [src.name] reinforcing bolts to the floor.", \ + user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ "You undo the external reinforcing bolts.", \ "You hear ratchet") src.anchored = 0 @@ -1246,7 +1238,7 @@ However people seem to like it for some reason. playsound(src.loc, 'Welder2.ogg', 50, 1) if(state == 1) - user.visible_message("[user.name] start to weld [src.name] to the floor.", \ + user.visible_message("[user.name] starts to weld [src.name] to the floor.", \ "You start to weld the [src] to the floor.", \ "You hear welding") if (do_after(user,20)) @@ -1256,7 +1248,7 @@ However people seem to like it for some reason. return 1 else if(state == 3) - user.visible_message("[user.name] start to cut [src.name] free from the floor.", \ + user.visible_message("[user.name] starts to cut [src.name] free from the floor.", \ "You start to cut the [src] free from the floor.", \ "You hear welding") if (do_after(user,20)) diff --git a/code/game/objects/closets.dm b/code/game/objects/closets.dm index 74c52637e8d..aaa50687ca1 100644 --- a/code/game/objects/closets.dm +++ b/code/game/objects/closets.dm @@ -144,7 +144,7 @@ user << "\blue You need more welding fuel to complete this task." return W:use_fuel(1) - new /obj/item/weapon/sheet/metal(src.loc) + new /obj/item/stack/sheet/metal(src.loc) for (var/mob/M in viewers(src)) M.show_message("\red [src] has been cut apart by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) del(src) diff --git a/code/game/objects/door_assembly.dm b/code/game/objects/door_assembly.dm index c86cec4c11e..05fc3b0a661 100644 --- a/code/game/objects/door_assembly.dm +++ b/code/game/objects/door_assembly.dm @@ -82,7 +82,7 @@ obj/door_assembly state = 1 glass = 1 -/obj/door_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/door_assembly/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/weldingtool) && W:welding && !anchored ) if (W:get_fuel() < 1) user << "\blue You need more welding fuel to dissassemble the airlock assembly." @@ -94,12 +94,9 @@ obj/door_assembly sleep(40) if(get_turf(user) == T) user << "\blue You dissasembled the airlock assembly!" - new /obj/item/weapon/sheet/metal(get_turf(src)) - new /obj/item/weapon/sheet/metal(get_turf(src)) - new /obj/item/weapon/sheet/metal(get_turf(src)) - new /obj/item/weapon/sheet/metal(get_turf(src)) + new /obj/item/stack/sheet/metal(get_turf(src), 4) if(src.glass==1) - new /obj/item/weapon/sheet/rglass(get_turf(src)) + new /obj/item/stack/sheet/rglass(get_turf(src)) del(src) else if(istype(W, /obj/item/weapon/wrench) && !anchored ) playsound(src.loc, 'Ratchet.ogg', 100, 1) @@ -207,7 +204,7 @@ obj/door_assembly ae = electronics electronics = null ae.loc = src.loc - else if(istype(W, /obj/item/weapon/sheet/rglass) && glass == 0) + else if(istype(W, /obj/item/stack/sheet/rglass) && glass == 0) playsound(src.loc, 'Crowbar.ogg', 100, 1) var/turf/T = get_turf(user) user.visible_message("[user] adds reinforced glass windows to the airlock assembly.", "You start to install reinforced glass windows into the airlock assembly.") diff --git a/code/game/objects/grille.dm b/code/game/objects/grille.dm index 68767b7c3ba..0a1422b39e2 100644 --- a/code/game/objects/grille.dm +++ b/code/game/objects/grille.dm @@ -131,11 +131,11 @@ src.icon_state = "brokengrille" src.density = 0 src.destroyed = 1 - new /obj/item/weapon/rods( src.loc ) + new /obj/item/stack/rods( src.loc ) else if (src.health <= -10.0) - new /obj/item/weapon/rods( src.loc ) + new /obj/item/stack/rods( src.loc ) //SN src = null del(src) return diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 189c28a47ab..bcca62b2ea0 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -2,8 +2,7 @@ /obj/item/apc_frame/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) - var/obj/item/weapon/sheet/metal/M = new /obj/item/weapon/sheet/metal( src.loc ) - M.amount = 2 + new /obj/item/stack/sheet/metal( src.loc, 2 ) del(src) /obj/item/apc_frame/proc/try_build(turf/on_wall) diff --git a/code/game/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm index ee6ff8bfe21..fccb083004f 100644 --- a/code/game/objects/items/robot_parts.dm +++ b/code/game/objects/items/robot_parts.dm @@ -71,18 +71,13 @@ return 0 /obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/sheet/metal)) + if(istype(W, /obj/item/stack/sheet/metal)) var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly - B.loc = user - if (user.r_hand == W) - user.u_equip(W) - user.r_hand = B - else - user.u_equip(W) - user.l_hand = B - B.layer = 20 user << "You armed the robot frame" - del(W) + W:use(1) + if (user.get_inactive_hand()==src) + user.before_take_item(src) + user.put_in_inactive_hand(B) del(src) if(istype(W, /obj/item/robot_parts/l_leg)) user.drop_item() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index b6ceec3f9d9..c1d05ce36f3 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -21,7 +21,7 @@ GETLINEEEEEEEEEEEEEEEEEEEEE var/lit = 0 //on or off var/turf/previousturf = null var/obj/item/weapon/weldingtool/part1 = null - var/obj/item/weapon/rods/part2 = null + var/obj/item/stack/rods/part2 = null var/obj/item/device/igniter/part3 = null var/obj/item/weapon/tank/plasma/part4 = null m_amt = 500 @@ -155,7 +155,7 @@ GETLINEEEEEEEEEEEEEEEEEEEEE if(isturf(location)) //start a fire if possible location.hotspot_expose(700, 2) -/obj/item/weapon/flamethrower/attackby(obj/item/weapon/tank/plasma/W as obj, mob/user as mob) +/obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob) if(user.stat || user.restrained() || user.lying) return if (istype(W,/obj/item/weapon/tank/plasma)) diff --git a/code/game/objects/items/weapons/glass.dm b/code/game/objects/items/weapons/glass.dm deleted file mode 100644 index d344ec0f907..00000000000 --- a/code/game/objects/items/weapons/glass.dm +++ /dev/null @@ -1,278 +0,0 @@ -/* -CONTAINS: -GLASS SHEET -REINFORCED GLASS SHEET -SHARDS - -*/ - -/obj/item/weapon/sheet/glass/attack_hand(mob/user as mob) - if ((user.r_hand == src || user.l_hand == src)) - src.add_fingerprint(user) - var/obj/item/weapon/sheet/glass/F = new /obj/item/weapon/sheet/glass( user ) - F.amount = 1 - src.amount-- - if (user.hand) - user.l_hand = F - else - user.r_hand = F - F.layer = 20 - F.add_fingerprint(user) - if (src.amount < 1) - //SN src = null - del(src) - return - else - ..() - src.force = 5 - return - -/obj/item/weapon/sheet/glass/attackby(obj/item/weapon/W, mob/user) - if ( istype(W, /obj/item/weapon/sheet/glass) ) - var/obj/item/weapon/sheet/glass/G = W - if (G.amount >= MAX_STACK_AMOUNT_GLASS) - return - if (G.amount + src.amount > MAX_STACK_AMOUNT_GLASS) - src.amount = G.amount + src.amount - MAX_STACK_AMOUNT_GLASS - G.amount = MAX_STACK_AMOUNT_GLASS - else - G.amount += src.amount - //SN src = null - del(src) - return - return - else if( istype(W, /obj/item/weapon/rods) ) - - var/obj/item/weapon/rods/V = W - var/obj/item/weapon/sheet/rglass/R = new /obj/item/weapon/sheet/rglass(user.loc) - R.loc = user.loc - R.add_fingerprint(user) - - - if(V.amount == 1) - - if(user.client) - user.client.screen -= V - - user.u_equip(W) - del(W) - else - V.amount-- - - - if(src.amount == 1) - - if(user.client) - user.client.screen -= src - - user.u_equip(src) - del(src) - else - src.amount-- - return - - - -/obj/item/weapon/sheet/glass/examine() - set src in view(1) - - ..() - usr << text("There are [] glass sheet\s on the stack.", src.amount) - return - -/obj/item/weapon/sheet/glass/attack_self(mob/user as mob) - - if (!( istype(usr.loc, /turf/simulated) )) - return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - switch(alert("Sheet-Glass", "Would you like full tile glass or one direction?", "one direct", "full (2 sheets)", "cancel", null)) - if("one direct") - var/go = 1 - for (var/obj/window/win in usr.loc) - if(win.ini_dir == NORTHWEST || win.ini_dir == NORTHEAST || win.ini_dir == SOUTHWEST || win.ini_dir == SOUTHEAST) - go = 0 - if(go) - var/obj/window/W = new /obj/window( usr.loc ) - W.anchored = 0 - if (src.amount < 1) - return - src.amount-- - else usr << "Can't let you do that." - if("full (2 sheets)") - var/go = 1 - for (var/obj/window/win in usr.loc) - if(win) - go = 0 - if (go) - if (src.amount < 2) - return - src.amount -= 2 - var/obj/window/W = new /obj/window( usr.loc ) - W.dir = SOUTHWEST - W.ini_dir = SOUTHWEST - W.anchored = 0 - else usr << "Can't let you do that." - else - if (src.amount <= 0) - user.u_equip(src) - del(src) - return - return - - - - - - -// REINFORCED GLASS - -/obj/item/weapon/sheet/rglass/attack_hand(mob/user as mob) - if ((user.r_hand == src || user.l_hand == src)) - src.add_fingerprint(user) - var/obj/item/weapon/sheet/rglass/F = new /obj/item/weapon/sheet/rglass( user ) - F.amount = 1 - src.amount-- - if (user.hand) - user.l_hand = F - else - user.r_hand = F - F.layer = 20 - F.add_fingerprint(user) - if (src.amount < 1) - //SN src = null - del(src) - return - else - ..() - src.force = 5 - return - -/obj/item/weapon/sheet/rglass/attackby(obj/item/weapon/sheet/rglass/W as obj, mob/user as mob) - if (!( istype(W, /obj/item/weapon/sheet/rglass) )) - return - if (W.amount >= MAX_STACK_AMOUNT_GLASS) - return - if (W.amount + src.amount > MAX_STACK_AMOUNT_GLASS) - src.amount = W.amount + src.amount - MAX_STACK_AMOUNT_GLASS - W.amount = MAX_STACK_AMOUNT_GLASS - else - W.amount += src.amount - del(src) - return - return - -/obj/item/weapon/sheet/rglass/examine() - set src in view(1) - - ..() - usr << text("There are [] reinforced glass sheet\s on the stack.", src.amount) - return - -/obj/item/weapon/sheet/rglass/attack_self(mob/user as mob) - if (!istype(usr.loc, /turf/simulated)) - return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - switch(alert("Sheet Reinf. Glass", "Would you like full tile glass or one direction?", "one direct", "full (2 sheets)", "cancel", null)) - if("one direct") - var/go = 1 - for (var/obj/window/win in usr.loc) - if(win.ini_dir == NORTHWEST || win.ini_dir == NORTHEAST || win.ini_dir == SOUTHWEST || win.ini_dir == SOUTHEAST) - go = 0 - if(go) - var/obj/window/W = new /obj/window( usr.loc, 1 ) - W.anchored = 0 - W.state = 0 - if (src.amount < 1) - return - src.amount-- - else usr << "Can't let you do that." - if("full (2 sheets)") - var/go = 1 - for (var/obj/window/win in usr.loc) - if(win) - go = 0 - if(go) - if (src.amount < 2) - return - src.amount -= 2 - var/obj/window/W = new /obj/window( usr.loc, 1 ) - W.dir = SOUTHWEST - W.ini_dir = SOUTHWEST - W.anchored = 0 - W.state = 0 - else usr << "Can't let you do that." - else - if (src.amount <= 0) - user.u_equip(src) - //SN src = null - del(src) - return - return - - - - - - - - -// SHARDS - -/obj/item/weapon/shard/Bump() - - spawn( 0 ) - if (prob(20)) - src.force = 15 - else - src.force = 4 - ..() - return - return - -/obj/item/weapon/shard/New() - - //****RM - //world<<"New shard at [x],[y],[z]" - - src.icon_state = pick("large", "medium", "small") - switch(src.icon_state) - if("small") - src.pixel_x = rand(1, 18) - src.pixel_y = rand(1, 18) - if("medium") - src.pixel_x = rand(1, 16) - src.pixel_y = rand(1, 16) - if("large") - src.pixel_x = rand(1, 10) - src.pixel_y = rand(1, 5) - else - return - -/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding )) - return - W:eyecheck(user) - new /obj/item/weapon/sheet/glass( user.loc ) - //SN src = null - del(src) - return - -/obj/item/weapon/shard/HasEntered(AM as mob|obj) - if(ismob(AM)) - var/mob/M = AM - M << "\red You step in the broken glass!" - playsound(src.loc, 'glass_step.ogg', 50, 1) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.shoes) - var/datum/organ/external/affecting = H.organs[pick("l_foot", "r_foot")] - H.weakened = max(3, H.weakened) - affecting.take_damage(5, 0) - H.UpdateDamageIcon() - H.updatehealth() - ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/metals_rods.dm b/code/game/objects/items/weapons/metals_rods.dm deleted file mode 100644 index 64f67d438fd..00000000000 --- a/code/game/objects/items/weapons/metals_rods.dm +++ /dev/null @@ -1,466 +0,0 @@ -/* -CONTAINS: -RODS -METAL -REINFORCED METAL -LATTICE - -*/ - - - -// RODS - -/obj/item/weapon/rods/examine() - set src in view(1) - - ..() - usr << text("There are [] rod\s left on the stack.", src.amount) - return - -/obj/item/weapon/rods/attack_hand(mob/user as mob) - if ((user.r_hand == src || user.l_hand == src)) - src.add_fingerprint(user) - var/obj/item/weapon/rods/F = new /obj/item/weapon/rods( user ) - F.amount = 1 - src.amount-- - if (user.hand) - user.l_hand = F - else - user.r_hand = F - F.layer = 20 - F.add_fingerprint(user) - if (src.amount < 1) - //SN src = null - del(src) - return - else - ..() - return - -/obj/item/weapon/rods/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/weldingtool) && W:welding) - if(amount < 2) - user << "\blue You need at least two rods to do this." - return - if (W:get_fuel() < 2) - user << "\blue You need more welding fuel to complete this task." - return - W:eyecheck(user) - W:use_fuel(2) - new /obj/item/weapon/sheet/metal(usr.loc) - for (var/mob/M in viewers(src)) - M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) - - amount -= 2 - if(amount == 0) - del(src) - return - if (istype(W, /obj/item/weapon/rods)) - if (W:amount == MAX_STACK_AMOUNT_RODS) - return - if (W:amount + src:amount > MAX_STACK_AMOUNT_RODS) - src.amount = W:amount + src:amount - MAX_STACK_AMOUNT_RODS - W:amount = MAX_STACK_AMOUNT_RODS - else - W:amount += src:amount - //SN src = null - del(src) - return - return - -/obj/item/weapon/rods/attack_self(mob/user as mob) - if (locate(/obj/grille, usr.loc)) - for(var/obj/grille/G in usr.loc) - if (G.destroyed) - G.health = 10 - G.density = 1 - G.destroyed = 0 - G.icon_state = "grille" - src.amount-- - else - else - if (src.amount < 2) - return - src.amount -= 2 - new /obj/grille( usr.loc ) - if (src.amount < 1) - del(src) - return - src.add_fingerprint(user) - return - - - - -// METAL SHEET - -/obj/item/weapon/sheet/metal/examine() - set src in view(1) - - ..() - usr << text("There are [] metal sheet\s on the stack.", src.amount) - return - -/obj/item/weapon/sheet/metal/attack_hand(mob/user as mob) - if ((user.r_hand == src || user.l_hand == src)) - src.add_fingerprint(user) - var/obj/item/weapon/sheet/metal/F = new /obj/item/weapon/sheet/metal( user ) - F.amount = 1 - src.amount-- - if (user.hand) - user.l_hand = F - else - user.r_hand = F - F.layer = 20 - F.add_fingerprint(user) - if (src.amount < 1) - del(src) - return - else - ..() - src.force = 5 - return - -/obj/item/weapon/sheet/metal/attackby(obj/item/weapon/sheet/metal/W as obj, mob/user as mob) - if (!( istype(W, /obj/item/weapon/sheet/metal) )) - return - if (W.amount >= MAX_STACK_AMOUNT_METAL) - return - if (W.amount + src.amount > MAX_STACK_AMOUNT_METAL) - src.amount = W.amount + src.amount - MAX_STACK_AMOUNT_METAL - W.amount = MAX_STACK_AMOUNT_METAL - else - W.amount += src.amount - //SN src = null - del(src) - return - return - - - -/obj/item/weapon/sheet/metal/attack_self(mob/user as mob) - var/t1 = text("Amount Left: []
", src.amount) - var/list/L = list( ) - L["stool"] = "stool" - L["chair"] = "chair" - L["bed"] = "bed (2 metal)
" - L["table"] = "table parts (2 metal)" - L["rack"] = "rack parts
" - L["aircan"] = "air canister (2 metal)" - L["o2can"] = "oxygen canister (2 metal)" - L["carboncan"] = "co2 canister (2 metal)" - L["plcan"] = "plasma canister (2 metal)" - L["n2can"] = "n2 canister (2 metal)" - L["n2ocan"] = "n2o canister (2 metal)" - L["closet"] = "closet (2 metal)
" - L["fl_tiles"] = "4x floor tiles" - L["rods"] = "2x metal rods" - L["casing"] = "grenade casing (1 metal)" - L["reinforced"] = "reinforced sheet (2 metal)
" - L["computer"] = "computer frame (5 metal)
" - L["construct"] = "construct wall girders (2 metal)" - L["airlock"] = "construct airlock assembly (4 metal)" - L["apc_frame"] = "construct apc frame (2 metal)" - - for(var/t in L) - t1 += text("
[] ", src, t, L[t]) - t1 += "
" - t1 += "
" - user << browse(t1, "window=met_sheet") - onclose(user, "met_sheet") - return - -/obj/item/weapon/sheet/metal/Topic(href, href_list) - ..() - if ((usr.restrained() || usr.stat || usr.equipped() != src)) - return - if (href_list["make"]) - if (src.amount < 1) - //SN src = null - del(src) - return - switch(href_list["make"]) - if("rods") - src.amount-- - var/obj/item/weapon/rods/R = new /obj/item/weapon/rods( usr.loc ) - R.amount = 2 - if("table") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the table parts!") - return - src.amount -= 2 - new /obj/item/weapon/table_parts( usr.loc ) - if("stool") - src.amount-- - new /obj/stool( usr.loc ) - if("chair") - src.amount-- - var/obj/stool/chair/C = new /obj/stool/chair( usr.loc ) - C.dir = usr.dir - if (C.dir == NORTH) - C.layer = 5 - if("rack") - src.amount-- - new /obj/item/weapon/rack_parts( usr.loc ) - - if("aircan") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the canister!") - return - src.amount -= 2 - var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc) - C.color = "grey" - C.icon_state = "grey" - - if("o2can") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the canister!") - return - src.amount -= 2 - - var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc) - C.color = "blue" - C.icon_state = "blue" - - if("carboncan") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the canister!") - return - src.amount -= 2 - - var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc) - C.color = "black" - C.icon_state = "black" - - if("plcan") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the canister!") - return - src.amount -= 2 - - var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc) - C.color = "orange" - C.icon_state = "orange" - - if("n2can") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the canister!") - return - src.amount -= 2 - var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc) - C.color = "red" - C.icon_state = "red" - if("n2ocan") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the canister!") - return - src.amount -= 2 - var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc) - C.color = "redws" - C.icon_state = "redws" - - if("reinforced") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the reinforced sheet!") - return - src.amount -= 2 - var/obj/item/weapon/sheet/r_metal/C = new /obj/item/weapon/sheet/r_metal( usr.loc ) - C.amount = 1 - - if("casing") - if (src.amount < 1) //Not possible! - usr << text("\red You haven't got enough metal to create the grenade casing!") - return - src.amount-- - new /obj/item/weapon/chem_grenade( usr.loc ) - - if("closet") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the reinforced closet!") - return - src.amount -= 2 - new /obj/closet( usr.loc ) - if("fl_tiles") - src.amount-- - var/obj/item/weapon/tile/R = new /obj/item/weapon/tile( usr.loc ) - R.amount = 4 - if("bed") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the bed!") - return - src.amount -= 2 - new /obj/stool/bed( usr.loc ) - if("computer") - if(src.amount < 5) - usr << text("\red You haven't got enough metal to build the computer frame!") - return - src.amount -= 5 - new /obj/computerframe( usr.loc ) - if("construct") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to construct the wall girders!") - return - usr << "\blue Building wall girders ..." - var/turf/location = usr.loc - sleep(50) - if ((usr.loc == location)) - if (!istype(location, /turf/simulated/floor)) - return - - src.amount -= 2 - new /obj/structure/girder(location) - if("airlock") - if (src.amount < 4) - usr << text("\red You haven't got enough metal to construct the airlock assembly!") - return - usr << "\blue Building airlock assembly ..." - var/turf/location = usr.loc - sleep(50) - if ((usr.loc == location)) - if (!istype(location, /turf/simulated/floor)) - return - src.amount -= 4 - new /obj/door_assembly(location) - if("apc_frame") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the APC frame!") - return - src.amount -= 2 - new /obj/item/apc_frame(usr.loc) - - if (src.amount <= 0) - usr << browse(null, "window=met_sheet") - onclose(usr, "met_sheet") - usr.u_equip(src) - del(src) - - - return - spawn( 0 ) - src.attack_self(usr) - return - return - - - - - -// REINFORCED METAL SHEET - -/obj/item/weapon/sheet/r_metal/attackby(obj/item/weapon/sheet/r_metal/W as obj, mob/user as mob) - if (!( istype(W, /obj/item/weapon/sheet/r_metal) )) - return - if (W.amount >= MAX_STACK_AMOUNT_METAL) - return - if (W.amount + src.amount > MAX_STACK_AMOUNT_METAL) - src.amount = W.amount + src.amount - MAX_STACK_AMOUNT_METAL - W.amount = MAX_STACK_AMOUNT_METAL - else - W.amount += src.amount - //SN src = null - del(src) - return - return - -/obj/item/weapon/sheet/r_metal/attack_self(mob/user as mob) - var/t1 = text("Amount Left: []
", src.amount) - var/list/L = list( ) - L["table"] = "table parts (2 metal)" - L["metal"] = "2x metal sheet (1 metal)
" - L["core"] = "AI core (4 metal)" - for(var/t in L) - t1 += text("[] ", src, t, L[t]) - t1 += "
" - t1 += "
" - user << browse(t1, "window=met_sheet") - onclose(user, "met_sheet") - return - -/obj/item/weapon/sheet/r_metal/Topic(href, href_list) - ..() - if ((usr.restrained() || usr.stat || usr.equipped() != src)) - return - if (href_list["make"]) - if (src.amount < 1) - //SN src = null - del(src) - return - switch(href_list["make"]) - if("table") - if (src.amount < 2) - usr << text("\red You haven't got enough metal to build the reinforced table parts!") - return - src.amount -= 2 - new /obj/item/weapon/table_parts/reinforced( usr.loc ) - if("metal") - if (src.amount < 1) - usr << text("\red You haven't got enough metal to build the metal sheets!") - return - src.amount -= 1 - var/obj/item/weapon/sheet/metal/C = new /obj/item/weapon/sheet/metal( usr.loc ) - C.amount = 2 - if("core") - if (src.amount < 4) - usr << text("\red You haven't got enough metal to build the metal sheets!") - return - src.amount -= 4 - new /obj/AIcore( usr.loc ) - - - if (src.amount <= 0) - usr << browse(null, "window=met_sheet") - onclose(usr, "met_sheet") - usr.u_equip(src) - del(src) - - - return - spawn( 0 ) - src.attack_self(usr) - return - return - - - -// LATTICE???? - - -/obj/lattice/blob_act() - del(src) - return - -/obj/lattice/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - del(src) - return - if(3.0) - return - else - return - -/obj/lattice/attackby(obj/item/weapon/C as obj, mob/user as mob) - - if (istype(C, /obj/item/weapon/tile)) - - C:build(get_turf(src)) - C:amount-- - playsound(src.loc, 'Genhit.ogg', 50, 1) - C.add_fingerprint(user) - - if (C:amount < 1) - user.u_equip(C) - del(C) - del(src) - return - if (istype(C, /obj/item/weapon/weldingtool) && C:welding) - user << "\blue Slicing lattice joints ..." - C:eyecheck(user) - new /obj/item/weapon/rods(src.loc) - del(src) - - return diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm index a996cc6045a..b62560af40c 100644 --- a/code/game/objects/items/weapons/table_rack_parts.dm +++ b/code/game/objects/items/weapons/table_rack_parts.dm @@ -11,7 +11,7 @@ RACK PARTS /obj/item/weapon/table_parts/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) - new /obj/item/weapon/sheet/metal( src.loc ) + new /obj/item/stack/sheet/metal( src.loc ) //SN src = null del(src) @@ -40,7 +40,7 @@ RACK PARTS // REINFORCED TABLE PARTS /obj/item/weapon/table_parts/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) - new /obj/item/weapon/sheet/r_metal( src.loc ) + new /obj/item/stack/sheet/r_metal( src.loc ) //SN src = null del(src) @@ -70,7 +70,7 @@ RACK PARTS // RACK PARTS /obj/item/weapon/rack_parts/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) - new /obj/item/weapon/sheet/metal( src.loc ) + new /obj/item/stack/sheet/metal( src.loc ) del(src) return return diff --git a/code/game/objects/items/weapons/tiles_wires.dm b/code/game/objects/items/weapons/tiles_wires.dm index 53cafbe9ad7..59e96b89ef2 100644 --- a/code/game/objects/items/weapons/tiles_wires.dm +++ b/code/game/objects/items/weapons/tiles_wires.dm @@ -26,86 +26,3 @@ TILES return - -// TILES - -/obj/item/weapon/tile/New() - - src.pixel_x = rand(1, 14) - src.pixel_y = rand(1, 14) - return - -/obj/item/weapon/tile/examine() - set src in view(1) - - ..() - usr << text("There are [] tile\s left on the stack.", src.amount) - return - -/obj/item/weapon/tile/attack_hand(mob/user as mob) - - if ((user.r_hand == src || user.l_hand == src)) - src.add_fingerprint(user) - var/obj/item/weapon/tile/F = new /obj/item/weapon/tile( user ) - F.amount = 1 - src.amount-- - if (user.hand) - user.l_hand = F - else - user.r_hand = F - F.layer = 20 - F.add_fingerprint(user) - if (src.amount < 1) - //SN src = null - del(src) - return - else - ..() - return - -/obj/item/weapon/tile/attack_self(mob/user as mob) - - if (usr.stat) - return - var/T = user.loc - if (!( istype(T, /turf) )) - user << "\blue You must be on the ground!" - return - else - var/S = T - if (!( istype(S, /turf/space) )) - user << "You cannot build on or repair this turf!" - return - else - src.build(S) - src.amount-- - if (src.amount < 1) - user.u_equip(src) - //SN src = null - del(src) - return - src.add_fingerprint(user) - return - -/obj/item/weapon/tile/attackby(obj/item/weapon/tile/W as obj, mob/user as mob) - - if (!( istype(W, /obj/item/weapon/tile) )) - return - if (W.amount == 10) - return - W.add_fingerprint(user) - if (W.amount + src.amount > 10) - src.amount = W.amount + src.amount - 10 - W.amount = 10 - else - W.amount += src.amount - //SN src = null - del(src) - return - return - -/obj/item/weapon/tile/proc/build(turf/S as turf) - - var/turf/simulated/floor/W = S.ReplaceWithFloor() - W.to_plating() - return \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 27a69d59c18..8cacdf6d98d 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -88,15 +88,17 @@ WELDINGTOOOL usr << text("\icon[] [] contains [] units of fuel left!", src, src.name, get_fuel() ) return -/obj/item/weapon/weldingtool/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (status == 0 && istype(W,/obj/item/weapon/screwdriver)) - status = 1 - user << "\blue The welder can now be attached and modified." - else if (status == 1 && istype(W,/obj/item/weapon/rods)) - var/obj/item/weapon/rods/R = W - R.amount = R.amount - 1 - if (R.amount == 0) - del(R) +/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W,/obj/item/weapon/screwdriver)) + status = !status + if (status) + user << "\blue You resecure the welder." + else + user << "\blue The welder can now be attached and modified." + src.add_fingerprint(user) + else if (status == 1 && istype(W,/obj/item/stack/rods)) + var/obj/item/stack/rods/R = W + R.use(1) var/obj/item/assembly/weld_rod/F = new /obj/item/assembly/weld_rod( user ) src.loc = F F.part1 = src @@ -120,10 +122,8 @@ WELDINGTOOOL R.layer = 20 F.loc = user src.add_fingerprint(user) - else if (status == 1 && istype(W,/obj/item/weapon/screwdriver)) - status = 0 - user << "\blue You resecure the welder." - return + else + ..() // helper functions for weldingtool fuel use diff --git a/code/game/objects/stacks/glass.dm b/code/game/objects/stacks/glass.dm new file mode 100644 index 00000000000..b33cfe079a7 --- /dev/null +++ b/code/game/objects/stacks/glass.dm @@ -0,0 +1,137 @@ +/* +CONTAINS: +GLASS SHEET +REINFORCED GLASS SHEET +SHARDS + +*/ + +/proc/construct_window(mob/usr as mob, obj/item/stack/sheet/src as obj) + if (!( istype(usr.loc, /turf/simulated) )) + return + if ( ! (istype(usr, /mob/living/carbon/human) || \ + istype(usr, /mob/living/silicon) || \ + istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) + usr << "\red You don't have the dexterity to do this!" + return 1 + var/reinf = istype(src, /obj/item/stack/sheet/rglass) + var/title = reinf?"Sheet Reinf. Glass":"Sheet-Glass" + title += " ([src.amount] sheet\s left)" + switch(alert(title, "Would you like full tile glass or one direction?", "one direct", "full (2 sheets)", "cancel", null)) + if("one direct") + if (src.amount < 1) + return 1 + var/list/directions = new/list(cardinal) + for (var/obj/window/win in usr.loc) + directions-=win.dir + if(!(win.ini_dir in cardinal)) + usr << "\red Can't let you do that." + return 1 + var/obj/window/W = new /obj/window( usr.loc, reinf ) + if (directions.len) + W.dir = directions[1] + W.ini_dir = W.dir + W.anchored = 0 + src.use(1) + if("full (2 sheets)") + if (src.amount < 2) + return 1 + if (locate(/obj/window) in usr.loc) + usr << "\red Can't let you do that." + return 1 + var/obj/window/W = new /obj/window( usr.loc, reinf ) + W.dir = SOUTHWEST + W.ini_dir = SOUTHWEST + W.anchored = 0 + src.use(2) + else + //do nothing + return + +// GLASS + +/obj/item/stack/sheet/glass/attack_self(mob/user as mob) + construct_window(usr, src) + +/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user) + if( istype(W, /obj/item/stack/rods) ) + var/obj/item/stack/rods/V = W + var/obj/item/stack/sheet/rglass/RG = new (user.loc) + RG.add_fingerprint(user) + RG.add_to_stacks(user) + V.use(1) + var/obj/item/stack/sheet/glass/G = src + src = null + var/replace = (user.get_inactive_hand()==G) + G.use(1) + if (!G && !RG && replace) + user.put_in_hand(RG) + else + return ..() + + +// REINFORCED GLASS + +/obj/item/stack/sheet/rglass/attack_self(mob/user as mob) + construct_window(usr, src) + + + + + + +// SHARDS + +/obj/item/weapon/shard/Bump() + + spawn( 0 ) + if (prob(20)) + src.force = 15 + else + src.force = 4 + ..() + return + return + +/obj/item/weapon/shard/New() + + //****RM + //world<<"New shard at [x],[y],[z]" + + src.icon_state = pick("large", "medium", "small") + switch(src.icon_state) + if("small") + src.pixel_x = rand(1, 18) + src.pixel_y = rand(1, 18) + if("medium") + src.pixel_x = rand(1, 16) + src.pixel_y = rand(1, 16) + if("large") + src.pixel_x = rand(1, 10) + src.pixel_y = rand(1, 5) + else + return + +/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob) + if ( istype(W, /obj/item/weapon/weldingtool) && W:welding ) + W:eyecheck(user) + new /obj/item/stack/sheet/glass( user.loc ) + //SN src = null + del(src) + return + return ..() + +/obj/item/weapon/shard/HasEntered(AM as mob|obj) + if(ismob(AM)) + var/mob/M = AM + M << "\red You step in the broken glass!" + playsound(src.loc, 'glass_step.ogg', 50, 1) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!H.shoes) + var/datum/organ/external/affecting = H.organs[pick("l_foot", "r_foot")] + H.weakened = max(3, H.weakened) + affecting.take_damage(5, 0) + H.UpdateDamageIcon() + H.updatehealth() + ..() \ No newline at end of file diff --git a/code/game/objects/stacks/metal.dm b/code/game/objects/stacks/metal.dm new file mode 100644 index 00000000000..b179f63dede --- /dev/null +++ b/code/game/objects/stacks/metal.dm @@ -0,0 +1,130 @@ +/* +CONTAINS: +RODS +METAL +REINFORCED METAL +FLOOR TILES +*/ + + + +// RODS + +/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/weldingtool) && W:welding) + if(amount < 2) + user << "\red You need at least two rods to do this." + return + if (W:get_fuel() < 3) + user << "\red You need more welding fuel to complete this task." + return + W:eyecheck(user) + W:use_fuel(2) + var/obj/item/stack/sheet/metal/new_item = new(usr.loc) + new_item.add_to_stacks(usr) + for (var/mob/M in viewers(src)) + M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2) + var/obj/item/stack/rods/R = src + src = null + var/replace = (user.get_inactive_hand()==R) + R.use(2) + if (!R && replace) + user.put_in_hand(new_item) + return + ..() + + +/obj/item/stack/rods/attack_self(mob/user as mob) + src.add_fingerprint(user) + if (locate(/obj/grille, usr.loc)) + for(var/obj/grille/G in usr.loc) + if (G.destroyed) + G.health = 10 + G.density = 1 + G.destroyed = 0 + G.icon_state = "grille" + use(1) + else + return 1 + else + if(amount < 2) + user << "\blue You need at least two rods to do this." + return + new /obj/grille( usr.loc ) + use(2) + return + + + +// METAL SHEET + +// /datum/stack_recipe/New(title, result_type, req_amount, res_amount, max_res_amount, time, one_per_turf, on_floor = 0) +var/global/list/datum/stack_recipe/metal_recipes = list ( \ + new/datum/stack_recipe("stool", /obj/stool), \ + new/datum/stack_recipe("chair", /obj/stool/chair, one_per_turf = 1), \ + new/datum/stack_recipe("bed", /obj/stool/bed, 2, one_per_turf = 1), \ + new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \ + new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \ + new/datum/stack_recipe("closet", /obj/closet, 2, one_per_turf = 1), \ + null, \ + new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 2, one_per_turf = 1), \ + null, \ + new/datum/stack_recipe("floor tile", /obj/item/stack/tile, 1, 4, 10), \ + new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \ + new/datum/stack_recipe("reinforced sheet", /obj/item/stack/sheet/r_metal, 2, 1, 50), \ + null, \ + new/datum/stack_recipe("computer frame", /obj/computerframe, 5, one_per_turf = 1), \ + new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("airlock assembly", /obj/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ + null, \ + new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \ + new/datum/stack_recipe("grenade casing", /obj/item/weapon/chem_grenade), \ + ) + +/obj/item/stack/sheet/metal + New(var/loc, var/amount=null) + recipes = metal_recipes + return ..() + +// REINFORCED METAL SHEET + +// /datum/stack_recipe/New(title, result_type, req_amount, res_amount, max_res_amount, time, one_per_turf, on_floor = 0) +var/global/list/datum/stack_recipe/r_metal_recipes = list ( \ + new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/reinforced, 2), \ + new/datum/stack_recipe("metal sheet", /obj/item/stack/sheet/metal, 1, 2, 50), \ + new/datum/stack_recipe("AI core", /obj/AIcore, 4, one_per_turf = 1), \ + ) + +/obj/item/stack/sheet/r_metal + New(var/loc, var/amount=null) + recipes = r_metal_recipes + return ..() + + + +// TILES + +/obj/item/stack/tile/New() + src.pixel_x = rand(1, 14) + src.pixel_y = rand(1, 14) + return + +/obj/item/stack/tile/attack_self(mob/user as mob) + if (usr.stat) + return + var/T = user.loc + if (!( istype(T, /turf) )) + user << "\red You must be on the ground!" + return + if (!( istype(T, /turf/space) )) + user << "\red You cannot build on or repair this turf!" + return + src.build(T) + src.add_fingerprint(user) + use(1) + return + +/obj/item/stack/tile/proc/build(turf/S as turf) + var/turf/simulated/floor/W = S.ReplaceWithFloor() + W.to_plating() + return \ No newline at end of file diff --git a/code/game/objects/stacks/stack.dm b/code/game/objects/stacks/stack.dm new file mode 100644 index 00000000000..4a81fe9a3a1 --- /dev/null +++ b/code/game/objects/stacks/stack.dm @@ -0,0 +1,203 @@ +/* + Base object for stackable items. + Stackable items are: + metal + rmetal + glass + rglass + floor tiles + metal rods +*/ + +/obj/item/stack/New(var/loc, var/amount=null) + ..() + if (amount) + src.amount=amount + + return + +/obj/item/stack/examine() + set src in view(1) + ..() + usr << text("There are [] []\s left on the stack.", src.amount, src.singular_name) + return + +/obj/item/stack/proc/use(var/amount) + src.amount-=amount + if (src.amount<=0) + var/oldsrc = src + src = null //dont kill proc after del() + usr.before_take_item(oldsrc) + del(oldsrc) + return + +/obj/item/stack/proc/add_to_stacks(mob/usr as mob) + var/obj/item/stack/oldsrc = src + src = null + for (var/obj/item/stack/item in usr.loc) + if (item==oldsrc) + continue + if (!istype(item, oldsrc.type)) + continue + if (item.amount>=item.max_amount) + continue + oldsrc.attackby(item, usr) + usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s." + if(!oldsrc) + break + +/obj/item/stack/attack_hand(mob/user as mob) + if (user.get_inactive_hand() == src) + var/obj/item/stack/F = new src.type( user, amount=1) + F.copy_evidences(src) + user.put_in_hand(F) + src.add_fingerprint(user) + F.add_fingerprint(user) + use(1) + if (src && usr.machine==src) + spawn(0) src.interact(usr) + else + ..() + return + +/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W, src.type)) + var/obj/item/stack/S = W + if (S.amount >= max_amount) + return 1 + var/to_transfer as num + if (user.get_inactive_hand()==src) + to_transfer = 1 + else + to_transfer = min(src.amount, S.max_amount-S.amount) + S.amount+=to_transfer + src.use(to_transfer) + if (src && usr.machine==src) + spawn(0) src.interact(usr) + if (S && usr.machine==S) + spawn(0) S.interact(usr) + else return ..() + +/obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj) + src.blood_DNA = from.blood_DNA + src.blood_type = from.blood_type + src.fingerprints = from.fingerprints + src.fingerprintshidden = from.fingerprintshidden + src.fingerprintslast = from.fingerprintslast + +/datum/stack_recipe + var/title = "ERROR" + var/result_type + var/req_amount = 1 + var/res_amount = 1 + var/max_res_amount = 1 + var/time = 0 + var/one_per_turf = 0 + var/on_floor = 0 + New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0) + src.title = title + src.result_type = result_type + src.req_amount = req_amount + src.res_amount = res_amount + src.max_res_amount = max_res_amount + src.time = time + src.one_per_turf = one_per_turf + src.on_floor = on_floor + +/obj/item/stack + var/list/datum/stack_recipe/recipes + +/obj/item/stack/attack_self(mob/user as mob) + interact(user) + +/obj/item/stack/proc/interact(mob/user as mob) + if (!recipes) + return + if (!src || amount<=0) + user << browse(null, "window=stack") + user.machine = src //for correct work of onclose + var/t1 = text("Constructions from []Amount Left: []", src, src.amount) + for(var/i=1;i<=recipes.len,i++) + var/datum/stack_recipe/R = recipes[i] + if (isnull(R)) + t1 += "
" + continue + if (i>1 && !isnull(recipes[i-1])) + t1+="
" + var/max_multiplier = round(src.amount / R.req_amount) + var/title as text + var/can_build = 1 + can_build = can_build && (max_multiplier>0) + if (R.one_per_turf) + can_build = can_build && !(locate(R.result_type) in usr.loc) + if (R.on_floor) + can_build = can_build && istype(usr.loc, /turf/simulated/floor) + if (R.res_amount>1) + title+= "[R.res_amount]x [R.title]\s" + else + title+= "[R.title]" + title+= " ([R.req_amount] [src.singular_name]\s)" + if (can_build) + t1 += text("[] ", src, i, title) + else + t1 += text("[]", title) + continue + if (R.max_res_amount>1 && max_multiplier>1) + var/multiplier = min(max_multiplier, round(R.max_res_amount/R.res_amount)) + t1 += text(" | []x ", src, i, multiplier, multiplier*R.res_amount) + t1 += "
" + user << browse(t1, "window=stack") + onclose(user, "stack") + return + +/obj/item/stack/Topic(href, href_list) + ..() + if ((usr.restrained() || usr.stat || usr.equipped() != src)) + return + if (href_list["make"]) + if (src.amount < 1) del(src) //Never should happen + + var/datum/stack_recipe/R = recipes[text2num(href_list["make"])] + var/multiplier = text2num(href_list["multiplier"]) + if (!multiplier) multiplier = 1 + if (src.amount < R.req_amount*multiplier) + if (R.req_amount*multiplier>1) + usr << "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!" + else + usr << "\red You haven't got enough [src] to build \the [R.title]!" + return + if (R.one_per_turf && (locate(R.result_type) in usr.loc)) + usr << "\red There is another [R.title] here!" + return + if (R.on_floor && !istype(usr.loc, /turf/simulated/floor)) + usr << "\red \The [R.title] must be constructed on the floor!" + return + if (R.time) + usr << "\blue Building [R.title] ..." + if (!do_after(usr, R.time)) + return + if (src.amount < R.req_amount*multiplier) + return + var/O = new R.result_type( usr.loc ) + if (R.max_res_amount>1) + var/obj/item/stack/new_item = O + new_item.amount = R.res_amount*multiplier + //new_item.add_to_stacks(usr) + src.amount-=R.req_amount*multiplier + if (src.amount<=0) + var/oldsrc = src + src = null //dont kill proc after del() + usr.before_take_item(oldsrc) + del(oldsrc) + if (istype(O,/obj/item)) + usr.put_in_hand(O) + if (src && usr.machine==src) //do not reopen closed window + spawn( 0 ) + src.interact(usr) + return + return + +/obj/item/stack/Del() + if (src && usr && usr.machine==src) + usr << browse(null, "window=stack") + ..() diff --git a/code/game/objects/stool.dm b/code/game/objects/stool.dm index f2963585303..f58030afbb6 100644 --- a/code/game/objects/stool.dm +++ b/code/game/objects/stool.dm @@ -20,13 +20,13 @@ /obj/stool/blob_act() if(prob(75)) - new /obj/item/weapon/sheet/metal( src.loc ) + new /obj/item/stack/sheet/metal( src.loc ) del(src) /obj/stool/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'Ratchet.ogg', 50, 1) - new /obj/item/weapon/sheet/metal( src.loc ) + new /obj/item/stack/sheet/metal( src.loc ) //SN src = null del(src) return @@ -36,7 +36,7 @@ ..() if (istype(W, /obj/item/weapon/wrench)) playsound(src.loc, 'Ratchet.ogg', 50, 1) - new /obj/item/weapon/sheet/metal( src.loc ) + new /obj/item/stack/sheet/metal( src.loc ) del(src) return diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index cf4494b7a95..05cf90cdf0e 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -15,114 +15,128 @@ obj/structure icon_state = "reinforced" state = 2 -/obj/structure/girder/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench) && state == 0 && anchored && !istype(src,/obj/structure/girder/displaced)) playsound(src.loc, 'Ratchet.ogg', 100, 1) - var/turf/T = get_turf(user) user << "\blue Now disassembling the girder" - sleep(40) - if(get_turf(user) == T) + if(do_after(user,40)) user << "\blue You dissasembled the girder!" - new /obj/item/weapon/sheet/metal(get_turf(src)) + new /obj/item/stack/sheet/metal(get_turf(src)) del(src) - else if((istype(W, /obj/item/weapon/sheet/metal)) && (W:amount >= 2) && istype(src,/obj/structure/girder/displaced)) - W:amount -= 2 - if(W:amount <= 0) - del(W) + else if((istype(W, /obj/item/stack/sheet/metal)) && (W:amount >= 2) && istype(src,/obj/structure/girder/displaced)) + W:use(2) user << "\blue You create a false wall! Push on it to open or close the passage." new /obj/falsewall (src.loc) del(src) - else if(istype(W, /obj/item/weapon/sheet/r_metal) && istype(src,/obj/structure/girder/displaced)) - W:amount -= 1 - if(W:amount <= 0) - del(W) + else if(istype(W, /obj/item/stack/sheet/r_metal) && istype(src,/obj/structure/girder/displaced)) + W:use(2) user << "\blue You create a false r wall! Push on it to open or close the passage." new /obj/falserwall (src.loc) del(src) else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced)) playsound(src.loc, 'Screwdriver.ogg', 100, 1) - var/turf/T = get_turf(user) user << "\blue Now unsecuring support struts" - sleep(40) - if(get_turf(user) == T) + if(do_after(user,40)) user << "\blue You unsecured the support struts!" state = 1 else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1) playsound(src.loc, 'Wirecutter.ogg', 100, 1) - var/turf/T = get_turf(user) user << "\blue Now removing support struts" - sleep(40) - if(get_turf(user) == T) + if(do_after(user,40)) user << "\blue You removed the support struts!" new/obj/structure/girder( src.loc ) del(src) else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored ) playsound(src.loc, 'Crowbar.ogg', 100, 1) - var/turf/T = get_turf(user) user << "\blue Now dislodging the girder" - sleep(40) - if(get_turf(user) == T) + if(do_after(user, 40)) user << "\blue You dislodged the girder!" new/obj/structure/girder/displaced( src.loc ) del(src) else if(istype(W, /obj/item/weapon/wrench) && state == 0 && !anchored ) playsound(src.loc, 'Ratchet.ogg', 100, 1) - var/turf/T = get_turf(user) user << "\blue Now securing the girder" - sleep(40) - if(get_turf(user) == T) + if(get_turf(user, 40)) user << "\blue You secured the girder!" new/obj/structure/girder( src.loc ) del(src) - else if((istype(W, /obj/item/weapon/sheet/metal)) && (W:amount >= 2)) - var/turf/T = get_turf(user) + else if((istype(W, /obj/item/stack/sheet/metal)) && (W:amount >= 2)) user << "\blue Now adding plating..." - sleep(40) - if (get_turf(user) == T) + if (do_after(user,40)) user << "\blue You added the plating!" var/turf/Tsrc = get_turf(src) Tsrc.ReplaceWithWall() - W:amount -= 2 - if(W:amount <= 0) - del(W) + W:use(2) del(src) return - else if (istype(W, /obj/item/weapon/sheet/r_metal)) - var/turf/T = get_turf(user) + else if (istype(W, /obj/item/stack/sheet/r_metal)) if (src.icon_state == "reinforced") //Time to finalize! user << "\blue Now finalising reinforced wall." - sleep(50) - if(W) - if(get_turf(user) == T) - user << "\blue Wall fully reinforced!" - var/turf/Tsrc = get_turf(src) - Tsrc.ReplaceWithRWall() - W:amount-- - if (W:amount <= 0) - del(W) - del(src) - return + if(do_after(user, 50)) + user << "\blue Wall fully reinforced!" + var/turf/Tsrc = get_turf(src) + Tsrc.ReplaceWithRWall() + W:use(1) + del(src) + return else user << "\blue Now reinforcing girders" - sleep(60) - user << "\blue Girders reinforced!" - W:amount-- - if (W:amount <= 0) - del(W) - new/obj/structure/girder/reinforced( src.loc ) - del(src) - return + if (do_after(user,60)) + user << "\blue Girders reinforced!" + W:use(1) + new/obj/structure/girder/reinforced( src.loc ) + del(src) + return else ..() /obj/structure/girder/blob_act() if(prob(40)) - del(src) \ No newline at end of file + del(src) + + +// LATTICE + + +/obj/lattice/blob_act() + del(src) + return + +/obj/lattice/ex_act(severity) + switch(severity) + if(1.0) + del(src) + return + if(2.0) + del(src) + return + if(3.0) + return + else + return + +/obj/lattice/attackby(obj/item/C as obj, mob/user as mob) + + if (istype(C, /obj/item/stack/tile)) + + C:build(get_turf(src)) + C:use(1) + playsound(src.loc, 'Genhit.ogg', 50, 1) + C.add_fingerprint(user) + del(src) + return + if (istype(C, /obj/item/weapon/weldingtool) && C:welding) + user << "\blue Slicing lattice joints ..." + C:eyecheck(user) + new /obj/item/stack/rods(src.loc) + del(src) + + return diff --git a/code/game/objects/window.dm b/code/game/objects/window.dm index aecd3cc9784..b87f91f77b2 100644 --- a/code/game/objects/window.dm +++ b/code/game/objects/window.dm @@ -10,7 +10,7 @@ health -= 35 if(health <=0) new /obj/item/weapon/shard( src.loc ) - new /obj/item/weapon/rods( src.loc ) + new /obj/item/stack/rods( src.loc ) src.density = 0 del(src) @@ -24,21 +24,21 @@ return if(2.0) new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) //SN src = null del(src) return if(3.0) if (prob(50)) new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) del(src) return return /obj/window/blob_act() - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) density = 0 del(src) @@ -66,7 +66,7 @@ //world << "glass at [x],[y],[z] Mhit" src.health = 0 new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) src.density = 0 @@ -92,7 +92,7 @@ step(src, get_dir(AM, src)) if (src.health <= 0) new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) src.density = 0 del(src) return @@ -107,7 +107,7 @@ O << text("\red [] smashes through the window!", usr) src.health = 0 new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) src.density = 0 del(src) return @@ -120,7 +120,7 @@ O << text("\red [] smashes through the window!", usr) src.health = 0 new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) src.density = 0 del(src) return @@ -142,7 +142,7 @@ src.health = 0 new /obj/item/weapon/shard(src.loc) if(reinf) - new /obj/item/weapon/rods(src.loc) + new /obj/item/stack/rods(src.loc) src.density = 0 del(src) return @@ -183,11 +183,11 @@ index = 0 while(index < 2) new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) index++ else new /obj/item/weapon/shard( src.loc ) - if(reinf) new /obj/item/weapon/rods( src.loc) + if(reinf) new /obj/item/stack/rods( src.loc) src.density = 0 del(src) return diff --git a/code/game/turf.dm b/code/game/turf.dm index 03e5203177d..9b8fc08aecd 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -227,21 +227,21 @@ if(!devastated) playsound(src.loc, 'Welder.ogg', 100, 1) new /obj/structure/girder/reinforced(src) - new /obj/item/weapon/sheet/r_metal( src ) + new /obj/item/stack/sheet/r_metal( src ) else - new /obj/item/weapon/sheet/metal( src ) - new /obj/item/weapon/sheet/metal( src ) - new /obj/item/weapon/sheet/r_metal( src ) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/r_metal( src ) else if(!devastated) playsound(src.loc, 'Welder.ogg', 100, 1) new /obj/structure/girder(src) - new /obj/item/weapon/sheet/metal( src ) - new /obj/item/weapon/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) else - new /obj/item/weapon/sheet/metal( src ) - new /obj/item/weapon/sheet/metal( src ) - new /obj/item/weapon/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) + new /obj/item/stack/sheet/metal( src ) ReplaceWithFloor() @@ -355,7 +355,7 @@ return -/turf/simulated/wall/r_wall/attackby(obj/item/weapon/W as obj, mob/user as mob) +/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob) if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") usr << "\red You don't have the dexterity to do this!" @@ -397,7 +397,7 @@ sleep(100) if ((user.loc == T && user.equipped() == W)) src.d_state = 6 - new /obj/item/weapon/rods( src ) + new /obj/item/stack/rods( src ) user << "\blue You removed the support rods." else if (istype(W, /obj/item/weapon/wrench)) @@ -414,7 +414,7 @@ if (src.d_state == 0) playsound(src.loc, 'Wirecutter.ogg', 100, 1) src.d_state = 1 - new /obj/item/weapon/rods( src ) + new /obj/item/stack/rods( src ) else if (istype(W, /obj/item/weapon/screwdriver)) if (src.d_state == 1) @@ -447,7 +447,7 @@ dismantle_wall() return - else if ((istype(W, /obj/item/weapon/sheet/metal)) && (src.d_state)) + else if ((istype(W, /obj/item/stack/sheet/metal)) && (src.d_state)) var/turf/T = user.loc user << "\blue Repairing wall." sleep(100) @@ -491,7 +491,7 @@ switch(pick(1,2;75,3)) if (1) src.ReplaceWithLattice() - if(prob(33)) new /obj/item/weapon/sheet/metal(src) + if(prob(33)) new /obj/item/stack/sheet/metal(src) if(2) src.ReplaceWithSpace() if(3) @@ -500,7 +500,7 @@ else src.break_tile() src.hotspot_expose(1000,CELL_VOLUME) - if(prob(33)) new /obj/item/weapon/sheet/metal(src) + if(prob(33)) new /obj/item/stack/sheet/metal(src) if(3.0) if (prob(50)) src.break_tile() @@ -543,8 +543,7 @@ turf/simulated/floor/proc/update_icon() user << "\blue Removing rods..." playsound(src.loc, 'Ratchet.ogg', 80, 1) if(do_after(user, 30)) - new /obj/item/weapon/rods(src) - new /obj/item/weapon/rods(src) + new /obj/item/stack/rods(src, 2) ReplaceWithFloor() var/turf/simulated/floor/F = src F.to_plating() @@ -596,7 +595,7 @@ turf/simulated/floor/proc/update_icon() icon_state = "floor" levelupdate() -/turf/simulated/floor/attackby(obj/item/weapon/C as obj, mob/user as mob) +/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob) if(!C || !user) return 0 @@ -605,36 +604,33 @@ turf/simulated/floor/proc/update_icon() if(broken || burnt) user << "\red You remove the broken plating." else - new /obj/item/weapon/tile(src) + new /obj/item/stack/tile(src) to_plating() playsound(src.loc, 'Crowbar.ogg', 80, 1) return - if(istype(C, /obj/item/weapon/rods)) + if(istype(C, /obj/item/stack/rods)) if (!src.intact) if (C:amount >= 2) user << "\blue Reinforcing the floor..." if(do_after(user, 30)) - if (C) - ReplaceWithEngineFloor() - C:amount -= 2 - if (C:amount <= 0) del(C) //wtf - playsound(src.loc, 'Deconstruct.ogg', 80, 1) + ReplaceWithEngineFloor() + playsound(src.loc, 'Deconstruct.ogg', 80, 1) + C:use(2) + return else user << "\red You need more rods." else user << "\red You must remove the plating first." return - if(istype(C, /obj/item/weapon/tile) && !intact) + if(istype(C, /obj/item/stack/tile) && !intact) restore_tile() - var/obj/item/weapon/tile/T = C + var/obj/item/stack/tile/T = C playsound(src.loc, 'Genhit.ogg', 50, 1) - if(--T.amount < 1) - del(T) - return + T.use(1) if(istype(C, /obj/item/weapon/cable_coil)) if(!intact) @@ -685,32 +681,22 @@ turf/simulated/floor/proc/update_icon() step(user.pulling, get_dir(user.pulling.loc, src)) return -/turf/space/attackby(obj/item/weapon/C as obj, mob/user as mob) +/turf/space/attackby(obj/item/C as obj, mob/user as mob) - if (istype(C, /obj/item/weapon/rods)) + if (istype(C, /obj/item/stack/rods)) user << "\blue Constructing support lattice ..." playsound(src.loc, 'Genhit.ogg', 50, 1) ReplaceWithLattice() - C:amount-- - - if (C:amount < 1) - user.u_equip(C) - del(C) - return + C:use(1) return - if (istype(C, /obj/item/weapon/tile)) - if(locate(/obj/lattice, src)) - var/obj/lattice/L = locate(/obj/lattice, src) + if (istype(C, /obj/item/stack/tile)) + var/obj/lattice/L = locate(/obj/lattice, src) + if(L) del(L) playsound(src.loc, 'Genhit.ogg', 50, 1) C:build(src) - C:amount-- - - if (C:amount < 1) - user.u_equip(C) - del(C) - return + C:use(1) return else user << "\red The plating is going to need some support." diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 26b02db09f5..ed55ef1f76b 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -17,8 +17,8 @@ if (!msg) return - var/rendered = "DEAD: ADMIN([src.stealth ? pick("BADMIN", "ViktoriaSA", "Drunkwaffel", "Android Datuhh") : src.key]) says, \"[msg]\"" - + var/rendered = "DEAD: ADMIN([src.stealth ? src.fakekey : src.key]) says, \"[msg]\"" + //pick("BADMIN", "ViktoriaSA", "Drunkwaffel", "Android Datuhh") for (var/mob/M in world) if(M.stat == 2 || (M.client && M.client.holder)) M.show_message(rendered, 2) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0906546b5d4..425042f29c0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -678,10 +678,9 @@ handle_regular_hud_updates() - if (istype(src.ears, /obj/item/device/radio/headset/traitor)) - src.robot_talk_understand = 1 - else - src.robot_talk_understand = 0 + if (istype(src.ears, /obj/item/device/radio/headset)) + var/obj/item/device/radio/headset/H = src.ears + src.robot_talk_understand = H.bintran if (src.stat == 2 || src.mutations & 4) src.sight |= SEE_TURFS diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index d48365a4e31..ccb635d4036 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -68,7 +68,7 @@ message_mode = "left hand" message = copytext(message, 3) - else if (copytext(message, 1, 3) == ":h") + else if (copytext(message, 1, 3) == ":h" || (copytext(message, 1, 3) == ":ð" )) if (ishuman(src)) message_mode = "secure headset" message = copytext(message, 3) @@ -81,14 +81,17 @@ message_mode = "intercom" message = copytext(message, 3) - else if (copytext(message, 1, 3) == ":s" && src.robot_talk_understand) + else if ((copytext(message, 1, 3) == ":s" || (copytext(message, 1, 3) == ":û" )) && src.robot_talk_understand) message = copytext(message, 3) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) src.robot_talk(message) return - // - message = trim(message) + else if ((copytext(message, 1, 3) == ":a" || (copytext(message, 1, 3) == ":ô")) && src.alien_talk_understand) + message = copytext(message, 3) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + src.alien_talk(message) + return if (!message) return diff --git a/code/modules/mob/living/silicon/hivebot/hive_modules.dm b/code/modules/mob/living/silicon/hivebot/hive_modules.dm index 56d34b7d3d8..4416dc2df81 100644 --- a/code/modules/mob/living/silicon/hivebot/hive_modules.dm +++ b/code/modules/mob/living/silicon/hivebot/hive_modules.dm @@ -44,11 +44,11 @@ src.modules += new /obj/item/weapon/wirecutters(src) src.modules += new /obj/item/device/multitool(src) - var/obj/item/weapon/sheet/metal/M = new /obj/item/weapon/sheet/metal(src) + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src) M.amount = 50 src.modules += M - var/obj/item/weapon/sheet/rglass/G = new /obj/item/weapon/sheet/rglass(src) + var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src) G.amount = 50 src.modules += G diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index c19e9abb7ba..cf96280f1b7 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -59,11 +59,11 @@ src.modules += new /obj/item/weapon/wirecutters(src) src.modules += new /obj/item/device/multitool(src) - var/obj/item/weapon/sheet/metal/M = new /obj/item/weapon/sheet/metal(src) + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src) M.amount = 50 src.modules += M - var/obj/item/weapon/sheet/rglass/G = new /obj/item/weapon/sheet/rglass(src) + var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src) G.amount = 50 src.modules += G diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3438f010417..34fb176fa95 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1095,6 +1095,43 @@ T.Entered(W) return +/mob/proc/before_take_item(var/obj/item/item) + u_equip(item) + if (src.client) + src.client.screen -= item + src.update_clothing() + return + +/mob/proc/get_active_hand() + if (src.hand) + return src.l_hand + else + return src.r_hand + +/mob/proc/get_inactive_hand() + if ( ! src.hand) + return src.l_hand + else + return src.r_hand + +/mob/proc/put_in_hand(var/obj/item/I) + I.loc = src + if (src.hand) + src.l_hand = I + else + src.r_hand = I + I.layer = 20 + src.update_clothing() + +/mob/proc/put_in_inactive_hand(var/obj/item/I) + I.loc = src + if (!src.hand) + src.l_hand = I + else + src.r_hand = I + I.layer = 20 + src.update_clothing() + /mob/proc/reset_view(atom/A) if (src.client) if (istype(A, /atom/movable)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 4199fbafaa3..4103aadf820 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -217,7 +217,7 @@ /obj/machinery/power/apc/attackby(obj/item/W, mob/user) - if (istype(user, /mob/living/silicon)) + if (istype(user, /mob/living/silicon) && get_dist(src,user)>1) return src.attack_hand(user) if (istype(W, /obj/item/weapon/crowbar) && opened) if (has_electronics==1) @@ -270,20 +270,20 @@ if (cell) user << "\red Close the APC first." //Less hints more mystery! return - else if (!has_electronics || !terminal) - user << "\red There is nothing to secure." - return else if (has_electronics==1) has_electronics = 2 stat &= ~MAINT playsound(src.loc, 'Screwdriver.ogg', 50, 1) user << "You screw the circuit electronics into place." - else /*(has_electronics==2)*/ + else if (has_electronics==2) has_electronics = 1 stat |= MAINT playsound(src.loc, 'Screwdriver.ogg', 50, 1) user << "You unfasten the electronics." + else /* has_electronics==0 */ + user << "\red There is nothing to secure." + return updateicon() else if(emagged || malfhack) user << "The interface is broken" @@ -377,7 +377,7 @@ playsound(src.loc, 'Welder.ogg', 50, 1) if(do_after(user, 50)) if (emagged || malfhack || (stat & BROKEN) || opened==2) - new /obj/item/weapon/sheet/metal(loc) + new /obj/item/stack/sheet/metal(loc) user.visible_message(\ "\red [src] has been cut apart by [user.name] with the weldingtool.",\ "You disassembled brocken APC frame.",\ @@ -419,14 +419,15 @@ && !opened \ && W.force >= 5 \ && W.w_class >= 3.0 \ - && !istype(W, /obj/item/weapon/gun) \ - && prob(10) ) + && prob(20) ) opened = 2 user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \ "\red You knock down the APC cover with your [W.name]!", \ "You hear bang") updateicon() else + if (istype(user, /mob/living/silicon)) + return src.attack_hand(user) user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \ "\red You hit the [src.name] with your [W.name]!", \ "You hear bang") @@ -478,7 +479,7 @@ return if(wiresexposed && (!istype(user, /mob/living/silicon))) user.machine = src - var/t1 = text("Access Panel
\n") + var/t1 = text("[area.name] APC wiresAccess Panel
\n") var/list/apcwires = list( "Orange" = 1, "Dark red" = 2, @@ -495,7 +496,7 @@ t1 += "Pulse " t1 += "
" t1 += text("
\n[(src.locked ? "The APC is locked." : "The APC is unlocked.")]
\n[(src.shorted ? "The APCs power has been shorted." : "The APC is working properly!")]
\n[(src.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") - t1 += text("

Close

\n") + t1 += text("

Close

") user << browse(t1, "window=apcwires") onclose(user, "apcwires") @@ -868,6 +869,7 @@ if (src.z == 1) ticker.mode:apcs++ src.malfai = usr + src.locked = 1 if (src.cell) if (src.cell.charge > 0) src.cell.charge = 0 diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index 808a6ef3135c1cd9f9f38ea4c9c227b3d2217909..3410ed93c89463e1bf3919e3cb3de6cceb64bb1d 100644 GIT binary patch literal 18246 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