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:
Markolie
2017-02-06 20:37:03 +01:00
59 changed files with 728 additions and 375 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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'
)

View File

@@ -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

View File

@@ -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

View File

@@ -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 ..()

View File

@@ -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

View File

@@ -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.

View File

@@ -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))

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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>")

View File

@@ -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")

View File

@@ -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"

View File

@@ -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'

View File

@@ -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"