diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 888524853d6..200c0a0a855 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -1,62 +1,112 @@ /obj/item/device/taperecorder - desc = "A device that can record up to an hour of dialogue and play it back. It automatically translates the content in playback." name = "universal recorder" - icon_state = "taperecorderidle" + desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback." + icon_state = "taperecorder_empty" item_state = "analyzer" - w_class = 1.0 + w_class = 2 + slot_flags = SLOT_BELT m_amt = 60 g_amt = 30 - var/emagged = 0.0 - var/recording = 0.0 - var/playing = 0.0 - var/timerecorded = 0.0 - var/playsleepseconds = 0.0 - var/list/storedinfo = new/list() - var/list/timestamp = new/list() + force = 2 + throwforce = 0 + var/recording = 0 + var/playing = 0 + var/playsleepseconds = 0 + var/obj/item/device/tape/mytape + var/open_panel = 0 + var/datum/wires/taperecorder/wires = null var/canprint = 1 - flags = CONDUCT - throwforce = 2 - throw_speed = 4 - throw_range = 20 -/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg) - if(recording) - var/ending = copytext(msg, length(msg)) - timestamp+= timerecorded - if(M.stuttering) - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] stammers, \"[msg]\"" + +/obj/item/device/taperecorder/New() + wires = new(src) + mytape = new /obj/item/device/tape/random(src) + update_icon() + + +/obj/item/device/taperecorder/examine() + set src in view(1) + ..() + usr << "The wire panel is [open_panel ? "opened" : "closed"]." + + +/obj/item/device/taperecorder/attackby(obj/item/I, mob/user) + if(!mytape && istype(I, /obj/item/device/tape)) + user.drop_item() + I.loc = src + mytape = I + user << "You insert [I] into [src]." + update_icon() + else if(istype(I, /obj/item/weapon/screwdriver)) + open_panel = !open_panel + user << "You [open_panel ? "open" : "close"] the wire panel." + if(open_panel) + wires.Interact(user) + else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler)) + wires.Interact(user) + + +/obj/item/device/taperecorder/proc/eject(mob/user) + if(mytape) + user << "You remove [mytape] from [src]." + stop() + user.put_in_hands(mytape) + mytape = null + update_icon() + + +/obj/item/device/taperecorder/attack_hand(mob/user) + if(loc == user) + if(mytape) + if(user.l_hand != src && user.r_hand != src) + ..() + return + eject(user) return - if(M.getBrainLoss() >= 60) - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] gibbers, \"[msg]\"" - return - if(ending == "?") - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] asks, \"[msg]\"" - return - else if(ending == "!") - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] exclaims, \"[msg]\"" - return - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] says, \"[msg]\"" + ..() + + +/obj/item/device/taperecorder/verb/ejectverb() + set name = "Eject Tape" + set category = "Object" + + if(usr.stat) + return + if(!mytape) return -/obj/item/device/taperecorder/emag_act(user as mob) - if(emagged == 0) - emagged = 1 - recording = 0 - user << "PZZTTPFFFT" - icon_state = "taperecorderidle" + eject(usr) + + +/obj/item/device/taperecorder/update_icon() + if(!mytape) + icon_state = "taperecorder_empty" + else if(recording) + icon_state = "taperecorder_recording" + else if(playing) + icon_state = "taperecorder_playing" else - user << "It is already emagged!" - -/obj/item/device/taperecorder/proc/explode() - var/turf/T = get_turf(loc) - if(ismob(loc)) - var/mob/M = loc - M << "\The [src] explodes!" - if(T) - T.hotspot_expose(700,125) - explosion(T, -1, -1, 0, 4) - del(src) - return + icon_state = "taperecorder_idle" + + +/obj/item/device/taperecorder/hear_talk(mob/living/M as mob, msg) + if(mytape && recording) + var/ending = copytext(msg, length(msg)) + mytape.timestamp += mytape.used_capacity + if(M.stuttering) + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] stammers, \"[msg]\"" + return + if(M.getBrainLoss() >= 60) + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] gibbers, \"[msg]\"" + return + if(ending == "?") + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] asks, \"[msg]\"" + return + else if(ending == "!") + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] exclaims, \"[msg]\"" + return + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] says, \"[msg]\"" + /obj/item/device/taperecorder/verb/record() set name = "Start Recording" @@ -64,25 +114,35 @@ if(usr.stat) return - if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." + if(!mytape || mytape.ruined) return - icon_state = "taperecorderrecording" - if(timerecorded < 3600 && playing == 0) + if(recording) + return + if(playing) + return + if(!wires.get_record()) + return + + if(mytape.used_capacity < mytape.max_capacity) usr << "Recording started." recording = 1 - timestamp+= timerecorded - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording started." - for(timerecorded, timerecorded<3600) + update_icon() + mytape.timestamp += mytape.used_capacity + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording started." + var/used = mytape.used_capacity //to stop runtimes when you eject the tape + var/max = mytape.max_capacity + for(used, used < max) if(recording == 0) break - timerecorded++ + if(!wires.get_record()) + break + mytape.used_capacity++ + used++ sleep(10) recording = 0 - icon_state = "taperecorderidle" - return + update_icon() else - usr << "Either your tape recorder's memory is full, or it is currently playing back its memory." + usr << "The tape is full." /obj/item/device/taperecorder/verb/stop() @@ -91,101 +151,76 @@ if(usr.stat) return - if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." - return - if(recording == 1) + + if(recording) recording = 0 - timestamp+= timerecorded - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording stopped." + mytape.timestamp += mytape.used_capacity + mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording stopped." usr << "Recording stopped." - icon_state = "taperecorderidle" return - else if(playing == 1) + else if(playing) playing = 0 var/turf/T = get_turf(src) T.visible_message("Tape Recorder: Playback stopped.") - icon_state = "taperecorderidle" - return + update_icon() -/obj/item/device/taperecorder/verb/clear_memory() - set name = "Clear Memory" +/obj/item/device/taperecorder/verb/play() + set name = "Play Tape" set category = "Object" if(usr.stat) return - if(emagged == 1) - usr << "The tape recorder makes a scratchy noise." + if(!mytape || mytape.ruined) return - if(recording == 1 || playing == 1) - usr << "You can't clear the memory while playing or recording!" + if(recording) return - else - if(storedinfo) storedinfo.Cut() - if(timestamp) timestamp.Cut() - timerecorded = 0 - usr << "Memory cleared." + if(playing) + return + if(!wires.get_play()) return - -/obj/item/device/taperecorder/verb/playback_memory() - set name = "Playback Memory" - set category = "Object" - - if(usr.stat) - return - if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." - return - if(recording == 1) - usr << "You can't playback when recording!" - return - if(playing == 1) - usr << "You're already playing!" - return playing = 1 - icon_state = "taperecorderplaying" + update_icon() usr << "Playing started." - for(var/i=1,timerecorded<3600,sleep(10 * (playsleepseconds) )) + var/used = mytape.used_capacity //to stop runtimes when you eject the tape + var/max = mytape.max_capacity + for(var/i = 1, used < max, sleep(10 * playsleepseconds)) + if(!mytape) + break + if(!wires.get_play()) + break if(playing == 0) break - if(storedinfo.len < i) + if(mytape.storedinfo.len < i) break var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: [storedinfo[i]]") - if(storedinfo.len < i+1) + T.visible_message("Tape Recorder: [mytape.storedinfo[i]]") + if(mytape.storedinfo.len < i + 1) playsleepseconds = 1 sleep(10) T = get_turf(src) T.visible_message("Tape Recorder: End of recording.") else - playsleepseconds = timestamp[i+1] - timestamp[i] + playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i] if(playsleepseconds > 14) sleep(10) T = get_turf(src) T.visible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence") playsleepseconds = 1 i++ - icon_state = "taperecorderidle" + playing = 0 - if(emagged == 1.0) - var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: This tape recorder will self-destruct in... Five.") - sleep(10) - T = get_turf(src) - T.visible_message("Tape Recorder: Four.") - sleep(10) - T = get_turf(src) - T.visible_message("Tape Recorder: Three.") - sleep(10) - T = get_turf(src) - T.visible_message("Tape Recorder: Two.") - sleep(10) - T = get_turf(src) - T.visible_message("Tape Recorder: One.") - sleep(10) - explode() + update_icon() + + +/obj/item/device/taperecorder/attack_self(mob/user) + if(!mytape || mytape.ruined) + return + if(recording) + stop() + else + record() /obj/item/device/taperecorder/verb/print_transcript() @@ -194,68 +229,74 @@ if(usr.stat) return - if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." + if(!mytape) return if(!canprint) usr << "The recorder can't print that fast!" return - if(recording == 1 || playing == 1) - usr << "You can't print the transcript while playing or recording!" + if(recording || playing) return + usr << "Transcript printed." var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) var/t1 = "Transcript:

" - for(var/i=1,storedinfo.len >= i,i++) - t1 += "[storedinfo[i]]
" + for(var/i = 1, mytape.storedinfo.len >= i, i++) + t1 += "[mytape.storedinfo[i]]
" P.info = t1 P.name = "paper- 'Transcript'" + usr.put_in_hands(P) canprint = 0 sleep(300) canprint = 1 -/obj/item/device/taperecorder/attack_self(mob/user) - if(recording == 0 && playing == 0) - if(usr.stat) - return - if(emagged == 1) - usr << "\red The tape recorder makes a scratchy noise." - return - icon_state = "taperecorderrecording" - if(timerecorded < 3600 && playing == 0) - usr << "\blue Recording started." - recording = 1 - timestamp+= timerecorded - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording started." - for(timerecorded, timerecorded<3600) - if(recording == 0) - break - timerecorded++ - sleep(10) - recording = 0 - icon_state = "taperecorderidle" - return - else - usr << "\red Either your tape recorder's memory is full, or it is currently playing back its memory." - else - if(usr.stat) - usr << "Not when you're incapacitated." - return - if(recording == 1) - recording = 0 - timestamp+= timerecorded - storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] Recording stopped." - usr << "\blue Recording stopped." - icon_state = "taperecorderidle" - return - else if(playing == 1) - playing = 0 - var/turf/T = get_turf(src) - for(var/mob/O in hearers(world.view-1, T)) - O.show_message("Tape Recorder: Playback stopped.",2) - icon_state = "taperecorderidle" - return - else - usr << "\red Stop what?" - return \ No newline at end of file +//empty tape recorders +/obj/item/device/taperecorder/empty/New() + wires = new(src) + return + + +/obj/item/device/tape + name = "tape" + desc = "A magnetic tape that can hold up to ten minutes of content." + icon_state = "tape_white" + item_state = "analyzer" + w_class = 1 + m_amt = 20 + g_amt = 5 + force = 1 + throwforce = 0 + var/max_capacity = 600 + var/used_capacity = 0 + var/list/storedinfo = list() + var/list/timestamp = list() + var/ruined = 0 + + +/obj/item/device/tape/attack_self(mob/user) + if(!ruined) + user << "You pull out all the tape!" + ruin() + + +/obj/item/device/tape/proc/ruin() + overlays += "ribbonoverlay" + ruined = 1 + + +/obj/item/device/tape/proc/fix() + overlays -= "ribbonoverlay" + ruined = 0 + + +/obj/item/device/tape/attackby(obj/item/I, mob/user) + if(ruined && istype(I, /obj/item/weapon/screwdriver)) + user << "You start winding the tape back in." + if(do_after(user, 120)) + user << "You wound the tape back in!" + fix() + + +//Random colour tapes +/obj/item/device/tape/random/New() + icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" \ No newline at end of file diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index d3030eec675..a1f332ee161 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -166,7 +166,7 @@ name = "security hailer" desc = "A set of recognizable pre-recorded messages for cyborgs to use when apprehending criminals." icon = 'icons/obj/device.dmi' - icon_state = "taperecorderidle" + icon_state = "taperecorder_idle" aggressiveness = 1 //Borgs are nicecurity! ignore_maskadjust = 1 diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index aac7a1be922..2cce7c7475d 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -9,7 +9,7 @@ materials = list("$metal" = 30, "$glass" = 20) build_path = /obj/item/device/analyzer category = list("initial","Tools") - + /datum/design/bucket name = "Bucket" id = "bucket" @@ -25,7 +25,7 @@ materials = list("$metal" = 50) build_path = /obj/item/weapon/crowbar category = list("initial","Tools") - + /datum/design/extinguisher name = "Fire Extinguisher" id = "extinguisher" @@ -49,7 +49,7 @@ materials = list("$metal" = 50, "$glass" = 20) build_path = /obj/item/device/multitool category = list("initial","Tools") - + /datum/design/screwdriver name = "Screwdriver" id = "screwdriver" @@ -72,8 +72,8 @@ build_type = AUTOLATHE materials = list("$metal" = 1750, "$glass" = 400) build_path = /obj/item/clothing/head/welding - category = list("initial","Tools") - + category = list("initial","Tools") + /datum/design/weldingtool name = "Welding Tool" id = "welding_tool" @@ -104,16 +104,16 @@ build_type = AUTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = /obj/item/weapon/airalarm_electronics - category = list("initial", "Electronics") - + category = list("initial", "Electronics") + /datum/design/airlock_board name = "Airlock Electronics" id = "airlock_board" build_type = AUTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = /obj/item/weapon/airlock_electronics - category = list("initial", "Electronics") - + category = list("initial", "Electronics") + /datum/design/console_screen name = "Console Screen" id = "console_screen" @@ -128,7 +128,7 @@ build_type = AUTOLATHE materials = list("$metal" = 50, "$glass" = 50) build_path = /obj/item/weapon/firealarm_electronics - category = list("initial", "Electronics") + category = list("initial", "Electronics") /datum/design/igniter name = "Igniter" @@ -137,7 +137,7 @@ materials = list("$metal" = 500, "$glass" = 50) build_path = /obj/item/device/assembly/igniter category = list("initial", "Miscellaneous") - + /datum/design/infrared_emitter name = "Infrared Emitter" id = "infrared_emitter" @@ -145,15 +145,15 @@ materials = list("$metal" = 1000, "$glass" = 500) build_path = /obj/item/device/assembly/infra category = list("initial", "Miscellaneous") - + /datum/design/kitchen_knife name = "Kitchen knife" id = "kitchen_knife" build_type = AUTOLATHE materials = list("$metal" = 12000) build_path = /obj/item/weapon/kitchenknife - category = list("initial","Miscellaneous") - + category = list("initial","Miscellaneous") + /datum/design/pipe_painter name = "Pipe Painter" id = "pipe_painter" @@ -161,15 +161,15 @@ materials = list("$metal" = 5000, "$glass" = 2000) build_path = /obj/item/device/pipe_painter category = list("initial", "Miscellaneous") - + /datum/design/prox_sensor name = "Proximity Sensor" id = "prox_sensor" build_type = AUTOLATHE materials = list("$metal" = 800, "$glass" = 200) build_path = /obj/item/device/assembly/prox_sensor - category = list("initial", "Miscellaneous") - + category = list("initial", "Miscellaneous") + /datum/design/timer name = "Timer" id = "timer" @@ -183,9 +183,17 @@ id = "recorder" build_type = AUTOLATHE materials = list("$metal" = 60, "$glass" = 30) - build_path = /obj/item/device/taperecorder - category = list("initial", "Miscellaneous") - + build_path = /obj/item/device/taperecorder/empty + category = list("initial", "Miscellaneous") + +/datum/design/tape + name = "Tape" + id = "tape" + build_type = AUTOLATHE + materials = list("$metal" = 20, "$glass" = 5) + build_path = /obj/item/device/tape/random + category = list("initial", "Miscellaneous") + /datum/design/voice_analyser name = "Voice Analyser" id = "voice_analyser" @@ -200,8 +208,8 @@ build_type = AUTOLATHE materials = list("$metal" = 400, "$glass" = 250) build_path = /obj/item/weapon/camera_assembly - category = list("initial", "Construction") - + category = list("initial", "Construction") + /datum/design/glass name = "Glass" id = "glass" @@ -216,16 +224,16 @@ build_type = AUTOLATHE materials = list("$metal" = 60, "$glass" = 100) build_path = /obj/item/weapon/light/bulb - category = list("initial", "Construction") - + category = list("initial", "Construction") + /datum/design/light_tube name = "Light Tube" id = "light_tube" build_type = AUTOLATHE materials = list("$metal" = 60, "$glass" = 100) build_path = /obj/item/weapon/light/tube - category = list("initial", "Construction") - + category = list("initial", "Construction") + /datum/design/metal name = "Metal" id = "metal" @@ -233,7 +241,7 @@ materials = list("$metal" = 3750) build_path = /obj/item/stack/sheet/metal category = list("initial","Construction") - + /datum/design/newscaster_frame name = "Newscaster Frame" id = "newscaster_frame" @@ -248,8 +256,8 @@ build_type = AUTOLATHE materials = list("$metal" = 16000, "$glass"=8000) build_path = /obj/item/weapon/rcd_ammo - category = list("initial","Construction") - + category = list("initial","Construction") + /datum/design/rglass name = "Reinforced Glass" id = "rglass" @@ -265,7 +273,7 @@ materials = list("$metal" = 1875) build_path = /obj/item/stack/rods category = list("initial","Construction") - + /datum/design/beaker name = "Beaker" id = "beaker" @@ -280,16 +288,16 @@ build_type = AUTOLATHE materials = list("$metal" = 2500, "$glass" = 750) build_path = /obj/item/weapon/cautery - category = list("initial", "Medical") - + category = list("initial", "Medical") + /datum/design/circular_saw name = "Circular Saw" id = "circular_saw" build_type = AUTOLATHE materials = list("$metal" = 10000, "$glass" = 6000) build_path = /obj/item/weapon/circular_saw - category = list("initial", "Medical") - + category = list("initial", "Medical") + /datum/design/hemostat name = "Hemostat" id = "hemostat" @@ -297,7 +305,7 @@ materials = list("$metal" = 5000, "$glass" = 2500) build_path = /obj/item/weapon/hemostat category = list("initial", "Medical") - + /datum/design/large_beaker name = "Large Beaker" id = "large_beaker" @@ -313,7 +321,7 @@ materials = list("$metal" = 6000, "$glass" = 3000) build_path = /obj/item/weapon/retractor category = list("initial", "Medical") - + /datum/design/scalpel name = "Scalpel" id = "scalpel" @@ -329,7 +337,7 @@ materials = list("$metal" = 10000, "$glass" = 6000) build_path = /obj/item/weapon/surgicaldrill category = list("initial", "Medical") - + /datum/design/syringe name = "Syringe" id = "syringe" @@ -360,8 +368,8 @@ build_type = AUTOLATHE materials = list("$metal" = 75) build_path = /obj/item/device/radio/headset - category = list("initial", "Communication") - + category = list("initial", "Communication") + /datum/design/signaler name = "Remote Signaling Device" id = "signaler" @@ -401,8 +409,8 @@ build_type = AUTOLATHE materials = list("$metal" = 30000) build_path = /obj/item/ammo_box/c9mm - category = list("hacked", "Security") - + category = list("hacked", "Security") + /datum/design/c10mm name = "Ammo Box (10mm)" id = "c10mm" @@ -410,7 +418,7 @@ materials = list("$metal" = 30000) build_path = /obj/item/ammo_box/c10mm category = list("hacked", "Security") - + /datum/design/buckshot_shell name = "Buckshot Shell" id = "buckshot_shell" @@ -418,7 +426,7 @@ materials = list("$metal" = 4000) build_path = /obj/item/ammo_casing/shotgun/buckshot category = list("hacked", "Security") - + /datum/design/electropack name = "Electropack" id = "electropack" @@ -426,7 +434,7 @@ materials = list("$metal" = 10000, "$glass" = 2500) build_path = /obj/item/device/radio/electropack category = list("hacked", "Tools") - + /datum/design/flamethrower name = "Flamethrower" id = "flamethrower" @@ -434,7 +442,7 @@ materials = list("$metal" = 500) build_path = /obj/item/weapon/flamethrower/full category = list("hacked", "Security") - + /datum/design/handcuffs name = "Handcuffs" id = "handcuffs" @@ -442,7 +450,7 @@ materials = list("$metal" = 500) build_path = /obj/item/weapon/restraints/handcuffs category = list("hacked", "Security") - + /datum/design/incendiary_slug name = "Incendiary Slug" id = "incendiary_slug" @@ -457,8 +465,8 @@ build_type = AUTOLATHE materials = list("$metal" = 70, "$glass" = 60) build_path = /obj/item/weapon/weldingtool/largetank - category = list("hacked", "Tools") - + category = list("hacked", "Tools") + /datum/design/rcd name = "Rapid Construction Device (RCD)" id = "rcd" @@ -473,8 +481,8 @@ build_type = AUTOLATHE materials = list("$metal" = 4000) build_path = /obj/item/ammo_casing/shotgun/dart - category = list("hacked", "Security") - + category = list("hacked", "Security") + /datum/design/shotgun_slug name = "Shotgun Slug" id = "shotgun_slug" @@ -482,4 +490,3 @@ materials = list("$metal" = 4000) build_path = /obj/item/ammo_casing/shotgun category = list("hacked", "Security") - \ No newline at end of file diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 374d95f9bc1..d74ab34b256 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/paradise.dme b/paradise.dme index a8a7f41df4c..03fe6fa4c30 100644 --- a/paradise.dme +++ b/paradise.dme @@ -253,6 +253,7 @@ #include "code\datums\wires\radio.dm" #include "code\datums\wires\robot.dm" #include "code\datums\wires\syndicatebomb.dm" +#include "code\datums\wires\taperecorder.dm" #include "code\datums\wires\vending.dm" #include "code\datums\wires\wires.dm" #include "code\defines\obj.dm"