Merge remote-tracking branch 'upstream/master' into instruments

This commit is contained in:
Fox-McCloud
2017-07-04 17:42:24 -04:00
99 changed files with 1497 additions and 572 deletions

View File

@@ -12,6 +12,7 @@
return
if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No")
return
var/turf/T = get_turf(mob)
var/pick_manually = 0
if(alert("Pick the team members manually? If you select yes, you pick from ghosts. If you select no, ghosts get offered the chance to join.",,"Yes","No")=="Yes")
pick_manually = 1
@@ -34,6 +35,9 @@
var/dresscode = input("Select Outfit", "Dress-a-mob") as null|anything in outfit_list
if(isnull(dresscode))
return
var/is_syndicate = 0
if(alert("Do you want these characters automatically classified as antagonists?",,"Yes","No")=="Yes")
is_syndicate = 1
var/list/players_to_spawn = list()
if(pick_manually)
@@ -55,7 +59,8 @@
return 0
var/datum/outfit/O = outfit_list[dresscode]
var/turf/T = get_turf(mob)
var/players_spawned = 0
for(var/mob/thisplayer in players_to_spawn)
var/mob/living/carbon/human/H = new /mob/living/carbon/human(T)
H.name = random_name(pick(MALE,FEMALE))
@@ -67,13 +72,20 @@
H.mind_initialize()
H.mind.assigned_role = "MODE"
H.mind.special_role = "Event Character"
ticker.mode.traitors |= H.mind //Adds them to extra antag list
H.key = thisplayer.key
H.equipOutfit(O, FALSE)
to_chat(H, "<BR><span class='danger'><B>[themission]</B></span>")
H.mind.store_memory("<B>[themission]</B><BR><BR>")
if(is_syndicate)
ticker.mode.traitors |= H.mind //Adds them to extra antag list
players_spawned++
if(players_spawned >= teamsize)
break
message_admins("[key_name_admin(src)] has spawned a Gimmick Team.", 1)

View File

@@ -332,7 +332,7 @@ BLIND // can't see anything
mask_adjusted = 1
if(adjusted_flags)
slot_flags = adjusted_flags
if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
if(ishuman(user) && H.internal && !H.get_organ_slot("breathing_tube") && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
H.update_internals_hud_icon(0)
H.internal = null

View File

@@ -90,7 +90,8 @@
scan_reagents = 1 //You can see reagents while wearing science goggles
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
actions_types = list(/datum/action/item_action/toggle_research_scanner)
@@ -138,7 +139,8 @@
item_state = "eyepatch"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/monocle
@@ -150,7 +152,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/material
@@ -163,7 +166,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/material/cyber
@@ -182,7 +186,8 @@
prescription = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/regular/hipster
@@ -198,7 +203,8 @@
item_state = "3d"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/gglasses
@@ -208,7 +214,8 @@
item_state = "gglasses"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
prescription_upgradable = 1
@@ -379,7 +386,8 @@
flash_protect = -1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
emp_act(severity)

View File

@@ -62,7 +62,8 @@
HUDType = DATA_HUD_DIAGNOSTIC
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/hud/diagnostic/night
@@ -85,7 +86,8 @@
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi'
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/hud/security/chameleon
@@ -138,7 +140,8 @@
HUDType = DATA_HUD_HYDROPONIC
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
/obj/item/clothing/glasses/hud/hydroponic/night

View File

@@ -70,4 +70,8 @@
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)

View File

@@ -13,10 +13,11 @@
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
burn_state = FIRE_PROOF
species_fit = list("Vox", "Drask")
species_fit = list("Vox", "Drask", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Drask" = 'icons/mob/species/drask/helmet.dmi'
"Drask" = 'icons/mob/species/drask/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
/obj/item/clothing/head/helmet/attack_self(mob/user)

View File

@@ -24,12 +24,13 @@
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
actions_types = list(/datum/action/item_action/toggle)
burn_state = FIRE_PROOF
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi'
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
/obj/item/clothing/head/welding/flamedecal

View File

@@ -8,12 +8,13 @@
w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/adjust)
adjusted_flags = SLOT_HEAD
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi'
)
@@ -28,12 +29,13 @@
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = WEIGHT_CLASS_SMALL
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi'
)

View File

@@ -10,13 +10,14 @@
permeability_coefficient = 0.50
actions_types = list(/datum/action/item_action/adjust)
burn_state = FIRE_PROOF
species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin", "Grey" )
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Vox Armalis" = 'icons/mob/species/armalis/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi'
)
@@ -30,7 +31,7 @@
item_state = "medical"
permeability_coefficient = 0.01
put_on_delay = 10
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
/obj/item/clothing/mask/breath/vox
desc = "A weirdly-shaped breath mask."

View File

@@ -34,12 +34,13 @@
w_class = WEIGHT_CLASS_TINY
resist_time = 150
mute = 0
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
@@ -65,12 +66,13 @@
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0)
actions_types = list(/datum/action/item_action/adjust)
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
@@ -83,12 +85,13 @@
icon_state = "fake-moustache"
flags_inv = HIDEFACE
actions_types = list(/datum/action/item_action/pontificate)
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
/obj/item/clothing/mask/fakemoustache/attack_self(mob/user)
@@ -267,12 +270,13 @@
slot_flags = SLOT_MASK
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
actions_types = list(/datum/action/item_action/adjust)

View File

@@ -9,6 +9,10 @@
var/obj/machinery/camera/camera
var/has_camera = TRUE
strip_delay = 130
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
/obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user)
if(camera || !has_camera)

View File

@@ -20,14 +20,15 @@
"Skrell" = 'icons/mob/species/skrell/helmet.dmi',
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
"Drask" = 'icons/mob/species/drask/helmet.dmi'
"Drask" = 'icons/mob/species/drask/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
sprite_sheets_obj = list(
"Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi',
"Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi',
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi',
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi',
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi'
)
/obj/item/clothing/head/helmet/space/hardsuit/equip_to_best_slot(mob/M)
@@ -83,7 +84,7 @@
"Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi',
"Vox" = 'icons/obj/clothing/species/vox/suits.dmi',
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi',
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi'
)
//Breach thresholds, should ideally be inherited by most (if not all) hardsuits.
@@ -440,7 +441,10 @@
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
sprite_sheets = null
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
/obj/item/clothing/suit/space/hardsuit/wizard
icon_state = "hardsuit-wiz"
@@ -538,7 +542,6 @@
icon_state = "hardsuit0-hos"
item_color = "hos"
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
sprite_sheets = null
/obj/item/clothing/suit/space/hardsuit/security/hos

View File

@@ -8,9 +8,10 @@
permeability_coefficient = 0.01
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
species_fit = list("Vox", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi'
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot)
@@ -136,9 +137,10 @@
desc = "A paramedic EVA helmet. Used in the recovery of bodies from space."
icon_state = "paramedic-eva-helmet"
item_state = "paramedic-eva-helmet"
species_fit = list("Vox")
species_fit = list("Vox", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi'
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
sprite_sheets_obj = list(
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi'
@@ -187,12 +189,13 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flash_protect = 0
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin")
species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin", "Grey")
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi'
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
sprite_sheets_obj = list(
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi',

View File

@@ -116,7 +116,7 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
flash_protect = 2
/obj/item/clothing/suit/space/eva/plasmaman/engineer
name = "plasmaman engineer suit"
icon_state = "plasmamanEngineer_suit"
@@ -128,7 +128,7 @@
base_state = "plasmamanEngineer_helmet"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
flash_protect = 2
/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
name = "plasmaman chief engineer suit"
icon_state = "plasmaman_CE"
@@ -269,6 +269,24 @@
icon_state = "plasmaman_CMO_helmet0"
base_state = "plasmaman_CMO_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
name = "plasmaman coroner suit"
icon_state = "plasmaman_Coroner"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
name = "plasmaman coroner helmet"
icon_state = "plasmaman_Coroner_helmet0"
base_state = "plasmaman_Coroner_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
name = "plasmaman virologist suit"
icon_state = "plasmaman_Virologist"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
name = "plasmaman virologist helmet"
icon_state = "plasmaman_Virologist_helmet0"
base_state = "plasmaman_Virologist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science
name = "plasmaman scientist suit"
icon_state = "plasmamanScience_suit"
@@ -278,6 +296,15 @@
icon_state = "plasmamanScience_helmet0"
base_state = "plasmamanScience_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
name = "plasmaman geneticist suit"
icon_state = "plasmaman_Geneticist"
/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
name = "plasmaman geneticist helmet"
icon_state = "plasmaman_Geneticist_helmet0"
base_state = "plasmaman_Geneticist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science/rd
name = "plasmaman research director suit"
icon_state = "plasmaman_RD"

View File

@@ -620,7 +620,7 @@
return
var/area/t = get_area(M)
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(src)
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
//give the syndicats a bit of stealth
a.autosay("[M] has been vandalized in Space!", "[M]'s Death Alarm")

View File

@@ -822,3 +822,11 @@
icon_state = "victorianredvest"
item_state = "victorianredvest"
item_color = "victorianredvest"
/obj/item/clothing/under/medigown
name = "medical gown"
desc = "a flimsy examination gown, the back ties never close."
icon_state = "medicalgown"
item_state = "medicalgown"
item_color = "medicalgown"
body_parts_covered = UPPER_TORSO|LOWER_TORSO

View File

@@ -9,15 +9,19 @@
var/atom/attached_to
color = "#ff0000"
var/text_size = 4
var/started = 0
var/started = FALSE
invisibility = INVISIBILITY_OBSERVER
anchored = 1
layer = 5
anchored = TRUE
layer = GHOST_LAYER
/obj/effect/countdown/New(atom/A)
. = ..()
attach(A)
/obj/effect/countdown/examine(mob/user)
. = ..()
to_chat(user, "This countdown is displaying: [displayed_text]")
/obj/effect/countdown/proc/attach(atom/A)
attached_to = A
loc = get_turf(A)
@@ -25,13 +29,13 @@
/obj/effect/countdown/proc/start()
if(!started)
fast_processing += src
started = 1
started = TRUE
/obj/effect/countdown/proc/stop()
if(started)
maptext = null
fast_processing -= src
started = 0
started = FALSE
/obj/effect/countdown/proc/get_value()
// Get the value from our atom
@@ -56,6 +60,19 @@
fast_processing -= src
return ..()
/obj/effect/countdown/ex_act(severity) //immune to explosions
return
/obj/effect/countdown/syndicatebomb
name = "syndicate bomb countdown"
/obj/effect/countdown/syndicatebomb/get_value()
var/obj/machinery/syndicatebomb/S = attached_to
if(!istype(S))
return
else if(S.active)
return S.seconds_remaining()
/obj/effect/countdown/clonepod
name = "cloning pod countdown"
text_size = 1

View File

@@ -324,6 +324,30 @@
/obj/item/stack/rods = 1)
category = CAT_MISC
/datum/crafting_recipe/chemical_payload
name = "Chemical Payload (C4)"
result = /obj/item/weapon/bombcore/chemical
reqs = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/grenade/plastic/c4 = 1,
/obj/item/weapon/grenade/chem_grenade = 2
)
parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2)
time = 30
category = CAT_WEAPON
/datum/crafting_recipe/chemical_payload2
name = "Chemical Payload (gibtonite)"
result = /obj/item/weapon/bombcore/chemical
reqs = list(
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/twohanded/required/gibtonite = 1,
/obj/item/weapon/grenade/chem_grenade = 2
)
parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2)
time = 50
category = CAT_WEAPON
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 60

View File

@@ -296,13 +296,6 @@
flags = RESTRICTED | HIVEMIND
/datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask)
var/their = "their"
if(speaker.gender == "female")
their = "her"
if(speaker.gender == "male")
their = "his"
speaker.visible_message("<span class='notice'>[speaker] touches [their] fingers to [their] temple.</span>")
..(speaker,message,speaker.real_name)
/datum/language/grey/check_can_speak(mob/living/speaker)
@@ -316,6 +309,14 @@
if(speaker.incapacitated(ignore_lying = 1))
to_chat(speaker,"<span class='warning'>You can't communicate while unable to move your hands to your head!</span>")
return FALSE
var/their = "their"
if(speaker.gender == "female")
their = "her"
if(speaker.gender == "male")
their = "his"
speaker.visible_message("<span class='notice'>[speaker] touches [their] fingers to [their] temple.</span>") //If placed in grey/broadcast, it will happen regardless of the success of the action.
return TRUE
/datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)

View File

@@ -654,9 +654,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
"<span class='userdanger'>[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].</span>")
var/no_mask
if(!(wear_mask && wear_mask.flags & AIRTIGHT))
if(!(head && head.flags & AIRTIGHT))
no_mask = 1
if(!get_organ_slot("breathing_tube"))
if(!(wear_mask && wear_mask.flags & AIRTIGHT))
if(!(head && head.flags & AIRTIGHT))
no_mask = 1
if(no_mask)
to_chat(usr, "<span class='warning'>[src] is not wearing a suitable mask or helmet!</span>")
return
@@ -667,9 +668,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
update_internals_hud_icon(0)
else
var/no_mask2
if(!(wear_mask && wear_mask.flags & AIRTIGHT))
if(!(head && head.flags & AIRTIGHT))
no_mask2 = 1
if(!get_organ_slot("breathing_tube"))
if(!(wear_mask && wear_mask.flags & AIRTIGHT))
if(!(head && head.flags & AIRTIGHT))
no_mask2 = 1
if(no_mask2)
to_chat(usr, "<span class='warning'>[src] is not wearing a suitable mask or helmet!</span>")
return

View File

@@ -3,6 +3,7 @@
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/stomach_contents = list()
var/list/internal_organs = list()
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
var/antibodies = 0
var/life_tick = 0 // The amount of life ticks that have processed on this mob.

View File

@@ -427,7 +427,7 @@
/mob/living/carbon/human/show_inv(mob/user)
user.set_machine(src)
var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask)
var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) || get_organ_slot("breathing_tube")
var/list/obscured = check_obscured_slots()
var/dat = {"<table>
@@ -596,7 +596,7 @@
return
//repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere
/mob/living/carbon/human/get_visible_name()
/mob/living/carbon/human/get_visible_name(var/id_override = FALSE)
if(name_override)
return name_override
if(wear_mask && (wear_mask.flags_inv & HIDEFACE)) //Wearing a mask which hides our face, use id-name if possible
@@ -605,7 +605,7 @@
return get_id_name("Unknown") //Likewise for hats
var/face_name = get_face_name()
var/id_name = get_id_name("")
if(id_name && (id_name != face_name))
if(id_name && (id_name != face_name) && !id_override)
return "[face_name] (as [id_name])"
return face_name

View File

@@ -151,7 +151,7 @@
update_hair() //rebuild hair
update_fhair()
update_head_accessory()
if(internal)
if(internal && !get_organ_slot("breathing_tube"))
internal = null
update_internals_hud_icon(0)
wear_mask_update(I, toggle_off = FALSE)

View File

@@ -305,9 +305,10 @@
var/null_internals = 0 //internals are invalid, therefore turn them off
var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped.
if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT)
if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT)
null_internals = 1 //not wearing a mask or suitable helmet
if(!get_organ_slot("breathing_tube"))
if(!(wear_mask && wear_mask.flags & AIRTIGHT)) //if NOT (wear_mask AND wear_mask.flags CONTAIN AIRTIGHT)
if(!(head && head.flags & AIRTIGHT)) //if NOT (head AND head.flags CONTAIN AIRTIGHT)
null_internals = 1 //not wearing a mask or suitable helmet
if(istype(back, /obj/item/weapon/rig)) //wearing a rigsuit
var/obj/item/weapon/rig/rig = back //needs to be typecasted because this doesn't use get_rig() for some reason

View File

@@ -49,9 +49,12 @@
var/tank_slot_name = "suit storage"
switch(assigned_role)
if("Scientist","Geneticist","Roboticist")
if("Scientist","Roboticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
if("Geneticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
if("Research Director")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
@@ -103,6 +106,12 @@
if("Chief Medical Officer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
if("Coroner")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
if("Virologist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
if("Bartender", "Chef")
suit=/obj/item/clothing/suit/space/eva/plasmaman/service
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service

View File

@@ -927,7 +927,7 @@
"brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain,
"cell" = /obj/item/organ/internal/cell,
"optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2.
"charger" = /obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord
"charger" = /obj/item/organ/internal/cyberimp/arm/power_cord
)
vision_organ = /obj/item/organ/internal/eyes/optical_sensor

View File

@@ -183,9 +183,10 @@
if(internal)
if(internal.loc != src)
internal = null
if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask
if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet
internal = null //turn off internals
if(!get_organ_slot("breathing_tube"))
if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask
if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet
internal = null //turn off internals
if(internal)
update_internals_hud_icon(1)

View File

@@ -120,6 +120,7 @@
var/has_enabled_antagHUD = 0
var/antagHUD = 0
var/can_change_intents = 1 //all mobs can change intents by default.
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
var/proc_holder_list[] = list()

View File

@@ -167,9 +167,11 @@
*/
var/breathing_tube = affecting.get_organ_slot("breathing_tube")
if(state >= GRAB_NECK)
affecting.Stun(5) //It will hamper your voice, being choked and all.
if(isliving(affecting))
if(isliving(affecting) && !breathing_tube)
var/mob/living/L = affecting
L.adjustOxyLoss(1)
@@ -177,7 +179,8 @@
//affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason.
affecting.Stuttering(5) //It will hamper your voice, being choked and all.
affecting.Weaken(5) //Should keep you down unless you get help.
affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
if(!breathing_tube)
affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjust_position()
@@ -290,7 +293,8 @@
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
assailant.next_move = world.time + 10
affecting.AdjustLoseBreath(1)
if(!affecting.get_organ_slot("breathing_tube"))
affecting.AdjustLoseBreath(1)
affecting.setDir(WEST)
adjust_position()

View File

@@ -242,7 +242,7 @@ proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an inpu
return sanitize(copytext(t,1,MAX_MESSAGE_LEN))
proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added
/proc/Gibberish(t, p)//t is the inputted message, and any value higher than 70 for p will cause letters to be replaced instead of added
/* Turn text into complete gibberish! */
var/returntext = ""
for(var/i = 1, i <= length(t), i++)
@@ -337,30 +337,31 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
set name = "a-intent"
set hidden = 1
if(ishuman(src) || isalienadult(src) || isbrain(src))
switch(input)
if(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
a_intent = input
if("right")
a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4)
if("left")
a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4)
if(hud_used && hud_used.action_intent)
hud_used.action_intent.icon_state = "[a_intent]"
if(can_change_intents)
if(ishuman(src) || isalienadult(src) || isbrain(src))
switch(input)
if(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
a_intent = input
if("right")
a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4)
if("left")
a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4)
if(hud_used && hud_used.action_intent)
hud_used.action_intent.icon_state = "[a_intent]"
else if(isrobot(src) || islarva(src))
switch(input)
if(INTENT_HELP)
a_intent = INTENT_HELP
if(INTENT_HARM)
a_intent = INTENT_HARM
if("right","left")
a_intent = intent_numeric(intent_numeric(a_intent) - 3)
if(hud_used && hud_used.action_intent)
if(a_intent == INTENT_HARM)
hud_used.action_intent.icon_state = "harm"
else
hud_used.action_intent.icon_state = "help"
else if(isrobot(src) || islarva(src))
switch(input)
if(INTENT_HELP)
a_intent = INTENT_HELP
if(INTENT_HARM)
a_intent = INTENT_HARM
if("right","left")
a_intent = intent_numeric(intent_numeric(a_intent) - 3)
if(hud_used && hud_used.action_intent)
if(a_intent == INTENT_HARM)
hud_used.action_intent.icon_state = "harm"
else
hud_used.action_intent.icon_state = "help"
/mob/living/verb/mob_sleep()

View File

@@ -1,30 +1,20 @@
/obj/item/weapon/gun/energy/gun/advtaser/mounted
name = "mounted taser"
desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots."
icon_state = "armcannon"
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "taser"
item_state = "armcannonstun4"
force = 5
flags = NODROP
w_class = WEIGHT_CLASS_HUGE
can_flashlight = 0
selfcharge = 1
can_flashlight = 0
trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead
/obj/item/weapon/gun/energy/gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow...
..()
loc = null//send it to nullspace to get retrieved by the implant later on. gotta cover those edge cases.
/obj/item/weapon/gun/energy/laser/mounted
name = "mounted laser"
desc = "An arm mounted cannon that fires lethal lasers. Doesn't come with a charge beam."
icon_state = "armcannon"
desc = "An arm mounted cannon that fires lethal lasers."
icon = 'icons/obj/items_cyborg.dmi'
icon_state = "laser"
item_state = "armcannonlase"
force = 5
flags = NODROP
w_class = WEIGHT_CLASS_HUGE
materials = null
selfcharge = 1
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
/obj/item/weapon/gun/energy/laser/mounted/dropped()
..()
loc = null
trigger_guard = TRIGGER_GUARD_ALLOW_ALL

View File

@@ -0,0 +1,78 @@
// Replaces chemgrenade stuff, allowing reagent explosions to be called from anywhere.
// It should be called using a location, the range, and a list of reagents involved.
// Threatscale is a multiplier for the 'threat' of the grenade. If you're increasing the affected range drastically, you might want to improve this.
// Extra heat affects the temperature of the mixture, and may cause it to react in different ways.
/proc/chem_splash(turf/epicenter, affected_range = 3, list/datum/reagents/reactants = list(), extra_heat = 0, threatscale = 1, adminlog = 1)
if(!isturf(epicenter) || !reactants.len || threatscale <= 0)
return
var/has_reagents
var/total_reagents
for(var/datum/reagents/R in reactants)
if(R.total_volume)
has_reagents = 1
total_reagents += R.total_volume
if(!has_reagents)
return
var/datum/reagents/splash_holder = new/datum/reagents(total_reagents*threatscale)
splash_holder.my_atom = epicenter // For some reason this is setting my_atom to null, and causing runtime errors.
var/total_temp = 0
for(var/datum/reagents/R in reactants)
R.trans_to(splash_holder, R.total_volume, threatscale, 1, 1)
total_temp += R.chem_temp
splash_holder.chem_temp = (total_temp/reactants.len) + extra_heat // Average temperature of reagents + extra heat.
splash_holder.handle_reactions() // React them now.
if(splash_holder.total_volume && affected_range >= 0) //The possible reactions didnt use up all reagents, so we spread it around.
var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread()
steam.set_up(10, 0, epicenter)
steam.attach(epicenter)
steam.start()
var/list/viewable = view(affected_range, epicenter)
var/list/accessible = list(epicenter)
for(var/i=1; i<=affected_range; i++)
var/list/turflist = list()
for(var/turf/T in (orange(i, epicenter) - orange(i-1, epicenter)))
turflist |= T
for(var/turf/T in turflist)
if( !(get_dir(T,epicenter) in cardinal) && (abs(T.x - epicenter.x) == abs(T.y - epicenter.y) ))
turflist.Remove(T)
turflist.Add(T) // we move the purely diagonal turfs to the end of the list.
for(var/turf/T in turflist)
if(accessible[T])
continue
for(var/thing in T.GetAtmosAdjacentTurfs(alldir = TRUE))
var/turf/NT = thing
if(!(NT in accessible))
continue
if(!(get_dir(T,NT) in cardinal))
continue
accessible[T] = 1
break
var/list/reactable = accessible
for(var/turf/T in accessible)
for(var/atom/A in T.GetAllContents())
if(!(A in viewable))
continue
reactable |= A
if(extra_heat >= 300)
T.hotspot_expose(extra_heat*2, 5)
if(!reactable.len) //Nothing to react with. Probably means we're in nullspace.
return
for(var/thing in reactable)
var/atom/A = thing
var/distance = max(1,get_dist(A, epicenter))
var/fraction = 0.5/(2 ** distance) //50/25/12/6... for a 200u splash, 25/12/6/3... for a 100u, 12/6/3/1 for a 50u
splash_holder.reaction(A, TOUCH, fraction)
qdel(splash_holder)
return 1

View File

@@ -108,7 +108,7 @@ var/const/INGEST = 2
return the_id
/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
if(!target)
return
if(total_volume <= 0)
@@ -143,13 +143,14 @@ var/const/INGEST = 2
if(preserve_data)
trans_data = copy_data(current_reagent)
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp)
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, chem_temp, no_react = 1)
remove_reagent(current_reagent.id, current_reagent_transfer)
update_total()
R.update_total()
R.handle_reactions()
handle_reactions()
if(!no_react)
R.handle_reactions()
handle_reactions()
return amount
/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0)
@@ -537,7 +538,7 @@ var/const/INGEST = 2
var/amt = list_reagents[r_id]
add_reagent(r_id, amt, data)
/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300)
/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0)
if(!isnum(amount))
return 1
update_total()
@@ -554,7 +555,8 @@ var/const/INGEST = 2
update_total()
my_atom.on_reagent_change()
R.on_merge(data)
handle_reactions()
if(!no_react)
handle_reactions()
return 0
var/datum/reagent/D = chemical_reagents_list[reagent]
@@ -570,7 +572,8 @@ var/const/INGEST = 2
update_total()
my_atom.on_reagent_change()
handle_reactions()
if(!no_react)
handle_reactions()
return 0
else
warning("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])")

View File

@@ -371,10 +371,12 @@
description = "What is this emotion you humans call \"love?\" Oh, it's this? This is it? Huh, well okay then, thanks."
reagent_state = LIQUID
color = "#FF83A5"
process_flags = ORGANIC | SYNTHETIC // That's the power of love~
/datum/reagent/love/on_mob_life(mob/living/M)
if(M.a_intent == INTENT_HARM)
M.a_intent = INTENT_HELP
if(M.a_intent != INTENT_HELP)
M.a_intent_change(INTENT_HELP)
M.can_change_intents = 0 //Now you have no choice but to be helpful.
if(prob(8))
var/lovely_phrase = pick("appreciated", "loved", "pretty good", "really nice", "pretty happy with yourself, even though things haven't always gone as well as they could")
@@ -391,9 +393,14 @@
break
..()
/datum/reagent/love/on_mob_delete(mob/living/M)
M.can_change_intents = 1
..()
/datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume)
to_chat(M, "<span class='notice'>You feel loved!</span>")
/datum/reagent/royal_bee_jelly
name = "royal bee jelly"
id = "royal_bee_jelly"

View File

@@ -221,6 +221,8 @@
if(method == TOUCH)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.get_species() == "Grey")
return
if(volume > 25)
@@ -247,6 +249,8 @@
if(method == INGEST)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.get_species() == "Grey")
return
if(volume < 10)
to_chat(M, "<span class='danger'>The greenish acidic substance stings you, but isn't concentrated enough to harm you!</span>")

View File

@@ -40,7 +40,8 @@
/obj/machinery/biogenerator,
/obj/machinery/hydroponics,
/obj/machinery/constructable_frame,
/obj/machinery/icemachine)
/obj/machinery/icemachine,
/obj/item/weapon/bombcore/chemical)
/obj/item/weapon/reagent_containers/glass/New()
..()

View File

@@ -29,6 +29,7 @@
/obj/structure/reagent_dispensers/proc/boom()
visible_message("<span class='danger'>[src] ruptures!</span>")
chem_splash(loc, 5, list(reagents))
qdel(src)
/obj/structure/reagent_dispensers/ex_act(severity)
@@ -53,15 +54,6 @@
desc = "A water tank."
icon_state = "water"
/obj/structure/reagent_dispensers/watertank/boom()
playsound(loc, 'sound/effects/spray2.ogg', 50, 1, -6)
new /obj/effect/effect/water(loc)
for(var/turf/simulated/T in view(5, loc))
T.MakeSlippery()
for(var/mob/living/L in T)
L.adjust_fire_stacks(-20)
..()
/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.."

View File

@@ -377,7 +377,7 @@
found = 1
break
if(!found)
to_chat(usr, "\icon[src]<span class=notice>The conveyor switch did not detect any linked conveyor belts in range.</span>")
to_chat(usr, "<span class=notice>[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.</span>")
return
var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id)
transfer_fingerprints_to(NC)

View File

@@ -1129,6 +1129,15 @@
construction_time = 200
category = list("Misc")
/datum/design/ipc_charger
name = "IPC Charger"
id = "ipc_cahrger"
build_type = MECHFAB
build_path = /obj/item/organ/internal/cyberimp/arm/power_cord
materials = list(MAT_METAL=2000, MAT_GLASS=1000)
construction_time = 200
category = list("Misc")
/datum/design/ipc_optics
name = "IPC Optical Sensor"
id = "ipc_optics"

View File

@@ -260,6 +260,28 @@
build_path = /obj/item/organ/internal/cyberimp/eyes/shield
category = list("Misc", "Medical")
/datum/design/cyberimp_breather
name = "Breathing Tube Implant"
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
id = "ci-breather"
req_tech = list("materials" = 2, "biotech" = 3)
build_type = PROTOLATHE | MECHFAB
construction_time = 35
materials = list(MAT_METAL = 600, MAT_GLASS = 250)
build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube
category = list("Misc", "Medical")
/datum/design/cyberimp_toolset
name = "Toolset Arm Implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm."
id = "ci-toolset"
req_tech = list("materials" = 3, "engineering" = 4, "biotech" = 4, "powerstorage" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
construction_time = 200
build_path = /obj/item/organ/internal/cyberimp/arm/toolset
category = list("Misc", "Medical")
/datum/design/cyberimp_medical_hud
name = "Medical HUD implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."

View File

@@ -80,6 +80,36 @@
build_path = /obj/item/weapon/grenade/chem_grenade/large
category = list("Weapons")
/datum/design/pyro_grenade
name = "Pyro Grenade"
desc = "An advanced grenade that is able to self ignite its mixture."
id = "pyro_Grenade"
req_tech = list("combat" = 4, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_PLASMA = 500)
build_path = /obj/item/weapon/grenade/chem_grenade/pyro
category = list("Weapons")
/datum/design/cryo_grenade
name = "Cryo Grenade"
desc = "An advanced grenade that rapidly cools its contents upon detonation."
id = "cryo_Grenade"
req_tech = list("combat" = 3, "materials" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
build_path = /obj/item/weapon/grenade/chem_grenade/cryo
category = list("Weapons")
/datum/design/adv_grenade
name = "Advanced Release Grenade"
desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter."
id = "adv_Grenade"
req_tech = list("combat" = 3, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 500)
build_path = /obj/item/weapon/grenade/chem_grenade/adv_release
category = list("Weapons")
/datum/design/tele_shield
name = "Telescopic Riot Shield"
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."

View File

@@ -0,0 +1,315 @@
/obj/item/organ/internal/cyberimp/arm
name = "arm-mounted implant"
desc = "You shouldn't see this! Adminhelp and report this as an issue on github!"
parent_organ = "r_arm"
slot = "r_arm_device"
icon_state = "implant-toolkit"
w_class = WEIGHT_CLASS_NORMAL
actions_types = list(/datum/action/item_action/organ_action/toggle)
var/list/items_list = list()
// Used to store a list of all items inside, for multi-item implants.
// I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies.
var/obj/item/holder = null
// You can use this var for item path, it would be converted into an item on New()
/obj/item/organ/internal/cyberimp/arm/New()
..()
if(ispath(holder))
holder = new holder(src)
update_icon()
slot = parent_organ + "_device"
items_list = contents.Copy()
/obj/item/organ/internal/cyberimp/arm/update_icon()
if(parent_organ == "r_arm")
transform = null
else // Mirroring the icon
transform = matrix(-1, 0, 0, 0, 1, 0)
/obj/item/organ/internal/cyberimp/arm/examine(mob/user)
..()
to_chat(user, "<span class='info'>[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.</span>")
/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/weapon/W, mob/user, params)
..()
if(isscrewdriver(W))
if(parent_organ == "r_arm")
parent_organ = "l_arm"
else
parent_organ = "r_arm"
slot = parent_organ + "_device"
to_chat(user, "<span class='notice'>You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.</span>")
update_icon()
else if(istype(W, /obj/item/weapon/card/emag))
emag_act()
/obj/item/organ/internal/cyberimp/arm/remove(mob/living/carbon/M, special = 0)
Retract()
. = ..()
/obj/item/organ/internal/cyberimp/arm/emag_act()
return 0
/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity)
if(prob(15/severity) && owner)
to_chat(owner, "<span class='warning'>[src] is hit by EMP!</span>")
// give the owner an idea about why his implant is glitching
Retract()
..()
/obj/item/organ/internal/cyberimp/arm/proc/Retract()
if(!holder || (holder in src))
return
owner.visible_message("<span class='notice'>[owner] retracts [holder] back into \his [parent_organ == "r_arm" ? "right" : "left"] arm.</span>",
"<span class='notice'>[holder] snaps back into your [parent_organ == "r_arm" ? "right" : "left"] arm.</span>",
"<span class='italics'>You hear a short mechanical noise.</span>")
if(istype(holder, /obj/item/device/flash/armimplant))
var/obj/item/device/flash/F = holder
F.set_light(0)
owner.unEquip(holder, 1)
holder.forceMove(src)
holder = null
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
/obj/item/organ/internal/cyberimp/arm/proc/Extend(var/obj/item/item)
if(!(item in src))
return
holder = item
holder.flags |= NODROP
holder.unacidable = 1
holder.slot_flags = null
holder.w_class = WEIGHT_CLASS_HUGE
holder.materials = null
if(istype(holder, /obj/item/device/flash/armimplant))
var/obj/item/device/flash/F = holder
F.set_light(7)
var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand)
var/obj/item/arm_item = owner.get_item_by_slot(arm_slot)
if(arm_item)
if(!owner.unEquip(arm_item))
to_chat(owner, "<span class='warning'>Your [arm_item] interferes with [src]!</span>")
return
else
to_chat(owner, "<span class='notice'>You drop [arm_item] to activate [src]!</span>")
if(parent_organ == "r_arm" ? !owner.put_in_r_hand(holder) : !owner.put_in_l_hand(holder))
to_chat(owner, "<span class='warning'>Your [src] fails to activate!</span>")
return
// Activate the hand that now holds our item.
if(parent_organ == "r_arm" ? owner.hand : !owner.hand)
owner.swap_hand()
owner.visible_message("<span class='notice'>[owner] extends [holder] from \his [parent_organ == "r_arm" ? "right" : "left"] arm.</span>",
"<span class='notice'>You extend [holder] from your [parent_organ == "r_arm" ? "right" : "left"] arm.</span>",
"<span class='italics'>You hear a short mechanical noise.</span>")
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
/obj/item/organ/internal/cyberimp/arm/ui_action_click()
if(crit_fail || (!holder && !contents.len))
to_chat(owner, "<span class='warning'>The implant doesn't respond. It seems to be broken...</span>")
return
// You can emag the arm-mounted implant by activating it while holding emag in it's hand.
var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand)
if(istype(owner.get_item_by_slot(arm_slot), /obj/item/weapon/card/emag) && emag_act())
return
if(!holder || (holder in src))
holder = null
if(contents.len == 1)
Extend(contents[1])
else // TODO: make it similar to borg's storage-like module selection
var/obj/item/choise = input("Activate which item?", "Arm Implant", null, null) as null|anything in items_list
if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && istype(choise) && (choise in contents))
// This monster sanity check is a nice example of how bad input() is.
Extend(choise)
else
Retract()
/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity)
if(prob(30/severity) && owner && !crit_fail)
Retract()
owner.visible_message("<span class='danger'>A loud bang comes from [owner]\'s [parent_organ == "r_arm" ? "right" : "left"] arm!</span>")
playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, 1)
to_chat(owner, "<span class='userdanger'>You feel an explosion erupt inside your [parent_organ == "r_arm" ? "right" : "left"] arm as your implant breaks!</span>")
owner.adjust_fire_stacks(20)
owner.IgniteMob()
owner.adjustFireLoss(25)
crit_fail = 1
else // The gun will still discharge anyway.
..()
/obj/item/organ/internal/cyberimp/arm/gun/laser
name = "arm-mounted laser implant"
desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use."
icon_state = "arm_laser"
origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3"
contents = newlist(/obj/item/weapon/gun/energy/laser/mounted)
/obj/item/organ/internal/cyberimp/arm/gun/laser/l
parent_organ = "l_arm"
/obj/item/organ/internal/cyberimp/arm/gun/taser
name = "arm-mounted taser implant"
desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use."
icon_state = "arm_taser"
origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4"
contents = newlist(/obj/item/weapon/gun/energy/gun/advtaser/mounted)
/obj/item/organ/internal/cyberimp/arm/gun/taser/l
parent_organ = "l_arm"
/obj/item/organ/internal/cyberimp/arm/toolset
name = "integrated toolset implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm. Contains all neccessary tools."
origin_tech = "materials=3;engineering=4;biotech=3;powerstorage=4"
contents = newlist(/obj/item/weapon/screwdriver/cyborg, /obj/item/weapon/wrench/cyborg, /obj/item/weapon/weldingtool/largetank/cyborg,
/obj/item/weapon/crowbar/cyborg, /obj/item/weapon/wirecutters/cyborg, /obj/item/device/multitool/cyborg)
/obj/item/organ/internal/cyberimp/arm/toolset/l
parent_organ = "l_arm"
/obj/item/organ/internal/cyberimp/arm/toolset/emag_act()
if(!(locate(/obj/item/weapon/kitchen/knife/combat/cyborg) in items_list))
to_chat(usr, "<span class='notice'>You unlock [src]'s integrated knife!</span>")
items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src)
return 1
return 0
/obj/item/organ/internal/cyberimp/arm/esword
name = "arm-mounted energy blade"
desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated enregy."
contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight)
origin_tech = "materials=4;combat=5;biotech=3;powerstorage=2;syndicate=5"
/obj/item/organ/internal/cyberimp/arm/medibeam
name = "integrated medical beamgun"
desc = "A cybernetic implant that allows the user to project a healing beam from their hand."
contents = newlist(/obj/item/weapon/gun/medbeam)
origin_tech = "materials=5;combat=2;biotech=5;powerstorage=4;syndicate=1"
/obj/item/organ/internal/cyberimp/arm/flash
name = "integrated high-intensity photon projector" //Why not
desc = "An integrated projector mounted onto a user's arm, that is able to be used as a powerful flash."
contents = newlist(/obj/item/device/flash/armimplant)
origin_tech = "materials=4;combat=3;biotech=4;magnets=4;powerstorage=3"
/obj/item/organ/internal/cyberimp/arm/flash/New()
..()
if(locate(/obj/item/device/flash/armimplant) in items_list)
var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list
F.I = src
/obj/item/organ/internal/cyberimp/arm/baton
name = "arm electrification implant"
desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm."
contents = newlist(/obj/item/borg/stun)
origin_tech = "materials=3;combat=5;biotech=4;powerstorage=4;syndicate=3"
/obj/item/organ/internal/cyberimp/arm/combat
name = "combat cybernetics implant"
desc = "A powerful cybernetic implant that contains combat modules built into the user's arm"
contents = newlist(/obj/item/weapon/melee/energy/blade/hardlight, /obj/item/weapon/gun/medbeam, /obj/item/borg/stun, /obj/item/device/flash/armimplant)
origin_tech = "materials=5;combat=7;biotech=5;powerstorage=5;syndicate=6;programming=5"
/obj/item/organ/internal/cyberimp/arm/combat/New()
..()
if(locate(/obj/item/device/flash/armimplant) in items_list)
var/obj/item/device/flash/armimplant/F = locate(/obj/item/device/flash/armimplant) in items_list
F.I = src
/obj/item/organ/internal/cyberimp/arm/surgery
name = "surgical toolset implant"
desc = "A set of surgical tools hidden behind a concealed panel on the user's arm"
contents = newlist(/obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/weapon/scalpel, /obj/item/weapon/circular_saw, /obj/item/weapon/bonegel, /obj/item/weapon/FixOVein, /obj/item/weapon/bonesetter)
origin_tech = "materials=3;engineering=3;biotech=3;programming=2;magnets=3"
// lets make IPCs even *more* vulnerable to EMPs!
/obj/item/organ/internal/cyberimp/arm/power_cord
name = "APC-compatible power adapter implant"
desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment"
origin_tech = "materials=3;biotech=2;powerstorage=3"
contents = newlist(/obj/item/apc_powercord)
/obj/item/organ/internal/cyberimp/arm/power_cord/emp_act(severity)
// To allow repair via nanopaste/screwdriver
// also so IPCs don't also catch on fire and fall even more apart upon EMP
damage = 1
crit_fail = TRUE
/obj/item/organ/internal/cyberimp/arm/power_cord/surgeryize()
if(crit_fail && owner)
to_chat(owner, "<span class='notice'>Your [src] feels functional again.</span>")
crit_fail = FALSE
/obj/item/apc_powercord
name = "power cable"
desc = "Insert into a nearby APC to draw power from it."
icon = 'icons/obj/power.dmi'
icon_state = "wire1"
flags = NOBLUDGEON
/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag)
return ..()
user.changeNext_move(CLICK_CD_MELEE)
var/obj/machinery/power/apc/A = target
var/mob/living/carbon/human/H = user
if(H.get_int_organ(/obj/item/organ/internal/cell))
if(A.emagged || A.stat & BROKEN)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, A)
s.start()
to_chat(H, "<span class='warning'>The APC power currents surge erratically, damaging your chassis!</span>")
H.adjustFireLoss(10,0)
else if(A.cell && A.cell.charge > 0)
if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
to_chat(user, "<span class='warning'>You are already fully charged!</span>")
else
addtimer(src, "powerdraw_loop", 0, TRUE, A, H)
else
to_chat(user, "<span class='warning'>There is no charge to draw from that APC.</span>")
else
to_chat(user, "<span class='warning'>You lack a cell in which to store charge!</span>")
/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H)
H.visible_message("<span class='notice'>[H] inserts a power connector into \the [A].</span>", "<span class='notice'>You begin to draw power from \the [A].</span>")
while(do_after(H, 10, target = A))
if(loc != H)
to_chat(H, "<span class='warning'>You must keep your connector out while charging!</span>")
break
if(A.cell.charge == 0)
to_chat(H, "<span class='warning'>\The [A] has no more charge.</span>")
break
A.charging = 1
if(A.cell.charge >= 500)
H.nutrition += 50
A.cell.charge -= 500
to_chat(H, "<span class='notice'>You siphon off some of the stored charge for your own use.</span>")
else
H.nutrition += A.cell.charge/10
A.cell.charge = 0
to_chat(H, "<span class='notice'>You siphon off the last of \the [A]'s charge.</span>")
break
if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
to_chat(H, "<span class='notice'>You are now fully charged.</span>")
break
H.visible_message("<span class='notice'>[H] unplugs from \the [A].</span>", "<span class='notice'>You unplug from \the [A].</span>")

View File

@@ -144,6 +144,24 @@
spawn(90 / severity)
crit_fail = 0
//[[[[MOUTH]]]]
/obj/item/organ/internal/cyberimp/mouth
parent_organ = "mouth"
/obj/item/organ/internal/cyberimp/mouth/breathing_tube
name = "breathing tube implant"
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
icon_state = "implant_mask"
slot = "breathing_tube"
w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=2;biotech=3"
/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity)
if(prob(60/severity) && owner)
to_chat(owner, "<span class='warning'>Your breathing tube suddenly closes!</span>")
owner.AdjustLoseBreath(2)
/obj/item/organ/internal/cyberimp/brain/clown_voice
name = "Comical implant"
desc = "<span class='sans'>Uh oh.</span>"
@@ -255,175 +273,6 @@
if(H.stat == CONSCIOUS)
to_chat(H, "<span class='notice'>You feel your heart beating again!</span>")
//ARM...THAT GO IN THE CHEST
/obj/item/organ/internal/cyberimp/chest/arm_mod//dummy parent item for making arm-mod implants. works best with nodrop items that are sent to nullspace upon being dropped.
name = "Arm-mounted item implant"
desc = "You shouldn't see this! Adminhelp and report this as an issue on github!"
icon_state = "chest_implant"
implant_color = "#007ACC"
slot = "shoulders"
origin_tech = "materials=5;biotech=4;powerstorage=4"
actions_types = list(/datum/action/item_action/organ_action/toggle)
var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere!
var/out = 0//determines if the item is in the owner's hand or not
var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work.
var/lasthand = null
/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click()
toggle_item()
/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/toggle_item()
if(overloaded)//ensure the implant isn't broken
to_chat(owner, "<span class='warning'>The implant doesn't respond. It seems to be broken...</span>")
return
owner.changeNext_move(CLICK_CD_MELEE)
if(owner.next_move < world.time)
return // No spam
if(out)//check if the owner has the item out already
owner.unEquip(holder, 1)//if he does, take it away. then,
holder.loc = null//stash it in nullspace
out = 0//and set this to clarify the item isn't out.
owner.visible_message("<span class='notice'>[owner] retracts [holder].</span>","<span class='notice'>You retract [holder].</span>")
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
else//if he doesn't have the item out
if(owner.put_in_hands(holder))//put it in his hands.
lasthand = owner.get_active_hand()
out = 1
owner.visible_message("<span class='notice'>[owner] extends [holder]!</span>","<span class='notice'>You extend [holder]!</span>")
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
else//if this fails to put the item in his hands,
holder.loc = null//keep it in nullspace
to_chat(owner, "<span class='warning'>You can't extend [holder] if you can't use your hands!</span>")
/obj/item/organ/internal/cyberimp/chest/arm_mod/emp_act(severity)//if the implant gets EMPed...
if(!owner || overloaded)//ensure that it's in an owner and that it's not already EMPed, then...
return
if(out)//check if he has the item out...
owner.unEquip(holder, 1)//if he does, take it away.
holder.loc = null
out = 0
owner.visible_message("<span class='notice'>[holder] forcibly retracts into [owner]'s arm.</span>")
overload() // Make sure this doesn't happen again
/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/overload()
owner.visible_message("<span class='danger'>A loud bang comes from [owner]...</span>")
playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1)
to_chat(owner, "<span class='warning'>You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?</span>")
owner.adjust_fire_stacks(20)
owner.IgniteMob()//ignite the owner, as well as
owner.say("AUUUUUUUUUUUUUUUUUUGH!!")
if(prob(50))
if(lasthand == "r_hand")
var/obj/item/organ/external/limb = owner.get_organ("r_arm")
limb.droplimb(0, DROPLIMB_EDGE)
else if(lasthand == "l_hand")
var/obj/item/organ/external/limb = owner.get_organ("l_arm")
limb.droplimb(0, DROPLIMB_EDGE)
owner.say("I HAVE BEEN DISARMED!!!")
owner.adjustFireLoss(25)//severely injure him!
overloaded = TRUE
/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser!
name = "Arm-cannon taser implant"
desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use."
icon_state = "armcannon_tase_implant"
origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4"
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created...
..()
holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun)
/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser!
name = "Arm-cannon laser implant"
desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use."
icon_state = "armcannon_lase_implant"
origin_tech = "materials=4;combat=4;biotech=4;powerstorage=4;syndicate=3"
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New()
..()
holder = new /obj/item/weapon/gun/energy/laser/mounted(src)
// lets make IPCs even *more* vulnerable to EMPs!
/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord
name = "APC-compatible power adapter implant"
desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment"
origin_tech = "materials=3;biotech=2;powerstorage=3"
slot = "shoulders2"
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/New()
..()
holder = new /obj/item/apc_powercord(src)
/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/overload()
// To allow repair via nanopaste/screwdriver
// also so IPCs don't also catch on fire and fall even more apart upon EMP
damage = 1
overloaded = TRUE
/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/surgeryize()
if(overloaded && owner)
to_chat(owner, "<span class='notice'>Your [src] feels functional again.</span>")
overloaded = FALSE
/obj/item/apc_powercord
name = "power cable"
desc = "Insert into a nearby APC to draw power from it."
icon = 'icons/obj/power.dmi'
icon_state = "wire1"
flags = NODROP | NOBLUDGEON
/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag)
return ..()
user.changeNext_move(CLICK_CD_MELEE)
var/obj/machinery/power/apc/A = target
var/mob/living/carbon/human/H = user
if(H.get_int_organ(/obj/item/organ/internal/cell))
if(A.emagged || A.stat & BROKEN)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, A)
s.start()
to_chat(H, "<span class='warning'>The APC power currents surge erratically, damaging your chassis!</span>")
H.adjustFireLoss(10,0)
else if(A.cell && A.cell.charge > 0)
if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
to_chat(user, "<span class='warning'>You are already fully charged!</span>")
else
addtimer(src, "powerdraw_loop", 0, TRUE, A, H)
else
to_chat(user, "<span class='warning'>There is no charge to draw from that APC.</span>")
else
to_chat(user, "<span class='warning'>You lack a cell in which to store charge!</span>")
/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H)
H.visible_message("<span class='notice'>[H] inserts a power connector into \the [A].</span>", "<span class='notice'>You begin to draw power from \the [A].</span>")
while(do_after(H, 10, target = A))
if(loc != H)
to_chat(H, "<span class='warning'>You must keep your connector out while charging!</span>")
break
if(A.cell.charge == 0)
to_chat(H, "<span class='warning'>\The [A] has no more charge.</span>")
break
A.charging = 1
if(A.cell.charge >= 500)
H.nutrition += 50
A.cell.charge -= 500
to_chat(H, "<span class='notice'>You siphon off some of the stored charge for your own use.</span>")
else
H.nutrition += A.cell.charge/10
A.cell.charge = 0
to_chat(H, "<span class='notice'>You siphon off the last of \the [A]'s charge.</span>")
break
if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
to_chat(H, "<span class='notice'>You are now fully charged.</span>")
break
H.visible_message("<span class='notice'>[H] unplugs from \the [A].</span>", "<span class='notice'>You unplug from \the [A].</span>")
//BOX O' IMPLANTS
/obj/item/weapon/storage/box/cyber_implants

View File

@@ -30,9 +30,7 @@
return returnorg
/mob/living/carbon/get_organ_slot(slot)
for(var/obj/item/organ/internal/O in internal_organs)
if(slot == O.slot)
return O
return internal_organs_slot[slot]
/mob/living/carbon/get_int_organ_tag(tag)
for(var/obj/item/organ/internal/O in internal_organs)

View File

@@ -5,8 +5,8 @@
force = 1
w_class = WEIGHT_CLASS_SMALL
throwforce = 0
var/zone = "chest"
var/slot
// DO NOT add slots with matching names to different zones - it will break internal_organs_slot list!
vital = 0
var/non_primary = 0
@@ -29,6 +29,7 @@
owner = M
M.internal_organs |= src
M.internal_organs_slot[slot] = src
var/obj/item/organ/external/parent
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
@@ -52,6 +53,8 @@
owner = null
if(M)
M.internal_organs -= src
if(M.internal_organs_slot[slot] == src)
M.internal_organs_slot.Remove(slot)
if(vital && !special)
if(M.stat != DEAD)//safety check!
M.death()

View File

@@ -38,7 +38,6 @@ var/static/regex/multispin_words = regex("like a record baby")
/obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x channel
name = "vocal cords"
icon_state = "appendix"
zone = "mouth"
slot = "vocal_cords"
parent_organ = "mouth"
var/spans = null

View File

@@ -14,7 +14,7 @@
/datum/surgery/organ_manipulation_boneless
name = "Organ Manipulation"
possible_locs = list("chest","head","groin", "eyes", "mouth")
possible_locs = list("chest","head","groin", "eyes", "mouth", "l_arm", "r_arm")
steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/internal/manipulate_organs,/datum/surgery_step/generic/cauterize)
requires_organic_bodypart = 1

View File

@@ -12,7 +12,7 @@
/datum/surgery/cybernetic_repair/internal
name = "Internal Component Manipulation"
steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/robotics/manipulate_robotic_organs)
possible_locs = list("eyes", "chest","head","groin")
possible_locs = list("eyes", "chest","head","groin","l_arm","r_arm")
requires_organic_bodypart = 0
/datum/surgery/cybernetic_amputation