diff --git a/baystation12.dme b/baystation12.dme index 589705e429..2bafd5ed58 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -67,10 +67,7 @@ #include "code\__HELPERS\icons.dm" #include "code\__HELPERS\lists.dm" #include "code\__HELPERS\logging.dm" -#include "code\__HELPERS\maths.dm" -#include "code\__HELPERS\mobs.dm" #include "code\__HELPERS\names.dm" -#include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" @@ -143,7 +140,6 @@ #include "code\datums\diseases\wizarditis.dm" #include "code\datums\diseases\xeno_transformation.dm" #include "code\datums\diseases\advance\advance.dm" -#include "code\datums\diseases\advance\presets.dm" #include "code\datums\diseases\advance\symptoms\confusion.dm" #include "code\datums\diseases\advance\symptoms\cough.dm" #include "code\datums\diseases\advance\symptoms\damage_converter.dm" @@ -151,12 +147,10 @@ #include "code\datums\diseases\advance\symptoms\fever.dm" #include "code\datums\diseases\advance\symptoms\hallucigen.dm" #include "code\datums\diseases\advance\symptoms\headache.dm" -#include "code\datums\diseases\advance\symptoms\heal.dm" #include "code\datums\diseases\advance\symptoms\itching.dm" #include "code\datums\diseases\advance\symptoms\shivering.dm" #include "code\datums\diseases\advance\symptoms\sneeze.dm" #include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\voice_change.dm" #include "code\datums\diseases\advance\symptoms\vomit.dm" #include "code\datums\diseases\advance\symptoms\weight.dm" #include "code\datums\helper_datums\construction_datum.dm" @@ -378,7 +372,6 @@ #include "code\game\machinery\computer\syndicate_specops_shuttle.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\alarmlock.dm" #include "code\game\machinery\doors\brigdoors.dm" #include "code\game\machinery\doors\checkForMultipleDoors.dm" #include "code\game\machinery\doors\door.dm" @@ -581,7 +574,6 @@ #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\false_walls.dm" -#include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" #include "code\game\objects\structures\kitchen_spike.dm" @@ -594,7 +586,6 @@ #include "code\game\objects\structures\morgue.dm" #include "code\game\objects\structures\musician.dm" #include "code\game\objects\structures\noticeboard.dm" -#include "code\game\objects\structures\signs.dm" #include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" @@ -710,7 +701,6 @@ #include "code\modules\assembly\timer.dm" #include "code\modules\awaymissions\bluespaceartillery.dm" #include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" #include "code\modules\awaymissions\gateway.dm" #include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\pamphlet.dm" @@ -722,9 +712,6 @@ #include "code\modules\awaymissions\maploader\writer.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_savefile.dm" -#include "code\modules\client\preferences_toggles.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\glasses\glasses.dm" #include "code\modules\clothing\glasses\hud.dm" @@ -798,7 +785,6 @@ #include "code\modules\mining\mine_turfs.dm" #include "code\modules\mining\mint.dm" #include "code\modules\mining\money_bag.dm" -#include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\inventory.dm" @@ -954,7 +940,6 @@ #include "code\modules\mob\living\silicon\robot\wires.dm" #include "code\modules\mob\living\simple_animal\clown.dm" #include "code\modules\mob\living\simple_animal\constructs.dm" -#include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\kobold.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" @@ -968,12 +953,7 @@ #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" -#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" -#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" -#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\russian.dm" -#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" #include "code\modules\mob\new_player\hud.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" @@ -991,7 +971,6 @@ #include "code\modules\paperwork\paperbin.dm" #include "code\modules\paperwork\pen.dm" #include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\photography.dm" #include "code\modules\paperwork\stamps.dm" #include "code\modules\power\apc.dm" #include "code\modules\power\cable.dm" @@ -1185,7 +1164,5 @@ #include "interface\skin.dmf" #include "maps\tgstation.2.0.9.1.dmm" #include "maps\RandomZLevels\Academy.dm" -#include "maps\RandomZLevels\challenge.dm" #include "maps\RandomZLevels\stationCollision.dm" -#include "maps\RandomZLevels\wildwest.dm" // END_INCLUDE diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 61cd0f6c6e..5683df4bf7 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -395,7 +395,7 @@ obj/machinery/atmospherics/tvalve/mirrored return ..() - //Radio remote control + //Radio remote control -eh? proc set_frequency(new_frequency) diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index cbff1f1b64..e13a58f601 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -721,7 +721,7 @@ obj/machinery/atmospherics/pipe icon_state = "manifold_[connected]_[unconnected]" - if(!connected) + if(!connected) del(src) return @@ -832,7 +832,7 @@ obj/machinery/atmospherics/pipe icon_state = "manifold-y-f" manifold4w - icon = 'pipe_manifold.dmi' + icon = 'icons/obj/atmospherics/pipe_manifold.dmi' icon_state = "manifold4w-f" name = "4-way pipe manifold" @@ -841,7 +841,7 @@ obj/machinery/atmospherics/pipe volume = 140 dir = SOUTH - initialize_directions = EAST|NORTH|WEST|SOUTH + initialize_directions = NORTH|SOUTH|EAST|WEST var/obj/machinery/atmospherics/node1 var/obj/machinery/atmospherics/node2 @@ -849,6 +849,7 @@ obj/machinery/atmospherics/pipe var/obj/machinery/atmospherics/node4 level = 1 + layer = 2.4 //under wires with their 2.44 hide(var/i) if(level == 1 && istype(loc, /turf/simulated)) @@ -862,7 +863,7 @@ obj/machinery/atmospherics/pipe if(!parent) ..() else - machines.Remove(src) + . = PROCESS_KILL /* if(!node1) parent.mingle_with_turf(loc, 70) @@ -913,14 +914,13 @@ obj/machinery/atmospherics/pipe if(reference == node4) if(istype(node4, /obj/machinery/atmospherics/pipe)) del(parent) - node3 = null + node4 = null update_icon() ..() update_icon() - overlays = new() if(node1&&node2&&node3&&node4) var/C = "" switch(color) @@ -934,7 +934,7 @@ obj/machinery/atmospherics/pipe else icon_state = "manifold4w_ex" - var/icon/con = new/icon('pipe_manifold.dmi',"manifold4w_con") + var/icon/con = new/icon('pipe_manifold.dmi',"manifold4w_con") //Since 4-ways are supposed to be directionless, they need an overlay instead it seems. if(node1) overlays += new/image(con,dir=1) @@ -950,23 +950,24 @@ obj/machinery/atmospherics/pipe return initialize() + for(var/obj/machinery/atmospherics/target in get_step(src,1)) - if(target.initialize_directions & get_dir(target,src)) + if(target.initialize_directions & 2) node1 = target break for(var/obj/machinery/atmospherics/target in get_step(src,2)) - if(target.initialize_directions & get_dir(target,src)) + if(target.initialize_directions & 1) node2 = target break for(var/obj/machinery/atmospherics/target in get_step(src,4)) - if(target.initialize_directions & get_dir(target,src)) + if(target.initialize_directions & 8) node3 = target break for(var/obj/machinery/atmospherics/target in get_step(src,8)) - if(target.initialize_directions & get_dir(target,src)) + if(target.initialize_directions & 4) node4 = target break @@ -1026,6 +1027,88 @@ obj/machinery/atmospherics/pipe manifold4w/general/hidden level = 1 icon_state = "manifold4w-f" + + cap + name = "pipe endcap" + desc = "An endcap for pipes" + icon = 'pipes.dmi' + icon_state = "cap" + level = 2 + layer = 2.4 //under wires with their 2.44 + + volume = 35 + + dir = SOUTH + initialize_directions = NORTH + + var/obj/machinery/atmospherics/node + + New() + ..() + switch(dir) + if(SOUTH) + initialize_directions = NORTH + if(NORTH) + initialize_directions = SOUTH + if(WEST) + initialize_directions = EAST + if(EAST) + initialize_directions = WEST + + hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() + + pipeline_expansion() + return list(node) + + process() + if(!parent) + ..() + else + . = PROCESS_KILL + Del() + if(node) + node.disconnect(src) + + ..() + + disconnect(obj/machinery/atmospherics/reference) + if(reference == node) + if(istype(node, /obj/machinery/atmospherics/pipe)) + del(parent) + node = null + + update_icon() + + ..() + + update_icon() + overlays = new() + + icon_state = "cap[invisibility ? "-f" : ""]" + return + + initialize() + for(var/obj/machinery/atmospherics/target in get_step(src, dir)) + if(target.initialize_directions & get_dir(target,src)) + node = target + break + + var/turf/T = src.loc // hide if turf is not intact + hide(T.intact) + //update_icon() + update_icon() + + visible + level = 2 + icon_state = "cap" + + hidden + level = 1 + icon_state = "cap-f" + obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (istype(src, /obj/machinery/atmospherics/pipe/tank)) diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index 404afdbb85..f07cf4b1f0 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -39,6 +39,16 @@ // evil infection stuff that will make everyone hate me var/can_infect = 0 + proc/isright(obj/item/tool) //is it is a required surgical tool for this step + return (istype(tool,required_tool)) + + proc/isacceptable(obj/item/tool) //is it is an accepted replacement tool for this step + if (allowed_tools) + for (var/T in allowed_tools) + if (istype(tool,T)) + return 1 + return 0 + // Build this list by iterating over all typesof(/datum/surgery_step) and sorting the results by priority @@ -1226,3 +1236,68 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) user:bloody_hands(target, 0) user:bloody_body(target) +////////////////////////////////////////////////////////////////// +// IMPLANT REMOVAL SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/implant_removal + required_tool = /obj/item/weapon/hemostat + allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork) + + min_duration = 80 + max_duration = 100 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \ + "You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" ) + target.custom_pain("The pain in your chest is living hell!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ("chest") + + var/find_prob = 0 + if (affected.implants.len) + var/obj/item/weapon/implant/imp = affected.implants[1] + if (imp.islegal()) + find_prob +=60 + else + find_prob +=40 + if (isright(tool)) + find_prob +=20 + + if (prob(find_prob)) + user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \ + "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." ) + var/obj/item/weapon/implant/imp = affected.implants[1] + affected.implants -= imp + imp.loc = get_turf(target) + imp.imp_in = null + imp.implanted = 0 + else + user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \ + "\blue You could not find anything inside [target]'s [affected.display_name]." ) + if (ishuman(user) && prob(80)) user:bloody_hands(target, 0) + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ(target_zone) + user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \ + "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!") + affected.createwound(CUT, 20) + if (affected.implants.len) + var/fail_prob = 10 + if (!isright(tool)) + fail_prob += 30 + if (prob(fail_prob)) + var/obj/item/weapon/implant/imp = affected.implants[1] + user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!") + playsound(imp.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + spawn(15) + imp.activate() + if (ishuman(user)) + user:bloody_hands(target, 0) + user:bloody_body(target) \ No newline at end of file diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 7cd6c5cbe3..71196144c6 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -34,6 +34,7 @@ var/open = 0 var/stage = 0 + var/list/implants = list() // INTERNAL germs inside the organ, this is BAD if it's greater 0 var/germ_level = 0 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2f1c87b7e8..08fbed7c2c 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -62,6 +62,8 @@ Devices and Tools; Whitespace:Seperator; Implants; /obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/implant/explosive:6:Explosive Implant (DANGER!); +/obj/item/weapon/implant/compressed:4:Compressed Matter Implant; /obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); Whitespace:Seperator; (Pointless) Badassery; @@ -419,4 +421,4 @@ proc/display_roundstart_logout_report() for(var/mob/M in mob_list) if(M.client && M.client.holder) - M << msg + M << msg diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 3bb0f83bad..ef556cbc70 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -296,7 +296,7 @@ AN = "[e.broken_description]:" if(e.open) open = "Open:" - if(e.implant) + if(e.implants.len) imp = "Implanted:" if(!AN && !open && !infected & !imp) AN = "None:" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index a8488e8c2d..1babba054e 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -20,6 +20,9 @@ Buildable meters #define PIPE_PASSIVE_GATE 15 #define PIPE_VOLUME_PUMP 16 #define PIPE_HEAT_EXCHANGE 17 +#define PIPE_MTVALVE 18 +#define PIPE_MANIFOLD4W 19 +#define PIPE_CAP 20 /obj/item/pipe name = "pipe" @@ -75,6 +78,12 @@ Buildable meters src.pipe_type = PIPE_VOLUME_PUMP else if(istype(make_from, /obj/machinery/atmospherics/unary/heat_exchanger)) src.pipe_type = PIPE_HEAT_EXCHANGE + else if(istype(make_from, /obj/machinery/atmospherics/tvalve)) + src.pipe_type = PIPE_MTVALVE + else if(istype(make_from, /obj/machinery/atmospherics/pipe/manifold4w)) + src.pipe_type = PIPE_MANIFOLD4W + else if(istype(make_from, /obj/machinery/atmospherics/pipe/cap)) + src.pipe_type = PIPE_CAP else src.pipe_type = pipe_type src.dir = dir @@ -105,6 +114,9 @@ Buildable meters "passive gate", \ "volume pump", \ "heat exchanger", \ + "t-valve", \ + "4-way manifold", \ + "pipe cap", \ ) name = nlist[pipe_type+1] + " fitting" var/list/islist = list( \ @@ -126,6 +138,9 @@ Buildable meters "passivegate", \ "volumepump", \ "heunary", \ + "mtvalve", \ + "manifold4w", \ + "cap", \ ) icon_state = islist[pipe_type + 1] @@ -149,6 +164,8 @@ Buildable meters dir = 1 else if(dir==8) dir = 4 + else if (pipe_type == PIPE_MANIFOLD4W) + dir = 2 //src.pipe_dir = get_pipe_dir() return @@ -188,10 +205,14 @@ Buildable meters return dir //dir|acw if(PIPE_CONNECTOR,PIPE_UVENT,PIPE_SCRUBBER,PIPE_HEAT_EXCHANGE) return dir + if(PIPE_MANIFOLD4W) + return dir|flip|cw|acw if(PIPE_MANIFOLD) return flip|cw|acw - if(PIPE_GAS_FILTER, PIPE_GAS_MIXER) + if(PIPE_GAS_FILTER, PIPE_GAS_MIXER,PIPE_MTVALVE) return dir|flip|cw + if(PIPE_CAP) + return flip return 0 /obj/item/pipe/proc/get_pdir() //endpoints for regular pipes @@ -241,6 +262,8 @@ Buildable meters dir = 1 else if(dir==8) dir = 4 + else if (pipe_type == PIPE_MANIFOLD4W) + dir = 2 var/pipe_dir = get_pipe_dir() for(var/obj/machinery/atmospherics/M in src.loc) @@ -325,6 +348,31 @@ Buildable meters if (M.node3) M.node3.initialize() M.node3.build_network() + + if(PIPE_MANIFOLD4W) //4-way manifold + var/obj/machinery/atmospherics/pipe/manifold4w/M = new( src.loc ) + M.dir = dir + M.initialize_directions = pipe_dir + //M.New() + var/turf/T = M.loc + M.level = T.intact ? 2 : 1 + M.initialize() + if (!M) + usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + return 1 + M.build_network() + if (M.node1) + M.node1.initialize() + M.node1.build_network() + if (M.node2) + M.node2.initialize() + M.node2.build_network() + if (M.node3) + M.node3.initialize() + M.node3.build_network() + if (M.node4) + M.node4.initialize() + M.node4.build_network() if(PIPE_JUNCTION) var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc ) @@ -467,6 +515,36 @@ Buildable meters if (P.node2) P.node2.initialize() P.node2.build_network() + + if(PIPE_MTVALVE) //manual t-valve + var/obj/machinery/atmospherics/tvalve/V = new(src.loc) + V.dir = dir + V.initialize_directions = pipe_dir + if (pipename) + V.name = pipename + var/turf/T = V.loc + V.level = T.intact ? 2 : 1 + V.initialize() + V.build_network() + if (V.node1) + V.node1.initialize() + V.node1.build_network() + if (V.node2) + V.node2.initialize() + V.node2.build_network() + if (V.node3) + V.node3.initialize() + V.node3.build_network() + + if(PIPE_CAP) + var/obj/machinery/atmospherics/pipe/cap/C = new(src.loc) + C.dir = dir + C.initialize_directions = pipe_dir + C.initialize() + C.build_network() + if(C.node) + C.node.initialize() + C.node.build_network() if(PIPE_PASSIVE_GATE) //passive gate var/obj/machinery/atmospherics/binary/passive_gate/P = new(src.loc) @@ -551,7 +629,7 @@ Buildable meters playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "\blue You have fastened the meter to the pipe" del(src) - +//not sure why these are necessary #undef PIPE_SIMPLE_STRAIGHT #undef PIPE_SIMPLE_BENT #undef PIPE_HE_STRAIGHT @@ -569,4 +647,6 @@ Buildable meters #undef PIPE_GAS_MIXER #undef PIPE_PASSIVE_GATE #undef PIPE_VOLUME_PUMP -#undef PIPE_OUTLET_INJECT \ No newline at end of file +#undef PIPE_OUTLET_INJECT +#undef PIPE_MTVALVE +//#undef PIPE_MANIFOLD4W \ No newline at end of file diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index d5da74c569..87001bcf47 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -19,6 +19,9 @@ Bent Pipe
Manifold
Manual Valve
+Pipe Cap
+4-Way Manifold
+Manual T-Valve
Devices:
Connector
Unary Vent
@@ -37,8 +40,9 @@ Insulated pipes:
Pipe
Bent Pipe
-"} +"} +//What number the make points to is in the define # at the top of construction.dm in same folder user << browse("[src][dat]", "window=pipedispenser") onclose(user, "pipedispenser") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f3e14d0b29..acf60d5dd3 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1153,7 +1153,7 @@ src.occupant.client.perspective = MOB_PERSPECTIVE */ src.occupant << browse(null, "window=exosuit") - if(istype(mob_container, /obj/item/device/mmi)) + if(istype(mob_container, /obj/item/device/mmi) || istype(mob_container, /obj/item/device/posibrain)) var/obj/item/device/mmi/mmi = mob_container if(mmi.brainmob) occupant.loc = mmi diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b6c7cf8da8..b2c9caaa15 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -186,26 +186,21 @@ if (!istype(M)) // not sure if this is the right thing... return + if (can_operate(M)) //Checks if mob is lying down on table for surgery if(istype(M,/mob/living/carbon)) - if (user.a_intent != "harm") + if (user.a_intent != "harm") //check for Hippocratic Oath if(surgery_steps.len == 0) build_surgery_steps_list() for(var/datum/surgery_step/S in surgery_steps) - //check if tool is right or close enough - var/right = istype(src, S.required_tool) - if (!right && S.allowed_tools) - for (var/T in S.allowed_tools) - if (istype(src, T)) - right = 1 - if(right && S.can_use(user, M, user.zone_sel.selecting, src)) //is this step possible? - S.begin_step(user, M, user.zone_sel.selecting, src) - if(do_mob(user, M, rand(S.min_duration, S.max_duration))) - S.end_step(user, M, user.zone_sel.selecting, src) - else - S.fail_step(user, M, user.zone_sel.selecting, src) - return //don't want to do weapony things after surgery - if (is_surgery_tool(src)) - return + if( S.isright(src) || S.isacceptable(src) ) //check if tool is right or close enough + if(S.can_use(user, M, user.zone_sel.selecting, src)) //and if this step is possible + S.begin_step(user, M, user.zone_sel.selecting, src) //start on it + if(do_mob(user, M, rand(S.min_duration, S.max_duration))) //if user did nto move or changed hands + S.end_step(user, M, user.zone_sel.selecting, src) //finish successfully + else //or + S.fail_step(user, M, user.zone_sel.selecting, src) //malpractice~ + return //don't want to do weapony things after surgery + var/messagesource = M diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 189aad862a..b9dc317043 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -198,6 +198,7 @@ user.drop_item() + O.mmi = W O.invisibility = 0 O.custom_name = created_name O.updatename("Default") @@ -212,7 +213,6 @@ O.cell = chest.cell O.cell.loc = O W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. - O.mmi = W feedback_inc("cyborg_birth",1) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 555d55dcc7..3817e58b11 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -1,7 +1,10 @@ /obj/item/weapon/implant name = "implant" + icon = 'device.dmi' + icon_state = "implant" var/implanted = null var/mob/imp_in = null + var/datum/organ/external/part = null color = "b" var/allow_reagents = 0 @@ -23,8 +26,8 @@ proc/hear(message, source as mob) return - - + proc/islegal() + return 0 /obj/item/weapon/implant/tracking name = "tracking" @@ -82,6 +85,8 @@ Implant Specifics:
"} if(src.imp_in) src.imp_in.gib() + islegal() + return 0 //BS12 Explosive /obj/item/weapon/implant/explosive name = "explosive implant" @@ -110,15 +115,18 @@ Implant Specifics:
"} var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "") msg = sanitize_simple(msg, replacechars) if(findtext(msg,phrase)) - if(istype(imp_in, /mob/)) - var/mob/T = imp_in - T.gib() - explosion(get_turf(imp_in), 1, 3, 4, 6, 3) - var/turf/t = get_turf(imp_in) - if(t) - t.hotspot_expose(3500,125) + activate() del(src) + activate() + if(istype(imp_in, /mob/)) + var/mob/T = imp_in + T.gib() + explosion(get_turf(imp_in), 1, 3, 4, 6, 3) + var/turf/t = get_turf(imp_in) + if(t) + t.hotspot_expose(3500,125) + implanted(mob/source as mob) phrase = input("Choose activation phrase:") as text var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "") @@ -127,6 +135,8 @@ Implant Specifics:
"} usr << "The implanted explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate." return 1 + islegal() + return 0 /obj/item/weapon/implant/chem name = "chem" @@ -266,14 +276,16 @@ the implant may become unstable and either pre-maturely inject the subject or si process() if (!implanted) return var/mob/M = imp_in - var/area/t = get_area(M) if(isnull(M)) // If the mob got gibbed - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) - a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") - del(a) - processing_objects.Remove(src) + activate() else if(M.stat == 2) + activate("death") + + activate(var/cause) + var/mob/M = imp_in + var/area/t = get_area(M) + if(cause == "death") var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) //give the syndies a bit of stealth @@ -282,7 +294,11 @@ the implant may become unstable and either pre-maturely inject the subject or si a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm") del(a) processing_objects.Remove(src) - + else + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") + del(a) + processing_objects.Remove(src) implanted(mob/source as mob) mobname = source.real_name @@ -314,13 +330,20 @@ the implant may become unstable and either pre-maturely inject the subject or si if (emote == src.activation_emote) source << "The air glows as \the [src.scanned.name] uncompresses." - var/turf/t = get_turf(source) - src.scanned.loc = t - del src + activate() + + activate() + var/turf/t = get_turf(src) + src.scanned.loc = t + if (part) part.implants -= src + del src implanted(mob/source as mob) src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") - source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) + if (source.mind) + source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." return 1 + islegal() + return 0 diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 9cf12fe247..ae21beff2d 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -40,6 +40,11 @@ src.imp.loc = M src.imp.imp_in = M src.imp.implanted = 1 + if (ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/external/affected = H.get_organ(user.zone_sel.selecting) + affected.implants += src.imp + imp.part = affected src.imp = null update() @@ -107,6 +112,10 @@ /obj/item/weapon/implanter/compressed/afterattack(atom/A, mob/user as mob) if(istype(A,/obj/item) && imp) + var/obj/item/weapon/implant/compressed/c = imp + if (c.scanned) + user << "\red Something is already scanned inside the implant!" + return imp:scanned = A A.loc.contents.Remove(A) update() diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index c3bc72ad6f..81e10532a1 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -41,7 +41,7 @@ if(holder.rights & R_ADMIN) C << "OOC: [key][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]" //todo: other adminranks OOC - if(holder.rights & R_MOD) + else if(holder.rights & R_MOD) C << "OOC: [key][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]" else diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 96e42bd46c..3539b4342c 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -58,14 +58,19 @@ src.brainmob.real_name = "PBU-[rand(100, 999)]" src.brainmob.loc = src src.brainmob.container = src + src.brainmob.robot_talk_understand = 1 src.brainmob.stat = 0 src.brainmob.silent = 0 src.brainmob.brain_op_stage = 4.0 src.brainmob.key = candidate.key - dead_mob_list -= src.brainmob living_mob_list += src.brainmob + src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." + src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." + src.brainmob << "Use say :b to speak to other artificial intelligences on the station." + src.brainmob.mind.assigned_role = "Positronic Brain" + var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) M.show_message("\blue The positronic brain chimes quietly.") diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index c4d9a865da..de169087b4 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -5,6 +5,11 @@ if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/posibrain)))) return //No MMI, can't speak, bucko./N else + if ((copytext(message, 1, 3) == ":b") || (copytext(message, 1, 3) == ":B") && (container && istype(container, /obj/item/device/posibrain))) + message = copytext(message, 3) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + robot_talk(message) + return if(prob(emp_damage*4)) if(prob(10))//10% chane to drop the message entirely return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index acd7595e3a..81bf5f03f9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -53,7 +53,7 @@ var/lockcharge //Used when locking down a borg to preserve cell charge var/speed = 0 //Cause sec borgs gotta go fast //No they dont! var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them. - + var/braintype = "Cyborg" /mob/living/silicon/robot/New(loc,var/syndie = 0) spark_system = new /datum/effect/effect/system/spark_spread() @@ -195,11 +195,16 @@ /mob/living/silicon/robot/proc/updatename(var/prefix as text) + if(istype(mmi, /obj/item/device/posibrain)) + braintype = "Android" + else + braintype = "Cyborg" + var/changed_name = "" if(custom_name) changed_name = custom_name else - changed_name = "[(prefix ? "[prefix] " : "")]Cyborg-[num2text(ident)]" + changed_name = "[(prefix ? "[prefix] " : "")][braintype]-[num2text(ident)]" real_name = changed_name name = real_name diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 8cd28f8c53..69aebdda8d 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -587,6 +587,16 @@ datum/design/paicard materials = list("$glass" = 500, "$metal" = 500) build_path = "/obj/item/device/paicard" +datum/design/paicard + name = "Positronic Brain" + desc = "Allows for the construction of a positronic brain" + id = "posibrain" + req_tech = list("engineering" = 4, "materials" = 4, "bluespace" = 2, "programming" = 6) + + build_type = PROTOLATHE + materials = list("$metal" = 2000, "$glass" = 1000, "$silver" = 1000, "$gold" = 500, "$plasma" = 500, "$diamond" = 100) + build_path = "/obj/item/device/posibrain" + /////////////////////////////////// //////////Mecha Module Disks/////// /////////////////////////////////// diff --git a/html/changelog.html b/html/changelog.html index dd89066edf..f66ed3084b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -58,7 +58,24 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> - +
+

7/01/2013

+

Chinsky updated:

+ +

December 28nd

Cael_Aislinn updated:

diff --git a/icons/obj/atmospherics/pipe_manifold.dmi b/icons/obj/atmospherics/pipe_manifold.dmi index f98f5869a4..0687e9e8bc 100644 Binary files a/icons/obj/atmospherics/pipe_manifold.dmi and b/icons/obj/atmospherics/pipe_manifold.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index e57a75e052..4831ad2ebf 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index 00c5760e01..7aad691051 100644 Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index d0b30ea32c..c86711b94e 100755 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/maps/RandomZLevels/zresearchlabs.dmm b/maps/RandomZLevels/zresearchlabs.dmm index 19f2de1a07..a4310ae7bf 100644 --- a/maps/RandomZLevels/zresearchlabs.dmm +++ b/maps/RandomZLevels/zresearchlabs.dmm @@ -907,7 +907,7 @@ "rw" = (/obj/machinery/washing_machine,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/labs/civilian) "rx" = (/obj/effect/decal/cleanable/blood,/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/labs/civilian) "ry" = (/obj/structure/table,/obj/structure/bedsheetbin{pixel_x = -2; pixel_y = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/labs/civilian) -"rz" = (/obj/structure/table,/obj/item/clothing/suit/labcoat{pixel_y = 3},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/labs/civilian) +"rz" = (/obj/structure/table,/obj/item/clothing/suit/storage/labcoat{pixel_y = 3},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/awaymission/labs/civilian) "rA" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/awaymission/labs/civilian) "rB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/awaymission/labs/civilian) "rC" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/awaymission/labs/civilian)