Merge branch 'master' into ALRAUNE_STUFF

This commit is contained in:
Cameron653
2018-07-23 20:08:30 -04:00
committed by GitHub
314 changed files with 40595 additions and 337577 deletions
+3 -1
View File
@@ -659,11 +659,13 @@ var/list/admin_verbs_event_manager = list(
set desc = "Cause an explosion of varying strength at your location."
var/turf/epicenter = mob.loc
var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb")
var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb", "Cancel")
var/choice = input("What size explosion would you like to produce?") in choices
switch(choice)
if(null)
return 0
if("Cancel")
return 0
if("Small Bomb")
explosion(epicenter, 1, 2, 3, 3)
if("Medium Bomb")
+2 -2
View File
@@ -12,7 +12,7 @@
else if(is_antag && !is_admin) // Is an antag, and not an admin, meaning we need to check if their antag type allows AOOC.
var/datum/antagonist/A = get_antag_data(usr.mind.special_role)
if(!A || !A.can_use_aooc)
if(!A || !A.can_speak_aooc || !A.can_hear_aooc)
to_chat(usr, "<span class='warning'>Sorry, but your antagonist type is not allowed to speak in AOOC.</span>")
return
@@ -36,7 +36,7 @@
var/datum/antagonist/A = null
if(M.mind) // Observers don't have minds, but they should still see AOOC.
A = get_antag_data(M.mind.special_role)
if((M.mind && M.mind.special_role && A && A.can_use_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
if((M.mind && M.mind.special_role && A && A.can_hear_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
to_chat(M, "<span class='ooc'><span class='aooc'>[create_text_tag("aooc", "Antag-OOC:", M.client)] <EM>[player_display]:</EM> <span class='message'>[msg]</span></span></span>")
log_aooc(msg,src)
+2 -2
View File
@@ -637,7 +637,7 @@
if(!check_rights(R_DEBUG))
return
var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in planet_controller.planets
var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in SSplanets.planets
var/datum/weather/new_weather = input(usr, "What weather do you want to change to?", "Change Weather") as null|anything in planet.weather_holder.allowed_weather_types
if(new_weather)
planet.weather_holder.change_weather(new_weather)
@@ -653,7 +653,7 @@
if(!check_rights(R_DEBUG))
return
var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in planet_controller.planets
var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in SSplanets.planets
var/datum/time/current_time_datum = planet.current_time
var/new_hour = input(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) as null|num
+184
View File
@@ -0,0 +1,184 @@
/obj/item/weapon/deadringer
name = "silver pocket watch"
desc = "A fancy silver-plated digital pocket watch. Looks expensive."
icon = 'icons/obj/deadringer.dmi'
icon_state = "deadringer"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_ID | SLOT_BELT | SLOT_TIE
origin_tech = list(TECH_ILLEGAL = 3)
var/activated = 0
var/timer = 0
var/bruteloss_prev = 999999
var/fireloss_prev = 999999
var/mob/living/carbon/human/corpse = null
var/mob/living/carbon/human/watchowner = null
/obj/item/weapon/deadringer/New()
..()
processing_objects |= src
/obj/item/weapon/deadringer/Destroy() //just in case some smartass tries to stay invisible by destroying the watch
uncloak()
processing_objects -= src
..()
/obj/item/weapon/deadringer/dropped()
if(timer > 20)
uncloak()
watchowner = null
return
/obj/item/weapon/deadringer/attack_self(var/mob/living/user as mob)
var/mob/living/H = src.loc
if (!istype(H, /mob/living/carbon/human))
to_chat(H,"<font color='blue'>You have no clue what to do with this thing.</font>")
return
if(!activated)
if(timer == 0)
to_chat(H, "<font color='blue'>You press a small button on [src]'s side. It starts to hum quietly.</font>")
bruteloss_prev = H.getBruteLoss()
fireloss_prev = H.getFireLoss()
activated = 1
return
else
to_chat(H,"<font color='blue'>You press a small button on [src]'s side. It buzzes a little.</font>")
return
if(activated)
to_chat(H,"<font color='blue'>You press a small button on [src]'s side. It stops humming.</font>")
activated = 0
return
/obj/item/weapon/deadringer/process()
if(activated)
if (ismob(src.loc))
var/mob/living/carbon/human/H = src.loc
watchowner = H
if(H.getBruteLoss() > bruteloss_prev || H.getFireLoss() > fireloss_prev)
deathprevent()
activated = 0
if(watchowner.isSynthetic())
to_chat(watchowner, "<font color='blue'>You fade into nothingness! [src]'s screen blinks, being unable to copy your synthetic body!</font>")
else
to_chat(watchowner, "<font color='blue'>You fade into nothingness, leaving behind a fake body!</font>")
icon_state = "deadringer_cd"
timer = 50
return
if(timer > 0)
timer--
if(timer == 20)
uncloak()
if(corpse)
new /obj/effect/effect/smoke/chem(corpse.loc)
qdel(corpse)
if(timer == 0)
icon_state = "deadringer"
return
/obj/item/weapon/deadringer/proc/deathprevent()
for(var/mob/living/simple_animal/D in oviewers(7, src))
D.LoseTarget()
watchowner.emote("deathgasp")
watchowner.invisibility = 85
watchowner.alpha = 127
makeacorpse(watchowner)
for(var/mob/living/simple_animal/D in oviewers(7, src))
D.LoseTarget()
return
/obj/item/weapon/deadringer/proc/uncloak()
if(watchowner)
watchowner.invisibility = 0
watchowner.alpha = 255
playsound(get_turf(src), 'sound/effects/uncloak.ogg', 35, 1, -1)
return
/obj/item/weapon/deadringer/proc/makeacorpse(var/mob/living/carbon/human/H)
if(H.isSynthetic())
return
corpse = new /mob/living/carbon/human(H.loc)
corpse.setDNA(H.dna.Clone())
corpse.death(1) //Kills the new mob
var/obj/item/clothing/temp = null
if(H.get_equipped_item(slot_w_uniform))
corpse.equip_to_slot_or_del(new /obj/item/clothing/under/chameleon/changeling(corpse), slot_w_uniform)
temp = corpse.get_equipped_item(slot_w_uniform)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_w_uniform)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_wear_suit))
corpse.equip_to_slot_or_del(new /obj/item/clothing/suit/chameleon/changeling(corpse), slot_wear_suit)
temp = corpse.get_equipped_item(slot_wear_suit)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_wear_suit)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_shoes))
corpse.equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/changeling(corpse), slot_shoes)
temp = corpse.get_equipped_item(slot_shoes)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_shoes)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_gloves))
corpse.equip_to_slot_or_del(new /obj/item/clothing/gloves/chameleon/changeling(corpse), slot_gloves)
temp = corpse.get_equipped_item(slot_gloves)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_gloves)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_l_ear))
temp = H.get_equipped_item(slot_l_ear)
corpse.equip_to_slot_or_del(new temp.type(corpse), slot_l_ear)
temp = corpse.get_equipped_item(slot_l_ear)
temp.canremove = 0
if(H.get_equipped_item(slot_glasses))
corpse.equip_to_slot_or_del(new /obj/item/clothing/glasses/chameleon/changeling(corpse), slot_glasses)
temp = corpse.get_equipped_item(slot_glasses)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_glasses)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_wear_mask))
corpse.equip_to_slot_or_del(new /obj/item/clothing/mask/chameleon/changeling(corpse), slot_wear_mask)
temp = corpse.get_equipped_item(slot_wear_mask)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_wear_mask)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_head))
corpse.equip_to_slot_or_del(new /obj/item/clothing/head/chameleon/changeling(corpse), slot_head)
temp = corpse.get_equipped_item(slot_head)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_head)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_belt))
corpse.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/chameleon/changeling(corpse), slot_belt)
temp = corpse.get_equipped_item(slot_belt)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_belt)
temp.disguise(c_type.type)
temp.canremove = 0
if(H.get_equipped_item(slot_back))
corpse.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chameleon/changeling(corpse), slot_back)
temp = corpse.get_equipped_item(slot_back)
var/obj/item/clothing/c_type = H.get_equipped_item(slot_back)
temp.disguise(c_type.type)
temp.canremove = 0
corpse.identifying_gender = H.identifying_gender
corpse.flavor_texts = H.flavor_texts.Copy()
corpse.real_name = H.real_name
corpse.name = H.name
corpse.set_species(corpse.dna.species)
corpse.change_hair(H.h_style)
corpse.change_facial_hair(H.f_style)
corpse.change_hair_color(H.r_hair, H.g_hair, H.b_hair)
corpse.change_facial_hair_color(H.r_facial, H.g_facial, H.b_facial)
corpse.change_skin_color(H.r_skin, H.g_skin, H.b_skin)
corpse.adjustFireLoss(H.getFireLoss())
corpse.adjustBruteLoss(H.getBruteLoss())
corpse.UpdateAppearance()
corpse.regenerate_icons()
for(var/obj/item/organ/internal/I in corpse.internal_organs)
var/obj/item/organ/internal/G = I
G.Destroy()
return
+3 -4
View File
@@ -250,9 +250,8 @@
return
/obj/effect/beam/i_beam/Destroy()
. = ..()
if(master.first == src)
master.first = null
if(next)
qdel(next)
next = null
..()
if(next && !next.gc_destroyed)
qdel_null(next)
@@ -71,8 +71,8 @@ datum/preferences/proc/set_biological_gender(var/gender)
. += "<b>Nickname:</b> "
. += "<a href='?src=\ref[src];nickname=1'><b>[pref.nickname]</b></a>"
. += "<br>"
. += "<b>Biological Gender:</b> <a href='?src=\ref[src];bio_gender=1'><b>[gender2text(pref.biological_gender)]</b></a><br>"
. += "<b>Gender Identity:</b> <a href='?src=\ref[src];id_gender=1'><b>[gender2text(pref.identifying_gender)]</b></a><br>"
. += "<b>Biological Sex:</b> <a href='?src=\ref[src];bio_gender=1'><b>[gender2text(pref.biological_gender)]</b></a><br>"
. += "<b>Pronouns:</b> <a href='?src=\ref[src];id_gender=1'><b>[gender2text(pref.identifying_gender)]</b></a><br>"
. += "<b>Age:</b> <a href='?src=\ref[src];age=1'>[pref.age]</a><br>"
. += "<b>Spawn Point</b>: <a href='?src=\ref[src];spawnpoint=1'>[pref.spawnpoint]</a><br>"
if(config.allow_Metadata)
@@ -111,13 +111,13 @@ datum/preferences/proc/set_biological_gender(var/gender)
return TOPIC_NOACTION
else if(href_list["bio_gender"])
var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
var/new_gender = input(user, "Choose your character's biological sex:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
if(new_gender && CanUseTopic(user))
pref.set_biological_gender(new_gender)
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["id_gender"])
var/new_gender = input(user, "Choose your character's identifying gender:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
var/new_gender = input(user, "Choose your character's pronouns:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
if(new_gender && CanUseTopic(user))
pref.identifying_gender = new_gender
return TOPIC_REFRESH
@@ -158,4 +158,4 @@ datum/preferences/proc/set_biological_gender(var/gender)
return possible_genders
possible_genders = possible_genders.Copy()
possible_genders |= NEUTER
return possible_genders
return possible_genders
@@ -36,6 +36,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_red"] >> pref.r_synth
S["synth_green"] >> pref.g_synth
S["synth_blue"] >> pref.b_synth
S["synth_markings"] >> pref.synth_markings
pref.preview_icon = null
S["bgstate"] >> pref.bgstate
@@ -65,6 +66,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["synth_red"] << pref.r_synth
S["synth_green"] << pref.g_synth
S["synth_blue"] << pref.b_synth
S["synth_markings"] << pref.synth_markings
S["bgstate"] << pref.bgstate
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
@@ -120,6 +122,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
character.r_synth = pref.r_synth
character.g_synth = pref.g_synth
character.b_synth = pref.b_synth
character.synth_markings = pref.synth_markings
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
@@ -305,6 +308,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "<br>"
. += "<br>"
. += "<b>Allow Synth markings:</b> <a href='?src=\ref[src];synth_markings=1'><b>[pref.synth_markings ? "Yes" : "No"]</b></a><br>"
. += "<b>Allow Synth color:</b> <a href='?src=\ref[src];synth_color=1'><b>[pref.synth_color ? "Yes" : "No"]</b></a><br>"
if(pref.synth_color)
. += "<a href='?src=\ref[src];synth2_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_synth, 2)][num2hex(pref.g_synth, 2)][num2hex(pref.b_synth, 2)]'><tr><td>__</td></tr></table></font> "
@@ -709,6 +713,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_synth = hex2num(copytext(new_color, 6, 8))
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["synth_markings"])
pref.synth_markings = !pref.synth_markings
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["cycle_bg"])
pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options)
return TOPIC_REFRESH_UPDATE_PREVIEW
@@ -241,6 +241,46 @@ datum/gear/suit/duster
path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
allowed_roles = list("Head of Personnel")
/datum/gear/suit/roles/poncho/cloak/cargo
display_name = "cloak, cargo"
path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo
allowed_roles = list("Cargo Technician","Quartermaster")
/datum/gear/suit/roles/poncho/cloak/mining
display_name = "cloak, cargo"
path = /obj/item/clothing/accessory/poncho/roles/cloak/mining
allowed_roles = list("Quartermaster","Shaft Miner")
/datum/gear/suit/roles/poncho/cloak/security
display_name = "cloak, security"
path = /obj/item/clothing/accessory/poncho/roles/cloak/security
allowed_roles = list("Head of Security","Detective","Warden","Security Officer")
/datum/gear/suit/roles/poncho/cloak/service
display_name = "cloak, service"
path = /obj/item/clothing/accessory/poncho/roles/cloak/service
allowed_roles = list("Head of Personnel","Bartender","Botanist","Janitor","Chef","Librarian")
/datum/gear/suit/roles/poncho/cloak/engineer
display_name = "cloak, engineer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/engineer
allowed_roles = list("Chief Engineer","Station Engineer")
/datum/gear/suit/roles/poncho/cloak/atmos
display_name = "cloak, atmos"
path = /obj/item/clothing/accessory/poncho/roles/cloak/atmos
allowed_roles = list("Chief Engineer","Atmospheric Technician")
/datum/gear/suit/roles/poncho/cloak/research
display_name = "cloak, science"
path = /obj/item/clothing/accessory/poncho/roles/cloak/research
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
/datum/gear/suit/roles/poncho/cloak/medical
display_name = "cloak, medical"
path = /obj/item/clothing/accessory/poncho/roles/cloak/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
@@ -116,22 +116,28 @@
path = /obj/item/weapon/cell/device
/datum/gear/utility/implant
exploitable = 1
/* VOREStation Edit - Make languages great again
/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
display_name = "implant, language, EAL"
path = /obj/item/weapon/implant/language/eal
cost = 2
slot = "implant"
exploitable = 1*/
exploitable = 1
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
cost = 0 //VOREStation Edit. Changed cost to 0
slot = "implant"
exploitable = 1
/* VOREStation Edit - Make languages great again
/datum/gear/utility/implant/language
cost = 2
exploitable = 0
/datum/gear/utility/implant/language/eal
display_name = "vocal synthesizer, EAL"
description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it."
path = /obj/item/weapon/implant/language/eal
/datum/gear/utility/implant/language/skrellian
display_name = "vocal synthesizer, Skrellian"
description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it."
path = /obj/item/weapon/implant/language/skrellian
*/
/datum/gear/utility/pen
display_name = "Fountain Pen"
path = /obj/item/weapon/pen/fountain
+1
View File
@@ -60,6 +60,7 @@ datum/preferences
var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
var/g_synth //Same as above
var/b_synth //Same as above
var/synth_markings = 0 //Enable/disable markings on synth parts.
//Some faction information.
var/home_system = "Unset" //System of birth.
+2 -1
View File
@@ -253,7 +253,8 @@
var/mob/living/carbon/human/H = user
if(slot && slot == slot_gloves)
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(istype(G))
ring = H.gloves
if(ring.glove_level >= src.glove_level)
to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
+2 -2
View File
@@ -9,8 +9,8 @@
/obj/item/clothing/head/helmet/combat/USDF
name = "marine helmet"
desc = "If you wanna to keep your brain inside yo' head, you'd best put this on!"
icon_state = "UNSC_helm"
item_state = "UNSC_helm"
icon_state = "unsc_helm"
item_state = "unsc_helm"
icon = 'icons/obj/clothing/hats_vr.dmi'
icon_override = 'icons/mob/head_vr.dmi'
+6
View File
@@ -20,27 +20,32 @@
/obj/item/clothing/head/pin/pink
icon_state = "pinkpin"
addblends = null
name = "pink hair hat"
/obj/item/clothing/head/pin/clover
icon_state = "cloverpin"
name = "clover pin"
addblends = null
desc = "A hair pin in the shape of a clover leaf."
/obj/item/clothing/head/pin/butterfly
icon_state = "butterflypin"
name = "butterfly pin"
addblends = null
desc = "A hair pin in the shape of a bright blue butterfly."
/obj/item/clothing/head/pin/magnetic
icon_state = "magnetpin"
name = "magnetic 'pin'"
addblends = null
desc = "Finally, a hair pin even a Morpheus chassis can use."
matter = list(DEFAULT_WALL_MATERIAL = 10)
/obj/item/clothing/head/pin/flower
name = "red flower pin"
icon_state = "hairflower"
addblends = null
desc = "Smells nice."
/obj/item/clothing/head/pin/flower/blue
@@ -82,6 +87,7 @@
/obj/item/clothing/head/pin/bow/big/red
icon_state = "redribbon"
name = "red ribbon"
addblends = null
/obj/item/clothing/head/powdered_wig
name = "powdered wig"
+6
View File
@@ -28,6 +28,12 @@
return gas_filtered
/obj/item/clothing/mask/gas/clear
name = "gas mask"
desc = "A face-covering mask with a transparent faceplate that can be connected to an air supply."
icon_state = "gas_clear"
flags_inv = null
/obj/item/clothing/mask/gas/half
name = "face mask"
desc = "A compact, durable gas mask that can be connected to an air supply."
@@ -104,14 +104,14 @@
interface_name = "mounted chem injector"
interface_desc = "Dispenses loaded chemicals via an arm-mounted injector."
var/max_reagent_volume = 10 //Regen to this volume
var/max_reagent_volume = 20 //Regen to this volume
var/chems_to_use = 5 //Per injection
charges = list(
list("inaprovaline", "inaprovaline", 0, 10),
list("tricordrazine", "tricordrazine", 0, 10),
list("tramadol", "tramadol", 0, 10),
list("dexalin plus", "dexalinp", 0, 10)
list("inaprovaline", "inaprovaline", 0, 20),
list("dylovene", "dylovene", 0, 20),
list("paracetamol", "paracetamol", 0, 20),
list("dexalin", "dexalin", 0, 20)
)
/obj/item/rig_module/rescue_pharm/process()
+1 -1
View File
@@ -60,7 +60,7 @@
/obj/item/clothing/suit/armor/combat/USDF
name = "marine body armor"
desc = "When I joined the Corps, we didn't have any fancy-schmanzy armor. We had sticks! Two sticks, and a rock for the whole platoonand we had to <i>share</i> the rock!"
icon_state = "UNSC_armor"
icon_state = "unsc_armor"
icon = 'icons/obj/clothing/suits_vr.dmi'
icon_override = 'icons/mob/suit_vr.dmi'
body_parts_covered = UPPER_TORSO|LOWER_TORSO // ToDo: Break up the armor into smaller bits.
@@ -128,6 +128,7 @@
/obj/item/clothing/suit/syndicatefake
name = "red space suit replica"
icon = 'icons/obj/clothing/spacesuits.dmi'
icon_state = "syndicate"
desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = ITEMSIZE_NORMAL
+1 -1
View File
@@ -78,7 +78,7 @@
name = "Radiation Hood"
icon_state = "rad"
desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation"
// flags_inv = BLOCKHAIR
flags_inv = BLOCKHAIR
item_flags = THICKMATERIAL
body_parts_covered = HEAD|FACE|EYES
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
@@ -121,8 +121,8 @@
* Cloak
*/
/obj/item/clothing/accessory/poncho/roles/cloak
name = "brown cloak"
desc = "An elaborate brown cloak."
name = "quartermaster's cloak"
desc = "An elaborate brown and gold cloak."
icon_state = "qmcloak"
item_state = "qmcloak"
body_parts_covered = null
@@ -169,6 +169,54 @@
icon_state = "capcloak"
item_state = "capcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/cargo
name = "brown cloak"
desc = "A simple brown and black cloak."
icon_state = "cargocloak"
item_state = "cargocloak"
/obj/item/clothing/accessory/poncho/roles/cloak/mining
name = "trimmed purple cloak"
desc = "A trimmed purple and brown cloak."
icon_state = "miningcloak"
item_state = "miningcloak"
/obj/item/clothing/accessory/poncho/roles/cloak/security
name = "red cloak"
desc = "A simple red and black cloak."
icon_state = "seccloak"
item_state = "seccloak"
/obj/item/clothing/accessory/poncho/roles/cloak/service
name = "green cloak"
desc = "A simple green and blue cloak."
icon_state = "servicecloak"
item_state = "servicecloak"
/obj/item/clothing/accessory/poncho/roles/cloak/engineer
name = "gold cloak"
desc = "A simple gold and brown cloak."
icon_state = "engicloak"
item_state = "engicloak"
/obj/item/clothing/accessory/poncho/roles/cloak/atmos
name = "yellow cloak"
desc = "A trimmed yellow and blue cloak."
icon_state = "atmoscloak"
item_state = "atmoscloak"
/obj/item/clothing/accessory/poncho/roles/cloak/research
name = "purple cloak"
desc = "A simple purple and white cloak."
icon_state = "scicloak"
item_state = "scicloak"
/obj/item/clothing/accessory/poncho/roles/cloak/medical
name = "blue cloak"
desc = "A simple blue and white cloak."
icon_state = "medcloak"
item_state = "medcloak"
/obj/item/clothing/accessory/hawaii
name = "flower-pattern shirt"
desc = "You probably need some welder googles to look at this."
-11
View File
@@ -51,17 +51,6 @@
kill()
return
/** Checks if any living humans are in a given area! */
/datum/event/atmos_leak/proc/is_area_occupied(var/area/myarea)
// Testing suggests looping over human_mob_list is quicker than looping over area contents
for(var/mob/living/carbon/human/H in human_mob_list)
if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it.
continue
var/area/A = get_area(H)
if(A == myarea) //The loc of a turf is the area it is in.
return 1
return 0
/datum/event/atmos_leak/announce()
command_announcement.Announce("Warning, hazardous [gas_data.name[gas_type]] gas leak detected in \the [target_area], evacuate the area and contain the damage!", "Hazard Alert")
+1 -1
View File
@@ -33,7 +33,7 @@
/datum/event/escaped_slimes/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
if(temp_vent.network && temp_vent.loc.z in using_map.station_levels) //borrowed from spiders event, but it works. Distribute the slimes only in rooms with vents
if(temp_vent.network && temp_vent.loc.z in using_map.station_levels && !is_area_occupied(temp_vent.loc.loc)) //borrowed from spiders event, but it works. Distribute the slimes only in rooms with vents
vents += temp_vent
while((spawncount > 0) && vents.len)
+2 -3
View File
@@ -6,9 +6,8 @@
endWhen = rand(15, 60)
// Setup which levels we will disrupt gravit on.
zLevels = using_map.station_levels.Copy()
if (planet_controller)
for(var/datum/planet/P in planet_controller.planets)
zLevels -= P.expected_z_levels
for(var/datum/planet/P in SSplanets.planets)
zLevels -= P.expected_z_levels
/datum/event/gravity/announce()
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system \
+1 -1
View File
@@ -50,7 +50,7 @@
new /obj/structure/meteorite(current)
var/datum/planet/impacted
for(var/datum/planet/P in planet_controller.planets)
for(var/datum/planet/P in SSplanets.planets)
if(current.z in P.expected_z_levels)
impacted = P
break
@@ -19,6 +19,9 @@
else
..()
/obj/item/device/electronic_assembly/get_cell()
return battery
/obj/item/device/assembly/electronic_assembly/proc/toggle_open(mob/user)
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
opened = !opened
@@ -162,13 +162,16 @@
return 1
var/cost = 1
if(isnull(current_category))
current_category = recipe_list[1]
if(ispath(build_type, /obj/item/device/electronic_assembly))
var/obj/item/device/electronic_assembly/E = build_type
cost = round( (initial(E.max_complexity) + initial(E.max_components) ) / 4)
else if(ispath(build_type, /obj/item/integrated_circuit))
var/obj/item/integrated_circuit/IC = build_type
cost = initial(IC.w_class)
else
var/obj/item/I = build_type
cost = initial(I.w_class)
if(!(locate(build_type) in recipe_list[current_category]))
return
if(metal - cost < 0)
@@ -198,4 +201,4 @@
name = "integrated circuit printer upgrade disk - circuit cloner"
desc = "Install this into your integrated circuit printer to enhance it. This one allows the printer to duplicate assemblies."
icon_state = "upgrade_disk_clone"
origin_tech = list(TECH_ENGINEERING = 5, TECH_DATA = 6)
origin_tech = list(TECH_ENGINEERING = 5, TECH_DATA = 6)
@@ -53,6 +53,7 @@
recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20)
recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20)
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60)
recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1)
+18
View File
@@ -0,0 +1,18 @@
/*
'Aura' modifiers are semi-permanent, in that they do not have a set duration, but will expire if out of range of the 'source' of the aura.
Note: The source is defined as an argument in New(), and if not specified, it is assumed the holder is the source,
making it not expire ever, which is likely not what you want.
*/
/datum/modifier/aura
var/aura_max_distance = 5 // If more than this many tiles away from the source, the modifier expires next tick.
/datum/modifier/aura/check_if_valid()
if(!origin)
expire()
var/atom/A = origin.resolve()
if(istype(A)) // Make sure we're not null.
if(get_dist(holder, A) > aura_max_distance)
expire()
else
expire() // Source got deleted or something.
+1 -1
View File
@@ -133,6 +133,6 @@
key = "s"
flags = SIGNLANG|NO_STUTTER|NONVERBAL
/datum/language/sign/can_speak_special(var/mob/speaker)
/datum/language/sign/can_speak_special(var/mob/speaker) // TODO: If ever we make external organs assist languages, convert this over to the new format
var/obj/item/organ/external/hand/hands = locate() in speaker //you can't sign without hands
return (hands || !iscarbon(speaker))
+9 -1
View File
@@ -133,7 +133,15 @@
return speech_verb
/datum/language/proc/can_speak_special(var/mob/speaker)
return 1
. = TRUE
if(ishuman(speaker))
var/mob/living/carbon/human/H = speaker
if(src.name in H.species.assisted_langs)
. = FALSE
var/obj/item/organ/internal/voicebox/vox = locate() in H.internal_organs // Only voiceboxes for now. Maybe someday it'll include other organs, but I'm not that clever
if(vox)
if(!vox.is_broken() && (src in vox.assists_languages))
. = TRUE
// Language handling.
/mob/proc/add_language(var/language)
+28 -12
View File
@@ -63,6 +63,14 @@
"ka","aasi","far","wa","baq","ara","qara","zir","saam","mak","hrar","nja","rir","khan","jun","dar","rik","kah",
"hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra")
/datum/language/tajaran/get_random_name(var/gender)
var/new_name = ..(gender,1)
if(prob(50))
new_name += " [pick(list("Hadii","Kaytam","Nazkiin","Zhan-Khazan","Hharar","Njarir'Akhan","Faaira'Nrezi","Rhezar","Mi'dynh","Rrhazkal","Bayan","Al'Manq","Mi'jri","Chur'eech","Sanu'dra","Ii'rka"))]"
else
new_name += " [..(gender,1)]"
return new_name
/datum/language/tajaranakhani
name = LANGUAGE_AKHANI
desc = "The language of the sea-faring Njarir'Akhan Tajaran. Borrowing some elements from Siik, the language is distinctly more structured."
@@ -77,14 +85,27 @@
"kar","yar","kzar","rha","hrar","err","fer","rir","rar","yarr","arr","ii'r","jar","kur","ran","rii","ii",
"nai","ou","kah","oa","ama","uuk","bel","chi","ayt","kay","kas","akor","tam","yir","enai")
/datum/language/tajaran/get_random_name(var/gender)
/datum/language/tajsign
name = LANGUAGE_ALAI
desc = "A standardized Tajaran sign language that was developed in Zarraya and gradually adopted by other nations, incorporating \
hand gestures and movements of the ears and tail."
signlang_verb = list("gestures with their hands", "gestures with their ears and tail", "gestures with their ears, tail and hands")
colour = "tajaran"
key = "l"
flags = WHITELISTED | SIGNLANG | NO_STUTTER | NONVERBAL
var/new_name = ..(gender,1)
if(prob(50))
new_name += " [pick(list("Hadii","Kaytam","Nazkiin","Zhan-Khazan","Hharar","Njarir'Akhan","Faaira'Nrezi","Rhezar","Mi'dynh","Rrhazkal","Bayan","Al'Manq","Mi'jri","Chur'eech","Sanu'dra","Ii'rka"))]"
else
new_name += " [..(gender,1)]"
return new_name
/datum/language/tajsign/can_speak_special(var/mob/speaker) // TODO: If ever we make external organs assist languages, convert this over to the new format
var/list/allowed_species = list(SPECIES_TAJ, SPECIES_TESHARI) // Need a tail and ears and such to use this.
if(iscarbon(speaker))
var/obj/item/organ/external/hand/hands = locate() in speaker //you can't sign without hands
if(!hands)
return FALSE
if(ishuman(speaker))
var/mob/living/carbon/human/H = speaker
if(H.species.get_bodytype(H) in allowed_species)
return TRUE
return FALSE
/datum/language/skrell
name = LANGUAGE_SKRELLIAN
@@ -152,11 +173,6 @@
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz","shh","shk")
space_chance = 10
/datum/language/machine/can_speak_special(var/mob/speaker)
var/obj/item/weapon/implant/language/eal/beep = locate() in speaker
return ((beep && beep.implanted) || speaker.isSynthetic() || isvoice(speaker))
//thank you sweet zuhayr
/datum/language/machine/get_random_name()
if(prob(70))
return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
-1
View File
@@ -71,7 +71,6 @@
"mihi","wan","six","salve","tartu")
machine_understands = FALSE
/datum/language/unathi
flags = 0
/datum/language/tajaran
@@ -1,6 +1,6 @@
/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null)
var/param = null
var/datum/gender/T = gender_datums[get_visible_gender()]
if (findtext(act, "-", 1, null))
@@ -14,9 +14,10 @@
var/muzzled = is_muzzled()
//var/m_type = 1
for (var/obj/item/weapon/implant/I in src)
if (I.implanted)
I.trigger(act, src)
for(var/obj/item/organ/O in src.organs)
for (var/obj/item/weapon/implant/I in O)
if (I.implanted)
I.trigger(act, src)
if(src.stat == 2.0 && (act != "deathgasp"))
return
@@ -80,10 +81,11 @@
//Promethean-only emotes
if("squish")
if(!species.bump_flag == SLIME) //That should do, yaya.
/* VOREStation Removal Start - Eh. People can squish maybe.
if(species.bump_flag != SLIME) //This should definitely do it.
src << "<span class='warning'>You are not a slime thing!</span>"
return
*/ //VOREStation Removal End
playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
message = "squishes."
m_type = 1
@@ -739,7 +741,7 @@
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
var/datum/gender/T = gender_datums[get_visible_gender()]
pose = sanitize(input(usr, "This is [src]. [T.he]...", "Pose", null) as text)
+4 -15
View File
@@ -166,25 +166,12 @@
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
/mob/living/carbon/human/proc/implant_loadout(var/datum/gear/G = new/datum/gear/utility/implant)
var/obj/item/weapon/implant/I = new G.path(src)
I.imp_in = src
I.implanted = 1
var/obj/item/organ/external/affected = src.organs_by_name[BP_HEAD]
affected.implants += I
I.part = affected
I.implanted(src)
/mob/living/carbon/human/proc/implant_loyalty(override = FALSE) // Won't override by default.
if(!config.use_loyalty_implants && !override) return // Nuh-uh.
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)
L.imp_in = src
L.implanted = 1
var/obj/item/organ/external/affected = src.organs_by_name[BP_HEAD]
affected.implants += L
L.part = affected
L.implanted(src)
if(L.handle_implant(src, BP_HEAD))
L.post_implant(src)
/mob/living/carbon/human/proc/is_loyalty_implanted()
for(var/L in src.contents)
@@ -1139,6 +1126,8 @@
remove_language(species.language)
if(species.default_language)
remove_language(species.default_language)
for(var/datum/language/L in species.assisted_langs)
remove_language(L)
// Clear out their species abilities.
species.remove_inherent_verbs(src)
holder_type = null
@@ -146,45 +146,35 @@ emp_act
//this proc returns the armour value for a particular external organ.
/mob/living/carbon/human/proc/getarmor_organ(var/obj/item/organ/external/def_zone, var/type)
if(!type || !def_zone) return 0
if(!type || !def_zone)
return 0
var/protection = 0
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
var/list/protective_gear = def_zone.get_covering_clothing()
for(var/obj/item/clothing/gear in protective_gear)
if(gear.body_parts_covered & def_zone.body_part)
protection += gear.armor[type]
if(LAZYLEN(gear.accessories))
for(var/obj/item/clothing/accessory/bling in gear.accessories)
if(bling.body_parts_covered & def_zone.body_part)
protection += bling.armor[type]
protection += gear.armor[type]
return protection
/mob/living/carbon/human/proc/getsoak_organ(var/obj/item/organ/external/def_zone, var/type)
if(!type || !def_zone) return 0
if(!type || !def_zone)
return 0
var/soaked = 0
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
var/list/protective_gear = def_zone.get_covering_clothing()
for(var/obj/item/clothing/gear in protective_gear)
if(gear.body_parts_covered & def_zone.body_part)
soaked += gear.armorsoak[type]
if(LAZYLEN(gear.accessories))
for(var/obj/item/clothing/accessory/bling in gear.accessories)
if(bling.body_parts_covered & def_zone.body_part)
soaked += bling.armorsoak[type]
soaked += gear.armorsoak[type]
return soaked
// Checked in borer code
/mob/living/carbon/human/proc/check_head_coverage()
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
for(var/bp in body_parts)
if(!bp) continue
if(bp && istype(bp ,/obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & HEAD)
return 1
var/obj/item/organ/external/H = organs_by_name[BP_HEAD]
var/list/body_parts = H.get_covering_clothing()
if(LAZYLEN(body_parts))
return 1
return 0
//Used to check if they can be fed food/drinks/pills
/mob/living/carbon/human/proc/check_mouth_coverage()
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform)
var/obj/item/organ/external/H = organs_by_name[BP_HEAD]
var/list/protective_gear = H.get_covering_clothing()
for(var/obj/item/gear in protective_gear)
if(istype(gear) && (gear.body_parts_covered & FACE) && !(gear.item_flags & FLEXIBLEMATERIAL))
return gear
@@ -30,6 +30,7 @@
var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
var/g_synth //Same as above
var/b_synth //Same as above
var/synth_markings = 0 //Enables/disables markings on synth parts.
//var/size_multiplier = 1 //multiplier for the mob's icon size //VOREStation Edit (Moved to /mob/living)
var/damage_multiplier = 1 //multiplies melee combat damage
@@ -1,6 +1,38 @@
// These should all be procs, you can add them to humans/subspecies by
// species.dm's inherent_verbs ~ Z
/mob/living/carbon/human/proc/tie_hair()
set name = "Tie Hair"
set desc = "Style your hair."
set category = "IC"
if(incapacitated())
to_chat(src, "<span class='warning'>You can't mess with your hair right now!</span>")
return
if(h_style)
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
var/selected_string
if(!(hair_style.flags & HAIR_TIEABLE))
to_chat(src, "<span class ='warning'>Your hair isn't long enough to tie.</span>")
return
else
var/list/datum/sprite_accessory/hair/valid_hairstyles = list()
for(var/hair_string in hair_styles_list)
var/list/datum/sprite_accessory/hair/test = hair_styles_list[hair_string]
if(test.flags & HAIR_TIEABLE)
valid_hairstyles.Add(hair_string)
selected_string = input("Select a new hairstyle", "Your hairstyle", hair_style) as null|anything in valid_hairstyles
if(incapacitated())
to_chat(src, "<span class='warning'>You can't mess with your hair right now!</span>")
return
else if(selected_string && h_style != selected_string)
h_style = selected_string
regenerate_icons()
visible_message("<span class='notice'>[src] pauses a moment to style their hair.</span>")
else
to_chat(src, "<span class ='notice'>You're already using that style.</span>")
/mob/living/carbon/human/proc/tackle()
set category = "Abilities"
set name = "Tackle"
+1 -1
View File
@@ -1041,7 +1041,7 @@
adjustHalLoss(-1)
if (drowsyness)
drowsyness--
drowsyness = max(0, drowsyness - 1)
eye_blurry = max(2, eye_blurry)
if (prob(5))
sleeping += 1
@@ -70,6 +70,7 @@ Variables you may want to make use of are:
num_alternate_languages = 3
species_language = LANGUAGE_GALCOM
secondary_langs = list()
assisted_langs = list()
name_language = null // Use the first-name last-name generator rather than a language scrambler
min_age = 0
@@ -25,6 +25,8 @@
genders = list(NEUTER)
assisted_langs = list()
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
spawn(1)
new /obj/effect/decal/cleanable/ash(H.loc)
@@ -7,6 +7,7 @@
language = LANGUAGE_GALCOM
species_language = LANGUAGE_VOX
num_alternate_languages = 1
assisted_langs = list(LANGUAGE_ROOTGLOBAL)
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong)
rarity_value = 4
blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
@@ -71,6 +72,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart/vox,
O_LUNGS = /obj/item/organ/internal/lungs/vox,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver/vox,
O_KIDNEYS = /obj/item/organ/internal/kidneys/vox,
O_BRAIN = /obj/item/organ/internal/brain/vox,
@@ -52,13 +52,17 @@
// Language/culture vars.
var/default_language = LANGUAGE_GALCOM // Default language is used when 'say' is used without modifiers.
var/language = LANGUAGE_GALCOM // Default racial language, if any.
var/species_language = LANGUAGE_GALCOM // Used on the Character Setup screen
var/list/species_language = list(LANGUAGE_GALCOM) // Used on the Character Setup screen
var/list/secondary_langs = list() // The names of secondary languages that are available to this species.
var/list/speech_sounds = list() // A list of sounds to potentially play when speaking.
var/list/speech_chance = list() // The likelihood of a speech sound playing.
var/num_alternate_languages = 0 // How many secondary languages are available to select at character creation
var/name_language = LANGUAGE_GALCOM // The language to use when determining names for this species, or null to use the first name/last name generator
// The languages the species can't speak without an assisted organ.
// This list is a guess at things that no one other than the parent species should be able to speak
var/list/assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
//Soundy emotey things.
var/scream_verb = "screams"
var/male_scream_sound //= 'sound/goonstation/voice/male_scream.ogg' Removed due to licensing, replace!
@@ -183,6 +187,7 @@
var/list/has_organ = list( // which required-organ checks are conducted.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
@@ -3,7 +3,6 @@
name_plural = "Alraunes"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
num_alternate_languages = 2
language = LANGUAGE_ROOTLOCAL
slowdown = 1 //slow, they're plants. Not as slow as full diona.
total_health = 100 //standard
brute_mod = 1 //nothing special
@@ -11,6 +11,8 @@
spawn_flags = SPECIES_IS_RESTRICTED
siemens_coefficient = 0
assisted_langs = list()
breath_type = null
poison_type = null
@@ -45,6 +45,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
@@ -30,6 +30,7 @@ var/datum/species/shapeshifter/promethean/prometheans
health_hud_intensity = 2
num_alternate_languages = 3
species_language = LANGUAGE_SOL_COMMON
assisted_langs = list(LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) // Prometheans are weird, let's just assume they can use basically any language.
breath_type = null
poison_type = null
@@ -104,6 +104,7 @@
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
@@ -12,6 +12,7 @@
species_language = LANGUAGE_SOL_COMMON
secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_TERMINUS)
name_language = null // Use the first-name last-name generator rather than a language scrambler
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
min_age = 17
max_age = 130
@@ -23,6 +24,9 @@
spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
inherent_verbs = list(
/mob/living/carbon/human/proc/tie_hair)
/datum/species/human/get_bodytype(var/mob/living/carbon/human/H)
return SPECIES_HUMAN
@@ -153,7 +157,7 @@
metabolic_rate = 1.1
gluttonous = 1
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_SIIK, LANGUAGE_AKHANI)
secondary_langs = list(LANGUAGE_SIIK, LANGUAGE_AKHANI, LANGUAGE_ALAI)
name_language = LANGUAGE_SIIK
species_language = LANGUAGE_SIIK
health_hud_intensity = 2.5
@@ -214,6 +218,7 @@
has_organ = list( //No appendix.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
@@ -240,6 +245,7 @@
secondary_langs = list(LANGUAGE_SKRELLIAN, LANGUAGE_SCHECHI)
name_language = LANGUAGE_SKRELLIAN
species_language = LANGUAGE_SKRELLIAN
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_TERMINUS, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
health_hud_intensity = 2
water_movement = -3
@@ -314,13 +320,14 @@
hud_type = /datum/hud_data/diona
siemens_coefficient = 0.3
show_ssd = "completely quiescent"
num_alternate_languages = 2
secondary_langs = list(LANGUAGE_ROOTGLOBAL)
name_language = LANGUAGE_ROOTLOCAL
species_language = LANGUAGE_ROOTLOCAL
health_hud_intensity = 2.5
item_slowdown_mod = 0.25
num_alternate_languages = 2
name_language = LANGUAGE_ROOTLOCAL
species_language = LANGUAGE_ROOTLOCAL
secondary_langs = list(LANGUAGE_ROOTGLOBAL)
assisted_langs = list(LANGUAGE_VOX) // Diona are weird, let's just assume they can use basically any language.
min_age = 1
max_age = 300
@@ -3,7 +3,7 @@
set category = "Abilities"
// 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()
@@ -658,7 +658,7 @@
return ..(G.affecting)
//PAIs don't need a grab or anything
//PAIs, borgs, and animals don't need a grab or anything
/mob/living/silicon/pai/can_shred(var/mob/living/carbon/human/target)
if(!target)
var/list/choices = list()
@@ -674,6 +674,36 @@
return ..(target)
/mob/living/silicon/robot/can_shred(var/mob/living/carbon/human/target)
if(!target)
var/list/choices = list()
for(var/mob/living/carbon/human/M in oviewers(1))
choices += M
if(!choices.len)
to_chat(src,"<span class='warning'>There's nobody nearby to use this on.</span>")
target = input(src,"Who do you wish to target?","Damage/Remove Prey's Organ") as null|anything in choices
if(!istype(target))
return FALSE
return ..(target)
/mob/living/simple_animal/can_shred(var/mob/living/carbon/human/target)
if(!target)
var/list/choices = list()
for(var/mob/living/carbon/human/M in oviewers(1))
choices += M
if(!choices.len)
to_chat(src,"<span class='warning'>There's nobody nearby to use this on.</span>")
target = input(src,"Who do you wish to target?","Damage/Remove Prey's Organ") as null|anything in choices
if(!istype(target))
return FALSE
return ..(target)
/mob/living/proc/shred_limb()
set name = "Damage/Remove Prey's Organ"
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
@@ -363,7 +363,7 @@
min_age = 18
icobase = 'icons/mob/human_races/r_vox_old.dmi'
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
inherent_verbs = list(/mob/living/proc/shred_limb)
inherent_verbs = list(/mob/living/proc/shred_limb, /mob/living/proc/eat_trash)
datum/species/harpy
name = SPECIES_RAPALA
@@ -1,5 +1,5 @@
/datum/trait
var/name = "Prototype Trait"
var/name
var/desc = "Contact a developer if you see this trait."
var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive.
@@ -16,6 +16,8 @@
speech_bubble_appearance = "cyber"
assisted_langs = list()
male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
@@ -5,6 +5,7 @@
default_language = "Xenomorph"
language = "Hivemind"
assisted_langs = list()
unarmed_types = list(/datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno)
hud_type = /datum/hud_data/alien
rarity_value = 3
+2 -1
View File
@@ -1,10 +1,11 @@
/mob/living/carbon/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it.
/* VOREStation Removal - Synths should be able to taste because... reasons
if(ishuman(src))
var/mob/living/carbon/human/H = src
var/braintype = H.get_FBP_type()
if(braintype == FBP_DRONE || braintype == FBP_POSI)
return from.trans_to_holder(target,amount,multiplier,copy) //skip the taste, complete transfer
*/
if(last_taste_time + 50 < world.time)
var/datum/reagents/temp = new(amount) //temporary holder used to analyse what gets transfered.
from.trans_to_holder(temp, amount, multiplier, 1)
+12 -4
View File
@@ -64,6 +64,7 @@ var/list/ai_verbs_default = list(
var/datum/announcement/priority/announcement
var/obj/machinery/ai_powersupply/psupply = null // Backwards reference to AI's powersupply object.
var/hologram_follow = 1 //This is used for the AI eye, to determine if a holopad's hologram should follow it or not.
var/is_dummy = 0 //Used to prevent dummy AIs from spawning with communicators.
//NEWMALF VARIABLES
var/malfunctioning = 0 // Master var that determines if AI is malfunctioning.
var/datum/malf_hardware/hardware = null // Installed piece of hardware.
@@ -111,15 +112,16 @@ var/list/ai_verbs_default = list(
possibleNames -= pickedName
pickedName = null
aiPDA = new/obj/item/device/pda/ai(src)
if(!is_dummy)
aiPDA = new/obj/item/device/pda/ai(src)
SetName(pickedName)
anchored = 1
canmove = 0
density = 1
loc = loc
aiCommunicator = new /obj/item/device/communicator/integrated(src)
if(!is_dummy)
aiCommunicator = new /obj/item/device/communicator/integrated(src)
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1"))
@@ -693,6 +695,9 @@ var/list/ai_verbs_default = list(
card.grab_ai(src, user)
else if(istype(W, /obj/item/weapon/wrench))
if(user == controlling_drone)
to_chat(user, "<span class='notice'>The drone's subsystems resist your efforts to tamper with your bolts.</span>")
return
if(anchored)
playsound(src, W.usesound, 50, 1)
user.visible_message("<font color='blue'>\The [user] starts to unbolt \the [src] from the plating...</font>")
@@ -802,6 +807,9 @@ var/list/ai_verbs_default = list(
return TRUE
//Special subtype kept around for global announcements
/mob/living/silicon/ai/announcer/
is_dummy = 1
/mob/living/silicon/ai/announcer/initialize()
. = ..()
mob_list -= src
@@ -3,6 +3,10 @@
if(stat == DEAD)
return
if(controlling_drone)
controlling_drone.release_ai_control("<b>WARNING: Primary control loop failure.</b> Session terminated.")
. = ..(gibbed)
if(src.eyeobj)
src.eyeobj.setLoc(get_turf(src))
+78 -3
View File
@@ -84,6 +84,7 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/glitchman
name = "Glitchman"
alive_icon = "ai-glitchman"
dead_icon = "ai-glitchman-crash"
/datum/ai_icon/goon
name = "Goon"
@@ -110,6 +111,7 @@ var/list/datum/ai_icon/ai_icons
name = "Inverted"
alive_icon = "ai-u"
alive_light = "#81DDFF"
dead_icon = "ai-u-crash"
/datum/ai_icon/lonestar
name = "Lonestar"
@@ -163,14 +165,87 @@ var/list/datum/ai_icon/ai_icons
/datum/ai_icon/trapped
name = "Trapped"
alive_icon = "ai-hades"
dead_icon = "ai-hades_dead"
dead_icon = "ai-hades-crash"
/datum/ai_icon/triumvirate_static
/datum/ai_icon/triumvirate
name = "Triumvirate"
alive_icon = "ai-triumvirate"
alive_light = "#020B2B"
/datum/ai_icon/triumvirate_static
name = "Triumvirate Static"
alive_icon = "ai-static"
alive_icon = "ai-triumvirate-malf"
alive_light = "#020B2B"
//Eros Research Platform Ports
/datum/ai_icon/clown2
name = "Honk"
alive_icon = "ai-clown2"
dead_icon = "ai-clown2-crash"
/datum/ai_icon/boxfort
name = "Boxfort"
alive_icon = "ai-boxfort"
dead_icon = "ai-boxfort_dead"
/datum/ai_icon/ravensdale
name = "Integration"
alive_icon = "ai-ravensdale"
dead_icon = "ai-ravensdale-crash"
/datum/ai_icon/gentoo
name = "Gentoo"
alive_icon = "ai-gentoo"
dead_icon = "ai-gentoo_dead"
/datum/ai_icon/serithi
name = "Mechanicus"
alive_icon = "ai-serithi"
dead_icon = "ai-serithi-crash"
/datum/ai_icon/alien
name = "Xenomorph"
alive_icon = "ai-alien"
dead_icon = "ai-alien-crash"
/datum/ai_icon/syndicat
name = "Syndi-cat"
alive_icon = "ai-syndicatmeow"
/datum/ai_icon/wasp
name = "Wasp"
alive_icon = "ai-wasp"
/datum/ai_icon/house
name = "Doctor"
alive_icon = "ai-house"
/datum/ai_icon/fabulous
name = "Fabulous"
alive_icon = "ai-fabulous"
/datum/ai_icon/yesman
name = "Yes Man"
alive_icon = "ai-yes-man"
dead_icon = "ai-alien-crash"
/datum/ai_icon/royal
name = "Royal"
alive_icon = "ai-royal"
/datum/ai_icon/pirate
name = "Pirate"
alive_icon = "ai-pirate"
/datum/ai_icon/gygas
name = "Love"
alive_icon = "ai-gygas"
/datum/ai_icon/xerxes
name = "Xerxes"
alive_icon = "ai-xerxes"
/datum/ai_icon/godfrey
name = "Godfrey"
alive_icon = "ai-godfrey"
@@ -8,6 +8,8 @@
if (src.stat!=CONSCIOUS)
src.cameraFollow = null
src.reset_view(null)
if(controlling_drone)
controlling_drone.release_ai_control("<b>WARNING: Primary control loop failure.</b> Session terminated.")
src.updatehealth()
@@ -15,6 +15,8 @@
if(module)
var/obj/item/weapon/gripper/G = locate(/obj/item/weapon/gripper) in module
if(G) G.drop_item()
var/obj/item/device/dogborg/sleeper/S = locate(/obj/item/device/dogborg/sleeper) in module //VOREStation edit.
if(S) S.go_out() //VOREStation edit.
remove_robot_verbs()
sql_report_cyborg_death(src)
..(gibbed,"shudders violently for a moment, then becomes motionless, its eyes slowly darkening.")
@@ -19,7 +19,7 @@ var/list/mob_hat_cache = list()
return mob_hat_cache[key]
/mob/living/silicon/robot/drone
name = "drone"
name = "maintenance drone"
real_name = "drone"
icon = 'icons/mob/robots.dmi'
icon_state = "repairbot"
@@ -57,6 +57,8 @@ var/list/mob_hat_cache = list()
var/obj/item/hat
var/hat_x_offset = 0
var/hat_y_offset = -13
var/serial_number = 0
var/name_override = 0
holder_type = /obj/item/weapon/holder/drone
@@ -71,6 +73,7 @@ var/list/mob_hat_cache = list()
return FALSE
/mob/living/silicon/robot/drone/construction
name = "construction drone"
icon_state = "constructiondrone"
law_type = /datum/ai_laws/construction_drone
module_type = /obj/item/weapon/robot_module/drone/construction
@@ -95,6 +98,7 @@ var/list/mob_hat_cache = list()
remove_language("Robot Talk")
add_language("Robot Talk", 0)
add_language("Drone Talk", 1)
serial_number = rand(0,999)
//They are unable to be upgraded, so let's give them a bit of a better battery.
cell.maxcharge = 10000
@@ -110,6 +114,7 @@ var/list/mob_hat_cache = list()
verbs -= /mob/living/silicon/robot/verb/Namepick
updateicon()
updatename()
/mob/living/silicon/robot/drone/init()
aiCamera = new/obj/item/device/camera/siliconcam/drone_camera(src)
@@ -127,14 +132,22 @@ var/list/mob_hat_cache = list()
name = real_name
/mob/living/silicon/robot/drone/updatename()
real_name = "maintenance drone ([rand(100,999)])"
if(name_override)
return
if(controlling_ai)
real_name = "remote drone ([controlling_ai])"
else
real_name = "[initial(name)] ([serial_number])"
name = real_name
/mob/living/silicon/robot/drone/updateicon()
overlays.Cut()
if(stat == 0)
overlays += "eyes-[icon_state]"
if(controlling_ai)
overlays += "eyes-[icon_state]-ai"
else
overlays += "eyes-[icon_state]"
else
overlays -= "eyes"
if(hat) // Let the drones wear hats.
@@ -213,15 +226,18 @@ var/list/mob_hat_cache = list()
return
if(emagged)
to_chat(user, "<span class='danger'>\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.</span>")
to_chat(src, "<span class='danger'>\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.</span>")
to_chat(user, "<span class='danger'>You attempt to subvert [src], but the sequencer has no effect.</span>")
return
to_chat(user, "<span class='danger'>You swipe the sequencer across [src]'s interface and watch its eyes flicker.</span>")
to_chat(user, "<span class='danger'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>")
message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
if(controlling_ai)
to_chat(src, "<span class='danger'>\The [user] loads some kind of subversive software into the remote drone, corrupting its lawset but luckily sparing yours.</span>")
else
to_chat(src, "<span class='danger'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>")
log_game("[key_name(user)] emagged drone [key_name(src)][controlling_ai ? " but AI [key_name(controlling_ai)] is in remote control" : " Laws overridden"].")
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] <B>:</B> [user.name]([user.key]) emagged [name]([key])")
@@ -234,9 +250,10 @@ var/list/mob_hat_cache = list()
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
set_zeroth_law("Only [user.real_name] and people [TU.he] designate[TU.s] as being such are operatives.")
src << "<b>Obey these laws:</b>"
laws.show_laws(src)
src << "<span class='danger'>ALERT: [user.real_name] [TU.is] your new master. Obey your new laws and [TU.his] commands.</span>"
if(!controlling_ai)
to_chat(src, "<b>Obey these laws:</b>")
laws.show_laws(src)
to_chat(src, "<span class='danger'>ALERT: [user.real_name] is your new master. Obey your new laws and \his commands.</span>")
return 1
//DRONE LIFE/DEATH
@@ -262,26 +279,41 @@ var/list/mob_hat_cache = list()
return
..()
/mob/living/silicon/robot/drone/death(gibbed)
if(controlling_ai)
release_ai_control("<b>WARNING: remote system failure.</b> Connection timed out.")
. = ..(gibbed)
//DRONE MOVEMENT.
/mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip)
return 0
//CONSOLE PROCS
/mob/living/silicon/robot/drone/proc/law_resync()
if(controlling_ai)
to_chat(src, "<span class='warning'>Someone issues a remote law reset order for this unit, but you disregard it.</span>")
return
if(stat != 2)
if(emagged)
src << "<span class='danger'>You feel something attempting to modify your programming, but your hacked subroutines are unaffected.</span>"
to_chat(src, "<span class='danger'>You feel something attempting to modify your programming, but your hacked subroutines are unaffected.</span>")
else
src << "<span class='danger'>A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it.</span>"
to_chat(src, "<span class='danger'>A reset-to-factory directive packet filters through your data connection, and you obediently modify your programming to suit it.</span>")
full_law_reset()
show_laws()
/mob/living/silicon/robot/drone/proc/shut_down()
if(controlling_ai && mind.special_role)
to_chat(src, "<span class='warning'>Someone issued a remote kill order for this unit, but you disregard it.</span>")
return
if(stat != 2)
if(emagged)
src << "<span class='danger'>You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.</span>"
to_chat(src, "<span class='danger'>You feel a system kill order percolate through [controlling_ai ? "the drones" : "your"] tiny brain, but it doesn't seem like a good idea to [controlling_ai ? "it" : "you"].</span>")
else
src << "<span class='danger'>You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.</span>"
to_chat(src, "<span class='danger'>You feel a system kill order percolate through [controlling_ai ? "the drones" : "your"] tiny brain, and [controlling_ai ? "it" : "you"] obediently destroy[controlling_ai ? "s itself" : " yourself"].</span>")
death()
/mob/living/silicon/robot/drone/proc/full_law_reset()
@@ -290,6 +322,21 @@ var/list/mob_hat_cache = list()
clear_ion_laws(1)
laws = new law_type
/mob/living/silicon/robot/drone/show_laws(var/everyone = 0)
if(!controlling_ai)
return..()
to_chat(src, "<b>Obey these laws:</b>")
controlling_ai.laws_sanity_check()
controlling_ai.laws.show_laws(src)
/mob/living/silicon/robot/drone/robot_checklaws()
set category = "Silicon Commands"
set name = "State Laws"
if(!controlling_ai)
return ..()
controlling_ai.subsystem_law_manager()
//Reboot procs.
/mob/living/silicon/robot/drone/proc/request_player()
@@ -347,14 +394,6 @@ var/list/mob_hat_cache = list()
..()
flavor_text = "It's a bulky construction drone stamped with a Sol Central glyph."
/mob/living/silicon/robot/drone/construction/updatename()
real_name = "construction drone ([rand(100,999)])"
name = real_name
/mob/living/silicon/robot/drone/mining/init()
..()
flavor_text = "It's a bulky mining drone stamped with a Grayson logo."
/mob/living/silicon/robot/drone/mining/updatename()
real_name = "mining drone ([rand(100,999)])"
name = real_name
@@ -75,20 +75,22 @@
if(!produce_drones || !config.allow_drone_spawn || count_drones() >= config.max_maint_drones)
return
if(!player || !istype(player.mob,/mob/observer/dead))
if(player && !istype(player.mob,/mob/observer/dead))
return
announce_ghost_joinleave(player, 0, "They have taken control over a maintenance drone.")
visible_message("\The [src] churns and grinds as it lurches into motion, disgorging a shiny new drone after a few moments.")
flick("h_lathe_leave",src)
drone_progress = 0
time_last_drone = world.time
if(player.mob && player.mob.mind) player.mob.mind.reset()
var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
new_drone.transfer_personality(player)
new_drone.master_fabricator = src
drone_progress = 0
var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src))
if(player)
announce_ghost_joinleave(player, 0, "They have taken control over a maintenance drone.")
if(player.mob && player.mob.mind) player.mob.mind.reset()
new_drone.transfer_personality(player)
return new_drone
/mob/observer/dead/verb/join_as_drone()
@@ -0,0 +1,103 @@
/mob/living/silicon/ai
var/mob/living/silicon/robot/drone/controlling_drone
/mob/living/silicon/robot/drone
var/mob/living/silicon/ai/controlling_ai
/mob/living/silicon/robot/drone/attack_ai(var/mob/living/silicon/ai/user)
if(!istype(user) || controlling_ai || !config.allow_drone_spawn || !config.allow_ai_drones)
return
if(client || key)
to_chat(user, "<span class='warning'>You cannot take control of an autonomous, active drone.</span>")
return
if(health < -35 || emagged)
to_chat(user, "<span class='notice'><b>WARNING:</b> connection timed out.</span>")
return
user.controlling_drone = src
user.teleop = src
radio.channels = user.aiRadio.keyslot2.channels
controlling_ai = user
verbs += /mob/living/silicon/robot/drone/proc/release_ai_control_verb
local_transmit = FALSE
languages = controlling_ai.languages.Copy()
speech_synthesizer_langs = controlling_ai.speech_synthesizer_langs.Copy()
stat = CONSCIOUS
if(user.mind)
user.mind.transfer_to(src)
else
key = user.key
updatename()
to_chat(src, "<span class='notice'><b>You have shunted your primary control loop into \a [initial(name)].</b> Use the <b>Release Control</b> verb to return to your core.</span>")
/obj/machinery/drone_fabricator/attack_ai(var/mob/living/silicon/ai/user as mob)
if(!istype(user) || user.controlling_drone || !config.allow_drone_spawn || !config.allow_ai_drones)
return
if(stat & NOPOWER)
to_chat(user, "<span class='warning'>\The [src] is unpowered.</span>")
return
if(!produce_drones)
to_chat(user, "<span class='warning'>\The [src] is disabled.</span>")
return
if(drone_progress < 100)
to_chat(user, "<span class='warning'>\The [src] is not ready to produce a new drone.</span>")
return
if(count_drones() >= config.max_maint_drones)
to_chat(user, "<span class='warning'>The drone control subsystems are tasked to capacity; they cannot support any more drones.</span>")
return
var/mob/living/silicon/robot/drone/new_drone = create_drone()
user.controlling_drone = new_drone
user.teleop = new_drone
new_drone.radio.channels = user.aiRadio.keyslot2.channels
new_drone.controlling_ai = user
new_drone.verbs += /mob/living/silicon/robot/drone/proc/release_ai_control_verb
new_drone.local_transmit = FALSE
new_drone.languages = new_drone.controlling_ai.languages.Copy()
new_drone.speech_synthesizer_langs = new_drone.controlling_ai.speech_synthesizer_langs.Copy()
if(user.mind)
user.mind.transfer_to(new_drone)
else
new_drone.key = user.key
new_drone.updatename()
to_chat(new_drone, "<span class='notice'><b>You have shunted your primary control loop into \a [initial(new_drone.name)].</b> Use the <b>Release Control</b> verb to return to your core.</span>")
/mob/living/silicon/robot/drone/proc/release_ai_control_verb()
set name = "Release Control"
set desc = "Release control of a remote drone."
set category = "Silicon Commands"
release_ai_control("Remote session terminated.")
/mob/living/silicon/robot/drone/proc/release_ai_control(var/message = "Connection terminated.")
if(controlling_ai)
if(mind)
mind.transfer_to(controlling_ai)
else
controlling_ai.key = key
to_chat(controlling_ai, "<span class='notice'>[message]</span>")
controlling_ai.controlling_drone = null
controlling_ai.teleop = null
controlling_ai = null
radio.channels = module.channels
verbs -= /mob/living/silicon/robot/drone/proc/release_ai_control_verb
module.remove_languages(src) //Removes excess, adds 'default'.
remove_language("Robot Talk")
add_language("Robot Talk", 0)
add_language("Drone Talk", 1)
local_transmit = TRUE
full_law_reset()
updatename()
death()
@@ -216,6 +216,7 @@ var/global/list/robot_modules = list(
..()
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src)
src.modules += new /obj/item/weapon/autopsy_scanner(src)
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
@@ -170,6 +170,7 @@
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs |= /mob/living/proc/shred_limb
..()
/obj/item/weapon/robot_module/robot/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
@@ -239,6 +240,7 @@
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs |= /mob/living/proc/shred_limb
..()
/obj/item/weapon/robot_module/robot/ert
@@ -284,6 +286,7 @@
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs |= /mob/living/proc/shred_limb
..()
/obj/item/weapon/robot_module/robot/scrubpup
@@ -363,6 +366,7 @@
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs |= /mob/living/proc/shred_limb
..()
/obj/item/weapon/robot_module/robot/science
@@ -408,6 +412,7 @@
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs |= /mob/living/proc/shred_limb
..()
/obj/item/weapon/robot_module/robot/engiedog
@@ -531,6 +536,7 @@
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs |= /mob/living/proc/shred_limb
..()
/obj/item/weapon/robot_module/Reset(var/mob/living/silicon/robot/R)
@@ -543,4 +549,5 @@
R.default_pixel_x = initial(pixel_x)
R.scrubbing = FALSE
R.verbs -= /mob/living/silicon/robot/proc/ex_reserve_refill
R.verbs -= /mob/living/proc/shred_limb
..()
@@ -148,6 +148,7 @@
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
// Surgery things.
src.modules += new /obj/item/weapon/autopsy_scanner(src)
src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
@@ -39,6 +39,8 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
showvoreprefs = 0 //VOREStation Edit - Hides mechanical vore prefs for mimics. You can't see their gaping maws when they're just sitting idle.
/mob/living/simple_animal/hostile/mimic/set_target()
. = ..()
if(.)
@@ -114,6 +116,8 @@
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
for(var/obj/O in src)
if(isbelly(O)) //VOREStation edit
continue
O.forceMove(C)
..()
@@ -146,6 +150,8 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/death()
for(var/atom/movable/M in src)
if(isbelly(M)) //VOREStation edit
continue
M.forceMove(get_turf(src))
..()
@@ -796,6 +796,8 @@
var/mob/living/L = target_mob
if(L.stat != DEAD)
return 1
if(L.invisibility < INVISIBILITY_LEVEL_ONE)
return 1
if (istype(target_mob,/obj/mecha))
var/obj/mecha/M = target_mob
if (M.occupant)
@@ -915,6 +917,8 @@
continue
else if(L in friends)
continue
else if(L.invisibility >= INVISIBILITY_LEVEL_ONE)
continue
else if(!SA_attackable(L))
continue
else if(!special_target_check(L))
@@ -1242,7 +1246,7 @@
ai_log("AttackTarget() Bailing because we're disabled",2)
LoseTarget()
return 0
if(!target_mob || !SA_attackable(target_mob))
if(!target_mob || !SA_attackable(target_mob) || (target_mob.invisibility >= INVISIBILITY_LEVEL_ONE)) //if the target went invisible, you can't follow it
LoseTarget()
return 0
if(!(target_mob in ListTargets(view_range)))
@@ -137,6 +137,7 @@
if(!IsAdvancedToolUser())
verbs |= /mob/living/simple_animal/proc/animal_nom
verbs |= /mob/living/proc/shred_limb
if(LAZYLEN(vore_organs))
return
@@ -6,7 +6,7 @@
/mob/living/simple_animal/otie //Spawn this one only if you're looking for a bad time. Not friendly.
name = "otie"
desc = "The classic bioengineered longdog."
tt_desc = "Canis otis"
tt_desc = "Otus robustus"
icon = 'icons/mob/vore64x32.dmi'
icon_state = "otie"
icon_living = "otie"
@@ -64,6 +64,7 @@
/mob/living/simple_animal/otie/feral //gets the pet2tame feature. starts out hostile tho so get gamblin'
name = "mutated feral otie"
desc = "The classic bioengineered longdog. No pets. Only bite. This one has mutated from too much time out on the surface of Virgo-3B."
tt_desc = "Otus phoronis"
icon_state = "siftusian"
icon_living = "siftusian"
icon_dead = "siftusian-dead"
@@ -84,6 +85,36 @@
glowyeyes = TRUE
eyetype = "photie"
/mob/living/simple_animal/otie/red
name = "feral red otie"
desc = "Seems this ominous looking longdog has been infused with wicked infernal forces."
tt_desc = "Otus infernalis"
icon_state = "hotie"
icon_living = "hotie"
icon_dead = "hotie-dead"
icon_rest = "hotie_rest"
faction = "cult"
tame_chance = 20
melee_damage_lower = 10
melee_damage_upper = 25
// Lazy way of making sure this otie survives outside.
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
glowyeyes = TRUE
eyetype = "hotie"
/mob/living/simple_animal/otie/red/friendly //gets the pet2tame feature and doesn't kill you right away
name = "red otie"
desc = "Seems this ominous looking longdog has been infused with wicked infernal forces. This one seems rather peaceful though."
faction = "neutral"
tamed = 1
/mob/living/simple_animal/otie/friendly //gets the pet2tame feature and doesn't kill you right away
name = "otie"
desc = "The classic bioengineered longdog. This one might even tolerate you!"
@@ -102,6 +133,7 @@
/mob/living/simple_animal/otie/cotie/phoron //friendly phoron pup with collar
name = "mutated otie"
desc = "Looks like someone did manage to domesticate one of those wild phoron mutants. What a badass."
tt_desc = "Otus phoronis"
icon_state = "pcotie"
icon_living = "pcotie"
icon_rest = "pcotie_rest"
@@ -139,6 +171,7 @@
/mob/living/simple_animal/otie/security/phoron
name = "mutated guard otie"
desc = "An extra rare phoron resistant version of the VARMAcorp trained snowflake guard dogs."
tt_desc = "Otus phoronis"
icon_state = "sifguard"
icon_living = "sifguard"
icon_rest = "sifguard_rest"
+2 -1
View File
@@ -49,5 +49,6 @@
//Final popup notice
if (!pass)
alert(src,"There were problems with spawning your character. Check your message log for details.","Error","OK")
spawn()
alert(src,"There were problems with spawning your character. Check your message log for details.","Error","OK")
return pass
+119 -11
View File
@@ -47,60 +47,80 @@
icon = 'icons/mob/Human_face_m.dmi' // default icon for all hairs
var/icon_add = 'icons/mob/human_face.dmi'
var/flags
bald
name = "Bald"
icon_state = "bald"
gender = MALE
flags = HAIR_VERY_SHORT
species_allowed = list(SPECIES_HUMAN,SPECIES_UNATHI,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_VOX)
short
name = "Short Hair" // try to capatilize the names please~
icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
flags = HAIR_VERY_SHORT
short2
name = "Short Hair 2"
icon_state = "hair_shorthair3"
flags = HAIR_VERY_SHORT
short3
name = "Short Hair 3"
icon_state = "hair_shorthair4"
flags = HAIR_VERY_SHORT
twintail
name = "Twintail"
icon_state = "hair_twintail"
flags = HAIR_TIEABLE
cut
name = "Cut Hair"
icon_state = "hair_c"
flags = HAIR_VERY_SHORT
flair
name = "Flaired Hair"
icon_state = "hair_flair"
flags = HAIR_TIEABLE
long
name = "Shoulder-length Hair"
icon_state = "hair_b"
flags = HAIR_TIEABLE
/*longish
/*
longish
name = "Longer Hair"
icon_state = "hair_b2"*/
icon_state = "hair_b2"
flags = HAIR_TIEABLE
*/
longer
name = "Long Hair"
icon_state = "hair_vlong"
flags = HAIR_TIEABLE
longeralt2
name = "Long Hair Alt 2"
icon_state = "hair_longeralt2"
flags = HAIR_TIEABLE
longest
name = "Very Long Hair"
icon_state = "hair_longest"
flags = HAIR_TIEABLE
longfringe
name = "Long Fringe"
icon_state = "hair_longfringe"
flags = HAIR_TIEABLE
longestalt
name = "Longer Fringe"
icon_state = "hair_vlongfringe"
flags = HAIR_TIEABLE
halfbang
name = "Half-banged Hair"
@@ -113,57 +133,72 @@
ponytail1
name = "Ponytail 1"
icon_state = "hair_ponytail"
flags = HAIR_TIEABLE
ponytail2
name = "Ponytail 2"
icon_state = "hair_pa"
flags = HAIR_TIEABLE
ponytail3
name = "Ponytail 3"
icon_state = "hair_ponytail3"
flags = HAIR_TIEABLE
ponytail4
name = "Ponytail 4"
icon_state = "hair_ponytail4"
flags = HAIR_TIEABLE
ponytail5
name = "Ponytail 5"
icon_state = "hair_ponytail5"
flags = HAIR_TIEABLE
ponytail6
name = "Ponytail 6"
icon_state = "hair_ponytail6"
flags = HAIR_TIEABLE
fringetail
name = "Fringetail"
icon_state = "hair_fringetail"
flags = HAIR_TIEABLE
sideponytail
name = "Side Ponytail"
icon_state = "hair_stail"
flags = HAIR_TIEABLE
sideponytail4 //Not happy about this... but it's for the save files.
name = "Side Ponytail 2"
icon_state = "hair_ponytailf"
flags = HAIR_TIEABLE
sideponytail2
name = "One Shoulder"
icon_state = "hair_oneshoulder"
flags = HAIR_TIEABLE
sideponytail3
name = "Tress Shoulder"
icon_state = "hair_tressshoulder"
flags = HAIR_TIEABLE
spikyponytail
name = "Spiky Ponytail"
icon_state = "hair_spikyponytail"
flags = HAIR_TIEABLE
zieglertail
name = "Zieglertail"
icon_state = "hair_ziegler"
flags = HAIR_TIEABLE
wisp
name = "Wisp"
icon_state = "hair_wisp"
flags = HAIR_TIEABLE
parted
name = "Parted"
@@ -176,6 +211,7 @@
sleeze
name = "Sleeze"
icon_state = "hair_sleeze"
flags = HAIR_VERY_SHORT
quiff
name = "Quiff"
@@ -192,32 +228,39 @@
bedhead3
name = "Bedhead 3"
icon_state = "hair_bedheadv3"
flags = HAIR_TIEABLE
bedheadlong
name = "Bedhead Long"
icon_state = "hair_long_bedhead"
flags = HAIR_TIEABLE
beehive
name = "Beehive"
icon_state = "hair_beehive"
flags = HAIR_TIEABLE
beehive2
name = "Beehive 2"
icon_state = "hair_beehive2"
flags = HAIR_TIEABLE
bobcurl
name = "Bobcurl"
icon_state = "hair_bobcurl"
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
flags = HAIR_TIEABLE
bob
name = "Bob"
icon_state = "hair_bobcut"
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
flags = HAIR_TIEABLE
bobcutalt
name = "Chin Length Bob"
icon_state = "hair_bobcutalt"
flags = HAIR_TIEABLE
bun
name = "Bun"
@@ -238,15 +281,18 @@
buzz
name = "Buzzcut"
icon_state = "hair_buzzcut"
flags = HAIR_VERY_SHORT
species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
shavehair
name = "Shaved Hair"
icon_state = "hair_shaved"
flags = HAIR_VERY_SHORT
crew
name = "Crewcut"
icon_state = "hair_crewcut"
flags = HAIR_VERY_SHORT
combover
name = "Combover"
@@ -271,6 +317,7 @@
curls
name = "Curls"
icon_state = "hair_curls"
flags = HAIR_TIEABLE
afro
name = "Afro"
@@ -287,14 +334,17 @@
rows
name = "Rows"
icon_state = "hair_rows1"
flags = HAIR_VERY_SHORT
rows2
name = "Rows 2"
icon_state = "hair_rows2"
flags = HAIR_TIEABLE
sargeant
name = "Flat Top"
icon_state = "hair_sargeant"
flags = HAIR_VERY_SHORT
emo
name = "Emo"
@@ -307,10 +357,12 @@
longemo
name = "Long Emo"
icon_state = "hair_emolong"
flags = HAIR_TIEABLE
fringeemo
name = "Emo Fringe"
icon_state = "hair_emofringe"
flags = HAIR_TIEABLE
veryshortovereyealternate
name = "Overeye Very Short, Alternate"
@@ -327,6 +379,7 @@
longovereye
name = "Overeye Long"
icon_state = "hair_longovereye"
flags = HAIR_TIEABLE
flowhair
name = "Flow Hair"
@@ -335,6 +388,7 @@
feather
name = "Feather"
icon_state = "hair_feather"
flags = HAIR_TIEABLE
hitop
name = "Hitop"
@@ -356,6 +410,7 @@
gentle
name = "Gentle"
icon_state = "hair_gentle"
flags = HAIR_TIEABLE
spiky
name = "Spiky"
@@ -369,51 +424,63 @@
kagami
name = "Pigtails"
icon_state = "hair_kagami"
flags = HAIR_TIEABLE
himecut
name = "Hime Cut"
icon_state = "hair_himecut"
flags = HAIR_TIEABLE
shorthime
name = "Short Hime Cut"
icon_state = "hair_shorthime"
flags = HAIR_TIEABLE
grandebraid
name = "Grande Braid"
icon_state = "hair_grande"
flags = HAIR_TIEABLE
mbraid
name = "Medium Braid"
icon_state = "hair_shortbraid"
flags = HAIR_TIEABLE
braid2
name = "Long Braid"
icon_state = "hair_hbraid"
flags = HAIR_TIEABLE
braid
name = "Floorlength Braid"
icon_state = "hair_braid"
flags = HAIR_TIEABLE
odango
name = "Odango"
icon_state = "hair_odango"
flags = HAIR_TIEABLE
ombre
name = "Ombre"
icon_state = "hair_ombre"
flags = HAIR_TIEABLE
updo
name = "Updo"
icon_state = "hair_updo"
flags = HAIR_TIEABLE
skinhead
name = "Skinhead"
icon_state = "hair_skinhead"
flags = HAIR_VERY_SHORT
balding
name = "Balding Hair"
icon_state = "hair_e"
gender = MALE
flags = HAIR_VERY_SHORT
familyman
name = "The Family Man"
@@ -434,10 +501,13 @@
poofy
name = "Poofy"
icon_state = "hair_poofy"
flags = HAIR_TIEABLE
poofy2
name = "Poofy2"
icon_state = "hair_poofy2"
flags = HAIR_TIEABLE
crono
name = "Chrono"
icon_state = "hair_toriyama"
@@ -461,6 +531,7 @@
nitori
name = "Nitori"
icon_state = "hair_nitori"
flags = HAIR_TIEABLE
joestar
name = "Joestar"
@@ -469,6 +540,7 @@
volaju
name = "Volaju"
icon_state = "hair_volaju"
flags = HAIR_TIEABLE
eighties
name = "80's"
@@ -486,14 +558,6 @@
name = "Modern"
icon_state = "hair_modern"
bald
name = "Bald"
icon_state = "bald"
longeralt2
name = "Long Hair Alt 2"
icon_state = "hair_longeralt2"
shortbangs
name = "Short Bangs"
icon_state = "hair_shortbangs"
@@ -505,10 +569,12 @@
bun
name = "Casual Bun"
icon_state = "hair_bun"
flags = HAIR_TIEABLE
doublebun
name = "Double-Bun"
icon_state = "hair_doublebun"
flags = HAIR_TIEABLE
oxton
name = "Oxton"
@@ -518,93 +584,113 @@
name = "Low Fade"
icon_state = "hair_lowfade"
gender = MALE
flags = HAIR_VERY_SHORT
medfade
name = "Medium Fade"
icon_state = "hair_medfade"
flags = HAIR_VERY_SHORT
highfade
name = "High Fade"
icon_state = "hair_highfade"
gender = MALE
flags = HAIR_VERY_SHORT
baldfade
name = "Balding Fade"
icon_state = "hair_baldfade"
gender = MALE
flags = HAIR_VERY_SHORT
nofade
name = "Regulation Cut"
icon_state = "hair_nofade"
gender = MALE
flags = HAIR_VERY_SHORT
trimflat
name = "Trimmed Flat Top"
icon_state = "hair_trimflat"
gender = MALE
flags = HAIR_VERY_SHORT
trimmed
name = "Trimmed"
icon_state = "hair_trimmed"
gender = MALE
flags = HAIR_VERY_SHORT
tightbun
name = "Tight Bun"
icon_state = "hair_tightbun"
gender = FEMALE
flags = HAIR_VERY_SHORT | HAIR_TIEABLE
coffeehouse
name = "Coffee House Cut"
icon_state = "hair_coffeehouse"
gender = MALE
flags = HAIR_VERY_SHORT
undercut1
name = "Undercut"
icon_state = "hair_undercut1"
gender = MALE
flags = HAIR_VERY_SHORT
undercut2
name = "Undercut Swept Right"
icon_state = "hair_undercut2"
gender = MALE
flags = HAIR_VERY_SHORT
undercut3
name = "Undercut Swept Left"
icon_state = "hair_undercut3"
gender = MALE
flags = HAIR_VERY_SHORT
partfade
name = "Parted Fade"
icon_state = "hair_shavedpart"
gender = MALE
flags = HAIR_VERY_SHORT
hightight
name = "High and Tight"
icon_state = "hair_hightight"
flags = HAIR_VERY_SHORT
rowbun
name = "Row Bun"
icon_state = "hair_rowbun"
flags = HAIR_TIEABLE
rowdualbraid
name = "Row Dual Braid"
icon_state = "hair_rowdualtail"
flags = HAIR_TIEABLE
rowbraid
name = "Row Braid"
icon_state = "hair_rowbraid"
flags = HAIR_TIEABLE
regulationmohawk
name = "Regulation Mohawk"
icon_state = "hair_shavedmohawk"
flags = HAIR_VERY_SHORT
topknot
name = "Topknot"
icon_state = "hair_topknot"
flags = HAIR_TIEABLE
ronin
name = "Ronin"
icon_state = "hair_ronin"
flags = HAIR_TIEABLE
bowlcut2
name = "Bowl2"
@@ -613,18 +699,22 @@
thinning
name = "Thinning"
icon_state = "hair_thinning"
flags = HAIR_VERY_SHORT
thinningfront
name = "Thinning Front"
icon_state = "hair_thinningfront"
flags = HAIR_VERY_SHORT
thinningback
name = "Thinning Back"
icon_state = "hair_thinningrear"
flags = HAIR_VERY_SHORT
manbun
name = "Manbun"
icon_state = "hair_manbun"
flags = HAIR_TIEABLE
shy
name = "Shy"
@@ -1167,6 +1257,24 @@
name = "Tattoo (Campbell, L.Arm)"
body_parts = list(BP_L_ARM)
rightleg
name = "Tattoo (Campbell, R.Leg)"
body_parts = list(BP_R_LEG)
leftleg
name = "Tattoo (Campbell, L.Leg)"
body_parts = list (BP_L_LEG)
tat_silverburgh
name = "Tattoo (Silverburgh, R.Leg)"
icon_state = "tat_silverburgh"
body_parts = list (BP_R_LEG)
left
name = "Tattoo (Silverburgh, L.Leg)"
icon_state = "tat_silverburgh"
body_parts = list (BP_L_LEG)
tat_tiger
name = "Tattoo (Tiger Stripes, Body)"
icon_state = "tat_tiger"
@@ -748,12 +748,42 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
otter_nose
name = "Otter nose"
icon_state = "otternose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
otter_face
name = "Otter face"
icon_state = "otterface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
deer_face
name = "Deer face"
icon_state = "deerface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
sharkface
name = "Akula snout"
icon_state = "sharkface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
sheppy_face
name = "Shepherd snout"
icon_state = "shepface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
sheppy_back
name = "Shepherd back"
icon_state = "shepback"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
zorren_belly_male
name = "Zorren Male Torso"
icon_state = "zorren_belly"
@@ -830,6 +860,12 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG)
chooves
name = "Cloven hooves"
icon_state = "chooves"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT)
alurane
name = "Alurane Body"
icon_state = "alurane"
@@ -928,13 +964,13 @@
icon_state = "teshi_sf"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO)
spirit_lights
name = "Ward - Spirit FBP Lights"
icon_state = "lights"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD)
spirit_lights_body
name = "Ward - Spirit FBP Lights (body)"
icon_state = "lights"
@@ -946,13 +982,13 @@
icon_state = "lights"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
spirit_panels
name = "Ward - Spirit FBP Panels"
icon_state = "panels"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
spirit_panels_body
name = "Ward - Spirit FBP Panels (body)"
icon_state = "panels"
+14 -13
View File
@@ -142,19 +142,20 @@
if(!istype(above))
above.ChangeTurf(/turf/simulated/open)
/obj/structure/stairs/Uncross(atom/movable/A)
if(A.dir == dir && upperStep(A.loc))
// This is hackish but whatever.
var/turf/target = get_step(GetAbove(A), dir)
var/turf/source = A.loc
if(target.Enter(A, source))
A.forceMove(target)
if(isliving(A))
var/mob/living/L = A
if(L.pulling)
L.pulling.forceMove(target)
return 0
return 1
/obj/structure/stairs/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
if(get_dir(loc, target) == dir && upperStep(mover.loc))
return FALSE
. = ..()
/obj/structure/stairs/Bumped(atom/movable/A)
// This is hackish but whatever.
var/turf/target = get_step(GetAbove(A), dir)
if(target.Enter(A, src)) // Pass src to be ignored to avoid infinate loop
A.forceMove(target)
if(isliving(A))
var/mob/living/L = A
if(L.pulling)
L.pulling.forceMove(target)
/obj/structure/stairs/proc/upperStep(var/turf/T)
return (T == loc)
+1 -1
View File
@@ -50,7 +50,7 @@
// Now sync the organ's eye_colour list.
update_colour()
// Finally, update the eye icon on the mob.
owner.update_eyes()
owner.regenerate_icons()
/obj/item/organ/internal/eyes/replaced(var/mob/living/carbon/human/target)
+42
View File
@@ -0,0 +1,42 @@
/*
* Voicebox/Vocal Synthesizers
* TL;DR: Assists with speaking languages that a species doesn't normally have,
* such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters.
*/
/obj/item/organ/internal/voicebox
name = "larynx"
icon_state = "larynx"
parent_organ = BP_TORSO // We don't have a neck area
organ_tag = O_VOICE
will_assist_languages = list(LANGUAGE_GALCOM)
/obj/item/organ/internal/voicebox/New()
..()
amend_assist_langs()
/obj/item/organ/internal/voicebox/proc/amend_assist_langs() // Adds the list of language datums assisted by the voicebox to the list used in speaking
for(var/L in will_assist_languages)
assists_languages |= all_languages[L]
/obj/item/organ/internal/voicebox/proc/add_assistable_langs(var/language) // Adds a new language (by string/define) to the list of things the voicebox can assist
will_assist_languages |= language
amend_assist_langs() // Can't think of a better place to put this, makes the voicebox actually start to assist with the added language
/////////////////////////////////
// Voicebox Subtypes
/////////////////////////////////
/obj/item/organ/internal/voicebox/assist // In the off chance we get a species that doesn't speak GalCom by default
/obj/item/organ/internal/voicebox/assist/New()
..()
mechassist()
/obj/item/organ/internal/voicebox/robot
name = "vocal synthesizer"
will_assist_languages = list(LANGUAGE_GALCOM, LANGUAGE_EAL) // Synthetics spawn with this by default
/obj/item/organ/internal/voicebox/robot/New()
..()
robotize()
+4
View File
@@ -31,6 +31,10 @@ var/list/organ_cache = list()
var/rejecting // Is this organ already being rejected?
var/preserved = 0 // If this is 1, prevents organ decay.
// Language vars. Putting them here in case we decide to do something crazy with sign-or-other-nonverbal languages.
var/list/will_assist_languages = list()
var/list/datum/language/assists_languages = list()
/obj/item/organ/Destroy()
if(owner) owner = null
+19
View File
@@ -72,6 +72,8 @@
var/open = 0
var/stage = 0
var/cavity = 0
var/burn_stage = 0 //Surgical repair stage for burn.
var/brute_stage = 0 //Surgical repair stage for brute.
// HUD element variable, see organ_icon.dm get_damage_hud_image()
var/image/hud_damage_image
@@ -1105,6 +1107,8 @@ Note that amputating the affected organ does in fact remove the infection from t
R = basic_robolimb
if(R)
force_icon = R.icon
brute_mod *= R.robo_brute_mod
burn_mod *= R.robo_burn_mod
if(R.lifelike)
robotic = ORGAN_LIFELIKE
name = "[initial(name)]"
@@ -1343,3 +1347,18 @@ Note that amputating the affected organ does in fact remove the infection from t
if(6 to INFINITY)
flavor_text += "a ton of [wound]\s"
return english_list(flavor_text)
// Returns a list of the clothing (not glasses) that are covering this part
/obj/item/organ/external/proc/get_covering_clothing()
var/list/covering_clothing = list()
if(owner)
var/list/protective_gear = list(owner.head, owner.wear_mask, owner.wear_suit, owner.w_uniform, owner.gloves, owner.shoes)
for(var/obj/item/clothing/gear in protective_gear)
if(gear.body_parts_covered & src.body_part)
covering_clothing |= gear
if(LAZYLEN(gear.accessories))
for(var/obj/item/clothing/accessory/bling in gear.accessories)
if(bling.body_parts_covered & src.body_part)
covering_clothing |= bling
return covering_clothing
+29 -18
View File
@@ -4,13 +4,13 @@ var/global/list/limb_icon_cache = list()
return
/obj/item/organ/external/proc/compile_icon()
overlays.Cut()
cut_overlays()
// This is a kludge, only one icon has more than one generation of children though.
for(var/obj/item/organ/external/organ in contents)
if(organ.children && organ.children.len)
for(var/obj/item/organ/external/child in organ.children)
overlays += child.mob_icon
overlays += organ.mob_icon
add_overlay(organ.mob_icon)
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human)
s_tone = null
@@ -51,10 +51,10 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/head/get_icon()
..()
//The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item
cut_overlays()
//Every 'addon' below requires information from species
if(!owner || !owner.species)
return
@@ -78,7 +78,7 @@ var/global/list/limb_icon_cache = list()
eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD)
add_overlay(eyes_icon)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
//Lip color/icon
if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS)))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
@@ -94,6 +94,12 @@ var/global/list/limb_icon_cache = list()
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
add_overlay(get_hair_icon())
return mob_icon
/obj/item/organ/external/head/proc/get_hair_icon()
var/image/res = image('icons/mob/human_face.dmi',"bald_s")
//Facial hair
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
@@ -101,20 +107,24 @@ var/global/list/limb_icon_cache = list()
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_MULTIPLY) // VOREStation edit
add_overlay(facial_s)
res.add_overlay(facial_s)
//Head hair
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style]
var/style = owner.h_style
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[style]
if(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))
if(!(hair_style.flags & HAIR_VERY_SHORT))
hair_style = hair_styles_list["Short Hair"]
if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
add_overlay(hair_s)
res.add_overlay(hair_s)
return mob_icon
return res
/obj/item/organ/external/proc/get_icon(var/skeletal)
@@ -154,7 +164,7 @@ var/global/list/limb_icon_cache = list()
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
overlays |= mark_s //So when it's not on your body, it has icons
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
@@ -170,13 +180,14 @@ var/global/list/limb_icon_cache = list()
icon_cache_key += "_model_[model]"
apply_colouration(mob_icon)
// VOREStation edit to enable markings on synths
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
overlays |= mark_s //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(owner && owner.synth_markings)
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
overlays |= mark_s //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
@@ -270,7 +281,7 @@ var/list/robot_hud_colours = list("#CFCFCF","#AFAFAF","#8F8F8F","#6F6F6F","#4F4F
var/b = 0.11 * R.health_hud_intensity
temp.color = list(r, r, r, g, g, g, b, b, b)
hud_damage_image = image(null)
hud_damage_image.overlays += temp
hud_damage_image.add_overlay(temp)
// Calculate the required color index.
var/dam_state = min(1,((brute_dam+burn_dam)/max_damage))
+5
View File
@@ -49,6 +49,9 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
var/suggested_species = "Human" //If it should make the torso a species
var/speech_bubble_appearance = "synthetic" // What icon_state to use for speech bubbles when talking. Check talk.dmi for all the icons.
var/robo_brute_mod = 1 // Multiplier for incoming brute damage.
var/robo_burn_mod = 1 // As above for burn.
/datum/robolimb/unbranded_monitor
company = "Unbranded Monitor"
desc = "A generic unbranded interpretation of a popular prosthetic head model. It looks rudimentary and cheaply constructed."
@@ -214,6 +217,8 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
skin_tone = 1
blood_color = "#CCCCCC"
speech_bubble_appearance = "normal"
//robo_brute_mod = 1.1 //VOREStation Edit
//robo_burn_mod = 1.1 //VOREStation Edit
/datum/robolimb/wardtakahashi
company = "Ward-Takahashi"
+8
View File
@@ -86,6 +86,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Tajara"
/obj/item/weapon/disk/limb/dsi_tajaran
@@ -99,6 +100,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Unathi"
/obj/item/weapon/disk/limb/dsi_lizard
@@ -112,6 +114,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Sergal"
/obj/item/weapon/disk/limb/dsi_sergal
@@ -125,6 +128,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Nevrean"
/obj/item/weapon/disk/limb/dsi_nevrean
@@ -138,6 +142,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Vulpkanin"
/obj/item/weapon/disk/limb/dsi_vulpkanin
@@ -151,6 +156,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Akula"
/obj/item/weapon/disk/limb/dsi_akula
@@ -164,6 +170,7 @@
lifelike = 1
unavailable_to_build = 1
includes_tail = 1
skin_tone = 1
suggested_species = "Vasilissan"
/obj/item/weapon/disk/limb/dsi_spider
@@ -174,6 +181,7 @@
desc = "This limb has a thin synthflesh casing with a few connection ports."
icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi'
lifelike = 1
skin_tone = 1
suggested_species = "Teshari"
/datum/robolimb/dsi_teshari/New()
+4 -3
View File
@@ -23,10 +23,11 @@
organ_rel_size = 70
base_miss_chance = 10
/obj/item/organ/external/chest/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0)
/obj/item/organ/external/chest/robotize()
if(..() && robotic != ORGAN_NANOFORM) //VOREStation Edit
// Give them a new cell.
owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
// Give them fancy new organs.
owner.internal_organs_by_name[O_CELL] = new /obj/item/organ/internal/cell(owner,1)
owner.internal_organs_by_name[O_VOICE] = new /obj/item/organ/internal/voicebox/robot(owner, 1)
/obj/item/organ/external/chest/handle_germ_effects()
. = ..() //Should return an infection level
+1 -1
View File
@@ -134,7 +134,7 @@ var/global/photo_count = 0
var/icon_on = "camera"
var/icon_off = "camera_off"
var/size = 3
var/picture_planes = list()
var/list/picture_planes = list()
/obj/item/device/camera/verb/change_size()
set name = "Set Photo Focus"
+3 -2
View File
@@ -30,9 +30,10 @@
current_time = current_time.make_random_time()
update_sun()
/datum/planet/proc/process(amount)
/datum/planet/proc/process(last_fire)
if(current_time)
current_time = current_time.add_seconds(amount)
var/difference = world.time - last_fire
current_time = current_time.add_seconds(difference SECONDS)
update_weather() // We update this first, because some weather types decease the brightness of the sun.
if(sun_last_process <= world.time - sun_process_interval)
update_sun()
+29 -9
View File
@@ -184,7 +184,8 @@ datum/weather/sif
)
/datum/weather/sif/snow/process_effects()
for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs)
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
@@ -207,7 +208,8 @@ datum/weather/sif
)
/datum/weather/sif/blizzard/process_effects()
for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs)
..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
@@ -219,6 +221,8 @@ datum/weather/sif
name = "rain"
icon_state = "rain"
light_modifier = 0.5
effect_message = "<span class='warning'>Rain falls on you.</span>"
transition_chances = list(
WEATHER_OVERCAST = 25,
WEATHER_LIGHT_SNOW = 10,
@@ -228,6 +232,7 @@ datum/weather/sif
)
/datum/weather/sif/rain/process_effects()
..()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
@@ -238,16 +243,19 @@ datum/weather/sif
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella</span>")
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella</span>")
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella</span>")
continue
L.water_act(1)
to_chat(L, "<span class='warning'>Rain falls on you.</span>")
if(show_message)
to_chat(L, effect_message)
/datum/weather/sif/storm
name = "storm"
@@ -256,6 +264,8 @@ datum/weather/sif
temp_low = 233.15 // -40c
light_modifier = 0.3
flight_failure_modifier = 10
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
@@ -264,6 +274,7 @@ datum/weather/sif
)
/datum/weather/sif/storm/process_effects()
..()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
@@ -294,6 +305,10 @@ datum/weather/sif
temp_low = 243.15 // -30c
light_modifier = 0.3
flight_failure_modifier = 15
timer_low_bound = 2
timer_high_bound = 5
effect_message = "<span class='warning'>The hail smacks into you!</span>"
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
@@ -302,6 +317,7 @@ datum/weather/sif
)
/datum/weather/sif/hail/process_effects()
..()
for(var/mob/living/carbon/human/H in living_mob_list)
if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H)
@@ -309,15 +325,18 @@ datum/weather/sif
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from rain
// Message plays every time the umbrella gets stolen, just so they're especially aware of what's happening
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(U.open)
to_chat(H, "<span class='notice'>Hail patters gently onto your umbrella.</span>")
if(show_message)
to_chat(H, "<span class='notice'>Hail patters gently onto your umbrella.</span>")
continue
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = H.get_inactive_hand()
if(U.open)
to_chat(H, "<span class='notice'>Hail patters gently onto your umbrella.</span>")
if(show_message)
to_chat(H, "<span class='notice'>Hail patters gently onto your umbrella.</span>")
continue
var/target_zone = pick(BP_ALL)
@@ -330,8 +349,9 @@ datum/weather/sif
if(amount_soaked >= 10)
continue // No need to apply damage.
H.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
to_chat(H, "<span class='warning'>The hail smacks into you!</span>")
H.apply_damage(rand(1, 3), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
if(show_message)
to_chat(H, effect_message)
/datum/weather/sif/blood_moon
name = "blood moon"
+13 -1
View File
@@ -25,7 +25,7 @@
if(current_weather)
old_light_modifier = current_weather.light_modifier // We store the old one, so we can determine if recalculating the sun is needed.
current_weather = allowed_weather_types[new_weather]
next_weather_shift = world.time + rand(20, 30) MINUTES
next_weather_shift = world.time + rand(current_weather.timer_low_bound, current_weather.timer_high_bound) MINUTES
update_icon_effects()
update_temperature()
@@ -66,8 +66,20 @@
var/flight_failure_modifier = 0 // Some types of weather make flying harder, and therefore make crashes more likely.
var/transition_chances = list() // Assoc list
var/datum/weather_holder/holder = null
var/timer_low_bound = 5 // How long this weather must run before it tries to change, in minutes
var/timer_high_bound = 10 // How long this weather can run before it tries to change, in minutes
var/effect_message = null // Should be a string, this is what is shown to a mob caught in the weather
var/last_message = 0 // Keeps track of when the weather last tells EVERY player it's hitting them
var/message_delay = 10 SECONDS // Delay in between weather hit messages
var/show_message = FALSE // Is set to TRUE and plays the messsage every [message_delay]
/datum/weather/proc/process_effects()
show_message = FALSE // Need to reset the show_message var, just in case
if(effect_message) // Only bother with the code below if we actually need to display something
if(world.time >= last_message + message_delay)
last_message = world.time // Reset the timer
show_message = TRUE // Tell the rest of the process that we need to make a message
return
// All this does is hold the weather icon.
+28 -3
View File
@@ -160,6 +160,7 @@ var/list/possible_cable_coil_colours = list(
return
if(istype(W, /obj/item/weapon/wirecutters))
var/obj/item/stack/cable_coil/CC
if(d1 == UP || d2 == UP)
to_chat(user, "<span class='warning'>You must cut this cable from above.</span>")
return
@@ -172,9 +173,12 @@ var/list/possible_cable_coil_colours = list(
return
if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long
new/obj/item/stack/cable_coil(T, 2, color)
CC = new/obj/item/stack/cable_coil(T, 2, color)
else
new/obj/item/stack/cable_coil(T, 1, color)
CC = new/obj/item/stack/cable_coil(T, 1, color)
src.add_fingerprint(user)
src.transfer_fingerprints_to(CC)
for(var/mob/O in viewers(src, null))
O.show_message("<span class='warning'>[user] cuts the cable.</span>", 1)
@@ -939,4 +943,25 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(get_dist(src, user) <= 1)
msg += " It doesn't seem to have a beginning, or an end."
to_chat(user, msg)
to_chat(user, msg)
/obj/item/stack/cable_coil/alien/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
var/N = input("How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1) as num|null
if(N && N <= amount)
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
CC.amount = N
CC.update_icon()
to_chat(user,"<font color='blue'>You take [N] units of wire from the [src].</font>")
if (CC)
user.put_in_hands(CC)
src.add_fingerprint(user)
CC.add_fingerprint(user)
spawn(0)
if (src && usr.machine==src)
src.interact(usr)
else
return
else
..()
return
+3
View File
@@ -41,6 +41,9 @@
processing_objects -= src
return ..()
/obj/item/weapon/cell/get_cell()
return src
/obj/item/weapon/cell/process()
if(self_recharge)
if(world.time >= last_use + charge_delay)
+23 -3
View File
@@ -3,21 +3,20 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "core_control"
light_color = COLOR_ORANGE
circuit = /obj/item/weapon/circuitboard/fusion_core_control
var/id_tag
var/scan_range = 25
var/list/connected_devices = list()
var/obj/machinery/power/fusion_core/cur_viewed_device
/obj/machinery/computer/fusion_core_control/attackby(var/obj/item/thing, var/mob/user)
..()
if(ismultitool(thing))
var/new_ident = input("Enter a new ident tag.", "Core Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
cur_viewed_device = null
return
else
return ..()
/obj/machinery/computer/fusion_core_control/attack_ai(mob/user)
attack_hand(user)
@@ -28,6 +27,11 @@
/obj/machinery/computer/fusion_core_control/interact(mob/user)
if(stat & (BROKEN|NOPOWER))
user.unset_machine()
user << browse(null, "window=fusion_control")
return
if(!cur_viewed_device || !check_core_status(cur_viewed_device))
cur_viewed_device = null
@@ -174,3 +178,19 @@
if(C.idle_power_usage > C.avail())
return
. = 1
/obj/machinery/computer/fusion_core_control/update_icon()
if(stat & (BROKEN))
icon = 'icons/obj/computer.dmi'
icon_state = "broken"
set_light(0)
if(stat & (NOPOWER))
icon = 'icons/obj/computer.dmi'
icon_state = "computer"
set_light(0)
if(!stat & (BROKEN|NOPOWER))
icon = initial(icon)
icon_state = initial(icon_state)
set_light(light_range_on, light_power_on)
+2 -2
View File
@@ -35,7 +35,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics,
/obj/machinery/air_sensor,
/mob/observer/dead,
/mob/observer,
/obj/machinery/power/hydromagnetic_trap
)
@@ -672,4 +672,4 @@
#undef FUSION_HEAT_CAP
#undef FUSION_MAX_ENVIRO_HEAT
#undef PLASMA_TEMP_RADIATION_DIVISIOR
#undef PLASMA_TEMP_RADIATION_DIVISIOR
@@ -2,6 +2,7 @@
name = "fuel injection control computer"
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "fuel"
circuit = /obj/item/weapon/circuitboard/fusion_fuel_control
var/id_tag
var/scan_range = 25
@@ -94,9 +95,25 @@
/obj/machinery/computer/fusion_fuel_control/attackby(var/obj/item/W, var/mob/user)
..()
if(ismultitool(W))
var/new_ident = input("Enter a new ident tag.", "Fuel Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
return ..()
/obj/machinery/computer/fusion_fuel_control/update_icon()
if(stat & (BROKEN))
icon = 'icons/obj/computer.dmi'
icon_state = "broken"
set_light(0)
if(stat & (NOPOWER))
icon = 'icons/obj/computer.dmi'
icon_state = "computer"
set_light(0)
if(!stat & (BROKEN|NOPOWER))
icon = initial(icon)
icon_state = initial(icon_state)
set_light(light_range_on, light_power_on)
@@ -3,6 +3,7 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "engine"
light_color = COLOR_BLUE
circuit = /obj/item/weapon/circuitboard/gyrotron_control
var/id_tag
var/scan_range = 25
@@ -16,6 +17,11 @@
/obj/machinery/computer/gyrotron_control/interact(var/mob/user)
if(stat & (BROKEN|NOPOWER))
user.unset_machine()
user << browse(null, "window=gyrotron_controller_[id_tag]")
return
if(!id_tag)
to_chat(user, "<span class='warning'>This console has not been assigned an ident tag. Please contact your system administrator or conduct a manual update with a standard multitool.</span>")
return
@@ -89,9 +95,25 @@
return 0
/obj/machinery/computer/gyrotron_control/attackby(var/obj/item/W, var/mob/user)
..()
if(ismultitool(W))
var/new_ident = input("Enter a new ident tag.", "Gyrotron Control", id_tag) as null|text
if(new_ident && user.Adjacent(src))
id_tag = new_ident
return
return ..()
/obj/machinery/computer/gyrotron_control/update_icon()
if(stat & (BROKEN))
icon = 'icons/obj/computer.dmi'
icon_state = "broken"
set_light(0)
if(stat & (NOPOWER))
icon = 'icons/obj/computer.dmi'
icon_state = "computer"
set_light(0)
if(!stat & (BROKEN|NOPOWER))
icon = initial(icon)
icon_state = initial(icon_state)
set_light(light_range_on, light_power_on)
@@ -325,6 +325,31 @@
/obj/item/ammo_magazine/box/c9mm/empty
initial_ammo = 0
/obj/item/ammo_magazine/m9mmR/saber
desc = "A very high capacity double stack magazine made specially for the SABER SMG. Filled with 22 9mm bullets."
icon_state = "S9mm-22"
mag_type = MAGAZINE
ammo_type = /obj/item/ammo_casing/a9mm
matter = list(DEFAULT_WALL_MATERIAL = 1200)
caliber = "9mm"
max_ammo = 22
origin_tech = list(TECH_COMBAT = 2, TECH_ILLEGAL = 1)
multiple_sprites = 1
/obj/item/ammo_magazine/m9mmR/saber/ap
desc = "A high capacity double stack magazine made specially for the SABER SMG. Filled with 22 9mm armor piercing bullets."
icon_state = "S9mm-22"
mag_type = MAGAZINE
ammo_type = /obj/item/ammo_casing/a9mm/ap
matter = list(DEFAULT_WALL_MATERIAL = 2000)
caliber = "9mm"
max_ammo = 22
origin_tech = list(TECH_COMBAT = 2, TECH_ILLEGAL = 1)
multiple_sprites = 1
/obj/item/ammo_magazine/m9mmR/saber/empty
initial_ammo = 0
///////// 10mm /////////
/obj/item/ammo_magazine/m10mm
+14 -11
View File
@@ -23,17 +23,6 @@
var/battery_lock = 0 //If set, weapon cannot switch batteries
/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
..()
/obj/item/weapon/gun/energy/switch_firemodes(mob/user)
if(..())
update_icon()
/obj/item/weapon/gun/energy/emp_act(severity)
..()
update_icon()
/obj/item/weapon/gun/energy/New()
..()
if(self_recharge)
@@ -52,6 +41,9 @@
processing_objects.Remove(src)
return ..()
/obj/item/weapon/gun/energy/get_cell()
return power_supply
/obj/item/weapon/gun/energy/process()
if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery
if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently
@@ -75,6 +67,17 @@
charge_tick = 0
return 1
/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
..()
/obj/item/weapon/gun/energy/switch_firemodes(mob/user)
if(..())
update_icon()
/obj/item/weapon/gun/energy/emp_act(severity)
..()
update_icon()
/obj/item/weapon/gun/energy/consume_next_projectile()
if(!power_supply) return null
if(!ispath(projectile_type)) return null
@@ -0,0 +1,56 @@
// Phase weapons go here
/obj/item/weapon/gun/energy/phasegun
name = "phase carbine"
desc = "The NT EW26 Artemis is a downsized energy weapon, specifically designed for use against wildlife."
icon_state = "phasecarbine"
wielded_item_state = "phasecarbine-wielded"
slot_flags = SLOT_BACK|SLOT_BELT
charge_cost = 240
projectile_type = /obj/item/projectile/energy/phase
one_handed_penalty = 15
/obj/item/weapon/gun/energy/phasegun/pistol
name = "phase pistol"
desc = "The NT EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife."
icon_state = "phase"
item_state = "taser" //I don't have an in-hand sprite, taser will be fine
w_class = ITEMSIZE_NORMAL
slot_flags = SLOT_BELT|SLOT_HOLSTER
charge_cost = 300
projectile_type = /obj/item/projectile/energy/phase/light
one_handed_penalty = 0
/obj/item/weapon/gun/energy/phasegun/pistol/mounted
name = "mounted phase pistol"
self_recharge = 1
use_external_power = 1
/obj/item/weapon/gun/energy/phasegun/pistol/mounted/cyborg
charge_cost = 400
recharge_time = 7
obj/item/weapon/gun/energy/phasegun/rifle
name = "phase rifle"
desc = "The NT EW31 Orion is a specialist energy weapon, intended for use against hostile wildlife."
icon_state = "phaserifle"
item_state = "phaserifle"
wielded_item_state = "phaserifle-wielded"
slot_flags = SLOT_BACK
charge_cost = 150
projectile_type = /obj/item/projectile/energy/phase/heavy
accuracy = 15
one_handed_penalty = 30
/obj/item/weapon/gun/energy/phasegun/cannon
name = "phase cannon"
desc = "The NT EW50 Gaia is a massive energy weapon, purpose-built for clearing land. You feel dirty just looking at it."
icon_state = "phasecannon"
item_state = "phasecannon"
wielded_item_state = "phasecannon-wielded" //TODO: New Sprites
w_class = ITEMSIZE_HUGE // This thing is big.
slot_flags = SLOT_BACK
charge_cost = 100
projectile_type = /obj/item/projectile/energy/phase/heavy/cannon
accuracy = 15
one_handed_penalty = 65
@@ -23,16 +23,7 @@
force = 5
slot_flags = SLOT_BELT|SLOT_HOLSTER
charge_cost = 480
projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE
/obj/item/weapon/gun/energy/phasegun
name = "phase pistol"
desc = "The NT Mk26 EW Apollo is an energy handgun, specifically designed for use against wildlife."
icon_state = "phase"
item_state = "taser" //I don't have an in-hand sprite, taser will be fine
slot_flags = SLOT_BELT|SLOT_HOLSTER
charge_cost = 300
projectile_type = /obj/item/projectile/energy/phase
projectile_type = /obj/item/projectile/ion/pistol
/obj/item/weapon/gun/energy/decloner
name = "biological demolecularisor"
@@ -36,6 +36,9 @@
qdel_null(capacitor)
. = ..()
/obj/item/weapon/gun/magnetic/get_cell()
return cell
/obj/item/weapon/gun/magnetic/process()
if(capacitor)
if(cell)
@@ -1,25 +1,40 @@
/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude //Except burstfire isn't fit for an rp server --Mark
/obj/item/weapon/gun/projectile/automatic //This should never be spawned in, it is just here because of code necessities.
name = "daka SMG"
desc = "A small SMG. You really shouldn't be able to get this gun. Uses 9mm rounds."
icon_state = "c05r" //Used because it's not used anywhere else
load_method = SPEEDLOADER
ammo_type = /obj/item/ammo_casing/a9mm
projectile_type = /obj/item/projectile/bullet/pistol
//Burst is the number of bullets fired; Fire delay is the time you have to wait to shoot the gun again, Move delay is the same but for moving after shooting. .
//Burst accuracy is the accuracy of each bullet fired in the burst. Dispersion is how much the bullets will 'spread' away from where you aimed.
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)))
/obj/item/weapon/gun/projectile/automatic/saber //Fixed it
name = "prototype SMG"
desc = "A protoype lightweight, fast firing gun. Uses 9mm rounds."
icon_state = "saber" //ugly
icon = 'icons/obj/gun.dmi'
icon_state = "saber"//Still ugly
w_class = ITEMSIZE_NORMAL
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
load_method = MAGAZINE //This should fix it
max_shells = 22
caliber = "9mm"
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
slot_flags = SLOT_BELT
ammo_type = /obj/item/ammo_casing/a9mm
magazine_type = /obj/item/ammo_magazine/m9mmR/saber
allowed_magazines = list(/obj/item/ammo_magazine/m9mmR/saber, /obj/item/ammo_magazine/m9mmR/saber/ap)
projectile_type = /obj/item/projectile/bullet/pistol
multi_aim = 1
burst_delay = 2
// one_handed_penalty = 15
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0))
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15,-30,-30), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
)
// list(mode_name="short bursts", burst=5, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15,-30,-30), dispersion=list(0.6, 1.0, 1.0, 1.0, 1.2)),
)
/obj/item/weapon/gun/projectile/automatic/c20r
name = "submachine gun"
+134
View File
@@ -0,0 +1,134 @@
// These projectiles are somewhat different from the other projectiles in the code.
// First, these have an 'arcing' visual, that is accomplished by having the projectile icon rotate as its flying, and
// moving up, then down as it approaches the target. There is also a small shadow effect that follows the projectile
// as its flying.
// Besides the visuals, arcing projectiles do not collide with anything until they reach the target, as they fly over them.
// For best effect, use this only when it makes sense to do so, IE on the Surface. The projectiles don't care about ceilings or gravity.
/obj/item/projectile/arc
name = "arcing shot"
icon_state = "fireball" // WIP
step_delay = 2 // Travel a bit slower, to really sell the arc visuals.
plane = ABOVE_PLANE // Since projectiles are 'in the air', they might visually overlap mobs while in flight, so the projectile needs to be above their plane.
var/target_distance = null // How many tiles the impact site is.
var/fired_dir = null // Which direction was the projectile fired towards. Needed to invert the projectile turning based on if facing left or right.
var/obj/effect/projectile_shadow/shadow = null // Visual indicator for the projectile's 'true' position. Needed due to being bound to two dimensions in reality.
/obj/item/projectile/arc/initialize()
shadow = new(get_turf(src))
return ..()
/obj/item/projectile/arc/Destroy()
qdel_null(shadow)
return ..()
/obj/item/projectile/arc/Bump(atom/A, forced=0)
return 0
// if(get_turf(src) != original)
// return 0
// else
// return ..()
// This is a test projectile in the sense that its testing the code to make sure it works,
// as opposed to a 'can I hit this thing' projectile.
/obj/item/projectile/arc/test/on_impact(turf/T)
new /obj/effect/explosion(T)
return ..()
/obj/item/projectile/arc/launch(atom/target, target_zone, x_offset=0, y_offset=0, angle_offset=0)
var/expected_distance = get_dist(target, loc)
kill_count = expected_distance // So the projectile "hits the ground."
target_distance = expected_distance
fired_dir = get_dir(loc, target)
..() // Does the regular launching stuff.
if(fired_dir & EAST)
transform = turn(transform, -45)
else if(fired_dir & WEST)
transform = turn(transform, 45)
// Visuals.
/obj/item/projectile/arc/after_move()
// Handle projectile turning in flight.
// This won't turn if fired north/south, as it looks weird.
var/turn_per_step = 90 / target_distance
if(fired_dir & EAST)
transform = turn(transform, turn_per_step)
else if(fired_dir & WEST)
transform = turn(transform, -turn_per_step)
// Now for the fake height.
// We need to know how far along our "arc" we are.
var/arc_progress = get_dist(src, original)
var/arc_max_height = (target_distance * world.icon_size) / 2 // TODO: Real math.
// var/arc_center = target_distance / 2
// var/projectile_position = abs(arc_progress - arc_center)
// var/height_multiplier = projectile_position / arc_center
// height_multiplier = abs(height_multiplier - 1)
// height_multiplier = height_multiplier ** 2
// animate(src, pixel_z = arc_max_height * height_multiplier, time = step_delay)
var/projectile_position = arc_progress / target_distance
var/sine_position = projectile_position * 180
var/pixel_z_position = arc_max_height * sin(sine_position)
animate(src, pixel_z = pixel_z_position, time = step_delay)
// Update our shadow.
shadow.forceMove(loc)
/obj/effect/projectile_shadow
name = "shadow"
desc = "You better avoid the thing coming down!"
icon = 'icons/obj/projectiles.dmi'
icon_state = "arc_shadow"
anchored = TRUE
//////////////
// Subtypes
//////////////
// Generic, Hivebot related
/obj/item/projectile/arc/blue_energy
name = "energy missile"
icon_state = "force_missile"
damage = 15
damage_type = BURN
// Fragmentation arc shot
/obj/item/projectile/arc/fragmentation
name = "fragmentation shot"
icon_state = "shell"
var/list/fragment_types = list(
/obj/item/projectile/bullet/pellet/fragment, /obj/item/projectile/bullet/pellet/fragment, \
/obj/item/projectile/bullet/pellet/fragment, /obj/item/projectile/bullet/pellet/fragment/strong
)
var/fragment_amount = 63 // Same as a grenade.
var/spread_range = 7
/obj/item/projectile/arc/fragmentation/on_impact(turf/T)
fragmentate(T, fragment_amount, spread_range, fragment_types)
// EMP arc shot
/obj/item/projectile/arc/emp_blast
name = "emp blast"
icon_state = "bluespace"
/obj/item/projectile/arc/emp_blast/on_impact(turf/T)
empulse(T, 2, 4, 7, 10) // Normal EMP grenade.
return ..()
/obj/item/projectile/arc/emp_blast/weak/on_impact(turf/T)
empulse(T, 1, 2, 3, 4) // Sec EMP grenade.
return ..()
// Radiation arc shot
/obj/item/projectile/arc/radioactive
name = "radiation blast"
icon_state = "green_pellet"
icon_scale = 2
var/rad_power = 50
/obj/item/projectile/arc/radioactive/on_impact(turf/T)
radiation_repository.radiate(T, rad_power)
+18 -3
View File
@@ -212,7 +212,22 @@
muzzle_type = /obj/effect/projectile/pulse/muzzle
/obj/item/projectile/energy/phase
kill_count = 4
name = "phase wave"
icon_state = "phase"
kill_count = 6
damage = 5
SA_bonus_damage = 55 // 60 total on animals.
SA_vulnerability = SA_ANIMAL
SA_bonus_damage = 45 // 50 total on animals
SA_vulnerability = SA_ANIMAL
/obj/item/projectile/energy/phase/light
kill_count = 4
SA_bonus_damage = 35 // 40 total on animals
/obj/item/projectile/energy/phase/heavy
kill_count = 8
SA_bonus_damage = 55 // 60 total on animals
/obj/item/projectile/energy/phase/heavy/cannon
kill_count = 10
damage = 15
SA_bonus_damage = 60 // 75 total on animals
@@ -865,7 +865,7 @@
glass_name = "lime tea"
glass_desc = "A tasty mixture of lime and tea. It's apparently good for you!"
cup_name = "cup of berry tea"
cup_name = "cup of lime tea"
cup_desc = "A tasty mixture of lime and tea. It's apparently good for you!"
/datum/reagent/drink/tea/orangetea
@@ -909,9 +909,9 @@
cup_icon_state = "cup_coffee"
cup_name = "cup of coffee"
cup_desc = "Don't drop it, or you'll send scalding liquid and porcelain shards everywhere."
cup_desc = "Don't drop it, or you'll send scalding liquid and ceramic shards everywhere."
glass_name = "cup of coffee"
glass_name = "coffee"
glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
@@ -32,7 +32,7 @@
if(alien == IS_SLIME)
chem_effective = 0.75
if(alien != IS_DIONA)
M.heal_organ_damage(6 * removed * chem_effective, 0)
M.heal_organ_damage(4 * removed * chem_effective, 0) //VOREStation Edit
/datum/reagent/bicaridine/overdose(var/mob/living/carbon/M, var/alien, var/removed)
..()
@@ -67,7 +67,7 @@
chem_effective = 0.5
M.adjustBruteLoss(2 * removed) //Mends burns, but has negative effects with a Promethean's skeletal structure.
if(alien != IS_DIONA)
M.heal_organ_damage(0, 6 * removed * chem_effective)
M.heal_organ_damage(0, 4 * removed * chem_effective) //VOREStation edit
/datum/reagent/dermaline
name = "Dermaline"
@@ -85,7 +85,7 @@
if(alien == IS_SLIME)
chem_effective = 0.75
if(alien != IS_DIONA)
M.heal_organ_damage(0, 12 * removed * chem_effective)
M.heal_organ_damage(0, 8 * removed * chem_effective) //VOREStation edit
/datum/reagent/dylovene
name = "Dylovene"
@@ -141,20 +141,21 @@
color = "#0080FF"
overdose = REAGENTS_OVERDOSE
scannable = 1
metabolism = REM * 0.25 //VOREStation Edit
/datum/reagent/dexalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_VOX)
M.adjustToxLoss(removed * 6)
M.adjustToxLoss(removed * 24) //VOREStation Edit
else if(alien == IS_SLIME && dose >= 15)
M.add_chemical_effect(CE_PAINKILLER, 15)
if(prob(15))
to_chat(M, "<span class='notice'>You have a moment of clarity as you collapse.</span>")
M.adjustBrainLoss(-5 * removed)
M.adjustBrainLoss(-20 * removed) //VOREStation Edit
M.Weaken(6)
else if(alien != IS_DIONA)
M.adjustOxyLoss(-15 * removed)
M.adjustOxyLoss(-60 * removed) //VOREStation Edit
holder.remove_reagent("lexorin", 2 * removed)
holder.remove_reagent("lexorin", 8 * removed) //VOREStation Edit
/datum/reagent/dexalinp
name = "Dexalin Plus"
@@ -399,7 +400,7 @@
M.Weaken(5)
if(dose >= 10 && M.paralysis < 40)
M.AdjustParalysis(1) //Messing with the core with a simple chemical probably isn't the best idea.
M.adjustBrainLoss(-30 * removed * chem_effective)
M.adjustBrainLoss(-8 * removed * chem_effective) //VOREStation Edit
M.add_chemical_effect(CE_PAINKILLER, 10 * chem_effective)
/datum/reagent/imidazoline

Some files were not shown because too many files have changed in this diff Show More