//Moon related contents: //Moon Areas //Moon turfs //Moon emails //A tourguid bud //Museum objects //Some kind of control panel puzzle thing ??? //A li'l fake bomb for an exhibit. #define MOON_IS_LIVE /area/moon name = "moon" icon_state = "blue" filler_turf = "/turf/unsimulated/floor/lunar" requires_power = 0 RL_Lighting = 1 luminosity = 1 RL_AmbientRed = 0.9 RL_AmbientGreen = 0.9 RL_AmbientBlue = 0.9 var/list/lunar_fx_sounds = list('sound/ambience/ambiatm1.ogg','sound/ambience/ambicomp2.ogg', 'sound/ambience/ambicomp3.ogg') /area/moon/museum name = "Museum of Lunar History" icon_state = "purple" luminosity = 0 RL_AmbientRed = 0.5 RL_AmbientGreen = 0.5 RL_AmbientBlue = 0.5 var/sound/ambientSound = 'sound/ambience/lavamoon_interior_amb1.ogg' var/list/fxlist = null var/list/soundSubscribers = null New() ..() fxlist = lunar_fx_sounds if (ambientSound) spawn (60) var/sound/S = new/sound() S.file = ambientSound S.repeat = 0 S.wait = 0 S.channel = 123 S.volume = 60 S.priority = 255 S.status = SOUND_UPDATE ambientSound = S soundSubscribers = list() process() Entered(atom/movable/Obj,atom/OldLoc) ..() if(ambientSound && ismob(Obj)) if (!soundSubscribers:Find(Obj)) soundSubscribers += Obj return proc/process() if (!soundSubscribers) return var/sound/S = null var/sound_delay = 0 while(ticker && ticker.current_state < GAME_STATE_FINISHED) sleep(60) if(prob(10) && fxlist) S = sound(file=pick(fxlist), volume=50) sound_delay = rand(0, 50) else S = null continue for(var/mob/living/H in soundSubscribers) var/area/mobArea = get_area(H) if (!istype(mobArea) || mobArea.type != src.type) soundSubscribers -= H if (H.client) ambientSound.status = SOUND_PAUSED | SOUND_UPDATE ambientSound.volume = 0 H << ambientSound continue if(H.client) ambientSound.status = SOUND_UPDATE ambientSound.volume = 60 H << ambientSound if(S) spawn(sound_delay) H << S /area/moon/museum/west icon_state = "red" /area/moon/museum/giftshop icon_state = "green" /turf/unsimulated/floor/lunar name = "lunar surface" desc = "Regolith. Wait, isn't moon dust actually really sticky, just from how incredibly dry it is?" icon_state = "lunar" carbon_dioxide = 0 nitrogen = 0 oxygen = 0 RL_Ignore = 1 New() ..() //icon_state = "moon[rand(1,3)]" /turf/unsimulated/wall/setpieces/lunar name = "moon rock" desc = "More regolith, now in big solid chunk form!" icon = 'icons/turf/walls.dmi' icon_state = "lunar" carbon_dioxide = 0 nitrogen = 0 oxygen = 0 RL_Ignore = 1 /turf/unsimulated/wall/setpieces/leadwall/white/lunar name = "Shielded Wall" desc = "Painted white, of course." /turf/unsimulated/wall/setpieces/leadwindow/white name = "Shielded Wall" desc = "Painted white, of course." icon_state = "leadwindow_white_1" /datum/computer/file/record/moon_mail New() ..() src.name = "[copytext("\ref[src]", 4, 12)]GENERIC" renovation_it New() ..() fields = list("MLH_INTERNAL", "*ALL", "HJANSSENAA@WMLH", "JWILLETMM@WMLH", "MEDIUM", "Network Outages", "Due to the ongoing renovations, connections between museum sections may be temporarily disrupted.", "This includes connections to the central mainframe. Local control systems will remain operative.", "We apologize for the inconvenience.", "Regards", "Harold Janssen", "World Museum of Lunar History Information Technology Services") no_journalists New() ..() fields = list("MLH_INTERNAL", "*SEC", "LOCALHOST", "JWILLETMM@WMLH", "HIGH", "SECURITY LEVEL ELEVATED", "The security level has been automatically elevated to GUARDED", "due to arrival of potential threat agent.", "Threat agent designation: Hartman, Wallace A. ", " DOB: 03/12/04", " OCCUPATION: Journalist", " Reason for inclusion in threat agent database:", " Production of articles unfavorable to NT corporate interests", " May attempt to produce material detrimental to museum profitability", "", "Recommended action: Detention of agent and confiscation of recording materials.") no_radicals New() ..() fields = list("MLH_INTERNAL", "*SEC", "LOCALHOST", "JWILLETMM@WMLH", "HIGH", "SECURITY LEVEL ELEVATED", "The security level has been automatically elevated to GUARDED", "due to arrival of potential threat agent.", "Threat agent designation: Leary, Samantha H. ", " DOB: 11/21/22", " OCCUPATION: Office Worker", " Reason for inclusion in threat agent database:", " Participation in leftist / anticorporate group WEATHER OUTERSPACE", " Production of material expressing these views as recently as:07 MAY 2045", "", "Recommended action: Detention of agent.") ex_employee New() fields = list("MLH_INTERNAL", "*SEC", "LOCALHOST", "JWILLETMM@WMLH", "HIGH", "SECURITY LEVEL ELEVATED", "The security level has been automatically elevated to GUARDED", "due to arrival of potential threat agent.", "Threat agent designation: Sullivan, Gerald D. ", " DOB: 08/01/17", " OCCUPATION: UNEMPLOYED", " Reason for inclusion in threat agent database:", " Former museum employee. Employment terminated 07/31/52 due", " to budget cuts.", " May make revenge attempt.", "", "Recommended action: Monitor agent, full measures authorized if", "agent turns violent or attempts to enter secure area.") saw_a_thing New() ..() fields = list("MLH_GENERAL", "*SEC", "SHUGHESAF@WMLH", "JWILLETMM@WMLH", "LOW", "something fucked up", "johnny, i just saw something fucked up and I don't know who to talk to", "okay, so I'm in the booth, right, and the only person outside is this suit", "inspecting the renovations, this tiny indian chick", "i'm only half paying attention and then CRASH and I look out and a bunch of", "gantry shit has fallen on her and like there's this rebar going through her", "shoulder. I'm all \"oh shit\" and reach for the call button but then she", "just kinda pulls it out?? like, calmly pulls out this fuckin jagged rebar", "that's taller than she is? And its not the craziest part, like, she has this", "hole in her shoulder and then all the fuckin blood just sucks back into it", "and the hole is fuckin gone like nothing even happened", "", "jesus christ im glad the booth window is dark tinted because i don't", "think she knew I was there", "what kind of fuckin monster am I stuck in here with") saw_a_thing2 New() ..() fields = list("MLH_GENERAL", "*SEC", "SHUGHESAF@WMLH", "JWILLETMM@WMLH", "LOW", "re: re: something fucked up", "what do you mean 'yeah but is she cute' you dumb fucker") weird_guest New() ..() fields = list("MLH_GENERAL", "*ALL", "ZGARRETTFN@WMLH", "JWILLETMM@WMLH", "LOW", "Pretty Weird Guest", "Hey Johnny, it's a shame you're on first shift because we just had the weirdest", "fucker come by. Dude came in dressed like some kind of hobo biker or whatever,", "absolutely reeking of cheap booze. We fixed him up for a \"random\" search and", "jesus christ the dude was like a noah's ark of narcotics. But here's the weird", "part: He had an NT employee ID on him, though it looked like he left it in a", "bathtub for a week, and hey the thing still scanned...and the computer refused", "to show any information, it's all confidential (???), and we were told to let him", "go. He staggered around for an hour mumbling to himself and I swear that every", "security camera was locked on him the whole time.", "Maybe this was a test and he's from some kinda secret shopper kinda thing? For", "security? I have no fuckin idea.", "", "Anyway, see you at the tournament. Laters, Zack.") weirder_guest New() ..() fields = list("MLH_GENERAL", "*ALL", "ZGARRETTFN@WMLH", "JWILLETMM@WMLH", "LOW", "Another Weirdo", "Hey Johnny, I must be cursed or something because another weirdo showed up.", "Some dude in a torn white straightjacket thing, ranting about angels and ", "screaming. Maybe an escaped mental patient, but the weird thing is that he", "showed up inside a sealed exhibit. We got him out and took him to the", "holding room. Here's the even weirder thing: we left him in there alone for", "like 30 seconds, and he just disappeared. Not escaped, disappeared. From a", "locked room. We're going to go over the security tapes, but he's not in the", "museum. What's up with all this spooky shit lately?") /obj/item/disk/data/fixed_disk/lunar New() ..() var/datum/computer/folder/currentFolder = new /datum/computer/folder {name="mails";} (src) src.root.add_file(currentFolder) currentFolder.add_file( new /datum/computer/file/record/moon_mail/renovation_it (src) ) currentFolder.add_file( new /datum/computer/file/record/moon_mail/no_journalists (src) ) currentFolder.add_file( new /datum/computer/file/record/moon_mail/no_radicals (src) ) currentFolder.add_file( new /datum/computer/file/record/moon_mail/ex_employee (src) ) currentFolder.add_file( new /datum/computer/file/record/moon_mail/saw_a_thing (src) ) currentFolder.add_file( new /datum/computer/file/record/moon_mail/saw_a_thing2 (src) ) currentFolder.add_file( new /datum/computer/file/record/moon_mail/weird_guest (src) ) currentFolder.add_file( new /datum/computer/file/record/moon_mail/weirder_guest (src) ) currentFolder = new /datum/computer/folder {name="bin";} (src) src.root.add_file(currentFolder) currentFolder.add_file( new /datum/computer/file/terminal_program/email (src) ) src.root.add_file( new /datum/computer/file/terminal_program/secure_records {req_access = list(999);} (src) ) /obj/machinery/computer3/generic/lunarsec name = "Security computer" icon_state = "datasec" base_icon_state = "datasec" setup_drive_type = /obj/item/disk/data/fixed_disk/lunar setup_starting_peripheral1 = /obj/item/peripheral/network/powernet_card #ifndef MOON_IS_LIVE New() ..() qdel(src) #endif /obj/item/audio_tape/lunar_01 New() ..() messages = list("This the stuff from that journo?", "Yeah, you want anything? You, uh, have any interest in photography?", "How about a nice microphone? Your kid still have that band?", "Ugh, yeah. \"Thanks for the microphone, dad, now let me sing about how totally unfair and lame you are all the time.\"", "No thanks.", "So, did you hear that they're going to try and, uh, move the Channel closer to Earth?", "Can they even do that? How the hell do you move a wormhole?", "I sucked at high school physics but that just sounds like it breaks some rule.", "Well, it's got those solid bits generating it or whatever, don't it? Maybe they pull that?", "I hope they don't, personally. Who the hell is going to come to the moon if they can go right through to a goddamn plasma goldmine without travelling for months?", "Maybe they want to see the, um. Fuck if I know, man.") speakers = list("Male voice", "Other male voice", "Other male voice", "Male voice", "Male voice", "Other male voice", "Male voice", "Male voice", "Other male voice", "Other male voice", "Male voice") /obj/item/device/audio_log/lunar_01 New() ..() src.tape = new /obj/item/audio_tape/lunar_01(src) /obj/machinery/bot/guardbot/old/tourguide/lunar name = "Molly" desc = "A PR-4 Robuddy. These are pretty old, guess the museum doesn't change often. This one has a little name tag on the front labeled 'Molly'" setup_default_startup_task = /datum/computer/file/guardbot_task/tourguide/lunar no_camera = 1 setup_charge_maximum = 3000 setup_charge_percentage = 100 flashlight_lum = 4 New() ..() #ifndef MOON_IS_LIVE del(src) #endif spawn (10) if (src.botcard) src.botcard.access += 999 //"Oh, hello! I apologize, I wasn't expecting guests before the renovations were done! Welcome to the Museum of Lunar History!" //"Before we begin, there is a request that all guests from Soviet bloc countries move down the hall to my right for special screening." //"This, um, includes those from Zvezda. Even if you have a day pass. I'm sorry, I hope this isn't too much of a bother!" //"Nanotrasen employees may be eligible for an employee discount. Now checking Museum Central, please hold..." //"Oh, I'm sorry. Your position is not eligible. Actually, um, well this is weird." //"There is a log indicating that all employees of Research Station #13 are to be charged 10% extra. I've never seen that before. Huh." //"FAAE or, as it is commonly called, Plasma, was first discovered here on the moon in 1969." //"It's not actually native to the moon, though! It was discovered embedded in the site of a meteorite impact." //"This is the actual, genuine recreation of the site where Neil Armstrong first walked on the moon! Of course, it now sits much lower due to extensive strip mining." //"As you have selected the surface tour option, we will get to walk in Neil's reconstructed footprints! Wow! Please, ensure your helmets are latched and follow me through the airlock in an orderly manner!" //"This is a model of the NASA LESA base, the first permanent lunar base. Construction finished in fall 1971 and it wasn't decommissioned until 1996!" //"It was the main site for plasma mining before Nanotrasen received mineral rights." //"I hope I'm around for the centennial!" //"This is Yuri Gagarin, the first man to go to outer space. He orbited the Earth on April 12, 1961. He um, died. MOVING ON" //"This exhibit remembers the 2004 Lunar Port Hostage Crisis, where the primary spaceport was seized for a terrifying four days by the Space Irish Republican Army.|pIn the aftermath, laws were passed boosting the size and capability of corporate security forces--boosting our safety without violating the 1967 Outer Space Treaty!" /obj/machinery/navbeacon/lunar name = "tour beacon" freq = 1441 tour0 name = "tour beacon - start" location = "tour0" codes_txt = "tour;next_tour=tour1;desc=Oh, hello! I apologize, I wasn't expecting guests before the renovations were done! Welcome to the Museum of Lunar History!\nBefore we begin, there is a request that all guests from Soviet bloc countries move down the hall to my right for special screening.\nThis, um, includes those from Zvezda. Even if you have a day pass. I'm sorry, I hope this isn't too much of a bother!" tour1 location = "tour1" codes_txt = "tour;next_tour=tour2;desc=FAAE or, as it is commonly called, Plasma, was first discovered here on the moon in 1969.\nIt's not actually native to the moon, though! It was discovered embedded in the site of a meteorite impact, extending down really far, almost like it grew outward!|pBut it didn't, because plasma crystals can't grow, ha ha..|pIt makes sense that more plasma was found in the asteroid belt. Oh, and through the Channel, um, as much as weird holes in space time make sense." tour2 location = "tour2" codes_txt = "tour;next_tour=tour3;desc=Lunar plasma deposits were almost entirely in crystalline form. Mining efforts went pretty slowly before Nanotrasen arrived!" tour3 location = "tour3" codes_txt = "tour;next_tour=tour4;desc=Nanotrasen, then the newly-diversifying National Notary Supply Company, first acquired plasma samples from the Apollo missions through connections to this man, the visionary Victor Jam, head of the Senate Committee on Aeronau--|pOh, um, I guess this is down for renovations. Nevermind." tour4 location = "tour4" codes_txt = "tour;next_tour=tour5;desc=This is the site of our star exhibit, the Apollo 11 Experience! Well, it will be the star when renovations are done and it has more displays and material. Eventually.|pI'm really sorry that it isn't done yet. Did I mention that?" tour5 location = "tour5" codes_txt = "tour;next_tour=tour6;desc=Outside that window is the actual, genuine recreation of the site where Neil Armstrong first walked on the moon! Of course, it now sits much lower due to extensive strip mining.|pAs you have selected the surface tour option, we will get to walk in Neil's reconstructed footprints! Wow! Please, ensure your helmets are latched and follow me through the airlock in an orderly manner!" tour6 location = "tour6" codes_txt = "tour;next_tour=tour7;desc=Again, please make sure your suit is secured! As I understand, air is kinda important." tour7 location = "tour7" New() var/goofy_story = pick_string("lunar.txt", "mary_stories") codes_txt = "tour;next_tour=tour8;desc=This is the lunar surf..oh! You probably can't hear me, being that we are outside and my audio systems aren't hooked to the radio. Ha ha. I guess I can just say anything I want now. [goofy_story]" ..() tour8 location = "tour8" codes_txt = "tour;next_tour=tour9;desc=Wow, That sure was fun! And nobody was hurt, which is important. Please disregard this message if anyone was hurt or did not have fun." tour9 location = "tour9" codes_txt = "tour;next_tour=tour10;desc=This is a model of the NASA LESA base, the first permanent lunar base. Construction finished in fall 1971 and it wasn't decommissioned until 1996!|pIt was the main site for plasma mining before Nanotrasen received mineral rights.|pThe base accomplished a great deal of scientific discovery and answered age-old questions, such as \"is the moon made of cheese?\" and \"is the moon full of tiny little men named Gary?\"" tour10 location = "tour10" codes_txt = "tour;next_tour=tour11;desc=Oh, um, I guess this compartment is sealed. And decompressed. Okay then. That just covers the spaceport that became the city. Nothing important..." tour11 location = "tour11" codes_txt = "tour;next_tour=tour12;desc=This is also normally open. And working. I'll try to get your ticket fees refunded because this is just completely unacceptable." tour12 location = "tour12" codes_txt = "tour;next_tour=tour13;desc=Oh, the Lunaport exhibits are still in this hall! Good!" tour13 location = "tour13" codes_txt = "tour;next_tour=tour14;desc=This exhibit remembers the 2004 Lunar Port Hostage Crisis, where the primary spaceport was seized for a terrifying four days by the Space Irish Republican Army.|pIn the aftermath, laws were passed boosting the size and capability of corporate security forces--boosting our safety without violating the 1967 Outer Space Treaty!" tour14 location = "tour14" codes_txt = "tour;next_tour=tour15;desc=This exhibit is on Wallace Jam, the longest-serving administrator of the Lunaport, during the economic boom times of 2001 to 2024. Please note the whimsical bag of jellybeans on his desk. He was known for throwing them at people." tour15 location = "tour15" codes_txt = "tour;next_tour=tour16;desc=This is the MNX-12, the first master computer of Lunaport, operational from the 2021 administration sector expansion until 2041. It managed a ton of tasks across the growing city.|pThis was Thinktronic Data System's first big contract with Nanotrasen! Fun fact: the first robuddy United States senator, Lloyd-019, started out working under MNX in 2031!" tour16 location = "tour16" codes_txt = "tour;next_tour=tour17;desc=This is Greg, also affectionately called \"Lousy Greg,\" beloved town character known for...laying down apparently? Um, maybe this would be a good time to hit the gift shop? Yes." tour17 location = "tour17" codes_txt = "tour;" #define NT_DISCOUNT 1 #define NT_CLOAKER 2 #define NT_OTHERGUIDE 4 #define NT_PONZI 8 #define NT_SPY 16 #define NT_BILL 32 #define NT_BEE 64 #define NT_SOLARIUM 128 #define NT_CHEGET 256 /datum/computer/file/guardbot_task/tourguide/lunar wait_for_guests = 1 look_for_neat_thing() if (istype(get_area(src.master), /area/solarium) && !(src.neat_things & NT_SOLARIUM)) src.neat_things |= NT_SOLARIUM master.speak("Huh, this place is weird! This is some ship and that's our sun, right?") if (prob(25)) spawn (10) if (master) master.speak("I, um, am going to need to go back to work. My shift isn't over yet.") return for (var/atom/movable/AM in view(7, master)) if (istype(AM, /mob/living/carbon/human)) var/mob/living/carbon/human/H = AM if (!(src.neat_things & NT_BILL) && cmptext(H.real_name, "shitty bill")) src.neat_things |= NT_BILL master.visible_message("[master] points at [H].") master.speak("Oh no, not you again. Uh, I mean...hey...guyyy.") if (!(src.neat_things & NT_DISCOUNT) && H.stat != 2 && (istype(H.wear_id, /obj/item/card/id) || (istype(H.wear_id, /obj/item/device/pda2) && H.wear_id:ID_card))) src.neat_things |= NT_DISCOUNT master.speak("Nanotrasen employees may be eligible for an employee discount. Now checking Museum Central, please hold...") spawn (15) if (master) master.speak("Oh, I'm sorry. Your position is not eligible. Actually, um, well this is weird.") sleep(8) if (master) master.speak("There is a log indicating that all employees of Research Station #13 are to be charged 10% extra. I've never seen that before. Huh.") return if (!(src.neat_things & NT_CLOAKER) && H.invisibility > 0) src.master.speak("This is a reminder that cloaking technology is illegal within the inner solar system. Please remain opaque to the visible spectrum as a courtesy to your fellow guests. Thanks!") src.neat_things |= NT_CLOAKER return if (!(src.neat_things & NT_PONZI) && (locate(/obj/item/spacecash/buttcoin) in AM.contents)) src.neat_things |= NT_PONZI src.master.speak("Um, I'm sorry [AM], we do not accept blockchain-based cryptocurrency as payment. You aren't one of those guys who yell about gold on the apollo flag or something, right?") H.unlock_medal("To the Moon!",1) return if (istype(AM, /obj/machinery/bot/guardbot) && AM != src.master) if (istype(AM, /obj/machinery/bot/guardbot/old/tourguide) && !(src.neat_things & NT_OTHERGUIDE)) src.neat_things |= NT_OTHERGUIDE src.master.visible_message("[master] nods professionally at [AM].
Well, really it's more of a shake from suddenly halting the drive motors, but you get the intent.") animate(master, pixel_x = -4, time = 10, loop = 1, easing = SINE_EASING) animate(pixel_x = 0, transform = matrix(10, MATRIX_ROTATE), time = 10, loop = 1, easing = SINE_EASING) animate(transform = matrix(-10, MATRIX_ROTATE), time = 10, loop = 1, easing = SINE_EASING) return if (istype(AM, /obj/critter/moonspy) && !(src.neat_things & NT_SPY)) src.neat_things |= NT_SPY master.visible_message("[master] points at [AM].") src.master.speak("Attention guests, there appears to be a coat rack or something available if needed.") spawn (10) if (src.master) src.master.speak("You know, because of all the coats that you are clearly wearing.") return if (istype(AM, /obj/critter/domestic_bee) && !(src.neat_things & NT_BEE)) src.neat_things |= NT_BEE master.visible_message("[master] points at [AM].") src.master.speak("Ah, a space bee! Space bees count as minors under 12 for the purposes of ticket pricing.") return if ((istype(AM, /obj/item/luggable_computer/cheget) || istype(AM, /obj/machinery/computer3/luggable/cheget)) && !(src.neat_things & NT_CHEGET)) src.neat_things |= NT_CHEGET src.master.speak("Huh, what's with the briefcase? Did that come out of the security annex? Somebody should probably call security or the embassy or something.") spawn (10) if (src.master) src.master.speak("I think they dealt with some kind of briefcase key the week before renovations started? There's some sad office worker out there right now.") return //wip return task_input(var/input) if (..()) return if (input == "broken_door") if (src.master.mover) src.master.mover.master = null //master mover master mover master mover help HELP src.master.mover = null master.moving = 0 sleep(10) src.master.speak("Uh. That isn't supposed to happen.") src.state = 0 //Yeah, let's find that route. spawn(10) if (src.master) src.master.speak("I guess we need to take another route. Please follow me.") src.state = 0 src.awaiting_beacon = 0 next_beacon_id = current_beacon_id src.task_act() #undef NT_DISCOUNT #undef NT_CLOAKER #undef NT_OTHERGUIDE #undef NT_PONZI #undef NT_SPY #undef NT_BILL #undef NT_BEE #undef NT_SOLARIUM #undef NT_CHEGET /obj/machinery/door/poddoor/blast/lunar name = "security door" desc = "A security door used to separate museum compartments." autoclose = 0 req_access_txt = "" /obj/machinery/door/poddoor/blast/lunar/tour isblocked() return (src.density && src.operating == -1) open(var/obj/callerDoor) if (src.operating == 1) //doors can still open when emag-disabled return if (!density) return 0 for (var/obj/machinery/door/poddoor/blast/lunar/tourDoor in orange(1, src)) if (tourDoor == callerDoor) continue spawn (0) tourDoor.open(src) if(!src.operating) //in case of emag src.operating = 1 flick("bdoor[doordir]c0", src) src.icon_state = "bdoor[doordir]0" sleep(10) src.density = 0 src.RL_SetOpacity(0) update_nearby_tiles() if(operating == 1) //emag again src.operating = 0 if(autoclose) spawn(150) autoclose() return 1 close(var/obj/callerDoor) if (src.operating) return if (src.density) return src.operating = 1 for (var/obj/machinery/door/poddoor/blast/lunar/tour/tourDoor in orange(1, src)) if (tourDoor == callerDoor) continue spawn (0) tourDoor.close(src) flick("bdoor[doordir]c1", src) src.icon_state = "bdoor[doordir]1" src.density = 1 if (src.visible) src.RL_SetOpacity(1) update_nearby_tiles() sleep(10) src.operating = 0 return attackby(obj/item/C as obj, mob/user as mob) src.add_fingerprint(user) return /obj/machinery/door/lunar_breakdoor name = "External Airlock" icon = 'icons/misc/lunar.dmi' icon_state = "breakairlock0" anchored = 1 density = 1 opacity = 1 autoclose = 0 cant_emag = 1 req_access = list(999) var/broken = 0 New() ..() UnsubscribeProcess() close() return isblocked() return broken open() if (src.broken) return src.broken = 1 playsound(src.loc, 'sound/machines/airlock_break_very_temp.ogg', 50, 1) spawn (0) flick("breakairlock1", src) src.icon_state = "breakairlock2" sleep (2) src.opacity = 0 sleep(6) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, src) s.start() pool(s) for (var/obj/machinery/door/airlock/otherDoor in view(7, src)) if (777 in otherDoor.req_access) otherDoor.req_access -= 777 var/obj/machinery/bot/guardbot/old/theTourguide = locate() in view(src) if (istype(theTourguide) && theTourguide.task) theTourguide.task.task_input("broken_door") /obj/decal/lunar_bootprint name = "Neil Armstrong's genuine lunar bootprint" desc = "The famous photographed bootprint is actually from Buzz Aldrin, but this is the genuine actual real replica of the FIRST step on the moon. A corner of another world that is forever mankind." anchored = 1 density = 0 layer = TURF_LAYER icon = 'icons/misc/lunar.dmi' icon_state = "footprint" pixel_x = -8 var/somebody_fucked_up = 0 attack_hand(mob/user as mob) if (!user) return if (user.loc != src.loc) boutput(user, "If you got really close, you could probably compare foot sizes.") return user.visible_message("[user] steps right into [src.name].", "You step into the footprint. Ha ha, oh man, your foot fits right into that!") if (!somebody_fucked_up) desc += " There's some total idiot fucker's footprint smooshed into the center." boutput(user, "OH FUCK you left your footprint over it! You fucked up a 90 year old famous footprint. You assumed it was covered in some kind of protective resin or something, shit!!") somebody_fucked_up = 1 /obj/decal/fakeobjects/moon_on_a_stick name = "Moon model" desc = "A really large mockup of the Earth's moon." icon = 'icons/misc/lunar64.dmi' icon_state = "moon" anchored = 1 density = 1 layer = MOB_LAYER + 1 New() ..() #ifndef MOON_IS_LIVE del(src) #endif var/image/stand = image('icons/misc/lunar.dmi', "moonstand") stand.pixel_x = 16 src.pixel_y = 24 stand.pixel_y = -24 stand.layer = OBJ_LAYER src.underlays += stand /obj/decal/fakeobjects/lunar_lander name = "Lunar module descent stage" desc = "The descent stage of the Apollo 11 lunar module, which landed the first astronauts on the moon." anchored = 1 density = 1 icon = 'icons/misc/lunar64.dmi' icon_state = "LEM" bound_height = 64 bound_width = 64 #ifndef MOON_IS_LIVE New () ..() del (src) #endif /obj/decal/fakeobjects/moonrock name = "moon rock" desc = "A piece of regolith. Or something. It is a heavy rock from the moon. These used to be worth more." icon = 'icons/misc/lunar.dmi' icon_state = "moonrock" anchored = 1 density = 1 #ifndef MOON_IS_LIVE New() ..() del(src) #endif /obj/critter/mannequin name = "mannequin" desc = "It's a dummy, dummy." icon = 'icons/misc/lunar.dmi' icon_state = "mannequin" atkcarbon = 0 atksilicon = 0 health = 10 firevuln = 1 //Typical store display mannequin has a styrofoam body and metal skeleton. Styrofoam /burns/ brutevuln = 0.5 aggressive = 0 defensive = 0 wanderer = 0 generic = 0 flying = 0 death_text = "%src% tips over, its joints seizing and locking up. It does not move again." angertext = "seems to stare at" var/does_creepy_stuff = 0 var/typeName = "Generic" #ifndef MOON_IS_LIVE New() ..() del(src) #endif CritterAttack(mob/M) src.attacking = 1 src.visible_message("[src] awkwardly bashes [src.target]!") random_brute_damage(src.target, rand(5,15)) playsound(src.loc, "sound/misc/automaton_spaz.ogg", 50, 1) spawn(10) src.attacking = 0 process() if(!..()) return 0 if (!alive || !does_creepy_stuff) return if (prob(6)) playsound(src.loc, "sound/misc/automaton_tickhum.ogg", 60, 1) src.visible_message("[src] emits [pick("a soft", "a quiet", "a curious", "an odd", "an ominous", "a strange", "a forboding", "a peculiar", "a faint")] [pick("ticking", "tocking", "humming", "droning", "clicking")] sound.") if (prob(6)) playsound(src.loc, "sound/misc/automaton_ratchet.ogg", 60, 1) src.visible_message("[src] emits [pick("a peculiar", "a worried", "a suspicious", "a reassuring", "a gentle", "a perturbed", "a calm", "an annoyed", "an unusual")] [pick("ratcheting", "rattling", "clacking", "whirring")] noise.") if (prob(5)) playsound(src.loc, "sound/misc/automaton_spaz.ogg", 50, 1) src.visible_message("[src] [pick("turns", "pivots", "twitches", "spins")].") src.dir = pick(alldirs) /obj/critter/moonspy name = "\proper not a syndicate spy probe" desc = "It's probably a coat rack or something." icon = 'icons/misc/worlds.dmi' icon_state = "drone_service_bot" density = 1 health = 35 aggressive = 0 defensive = 1 wanderer = 0 opensdoors = 1 atkcarbon = 1 atksilicon = 1 atcritter = 0 firevuln = 0.5 brutevuln = 0.5 sleeping_icon_state = "drone_service_bot_off" flying = 0 generic = 0 death_text = "%src% stops moving." var/static/list/non_spy_weapons = list("something that isn't a high gain microphone", "an object distinct from a tape recorder", "object that is, in all likelihood, not a spy camera") #ifndef MOON_IS_LIVE New() ..() del(src) #endif ChaseAttack(mob/M) src.visible_message("[src] launches itself towards [M]!") if (prob(20)) M.stunned += rand(1,3) random_brute_damage(M, rand(2,5)) CritterAttack(mob/M) src.attacking = 1 src.visible_message("The [src.name] [pick("conks", "whacks", "bops")] [src.target] with [pick(non_spy_weapons)]!") random_brute_damage(src.target, rand(2,4)) spawn(10) src.attacking = 0 CritterDeath() if (!src.alive) return src.alive = 0 walk_to(src,0) src.visible_message("[src] blows apart! But not in a way at all like surveillance equipment. More like a washing machine or something.") spawn(0) var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread) s.set_up(3, 1, src) s.start() qdel(src) /obj/item/clothing/suit/lunar_tshirt name = "museum of lunar history t-shirt" desc = "Size small. However, just fifty years ago this would have been considered an XXL." icon = 'icons/obj/clothing/overcoats/item_suit_gimmick.dmi' wear_image_icon = 'icons/mob/overcoats/worn_suit_gimmick.dmi' inhand_image_icon = 'icons/mob/inhand/overcoat/hand_suit_gimmick.dmi' icon_state = "moon_tshirt" item_state = "moon_tshirt" body_parts_covered = TORSO|ARMS #define REASON_NONE 0 #define REASON_ADDTEXT 1 #define REASON_CLEARSCREEN 2 #define REASON_UPDATETEXT 4 obj/machinery/embedded_controller/radio/maintpanel name = "maintenance access panel" icon = 'icons/obj/airlock_machines.dmi' icon_state = "museum_control" anchored = 1 density = 0 var/id_tag = null var/net_id = null var/locked = 0 var/blinking = 0 var/obj/machinery/power/data_terminal/wired_connection = null var/setup_string var/datum/light/light var/updateFlags = 0 var/the_goddamn_regex = "/\\s/gm" //req_access New() ..() light = new /datum/light/point light.attach(src) light.set_color(0.6, 1, 0.66) light.set_brightness(0.4) light.enable() spawn (5) if (src.tag) src.id_tag = src.tag src.tag = null src.net_id = generate_net_id(src) if(!src.wired_connection) //Find the data terminal if there is one around. var/turf/T = get_turf(src) var/obj/machinery/power/data_terminal/test_link = locate() in T if(test_link && !test_link.is_valid_master(test_link.master)) src.wired_connection = test_link src.wired_connection.master = src attackby(obj/item/I, mob/user) if (istype(I, /obj/item/card/id)) if (user && src.allowed(user, req_only_one_required)) boutput(user, "Access approved..") src.locked = !src.locked updateUsrDialog() else boutput(user, "Access denied.") else return ..() post_signal(datum/signal/signal, comm_line) if (!signal || (stat & NOPOWER)) return signal.source = src signal.data["sender"] = src.net_id if (comm_line) signal.transmission_method = TRANSMISSION_WIRE if (wired_connection) wired_connection.post_signal(src, signal) else signal.transmission_method = TRANSMISSION_RADIO if(radio_connection) return radio_connection.post_signal(src, signal, 100) initialize() ..() var/datum/computer/file/embedded_program/maintpanel/new_prog = new new_prog.master = src program = new_prog if (setup_string) new_prog.do_setup(setup_string) receive_signal(datum/signal/signal, receive_method, receive_param) if(!signal || signal.encryption) return if (!cmptext(signal.data["address_1"], src.net_id)) if (cmptext(signal.data["address_1"], "ping")) var/datum/signal/pingsignal = get_free_signal() pingsignal.data["device"] = "MCU_CONTROL" pingsignal.data["netid"] = src.net_id pingsignal.data["address_1"] = signal.data["sender"] pingsignal.data["command"] = "ping_reply" post_signal(pingsignal) return if(program) return program.receive_signal(signal, receive_method, receive_param) process() if (stat & NOPOWER) update_icon() return return ..() update_icon() if (stat & NOPOWER) icon_state = "museum_control_off" else icon_state = blinking ? "museum_control_blink" : "museum_control" attack_hand(mob/user) user.machine = src var/dat = {" Intelligent Maintenance Panel
"} for (var/screenlineIndex = 0, screenlineIndex < 13, screenlineIndex++) dat += "
" dat +={"
SEL BACK ACT DEAC " user << browse(dat, "window=maintpanel;size=435x380;can_resize=0") onclose(user, "maintpanel") Topic(href, href_list) if (stat & NOPOWER) return if (get_dist(src, usr) > 1 && !issilicon(usr)) return if(program) program.receive_user_command(href_list["command"]) usr.machine = src process() if(!(stat & NOPOWER) && program) program.process() update_icon() updateUsrDialog(var/reason) var/list/nearby = viewers(1, src) for(var/mob/M in nearby) if ((M.client && M.machine == src)) if (reason || updateFlags) src.dynamicUpdate(M, reason|updateFlags) updateFlags = REASON_NONE else src.attack_hand(M) if (istype(usr, /mob/living/silicon)) if (!(usr in nearby)) if (usr.client && usr.machine==src) if (reason || updateFlags) src.dynamicUpdate(usr, reason|updateFlags) updateFlags = REASON_NONE else src.attack_ai(usr) if (program) for (var/line = 1, line <= 13, line++) if (program.memory["display_add[line]"]) program.memory["display[line]"] = program.memory["display_add[line]"] program.memory["display_add[line]"] = null proc/dynamicUpdate(mob/user, reasonFlags) if (reasonFlags & REASON_CLEARSCREEN) user << output(null, "maintpanel.browser:clearScreen") if (program) if (reasonFlags & REASON_ADDTEXT) for (var/line = 1, line < 14, line++) if (program.memory["display_add[line]"]) user << output(url_encode(program.memory["display_add[line]"])+"&[line]", "maintpanel.browser:consoleTextOut") else for (var/line = 1, line < 14, line++) if (program.memory["display[line]"]) user << output(url_encode(program.memory["display[line]"])+"&[line]", "maintpanel.browser:setDisplay") /* return_text() if (stat & NOPOWER) return "" if (locked) return "
 LOCKED 
" if (program) return program.memory["display"] */ #define ENTRY_MAX 24 #define PANELSTATE_MAIN_MENU 0 #define PANELSTATE_ENTRY_MENU 1 datum/computer/file/embedded_program/maintpanel name = "maintpnl" extension = "EPG" state = PANELSTATE_MAIN_MENU var/tmp/list/device_entries = list() var/tmp/selected_entry = 0 var/tmp/list/sessions = list() New() ..() for (var/line = 1, line <= 13, line++) memory += "display[line]" memory["display[line]"] = "" memory += "display_add[line]" memory["display_add[line]"] = "" spawn (10) updateDisplay() disposing() if (device_entries) for (var/datum/entry in device_entries) entry.disposing() device_entries = null sessions = null ..() proc/do_setup(var/setupString) var/list/setupList = splittext(setupString, ";") if (!setupList || !setupList.len) return for (var/setupEntry in setupList) var/entryName = "" . = findtext(setupEntry, ",") if (.) entryName = copytext(setupEntry, .+1) setupEntry = copytext(setupEntry, 1, .) if (cmptext(copytext(setupEntry, 1, 5), "fake")) . = text2path("/datum/maintpanel_device_entry/dummy[copytext(setupEntry, 5)]") if (.) src.device_entries += new . (src, entryName) else src.device_entries += new /datum/maintpanel_device_entry/dummy (src, entryName) continue var/obj/controlTarget = locate(setupEntry) if (!controlTarget) logTheThing("debug", null, null, "Maint control panel at \[[master.x], [master.y], [master.z]] had invalid setup tag \"[setupEntry]\"") continue if (istype(controlTarget, /obj/machinery/door/airlock)) src.device_entries += new /datum/maintpanel_device_entry/airlock (src, controlTarget, entryName) else if (istype(controlTarget, /obj/machinery/door/poddoor)) src.device_entries += new /datum/maintpanel_device_entry/podlock (src, controlTarget, entryName) else if (istype(controlTarget, /obj/critter/mannequin)) src.device_entries += new /datum/maintpanel_device_entry/mannequin (src, controlTarget, entryName) while (src.device_entries.len < 16) src.device_entries += new /datum/maintpanel_device_entry/dummy (src, pick("GEN$$E$C", "MANNEA83IN 13", "M@____$CC DOOR $$S9", "########?3")) receive_user_command(command) switch (command) if ("button1") //Left arrow if (state == PANELSTATE_MAIN_MENU) selected_entry &= ~1 //Left side is all evens if ("button2") //Right arrow if (state == PANELSTATE_MAIN_MENU) selected_entry |= 1 //Right side is all odds. if ("button5") //Down arrow if (state == PANELSTATE_MAIN_MENU) selected_entry = min(selected_entry + 2, ENTRY_MAX) if ("button6") //Up arrow if (state == PANELSTATE_MAIN_MENU) selected_entry = max(selected_entry - 2, 0) if ("button3") //Select if (state == PANELSTATE_MAIN_MENU) state = PANELSTATE_ENTRY_MENU if ("button4") //Back if (state != PANELSTATE_MAIN_MENU) state = PANELSTATE_MAIN_MENU if ("button7") //Activate if (state == PANELSTATE_ENTRY_MENU && selected_entry < device_entries.len) var/datum/maintpanel_device_entry/currentEntry = src.device_entries[selected_entry + 1] if (!istype(currentEntry)) return currentEntry.activate() if ("button8") //Deactivate if (state == PANELSTATE_ENTRY_MENU && selected_entry < device_entries.len) var/datum/maintpanel_device_entry/currentEntry = src.device_entries[selected_entry + 1] if (!istype(currentEntry)) return currentEntry.deactivate() updateDisplay() return receive_signal(datum/signal/signal, receive_method, receive_param) if (signal.data["sender"] in src.sessions) var/datum/maintpanel_device_entry/entry = src.sessions[signal.data["sender"]] src.sessions -= signal.data["sender"] if (istype(entry) && (entry in src.device_entries) && signal.data["lock_status"]) entry.receive_signal(signal) updateDisplay() return process() return proc/updateDisplay() if (state == PANELSTATE_MAIN_MENU) var/list/printList = list(" * KNOWN DEVICES * ","","","","","","","","","","","","") var/printedCounter for (printedCounter = 0, printedCounter < ENTRY_MAX, printedCounter++) var/datum/maintpanel_device_entry/entry if (printedCounter < device_entries.len) entry = device_entries[printedCounter+1] var/nextEntry printList[round(printedCounter/2) + 2] += (selected_entry == printedCounter) ? ">" : (istype(entry) && entry.active ? "*" : " ") if (!istype(entry)) printList[round(printedCounter/2) + 2] += " " //This makes half a display row of spaces. 16 spaces. 2^4 spaces. continue nextEntry = "[copytext(entry.name, 1, 16)]" while (length(nextEntry) < 15) nextEntry += " " printList[round(printedCounter/2) + 2] += nextEntry printToDisplay(printList, 0) else if (state == PANELSTATE_ENTRY_MENU) if ((selected_entry+1) > device_entries.len) state = PANELSTATE_MAIN_MENU return var/datum/maintpanel_device_entry/entry = device_entries[selected_entry + 1] if (!istype(entry)) state = PANELSTATE_MAIN_MENU return . = copytext(entry.name, 1, 17) while (length(.) < 28) . = " [.] " var/list/outList = list(" *[.]* ") . = entry.getControlMenu() if (.) outList += . else outList += " N / A" printToDisplay(outList, 0) return proc/printToDisplay(var/list/newText, var/add) if (!istype(newText)) return if (add) for (var/line = 1, line <= 13 && line <= newText.len, line++) memory["display_add[line]"] += newText[line] else for (var/line = 1, line <= 13, line++) if (line <= newText.len) memory["display[line]"] = newText[line] else memory["display[line]"] = " " if (master) master.updateUsrDialog(add ? REASON_ADDTEXT : REASON_UPDATETEXT) datum/maintpanel_device_entry var/name = "GENERIC" var/datum/computer/file/embedded_program/maintpanel/master var/active = 0 var/needs_hack = 0 disposing() master = null ..() proc/activate() return 0 proc/deactivate() return 0 proc/toggle() if (active) return deactivate() else return activate() proc/getControlMenu() return " ACTIVE: [src.active ? "YES" : "NO"]" proc/receive_signal(datum/signal/signal) airlock name = "AIRLOCK" var/ourDoorID var/open = 0 var/locked = 0 New(datum/computer/file/embedded_program/maintpanel/newMaster, obj/machinery/door/airlock/targetDoor, entryName) ..() if (!istype(newMaster) || !istype(targetDoor)) return ourDoorID = targetDoor.net_id master = newMaster if (entryName) src.name = uppertext(entryName) locked = targetDoor.locked open = !targetDoor.density active = open || !locked getControlMenu() return list(" SEALED: [src.active ? "NO" : "YES"]",\ " LOCKED: [src.locked ? "YES" : "NO"]",\ " CLASS: AIRLOCK - GENERIC") receive_signal(datum/signal/signal) open = signal.data["door_status"] == "open" locked = signal.data["lock_status"] == "locked" active = open || !locked activate() if (!ourDoorID || !master) return 1 if (active) return 0 var/datum/signal/signal = get_free_signal() signal.data["address_1"] = ourDoorID signal.data["command"] = "secure_open" master.sessions["[ourDoorID]"] = src master.post_signal(signal) return 0 deactivate() if (!ourDoorID || !master) return 1 if (!active) return 0 var/datum/signal/signal = get_free_signal() signal.data["address_1"] = ourDoorID signal.data["command"] = "secure_close" master.sessions["[ourDoorID]"] = src master.post_signal(signal) return 0 podlock name = "BLASTDOOR" var/obj/machinery/door/poddoor/ourDoor New(datum/computer/file/embedded_program/maintpanel/newMaster, obj/machinery/door/poddoor/targetDoor, entryName) ..() if (!istype(newMaster) || !istype(targetDoor)) return //ourDoorID = targetDoor.net_id master = newMaster if (entryName) src.name = uppertext(entryName) ourDoor = targetDoor getControlMenu() if (ourDoor) src.active = !ourDoor.density return list(" DOOR TYPE: BLAST DOOR"," SEALED: [src.active ? "NO" : "YES"]"," ACTUATOR PRESSURE:"," ACT 1: OK"," ACT 2: OK"," ACT 3: OK") activate() if (!ourDoor) return 1 if (ourDoor.disposed) ourDoor = null return 1 if (ourDoor.open()) src.active = 1 return 0 deactivate() if (!ourDoor) return 1 if (ourDoor.disposed) ourDoor = null return 1 if (ourDoor.close()) src.active = 0 return 0 mannequin name = "ANIMATRONIC" var/obj/critter/mannequin/ourMannequin var/mannequinName = "GENERIC" getControlMenu() return list(" ACTOR ID: [mannequinName]",\ " ACTIVE: [(ourMannequin && ourMannequin.alive) ? (src.active ? "YES" : "NO") : "NO"]",\ " CONDITION: [ourMannequin && ourMannequin.alive ? "OK" : "REPAIRS NEEDED"]") New(datum/computer/file/embedded_program/maintpanel/newMaster, obj/critter/mannequin/mannequin, entryName) ..() if (!istype(newMaster) || !istype(mannequin)) return master = newMaster src.active = mannequin.does_creepy_stuff if (mannequin.typeName) src.mannequinName = uppertext(mannequin.typeName) ourMannequin = mannequin if (entryName) src.name = uppertext(entryName) activate() if (ourMannequin) if (ourMannequin.disposed) ourMannequin = null return 1 active = 1 ourMannequin.does_creepy_stuff = 1 return 0 return 1 deactivate() if (ourMannequin) if (ourMannequin.disposed) ourMannequin = null return 1 active = 0 ourMannequin.does_creepy_stuff = 0 return 1 dummy //This is a fake entry that exists to fill space, not to be confused with the mannequin type. New(datum/computer/file/embedded_program/maintpanel/newMaster, entryName) ..() if (istype(newMaster)) master = newMaster if (entryName) src.name = uppertext(entryName) getControlMenu() . = list() for (var/n = 0, n < 10, n++) var/toAdd = "" while (length(toAdd) < 25) toAdd += ascii2text( prob(50) ? rand(48, 59) : rand(63, 90) ) . += toAdd dummyreactor New(datum/computer/file/embedded_program/maintpanel/newMaster, entryName) ..() if (istype(newMaster)) master = newMaster if (entryName) src.name = uppertext(entryName) getControlMenu() return list(" CLASS MSTAR-80A", " STATUS: INACTIVE", " OUTPUT: 0 W", "", " !! CHECK COOLANT PUMPS !!", " !! TURBINE TRIP !!") dummyatmos New(datum/computer/file/embedded_program/maintpanel/newMaster, entryName) ..() if (istype(newMaster)) master = newMaster if (entryName) src.name = uppertext(entryName) getControlMenu() return list(" ATMOS PROCESSOR"," STATUS: LOW FUNCTION", " REFRIGERANT LEVELS LOW"," FILTER 0 STATUS: OK", " FILTER 1 STATUS: REPLACE", " FILTER 2 STATUS: REPLACE") #undef PANELSTATE_MAIN_MENU #undef PANELSTATE_ENTRY_MENU #undef REASON_NONE #undef REASON_ADDTEXT #undef REASON_CLEARSCREEN #undef REASON_UPDATETEXT /obj/item/kitchen/everyflavor_box/wax attack_hand(mob/user as mob, unused, flag) if (flag) return ..() if(user.r_hand == src || user.l_hand == src) if(src.amount == 0) boutput(user, "You're out of beans. You feel strangely sad.") return else var/obj/item/reagent_containers/food/snacks/candy/B = new /obj/item/reagent_containers/food/snacks/candy {name = "A Farty Snott's Every Flavour Bean"; desc = "A favorite halloween sweet worldwide!"; icon_state = "bean"; amount = 1; initial_volume = 100;} (user) user.put_in_hand_or_drop(B) src.amount-- if (B.reagents) B.reagents.clear_reagents() B.reagents.add_reagent("wax", 20) if(src.amount == 0) src.icon_state = "beans_empty" src.name = "An empty Farty Snott's bag." else return ..() return /obj/fake_dwarf_bomb name = "historic \"dwarf\" plasma bomb" desc = "This is a model of the \"dwarf\" plasma bomb held by the Space IRA in the 2004 Lunar Port Hostage Crisis. At least, you hope it's a model." icon = 'icons/misc/lunar.dmi' icon_state = "dwarf_bomb" anchored = 0 density = 1 var/well_fuck_its_armed = 0 attackby(obj/item/I, mob/user) return attack_hand(user) attack_hand(mob/living/user) if (!istype(user) || user.stat || (get_dist(src, user) > 1) || well_fuck_its_armed) return well_fuck_its_armed = 1 user.visible_message("[user] prods [src].", "You prod at [src]. It's a pretty accurate replica, it seems. Neat.") spawn (10) src.visible_message("[src] gives a grumpy beep! OH FUCK") playsound(src.loc, "sound/weapons/armbomb.ogg", 50) sleep(30) //do tiny baby explosion noise //Todo: a squeakier blast sound. playsound(src.loc, "sound/effects/Explosion2.ogg", 40, 0, 0, 4) new /obj/effects/explosion/tiny_baby (src.loc) for (var/mob/living/carbon/unfortunate_jerk in range(1, src)) if (unfortunate_jerk.stat != 2 && unfortunate_jerk.client) shake_camera(unfortunate_jerk, 12, 4) unfortunate_jerk.stunned += 4 unfortunate_jerk.stuttering += 4 unfortunate_jerk.lying = 1 unfortunate_jerk.set_clothing_icon_dirty() qdel(src) /obj/effects/explosion/tiny_baby New() ..() src.transform = matrix(0.5, MATRIX_SCALE) //Shelving for the gift shop /obj/rack/lunar name = "shop shelf" desc = "A shelf as is used in many stores." icon = 'icons/misc/lunar.dmi' icon_state = "aisleshelf" attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/wrench)) return return ..() /obj/item/basketball/lunar name = "moon basketball" desc = "A basketball that is printed to resemble the moon." icon = 'icons/misc/lunar.dmi' icon_state = "bball" item_state = "bbmoon"