/obj/item/device/taperecorder name = "universal recorder" 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 = 2 slot_flags = SLOT_BELT m_amt = 60 g_amt = 30 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 /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 ..() /obj/item/device/taperecorder/verb/ejectverb() set name = "Eject Tape" set category = "Object" if(usr.stat) return if(!mytape) return 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 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" set category = "Object" if(usr.stat) return if(!mytape || mytape.ruined) return if(recording) return if(playing) return if(!wires.get_record()) return if(mytape.used_capacity < mytape.max_capacity) usr << "Recording started." recording = 1 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 if(!wires.get_record()) break mytape.used_capacity++ used++ sleep(10) recording = 0 update_icon() else usr << "The tape is full." /obj/item/device/taperecorder/verb/stop() set name = "Stop" set category = "Object" if(usr.stat) return if(recording) recording = 0 mytape.timestamp += mytape.used_capacity mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording stopped." usr << "Recording stopped." return else if(playing) playing = 0 var/turf/T = get_turf(src) T.visible_message("Tape Recorder: Playback stopped.") update_icon() /obj/item/device/taperecorder/verb/play() set name = "Play Tape" set category = "Object" if(usr.stat) return if(!mytape || mytape.ruined) return if(recording) return if(playing) return if(!wires.get_play()) return playing = 1 update_icon() usr << "Playing started." 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(mytape.storedinfo.len < i) break var/turf/T = get_turf(src) 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 = 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++ playing = 0 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() set name = "Print Transcript" set category = "Object" if(usr.stat) return if(!mytape) return if(!canprint) usr << "The recorder can't print that fast!" return 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, 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 //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")]"