diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 3784519ff95..d41366bfd14 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -153,6 +153,8 @@ "cW" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary) "cX" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "cY" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space) +"cZ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/trackimp,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"da" = (/obj/structure/table/reinforced,/obj/item/weapon/scalpel,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "db" = (/turf/simulated/floor/holofloor{tag = "icon-carpet2-0 (EAST)"; icon_state = "carpet2-0"; dir = 4},/area/holodeck/source_theatre) "do" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "dp" = (/turf/unsimulated/floor{icon_state = "floorgrime"},/area/prison/solitary) @@ -1135,8 +1137,6 @@ "HJ" = (/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) "HK" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) "HL" = (/obj/structure/table/reinforced,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/paper/Court,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HM" = (/obj/structure/table/reinforced,/obj/item/weapon/scalpel,/obj/item/weapon/storage/box/syndie_kit/mindslave,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/syndie_kit/imp_explosive,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "HO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashes,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "HP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/grenades,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) "HQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/teargas,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) @@ -1435,7 +1435,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHeHfDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHgHhHiDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHjHjHjHkHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLHMHNDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 8cca8a70898..a20149b8c97 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -24,6 +24,6 @@ var/global/list/apcs = list() var/global/list/air_alarms = list() var/global/list/power_monitors = list() -var/global/list/tracking_implants = list() //list of all tracking implants to work out what treks everyone are on. Sadly not on lavaworld not implemented... var/global/list/beacons = list() -var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none. \ No newline at end of file +var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none. +var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented... \ No newline at end of file diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index af26f3ed8a1..9c30b3305f0 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -875,18 +875,11 @@ var/list/uplink_items = list() cost = 14 surplus = 0 -/datum/uplink_item/implants/explosive - name = "Explosive Implant" - desc = "An implant injected into the body, and later activated using a vocal command to cause a large explosion from the implant." - reference = "EI" - item = /obj/item/weapon/implanter/explosive - cost = 12 - -/datum/uplink_item/implants/compression - name = "Compressed Matter Implant" - desc = "An implant injected into the body, and later activated using a bodily gesture to retrieve an item that was earlier compressed." - reference = "CI" - item = /obj/item/weapon/implanter/compressed +/datum/uplink_item/implants/storage + name = "Storage Implant" + desc = "An implant injected into the body, and later activated at the user's will. It will open a small subspace pocket capable of storing two items." + reference = "ESI" + item = /obj/item/weapon/implanter/storage cost = 8 /datum/uplink_item/implants/mindslave @@ -903,6 +896,15 @@ var/list/uplink_items = list() item = /obj/item/weapon/implanter/adrenalin cost = 8 +/datum/uplink_item/implants/microbomb + name = "Microbomb Implant" + desc = "An implant injected into the body, and later activated either manually or automatically upon death. The more implants inside of you, the higher the explosive power. \ + This will permanently destroy your body, however." + reference = "MBI" + item = /obj/item/weapon/implanter/explosive + cost = 2 + gamemodes = list(/datum/game_mode/nuclear) + // POINTLESS BADASSERY /datum/uplink_item/badass @@ -949,6 +951,14 @@ var/list/uplink_items = list() item = /obj/item/toy/syndicateballoon cost = 20 +/datum/uplink_item/implants/macrobomb + name = "Macrobomb Implant" + desc = "An implant injected into the body, and later activated either manually or automatically upon death. Upon death, releases a massive explosion that will wipe out everything nearby." + reference = "HAB" + item = /obj/item/weapon/implanter/explosive_macro + cost = 20 + gamemodes = list(/datum/game_mode/nuclear) + /*/datum/uplink_item/badass/random name = "Random Item" desc = "Picking this choice will send you a random item from the list. Useful for when you cannot think of a strategy to finish your objectives with." diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index cb6a50af8ce..3b5127c10c6 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -273,9 +273,8 @@ proc/issyndicate(mob/living/M as mob) if (synd_mob.internals) synd_mob.internals.icon_state = "internal1" - var/obj/item/weapon/implant/dexplosive/E = new/obj/item/weapon/implant/dexplosive(synd_mob) - E.imp_in = synd_mob - E.implanted = 1 + var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob) + E.implant(synd_mob) synd_mob.faction |= "syndicate" synd_mob.update_icons() return 1 diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index c975aa8292c..7fe0121090e 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -342,7 +342,7 @@ /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_SOLO] //var/ref = "\ref[traitor_mind]" - tatorhud.join_solo_hud(traitor_mind.current) + tatorhud.join_solo_hud(traitor_mind.current) set_antag_hud(traitor_mind.current, "hudsyndicate") /datum/game_mode/proc/update_traitor_icons_removed(datum/mind/traitor_mind) diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 6c67ddd71cc..d9c8578c853 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -40,7 +40,7 @@ dat += text("Insert Prisoner ID
") dat += "
Chemical Implants
" var/turf/Tr = null - for(var/obj/item/weapon/implant/chem/C in tracking_implants) + for(var/obj/item/weapon/implant/chem/C in tracked_implants) Tr = get_turf(C) if((Tr) && (Tr.z != src.z)) continue//Out of range if(!C.implanted) continue @@ -54,7 +54,7 @@ ********************************
"} // END AUTOFIX dat += "
Tracking Implants
" - for(var/obj/item/weapon/implant/tracking/T in tracking_implants) + for(var/obj/item/weapon/implant/tracking/T in tracked_implants) Tr = get_turf(T) if((Tr) && (Tr.z != src.z)) continue//Out of range if(!T.implanted) continue @@ -63,8 +63,6 @@ if((M.z in config.station_levels) && !istype(M.loc, /turf/space)) var/turf/mob_loc = get_turf(M) loc_display = mob_loc.loc - if(T.malfunction) - loc_display = pick(teleportlocs) dat += "ID: [T.id] | Location: [loc_display]
" dat += "(Message Holder) |
" dat += "********************************
" diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 2af6157b0ee..6d0f70fc528 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -192,7 +192,7 @@ areaindex[tmpname] = 1 L[tmpname] = R - for (var/obj/item/weapon/implant/tracking/I in tracking_implants) + for (var/obj/item/weapon/implant/tracking/I in tracked_implants) if (!I.implanted || !ismob(I.loc)) continue else diff --git a/code/game/objects/items/weapons/implants/deadman.dm b/code/game/objects/items/weapons/implants/deadman.dm deleted file mode 100644 index 29433380d7e..00000000000 --- a/code/game/objects/items/weapons/implants/deadman.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/item/weapon/implant/deadman - name = "deadman switch implant" - desc = "Activates a signal on death." - var/obj/item/device/assembly/signaler/signaler - icon_state = "implant_evil" - -/obj/item/weapon/implant/deadman/get_data() - var/dat = {" -Implant Specifications:
-Name: Robust Corp RX-79 Deadman Switch Implant
-Life: Activates upon death.
-Important Notes: Sends triggering signal
-
-Implant Details:
-Function: Contains a compact, electric signaller that activates upon host death.
-Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} - return dat - -/obj/item/weapon/implant/deadman/implanted(mob/source as mob) - signaler = new /obj/item/device/assembly/signaler(src) - signaler.interact(source) - usr.mind.store_memory("Deadman switch will broadcast signal on [signaler.frequency] using encryption [signaler.code].", 0, 0) - usr << "Deadman switch will broadcast signal on [signaler.frequency] using encryption [signaler.code]." - -/obj/item/weapon/implant/deadman/trigger(emote, source as mob) - if(emote == "deathgasp") - src.activate("death") - return - -/obj/item/weapon/implant/deadman/activate(var/cause) - if((!cause) || (!src.imp_in)) return 0 - signaler.signal() - -/obj/item/weapon/implant/deadman/islegal() - return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index d27cd74140d..91c6c6726e1 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -1,621 +1,86 @@ -#define MALFUNCTION_TEMPORARY 1 -#define MALFUNCTION_PERMANENT 2 /obj/item/weapon/implant name = "implant" - icon = 'icons/obj/device.dmi' - icon_state = "implant" + icon = 'icons/obj/implants.dmi' + icon_state = "generic" //Shows up as the action button icon + action_button_is_hands_free = 1 origin_tech = "materials=2;biotech=3;programming=2" + + var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like loyalty implants var/implanted = null var/mob/living/imp_in = null var/obj/item/organ/external/part = null item_color = "b" - var/allow_reagents = 0 - var/malfunction = 0 + var/allow_multiple = 0 + var/uses = -1 -/obj/item/weapon/implant/proc/trigger(emote, source as mob) + +/obj/item/weapon/implant/proc/trigger(emote, mob/source) return /obj/item/weapon/implant/proc/activate() return -// What does the implant do upon injection? -// return 0 if the implant fails (ex. Revhead and loyalty implant.) -// return 1 if the implant succeeds (ex. Nonrevhead and loyalty implant.) -/obj/item/weapon/implant/proc/implanted(var/mob/source) +/obj/item/weapon/implant/ui_action_click() + activate("action_button") + + +//What does the implant do upon injection? +//return 1 if the implant injects +//return -1 if the implant fails to inject +//return 0 if there is no room for implant +/obj/item/weapon/implant/proc/implant(var/mob/source, var/mob/user) + var/obj/item/weapon/implant/imp_e = locate(src.type) in source + if(!allow_multiple && imp_e && imp_e != src) + if(imp_e.uses < initial(imp_e.uses)*2) + if(uses == -1) + imp_e.uses = -1 + else + imp_e.uses = min(imp_e.uses + uses, initial(imp_e.uses)*2) + qdel(src) + return 1 + else + return 0 + + + if(activated) + action_button_name = "Activate [src.name]" + src.loc = source + imp_in = source + implanted = 1 + if(istype(source, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = source + if(user) + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + affected.implants += src + part = affected + H.sec_hud_set_implants() + + if(user) + add_logs(source, user, "implanted", object="[name]") + + return 1 + +/obj/item/weapon/implant/proc/removed(var/mob/source) + src.loc = null + imp_in = null + implanted = 0 + if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() + return 1 +/obj/item/weapon/implant/Destroy() + if(imp_in) + removed(imp_in) + return ..() + + /obj/item/weapon/implant/proc/get_data() return "No information available" -/obj/item/weapon/implant/proc/hear(message, source as mob) - return - -/obj/item/weapon/implant/proc/islegal() - return 1 - -/obj/item/weapon/implant/proc/meltdown() //breaks it down, making implant unrecongizible - imp_in << "\red You feel something melting inside [part ? "your [part.name]" : "you"]!" - if (part) - part.take_damage(burn = 15, used_weapon = "Electronics meltdown") - else - var/mob/living/M = imp_in - M.apply_damage(15,BURN) - name = "melted implant" - desc = "Charred circuit in melted plastic case. Wonder what that used to be..." - icon_state = "implant_melted" - malfunction = MALFUNCTION_PERMANENT - -/obj/item/weapon/implant/Destroy() - if(part) - part.implants.Remove(src) - return ..() - -/obj/item/weapon/implant/tracking - name = "tracking" - desc = "Track with this." - origin_tech = "materials=2;magnets=2;programming=2;biotech=2" - var/id = 1.0 - -/obj/item/weapon/implant/tracking/New() - ..() - tracking_implants += src - -/obj/item/weapon/implant/tracking/Destroy() - tracking_implants -= src - return ..() - -/obj/item/weapon/implant/tracking/get_data() - var/dat = {"Implant Specifications:
-Name: Tracking Beacon
-Life: 10 minutes after death of host
-Important Notes: None
-
-Implant Details:
-Function: Continuously transmits low power signal. Useful for tracking.
-Special Features:
-Neuro-Safe- Specialized shell absorbs excess voltages self-destructing the chip if -a malfunction occurs thereby securing safety of subject. The implant will melt and -disintegrate into bio-safe elements.
-Integrity: Gradient creates slight risk of being overcharged and frying the -circuitry. As a result neurotoxins can cause massive damage.
-Implant Specifics:
"} - return dat - -/obj/item/weapon/implant/tracking/emp_act(severity) - if (malfunction) //no, dawg, you can't malfunction while you are malfunctioning - return - malfunction = MALFUNCTION_TEMPORARY - - var/delay = 20 - switch(severity) - if(1) - if(prob(60)) - meltdown() - if(2) - delay = rand(5*60*10,15*60*10) //from 5 to 15 minutes of free time - - spawn(delay) - malfunction-- - -/obj/item/weapon/implant/dexplosive - name = "explosive" - desc = "And boom goes the weasel." - origin_tech = "materials=2;combat=3;biotech=4;syndicate=4" - icon_state = "implant_evil" - -/obj/item/weapon/implant/dexplosive/get_data() - var/dat = {" -Implant Specifications:
-Name: Robust Corp RX-78 Employee Management Implant
-Life: Activates upon death.
-Important Notes: Explodes
-
-Implant Details:
-Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
-Special Features: Explodes
-Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} - return dat - -/obj/item/weapon/implant/dexplosive/trigger(emote, source as mob) - if(emote == "deathgasp") - src.activate("death") - return - -/obj/item/weapon/implant/dexplosive/activate(var/cause) - if((!cause) || (!src.imp_in)) return 0 - explosion(src, 0, 1, 3, 6)//This might be a bit much, dono will have to see. - if(src.imp_in) - src.imp_in.gib() - -/obj/item/weapon/implant/dexplosive/islegal() - return 0 - -//BS12 Explosive -/obj/item/weapon/implant/explosive - name = "explosive implant" - desc = "A military grade micro bio-explosive. Highly dangerous." - origin_tech = "materials=2;combat=3;biotech=4;syndicate=4" - var/elevel = "Localized Limb" - var/phrase = "supercalifragilisticexpialidocious" - icon_state = "implant_evil" - -/obj/item/weapon/implant/explosive/get_data() - var/dat = {" -Implant Specifications:
-Name: Robust Corp RX-78 Intimidation Class Implant
-Life: Activates upon codephrase.
-Important Notes: Explodes
-
-Implant Details:
-Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
-Special Features: Explodes
-Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} - return dat - -/obj/item/weapon/implant/explosive/hear_talk(mob/M as mob, msg) - hear(msg) - return - -/obj/item/weapon/implant/explosive/hear(var/msg) - var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "") - msg = sanitize_simple(msg, replacechars) - if(findtext(msg,phrase)) - activate() - qdel(src) - -/obj/item/weapon/implant/explosive/activate() - if (malfunction == MALFUNCTION_PERMANENT) - return - - var/need_gib = null - if(istype(imp_in, /mob/)) - var/mob/T = imp_in - message_admins("Explosive implant triggered in [key_name_admin(T)]") - log_game("Explosive implant triggered in [key_name(T)].") - need_gib = 1 - - if(ishuman(imp_in)) - if (elevel == "Localized Limb") - if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste. - imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") - playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) - sleep(25) - if (istype(part,/obj/item/organ/external/chest) || \ - istype(part,/obj/item/organ/external/groin) || \ - istype(part,/obj/item/organ/external/head)) - part.createwound(BRUISE, 60) //mangle them instead - explosion(get_turf(imp_in), -1, -1, 2, 3) - qdel(src) - else - explosion(get_turf(imp_in), -1, -1, 2, 3) - part.droplimb() - qdel(src) - if (elevel == "Destroy Body") - explosion(get_turf(T), -1, 0, 1, 6) - T.gib() - if (elevel == "Full Explosion") - explosion(get_turf(T), 0, 1, 3, 6) - T.gib() - - else - explosion(get_turf(imp_in), 0, 1, 3, 6) - - if(need_gib) - imp_in.gib() - - var/turf/t = get_turf(imp_in) - - if(t) - t.hotspot_expose(3500,125) - -/obj/item/weapon/implant/explosive/implanted(mob/source as mob) - elevel = alert("What sort of explosion would you prefer?", "Implant Intent", "Localized Limb", "Destroy Body", "Full Explosion") - phrase = input("Choose activation phrase:") as text - var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "") - phrase = sanitize_simple(phrase, replacechars) - usr.mind.store_memory("Explosive implant in [source] can be activated by saying something containing the phrase ''[src.phrase]'', say [src.phrase] to attempt to activate.", 0, 0) - 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 - -/obj/item/weapon/implant/explosive/emp_act(severity) - if (malfunction) - return - malfunction = MALFUNCTION_TEMPORARY - switch (severity) - if (2.0) //Weak EMP will make implant tear limbs off. - if (prob(50)) - small_boom() - if (1.0) //strong EMP will melt implant either making it go off, or disarming it - if (prob(70)) - if (prob(50)) - small_boom() - else - if (prob(50)) - activate() //50% chance of bye bye - else - meltdown() //50% chance of implant disarming - spawn (20) - malfunction-- - -/obj/item/weapon/implant/explosive/islegal() - return 0 - -/obj/item/weapon/implant/explosive/proc/small_boom() - if (ishuman(imp_in) && part) - imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!") - playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3) - spawn(25) - if (ishuman(imp_in) && part) - //No tearing off these parts since it's pretty much killing - //and you can't replace groins - if (istype(part,/obj/item/organ/external/chest) || \ - istype(part,/obj/item/organ/external/groin) || \ - istype(part,/obj/item/organ/external/head)) - part.createwound(BRUISE, 60) //mangle them instead - else - part.droplimb() - explosion(get_turf(imp_in), -1, -1, 2, 3) - qdel(src) - -/obj/item/weapon/implant/chem - name = "chem" - desc = "Injects things." - origin_tech = "materials=3;biotech=4" - allow_reagents = 1 - -/obj/item/weapon/implant/chem/get_data() - var/dat = {" -Implant Specifications:
-Name: Robust Corp MJ-420 Prisoner Management Implant
-Life: Deactivates upon death but remains within the body.
-Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject
-will suffer from an increased appetite.

-
-Implant Details:
-Function: Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal
-the implant releases the chemicals directly into the blood stream.
-Special Features: -Micro-Capsule- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.
-Can only be loaded while still in its original case.
-Integrity: Implant will last so long as the subject is alive. However, if the subject suffers from malnutrition,
-the implant may become unstable and either pre-maturely inject the subject or simply break."} - return dat - -/obj/item/weapon/implant/chem/New() - ..() - var/datum/reagents/R = new/datum/reagents(50) - reagents = R - R.my_atom = src - tracking_implants += src - -/obj/item/weapon/implant/chem/Destroy() - tracking_implants -= src - return ..() - -/obj/item/weapon/implant/chem/trigger(emote, source as mob) - if(emote == "deathgasp") - src.activate(src.reagents.total_volume) - return - -/obj/item/weapon/implant/chem/activate(var/cause) - if((!cause) || (!src.imp_in)) return 0 - var/mob/living/carbon/R = src.imp_in - src.reagents.trans_to(R, cause) - R << "You hear a faint *beep*." - if(!src.reagents.total_volume) - R << "You hear a faint click from your chest." - spawn(0) - qdel(src) - return - -/obj/item/weapon/implant/chem/emp_act(severity) - if (malfunction) - return - malfunction = MALFUNCTION_TEMPORARY - - switch(severity) - if(1) - if(prob(60)) - activate(20) - if(2) - if(prob(30)) - activate(5) - - spawn(20) - malfunction-- - -/obj/item/weapon/implant/loyalty - name = "loyalty" - desc = "Makes you loyal or such." - origin_tech = "materials=2;biotech=4;programming=4" - -/obj/item/weapon/implant/loyalty/get_data() - var/dat = {" -Implant Specifications:
-Name: Nanotrasen Employee Management Implant
-Life: Ten years.
-Important Notes: Personnel injected with this device tend to be much more loyal to the company.
-
-Implant Details:
-Function: Contains a small pod of nanobots that manipulate the host's mental functions.
-Special Features: Will prevent and cure most forms of brainwashing.
-Integrity: Implant will last so long as the nanobots are inside the bloodstream."} - return dat - - -/obj/item/weapon/implant/loyalty/implanted(mob/M) - if(!istype(M, /mob/living/carbon/human)) return 0 - var/mob/living/carbon/human/H = M - if(H.mind in ticker.mode.head_revolutionaries) - H.visible_message("[H] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") - return 0 - else if(H.mind in ticker.mode:revolutionaries) - ticker.mode:remove_revolutionary(H.mind) - H << "You feel a surge of loyalty towards Nanotrasen." - return 1 - -/obj/item/weapon/implant/traitor - name = "Mindslave Implant" - desc = "Divide and Conquer" - icon_state = "implant_evil" - -/obj/item/weapon/implant/traitor/get_data() - var/dat = {" -Implant Specifications:
-Name: Mind-Slave Implant
-Life: ???
-Important Notes: Any humanoid injected with this implant will become loyal to the injector, unless of course the host is already loyal to someone else.
-
-Implant Details:
-Function: Contains a small pod of nanobots that manipulate the host's mental functions.
-Special Features: Diplomacy was never so easy.
-Integrity: Implant will last so long as the nanobots are inside the bloodstream."} - return dat - -/obj/item/weapon/implant/traitor/implanted(mob/M, mob/user) - var/list/implanters - var/ref = "\ref[user.mind]" - if(!ishuman(M)) return 0 - if(!M.mind) return 0 - var/mob/living/carbon/human/H = M - if(M == user) - user << "Making yourself loyal to yourself was a great idea! Perhaps even the best idea ever! Actually, you just feel like an idiot." - if(isliving(user)) - var/mob/living/L = user - L.adjustBrainLoss(20) - return - if(locate(/obj/item/weapon/implant/loyalty) in H.contents) - H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") - return 0 - if(locate(/obj/item/weapon/implant/traitor) in H.contents) - H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") - return 0 - H.implanting = 1 - H << "You feel completely loyal to [user.name]." - if(!(user.mind in ticker.mode:implanter)) - ticker.mode:implanter[ref] = list() - implanters = ticker.mode:implanter[ref] - implanters.Add(H.mind) - ticker.mode.implanted.Add(H.mind) - ticker.mode.implanted[H.mind] = user.mind - //ticker.mode:implanter[user.mind] += H.mind - ticker.mode:implanter[ref] = implanters - ticker.mode.traitors += H.mind - H.mind.special_role = "traitor" - H << "You're now completely loyal to [user.name]! You now must lay down your life to protect them and assist in their goals at any cost." - var/datum/objective/protect/p = new - p.owner = H.mind - p.target = user:mind - p.explanation_text = "Obey every order from and protect [user:real_name], the [user:mind:assigned_role=="MODE" ? (user:mind:special_role) : (user:mind:assigned_role)]." - H.mind.objectives += p - for(var/datum/objective/objective in H.mind.objectives) - H << "Objective #1: [objective.explanation_text]" - - ticker.mode.update_traitor_icons_added(user.mind) - ticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds - - if(user.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall... - var/datum/mindslaves/slaved = user.mind.som - H.mind.som = slaved - slaved.serv += H - slaved.add_serv_hud(user.mind,"syndicate")//handles master servent icons - slaved.add_serv_hud(H.mind,"mindslave") - - log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].") - return 1 - -/obj/item/weapon/implant/traitor/islegal() - return 0 - -/obj/item/weapon/implant/adrenalin - name = "adrenalin" - desc = "Removes all stuns and knockdowns." - origin_tech = "materials=2;biotech=4;combat=3;syndicate=4" - var/uses = 3 - -/obj/item/weapon/implant/adrenalin/get_data() - var/dat = {" -Implant Specifications:
-Name: Cybersun Industries Adrenalin Implant
-Life: Five days.
-Important Notes: Illegal
-
-Implant Details: Subjects injected with implant can activate an injection of medical cocktails.
-Function: Removes stuns, increases speed, and has a mild healing effect.
-Special Features: Will prevent and cure most forms of brainwashing.
-Integrity: Implant can only be used three times before the nanobots are depleted."} - return dat - -/obj/item/weapon/implant/adrenalin/trigger(emote, mob/source as mob) - if (src.uses < 1) return 0 - if (emote == "pale") - src.uses-- - source << "\blue You feel a sudden surge of energy!" - source.SetStunned(0) - source.SetWeakened(0) - source.SetParalysis(0) - imp_in.adjustStaminaLoss(-75) - source.lying = 0 - source.update_canmove() - - source.reagents.add_reagent("synaptizine", 10) - source.reagents.add_reagent("omnizine", 10) - source.reagents.add_reagent("stimulative_agent", 10) - - return - -/obj/item/weapon/implant/adrenalin/implanted(mob/source) - source.mind.store_memory("A implant can be activated by using the pale emote, say *pale to attempt to activate.", 0, 0) - source << "The implanted freedom implant can be activated by using the pale emote, say *pale to attempt to activate." - return 1 - -/obj/item/weapon/implant/death_alarm - name = "death alarm implant" - desc = "An alarm which monitors host vital signs and transmits a radio message upon death." - var/mobname = "Will Robinson" - -/obj/item/weapon/implant/death_alarm/get_data() - var/dat = {" -Implant Specifications:
-Name: Nanotrasen \"Profit Margin\" Class Employee Lifesign Sensor
-Life: Activates upon death.
-Important Notes: Alerts crew to crewmember death.
-
-Implant Details:
-Function: Contains a compact radio signaler that triggers when the host's lifesigns cease.
-Special Features: Alerts crew to crewmember death.
-Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} - return dat - -/obj/item/weapon/implant/death_alarm/process() - if (!implanted) return - var/mob/M = imp_in - - if(isnull(M)) // If the mob got gibbed - activate() - else if(M.stat == 2) - activate("death") - -/obj/item/weapon/implant/death_alarm/activate(var/cause) - var/mob/M = imp_in - var/area/t = get_area(M) - switch (cause) - if("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 - a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm") - else - a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm") - qdel(a) - processing_objects.Remove(src) - if ("emp") - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) - var/name = prob(50) ? t.name : pick(teleportlocs) - a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm") - qdel(a) - 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") - qdel(a) - processing_objects.Remove(src) - -/obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this - if (malfunction) //so I'm just going to add a meltdown chance here - return - malfunction = MALFUNCTION_TEMPORARY - - activate("emp") //let's shout that this dude is dead - if(severity == 1) - if(prob(40)) //small chance of obvious meltdown - meltdown() - else if (prob(60)) //but more likely it will just quietly die - malfunction = MALFUNCTION_PERMANENT - processing_objects.Remove(src) - - spawn(20) - malfunction-- - -/obj/item/weapon/implant/death_alarm/implanted(mob/source as mob) - mobname = source.real_name - processing_objects.Add(src) - return 1 - -/obj/item/weapon/implant/compressed - name = "compressed matter implant" - desc = "Based on compressed matter technology, can store a single item." - icon_state = "implant_evil" - origin_tech = "materials=2;magnets=4;bluespace=4;syndicate=4" - var/activation_emote = "sigh" - var/obj/item/scanned = null - -/obj/item/weapon/implant/compressed/get_data() - var/dat = {" -Implant Specifications:
-Name: Nanotrasen \"Profit Margin\" Class Employee Lifesign Sensor
-Life: Activates upon death.
-Important Notes: Alerts crew to crewmember death.
-
-Implant Details:
-Function: Contains a compact radio signaler that triggers when the host's lifesigns cease.
-Special Features: Alerts crew to crewmember death.
-Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} - return dat - -/obj/item/weapon/implant/compressed/trigger(emote, mob/source as mob) - if (src.scanned == null) - return 0 - - if (emote == src.activation_emote) - source << "The air glows as \the [src.scanned.name] uncompresses." - activate() - -/obj/item/weapon/implant/compressed/activate() - var/turf/t = get_turf(src) - if (imp_in) - imp_in.put_in_hands(scanned) - else - scanned.loc = t +/obj/item/weapon/implant/dropped(mob/user) + . = 1 qdel(src) - -/obj/item/weapon/implant/compressed/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") - if (source.mind) - source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) - source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." - return 1 - -/obj/item/weapon/implant/compressed/islegal() - return 0 - -/obj/item/weapon/implant/cortical - name = "cortical stack" - desc = "A fist-sized mass of biocircuits and chips." - icon_state = "implant_evil" - -/obj/item/weapon/implant/emp - name = "emp implant" - desc = "Triggers an EMP." - origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4" - var/activation_emote = "chuckle" - var/uses = 2 - -/obj/item/weapon/implant/emp/New() - activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "smile", "pale", "sniff", "whimper", "wink") - ..() - return - -/obj/item/weapon/implant/emp/trigger(emote, mob/living/carbon/source as mob) - if (src.uses < 1) return 0 - if (emote == src.activation_emote) - src.uses-- - empulse(source, 3, 5) - return - -/obj/item/weapon/implant/emp/implanted(mob/living/carbon/source) - source.mind.store_memory("EMP implant can be activated [uses] time\s by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) - source << "The implanted EMP implant can be activated [uses] time\s by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." - return 1 \ No newline at end of file + return . diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm new file mode 100644 index 00000000000..a0540dbe79c --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_chem.dm @@ -0,0 +1,61 @@ +/obj/item/weapon/implant/chem + name = "chem implant" + desc = "Injects things." + icon_state = "reagents" + origin_tech = "materials=3;biotech=4" + flags = OPENCONTAINER + +/obj/item/weapon/implant/chem/get_data() + var/dat = {"Implant Specifications:
+ Name: Robust Corp MJ-420 Prisoner Management Implant
+ Life: Deactivates upon death but remains within the body.
+ Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject
+ will suffer from an increased appetite.

+
+ Implant Details:
+ Function: Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal
+ the implant releases the chemicals directly into the blood stream.
+ Special Features: + Micro-Capsule- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.
+ Can only be loaded while still in its original case.
+ Integrity: Implant will last so long as the subject is alive."} + return dat + +/obj/item/weapon/implant/chem/New() + ..() + create_reagents(50) + tracked_implants += src + +/obj/item/weapon/implant/chem/Destroy() + tracked_implants -= src + return ..() + + + + +/obj/item/weapon/implant/chem/trigger(emote, mob/source) + if(emote == "deathgasp") + activate(reagents.total_volume) + +/obj/item/weapon/implant/chem/activate(cause) + if(!cause || !imp_in) return 0 + var/mob/living/carbon/R = imp_in + var/injectamount = null + if (cause == "action_button") + injectamount = reagents.total_volume + else + injectamount = cause + reagents.trans_to(R, injectamount) + R << "You hear a faint beep." + if(!reagents.total_volume) + R << "You hear a faint click from your chest." + qdel(src) + + +/obj/item/weapon/implantcase/chem + name = "implant case - 'Remote Chemical'" + desc = "A glass case containing a remote chemical implant." + +/obj/item/weapon/implantcase/chem/New() + imp = new /obj/item/weapon/implant/chem(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm new file mode 100644 index 00000000000..886fd3f1385 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm @@ -0,0 +1,67 @@ +/obj/item/weapon/implant/death_alarm + name = "death alarm implant" + desc = "An alarm which monitors host vital signs and transmits a radio message upon death." + var/mobname = "Will Robinson" + activated = 0 + +/obj/item/weapon/implant/death_alarm/get_data() + var/dat = {"Implant Specifications:
+ Name: Nanotrasen \"Profit Margin\" Class Employee Lifesign Sensor
+ Life: Activates upon death.
+ Important Notes: Alerts crew to crewmember death.
+
+ Implant Details:
+ Function: Contains a compact radio signaler that triggers when the host's lifesigns cease.
+ Special Features: Alerts crew to crewmember death.
+ Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} + return dat + +/obj/item/weapon/implant/death_alarm/process() + if(!implanted) + return + var/mob/M = imp_in + + if(isnull(M)) // If the mob got gibbed + activate() + else if(M.stat == DEAD) + activate("death") + +/obj/item/weapon/implant/death_alarm/activate(var/cause) + var/mob/M = imp_in + var/area/t = get_area(M) + switch (cause) + if("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 + a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm") + else + a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm") + qdel(a) + processing_objects.Remove(src) + if ("emp") + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + var/name = prob(50) ? t.name : pick(teleportlocs) + a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm") + qdel(a) + 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") + qdel(a) + processing_objects.Remove(src) + +/obj/item/weapon/implant/death_alarm/emp_act(severity) //for some reason alarms stop going off in case they are emp'd, even without this + activate("emp") //let's shout that this dude is dead + +/obj/item/weapon/implant/death_alarm/implant(mob/target) + if(..()) + mobname = target.real_name + processing_objects.Add(src) + return 1 + return 0 + +/obj/item/weapon/implant/death_alarm/removed(mob/target) + if(..()) + processing_objects.Remove(src) + return 1 + return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm new file mode 100644 index 00000000000..3006a437943 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -0,0 +1,128 @@ +/obj/item/weapon/implant/explosive + name = "microbomb implant" + desc = "And boom goes the weasel." + icon_state = "explosive" + origin_tech = "materials=2;combat=3;biotech=4;syndicate=4" + var/weak = 2 + var/medium = 0.8 + var/heavy = 0.4 + var/delay = 7 + +/obj/item/weapon/implant/explosive/get_data() + var/dat = {"Implant Specifications:
+ Name: Robust Corp RX-78 Employee Management Implant
+ Life: Activates upon death.
+ Important Notes: Explodes
+
+ Implant Details:
+ Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
+ Special Features: Explodes
+ "} + return dat + +/obj/item/weapon/implant/explosive/trigger(emote, mob/source) + if(emote == "deathgasp") + activate("death") + +/obj/item/weapon/implant/explosive/activate(cause) + if(!cause || !imp_in) return 0 + if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your microbomb implant? This will cause you to explode!", "Microbomb Implant Confirmation", "Yes", "No") != "Yes") + return 0 + heavy = round(heavy) + medium = round(medium) + weak = round(weak) + imp_in << "You activate your microbomb implant." +//If the delay is short, just blow up already jeez + if(delay <= 7) + explosion(src,heavy,medium,weak,weak, flame_range = weak) + if(imp_in) + imp_in.gib() + qdel(src) + return + timed_explosion() + +/obj/item/weapon/implant/explosive/implant(mob/source) + var/obj/item/weapon/implant/explosive/imp_e = locate(src.type) in source + if(imp_e && imp_e != src) + imp_e.heavy += heavy + imp_e.medium += medium + imp_e.weak += weak + imp_e.delay += delay + qdel(src) + return 1 + + return ..() + +/obj/item/weapon/implant/explosive/proc/timed_explosion() + imp_in.visible_message("[imp_in] starts beeping ominously!") + playsound(loc, 'sound/items/timer.ogg', 30, 0) + sleep(delay/4) + if(imp_in && imp_in.stat) + imp_in.visible_message("[imp_in] doubles over in pain!") + imp_in.Weaken(7) + playsound(loc, 'sound/items/timer.ogg', 30, 0) + sleep(delay/4) + playsound(loc, 'sound/items/timer.ogg', 30, 0) + sleep(delay/4) + playsound(loc, 'sound/items/timer.ogg', 30, 0) + sleep(delay/4) + explosion(src,heavy,medium,weak,weak, flame_range = weak) + if(imp_in) + imp_in.gib() + qdel(src) + +/obj/item/weapon/implant/explosive/macro + name = "macrobomb implant" + desc = "And boom goes the weasel. And everything else nearby." + icon_state = "explosive" + origin_tech = "materials=3;combat=5;biotech=4;syndicate=5" + weak = 16 + medium = 8 + heavy = 4 + delay = 70 + +/obj/item/weapon/implant/explosive/macro/activate(cause) + if(!cause || !imp_in) return 0 + if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes") + return 0 + imp_in << "You activate your macrobomb implant." + timed_explosion() + +/obj/item/weapon/implant/explosive/macro/implant(mob/source) + var/obj/item/weapon/implant/explosive/imp_e = locate(src.type) in source + if(imp_e && imp_e != src) + return 0 + imp_e = locate(/obj/item/weapon/implant/explosive) in source + if(imp_e && imp_e != src) + heavy += imp_e.heavy + medium += imp_e.medium + weak += imp_e.weak + delay += imp_e.delay + qdel(imp_e) + + return ..() + + +/obj/item/weapon/implanter/explosive + name = "implanter (explosive)" + +/obj/item/weapon/implanter/explosive/New() + imp = new /obj/item/weapon/implant/explosive(src) + ..() + + +/obj/item/weapon/implantcase/explosive + name = "implant case - 'Explosive'" + desc = "A glass case containing an explosive implant." + +/obj/item/weapon/implantcase/explosive/New() + imp = new /obj/item/weapon/implant/explosive(src) + ..() + + +/obj/item/weapon/implanter/explosive_macro + name = "implanter (macro-explosive)" + +/obj/item/weapon/implanter/explosive_macro/New() + imp = new /obj/item/weapon/implant/explosive/macro(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm new file mode 100644 index 00000000000..e3e70e982a2 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -0,0 +1,50 @@ +/obj/item/weapon/implant/freedom + name = "freedom implant" + desc = "Use this to escape from those evil Red Shirts." + icon_state = "freedom" + item_color = "r" + origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4" + uses = 4 + + +/obj/item/weapon/implant/freedom/activate() + if(uses == 0) return 0 + if(uses != -1) uses-- + imp_in << "You feel a faint click." + if(iscarbon(imp_in)) + var/mob/living/carbon/C_imp_in = imp_in + C_imp_in.uncuff() + + +/obj/item/weapon/implant/freedom/get_data() + var/dat = {" +Implant Specifications:
+Name: Freedom Beacon
+Life: optimum 5 uses
+Important Notes: Illegal
+
+Implant Details:
+Function: Transmits a specialized cluster of signals to override handcuff locking +mechanisms
+Special Features:
+Neuro-Scan- Analyzes certain shadow signals in the nervous system
+
+No Implant Specifics"} + return dat + + +/obj/item/weapon/implanter/freedom + name = "implanter (freedom)" + +/obj/item/weapon/implanter/freedom/New() + imp = new /obj/item/weapon/implant/freedom(src) + ..() + + +/obj/item/weapon/implantcase/freedom + name = "implant case - 'Freedom'" + desc = "A glass case containing a freedom implant." + +/obj/item/weapon/implantcase/freedom/New() + imp = new /obj/item/weapon/implant/freedom(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_loyality.dm new file mode 100644 index 00000000000..088c70bf3c1 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_loyality.dm @@ -0,0 +1,59 @@ +/obj/item/weapon/implant/loyalty + name = "loyalty implant" + desc = "Makes you loyal or such." + origin_tech = "materials=2;biotech=4;programming=4" + activated = 0 + +/obj/item/weapon/implant/loyalty/get_data() + var/dat = {"Implant Specifications:
+ Name: Nanotrasen Employee Management Implant
+ Life: Ten years.
+ Important Notes: Personnel injected with this device tend to be much more loyal to the company.
+
+ Implant Details:
+ Function: Contains a small pod of nanobots that manipulate the host's mental functions.
+ Special Features: Will prevent and cure most forms of brainwashing.
+ Integrity: Implant will last so long as the nanobots are inside the bloodstream."} + return dat + + +/obj/item/weapon/implant/loyalty/implant(mob/target) + if(..()) + if(target.mind in ticker.mode.head_revolutionaries || is_shadow_or_thrall(target)) + target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!") + removed(target, 1) + qdel(src) + return -1 + if(target.mind in ticker.mode.revolutionaries) + ticker.mode.remove_revolutionary(target.mind) + if(target.mind in ticker.mode.cult) + target << "You feel the corporate tendrils of Nanotrasen try to invade your mind!" + else + target << "You feel a surge of loyalty towards Nanotrasen." + return 1 + return 0 + +/obj/item/weapon/implant/loyalty/removed(mob/target, var/silent = 0) + if(..()) + if(target.stat != DEAD && !silent) + target << "You feel a sense of liberation as Nanotrasen's grip on your mind fades away." + return 1 + return 0 + + +/obj/item/weapon/implanter/loyalty + name = "implanter (loyalty)" + +/obj/item/weapon/implanter/loyalty/New() + imp = new /obj/item/weapon/implant/loyalty(src) + ..() + update_icon() + + +/obj/item/weapon/implantcase/loyalty + name = "implant case - 'Loyalty'" + desc = "A glass case containing a loyalty implant." + +/obj/item/weapon/implantcase/loyalty/New() + imp = new /obj/item/weapon/implant/loyalty(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm new file mode 100644 index 00000000000..79b7285e2d4 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_misc.dm @@ -0,0 +1,66 @@ +/obj/item/weapon/implant/weapons_auth + name = "firearms authentication implant" + desc = "Lets you shoot your guns" + icon_state = "auth" + origin_tech = "materials=2;magnets=2;programming=2;biotech=5;syndicate=5" + activated = 0 + +/obj/item/weapon/implant/weapons_auth/get_data() + var/dat = {"Implant Specifications:
+ Name: Firearms Authentication Implant
+ Life: 4 hours after death of host
+ Implant Details:
+ Function: Allows operation of implant-locked weaponry, preventing equipment from falling into enemy hands."} + return dat + + +/obj/item/weapon/implant/adrenalin + name = "adrenal implant" + desc = "Removes all stuns and knockdowns." + icon_state = "adrenal" + origin_tech = "materials=2;biotech=4;combat=3;syndicate=4" + uses = 3 + +/obj/item/weapon/implant/adrenalin/get_data() + var/dat = {"Implant Specifications:
+ Name: Cybersun Industries Adrenaline Implant
+ Life: Five days.
+ Important Notes: Illegal
+
+ Implant Details: Subjects injected with implant can activate an injection of medical cocktails.
+ Function: Removes stuns, increases speed, and has a mild healing effect.
+ Integrity: Implant can only be used three times before reserves are depleted."} + return dat + +/obj/item/weapon/implant/adrenalin/activate() + if(uses < 1) return 0 + uses-- + imp_in << "You feel a sudden surge of energy!" + imp_in.SetStunned(0) + imp_in.SetWeakened(0) + imp_in.SetParalysis(0) + imp_in.adjustStaminaLoss(-75) + imp_in.lying = 0 + imp_in.update_canmove() + + imp_in.reagents.add_reagent("synaptizine", 10) + imp_in.reagents.add_reagent("omnizine", 10) + imp_in.reagents.add_reagent("stimulative_agent", 10) + + +/obj/item/weapon/implant/emp + name = "emp implant" + desc = "Triggers an EMP." + icon_state = "emp" + origin_tech = "materials=2;biotech=3;magnets=4;syndicate=4" + uses = 2 + +/obj/item/weapon/implant/emp/activate() + if (src.uses < 1) return 0 + src.uses-- + empulse(imp_in, 3, 5) + +/obj/item/weapon/implant/cortical + name = "cortical stack" + desc = "A fist-sized mass of biocircuits and chips." + icon_state = "implant_evil" \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm new file mode 100644 index 00000000000..454c08f9df1 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_storage.dm @@ -0,0 +1,57 @@ +/obj/item/weapon/storage/hidden/implant + name = "bluespace pocket" + storage_slots = 2 + max_w_class = 3 + max_combined_w_class = 6 + w_class = 4 + cant_hold = list(/obj/item/weapon/disk/nuclear) + silent = 1 + + +/obj/item/weapon/implant/storage + name = "storage implant" + desc = "Stores up to two big items in a bluespace pocket." + icon_state = "storage" + origin_tech = "materials=2;magnets=4;bluespace=4;syndicate=4" + item_color = "r" + var/obj/item/weapon/storage/hidden/implant/storage + +/obj/item/weapon/implant/storage/New() + ..() + storage = new /obj/item/weapon/storage/hidden/implant(src) + +/obj/item/weapon/implant/storage/activate() + storage.MouseDrop(imp_in) + +/obj/item/weapon/implant/storage/removed(source) + if(..()) + for(var/mob/M in range(1)) + if(M.s_active == storage) + storage.close(M) + for(var/obj/item/I in storage) + storage.remove_from_storage(I, get_turf(source)) + return 1 + +/obj/item/weapon/implant/storage/implant(mob/source) + var/obj/item/weapon/implant/storage/imp_e = locate(src.type) in source + if(imp_e) + imp_e.storage.storage_slots += storage.storage_slots + imp_e.storage.max_combined_w_class += storage.max_combined_w_class + imp_e.storage.contents += storage.contents + + for(var/mob/M in range(1)) + if(M.s_active == storage) + storage.close(M) + storage.show_to(source) + + qdel(src) + return 1 + + return ..() + +/obj/item/weapon/implanter/storage + name = "implanter (storage)" + +/obj/item/weapon/implanter/storage/New() + imp = new /obj/item/weapon/implant/storage(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_track.dm b/code/game/objects/items/weapons/implants/implant_track.dm new file mode 100644 index 00000000000..d0d1159a9c5 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_track.dm @@ -0,0 +1,32 @@ +/obj/item/weapon/implant/tracking + name = "tracking implant" + desc = "Track with this." + activated = 0 + origin_tech = "materials=2;magnets=2;programming=2;biotech=2" + var/id = 1 + + +/obj/item/weapon/implant/tracking/New() + ..() + tracked_implants += src + +/obj/item/weapon/implant/tracking/Destroy() + tracked_implants -= src + return ..() + +/obj/item/weapon/implant/tracking/get_data() + var/dat = {"Implant Specifications:
+ Name: Tracking Beacon
+ Life: 10 minutes after death of host
+ Important Notes: None
+
+ Implant Details:
+ Function: Continuously transmits low power signal. Useful for tracking.
+ Special Features:
+ Neuro-Safe- Specialized shell absorbs excess voltages self-destructing the chip if + a malfunction occurs thereby securing safety of subject. The implant will melt and + disintegrate into bio-safe elements.
+ Integrity: Gradient creates slight risk of being overcharged and frying the + circuitry. As a result neurotoxins can cause massive damage.
+ Implant Specifics:
"} + return dat diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm new file mode 100644 index 00000000000..ba89e970de8 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -0,0 +1,78 @@ +/obj/item/weapon/implant/traitor + name = "Mindslave Implant" + desc = "Divide and Conquer" + origin_tech = "programming=5;biotech=5;syndicate=8" + activated = 0 + +/obj/item/weapon/implant/traitor/get_data() + var/dat = {"Implant Specifications:
+ Name: Mind-Slave Implant
+ Life: ???
+ Important Notes: Any humanoid injected with this implant will become loyal to the injector, unless of course the host is already loyal to someone else.
+
+ Implant Details:
+ Function: Contains a small pod of nanobots that manipulate the host's mental functions.
+ Special Features: Diplomacy was never so easy.
+ Integrity: Implant will last so long as the nanobots are inside the bloodstream."} + return dat + +/obj/item/weapon/implant/traitor/implant(mob/M, mob/user) + var/mob/living/carbon/human/H = M + if(ismindslave(H)) + H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") + qdel(src) + return -1 + if(..()) + var/list/implanters + var/ref = "\ref[user.mind]" + if(!ishuman(M)) + return 0 + if(!M.mind) + return 0 + if(M == user) + user << "Making yourself loyal to yourself was a great idea! Perhaps even the best idea ever! Actually, you just feel like an idiot." + if(isliving(user)) + var/mob/living/L = user + L.adjustBrainLoss(20) + removed(M) + qdel(src) + return -1 + if(isloyal(H)) + H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") + removed(M) + qdel(src) + return -1 + H.implanting = 1 + H << "You feel completely loyal to [user.name]." + if(!(user.mind in ticker.mode:implanter)) + ticker.mode:implanter[ref] = list() + implanters = ticker.mode:implanter[ref] + implanters.Add(H.mind) + ticker.mode.implanted.Add(H.mind) + ticker.mode.implanted[H.mind] = user.mind + //ticker.mode:implanter[user.mind] += H.mind + ticker.mode:implanter[ref] = implanters + ticker.mode.traitors += H.mind + H.mind.special_role = "traitor" + H << "You're now completely loyal to [user.name]! You now must lay down your life to protect them and assist in their goals at any cost." + var/datum/objective/protect/p = new + p.owner = H.mind + p.target = user:mind + p.explanation_text = "Obey every order from and protect [user:real_name], the [user:mind:assigned_role=="MODE" ? (user:mind:special_role) : (user:mind:assigned_role)]." + H.mind.objectives += p + for(var/datum/objective/objective in H.mind.objectives) + H << "Objective #1: [objective.explanation_text]" + + ticker.mode.update_traitor_icons_added(user.mind) + ticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds + + if(user.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall... + var/datum/mindslaves/slaved = user.mind.som + H.mind.som = slaved + slaved.serv += H + slaved.add_serv_hud(user.mind,"syndicate")//handles master servent icons + slaved.add_serv_hud(H.mind,"mindslave") + + log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].") + return 1 + return 0 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 742717c1b70..41354136648 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -1,171 +1,101 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - /obj/item/weapon/implantcase - name = "Glass Case" - desc = "A case containing an implant." + name = "implant case" + desc = "A glass case containing an implant." + icon = 'icons/obj/items.dmi' icon_state = "implantcase-0" item_state = "implantcase" - throw_speed = 1 + throw_speed = 2 throw_range = 5 - w_class = 1.0 + w_class = 1 origin_tech = "materials=1;biotech=2" materials = list(MAT_GLASS=500) var/obj/item/weapon/implant/imp = null - New() - ..() - update() - proc - update() +/obj/item/weapon/implantcase/update_icon() + if(imp) + icon_state = "implantcase-[imp.item_color]" + origin_tech = imp.origin_tech + flags = imp.flags + reagents = imp.reagents + else + icon_state = "implantcase-0" + origin_tech = initial(origin_tech) + flags = initial(flags) + reagents = null - update() - if (src.imp) - src.icon_state = text("implantcase-[]", src.imp.item_color) - src.origin_tech = src.imp.origin_tech +/obj/item/weapon/implantcase/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(istype(W, /obj/item/weapon/pen)) + var/t = stripped_input(user, "What would you like the label to be?", name, null) + if(user.get_active_hand() != W) + return + if(!in_range(src, user) && loc != user) + return + if(t) + name = "implant case - '[t]'" else - src.icon_state = "implantcase-0" - src.origin_tech = initial(src.origin_tech) - return - - - attackby(obj/item/weapon/I as obj, mob/user as mob, params) - ..() - if (istype(I, /obj/item/weapon/pen)) - var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text - if (user.get_active_hand() != I) + name = "implant case" + else if(istype(W, /obj/item/weapon/implanter)) + var/obj/item/weapon/implanter/I = W + if(I.imp) + if(imp || I.imp.implanted) return - if((!in_range(src, usr) && src.loc != user)) - return - t = sanitize(copytext(t,1,MAX_MESSAGE_LEN)) - if(t) - src.name = text("Glass Case- '[]'", t) - else - src.name = "Glass Case" - else if(istype(I, /obj/item/weapon/reagent_containers/syringe)) - if(!src.imp) return - if(!src.imp.allow_reagents) return - if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume) - user << "\red [src] is full." - else - spawn(5) - I.reagents.trans_to(src.imp, 5) - user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units." - else if (istype(I, /obj/item/weapon/implanter)) - if (I:imp) - if ((src.imp || I:imp.implanted)) + I.imp.loc = src + imp = I.imp + I.imp = null + update_icon() + I.update_icon() + else + if(imp) + if(I.imp) return - I:imp.loc = src - src.imp = I:imp - I:imp = null - src.update() - I:update() - else - if (src.imp) - if (I:imp) - return - src.imp.loc = I - I:imp = src.imp - src.imp = null - update() - I:update() - return + imp.loc = I + I.imp = imp + imp = null + update_icon() + I.update_icon() + /*else if(istype(W, /obj/item/ammo_casing/shotgun/implanter)) + var/obj/item/ammo_casing/shotgun/implanter/I = W + if(I.implanter) + src.attackby(I.implanter, user, params) */ // COMING SOON -- c0 + +/obj/item/weapon/implantcase/New() + ..() + update_icon() /obj/item/weapon/implantcase/tracking - name = "Glass Case- 'Tracking'" - desc = "A case containing a tracking implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" + name = "implant case - 'Tracking'" + desc = "A glass case containing a tracking implant." - - New() - src.imp = new /obj/item/weapon/implant/tracking( src ) - ..() - return - - - -/obj/item/weapon/implantcase/explosive - name = "Glass Case- 'Explosive'" - desc = "A case containing an explosive implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-r" - - - New() - src.imp = new /obj/item/weapon/implant/explosive( src ) - ..() - return - -/obj/item/weapon/implantcase/dexplosive - name = "Glass Case- 'Death Explosive'" - desc = "A case containing an explosive implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-r" - - - New() - src.imp = new /obj/item/weapon/implant/dexplosive( src ) - ..() - return - -/obj/item/weapon/implantcase/chem - name = "Glass Case- 'Chem'" - desc = "A case containing a chemical implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" -/obj/item/weapon/implantcase/chem/New() - - src.imp = new /obj/item/weapon/implant/chem( src ) +/obj/item/weapon/implantcase/tracking/New() + imp = new /obj/item/weapon/implant/tracking(src) ..() - return -/obj/item/weapon/implantcase/loyalty - name = "Glass Case- 'Loyalty'" - desc = "A case containing a loyalty implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-r" +/obj/item/weapon/implantcase/weapons_auth + name = "implant case - 'Firearms Authentication'" + desc = "A glass case containing a firearms authentication implant." +/obj/item/weapon/implantcase/weapons_auth/New() + imp = new /obj/item/weapon/implant/weapons_auth(src) + ..() - New() - src.imp = new /obj/item/weapon/implant/loyalty( src ) - ..() - return +/obj/item/weapon/implantcase/adrenaline + name = "implant case - 'Adrenaline'" + desc = "A glass case containing an adrenaline implant." +/obj/item/weapon/implantcase/adrenaline/New() + imp = new /obj/item/weapon/implant/adrenalin(src) + ..() /obj/item/weapon/implantcase/death_alarm name = "Glass Case- 'Death Alarm'" desc = "A case containing a death alarm implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" - New() - src.imp = new /obj/item/weapon/implant/death_alarm( src ) - ..() - return - -/obj/item/weapon/implantcase/freedom - name = "Glass Case- 'Freedom'" - desc = "A case containing a freedom implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" - - New() - src.imp = new /obj/item/weapon/implant/freedom( src ) - ..() - return - -/obj/item/weapon/implantcase/adrenaline - name = "Glass Case- 'Adrenaline'" - desc = "A glass case containing an adrenaline implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" - - New() - src.imp = new /obj/item/weapon/implant/adrenalin( src ) - ..() - return \ No newline at end of file +/obj/item/weapon/implantcase/death_alarm/New() + imp = new /obj/item/weapon/implant/death_alarm(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index dc9f95ad322..9a5633c0ba3 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -1,7 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 /obj/machinery/implantchair - name = "Loyalty Implanter" + name = "loyalty implanter" desc = "Used to implant occupants with loyalty implants." icon = 'icons/obj/machines/implantchair.dmi' icon_state = "implantchair" @@ -19,153 +19,148 @@ var/mob/living/carbon/occupant = null var/injecting = 0 - proc - go_out() - put_mob(mob/living/carbon/M as mob) - implant(var/mob/M) - add_implants() - - - New() - ..() - add_implants() - - - attack_hand(mob/user as mob) - user.set_machine(src) - var/health_text = "" - if(src.occupant) - if(src.occupant.health <= -100) - health_text = "Dead" - else if(src.occupant.health < 0) - health_text = "[round(src.occupant.health,0.1)]" - else - health_text = "[round(src.occupant.health,0.1)]" - - var/dat ="Implanter Status
" - - dat +="Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
" : "None"]
" - dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
" - if(src.occupant) - dat += "[src.ready ? "Implant" : "Recharging"]
" - user.set_machine(src) - user << browse(dat, "window=implant") - onclose(user, "implant") - - - Topic(href, href_list) - if((get_dist(src, usr) <= 1) || istype(usr, /mob/living/silicon/ai)) - if(href_list["implant"]) - if(src.occupant) - injecting = 1 - go_out() - ready = 0 - spawn(injection_cooldown) - ready = 1 - - if(href_list["replenish"]) - ready = 0 - spawn(replenish_cooldown) - add_implants() - ready = 1 - - src.updateUsrDialog() - src.add_fingerprint(usr) - return - - - attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params) - if(istype(G, /obj/item/weapon/grab)) - if(!ismob(G:affecting)) - return - for(var/mob/living/carbon/slime/M in range(1,G:affecting)) - if(M.Victim == G:affecting) - usr << "[G:affecting:name] will not fit into the [src.name] because they have a slime latched onto their head." - return - var/mob/M = G:affecting - if(put_mob(M)) - qdel(G) - src.updateUsrDialog() - return - - - go_out(var/mob/M) - if(!( src.occupant )) - return - if(M == occupant) // so that the guy inside can't eject himself -Agouri - return - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - if(injecting) - implant(src.occupant) - injecting = 0 - src.occupant = null - icon_state = "implantchair" - return - - - put_mob(mob/living/carbon/M as mob) - if(!iscarbon(M)) - usr << "\red The [src.name] cannot hold this!" - return - if(src.occupant) - usr << "\red The [src.name] is already occupied!" - return - if(M.client) - M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.stop_pulling() - M.loc = src - src.occupant = M - src.add_fingerprint(usr) - icon_state = "implantchair_on" - return 1 - - +/obj/machinery/implantchair/proc + go_out() + put_mob(mob/living/carbon/M) implant(var/mob/M) - if (!istype(M, /mob/living/carbon)) - return - if(!implant_list.len) return - for(var/obj/item/weapon/implant/loyalty/imp in implant_list) - if(!imp) continue - if(istype(imp, /obj/item/weapon/implant/loyalty)) - for (var/mob/O in viewers(M, null)) - O.show_message("\red [M] has been implanted by the [src.name].", 1) - - if(imp.implanted(M)) - imp.loc = M - imp.imp_in = M - imp.implanted = 1 - implant_list -= imp - break - return - - add_implants() - for(var/i=0, iName: [src.occupant]
Health: [health_text]
" : "None"]
" + dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
" + if(src.occupant) + dat += "[src.ready ? "Implant" : "Recharging"]
" + user.set_machine(src) + user << browse(dat, "window=implant") + onclose(user, "implant") + + +/obj/machinery/implantchair/Topic(href, href_list) + if(..()) return + if(href_list["implant"]) + if(src.occupant) + injecting = 1 + go_out() + ready = 0 + spawn(injection_cooldown) + ready = 1 - verb - get_out() - set name = "Eject occupant" - set category = "Object" - set src in oview(1) - if(usr.stat != 0) - return - src.go_out(usr) - add_fingerprint(usr) + if(href_list["replenish"]) + ready = 0 + spawn(replenish_cooldown) + add_implants() + ready = 1 + + src.updateUsrDialog() + return + + +/obj/machinery/implantchair/attackby(obj/item/weapon/W, mob/user, params) + if(istype(W, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W + if(!ismob(G.affecting)) return - - - move_inside() - set name = "Move Inside" - set category = "Object" - set src in oview(1) - if(usr.stat != 0 || stat & (NOPOWER|BROKEN)) - return - put_mob(usr) + var/mob/M = G.affecting + if(M.buckled_mob) + usr << "[M] will not fit into [src] because they have a slime latched onto their head." return + if(put_mob(M)) + qdel(G) + src.updateUsrDialog() + return + + +/obj/machinery/implantchair/go_out(mob/M) + if(!( src.occupant )) + return + if(M == occupant) // so that the guy inside can't eject himself -Agouri + return + if (src.occupant.client) + src.occupant.client.eye = src.occupant.client.mob + src.occupant.client.perspective = MOB_PERSPECTIVE + src.occupant.loc = src.loc + if(injecting) + implant(src.occupant) + injecting = 0 + src.occupant = null + icon_state = "implantchair" + return + + +/obj/machinery/implantchair/put_mob(mob/living/carbon/M) + if(!iscarbon(M)) + usr << "The [src.name] cannot hold this!" + return + if(src.occupant) + usr << "The [src.name] is already occupied!" + return + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.stop_pulling() + M.loc = src + src.occupant = M + src.add_fingerprint(usr) + icon_state = "implantchair_on" + return 1 + + +/obj/machinery/implantchair/implant(mob/M) + if (!istype(M, /mob/living/carbon)) + return + if(!implant_list.len) return + for(var/obj/item/weapon/implant/loyalty/imp in implant_list) + if(!imp) continue + if(istype(imp, /obj/item/weapon/implant/loyalty)) + M.visible_message("[M] has been implanted by the [src.name].") + + if(imp.implant(M)) + implant_list -= imp + break + return + + +/obj/machinery/implantchair/add_implants() + for(var/i=0, i[user] is attemping to implant [M].") + + var/turf/T = get_turf(M) + if(T && (M == user || do_after(user, 50, target = M))) + if(user && M && (get_turf(M) == T) && src && imp) + if(imp.implant(M, user)) + if (M == user) + user << "You implant yourself." + else + M.visible_message("[user] has implanted [M].", "[user] implants you.") + imp = null + update_icon() + +/obj/item/weapon/implanter/attackby(obj/item/weapon/W, mob/user, params) + ..() + if(istype(W, /obj/item/weapon/pen)) + var/t = stripped_input(user, "What would you like the label to be?", name, null) + if(user.get_active_hand() != W) + return + if(!in_range(src, user) && loc != user) + return + if(t) + name = "implanter ([t])" + else + name = "implanter" + /obj/item/weapon/implanter/New() ..() - update() - -/obj/item/weapon/implanter/proc/update() - - -/obj/item/weapon/implanter/update() - if (src.imp) - src.icon_state = "implanter1" - src.origin_tech = src.imp.origin_tech - else - src.icon_state = "implanter0" - src.origin_tech = initial(src.origin_tech) - return - - -/obj/item/weapon/implanter/attack(mob/M as mob, mob/user as mob) - if (!istype(M, /mob/living/carbon)) - return - if (user && src.imp) - for (var/mob/O in viewers(M, null)) - O.show_message("\red [user] is attemping to implant [M].", 1) - - var/turf/T1 = get_turf(M) - if (T1 && ((M == user) || do_after(user, 50, target = M))) - if(user && M && (get_turf(M) == T1) && src && src.imp) - for (var/mob/O in viewers(M, null)) - O.show_message("\red [M] has been implanted by [user].", 1) - - M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.imp.name]) by [key_name(user)]") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.imp.name]) to implant [key_name(M)]") - msg_admin_attack("[key_name_admin(user)] implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") - - user.show_message("\red You implanted the implant into [M].") - if(src.imp.implanted(M, user)) - src.imp.loc = M - src.imp.imp_in = M - src.imp.implanted = 1 - if (ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) - affected.implants += src.imp - imp.part = affected - H.sec_hud_set_implants() - M:implanting = 0 - src.imp = null - update() + spawn(1) + update_icon() -/obj/item/weapon/implanter/traitor - name = "implanter (Mindslave)" - desc = "Divide and Conquer." - - New() - src.imp = new /obj/item/weapon/implant/traitor(src) - ..() - update() - return - -/obj/item/weapon/implanter/loyalty - name = "implanter (Loyalty)" - -/obj/item/weapon/implanter/loyalty/New() - src.imp = new /obj/item/weapon/implant/loyalty( src ) - ..() - update() - return - -/obj/item/weapon/implanter/dexplosive - name = "implanter (Microbomb)" - -/obj/item/weapon/implanter/dexplosive/New() - src.imp = new /obj/item/weapon/implant/dexplosive( src ) - ..() - update() - return - -/obj/item/weapon/implanter/explosive - name = "implanter (Explosive)" - -/obj/item/weapon/implanter/explosive/New() - src.imp = new /obj/item/weapon/implant/explosive( src ) - ..() - update() - return /obj/item/weapon/implanter/adrenalin - name = "implanter (Adrenaline)" + name = "implanter (adrenalin)" /obj/item/weapon/implanter/adrenalin/New() - src.imp = new /obj/item/weapon/implant/adrenalin(src) - ..() - update() - return - -/obj/item/weapon/implanter/compressed - name = "implanter (Compressed)" - icon_state = "cimplanter1" - - var/list/forbidden_types=list( - // /obj/item/weapon/storage/bible // VG #11 - Recursion. - ) - -/obj/item/weapon/implanter/compressed/New() - imp = new /obj/item/weapon/implant/compressed( src ) - ..() - update() - return - -/obj/item/weapon/implanter/compressed/update() - if (imp) - var/obj/item/weapon/implant/compressed/c = imp - if(!c.scanned) - icon_state = "cimplanter1" - else - icon_state = "cimplanter2" - else - icon_state = "cimplanter0" - return - -/obj/item/weapon/implanter/compressed/attack(mob/M as mob, mob/user as mob) - // Attacking things in your hands tends to make this fuck up. - if(!istype(M)) - return - var/obj/item/weapon/implant/compressed/c = imp - if (!c) return - if (c.scanned == null) - user << "Please scan an object with the implanter first." - return + imp = new /obj/item/weapon/implant/adrenalin(src) ..() -/obj/item/weapon/implanter/compressed/afterattack(var/obj/item/I, mob/user as mob) - if(is_type_in_list(I,forbidden_types)) - user << "\red A red light flickers on the implanter." - return - if(istype(I) && imp) - var/obj/item/weapon/implant/compressed/c = imp - if (c.scanned) - user << "\red Something is already scanned inside the implant!" - return - if(user) - user.unEquip(I) - user.update_icons() //update our overlays - c.scanned = I - c.scanned.loc = c - update() - -/obj/item/weapon/implanter/deadman - name = "implanter (Deadman)" - desc = "Switch it." - - New() - src.imp = new /obj/item/weapon/implant/deadman(src) - ..() - update() - return - -/obj/item/weapon/implanter/death_alarm - name = "implanter (Death Alarm)" - desc = "Announces the death of the implanted person over radio" - - New() - src.imp = new /obj/item/weapon/implant/death_alarm(src) - ..() - update() - return /obj/item/weapon/implanter/emp name = "implanter (EMP)" - New() - src.imp = new /obj/item/weapon/implant/emp(src) - ..() - update() - return +/obj/item/weapon/implanter/emp/New() + imp = new /obj/item/weapon/implant/emp(src) + ..() -/obj/item/weapon/implanter/freedom - name = "implanter (Freedom)" +/obj/item/weapon/implanter/traitor + name = "implanter (Mindslave)" - New() - src.imp = new /obj/item/weapon/implant/freedom(src) - ..() - update() - return +/obj/item/weapon/implanter/traitor/New() + imp = new /obj/item/weapon/implant/traitor(src) + ..() -/obj/item/weapon/implanter/uplink - name = "implanter (Uplink)" - - New() - src.imp = new /obj/item/weapon/implant/uplink(src) - ..() - update() - return \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm deleted file mode 100644 index 978b6eb237b..00000000000 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ /dev/null @@ -1,73 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - -/obj/item/weapon/implant/freedom - name = "freedom" - desc = "Use this to escape from those evil Red Shirts." - item_color = "r" - var/activation_emote = "chuckle" - origin_tech = "materials=2;magnets=3;biotech=3;syndicate=4" - var/uses = 4 - - - New() - src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") - ..() - return - - - trigger(emote, mob/living/carbon/source as mob) - if (src.uses < 1) return 0 - if (emote == src.activation_emote) - src.uses-- - source << "You feel a faint click." - if (source.handcuffed) - var/obj/item/weapon/W = source.handcuffed - source.handcuffed = null - if(source.buckled && source.buckled.buckle_requires_restraints) - source.buckled.unbuckle_mob() - source.update_inv_handcuffed() - if (source.client) - source.client.screen -= W - if (W) - W.loc = source.loc - dropped(source) - if (W) - W.layer = initial(W.layer) - if (source.legcuffed) - var/obj/item/weapon/W = source.legcuffed - source.legcuffed = null - source.update_inv_legcuffed() - if (source.client) - source.client.screen -= W - if (W) - W.loc = source.loc - dropped(source) - if (W) - W.layer = initial(W.layer) - return - - - implanted(mob/living/carbon/source) - 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 - - - get_data() - var/dat = {" -Implant Specifications:
-Name: Freedom Beacon
-Life: optimum 5 uses
-Important Notes: Illegal
-
-Implant Details:
-Function: Transmits a specialized cluster of signals to override handcuff locking -mechanisms
-Special Features:
-Neuro-Scan- Analyzes certain shadow signals in the nervous system
-Integrity: The battery is extremely weak and commonly after injection its -life can drive down to only 1 use.
-No Implant Specifics"} - return dat - - diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index 4d8b07abc63..98aca2efe5d 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -6,11 +6,11 @@ icon = 'icons/obj/items.dmi' icon_state = "implantpad-0" item_state = "electronic" - throw_speed = 1 + throw_speed = 3 throw_range = 5 - w_class = 2.0 + w_class = 2 var/obj/item/weapon/implantcase/case = null - + /obj/item/weapon/implantpad/Destroy() if(case) dropcase() @@ -22,7 +22,7 @@ else src.icon_state = "implantpad-0" return - + /obj/item/weapon/implantpad/proc/addcase(mob/user as mob, obj/item/weapon/implantcase/C as obj) if(!user || !C) return @@ -33,8 +33,8 @@ C.forceMove(src) case = C update_icon() - -/obj/item/weapon/implantpad/proc/dropcase(mob/user as mob) + +/obj/item/weapon/implantpad/proc/dropcase(mob/user as mob) if(!case) user << "There's no implant in the pad!" return @@ -45,7 +45,7 @@ case = null update_icon() return - + case.forceMove(get_turf(src)) case = null update_icon() @@ -54,10 +54,10 @@ set category = "Object" set name = "Remove Implant" set src in usr - + if (usr.stat || usr.restrained()) return - + dropcase(usr) /obj/item/weapon/implantpad/attackby(obj/item/weapon/implantcase/C as obj, mob/user as mob, params) @@ -103,7 +103,7 @@ T.id = min(100, T.id) T.id = max(1, T.id) else if(href_list["removecase"]) - dropcase(user) - + dropcase(user) + attack_self(user) return 1 diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 6e7fac76a6c..3ccea8aee20 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -1,25 +1,35 @@ /obj/item/weapon/implant/uplink - name = "uplink" + name = "uplink implant" desc = "Summon things." + icon = 'icons/obj/radio.dmi' + icon_state = "radio" origin_tech = "materials=2;magnets=4;programming=4;biotech=4;syndicate=8;bluespace=5" - var/activation_emote = "chuckle" /obj/item/weapon/implant/uplink/New() - activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") hidden_uplink = new(src) hidden_uplink.uses = 10 ..() - return -/obj/item/weapon/implant/uplink/implanted(mob/source) - 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("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) - source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." - hidden_uplink.uplink_owner="[source]" - return 1 +/obj/item/weapon/implant/uplink/implant(mob/source) + var/obj/item/weapon/implant/imp_e = locate(src.type) in source + if(imp_e && imp_e != src) + imp_e.hidden_uplink.uses += hidden_uplink.uses + qdel(src) + return 1 + + if(..()) + hidden_uplink.uplink_owner="[source.key]" + return 1 + return 0 + +/obj/item/weapon/implant/uplink/activate() + if(hidden_uplink) + hidden_uplink.check_trigger(imp_in) -/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob) - if(hidden_uplink && usr == source) // Let's not have another people activate our uplink - hidden_uplink.check_trigger(source, emote, activation_emote) - return \ No newline at end of file +/obj/item/weapon/implanter/uplink + name = "implanter (uplink)" + +/obj/item/weapon/implanter/uplink/New() + imp = new /obj/item/weapon/implant/uplink(src) + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index c18af6f7218..772dc76d46c 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -56,6 +56,7 @@ new /obj/item/weapon/implanter/emp(src) new /obj/item/weapon/implanter/adrenalin(src) new /obj/item/weapon/implanter/explosive(src) + new /obj/item/weapon/implanter/storage(src) return if("hacker") @@ -86,42 +87,6 @@ desc = "A sleek, sturdy box" icon_state = "box_of_doom" -/obj/item/weapon/storage/box/syndie_kit/imp_freedom - name = "Freedom Implant (with injector)" - -/obj/item/weapon/storage/box/syndie_kit/imp_freedom/New() - ..() - var/obj/item/weapon/implanter/O = new(src) - O.imp = new /obj/item/weapon/implant/freedom(O) - O.update() - return - -/obj/item/weapon/storage/box/syndie_kit/imp_compress - name = "box (C)" - -/obj/item/weapon/storage/box/syndie_kit/imp_compress/New() - new /obj/item/weapon/implanter/compressed(src) - ..() - return - -/obj/item/weapon/storage/box/syndie_kit/imp_explosive - name = "box (E)" - -/obj/item/weapon/storage/box/syndie_kit/imp_explosive/New() - new /obj/item/weapon/implanter/explosive(src) - ..() - return - -/obj/item/weapon/storage/box/syndie_kit/imp_uplink - name = "Uplink Implant (with injector)" - -/obj/item/weapon/storage/box/syndie_kit/imp_uplink/New() - ..() - var/obj/item/weapon/implanter/O = new(src) - O.imp = new /obj/item/weapon/implant/uplink(O) - O.update() - return - /obj/item/weapon/storage/box/syndie_kit/space name = "Boxed Space Suit and Helmet" can_hold = list("/obj/item/clothing/suit/space/syndicate/black/red", "/obj/item/clothing/head/helmet/space/syndicate/black/red") @@ -164,24 +129,6 @@ new /obj/item/ammo_box/a357(src) return -/obj/item/weapon/storage/box/syndie_kit/imp_adrenal - name = "boxed adrenal implant (with injector)" - - New() - ..() - var/obj/item/weapon/implanter/O = new(src) - O.imp = new /obj/item/weapon/implant/adrenalin(O) - O.update() - -/obj/item/weapon/storage/box/syndie_kit/mindslave - name = "box (MS)" - - New() - ..() - var/obj/item/weapon/implanter/O = new(src) - O.imp = new /obj/item/weapon/implant/traitor(O) - O.update() - /obj/item/weapon/storage/box/syndie_kit/boolets name = "Shotgun shells" diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 6fcc67e1e67..61663a82fb4 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -66,7 +66,7 @@ Frequency: temp += "[W.code]: [TB.x], [TB.y], [TB.z]
" temp += "Located Implants:
" - for (var/obj/item/weapon/implant/tracking/T in tracking_implants) + for (var/obj/item/weapon/implant/tracking/T in tracked_implants) if (!T.implanted || !T.imp_in) continue diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm index d0cdce5b7f4..4e6a69d591b 100644 --- a/code/modules/awaymissions/exile.dm +++ b/code/modules/awaymissions/exile.dm @@ -1,51 +1,44 @@ -//////Exile implants will allow you to use the station gate, but not return home. This will allow security to exile badguys/for badguys to exile their kill targets//////// +//Exile implants will allow you to use the station gate, but not return home. +//This will allow security to exile badguys/for badguys to exile their kill targets + +/obj/item/weapon/implant/exile + name = "exile implant" + desc = "Prevents you from returning from away missions" + origin_tech = "materials=2;biotech=3;magnets=2;bluespace=3" + activated = 0 + +/obj/item/weapon/implant/exile/get_data() + var/dat = {"Implant Specifications:
+ Name: Nanotrasen Employee Exile Implant
+ Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant
"} + return dat /obj/item/weapon/implanter/exile - name = "implanter-exile" + name = "implanter (exile)" /obj/item/weapon/implanter/exile/New() - src.imp = new /obj/item/weapon/implant/exile( src ) + imp = new /obj/item/weapon/implant/exile( src ) ..() - update() - return - - -/obj/item/weapon/implant/exile - name = "exile" - desc = "Prevents you from returning from away missions" - - get_data() - var/dat = {" -Implant Specifications:
-Name: Nanotrasen Employee Exile Implant
-Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant
"} - return dat /obj/item/weapon/implantcase/exile - name = "\improper Glass Case- 'Exile'" - desc = "A case containing an exile implant." - icon = 'icons/obj/items.dmi' - icon_state = "implantcase-r" + name = "implant case - 'Exile'" + desc = "A glass case containing an exile implant." - - New() - src.imp = new /obj/item/weapon/implant/exile( src ) - ..() - return +/obj/item/weapon/implantcase/exile/New() + imp = new /obj/item/weapon/implant/exile(src) + ..() /obj/structure/closet/secure_closet/exile name = "exile implants" req_access = list(access_hos) - New() - ..() - sleep(2) - new /obj/item/weapon/implanter/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - new /obj/item/weapon/implantcase/exile(src) - return \ No newline at end of file +/obj/structure/closet/secure_closet/exile/New() + ..() + new /obj/item/weapon/implanter/exile(src) + new /obj/item/weapon/implantcase/exile(src) + new /obj/item/weapon/implantcase/exile(src) + new /obj/item/weapon/implantcase/exile(src) + new /obj/item/weapon/implantcase/exile(src) + new /obj/item/weapon/implantcase/exile(src) \ No newline at end of file diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm index e3cfba6e673..f9a4c6f45d5 100644 --- a/code/modules/computer3/computers/prisoner.dm +++ b/code/modules/computer3/computers/prisoner.dm @@ -46,8 +46,6 @@ if(M.z == ZLEVEL_STATION && !istype(M.loc, /turf/space)) var/turf/mob_loc = get_turf(M) loc_display = mob_loc.loc - if(T.malfunction) - loc_display = pick(teleportlocs) dat += "ID: [T.id] | Location: [loc_display]
" dat += "(Send Message) |
" dat += "********************************
" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8c9ffd8400e..9c3e0e97294 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -731,4 +731,30 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, handcuffed, legcuffed, back, - wear_mask) \ No newline at end of file + wear_mask) + +/mob/living/carbon/proc/uncuff() + if (handcuffed) + var/obj/item/weapon/W = handcuffed + handcuffed = null + if (buckled && buckled.buckle_requires_restraints) + buckled.unbuckle_mob() + update_inv_handcuffed() + if (client) + client.screen -= W + if (W) + W.loc = loc + W.dropped(src) + if (W) + W.layer = initial(W.layer) + if (legcuffed) + var/obj/item/weapon/W = legcuffed + legcuffed = null + update_inv_legcuffed() + if (client) + client.screen -= W + if (W) + W.loc = loc + W.dropped(src) + if (W) + W.layer = initial(W.layer) \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 2e34a1a5b45..5b432ddfd56 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -178,6 +178,12 @@ proc/isorgan(A) return 1 return 0 +/proc/ismindslave(A) //Checks to see if the person contains a mindslave implant, then checks that the implant is actually inside of them + for(var/obj/item/weapon/implant/traitor/T in A) + if(T && T.implanted) + return 1 + return 0 + proc/isAntag(A) if(istype(A, /mob/living/carbon)) var/mob/living/carbon/C = A diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index a6cd4553270..d0638dcc1d4 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -157,44 +157,47 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/find_prob = 0 if (affected.implants.len) var/obj/item/obj = affected.implants[1] + user.visible_message("\blue [user] takes something out of [target]'s [affected.name] with \the [tool].", \ + "\blue You take [obj] out of [target]'s [affected.name]s with \the [tool]." ) + affected.implants -= obj + + target.sec_hud_set_implants() + + //Handle possessive brain borers. + if(istype(obj,/mob/living/simple_animal/borer)) + var/mob/living/simple_animal/borer/worm = obj + if(worm.controlling) + target.release_control() + worm.detatch() + worm.leave_host() + + obj.loc = get_turf(target) if(istype(obj,/obj/item/weapon/implant)) var/obj/item/weapon/implant/imp = obj - if (imp.islegal()) - find_prob +=60 + imp.removed(target) + + var/obj/item/weapon/implantcase/case + + if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_l_hand) + else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_r_hand) else - find_prob +=40 - else - find_prob +=50 + case = locate(/obj/item/weapon/implantcase) in get_turf(target) - if (prob(find_prob)) - user.visible_message("\blue [user] takes something out of [target]'s [affected.name] with \the [tool].", \ - "\blue You take [obj] out of [target]'s [affected.name]s with \the [tool]." ) - affected.implants -= obj + if(case && !case.imp) + case.imp = imp + imp.loc = case + case.update_icon() + user.visible_message("[user] places [imp] into [case]!", "You place [imp] into [case].") + else + qdel(imp) - target.sec_hud_set_implants() - - //Handle possessive brain borers. - if(istype(obj,/mob/living/simple_animal/borer)) - var/mob/living/simple_animal/borer/worm = obj - if(worm.controlling) - target.release_control() - worm.detatch() - worm.leave_host() - - obj.loc = get_turf(target) - if(istype(obj,/obj/item/weapon/implant)) - var/obj/item/weapon/implant/imp = obj - imp.imp_in = null - imp.implanted = 0 - else - user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \ - "\blue There's something inside [target]'s [affected.name], but you just missed it this time." ) else if (affected.hidden) user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.name] with \the [tool].", \ "\blue You take something out of incision on [target]'s [affected.name]s with \the [tool]." ) diff --git a/html/changelogs/implant-refactor-fox-mccloud.yml b/html/changelogs/implant-refactor-fox-mccloud.yml new file mode 100644 index 00000000000..451daad5877 --- /dev/null +++ b/html/changelogs/implant-refactor-fox-mccloud.yml @@ -0,0 +1,13 @@ + +author: Fox McCloud + +delete-after: True + +changes: + - rscadd: "completely overhauls implants to TG's standards." + - rscadd: "Adds storage implant." + - rscadd: "Adds microbomb and macrobomb implants." + - rscadd: "Adds in support for removing implants directly into cases." + - rscdel: "Removes Bay style explosive implants." + - rscdel: "Removes compressed matter implants." + - tweak: "Tweaks the uplink to reflect removal of the old implants and inclusion of the new." \ No newline at end of file diff --git a/icons/obj/implants.dmi b/icons/obj/implants.dmi new file mode 100644 index 00000000000..8dc2f08fdcb Binary files /dev/null and b/icons/obj/implants.dmi differ diff --git a/paradise.dme b/paradise.dme index edd7c70ffd1..f64993821af 100644 --- a/paradise.dme +++ b/paradise.dme @@ -768,12 +768,19 @@ #include "code\game\objects\items\weapons\grenades\smokebomb.dm" #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" #include "code\game\objects\items\weapons\grenades\syndieminibomb.dm" -#include "code\game\objects\items\weapons\implants\deadman.dm" #include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implant_chem.dm" +#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm" +#include "code\game\objects\items\weapons\implants\implant_explosive.dm" +#include "code\game\objects\items\weapons\implants\implant_freedom.dm" +#include "code\game\objects\items\weapons\implants\implant_loyality.dm" +#include "code\game\objects\items\weapons\implants\implant_misc.dm" +#include "code\game\objects\items\weapons\implants\implant_storage.dm" +#include "code\game\objects\items\weapons\implants\implant_track.dm" +#include "code\game\objects\items\weapons\implants\implant_traitor.dm" #include "code\game\objects\items\weapons\implants\implantcase.dm" #include "code\game\objects\items\weapons\implants\implantchair.dm" #include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implantfreedom.dm" #include "code\game\objects\items\weapons\implants\implantpad.dm" #include "code\game\objects\items\weapons\implants\implantuplink.dm" #include "code\game\objects\items\weapons\melee\energy.dm"