Merge remote-tracking branch 'upstream/dev' into air-alarm

This commit is contained in:
mwerezak
2014-06-29 19:15:37 -04:00
38 changed files with 729 additions and 337 deletions
+35 -14
View File
@@ -1,3 +1,8 @@
#define EXTERNAL_PRESSURE_BOUND ONE_ATMOSPHERE
#define INTERNAL_PRESSURE_BOUND 0
#define PRESSURE_CHECKS 1
#undefine
/obj/machinery/atmospherics/unary/vent_pump
icon = 'icons/obj/atmospherics/vent_pump.dmi'
icon_state = "off"
@@ -14,14 +19,19 @@
var/on = 0
var/pump_direction = 1 //0 = siphoning, 1 = releasing
var/external_pressure_bound = ONE_ATMOSPHERE
var/internal_pressure_bound = 0
var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND
var/internal_pressure_bound = INTERNAL_PRESSURE_BOUND
var/pressure_checks = 1
var/pressure_checks = PRESSURE_CHECKS
//1: Do not pass external_pressure_bound
//2: Do not pass internal_pressure_bound
//3: Do not pass either
// Used when handling incoming radio signals requesting default settings
var/external_pressure_bound_default = EXTERNAL_PRESSURE_BOUND
var/internal_pressure_bound_default = INTERNAL_PRESSURE_BOUND
var/pressure_checks_default = PRESSURE_CHECKS
var/welded = 0 // Added for aliens -- TLE
var/frequency = 1439
@@ -205,7 +215,10 @@
on = !on
if(signal.data["checks"] != null)
pressure_checks = text2num(signal.data["checks"])
if (signal.data["set_internal_pressure"] == "default")
pressure_checks = pressure_checks_default
else
pressure_checks = text2num(signal.data["checks"])
if(signal.data["checks_toggle"] != null)
pressure_checks = (pressure_checks?0:3)
@@ -214,18 +227,24 @@
pump_direction = text2num(signal.data["direction"])
if(signal.data["set_internal_pressure"] != null)
internal_pressure_bound = between(
0,
text2num(signal.data["set_internal_pressure"]),
ONE_ATMOSPHERE*50
)
if (signal.data["set_internal_pressure"] == "default")
internal_pressure_bound = internal_pressure_bound_default
else
internal_pressure_bound = between(
0,
text2num(signal.data["set_internal_pressure"]),
ONE_ATMOSPHERE*50
)
if(signal.data["set_external_pressure"] != null)
external_pressure_bound = between(
0,
text2num(signal.data["set_external_pressure"]),
ONE_ATMOSPHERE*50
)
if (signal.data["set_external_pressure"] == "default")
external_pressure_bound = external_pressure_bound_default
else
external_pressure_bound = between(
0,
text2num(signal.data["set_external_pressure"]),
ONE_ATMOSPHERE*50
)
if(signal.data["adjust_internal_pressure"] != null)
internal_pressure_bound = between(
@@ -235,6 +254,8 @@
)
if(signal.data["adjust_external_pressure"] != null)
external_pressure_bound = between(
0,
external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),
@@ -70,6 +70,9 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
set_launch_countdown(get_shuttle_prep_time())
auto_recall_time = rand(world.time + 300, launch_time - 300)
//reset the shuttle transit time if we need to
shuttle.move_time = SHUTTLE_TRANSIT_DURATION
evac = 1
captain_announce("An emergency evacuation shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.")
world << sound('sound/AI/shuttlecalled.ogg')
@@ -86,6 +89,9 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
set_launch_countdown(get_shuttle_prep_time())
auto_recall_time = rand(world.time + 300, launch_time - 300)
//reset the shuttle transit time if we need to
shuttle.move_time = SHUTTLE_TRANSIT_DURATION
captain_announce("A crew transfer has been scheduled. The shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.")
//recalls the shuttle
+6
View File
@@ -269,6 +269,12 @@ var/global/datum/shuttle_controller/shuttle_controller
shuttle = dock_controller_map[C.id_tag]
shuttle.docking_controller = C.program
dock_controller_map -= C.id_tag
//escape pods
if(istype(C, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod))
var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/EPC = C
EPC.pod = shuttle
if (C.id_tag in dock_controller_map_station)
multidock = dock_controller_map_station[C.id_tag]
if (istype(multidock))
+5 -5
View File
@@ -45,8 +45,8 @@
flag = CHEF
department_flag = CIVILIAN
faction = "Station"
total_positions = 1
spawn_positions = 1
total_positions = 2
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#dddddd"
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue)
@@ -70,12 +70,12 @@
/datum/job/hydro
title = "Botanist"
title = "Gardener"
flag = BOTANIST
department_flag = CIVILIAN
faction = "Station"
total_positions = 3
spawn_positions = 2
total_positions = 2
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
+2 -2
View File
@@ -42,13 +42,13 @@
flag = SCIENTIST
department_flag = MEDSCI
faction = "Station"
total_positions = 5
total_positions = 6
spawn_positions = 3
supervisors = "the research director"
selection_color = "#ffeeff"
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Xenobotanist")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
+1 -1
View File
@@ -433,7 +433,7 @@ var/global/datum/controller/occupations/job_master
if(H.species.name == "Tajaran" || H.species.name == "Unathi")
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1)
else if(H.species.name == "Vox")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath/vox(src), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(src), slot_wear_mask)
if(!H.r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_r_hand)
H.internal = H.r_hand
+11 -9
View File
@@ -71,6 +71,7 @@
active_power_usage = 8
power_channel = ENVIRON
req_one_access = list(access_atmospherics, access_engine_equip)
var/breach_detection = 1 // Whether to use automatic breach detection or not
var/frequency = 1439
//var/skipprocess = 0 //Experimenting
var/alarm_frequency = 1437
@@ -283,17 +284,20 @@
if(!istype(location))
return 0
if(breach_detection == 0)
return 0
var/datum/gas_mixture/environment = location.return_air()
var/environment_pressure = environment.return_pressure()
var/pressure_levels = TLV["pressure"]
if (environment_pressure <= pressure_levels[1]) //low pressures
if (!(mode == AALARM_MODE_PANIC || mode == AALARM_MODE_CYCLE))
return 1
return 0
/obj/machinery/alarm/proc/master_is_operating()
return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN))
@@ -404,14 +408,12 @@
return 1
/obj/machinery/alarm/proc/apply_mode()
var/current_pressures = TLV["pressure"]
var/target_pressure = (current_pressures[2] + current_pressures[3])/2
switch(mode)
if(AALARM_MODE_SCRUBBING)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "scrubbing"= 1, "panic_siphon"= 0) )
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) )
send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") )
if(AALARM_MODE_PANIC, AALARM_MODE_CYCLE)
for(var/device_id in alarm_area.air_scrub_names)
@@ -423,13 +425,13 @@
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list("power"= 1, "panic_siphon"= 1) )
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) )
send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") )
if(AALARM_MODE_FILL)
for(var/device_id in alarm_area.air_scrub_names)
send_signal(device_id, list("power"= 0) )
for(var/device_id in alarm_area.air_vent_names)
send_signal(device_id, list("power"= 1, "checks"= 1, "set_external_pressure"= target_pressure) )
send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") )
if(AALARM_MODE_OFF)
for(var/device_id in alarm_area.air_scrub_names)
@@ -309,7 +309,7 @@
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=RestoreBackup'>Restore Backup Routing Data</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=changeseclevel'>Change alert level</A> \]"
if(!emergency_shuttle.location())
if(emergency_shuttle.location())
if (emergency_shuttle.online())
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=cancelshuttle'>Cancel Shuttle Call</A> \]"
else
@@ -377,7 +377,7 @@
var/dat = ""
switch(src.aistate)
if(STATE_DEFAULT)
if(!emergency_shuttle.location() && !emergency_shuttle.online())
if(emergency_shuttle.location() && !emergency_shuttle.online())
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-callshuttle'>Call Emergency Shuttle</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-messagelist'>Message List</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-status'>Set Status Display</A> \]"
@@ -1,12 +1,58 @@
//This controller goes on the escape pod itself
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod
var/datum/shuttle/ferry/pod
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
var/data[0]
data = list(
"docking_status" = docking_program.get_docking_status(),
"override_enabled" = docking_program.override_enabled,
"door_state" = docking_program.memory["door_status"]["state"],
"door_lock" = docking_program.memory["door_status"]["lock"],
"can_force" = pod.can_force(),
)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if (!ui)
ui = new(user, src, ui_key, "simple_docking_console_pod.tmpl", name, 470, 290)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
var/clean = 0
switch(href_list["command"]) //anti-HTML-hacking checks
if("force_door")
clean = 1
if("toggle_override")
clean = 1
if("force_launch")
pod.force_launch(src)
if(clean)
program.receive_user_command(href_list["command"])
return 1
//This controller is for the escape pod berth (station side)
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth
name = "escape pod berth controller"
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/initialize()
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/initialize()
..()
docking_program = new/datum/computer/file/embedded_program/docking/simple/escape_pod(src)
program = docking_program
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
var/data[0]
var/armed = null
@@ -28,7 +74,7 @@
ui.open()
ui.set_auto_update(1)
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/emag) && !emagged)
user << "\blue You emag the [src], arming the escape pod!"
emagged = 1
@@ -43,7 +89,7 @@
//A docking controller program for a simple door based docking port
/datum/computer/file/embedded_program/docking/simple/escape_pod
var/armed = 0
var/eject_delay = 15 //give latecomers some time to get out of the way if they don't make it onto the pod
var/eject_delay = 10 //give latecomers some time to get out of the way if they don't make it onto the pod
var/eject_time = null
var/closing = 0
+27 -8
View File
@@ -24,26 +24,40 @@
/obj/structure/New()
..()
if(climbable)
verbs += /obj/structure/proc/do_climb
verbs += /obj/structure/proc/climb_on
/obj/structure/proc/do_climb()
/obj/structure/proc/climb_on()
set name = "Climb structure"
set desc = "Climbs onto a structure."
set category = "Object"
set src in oview(1)
if (!can_touch(usr) || !climbable)
do_climb(usr)
/obj/structure/MouseDrop(atom/over_object)
var/mob/living/H = over_object
if(!istype(H)) return ..()
do_climb(H)
/obj/structure/proc/do_climb(var/mob/living/user)
if (!can_touch(user) || !climbable)
return
usr.visible_message("<span class='warning'>[usr] starts climbing onto \the [src]!</span>")
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
if(!do_after(usr,50))
if(!do_after(user,50))
return
if (!can_touch(user) || !climbable)
return
usr.loc = get_turf(src)
if (get_turf(usr) == get_turf(src))
usr.visible_message("<span class='warning'>[usr] climbs onto \the [src]!</span>")
if (get_turf(user) == get_turf(src))
usr.visible_message("<span class='warning'>[user] climbs onto \the [src]!</span>")
/obj/structure/proc/structure_shaken()
@@ -93,7 +107,12 @@
/obj/structure/proc/can_touch(var/mob/user)
if (!user)
return 0
if (user.stat || user.restrained() || user.paralysis || user.sleeping || user.lying || user.weakened)
if(!Adjacent(user))
return 0
if (user.restrained() || user.buckled)
user << "<span class='notice'>You need your hands and legs free for this.</span>"
return 0
if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
return 0
if (issilicon(user))
user << "<span class='notice'>You need hands for this.</span>"
@@ -120,8 +120,9 @@
return 1
/obj/structure/closet/proc/toggle(mob/user as mob)
var/orig = src.opened
. = src.opened ? src.close() : src.open()
if(!.)
if(. == orig)
user << "<span class='notice'>It won't budge!</span>"
return
@@ -299,6 +299,8 @@
return (check_cover(mover,target))
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
if(locate(/obj/structure/table) in get_turf(mover))
return 1
if (flipped)
if (get_dir(loc, target) == dir)
return !density
+1 -1
View File
@@ -48,7 +48,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/weapon/circular_saw(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/dartgun/vox/medical, slot_r_hand)
equip_to_slot_or_del(new /obj/item/clothing/mask/breath/vox(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/mask/breath(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_back)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
+8
View File
@@ -962,6 +962,14 @@ datum/preferences
var/datum/language/lang = all_languages[L]
if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))||(S && (L in S.secondary_langs))))
new_languages += lang
//Apparently there's some PHP script that needs to be updated in order to give people whitelist languages.
//This workaround should be removed once that has been properly updated
if (lang.name == "Siik'maas")
new_languages |= all_languages["Siik'tajr"]
if (lang.name == "Siik'tajr")
new_languages |= all_languages["Siik'maas"]
languages_available = 1
if(!(languages_available))
+1 -1
View File
@@ -24,7 +24,7 @@
name = "collectable chef's hat"
desc = "A rare Chef's Hat meant for hat collectors!"
icon_state = "chef"
item_state = "chef"
item_state = "chefhat"
/obj/item/clothing/head/collectable/paper
name = "collectable paper hat"
+1 -1
View File
@@ -4,7 +4,7 @@
name = "chef's hat"
desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work."
icon_state = "chef"
item_state = "chef"
item_state = "chefhat"
desc = "The commander in chef's head wear."
flags = FPRINT | TABLEPASS
siemens_coefficient = 0.9
+6 -19
View File
@@ -7,6 +7,11 @@
w_class = 2
gas_transfer_coefficient = 0.10
permeability_coefficient = 0.50
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/masks.dmi'
)
var/hanging = 0
verb/toggle()
@@ -35,22 +40,4 @@
name = "medical mask"
icon_state = "medical"
item_state = "medical"
permeability_coefficient = 0.01
/obj/item/clothing/mask/breath/vox
desc = "A weirdly-shaped breath mask."
name = "vox breath mask"
icon_state = "voxmask"
item_state = "voxmask"
permeability_coefficient = 0.01
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
"Vox Armalis" = 'icons/mob/species/armalis/mask.dmi'
)
toggle()
set category = "Object"
set name = "Adjust mask"
set src in usr
usr << "You can't really adjust this mask - it's moulded to your beak!"
permeability_coefficient = 0.01
+20
View File
@@ -224,6 +224,16 @@
icon_on = "redzippoon"
icon_off = "redzippo"
////////////////////////////// Vivallion - Isaac Jachym - Butterfly Lighter ////////////
/obj/item/weapon/lighter/zippo/fluff/isaac_jachym
name = "Butterfly lighter"
desc = "A custom-made zippo lighter, looks rather expensive. On one of it's sides, a clean inscription has been made, 'Butterfly, what is your wisdom?' And I looked down at it's majestic form, flexing it's wings as if to show it's strength. 'Fuck chechenya.' Had it whispered, before fluttering away, and so we went to war."
icon = 'icons/obj/custom_items.dmi'
icon_state = "che_zippo"
icon_on = "che_zippoon"
icon_off = "che_zippo"
/obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1 //rawrtaicho: Riley Rohtin
name = "Riley's black zippo"
desc = "A black zippo lighter, which holds some form of sentimental value."
@@ -1051,6 +1061,16 @@
name = "duty boots"
desc = "Eight-inch black leather boots with side zips and NT-approved safety toes."
////////////////////////////////////////// Vivallion - Kecer Eldraran - Toe-less Jackboots //////////////
/obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran
name = "Toe-less Jackboots"
desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws."
icon = 'icons/obj/custom_items.dmi'
item_state = "digiboots"
icon_state = "digiboots"
species_restricted = null
//////////// Sets ////////////
+2 -1
View File
@@ -48,7 +48,7 @@
for(var/datum/playingcard/P in H.cards)
cards += P
del(O)
user << "You place your cards on top of the deck."
user << "You place your cards on the bottom of the deck."
return
..()
@@ -57,6 +57,7 @@
set category = "Object"
set name = "Draw"
set desc = "Draw a card from a deck."
set src in oview(1)
if(usr.stat || !Adjacent(usr)) return
+31 -1
View File
@@ -1,6 +1,6 @@
// At minimum every mob has a hear_say proc.
/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(!client)
return
@@ -9,6 +9,12 @@
return
var/style = "body"
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
@@ -44,6 +50,9 @@
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear \him."
else
src << "<span class='game say'><span class='name'>[speaker_name]</span>[alt_name] [track][verb], <span class='message'><span class='[style]'>\"[message]\"</span></span></span>"
if (speech_sound)
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
src.playsound_local(source, speech_sound, sound_vol, 1)
/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
@@ -59,6 +68,11 @@
var/style = "body"
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if (language && (language.flags & NONVERBAL))
if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker,language))
if(istype(speaker,/mob/living/simple_animal))
var/mob/living/simple_animal/S = speaker
@@ -142,6 +156,22 @@
else
src << "[part_a][speaker_name][part_b][verb], <span class=\"[style]\">\"[message]\"</span></span></span>"
/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
if(!client)
return
if(say_understands(speaker, language))
message = "<B>[src]</B> [verb], \"[message]\""
else
message = "<B>[src]</B> [verb]."
if(src.status_flags & PASSEMOTES)
for(var/obj/item/weapon/holder/H in src.contents)
H.show_message(message)
for(var/mob/living/M in src.contents)
M.show_message(message)
src.show_message(message)
/mob/proc/hear_sleep(var/message)
var/heard = ""
if(prob(15))
+5
View File
@@ -6,6 +6,7 @@
var/name = "an unknown language" // Fluff name of language if any.
var/desc = "A language." // Short description for 'Check Languages'.
var/speech_verb = "says" // 'says', 'hisses', 'farts'.
var/signlang_verb = list() // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags
var/colour = "body" // CSS style to use for strings in this language.
var/key = "x" // Character used to speak in language eg. :o for Unathi.
var/flags = 0 // Various language flags.
@@ -33,6 +34,10 @@
speech_verb = "mrowls"
colour = "tajaran_signlang"
key = "y" //only "dfpqxyz" left.
//need to find a way to resolve possesive macros
signlang_verb = list("flicks their left ear", "flicks their right ear", "swivels their ears", "twitches their tail", "curls the end of their tail", "arches their tail", "wiggles the end of their tail", "waves their tail about", "holds up a claw", "gestures with their left hand", "gestures with their right hand", "gestures with their tail", "gestures with their ears")
flags = WHITELISTED | NONVERBAL
/datum/language/skrell
+10 -3
View File
@@ -1347,7 +1347,7 @@
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying)
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot leap in your current state."
return
@@ -1357,13 +1357,20 @@
choices += M
choices -= src
var/mob/living/T = input(src,"Who do you wish to leap at?") in null|choices
var/mob/living/T = input(src,"Who do you wish to leap at?") as null|anything in choices
if(!T || !src || src.stat) return
if(get_dist(get_turf(T), get_turf(src)) > 6) return
last_special = world.time + 100
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot leap in your current state."
return
last_special = world.time + 75
status_flags |= LEAPING
src.visible_message("<span class='warning'><b>\The [src]</b> leaps at [T]!</span>")
+7 -16
View File
@@ -121,23 +121,14 @@
else if(r_ear && istype(r_ear,/obj/item/device/radio))
r_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += r_ear
if(used_radios.len)
italics = 1
message_range = 1
var/datum/gas_mixture/environment = loc.return_air()
if(environment)
var/pressure = environment.return_pressure()
if(pressure < SAY_MINIMUM_PRESSURE)
italics = 1
message_range =1
var/sound/speech_sound
var/sound_vol
if((species.name == "Vox" || species.name == "Vox Armalis") && prob(20))
playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1)
..(message, speaking, verb, alt_name, italics, message_range, used_radios)
speech_sound = sound('sound/voice/shriek1.ogg')
sound_vol = 50
..(message, speaking, verb, alt_name, italics, message_range, used_radios, speech_sound, sound_vol) //ohgod we should really be passing a datum here.
/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null)
+49 -18
View File
@@ -81,14 +81,48 @@ var/list/department_radio_keys = list(
if(!istype(dongle)) return
if(dongle.translate_binary) return 1
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list())
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list(), var/sound/speech_sound, var/sound_vol)
var/turf/T = get_turf(src)
//handle nonverbal and sign languages here
if (speaking)
if (speaking.flags & NONVERBAL)
if (prob(30))
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
if (speaking.flags & SIGNLANG)
say_signlang(message, pick(speaking.signlang_verb), speaking)
return
//speaking into radios
if(used_radios.len)
italics = 1
message_range = 1
for(var/mob/living/M in hearers(5, src))
if(M != src)
M.show_message("<span class='notice'>[src] talks into [used_radios.len ? used_radios[1] : "the radio."]</span>")
if (speech_sound)
src.playsound_local(get_turf(src), speech_sound, sound_vol * 0.5, 1)
speech_sound = null //so we don't play it twice.
//make sure the air can transmit speech
var/datum/gas_mixture/environment = T.return_air()
if(environment)
var/pressure = environment.return_pressure()
if(pressure < SAY_MINIMUM_PRESSURE)
italics = 1
message_range = 1
if (speech_sound)
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
var/list/listening = list()
var/list/listening_obj = list()
if(T)
var/list/objects = list()
var/list/hear = hear(message_range, T)
var/list/hearturfs = list()
@@ -98,11 +132,11 @@ var/list/department_radio_keys = list(
listening += M
hearturfs += M.locs[1]
for(var/obj/O in M.contents)
objects |= O
listening_obj |= O
else if(istype(I, /obj/))
var/obj/O = I
hearturfs += O.locs[1]
objects |= O
listening_obj |= O
for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
@@ -111,28 +145,25 @@ var/list/department_radio_keys = list(
if(M.loc && M.locs[1] in hearturfs)
listening |= M
for(var/obj/O in objects)
spawn(0)
if(O) //It's possible that it could be deleted in the meantime.
O.hear_talk(src, message, verb, speaking)
var/speech_bubble_test = say_test(message)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"h[speech_bubble_test]")
spawn(30) del(speech_bubble)
if(used_radios.len)
for(var/mob/living/M in hearers(5, src))
if(M != src)
M.show_message("<span class='notice'>[src] talks into [used_radios.len ? used_radios[1] : "radio"]</span>")
for(var/mob/M in listening)
M << speech_bubble
M.hear_say(message,verb,speaking,alt_name, italics, src)
M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)
for(var/obj/O in listening_obj)
spawn(0)
if(O) //It's possible that it could be deleted in the meantime.
O.hear_talk(src, message, verb, speaking)
log_say("[name]/[key] : [message]")
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
for (var/mob/O in viewers(src, null))
O.hear_signlang(message, verb, language, src)
/obj/effect/speech_bubble
var/mob/parent
@@ -35,6 +35,10 @@
// Gain Power
adjustOxyLoss(-1)
// Handle EMP-stun
if(stunned)
AdjustStunned(-1)
//stage = 1
//if (istype(src, /mob/living/silicon/ai)) // Are we not sure what we are?
var/blind = 0
-4
View File
@@ -92,10 +92,6 @@
//Language check.
for(var/datum/language/L in src.languages)
if(speaking.name == L.name)
if (L.flags & NONVERBAL)
if ((src.sdisabilities & BLIND || src.blinded || src.stat) || !(other in view(src)))
return 0
return 1
return 0
+4
View File
@@ -133,6 +133,10 @@
var/mode = 1
sprite_sheets = list(
"Vox Armalis" = 'icons/mob/species/armalis/held.dmi'
)
/obj/item/weapon/gun/energy/noisecannon/attack_hand(mob/user as mob)
if(loc != user)
var/mob/living/carbon/human/H = user
+1 -1
View File
@@ -261,7 +261,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
files.UpdateTech(T, temp_tech[T])
if(linked_destroy.loaded_item.reliability < 100 && linked_destroy.loaded_item.crit_fail)
files.UpdateDesign(linked_destroy.loaded_item.type)
if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any.
if(linked_lathe && linked_destroy.loaded_item.matter) //Also sends salvaged materials to a linked protolathe, if any.
linked_lathe.m_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.matter["metal"]*linked_destroy.decon_mod))
linked_lathe.g_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.matter["glass"]*linked_destroy.decon_mod))
linked_destroy.loaded_item = null
+11 -9
View File
@@ -38,8 +38,8 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
var/obj/machinery/computer/shuttle_control/emergency/C = user
if (!C.has_authorization())
return
if (emergency_shuttle.waiting_to_leave() && !C.has_authorization())
return //need authorization to launch early
if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0
@@ -52,8 +52,8 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
var/obj/machinery/computer/shuttle_control/emergency/C = user
if (!C.has_authorization())
return
if (emergency_shuttle.waiting_to_leave() && !C.has_authorization())
return //need authorization to launch early
if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0
@@ -66,7 +66,7 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
var/obj/machinery/computer/shuttle_control/emergency/C = user
if (!C.has_authorization())
if (emergency_shuttle.waiting_to_leave() && !C.has_authorization())
return
if (emergency_shuttle.autopilot)
@@ -186,9 +186,9 @@
"has_docking" = shuttle.docking_controller? 1 : 0,
"docking_status" = shuttle.docking_controller? shuttle.docking_controller.get_docking_status() : null,
"docking_override" = shuttle.docking_controller? shuttle.docking_controller.override_enabled : null,
"can_launch" = shuttle.can_launch() && has_auth,
"can_cancel" = shuttle.can_cancel() && has_auth,
"can_force" = shuttle.can_force() && has_auth,
"can_launch" = shuttle.can_launch() && (!emergency_shuttle.waiting_to_leave() || has_auth),
"can_cancel" = shuttle.can_cancel() && (!emergency_shuttle.waiting_to_leave() || has_auth),
"can_force" = shuttle.can_force() && (!emergency_shuttle.waiting_to_leave() || has_auth),
"auth_list" = auth_list,
"has_auth" = has_auth,
"user" = debug? user : null,
@@ -235,7 +235,9 @@
return ..()
/datum/shuttle/ferry/escape_pod/can_force()
return 0
if (arming_controller.eject_time && world.time < arming_controller.eject_time + 50)
return 0 //dont allow force launching until 5 seconds after the arming controller has reached it's countdown
return ..()
/datum/shuttle/ferry/escape_pod/can_cancel()
return 0
+1
View File
@@ -125,6 +125,7 @@
moving_status = SHUTTLE_IDLE
process_state = WAIT_FINISH
in_use = null
if (docking_controller && !docking_controller.undocked())
docking_controller.force_undock()
+2 -1
View File
@@ -746,7 +746,8 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
//Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
#define RESTRICTED 2 // Language can only be accquired by spawning or an admin.
#define NONVERBAL 4 // Language has a significant non-verbal component.
#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight
#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand.
//Flags for zone sleeping
#define ZONE_ACTIVE 1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 58 KiB

+315 -215
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,101 @@
<div class="item" style="padding-top: 10px">
<div class="item">
<div class="itemLabel">
Docking Port Status:
</div>
<div class="itemContent">
{{if docking_status == "docked"}}
{{if !override_enabled}}
<span class="good">DOCKED</span>
{{else}}
<span class="bad">DOCKED-OVERRIDE ENABLED</span>
{{/if}}
{{else docking_status == "docking"}}
{{if !override_enabled}}
<span class="average">DOCKING</span>
{{else}}
<span class="bad">DOCKING-OVERRIDE ENABLED</span>
{{/if}}
{{else docking_status == "undocking"}}
{{if !override_enabled}}
<span class="average">UNDOCKING</span>
{{else}}
<span class="bad">UNDOCKING-OVERRIDE ENABLED</span>
{{/if}}
{{else docking_status == "undocked"}}
{{if !override_enabled}}
<span class="idle">NOT IN USE</span>
{{else}}
<span class="bad" style="float:left">OVERRIDE ENABLED</span>
{{/if}}
{{else}}
<span class="bad">ERROR</span>
{{/if}}
</div>
</div>
</div>
<div class="item" style="padding-top: 10px">
<div class="item">
<div class="itemLabel">
Docking Hatch:
</div>
<div class="itemContent">
{{if docking_status == "docked"}}
{{if door_state == "open"}}
<span class="good">OPEN</span>
{{else door_state == "closed"}}
<span class="good">CLOSED</span>
{{else}}
<span class="bad">ERROR</span>
{{/if}}
{{else docking_status == "docking"}}
{{if door_state == "open"}}
<span class="good">OPEN</span>
{{else door_state == "closed" && door_lock == "locked"}}
<span class="good">SECURED</span>
{{else door_state == "closed" && door_lock == "unlocked"}}
<span class="good">UNSECURED</span>
{{else}}
<span class="bad">ERROR</span>
{{/if}}
{{else docking_status == "undocking"}}
{{if door_state == "open"}}
<span class="average">OPEN</span>
{{else door_state == "closed" && door_lock == "locked"}}
<span class="good">SECURED</span>
{{else door_state == "closed" && door_lock == "unlocked"}}
<span class="average">UNSECURED</span>
{{else}}
<span class="bad">ERROR</span>
{{/if}}
{{else docking_status == "undocked"}}
{{if door_state == "open"}}
<span class="bad">OPEN</span>
{{else door_state == "closed" && door_lock == "locked"}}
<span class="good">SECURED</span>
{{else door_state == "closed" && door_lock == "unlocked"}}
<span class="bad">UNSECURED</span>
{{else}}
<span class="bad">ERROR</span>
{{/if}}
{{else}}
<span class="bad">ERROR</span>
{{/if}}
</div>
</div>
</div>
<div class="item" style="padding-top: 10px">
<div class="item">
<div class="itemContent" style="padding-top: 2px; width: 100%">
{{if docking_status == "docked"}}
{{:~link('Force exterior door', 'alert', {'command' : 'force_door'}, override_enabled ? null : 'disabled', null)}}
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, override_enabled ? 'redBackground' : null)}}
{{:~link('MANUAL EJECT', 'alert', {'command' : 'toggle_override'}, 'disabled', null)}}
{{else}}
{{:~link('Force exterior door', 'alert', {'command' : 'force_door'}, override_enabled ? null : 'disabled', override_enabled? 'redBackground' : null)}}
{{:~link('Override', 'alert', {'command' : 'toggle_override'}, null, override_enabled ? 'redBackground' : 'yellowBackground')}}
{{:~link('MANUAL EJECT', 'alert', {'command' : 'toggle_override'}, can_force ? null : 'disabled', can_force ? 'redBackground' : null)}}
{{/if}}
</div>
</div>
</div>
Binary file not shown.