mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-30 15:38:02 +01:00
Merge branch 'master' into ALRAUNE_STUFF
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 platoon–and 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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)]"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+32
-2
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
@@ -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
Reference in New Issue
Block a user