mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-29 19:52:12 +00:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into lavaland_updates
# Conflicts: # icons/mob/head.dmi # icons/mob/suit.dmi # icons/obj/clothing/hats.dmi # icons/obj/clothing/suits.dmi
This commit is contained in:
@@ -266,7 +266,7 @@
|
||||
|
||||
//Sanitize
|
||||
metadata = sanitize_text(metadata, initial(metadata))
|
||||
real_name = reject_bad_name(real_name)
|
||||
real_name = reject_bad_name(real_name, 1)
|
||||
if(isnull(species)) species = "Human"
|
||||
if(isnull(language)) language = "None"
|
||||
if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
species_restricted = list("exclude", "Diona", "Wryn")
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
)
|
||||
/obj/item/clothing/head/helmet/space/capspace/equipped(var/mob/living/carbon/human/user, var/slot)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot)
|
||||
if(ishuman(user) && slot == slot_head)
|
||||
if(user.species.name == "Vox")
|
||||
if(flags & BLOCKHAIR)
|
||||
@@ -33,11 +33,9 @@
|
||||
species_restricted = list("exclude", "Diona", "Wryn")
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/suit.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
|
||||
|
||||
//Deathsquad space suit, not hardsuits because no flashlight!
|
||||
/obj/item/clothing/head/helmet/space/deathsquad
|
||||
name = "deathsquad helmet"
|
||||
@@ -106,7 +104,6 @@
|
||||
flags_size = ONESIZEFITSALL
|
||||
allowed = list(/obj/item) //for stuffing exta special presents
|
||||
|
||||
|
||||
//Space pirate outfit
|
||||
/obj/item/clothing/head/helmet/space/pirate
|
||||
name = "pirate hat"
|
||||
@@ -136,12 +133,22 @@
|
||||
desc = "A paramedic EVA helmet. Used in the recovery of bodies from space."
|
||||
icon_state = "paramedic-eva-helmet"
|
||||
item_state = "paramedic-eva-helmet"
|
||||
species_restricted = list("exclude","Diona","Wryn")
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/space/eva/paramedic
|
||||
name = "Paramedic EVA suit"
|
||||
icon_state = "paramedic-eva"
|
||||
item_state = "paramedic-eva"
|
||||
desc = "A paramedic EVA suit. Used in the recovery of bodies from space."
|
||||
species_restricted = list("exclude","Diona","Wryn")
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/space/eva
|
||||
name = "EVA suit"
|
||||
@@ -207,4 +214,4 @@
|
||||
armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
strip_delay = 130
|
||||
strip_delay = 130
|
||||
|
||||
@@ -69,15 +69,6 @@
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
// ENGINEERING
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/assistant
|
||||
name = "plasmaman assistant suit"
|
||||
icon_state = "plasmamanAssistant_suit"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
|
||||
name = "plasmaman assistant helmet"
|
||||
icon_state = "plasmamanAssistant_helmet0"
|
||||
base_state = "plasmamanAssistant_helmet"
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/atmostech
|
||||
name = "plasmaman atmospheric suit"
|
||||
icon_state = "plasmamanAtmos_suit"
|
||||
@@ -115,6 +106,14 @@
|
||||
|
||||
|
||||
//SERVICE
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/assistant
|
||||
name = "plasmaman assistant suit"
|
||||
icon_state = "plasmamanAssistant_suit"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
|
||||
name = "plasmaman assistant helmet"
|
||||
icon_state = "plasmamanAssistant_helmet0"
|
||||
base_state = "plasmamanAssistant_helmet"
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/botanist
|
||||
name = "plasmaman botanist suit"
|
||||
@@ -301,6 +300,17 @@
|
||||
icon_state = "plasmaman_Captain_helmet0"
|
||||
base_state = "plasmaman_Captain_helmet"
|
||||
|
||||
|
||||
//IAA/LAWYER
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/lawyer
|
||||
name = "plasmaman lawyer suit"
|
||||
icon_state = "plasmamanlawyer_suit"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
|
||||
name = "plasmaman lawyer helmet"
|
||||
icon_state = "plasmamanlawyer_helmet0"
|
||||
base_state = "plasmamanlawyer_helmet"
|
||||
|
||||
//NUKEOPS
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/nuclear
|
||||
|
||||
@@ -74,6 +74,10 @@
|
||||
strip_delay = 70
|
||||
put_on_delay = 70
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/bomb_suit
|
||||
name = "bomb suit"
|
||||
@@ -99,17 +103,20 @@
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
hide_tail_by_species = list("Vox")
|
||||
|
||||
/obj/item/clothing/head/bomb_hood/security
|
||||
icon_state = "bombsuitsec"
|
||||
item_state = "bombsuitsec"
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
|
||||
/obj/item/clothing/suit/bomb_suit/security
|
||||
icon_state = "bombsuitsec"
|
||||
item_state = "bombsuitsec"
|
||||
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/*
|
||||
* Radiation protection
|
||||
@@ -123,6 +130,10 @@
|
||||
strip_delay = 60
|
||||
put_on_delay = 60
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/radiation
|
||||
name = "Radiation suit"
|
||||
@@ -140,4 +151,8 @@
|
||||
flags_inv = HIDEJUMPSUIT|HIDETAIL
|
||||
strip_delay = 60
|
||||
put_on_delay = 60
|
||||
burn_state = FIRE_PROOF
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
)
|
||||
@@ -48,10 +48,8 @@
|
||||
result = /obj/item/weapon/melee/baton/cattleprod
|
||||
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
|
||||
/obj/item/stack/rods = 1,
|
||||
/obj/item/weapon/wirecutters = 1,
|
||||
/obj/item/weapon/stock_parts/cell = 1)
|
||||
/obj/item/device/assembly/igniter = 1)
|
||||
time = 40
|
||||
parts = list(/obj/item/weapon/stock_parts/cell = 1)
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/bola
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
pressure_resistance = 5*ONE_ATMOSPHERE
|
||||
|
||||
/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/device/t_scanner/adv_mining_scanner))
|
||||
attack_hand(user)
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/ore))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
var/english_names = 0 // Do we want English names by default, no matter what?
|
||||
var/list/scramble_cache = list()
|
||||
|
||||
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4)
|
||||
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4)
|
||||
if(!syllables || !syllables.len || english_names)
|
||||
if(gender==FEMALE)
|
||||
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
return "[trim(full_name)]"
|
||||
|
||||
/datum/language/proc/scramble(var/input)
|
||||
/datum/language/proc/scramble(input)
|
||||
|
||||
if(!syllables || !syllables.len)
|
||||
return stars(input)
|
||||
@@ -95,10 +95,11 @@
|
||||
// if you yell, you'll be heard from two tiles over instead of one
|
||||
return (copytext(message, length(message)) == "!") ? 2 : 1
|
||||
|
||||
/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
/datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
log_say("[key_name(speaker)]: ([name]) [message]")
|
||||
|
||||
if(!speaker_mask) speaker_mask = speaker.name
|
||||
if(!speaker_mask)
|
||||
speaker_mask = speaker.name
|
||||
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> [format_message(message, get_spoken_verb(message))]</span></i>"
|
||||
|
||||
for(var/mob/player in player_list)
|
||||
@@ -110,10 +111,10 @@
|
||||
else if(istype(player,/mob/dead) || ((src in player.languages) && check_special_condition(player, speaker)))
|
||||
to_chat(player, msg)
|
||||
|
||||
/datum/language/proc/check_special_condition(var/mob/other, var/mob/living/speaker)
|
||||
return 1
|
||||
/datum/language/proc/check_special_condition(mob/other, mob/living/speaker)
|
||||
return TRUE
|
||||
|
||||
/datum/language/proc/get_spoken_verb(var/msg_end)
|
||||
/datum/language/proc/get_spoken_verb(msg_end)
|
||||
switch(msg_end)
|
||||
if("!")
|
||||
return exclaim_verb
|
||||
@@ -170,8 +171,7 @@
|
||||
"ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \
|
||||
"hal","ket","jurl","mah","tul","cresh","azu","ragh")
|
||||
|
||||
/datum/language/tajaran/get_random_name(var/gender)
|
||||
|
||||
/datum/language/tajaran/get_random_name(gender)
|
||||
var/new_name = ..(gender,1)
|
||||
if(prob(80))
|
||||
new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]"
|
||||
@@ -286,13 +286,13 @@
|
||||
key = "^"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/grey/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
/datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
..(speaker,message,speaker.real_name)
|
||||
|
||||
/datum/language/grey/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker)
|
||||
/datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
|
||||
if(other in range(7, speaker))
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/language/drask
|
||||
name = "Orluum"
|
||||
@@ -322,7 +322,7 @@
|
||||
english_names = 1
|
||||
|
||||
//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
|
||||
/datum/language/common/get_spoken_verb(var/msg_end)
|
||||
/datum/language/common/get_spoken_verb(msg_end)
|
||||
switch(msg_end)
|
||||
if("!")
|
||||
return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
|
||||
@@ -341,7 +341,7 @@
|
||||
syllables = list("tao","shi","tzu","yi","com","be","is","i","op","vi","ed","lec","mo","cle","te","dis","e")
|
||||
english_names = 1
|
||||
|
||||
/datum/language/human/get_spoken_verb(var/msg_end)
|
||||
/datum/language/human/get_spoken_verb(msg_end)
|
||||
switch(msg_end)
|
||||
if("!")
|
||||
return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
|
||||
@@ -396,15 +396,14 @@
|
||||
key = "y"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/wryn/check_special_condition(var/mob/other)
|
||||
|
||||
/datum/language/wryn/check_special_condition(mob/other)
|
||||
var/mob/living/carbon/M = other
|
||||
if(!istype(M))
|
||||
return 1
|
||||
return TRUE
|
||||
if(locate(/obj/item/organ/internal/wryn/hivenode) in M.internal_organs)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/datum/language/xenocommon
|
||||
name = "Xenomorph"
|
||||
@@ -428,7 +427,6 @@
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
follow = 1
|
||||
|
||||
|
||||
/datum/language/terrorspider
|
||||
name = "Spider Hivemind"
|
||||
desc = "Terror spiders have a limited ability to commune over a psychic hivemind, similar to xenomorphs."
|
||||
@@ -440,7 +438,6 @@
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
follow = 1
|
||||
|
||||
|
||||
/datum/language/ling
|
||||
name = "Changeling"
|
||||
desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance."
|
||||
@@ -449,6 +446,14 @@
|
||||
key = "g"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/ling/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
if(speaker.mind && speaker.mind.changeling)
|
||||
..(speaker,message,speaker.mind.changeling.changelingID)
|
||||
else if(speaker.mind && speaker.mind.linglink)
|
||||
..()
|
||||
else
|
||||
..(speaker,message)
|
||||
|
||||
/datum/language/shadowling
|
||||
name = "Shadowling Hivemind"
|
||||
desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind."
|
||||
@@ -457,20 +462,12 @@
|
||||
key = "8"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
|
||||
/datum/language/shadowling/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
|
||||
/datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
if(speaker.mind && speaker.mind.special_role)
|
||||
..(speaker, message, "([speaker.mind.special_role]) [speaker]")
|
||||
else
|
||||
..(speaker, message)
|
||||
|
||||
/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
|
||||
if(speaker.mind && speaker.mind.changeling)
|
||||
..(speaker,message,speaker.mind.changeling.changelingID)
|
||||
else
|
||||
..(speaker,message)
|
||||
|
||||
/datum/language/abductor
|
||||
name = "Abductor Mindlink"
|
||||
desc = "Abductors are incapable of speech, but have a psychic link attuned to their own team."
|
||||
@@ -481,14 +478,14 @@
|
||||
key = "zw" //doesn't matter, this is their default and only language
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/abductor/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
/datum/language/abductor/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
..(speaker,message,speaker.real_name)
|
||||
|
||||
/datum/language/abductor/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker)
|
||||
/datum/language/abductor/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
|
||||
if(other.mind && other.mind.abductor)
|
||||
if(other.mind.abductor.team == speaker.mind.abductor.team)
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/language/corticalborer
|
||||
name = "Cortical Link"
|
||||
@@ -500,11 +497,11 @@
|
||||
key = "x"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
/datum/language/corticalborer/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
|
||||
var/mob/living/simple_animal/borer/B
|
||||
|
||||
if(istype(speaker,/mob/living/carbon))
|
||||
if(iscarbon(speaker))
|
||||
var/mob/living/carbon/M = speaker
|
||||
B = M.has_brain_worms()
|
||||
else if(istype(speaker,/mob/living/simple_animal/borer))
|
||||
@@ -526,7 +523,7 @@
|
||||
follow = 1
|
||||
var/drone_only
|
||||
|
||||
/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
/datum/language/binary/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
|
||||
if(!speaker.binarycheck())
|
||||
return
|
||||
@@ -538,15 +535,14 @@
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)], \"[message]\"</span></span></i>"
|
||||
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
|
||||
if(!isnewplayer(M) && !isbrain(M))
|
||||
var/message_start_dead = "<i><span class='game say'>[name], <span class='name'>[speaker.name] ([ghost_follow_link(speaker, ghost=M)])</span>"
|
||||
M.show_message("[message_start_dead] [message_body]", 2)
|
||||
|
||||
for(var/mob/living/S in living_mob_list)
|
||||
|
||||
if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
|
||||
continue
|
||||
else if(istype(S , /mob/living/silicon/ai))
|
||||
else if(isAI(S))
|
||||
message_start = "<i><span class='game say'>[name], <a href='byond://?src=[S.UID()];track=\ref[speaker]'><span class='name'>[speaker.name]</span></a>"
|
||||
else if(!S.binarycheck())
|
||||
continue
|
||||
@@ -557,7 +553,7 @@
|
||||
listening -= src
|
||||
|
||||
for(var/mob/living/M in listening)
|
||||
if(istype(M, /mob/living/silicon) || M.binarycheck())
|
||||
if(issilicon(M) || M.binarycheck())
|
||||
continue
|
||||
M.show_message("<i><span class='game say'><span class='name'>synthesised voice</span> <span class='message'>beeps, \"beep beep beep\"</span></span></i>",2)
|
||||
|
||||
@@ -596,17 +592,17 @@
|
||||
follow = 1
|
||||
|
||||
// Language handling.
|
||||
/mob/proc/add_language(var/language)
|
||||
/mob/proc/add_language(language)
|
||||
|
||||
var/datum/language/new_language = all_languages[language]
|
||||
|
||||
if(!istype(new_language) || new_language in languages)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
languages |= new_language
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/proc/remove_language(var/rem_language)
|
||||
/mob/proc/remove_language(rem_language)
|
||||
var/datum/language/L = all_languages[rem_language]
|
||||
. = (L in languages)
|
||||
languages.Remove(L)
|
||||
@@ -620,7 +616,7 @@
|
||||
// Can we speak this language, as opposed to just understanding it?
|
||||
/mob/proc/can_speak_language(datum/language/speaking)
|
||||
|
||||
return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages)
|
||||
return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in languages)
|
||||
|
||||
//TBD
|
||||
/mob/verb/check_languages()
|
||||
@@ -661,7 +657,7 @@
|
||||
if(L)
|
||||
set_default_language(L)
|
||||
check_languages()
|
||||
return 1
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -67,6 +67,9 @@
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
|
||||
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_in_backpack)
|
||||
if("Internal Affairs Agent")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
|
||||
if("Magistrate")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
|
||||
|
||||
@@ -99,22 +99,24 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
var/obj/machinery/camera/portable/builtInCamera
|
||||
|
||||
var/obj/structure/AIcore/deactivated/linked_core //For exosuit control
|
||||
|
||||
var/arrivalmsg = "$name, $rank, has arrived on the station."
|
||||
|
||||
/mob/living/silicon/ai/proc/add_ai_verbs()
|
||||
src.verbs |= ai_verbs_default
|
||||
src.verbs |= silicon_subsystems
|
||||
verbs |= ai_verbs_default
|
||||
verbs |= silicon_subsystems
|
||||
|
||||
/mob/living/silicon/ai/proc/remove_ai_verbs()
|
||||
src.verbs -= ai_verbs_default
|
||||
src.verbs -= silicon_subsystems
|
||||
verbs -= ai_verbs_default
|
||||
verbs -= silicon_subsystems
|
||||
|
||||
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
|
||||
announcement = new()
|
||||
announcement.title = "A.I. Announcement"
|
||||
announcement.announcement_type = "A.I. Announcement"
|
||||
announcement.announcer = name
|
||||
announcement.newscast = 1
|
||||
announcement.newscast = 0
|
||||
|
||||
var/list/possibleNames = ai_names
|
||||
|
||||
@@ -154,7 +156,7 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src)
|
||||
|
||||
if(istype(loc, /turf))
|
||||
if(isturf(loc))
|
||||
add_ai_verbs(src)
|
||||
|
||||
//Languages
|
||||
@@ -226,7 +228,7 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
/mob/living/silicon/ai/rename_character(oldname, newname)
|
||||
if(!..(oldname, newname))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(oldname != real_name)
|
||||
announcement.announcer = name
|
||||
@@ -238,7 +240,7 @@ var/list/ai_verbs_default = list(
|
||||
if(aiPDA)
|
||||
aiPDA.set_name_and_job(newname, "AI")
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/ai/Destroy()
|
||||
ai_list -= src
|
||||
@@ -261,7 +263,7 @@ var/list/ai_verbs_default = list(
|
||||
var/mob/living/silicon/ai/powered_ai = null
|
||||
invisibility = 100
|
||||
|
||||
/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
|
||||
/obj/machinery/ai_powersupply/New(mob/living/silicon/ai/ai=null)
|
||||
powered_ai = ai
|
||||
if(isnull(powered_ai))
|
||||
qdel(src)
|
||||
@@ -307,31 +309,83 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
//if(icon_state == initial(icon_state))
|
||||
var/icontype = ""
|
||||
if(custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
|
||||
else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT")
|
||||
if(custom_sprite == 1)
|
||||
icontype = ("Custom")//automagically selects custom sprite if one is available
|
||||
else
|
||||
icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT", "NT2", "Rainbow", "Angel", "Heartline", "Hades", "Helios", "Syndicat Meow", "Too Deep", "Goon", "Murica", "Fuzzy", "Glitchman", "House", "Database")
|
||||
switch(icontype)
|
||||
if("Custom") icon_state = "[ckey]-ai"
|
||||
if("Clown") icon_state = "ai-clown2"
|
||||
if("Monochrome") icon_state = "ai-mono"
|
||||
if("Inverted") icon_state = "ai-u"
|
||||
if("Firewall") icon_state = "ai-magma"
|
||||
if("Green") icon_state = "ai-wierd"
|
||||
if("Red") icon_state = "ai-red"
|
||||
if("Static") icon_state = "ai-static"
|
||||
if("Text") icon_state = "ai-text"
|
||||
if("Smiley") icon_state = "ai-smiley"
|
||||
if("Matrix") icon_state = "ai-matrix"
|
||||
if("Angry") icon_state = "ai-angryface"
|
||||
if("Dorf") icon_state = "ai-dorf"
|
||||
if("Bliss") icon_state = "ai-bliss"
|
||||
if("Triumvirate") icon_state = "ai-triumvirate"
|
||||
if("Triumvirate Static") icon_state = "ai-triumvirate-malf"
|
||||
if("Red October") icon_state = "ai-redoctober"
|
||||
if("Sparkles") icon_state = "ai-sparkles"
|
||||
if("ANIMA") icon_state = "ai-anima"
|
||||
if("President") icon_state = "ai-president"
|
||||
if("NT") icon_state = "ai-nt"
|
||||
else icon_state = "ai"
|
||||
if("Custom")
|
||||
icon_state = "[ckey]-ai"
|
||||
if("Clown")
|
||||
icon_state = "ai-clown"
|
||||
if("Monochrome")
|
||||
icon_state = "ai-mono"
|
||||
if("Inverted")
|
||||
icon_state = "ai-u"
|
||||
if("Firewall")
|
||||
icon_state = "ai-magma"
|
||||
if("Green")
|
||||
icon_state = "ai-weird"
|
||||
if("Red")
|
||||
icon_state = "ai-red"
|
||||
if("Static")
|
||||
icon_state = "ai-static"
|
||||
if("Text")
|
||||
icon_state = "ai-text"
|
||||
if("Smiley")
|
||||
icon_state = "ai-smiley"
|
||||
if("Matrix")
|
||||
icon_state = "ai-matrix"
|
||||
if("Angry")
|
||||
icon_state = "ai-angryface"
|
||||
if("Dorf")
|
||||
icon_state = "ai-dorf"
|
||||
if("Bliss")
|
||||
icon_state = "ai-bliss"
|
||||
if("Triumvirate")
|
||||
icon_state = "ai-triumvirate"
|
||||
if("Triumvirate Static")
|
||||
icon_state = "ai-triumvirate-malf"
|
||||
if("Red October")
|
||||
icon_state = "ai-redoctober"
|
||||
if("Sparkles")
|
||||
icon_state = "ai-sparkles"
|
||||
if("ANIMA")
|
||||
icon_state = "ai-anima"
|
||||
if("President")
|
||||
icon_state = "ai-president"
|
||||
if("NT")
|
||||
icon_state = "ai-nt"
|
||||
if("NT2")
|
||||
icon_state = "ai-nanotrasen"
|
||||
if("Rainbow")
|
||||
icon_state = "ai-rainbow"
|
||||
if("Angel")
|
||||
icon_state = "ai-angel"
|
||||
if("Heartline")
|
||||
icon_state = "ai-heartline"
|
||||
if("Hades")
|
||||
icon_state = "ai-hades"
|
||||
if("Helios")
|
||||
icon_state = "ai-helios"
|
||||
if("Syndicat Meow")
|
||||
icon_state = "ai-syndicatmeow"
|
||||
if("Too Deep")
|
||||
icon_state = "ai-toodeep"
|
||||
if("Goon")
|
||||
icon_state = "ai-goon"
|
||||
if("Murica")
|
||||
icon_state = "ai-murica"
|
||||
if("Fuzzy")
|
||||
icon_state = "ai-fuzz"
|
||||
if("Glitchman")
|
||||
icon_state = "ai-glitchman"
|
||||
if("House")
|
||||
icon_state = "ai-house"
|
||||
if("Database")
|
||||
icon_state = "ai-database"
|
||||
else
|
||||
icon_state = "ai"
|
||||
//else
|
||||
// to_chat(usr, "You can only change your display once!")
|
||||
//return
|
||||
@@ -400,7 +454,7 @@ var/list/ai_verbs_default = list(
|
||||
cancel_call_proc(src)
|
||||
|
||||
/mob/living/silicon/ai/cancel_camera()
|
||||
src.view_core()
|
||||
view_core()
|
||||
|
||||
/mob/living/silicon/ai/verb/toggle_anchor()
|
||||
set category = "AI Commands"
|
||||
@@ -414,7 +468,7 @@ var/list/ai_verbs_default = list(
|
||||
to_chat(src, "[anchored ? "<b>You are now anchored.</b>" : "<b>You are now unanchored.</b>"]")
|
||||
|
||||
/mob/living/silicon/ai/update_canmove()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/ai/proc/announcement()
|
||||
set name = "Announcement"
|
||||
@@ -426,21 +480,21 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
ai_announcement()
|
||||
|
||||
/mob/living/silicon/ai/check_eye(var/mob/user as mob)
|
||||
/mob/living/silicon/ai/check_eye(mob/user)
|
||||
if(!current)
|
||||
return null
|
||||
user.reset_perspective(current)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/ai/blob_act()
|
||||
if(stat != 2)
|
||||
adjustBruteLoss(60)
|
||||
updatehealth()
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/ai/restrained()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/ai/emp_act(severity)
|
||||
if(prob(30))
|
||||
@@ -516,7 +570,7 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
if(href_list["callbot"]) //Command a bot to move to a selected location.
|
||||
Bot = locate(href_list["callbot"]) in simple_animal_list
|
||||
if(!Bot || Bot.remote_disabled || src.control_disabled)
|
||||
if(!Bot || Bot.remote_disabled || control_disabled)
|
||||
return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off.
|
||||
waypoint_mode = 1
|
||||
to_chat(src, "<span class='notice'>Set your waypoint by clicking on a valid location free of obstructions.</span>")
|
||||
@@ -524,7 +578,7 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
if(href_list["interface"]) //Remotely connect to a bot!
|
||||
Bot = locate(href_list["interface"]) in simple_animal_list
|
||||
if(!Bot || Bot.remote_disabled || src.control_disabled)
|
||||
if(!Bot || Bot.remote_disabled || control_disabled)
|
||||
return
|
||||
Bot.attack_ai(src)
|
||||
|
||||
@@ -535,7 +589,16 @@ var/list/ai_verbs_default = list(
|
||||
if(href_list["ai_take_control"]) //Mech domination
|
||||
var/obj/mecha/M = locate(href_list["ai_take_control"])
|
||||
if(controlled_mech)
|
||||
to_chat(src, "You are already loaded into an onboard computer!")
|
||||
to_chat(src, "<span class='warning'>You are already loaded into an onboard computer!</span>")
|
||||
return
|
||||
if(!cameranet.checkCameraVis(M))
|
||||
to_chat(src, "<span class='warning'>Exosuit is no longer near active cameras.</span>")
|
||||
return
|
||||
if(lacks_power())
|
||||
to_chat(src, "<span class='warning'>You're depowered!</span>")
|
||||
return
|
||||
if(!isturf(loc))
|
||||
to_chat(src, "<span class='warning'>You aren't in your core!</span>")
|
||||
return
|
||||
if(M)
|
||||
M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself.
|
||||
@@ -550,7 +613,7 @@ var/list/ai_verbs_default = list(
|
||||
if(usr.machine == null)
|
||||
usr.machine = usr
|
||||
|
||||
while(src.cameraFollow == target)
|
||||
while(cameraFollow == target)
|
||||
to_chat(usr, "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb).")
|
||||
sleep(40)
|
||||
continue
|
||||
@@ -565,12 +628,12 @@ var/list/ai_verbs_default = list(
|
||||
return 2
|
||||
|
||||
|
||||
/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M)
|
||||
if(!ticker)
|
||||
to_chat(M, "You cannot attack people before the game has started.")
|
||||
return
|
||||
|
||||
if(istype(loc, /turf) && istype(loc.loc, /area/start))
|
||||
if(isturf(loc) && istype(loc.loc, /area/start))
|
||||
to_chat(M, "No attacking people at spawn, you jackass.")
|
||||
return
|
||||
|
||||
@@ -595,7 +658,7 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob)
|
||||
/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.custom_emote(1, "[M.friendly] [src]")
|
||||
else
|
||||
@@ -653,7 +716,7 @@ var/list/ai_verbs_default = list(
|
||||
popup.set_content(d)
|
||||
popup.open()
|
||||
|
||||
/mob/living/silicon/ai/proc/set_waypoint(var/atom/A)
|
||||
/mob/living/silicon/ai/proc/set_waypoint(atom/A)
|
||||
var/turf/turf_check = get_turf(A)
|
||||
//The target must be in view of a camera or near the core.
|
||||
if(turf_check in range(get_turf(src)))
|
||||
@@ -663,7 +726,7 @@ var/list/ai_verbs_default = list(
|
||||
else
|
||||
to_chat(src, "<span class='danger'>Selected location is not visible.</span>")
|
||||
|
||||
/mob/living/silicon/ai/proc/call_bot(var/turf/waypoint)
|
||||
/mob/living/silicon/ai/proc/call_bot(turf/waypoint)
|
||||
|
||||
if(!Bot)
|
||||
return
|
||||
@@ -674,22 +737,22 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
Bot.call_bot(src, waypoint)
|
||||
|
||||
/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C)
|
||||
/mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C)
|
||||
|
||||
if(!tracking)
|
||||
cameraFollow = null
|
||||
|
||||
if(!C || stat == DEAD) //C.can_use())
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(!src.eyeobj)
|
||||
if(!eyeobj)
|
||||
view_core()
|
||||
return
|
||||
// ok, we're alive, camera is good and in our network...
|
||||
eyeobj.setLoc(get_turf(C))
|
||||
//machine = src
|
||||
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
//Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm
|
||||
//Adds in /mob/living/silicon/ai/proc/ai_network_change() instead
|
||||
@@ -920,7 +983,7 @@ var/list/ai_verbs_default = list(
|
||||
set category = "Malfunction"
|
||||
set name = "Return to Main Core"
|
||||
|
||||
var/obj/machinery/power/apc/apc = src.loc
|
||||
var/obj/machinery/power/apc/apc = loc
|
||||
if(!istype(apc))
|
||||
to_chat(src, "\blue You are already in your Main Core.")
|
||||
return
|
||||
@@ -994,7 +1057,7 @@ var/list/ai_verbs_default = list(
|
||||
lit_cameras |= C
|
||||
|
||||
|
||||
/mob/living/silicon/ai/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
/mob/living/silicon/ai/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
if(anchored)
|
||||
user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...")
|
||||
@@ -1025,14 +1088,15 @@ var/list/ai_verbs_default = list(
|
||||
return
|
||||
|
||||
to_chat(src, "Accessing Subspace Transceiver control...")
|
||||
if(src.aiRadio)
|
||||
src.aiRadio.interact(src)
|
||||
if(aiRadio)
|
||||
aiRadio.interact(src)
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target as mob)
|
||||
if(!istype(target)) return
|
||||
/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target)
|
||||
if(!istype(target))
|
||||
return
|
||||
spawn(0)
|
||||
if(istype(target, /mob/living/carbon/human))
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/obj/item/weapon/card/id/id = H.wear_id
|
||||
if(istype(id) && id.is_untrackable())
|
||||
@@ -1047,7 +1111,8 @@ var/list/ai_verbs_default = list(
|
||||
var/obj/machinery/door/airlock/tobeopened
|
||||
var/dist = -1
|
||||
for(var/obj/machinery/door/airlock/D in range(3,target))
|
||||
if(!D.density) continue
|
||||
if(!D.density)
|
||||
continue
|
||||
if(dist < 0)
|
||||
dist = get_dist(D, target)
|
||||
// to_chat(world, dist)
|
||||
@@ -1073,27 +1138,27 @@ var/list/ai_verbs_default = list(
|
||||
return
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/check_unable(var/flags = 0)
|
||||
/mob/living/silicon/ai/proc/check_unable(flags = 0)
|
||||
if(stat == DEAD)
|
||||
to_chat(usr, "<span class='warning'>You are dead!</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
if(lacks_power())
|
||||
to_chat(usr, "<span class='warning'>Power systems failure!</span>")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
if((flags & AI_CHECK_WIRELESS) && src.control_disabled)
|
||||
if((flags & AI_CHECK_WIRELESS) && control_disabled)
|
||||
to_chat(usr, "<span class='warning'>Wireless control is disabled!</span>")
|
||||
return 1
|
||||
if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi)
|
||||
return TRUE
|
||||
if((flags & AI_CHECK_RADIO) && aiRadio.disabledAi)
|
||||
to_chat(src, "<span class='warning'>System Error - Transceiver Disabled!</span>")
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/ai/proc/is_in_chassis()
|
||||
return istype(loc, /turf)
|
||||
return isturf(loc)
|
||||
|
||||
/mob/living/silicon/ai/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card)
|
||||
/mob/living/silicon/ai/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card)
|
||||
if(!..())
|
||||
return
|
||||
if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card.
|
||||
@@ -1114,17 +1179,17 @@ var/list/ai_verbs_default = list(
|
||||
set category = "IC"
|
||||
|
||||
resting = 0
|
||||
var/obj/item/weapon/rig/rig = src.get_rig()
|
||||
var/obj/item/weapon/rig/rig = get_rig()
|
||||
if(rig)
|
||||
rig.force_rest(src)
|
||||
|
||||
/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
|
||||
/mob/living/silicon/ai/switch_to_camera(obj/machinery/camera/C)
|
||||
if(!C.can_use() || !is_in_chassis())
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
eyeobj.setLoc(get_turf(C))
|
||||
client.eye = eyeobj
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/ai/proc/relay_speech(mob/living/M, text, verb, datum/language/speaking)
|
||||
if(!say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad.
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
/mob/living/silicon/ai/death(gibbed)
|
||||
if(stat == DEAD) return
|
||||
if(stat == DEAD)
|
||||
return
|
||||
stat = DEAD
|
||||
if(src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
|
||||
icon_state = "[ckey]-ai-crash"
|
||||
else icon_state = "ai-crash"
|
||||
if(custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
|
||||
icon_state = "[ckey]-ai_dead"
|
||||
else if("[icon_state]_dead" in icon_states(icon,1))
|
||||
icon_state = "[icon_state]_dead"
|
||||
else
|
||||
icon_state = "ai_dead"
|
||||
update_canmove()
|
||||
if(eyeobj)
|
||||
eyeobj.setLoc(get_turf(src))
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
/obj/item/weapon/gripper/verb/drop_item()
|
||||
|
||||
set name = "Drop Item"
|
||||
set name = "Drop Gripped Item"
|
||||
set desc = "Release an item from your magnetic gripper."
|
||||
set category = "Drone"
|
||||
|
||||
|
||||
@@ -113,12 +113,13 @@
|
||||
feedback_add_details("hivelord_core","[src.type]|used|self")
|
||||
playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||
H.revive()
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/organ/internal/hivelord_core/prepare_eat()
|
||||
return null
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood
|
||||
name = "hivelord brood"
|
||||
desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
|
||||
@@ -206,7 +207,7 @@
|
||||
faction = list("\ref[src]", "\ref[H]") // Hostile to everyone except the host.
|
||||
H.vessel.trans_to(src, 30)
|
||||
color = mix_color_from_reagents(reagents.reagent_list)
|
||||
|
||||
|
||||
// Legion
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelord/legion
|
||||
name = "legion"
|
||||
@@ -240,7 +241,7 @@
|
||||
else
|
||||
new /obj/effect/landmark/corpse/damaged(T)
|
||||
..(gibbed)
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
|
||||
name = "legion"
|
||||
|
||||
@@ -235,7 +235,7 @@ var/global/list/ts_spiderlist = list()
|
||||
notify_ghosts("[src] has appeared in [get_area(src)]. (already player-controlled)", source = src, alert_overlay = alert_overlay)
|
||||
else if(ai_playercontrol_allowingeneral && ai_playercontrol_allowtype)
|
||||
var/image/alert_overlay = image('icons/mob/terrorspider.dmi', icon_state)
|
||||
notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "<a href=?src=[UID()];activate=1>(Click to control)</a>", source = src, alert_overlay = alert_overlay, attack_not_jump = 1)
|
||||
notify_ghosts("[src] has appeared in [get_area(src)].", enter_link = "<a href=?src=[UID()];activate=1>(Click to control)</a>", source = src, alert_overlay = alert_overlay, action = NOTIFY_ATTACK)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/Destroy()
|
||||
ts_spiderlist -= src
|
||||
|
||||
@@ -434,7 +434,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
|
||||
lname = "<span class='name'>[lname]</span> "
|
||||
to_chat(M, "<span class='deadsay'>[lname][follow][message]</span>")
|
||||
|
||||
/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, atom/source = null, image/alert_overlay = null, attack_not_jump = 0, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts.
|
||||
/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, atom/source = null, image/alert_overlay = null, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts.
|
||||
for(var/mob/dead/observer/O in player_list)
|
||||
if(O.client)
|
||||
to_chat(O, "<span class='ghostalert'>[message][(enter_link) ? " [enter_link]" : ""]<span>")
|
||||
|
||||
@@ -342,7 +342,7 @@
|
||||
build_path = /obj/item/weapon/circuitboard/teleporter
|
||||
category = list("Computer Boards")
|
||||
|
||||
datum/design/GAC
|
||||
/datum/design/GAC
|
||||
name = "Console Board (General Air Control)"
|
||||
desc = "Allows for the construction of circuit boards used to build a General Air Control Computer."
|
||||
id = "GAC"
|
||||
@@ -352,7 +352,7 @@ datum/design/GAC
|
||||
build_path = /obj/item/weapon/circuitboard/air_management
|
||||
category = list("Computer Boards")
|
||||
|
||||
datum/design/tank_control
|
||||
/datum/design/tank_control
|
||||
name = "Console Board (Large Tank Control)"
|
||||
desc = "Allows for the construction of circuit boards used to build a Large Tank Control Computer."
|
||||
id = "tankcontrol"
|
||||
@@ -362,7 +362,7 @@ datum/design/tank_control
|
||||
build_path = /obj/item/weapon/circuitboard/large_tank_control
|
||||
category = list("Computer Boards")
|
||||
|
||||
datum/design/AAC
|
||||
/datum/design/AAC
|
||||
name = "Console Board (Atmospheric Automations Console)"
|
||||
desc = "Allows for the construction of circuit boards used to build an Atmospheric Automations Console."
|
||||
id = "AAC"
|
||||
@@ -370,4 +370,14 @@ datum/design/AAC
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 1000, "sacid" = 20)
|
||||
build_path = /obj/item/weapon/circuitboard/atmos_automation
|
||||
category = list("Computer Boards")
|
||||
category = list("Computer Boards")
|
||||
|
||||
/datum/design/xenobiocamera
|
||||
name = "Console Board (Xenobiology Console)"
|
||||
desc = "Allows for the construction of circuit boards used to build xenobiology camera computers."
|
||||
id = "xenobioconsole"
|
||||
req_tech = list("programming" = 3, "biotech" = 3)
|
||||
build_type = IMPRINTER
|
||||
materials = list(MAT_GLASS = 1000, "sacid" = 20)
|
||||
build_path = /obj/item/weapon/circuitboard/xenobiology
|
||||
category = list("Computer Boards")
|
||||
|
||||
@@ -1068,6 +1068,16 @@
|
||||
construction_time = 50
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/mecha_tracking_ai_control
|
||||
name = "AI Control Beacon"
|
||||
id = "mecha_tracking_ai_control"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_tracking/ai_control
|
||||
materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 200)
|
||||
req_tech = list("programming" = 3, "magnets" = 2, "engineering" = 2)
|
||||
construction_time = 50
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/ipc_head
|
||||
name = "IPC Head"
|
||||
id = "ipc_head"
|
||||
|
||||
@@ -3,11 +3,16 @@
|
||||
visible_icon = 1
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "camera_target"
|
||||
var/allowed_area = null
|
||||
|
||||
/mob/camera/aiEye/remote/xenobio/New(loc)
|
||||
var/area/A = get_area(loc)
|
||||
allowed_area = A.name
|
||||
..()
|
||||
|
||||
/mob/camera/aiEye/remote/xenobio/setLoc(var/t)
|
||||
/mob/camera/aiEye/remote/xenobio/setLoc(t)
|
||||
var/area/new_area = get_area(t)
|
||||
if(new_area && new_area.name == "Xenobiology Lab" || istype(new_area, /area/toxins/xenobiology ))
|
||||
if(new_area && new_area.name == allowed_area || istype(new_area, /area/toxins/xenobiology ))
|
||||
return ..()
|
||||
else
|
||||
return
|
||||
@@ -16,6 +21,7 @@
|
||||
name = "Slime management console"
|
||||
desc = "A computer used for remotely handling slimes."
|
||||
networks = list("SS13")
|
||||
circuit = /obj/item/weapon/circuitboard/xenobiology
|
||||
off_action = new /datum/action/innate/camera_off/xenobio
|
||||
var/datum/action/innate/slime_place/slime_place_action = new
|
||||
var/datum/action/innate/slime_pick_up/slime_up_action = new
|
||||
@@ -30,8 +36,7 @@
|
||||
icon_keyboard = "rd_key"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
|
||||
eyeobj = new /mob/camera/aiEye/remote/xenobio()
|
||||
eyeobj.loc = get_turf(src)
|
||||
eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
|
||||
eyeobj.origin = src
|
||||
eyeobj.visible_icon = 1
|
||||
eyeobj.icon = 'icons/obj/abductor.dmi'
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
else
|
||||
// This isn't an error, per se, but we can't let the shuttle code
|
||||
// attempt to move us where we currently are, it will get weird.
|
||||
return SHUTTLE_ALREADY_DOCKED
|
||||
return SHUTTLE_ALREADY_DOCKED
|
||||
return SHUTTLE_CAN_DOCK
|
||||
|
||||
/obj/docking_port/mobile/proc/check_dock(obj/docking_port/stationary/S)
|
||||
@@ -761,6 +761,7 @@
|
||||
/obj/machinery/computer/shuttle/ert
|
||||
name = "specops shuttle console"
|
||||
//circuit = /obj/item/weapon/circuitboard/ert
|
||||
req_access = list(access_cent_general)
|
||||
shuttleId = "specops"
|
||||
possible_destinations = "specops_home;specops_away"
|
||||
|
||||
@@ -799,13 +800,14 @@
|
||||
/obj/machinery/computer/shuttle/sst
|
||||
name = "Syndicate Strike Time Shuttle Console"
|
||||
desc = "Used to call and send the SST shuttle."
|
||||
req_access = list(access_syndicate)
|
||||
shuttleId = "sst"
|
||||
possible_destinations = "sst_home;sst_away"
|
||||
|
||||
/obj/machinery/computer/shuttle/sit
|
||||
req_access = list(access_syndicate)
|
||||
name = "Syndicate Infiltration Team Shuttle Console"
|
||||
desc = "Used to call and send the SIT shuttle."
|
||||
req_access = list(access_syndicate)
|
||||
shuttleId = "sit"
|
||||
possible_destinations = "sit_arrivals;sit_scimaint;sit_engshuttle;sit_away"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user