Merge branch 'virgoMaster' into virgoPull

This commit is contained in:
Reddeyfish
2018-05-19 17:16:17 -07:00
203 changed files with 11021 additions and 7365 deletions
+19 -1
View File
@@ -82,4 +82,22 @@
name = "Smaller"
desc = "Your body is smaller than average."
icon_scale_percent = 0.9
icon_scale_percent = 0.9
/datum/modifier/trait/colorblind_taj
name = "Colorblind - B+R"
desc = "You are colorblind. You have a minor issue with blue colors and have difficulty recognizing them from red colors."
client_color = MATRIX_Taj_Colorblind
/datum/modifier/trait/colorblind_vulp
name = "Colorblind - G+R"
desc = "You are colorblind. You have a severe issue with green colors and have difficulty recognizing them from red colors."
client_color = MATRIX_Vulp_Colorblind
/datum/modifier/trait/colorblind_mono
name = "Colorblind - Mono"
desc = "You are colorblind. Your condition is rare, but you can see no colors at all."
client_color = MATRIX_Monochromia
+2 -2
View File
@@ -11,7 +11,7 @@
var/input
if(!message)
input = sanitize(input(src,"Choose an emote to display.") as text|null)
input = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason
else
input = message
if(input)
@@ -70,7 +70,7 @@
var/input
if(!message)
input = sanitize(input(src, "Choose an emote to display.") as text|null)
input = sanitize_or_reflect(input(src, "Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason
else
input = message
+14
View File
@@ -0,0 +1,14 @@
/datum/gender/herm
key = "herm"
He = "Shi"
he = "shi"
His = "Hir"
his = "hir"
him = "hir"
has = "has"
is = "is"
does = "does"
himself = "hirself"
s = "s"
hes = "shi's"
@@ -99,7 +99,7 @@
set name = "Set Gender Identity"
set desc = "Sets the pronouns when examined and performing an emote."
set category = "IC"
var/new_gender_identity = input("Please select a gender Identity.") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL)
var/new_gender_identity = input("Please select a gender Identity.") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL, HERM)
if(!new_gender_identity)
return 0
change_gender_identity(new_gender_identity)
@@ -110,4 +110,4 @@
set category = "IC"
set desc = "Switch tail layer on top."
tail_alt = !tail_alt
update_tail_showing()
update_tail_showing()
@@ -35,6 +35,12 @@
t_he = "it"
t_His = "Its"
t_his = "its"
if(HERM)
t_He = "Shi"
t_he = "shi"
t_His = "Hir"
t_his = "hir"
t_heavy = "curvy"
switch(weight_examine)
if(0 to 74)
@@ -88,6 +94,10 @@
t_He = "It"
t_his = "its"
t_His = "Its"
if(HERM)
t_He = "Shi"
t_his = "hir"
t_His = "Hir"
switch(nutrition_examine)
if(0 to 49)
message = "<span class='warning'>[t_He] [t_is] starving! You can hear [t_his] stomach snarling from across the room!</span>\n"
+1 -1
View File
@@ -3,7 +3,7 @@
if(name != GetVoice())
alt_name = "(as [get_id_name("Unknown")])"
message = sanitize(message)
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages, within reason
..(message, alt_name = alt_name, whispering = whispering)
/mob/living/carbon/human/proc/forcesay(list/append)
@@ -130,7 +130,7 @@ var/list/wrapped_species_by_ref = list()
if(!new_gender)
return
var/new_gender_identity = input("Please select a gender Identity.", "Shapeshifter Gender Identity") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL)
var/new_gender_identity = input("Please select a gender Identity.", "Shapeshifter Gender Identity") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL, HERM) //VOREStation Edit
if(!new_gender_identity)
return
@@ -33,9 +33,10 @@
var/type = H.nif.type
var/durability = H.nif.durability
var/list/nifsofts = H.nif.nifsofts
var/list/nif_savedata = H.nif.save_data.Copy()
..()
var/obj/item/device/nif/nif = new type(H,durability)
var/obj/item/device/nif/nif = new type(H,durability,nif_savedata)
nif.nifsofts = nifsofts
else
..()
@@ -184,6 +184,8 @@ VOREStation Removal End */
t_she = "They are"
else if(H.identifying_gender == NEUTER)
t_she = "It is"
else if(H.identifying_gender == HERM) //VOREStation Edit
t_she = "Shi is"
switch(stored_shock_by_ref["\ref[H]"])
if(1 to 10)
@@ -1,137 +1,151 @@
/mob/living/carbon/human/proc/begin_reconstitute_form() //Scree's race ability.in exchange for: No cloning.
/mob/living/carbon/human/proc/reconstitute_form() //Scree's race ability.in exchange for: No cloning.
set name = "Reconstitute Form"
set category = "Abilities"
if(world.time < last_special)
return
last_special = world.time + 50 //To prevent button spam.
// Sanity is mostly handled in chimera_regenerate()
var/confirm = alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to twenty minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", "Yes", "No")
if(confirm == "Yes")
chimera_regenerate()
/mob/living/carbon/human/proc/chimera_regenerate()
var/nutrition_used = nutrition/2
if(reviving == TRUE) //If they're already unable to
to_chat(src, "You are already reconstructing, or your body is currently recovering from the intense process of your previous reconstitution.")
return
if(stat == DEAD) //Uh oh, you died!
if(hasnutriment()) //Let's hope you have nutriment in you.... If not
var/time = (240+960/(1 + nutrition_used/75))
reviving = TRUE
to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
//don't need all the weakened, does_not_breathe, canmove, heal IB crap here like you do for live ones'cause they're DEAD.
spawn(time SECONDS)
if(src) //Runtime prevention.
if (stat == DEAD) // let's make sure they've not been defibbed or whatever
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch.</span>")
verbs += /mob/living/carbon/human/proc/hatch
return
else // their revive got aborted by being made not-dead. Remove their cooldown.
to_chat(src, "<span class='notice'>Your body has recovered from its ordeal, ready to regenerate itself again.</span>")
reviving = FALSE
return
else
return //Something went wrong.
else //Dead until nutrition injected.
to_chat(src, "Your body is too damaged to regenerate without additional nutrients to feed what few living cells remain.")
//If they're already regenerating
switch(reviving)
if(REVIVING_NOW)
to_chat(src, "You are already reconstructing, just wait for the reconstruction to finish!")
return
if(REVIVING_DONE)
to_chat(src, "Your reconstruction is done, but you need to hatch now.")
return
if(REVIVING_COOLDOWN)
to_chat(src, "You can't use that ability again so soon!")
return
else if(stat != DEAD) //If they're alive at the time of regenerating.
var/time = (240+960/(1 + nutrition_used/75))
weakened = 10000 //Since it takes 1 tick to lose one weaken. Due to prior rounding errors, you'd sometimes unweaken before regenning. This fixes that.
reviving = TRUE
canmove = 0 //Make them unable to move. In case they somehow get up before the delay.
to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
does_not_breathe = 1 //effectively makes them spaceworthy while regenning
var/nutrition_used = nutrition * 0.5
var/time = (240+960/(1 + nutrition_used/75))
spawn(time SECONDS)
if(stat != DEAD) //If they're still alive after regenning.
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
verbs += /mob/living/carbon/human/proc/hatch
return
else if(stat == DEAD)
if(hasnutriment()) //Let's hope you have nutriment in you.... If not
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
verbs += /mob/living/carbon/human/proc/hatch
return
else //Dead until nutrition injected.
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
reviving = FALSE // so they can try again when they're given a kickstart
return
else
return //Something went wrong
//Clicked regen while dead.
if(stat == DEAD)
//Has nutrition and dead, allow regen.
if(hasnutriment())
to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
//Scary spawnerization.
reviving = REVIVING_NOW
spawn(time SECONDS)
// Was dead, now not dead.
if(stat != DEAD)
to_chat(src, "<span class='notice'>Your body has recovered from its ordeal, ready to regenerate itself again.</span>")
reviving = 0 //Not bool
// Was dead, still dead.
else
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch.</span>")
verbs |= /mob/living/carbon/human/proc/hatch
reviving = REVIVING_DONE
//Dead until nutrition injected.
else
to_chat(src, "<span class='warning'>Your body is too damaged to regenerate without additional nutrients to feed what few living cells remain.</span>")
//Clicked regen while NOT dead
else
return //Something went wrong
to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
//Waiting for regen after being alive
reviving = REVIVING_NOW
spawn(time SECONDS)
//If they're still alive after regenning.
if(stat != DEAD)
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
verbs |= /mob/living/carbon/human/proc/hatch
reviving = REVIVING_DONE
//Was alive, now dead
else if(hasnutriment())
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
verbs |= /mob/living/carbon/human/proc/hatch
reviving = REVIVING_DONE
//Dead until nutrition injected.
else
to_chat(src, "<span class='warning'>Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.</span>")
reviving = 0 //Not boolean
/mob/living/carbon/human/proc/hasnutriment()
if (bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein.
return 1
return TRUE
else if (ingested.has_reagent("nutriment", 60) || src.ingested.has_reagent("protein", 30)) //try forcefeeding them, why not. Less effective.
return 1
else return 0
return TRUE
else return FALSE
/mob/living/carbon/human/proc/hatch()
set name = "Hatch"
set category = "Abilities"
if(world.time < last_special)
if(reviving != REVIVING_DONE)
//Hwhat?
verbs -= /mob/living/carbon/human/proc/hatch
return
last_special = world.time + 50 //To prevent button spam.
var/confirm = alert(usr, "Are you sure you want to hatch right now? This will be very obvious to anyone in view.", "Confirm Regeneration", "Yes", "No")
if(confirm == "Yes")
if(stat == DEAD) //Uh oh, you died!
if(hasnutriment()) //Let's hope you have nutriment in you.... If not
if(src) //Runtime prevention.
chimera_hatch()
visible_message("<span class='danger'><p><font size=4>The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //Bloody hell...
brainloss += 10 //Reviving from dead means you take a lil' brainloss on top of whatever was healed in the revive.
return
else
return //Runtime prevention
else //don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch.
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
reviving = FALSE // so they can try again when they're given a kickstart
//Dead when hatching
if(stat == DEAD)
//Check again for nutriment (necessary?)
if(hasnutriment())
chimera_hatch()
adjustBrainLoss(10) // if they're reviving from dead, they come back with 10 brainloss on top of whatever's unhealed.
visible_message("<span class='danger'><p><font size=4>The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //Bloody hell...
return
else if(stat != DEAD) //If they're alive at the time of regenerating.
//Don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch.
else
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
verbs -= /mob/living/carbon/human/proc/hatch
reviving = 0 //So they can try again when they're given a kickstart
//Alive when hatching
else
chimera_hatch()
visible_message("<span class='danger'><p><font size=4>The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //Bloody hell...
return
else
return //Runtime prevention.
/mob/living/carbon/human/proc/chimera_hatch()
nutrition -= nutrition/2 //Cut their nutrition in half.
var/old_nutrition = nutrition //Since the game is being annoying.
verbs -= /mob/living/carbon/human/proc/hatch
to_chat(src, "<span class='notice'>Your new body awakens, bursting free from your old skin.</span>")
var/T = get_turf(src)
new /obj/effect/gibspawner/human/scree(T)
var/braindamage = brainloss/2 //If you have 100 brainloss, it gives you 50.
does_not_breathe = 0 //start breathing again
revive() // I did have special snowflake code, but this is easier.
weakened = 2 //Not going to let you get up immediately. 2 ticks before you get up. Overrides the above 10000 weaken.
//Modify and record values (half nutrition and braindamage)
var/old_nutrition = nutrition * 0.5
var/braindamage = (brainloss * 0.5) //Can only heal half brain damage.
//I did have special snowflake code, but this is easier.
revive()
mutations.Remove(HUSK)
nutrition = old_nutrition
brainloss = braindamage //Gives them half their prior brain damage.
update_canmove()
setBrainLoss(braindamage)
//Drop everything
for(var/obj/item/W in src)
drop_from_inventory(W)
spawn(3600 SECONDS) //1 hour wait until you can revive.
reviving = FALSE
to_chat(src, "Your body has recovered from the strenuous effort of rebuilding itself.")
verbs -= /mob/living/carbon/human/proc/hatch
return
/obj/effect/gibspawner/human/scree
fleshcolor = "#14AD8B" //Scree blood.
//Unfreeze some things
does_not_breathe = FALSE
update_canmove()
weakened = 2
//Visual effects
var/T = get_turf(src)
new /obj/effect/gibspawner/human/xenochimera(T)
reviving = REVIVING_COOLDOWN
schedule_callback_in(1 HOUR, VARSET_CALLBACK(src, reviving, 0))
/obj/effect/gibspawner/human/xenochimera
fleshcolor = "#14AD8B"
bloodcolor = "#14AD8B"
/mob/living/carbon/human/proc/getlightlevel() //easier than having the same code in like three places
@@ -141,7 +155,7 @@
else return 0
/mob/living/carbon/human/proc/handle_feral()
if(handling_hal) return //avoid conflict with actual hallucinations
if(handling_hal) return
handling_hal = 1
if(client && feral >= 10) // largely a copy of handle_hallucinations() without the fake attackers. Unlike hallucinations, only fires once - if they're still feral they'll get hit again anyway.
@@ -734,6 +748,12 @@
add_attack_logs(src,T,"Shredded (hardvore)")
/mob/living/proc/shred_limb_temp()
set name = "Damage/Remove Prey's Organ (beartrap)"
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
set category = "Abilities"
shred_limb()
/mob/living/proc/flying_toggle()
set name = "Toggle Flight"
set desc = "While flying over open spaces, you will use up some nutrition. If you run out nutrition, you will fall. Additionally, you can't fly if you are too heavy."
@@ -22,7 +22,7 @@
tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite"
icobase_tail = 1
inherent_verbs = list(
/mob/living/carbon/human/proc/begin_reconstitute_form,
/mob/living/carbon/human/proc/reconstitute_form,
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/succubus_drain,
/mob/living/carbon/human/proc/succubus_drain_finalize,
@@ -40,9 +40,9 @@
Most, if not all chimeras possess the ability to undergo some type of regeneration process, at the cost of energy."
hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below.
cold_level_1 = -5000 // All cold debuffs are handled below in handle_environment_special
cold_level_2 = -5000
cold_level_3 = -5000
cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special
cold_level_2 = -1
cold_level_3 = -1
//primitive_form = "Farwa"
@@ -56,142 +56,198 @@
/datum/species/xenochimera/handle_environment_special(var/mob/living/carbon/human/H)
if(H.stat == 2) // If they're dead they won't think about being all feral and won't need all the code below.
return
//If they're KO'd/dead, they're probably not thinking a lot about much of anything.
if(!H.stat)
handle_feralness(H)
//handle feral triggers
if(H.nutrition <= 200||H.traumatic_shock > min(60, H.nutrition/10)) // Stress factors are in play
// If they're hungry, give nag messages.
if (!istype(H.loc, /mob)) // if they're in a mob, skip the hunger stuff so it doesn't mess with drain/absorption modes.
if(H.nutrition < 200 && H.nutrition > 150)
if(prob(0.5)) //A bit of an issue, not too bad.
H << "<span class='info'>You feel rather hungry. It might be a good idea to find some some food...</span>"
else if(H.nutrition <= 150 && H.nutrition > 100)
if(prob(0.5)) //Getting closer, should probably eat some food about now...
H << "<span class='warning'>You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat...</span>"
else if(H.nutrition <= 100) //Should've eaten sooner!
if(H.feral == 0)
H << "<span class='danger'><big>Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.</big></span>"
log_and_message_admins("has gone feral due to hunger.", H)
H.feral += 5 //just put them over the threshold by a decent amount for the first chunk.
if(H.stat == CONSCIOUS)
H.emote("twitch")
if(H.feral + H.nutrition < 150) //Feralness increases while this hungry, capped at 50-150 depending on hunger.
H.feral += 1
// If they're hurt, chance of snapping. Not if they're straight-up KO'd though.
if (H.stat == CONSCIOUS && H.traumatic_shock >=min(60, H.nutrition/10)) //at 360 nutrition, this is 30 brute/burn, or 18 halloss. Capped at 50 brute/30 halloss - if they take THAT much, no amount of satiation will help them. Also they're fat.
if (2.5*H.halloss >= H.traumatic_shock) //If the majority of their shock is due to halloss, greater chance of snapping.
if(prob(min(10,(0.2 * H.traumatic_shock))))
if(H.feral == 0)
H << "<span class='danger'><big>The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...</big></span>"
log_and_message_admins("has gone feral due to halloss.", H)
H.feral = max(H.feral, H.halloss) //if already more feral than their halloss justifies, don't increase it.
H.emote("twitch")
else if(prob(min(10,(0.1 * H.traumatic_shock))))
H.emote("twitch")
if(H.feral == 0)
H << "<span class='danger'><big>Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.</big></span>"
H.feral = 2*H.traumatic_shock //Make 'em snap.
log_and_message_admins("has gone feral due to injury.", H)
else
H.feral = max(H.feral, H.traumatic_shock * 2) //keep feralness up to match the current injury state.
else if (H.jitteriness >= 100) //No stress factors, but there's coffee. Keeps them mildly feral while they're all jittery.
if(H.feral == 0)
H << "<span class='warning'><big>Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!</big></span>"
log_and_message_admins("has gone feral due to jitteriness.", H)
if(H.stat == CONSCIOUS)
H.emote("twitch")
H.feral = max(H.feral, H.jitteriness-100) //they'll be twitchy and pouncy while they're under the influence, and feralness won't wear off until they're calm.
//While regenerating
if(H.reviving && H.reviving != REVIVING_COOLDOWN)
H.weakened = 5
H.canmove = 0
H.does_not_breathe = TRUE
//Cold/pressure effects when not regenerating
else
if (H.feral > 0) //still feral, but all stress factors are gone. Calm them down.
H.feral -= 1
if (H.feral <=0) //check if they're unferalled
H.feral = 0
H << "<span class='info'>Your thoughts start clearing, your feral urges having passed - for the time being, at least.</span>"
log_and_message_admins("is no longer feral.", H)
var/datum/gas_mixture/environment = H.loc.return_air()
var/pressure2 = environment.return_pressure()
var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2)
// handle what happens while feral
//Very low pressure damage
if(adjusted_pressure2 <= 20)
H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
if(H.feral > 0) //do the following if feral, otherwise no effects.
var/light_amount = H.getlightlevel() //how much light there is in the place
//Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral.
//NB: 'body_temperature' used here is the 'setpoint' species var
var/temp_diff = body_temperature - H.bodytemperature
if(temp_diff >= 50)
H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale
H.eye_blurry = max(5,H.eye_blurry)
H.shock_stage = max(H.shock_stage-(H.feral/20), 0) //if they lose enough health to hit softcrit, handle_shock() will keep resetting this. Otherwise, pissed off critters will lose shock faster than they gain it.
if(light_amount <= 0.5) // in the darkness. No need for custom scene-protection checks as it's just an occational infomessage.
if(prob(2)) //periodic nagmessages just to remind 'em they're still feral
if (H.traumatic_shock >=min(60, H.nutrition/10)) // if hurt, tell 'em to heal up
H << "<span class='info'> This place seems safe, secure, hidden, a place to lick your wounds and recover...</span>"
else if(H.nutrition <= 100) //If hungry, nag them to go and find someone or something to eat.
H << "<span class='info'> Secure in your hiding place, your hunger still gnaws at you. You need to catch some food...</span>"
else if(H.jitteriness >= 100)
H << "<span class='info'> sneakysneakyyesyesyescleverhidingfindthingsyessssss</span>"
else //otherwise, just tell them to keep hiding.
H << "<span class='info'> ...safe...</span>"
else // must be in a lit area
var/list/nearby = oviewers(H)
if (nearby.len) // someone's nearby
if(prob(1)) // 1 in 100 chance of doing something so as not to interrupt scenes
var/mob/M = pick(nearby)
if (H.traumatic_shock >=min(60, H.nutrition/10)) //tell 'em to be wary of a random person
H << "<span class='danger'> You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort...</span>"
else if(H.nutrition <= 250 || H.jitteriness > 0) //tell them a random person in view looks like food. It CAN happen when you're not hungry enough to be feral, especially if coffee is involved.
H << "<span class='danger'> Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...</span>"
if(H.stat == CONSCIOUS)
/datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H)
//Low-ish nutrition has messages and eventually feral
var/hungry = H.nutrition <= 200
//At 360 nutrition, this is 30 brute/burn, or 18 halloss. Capped at 50 brute/30 halloss - if they take THAT much, no amount of satiation will help them. Also they're fat.
var/shock = H.traumatic_shock > min(60, H.nutrition/10)
//Caffeinated xenochimera can become feral and have special messages
var/jittery = H.jitteriness >= 100
//To reduce distant object references
var/feral = H.feral
//Handle feral triggers and pre-feral messages
if(!feral && (hungry || shock || jittery))
// If they're hungry, give nag messages (when not bellied)
if(H.nutrition >= 100 && prob(0.5) && !isbelly(H.loc))
switch(H.nutrition)
if(150 to 200)
to_chat(H,"<span class='info'>You feel rather hungry. It might be a good idea to find some some food...</span>")
if(100 to 150)
to_chat(H,"<span class='warning'>You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat...</span>")
// Going feral due to hunger
else if(H.nutrition < 100 && !isbelly(H.loc))
to_chat(H,"<span class='danger'><big>Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.</big></span>")
log_and_message_admins("has gone feral due to hunger.", H)
feral = 5
if(!H.stat)
H.emote("twitch")
// If they're hurt, chance of snapping.
else if(shock)
//If the majority of their shock is due to halloss, greater chance of snapping.
if(2.5*H.halloss >= H.traumatic_shock)
if(prob(min(10,(0.2 * H.traumatic_shock))))
to_chat(H,"<span class='danger'><big>The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...</big></span>")
log_and_message_admins("has gone feral due to halloss.", H)
feral = 5
if(!H.stat)
H.emote("twitch")
//Majority due to other damage sources
else if(prob(min(10,(0.1 * H.traumatic_shock))))
to_chat(H,"<span class='danger'><big>Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.</big></span>")
feral = 5
log_and_message_admins("has gone feral due to injury.", H)
if(!H.stat)
H.emote("twitch")
//No hungry or shock, but jittery
else if(jittery)
to_chat(H,"<span class='warning'><big>Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!</big></span>")
feral = 5
log_and_message_admins("has gone feral due to jitteriness.", H)
if(!H.stat)
H.emote("twitch")
// Handle being feral
if(feral)
//Shock due to mostly halloss. More feral.
if(shock && 2.5*H.halloss >= H.traumatic_shock)
feral = max(feral, H.halloss)
//Shock due to mostly injury. More feral.
else if(shock)
feral = max(feral, H.traumatic_shock * 2)
//Still jittery? More feral.
if(jittery)
feral = max(feral, H.jitteriness-100)
//Still hungry? More feral.
if(H.feral + H.nutrition < 150)
feral++
else
feral = max(0,--feral)
//Set our real mob's var to our temp var
H.feral = feral
//Did we just finish being feral?
if(!feral)
to_chat(H,"<span class='info'>Your thoughts start clearing, your feral urges having passed - for the time being, at least.</span>")
log_and_message_admins("is no longer feral.", H)
return
//If they lose enough health to hit softcrit, handle_shock() will keep resetting this. Otherwise, pissed off critters will lose shock faster than they gain it.
H.shock_stage = max(H.shock_stage-(feral/20), 0)
//Handle light/dark areas
var/turf/T = get_turf(H)
if(!T)
return //Nullspace
var/darkish = T.get_lumcount() <= 0.1
//Don't bother doing heavy lifting if we weren't going to give emotes anyway.
if(!prob(1))
//This is basically the 'lite' version of the below block.
var/list/nearby = H.living_mobs(world.view)
//Not in the dark and out in the open.
if(!darkish && isturf(H.loc))
//Always handle feral if nobody's around and not in the dark.
if(!nearby.len)
H.handle_feral()
else // nobody around
H.handle_feral()
if(prob(2)) //periodic nagmessages
if(H.nutrition <= 100) //If hungry, nag them to go and find someone or something to eat.
H << "<span class='danger'> Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you.</span>"
if(H.stat == CONSCIOUS)
H.emote("twitch")
else if(H.jitteriness >= 100)
H << "<span class='danger'> yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes</span>"
if(H.stat == CONSCIOUS)
H.emote("twitch")
else //otherwise, just tell them to hide.
H << "<span class='danger'> Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground...</span>"
if(H.stat == CONSCIOUS)
H.emote("twitch")
//Rarely handle feral if someone is around
else if(prob(1))
H.handle_feral()
//////////////////////////////////////////////////////////////////////////////////////////
///////////WIP CODE TO MAKE XENOCHIMERAS NOT DIE IN SPACE WHILE REGENNING BELOW/////////// //I put WIP, but what I really meant to put was "Finished"
//////////////////////////////////////////////////////////////////////////////////////////
//And bail
return
var/datum/gas_mixture/environment = H.loc.return_air()
var/pressure2 = environment.return_pressure()
var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2)
// In the darkness or "hidden". No need for custom scene-protection checks as it's just an occational infomessage.
if(darkish || !isturf(H.loc))
// If hurt, tell 'em to heal up
if (shock)
to_chat(H,"<span class='info'>This place seems safe, secure, hidden, a place to lick your wounds and recover...</span>")
if(adjusted_pressure2 <= 20 && H.does_not_breathe) //If they're in a enviroment with no pressure and are not breathing (See: regenerating), don't kill them.
//This is just to prevent them from taking damage if they're in stasis.
//If hungry, nag them to go and find someone or something to eat.
else if(hungry)
to_chat(H,"<span class='info'>Secure in your hiding place, your hunger still gnaws at you. You need to catch some food...</span>")
else if(adjusted_pressure2 <= 20) //If they're in an enviroment with no pressure and are NOT in stasis, damage them.
H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
//If jittery, etc
else if(jittery)
to_chat(H,"<span class='info'>sneakysneakyyesyesyescleverhidingfindthingsyessssss</span>")
if(H.bodytemperature <= 260 && H.does_not_breathe) //If they're regenerating, don't give them them the negative cold effects
//This is just here to prevent them from getting cold effects
//Otherwise, just tell them to keep hiding.
else
to_chat(H,"<span class='info'>...safe...</span>")
// NOT in the darkness
else
//Twitch twitch
if(!H.stat)
H.emote("twitch")
var/list/nearby = H.living_mobs(world.view)
// Someone/something nearby
if(nearby.len)
var/M = pick(nearby)
if(shock)
to_chat(H,"<span class='danger'>You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort...</span>")
else if(hungry || jittery)
to_chat(H,"<span class='danger'>Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...</span>")
// Nobody around
else
if(hungry)
to_chat(H,"<span class='danger'>Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you.</span>")
else if(jittery)
to_chat(H,"<span class='danger'>yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes</span>")
else
to_chat(H,"<span class='danger'>Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground...</span>")
else if(H.bodytemperature <= 260) //If they're not in stasis and are cold. Don't really have to add in an exception to cryo cells, as the effects aren't anything /too/ horrible.
var/coldshock = 0
if(H.bodytemperature <= 260 && H.bodytemperature >= 200) //Chilly.
coldshock = 4 //This will begin to knock them out until they run out of oxygen and suffocate or until someone finds them.
H.eye_blurry = 5 //Blurry vision in the cold.
if(H.bodytemperature <= 199 && H.bodytemperature >= 100) //Extremely cold. Even in somewhere like the server room it takes a while for bodytemp to drop this low.
coldshock = 8
H.eye_blurry = 5
if(H.bodytemperature <= 99) //Insanely cold.
coldshock = 16
H.eye_blurry = 5
H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral.
return
/datum/species/xenochimera/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H)
ASSERT(to_copy)
@@ -272,10 +328,10 @@
Before they were found they built great cities out of their silk, being united and subjugated in warring factions under great “Star Queens” \
Who forced the working class to build huge, towering cities to attempt to reach the stars, which they worship as gems of great spiritual and magical significance."
hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below.
cold_level_1 = -5000 // All cold debuffs are handled below in handle_environment_special
cold_level_2 = -5000
cold_level_3 = -5000
hazard_low_pressure = 20 //Prevents them from dying normally in space. Special code handled below.
cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special
cold_level_2 = -1
cold_level_3 = -1
//primitive_form = "Monkey" //I dunno. Replace this in the future.
@@ -288,16 +344,9 @@
blood_color = "#0952EF" //Spiders have blue blood.
/datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H)
if(H.stat == 2) // If they're dead they won't need anything.
if(H.stat == DEAD) // If they're dead they won't need anything.
return
var/datum/gas_mixture/environment = H.loc.return_air()
var/pressure2 = environment.return_pressure()
var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2)
if(adjusted_pressure2 <= 20) //If they're in an enviroment with no pressure and are NOT in stasis, like a stasis bodybag, damage them.
H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
if(H.bodytemperature <= 260) //If they're really cold, they go into stasis.
var/coldshock = 0
if(H.bodytemperature <= 260 && H.bodytemperature >= 200) //Chilly.
@@ -118,11 +118,13 @@
desc = "You simply can't see colors at all, period. You are 100% colorblind."
cost = -1
/datum/modifier/colorblindness_mono
name = "Colorblindness (Monochromancy)"
desc = "You simply can't see colors at all, period. You are 100% colorblind."
/datum/trait/colorblind/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
if(!H.plane_holder)
H.plane_holder = new(H)
H.plane_holder.set_vis(VIS_D_COLORBLIND,TRUE) //The default is monocrhomia, no need to set values
H.add_modifier(/datum/modifier/trait/colorblind_mono)
/datum/trait/colorblind/para_vulp
name = "Colorblindness (Para Vulp)"
@@ -131,7 +133,7 @@
/datum/trait/colorblind/para_vulp/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.plane_holder.alter_values(VIS_D_COLORBLIND,list("variety" = "Paradise Vulp"))
H.add_modifier(/datum/modifier/trait/colorblind_vulp)
/datum/trait/colorblind/para_taj
name = "Colorblindness (Para Taj)"
@@ -140,4 +142,4 @@
/datum/trait/colorblind/para_taj/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
H.plane_holder.alter_values(VIS_D_COLORBLIND,list("variety" = "Paradise Taj"))
H.add_modifier(/datum/modifier/trait/colorblind_taj)
+3
View File
@@ -1124,6 +1124,9 @@ default behaviour is:
var/list/colors_to_blend = list()
for(var/datum/modifier/M in modifiers)
if(!isnull(M.client_color))
if(islist(M.client_color)) //It's a color matrix! Forget it. Just use that one.
animate(client, color = M.client_color, time = 10)
return
colors_to_blend += M.client_color
if(colors_to_blend.len)
@@ -23,6 +23,8 @@
var/startdrain = 500
var/max_item_count = 1
var/gulpsound = 'sound/vore/gulp.ogg'
var/digest_brute = 2
var/digest_burn = 3
/obj/item/device/dogborg/sleeper/New()
..()
@@ -504,9 +506,14 @@
if((T.status_flags & GODMODE) || !T.digestable)
items_preserved += T
else
T.adjustBruteLoss(2)
T.adjustFireLoss(3)
drain(-100) //20*total loss as with voreorgan stats.
var/old_brute = T.getBruteLoss()
var/old_burn = T.getFireLoss()
T.adjustBruteLoss(digest_brute)
T.adjustFireLoss(digest_burn)
var/actual_brute = T.getBruteLoss() - old_brute
var/actual_burn = T.getFireLoss() - old_burn
var/damage_gain = actual_brute + actual_burn
drain(-25 * damage_gain) //25*total loss as with voreorgan stats.
update_patient()
//Pick a random item to deal with (if there are any)
@@ -1,9 +0,0 @@
/mob/living/silicon/robot/drone
can_enter_vent_with = list(
/obj/item/device/radio/borg,
/obj/machinery/camera,
/obj/item/device/camera/siliconcam/drone_camera,
/obj/item/weapon/robot_module/drone,
/obj/item/weapon/cell,
/obj/screen/movable/ability_master,
/obj/item/weapon/card/id/synthetic)
@@ -49,10 +49,7 @@
qdel(src)
/mob/living/simple_animal/hostile/mimic/MouseEntered(location, control, params)
..()
closeToolTip(usr)
// ideally, we'd remove the code in ..() that opens the tooltip,
// but then we'd need to duplicate all the other code in ..()
return // Do not call parent: Mimics shouldn't have tooltips!
//
// Crate Mimic
@@ -84,13 +84,16 @@ Nurse Family
var/atom/cocoon_target
var/egg_inject_chance = 5
// VOREStation Edit - Keep Nurse Hat Spiders
/mob/living/simple_animal/hostile/giant_spider/nurse/medical
/mob/living/simple_animal/hostile/giant_spider/nurse/hat
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes and a tiny nurse hat."
icon_state = "nursemed"
icon_living = "nursemed"
icon_dead = "nursemed_dead"
maxHealth = 50
health = 50
// VOREStation Edit
melee_damage_lower = 8
melee_damage_upper = 16
poison_type = "tramadol"
@@ -1,4 +1,4 @@
/mob/living/simple_animal/hostile/badboi
/mob/living/simple_animal/hostile/corrupthound
name = "corrupt hound"
desc = "Good boy machine broke. This is definitely no good news for the organic lifeforms in vicinity."
icon = 'icons/mob/vore64x32.dmi'
@@ -48,6 +48,9 @@
minbodytemp = 150
maxbodytemp = 900
var/image/eye_layer = null
vore_active = TRUE
vore_capacity = 1
vore_pounce_chance = 15
@@ -57,7 +60,7 @@
loot_list = list(/obj/item/borg/upgrade/syndicate = 6, /obj/item/borg/upgrade/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6)
/mob/living/simple_animal/hostile/badboi/prettyboi
/mob/living/simple_animal/hostile/corrupthound/prettyboi
name = "corrupt corrupt hound"
desc = "Bad boy machine broke as well. Seems an attempt was made to achieve a less threatening look, and this one is definitely having some conflicting feelings about it."
icon_state = "prettyboi"
@@ -76,18 +79,37 @@
say_got_target = list("HERE COMES BIG MEAN HUG MACHINE!", "I'LL BE GENTLE!", "FUEL ME FRIEND!", "I*M SO SORRY!", "YUMMY TREAT DETECTED!", "LOVE ME!", "Not again. NOT AGAIN!")
/mob/living/simple_animal/hostile/badboi/isSynthetic()
/mob/living/simple_animal/hostile/corrupthound/isSynthetic()
return TRUE
/mob/living/simple_animal/hostile/badboi/speech_bubble_appearance()
/mob/living/simple_animal/hostile/corrupthound/speech_bubble_appearance()
return "synthetic_evil"
/mob/living/simple_animal/hostile/badboi/PunchTarget()
/mob/living/simple_animal/hostile/corrupthound/PunchTarget()
if(istype(target_mob,/mob/living/simple_animal/mouse))
return EatTarget()
else ..()
/mob/living/simple_animal/hostile/badboi/death(gibbed, deathmessage = "shudders and collapses!")
/mob/living/simple_animal/hostile/corrupthound/proc/add_eyes()
if(!eye_layer)
eye_layer = image(icon, "badboi-eyes")
eye_layer.plane = PLANE_LIGHTING_ABOVE
add_overlay(eye_layer)
/mob/living/simple_animal/hostile/corrupthound/proc/remove_eyes()
cut_overlay(eye_layer)
/mob/living/simple_animal/hostile/corrupthound/New()
add_eyes()
..()
/mob/living/simple_animal/hostile/corrupthound/death(gibbed, deathmessage = "shudders and collapses!")
.=..()
resting = 0
icon_state = icon_dead
/mob/living/simple_animal/hostile/corrupthound/update_icon()
. = ..()
remove_eyes()
if(stat == CONSCIOUS && !resting)
add_eyes()
@@ -46,6 +46,9 @@
pixel_x = -16
pixel_y = 0
var/glowyeyes = FALSE
var/image/eye_layer = null
var/eyetype
var/mob/living/carbon/human/friend
var/tamed = 0
var/tame_chance = 50 //It's a fiddy-fiddy default you may get a buddy pal or you may get mauled and ate. Win-win!
@@ -78,6 +81,8 @@
max_co2 = 0
min_n2 = 0
max_n2 = 0
glowyeyes = TRUE
eyetype = "photie"
/mob/living/simple_animal/otie/friendly //gets the pet2tame feature and doesn't kill you right away
name = "otie"
@@ -116,6 +121,8 @@
max_co2 = 0
min_n2 = 0
max_n2 = 0
glowyeyes = TRUE
eyetype = "photie"
/mob/living/simple_animal/otie/security //tame by default unless you're a marked crimester. can be befriended to follow with pets tho.
name = "guard otie"
@@ -128,6 +135,8 @@
maxHealth = 200 //armored or something
health = 200
tamed = 1
glowyeyes = TRUE
eyetype = "sotie"
loot_list = list(/obj/item/clothing/glasses/sunglasses/sechud,/obj/item/clothing/suit/armor/vest/alt)
vore_pounce_chance = 60 // Good boys don't do too much police brutality.
@@ -151,6 +160,8 @@
max_co2 = 0
min_n2 = 0
max_n2 = 0
glowyeyes = TRUE
eyetype = "sotie"
/mob/living/simple_animal/otie/PunchTarget()
if(istype(target_mob,/mob/living/simple_animal/mouse))
@@ -322,8 +333,27 @@
else
..()
/mob/living/simple_animal/otie/death(gibbed, deathmessage = "dies!")
resting = 0
icon_state = icon_dead
update_icon()
/mob/living/simple_animal/otie/proc/add_eyes()
if(!eye_layer)
eye_layer = image(icon, "[eyetype]-eyes")
eye_layer.plane = PLANE_LIGHTING_ABOVE
add_overlay(eye_layer)
/mob/living/simple_animal/otie/proc/remove_eyes()
cut_overlay(eye_layer)
/mob/living/simple_animal/otie/New()
if(glowyeyes)
add_eyes()
..()
/mob/living/simple_animal/otie/update_icon()
. = ..()
remove_eyes()
if(glowyeyes && stat == CONSCIOUS && !resting)
add_eyes()
/mob/living/simple_animal/otie/death(gibbed, deathmessage = "dies!")
.=..()
resting = 0
icon_state = icon_dead
@@ -1,4 +1,4 @@
/mob/living/simple_animal/hostile/rous
/mob/living/simple_animal/hostile/rat
name = "giant rat"
desc = "In what passes for a hierarchy among verminous rodents, this one is king."
tt_desc = "Mus muscular"
@@ -41,6 +41,6 @@
vore_pounce_chance = 45
vore_icons = SA_ICON_LIVING | SA_ICON_REST
/mob/living/simple_animal/hostile/rous/death()
/mob/living/simple_animal/hostile/rat/death()
playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1)
..()
@@ -1,4 +1,4 @@
/mob/living/simple_animal/wah
/mob/living/simple_animal/redpanda
name = "red panda"
desc = "It's a wah! Beware of doom pounce!"
tt_desc = "Ailurus fulgens"
@@ -29,7 +29,7 @@
emote_see = list("trundles around","rears up onto their hind legs and pounces a bug")
// Activate Noms!
/mob/living/simple_animal/wah
/mob/living/simple_animal/redpanda
vore_active = 1
vore_bump_chance = 10
vore_bump_emote = "playfully lunges at"
@@ -37,7 +37,7 @@
vore_default_mode = DM_HOLD // above will only matter if someone toggles it anyway
vore_icons = SA_ICON_LIVING
/mob/living/simple_animal/wah/fae
/mob/living/simple_animal/redpanda/fae
name = "dark wah"
desc = "Ominous, but still cute!"
tt_desc = "Ailurus brattus"
@@ -1,4 +1,4 @@
/mob/living/simple_animal/hostile/snake
/mob/living/simple_animal/hostile/giant_snake
name = "giant snake"
desc = "Snakes. Why did it have to be snakes?"
icon = 'icons/mob/vore64x64.dmi'
@@ -21,7 +21,7 @@
pixel_y = -16
// Activate Noms!
/mob/living/simple_animal/hostile/snake
/mob/living/simple_animal/hostile/giant_snake
vore_active = 1
vore_pounce_chance = 25
vore_icons = SA_ICON_LIVING
+10
View File
@@ -34,6 +34,11 @@
if(hud_used) qdel(hud_used) //remove the hud objects
hud_used = new /datum/hud(src)
if(client.prefs && client.prefs.client_fps)
client.fps = client.prefs.client_fps
else
client.fps = 0 // Results in using the server FPS
next_move = 1
disconnect_time = null //clear the disconnect time
sight |= SEE_SELF
@@ -56,6 +61,11 @@
client.screen += plane_holder.plane_masters
recalculate_vis()
// AO support
var/ao_enabled = client.is_preference_enabled(/datum/client_preference/ambient_occlusion)
plane_holder.set_ao(VIS_OBJS, ao_enabled)
plane_holder.set_ao(VIS_MOBS, ao_enabled)
//set macro to normal incase it was overriden (like cyborg currently does)
client.set_hotkeys_macro("macro", "hotkeymode")
+27 -54
View File
@@ -11,6 +11,8 @@
my_mob = this_guy
//It'd be nice to lazy init these but some of them are important to just EXIST. Like without ghost planemaster, you can see ghosts. Go figure.
// 'Utility' planes
plane_masters[VIS_FULLBRIGHT] = new /obj/screen/plane_master/fullbright //Lighting system (lighting_overlay objects)
plane_masters[VIS_LIGHTING] = new /obj/screen/plane_master/lighting //Lighting system (but different!)
plane_masters[VIS_GHOSTS] = new /obj/screen/plane_master/ghosts //Ghosts!
@@ -31,11 +33,13 @@
plane_masters[VIS_ADMIN2] = new /obj/screen/plane_master{plane = PLANE_ADMIN2} //For admin use
plane_masters[VIS_ADMIN3] = new /obj/screen/plane_master{plane = PLANE_ADMIN3} //For admin use
plane_masters[VIS_D_COLORBLIND] = new /obj/screen/plane_master/colorblindness //Colorblindness (affects world)
plane_masters[VIS_D_COLORBLINDI]= new /obj/screen/plane_master/colorblindness/items //Colorblindness (items in HUD, subplane of above, don't toggle)
plane_masters[VIS_MESONS] = new /obj/screen/plane_master{plane = PLANE_MESONS} //Meson-specific things like open ceilings.
// Real tangible stuff planes
plane_masters[VIS_TURFS] = new /obj/screen/plane_master/main{plane = TURF_PLANE}
plane_masters[VIS_OBJS] = new /obj/screen/plane_master/main{plane = OBJ_PLANE}
plane_masters[VIS_MOBS] = new /obj/screen/plane_master/main{plane = MOB_PLANE}
..()
/datum/plane_holder/Destroy()
@@ -70,6 +74,17 @@
for(var/SP in subplanes)
set_vis(which = SP, new_alpha = new_alpha)
/datum/plane_holder/proc/set_ao(var/which = null, var/enabled = FALSE)
ASSERT(which)
var/obj/screen/plane_master/PM = plane_masters[which]
if(!PM)
crash_with("Tried to set_ao [which] in plane_holder on [my_mob]!")
PM.set_ambient_occlusion(enabled)
if(PM.sub_planes)
var/list/subplanes = PM.sub_planes
for(var/SP in subplanes)
set_ao(SP, enabled)
/datum/plane_holder/proc/alter_values(var/which = null, var/list/values = null)
ASSERT(which)
var/obj/screen/plane_master/PM = plane_masters[which]
@@ -124,6 +139,11 @@
new_alpha = sanitize_integer(new_alpha, 0, 255, 255)
alpha = new_alpha
/obj/screen/plane_master/proc/set_ambient_occlusion(var/enabled = FALSE)
filters -= AMBIENT_OCCLUSION
if(enabled)
filters += AMBIENT_OCCLUSION
/obj/screen/plane_master/proc/alter_plane_values()
return //Stub
@@ -152,55 +172,8 @@
plane = PLANE_GHOSTS
desired_alpha = 127 //When enabled, they're like half-transparent
//'Normal'ness v v v
//Various types of colorblindness R2R R2G R2B G2R G2G G2B B2R B2G B2B
#define MATRIX_Monochromia list(0.33, 0.33, 0.33, 0.59, 0.59, 0.59, 0.11, 0.11, 0.11)
#define MATRIX_Protanopia list(0.57, 0.43, 0, 0.56, 0.44, 0, 0, 0.24, 0.76)
#define MATRIX_Protanomaly list(0.82, 0.18, 0, 0.33, 0.67, 0, 0, 0.13, 0.88)
#define MATRIX_Deuteranopia list(0.63, 0.38, 0, 0.70, 0.30, 0, 0, 0.30, 0.70)
#define MATRIX_Deuteranomaly list(0.80, 0.20, 0, 0.26, 0.74, 0, 0, 0.14, 0.86)
#define MATRIX_Tritanopia list(0.95, 0.05, 0, 0, 0.43, 0.57, 0, 0.48, 0.53)
#define MATRIX_Tritanomaly list(0.97, 0.03, 0, 0, 0.73, 0.27, 0, 0.18, 0.82)
#define MATRIX_Achromatopsia list(0.30, 0.59, 0.11, 0.30, 0.59, 0.11, 0.30, 0.59, 0.11)
#define MATRIX_Achromatomaly list(0.62, 0.32, 0.06, 0.16, 0.78, 0.06, 0.16, 0.32, 0.52)
#define MATRIX_Vulp_Colorblind list(0.50, 0.40, 0.10, 0.50, 0.40, 0.10, 0, 0.20, 0.80)
#define MATRIX_Taj_Colorblind list(0.40, 0.20, 0.40, 0.40, 0.60, 0, 0.20, 0.20, 0.60)
/////////////////
//Colorblindness uses special color shenanigans
/obj/screen/plane_master/colorblindness
plane = PLANE_WORLD //Affects the main game world
color = MATRIX_Monochromia
alpha = 255 //Starts out nice and opaque
invisibility = 101 //Can't see it usually
mouse_opacity = 1 //Don't make entire world not visible pls
invis_toggle = TRUE
sub_planes = list(VIS_D_COLORBLINDI)
var/list/varieties = list(
"Monochromia" = MATRIX_Monochromia,
"Protanopia" = MATRIX_Protanopia,
"Protanomaly" = MATRIX_Protanomaly,
"Deuteranopia" = MATRIX_Deuteranopia,
"Deuteranomaly" = MATRIX_Deuteranomaly,
"Tritanopia" = MATRIX_Tritanopia,
"Tritanomaly" = MATRIX_Tritanomaly,
"Achromatopsia" = MATRIX_Achromatopsia,
"Achromatomaly" = MATRIX_Achromatomaly,
"Paradise Vulp" = MATRIX_Vulp_Colorblind,
"Paradise Taj" = MATRIX_Taj_Colorblind
)
/obj/screen/plane_master/colorblindness/alter_plane_values(var/variety = null)
var/new_matrix = varieties[variety]
if(!new_matrix) return
color = new_matrix
/obj/screen/plane_master/colorblindness/proc/debug_variety()
var/choice = input(usr,"Pick a type of colorblindness","Which?") as null|anything in varieties
if(choice)
color = varieties[choice]
/obj/screen/plane_master/colorblindness/items
plane = PLANE_PLAYER_HUD_ITEMS
sub_planes = null
//The main game planes start normal and visible
/obj/screen/plane_master/main
alpha = 255
mouse_opacity = 1
+16 -3
View File
@@ -2,9 +2,10 @@
/mob/new_player
var/ready = 0
var/spawning = 0//Referenced when you want to delete the new_player later on in the code.
var/totalPlayers = 0 //Player counts for the Lobby tab
var/spawning = 0 //Referenced when you want to delete the new_player later on in the code.
var/totalPlayers = 0 //Player counts for the Lobby tab
var/totalPlayersReady = 0
var/show_hidden_jobs = 0 //Show jobs that are set to "Never" in preferences
var/datum/browser/panel
universal_speak = 1
@@ -115,7 +116,7 @@
if(alert(src,"Are you sure you wish to observe? You will have to wait 1 minute before being able to respawn!","Player Setup","Yes","No") == "Yes")
if(!client) return 1
//Make a new mannequin quickly, and allow the observer to take the appearance
var/mob/living/carbon/human/dummy/mannequin = new()
client.prefs.dress_preview_mob(mannequin)
@@ -291,6 +292,10 @@
handle_server_news()
return
if(href_list["hidden_jobs"])
show_hidden_jobs = !show_hidden_jobs
LateChoices()
/mob/new_player/proc/handle_server_news()
if(!client)
return
@@ -421,10 +426,18 @@
dat += "<font color='red'>The station is currently undergoing crew transfer procedures.</font><br>"
dat += "Choose from the following open/valid positions:<br>"
dat += "<a href='byond://?src=\ref[src];hidden_jobs=1'>[show_hidden_jobs ? "Hide":"Show"] Hidden Jobs.</a><br>"
for(var/datum/job/job in job_master.occupations)
if(job && IsJobAvailable(job.title))
// Checks for jobs with minimum age requirements
if(job.minimum_character_age && (client.prefs.age < job.minimum_character_age))
continue
// Checks for jobs set to "Never" in preferences //TODO: Figure out a better way to check for this
if(!(client.prefs.GetJobDepartment(job, 1) & job.flag))
if(!(client.prefs.GetJobDepartment(job, 2) & job.flag))
if(!(client.prefs.GetJobDepartment(job, 3) & job.flag))
if(!show_hidden_jobs && job.title != "Assistant") // Assistant is always an option
continue
var/active = 0
// Only players with the job assigned and AFK for less than 10 minutes count as active
for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 * 60 * 10)
+2 -2
View File
@@ -21,8 +21,8 @@
if(say_disabled) //This is here to try to identify lag problems
usr << "<font color='red'>Speech is currently admin-disabled.</font>"
return
message = sanitize(message)
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason)
set_typing_indicator(FALSE)
if(use_me)
+32 -2
View File
@@ -11,7 +11,7 @@
usr << "Speech is currently admin-disabled."
return
message = sanitize(message)
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason)
if(!message)
return
@@ -31,7 +31,7 @@
var/input
if(!message)
input = sanitize(input(src,"Choose an emote to display.") as text|null)
input = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src)
else
input = message
@@ -42,6 +42,8 @@
return
if (message)
message = say_emphasis(message)
var/list/vis = get_mobs_and_objs_in_view_fast(get_turf(src),1,2) //Turf, Range, and type 2 is emote
var/list/vis_mobs = vis["mobs"]
var/list/vis_objs = vis["objs"]
@@ -59,3 +61,31 @@
/mob/proc/emote_vr(var/act, var/type, var/message) //This would normally go in say.dm
if(act == "me")
return custom_emote_vr(type, message)
#define MAX_HUGE_MESSAGE_LEN 8192
#define POST_DELIMITER_STR "\<\>"
/proc/sanitize_or_reflect(message,user)
//Way too long to send
if(length(message) > MAX_HUGE_MESSAGE_LEN)
fail_to_chat(user)
return
message = sanitize(message, max_length = MAX_HUGE_MESSAGE_LEN)
//Came back still too long to send
if(length(message) > MAX_MESSAGE_LEN)
fail_to_chat(user,message)
return null
else
return message
/proc/fail_to_chat(user,message)
if(!message)
to_chat(user,"<span class='danger'>Your message was NOT SENT, either because it was FAR too long, or sanitized to nothing at all.</span>")
return
var/length = length(message)
var/posts = Ceiling(length/MAX_MESSAGE_LEN)
to_chat(user,message)
to_chat(user,"<span class='danger'>^ This message was NOT SENT ^ -- It was [length] characters, and the limit is [MAX_MESSAGE_LEN]. It would fit in [posts] separate messages.</span>")
#undef MAX_HUGE_MESSAGE_LEN