Merge branch 'master' into namelesstiders
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
|
||||
/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(deathchecks = TRUE)
|
||||
if(real_mind && mind)
|
||||
real_mind.current.audiovisual_redirect = null
|
||||
real_mind.current.ckey = ckey
|
||||
real_mind.current.stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||
if(deathchecks && vr_sleeper)
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
to_chat(occupant, "<span class='warning'>Transferring to virtual reality...</span>")
|
||||
if(vr_human && vr_human.stat == CONSCIOUS && !vr_human.real_mind)
|
||||
SStgui.close_user_uis(occupant, src)
|
||||
human_occupant.audiovisual_redirect = vr_human
|
||||
vr_human.real_mind = human_occupant.mind
|
||||
vr_human.ckey = human_occupant.ckey
|
||||
to_chat(vr_human, "<span class='notice'>Transfer successful! You are now playing as [vr_human] in VR!</span>")
|
||||
@@ -171,6 +172,7 @@
|
||||
O.equip(vr_human)
|
||||
if(transfer && H.mind)
|
||||
SStgui.close_user_uis(H, src)
|
||||
H.audiovisual_redirect = vr_human
|
||||
vr_human.ckey = H.ckey
|
||||
|
||||
/obj/machinery/vr_sleeper/proc/cleanup_vr_human()
|
||||
|
||||
@@ -605,6 +605,24 @@
|
||||
world.update_status()
|
||||
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle AI", "[!alai ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/toggleMulticam()
|
||||
set category = "Server"
|
||||
set desc="Turns mutlicam on and off."
|
||||
set name="Toggle Multicam"
|
||||
var/almcam = CONFIG_GET(flag/allow_ai_multicam)
|
||||
CONFIG_SET(flag/allow_ai_multicam, !almcam)
|
||||
if (almcam)
|
||||
to_chat(world, "<B>The AI no longer has multicam.</B>")
|
||||
for(var/i in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/aiPlayer = i
|
||||
if(aiPlayer.multicam_on)
|
||||
aiPlayer.end_multicam()
|
||||
else
|
||||
to_chat(world, "<B>The AI now has multicam.</B>")
|
||||
log_admin("[key_name(usr)] toggled AI multicam.")
|
||||
world.update_status()
|
||||
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Multicam", "[!almcam ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/toggleaban()
|
||||
set category = "Server"
|
||||
set desc="Respawn basically"
|
||||
|
||||
@@ -118,6 +118,7 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
|
||||
/datum/admins/proc/toggleaban,
|
||||
/client/proc/everyone_random,
|
||||
/datum/admins/proc/toggleAI,
|
||||
/datum/admins/proc/toggleMulticam,
|
||||
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
|
||||
/client/proc/cmd_debug_del_all,
|
||||
/client/proc/toggle_random_events,
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
var/mimicing = ""
|
||||
var/canrespec = 0
|
||||
var/changeling_speak = 0
|
||||
var/loudfactor = 0 //Used for blood tests. At 4, blood tests will succeed. At 10, blood tests will result in an explosion.
|
||||
var/bloodtestwarnings = 0 //Used to track if the ling has been notified that they will pass blood tests.
|
||||
var/datum/dna/chosen_dna
|
||||
var/obj/effect/proc_holder/changeling/sting/chosen_sting
|
||||
var/datum/cellular_emporium/cellular_emporium
|
||||
@@ -71,8 +73,6 @@
|
||||
reset_powers()
|
||||
create_initial_profile()
|
||||
if(give_objectives)
|
||||
if(team_mode)
|
||||
forge_team_objectives()
|
||||
forge_objectives()
|
||||
remove_clownmut()
|
||||
. = ..()
|
||||
@@ -123,6 +123,8 @@
|
||||
/datum/antagonist/changeling/proc/reset_powers()
|
||||
if(purchasedpowers)
|
||||
remove_changeling_powers()
|
||||
loudfactor = 0
|
||||
bloodtestwarnings = 0
|
||||
//Repurchase free powers.
|
||||
for(var/path in all_powers)
|
||||
var/obj/effect/proc_holder/changeling/S = new path()
|
||||
@@ -174,6 +176,13 @@
|
||||
geneticpoints -= thepower.dna_cost
|
||||
purchasedpowers += thepower
|
||||
thepower.on_purchase(owner.current)
|
||||
loudfactor += thepower.loudness
|
||||
if(loudfactor >= 4 && !bloodtestwarnings)
|
||||
to_chat(owner.current, "<span class='warning'>Our blood is growing flammable. Our blood will react violently to heat.</span>")
|
||||
bloodtestwarnings = 1
|
||||
if(loudfactor >= 10 && bloodtestwarnings < 2)
|
||||
to_chat(owner.current, "<span class='warning'>Our blood has grown extremely flammable. Our blood will react explosively to heat.</span>")
|
||||
bloodtestwarnings = 2
|
||||
|
||||
/datum/antagonist/changeling/proc/readapt()
|
||||
if(!ishuman(owner.current))
|
||||
@@ -182,6 +191,7 @@
|
||||
if(canrespec)
|
||||
to_chat(owner.current, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
|
||||
reset_powers()
|
||||
playsound(get_turf(owner.current), 'sound/effects/lingreadapt.ogg', 75, TRUE, 5, soundenvwet = 0)
|
||||
canrespec = 0
|
||||
SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt")
|
||||
return 1
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD
|
||||
var/always_keep = 0 // important for abilities like revive that screw you if you lose them.
|
||||
var/ignores_fakedeath = FALSE // usable with the FAKEDEATH flag
|
||||
var/loudness = 0 //Determines how much having this ability will affect changeling blood tests. At 4, the blood will react violently and turn to ash, creating a unique message in the process. At 10, the blood will explode when heated.
|
||||
|
||||
|
||||
/obj/effect/proc_holder/changeling/proc/on_purchase(mob/user, is_respec)
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/obj/effect/proc_holder/changeling/biodegrade
|
||||
name = "Biodegrade"
|
||||
desc = "Dissolves restraints or other objects preventing free movement."
|
||||
helptext = "This is obvious to nearby people, and can destroy standard restraints and closets."
|
||||
helptext = "This is obvious to nearby people, and can destroy standard restraints and closets. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
chemical_cost = 30 //High cost to prevent spam
|
||||
loudness = 1
|
||||
dna_cost = 2
|
||||
req_human = 1
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/obj/effect/proc_holder/changeling/digitalcamo
|
||||
name = "Digital Camouflage"
|
||||
desc = "By evolving the ability to distort our form and proportions, we defeat common algorithms used to detect lifeforms on cameras."
|
||||
helptext = "We cannot be tracked by camera or seen by AI units while using this skill. However, humans looking at us will find us... uncanny."
|
||||
helptext = "We cannot be tracked by camera or seen by AI units while using this skill. However, humans looking at us will find us... uncanny. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
dna_cost = 1
|
||||
loudness = 1
|
||||
|
||||
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
|
||||
/obj/effect/proc_holder/changeling/digitalcamo/sting_action(mob/user)
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/obj/effect/proc_holder/changeling/headcrab
|
||||
name = "Last Resort"
|
||||
desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel."
|
||||
helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us."
|
||||
helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us. This ability is loud, and might cause our blood to react violently to heat."
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
loudness = 2
|
||||
req_human = 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "Hivemind Communication"
|
||||
desc = "We tune our senses to the airwaves to allow us to discreetly communicate and exchange DNA with other changelings."
|
||||
helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives."
|
||||
dna_cost = 0
|
||||
dna_cost = 1
|
||||
chemical_cost = -1
|
||||
|
||||
/obj/effect/proc_holder/changeling/hivemind_comms/on_purchase(mob/user, is_respec)
|
||||
@@ -17,6 +17,9 @@
|
||||
var/obj/effect/proc_holder/changeling/hivemind_download/S2 = new
|
||||
if(!changeling.has_sting(S2))
|
||||
changeling.purchasedpowers+=S2
|
||||
var/obj/effect/proc_holder/changeling/linglink/S3 = new
|
||||
if(!changeling.has_sting(S3))
|
||||
changeling.purchasedpowers+=S3
|
||||
|
||||
// HIVE MIND UPLOAD/DOWNLOAD DNA
|
||||
GLOBAL_LIST_EMPTY(hivemind_bank)
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/obj/effect/proc_holder/changeling/lesserform
|
||||
name = "Lesser Form"
|
||||
desc = "We debase ourselves and become lesser. We become a monkey."
|
||||
desc = "We debase ourselves and become lesser. We become a monkey. This ability is loud, and might cause our blood to react violently to heat."
|
||||
chemical_cost = 5
|
||||
dna_cost = 1
|
||||
loudness = 2
|
||||
req_human = 1
|
||||
|
||||
//Transform into a monkey.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Hivemind Link"
|
||||
desc = "Link your victim's mind into the hivemind for personal interrogation."
|
||||
chemical_cost = 0
|
||||
dna_cost = 0
|
||||
dna_cost = -1
|
||||
req_human = 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user)
|
||||
|
||||
@@ -134,9 +134,10 @@
|
||||
/obj/effect/proc_holder/changeling/weapon/arm_blade
|
||||
name = "Arm Blade"
|
||||
desc = "We reform one of our arms into a deadly blade."
|
||||
helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form."
|
||||
helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form. This ability is loud, and might cause our blood to react violently to heat."
|
||||
chemical_cost = 20
|
||||
dna_cost = 2
|
||||
loudness = 2
|
||||
req_human = 1
|
||||
weapon_type = /obj/item/melee/arm_blade
|
||||
weapon_name_simple = "blade"
|
||||
@@ -215,9 +216,11 @@
|
||||
desc = "We ready a tentacle to grab items or victims with."
|
||||
helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \
|
||||
Help will simply drag them closer, Disarm will grab whatever they're holding instead of them, Grab will put the victim in our hold after catching it, \
|
||||
and Harm will stun it, and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form."
|
||||
and Harm will stun it, and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form.\
|
||||
This ability is loud, and might cause our blood to react violently to heat."
|
||||
chemical_cost = 10
|
||||
dna_cost = 2
|
||||
loudness = 2
|
||||
req_human = 1
|
||||
weapon_type = /obj/item/gun/magic/tentacle
|
||||
weapon_name_simple = "tentacle"
|
||||
@@ -393,9 +396,10 @@
|
||||
/obj/effect/proc_holder/changeling/weapon/shield
|
||||
name = "Organic Shield"
|
||||
desc = "We reform one of our arms into a hard shield."
|
||||
helptext = "Organic tissue cannot resist damage forever; the shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form."
|
||||
helptext = "Organic tissue cannot resist damage forever; the shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
loudness = 1
|
||||
req_human = 1
|
||||
|
||||
weapon_type = /obj/item/shield/changeling
|
||||
@@ -445,9 +449,10 @@
|
||||
/obj/effect/proc_holder/changeling/suit/organic_space_suit
|
||||
name = "Organic Space Suit"
|
||||
desc = "We grow an organic suit to protect ourselves from space exposure."
|
||||
helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Cannot be used in lesser form."
|
||||
helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Cannot be used in lesser form. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
chemical_cost = 20
|
||||
dna_cost = 2
|
||||
loudness = 1
|
||||
req_human = 1
|
||||
|
||||
suit_type = /obj/item/clothing/suit/space/changeling
|
||||
@@ -492,9 +497,10 @@
|
||||
/obj/effect/proc_holder/changeling/suit/armor
|
||||
name = "Chitinous Armor"
|
||||
desc = "We turn our skin into tough chitin to protect us from damage."
|
||||
helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Cannot be used in lesser form."
|
||||
helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Cannot be used in lesser form. This ability is loud, and might cause our blood to react violently to heat."
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
loudness = 2
|
||||
req_human = 1
|
||||
recharge_slowdown = 0.25
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/obj/effect/proc_holder/changeling/resonant_shriek
|
||||
name = "Resonant Shriek"
|
||||
desc = "Our lungs and vocal cords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded."
|
||||
helptext = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors."
|
||||
helptext = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
loudness = 1
|
||||
req_human = 1
|
||||
|
||||
//A flashy ability, good for crowd control and sewing chaos.
|
||||
@@ -30,8 +31,10 @@
|
||||
/obj/effect/proc_holder/changeling/dissonant_shriek
|
||||
name = "Dissonant Shriek"
|
||||
desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics."
|
||||
helptext = "Emits a high-frequency sound that overloads nearby electronics. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
loudness = 1
|
||||
|
||||
//A flashy ability, good for crowd control and sewing chaos.
|
||||
/obj/effect/proc_holder/changeling/dissonant_shriek/sting_action(mob/user)
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/obj/effect/proc_holder/changeling/spiders
|
||||
name = "Spread Infestation"
|
||||
desc = "Our form divides, creating arachnids which will grow into deadly beasts."
|
||||
helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 3 DNA gained through Absorb, and not through DNA sting."
|
||||
helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires at least 3 DNA gained through Absorb, and not through DNA sting. This ability is very loud, and will guarantee that our blood will react violently to heat."
|
||||
chemical_cost = 45
|
||||
dna_cost = 1
|
||||
loudness = 4
|
||||
req_absorbs = 3
|
||||
|
||||
//Makes some spiderlings. Good for setting traps and causing general trouble.
|
||||
|
||||
@@ -64,10 +64,11 @@
|
||||
/obj/effect/proc_holder/changeling/sting/transformation
|
||||
name = "Transformation Sting"
|
||||
desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
|
||||
helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human."
|
||||
helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
sting_icon = "sting_transform"
|
||||
chemical_cost = 50
|
||||
dna_cost = 3
|
||||
loudness = 1
|
||||
var/datum/changelingprofile/selected_dna = null
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/transformation/Click()
|
||||
@@ -111,10 +112,11 @@
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade
|
||||
name = "False Armblade Sting"
|
||||
desc = "We silently sting a human, injecting a retrovirus that mutates their arm to temporarily appear as an armblade."
|
||||
helptext = "The victim will form an armblade much like a changeling would, except the armblade is dull and useless."
|
||||
helptext = "The victim will form an armblade much like a changeling would, except the armblade is dull and useless. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
sting_icon = "sting_armblade"
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
loudness = 1
|
||||
|
||||
/obj/item/melee/arm_blade/false
|
||||
desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless."
|
||||
@@ -183,10 +185,11 @@
|
||||
/obj/effect/proc_holder/changeling/sting/mute
|
||||
name = "Mute Sting"
|
||||
desc = "We silently sting a human, completely silencing them for a short time."
|
||||
helptext = "Does not provide a warning to the victim that they have been stung, until they try to speak and cannot."
|
||||
helptext = "Does not provide a warning to the victim that they have been stung, until they try to speak and cannot. This ability is loud, and might cause our blood to react violently to heat."
|
||||
sting_icon = "sting_mute"
|
||||
chemical_cost = 20
|
||||
dna_cost = 2
|
||||
loudness = 2
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/mute/sting_action(mob/user, mob/living/carbon/target)
|
||||
log_combat(user, target, "stung", "mute sting")
|
||||
@@ -196,10 +199,11 @@
|
||||
/obj/effect/proc_holder/changeling/sting/blind
|
||||
name = "Blind Sting"
|
||||
desc = "Temporarily blinds the target."
|
||||
helptext = "This sting completely blinds a target for a short time."
|
||||
helptext = "This sting completely blinds a target for a short time. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
sting_icon = "sting_blind"
|
||||
chemical_cost = 25
|
||||
dna_cost = 1
|
||||
loudness = 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target)
|
||||
log_combat(user, target, "stung", "blind sting")
|
||||
@@ -229,10 +233,11 @@
|
||||
/obj/effect/proc_holder/changeling/sting/cryo
|
||||
name = "Cryogenic Sting"
|
||||
desc = "We silently sting a human with a cocktail of chemicals that freeze them."
|
||||
helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing."
|
||||
helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
sting_icon = "sting_cryo"
|
||||
chemical_cost = 15
|
||||
dna_cost = 2
|
||||
loudness = 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/cryo/sting_action(mob/user, mob/target)
|
||||
log_combat(user, target, "stung", "cryo sting")
|
||||
|
||||
@@ -194,10 +194,12 @@
|
||||
else
|
||||
L.visible_message("<span class='warning'>[L]'s eyes blaze with brilliant light!</span>", \
|
||||
"<span class='userdanger'>Your vision suddenly screams with white-hot light!</span>")
|
||||
L.Knockdown(160)
|
||||
L.adjustStaminaLoss(140) // now kindle works pretty much like bloodcult stun knockdown and stamcrit wise
|
||||
L.Knockdown(15, TRUE, FALSE, 15)
|
||||
L.apply_status_effect(STATUS_EFFECT_KINDLE)
|
||||
L.flash_act(1, 1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
if(iscultist(L))
|
||||
L.adjustFireLoss(15)
|
||||
..()
|
||||
|
||||
@@ -24,6 +24,19 @@
|
||||
description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium."
|
||||
gas_type = /datum/gas/tritium
|
||||
|
||||
/datum/bounty/item/engineering/pacman
|
||||
name = "P.A.C.M.A.N.-type portable generator"
|
||||
description = "A neighboring station had a problem with their SMES, and now need something to power their communications console. Can you send them a P.AC.M.A.N.?"
|
||||
reward = 3500 //2500 for the cargo one
|
||||
wanted_types = list(/obj/machinery/power/port_gen/pacman)
|
||||
|
||||
/datum/bounty/item/engineering/canisters
|
||||
name = "Gas Canisters"
|
||||
description = "After a recent debacle in a nearby sector, 10 gas canisters are needed for containing an experimental aerosol before it kills all the local fauna."
|
||||
reward = 5000
|
||||
required_count = 10 //easy to make
|
||||
wanted_types = list(/obj/machinery/portable_atmospherics/canister)
|
||||
|
||||
/datum/bounty/item/engineering/energy_ball
|
||||
name = "Contained Tesla Ball"
|
||||
description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
|
||||
|
||||
@@ -57,3 +57,71 @@
|
||||
description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?"
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/organ/tail/cat)
|
||||
|
||||
/datum/bounty/item/medical/blood
|
||||
name = "Generic Blood"
|
||||
description = "Nanotrasen's annual blood drive is back up to full speed, following the garlic incident. Good blood in good volumes accepted for Credit returns."
|
||||
reward = 3500
|
||||
required_count = 600
|
||||
wanted_types = list(/datum/reagent/blood)
|
||||
|
||||
/* If anyone wants to try and fix/work, go for it
|
||||
/datum/bounty/item/medical/medibot // Mob so this dosn't work yet*
|
||||
name = "Medibot"
|
||||
description = "A sister station is dealing with um problem, they need a medibot to help treat their wounded..."
|
||||
reward = 3000
|
||||
wanted_types = list(/mob/living/simple_animal/bot/medbot)
|
||||
|
||||
/datum/bounty/item/medical/bloodl //Dosnt work do to how blood is yet*
|
||||
name = "L-type Blood"
|
||||
description = "After a small scuffle, a few of our lizard employees need another blood transfusion."
|
||||
reward = 4000
|
||||
required_count = 200
|
||||
wanted_types = (L,/datum/reagent/blood)
|
||||
if(istype(L,/datum/reagent/blood))
|
||||
wanted_types += L
|
||||
|
||||
/datum/bounty/item/medical/bloodu //Dosnt work do to how blood is yet*
|
||||
name = "U-Type Blood"
|
||||
description = "After dealing with a small revolt in a local penal colony, the colony's anemic CMO needs blood, urgently. With his compromised immune system, only the best blood can be used."
|
||||
reward = 5500 // Rarer blood
|
||||
required_count = 200
|
||||
wanted_types = (U,/datum/reagent/blood)
|
||||
if(istype(U,/datum/reagent/blood))
|
||||
wanted_types += U
|
||||
|
||||
*/
|
||||
|
||||
/datum/bounty/item/medical/surgery
|
||||
name = "Surgery tool implants"
|
||||
description = "Our medical interns keep dropping their Shambler's Juice while they're performing open heart surgery. One of them even had the audacity to say he only had two hands!"
|
||||
reward = 10000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/cyberimp/arm/surgery)
|
||||
|
||||
/datum/bounty/item/medical/chemmaker
|
||||
name = "Portable Chem Dispenser"
|
||||
description = "After a new chemist mixed up some water and a banana, we lost our only chem dispenser. Please send us a replacement and you will be compensated."
|
||||
reward = 7000
|
||||
wanted_types = list(/obj/machinery/chem_dispenser)
|
||||
|
||||
/datum/bounty/item/medical/advhealthscaner
|
||||
name = "Advanced Health Analyzer"
|
||||
description = "A ERT Medical unit needs the new 'advanced health analyzer', for a mission at a Station 4. Can you send some?."
|
||||
reward = 4000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/healthanalyzer/advanced)
|
||||
|
||||
/datum/bounty/item/medical/wallmounts
|
||||
name = "Defibrillator wall mounts"
|
||||
description = "New Space OSHA regulation state that are new cloning medical wing needs a few 'Easy to access defibrillartors'. Can you send a few before we get a lawsuit?"
|
||||
reward = 5000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/machinery/defibrillator_mount)
|
||||
|
||||
/datum/bounty/item/medical/defibrillator
|
||||
name = "New defibillators"
|
||||
description = "After years of storge are defibrillator units have become more liabilities then we want. Please send us some new ones to replace these old ones."
|
||||
reward = 5000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/defibrillator)
|
||||
|
||||
@@ -49,3 +49,17 @@
|
||||
reward = 5000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/kitchen/knife/combat/bone)
|
||||
|
||||
/datum/bounty/item/mining/basalt
|
||||
name = "Artificial Basalt Tiles"
|
||||
description = "Central Command's Ash Walker exhibit needs to be expanded again, we just need some more basalt flooring."
|
||||
reward = 5000
|
||||
required_count = 60
|
||||
wanted_types = list(/obj/item/stack/tile/basalt)
|
||||
|
||||
/datum/bounty/item/mining/fruit
|
||||
name = "Cactus Fruit"
|
||||
description = "Central Command's Ash Walker habitat needs more fauna, send us some local fruit seeds!"
|
||||
reward = 2000
|
||||
required_count = 1
|
||||
wanted_types = list(/obj/item/seeds/lavaland/cactus)
|
||||
|
||||
@@ -64,3 +64,55 @@
|
||||
description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay."
|
||||
reward = 10000
|
||||
wanted_types = list(/obj/item/gun/energy/e_gun/nuclear)
|
||||
|
||||
/datum/bounty/item/science/bscells
|
||||
name = "Bluespace Power Cells"
|
||||
description = "Someone in upper management keeps using the excuse that his tablet battery dies when he's in the middle of work. This will be the last time he doesn't have his presentation, I swear to -"
|
||||
reward = 7000
|
||||
required_count = 10 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/cell/bluespace)
|
||||
|
||||
/datum/bounty/item/science/t4manip
|
||||
name = "Femto-Manipulators"
|
||||
description = "One of our Chief Engineers has OCD. Can you send us some femto-manipulators so he stops complaining that his ID doesn't fit perfectly in the PDA slot?"
|
||||
reward = 7000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/manipulator/femto)
|
||||
|
||||
/datum/bounty/item/science/t4bins
|
||||
name = "Bluespace Matter Bins"
|
||||
description = "The local Janitorial union has gone on strike. Can you send us some bluespace bins so we don't have to take out our own trash?"
|
||||
reward = 7000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/matter_bin/bluespace)
|
||||
|
||||
/datum/bounty/item/science/t4capacitor
|
||||
name = "Quadratic Capacitor"
|
||||
description = "One of our linguists doesn't understand why they're called Quadratic capacitors. Can you give him a few so he leaves us alone about it?"
|
||||
reward = 7000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/capacitor/quadratic)
|
||||
|
||||
/datum/bounty/item/science/t4triphasic
|
||||
name = "Triphasic Scanning Module"
|
||||
description = "One of our scientists got into the liberty caps and is demanding new scanning modules so he can talk to ghosts. At this point we just want him out of our office."
|
||||
reward = 7000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/scanning_module/triphasic)
|
||||
|
||||
/datum/bounty/item/science/t4microlaser
|
||||
name = "Quad-Ultra Micro-Laser"
|
||||
description = "The cats on Vega 9 are breeding out of control. We need something to corral them into one area so we can saturation bomb it."
|
||||
reward = 7000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/micro_laser/quadultra)
|
||||
|
||||
/datum/bounty/item/science/fakecrystals
|
||||
name = "synthetic bluespace crystals"
|
||||
description = "Don't, uh, tell anyone, but one of our BSA arrays might have had a little... accident. Send us some bluespace crystals so we can recalibrate it before anyone realizes. The whole set uses artificial bluespace crystals, so we need and not any other type of bluespace crystals..."
|
||||
reward = 10000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/stack/ore/bluespace_crystal/artificial)
|
||||
exclude_types = list(/obj/item/stack/ore/bluespace_crystal,
|
||||
/obj/item/stack/sheet/bluespace_crystal,
|
||||
/obj/item/stack/ore/bluespace_crystal/refined)
|
||||
|
||||
@@ -11,3 +11,44 @@
|
||||
reward = 2000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/machinery/recharger)
|
||||
|
||||
/datum/bounty/item/security/practice
|
||||
name = "Practice Laser Gun"
|
||||
description = "Nanotrasen Military Academy is conducting routine marksmanship exercises. The clown hid all the practice lasers, and we're not using live weapons after last time."
|
||||
reward = 3000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/gun/energy/laser/practice)
|
||||
|
||||
/datum/bounty/item/security/flashshield
|
||||
name = "Strobe Shield"
|
||||
description = "One of our Emergency Response Agents thinks there's vampires in a local station. Send him something to help with his fear of the dark and protect him, too."
|
||||
reward = 5000
|
||||
wanted_types = list(/obj/item/assembly/flash/shield)
|
||||
|
||||
/datum/bounty/item/security/sechuds
|
||||
name = "Sec HUDs"
|
||||
description = "Nanotrasen military academy has started to train officers how to use Sec HUDs to the fullest affect. Please send spare Sec HUDs so we can teach the men."
|
||||
reward = 3000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/clothing/glasses/hud/security)
|
||||
|
||||
/datum/bounty/item/security/techslugs
|
||||
name = "Tech Slugs"
|
||||
description = "Nanotrasen Military Academy is conducting an ammo loading and use lessons, on the new 'Tech Slugs'. Problem is we don't have any, please fix this..."
|
||||
reward = 7500
|
||||
required_count = 15
|
||||
wanted_types = list(/obj/item/ammo_casing/shotgun/techshell)
|
||||
|
||||
/datum/bounty/item/security/WT550
|
||||
name = "Spare WT-550 clips"
|
||||
description = "Nanotrasen Military Academy's ammunition is running low, please send in spare ammo for practice."
|
||||
reward = 7500
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/ammo_box/magazine/wt550m9)
|
||||
|
||||
/datum/bounty/item/security/pins
|
||||
name = "Test range firing pins"
|
||||
description = "Nanotrasen Military Academy just got a new set of guns, sadly they didn't come with any pins. Can you send us some Test range locked firing pins?"
|
||||
reward = 5000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/firing_pin/test_range)
|
||||
|
||||
@@ -72,4 +72,6 @@
|
||||
|
||||
var/list/credits //lazy list of all credit object bound to this client
|
||||
|
||||
var/datum/player_details/player_details //these persist between logins/logouts during the same round.
|
||||
var/datum/player_details/player_details //these persist between logins/logouts during the same round.
|
||||
|
||||
var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen.
|
||||
|
||||
@@ -454,6 +454,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
GLOB.ahelp_tickets.ClientLogout(src)
|
||||
GLOB.directory -= ckey
|
||||
GLOB.clients -= src
|
||||
QDEL_LIST_ASSOC_VAL(char_render_holders)
|
||||
if(movingmob != null)
|
||||
movingmob.client_mobs_in_contents -= mob
|
||||
UNSETEMPTY(movingmob.client_mobs_in_contents)
|
||||
@@ -877,3 +878,23 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
|
||||
/client/proc/AnnouncePR(announcement)
|
||||
if(prefs && prefs.chat_toggles & CHAT_PULLR)
|
||||
to_chat(src, announcement)
|
||||
|
||||
/client/proc/show_character_previews(mutable_appearance/MA)
|
||||
var/pos = 0
|
||||
for(var/D in GLOB.cardinals)
|
||||
pos++
|
||||
var/obj/screen/O = LAZYACCESS(char_render_holders, "[D]")
|
||||
if(!O)
|
||||
O = new
|
||||
LAZYSET(char_render_holders, "[D]", O)
|
||||
screen |= O
|
||||
O.appearance = MA
|
||||
O.dir = D
|
||||
O.screen_loc = "character_preview_map:0,[pos]"
|
||||
|
||||
/client/proc/clear_character_previews()
|
||||
for(var/index in char_render_holders)
|
||||
var/obj/screen/S = char_render_holders[index]
|
||||
screen -= S
|
||||
qdel(S)
|
||||
char_render_holders = null
|
||||
|
||||
+2212
-2125
File diff suppressed because it is too large
Load Diff
@@ -302,6 +302,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_mam_ears"] >> features["mam_ears"]
|
||||
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
|
||||
S["feature_taur"] >> features["taur"]
|
||||
S["feature_mam_snouts"] >> features["mam_snouts"]
|
||||
//Xeno features
|
||||
S["feature_xeno_tail"] >> features["xenotail"]
|
||||
S["feature_xeno_dors"] >> features["xenodorsal"]
|
||||
|
||||
@@ -20,17 +20,19 @@
|
||||
features = random_features()
|
||||
age = rand(AGE_MIN,AGE_MAX)
|
||||
|
||||
/datum/preferences/proc/update_preview_icon(nude = FALSE)
|
||||
/datum/preferences/proc/update_preview_icon()
|
||||
// Silicons only need a very basic preview since there is no customization for them.
|
||||
// var/wide_icon = FALSE //CITDEL THINGS
|
||||
// if(features["taur"] != "None")
|
||||
// wide_icon = TRUE
|
||||
|
||||
if(job_engsec_high)
|
||||
switch(job_engsec_high)
|
||||
if(AI_JF)
|
||||
preview_icon = icon('icons/mob/ai.dmi', "AI", SOUTH)
|
||||
preview_icon.Scale(64, 64)
|
||||
parent.show_character_previews(image('icons/mob/ai.dmi', icon_state = "AI", dir = SOUTH))
|
||||
return
|
||||
if(CYBORG)
|
||||
preview_icon = icon('icons/mob/robots.dmi', "robot", SOUTH)
|
||||
preview_icon.Scale(64, 64)
|
||||
parent.show_character_previews(image('icons/mob/robots.dmi', icon_state = "robot", dir = SOUTH))
|
||||
return
|
||||
|
||||
// Set up the dummy for its photoshoot
|
||||
@@ -57,30 +59,11 @@
|
||||
previewJob = job
|
||||
break
|
||||
|
||||
if(previewJob && !nude)
|
||||
mannequin.job = previewJob.title
|
||||
previewJob.equip(mannequin, TRUE)
|
||||
COMPILE_OVERLAYS(mannequin)
|
||||
CHECK_TICK
|
||||
preview_icon = icon('icons/effects/effects.dmi', "nothing")
|
||||
preview_icon.Scale(48+32, 16+32)
|
||||
CHECK_TICK
|
||||
mannequin.setDir(NORTH)
|
||||
if(previewJob)
|
||||
if(current_tab != 2)
|
||||
mannequin.job = previewJob.title
|
||||
previewJob.equip(mannequin, TRUE)
|
||||
|
||||
var/icon/stamp = getFlatIcon(mannequin)
|
||||
CHECK_TICK
|
||||
preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17)
|
||||
CHECK_TICK
|
||||
mannequin.setDir(WEST)
|
||||
stamp = getFlatIcon(mannequin)
|
||||
CHECK_TICK
|
||||
preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9)
|
||||
CHECK_TICK
|
||||
mannequin.setDir(SOUTH)
|
||||
stamp = getFlatIcon(mannequin)
|
||||
CHECK_TICK
|
||||
preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1)
|
||||
CHECK_TICK
|
||||
preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.
|
||||
CHECK_TICK
|
||||
COMPILE_OVERLAYS(mannequin)
|
||||
parent.show_character_previews(new /mutable_appearance(mannequin))
|
||||
unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
|
||||
|
||||
@@ -1522,18 +1522,3 @@
|
||||
/datum/sprite_accessory/moth_wings/snow
|
||||
name = "Snow"
|
||||
icon_state = "snow"
|
||||
|
||||
//Lunasune
|
||||
/datum/sprite_accessory/mam_ears/lunasune
|
||||
name = "lunasune"
|
||||
icon_state = "lunasune"
|
||||
hasinner = 1
|
||||
extra = TRUE
|
||||
extra_color_src = MUTCOLORS2
|
||||
ckeys_allowed = list("invader4352")
|
||||
|
||||
/datum/sprite_accessory/mam_tails/lunasune
|
||||
name = "lunasune"
|
||||
icon_state = "lunasune"
|
||||
extra = TRUE
|
||||
ckeys_allowed = list("invader4352")
|
||||
|
||||
@@ -198,6 +198,11 @@
|
||||
for(var/V in roundstart_quirks)
|
||||
var/datum/quirk/T = V
|
||||
blood_data["quirks"] += T.type
|
||||
blood_data["changeling_loudness"] = 0
|
||||
if(mind)
|
||||
var/datum/antagonist/changeling/ling = mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(istype(ling))
|
||||
blood_data["changeling_loudness"] = ling.loudfactor
|
||||
return blood_data
|
||||
|
||||
//get the id of the substance this mob use as blood.
|
||||
|
||||
@@ -317,9 +317,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
if(!HD) //Decapitated
|
||||
return
|
||||
|
||||
if(H.has_trait(TRAIT_HUSK))
|
||||
return
|
||||
|
||||
var/datum/sprite_accessory/S
|
||||
var/list/standing = list()
|
||||
|
||||
@@ -351,7 +351,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(H.facial_hair_style && (FACEHAIR in species_traits) && (!facialhair_hidden || dynamic_fhair_suffix))
|
||||
S = GLOB.facial_hair_styles_list[H.facial_hair_style]
|
||||
if(S)
|
||||
|
||||
//List of all valid dynamic_fhair_suffixes
|
||||
var/static/list/fextensions
|
||||
if(!fextensions)
|
||||
@@ -410,7 +409,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
else if(H.hair_style && (HAIR in species_traits))
|
||||
S = GLOB.hair_styles_list[H.hair_style]
|
||||
if(S)
|
||||
|
||||
//List of all valid dynamic_hair_suffixes
|
||||
var/static/list/extensions
|
||||
if(!extensions)
|
||||
@@ -612,6 +610,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "mam_ears"
|
||||
|
||||
if("mam_snouts" in mutant_bodyparts) //Take a closer look at that snout!
|
||||
if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "mam_snouts"
|
||||
|
||||
if("taur" in mutant_bodyparts)
|
||||
if(!H.dna.features["taur"] || H.dna.features["taur"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
|
||||
bodyparts_to_add -= "taur"
|
||||
@@ -696,13 +698,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer)
|
||||
|
||||
accessory_overlay.color = null //just because. reee.
|
||||
|
||||
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
|
||||
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "xenotail")
|
||||
bodypart = "tail"
|
||||
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human" || bodypart == "mam_waggingtail")
|
||||
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human")
|
||||
bodypart = "waggingtail"
|
||||
if(bodypart == "mam_waggingtail")
|
||||
bodypart = "tailwag"
|
||||
if(bodypart == "mam_ears" || bodypart == "ears")
|
||||
bodypart = "ears"
|
||||
if(bodypart == "mam_snouts" || bodypart == "snout")
|
||||
bodypart = "snout"
|
||||
if(bodypart == "xenohead")
|
||||
bodypart = "xhead"
|
||||
|
||||
@@ -714,6 +722,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(S.center)
|
||||
accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y)
|
||||
|
||||
var/list/colorlist = list()
|
||||
colorlist.Cut()
|
||||
colorlist += ReadRGB(H.dna.features["mcolor"])
|
||||
colorlist += ReadRGB(H.dna.features["mcolor2"])
|
||||
colorlist += ReadRGB(H.dna.features["mcolor3"])
|
||||
colorlist += list(0,0,0)
|
||||
for(var/index=1, index<=colorlist.len, index++)
|
||||
colorlist[index] = colorlist[index]/255
|
||||
|
||||
if(!(H.has_trait(TRAIT_HUSK)))
|
||||
if(!forced_colour)
|
||||
switch(S.color_src)
|
||||
@@ -732,6 +749,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
accessory_overlay.color = "#[fixed_mut_color3]"
|
||||
else
|
||||
accessory_overlay.color = "#[H.dna.features["mcolor3"]]"
|
||||
|
||||
if(MATRIXED)
|
||||
accessory_overlay.color = list(colorlist)
|
||||
|
||||
if(HAIR)
|
||||
if(hair_color == "mutcolor")
|
||||
accessory_overlay.color = "#[H.dna.features["mcolor"]]"
|
||||
@@ -743,6 +764,21 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
accessory_overlay.color = "#[H.eye_color]"
|
||||
else
|
||||
accessory_overlay.color = forced_colour
|
||||
else
|
||||
if(bodypart == "ears")
|
||||
accessory_overlay.icon_state = "m_ears_none_[layertext]"
|
||||
if(bodypart == "tail")
|
||||
accessory_overlay.icon_state = "m_tail_husk_[layertext]"
|
||||
if(MATRIXED)
|
||||
var/list/husklist = list()
|
||||
husklist += ReadRGB("#a3a3a3")
|
||||
husklist += ReadRGB("#a3a3a3")
|
||||
husklist += ReadRGB("#a3a3a3")
|
||||
husklist += list(0,0,0)
|
||||
for(var/index=1, index<=husklist.len, index++)
|
||||
husklist[index] = husklist[index]/255
|
||||
accessory_overlay.color = husklist
|
||||
|
||||
standing += accessory_overlay
|
||||
|
||||
if(S.hasinner)
|
||||
@@ -1221,6 +1257,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
. += speedmod
|
||||
. += H.physiology.speed_mod
|
||||
|
||||
if (H.m_intent == MOVE_INTENT_WALK && H.has_trait(TRAIT_SPEEDY_STEP))
|
||||
. -= 1
|
||||
|
||||
if(H.has_trait(TRAIT_IGNORESLOWDOWN))
|
||||
ignoreslow = 1
|
||||
|
||||
@@ -1703,6 +1742,21 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
H.adjust_bodytemperature((thermal_protection+1)*natural + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
|
||||
else //we're sweating, insulation hinders out ability to reduce heat - but will reduce the amount of heat we get from the environment
|
||||
H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
|
||||
switch((loc_temp - H.bodytemperature)*thermal_protection)
|
||||
if(-INFINITY to -50)
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 3)
|
||||
if(-50 to -35)
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 2)
|
||||
if(-35 to -20)
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 1)
|
||||
if(-20 to 0) //This is the sweet spot where air is considered normal
|
||||
H.clear_alert("temp")
|
||||
if(0 to 15) //When the air around you matches your body's temperature, you'll start to feel warm.
|
||||
H.throw_alert("temp", /obj/screen/alert/hot, 1)
|
||||
if(15 to 30)
|
||||
H.throw_alert("temp", /obj/screen/alert/hot, 2)
|
||||
if(30 to INFINITY)
|
||||
H.throw_alert("temp", /obj/screen/alert/hot, 3)
|
||||
|
||||
// +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt.
|
||||
if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT))
|
||||
@@ -1718,14 +1772,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
else
|
||||
firemodifier = min(firemodifier, 0)
|
||||
burn_damage = max(log(2-firemodifier,(H.bodytemperature-BODYTEMP_NORMAL))-5,0) // this can go below 5 at log 2.5
|
||||
if (burn_damage)
|
||||
switch(burn_damage)
|
||||
if(0 to 2)
|
||||
H.throw_alert("temp", /obj/screen/alert/hot, 1)
|
||||
if(2 to 4)
|
||||
H.throw_alert("temp", /obj/screen/alert/hot, 2)
|
||||
else
|
||||
H.throw_alert("temp", /obj/screen/alert/hot, 3)
|
||||
burn_damage = burn_damage * heatmod * H.physiology.heat_mod
|
||||
if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans
|
||||
H.emote("scream")
|
||||
@@ -1736,17 +1782,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
|
||||
switch(H.bodytemperature)
|
||||
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 1)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN)
|
||||
if(120 to 200)
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 2)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod*H.physiology.cold_mod, BURN)
|
||||
else
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 3)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN)
|
||||
|
||||
else
|
||||
H.clear_alert("temp")
|
||||
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
|
||||
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
id = "felinid"
|
||||
limbs_id = "human"
|
||||
|
||||
mutant_bodyparts = list("ears", "tail_human")
|
||||
default_features = list("mcolor" = "FFF", "tail_human" = "Cat", "ears" = "Cat", "wings" = "None")
|
||||
mutant_bodyparts = list("mam_ears", "mam_tail")
|
||||
default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None")
|
||||
|
||||
mutantears = /obj/item/organ/ears/cat
|
||||
mutanttail = /obj/item/organ/tail/cat
|
||||
@@ -23,38 +23,39 @@
|
||||
stop_wagging_tail(H)
|
||||
. = ..()
|
||||
|
||||
|
||||
/datum/species/human/felinid/can_wag_tail(mob/living/carbon/human/H)
|
||||
return ("tail_human" in mutant_bodyparts) || ("waggingtail_human" in mutant_bodyparts)
|
||||
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
|
||||
|
||||
/datum/species/human/felinid/is_wagging_tail(mob/living/carbon/human/H)
|
||||
return ("waggingtail_human" in mutant_bodyparts)
|
||||
return ("mam_waggingtail" in mutant_bodyparts)
|
||||
|
||||
/datum/species/human/felinid/start_wagging_tail(mob/living/carbon/human/H)
|
||||
if("tail_human" in mutant_bodyparts)
|
||||
mutant_bodyparts -= "tail_human"
|
||||
mutant_bodyparts |= "waggingtail_human"
|
||||
if("mam_tail" in mutant_bodyparts)
|
||||
mutant_bodyparts -= "mam_tail"
|
||||
mutant_bodyparts |= "mam_waggingtail"
|
||||
H.update_body()
|
||||
|
||||
/datum/species/human/felinid/stop_wagging_tail(mob/living/carbon/human/H)
|
||||
if("waggingtail_human" in mutant_bodyparts)
|
||||
mutant_bodyparts -= "waggingtail_human"
|
||||
mutant_bodyparts |= "tail_human"
|
||||
if("mam_waggingtail" in mutant_bodyparts)
|
||||
mutant_bodyparts -= "mam_waggingtail"
|
||||
mutant_bodyparts |= "mam_tail"
|
||||
H.update_body()
|
||||
|
||||
/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas!
|
||||
if(H.dna.features["tail_human"] == "None")
|
||||
H.dna.features["tail_human"] = "Cat"
|
||||
if(H.dna.features["ears"] == "None")
|
||||
H.dna.features["ears"] = "Cat"
|
||||
if(H.dna.features["ears"] == "Cat")
|
||||
if(H.dna.features["mam_tail"] == "None")
|
||||
H.dna.features["mam_tail"] = "Cat"
|
||||
if(H.dna.features["mam_ears"] == "None")
|
||||
H.dna.features["mam_ears"] = "Cat"
|
||||
if(H.dna.features["mam_ears"] == "Cat")
|
||||
var/obj/item/organ/ears/cat/ears = new
|
||||
ears.Insert(H, drop_if_replaced = FALSE)
|
||||
else
|
||||
mutantears = /obj/item/organ/ears
|
||||
if(H.dna.features["tail_human"] == "Cat")
|
||||
if(H.dna.features["mam_tail"] == "Cat")
|
||||
var/obj/item/organ/tail/cat/tail = new
|
||||
tail.Insert(H, drop_if_replaced = FALSE)
|
||||
else
|
||||
|
||||
@@ -359,7 +359,6 @@ There are several things that need to be remembered:
|
||||
apply_overlay(BELT_LAYER)
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/update_inv_wear_suit()
|
||||
remove_overlay(SUIT_LAYER)
|
||||
|
||||
@@ -391,8 +390,6 @@ There are several things that need to be remembered:
|
||||
else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE)
|
||||
S.alternate_worn_icon = null
|
||||
|
||||
|
||||
|
||||
overlays_standing[SUIT_LAYER] = S.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = ((wear_suit.alternate_worn_icon) ? S.alternate_worn_icon : 'icons/mob/suit.dmi'))
|
||||
var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER]
|
||||
if(OFFSET_SUIT in dna.species.offset_features)
|
||||
@@ -477,7 +474,6 @@ There are several things that need to be remembered:
|
||||
out += overlays_standing[i]
|
||||
return out
|
||||
|
||||
|
||||
//human HUD updates for items in our inventory
|
||||
|
||||
//update whether our head item appears on our hud.
|
||||
@@ -614,7 +610,7 @@ generate/load female uniform sprites matching all previously decided variables
|
||||
else if(dna.species.fixed_mut_color)
|
||||
. += "-coloured-[dna.species.fixed_mut_color]"
|
||||
else if(dna.features["mcolor"])
|
||||
. += "-coloured-[dna.features["mcolor"]]"
|
||||
. += "-coloured-[dna.features["mcolor"]]-[dna.features["mcolor2"]]-[dna.features["mcolor3"]]"
|
||||
else
|
||||
. += "-not_coloured"
|
||||
|
||||
@@ -644,6 +640,8 @@ generate/load female uniform sprites matching all previously decided variables
|
||||
. += "-digitigrade[BP.use_digitigrade]"
|
||||
if(BP.dmg_overlay_type)
|
||||
. += "-[BP.dmg_overlay_type]"
|
||||
if(BP.body_markings)
|
||||
. += "-[BP.body_markings]"
|
||||
|
||||
if(has_trait(TRAIT_HUSK))
|
||||
. += "-husk"
|
||||
|
||||
@@ -1067,10 +1067,12 @@
|
||||
update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall.
|
||||
|
||||
/mob/living/proc/update_z(new_z) // 1+ to register, null to unregister
|
||||
if(isnull(new_z) && audiovisual_redirect)
|
||||
return
|
||||
if (registered_z != new_z)
|
||||
if (registered_z)
|
||||
SSmobs.clients_by_zlevel[registered_z] -= src
|
||||
if (client)
|
||||
if (client || audiovisual_redirect)
|
||||
if (new_z)
|
||||
SSmobs.clients_by_zlevel[new_z] += src
|
||||
for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
var/datum/action/innate/deploy_last_shell/redeploy_action = new
|
||||
var/chnotify = 0
|
||||
|
||||
var/multicam_allowed = FALSE
|
||||
|
||||
var/multicam_on = FALSE
|
||||
var/obj/screen/movable/pic_in_pic/ai/master_multicam
|
||||
var/list/multicam_screens = list()
|
||||
|
||||
@@ -194,7 +194,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room)
|
||||
//AI procs
|
||||
|
||||
/mob/living/silicon/ai/proc/drop_new_multicam(silent = FALSE)
|
||||
if(!multicam_allowed)
|
||||
if(!CONFIG_GET(flag/allow_ai_multicam))
|
||||
if(!silent)
|
||||
to_chat(src, "<span class='warning'>This action is currently disabled. Contact an administrator to enable this feature.</span>")
|
||||
return
|
||||
@@ -213,7 +213,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room)
|
||||
return C
|
||||
|
||||
/mob/living/silicon/ai/proc/toggle_multicam()
|
||||
if(!multicam_allowed)
|
||||
if(!CONFIG_GET(flag/allow_ai_multicam))
|
||||
to_chat(src, "<span class='warning'>This action is currently disabled. Contact an administrator to enable this feature.</span>")
|
||||
return
|
||||
if(multicam_on)
|
||||
|
||||
@@ -261,11 +261,13 @@
|
||||
if(!has_trait(TRAIT_HUSK))
|
||||
remove_trait(TRAIT_DISFIGURED, "husk")
|
||||
update_body()
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/become_husk(source)
|
||||
if(!has_trait(TRAIT_HUSK))
|
||||
add_trait(TRAIT_DISFIGURED, "husk")
|
||||
update_body()
|
||||
. = TRUE
|
||||
add_trait(TRAIT_HUSK, source)
|
||||
|
||||
/mob/living/proc/cure_fakedeath(list/sources)
|
||||
|
||||
@@ -76,6 +76,8 @@
|
||||
return "a ... thing?"
|
||||
|
||||
/mob/proc/show_message(msg, type, alt_msg, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
|
||||
if(audiovisual_redirect)
|
||||
audiovisual_redirect.show_message(msg ? "<avredirspan class='small'>[msg]</avredirspan>" : null, type, alt_msg ? "<avredirspan class='small'>[alt_msg]</avredirspan>" : null, alt_type)
|
||||
|
||||
if(!client)
|
||||
return
|
||||
|
||||
@@ -110,3 +110,5 @@
|
||||
var/datum/click_intercept
|
||||
|
||||
var/registered_z
|
||||
|
||||
var/mob/audiovisual_redirect //Mob to redirect messages, speech, and sounds to
|
||||
|
||||
@@ -232,6 +232,8 @@
|
||||
remove_eyeblur()
|
||||
|
||||
/mob/proc/add_eyeblur()
|
||||
if(!client)
|
||||
return
|
||||
var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen
|
||||
var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen
|
||||
GW.add_filter("blurry_eyes", 2, EYE_BLUR(CLAMP(eye_blurry*0.1,0.6,3)))
|
||||
@@ -242,6 +244,8 @@
|
||||
add_eyeblur()
|
||||
|
||||
/mob/proc/remove_eyeblur()
|
||||
if(!client)
|
||||
return
|
||||
var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen
|
||||
var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen
|
||||
GW.remove_filter("blurry_eyes")
|
||||
|
||||
@@ -477,8 +477,12 @@
|
||||
|
||||
/datum/action/toggle_scope_zoom/IsAvailable()
|
||||
. = ..()
|
||||
if(!. && gun)
|
||||
if(!gun)
|
||||
return FALSE
|
||||
if(!.)
|
||||
gun.zoom(owner, FALSE)
|
||||
if(!owner.get_held_index_of_item(gun))
|
||||
return FALSE
|
||||
|
||||
/datum/action/toggle_scope_zoom/Remove(mob/living/L)
|
||||
gun.zoom(L, FALSE)
|
||||
|
||||
@@ -361,6 +361,8 @@
|
||||
var/required_temp = C.required_temp
|
||||
var/is_cold_recipe = C.is_cold_recipe
|
||||
var/meets_temp_requirement = 0
|
||||
var/has_special_react = C.special_react
|
||||
var/can_special_react = 0
|
||||
|
||||
for(var/B in cached_required_reagents)
|
||||
if(!has_reagent(B, cached_required_reagents[B]))
|
||||
@@ -396,7 +398,10 @@
|
||||
if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))
|
||||
meets_temp_requirement = 1
|
||||
|
||||
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement)
|
||||
if(!has_special_react || C.check_special_react(src))
|
||||
can_special_react = 1
|
||||
|
||||
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement && can_special_react)
|
||||
possible_reactions += C
|
||||
|
||||
if(possible_reactions.len)
|
||||
@@ -412,6 +417,7 @@
|
||||
selected_reaction = competitor
|
||||
var/list/cached_required_reagents = selected_reaction.required_reagents
|
||||
var/list/cached_results = selected_reaction.results
|
||||
var/special_react_result = selected_reaction.check_special_react(src)
|
||||
var/list/multiplier = INFINITY
|
||||
for(var/B in cached_required_reagents)
|
||||
multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B]))
|
||||
@@ -443,7 +449,7 @@
|
||||
ME2.name = "used slime extract"
|
||||
ME2.desc = "This extract has been used up."
|
||||
|
||||
selected_reaction.on_reaction(src, multiplier)
|
||||
selected_reaction.on_reaction(src, multiplier, special_react_result)
|
||||
reaction_occurred = 1
|
||||
|
||||
while(reaction_occurred)
|
||||
|
||||
@@ -13,13 +13,17 @@
|
||||
|
||||
var/required_temp = 0
|
||||
var/is_cold_recipe = 0 // Set to 1 if you want the recipe to only react when it's BELOW the required temp.
|
||||
var/special_react = FALSE //Determines if the recipe has special conditions for it to react. Mainly used for ling blood tests
|
||||
var/mix_message = "The solution begins to bubble." //The message shown to nearby people upon mixing, if applicable
|
||||
var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable
|
||||
|
||||
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume)
|
||||
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact)
|
||||
return
|
||||
//I recommend you set the result amount to the total volume of all components.
|
||||
|
||||
/datum/chemical_reaction/proc/check_special_react(datum/reagents/holder)
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_class = HOSTILE_SPAWN, mob_faction = "chemicalsummon")
|
||||
if(holder && holder.my_atom)
|
||||
var/atom/A = holder.my_atom
|
||||
|
||||
@@ -133,6 +133,18 @@
|
||||
required_reagents = list("slime_toxin" = 1, "mutagen" = 1)
|
||||
|
||||
|
||||
/datum/chemical_reaction/fermis_plush
|
||||
name = "Fermis plush"
|
||||
id = "fermis_plush"
|
||||
required_reagents = list("sugar" = 10, "blood" = 10, "stable_plasma" = 10)
|
||||
mob_react = FALSE
|
||||
required_temp = 400
|
||||
|
||||
/datum/chemical_reaction/fermis_plush/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i = 1, i <= created_volume, i+=10)
|
||||
new /obj/item/toy/plush/catgirl/fermis(location)
|
||||
|
||||
////////////////////////////////// VIROLOGY //////////////////////////////////////////
|
||||
|
||||
/datum/chemical_reaction/virus_food
|
||||
|
||||
@@ -464,4 +464,30 @@
|
||||
results = list("firefighting_foam" = 3)
|
||||
required_reagents = list("stabilizing_agent" = 1,"fluorosurfactant" = 1,"carbon" = 1)
|
||||
required_temp = 200
|
||||
is_cold_recipe = 1
|
||||
is_cold_recipe = 1
|
||||
|
||||
/datum/chemical_reaction/reagent_explosion/lingblood
|
||||
name = "Changeling Blood Reaction"
|
||||
id = "ling_blood_reaction"
|
||||
results = list("ash" = 1)
|
||||
required_reagents = list("blood" = 1)
|
||||
strengthdiv = 4 //The explosion should be somewhat strong if a full 15u is heated within a syringe. !!fun!!
|
||||
required_temp = 666
|
||||
special_react = TRUE
|
||||
mix_sound = 'sound/effects/lingbloodhiss.ogg'
|
||||
mix_message = "The blood bubbles and sizzles violently!"
|
||||
|
||||
/datum/chemical_reaction/reagent_explosion/lingblood/check_special_react(datum/reagents/holder)
|
||||
if(!holder)
|
||||
return FALSE
|
||||
var/list/D = holder.get_data("blood")
|
||||
if(D && D["changeling_loudness"])
|
||||
return (D["changeling_loudness"] >= 4 ? D["changeling_loudness"] : FALSE)
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/chemical_reaction/reagent_explosion/lingblood/on_reaction(datum/reagents/holder, created_volume, specialreact)
|
||||
if(specialreact >= 10)
|
||||
return ..()
|
||||
else
|
||||
return FALSE
|
||||
|
||||
@@ -849,10 +849,10 @@
|
||||
var/obj/vehicle/V = C
|
||||
var/datum/component/riding/R = V.GetComponent(/datum/component/riding)
|
||||
if(R)
|
||||
if(R.vehicle_move_delay <= 0 )
|
||||
if(R.vehicle_move_delay <= 1 )
|
||||
to_chat(user, "<span class='warning'>The [C] can't be made any faster!</span>")
|
||||
return ..()
|
||||
R.vehicle_move_delay = 0
|
||||
R.vehicle_move_delay = 1
|
||||
|
||||
to_chat(user, "<span class='notice'>You slather the red gunk over the [C], making it faster.</span>")
|
||||
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
|
||||
@@ -45,6 +45,10 @@
|
||||
var/species_color = ""
|
||||
var/mutation_color = ""
|
||||
var/no_update = 0
|
||||
var/list/body_markings = list() //for bodypart markings
|
||||
var/list/markings_color = list()
|
||||
var/auxmarking
|
||||
var/list/auxmarking_color = list()
|
||||
|
||||
var/animal_origin = null //for nonhuman bodypart (e.g. monkey)
|
||||
var/dismemberable = 1 //whether it can be dismembered with a weapon.
|
||||
@@ -285,6 +289,7 @@
|
||||
should_draw_gender = FALSE
|
||||
should_draw_greyscale = FALSE
|
||||
no_update = TRUE
|
||||
body_markings = "husk" // reeee
|
||||
|
||||
if(no_update)
|
||||
return
|
||||
@@ -298,6 +303,16 @@
|
||||
should_draw_citadel = S.should_draw_citadel // Citadel Addition
|
||||
species_flags_list = H.dna.species.species_traits
|
||||
|
||||
//body marking memes
|
||||
var/list/colorlist = list()
|
||||
colorlist.Cut()
|
||||
colorlist += ReadRGB(H.dna.features["mcolor"])
|
||||
colorlist += ReadRGB(H.dna.features["mcolor2"])
|
||||
colorlist += ReadRGB(H.dna.features["mcolor3"])
|
||||
colorlist += list(0,0,0)
|
||||
for(var/index=1, index<=colorlist.len, index++)
|
||||
colorlist[index] = colorlist[index]/255
|
||||
|
||||
if(S.use_skintones)
|
||||
skin_tone = H.skin_tone
|
||||
should_draw_greyscale = TRUE
|
||||
@@ -316,6 +331,17 @@
|
||||
else
|
||||
species_color = ""
|
||||
|
||||
if("mam_body_markings" in S.default_features)
|
||||
if(H.dna.features.["mam_body_markings"] != "None")
|
||||
body_markings = lowertext(H.dna.features.["mam_body_markings"])
|
||||
if(MATRIXED)
|
||||
markings_color = list(colorlist)
|
||||
else
|
||||
markings_color = (H.dna.features.["mcolor"])
|
||||
else
|
||||
body_markings = "None"
|
||||
markings_color = ""
|
||||
|
||||
if(!dropping_limb && H.dna.check_mutation(HULK))
|
||||
mutation_color = "00aa00"
|
||||
else
|
||||
@@ -346,6 +372,7 @@
|
||||
|
||||
//Gives you a proper icon appearance for the dismembered limb
|
||||
/obj/item/bodypart/proc/get_limb_icon(dropped)
|
||||
cut_overlays()
|
||||
icon_state = "" //to erase the default sprite, we're building the visual aspects of the bodypart through overlays alone.
|
||||
|
||||
. = list()
|
||||
@@ -358,9 +385,17 @@
|
||||
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir)
|
||||
if(burnstate)
|
||||
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
|
||||
if(body_markings)
|
||||
if(use_digitigrade == NOT_DIGITIGRADE)
|
||||
. += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else
|
||||
. += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
|
||||
var/image/aux
|
||||
var/image/marking
|
||||
var/image/auxmarking
|
||||
|
||||
. += limb
|
||||
|
||||
if(animal_origin)
|
||||
@@ -403,11 +438,31 @@
|
||||
limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
|
||||
else
|
||||
limb.icon_state = "[species_id]_[body_zone]"
|
||||
|
||||
// Body markings
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else if(species_id == "husk" && use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
else if(!use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
. += marking
|
||||
|
||||
// Citadel End
|
||||
|
||||
if(aux_zone)
|
||||
aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += aux
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
else
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += auxmarking
|
||||
|
||||
else
|
||||
limb.icon = icon
|
||||
@@ -416,17 +471,45 @@
|
||||
else
|
||||
limb.icon_state = "[body_zone]"
|
||||
if(aux_zone)
|
||||
aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir)
|
||||
aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += aux
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
else
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += auxmarking
|
||||
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else if(species_id == "husk" && use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
else if(!use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
. += marking
|
||||
return
|
||||
|
||||
|
||||
if(should_draw_greyscale)
|
||||
marking.color = null
|
||||
var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone))
|
||||
if(draw_color)
|
||||
limb.color = "#[draw_color]"
|
||||
if(aux_zone)
|
||||
aux.color = "#[draw_color]"
|
||||
if(body_markings)
|
||||
auxmarking.color = list(markings_color)
|
||||
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
marking.color = "#141414"
|
||||
else
|
||||
marking.color = list(markings_color)
|
||||
|
||||
|
||||
/obj/item/bodypart/deconstruct(disassembled = TRUE)
|
||||
drop_organs()
|
||||
|
||||
@@ -288,6 +288,7 @@
|
||||
O.drop_limb(1)
|
||||
qdel(O)
|
||||
N.attach_limb(src)
|
||||
|
||||
if(body_plan_changed && ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.w_uniform)
|
||||
@@ -311,4 +312,4 @@
|
||||
S.adjusted = NORMAL_STYLE
|
||||
else
|
||||
S.adjusted = ALT_STYLE
|
||||
H.update_inv_wear_suit()
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
Reference in New Issue
Block a user