//////////////////TABLE OF CONTENTS////////////////// ///MANTA RELATED LISTS AND GLOBAL VARIABLES/// ///MANTA RELATED OBJECTS/// ///MANTA RELATED TURFS/// ///MANTA RELATED DATUMS (Mainly related to fixing propellers.)/// ///MANTA RELATED AREAS/// ///MANTA SECRET STUFF/// //******************************************** MANTA COMPATIBLE LISTS HERE ******************************************** var/list/mantaTiles = list() var/list/mantaBubbles = list() var/list/mantaPlants = list() var/list/mantaPropellers = list() var/list/mantaHeaters = list() var/list/mantaJunctionbox = list () var/list/mantaPushList = list() var/mantaMoving = 1 var/MagneticTether = 1 var/obj/manta_speed_lever/mantaLever = null //******************************************** MANTA COMPATIBLE OBJECTS HERE ******************************************** /obj/decal/mantaBubbles density = 0 anchored = 1 layer = EFFECTS_LAYER_4 name = "" mouse_opacity = 0 New() mantaBubbles.Add(src) return ..() Del() mantaBubbles.Remove(src) return ..() small icon = 'icons/effects/bubbles32x64.dmi' icon_state = "bubbles" pixel_y = 8 large icon = 'icons/effects/bubbles64x64.dmi' icon_state = "bubbles2" pixel_y = 16 verylarge icon = 'icons/effects/bubbles64x256.dmi' icon_state = "bubbles" pixel_y = 16 smallfast icon = 'icons/effects/bubbles_1.dmi' icon_state = "bubbles" dir = NORTH //pixel_y = 32 /obj/manta_speed_lever name = "lever console" icon = 'icons/obj/decoration.dmi' icon_state = "lever1" density = 1 anchored = 2 var/on = 1 var/lastuse = 0 var/locked = 1 //Starts off locked. req_access = list(access_heads) New() mantaLever = src updateIcon() ..() //This crap is here so nothing can destroy it. hitby() reagent_act() bullet_act() ex_act() blob_act() meteorhit() damage_heat() damage_corrosive() damage_piercing() damage_slashing() damage_blunt() attack_hand(mob/user as mob) var/diff = world.timeofday - lastuse if(diff < 0) diff += 864000 //Wrapping protection. if (locked == 1) user.show_text("You must first unlock the lever console with an ID to be able to use it.") return if(mantaIsBroken() && !on) user.show_text("Too many propellers are damaged; you can not move NSS Manta.") return if(diff > 3000) lastuse = world.timeofday if(on) user.show_text("You turn off the propellers.") on = 0 updateIcon() command_alert("Attention, NSS Manta is slowing down to a halt. Shutting down propellers.", "NSS Manta Movement Computer") mantaSetMove(on) else user.show_text("You turn on the propellers.") on = 1 world << 'sound/effects/mantamoving.ogg' sleep(70) updateIcon() command_alert("Attention, firing up propellers. NSS Manta will be on the move shortly.", "NSS Manta Movement Computer") mantaSetMove(on) return else user.show_text("The engine is still busy.") attack_ai(mob/user as mob) return attack_hand(user) attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/device/pda2) && W:ID_card) W = W:ID_card if(istype(W, /obj/item/card/id)) if (src.allowed(user)) user.visible_message("[user] [src.locked ? "unlocks" : "locks"] the access panel.","You [src.locked ? "unlock" : "lock"] the access panel.") src.locked = !src.locked updateIcon() else boutput(user, "Access denied.") else ..() return proc/updateIcon() if (locked == 1 && on == 1) icon_state = "lever1-locked" if (locked == 1 && on == 0) icon_state = "lever0-locked" if (locked == 0 && on == 1) icon_state = "lever1" if (locked == 0 && on == 0) icon_state = "lever0" /proc/mantaIsBroken() var/broken = 0 for(var/obj/machinery/mantapropulsion/A in mantaPropellers) if(!A.important) continue if(A.health == 0) broken++ if(A.health > 0) broken-- if(broken >= 4) return 1 return 0 /proc/mantaSetMove(var/moving=1, var/doShake=1) if(mantaIsBroken() && moving == 1) //If too many are broken and we want to move, nope out. This is just an extra safety. return if(doShake) for(var/client/C in clients) var/mob/M = C.mob if(M && M.z == 1) shake_camera(M, 5, 15, 0.2) for(var/A in mantaTiles) var/turf/space/fluid/manta/T = A T.setScroll(moving) for(var/A in mantaBubbles) var/obj/O = A O.alpha = (moving ? 255:0) for(var/A in mantaPlants) var/obj/O = A O.alpha = (moving ? 0:255) for(var/A in mantaPropellers) var/obj/machinery/mantapropulsion/O = A O.setOn(moving) mantaMoving = moving return /obj/machinery/mantapropulsion name = "propeller" icon = 'icons/turf/shuttle.dmi' icon_state = "sea_propulsion" var/stateOn = "" var/stateOff = "" var/stateDamaged = "" var/on = 1 anchored = 2 density = 1 var/health = 100 var/maxhealth = 100 var/important = 0 var/repairstate = 0 var/broken = 0 New() stateOff = "sea_propulsion_off" stateOn = "sea_propulsion" icon_state = stateOn on = 1 return . Del() mantaPropellers.Remove(src) return ..() Bumped(atom/AM) //This is stolen straight from the crusher, just making sure that the propellers are actually on. var/tm_amt = 0 var/tg_amt = 0 var/tw_amt = 0 var/bblood = 0 if (mantaMoving == 1) if (repairstate == 0) if(istype(AM,/obj/item/scrap)) return if(world.timeofday - AM.last_bumped <= 60) return if(ismob(AM)) var/mob/M = AM for(var/obj/O in M.contents) if(isobj(O)) tm_amt += O.m_amt tg_amt += O.g_amt tw_amt += O.w_amt if(iscarbon(M)) tw_amt += 5000 bblood = 2 else if(issilicon(M)) tm_amt += 5000 tg_amt += 1000 qdel(O) logTheThing("combat", M, null, "is ground up in one of Manta's propellers at[log_loc(src)].") message_admins("[key_name(M)] is ground up in one of Manta's propellers at [log_loc(src)].") M.gib() else if(isobj(AM)) var/obj/B = AM tm_amt += B.m_amt tg_amt += B.g_amt tw_amt += B.w_amt for(var/obj/O in AM.contents) if(isobj(O)) tm_amt += O.m_amt tg_amt += O.g_amt tw_amt += O.w_amt qdel(O) else return for(var/mob/M in oviewers()) if(M.client) boutput(M, "You hear a grinding sound!") var/obj/item/scrap/S = new(get_turf(src)) S.blood = bblood S.set_components(tm_amt,tg_amt,tw_amt) qdel(AM) // step(S,2) return //REPAIRING: wrench > screwdriver > crowbar > wires > welder > wrench > screwdriver > sheet > welder attackby(var/obj/item/I as obj, var/mob/user as mob) switch(repairstate) if (0) if (important == 1) ..() change_health(-I.force) return if(1) if (istool(I, TOOL_WRENCHING)) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 50), user) if(2) if (istool(I, TOOL_SCREWING)) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 50), user) if(3) if (ispryingtool(I)) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 60), user) if(4) if (istype(I, /obj/item/cable_coil)) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 60), user) if(5) if (istype(I, /obj/item/weldingtool) && I:welding) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 50), user) if(6) if (istool(I, TOOL_WRENCHING)) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 50), user) if(7) if (istool(I, TOOL_SCREWING)) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 50), user) if(8) if (istype(I, /obj/item/sheet)) var/obj/item/sheet/S = I if (S.amount >= 5) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 50), user) if(9) if (istype(I, /obj/item/weldingtool) && I:welding) actions.start(new /datum/action/bar/icon/propeller_fix(src, I, 50), user) ex_act(severity) switch(severity) if(1.0) change_health(-maxhealth) return if(2.0) change_health(-50) return if(3 to INFINITY) change_health(-35) return proc/change_health(var/change = 0) health = max(min(maxhealth, health+change), 0) if(health == 0) setOn(0) repairstate = 1 broken = 1 desc = "It's definitely totaled, looks like the securing bolts are in place. Maybe grab a wrench?" if(mantaIsBroken() && mantaMoving) mantaSetMove(0) if(mantaLever) mantaLever.on = 0 mantaLever.icon_state = "lever0" return proc/setOn(var/newOn=0) if(health) if(newOn) icon_state = stateOn on = newOn else icon_state = stateOff on = newOn else icon_state = stateDamaged //ADD YOUR BROKEN ICON STATE HERE THANK YOU on = 0 return proc/Breakdown() health = 0 on = 0 icon_state = "bigsea_propulsion_broken" change_health() /obj/machinery/mantapropulsion/big icon = 'icons/obj/64x64.dmi' icon_state = "bigsea_propulsion" important = 1 bound_height = 64 bound_width = 64 appearance_flags = TILE_BOUND New() mantaPropellers.Add(src) . = ..() stateOff = "bigsea_propulsion_off" stateOn = "bigsea_propulsion" stateDamaged = "bigsea_propulsion_broken" icon_state = stateOn on = 1 return . /obj/machinery/power/seaheater name = "heater" icon = 'icons/turf/shuttle.dmi' icon_state = "heater" anchored = 2 density = 1 New() ..() seaheater_right icon_state = "seaheater_R" seaheater_left icon_state = "seaheater_L" seaheater_middle icon_state = "seaheater_M" seaheater icon_state = "seaheater" /obj/machinery/power/seaheater/big icon = 'icons/obj/64x64.dmi' icon_state = "bigheater" var/lastpower = 0 /*process() if(mantaMoving) var/power = 0 var/a = 1000 var/b = 100 var/c = 100 power = a*b*c src.lastpower = power powernet = get_direct_powernet() add_avail(power) ..() proc/GetFunctioningPropellers() var/propelcount = 0 for(var/obj/machinery/mantapropulsion/A in mantaPropellers) if(A.health <= 1) propelcount++ return propelcount*/ /obj/machinery/junctionbox name = "junction box" desc = "An electrical junction box is an enclosure housing electrical connections, to protect the connections and provide a safety barrier." icon = 'icons/obj/decoration.dmi' icon_state = "junctionbox" anchored = 2 var/open = 0 var/iconopen = "junctionbox_open" var/iconclosed = "junctionbox" var/broken = 0 var/repairstate = 0 var/obj/cable/attached var/drain_rate = 50000 // amount of power to drain per tick var/power_drained = 0 // has drained this much power var/max_power = 2e8 // maximum power that can be drained before exploding New() mantaJunctionbox.Add(src) . = ..() update_icon() Del() mantaJunctionbox.Remove(src) return ..() attack_hand(mob/user as mob) if (isAI(usr)) boutput(user, "You'd touch the door, if only you had hands.") return if (broken == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (!src.open) src.open = 1 update_icon() user.show_text("You open junction box's outer door.") else src.open = 0 update_icon() user.show_text("You close junction box's outer door.") attackby(var/obj/item/I as obj, var/mob/user as mob) if (broken == 1 && open == 1) user.shock(src, rand(5000, 15000), "chest", 1) switch(repairstate) if(1) if (broken == 1 && open == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SCREWING)) actions.start(new /datum/action/bar/icon/junctionbox_fix(src, I, 30), user) if(2) if (broken == 1 && open == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SNIPPING)) actions.start(new /datum/action/bar/icon/junctionbox_fix(src, I, 20), user) if(3) if (broken == 1 && open == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istype(I, /obj/item/cable_coil)) actions.start(new /datum/action/bar/icon/junctionbox_fix(src, I, 30), user) if(4) if (broken == 1 && open == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SNIPPING)) actions.start(new /datum/action/bar/icon/junctionbox_fix(src, I, 20), user) if(5) if (broken == 1 && open == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SCREWING)) actions.start(new /datum/action/bar/icon/junctionbox_fix(src, I, 30), user) proc/Breakdown() src.broken = 1 src.repairstate = 1 mantaJunctionbox.Remove(src) src.desc = "You should start by removing the outer screws from the casing. Be sure to wear some insulated gloves!" proc/Repair() src.broken = 0 src.repairstate = 0 proc/update_icon() if (src.open == 1) src.icon_state = src.iconopen else src.open = 0 src.icon_state = src.iconclosed process() if(broken == 1) var/obj/sparks = unpool(/obj/effects/sparks/end) sparks.set_loc(src.loc) playsound(src.loc, "sparks", 100, 1) var/area/TT = get_area(src) if(isarea(TT)) attached = locate() in TT if(attached) var/datum/powernet/PN = attached.get_powernet() if(PN) var/drained = min ( drain_rate, PN.avail ) PN.newload += drained power_drained += drained if(drained < drain_rate) for(var/obj/machinery/power/terminal/T in PN.nodes) if(istype(T.master, /obj/machinery/power/apc)) var/obj/machinery/power/apc/A = T.master if(A.operating && A.cell) A.cell.charge = max(0, A.cell.charge - 50) power_drained += 50 if(power_drained > max_power * 0.95) playsound(src, "sound/effects/screech.ogg", 100, 1, 1) if(power_drained >= max_power) processing_items.Remove(src) explosion(src, src.loc, 3,6,9,12) qdel(src) /obj/machinery/junctionbox/varianta icon_state = "junctionbox3" iconopen = "junctionbox3_open" iconclosed = "junctionbox3" /obj/machinery/junctionbox/variantb icon_state = "junctionbox2" iconopen = "junctionbox2_open" iconclosed = "junctionbox2" /obj/machinery/communicationstower icon = 'icons/obj/32x64.dmi' name = "Communications Tower" icon_state = "commstower" density = 0 anchored = 2 var/health = 100 var/maxhealth = 100 var/broken = 0 bound_width = 32 bound_height = 32 ex_act(severity) switch(severity) if(1.0) change_health(-maxhealth) return if(2.0) change_health(-50) return if(3 to INFINITY) change_health(-35) return attackby(var/obj/item/I as obj, var/mob/user as mob) user.lastattacked = src ..() if (broken == 0) change_health(-I.force) return else return proc/change_health(var/change = 0) health = max(min(maxhealth, health+change), 0) if (broken == 1) return if(health == 0) icon_state = "commstower_broken" broken = 1 random_events.force_event("Communications Malfunction") /obj/machinery/magneticbeacon icon = 'icons/obj/32x64.dmi' name = "Magnetic Tether" icon_state = "magbeacon" desc = "A rather delicate magnetic tether array. It allows people to safely explore the ocean around NSS Manta while carrying a magnetic attachment point." density = 0 anchored = 2 var/health = 100 var/maxhealth = 100 var/broken = 0 var/repairstate = 0 bound_width = 32 bound_height = 32 appearance_flags = TILE_BOUND ex_act(severity) switch(severity) if(1.0) change_health(-maxhealth) return if(2.0) change_health(-50) return if(3 to INFINITY) change_health(-35) return attackby(var/obj/item/I as obj, var/mob/user as mob) user.lastattacked = src ..() if (broken == 0) change_health(-I.force) return else switch(repairstate) if(1) if (broken == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SCREWING)) actions.start(new /datum/action/bar/icon/magnettether_fix(src, I, 30), user) if(2) if (broken == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SNIPPING)) actions.start(new /datum/action/bar/icon/magnettether_fix(src, I, 20), user) if(3) if (broken == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istype(I, /obj/item/cable_coil)) actions.start(new /datum/action/bar/icon/magnettether_fix(src, I, 30), user) if(4) if (broken == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SNIPPING)) actions.start(new /datum/action/bar/icon/magnettether_fix(src, I, 20), user) if(5) if (broken == 1) user.shock(src, rand(5000, 15000), "chest", 1) if (istool(I, TOOL_SCREWING)) actions.start(new /datum/action/bar/icon/magnettether_fix(src, I, 30), user) proc/change_health(var/change = 0) health = max(min(maxhealth, health+change), 0) if (broken == 1) return if(health == 0) icon_state = "magbeacon_broken" broken = 1 repairstate = 1 MagneticTether = 0 src.desc = "You should start by removing the outer screws from the casing. Be sure to wear some insulated gloves!" world << 'sound/effects/manta_alarm.ogg' command_alert("The Magnetic tether has suffered critical damage aboard NSS Manta. Jetpacks equipped with magnetic attachments are now offline, please do not venture out into the ocean until the tether has been repaired.", "Magnetic Tether Damaged") /obj/landmark name = "bigboom" icon = 'icons/mob/screen1.dmi' icon_state = "x" anchored = 1.0 /obj/miningteleporter name = "Experimental long-range mining teleporter" desc = "Well this looks somewhat unsafe." icon = 'icons/misc/32x64.dmi' icon_state = "englrt0" density = 0 anchored = 1 var/recharging =0 var/id = "shuttle" //The main location of the teleporter var/recharge = 20 //A short recharge time between teleports var/busy = 0 layer = 2 bound_height = 32 bound_width = 32 attack_ai(mob/user as mob) return attack_hand(user) attack_hand(mob/user as mob) if(busy) return if(get_dist(usr, src) > 1 || usr.z != src.z) return user.machine = src add_fingerprint(user) busy = 1 flick("englrt1", src) playsound(src, 'sound/machines/lrteleport.ogg', 60, 1) animate_teleport(user) SPAWN_DBG(1 SECOND) teleport(user) busy = 0 proc/teleport(mob/user) for(var/obj/miningteleporter/S) // in world AUGHHH if(S.id == src.id && S != src) if(recharging == 1) return 1 else S.recharging = 1 src.recharging = 1 user.set_loc(S.loc) showswirl(user.loc) SPAWN_DBG(recharge) S.recharging = 0 src.recharging = 0 return /obj/item/hosmedal name = "war medal" icon = 'icons/obj/items.dmi' inhand_image_icon = 'icons/mob/inhand/hand_general.dmi' icon_state = "hosmedal" item_state = "hosmedal" /obj/item/rddiploma name = "RD's diploma" icon = 'icons/obj/items.dmi' desc = ".. Upon closer inspection this degree seems to be fake! Who could have guessed!" inhand_image_icon = 'icons/mob/inhand/hand_general.dmi' icon_state = "rddiploma" item_state = "rddiploma" /obj/item/mdlicense name = "MD's medical license" icon = 'icons/obj/items.dmi' inhand_image_icon = 'icons/mob/inhand/hand_general.dmi' icon_state = "mdlicense" item_state = "mdlicense" /obj/item/firstbill name = "HoP's first bill" icon = 'icons/obj/items.dmi' icon_state = "hopbill" /obj/effect/boommarker name = "" icon = 'icons/effects/64x64.dmi' icon_state = "impact_marker" density = 0 anchored = 1 mouse_opacity = 0 desc = "Uh oh.." pixel_x = -16 pixel_y = -16 //Manta specific plants, straight copy, does not use the slow-down mechanic due to the alpha. /obj/sea_plant_manta name = "sea plant" icon = 'icons/obj/sealab_objects.dmi' desc = "It's thriving." anchored = 1 density = 0 layer = EFFECTS_LAYER_UNDER_1 var/database_id = null var/random_color = 1 var/drop_type = 0 event_handler_flags = USE_HASENTERED | USE_FLUID_ENTER | USE_CANPASS New() ..() if (src.random_color) src.color = random_saturated_hex_color() if (!src.pixel_x) src.pixel_x = rand(-8,8) if (!src.pixel_y) src.pixel_y = rand(-8,8) mantaPlants.Add(src) attackby(obj/item/W, mob/user) if (drop_type && issnippingtool(W)) var/obj/item/drop = new drop_type drop.set_loc(src.loc) src.visible_message("[user] cuts down [src].") qdel(src) ..() Del() mantaPlants.Remove(src) return ..() /obj/sea_plant_manta/HasExited(atom/movable/A as mob|obj) ..() if (ismob(A)) if (A.dir & SOUTH) //If mob exiting south, dont break perspective src.layer = 3.9 else src.layer = EFFECTS_LAYER_UNDER_1 //TODO : make all plants drop things! /obj/sea_plant_manta/bulbous name = "bulbous coral" icon_state = "bulbous" database_id = "sea_plant_bluecoral" drop_type = /obj/item/material_piece/coral /obj/sea_plant_manta/branching name = "branching coral" icon_state = "branching" database_id = "sea_plant_branchcoral" drop_type = /obj/item/material_piece/coral /obj/sea_plant_manta/coralfingers name = "stylophora coral" icon_state = "coralfingers" database_id = "sea_plant_fingercoral" drop_type = /obj/item/material_piece/coral /obj/sea_plant_manta/anemone name = "sea anemone" icon_state = "anemone" database_id = "sea_plant_anemone" /obj/sea_plant_manta/anemone/lit name = "glowing sea anemone" icon_state = "anemone_lit" database_id = "sea_plant_lit_anemone" var/datum/light/point/light = 0 var/init = 0 disposing() light = 0 ..() initialize() ..() if (!init) init = 1 var/datum/color/C = new C.from_hex(src.color) if (!light) light = new light.attach(src) light.set_brightness(1) light.set_color(C.r/255, C.g * 0.25/255, C.b * 0.25/255) light.set_height(3) light.enable() /obj/sea_plant_manta/kelp name = "kelp" icon_state = "kelp" database_id = "sea_plant_kelp" random_color = 0 /obj/sea_plant_manta/seaweed name = "seaweed" icon_state = "seaweed" database_id = "sea_plant_seaweed" random_color = 0 drop_type = /obj/item/reagent_containers/food/snacks/ingredient/seaweed /obj/sea_plant_manta/tubesponge name = "tube sponge" icon_state = "tubesponge" database_id = "sea_plant_tubesponge" drop_type = /obj/item/sponge /obj/sea_plant_manta/tubesponge/small icon_state = "tubesponge_small" database_id = "sea_plant_tubesponge-small" //******************************************** MANTA COMPATIBLE TURFS HERE ******************************************** /turf/space/fluid/manta var/stateOn = "" var/stateOff = "" var/on = 1 var/list/L = list() New() mantaTiles.Add(src) . = ..() stateOff = "manta_sand" stateOn = "[stateOff]_scroll" icon_state = stateOn on = 1 return . Del() mantaTiles.Remove(src) return ..() ex_act(severity) return proc/setScroll(var/newOn=0) if(newOn) icon_state = stateOn on = newOn else icon_state = stateOff on = newOn return Entered(atom/movable/Obj,atom/OldLoc) if(y <= 3 || y >= world.maxy - 3 || x <= 3 || x >= world.maxx - 3) if (!L || L.len == 0) for(var/turf/T in get_area_turfs(/area/trench_landing)) L+=T if (istype(Obj,/obj/torpedo_targeter) ||istype(Obj,/mob/dead) || istype(Obj,/mob/wraith) || istype(Obj,/mob/living/intangible) || istype(Obj, /obj/lattice) || istype(Obj, /obj/cable/reinforced)) return return_if_overlay_or_effect(Obj) if (L && L.len && !istype(Obj,/obj/overlay) && !istype(Obj,/obj/torpedo_targeter)) Obj.set_loc(pick(L)) ..(Obj,OldLoc) //Manta /turf/space/fluid/manta/nospawn spawningFlags = null //******************************************** MANTA COMPATIBLE DATUMS HERE ******************************************** //REPAIRING: wrench > screwdriver > crowbar > wires > welder > wrench > screwdriver > sheet > welder /datum/action/bar/icon/propeller_fix id = "propeller_fix1" interrupt_flags = INTERRUPT_MOVE | INTERRUPT_ACT | INTERRUPT_STUNNED | INTERRUPT_ACTION duration = 200 icon = 'icons/ui/actions.dmi' icon_state = "working" var/obj/machinery/mantapropulsion/propeller var/obj/item/the_tool New(var/obj/O, var/obj/item/tool, var/duration_i) ..() if (O) propeller = O if (tool) the_tool = tool icon = the_tool.icon icon_state = the_tool.icon_state if (duration_i) duration = duration_i if (ishuman(owner)) var/mob/living/carbon/human/H = owner if (H.mind.assigned_role == "Chief Engineer") duration = round(duration / 2) if (H.mind.assigned_role == "Engineer") duration = round(duration / 2) if (H.mind.assigned_role == "Mechanic") duration = round(duration / 2) onUpdate() ..() if (propeller == null || the_tool == null || owner == null || get_dist(owner, propeller) > 1) interrupt(INTERRUPT_ALWAYS) return var/mob/source = owner if (istype(source) && the_tool != source.equipped()) interrupt(INTERRUPT_ALWAYS) onStart() ..() if (propeller.repairstate == 1) playsound(get_turf(propeller), "sound/items/Ratchet.ogg", 50, 1) owner.visible_message("[owner] begins to loosen the outer bolts.") if (propeller.repairstate == 2) playsound(get_turf(propeller), "sound/items/Screwdriver.ogg", 50, 1) owner.visible_message("[owner] begins to unscrew the casings screws..") if (propeller.repairstate == 3) owner.visible_message("[owner] begins prying the outer casing.") playsound(get_turf(propeller), "sound/items/Crowbar.ogg", 60, 1) if (propeller.repairstate == 4) playsound(get_turf(propeller), "sound/impact_sounds/Generic_Stab_1.ogg", 60, 1) owner.visible_message("[owner] begins reconnecting and replacing the damaged cables.") if (propeller.repairstate == 5) playsound(get_turf(propeller), "sound/items/Welder.ogg", 50, 1) owner.visible_message("[owner] begins to weld the connection points and soldering the control board.") if (propeller.repairstate == 6) playsound(get_turf(propeller), "sound/items/Ratchet.ogg", 60, 1) owner.visible_message("[owner] begins securing the bolts to the casing.") if (propeller.repairstate == 7) playsound(get_turf(propeller), "sound/items/Screwdriver.ogg", 50, 1) owner.visible_message("[owner] places the casing back on and begins securing the casing and its screws back on.") if (propeller.repairstate == 8) playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 50, 1) owner.visible_message("[owner] begins constructing replacements for the propellers..") if (propeller.repairstate == 9) playsound(get_turf(propeller), "sound/items/Welder.ogg", 60, 1) owner.visible_message("[owner] begins to weld the replacement propellers on.") onEnd() ..() if (propeller.repairstate == 1) propeller.repairstate = 2 boutput(owner, "You remove the bolts.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's totaled, the securing bolts are off, just have to unscrew the casing screws now." return if (propeller.repairstate == 2) propeller.repairstate = 3 boutput(owner, "You remove the screws.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's totaled. The casing looks like it can be pried off now." return if (propeller.repairstate == 3) propeller.repairstate = 4 boutput(owner, "You pry the outer casing off.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's totaled. The casing's off and the motor wiring is exposed, might need replacing." return if (propeller.repairstate == 4) propeller.repairstate = 5 boutput(owner, "You reconnect the damaged cables and re-wire the propellers internal motor.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's totaled. The wiring connectors needs to be welded onto the motor now." return if (propeller.repairstate == 5) propeller.repairstate = 6 boutput(owner, "You finish welding the points and the board.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's partially fixed. the wiring looks good, better secure it with bolts before moving on." return if (propeller.repairstate == 6) propeller.repairstate = 7 boutput(owner, "You secure the bolts back to the casing.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's partially fixed. the wiring looks good, better secure it with screws before moving on.." return if (propeller.repairstate == 7) propeller.repairstate = 8 boutput(owner, "You finish placing the casing back on and successfully attach it with screws.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's partially fixed.The casing's closed, but the propellers are mangled, will probably need 5 sheets of metal to weld on a replacement." return if (propeller.repairstate == 8) propeller.repairstate = 9 boutput(owner, "You finish building the replacement propellers.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.desc = "It's nearly fixed. The replacement propellers are ready, just have to weld them on now." if (the_tool != null) the_tool.amount -= 5 if(the_tool.amount <= 0) qdel(the_tool) return if (propeller.repairstate == 9) propeller.repairstate = 0 propeller.broken = 0 boutput(owner, "You finish welding the replacement propellers,the propeller is again in working condition.") playsound(get_turf(propeller), "sound/items/Deconstruct.ogg", 80, 1) propeller.health = 100 mantaPropellers.Add(src) if (mantaMoving == 1) propeller.on = 1 propeller.icon_state = "bigsea_propulsion" else propeller.on = 0 propeller.icon_state = "bigsea_propulsion_off" //REPAIRING: screwdriver > wirecutters > cable coil > wirecutters > multitool > screwdriver /datum/action/bar/icon/junctionbox_fix id = "junctionbox_fix" interrupt_flags = INTERRUPT_MOVE | INTERRUPT_ACT | INTERRUPT_STUNNED | INTERRUPT_ACTION duration = 200 icon = 'icons/ui/actions.dmi' icon_state = "working" var/obj/machinery/junctionbox/box var/obj/item/the_tool New(var/obj/O, var/obj/item/tool, var/duration_i) ..() if (O) box = O if (tool) the_tool = tool icon = the_tool.icon icon_state = the_tool.icon_state if (duration_i) duration = duration_i if (ishuman(owner)) var/mob/living/carbon/human/H = owner if (H.mind.assigned_role == "Chief Engineer") duration = round(duration / 2) if (H.mind.assigned_role == "Engineer") duration = round(duration / 2) if (H.mind.assigned_role == "Mechanic") duration = round(duration / 2) onUpdate() ..() if (box == null || the_tool == null || owner == null || get_dist(owner, box) > 1) interrupt(INTERRUPT_ALWAYS) return var/mob/source = owner if (istype(source) && the_tool != source.equipped()) interrupt(INTERRUPT_ALWAYS) onStart() ..() if (box.repairstate == 1) playsound(get_turf(box), "sound/items/Screwdriver.ogg", 100, 1) owner.visible_message("[owner] begins to unscrew the casings screws.") if (box.repairstate == 2) playsound(get_turf(box), "sound/items/Wirecutter.ogg", 100, 1) owner.visible_message("[owner] begins cutting out the damaged cables.") if (box.repairstate == 3) playsound(get_turf(box), "sound/impact_sounds/Generic_Stab_1.ogg", 60, 1) owner.visible_message("[owner] begins reconnecting and replacing the damaged cables.") if (box.repairstate == 4) playsound(get_turf(box), "sound/items/Wirecutter.ogg", 100, 1) owner.visible_message("[owner] begins cutting out the excess bits of cable.") if (box.repairstate == 5) playsound(get_turf(box), "sound/items/Screwdriver.ogg", 100, 1) owner.visible_message("[owner] begins to screw the casings screws back on.") onEnd() ..() if (box.repairstate == 1) box.repairstate = 2 boutput(owner, "You successfully remove the screws.") playsound(get_turf(box), "sound/items/Deconstruct.ogg", 80, 1) box.desc = "Perhaps you should cut out the damaged wires?" return if (box.repairstate == 2) boutput(owner, "You cut out the damaged cables. ") playsound(get_turf(box), "sound/items/Deconstruct.ogg", 80, 1) box.repairstate = 3 box.desc = "You should reconnect the damaged wires by adding some new wire." return if (box.repairstate == 3) box.repairstate = 4 boutput(owner, "You reconnect the damaged cables and re-wire the junction box.") playsound(get_turf(box), "sound/items/Deconstruct.ogg", 80, 1) box.desc = "You should maybe cut off the excess bits of cable out." return if (box.repairstate == 4) boutput(owner, "You cut out excess bits of cable.") playsound(get_turf(box), "sound/items/Deconstruct.ogg", 80, 1) box.repairstate = 5 box.desc = "Alright, that should do it. Just have to screw the casing back on now." return if (box.repairstate == 5) box.repairstate = 0 box.broken = 0 boutput(owner, "You successfully screw the casing back on.") playsound(get_turf(box), "sound/items/Deconstruct.ogg", 80, 1) mantaJunctionbox.Add(src) box.desc = "An electrical junction box is an enclosure housing electrical connections, to protect the connections and provide a safety barrier." return //REPAIRING: screwdriver > wirecutters > cable coil > wirecutters > multitool > screwdriver /datum/action/bar/icon/magnettether_fix id = "junctionbox_fix" interrupt_flags = INTERRUPT_MOVE | INTERRUPT_ACT | INTERRUPT_STUNNED | INTERRUPT_ACTION duration = 200 icon = 'icons/ui/actions.dmi' icon_state = "working" var/obj/machinery/magneticbeacon/magnet var/obj/item/the_tool New(var/obj/O, var/obj/item/tool, var/duration_i) ..() if (O) magnet = O if (tool) the_tool = tool icon = the_tool.icon icon_state = the_tool.icon_state if (duration_i) duration = duration_i if (ishuman(owner)) var/mob/living/carbon/human/H = owner if (H.mind.assigned_role == "Chief Engineer") duration = round(duration / 2) if (H.mind.assigned_role == "Engineer") duration = round(duration / 2) if (H.mind.assigned_role == "Mechanic") duration = round(duration / 2) onUpdate() ..() if (magnet == null || the_tool == null || owner == null || get_dist(owner, magnet) > 1) interrupt(INTERRUPT_ALWAYS) return var/mob/source = owner if (istype(source) && the_tool != source.equipped()) interrupt(INTERRUPT_ALWAYS) onStart() ..() if (magnet.repairstate == 1) playsound(get_turf(magnet), "sound/items/Screwdriver.ogg", 100, 1) owner.visible_message("[owner] begins to unscrew the casings screws.") if (magnet.repairstate == 2) playsound(get_turf(magnet), "sound/items/Wirecutter.ogg", 100, 1) owner.visible_message("[owner] begins cutting out the damaged cables.") if (magnet.repairstate == 3) playsound(get_turf(magnet), "sound/impact_sounds/Generic_Stab_1.ogg", 60, 1) owner.visible_message("[owner] begins reconnecting and replacing the damaged cables.") if (magnet.repairstate == 4) playsound(get_turf(magnet), "sound/items/Wirecutter.ogg", 100, 1) owner.visible_message("[owner] begins cutting out the excess bits of cable.") if (magnet.repairstate == 5) playsound(get_turf(magnet), "sound/items/Screwdriver.ogg", 100, 1) owner.visible_message("[owner] begins to screw the casings screws back on.") onEnd() ..() if (magnet.repairstate == 1) magnet.repairstate = 2 boutput(owner, "You successfully remove the screws.") playsound(get_turf(magnet), "sound/items/Deconstruct.ogg", 80, 1) magnet.desc = "Perhaps you should cut out the damaged wires?" return if (magnet.repairstate == 2) boutput(owner, "You cut out the damaged cables. ") playsound(get_turf(magnet), "sound/items/Deconstruct.ogg", 80, 1) magnet.repairstate = 3 magnet.desc = "You should reconnect the damaged wires by adding some new wire." return if (magnet.repairstate == 3) magnet.repairstate = 4 boutput(owner, "You reconnect the damaged cables and re-wire the junction box.") playsound(get_turf(magnet), "sound/items/Deconstruct.ogg", 80, 1) magnet.desc = "You should maybe cut off the excess bits of cable out." return if (magnet.repairstate == 4) boutput(owner, "You cut out excess bits of cable.") playsound(get_turf(magnet), "sound/items/Deconstruct.ogg", 80, 1) magnet.repairstate = 5 magnet.desc = "Alright, that should do it. Just have to screw the casing back on now." return if (magnet.repairstate == 5) magnet.repairstate = 0 magnet.broken = 0 magnet.icon_state = "magbeacon" boutput(owner, "You successfully screw the casing back on.") playsound(get_turf(magnet), "sound/items/Deconstruct.ogg", 80, 1) MagneticTether = 1 magnet.health = 100 magnet.desc = "A rather delicate magnetic tether array. It allows people to safely explore the ocean around NSS Manta while carrying a magnetic attachment point." command_alert("The Magnetic tether has been successfully repaired. Magnetic attachment points are online once again.", "Magnetic Tether Repaired") return #ifdef MOVING_SUB_MAP //Defined in the map-specific .dm configuration file. /datum/random_event/special/mantacommsdown name = "Communications Malfunction" event_effect(var/source) ..() if (random_events.announce_events) command_alert("Communication tower has been severely damaged aboard NSS Manta. Ships automated communication system will now attempt to re-establish signal through backup channel. We estimate this will take eight to ten minutes.", "Communications Malfunction") world << 'sound/effects/commsdown.ogg' sleep(rand(80,100)) signal_loss += 100 sleep(rand(4800,6000)) signal_loss -= 100 if (random_events.announce_events) command_alert("Communication link has been established with Oshan Laboratory through backkup channel. Communications should be restored to normal aboard NSS Manta.", "Communications Restored") else message_admins("Manta Comms event ceasing.") /datum/random_event/major/electricmalfunction name = "Electrical Malfunction" event_effect() ..() var/obj/machinery/junctionbox/J = mantaJunctionbox[rand(3,mantaJunctionbox.len)] if (J.broken == 1) return J.Breakdown() command_alert("Certain junction boxes are malfunctioning around NSS Manta. Please seek out and repair the malfunctioning junction boxes before they lead to power outages.", "Electrical Malfunction") /datum/random_event/special/namepending name = "Name Pending" event_effect() ..() var/list/EV = list() //var/delay = rand(2000,3000) hissssss //var/obj/effect/boommarker/B = /obj/effect/boommarker for(var/obj/landmark/S in landmarks)//world) if (S.name == "bigboom") EV.Add(S.loc) var/bigboommark = pick(EV) var/list/eligible = mantaPropellers.Copy() for(var/i=0, i<3, i++) var/obj/machinery/mantapropulsion/big/P = eligible[rand(1,eligible.len)] P.Breakdown() eligible.Remove(P) sleep(10) new /obj/effect/boommarker(bigboommark) #endif //******************************************** MANTA COMPATIBLE AREAS HERE ******************************************** //Also ugh, duplicate code. /area/mantaSpace icon_state = "blue" // ************** Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) // ************** /area proc/removeManta(atom/movable/Obj) mantaPushList.Remove(Obj) Obj.temp_flags &= ~MANTA_PUSHING return proc/addManta(atom/movable/Obj) if(!istype(Obj, /obj/overlay) && !istype(Obj, /obj/machinery/light_area_manager) && istype(Obj, /atom/movable)) if(!(Obj.temp_flags & MANTA_PUSHING)) mantaPushList.Add(Obj) Obj.temp_flags |= MANTA_PUSHING return /area/propellerpower icon_state = "propeller" name = "Propellers" color = OCEAN_COLOR Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/supply/sell_point/manta ambient_light = OCEAN_LIGHT Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/supply/spawn_point/manta color = OCEAN_COLOR requires_power = 0 force_fullbright = 0 luminosity = 0 Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/station/shield_zone/manta Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/shuttle/merchant_shuttle/left_station/cogmap/manta filler_turf = "/turf/space/fluid/manta" Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/shuttle/merchant_shuttle/right_station/cogmap/manta filler_turf = "/turf/space/fluid/manta" Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/station/com_dish/manta Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/shuttle/john/diner/manta filler_turf = "/turf/space/fluid/manta" Entered(atom/movable/Obj,atom/OldLoc) addManta(Obj) return ..(Obj, OldLoc) Exited(atom/movable/Obj, atom/newLoc) removeManta(Obj) return ..(Obj, newLoc) /area/station/abandonedship name = "Abandoned ship" icon_state = "yellow" //******************************************** MANTA SECRET STUFF HERE ******************************************** //******************************************** NSS POLARIS STUFF ******************************************** /area/crashsite name = "Crash site" icon_state = "green" /area/wrecknsspolaris name = "Wreck of NSS Polaris" icon_state = "green" sound_group = "polaris" teleport_blocked = 1 sound_loop = 'sound/ambience/loop/Polarisloop.ogg' /area/wrecknsspolaris/vault requires_power = 0 /area/wrecknsspolaris/outside icon_state = "blue" ambient_light = OCEAN_LIGHT /area/wrecknsspolaris/outside/teleport /area/wrecknsspolaris/outside/back /obj/item/parts/human_parts/arm/right/polaris name = "misplaced right arm" desc = "Someone might need a hand with this." /obj/machinery/handscanner name = "Hand Scanner" icon = 'icons/obj/decoration.dmi' icon_state = "handscanner" var/id = "polarisdoor" var/used = 0 /obj/machinery/hanscanner/New() ..() UnsubscribeProcess() /obj/machinery/handscanner/attackby(obj/item/W, mob/user as mob) if(istype(W, /obj/item/device/detective_scanner)) return if (used == 0) if(istype(W, /obj/item/parts/human_parts/arm/right/polaris)) user.visible_message("The [src] accepts the biometrics of the hand and beeps, granting you access.") playsound(src.loc, "sound/effects/handscan.ogg", 50, 1) for (var/obj/machinery/door/airlock/M in doors) if (M.id == src.id) if (M.density) M.open() M.operating = -1 used = 1 /obj/machinery/handscanner/attack_hand(mob/user as mob) src.add_fingerprint(user) playsound(src.loc, "sound/effects/handscan.ogg", 50, 1) if (used == 0) if (ishuman(user)) var/mob/living/carbon/human/H = user if (H.limbs && (istype(H.limbs.r_arm, /obj/item/parts/human_parts/arm/right/polaris))) user.visible_message("The [src] accepts the biometrics of the hand and beeps, granting you access.") for (var/obj/machinery/door/poddoor/M in doors) if (M.id == src.id) if (M.density) M.open() for (var/obj/machinery/door/airlock/M in doors) if (M.id == src.id) if (M.density) M.open() M.operating = -1 used = 1 else boutput(user, "Invalid biometric profile. Access denied.") else boutput(user, "The door has already been opened. It looks like the mechanism has jammed for good.") /obj/item/storage/secure/ssafe/polaris name = "captain's lockbox" configure_mode = 0 random_code = 1 spawn_contents = list(/obj/item/card/id/polaris, /obj/item/paper/manta_polarisnote,/obj/item/reagent_containers/emergency_injector/random,/obj/item/spacecash/thousand, /obj/item/spacecash/thousand,/obj/item/spacecash/thousand) /obj/item/card/id/polaris name = "Sergeant's spare ID" icon_state = "polaris" registered = "Sgt. Wilkins" assignment = "Sergeant" access = list(access_polariscargo,access_heads) /obj/item/card/id/blank_polaris name = "blank Nanotrasen ID" icon_state = "polaris" /obj/item/broken_egun name = "broken energy gun" inhand_image_icon = 'icons/mob/inhand/hand_weapons.dmi' icon = 'icons/obj/items.dmi' icon_state = "broken_egun" desc = "Its a gun that has two modes, stun and kill, although this one is nowhere near working condition." item_state = "energy" force = 5.0 /obj/item/blackbox name = "flight recorder of NSS Polaris" inhand_image_icon = 'icons/mob/inhand/hand_general.dmi' icon = 'icons/obj/items.dmi' icon_state = "blackbox" desc = "A flight recorder is an electronic recording device placed in an spacecraft for the purpose of facilitating the investigation of accidents and incidents. Someone from Nanotrasen would surely want to see this." item_state = "electropack" force = 5.0 /turf/unsimulated/floor/polarispit name = "deep abyss" desc = "You can't see the bottom." icon = 'icons/turf/outdoors.dmi' icon_state = "pit" fullbright = 0 pathable = 0 // this is the code for falling from abyss into ice caves // could maybe use an animation, or better text. perhaps a slide whistle ogg? Entered(atom/A as mob|obj) if (isobserver(A) || isintangible(A)) return ..() if (polarisfall.len) var/turf/T = pick(polarisfall) fall_to(T, A) return else ..() polarispitwall icon_state = "pit_wall"