From fd9f82d6b423197e6b82f8489fbb336f30e61af1 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 22 Jul 2018 00:56:58 -0400 Subject: [PATCH 01/32] Splits up Species Files --- code/game/gamemodes/shadowling/shadowling.dm | 87 -- .../human/species/{species.dm => _species.dm} | 0 .../mob/living/carbon/human/species/diona.dm | 114 ++ .../mob/living/carbon/human/species/drask.dm | 62 + .../mob/living/carbon/human/species/grey.dm | 55 + .../mob/living/carbon/human/species/human.dm | 20 + .../mob/living/carbon/human/species/kidan.dm | 41 + .../living/carbon/human/species/machine.dm | 88 ++ .../living/carbon/human/species/nucleation.dm | 41 + .../living/carbon/human/species/shadowling.dm | 85 ++ .../mob/living/carbon/human/species/skrell.dm | 46 + .../mob/living/carbon/human/species/slime.dm | 200 ++++ .../living/carbon/human/species/station.dm | 1040 ----------------- .../living/carbon/human/species/tajaran.dm | 58 + .../mob/living/carbon/human/species/unathi.dm | 92 ++ .../mob/living/carbon/human/species/vox.dm | 201 ++++ .../living/carbon/human/species/vulpkanin.dm | 52 + .../human/species/{apollo.dm => wryn.dm} | 44 +- paradise.dme | 19 +- 19 files changed, 1172 insertions(+), 1173 deletions(-) rename code/modules/mob/living/carbon/human/species/{species.dm => _species.dm} (100%) create mode 100644 code/modules/mob/living/carbon/human/species/diona.dm create mode 100644 code/modules/mob/living/carbon/human/species/drask.dm create mode 100644 code/modules/mob/living/carbon/human/species/grey.dm create mode 100644 code/modules/mob/living/carbon/human/species/human.dm create mode 100644 code/modules/mob/living/carbon/human/species/kidan.dm create mode 100644 code/modules/mob/living/carbon/human/species/machine.dm create mode 100644 code/modules/mob/living/carbon/human/species/nucleation.dm create mode 100644 code/modules/mob/living/carbon/human/species/shadowling.dm create mode 100644 code/modules/mob/living/carbon/human/species/skrell.dm create mode 100644 code/modules/mob/living/carbon/human/species/slime.dm delete mode 100644 code/modules/mob/living/carbon/human/species/station.dm create mode 100644 code/modules/mob/living/carbon/human/species/tajaran.dm create mode 100644 code/modules/mob/living/carbon/human/species/unathi.dm create mode 100644 code/modules/mob/living/carbon/human/species/vox.dm create mode 100644 code/modules/mob/living/carbon/human/species/vulpkanin.dm rename code/modules/mob/living/carbon/human/species/{apollo.dm => wryn.dm} (61%) diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 3c1f5d47ed8..6a1c242efb4 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -306,93 +306,6 @@ Made by Xhuis MISCELLANEOUS */ - -/datum/species/shadow/ling - //Normal shadowpeople but with enhanced effects - name = "Shadowling" - - icobase = 'icons/mob/human_races/r_shadowling.dmi' - deform = 'icons/mob/human_races/r_shadowling.dmi' - - blood_color = "#555555" - flesh_color = "#222222" - - species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash - burn_mod = 1.5 //1.5x burn damage, 2x is excessive - oxy_mod = 0 - heatmod = 1.5 - - silent_steps = 1 - grant_vision_toggle = 0 - - has_organ = list( - "brain" = /obj/item/organ/internal/brain, - "eyes" = /obj/item/organ/internal/eyes) - -/datum/species/shadow/ling/handle_life(var/mob/living/carbon/human/H) - if(!H.weakeyes) - H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs - var/light_amount = 0 - H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry - if(isturf(H.loc)) - var/turf/T = H.loc - light_amount = T.get_lumcount() * 10 - if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes - H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) - H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) - if(H.stat != DEAD) - to_chat(H, "The light burns you!")//Message spam to say "GET THE FUCK OUT" - H << 'sound/weapons/sear.ogg' - else if(light_amount < LIGHT_HEAL_THRESHOLD) - H.clear_alert("lightexposure") - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - if(istype(E)) - E.receive_damage(-1) - H.heal_overall_damage(5, 5) - H.adjustToxLoss(-5) - H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!" - H.AdjustEyeBlurry(-1) - H.CureNearsighted() - H.CureBlind() - H.adjustCloneLoss(-1) - H.SetWeakened(0) - H.SetStunned(0) - ..() - - -/datum/species/shadow/ling/lesser //Empowered thralls. Obvious, but powerful - name = "Lesser Shadowling" - - icobase = 'icons/mob/human_races/r_lshadowling.dmi' - deform = 'icons/mob/human_races/r_lshadowling.dmi' - - blood_color = "#CCCCCC" - flesh_color = "#AAAAAA" - - species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE) - burn_mod = 1.1 - oxy_mod = 0 - heatmod = 1.1 - -/datum/species/shadow/ling/lesser/handle_life(var/mob/living/carbon/human/H) - if(!H.weakeyes) - H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs - var/light_amount = 0 - H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry - if(isturf(H.loc)) - var/turf/T = H.loc - light_amount = T.get_lumcount() * 10 - if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) - H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) - H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN/2) - else if(light_amount < LIGHT_HEAL_THRESHOLD) - H.clear_alert("lightexposure") - H.heal_overall_damage(2,2) - H.adjustToxLoss(-5) - H.adjustBrainLoss(-25) - H.adjustCloneLoss(-1) - ..() - /datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind) var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW] shadow_hud.join_hud(shadow_mind.current) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/_species.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/species.dm rename to code/modules/mob/living/carbon/human/species/_species.dm diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm new file mode 100644 index 00000000000..7d7b2acd713 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/diona.dm @@ -0,0 +1,114 @@ +/datum/species/diona + name = "Diona" + name_plural = "Dionaea" + icobase = 'icons/mob/human_races/r_diona.dmi' + deform = 'icons/mob/human_races/r_def_plant.dmi' + language = "Rootspeak" + speech_sounds = list('sound/voice/dionatalk1.ogg') //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16] + speech_chance = 20 + unarmed_type = /datum/unarmed_attack/diona + //primitive_form = "Nymph" + slowdown = 5 + remains_type = /obj/effect/decal/cleanable/ash + + + warning_low_pressure = 50 + hazard_low_pressure = -1 + + cold_level_1 = 50 + cold_level_2 = -1 + cold_level_3 = -1 + + heat_level_1 = 300 + heat_level_2 = 340 + heat_level_3 = 400 + + blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ + species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \ + there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \ + Minoris primary being ringed with a cloud of singing space-station-sized entities.

The Dionaea coexist peacefully with \ + all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \ + even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \ + water and other radiation." + + species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN) + clothing_flags = HAS_SOCKS + default_hair_colour = "#000000" + dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary + taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE + skinned_type = /obj/item/stack/sheet/wood + + oxy_mod = 0 + + body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not + blood_color = "#004400" + flesh_color = "#907E4A" + butt_sprite = "diona" + + reagent_tag = PROCESS_ORG + + has_organ = list( + "nutrient channel" = /obj/item/organ/internal/liver/diona, + "neural strata" = /obj/item/organ/internal/heart/diona, + "receptor node" = /obj/item/organ/internal/eyes/diona, //Default darksight of 2. + "gas bladder" = /obj/item/organ/internal/brain/diona, + "polyp segment" = /obj/item/organ/internal/kidneys/diona, + "anchoring ligament" = /obj/item/organ/internal/appendix/diona + ) + + vision_organ = /obj/item/organ/internal/eyes/diona + has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/chest/diona), + "groin" = list("path" = /obj/item/organ/external/groin/diona), + "head" = list("path" = /obj/item/organ/external/head/diona), + "l_arm" = list("path" = /obj/item/organ/external/arm/diona), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/diona), + "l_leg" = list("path" = /obj/item/organ/external/leg/diona), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/diona), + "l_hand" = list("path" = /obj/item/organ/external/hand/diona), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/diona), + "l_foot" = list("path" = /obj/item/organ/external/foot/diona), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/diona) + ) + + suicide_messages = list( + "is losing branches!", + "pulls out a secret stash of herbicide and takes a hearty swig!", + "is pulling themselves apart!") + +/datum/species/diona/can_understand(var/mob/other) + if(istype(other, /mob/living/simple_animal/diona)) + return 1 + return 0 + +/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) + H.gender = NEUTER + + return ..() + +/datum/species/diona/handle_life(var/mob/living/carbon/human/H) + H.radiation = Clamp(H.radiation, 0, 100) //We have to clamp this first, then decrease it, or there's a few edge cases of massive heals if we clamp and decrease at the same time. + var/rads = H.radiation / 25 + H.radiation = max(H.radiation-rads, 0) + H.nutrition = min(H.nutrition+rads, NUTRITION_LEVEL_WELL_FED+10) + H.adjustBruteLoss(-(rads)) + H.adjustToxLoss(-(rads)) + + var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing + if(isturf(H.loc)) //else, there's considered to be no light + var/turf/T = H.loc + light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights + H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10) + + if(light_amount > 0) + H.clear_alert("nolight") + else + H.throw_alert("nolight", /obj/screen/alert/nolight) + + if((light_amount >= 5) && !H.suiciding) //if there's enough light, heal + + H.adjustBruteLoss(-(light_amount/2)) + H.adjustFireLoss(-(light_amount/4)) + if(H.nutrition < NUTRITION_LEVEL_STARVING+50) + H.take_overall_damage(10,0) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/drask.dm b/code/modules/mob/living/carbon/human/species/drask.dm new file mode 100644 index 00000000000..7914c4e7d70 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/drask.dm @@ -0,0 +1,62 @@ +/datum/species/drask + name = "Drask" + name_plural = "Drask" + icobase = 'icons/mob/human_races/r_drask.dmi' + deform = 'icons/mob/human_races/r_drask.dmi' + language = "Orluum" + eyes = "drask_eyes_s" + + speech_sounds = list('sound/voice/DraskTalk.ogg') + speech_chance = 20 + male_scream_sound = 'sound/voice/DraskTalk2.ogg' + female_scream_sound = 'sound/voice/DraskTalk2.ogg' + male_cough_sounds = 'sound/voice/DraskCough.ogg' + female_cough_sounds = 'sound/voice/DraskCough.ogg' + male_sneeze_sound = 'sound/voice/DraskSneeze.ogg' + female_sneeze_sound = 'sound/voice/DraskSneeze.ogg' + + burn_mod = 2 + //exotic_blood = "cryoxadone" + body_temperature = 273 + + blurb = "Hailing from Hoorlm, planet outside what is usually considered a habitable \ + orbit, the Drask evolved to live in extreme cold. Their strange bodies seem \ + to operate better the colder their surroundings are, and can regenerate rapidly \ + when breathing supercooled gas.

On their homeworld, the Drask live long lives \ + in their labyrinthine settlements, carved out beneath Hoorlm's icy surface, where the air \ + is of breathable density." + + suicide_messages = list( + "is self-warming with friction!", + "is jamming fingers through their big eyes!", + "is sucking in warm air!", + "is holding their breath!") + + species_traits = list(LIPS, IS_WHITELISTED) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT + bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS + dietflags = DIET_OMNI + + cold_level_1 = -1 //Default 260 - Lower is better + cold_level_2 = -1 //Default 200 + cold_level_3 = -1 //Default 120 + coldmod = -1 + + heat_level_1 = 300 //Default 360 - Higher is better + heat_level_2 = 340 //Default 400 + heat_level_3 = 400 //Default 460 + heatmod = 2 + + flesh_color = "#a3d4eb" + reagent_tag = PROCESS_ORG + base_color = "#a3d4eb" + blood_color = "#a3d4eb" + butt_sprite = "drask" + + has_organ = list( + "heart" = /obj/item/organ/internal/heart/drask, + "lungs" = /obj/item/organ/internal/lungs/drask, + "metabolic strainer" = /obj/item/organ/internal/liver/drask, + "eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight. + "brain" = /obj/item/organ/internal/brain/drask + ) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm new file mode 100644 index 00000000000..ad4239c0d05 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/grey.dm @@ -0,0 +1,55 @@ +/datum/species/grey + name = "Grey" + name_plural = "Greys" + icobase = 'icons/mob/human_races/r_grey.dmi' + deform = 'icons/mob/human_races/r_def_grey.dmi' + language = "Psionic Communication" + eyes = "grey_eyes_s" + butt_sprite = "grey" + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs, + "liver" = /obj/item/organ/internal/liver/grey, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain/grey, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes/grey //5 darksight. + ) + + brute_mod = 1.25 //greys are fragile + + default_genes = list(REMOTE_TALK) + + + species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_BODY_MARKINGS + dietflags = DIET_HERB + reagent_tag = PROCESS_ORG + blood_color = "#A200FF" + +/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove) + if(!remove) + C.dna.SetSEState(REMOTETALKBLOCK,1,1) + genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) + else + C.dna.SetSEState(REMOTETALKBLOCK,0,1) + genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) + ..() + +/datum/species/grey/water_act(var/mob/living/carbon/C, volume, temperature, source) + ..() + C.take_organ_damage(5,min(volume,20)) + C.emote("scream") + +/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H) + var/speech_pref = H.client.prefs.speciesprefs + if(speech_pref) + H.mind.speech_span = "wingdings" + +/datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) + if(R.id == "sacid") + H.reagents.del_reagent(R.id) + return 0 + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/human.dm b/code/modules/mob/living/carbon/human/species/human.dm new file mode 100644 index 00000000000..2a161ab9318 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/human.dm @@ -0,0 +1,20 @@ +/datum/species/human + name = "Human" + name_plural = "Humans" + icobase = 'icons/mob/human_races/r_human.dmi' + deform = 'icons/mob/human_races/r_def_human.dmi' + primitive_form = /datum/species/monkey + language = "Sol Common" + species_traits = list(LIPS, CAN_BE_FAT) + skinned_type = /obj/item/stack/sheet/animalhide/human + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS + dietflags = DIET_OMNI + blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \ + colonies across a wide swathe of space. They hold a wide range of forms and creeds.

\ + While the central Sol government maintains control of its far-flung people, powerful corporate \ + interests, rampant cyber and bio-augmentation and secretive factions make life on most human \ + worlds tumultous at best." + + reagent_tag = PROCESS_ORG + //Has standard darksight of 2. \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/kidan.dm b/code/modules/mob/living/carbon/human/species/kidan.dm new file mode 100644 index 00000000000..583e098054b --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/kidan.dm @@ -0,0 +1,41 @@ +/datum/species/kidan + name = "Kidan" + name_plural = "Kidan" + icobase = 'icons/mob/human_races/r_kidan.dmi' + deform = 'icons/mob/human_races/r_def_kidan.dmi' + language = "Chittin" + unarmed_type = /datum/unarmed_attack/claws + + brute_mod = 0.8 + + species_traits = list(IS_WHITELISTED) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS + eyes = "kidan_eyes_s" + dietflags = DIET_HERB + blood_color = "#FB9800" + reagent_tag = PROCESS_ORG + //Default styles for created mobs. + default_headacc = "Normal Antennae" + butt_sprite = "kidan" + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs, + "liver" = /obj/item/organ/internal/liver/kidan, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "lantern" = /obj/item/organ/internal/lantern + ) + + allowed_consumed_mobs = list(/mob/living/simple_animal/diona) + + suicide_messages = list( + "is attempting to bite their antenna off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is cracking their exoskeleton!", + "is stabbing themselves with their mandibles!", + "is holding their breath!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm new file mode 100644 index 00000000000..066677f3104 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -0,0 +1,88 @@ +/datum/species/machine + name = "Machine" + name_plural = "Machines" + + blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \ + robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \ + to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \ + generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \ + inhuman in outlook and perspective." + + icobase = 'icons/mob/human_races/r_machine.dmi' + deform = 'icons/mob/human_races/r_machine.dmi' + language = "Trinary" + remains_type = /obj/effect/decal/remains/robot + skinned_type = /obj/item/stack/sheet/metal // Let's grind up IPCs for station resources! + + eyes = "blank_eyes" + brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150% + burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall. + tox_mod = 0 + clone_mod = 0 + oxy_mod = 0 + death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." + + species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS + dietflags = 0 //IPCs can't eat, so no diet + taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE + blood_color = "#1F181F" + flesh_color = "#AAAAAA" + //Default styles for created mobs. + default_hair = "Blue IPC Screen" + can_revive_by_healing = 1 + has_gender = FALSE + reagent_tag = PROCESS_SYN + male_scream_sound = 'sound/goonstation/voice/robot_scream.ogg' + female_scream_sound = 'sound/goonstation/voice/robot_scream.ogg' + male_cough_sounds = list('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg') + female_cough_sounds = list('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg') + male_sneeze_sound = 'sound/effects/mob_effects/machine_sneeze.ogg' + female_sneeze_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg' + butt_sprite = "machine" + + has_organ = list( + "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/arm/power_cord + ) + + vision_organ = /obj/item/organ/internal/eyes/optical_sensor + has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/chest/ipc), + "groin" = list("path" = /obj/item/organ/external/groin/ipc), + "head" = list("path" = /obj/item/organ/external/head/ipc), + "l_arm" = list("path" = /obj/item/organ/external/arm/ipc), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc), + "l_leg" = list("path" = /obj/item/organ/external/leg/ipc), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc), + "l_hand" = list("path" = /obj/item/organ/external/hand/ipc), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc), + "l_foot" = list("path" = /obj/item/organ/external/foot/ipc), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) + ) + + suicide_messages = list( + "is powering down!", + "is smashing their own monitor!", + "is twisting their own neck!", + "is downloading extra RAM!", + "is frying their own circuits!", + "is blocking their ventilation port!") + + species_abilities = list( + /mob/living/carbon/human/proc/change_monitor + ) + +/datum/species/machine/handle_death(var/mob/living/carbon/human/H) + var/obj/item/organ/external/head/head_organ = H.get_organ("head") + if(!head_organ) + return + head_organ.h_style = "Bald" + head_organ.f_style = "Shaved" + spawn(100) + if(H) + H.update_hair() + H.update_fhair() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/nucleation.dm b/code/modules/mob/living/carbon/human/species/nucleation.dm new file mode 100644 index 00000000000..4fcfae74282 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/nucleation.dm @@ -0,0 +1,41 @@ +/datum/species/nucleation + name = "Nucleation" + name_plural = "Nucleations" + icobase = 'icons/mob/human_races/r_nucleation.dmi' + blurb = "A sub-race of unfortunates who have been exposed to too much supermatter radiation. As a result, \ + supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \ + has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \ + negating the need for the individual to breathe. Their massive change in biology, however, renders most medicines \ + obselete. Ionizing radiation seems to cause resonance in some of their crystals, which seems to encourage regeneration \ + and produces a calming effect on the individual. Nucleations are highly stigmatized, and are treated much in the same \ + way as lepers were back on Earth." + language = "Sol Common" + burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores + brute_mod = 2 // damn, double wham, double dam + oxy_mod = 0 + species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE) + dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet + + //Default styles for created mobs. + default_hair = "Nucleation Crystals" + + reagent_tag = PROCESS_ORG + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "crystallized brain" = /obj/item/organ/internal/brain/crystal, + "eyes" = /obj/item/organ/internal/eyes/luminescent_crystal, //Standard darksight of 2. + "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal + ) + vision_organ = /obj/item/organ/internal/eyes/luminescent_crystal + +/datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H) + H.light_color = "#1C1C00" + H.set_light(2) + return ..() + +/datum/species/nucleation/handle_death(var/mob/living/carbon/human/H) + var/turf/T = get_turf(H) + H.visible_message("[H]'s body explodes, leaving behind a pile of microscopic crystals!") + explosion(T, 0, 0, 2, 2) // Create a small explosion burst upon death +// new /obj/item/shard/supermatter( T ) + qdel(H) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/shadowling.dm b/code/modules/mob/living/carbon/human/species/shadowling.dm new file mode 100644 index 00000000000..e7d7982a765 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/shadowling.dm @@ -0,0 +1,85 @@ +/datum/species/shadow/ling + //Normal shadowpeople but with enhanced effects + name = "Shadowling" + + icobase = 'icons/mob/human_races/r_shadowling.dmi' + deform = 'icons/mob/human_races/r_shadowling.dmi' + + blood_color = "#555555" + flesh_color = "#222222" + + species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash + burn_mod = 1.5 //1.5x burn damage, 2x is excessive + oxy_mod = 0 + heatmod = 1.5 + + silent_steps = 1 + grant_vision_toggle = 0 + + has_organ = list( + "brain" = /obj/item/organ/internal/brain, + "eyes" = /obj/item/organ/internal/eyes) + +/datum/species/shadow/ling/handle_life(var/mob/living/carbon/human/H) + if(!H.weakeyes) + H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs + var/light_amount = 0 + H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry + if(isturf(H.loc)) + var/turf/T = H.loc + light_amount = T.get_lumcount() * 10 + if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes + H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) + H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) + if(H.stat != DEAD) + to_chat(H, "The light burns you!")//Message spam to say "GET THE FUCK OUT" + H << 'sound/weapons/sear.ogg' + else if(light_amount < LIGHT_HEAL_THRESHOLD) + H.clear_alert("lightexposure") + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) + if(istype(E)) + E.receive_damage(-1) + H.heal_overall_damage(5, 5) + H.adjustToxLoss(-5) + H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!" + H.AdjustEyeBlurry(-1) + H.CureNearsighted() + H.CureBlind() + H.adjustCloneLoss(-1) + H.SetWeakened(0) + H.SetStunned(0) + ..() + + +/datum/species/shadow/ling/lesser //Empowered thralls. Obvious, but powerful + name = "Lesser Shadowling" + + icobase = 'icons/mob/human_races/r_lshadowling.dmi' + deform = 'icons/mob/human_races/r_lshadowling.dmi' + + blood_color = "#CCCCCC" + flesh_color = "#AAAAAA" + + species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE) + burn_mod = 1.1 + oxy_mod = 0 + heatmod = 1.1 + +/datum/species/shadow/ling/lesser/handle_life(var/mob/living/carbon/human/H) + if(!H.weakeyes) + H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs + var/light_amount = 0 + H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry + if(isturf(H.loc)) + var/turf/T = H.loc + light_amount = T.get_lumcount() * 10 + if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) + H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) + H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN/2) + else if(light_amount < LIGHT_HEAL_THRESHOLD) + H.clear_alert("lightexposure") + H.heal_overall_damage(2,2) + H.adjustToxLoss(-5) + H.adjustBrainLoss(-25) + H.adjustCloneLoss(-1) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/skrell.dm b/code/modules/mob/living/carbon/human/species/skrell.dm new file mode 100644 index 00000000000..a7c24cd338c --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/skrell.dm @@ -0,0 +1,46 @@ +/datum/species/skrell + name = "Skrell" + name_plural = "Skrell" + icobase = 'icons/mob/human_races/r_skrell.dmi' + deform = 'icons/mob/human_races/r_def_skrell.dmi' + language = "Skrellian" + primitive_form = /datum/species/monkey/skrell + + blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \ + the royals' or 'Light of the Crown'.

Skrell are a highly advanced and logical race who live under the rule \ + of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \ + herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ + the secrets of their empire to their allies." + + species_traits = list(LIPS) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS + dietflags = DIET_HERB + taste_sensitivity = TASTE_SENSITIVITY_DULL + flesh_color = "#8CD7A3" + blood_color = "#1D2CBF" + base_color = "#38b661" //RGB: 56, 182, 97. + default_hair_colour = "#38b661" + eyes = "skrell_eyes_s" + //Default styles for created mobs. + default_hair = "Skrell Male Tentacles" + reagent_tag = PROCESS_ORG + butt_sprite = "skrell" + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs, + "liver" = /obj/item/organ/internal/liver/skrell, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "headpocket" = /obj/item/organ/internal/headpocket + ) + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their thumbs into their eye sockets!", + "is twisting their own neck!", + "makes like a fish and suffocates!", + "is strangling themselves with their own tendrils!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm new file mode 100644 index 00000000000..77fa54491e0 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -0,0 +1,200 @@ +/datum/species/slime + name = "Slime People" + name_plural = "Slime People" + language = "Bubblish" + icobase = 'icons/mob/human_races/r_slime.dmi' + deform = 'icons/mob/human_races/r_slime.dmi' + remains_type = /obj/effect/decal/remains/slime + + // More sensitive to the cold + cold_level_1 = 280 + cold_level_2 = 240 + cold_level_3 = 200 + coldmod = 3 + + oxy_mod = 0 + brain_mod = 2.5 + + male_cough_sounds = list('sound/effects/slime_squish.ogg') + female_cough_sounds = list('sound/effects/slime_squish.ogg') + + species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_SKIN_COLOR | NO_EYES + dietflags = DIET_CARN + reagent_tag = PROCESS_ORG + + blood_color = "#0064C8" + exotic_blood = "water" + blood_damage_type = TOX + + butt_sprite = "slime" + //Has default darksight of 2. + + has_organ = list( + "brain" = /obj/item/organ/internal/brain/slime + ) + + suicide_messages = list( + "is melting into a puddle!", + "is ripping out their own core!", + "is turning a dull, brown color and melting into a puddle!") + + var/reagent_skin_coloring = FALSE + + var/datum/action/innate/regrow/grow = new() + + species_abilities = list( + /mob/living/carbon/human/verb/toggle_recolor_verb, + /mob/living/carbon/human/proc/regrow_limbs + ) + +/datum/species/slime/handle_post_spawn(var/mob/living/carbon/human/H) + grow.Grant(H) + ..() + +/datum/action/innate/regrow + name = "Regrow limbs" + icon_icon = 'icons/effects/effects.dmi' + button_icon_state = "greenglow" + +/datum/action/innate/regrow/Activate() + var/mob/living/carbon/human/user = owner + user.regrow_limbs() + + +/datum/species/slime/handle_life(var/mob/living/carbon/human/H) +//This is allegedly for code "style". Like a plaid sweater? +#define SLIMEPERSON_COLOR_SHIFT_TRIGGER 0.1 +#define SLIMEPERSON_ICON_UPDATE_PERIOD 200 // 20 seconds +#define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower. + // Slowly shifting to the color of the reagents + if(reagent_skin_coloring && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER) + var/blood_amount = H.blood_volume + var/r_color = mix_color_from_reagents(H.reagents.reagent_list) + var/new_body_color = BlendRGB(r_color, H.skin_colour, (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume))) + H.skin_colour = new_body_color + if(world.time % SLIMEPERSON_ICON_UPDATE_PERIOD > SLIMEPERSON_ICON_UPDATE_PERIOD - 20) // The 20 is because this gets called every 2 seconds, from the mob controller + for(var/organname in H.bodyparts_by_name) + var/obj/item/organ/external/E = H.bodyparts_by_name[organname] + if(istype(E) && E.dna && istype(E.dna.species, /datum/species/slime)) + E.sync_colour_to_human(H) + H.update_hair(0) + H.update_body() + ..() + +#undef SLIMEPERSON_COLOR_SHIFT_TRIGGER +#undef SLIMEPERSON_ICON_UPDATE_PERIOD +#undef SLIMEPERSON_BLOOD_SCALING_FACTOR + +/mob/living/carbon/human/proc/toggle_recolor(silent = FALSE) + if(!isslimeperson(src)) + if(!silent) + to_chat(src, "You're not a slime person!") + return + + var/datum/species/slime/S = dna.species + if(S.reagent_skin_coloring) + S.reagent_skin_coloring = TRUE + if(!silent) + to_chat(src, "You adjust your internal chemistry to filter out pigments from things you consume.") + else + S.reagent_skin_coloring = TRUE + if(!silent) + to_chat(src, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.") + +/mob/living/carbon/human/verb/toggle_recolor_verb() + set category = "IC" + set name = "Toggle Reagent Recoloring" + set desc = "While active, you'll slowly adjust your body's color to that of the reagents inside of you, moderated by how much blood you have." + + toggle_recolor() + + +/mob/living/carbon/human/proc/regrow_limbs() + set category = "IC" + set name = "Regrow Limbs" + set desc = "Regrow one of your missing limbs at the cost of a large amount of hunger" + +#define SLIMEPERSON_HUNGERCOST 50 +#define SLIMEPERSON_MINHUNGER 250 +#define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds + + if(stat || paralysis || stunned) + to_chat(src, "You cannot regenerate missing limbs in your current state.") + return + + if(nutrition < SLIMEPERSON_MINHUNGER) + to_chat(src, "You're too hungry to regenerate a limb!") + return + + var/list/missing_limbs = list() + for(var/l in bodyparts_by_name) + var/obj/item/organ/external/E = bodyparts_by_name[l] + if(!istype(E)) + var/list/limblist = dna.species.has_limbs[l] + var/obj/item/organ/external/limb = limblist["path"] + var/parent_organ = initial(limb.parent_organ) + var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ] + if(!istype(parentLimb)) + continue + missing_limbs[initial(limb.name)] = l + + if(!missing_limbs.len) + to_chat(src, "You're not missing any limbs!") + return + + var/limb_select = input(src, "Choose a limb to regrow", "Limb Regrowth") as null|anything in missing_limbs + var/chosen_limb = missing_limbs[limb_select] + + visible_message("[src] begins to hold still and concentrate on [p_their()] missing [limb_select]...", "You begin to focus on regrowing your missing [limb_select]... (This will take [round(SLIMEPERSON_REGROWTHDELAY/10)] seconds, and you must hold still.)") + if(do_after(src, SLIMEPERSON_REGROWTHDELAY, needhand=0, target = src)) + if(stat || paralysis || stunned) + to_chat(src, "You cannot regenerate missing limbs in your current state.") + return + + if(nutrition < SLIMEPERSON_MINHUNGER) + to_chat(src, "You're too hungry to regenerate a limb!") + return + + var/obj/item/organ/external/O = bodyparts_by_name[chosen_limb] + + var/stored_brute = 0 + var/stored_burn = 0 + if(istype(O)) + to_chat(src, "You distribute the damaged tissue around your body, out of the way of your new pseudopod!") + var/obj/item/organ/external/doomedStump = O + stored_brute = doomedStump.brute_dam + stored_burn = doomedStump.burn_dam + qdel(O) + + var/limb_list = dna.species.has_limbs[chosen_limb] + var/obj/item/organ/external/limb_path = limb_list["path"] + // Parent check + var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)] + if(!istype(potential_parent)) + to_chat(src, "You've lost the organ that you've been growing your new part on!") + return // No rayman for you + // Grah this line will leave a "not used" warning, in spite of the fact that the new() proc WILL do the thing. + // Bothersome. + var/obj/item/organ/external/new_limb = new limb_path(src) + new_limb.open = 0 // This is just so that the compiler won't think that new_limb is unused, because the compiler is horribly stupid. + adjustBruteLoss(stored_brute) + adjustFireLoss(stored_burn) + update_body() + updatehealth() + UpdateDamageIcon() + nutrition -= SLIMEPERSON_HUNGERCOST + visible_message("[src] finishes regrowing [p_their()] missing [new_limb]!", "You finish regrowing your [limb_select]") + else + to_chat(src, "You need to hold still in order to regrow a limb!") + return + +#undef SLIMEPERSON_HUNGERCOST +#undef SLIMEPERSON_MINHUNGER +#undef SLIMEPERSON_REGROWTHDELAY + +/datum/species/slime/handle_pre_change(mob/living/carbon/human/H) + ..() + if(reagent_skin_coloring) + H.toggle_recolor(silent = 1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm deleted file mode 100644 index 22b8b281f8b..00000000000 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ /dev/null @@ -1,1040 +0,0 @@ -/datum/species/human - name = "Human" - name_plural = "Humans" - icobase = 'icons/mob/human_races/r_human.dmi' - deform = 'icons/mob/human_races/r_def_human.dmi' - primitive_form = /datum/species/monkey - language = "Sol Common" - species_traits = list(LIPS, CAN_BE_FAT) - skinned_type = /obj/item/stack/sheet/animalhide/human - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS - dietflags = DIET_OMNI - blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \ - colonies across a wide swathe of space. They hold a wide range of forms and creeds.

\ - While the central Sol government maintains control of its far-flung people, powerful corporate \ - interests, rampant cyber and bio-augmentation and secretive factions make life on most human \ - worlds tumultous at best." - - reagent_tag = PROCESS_ORG - //Has standard darksight of 2. - -/datum/species/unathi - name = "Unathi" - name_plural = "Unathi" - icobase = 'icons/mob/human_races/r_lizard.dmi' - deform = 'icons/mob/human_races/r_def_lizard.dmi' - language = "Sinta'unathi" - tail = "sogtail" - skinned_type = /obj/item/stack/sheet/animalhide/lizard - unarmed_type = /datum/unarmed_attack/claws - primitive_form = /datum/species/monkey/unathi - - blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \ - Uuosa-Eso system, which roughly translates to 'burning mother'.

Coming from a harsh, radioactive \ - desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \ - else, frequently even their own lives. They prefer warmer temperatures than most species and \ - their native tongue is a heavy hissing laungage called Sinta'Unathi." - - species_traits = list(LIPS) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING - dietflags = DIET_CARN - - cold_level_1 = 280 //Default 260 - Lower is better - cold_level_2 = 220 //Default 200 - cold_level_3 = 140 //Default 120 - - heat_level_1 = 380 //Default 360 - Higher is better - heat_level_2 = 420 //Default 400 - heat_level_3 = 480 //Default 460 - - flesh_color = "#34AF10" - reagent_tag = PROCESS_ORG - base_color = "#066000" - //Default styles for created mobs. - default_headacc = "Simple" - default_headacc_colour = "#404040" - butt_sprite = "unathi" - brute_mod = 1.05 - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver/unathi, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes/unathi //3 darksight. - ) - - allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, - /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) - - suicide_messages = list( - "is attempting to bite their tongue off!", - "is jamming their claws into their eye sockets!", - "is twisting their own neck!", - "is holding their breath!") - - var/datum/action/innate/tail_lash/lash = new() - - -/datum/species/unathi/handle_post_spawn(var/mob/living/carbon/human/H) - lash.Grant(H) - ..() - -/datum/action/innate/tail_lash - name = "Tail lash" - icon_icon = 'icons/effects/effects.dmi' - button_icon_state = "tail" - -/datum/action/innate/tail_lash/Activate() - var/mob/living/carbon/human/user = owner - if(!user.restrained() || !user.buckled) - to_chat(user, "You need freedom of movement to tail lash!") - return - if(user.getStaminaLoss() >= 50) - to_chat(user, "Rest before tail lashing again!") - return - for(var/mob/living/carbon/human/C in orange(1)) - var/obj/item/organ/external/E = C.get_organ(pick("l_leg", "r_leg", "l_foot", "r_foot", "groin")) - if(E) - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message("[src] smacks [C] in [E] with their tail! ", "You hit [C] in [E] with your tail!") - user.adjustStaminaLoss(15) - C.apply_damage(5, BRUTE, E) - user.spin(20, 1) - playsound(user.loc, 'sound/weapons/slash.ogg', 50, 0) - - - -/datum/species/unathi/handle_death(var/mob/living/carbon/human/H) - H.stop_tail_wagging(1) - -/datum/species/tajaran - name = "Tajaran" - name_plural = "Tajaran" - icobase = 'icons/mob/human_races/r_tajaran.dmi' - deform = 'icons/mob/human_races/r_def_tajaran.dmi' - language = "Siik'tajr" - tail = "tajtail" - skinned_type = /obj/item/stack/sheet/fur - unarmed_type = /datum/unarmed_attack/claws - - blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \ - S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \ - influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \ - of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \ - using unique inflections their mouths form." - - cold_level_1 = 240 - cold_level_2 = 180 - cold_level_3 = 100 - - heat_level_1 = 340 - heat_level_2 = 380 - heat_level_3 = 440 - - primitive_form = /datum/species/monkey/tajaran - - species_traits = list(LIPS, CAN_BE_FAT) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING - dietflags = DIET_OMNI - taste_sensitivity = TASTE_SENSITIVITY_SHARP - reagent_tag = PROCESS_ORG - flesh_color = "#AFA59E" - base_color = "#424242" - butt_sprite = "tajaran" - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver/tajaran, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2) - unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/ - ) - - allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, - /mob/living/simple_animal/tribble) - - suicide_messages = list( - "is attempting to bite their tongue off!", - "is jamming their claws into their eye sockets!", - "is twisting their own neck!", - "is holding their breath!") - -/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) - H.stop_tail_wagging(1) - -/datum/species/vulpkanin - name = "Vulpkanin" - name_plural = "Vulpkanin" - icobase = 'icons/mob/human_races/r_vulpkanin.dmi' - deform = 'icons/mob/human_races/r_vulpkanin.dmi' - language = "Canilunzt" - primitive_form = /datum/species/monkey/vulpkanin - tail = "vulptail" - skinned_type = /obj/item/stack/sheet/fur - unarmed_type = /datum/unarmed_attack/claws - - blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \ - dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \ - culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \ - to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ - which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." - - species_traits = list(LIPS) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR - dietflags = DIET_OMNI - hunger_drain = 0.11 - taste_sensitivity = TASTE_SENSITIVITY_SHARP - reagent_tag = PROCESS_ORG - flesh_color = "#966464" - base_color = "#CF4D2F" - butt_sprite = "vulp" - - scream_verb = "yelps" - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver/vulpkanin, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2) - unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/ - ) - - allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, - /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) - - suicide_messages = list( - "is attempting to bite their tongue off!", - "is jamming their claws into their eye sockets!", - "is twisting their own neck!", - "is holding their breath!") - -/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H) - H.stop_tail_wagging(1) - -/datum/species/skrell - name = "Skrell" - name_plural = "Skrell" - icobase = 'icons/mob/human_races/r_skrell.dmi' - deform = 'icons/mob/human_races/r_def_skrell.dmi' - language = "Skrellian" - primitive_form = /datum/species/monkey/skrell - - blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \ - the royals' or 'Light of the Crown'.

Skrell are a highly advanced and logical race who live under the rule \ - of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \ - herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ - the secrets of their empire to their allies." - - species_traits = list(LIPS) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS - dietflags = DIET_HERB - taste_sensitivity = TASTE_SENSITIVITY_DULL - flesh_color = "#8CD7A3" - blood_color = "#1D2CBF" - base_color = "#38b661" //RGB: 56, 182, 97. - default_hair_colour = "#38b661" - eyes = "skrell_eyes_s" - //Default styles for created mobs. - default_hair = "Skrell Male Tentacles" - reagent_tag = PROCESS_ORG - butt_sprite = "skrell" - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver/skrell, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. - "headpocket" = /obj/item/organ/internal/headpocket - ) - - suicide_messages = list( - "is attempting to bite their tongue off!", - "is jamming their thumbs into their eye sockets!", - "is twisting their own neck!", - "makes like a fish and suffocates!", - "is strangling themselves with their own tendrils!") - -/datum/species/vox - name = "Vox" - name_plural = "Vox" - icobase = 'icons/mob/human_races/vox/r_vox.dmi' - deform = 'icons/mob/human_races/vox/r_def_vox.dmi' - language = "Vox-pidgin" - tail = "voxtail" - speech_sounds = list('sound/voice/shriek1.ogg') - speech_chance = 20 - unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. - - blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ - scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \ - alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \ - refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \ - smell.

Most humans will never meet a Vox raider, instead learning of this insular species through \ - dealing with their traders and merchants; those that do rarely enjoy the experience." - - brute_mod = 1.2 //20% more brute damage. Fragile bird bones. - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - breathid = "n2" - - eyes = "vox_eyes_s" - - species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING) - clothing_flags = HAS_SOCKS - dietflags = DIET_OMNI - bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS - - blood_color = "#2299FC" - flesh_color = "#808D11" - //Default styles for created mobs. - default_hair = "Short Vox Quills" - default_hair_colour = "#614f19" //R: 97, G: 79, B: 25 - butt_sprite = "vox" - - reagent_tag = PROCESS_ORG - scream_verb = "shrieks" - male_scream_sound = 'sound/voice/shriek1.ogg' - female_scream_sound = 'sound/voice/shriek1.ogg' - male_cough_sounds = list('sound/voice/shriekcough.ogg') - female_cough_sounds = list('sound/voice/shriekcough.ogg') - male_sneeze_sound = 'sound/voice/shrieksneeze.ogg' - female_sneeze_sound = 'sound/voice/shrieksneeze.ogg' - - icon_skin_tones = list( - 1 = "Default Green", - 2 = "Dark Green", - 3 = "Brown", - 4 = "Grey", - 5 = "Emerald", - 6 = "Azure" - ) - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs/vox, - "liver" = /obj/item/organ/internal/liver/vox, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. - "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used - ) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ. - - suicide_messages = list( - "is attempting to bite their tongue off!", - "is jamming their claws into their eye sockets!", - "is twisting their own neck!", - "is holding their breath!", - "is deeply inhaling oxygen!") - -/datum/species/vox/handle_death(var/mob/living/carbon/human/H) - H.stop_tail_wagging(1) - -/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H) - if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime") - H.unEquip(H.wear_mask) - H.unEquip(H.l_hand) - - H.equip_or_collect(new /obj/item/clothing/mask/breath/vox(H), slot_wear_mask) - var/tank_pref = H.client && H.client.prefs ? H.client.prefs.speciesprefs : null - if(tank_pref)//Diseasel, here you go - H.equip_or_collect(new /obj/item/tank/nitrogen(H), slot_l_hand) - else - H.equip_or_collect(new /obj/item/tank/emergency_oxygen/vox(H), slot_l_hand) - to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") - H.internal = H.l_hand - H.update_action_buttons_icon() - -/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) - updatespeciescolor(H) - H.update_icons() - //H.verbs += /mob/living/carbon/human/proc/leap - ..() - -/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race. - if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis. - var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox. - var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox. - switch(H.s_tone) - if(6) //Azure Vox. - new_icobase = 'icons/mob/human_races/vox/r_voxazu.dmi' - new_deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi' - H.tail = "voxtail_azu" - if(5) //Emerald Vox. - new_icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi' - new_deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi' - H.tail = "voxtail_emrl" - if(4) //Grey Vox. - new_icobase = 'icons/mob/human_races/vox/r_voxgry.dmi' - new_deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi' - H.tail = "voxtail_gry" - if(3) //Brown Vox. - new_icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi' - new_deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi' - H.tail = "voxtail_brn" - if(2) //Dark Green Vox. - new_icobase = 'icons/mob/human_races/vox/r_voxdgrn.dmi' - new_deform = 'icons/mob/human_races/vox/r_def_voxdgrn.dmi' - H.tail = "voxtail_dgrn" - else //Default Green Vox. - H.tail = "voxtail" //Ensures they get an appropriately coloured tail depending on the skin-tone. - - H.change_icobase(new_icobase, new_deform, owner_sensitive) //Update the icobase/deform of all our organs, but make sure we don't mess with frankenstein limbs in doing so. - H.update_dna() - -/datum/species/vox/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R) - if(R.id == "oxygen") //Armalis are above such petty things. - H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma. - H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM) - return 0 //Handling reagent removal on our own. - - return ..() - -/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) - H.verbs += /mob/living/carbon/human/proc/leap - H.verbs += /mob/living/carbon/human/proc/gut - ..() - -/datum/species/vox/armalis - name = "Vox Armalis" - name_plural = "Vox Armalis" - icobase = 'icons/mob/human_races/r_armalis.dmi' - deform = 'icons/mob/human_races/r_armalis.dmi' - unarmed_type = /datum/unarmed_attack/claws/armalis - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - heat_level_1 = 2000 - heat_level_2 = 3000 - heat_level_3 = 4000 - - brute_mod = 0.2 - burn_mod = 0.2 - - eyes = "blank_eyes" - - species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED) - bodyflags = HAS_TAIL - dietflags = DIET_OMNI //should inherit this from vox, this is here just in case - - blood_color = "#2299FC" - flesh_color = "#808D11" - - reagent_tag = PROCESS_ORG - - tail = "armalis_tail" - icon_template = 'icons/mob/human_races/r_armalis.dmi' - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs/vox, - "liver" = /obj/item/organ/internal/liver, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. - "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used - ) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ. - - suicide_messages = list( - "is attempting to bite their tongue off!", - "is jamming their claws into their eye sockets!", - "is twisting their own neck!", - "is holding their breath!", - "is huffing oxygen!") - -/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things. - return 1 - -/datum/species/kidan - name = "Kidan" - name_plural = "Kidan" - icobase = 'icons/mob/human_races/r_kidan.dmi' - deform = 'icons/mob/human_races/r_def_kidan.dmi' - language = "Chittin" - unarmed_type = /datum/unarmed_attack/claws - - brute_mod = 0.8 - - species_traits = list(IS_WHITELISTED) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS - eyes = "kidan_eyes_s" - dietflags = DIET_HERB - blood_color = "#FB9800" - reagent_tag = PROCESS_ORG - //Default styles for created mobs. - default_headacc = "Normal Antennae" - butt_sprite = "kidan" - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver/kidan, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. - "lantern" = /obj/item/organ/internal/lantern - ) - - allowed_consumed_mobs = list(/mob/living/simple_animal/diona) - - suicide_messages = list( - "is attempting to bite their antenna off!", - "is jamming their claws into their eye sockets!", - "is twisting their own neck!", - "is cracking their exoskeleton!", - "is stabbing themselves with their mandibles!", - "is holding their breath!") - -/datum/species/slime - name = "Slime People" - name_plural = "Slime People" - language = "Bubblish" - icobase = 'icons/mob/human_races/r_slime.dmi' - deform = 'icons/mob/human_races/r_slime.dmi' - remains_type = /obj/effect/decal/remains/slime - - // More sensitive to the cold - cold_level_1 = 280 - cold_level_2 = 240 - cold_level_3 = 200 - coldmod = 3 - - oxy_mod = 0 - brain_mod = 2.5 - - male_cough_sounds = list('sound/effects/slime_squish.ogg') - female_cough_sounds = list('sound/effects/slime_squish.ogg') - - species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR | NO_EYES - dietflags = DIET_CARN - reagent_tag = PROCESS_ORG - - blood_color = "#0064C8" - exotic_blood = "water" - blood_damage_type = TOX - - butt_sprite = "slime" - //Has default darksight of 2. - - has_organ = list( - "brain" = /obj/item/organ/internal/brain/slime - ) - - suicide_messages = list( - "is melting into a puddle!", - "is ripping out their own core!", - "is turning a dull, brown color and melting into a puddle!") - - var/reagent_skin_coloring = FALSE - - var/datum/action/innate/regrow/grow = new() - - species_abilities = list( - /mob/living/carbon/human/verb/toggle_recolor_verb, - /mob/living/carbon/human/proc/regrow_limbs - ) - -/datum/species/slime/handle_post_spawn(var/mob/living/carbon/human/H) - grow.Grant(H) - ..() - -/datum/action/innate/regrow - name = "Regrow limbs" - icon_icon = 'icons/effects/effects.dmi' - button_icon_state = "greenglow" - -/datum/action/innate/regrow/Activate() - var/mob/living/carbon/human/user = owner - user.regrow_limbs() - - -/datum/species/slime/handle_life(var/mob/living/carbon/human/H) -//This is allegedly for code "style". Like a plaid sweater? -#define SLIMEPERSON_COLOR_SHIFT_TRIGGER 0.1 -#define SLIMEPERSON_ICON_UPDATE_PERIOD 200 // 20 seconds -#define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower. - // Slowly shifting to the color of the reagents - if(reagent_skin_coloring && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER) - var/blood_amount = H.blood_volume - var/r_color = mix_color_from_reagents(H.reagents.reagent_list) - var/new_body_color = BlendRGB(r_color, H.skin_colour, (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume))) - H.skin_colour = new_body_color - if(world.time % SLIMEPERSON_ICON_UPDATE_PERIOD > SLIMEPERSON_ICON_UPDATE_PERIOD - 20) // The 20 is because this gets called every 2 seconds, from the mob controller - for(var/organname in H.bodyparts_by_name) - var/obj/item/organ/external/E = H.bodyparts_by_name[organname] - if(istype(E) && E.dna && istype(E.dna.species, /datum/species/slime)) - E.sync_colour_to_human(H) - H.update_hair(0) - H.update_body() - ..() - -#undef SLIMEPERSON_COLOR_SHIFT_TRIGGER -#undef SLIMEPERSON_ICON_UPDATE_PERIOD -#undef SLIMEPERSON_BLOOD_SCALING_FACTOR - -/mob/living/carbon/human/proc/toggle_recolor(silent = FALSE) - if(!isslimeperson(src)) - if(!silent) - to_chat(src, "You're not a slime person!") - return - - var/datum/species/slime/S = dna.species - if(S.reagent_skin_coloring) - S.reagent_skin_coloring = TRUE - if(!silent) - to_chat(src, "You adjust your internal chemistry to filter out pigments from things you consume.") - else - S.reagent_skin_coloring = TRUE - if(!silent) - to_chat(src, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.") - -/mob/living/carbon/human/verb/toggle_recolor_verb() - set category = "IC" - set name = "Toggle Reagent Recoloring" - set desc = "While active, you'll slowly adjust your body's color to that of the reagents inside of you, moderated by how much blood you have." - - toggle_recolor() - - -/mob/living/carbon/human/proc/regrow_limbs() - set category = "IC" - set name = "Regrow Limbs" - set desc = "Regrow one of your missing limbs at the cost of a large amount of hunger" - -#define SLIMEPERSON_HUNGERCOST 50 -#define SLIMEPERSON_MINHUNGER 250 -#define SLIMEPERSON_REGROWTHDELAY 450 // 45 seconds - - if(stat || paralysis || stunned) - to_chat(src, "You cannot regenerate missing limbs in your current state.") - return - - if(nutrition < SLIMEPERSON_MINHUNGER) - to_chat(src, "You're too hungry to regenerate a limb!") - return - - var/list/missing_limbs = list() - for(var/l in bodyparts_by_name) - var/obj/item/organ/external/E = bodyparts_by_name[l] - if(!istype(E)) - var/list/limblist = dna.species.has_limbs[l] - var/obj/item/organ/external/limb = limblist["path"] - var/parent_organ = initial(limb.parent_organ) - var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ] - if(!istype(parentLimb)) - continue - missing_limbs[initial(limb.name)] = l - - if(!missing_limbs.len) - to_chat(src, "You're not missing any limbs!") - return - - var/limb_select = input(src, "Choose a limb to regrow", "Limb Regrowth") as null|anything in missing_limbs - var/chosen_limb = missing_limbs[limb_select] - - visible_message("[src] begins to hold still and concentrate on [p_their()] missing [limb_select]...", "You begin to focus on regrowing your missing [limb_select]... (This will take [round(SLIMEPERSON_REGROWTHDELAY/10)] seconds, and you must hold still.)") - if(do_after(src, SLIMEPERSON_REGROWTHDELAY, needhand=0, target = src)) - if(stat || paralysis || stunned) - to_chat(src, "You cannot regenerate missing limbs in your current state.") - return - - if(nutrition < SLIMEPERSON_MINHUNGER) - to_chat(src, "You're too hungry to regenerate a limb!") - return - - var/obj/item/organ/external/O = bodyparts_by_name[chosen_limb] - - var/stored_brute = 0 - var/stored_burn = 0 - if(istype(O)) - to_chat(src, "You distribute the damaged tissue around your body, out of the way of your new pseudopod!") - var/obj/item/organ/external/doomedStump = O - stored_brute = doomedStump.brute_dam - stored_burn = doomedStump.burn_dam - qdel(O) - - var/limb_list = dna.species.has_limbs[chosen_limb] - var/obj/item/organ/external/limb_path = limb_list["path"] - // Parent check - var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)] - if(!istype(potential_parent)) - to_chat(src, "You've lost the organ that you've been growing your new part on!") - return // No rayman for you - // Grah this line will leave a "not used" warning, in spite of the fact that the new() proc WILL do the thing. - // Bothersome. - var/obj/item/organ/external/new_limb = new limb_path(src) - new_limb.open = 0 // This is just so that the compiler won't think that new_limb is unused, because the compiler is horribly stupid. - adjustBruteLoss(stored_brute) - adjustFireLoss(stored_burn) - update_body() - updatehealth() - UpdateDamageIcon() - nutrition -= SLIMEPERSON_HUNGERCOST - visible_message("[src] finishes regrowing [p_their()] missing [new_limb]!", "You finish regrowing your [limb_select]") - else - to_chat(src, "You need to hold still in order to regrow a limb!") - return - -#undef SLIMEPERSON_HUNGERCOST -#undef SLIMEPERSON_MINHUNGER -#undef SLIMEPERSON_REGROWTHDELAY - -/datum/species/slime/handle_pre_change(mob/living/carbon/human/H) - ..() - if(reagent_skin_coloring) - H.toggle_recolor(silent = 1) - -/datum/species/grey - name = "Grey" - name_plural = "Greys" - icobase = 'icons/mob/human_races/r_grey.dmi' - deform = 'icons/mob/human_races/r_def_grey.dmi' - language = "Psionic Communication" - eyes = "grey_eyes_s" - butt_sprite = "grey" - - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver/grey, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain/grey, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes/grey //5 darksight. - ) - - brute_mod = 1.25 //greys are fragile - - default_genes = list(REMOTE_TALK) - - - species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_BODY_MARKINGS - dietflags = DIET_HERB - reagent_tag = PROCESS_ORG - blood_color = "#A200FF" - -/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove) - if(!remove) - C.dna.SetSEState(REMOTETALKBLOCK,1,1) - genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) - else - C.dna.SetSEState(REMOTETALKBLOCK,0,1) - genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) - ..() - -/datum/species/grey/water_act(var/mob/living/carbon/C, volume, temperature, source) - ..() - C.take_organ_damage(5,min(volume,20)) - C.emote("scream") - -/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H) - var/speech_pref = H.client.prefs.speciesprefs - if(speech_pref) - H.mind.speech_span = "wingdings" - -/datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) - if(R.id == "sacid") - H.reagents.del_reagent(R.id) - return 0 - return ..() - -/datum/species/diona - name = "Diona" - name_plural = "Dionaea" - icobase = 'icons/mob/human_races/r_diona.dmi' - deform = 'icons/mob/human_races/r_def_plant.dmi' - language = "Rootspeak" - speech_sounds = list('sound/voice/dionatalk1.ogg') //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16] - speech_chance = 20 - unarmed_type = /datum/unarmed_attack/diona - //primitive_form = "Nymph" - slowdown = 5 - remains_type = /obj/effect/decal/cleanable/ash - - - warning_low_pressure = 50 - hazard_low_pressure = -1 - - cold_level_1 = 50 - cold_level_2 = -1 - cold_level_3 = -1 - - heat_level_1 = 300 - heat_level_2 = 340 - heat_level_3 = 400 - - blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ - species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \ - there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \ - Minoris primary being ringed with a cloud of singing space-station-sized entities.

The Dionaea coexist peacefully with \ - all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \ - even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \ - water and other radiation." - - species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN) - clothing_flags = HAS_SOCKS - default_hair_colour = "#000000" - dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary - taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE - skinned_type = /obj/item/stack/sheet/wood - - oxy_mod = 0 - - body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - blood_color = "#004400" - flesh_color = "#907E4A" - butt_sprite = "diona" - - reagent_tag = PROCESS_ORG - - has_organ = list( - "nutrient channel" = /obj/item/organ/internal/liver/diona, - "neural strata" = /obj/item/organ/internal/heart/diona, - "receptor node" = /obj/item/organ/internal/eyes/diona, //Default darksight of 2. - "gas bladder" = /obj/item/organ/internal/brain/diona, - "polyp segment" = /obj/item/organ/internal/kidneys/diona, - "anchoring ligament" = /obj/item/organ/internal/appendix/diona - ) - - vision_organ = /obj/item/organ/internal/eyes/diona - has_limbs = list( - "chest" = list("path" = /obj/item/organ/external/chest/diona), - "groin" = list("path" = /obj/item/organ/external/groin/diona), - "head" = list("path" = /obj/item/organ/external/head/diona), - "l_arm" = list("path" = /obj/item/organ/external/arm/diona), - "r_arm" = list("path" = /obj/item/organ/external/arm/right/diona), - "l_leg" = list("path" = /obj/item/organ/external/leg/diona), - "r_leg" = list("path" = /obj/item/organ/external/leg/right/diona), - "l_hand" = list("path" = /obj/item/organ/external/hand/diona), - "r_hand" = list("path" = /obj/item/organ/external/hand/right/diona), - "l_foot" = list("path" = /obj/item/organ/external/foot/diona), - "r_foot" = list("path" = /obj/item/organ/external/foot/right/diona) - ) - - suicide_messages = list( - "is losing branches!", - "pulls out a secret stash of herbicide and takes a hearty swig!", - "is pulling themselves apart!") - -/datum/species/diona/can_understand(var/mob/other) - if(istype(other, /mob/living/simple_animal/diona)) - return 1 - return 0 - -/datum/species/diona/handle_post_spawn(var/mob/living/carbon/human/H) - H.gender = NEUTER - - return ..() - -/datum/species/diona/handle_life(var/mob/living/carbon/human/H) - H.radiation = Clamp(H.radiation, 0, 100) //We have to clamp this first, then decrease it, or there's a few edge cases of massive heals if we clamp and decrease at the same time. - var/rads = H.radiation / 25 - H.radiation = max(H.radiation-rads, 0) - H.nutrition = min(H.nutrition+rads, NUTRITION_LEVEL_WELL_FED+10) - H.adjustBruteLoss(-(rads)) - H.adjustToxLoss(-(rads)) - - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(H.loc)) //else, there's considered to be no light - var/turf/T = H.loc - light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights - H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10) - - if(light_amount > 0) - H.clear_alert("nolight") - else - H.throw_alert("nolight", /obj/screen/alert/nolight) - - if((light_amount >= 5) && !H.suiciding) //if there's enough light, heal - - H.adjustBruteLoss(-(light_amount/2)) - H.adjustFireLoss(-(light_amount/4)) - if(H.nutrition < NUTRITION_LEVEL_STARVING+50) - H.take_overall_damage(10,0) - ..() - -/datum/species/machine - name = "Machine" - name_plural = "Machines" - - blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \ - robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \ - to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \ - generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \ - inhuman in outlook and perspective." - - icobase = 'icons/mob/human_races/r_machine.dmi' - deform = 'icons/mob/human_races/r_machine.dmi' - language = "Trinary" - remains_type = /obj/effect/decal/remains/robot - skinned_type = /obj/item/stack/sheet/metal // Let's grind up IPCs for station resources! - - eyes = "blank_eyes" - brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150% - burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall. - tox_mod = 0 - clone_mod = 0 - oxy_mod = 0 - death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." - - species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS - bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS - dietflags = 0 //IPCs can't eat, so no diet - taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE - blood_color = "#1F181F" - flesh_color = "#AAAAAA" - //Default styles for created mobs. - default_hair = "Blue IPC Screen" - can_revive_by_healing = 1 - has_gender = FALSE - reagent_tag = PROCESS_SYN - male_scream_sound = 'sound/goonstation/voice/robot_scream.ogg' - female_scream_sound = 'sound/goonstation/voice/robot_scream.ogg' - male_cough_sounds = list('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg') - female_cough_sounds = list('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg') - male_sneeze_sound = 'sound/effects/mob_effects/machine_sneeze.ogg' - female_sneeze_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg' - butt_sprite = "machine" - - has_organ = list( - "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/arm/power_cord - ) - - vision_organ = /obj/item/organ/internal/eyes/optical_sensor - has_limbs = list( - "chest" = list("path" = /obj/item/organ/external/chest/ipc), - "groin" = list("path" = /obj/item/organ/external/groin/ipc), - "head" = list("path" = /obj/item/organ/external/head/ipc), - "l_arm" = list("path" = /obj/item/organ/external/arm/ipc), - "r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc), - "l_leg" = list("path" = /obj/item/organ/external/leg/ipc), - "r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc), - "l_hand" = list("path" = /obj/item/organ/external/hand/ipc), - "r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc), - "l_foot" = list("path" = /obj/item/organ/external/foot/ipc), - "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) - ) - - suicide_messages = list( - "is powering down!", - "is smashing their own monitor!", - "is twisting their own neck!", - "is downloading extra RAM!", - "is frying their own circuits!", - "is blocking their ventilation port!") - - species_abilities = list( - /mob/living/carbon/human/proc/change_monitor - ) - -/datum/species/machine/handle_death(var/mob/living/carbon/human/H) - var/obj/item/organ/external/head/head_organ = H.get_organ("head") - if(!head_organ) - return - head_organ.h_style = "Bald" - head_organ.f_style = "Shaved" - spawn(100) - if(H) - H.update_hair() - H.update_fhair() - -/datum/species/drask - name = "Drask" - name_plural = "Drask" - icobase = 'icons/mob/human_races/r_drask.dmi' - deform = 'icons/mob/human_races/r_drask.dmi' - language = "Orluum" - eyes = "drask_eyes_s" - - speech_sounds = list('sound/voice/DraskTalk.ogg') - speech_chance = 20 - male_scream_sound = 'sound/voice/DraskTalk2.ogg' - female_scream_sound = 'sound/voice/DraskTalk2.ogg' - male_cough_sounds = 'sound/voice/DraskCough.ogg' - female_cough_sounds = 'sound/voice/DraskCough.ogg' - male_sneeze_sound = 'sound/voice/DraskSneeze.ogg' - female_sneeze_sound = 'sound/voice/DraskSneeze.ogg' - - burn_mod = 2 - //exotic_blood = "cryoxadone" - body_temperature = 273 - - blurb = "Hailing from Hoorlm, planet outside what is usually considered a habitable \ - orbit, the Drask evolved to live in extreme cold. Their strange bodies seem \ - to operate better the colder their surroundings are, and can regenerate rapidly \ - when breathing supercooled gas.

On their homeworld, the Drask live long lives \ - in their labyrinthine settlements, carved out beneath Hoorlm's icy surface, where the air \ - is of breathable density." - - suicide_messages = list( - "is self-warming with friction!", - "is jamming fingers through their big eyes!", - "is sucking in warm air!", - "is holding their breath!") - - species_traits = list(LIPS, IS_WHITELISTED) - clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT - bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS - dietflags = DIET_OMNI - - cold_level_1 = -1 //Default 260 - Lower is better - cold_level_2 = -1 //Default 200 - cold_level_3 = -1 //Default 120 - coldmod = -1 - - heat_level_1 = 300 //Default 360 - Higher is better - heat_level_2 = 340 //Default 400 - heat_level_3 = 400 //Default 460 - heatmod = 2 - - flesh_color = "#a3d4eb" - reagent_tag = PROCESS_ORG - base_color = "#a3d4eb" - blood_color = "#a3d4eb" - butt_sprite = "drask" - - has_organ = list( - "heart" = /obj/item/organ/internal/heart/drask, - "lungs" = /obj/item/organ/internal/lungs/drask, - "metabolic strainer" = /obj/item/organ/internal/liver/drask, - "eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight. - "brain" = /obj/item/organ/internal/brain/drask - ) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/tajaran.dm b/code/modules/mob/living/carbon/human/species/tajaran.dm new file mode 100644 index 00000000000..0eaede54dbf --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/tajaran.dm @@ -0,0 +1,58 @@ +/datum/species/tajaran + name = "Tajaran" + name_plural = "Tajaran" + icobase = 'icons/mob/human_races/r_tajaran.dmi' + deform = 'icons/mob/human_races/r_def_tajaran.dmi' + language = "Siik'tajr" + tail = "tajtail" + skinned_type = /obj/item/stack/sheet/fur + unarmed_type = /datum/unarmed_attack/claws + + blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \ + S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \ + influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \ + of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \ + using unique inflections their mouths form." + + cold_level_1 = 240 + cold_level_2 = 180 + cold_level_3 = 100 + + heat_level_1 = 340 + heat_level_2 = 380 + heat_level_3 = 440 + + primitive_form = /datum/species/monkey/tajaran + + species_traits = list(LIPS, CAN_BE_FAT) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING + dietflags = DIET_OMNI + taste_sensitivity = TASTE_SENSITIVITY_SHARP + reagent_tag = PROCESS_ORG + flesh_color = "#AFA59E" + base_color = "#424242" + butt_sprite = "tajaran" + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs, + "liver" = /obj/item/organ/internal/liver/tajaran, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2) + unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/ + ) + + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/chick, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, + /mob/living/simple_animal/tribble) + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") + +/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) + H.stop_tail_wagging(1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm new file mode 100644 index 00000000000..243baa0ebfd --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/unathi.dm @@ -0,0 +1,92 @@ +/datum/species/unathi + name = "Unathi" + name_plural = "Unathi" + icobase = 'icons/mob/human_races/r_lizard.dmi' + deform = 'icons/mob/human_races/r_def_lizard.dmi' + language = "Sinta'unathi" + tail = "sogtail" + skinned_type = /obj/item/stack/sheet/animalhide/lizard + unarmed_type = /datum/unarmed_attack/claws + primitive_form = /datum/species/monkey/unathi + + blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \ + Uuosa-Eso system, which roughly translates to 'burning mother'.

Coming from a harsh, radioactive \ + desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \ + else, frequently even their own lives. They prefer warmer temperatures than most species and \ + their native tongue is a heavy hissing laungage called Sinta'Unathi." + + species_traits = list(LIPS) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING + dietflags = DIET_CARN + + cold_level_1 = 280 //Default 260 - Lower is better + cold_level_2 = 220 //Default 200 + cold_level_3 = 140 //Default 120 + + heat_level_1 = 380 //Default 360 - Higher is better + heat_level_2 = 420 //Default 400 + heat_level_3 = 480 //Default 460 + + flesh_color = "#34AF10" + reagent_tag = PROCESS_ORG + base_color = "#066000" + //Default styles for created mobs. + default_headacc = "Simple" + default_headacc_colour = "#404040" + butt_sprite = "unathi" + brute_mod = 1.05 + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs, + "liver" = /obj/item/organ/internal/liver/unathi, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes/unathi //3 darksight. + ) + + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, + /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") + + var/datum/action/innate/tail_lash/lash = new() + + +/datum/species/unathi/handle_post_spawn(var/mob/living/carbon/human/H) + lash.Grant(H) + ..() + +/datum/action/innate/tail_lash + name = "Tail lash" + icon_icon = 'icons/effects/effects.dmi' + button_icon_state = "tail" + +/datum/action/innate/tail_lash/Activate() + var/mob/living/carbon/human/user = owner + if(!user.restrained() || !user.buckled) + to_chat(user, "You need freedom of movement to tail lash!") + return + if(user.getStaminaLoss() >= 50) + to_chat(user, "Rest before tail lashing again!") + return + for(var/mob/living/carbon/human/C in orange(1)) + var/obj/item/organ/external/E = C.get_organ(pick("l_leg", "r_leg", "l_foot", "r_foot", "groin")) + if(E) + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[src] smacks [C] in [E] with their tail! ", "You hit [C] in [E] with your tail!") + user.adjustStaminaLoss(15) + C.apply_damage(5, BRUTE, E) + user.spin(20, 1) + playsound(user.loc, 'sound/weapons/slash.ogg', 50, 0) + + + +/datum/species/unathi/handle_death(var/mob/living/carbon/human/H) + H.stop_tail_wagging(1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm new file mode 100644 index 00000000000..e86185a4d9b --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/vox.dm @@ -0,0 +1,201 @@ +/datum/species/vox + name = "Vox" + name_plural = "Vox" + icobase = 'icons/mob/human_races/vox/r_vox.dmi' + deform = 'icons/mob/human_races/vox/r_def_vox.dmi' + language = "Vox-pidgin" + tail = "voxtail" + speech_sounds = list('sound/voice/shriek1.ogg') + speech_chance = 20 + unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. + + blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ + scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \ + alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \ + refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \ + smell.

Most humans will never meet a Vox raider, instead learning of this insular species through \ + dealing with their traders and merchants; those that do rarely enjoy the experience." + + brute_mod = 1.2 //20% more brute damage. Fragile bird bones. + + warning_low_pressure = 50 + hazard_low_pressure = 0 + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = 0 + + breathid = "n2" + + eyes = "vox_eyes_s" + + species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING) + clothing_flags = HAS_SOCKS + dietflags = DIET_OMNI + bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS + + blood_color = "#2299FC" + flesh_color = "#808D11" + //Default styles for created mobs. + default_hair = "Short Vox Quills" + default_hair_colour = "#614f19" //R: 97, G: 79, B: 25 + butt_sprite = "vox" + + reagent_tag = PROCESS_ORG + scream_verb = "shrieks" + male_scream_sound = 'sound/voice/shriek1.ogg' + female_scream_sound = 'sound/voice/shriek1.ogg' + male_cough_sounds = list('sound/voice/shriekcough.ogg') + female_cough_sounds = list('sound/voice/shriekcough.ogg') + male_sneeze_sound = 'sound/voice/shrieksneeze.ogg' + female_sneeze_sound = 'sound/voice/shrieksneeze.ogg' + + icon_skin_tones = list( + 1 = "Default Green", + 2 = "Dark Green", + 3 = "Brown", + 4 = "Grey", + 5 = "Emerald", + 6 = "Azure" + ) + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs/vox, + "liver" = /obj/item/organ/internal/liver/vox, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used + ) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ. + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is deeply inhaling oxygen!") + +/datum/species/vox/handle_death(var/mob/living/carbon/human/H) + H.stop_tail_wagging(1) + +/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H) + if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime") + H.unEquip(H.wear_mask) + H.unEquip(H.l_hand) + + H.equip_or_collect(new /obj/item/clothing/mask/breath/vox(H), slot_wear_mask) + var/tank_pref = H.client && H.client.prefs ? H.client.prefs.speciesprefs : null + if(tank_pref)//Diseasel, here you go + H.equip_or_collect(new /obj/item/tank/nitrogen(H), slot_l_hand) + else + H.equip_or_collect(new /obj/item/tank/emergency_oxygen/vox(H), slot_l_hand) + to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") + H.internal = H.l_hand + H.update_action_buttons_icon() + +/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) + updatespeciescolor(H) + H.update_icons() + //H.verbs += /mob/living/carbon/human/proc/leap + ..() + +/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race. + if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis. + var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox. + var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox. + switch(H.s_tone) + if(6) //Azure Vox. + new_icobase = 'icons/mob/human_races/vox/r_voxazu.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi' + H.tail = "voxtail_azu" + if(5) //Emerald Vox. + new_icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi' + H.tail = "voxtail_emrl" + if(4) //Grey Vox. + new_icobase = 'icons/mob/human_races/vox/r_voxgry.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi' + H.tail = "voxtail_gry" + if(3) //Brown Vox. + new_icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi' + H.tail = "voxtail_brn" + if(2) //Dark Green Vox. + new_icobase = 'icons/mob/human_races/vox/r_voxdgrn.dmi' + new_deform = 'icons/mob/human_races/vox/r_def_voxdgrn.dmi' + H.tail = "voxtail_dgrn" + else //Default Green Vox. + H.tail = "voxtail" //Ensures they get an appropriately coloured tail depending on the skin-tone. + + H.change_icobase(new_icobase, new_deform, owner_sensitive) //Update the icobase/deform of all our organs, but make sure we don't mess with frankenstein limbs in doing so. + H.update_dna() + +/datum/species/vox/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R) + if(R.id == "oxygen") //Armalis are above such petty things. + H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma. + H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM) + return 0 //Handling reagent removal on our own. + + return ..() + +/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) + H.verbs += /mob/living/carbon/human/proc/leap + H.verbs += /mob/living/carbon/human/proc/gut + ..() + +/datum/species/vox/armalis + name = "Vox Armalis" + name_plural = "Vox Armalis" + icobase = 'icons/mob/human_races/r_armalis.dmi' + deform = 'icons/mob/human_races/r_armalis.dmi' + unarmed_type = /datum/unarmed_attack/claws/armalis + + warning_low_pressure = 50 + hazard_low_pressure = 0 + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = 0 + + heat_level_1 = 2000 + heat_level_2 = 3000 + heat_level_3 = 4000 + + brute_mod = 0.2 + burn_mod = 0.2 + + eyes = "blank_eyes" + + species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED) + bodyflags = HAS_TAIL + dietflags = DIET_OMNI //should inherit this from vox, this is here just in case + + blood_color = "#2299FC" + flesh_color = "#808D11" + + reagent_tag = PROCESS_ORG + + tail = "armalis_tail" + icon_template = 'icons/mob/human_races/r_armalis.dmi' + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs/vox, + "liver" = /obj/item/organ/internal/liver, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used + ) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ. + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is huffing oxygen!") + +/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things. + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/vulpkanin.dm b/code/modules/mob/living/carbon/human/species/vulpkanin.dm new file mode 100644 index 00000000000..5746fe125c9 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/vulpkanin.dm @@ -0,0 +1,52 @@ +/datum/species/vulpkanin + name = "Vulpkanin" + name_plural = "Vulpkanin" + icobase = 'icons/mob/human_races/r_vulpkanin.dmi' + deform = 'icons/mob/human_races/r_vulpkanin.dmi' + language = "Canilunzt" + primitive_form = /datum/species/monkey/vulpkanin + tail = "vulptail" + skinned_type = /obj/item/stack/sheet/fur + unarmed_type = /datum/unarmed_attack/claws + + blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \ + dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \ + culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \ + to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ + which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." + + species_traits = list(LIPS) + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS + bodyflags = HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR + dietflags = DIET_OMNI + hunger_drain = 0.11 + taste_sensitivity = TASTE_SENSITIVITY_SHARP + reagent_tag = PROCESS_ORG + flesh_color = "#966464" + base_color = "#CF4D2F" + butt_sprite = "vulp" + + scream_verb = "yelps" + + has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs, + "liver" = /obj/item/organ/internal/liver/vulpkanin, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2) + unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/ + ) + + allowed_consumed_mobs = list(/mob/living/simple_animal/mouse, /mob/living/simple_animal/lizard, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken, + /mob/living/simple_animal/crab, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/parrot, /mob/living/simple_animal/tribble) + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") + +/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H) + H.stop_tail_wagging(1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/wryn.dm similarity index 61% rename from code/modules/mob/living/carbon/human/species/apollo.dm rename to code/modules/mob/living/carbon/human/species/wryn.dm index 5a3e1d4cde9..5606cd81e9b 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/wryn.dm @@ -75,46 +75,4 @@ add_attack_logs(user, target, "Antennae removed") return 0 else - ..() - -/datum/species/nucleation - name = "Nucleation" - name_plural = "Nucleations" - icobase = 'icons/mob/human_races/r_nucleation.dmi' - blurb = "A sub-race of unfortunates who have been exposed to too much supermatter radiation. As a result, \ - supermatter crystal clusters have begun to grow across their bodies. Research to find a cure for this ailment \ - has been slow, and so this is a common fate for veteran engineers. The supermatter crystals produce oxygen, \ - negating the need for the individual to breathe. Their massive change in biology, however, renders most medicines \ - obselete. Ionizing radiation seems to cause resonance in some of their crystals, which seems to encourage regeneration \ - and produces a calming effect on the individual. Nucleations are highly stigmatized, and are treated much in the same \ - way as lepers were back on Earth." - language = "Sol Common" - burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores - brute_mod = 2 // damn, double wham, double dam - oxy_mod = 0 - species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE) - dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet - - //Default styles for created mobs. - default_hair = "Nucleation Crystals" - - reagent_tag = PROCESS_ORG - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "crystallized brain" = /obj/item/organ/internal/brain/crystal, - "eyes" = /obj/item/organ/internal/eyes/luminescent_crystal, //Standard darksight of 2. - "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal - ) - vision_organ = /obj/item/organ/internal/eyes/luminescent_crystal - -/datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H) - H.light_color = "#1C1C00" - H.set_light(2) - return ..() - -/datum/species/nucleation/handle_death(var/mob/living/carbon/human/H) - var/turf/T = get_turf(H) - H.visible_message("[H]'s body explodes, leaving behind a pile of microscopic crystals!") - explosion(T, 0, 0, 2, 2) // Create a small explosion burst upon death -// new /obj/item/shard/supermatter( T ) - qdel(H) \ No newline at end of file + ..() \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 8993f3f625d..96675812fdb 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1664,15 +1664,28 @@ #include "code\modules\mob\living\carbon\human\interactive\functions.dm" #include "code\modules\mob\living\carbon\human\interactive\interactive.dm" #include "code\modules\mob\living\carbon\human\interactive\prefabs.dm" +#include "code\modules\mob\living\carbon\human\species\_species.dm" #include "code\modules\mob\living\carbon\human\species\abductor.dm" -#include "code\modules\mob\living\carbon\human\species\apollo.dm" +#include "code\modules\mob\living\carbon\human\species\diona.dm" +#include "code\modules\mob\living\carbon\human\species\drask.dm" #include "code\modules\mob\living\carbon\human\species\golem.dm" +#include "code\modules\mob\living\carbon\human\species\grey.dm" +#include "code\modules\mob\living\carbon\human\species\human.dm" +#include "code\modules\mob\living\carbon\human\species\kidan.dm" +#include "code\modules\mob\living\carbon\human\species\machine.dm" #include "code\modules\mob\living\carbon\human\species\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\nucleation.dm" #include "code\modules\mob\living\carbon\human\species\plasmaman.dm" #include "code\modules\mob\living\carbon\human\species\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\shadowling.dm" #include "code\modules\mob\living\carbon\human\species\skeleton.dm" -#include "code\modules\mob\living\carbon\human\species\species.dm" -#include "code\modules\mob\living\carbon\human\species\station.dm" +#include "code\modules\mob\living\carbon\human\species\skrell.dm" +#include "code\modules\mob\living\carbon\human\species\slime.dm" +#include "code\modules\mob\living\carbon\human\species\tajaran.dm" +#include "code\modules\mob\living\carbon\human\species\unathi.dm" +#include "code\modules\mob\living\carbon\human\species\vox.dm" +#include "code\modules\mob\living\carbon\human\species\vulpkanin.dm" +#include "code\modules\mob\living\carbon\human\species\wryn.dm" #include "code\modules\mob\living\carbon\slime\death.dm" #include "code\modules\mob\living\carbon\slime\emote.dm" #include "code\modules\mob\living\carbon\slime\examine.dm" From fa6003dbee014bc480a9f007771d0b07c0fec6a3 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Mon, 23 Jul 2018 23:35:24 +0100 Subject: [PATCH 02/32] Blocks embeds from NTSL --- code/modules/scripting/Implementations/Telecomms.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index a24a9522b38..0e9053bbb44 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -26,11 +26,11 @@ //temp /datum/TCS_Compiler - var/datum/n_scriptOptions/nS_Options/options - var/datum/n_Scanner/nS_Scanner/scanner - var/list/tokens - var/datum/n_Parser/nS_Parser/parser - var/datum/node/BlockDefinition/GlobalBlock/program + var/datum/n_scriptOptions/nS_Options/options + var/datum/n_Scanner/nS_Scanner/scanner + var/list/tokens + var/datum/n_Parser/nS_Parser/parser + var/datum/node/BlockDefinition/GlobalBlock/program /* -- Compile a raw block of text -- */ @@ -248,7 +248,7 @@ But I like HTML, so back to no sanitizing.*/ var/message = interpreter.GetVar("$content") - var/regex/bannedTags = new ("( Date: Tue, 24 Jul 2018 19:49:10 -0400 Subject: [PATCH 03/32] Abductor Update --- code/__DEFINES/hud.dm | 2 + code/datums/hud.dm | 3 +- code/game/data_huds.dm | 3 + .../miniantags/abduction/abduction_gear.dm | 151 +++++++++++++++--- .../gamemodes/miniantags/abduction/gland.dm | 137 ++++++++++++++-- .../miniantags/abduction/machinery/console.dm | 65 +++++--- .../abduction/machinery/dispenser.dm | 8 +- .../abduction/machinery/experiment.dm | 5 +- .../mob/living/carbon/human/human_defines.dm | 2 +- .../living/carbon/human/species/abductor.dm | 9 +- goon/browserassets/css/browserOutput.css | 3 +- icons/mob/hud.dmi | Bin 14509 -> 14695 bytes icons/obj/abductor.dmi | Bin 55758 -> 57606 bytes 13 files changed, 318 insertions(+), 70 deletions(-) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 29392997893..60252fc11ba 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -27,6 +27,7 @@ #define PLANT_WEED_HUD "22"// Weed level #define DIAG_TRACK_HUD "23"// Mech tracking beacon #define DIAG_PATH_HUD "24"//Bot path indicators +#define GLAND_HUD "25"//Gland indicators for abductors //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -54,6 +55,7 @@ #define ANTAG_HUD_CHANGELING 16 #define ANTAG_HUD_VAMPIRE 17 #define ANTAG_HUD_ABDUCTOR 18 +#define DATA_HUD_ABDUCTOR 19 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 04ebcc68ed5..84c45299ece 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -20,7 +20,8 @@ var/datum/atom_hud/huds = list( \ ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),\ ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),\ ANTAG_HUD_VAMPIRE = new/datum/atom_hud/antag/hidden(),\ - ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden()\ + ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\ + DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor()\ ) /datum/atom_hud diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index a4faafcf91f..db2fb3c64df 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -52,6 +52,9 @@ /datum/atom_hud/data/bot_path hud_icons = list(DIAG_PATH_HUD) +/datum/atom_hud/abductor + hud_icons = list(GLAND_HUD) + /datum/atom_hud/data/hydroponic hud_icons = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 40d48f7fd59..f16028c35ba 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -2,6 +2,8 @@ #define VEST_COMBAT 2 #define GIZMO_SCAN 1 #define GIZMO_MARK 2 +#define MIND_DEVICE_MESSAGE 1 +#define MIND_DEVICE_CONTROL 2 //AGENT VEST /obj/item/clothing/suit/armor/abductor/vest @@ -14,6 +16,7 @@ origin_tech = "magnets=7;biotech=4;powerstorage=4;abductor=4" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) actions_types = list(/datum/action/item_action/hands_free/activate) + allowed = list(/obj/item/abductor, /obj/item/abductor_baton, /obj/item/melee/baton, /obj/item/gun/energy, /obj/item/restraints/handcuffs) var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -23,6 +26,11 @@ species_fit = null sprite_sheets = null +/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop() + flags ^= NODROP + if(ismob(loc)) + to_chat(loc, "Your vest is now [flags & NODROP ? "locked" : "unlocked"].") + /obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode() switch(mode) if(VEST_STEALTH) @@ -53,7 +61,7 @@ return stealth_active = 1 if(ishuman(loc)) - var/mob/living/carbon/human/M = src.loc + var/mob/living/carbon/human/M = loc new /obj/effect/temp_visual/dir_setting/ninja/cloak(get_turf(M), M.dir) M.name_override = disguise.name M.icon = disguise.icon @@ -67,7 +75,7 @@ return stealth_active = 0 if(ishuman(loc)) - var/mob/living/carbon/human/M = src.loc + var/mob/living/carbon/human/M = loc new /obj/effect/temp_visual/dir_setting/ninja(get_turf(M), M.dir) M.name_override = null M.overlays.Cut() @@ -94,9 +102,9 @@ /obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() if(ishuman(loc)) if(combat_cooldown != initial(combat_cooldown)) - to_chat(src.loc, "Combat injection is still recharging.") + to_chat(loc, "Combat injection is still recharging.") return - var/mob/living/carbon/human/M = src.loc + var/mob/living/carbon/human/M = loc M.adjustStaminaLoss(-75) M.SetParalysis(0) M.SetStunned(0) @@ -109,6 +117,17 @@ if(combat_cooldown==initial(combat_cooldown)) processing_objects.Remove(src) +/obj/item/clothing/suit/armor/abductor/Destroy() + processing_objects.Remove(src) + for(var/obj/machinery/abductor/console/C in machines) + if(C.vest == src) + C.vest = null + break + return ..() + +/obj/item/abductor + icon = 'icons/obj/abductor.dmi' + /obj/item/abductor/proc/AbductorCheck(user) if(isabductor(user)) return TRUE @@ -116,14 +135,19 @@ return FALSE /obj/item/abductor/proc/ScientistCheck(user) + if(!AbductorCheck(user)) + return FALSE + var/mob/living/carbon/human/H = user var/datum/species/abductor/S = H.dna.species - return S.scientist + if(S.scientist) + return TRUE + to_chat(user, "You're not trained to use this!") + return FALSE /obj/item/abductor/gizmo name = "science tool" desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras." - icon = 'icons/obj/abductor.dmi' icon_state = "gizmo_scan" item_state = "gizmo" origin_tech = "engineering=7;magnets=4;bluespace=4;abductor=3" @@ -132,11 +156,12 @@ var/obj/machinery/abductor/console/console /obj/item/abductor/gizmo/attack_self(mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this!") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + if(mode == GIZMO_SCAN) mode = GIZMO_MARK icon_state = "gizmo_mark" @@ -146,11 +171,12 @@ to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE") /obj/item/abductor/gizmo/attack(mob/living/M, mob/user) - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(M, user) @@ -161,11 +187,12 @@ /obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) if(flag) return - if(!AbductorCheck(user)) - return if(!ScientistCheck(user)) - to_chat(user, "You're not trained to use this") return + if(!console) + to_chat(user, "The device is not linked to console!") + return + switch(mode) if(GIZMO_SCAN) scan(target, user) @@ -174,9 +201,8 @@ /obj/item/abductor/gizmo/proc/scan(atom/target, mob/living/user) if(ishuman(target)) - if(console!=null) - console.AddSnapshot(target) - to_chat(user, "You scan [target] and add [target.p_them()] to the database.") + console.AddSnapshot(target) + to_chat(user, "You scan [target] and add [target.p_them()] to the database.") /obj/item/abductor/gizmo/proc/mark(atom/target, mob/living/user) if(marked == target) @@ -200,11 +226,15 @@ marked = target to_chat(user, "You finish preparing [target] for transport.") +/obj/item/abductor/gizmo/Destroy() + if(console) + console.gizmo = null + return ..() + /obj/item/abductor/silencer name = "abductor silencer" desc = "A compact device used to shut down communications equipment." - icon = 'icons/obj/abductor.dmi' icon_state = "silencer" item_state = "silencer" origin_tech = "materials=4;programming=7;abductor=3" @@ -222,7 +252,7 @@ radio_off(target, user) /obj/item/abductor/silencer/proc/radio_off(atom/target, mob/living/user) - if(!(user in (viewers(7,target)))) + if(!(user in (viewers(7, target)))) return var/turf/targloc = get_turf(target) @@ -238,12 +268,85 @@ var/list/all_items = M.GetAllContents() for(var/obj/I in all_items) - if(istype(I,/obj/item/radio/)) + if(istype(I, /obj/item/radio)) var/obj/item/radio/r = I r.listening = 0 - if(!istype(I,/obj/item/radio/headset)) + if(!istype(I, /obj/item/radio/headset)) r.broadcasting = 0 //goddamned headset hacks +/obj/item/abductor/mind_device + name = "mental interface device" + desc = "A dual-mode tool for directly communicating with sentient brains. It can be used to send a direct message to a target, or to send a command to a test subject with a charged gland." + icon_state = "mind_device_message" + item_state = "silencer" + var/mode = MIND_DEVICE_MESSAGE + +/obj/item/abductor/mind_device/attack_self(mob/user) + if(!ScientistCheck(user)) + return + + if(mode == MIND_DEVICE_MESSAGE) + mode = MIND_DEVICE_CONTROL + icon_state = "mind_device_control" + else + mode = MIND_DEVICE_MESSAGE + icon_state = "mind_device_message" + to_chat(user, "You switch the device to [mode == MIND_DEVICE_MESSAGE ? "TRANSMISSION" : "COMMAND"] MODE") + +/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) + if(!ScientistCheck(user)) + return + + switch(mode) + if(MIND_DEVICE_CONTROL) + mind_control(target, user) + if(MIND_DEVICE_MESSAGE) + mind_message(target, user) + +/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user) + if(iscarbon(target)) + var/mob/living/carbon/C = target + var/obj/item/organ/internal/heart/gland/G = C.get_organ_slot("heart") + if(!istype(G)) + to_chat(user, "Your target does not have an experimental gland!") + return + if(!G.mind_control_uses) + to_chat(user, "Your target's gland is spent!") + return + if(G.active_mind_control) + to_chat(user, "Your target is already under a mind-controlling influence!") + return + + var/command = stripped_input(user, "Enter the command for your target to follow. Uses Left: [G.mind_control_uses], Duration: [DisplayTimeText(G.mind_control_duration)]", "Enter command") + + if(!command) + return + + if(QDELETED(user) || user.get_active_hand() != src || loc != user) + return + + if(QDELETED(G)) + return + + G.mind_control(command, user) + to_chat(user, "You send the command to your target.") + +/obj/item/abductor/mind_device/proc/mind_message(atom/target, mob/living/user) + if(isliving(target)) + var/mob/living/L = target + if(L.stat == DEAD) + to_chat(user, "Your target is dead!") + return + var/message = stripped_input(user, "Write a message to send to your target's brain.", "Enter message") + if(!message) + return + if(QDELETED(L) || L.stat == DEAD) + return + + to_chat(L, "You hear a voice in your head saying: [message]") + to_chat(user, "You send the message to your target.") + log_say("[key_name(user)] sent an abductor mind message to [key_name(L)]: '[message]'", user) + /obj/item/gun/energy/alien name = "alien pistol" desc = "A complicated gun that fires bursts of high-intensity radiation." @@ -302,7 +405,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} w_class = WEIGHT_CLASS_NORMAL actions_types = list(/datum/action/item_action/toggle_mode) -/obj/item/abductor_baton/proc/toggle(mob/living/user=usr) +/obj/item/abductor_baton/proc/toggle(mob/living/user = usr) mode = (mode+1)%BATON_MODES var/txt switch(mode) @@ -475,7 +578,6 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(BATON_PROBE) to_chat(user, "The baton is in probing mode.") - /obj/item/radio/headset/abductor name = "alien headset" desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows." @@ -553,6 +655,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} name = "resting contraption" desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?" icon = 'icons/obj/abductor.dmi' + buildstacktype = /obj/item/stack/sheet/mineral/abductor icon_state = "bed" /obj/structure/table_frame/abductor diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index ebc14225cd7..4976fbc412b 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -14,28 +14,68 @@ var/active = 0 tough = TRUE //not easily broken by combat damage + var/mind_control_uses = 1 + var/mind_control_duration = 1800 + var/active_mind_control = FALSE + /obj/item/organ/internal/heart/gland/proc/ownerCheck() if(ishuman(owner)) - return 1 + return TRUE if(!human_only && iscarbon(owner)) - return 1 - return 0 + return TRUE + return FALSE /obj/item/organ/internal/heart/gland/proc/Start() active = 1 next_activation = world.time + rand(cooldown_low,cooldown_high) +/obj/item/organ/internal/heart/gland/proc/update_gland_hud() + if(!owner) + return + var/image/holder = owner.hud_list[GLAND_HUD] + var/icon/I = icon(owner.icon, owner.icon_state, owner.dir) + holder.pixel_y = I.Height() - world.icon_size + if(active_mind_control) + holder.icon_state = "hudgland_active" + else if(mind_control_uses) + holder.icon_state = "hudgland_ready" + else + holder.icon_state = "hudgland_spent" + +/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user) + if(!ownerCheck() || !mind_control_uses || active_mind_control) + return + mind_control_uses-- + to_chat(owner, "You suddenly feel an irresistible compulsion to follow an order...") + to_chat(owner, "[command]") + active_mind_control = TRUE + log_admin("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") + update_gland_hud() + + addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) + +/obj/item/organ/internal/heart/gland/proc/clear_mind_control() + if(!ownerCheck() || !active_mind_control) + return + to_chat(owner, "You feel the compulsion fade, and you completely forget about your previous orders.") + active_mind_control = FALSE /obj/item/organ/internal/heart/gland/remove(var/mob/living/carbon/M, special = 0) active = 0 if(initial(uses) == 1) uses = initial(uses) + var/datum/atom_hud/abductor/hud = huds[DATA_HUD_ABDUCTOR] + hud.remove_from_hud(owner) + clear_mind_control() . = ..() /obj/item/organ/internal/heart/gland/insert(var/mob/living/carbon/M, special = 0) ..() if(special != 2 && uses) // Special 2 means abductor surgery Start() + var/datum/atom_hud/abductor/hud = huds[DATA_HUD_ABDUCTOR] + hud.add_to_hud(owner) + update_gland_hud() /obj/item/organ/internal/heart/gland/on_life() if(!beating) @@ -61,9 +101,12 @@ cooldown_high = 400 uses = -1 icon_state = "health" + mind_control_uses = 3 + mind_control_duration = 3000 /obj/item/organ/internal/heart/gland/heals/activate() to_chat(owner, "You feel curiously revitalized.") + owner.adjustToxLoss(-20) owner.adjustBruteLoss(-20) owner.adjustOxyLoss(-20) owner.adjustFireLoss(-20) @@ -73,6 +116,13 @@ cooldown_high = 1200 uses = -1 icon_state = "slime" + mind_control_uses = 1 + mind_control_duration = 2400 + +/obj/item/organ/internal/heart/gland/slime/insert(mob/living/carbon/M, special = 0) + ..() + owner.faction |= "slime" + owner.add_language("Bubblish") /obj/item/organ/internal/heart/gland/slime/activate() to_chat(owner, "You feel nauseous!") @@ -84,10 +134,12 @@ /obj/item/organ/internal/heart/gland/mindshock origin_tech = "materials=4;biotech=4;magnets=6;abductor=3" - cooldown_low = 300 - cooldown_high = 300 + cooldown_low = 400 + cooldown_high = 700 uses = -1 icon_state = "mindshock" + mind_control_uses = 1 + mind_control_duration = 6000 /obj/item/organ/internal/heart/gland/mindshock/activate() to_chat(owner, "You get a headache.") @@ -96,15 +148,25 @@ for(var/mob/living/carbon/H in orange(4,T)) if(H == owner) continue - to_chat(H, "You hear a buzz in your head.") - H.AdjustConfused(20) + switch(pick(1,3)) + if(1) + to_chat(H, "You hear a loud buzz in your head, silencing your thoughts!") + H.Stun(3) + if(2) + to_chat(H, "You hear an annoying buzz in your head.") + H.AdjustConfused(15) + H.adjustBrainLoss(5, 15) + if(3) + H.hallucination += 60 /obj/item/organ/internal/heart/gland/pop cooldown_low = 900 cooldown_high = 1800 uses = -1 - human_only = 1 + human_only = TRUE icon_state = "species" + mind_control_uses = 5 + mind_control_duration = 300 /obj/item/organ/internal/heart/gland/pop/activate() to_chat(owner, "You feel unlike yourself.") @@ -117,6 +179,8 @@ cooldown_high = 2400 uses = 1 icon_state = "vent" + mind_control_uses = 4 + mind_control_duration = 1800 /obj/item/organ/internal/heart/gland/ventcrawling/activate() to_chat(owner, "You feel very stretchy.") @@ -128,6 +192,8 @@ cooldown_high = 2400 uses = 1 icon_state = "viral" + mind_control_uses = 1 + mind_control_duration = 1800 /obj/item/organ/internal/heart/gland/viral/activate() to_chat(owner, "You feel sick.") @@ -153,19 +219,24 @@ /obj/item/organ/internal/heart/gland/spiderman cooldown_low = 450 cooldown_high = 900 - uses = 10 + uses = -1 icon_state = "spider" + mind_control_uses = 2 + mind_control_duration = 2400 /obj/item/organ/internal/heart/gland/spiderman/activate() to_chat(owner, "You feel something crawling in your skin.") owner.faction |= "spiders" - new /obj/structure/spider/spiderling(owner.loc) + var/obj/structure/spider/spiderling/S = new(owner.loc) + S.master_commander = owner /obj/item/organ/internal/heart/gland/egg cooldown_low = 300 cooldown_high = 400 uses = -1 icon_state = "egg" + mind_control_uses = 2 + mind_control_duration = 1800 /obj/item/organ/internal/heart/gland/egg/activate() to_chat(owner, "You lay an egg!") @@ -173,6 +244,50 @@ egg.reagents.add_reagent("sacid",20) egg.desc += " It smells bad." +/obj/item/organ/internal/heart/gland/electric + cooldown_low = 800 + cooldown_high = 1200 + uses = -1 + mind_control_uses = 2 + mind_control_duration = 900 + +/obj/item/organ/internal/heart/gland/electric/insert(mob/living/carbon/M, special = 0) + ..() + if(ishuman(owner)) + owner.gene_stability += GENE_INSTABILITY_MODERATE // give them this gene for free + owner.dna.SetSEState(SHOCKIMMUNITYBLOCK, TRUE) + genemutcheck(owner, SHOCKIMMUNITYBLOCK, null, MUTCHK_FORCED) + +/obj/item/organ/internal/heart/gland/electric/remove(mob/living/carbon/M, special = 0) + if(ishuman(owner)) + owner.gene_stability -= GENE_INSTABILITY_MODERATE // but return it to normal once it's removed + owner.dna.SetSEState(SHOCKIMMUNITYBLOCK, FALSE) + genemutcheck(owner, SHOCKIMMUNITYBLOCK, null, MUTCHK_FORCED) + return ..() + +/obj/item/organ/internal/heart/gland/electric/activate() + owner.visible_message("[owner]'s skin starts emitting electric arcs!",\ + "You feel electric energy building up inside you!") + playsound(get_turf(owner), "sparks", 100, 1, -1) + addtimer(CALLBACK(src, .proc/zap), rand(30, 100)) + +/obj/item/organ/internal/heart/gland/electric/proc/zap() + tesla_zap(owner, 4, 8000) + playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, 1) + +/obj/item/organ/internal/heart/gland/chem + cooldown_low = 50 + cooldown_high = 50 + uses = -1 + mind_control_uses = 3 + mind_control_duration = 1200 + +/obj/item/organ/internal/heart/gland/chem/activate() + var/chem_to_add = get_random_reagent_id() + owner.reagents.add_reagent(chem_to_add, 2) + owner.adjustToxLoss(-2, TRUE, TRUE) + ..() + /obj/item/organ/internal/heart/gland/bloody cooldown_low = 200 cooldown_high = 400 @@ -257,6 +372,8 @@ cooldown_high = 1800 origin_tech = "materials=4;biotech=4;plasmatech=6;abductor=3" uses = -1 + mind_control_uses = 1 + mind_control_duration = 800 /obj/item/organ/internal/heart/gland/plasma/activate() spawn(0) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 10cd5473279..0e8c4d3c409 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -54,21 +54,22 @@ dat += "Agent Vest
" dat += "Radio Silencer
" dat += "Science Tool
" + dat += "Mental Interface Device
" else dat += "NO EXPERIMENT MACHINE DETECTED
" - if(pad!=null) + if(pad) dat += "Emergency Teleporter System." dat += "Consider using primary observation console first." dat += "Activate Teleporter
" - if(gizmo!=null && gizmo.marked!=null) + if(gizmo && gizmo.marked) dat += "Retrieve Mark
" else dat += "Retrieve Mark
" else dat += "NO TELEPAD DETECTED
" - if(vest!=null) + if(vest) dat += "

Agent Vest Mode


" var/mode = vest.mode if(mode == VEST_STEALTH) @@ -100,13 +101,14 @@ else if(href_list["flip_vest"]) FlipVest() else if(href_list["toggle_vest"]) - toggle_vest() + if(vest) + vest.toggle_nodrop() else if(href_list["select_disguise"]) SelectDisguise() else if(href_list["dispense"]) switch(href_list["dispense"]) if("baton") - Dispense(/obj/item/abductor_baton,cost=2) + Dispense(/obj/item/abductor_baton, cost = 2) if("helmet") Dispense(/obj/item/clothing/head/helmet/abductor) if("silencer") @@ -115,19 +117,21 @@ Dispense(/obj/item/abductor/gizmo) if("vest") Dispense(/obj/item/clothing/suit/armor/abductor/vest) + if("mind_device") + Dispense(/obj/item/abductor/mind_device, cost = 2) updateUsrDialog() /obj/machinery/abductor/console/proc/TeleporterRetrieve() - if(gizmo!=null && pad!=null && gizmo.marked) + if(pad && gizmo && gizmo.marked) pad.Retrieve(gizmo.marked) /obj/machinery/abductor/console/proc/TeleporterSend() - if(pad!=null) + if(pad) pad.Send() /obj/machinery/abductor/console/proc/FlipVest() - if(vest!=null) + if(vest) vest.flip_mode() /obj/machinery/abductor/console/proc/SelectDisguise(remote = 0) @@ -175,21 +179,36 @@ return disguises[entry.name] = entry +/obj/machinery/abductor/console/proc/AddGizmo(obj/item/abductor/gizmo/G) + if(G == gizmo && G.console == src) + return FALSE + + if(G.console) + G.console.gizmo = null + + gizmo = G + G.console = src + return TRUE + +/obj/machinery/abductor/console/proc/AddVest(obj/item/clothing/suit/armor/abductor/vest/V) + if(vest == V) + return FALSE + + for(var/obj/machinery/abductor/console/C in machines) + if(C.vest == V) + C.vest = null + break + + vest = V + return TRUE + /obj/machinery/abductor/console/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/abductor/gizmo)) - var/obj/item/abductor/gizmo/G = O + if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O)) to_chat(user, "You link the tool to the console.") - gizmo = G - G.console = src - else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest)) - var/obj/item/clothing/suit/armor/abductor/vest/V = O + else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) to_chat(user, "You link the vest to the console.") - if(istype(vest)) - if(vest.flags & NODROP) - toggle_vest() - vest = V else - ..() + return ..() /obj/machinery/abductor/console/proc/Dispense(item,cost=1) if(experiment && experiment.credits >= cost) @@ -201,10 +220,4 @@ else new item(src.loc) else - atom_say("Insufficent data!") - -/obj/machinery/abductor/console/proc/toggle_vest() - vest.flags ^= NODROP - var/mob/M = vest.loc - if(istype(M)) - to_chat(M, "[src] is now [vest.flags & NODROP ? "locked" : "unlocked"].") \ No newline at end of file + atom_say("Insufficent data!") \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index 9e07c9c04a9..1a377667650 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -3,8 +3,8 @@ desc = "A tank filled with replacement organs" icon = 'icons/obj/abductor.dmi' icon_state = "dispenser" - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE var/list/gland_types var/list/gland_colors var/list/amounts @@ -49,7 +49,7 @@ var/g_color = gland_colors[i] var/amount = amounts[i] dat += "[amount]" - if(item_count == 3) // Three boxes per line + if(item_count == 4) // Three boxes per line dat +="

" item_count = 0 var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200) @@ -68,7 +68,7 @@ if(gland_types[i] == W.type) amounts[i]++ else - ..() + return ..() /obj/machinery/abductor/gland_dispenser/Topic(href, href_list) if(..()) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 3b339ad7c40..53969aaf7d1 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -3,8 +3,8 @@ desc = "A large man-sized tube sporting a complex array of surgical apparatus." icon = 'icons/obj/abductor.dmi' icon_state = "experiment-open" - anchored = 1 - density = 1 + anchored = TRUE + density = TRUE var/points = 0 var/credits = 0 var/list/history = list() @@ -137,6 +137,7 @@ to_chat(H, "You feel intensely watched.") sleep(5) to_chat(H, "Your mind snaps!") + to_chat(H, "You can't remember how you got here...") var/objtype = pick(subtypesof(/datum/objective/abductee/)) var/datum/objective/abductee/O = new objtype() ticker.mode.abductees += H.mind diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index a7fcc6874a2..96693a0d086 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,7 +1,7 @@ var/global/default_martial_art = new/datum/martial_art /mob/living/carbon/human - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD,GLAND_HUD) //Marking colour and style var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000. diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm index d50be2e73e8..c205cb6d033 100644 --- a/code/modules/mob/living/carbon/human/species/abductor.dm +++ b/code/modules/mob/living/carbon/human/species/abductor.dm @@ -36,4 +36,11 @@ H.gender = NEUTER H.languages.Cut() //Under no condition should you be able to speak any language H.add_language("Abductor Mindlink") //other than over the abductor's own mindlink - return ..() \ No newline at end of file + var/datum/atom_hud/abductor_hud = huds[DATA_HUD_ABDUCTOR] + abductor_hud.add_hud_to(H) + return ..() + +/datum/species/abductor/remove_abilities(mob/living/carbon/human/H) + ..() + var/datum/atom_hud/abductor_hud = huds[DATA_HUD_ABDUCTOR] + abductor_hud.remove_hud_from(H) \ No newline at end of file diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index f3fe28315f6..234c5ac2274 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -342,7 +342,8 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #ff0000;} .shadowling {color: #3b2769;} .vulpkanin {color: #B97A57;} -.abductor {color: #800080;} +.abductor {color: #800080; font-style: italic;} +.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;} .rough {font-family: 'Trebuchet MS', cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .cult {color: #800080; font-weight: bold; font-style: italic;} diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 760e82458d8f47194475afd7cc7a9a4715b9c613..b4dea0cfa36482c56dac07680a4d185bab5034ab 100644 GIT binary patch literal 14695 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 E076+;R{#J2 literal 14509 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 ZQ0Z&TPjdS7Qy}0UOkL-0nW|Or{{d5ny{Z5J diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 2adfdba567084bd918068fdb5515190fe7b6d6b1..f20b190ce76189c881954183e307e57edade92b6 100644 GIT binary patch delta 8730 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 T@ Date: Tue, 24 Jul 2018 23:14:05 -0400 Subject: [PATCH 04/32] new tools --- _maps/map_files/cyberiad/z2.dmm | 5 +-- .../miniantags/abduction/abduction_gear.dm | 21 ++++++++++++ .../research/designs/medical_designs.dm | 30 ++++++++++++++++++ icons/obj/abductor.dmi | Bin 57606 -> 58701 bytes 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 4c9573b8e7e..e7bd86f366e 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -919,6 +919,7 @@ "rI" = (/obj/machinery/computer/security/telescreen{name = "Special Ops. Monitor"; desc = "Used for watching the Special Ops."; network = list("ERT")},/obj/structure/table/wood,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops) "rJ" = (/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = -6; pixel_y = 6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; pixel_y = -6; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -6; req_access_txt = "114"},/obj/structure/table/wood,/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops) "rK" = (/turf/unsimulated/wall/splashscreen,/area/start) +"rL" = (/obj/structure/table/abductor,/obj/item/bonegel/alien,/obj/item/bonesetter/alien,/obj/item/FixOVein/alien,/obj/item/surgicaldrill/alien,/obj/item/circular_saw/alien,/turf/unsimulated/floor/abductor,/area/abductor_ship) "sq" = (/turf/unsimulated/wall,/area/centcom/control) "sr" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "ss" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) @@ -1731,7 +1732,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwkykxkxkxkAkzaNkwkDkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGkFkIkHkNkMaNkEkGkOkIkPkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLdacZDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVrLljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNjQjPjSjRjTaNaNaNjQjPjSjRjTaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1739,7 +1740,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkwlRkxkxkxkAkzaNkwlSkxkxkxkAkzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkEkGlTkIlUkNkMaNkEkGlVkIlYkNkMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKlKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVrLljlmllaNkUlikVrLljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHmsIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index f16028c35ba..97e0d8b8860 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -639,6 +639,27 @@ Congratulations! You are now trained for invasive xenobiology research!"} origin_tech = "materials=2;biotech=2;abductor=2" toolspeed = 0.25 +/obj/item/bonegel/alien + name = "alien bone gel" + desc = "It smells like duct tape." + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 + +/obj/item/FixOVein/alien + name = "alien FixOVein" + desc = "Bloodless aliens would totally know how to stop internal bleeding...right?" + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 + +/obj/item/bonesetter/alien + name = "alien bone setter" + desc = "You're not sure you want to know whether or not aliens have bones." + icon = 'icons/obj/abductor.dmi' + origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 + /obj/item/clothing/head/helmet/abductor name = "agent headgear" desc = "Abduct with style - spiky style. Prevents digital tracking." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 638a614fc85..a7fe42063ff 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -245,6 +245,36 @@ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) category = list("Medical") +/datum/design/alienbonegel + name = "Alien Bone Gel" + desc = "Advanced bone gel obtained through Abductor technology." + id = "alien_bonegel" + req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/bonegel/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) + category = list("Medical") + +/datum/design/alienbonesetter + name = "Alien Bone Setter" + desc = "An advanced bone setter obtained through Abductor technology." + id = "alien_bonesetter" + req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/bonesetter/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) + category = list("Medical") + +/datum/design/alienfixovein + name = "Alien FixOVein" + desc = "An advanced FixOVein obtained through Abductor technology." + id = "alien_fixovein" + req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/FixOVein/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500) + category = list("Medical") + ///////////////////////////////////////// //////////Cybernetic Implants//////////// ///////////////////////////////////////// diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index f20b190ce76189c881954183e307e57edade92b6..f556369cf69ab9f3a4360801e6baf58f87578e7b 100644 GIT binary patch delta 9817 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 F{s$qz(*pni delta 8714 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 b_1?d1y`jvb+Z^x^fIiAkHRMZV&4d0QqN3sC From b2d0bb1c0bd8b6216612fb536b3f499b5cfe5153 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sat, 7 Jul 2018 11:49:51 -0700 Subject: [PATCH 05/32] Fixes maploading so that the cyberiad and space hotel load cleanly again --- code/ATMOSPHERICS/atmospherics.dm | 5 +- code/LINDA/LINDA_fire.dm | 2 +- code/LINDA/LINDA_turf_tile.dm | 2 +- code/__HELPERS/unsorted.dm | 6 ++- code/controllers/Processes/npcpool.dm | 3 ++ code/controllers/subsystem/air.dm | 32 ++++++++---- code/controllers/subsystem/atoms.dm | 24 ++++++--- code/datums/helper_datums/map_template.dm | 4 +- code/game/atoms_movable.dm | 11 ++--- .../effects/spawners/random_barrier.dm | 2 +- .../effects/spawners/random_spawners.dm | 2 +- .../objects/effects/spawners/windowspawner.dm | 49 ++++++++++--------- code/game/objects/items/weapons/cards_ids.dm | 2 +- code/game/world.dm | 4 +- code/modules/awaymissions/map_rng.dm | 2 +- code/modules/awaymissions/maploader/reader.dm | 3 -- .../mission_code/spacehotel_npcs.dm | 8 +-- code/modules/awaymissions/snpc.dm | 12 +++-- code/modules/mining/mine_items.dm | 2 +- .../carbon/human/interactive/interactive.dm | 14 ++++-- code/modules/mob/living/living.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob.dm | 2 +- .../mapGeneratorModules/helpers.dm | 2 +- code/modules/space_management/space_level.dm | 47 ++++++++---------- .../surgery/organs/subtypes/standard.dm | 4 +- 26 files changed, 139 insertions(+), 109 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 3fcf79fe8d8..ede0351993b 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -33,7 +33,6 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) if(!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100) ..() - SSair.atmos_machinery += src if(!pipe_color) pipe_color = color @@ -42,6 +41,10 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) if(!pipe_color_check(pipe_color)) pipe_color = null +/obj/machinery/atmospherics/Initialize() + . = ..() + SSair.atmos_machinery += src + /obj/machinery/atmospherics/proc/atmos_init() if(can_unwrench) stored = new(src, make_from = src) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index 11ecc8f10e3..df4e8b47f31 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -181,4 +181,4 @@ /obj/effect/hotspot/Crossed(mob/living/L) ..() if(isliving(L)) - L.fire_act() \ No newline at end of file + L.fire_act() diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index a8f35105cd8..f1475bb2605 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -552,4 +552,4 @@ turf/simulated/proc/radiate_to_spess() //Radiate excess tile heat to space else if(!air.check_turf_total(enemy_tile)) excited = 1 - SSair.active_turfs |= src \ No newline at end of file + SSair.active_turfs |= src diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 35d271461df..1a9ccbe6c2b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1497,6 +1497,10 @@ var/mob/dview/dview_mob = new /mob/dview/New() //For whatever reason, if this isn't called, then BYOND will throw a type mismatch runtime when attempting to add this to the mobs list. -Fox +/mob/dview/Destroy() + // should never be deleted + return QDEL_HINT_LETMELIVE + /proc/IsValidSrc(A) if(istype(A, /datum)) var/datum/D = A @@ -1962,4 +1966,4 @@ var/mob/dview/dview_mob = new CRASH(msg) /proc/pass() - return \ No newline at end of file + return diff --git a/code/controllers/Processes/npcpool.dm b/code/controllers/Processes/npcpool.dm index 553801b42b8..945938852b4 100644 --- a/code/controllers/Processes/npcpool.dm +++ b/code/controllers/Processes/npcpool.dm @@ -31,6 +31,9 @@ DECLARE_GLOBAL_CONTROLLER(npcpool, npc_master) if(istype(toInsert, /mob/living/carbon/human/interactive)) botPool_l |= toInsert +/datum/controller/process/npcpool/proc/removeBot(toRemove) + botPool_l -= toRemove + /datum/controller/process/npcpool/statProcess() ..() stat(null, "T [botPool_l.len + botPool_l_non.len] | D [needsDelegate.len] | A [needsAssistant.len + needsHelp_non.len] | U [canBeUsed.len + canBeUsed_non.len]") diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index d46ec164e35..9f21eb23e2d 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -66,8 +66,8 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/Initialize(timeofday) setup_overlays() // Assign icons and such for gas-turf-overlays setup_allturfs() - setup_atmos_machinery() - setup_pipenets() + setup_atmos_machinery(machines) + setup_pipenets(machines) ..() @@ -316,11 +316,17 @@ SUBSYSTEM_DEF(air) ET.excited = 1 . += ET -/datum/controller/subsystem/air/proc/setup_atmos_machinery() +/datum/controller/subsystem/air/proc/setup_atmos_machinery(var/list/machines_to_init) var/watch = start_watch() - var/count = 0 log_startup_progress("Initializing atmospherics machinery...") - for(var/obj/machinery/atmospherics/A in machines) + var/count = _setup_atmos_machinery(machines_to_init) + log_startup_progress(" Initialized [count] atmospherics machines in [stop_watch(watch)]s.") + +// this underscored variant is so that we can have a means of late initing +// atmos machinery without a loud announcement to the world +/datum/controller/subsystem/air/proc/_setup_atmos_machinery(var/list/machines_to_init) + var/count = 0 + for(var/obj/machinery/atmospherics/A in machines_to_init) A.atmos_init() count++ if(istype(A, /obj/machinery/atmospherics/unary/vent_pump)) @@ -329,19 +335,25 @@ SUBSYSTEM_DEF(air) else if(istype(A, /obj/machinery/atmospherics/unary/vent_scrubber)) var/obj/machinery/atmospherics/unary/vent_scrubber/T = A T.broadcast_status() - log_startup_progress(" Initialized [count] atmospherics machines in [stop_watch(watch)]s.") + return count //this can't be done with setup_atmos_machinery() because // all atmos machinery has to initalize before the first // pipenet can be built. -/datum/controller/subsystem/air/proc/setup_pipenets() +/datum/controller/subsystem/air/proc/setup_pipenets(var/list/pipes) var/watch = start_watch() - var/count = 0 log_startup_progress("Initializing pipe networks...") - for(var/obj/machinery/atmospherics/machine in machines) + var/count = _setup_pipenets(pipes) + log_startup_progress(" Initialized [count] pipenets in [stop_watch(watch)]s.") + +// An underscored wrapper that exists for the same reason +// the machine init wrapper does +/datum/controller/subsystem/air/proc/_setup_pipenets(var/list/pipes) + var/count = 0 + for(var/obj/machinery/atmospherics/machine in pipes) machine.build_network() count++ - log_startup_progress(" Initialized [count] pipenets in [stop_watch(watch)]s.") + return count /datum/controller/subsystem/air/proc/setup_overlays() plmaster = new /obj/effect/overlay() diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index c3943ea9163..64d83a80c6b 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(atoms) -/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms, noisy = TRUE) if(initialized == INITIALIZATION_INSSATOMS) return @@ -32,7 +32,10 @@ SUBSYSTEM_DEF(atoms) LAZYINITLIST(late_loaders) var/watch = start_watch() - log_startup_progress("Initializing atoms...") + if(noisy) + log_startup_progress("Initializing atoms...") + else + log_debug("Initializing atoms...") var/count var/list/mapload_arg = list(TRUE) if(atoms) @@ -52,18 +55,27 @@ SUBSYSTEM_DEF(atoms) ++count CHECK_TICK - log_startup_progress(" Initialized [count] atoms in [stop_watch(watch)]s") + if(noisy) + log_startup_progress(" Initialized [count] atoms in [stop_watch(watch)]s") + else + log_debug(" Initialized [count] atoms in [stop_watch(watch)]s") pass(count) initialized = INITIALIZATION_INNEW_REGULAR if(late_loaders.len) watch = start_watch() - log_startup_progress("Late-initializing atoms...") + if(noisy) + log_startup_progress("Late-initializing atoms...") + else + log_debug("Late-initializing atoms...") for(var/I in late_loaders) var/atom/A = I A.LateInitialize() - log_startup_progress(" Late initialized [late_loaders.len] atoms in [stop_watch(watch)]s") + if(noisy) + log_startup_progress(" Late initialized [late_loaders.len] atoms in [stop_watch(watch)]s") + else + log_debug(" Late initialized [late_loaders.len] atoms in [stop_watch(watch)]s") late_loaders.Cut() if(atoms) @@ -117,4 +129,4 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INNEW_MAPLOAD) InitializeAtoms() old_initialized = SSatoms.old_initialized - BadInitializeCalls = SSatoms.BadInitializeCalls \ No newline at end of file + BadInitializeCalls = SSatoms.BadInitializeCalls diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index 1ecf89de0fe..0352c932a5a 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -58,10 +58,10 @@ if(ST_bot_left == null || ST_top_right == null) log_runtime(EXCEPTION("One of the smoothing corners is bust"), src) + space_manager.remove_dirt(placement.z) late_setup_level( block(bot_left, top_right), block(ST_bot_left, ST_top_right)) - space_manager.remove_dirt(placement.z) log_game("[name] loaded at [min_x],[min_y],[placement.z]") return 1 @@ -175,4 +175,4 @@ var/datum/map_template/vr/V = new vr_type() vr_templates[V.id] = V - map_templates[V.id] = V \ No newline at end of file + map_templates[V.id] = V diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 7ab561f0814..a847350cb3d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -29,11 +29,10 @@ areaMaster = get_area_master(src) /atom/movable/attempt_init() - if(ticker && ticker.current_state >= GAME_STATE_SETTING_UP) - var/turf/T = get_turf(src) - if(T && space_manager.is_zlevel_dirty(T.z)) - space_manager.postpone_init(T.z, src) - return + var/turf/T = get_turf(src) + if(T && SSatoms.initialized != INITIALIZATION_INSSATOMS && space_manager.is_zlevel_dirty(T.z)) + space_manager.postpone_init(T.z, src) + return . = ..() @@ -429,4 +428,4 @@ flick_overlay(I, viewing, 5) // 5 ticks/half a second // And animate the attack! - animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) \ No newline at end of file + animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) diff --git a/code/game/objects/effects/spawners/random_barrier.dm b/code/game/objects/effects/spawners/random_barrier.dm index 3fd81bcf9b0..e337df8df27 100644 --- a/code/game/objects/effects/spawners/random_barrier.dm +++ b/code/game/objects/effects/spawners/random_barrier.dm @@ -11,7 +11,7 @@ // This needs to come before the initialization wave because // the thing it creates might need to be initialized too -/obj/effect/spawner/random_barrier/New() +/obj/effect/spawner/random_barrier/Initialize() . = ..() var/turf/T = get_turf(src) if(!T) diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 621c8799cc2..4e381c96c3b 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -12,7 +12,7 @@ // This needs to come before the initialization wave because // the thing it creates might need to be initialized too -/obj/effect/spawner/random_spawners/New() +/obj/effect/spawner/random_spawners/Initialize() . = ..() var/turf/T = get_turf(src) if(!T) diff --git a/code/game/objects/effects/spawners/windowspawner.dm b/code/game/objects/effects/spawners/windowspawner.dm index 6d271039070..e6e2aaa1a21 100644 --- a/code/game/objects/effects/spawners/windowspawner.dm +++ b/code/game/objects/effects/spawners/windowspawner.dm @@ -8,33 +8,34 @@ anchored = 1 // No sliding out while you prime /obj/effect/spawner/window/Initialize() - ..() - spawn(0) - var/turf/T = get_turf(src) - for(var/obj/structure/grille/G in get_turf(src)) - // Complain noisily - log_runtime(EXCEPTION("Extra grille on turf: ([T.x],[T.y],[T.z])"), src) - qdel(G) //just in case mappers don't know what they are doing + . = ..() + var/turf/T = get_turf(src) + for(var/obj/structure/grille/G in get_turf(src)) + // Complain noisily + log_runtime(EXCEPTION("Extra grille on turf: ([T.x],[T.y],[T.z])"), src) + qdel(G) //just in case mappers don't know what they are doing - if(!useFull) - for(var/cdir in cardinal) - for(var/obj/effect/spawner/window/WS in get_step(src,cdir)) - cdir = null - break - if(!cdir) continue - var/obj/structure/window/WI = new windowtospawn(get_turf(src)) - WI.dir = cdir - else - var/obj/structure/window/W = new windowtospawn(get_turf(src)) - W.dir = SOUTHWEST + if(!useFull) + for(var/cdir in cardinal) + for(var/obj/effect/spawner/window/WS in get_step(src,cdir)) + cdir = null + break + if(!cdir) continue + var/obj/structure/window/WI = new windowtospawn(get_turf(src)) + WI.dir = cdir + else + var/obj/structure/window/W = new windowtospawn(get_turf(src)) + W.dir = SOUTHWEST - if(useGrille) - new /obj/structure/grille(get_turf(src)) + if(useGrille) + new /obj/structure/grille(get_turf(src)) - src.air_update_turf(1) //atmos can pass otherwise - - spawn(10) - qdel(src) + src.air_update_turf(1) //atmos can pass otherwise + // Give some time for nearby window spawners to initialize + spawn(10) + qdel(src) + // why is this line a no-op + // QDEL_IN(src, 10) /obj/effect/spawner/window/reinforced diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 38fccdf4437..daaa5c3e4c4 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -86,7 +86,7 @@ icon_state = "id" item_state = "card-id" var/mining_points = 0 //For redeeming at mining equipment lockers - var/access = list() + var/list/access = list() var/registered_name = "Unknown" // The name registered_name on the card slot_flags = SLOT_ID var/untrackable // Can not be tracked by AI's diff --git a/code/game/world.dm b/code/game/world.dm index ffb9dfb1ecd..516346aeca3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -21,14 +21,13 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG src.update_status() + space_manager.initialize() //Before the MC starts up . = ..() // Create robolimbs for chargen. populate_robolimb_list() - space_manager.initialize() //Before the MC starts up - Master.Initialize(10, FALSE) processScheduler = new @@ -494,4 +493,3 @@ proc/establish_db_connection() return 1 #undef FAILED_DB_CONNECTION_CUTOFF - diff --git a/code/modules/awaymissions/map_rng.dm b/code/modules/awaymissions/map_rng.dm index 7618996fdf9..77954eafb9f 100644 --- a/code/modules/awaymissions/map_rng.dm +++ b/code/modules/awaymissions/map_rng.dm @@ -20,7 +20,7 @@ template = map_templates[template_name] /obj/effect/landmark/map_loader/Initialize() - ..() + . = ..() if(template) load(template) diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 5ff625544fd..816007d4ff8 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -57,8 +57,6 @@ var/global/dmm_suite/preloader/_preloader = new var/list/grid_models = list() var/key_len = 0 - - var/dmm_suite/loaded_map/LM = new // This try-catch is used as a budget "Finally" clause, as the dirt count // needs to be reset @@ -128,7 +126,6 @@ var/global/dmm_suite/preloader/_preloader = new bounds[MAP_MAXY] = max(bounds[MAP_MAXY], min(ycrd, world.maxy)) var/maxx = xcrdStart - log_debug("[xcrdStart]") if(measureOnly) for(var/line in gridLines) maxx = max(maxx, xcrdStart + length(line) / key_len - 1) diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm index 5426516f86b..2a524ab738c 100644 --- a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm +++ b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm @@ -4,7 +4,7 @@ chattyness = SNPC_CHANCE_TALK / 4 /mob/living/carbon/human/interactive/away/hotel/Initialize(mapload) - ..(loc, /datum/species/skrell) + . = ..(mapload, /datum/species/skrell) /mob/living/carbon/human/interactive/away/hotel/doSetup() ..() @@ -24,12 +24,6 @@ for(var/obj/item/I in get_all_slots()) I.flags |= NODROP - // FIXME(crazylemon) a hack to prevent guards from running around with an - // extra security jumpsuit like a goof - for(var/obj/item/clothing/under/U in get_all_slots()) - if(w_uniform != U) - qdel(U) - /mob/living/carbon/human/interactive/away/hotel/guard/KnockOut() // you'll never take me alive (this triggers the implant) emote("deathgasp") diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm index 8dc2b1b31e9..04e3bf19b8e 100644 --- a/code/modules/awaymissions/snpc.dm +++ b/code/modules/awaymissions/snpc.dm @@ -5,14 +5,18 @@ var/home_z /mob/living/carbon/human/interactive/away/Initialize(mapload) - ..() + . = ..() TRAITS |= TRAIT_ROBUST faction += "away" /mob/living/carbon/human/interactive/away/random() - if(ispath(override_under, /obj/item/clothing/under)) - equip_to_slot(new override_under(src), slot_w_uniform) ..() + // a little hacky but it should prevent doubled uniforms + if(ispath(override_under, /obj/item/clothing/under)) + var/old_under = w_uniform + w_uniform = null + equip_to_slot(new override_under(src), slot_w_uniform) + qdel(old_under) /mob/living/carbon/human/interactive/away/doSetup() ..() @@ -78,4 +82,4 @@ if(living < squad_size && !length(viewers(src, world.view))) var/mob/living/carbon/human/interactive/away/A = new squad_type(loc) squad += A - A.squad_member = 1 \ No newline at end of file + A.squad_member = 1 diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 0a151babe67..c4487d61948 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -523,7 +523,7 @@ icon_state = "fan_tiny" buildstackamount = 2 -/obj/structure/fans/New(loc) +/obj/structure/fans/Initialize(loc) ..() air_update_turf(1) diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index fe50206aedc..763a5ef15be 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -245,7 +245,7 @@ MYID.age = age MYID.registered_name = real_name MYID.photo = get_id_photo(src) - MYID.access = Path_ID.access // Automatons have strange powers... strange indeed + MYID.access = Path_ID.access.Copy() // Automatons have strange powers... strange indeed RPID = new(src) RPID.name = "[real_name]'s ID Card ([alt_title])" @@ -257,7 +257,10 @@ RPID.photo = get_id_photo(src) RPID.access = myjob.get_access() - equip_to_slot_or_del(MYID, slot_wear_id) + if(wear_id) + qdel(wear_id) + if(!equip_to_slot_or_del(MYID, slot_wear_id)) + create_attack_log("Deleted ID due to slot contention") if(wear_pda) MYPDA = wear_pda else @@ -403,8 +406,12 @@ if(!hud_used) hud_used = new /datum/hud/human(src) -/mob/living/carbon/human/interactive/Initialize(mapload) +/mob/living/carbon/human/interactive/Initialize() ..() + return INITIALIZE_HINT_LATELOAD + +/mob/living/carbon/human/interactive/LateInitialize() + . = ..() snpc_list += src create_mob_hud() @@ -427,6 +434,7 @@ /mob/living/carbon/human/interactive/Destroy() hear_radio_list -= src snpc_list -= src + npc_master.removeBot(src) return ..() /mob/living/carbon/human/interactive/proc/retalTarget(mob/living/target) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ee23633f4b6..4cfdc7bb1f4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,4 +1,4 @@ -/mob/living/New() +/mob/living/Initialize() . = ..() var/datum/atom_hud/data/human/medical/advanced/medhud = huds[DATA_HUD_MEDICAL_ADVANCED] medhud.add_to_hud(src) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 57fe64f3265..cc50f2aa56e 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -79,7 +79,7 @@ var/death_sound = null //The sound played on death -/mob/living/simple_animal/New() +/mob/living/simple_animal/Initialize() ..() simple_animal_list += src verbs -= /mob/verb/observe diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 84f9503066a..fc09105e948 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -24,7 +24,7 @@ ..() return QDEL_HINT_HARDDEL -/mob/New() +/mob/Initialize() mob_list += src if(stat == DEAD) dead_mob_list += src diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 11873b5acdf..3e43c5638d1 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -38,4 +38,4 @@ if(get_step(T,direction) in mother.map) continue return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm index 38ec849179a..e2c18699a64 100644 --- a/code/modules/space_management/space_level.dm +++ b/code/modules/space_management/space_level.dm @@ -133,6 +133,10 @@ if(SELFLOOPING) link_to_self() // `link_to_self` is defined in space_transitions.dm +var/list/atmos_machine_typecache = typecacheof(/obj/machinery/atmospherics) +var/list/cable_typecache = typecacheof(/obj/structure/cable) +var/list/maploader_typecache = typecacheof(/obj/effect/landmark/map_loader) + /datum/space_level/proc/resume_init() if(dirt_count > 0) throw EXCEPTION("Init told to resume when z-level still dirty. Z level: '[zpos]'") @@ -140,23 +144,15 @@ log_debug("Beginning initialization!") var/list/our_atoms = init_list // OURS NOW!!! (Keeping this list to ourselves will prevent hijack) init_list = list() - var/list/late_maps = list() - var/list/pipes = list() - var/list/cables = list() var/watch = start_watch() - for(var/schmoo in our_atoms) - var/atom/movable/AM = schmoo - if(AM) // to catch stuff like the nuke disk that no longer exists - - // This can mess with our state - we leave these for last - if(istype(AM, /obj/effect/landmark/map_loader)) - late_maps.Add(AM) - continue - AM.Initialize(TRUE) - if(istype(AM, /obj/machinery/atmospherics)) - pipes.Add(AM) - else if(istype(AM, /obj/structure/cable)) - cables.Add(AM) + listclearnulls(our_atoms) + var/list/late_maps = typecache_filter_list(our_atoms, maploader_typecache) + var/list/pipes = typecache_filter_list(our_atoms, atmos_machine_typecache) + var/list/cables = typecache_filter_list(our_atoms, cable_typecache) + // If we don't carefully add dirt around the map templates, bad stuff happens + // so we separate them out here + our_atoms -= late_maps + SSatoms.InitializeAtoms(our_atoms, FALSE) log_debug("Primary initialization finished in [stop_watch(watch)]s.") our_atoms.Cut() if(pipes.len) @@ -168,13 +164,14 @@ /datum/space_level/proc/do_pipes(list/pipes) var/watch = start_watch() - log_debug("Building pipenets on z-level '[zpos]'!") - for(var/schmoo in pipes) - var/obj/machinery/atmospherics/machine = schmoo - if(machine) - machine.build_network() + log_debug("Initializing atmos machines on z-level '[zpos]'!") + var/init_count = SSair._setup_atmos_machinery(pipes) + log_debug("Initialized [init_count] machines, took [stop_watch(watch)]s") + watch = start_watch() + log_debug("Initializing pipe networks on z-level '[zpos]'!") + init_count = SSair._setup_pipenets(pipes) + log_debug("Initialized pipenets for [init_count] machines, took [stop_watch(watch)]s") pipes.Cut() - log_debug("Took [stop_watch(watch)]s") /datum/space_level/proc/do_cables(list/cables) var/watch = start_watch() @@ -187,10 +184,8 @@ var/watch = start_watch() log_debug("Loading map templates on z-level '[zpos]'!") space_manager.add_dirt(zpos) // Let's not repeatedly resume init for each template - for(var/schmoo in late_maps) - var/obj/effect/landmark/map_loader/ML = schmoo - if(ML) - ML.Initialize() + for(var/atom/movable/AM in late_maps) + AM.Initialize() late_maps.Cut() space_manager.remove_dirt(zpos) log_debug("Took [stop_watch(watch)]s") diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index c83678a71a5..6c217bebfc4 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -136,9 +136,9 @@ if(owner.gloves) owner.unEquip(owner.gloves) if(owner.l_hand) - owner.unEquip(owner.l_hand,1) + owner.unEquip(owner.l_hand) if(owner.r_hand) - owner.unEquip(owner.r_hand,1) + owner.unEquip(owner.r_hand) . = ..() From bbe8b754a754eba16bd06db5fcc9c8d50fe5eb5f Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Fri, 13 Jul 2018 12:32:09 -0700 Subject: [PATCH 06/32] Undoes the hand change --- code/modules/surgery/organs/subtypes/standard.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index 6c217bebfc4..0e4ecbe2f98 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -136,9 +136,9 @@ if(owner.gloves) owner.unEquip(owner.gloves) if(owner.l_hand) - owner.unEquip(owner.l_hand) + owner.unEquip(owner.l_hand, TRUE) if(owner.r_hand) - owner.unEquip(owner.r_hand) + owner.unEquip(owner.r_hand, TRUE) . = ..() From fc89432b3654f81c35eae8851759c694d95ccec7 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 25 Jul 2018 00:31:57 -0400 Subject: [PATCH 07/32] update --- code/__DEFINES/misc.dm | 2 + code/datums/diseases/_disease.dm | 2 + .../gamemodes/miniantags/abduction/gland.dm | 47 +++++++++++++------ .../food_and_drinks/food/foods/meat.dm | 10 ++++ 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 21bcd079d8b..c730d883e28 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -371,3 +371,5 @@ #define GET_RANDOM_JOB 0 #define BE_ASSISTANT 1 #define RETURN_TO_LOBBY 2 + +#define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") \ No newline at end of file diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 571a0d7aa7b..9414a079e80 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -1,4 +1,6 @@ +#define VIRUS_SYMPTOM_LIMIT 6 + //Visibility Flags #define HIDDEN_SCANNER 1 #define HIDDEN_PANDEMIC 2 diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 4976fbc412b..3ff2f678fcf 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -59,6 +59,7 @@ return to_chat(owner, "You feel the compulsion fade, and you completely forget about your previous orders.") active_mind_control = FALSE + update_gland_hud() /obj/item/organ/internal/heart/gland/remove(var/mob/living/carbon/M, special = 0) active = 0 @@ -197,20 +198,39 @@ /obj/item/organ/internal/heart/gland/viral/activate() to_chat(owner, "You feel sick.") - var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis) - var/datum/disease/D = new virus_type() - D.carrier = TRUE - owner.viruses += D - D.affected_mob = owner - owner.med_hud_set_status() + var/datum/disease/advance/A = random_virus(pick(2, 6), 6) + A.carrier = TRUE + owner.ForceContractDisease(A) + +/obj/item/organ/internal/heart/gland/viral/proc/random_virus(max_symptoms, max_level) + if(max_symptoms > VIRUS_SYMPTOM_LIMIT) + max_symptoms = VIRUS_SYMPTOM_LIMIT + var/datum/disease/advance/A = new /datum/disease/advance() + var/list/datum/symptom/possible_symptoms = list() + for(var/symptom in subtypesof(/datum/symptom)) + var/datum/symptom/S = symptom + if(initial(S.level) > max_level) + continue + if(initial(S.level) <= 0) //unobtainable symptoms + continue + possible_symptoms += S + for(var/i in 1 to max_symptoms) + var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) + if(chosen_symptom) + var/datum/symptom/S = new chosen_symptom + A.symptoms += S + A.Refresh() //just in case someone already made and named the same disease + return A /obj/item/organ/internal/heart/gland/emp //TODO : Replace with something more interesting origin_tech = "materials=4;biotech=4;magnets=6;abductor=3" - cooldown_low = 900 - cooldown_high = 1600 + cooldown_low = 800 + cooldown_high = 1200 uses = 10 icon_state = "emp" + mind_control_uses = 3 + mind_control_duration = 1800 /obj/item/organ/internal/heart/gland/emp/activate() to_chat(owner, "You feel a spike of pain in your head.") @@ -239,10 +259,8 @@ mind_control_duration = 1800 /obj/item/organ/internal/heart/gland/egg/activate() - to_chat(owner, "You lay an egg!") - var/obj/item/reagent_containers/food/snacks/egg/egg = new(owner.loc) - egg.reagents.add_reagent("sacid",20) - egg.desc += " It smells bad." + owner.visible_message("[owner] [pick(EGG_LAYING_MESSAGES)]") + new /obj/item/reagent_containers/food/snacks/egg/gland(get_turf(owner)) /obj/item/organ/internal/heart/gland/electric cooldown_low = 800 @@ -283,9 +301,8 @@ mind_control_duration = 1200 /obj/item/organ/internal/heart/gland/chem/activate() - var/chem_to_add = get_random_reagent_id() - owner.reagents.add_reagent(chem_to_add, 2) - owner.adjustToxLoss(-2, TRUE, TRUE) + owner.reagents.add_reagent(get_random_reagent_id(), 2) + owner.adjustToxLoss(-2) ..() /obj/item/organ/internal/heart/gland/bloody diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm index c59b6b9b1ee..a7f4acb4405 100644 --- a/code/modules/food_and_drinks/food/foods/meat.dm +++ b/code/modules/food_and_drinks/food/foods/meat.dm @@ -324,6 +324,16 @@ icon_state = "egg-yellow" item_color = "yellow" +/obj/item/reagent_containers/food/snacks/egg/gland + desc = "An egg! It looks weird..." + +/obj/item/reagent_containers/food/snacks/egg/gland/New() + ..() + reagents.add_reagent(get_random_reagent_id(), 15) + + var/reagent_color = mix_color_from_reagents(reagents.reagent_list) + color = reagent_color + /obj/item/reagent_containers/food/snacks/friedegg name = "Fried egg" desc = "A fried egg, with a touch of salt and pepper." From 953a3382b73624ab6257a0074a276206a4ac3018 Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Wed, 25 Jul 2018 16:18:59 +0300 Subject: [PATCH 08/32] fixes all loose pipes --- _maps/map_files/cyberiad/cyberiad.dmm | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index ce03d4ba799..6a8a1ef134c 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2619,7 +2619,7 @@ "aYs" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aYt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/clipboard,/obj/item/folder/yellow,/obj/item/stamp/ce,/obj/item/book/manual/sop_engineering,/obj/item/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/storage/fancy/cigarettes,/obj/item/lighter/zippo,/obj/item/pen/multi,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "aYu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) -"aYv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aYv" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness) "aYw" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/crew_quarters/fitness) "aYx" = (/obj/structure/crematorium,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office) "aYy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -2628,7 +2628,7 @@ "aYB" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "aYC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "aYD" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape) -"aYE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/library) +"aYE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aYF" = (/obj/structure/closet/coffin,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "aYG" = (/obj/structure/closet/coffin,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) "aYH" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/escape) @@ -2891,7 +2891,7 @@ "bdE" = (/obj/machinery/camera{c_tag = "Dormitories Toilets"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/toilet) "bdF" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Bar Office"; req_access_txt = "25"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar) "bdG" = (/obj/machinery/portable_atmospherics/canister/air{anchored = 1},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) -"bdH" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/central/ne) +"bdH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bdI" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/central/ne) "bdJ" = (/obj/machinery/light/small{dir = 1},/obj/item/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/closet/chefcloset,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) "bdK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen) @@ -2975,7 +2975,7 @@ "bfk" = (/obj/machinery/requests_console{department = "Bar"; name = "Bar Requests Console"; departmentType = 2; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/machinery/chem_dispenser/beer,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar) "bfl" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bfm" = (/obj/effect/decal/warning_stripes/north,/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/turret_protected/aisat_interior) -"bfn" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) +"bfn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "bfo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "bfp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "bfq" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/central/ne) @@ -3208,7 +3208,7 @@ "bjJ" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/escape) "bjK" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/wood,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "bjL" = (/obj/structure/stool/bed/chair,/obj/item/radio/intercom/locked/confessional{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main) -"bjM" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{icon_state = "neutral"},/area/crew_quarters/fitness) +"bjM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "bjN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/library) "bjO" = (/obj/structure/table/wood,/turf/simulated/floor/carpet,/area/hallway/secondary/entry) "bjP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/port) @@ -8228,6 +8228,8 @@ "dcl" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/engine/engineering) "dcm" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/engine/engineering) "dcn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/engine/engineering) +"dco" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) +"dcp" = (/obj/machinery/porta_turret{dir = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) "dcs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/engine/engineering) "dct" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/atmos) "dcv" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos) @@ -8817,7 +8819,6 @@ "dqw" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) "dqx" = (/obj/machinery/porta_turret{dir = 1},/obj/item/radio/intercom/locked/ai_private{broadcasting = 1; listening = 0; pixel_y = -29},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) "dqy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) -"dqz" = (/obj/machinery/porta_turret{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) "dqA" = (/obj/structure/rack,/obj/item/crowbar/red,/obj/item/wrench,/turf/simulated/floor/plating,/area/aisat{name = "\improper AI Satellite Hallway"}) "dqB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/aisat/maintenance{name = "\improper AI Satellite Service"}) "dqC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/mob/living/simple_animal/bot/cleanbot{on = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkbluecorners"},/area/aisat/maintenance{name = "\improper AI Satellite Service"}) @@ -9017,15 +9018,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPVaSdaSdaLdaMsaPZaQaaLdaMsaPZaQaaLdaGnaLkaGnaGnaGnaGnaGnaHSaGnaHSaQbaPXaHSaHSaGnaLsaGnaPYaabaPYaGnaJYaOZaGnaQeaQcaGnaNAaKaaGnaLsaMAaMAaQgaQgaQgaQgaQgaQgaQgaQgaQgaPiaPiaPjaQhaQiaQjaQkaQlaQdaKEaKDaKFaKFaKFaKFaKFaKGaKIaKHaKFaKFaKFaKKaKKaKLaLzaKNaLBaEjaHBaLPaQzaKpaLNaLPaKuaMNaMWaNRaNSaMNaMVaMVaMVaMVaNTaMZaNdaNdaNeaMVaSQaMVaMVaMVaMVaKCaODaKQaKQaKQaKQaKQaODaQHaPMaKOaGYaVJaGYaQBaMzaQCaHOaQLaQJaHbaGXaOFaHbaGXaQKaGYaGXaQMaGYaGXaQOaQNaQPaOGaRWaMqaUgaQRaUiaUhaUiaQRaUjaMqaMzaMzaGXaGXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQXaRbaoOaSbaMcaMdaMdaRaaMdaMdaMdaRdaRcaReaReaReaReaRfaGnaHSaGnaRhaRgaRiaHSaRjaPcaLsaGnaGnaGnaGnaGnaGnaPcaGnaHSaRiaLkaHSaHSaHSaRkaRmaRlaRnaRnaRnaRnaRoaRnaRnaRpaRqaRlaRsaRraRraRraRraRraRraRraRtaRwaRwaRwaRwaRxaRwaRwaLDaRwaRwaRxaRwaRwaRwaRwaRzaLFaLKaLGaLLaLPaRDaLMaLWaLOaNVaMNaNYaNXaOeaMNaMVaMVaMVaMVaMTaRMaOpaOpaRGaMVaVLaVKaMVaMVaMVaPvaRVaKQaKQaKQaKQaKQaRVaVMaYwaVObfQaZzbafbafbafbafbbYaOGaOGaOGaOGaOGaOGaOGaKSaGYaGYaGYaGYaMnaGYaGYaMkaGYaRXaUYaUYaMqaMqaMqaMqaMqaMqaUfaQIaOFaJMaGXaabajcaMraMraabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZPaSdaSdaMBaSfaMDaMEaSiaSjaQZaSaaSjaSeaScaSjaSjaSnaGnaHSaGnaSoaHSaHSaSpaSqaGnaNIaKgaHSaHSaHSaHSaHSaHSaPcaSsaHSaGnaNxaNxaGnaSraMAaSuaSwaSvaSvaSvaSxaSvaSvaSvaSyaSuaSzaSAaSAaSAaSAaSAaSAaSAaPiaRwaSBaSCaSEaSgaSkaShaSmaSlaSJaSDaSLaSCaSMaRwaSNaFFaSOaEjaMFaLPaSRaMGaSTaSSaOqaWHaOyaOraOraPkaPBbhiaPCbgsbhhbhibhibhibhibhibhjaMVaMVaMVaMVaThaODaKQaKQaKQaKQaKQaKOaKOaKOaKOaHbaMzaMzaIEaGXaGXbBOaMzaGXaTgaMzaGXaIEaGXaMkaQIaMzaGXaIEaGXaKXaUUaMkaGYaTiaGXaHOaHbaGYaGYaVTaVhaVUaVUaWZaGYaGYaGXaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaRUaSdaToaSfaSfaTpaSdaRUaSdaTqaTsaTraTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIfaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaSraKbaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTvaTyaTxaTAaSAaPiaRwaTzaTzaTCaTBaTEaTDaTFaTDaMKaTGaTIaTzaTzaRwatcaFFaTJaEjaMFaLPaOnaKpaLNaLPaPDbhkbhtbhpaPFaPEaQAbhzbitbisbiTbiubjkbjcbjXbjMbkKbkIaQEaOvaOwaKOaODaKQaKQaKQaKQaKQaKOaTXaUaaMzaGXaMzaLcaGYaGXaLcbBOaGXaTZaGYaGXaUbaGYaMzaUdaUcaGXaUeaGYaMzaIEaIEaMkaGYaXbaXaaXaaXaaXaaXaaXdaGYaGYaGYaXeaGYaGYaIFaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaMsaSdaRUaSdaToaSfaSfaTpaSdaRUaSdaTqaTsaTraTtaGnaHSaPcaPcaGnaGnaGnaTuaTuaTuaIfaTuaTuaTuaTuaTuaHSaGnaGnaGnaGnaGnaGnaGnaSraKbaStaaaaabaaaaabaaaaabaaaaabaaaaSuaSzaSAaTwaTvaTyaTxaTAaSAaPiaRwaTzaTzaTCaTBaTEaTDaTFaTDaMKaTGaTIaTzaTzaRwatcaFFaTJaEjaMFaLPaOnaKpaLNaLPaPDbhkbhtbhpaPFaPEaQAbhzbitbisbiTbiubjkbjcbjXaYvbkKbkIaQEaOvaOwaKOaODaKQaKQaKQaKQaKQaKOaTXaUaaMzaGXaMzaLcaGYaGXaLcbBOaGXaTZaGYaGXaUbaGYaMzaUdaUcaGXaUeaGYaMzaIEaIEaMkaGYaXbaXaaXaaXaaXaaXaaXdaGYaGYaGYaXeaGYaGYaIFaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaLdaLdaSdaOQaSdaUlaUkaUnaUmaSdaOQaSdaSdaLdaUoaUpaGnaHSaHSaHSaHSaHSaHSaTuaUuaUvaUqaUxaUsaUzaUuaTuaUwaUAaUyaUyaUyaUyaUyaUyaUBaNxaStaabaUEaUEaUEaUEaUEaUEaUEaabaSuaSzaSAaUFaUCaUHaUDaUFaSAaPiaRwaUJaUJaUJaUGaULaSCaUIaSCaULaUKaUJaUJaUJaRwaSNaFFaUMaEjaMFaLPaOjaKpaLNaLPaQFbuMaUQaUQaUQaUQaUQaUQaUQaNZaUQaUSaUSaUSaUSaUSaOaaGXaPGaPIaPIbJUaODaKQaKQaKQaKQaKQaKOaURaUaaMzaUTaGXaGYaGYaGXbJVbLCaMzaGYaGYaGXaGYaGYaMzaMkaGVaGXaGYaGYaMzaUWaGYaMkaGYaXgaQLbazbazbazbazbazaYPaYPaYPaQDaYPaYPaYPaYRaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdaRUaSdaSdaSdaSdaSdaSdaRUaSdaUZaLdaUVaUXaVcaVcaVcaVcaVcaVcaVaaTuaUuaVeaUqaVfaVeaVeaUuaTuaVgaVbaViaViaViaViaViaViaViaViaVjaaaaUEaVkaVdaVmaVlaVnaUEaaaaSuaSzaSAaVpaVoaVraVqaUFaSAaPiaRwaVsaVsaTCaVtaVuaTDaTFaTDaVuaVvaVwaTzaTzaRwaSNaFFaSOaEjaObaLPaOdaOcaLNaLPaQGbuMaUQaVzaVAaVCaVCaUQaVBaOfaVDaUSbxyaVFaVHaUSaOgaGXaPGaPIaPHaPJaKOaKOaKOaKOaKOaKOaKOaVNbLGaMzaMzaGXaGXaMzaMzbLHaVPaMzaGXaHPaGXaGXaMzaMzaVRaVQaGXaGXaGXaQLaUWaGYaMkaGYaRXaGYbazaXjaXoaXkaYxaYPaYAaYzaYCaYBaYGaYFaYRaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVSaVXaVSaVSaVYaVZaVSaVSaVXaWaaVWaLdaToaWbaVcaWdaWcaWfaWeaWhaWgaTuaUuaVeaUqaWjaVeaVeaUuaTuaWkaWlaWiaWnaWmaWoaWqaWraWpaWtaVjaabaUEaWuaWsaWwaWvaWxaUEaabaSuaSzaSAaWzaWAaWyaWCaWBaSAaPiaRwaSBaSCaWEaWDaULaSCaWFaSCaULaWGaSLaSCaSMaRwaSNaFFaWJaEjaMFaLPaISaOhaLNaLPaRvbuUaUQaWKaVEaVEaVEaWLaOlaOkaOmaUSaWQaWPaOxaOtaPgaGXaRPaRQaRQaRIaGXaJMaGXaGYaQIaHPaLcaWUaWXaWWaWYaGXaNhaGYaQIbBOaGYaGXaaaaGXaGYaGYaGYbbIaYIbbIaYKaYJaYJaYJaYJaYJbamaYObapbanbarbaqbatbasbawaYPbaAbayaYCbaBbaCbaCaYRaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVSaXmaXraXsaXtaXuaXvaXwaXxaXyaXzaXpaXnaSdaToaXqaVcaXBaXAaXFaXGaXFaXCaTuaXIaVeaXDaXHaXEaXHaXJaXLaXKaXMaXQaXQaXQaXQaXQaXQaXNaXSaVjaaaaUEaXOaWsaXPaWvaXRaUEaaaaSuaSzaSAaXTaXXaXVaXUaYaaSAaPiaRwaXWaXWaTCaXYaVuaTDaXZaTDaVuaYbaTIaTzaTzaRwaYcaIraYhaEjaMFaLPaLPaLPaLPaLPaPlaRJaPnaPmaPoaUQaUQaUQaUQaUQaUQaUSaPpaZVaPqaUSaOgaGXaGXaGXaGXaGXaGXaGYaGXaGYaHPaHPaGXaGXaGXaYnaGXaGXaGXaGXaGYbBOaWVaHNaabaHNaGYaYsaYvaYuaYybaDbaEbaubauaYEbauaGXbaFaGXbazbazbazbazbazbaIbazbazbazbaybcgaXcbaMaXhaYRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpaYMaYLaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaToaYWaVcaYYaYXaZfaZaaZhaZbaTuaZjaUraZcaZlaZmaZnaZdaTuaZeaZgaXQaXQaXQaXQaXQaXQaXNaZraVjaabaUEaZkaZiaZpaZoaZqaUEaabaSuaSzaSAaZsaZyaZtaZAaZuaSAaPiaRwaUJaUJaUJaYpaULaSCaUIaSCaULaZvaUJaUJaUJaRwaZxaZFaZGaEjaPtaPsaPsaPsaPsaPuaPxaPvaUQaPyaPzaUQaQmaQfaQnaUQaQoaUSaZDaZVaZEaUSaQpaZKaQqaZNaZNaZKaZXaZWaZWaZWaZWaZWaQxaZYaZWbaabacbabbaebadbagbMgbaibahbajbahbalbakaGYaGXbaubaubcmbaubavbaobaxaGXbcnaHObazbcqbcwbcubcAbcxbcCbcBbazbcFbdZbdYbegbedaXlaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaYVaYTaSdaTobaJaVcaVcbaKaUtbaLaUtaVcaTuaTuaTuaTubaSbaPbbhbbbaTubbjbbcbblaXQaXQbbmaXQbbebbdbbpaVjaaaaUEaUEbbqbbfbbqaUEaUEaaaaSuaSzaSAbbibbgbbkaZAbbnaSAaPiaRwaSBaSCbboaWDaULaSCaUIaSCaULaWGbbxaRwaRwaRwbbrbbzbbtbbsbbCatGatGatGbbEbbFbbvbbuaUQbbwaVEaUQbbJaUQbbKaUQbbLaQrbbBbbAbbHbbGbbUbbIaQtbbNbbQbbPbbRbbQbbQbbSbbQbbIbbTbbIaXfbbUbbIbbVbbXaSGbbZaZZbcbbcabcdbccbcfbceaXibaubaubcobekbchbcibcsbcjaGXbaFbelbazbeqbetberbevbeubczbczbewbcDbfUbfSbfSbfSaYRaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpbcrbcNaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaTobcvbctbcEbcybcSbcSaSfbcGbcMbcVbcWbcXbcPbcOaVebcQaTubdbbcRbddbdebcTbdgbdhbdibcUbdkaVjaaaaabaaabcYbcZbcYaaaaabaaaaSuaSzaSAbdcbdabdjbdfbdraSAaPiaRwbdmbdlaTCaZwbdoaTDbdpaTDbdsaZQbdzaRwbdubdtbdvbdDbdxbdwbbDbdHaaaaaabbEbdIbdBbdAaUQbdCbdEaVEaVEbdNaVEaVEaVEbdOaUSbdFaUSbdQaUSaUSaQuaUSbdTbdUbdKbdJbdMbdLbdTbdPbeabebbecbebbebbebbebbdSbeebebbefbdVbdWbeibebbdXaGYbaubtlbcpbfVbembenbeobepaGXbaFbfWbazbfXbcxbgabcxbckbczbczbggbcDbybbgibgibgRaYQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehbejaVSaXmaXzaXsbeGbesaXsaXsbexbeGaXzaXpbeyaSdaTobeEbezbeMaRKbeMbeMbeMbeMbeMbeHaSfaTubePbeQbePaTuaTubeRbeIbeRaViaViaViaVibeRbeJbeUaVjbeLbeKbeKbeNbeObeNbeKbeKbeSaSubfaaSAbeTaSAbeWbeVbfeaSAbffaRwaRwaRwaRwbfgbfhbeXbeYbeXbfhbfgaRwaRwbeZbdDbdDbdDbdDbfbbdybfnbfobfpbbEbfqbdBbfiaUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfkbfjaQvaRLaSUaRNbdTbfAbfvbfCbfwbfEbdTbfxbfybfHbfzbfHbfJbfKbfMbfBbfFbfDbfIbfGbfNbfLbebbfObfQbfPbhKbfRbfVbfYbfZbeobfTaGXbhObhNbhUbhSbhXbhWbhWbhYbczbczbggbcDbcDbgibhZbgiaYQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYDaYUaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaVSaVXaVSaVSaVYaVZaVSaVSaVXaWaaVWaLdaToaWbaVcaWdaWcaWfaWeaWhaWgaTuaUuaVeaUqaWjaVeaVeaUuaTuaWkaWlaWiaWnaWmaWoaWqaWraWpaWtaVjaabaUEaWuaWsaWwaWvaWxaUEaabaSuaSzaSAaWzaWAaWyaWCaWBaSAaPiaRwaSBaSCaWEaWDaULaSCaWFaSCaULaWGaSLaSCaSMaRwaSNaFFaWJaEjaMFaLPaISaOhaLNaLPaRvbuUaUQaWKaVEaVEaVEaWLaOlaOkaOmaUSaWQaWPaOxaOtaPgaGXaRPaRQaRQaRIaGXaJMaGXaGYaQIaHPaLcaWUaWXaWWaWYaGXaNhaGYaQIbBOaGYaGXaaaaGXaGYaGYaYEbbIaYIbbIaYKaYJaYJaYJaYJaYJbamaYObapbanbarbaqbatbasbawaYPbaAbayaYCbaBbaCbaCaYRaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVVaWaaVSaXmaXraXsaXtaXuaXvaXwaXxaXyaXzaXpaXnaSdaToaXqaVcaXBaXAaXFaXGaXFaXCaTuaXIaVeaXDaXHaXEaXHaXJaXLaXKaXMaXQaXQaXQaXQaXQaXQaXNaXSaVjaaaaUEaXOaWsaXPaWvaXRaUEaaaaSuaSzaSAaXTaXXaXVaXUaYaaSAaPiaRwaXWaXWaTCaXYaVuaTDaXZaTDaVuaYbaTIaTzaTzaRwaYcaIraYhaEjaMFaLPaLPaLPaLPaLPaPlaRJaPnaPmaPoaUQaUQaUQaUQaUQaUQaUSaPpaZVaPqaUSaOgaGXaGXaGXaGXaGXaGXaGYaGXaGYaHPaHPaGXaGXaGXaYnaGXaGXaGXaGXaGYbBOaWVaHNaabaHNaGYaYsbdHaYuaYybaDbaEbaubaubaubauaGXbaFaGXbazbazbazbazbazbaIbazbazbazbaybcgaXcbaMaXhaYRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpaYMaYLaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaToaYWaVcaYYaYXaZfaZaaZhaZbaTuaZjaUraZcaZlaZmaZnaZdaTuaZeaZgaXQaXQaXQaXQaXQaXQaXNaZraVjaabaUEaZkaZiaZpaZoaZqaUEaabaSuaSzaSAaZsaZyaZtaZAaZuaSAaPiaRwaUJaUJaUJaYpaULaSCaUIaSCaULaZvaUJaUJaUJaRwaZxaZFaZGaEjaPtaPsaPsaPsaPsaPuaPxaPvaUQaPyaPzaUQaQmaQfaQnaUQaQoaUSaZDaZVaZEaUSaQpaZKaQqaZNaZNaZKaZXaZWaZWaZWaZWaZWaQxaZYaZWbaabacbabbaebadbagbMgbaibahbajbahbalbakaVJaGXbaubaubcmbaubavbaobaxaGXbcnaHObazbcqbcwbcubcAbcxbcCbcBbazbcFbdZbdYbegbedaXlaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaZaXsaXsaVXaXzaYZaXsaYZbbaaYZaXsaYZaXzaYVaYTaSdaTobaJaVcaVcbaKaUtbaLaUtaVcaTuaTuaTuaTubaSbaPbbhbbbaTubbjbbcbblaXQaXQbbmaXQbbebbdbbpaVjaaaaUEaUEbbqbbfbbqaUEaUEaaaaSuaSzaSAbbibbgbbkaZAbbnaSAaPiaRwaSBaSCbboaWDaULaSCaUIaSCaULaWGbbxaRwaRwaRwbbrbbzbbtbbsbbCatGatGatGbbEbbFbbvbbuaUQbbwaVEaUQbbJaUQbbKaUQbbLaQrbbBbbAbbHbbGbbUbbIaQtbbNbbQbbPbbRbbQbbQbbSbbQbbIbbTbbIaXfbbUbbIbbVbbXaSGbbZaZZbcbbcabcdbccbcfbcebfnbaubaubcobekbchbcibcsbcjaGXbaFbelbazbeqbetberbevbeubczbczbewbcDbfUbfSbfSbfSaYRaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaXpbcrbcNaYNaXzaYZaXsaYZaXsaYZaXsaYZaXzaYVaYTaSdaTobcvbctbcEbcybcSbcSaSfbcGbcMbcVbcWbcXbcPbcOaVebcQaTubdbbcRbddbdebcTbdgbdhbdibcUbdkaVjaaaaabaaabcYbcZbcYaaaaabaaaaSuaSzaSAbdcbdabdjbdfbdraSAaPiaRwbdmbdlaTCaZwbdoaTDbdpaTDbdsaZQbdzaRwbdubdtbdvbdDbdxbdwbbDbjMaaaaaabbEbdIbdBbdAaUQbdCbdEaVEaVEbdNaVEaVEaVEbdOaUSbdFaUSbdQaUSaUSaQuaUSbdTbdUbdKbdJbdMbdLbdTbdPbeabebbecbebbebbebbebbdSbeebebbefbdVbdWbeibebbdXaGYbaubtlbcpbfVbembenbeobepaGXbaFbfWbazbfXbcxbgabcxbckbczbczbggbcDbybbgibgibgRaYQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehbejaVSaXmaXzaXsbeGbesaXsaXsbexbeGaXzaXpbeyaSdaTobeEbezbeMaRKbeMbeMbeMbeMbeMbeHaSfaTubePbeQbePaTuaTubeRbeIbeRaViaViaViaVibeRbeJbeUaVjbeLbeKbeKbeNbeObeNbeKbeKbeSaSubfaaSAbeTaSAbeWbeVbfeaSAbffaRwaRwaRwaRwbfgbfhbeXbeYbeXbfhbfgaRwaRwbeZbdDbdDbdDbdDbfbbdydcobfobfpbbEbfqbdBbfiaUQaUQaUQaUQaUQaUQaUQaUSaUSbdObfsbftbfkbfjaQvaRLaSUaRNbdTbfAbfvbfCbfwbfEbdTbfxbfybfHbfzbfHbfJbfKbfMbfBbfFbfDbfIbfGbfNbfLbebbfObfQbfPbhKbfRbfVbfYbfZbeobfTaGXbhObhNbhUbhSbhXbhWbhWbhYbczbczbggbcDbcDbgibhZbgiaYQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYDaYUaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabehaVSaVXaVSaVSaVYaVZaVSaVSaVXbejbgeaLdbdnbeEaSdaSWaSWaSXaSWaSYaMsbgvbglaSfbgnbfcbgzbgzbgqbgrbgzbgubgzbgzbgzbgDbgzbgzbgwbgFbdqbgAbghbgBbgAbgCbgAbgAbgAbgAbgEbgMbgJbgzbgzbgKbfcbgQbgxbgSbgLbgObgNbgTbgPbgPbgPbgPbgPbgPbgPbgVbgUbhabhbbhcbhdbhebgWbgXbfdbdDbdDbhfbgZbhgbgZbhgaSZaTfaTaaWNaUNbhqaUSbhrbhlaYeaYdaZRaZRaWMbeFbfrbflbdTbhobhubhsbhsbhwbdTbhAbhCbhBbhEbhDbhDbhFbhHbhGbfMbhIbhJbhPbhQbhRbebbdXaTgbaubiabcpbihbibbhVbhTbhLaGXbjnbiibazbjrbazbewbggbggbazbazbazbjsbjsaYPaYPaYPaYRaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYDbaWbaXbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSdbgyaSdaSdaSdaSdaSdaSdbgyaSdaUZaLdbgHbieaSdbgtbgjbhmbhmbhvaMsbivbglbifbgGbfcbijbipbiobiqbiqbixbiwbiwbiwbizbiybiybiAbiCbiBbiqbiqbiDbiybiFbiEbiGbiGbiIbiHbiKbiJbiJbiJbiLbfcbgQbgxbgSbgSbgSbgSbiMbgSbgSbgSbgSbgSbgSbiNbiUbiVbiWbiXbiObiZbiQbiPbiRbiVbiVbiVbjdbjebjebjebiSbhqbhqbhqbirbhxbhqaUSbjabjjaZRaZRbiYaZRaWTbjmbfrbjKbdTbjobjfbjqbjhbjgbdTbjtbjibjvbjwbjxbjybebbebbjzbebbebbebbjBbjlbjBbebbdXaGYbaubjubcpbcpbekbjEbcpbjFaGXaGXaGXaYPaYPaYPbcDbcDbcDbjDbjAbjIbcDbcDbcDbjpbjLaYRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYDbaWbcJbcKbcLbaYaYHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbjQaLdaSdaOQaSdbidbgIbjTbjSaSdaOQaSdaSdaLdbjUbeEaSdbkcbjObhmbhmbhvaMsbkdbglaSfbgGbfcbgzbjZbjYbkgbkgbkabkibkbbkgbkebkgbkfbkgbkhbjPbkgbkgbkgbkgbkgbkjbkkbkgbklbkrbknbkmbgzbgzbkpbkobksbkqbkubktbkubkvbkwbkvbkvbkvbkvbkvbkvbkybkAbkzbkzbkzbkzbkBbkzbkCbkDbkzbkzbkEbkGbkFbkFbkFbkFbkFbkFbkFbkHbhqbhqaUSbkMbkNbkPbkObkOblrblsbjmbfrbltbdTbdTbdTbdTbdTbkLbdTbkQbkRbkWbkSbfHbkYbebbhMbkTbkUblcbkVbleblfblgbebbdXaQLbaubliblibcpbjNblkbcpbllbllbaubkXblabkZaYPbldblnbloboJblhboJblnbloblmaYPblqaYRaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYUbeAbeBbeCbeBbeDaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9127,7 +9128,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpCdpEdpDdpFdpfdpIdpHdpJdpfdpKdpAdpAdpLdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaadohdohdohdohdohaabdnLaabdohdohdohdohdohaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpMdpOdpNdpPdpGdpRdpQdpSdpGdpUdpTdpWdpVdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdondoodoodoodoodpYdpXdpYdordordordordptaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaadpddpZdqbdqadqddqcdqfdqedqhdqgdqjdqidqldqkdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdoGdoGdoGdoGdoGaaadnLaaadoGdoGdoGdoGdoGaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpddqqdqodqsdpfdqxdqtdqzdpfdqCdqBdqEdppdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaaaaabaabaabaaaaaadnLaabaaaaaaaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpddpddqqdqodqsdpfdqxdqtdcpdpfdqCdqBdqEdppdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaaaaabaabaabaaaaaadnLaabaaaaaaaabaabaaaaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqpdqFdqpdqmdqmdqGdqrdqmdqpdqHdqpdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWamWamWamWamWaaaaaaaaadnLaaaaaaaaaamWamWamWayiamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqmdisdqudqpdqvdqwdqIdqydqvdqpdqJdqAdqmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaabdqKaabamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdqmdqndqudqpdqvdqwdqIdqydqvdqpdqJdqDdqmaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamWaaaaabaaaamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 29ddbc5169bc9a0db4ea65ff0b99a24cb21410f9 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 25 Jul 2018 23:14:08 -0400 Subject: [PATCH 09/32] Fix Cybernetic Limb Custom Appearance Surgery --- code/modules/surgery/robotics.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 762c4e6040b..f9fb2ac20c2 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -590,6 +590,7 @@ target.UpdateDamageIcon() user.visible_message(" [user] reprograms the appearance of [target]'s [affected.name] with [tool].", \ " You reprogram the appearance of [target]'s [affected.name] with [tool].") + affected.open = 0 return TRUE /datum/surgery_step/robotics/external/customize_appearance/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) From 530e46e02f72a098bfdc0d08acd1b0bd55ac4130 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 26 Jul 2018 02:09:03 -0400 Subject: [PATCH 10/32] Fixes Posibrains Having Incorrect Names --- code/modules/surgery/organs/mmi_holder.dm | 2 +- .../surgery/organs/subtypes/machine.dm | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/code/modules/surgery/organs/mmi_holder.dm b/code/modules/surgery/organs/mmi_holder.dm index 8b5834bd8fc..d4228fb9625 100644 --- a/code/modules/surgery/organs/mmi_holder.dm +++ b/code/modules/surgery/organs/mmi_holder.dm @@ -29,7 +29,7 @@ /obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() if(!stored_mmi) return - name = stored_mmi.name + name = initial(stored_mmi.name) desc = stored_mmi.desc icon = stored_mmi.icon icon_state = stored_mmi.icon_state diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 7c2aae08894..b66d13612a3 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -115,15 +115,22 @@ . = ..() +/obj/item/organ/internal/brain/mmi_holder/posibrain + name = "positronic brain" + /obj/item/organ/internal/brain/mmi_holder/posibrain/New() ..() stored_mmi = new /obj/item/mmi/robotic_brain/positronic(src) - if(owner) - stored_mmi.name = "positronic brain ([owner.real_name])" - stored_mmi.brainmob.real_name = owner.real_name + if(!owner) + stored_mmi.forceMove(get_turf(src)) + qdel(src) + +/obj/item/organ/internal/brain/mmi_holder/posibrain/remove(mob/living/user, special = 0) + if(stored_mmi && dna) + stored_mmi.name = "[initial(name)] ([dna.real_name])" + stored_mmi.brainmob.real_name = dna.real_name stored_mmi.brainmob.name = stored_mmi.brainmob.real_name stored_mmi.icon_state = "posibrain-occupied" - update_from_mmi() - else - stored_mmi.forceMove(get_turf(src)) - qdel(src) \ No newline at end of file + if(!stored_mmi.brainmob.dna) + stored_mmi.brainmob.dna = dna.Clone() + . = ..() \ No newline at end of file From 2f8db36257237f4b594288197bf8e923fb44593a Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Thu, 26 Jul 2018 22:38:36 +0800 Subject: [PATCH 11/32] Robot analyzer no longer rounds off damage number --- code/modules/mob/living/silicon/robot/component.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 5802bdeb9ec..cc5108d89f8 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -237,7 +237,7 @@ if(!E.is_robotic()) continue organ_found = 1 - to_chat(user, "[E.name]: [round(E.brute_dam)] [round(E.burn_dam)]") + to_chat(user, "[E.name]: [E.brute_dam] [E.burn_dam]") if(!organ_found) to_chat(user, "No prosthetics located.") to_chat(user, "
") From ed6a881520589ec90fa312e944e1722545269831 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 26 Jul 2018 19:03:10 -0400 Subject: [PATCH 12/32] Fixes Icon Caching --- code/modules/mob/living/carbon/human/update_icons.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index af134052a66..450b7a6c1a4 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -249,7 +249,8 @@ var/global/list/damage_icon_parts = list() icon_key += "1" if(part) - icon_key += "[part.dna.species.race_key]" + var/datum/species/S = GLOB.all_species[part.dna.species.name] //This has to reference the species datums from round start, since they're global and unchanging + icon_key += "[S.race_key]" icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" if(part.s_col) From 8b86e45c06ea54b212952d4b96f0746002d01259 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 26 Jul 2018 23:25:23 -0400 Subject: [PATCH 13/32] Automatic changelog generation for PR #9206 [ci skip] --- html/changelogs/AutoChangeLog-pr-9206.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9206.yml diff --git a/html/changelogs/AutoChangeLog-pr-9206.yml b/html/changelogs/AutoChangeLog-pr-9206.yml new file mode 100644 index 00000000000..8e72cc4a8f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9206.yml @@ -0,0 +1,4 @@ +author: "Crazylemon64" +delete-after: True +changes: + - rscadd: "Space hotel is back in business" From dfe67981b887ad788e80e9fb2a1f9a14dfb7467e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Jul 2018 03:30:20 +0000 Subject: [PATCH 14/32] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-9206.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9206.yml diff --git a/html/changelog.html b/html/changelog.html index afbfc9171fe..7864212b688 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->
+

27 July 2018

+

Crazylemon64 updated:

+
    +
  • Space hotel is back in business
  • +
+

25 July 2018

variableundefined updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 460c941f95c..d478d11a132 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6683,3 +6683,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-07-25: variableundefined: - bugfix: Fixes runtime error from medical kit change +2018-07-27: + Crazylemon64: + - rscadd: Space hotel is back in business diff --git a/html/changelogs/AutoChangeLog-pr-9206.yml b/html/changelogs/AutoChangeLog-pr-9206.yml deleted file mode 100644 index 8e72cc4a8f3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9206.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Crazylemon64" -delete-after: True -changes: - - rscadd: "Space hotel is back in business" From a90611965ce27892faf70df06e005a7a5ce3a9fd Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 26 Jul 2018 23:36:30 -0400 Subject: [PATCH 15/32] Automatic changelog generation for PR #9252 [ci skip] --- html/changelogs/AutoChangeLog-pr-9252.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9252.yml diff --git a/html/changelogs/AutoChangeLog-pr-9252.yml b/html/changelogs/AutoChangeLog-pr-9252.yml new file mode 100644 index 00000000000..6ad3f007b8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9252.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Extract posibrains should have the correct names now" From f6ed5223fda6b153d19d2666399329d4ea191cf5 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Jul 2018 00:19:26 -0400 Subject: [PATCH 16/32] Automatic changelog generation for PR #9244 [ci skip] --- html/changelogs/AutoChangeLog-pr-9244.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9244.yml diff --git a/html/changelogs/AutoChangeLog-pr-9244.yml b/html/changelogs/AutoChangeLog-pr-9244.yml new file mode 100644 index 00000000000..7faae53720e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9244.yml @@ -0,0 +1,4 @@ +author: "AffectedArc07" +delete-after: True +changes: + - bugfix: "You can no longer use embeds in NTSL" From ea4cd378b0fe786f6e0536f7e671a2394e242e33 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Thu, 26 Jul 2018 21:43:27 -0700 Subject: [PATCH 17/32] Adds initialize returns that I forgot to add in the maploader fix PR --- code/modules/mob/living/carbon/human/interactive/prefabs.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/interactive/prefabs.dm b/code/modules/mob/living/carbon/human/interactive/prefabs.dm index 85824145019..cee716b66ec 100644 --- a/code/modules/mob/living/carbon/human/interactive/prefabs.dm +++ b/code/modules/mob/living/carbon/human/interactive/prefabs.dm @@ -2,7 +2,7 @@ TRAITS |= TRAIT_ROBUST TRAITS |= TRAIT_MEAN faction += "bot_angry" - ..() + return ..() /mob/living/carbon/human/interactive/friendly/Initialize(mapload) TRAITS |= TRAIT_FRIENDLY @@ -10,7 +10,7 @@ faction += "bot_friendly" faction += "neutral" functions -= "combat" - ..() + return ..() /mob/living/carbon/human/interactive/greytide/Initialize(mapload) TRAITS |= TRAIT_ROBUST @@ -21,4 +21,4 @@ targetInterestShift = 2 // likewise faction += "bot_grey" graytide = 1 - ..() \ No newline at end of file + return ..() From cbd52db2be597832ee2679ca9e3bbc4289da930c Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Wed, 25 Jul 2018 14:18:30 -0700 Subject: [PATCH 18/32] A couple buildmode fixes The runtime when not placing a valid path is now replaced with a warning message The HUD icon for buildmode is no longer covered up by item actions --- code/_onclick/hud/_defines.dm | 5 +++++ code/_onclick/hud/screen_objects.dm | 2 +- code/datums/action.dm | 2 +- code/modules/admin/buildmode.dm | 6 +++++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 26fb60335c8..29fef068cce 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -161,3 +161,8 @@ //1 = standard hud //2 = reduced hud (just hands and intent switcher) //3 = no hud (for screenshots) + + +#define HUD_LAYER_SCREEN 20 + +#define HUD_LAYER_BUILDMODE 30 diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 5bf3a483cd8..17c67c7821f 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -9,7 +9,7 @@ /obj/screen name = "" icon = 'icons/mob/screen_gen.dmi' - layer = 20 + layer = HUD_LAYER_SCREEN plane = HUD_PLANE unacidable = 1 var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. diff --git a/code/datums/action.dm b/code/datums/action.dm index e49002e8e9d..e0634527104 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -127,7 +127,7 @@ var/obj/item/I = target var/old_layer = I.layer var/old_plane = I.plane - I.layer = 21 + I.layer = HUD_LAYER_SCREEN + 1 I.plane = HUD_PLANE current_button.overlays += I I.layer = old_layer diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm index d628df054c6..e4a0cbcfd42 100644 --- a/code/modules/admin/buildmode.dm +++ b/code/modules/admin/buildmode.dm @@ -14,6 +14,7 @@ /obj/screen/buildmode icon = 'icons/misc/buildmode.dmi' var/datum/click_intercept/buildmode/bd + layer = HUD_LAYER_BUILDMODE /obj/screen/buildmode/New(bld) ..() @@ -78,6 +79,7 @@ /obj/effect/buildmode_reticule var/image/I var/client/cl + anchored = TRUE /obj/effect/buildmode_reticule/New(var/turf/t, var/client/c) loc = t @@ -454,10 +456,12 @@ var/turf/T = get_turf(object) log_admin("Build Mode: [key_name(user)] modified [T] ([T.x],[T.y],[T.z]) to [objholder]") T.ChangeTurf(objholder) - else + else if(!isnull(objholder)) var/obj/A = new objholder (get_turf(object)) A.setDir(build_dir) log_admin("Build Mode: [key_name(user)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [build_dir]") + else + to_chat(user, "Select object type first.") else if(right_click) if(isobj(object)) log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])") From 1a2e19dd82737f3a3784d19ccf90db22fe2f56bd Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Jul 2018 01:03:30 -0400 Subject: [PATCH 19/32] Automatic changelog generation for PR #9262 [ci skip] --- html/changelogs/AutoChangeLog-pr-9262.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9262.yml diff --git a/html/changelogs/AutoChangeLog-pr-9262.yml b/html/changelogs/AutoChangeLog-pr-9262.yml new file mode 100644 index 00000000000..a20b6664267 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9262.yml @@ -0,0 +1,4 @@ +author: "Crazylemon64" +delete-after: True +changes: + - bugfix: "Non-hotel SNPCs work again" From ed05c2ec4505d9b74cb79ba3309172b30cca4aa4 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Thu, 26 Jul 2018 22:07:42 -0700 Subject: [PATCH 20/32] Explosion buildmode now works --- code/modules/admin/buildmode.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm index e4a0cbcfd42..b04b9d2b96a 100644 --- a/code/modules/admin/buildmode.dm +++ b/code/modules/admin/buildmode.dm @@ -351,13 +351,13 @@ if(BOOM_BUILDMODE) devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null if(devastation == null) devastation = -1 - var/heavy = input("Range of heavy impact. -1 to none", text("Input")) as num|null + heavy = input("Range of heavy impact. -1 to none", text("Input")) as num|null if(heavy == null) heavy = -1 - var/light = input("Range of light impact. -1 to none", text("Input")) as num|null + light = input("Range of light impact. -1 to none", text("Input")) as num|null if(light == null) light = -1 - var/flash = input("Range of flash. -1 to none", text("Input")) as num|null + flash = input("Range of flash. -1 to none", text("Input")) as num|null if(flash == null) flash = -1 - var/flames = input("Range of flames. -1 to none", text("Input")) as num|null + flames = input("Range of flames. -1 to none", text("Input")) as num|null if(flames == null) flames = -1 if(SAVE_BUILDMODE) @@ -629,7 +629,7 @@ L2.color = L.color link_lines += L2 if(BOOM_BUILDMODE) - explosion(object, devastation, heavy, light, flash, null, null,flames) + explosion(object, devastation, heavy, light, flash, null, TRUE, flames) if(SAVE_BUILDMODE) if(!cornerA) cornerA = select_tile(get_turf(object)) From 21561459282069d3edac08e2ff91b6dc9ee6c198 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Jul 2018 05:49:19 +0000 Subject: [PATCH 21/32] Automatic changelog compile, [ci skip] --- html/changelog.html | 9 +++++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-9244.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9252.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9262.yml | 4 ---- 5 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9244.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9252.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9262.yml diff --git a/html/changelog.html b/html/changelog.html index 7864212b688..db041fd29f2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,9 +57,18 @@

    27 July 2018

    +

    AffectedArc07 updated:

    +
      +
    • You can no longer use embeds in NTSL
    • +

    Crazylemon64 updated:

    • Space hotel is back in business
    • +
    • Non-hotel SNPCs work again
    • +
    +

    Fox McCloud updated:

    +
      +
    • Extract posibrains should have the correct names now

    25 July 2018

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d478d11a132..b3da310a082 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6684,5 +6684,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. variableundefined: - bugfix: Fixes runtime error from medical kit change 2018-07-27: + AffectedArc07: + - bugfix: You can no longer use embeds in NTSL Crazylemon64: - rscadd: Space hotel is back in business + - bugfix: Non-hotel SNPCs work again + Fox McCloud: + - bugfix: Extract posibrains should have the correct names now diff --git a/html/changelogs/AutoChangeLog-pr-9244.yml b/html/changelogs/AutoChangeLog-pr-9244.yml deleted file mode 100644 index 7faae53720e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9244.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - bugfix: "You can no longer use embeds in NTSL" diff --git a/html/changelogs/AutoChangeLog-pr-9252.yml b/html/changelogs/AutoChangeLog-pr-9252.yml deleted file mode 100644 index 6ad3f007b8b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9252.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Extract posibrains should have the correct names now" diff --git a/html/changelogs/AutoChangeLog-pr-9262.yml b/html/changelogs/AutoChangeLog-pr-9262.yml deleted file mode 100644 index a20b6664267..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9262.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Crazylemon64" -delete-after: True -changes: - - bugfix: "Non-hotel SNPCs work again" From 4f10f52c7e223257e76a75ce542d6feeead07f03 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 27 Jul 2018 14:51:04 -0400 Subject: [PATCH 22/32] tweaks --- code/__DEFINES/misc.dm | 4 +--- code/_globalvars/lists/misc.dm | 4 +++- code/game/gamemodes/miniantags/abduction/abduction_gear.dm | 2 +- code/game/gamemodes/miniantags/abduction/gland.dm | 2 +- .../modules/mob/living/simple_animal/friendly/farm_animals.dm | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index c730d883e28..67a187c45db 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -370,6 +370,4 @@ // used for alternate_option #define GET_RANDOM_JOB 0 #define BE_ASSISTANT 1 -#define RETURN_TO_LOBBY 2 - -#define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") \ No newline at end of file +#define RETURN_TO_LOBBY 2 \ No newline at end of file diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index 148488a6ddf..65bffa7515a 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -31,4 +31,6 @@ var/list/round_end_sounds = list( // Maps available round end sounds to their du 'sound/goonstation/misc/newround2.ogg' = 14.8 SECONDS ) -GLOBAL_LIST(station_level_space_turfs) \ No newline at end of file +GLOBAL_LIST(station_level_space_turfs) + +#define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.") \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 97e0d8b8860..c8539b568db 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -159,7 +159,7 @@ if(!ScientistCheck(user)) return if(!console) - to_chat(user, "The device is not linked to console!") + to_chat(user, "The device is not linked to a console!") return if(mode == GIZMO_SCAN) diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 3ff2f678fcf..8f058a872e6 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -167,7 +167,7 @@ human_only = TRUE icon_state = "species" mind_control_uses = 5 - mind_control_duration = 300 + mind_control_duration = 3000 /obj/item/organ/internal/heart/gland/pop/activate() to_chat(owner, "You feel unlike yourself.") diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index a8784a6d150..370418134c3 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -234,7 +234,7 @@ var/global/chicken_count = 0 can_hide = 1 can_collar = 1 var/list/feedMessages = list("It clucks happily.","It clucks happily.") - var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") + var/list/layMessage = EGG_LAYING_MESSAGES var/list/validColors = list("brown","black","white") gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY From eb834db4f4c814f8fff0284b677bd9fd4aa7a1ee Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Jul 2018 15:22:16 -0400 Subject: [PATCH 23/32] Automatic changelog generation for PR #9247 [ci skip] --- html/changelogs/AutoChangeLog-pr-9247.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9247.yml diff --git a/html/changelogs/AutoChangeLog-pr-9247.yml b/html/changelogs/AutoChangeLog-pr-9247.yml new file mode 100644 index 00000000000..9bfe5a12504 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9247.yml @@ -0,0 +1,7 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscadd: "Abductors can now purchase a mind device to speak into crewmembers minds or give directives to abductees" + - rscadd: "Abductors now have their own versions of the FixOVein, Bonesetter, and Bonegel. Credit to Triiodine for the sprites" + - rscadd: "Adds a new electric shock and chemical gland for abductors" + - tweak: "viral gland generates random viruses and egg laying gland eggs now have random reagents in them" From 51c5f6c9232bdd40460530273545870dae8ccc45 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Jul 2018 15:26:47 -0400 Subject: [PATCH 24/32] Automatic changelog generation for PR #9258 [ci skip] --- html/changelogs/AutoChangeLog-pr-9258.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9258.yml diff --git a/html/changelogs/AutoChangeLog-pr-9258.yml b/html/changelogs/AutoChangeLog-pr-9258.yml new file mode 100644 index 00000000000..8827a2fd6d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9258.yml @@ -0,0 +1,4 @@ +author: "variableundefined" +delete-after: True +changes: + - tweak: "Cyborg Analyzer no longer rounds off the damage number it displays." From 96808768e90e8f61af3a5196909ff43c0482dbcf Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Jul 2018 20:47:10 +0000 Subject: [PATCH 25/32] Automatic changelog compile, [ci skip] --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 9 +++++++++ html/changelogs/AutoChangeLog-pr-9247.yml | 7 ------- html/changelogs/AutoChangeLog-pr-9258.yml | 4 ---- 4 files changed, 17 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9247.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9258.yml diff --git a/html/changelog.html b/html/changelog.html index db041fd29f2..3f60e917d5b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -69,6 +69,14 @@

    Fox McCloud updated:

    • Extract posibrains should have the correct names now
    • +
    • Abductors can now purchase a mind device to speak into crewmembers minds or give directives to abductees
    • +
    • Abductors now have their own versions of the FixOVein, Bonesetter, and Bonegel. Credit to Triiodine for the sprites
    • +
    • Adds a new electric shock and chemical gland for abductors
    • +
    • viral gland generates random viruses and egg laying gland eggs now have random reagents in them
    • +
    +

    variableundefined updated:

    +
      +
    • Cyborg Analyzer no longer rounds off the damage number it displays.

    25 July 2018

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b3da310a082..d825d60e441 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6691,3 +6691,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Non-hotel SNPCs work again Fox McCloud: - bugfix: Extract posibrains should have the correct names now + - rscadd: Abductors can now purchase a mind device to speak into crewmembers minds + or give directives to abductees + - rscadd: Abductors now have their own versions of the FixOVein, Bonesetter, and + Bonegel. Credit to Triiodine for the sprites + - rscadd: Adds a new electric shock and chemical gland for abductors + - tweak: viral gland generates random viruses and egg laying gland eggs now have + random reagents in them + variableundefined: + - tweak: Cyborg Analyzer no longer rounds off the damage number it displays. diff --git a/html/changelogs/AutoChangeLog-pr-9247.yml b/html/changelogs/AutoChangeLog-pr-9247.yml deleted file mode 100644 index 9bfe5a12504..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9247.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Abductors can now purchase a mind device to speak into crewmembers minds or give directives to abductees" - - rscadd: "Abductors now have their own versions of the FixOVein, Bonesetter, and Bonegel. Credit to Triiodine for the sprites" - - rscadd: "Adds a new electric shock and chemical gland for abductors" - - tweak: "viral gland generates random viruses and egg laying gland eggs now have random reagents in them" diff --git a/html/changelogs/AutoChangeLog-pr-9258.yml b/html/changelogs/AutoChangeLog-pr-9258.yml deleted file mode 100644 index 8827a2fd6d4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9258.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - tweak: "Cyborg Analyzer no longer rounds off the damage number it displays." From c8f04a86f45e94666bc3375f72b2f988388f7088 Mon Sep 17 00:00:00 2001 From: KasparoVy <12377767+KasparoVy@users.noreply.github.com> Date: Sat, 28 Jul 2018 00:01:09 -0400 Subject: [PATCH 26/32] Fixes Head Robotization by Resetting alt_head and icon_name Fixes issues robotizing the heads of mobs with alt_heads by resetting the alt_head and icon_name for sanity. --- code/modules/surgery/organs/subtypes/standard.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm index 0e4ecbe2f98..e04c27284ae 100644 --- a/code/modules/surgery/organs/subtypes/standard.dm +++ b/code/modules/surgery/organs/subtypes/standard.dm @@ -202,7 +202,6 @@ /obj/item/organ/external/head/replaced() name = limb_name - ..() /obj/item/organ/external/head/receive_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list(), ignore_resists = FALSE) @@ -222,6 +221,11 @@ alt_head = initial(alt_head) icon_name = initial(icon_name) +/obj/item/organ/external/head/robotize(company, make_tough = 0, convert_all = 1) //Undoes alt_head business to avoid getting in the way of robotization. Make sure we pass all args down the line... + alt_head = initial(alt_head) + icon_name = initial(icon_name) + ..() + /obj/item/organ/external/head/set_dna(datum/dna/new_dna) ..() new_dna.write_head_attributes(src) From 187a0e418444dde36a71f26ea0e437c999387803 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 28 Jul 2018 03:11:21 -0400 Subject: [PATCH 27/32] Automatic changelog generation for PR #9268 [ci skip] --- html/changelogs/AutoChangeLog-pr-9268.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9268.yml diff --git a/html/changelogs/AutoChangeLog-pr-9268.yml b/html/changelogs/AutoChangeLog-pr-9268.yml new file mode 100644 index 00000000000..cbd566e5d0e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9268.yml @@ -0,0 +1,4 @@ +author: "KasparoVy" +delete-after: True +changes: + - bugfix: "You can now safely augment the heads of pointy-snooted Unathi, although your mileage may vary." From 63e46ba87e295c894363a64c302e14c0e0442234 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 28 Jul 2018 07:56:25 +0000 Subject: [PATCH 28/32] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-9268.yml | 4 ---- 3 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9268.yml diff --git a/html/changelog.html b/html/changelog.html index 3f60e917d5b..cf1341a3dad 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->
    +

    28 July 2018

    +

    KasparoVy updated:

    +
      +
    • You can now safely augment the heads of pointy-snooted Unathi, although your mileage may vary.
    • +
    +

    27 July 2018

    AffectedArc07 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d825d60e441..6cdaaed7186 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6700,3 +6700,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. random reagents in them variableundefined: - tweak: Cyborg Analyzer no longer rounds off the damage number it displays. +2018-07-28: + KasparoVy: + - bugfix: You can now safely augment the heads of pointy-snooted Unathi, although + your mileage may vary. diff --git a/html/changelogs/AutoChangeLog-pr-9268.yml b/html/changelogs/AutoChangeLog-pr-9268.yml deleted file mode 100644 index cbd566e5d0e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9268.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - bugfix: "You can now safely augment the heads of pointy-snooted Unathi, although your mileage may vary." From 06d5410b3a5a2cf4a2fe1259ccfc7d4f348c8d36 Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Sat, 28 Jul 2018 21:36:53 +0300 Subject: [PATCH 29/32] all crate things must come to an end --- code/datums/supplypacks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 353d38a6932..3dc03057228 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1236,8 +1236,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/materials/plastic30 name = "30 Plastic Sheets Crate" contains = list(/obj/item/stack/sheet/plastic) - amount = 50 - cost = 10 + amount = 30 + cost = 35 containername = "plastic sheets crate" ////////////////////////////////////////////////////////////////////////////// From 5bfb03fd54bd321b9662fdbf7d2769a9591f1b6a Mon Sep 17 00:00:00 2001 From: FreeStylaLT Date: Sat, 28 Jul 2018 21:50:51 +0300 Subject: [PATCH 30/32] crate pun --- code/datums/supplypacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 3dc03057228..628b754a5ae 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1237,7 +1237,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine name = "30 Plastic Sheets Crate" contains = list(/obj/item/stack/sheet/plastic) amount = 30 - cost = 35 + cost = 20 containername = "plastic sheets crate" ////////////////////////////////////////////////////////////////////////////// From 2163b4ad8e3491543fe73ef76a427625868f043b Mon Sep 17 00:00:00 2001 From: Crazy Lemon Date: Sat, 28 Jul 2018 12:09:18 -0700 Subject: [PATCH 31/32] Tiger isn't a maint anymore --- .github/CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ba253b3073e..b5564f3f6b0 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -523,7 +523,6 @@ responsible for properly tagging new pull requests and issues, moderating commen pull requests/issues, and merging/closing pull requests. ### Maintainer List -* [tigercat2000](https://github.com/tigercat2000) * [Fox P McCloud](https://github.com/Fox-McCloud) * [Crazy Lemon](https://github.com/Crazylemon64) From f167c32424ba713b504b43f270178ba87a2a6979 Mon Sep 17 00:00:00 2001 From: datlo Date: Sun, 29 Jul 2018 18:42:30 +0100 Subject: [PATCH 32/32] Fixes pyrosium description --- code/modules/reagents/chemistry/reagents/pyrotechnic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index b54444ee2d4..f2a5e8b9e24 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -221,7 +221,7 @@ /datum/reagent/pyrosium name = "Pyrosium" id = "pyrosium" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly heats all other reagents." color = "#B20000" // rgb: 139, 166, 233 process_flags = ORGANIC | SYNTHETIC