initial commit - game folder + maps + dme

This commit is contained in:
deathride58
2018-01-03 22:52:38 -05:00
parent fb555e5680
commit d8facb3bce
230 changed files with 20742 additions and 14130 deletions
+1
View File
@@ -78,6 +78,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
QDEL_NULL(ghost_appearance)
/datum/atom_hud/alternate_appearance/basic/add_to_hud(atom/A)
LAZYINITLIST(A.hud_list)
A.hud_list[appearance_key] = theImage
. = ..()
+1 -1
View File
@@ -28,4 +28,4 @@
for(var/X in motioncameras)
var/obj/machinery/camera/cam = X
cam.lostTargetRef(WEAKREF(O))
return
return
+1 -1
View File
@@ -123,4 +123,4 @@
/area/holodeck/rec_center/thunderdome1218
name = "Holodeck - 1218 AD"
restricted = 1
restricted = 1
+36 -1
View File
@@ -32,9 +32,44 @@
/area/ruin/powered/seedvault
icon_state = "dk_yellow"
/area/ruin/powered/syndicate_lava_base
/area/ruin/unpowered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
ambientsounds = HIGHSEC
/area/ruin/unpowered/syndicate_lava_base/engineering
name = "Syndicate Lavaland Engineering"
/area/ruin/unpowered/syndicate_lava_base/medbay
name = "Syndicate Lavaland Medbay"
/area/ruin/unpowered/syndicate_lava_base/arrivals
name = "Syndicate Lavaland Arrivals"
/area/ruin/unpowered/syndicate_lava_base/bar
name = "Syndicate Lavaland Bar"
/area/ruin/unpowered/syndicate_lava_base/main
name = "Syndicate Lavaland Primary Hallway"
/area/ruin/unpowered/syndicate_lava_base/cargo
name = "Syndicate Lavaland Cargo Bay"
/area/ruin/unpowered/syndicate_lava_base/chemistry
name = "Syndicate Lavaland Chemistry"
/area/ruin/unpowered/syndicate_lava_base/virology
name = "Syndicate Lavaland Virology"
/area/ruin/unpowered/syndicate_lava_base/testlab
name = "Syndicate Lavaland Experimentation Lab"
/area/ruin/unpowered/syndicate_lava_base/dormitories
name = "Syndicate Lavaland Dormitories"
/area/ruin/unpowered/syndicate_lava_base/telecomms
name = "Syndicate Lavaland Telecommunications"
//Xeno Nest
+1 -33
View File
@@ -132,44 +132,12 @@
if (orbiting)
orbiting.Check()
if(flags_1 & CLEAN_ON_MOVE_1)
clean_on_move()
var/datum/proximity_monitor/proximity_monitor = src.proximity_monitor
if(proximity_monitor)
proximity_monitor.HandleMove()
return 1
/atom/movable/proc/clean_on_move()
var/turf/tile = loc
if(isturf(tile))
tile.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
for(var/A in tile)
if(is_cleanable(A))
qdel(A)
else if(istype(A, /obj/item))
var/obj/item/cleaned_item = A
cleaned_item.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
else if(ishuman(A))
var/mob/living/carbon/human/cleaned_human = A
if(cleaned_human.lying)
if(cleaned_human.head)
cleaned_human.head.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
cleaned_human.update_inv_head()
if(cleaned_human.wear_suit)
cleaned_human.wear_suit.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
cleaned_human.update_inv_wear_suit()
else if(cleaned_human.w_uniform)
cleaned_human.w_uniform.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
cleaned_human.update_inv_w_uniform()
if(cleaned_human.shoes)
cleaned_human.shoes.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
cleaned_human.update_inv_shoes()
cleaned_human.clean_blood()
cleaned_human.wash_cream()
to_chat(cleaned_human, "<span class='danger'>[src] cleans your face!</span>")
/atom/movable/Destroy(force)
var/inform_admins = (flags_2 & INFORM_ADMINS_ON_RELOCATE_2)
var/stationloving = (flags_2 & STATIONLOVING_2)
@@ -712,4 +680,4 @@
return FALSE
if(anchored || throwing)
return FALSE
return TRUE
return TRUE
+43 -153
View File
@@ -86,109 +86,55 @@ GLOBAL_LIST_EMPTY(all_radios)
for(var/freq in GLOB.all_radios)
GLOB.all_radios["[freq]"] -= radio
/*
Frequency range: 1200 to 1600
Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency, even during mapmaking)
Radio:
1459 - standard radio chat
1351 - Science
1353 - Command
1355 - Medical
1357 - Engineering
1359 - Security
1337 - death squad
1443 - Confession Intercom
1349 - Miners
1347 - Cargo techs
1447 - AI Private
Devices:
1451 - tracking implant
1457 - RSD default
On the map:
1311 for prison shuttle console (in fact, it is not used)
1435 for status displays
1437 for atmospherics/fire alerts
1439 for engine components
1439 for air pumps, air scrubbers, atmo control
1441 for atmospherics - supply tanks
1443 for atmospherics - distribution loop/mixed air tank
1445 for bot nav beacons
1447 for mulebot, secbot and ed209 control
1449 for airlock controls, electropack, magnets
1451 for toxin lab access
1453 for engineering access
1455 for AI access
*/
// For information on what objects or departments use what frequencies,
// see __DEFINES/radio.dm. Mappers may also select additional frequencies for
// use in maps, such as in intercoms.
GLOBAL_LIST_INIT(radiochannels, list(
"Common" = 1459,
"Science" = 1351,
"Command" = 1353,
"Medical" = 1355,
"Engineering" = 1357,
"Security" = 1359,
"CentCom" = 1337,
"Syndicate" = 1213,
"Supply" = 1347,
"Service" = 1349,
"AI Private" = 1447,
"Red Team" = 1215,
"Blue Team" = 1217
"Common" = FREQ_COMMON,
"Science" = FREQ_SCIENCE,
"Command" = FREQ_COMMAND,
"Medical" = FREQ_MEDICAL,
"Engineering" = FREQ_ENGINEERING,
"Security" = FREQ_SECURITY,
"CentCom" = FREQ_CENTCOM,
"Syndicate" = FREQ_SYNDICATE,
"Supply" = FREQ_SUPPLY,
"Service" = FREQ_SERVICE,
"AI Private" = FREQ_AI_PRIVATE,
"Red Team" = FREQ_CTF_RED,
"Blue Team" = FREQ_CTF_BLUE
))
GLOBAL_LIST_INIT(reverseradiochannels, list(
"1459" = "Common",
"1351" = "Science",
"1353" = "Command",
"1355" = "Medical",
"1357" = "Engineering",
"1359" = "Security",
"1337" = "CentCom",
"1213" = "Syndicate",
"1347" = "Supply",
"1349" = "Service",
"1447" = "AI Private",
"1215" = "Red Team",
"1217" = "Blue Team"
"[FREQ_COMMON]" = "Common",
"[FREQ_SCIENCE]" = "Science",
"[FREQ_COMMAND]" = "Command",
"[FREQ_MEDICAL]" = "Medical",
"[FREQ_ENGINEERING]" = "Engineering",
"[FREQ_SECURITY]" = "Security",
"[FREQ_CENTCOM]" = "CentCom",
"[FREQ_SYNDICATE]" = "Syndicate",
"[FREQ_SUPPLY]" = "Supply",
"[FREQ_SERVICE]" = "Service",
"[FREQ_AI_PRIVATE]" = "AI Private",
"[FREQ_CTF_RED]" = "Red Team",
"[FREQ_CTF_BLUE]" = "Blue Team"
))
//depenging helpers
GLOBAL_VAR_CONST(SYND_FREQ, 1213) //nuke op frequency, coloured dark brown in chat window
GLOBAL_VAR_CONST(SUPP_FREQ, 1347) //supply, coloured light brown in chat window
GLOBAL_VAR_CONST(SERV_FREQ, 1349) //service, coloured green in chat window
GLOBAL_VAR_CONST(SCI_FREQ, 1351) //science, coloured plum in chat window
GLOBAL_VAR_CONST(COMM_FREQ, 1353) //command, colored gold in chat window
GLOBAL_VAR_CONST(MED_FREQ, 1355) //medical, coloured blue in chat window
GLOBAL_VAR_CONST(ENG_FREQ, 1357) //engineering, coloured orange in chat window
GLOBAL_VAR_CONST(SEC_FREQ, 1359) //security, coloured red in chat window
GLOBAL_VAR_CONST(CENTCOM_FREQ, 1337) //centcom frequency, coloured grey in chat window
GLOBAL_VAR_CONST(AIPRIV_FREQ, 1447) //AI private, colored magenta in chat window
GLOBAL_VAR_CONST(REDTEAM_FREQ, 1215) // red team (CTF) frequency, coloured red
GLOBAL_VAR_CONST(BLUETEAM_FREQ, 1217) // blue team (CTF) frequency, coloured blue
#define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1
/* filters */
GLOBAL_VAR_INIT(RADIO_TO_AIRALARM, "1")
GLOBAL_VAR_INIT(RADIO_FROM_AIRALARM, "2")
GLOBAL_VAR_INIT(RADIO_CHAT, "3") //deprecated
GLOBAL_VAR_INIT(RADIO_ATMOSIA, "4")
GLOBAL_VAR_INIT(RADIO_NAVBEACONS, "5")
GLOBAL_VAR_INIT(RADIO_AIRLOCK, "6")
GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
/datum/radio_frequency
var/frequency as num
var/list/list/obj/devices = list()
/datum/radio_frequency/New(freq)
frequency = freq
//If range > 0, only post to devices on the same z_level and within range
//Use range = -1, to restrain to the same z_level without limiting range
/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, filter = null as text|null, range = null as num|null)
// Ensure the signal's data is fully filled
signal.source = source
signal.frequency = frequency
//Apply filter to the signal. If none supply, broadcast to every devices
//_default channel is always checked
@@ -217,7 +163,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
continue
if(start_point.z != end_point.z || (range > 0 && get_dist(start_point, end_point) > range))
continue
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
device.receive_signal(signal)
/datum/radio_frequency/proc/add_listener(obj/device, filter as text|null)
if (!filter)
@@ -225,8 +171,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
var/list/devices_line = devices[filter]
if(!devices_line)
devices_line = list()
devices[filter] = devices_line
devices[filter] = devices_line = list()
devices_line += device
@@ -240,70 +185,15 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
devices -= devices_filter
/client/proc/print_pointers()
set name = "Debug Signals"
set category = "Debug"
if(!holder)
return
var/datum/signal/S
to_chat(src, "There are [S.pointers.len] pointers:")
for(var/p in S.pointers)
to_chat(src, p)
S = locate(p)
if(istype(S))
to_chat(src, S.debug_print())
/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
/obj/proc/receive_signal(datum/signal/signal)
return
/datum/signal
var/obj/source
var/transmission_method = 0
//0 = wire
//1 = radio transmission
//2 = subspace transmission
var/data = list()
var/encryption
var/frequency = 0
var/static/list/pointers = list()
var/transmission_method
var/list/data
/datum/signal/New()
..()
pointers += "[REF(src)]"
/datum/signal/Destroy()
pointers -= "[REF(src)]"
return ..()
/datum/signal/proc/copy_from(datum/signal/model)
source = model.source
transmission_method = model.transmission_method
data = model.data
encryption = model.encryption
frequency = model.frequency
/datum/signal/proc/debug_print()
if (source)
. = "signal = {source = '[source]' [COORD(source)]\n"
else
. = "signal = {source = '[source]' ()\n"
for (var/i in data)
. += "data\[\"[i]\"\] = \"[data[i]]\"\n"
if(islist(data[i]))
var/list/L = data[i]
for(var/t in L)
. += "data\[\"[i]\"\] list has: [t]"
/datum/signal/proc/sanitize_data()
for(var/d in data)
var/val = data[d]
if(istext(val))
data[d] = html_encode(val)
/datum/signal/New(data, transmission_method = TRANSMISSION_RADIO)
src.data = data || list()
src.transmission_method = transmission_method
+3 -1
View File
@@ -48,4 +48,6 @@
newhud.join_hud(current)
/datum/mind/proc/leave_all_antag_huds()
for(var/datum/atom_hud/antag/hud in GLOB.huds)
for(var/datum/atom_hud/antag/hud in GLOB.huds)
if(hud.hudusers[current])
hud.leave_hud(current)
+6 -6
View File
@@ -125,7 +125,7 @@
return
used = TRUE
var/mob/dead/observer/theghost = pick(nuke_candidates)
spawn_antag(theghost.client, get_turf(src), "syndieborg")
spawn_antag(theghost.client, get_turf(src), "syndieborg", user.mind)
do_sparks(4, TRUE, src)
qdel(src)
else
@@ -219,7 +219,7 @@
return
used = 1
var/mob/dead/observer/theghost = pick(demon_candidates)
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name))
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name),user.mind)
to_chat(user, shatter_msg)
to_chat(user, veil_msg)
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
@@ -237,15 +237,15 @@
S.mind.special_role = S.name
SSticker.mode.traitors += S.mind
var/datum/objective/assassinate/new_objective
if(usr)
if(user)
new_objective = new /datum/objective/assassinate
new_objective.owner = S.mind
new_objective.target = usr.mind
new_objective.explanation_text = "[objective_verb] [usr.real_name], the one who summoned you."
new_objective.target = user
new_objective.explanation_text = "[objective_verb] [user.name], the one who summoned you."
S.mind.objectives += new_objective
var/datum/objective/new_objective2 = new /datum/objective
new_objective2.owner = S.mind
new_objective2.explanation_text = "[objective_verb] everyone[usr ? " else while you're at it":""]."
new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]."
S.mind.objectives += new_objective2
S.mind.add_antag_datum(/datum/antagonist/auto_custom)
to_chat(S, S.playstyle_string)
+1 -1
View File
@@ -30,4 +30,4 @@
name = initial(name)
desc = initial(desc)
atmosblock = TRUE
air_update_turf(1)
air_update_turf(1)
+3 -3
View File
@@ -59,7 +59,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
/mob/camera/blob/proc/validate_location()
var/turf/T = get_turf(src)
var/area/A = get_area(T)
if(((A && !A.blob_allowed) || !T || !(T.z in GLOB.station_z_levels)) && LAZYLEN(GLOB.blobstart))
if(((A && !A.blob_allowed) || !T || !is_station_level(T.z)) && LAZYLEN(GLOB.blobstart))
T = get_turf(pick(GLOB.blobstart))
if(!T)
CRASH("No blobspawnpoints and blob spawned in nullspace.")
@@ -83,7 +83,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
max_blob_points = INFINITY
blob_points = INFINITY
addtimer(CALLBACK(src, .proc/victory), 450)
if(!victory_in_progress && max_count < blobs_legit.len)
max_count = blobs_legit.len
..()
@@ -95,7 +95,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
for(var/i in GLOB.mob_living_list)
var/mob/living/L = i
var/turf/T = get_turf(L)
if(!T || !(T.z in GLOB.station_z_levels))
if(!T || !is_station_level(T.z))
continue
if(L in GLOB.overminds || (L.pass_flags & PASSBLOB))
+1 -1
View File
@@ -348,4 +348,4 @@
icon_state = "blob"
name = "blob"
desc = "A thick wall of writhing tendrils."
brute_resist = 0.25
brute_resist = 0.25
@@ -10,17 +10,6 @@
/obj/effect/proc_holder/changeling/panacea/sting_action(mob/user)
to_chat(user, "<span class='notice'>We cleanse impurities from our form.</span>")
var/mob/living/simple_animal/borer/B = user.has_brain_worms()
if(B)
if(B.controlling)
B.detatch()
B.leave_victim()
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(0, toxic = TRUE)
to_chat(user, "<span class='notice'>A parasite exits our form.</span>")
var/list/bad_organs = list(
user.getorgan(/obj/item/organ/body_egg),
user.getorgan(/obj/item/organ/zombie_infection))
@@ -209,7 +209,7 @@
/obj/effect/proc_holder/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target)
add_logs(user, target, "stung", "blind sting")
to_chat(target, "<span class='danger'>Your eyes burn horrifically!</span>")
target.become_nearsighted()
target.become_nearsighted(EYE_DAMAGE)
target.blind_eyes(20)
target.blur_eyes(40)
return TRUE
+1 -1
View File
@@ -196,7 +196,7 @@ Credit where due:
/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
return main_clockcult.check_clockwork_victory()
/datum/game_mode/clock_cult/set_round_result()
/datum/game_mode/clockwork_cult/set_round_result()
..()
if(GLOB.clockwork_gateway_activated)
SSticker.news_report = CLOCK_SUMMON
@@ -98,12 +98,12 @@
if(severity == 1 && uses)
uses = 0
visible_message("<span class='warning'>[src] is disrupted!</span>")
animate(src, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW)
animate(src, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
deltimer(timerid)
timerid = QDEL_IN(src, 10)
linked_gateway.uses = 0
linked_gateway.visible_message("<span class='warning'>[linked_gateway] is disrupted!</span>")
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW)
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
deltimer(linked_gateway.timerid)
linked_gateway.timerid = QDEL_IN(linked_gateway, 10)
return TRUE
@@ -144,13 +144,13 @@
uses = max(0, uses - 1)
linked_gateway.uses = max(0, linked_gateway.uses - 1)
if(!uses)
animate(src, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW)
animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW)
animate(src, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW)
animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW)
density = FALSE
linked_gateway.density = FALSE
else
animate(src, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW)
animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW)
animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
addtimer(CALLBACK(src, .proc/check_uses), 10)
return TRUE
@@ -132,7 +132,7 @@
var/doortype = /obj/machinery/door/airlock/clockwork
if(glass)
doortype = /obj/machinery/door/airlock/clockwork/brass
return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir)
return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir, "transfer_name" = TRUE)
/obj/machinery/door/airlock/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
return FALSE
@@ -188,7 +188,7 @@
//Windoor conversion
/obj/machinery/door/window/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE)
return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE, "transfer_name" = TRUE)
/obj/machinery/door/window/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
return FALSE
@@ -86,6 +86,7 @@
construct_type = /mob/living/simple_animal/drone/cogscarab
w_class = WEIGHT_CLASS_SMALL
var/infinite_resources = TRUE
var/static/obj/item/seasonal_hat //Share it with all other scarabs, since we're from the same cult!
/obj/item/clockwork/construct_chassis/cogscarab/Initialize()
. = ..()
@@ -96,6 +97,12 @@
if(infinite_resources)
//During rounds where they can't interact with the station, let them experiment with builds
construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar
if(!seasonal_hat)
var/obj/item/drone_shell/D = locate() in GLOB.poi_list
if(D && D.possible_seasonal_hats.len)
seasonal_hat = pick(D.possible_seasonal_hats)
else
seasonal_hat = "none"
/obj/item/clockwork/construct_chassis/cogscarab/post_spawn(mob/living/construct)
if(infinite_resources) //Allow them to build stuff and recite scripture
@@ -104,3 +111,6 @@
F.uses_power = FALSE
for(var/obj/item/clockwork/slab/S in cached_stuff)
S.no_cost = TRUE
if(seasonal_hat && seasonal_hat != "none")
var/obj/item/hat = new seasonal_hat(construct)
construct.equip_to_slot_or_del(hat, slot_head)
@@ -144,10 +144,14 @@
else
if(new_thing_type)
if(fabrication_values["dir_in_new"])
new new_thing_type(get_turf(target), fabrication_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
var/atom/A = new new_thing_type(get_turf(target), fabrication_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
if(fabrication_values["transfer_name"])
A.name = target.name
else
var/atom/A = new new_thing_type(get_turf(target))
A.setDir(fabrication_values["spawn_dir"])
if(fabrication_values["transfer_name"])
A.name = target.name
if(!fabrication_values["no_target_deletion"]) //for some cases where fabrication_vals() modifies the object but doesn't want it deleted
qdel(target)
adjust_clockwork_power(-fabrication_values["power_cost"])
@@ -51,7 +51,7 @@
to_chat(victim, "<span class='heavy_brass'>\"It looks like Nar-Sie's dogs really don't value their eyes.\"</span>")
to_chat(victim, "<span class='userdanger'>Your eyes explode with horrific pain!</span>")
victim.emote("scream")
victim.become_blind()
victim.become_blind(EYE_DAMAGE)
victim.adjust_blurriness(30)
victim.adjust_blindness(30)
return TRUE
@@ -142,8 +142,8 @@
apply_eye_damage(H)
else
if(GLOB.ratvar_awakens)
H.cure_nearsighted()
H.cure_blind()
H.cure_nearsighted(list(EYE_DAMAGE))
H.cure_blind(list(EYE_DAMAGE))
H.adjust_eye_damage(-eye_damage_done)
eye_damage_done = 0
else if(prob(50) && eye_damage_done)
@@ -166,5 +166,7 @@
if(eye_damage_done >= blind_breakpoint)
if(!H.has_disability(DISABILITY_BLIND))
to_chat(H, "<span class='nzcrentr_large'>A piercing white light floods your vision. Suddenly, all goes dark!</span>")
H.become_blind(EYE_DAMAGE)
if(prob(min(20, 5 + eye_damage_done)))
to_chat(H, "<span class='nzcrentr_small'><i>Your eyes continue to burn.</i></span>")
@@ -1,3 +1,7 @@
//Helper proc to get an Eminence mob if it exists
/proc/get_eminence()
return locate(/mob/camera/eminence) in servants_and_ghosts()
//The Eminence is a unique mob that functions like the leader of the cult. It's incorporeal but can interact with the world in several ways.
/mob/camera/eminence
name = "\the Emininence"
@@ -12,6 +16,7 @@
layer = FLY_LAYER
faction = list("ratvar")
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
var/turf/last_failed_turf
var/static/superheated_walls = 0
/mob/camera/eminence/CanPass(atom/movable/mover, turf/target)
@@ -20,25 +25,38 @@
/mob/camera/eminence/Move(NewLoc, direct)
var/OldLoc = loc
if(NewLoc && !istype(NewLoc, /turf/open/indestructible/reebe_void))
forceMove(get_turf(NewLoc))
var/turf/T = get_turf(NewLoc)
if(T.flags_1 & NOJAUNT_1)
if(last_failed_turf != T)
T.visible_message("<span class='warning'>[T] suddenly emits a ringing sound!</span>", ignore_mob = src)
playsound(T, 'sound/machines/clockcult/ark_damage.ogg', 75, FALSE)
last_failed_turf = T
to_chat(src, "<span class='warning'>This turf is consecrated and can't be crossed!</span>")
return
if(!GLOB.ratvar_awakens && istype(get_area(T), /area/chapel))
to_chat(src, "<span class='warning'>The Chapel is hallowed ground under a heretical deity, and can't be accessed!</span>")
return
forceMove(T)
Moved(OldLoc, direct)
if(GLOB.ratvar_awakens)
for(var/turf/T in range(5, src))
if(prob(166 - (get_dist(src, T) * 33)))
T.ratvar_act() //Causes moving to leave a swath of proselytized area behind the Eminence
/mob/camera/eminence/Process_Spacemove(movement_dir = 0)
return TRUE
/mob/camera/eminence/Login()
..()
add_servant_of_ratvar(src, TRUE)
var/datum/antagonist/clockcult/C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE)
if(!C)
add_servant_of_ratvar(src, TRUE)
C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE)
if(C && C.clock_team)
if(C.clock_team.eminence)
remove_servant_of_ratvar(src,TRUE)
qdel(src)
else
C.clock_team.eminence = src
if(C && C.clock_team)
if(C.clock_team.eminence && C.clock_team.eminence != src)
remove_servant_of_ratvar(src,TRUE)
qdel(src)
return
else
C.clock_team.eminence = src
to_chat(src, "<span class='bold large_brass'>You have been selected as the Eminence!</span>")
to_chat(src, "<span class='brass'>As the Eminence, you lead the servants. Anything you say will be heard by the entire cult.</span>")
to_chat(src, "<span class='brass'>Though you can move through walls, you're also incorporeal, and largely can't interact with the world except for a few ways.</span>")
@@ -53,6 +71,12 @@
E.Grant(src)
/mob/camera/eminence/say(message)
if(client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot send IC messages (muted).")
return
if(client.handle_spam_prevention(message,MUTE_IC))
return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(!message)
return
@@ -60,7 +84,13 @@
if(GLOB.ratvar_awakens)
visible_message("<span class='brass'><b>You feel light slam into your mind and form words:</b> \"[capitalize(message)]\"</span>")
playsound(src, 'sound/machines/clockcult/ark_scream.ogg', 50, FALSE)
hierophant_message("<span class='large_brass'><b>The Eminence:</b> \"[message]\"</span>")
message = "<span class='big brass'><b>The [GLOB.ratvar_awakens ? "Radiance" : "Eminence"]:</b> \"[message]\"</span>"
for(var/mob/M in servants_and_ghosts())
if(isobserver(M))
var/link = FOLLOW_LINK(M, src)
to_chat(M, "[link] [message]")
else
to_chat(M, message)
/mob/camera/eminence/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
if(is_reebe(z) || is_servant_of_ratvar(speaker) || GLOB.ratvar_approaches || GLOB.ratvar_awakens) //Away from Reebe, the Eminence can't hear anything
@@ -21,7 +21,7 @@
loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor)
light_range = 2
light_power = 1.1
playstyle_string = "<b><span class='neovgre'>You are a clockwork marauder,</span> a well-rounded frontline construct of Ratvar. Although you have no \
playstyle_string = "<span class='big bold'><span class='neovgre'>You are a clockwork marauder,</span></span><b> a well-rounded frontline construct of Ratvar. Although you have no \
unique abilities, you're a fearsome fighter in one-on-one combat, and your shield protects from projectiles!<br><br>Obey the Servants and do as they \
tell you. Your primary goal is to defend the Ark from destruction; they are your allies in this, and should be protected from harm.</b>"
empower_string = "<span class='neovgre'>The Anima Bulwark's power flows through you! Your weapon will strike harder, your armor is sturdier, and your shield is more durable.</span>"
@@ -113,7 +113,7 @@
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/mass_recall()
for(var/V in SSticker.mode.servants_of_ratvar)
var/datum/mind/M = V
if(!M.current.stat)
if(M.current.stat != DEAD)
M.current.forceMove(get_turf(src))
M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
M.current.clear_fullscreen("flash", 5)
@@ -38,7 +38,6 @@
/obj/structure/destructible/clockwork/eminence_spire/attack_ghost(mob/user)
if(!IsAdminGhost(user))
return
var/datum/antagonist/clockcult/random_cultist = locate() in GLOB.antagonists //if theres no cultists new team without eminence will be created anyway.
if(random_cultist && random_cultist.clock_team && random_cultist.clock_team.eminence)
to_chat(user, "<span class='warning'>There's already an Eminence - too late!</span>")
+6 -6
View File
@@ -163,7 +163,7 @@
/obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters)
. = ..()
if(dash_toggled && jaunt.IsAvailable())
if(dash_toggled)
jaunt.Teleport(user, target)
return
if(!proximity)
@@ -577,21 +577,21 @@
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
return
if(!cultist_to_receive)
to_chat(user, "<span class='cultitalic'>You require a destination!</span>")
to_chat(user, "<span class='cult italic'>You require a destination!</span>")
log_game("Void torch failed - no target")
return
if(cultist_to_receive.stat == DEAD)
to_chat(user, "<span class='cultitalic'>[cultist_to_receive] has died!</span>")
to_chat(user, "<span class='cult italic'>[cultist_to_receive] has died!</span>")
log_game("Void torch failed - target died")
return
if(!iscultist(cultist_to_receive))
to_chat(user, "<span class='cultitalic'>[cultist_to_receive] is not a follower of the Geometer!</span>")
to_chat(user, "<span class='cult italic'>[cultist_to_receive] is not a follower of the Geometer!</span>")
log_game("Void torch failed - target was deconverted")
return
if(A in user.GetAllContents())
to_chat(user, "<span class='cultitalic'>[A] must be on a surface in order to teleport it!</span>")
to_chat(user, "<span class='cult italic'>[A] must be on a surface in order to teleport it!</span>")
return
to_chat(user, "<span class='cultitalic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!")
to_chat(user, "<span class='cult italic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!")
cultist_to_receive.put_in_hands(A)
charges--
to_chat(user, "\The [src] now has [charges] charge\s.")
+13 -17
View File
@@ -10,7 +10,7 @@
..()
to_chat(user, "<span class='notice'>\The [src] is [anchored ? "":"not "]secured to the floor.</span>")
if((iscultist(user) || isobserver(user)) && cooldowntime > world.time)
to_chat(user, "<span class='cultitalic'>The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
to_chat(user, "<span class='cult italic'>The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
/obj/structure/destructible/cult/examine_status(mob/user)
if(iscultist(user) || isobserver(user))
@@ -62,10 +62,10 @@
to_chat(user, "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>")
return
if(!anchored)
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
to_chat(user, "<span class='cult italic'>You need to anchor [src] to the floor with a tome first.</span>")
return
if(cooldowntime > world.time)
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water")
var/pickedtype
@@ -79,7 +79,7 @@
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with an [N]!</span>")
to_chat(user, "<span class='cult italic'>You kneel before the altar and your faith is rewarded with an [N]!</span>")
/obj/structure/destructible/cult/forge
@@ -95,15 +95,14 @@
to_chat(user, "<span class='warning'>The heat radiating from [src] pushes you back.</span>")
return
if(!anchored)
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
to_chat(user, "<span class='cult italic'>You need to anchor [src] to the floor with a tome first.</span>")
return
if(cooldowntime > world.time)
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/option = "Shielded Robe"
option = input(user, "You study the schematics etched into the forge...", "[src]", option) as null|anything in list("Shielded Robe", "Flagellant's Robe", "Bastard Sword", "Nar-Sien Hardsuit")
var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Bastard Sword")
var/pickedtype
switch(option)
switch(choice)
if("Shielded Robe")
pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
if("Flagellant's Robe")
@@ -113,16 +112,13 @@
pickedtype = /obj/item/twohanded/required/cult_bastard
else
cooldowntime = 12000 - (world.time - SSticker.round_start_time)
to_chat(user, "<span class='cultitalic'>The forge fires are not yet hot enough for this weapon, give it another [DisplayTimeText(cooldowntime)].</span>")
to_chat(user, "<span class='cult italic'>The forge fires are not yet hot enough for this weapon, give it another [DisplayTimeText(cooldowntime)].</span>")
cooldowntime = 0
return
if("Nar-Sien Hardsuit")
pickedtype = /obj/item/clothing/suit/space/hardsuit/cult
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>")
to_chat(user, "<span class='cult italic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>")
@@ -212,10 +208,10 @@
to_chat(user, "<span class='warning'>All of these books seem to be gibberish.</span>")
return
if(!anchored)
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>")
to_chat(user, "<span class='cult italic'>You need to anchor [src] to the floor with a tome first.</span>")
return
if(cooldowntime > world.time)
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Walker Set")
var/list/pickedtype = list()
@@ -231,7 +227,7 @@
cooldowntime = world.time + 2400
for(var/N in pickedtype)
var/obj/item/D = new N(get_turf(src))
to_chat(user, "<span class='cultitalic'>You summon [D] from the archives!</span>")
to_chat(user, "<span class='cult italic'>You summon [D] from the archives!</span>")
/obj/effect/gateway
name = "gateway"
+1
View File
@@ -265,6 +265,7 @@ This file contains the arcane tome files.
if(locate(/obj/effect/rune) in T)
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
return FALSE
if(!is_station_level(T.z) && !is_mining_level(T.z))
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
return FALSE
+51 -40
View File
@@ -140,7 +140,7 @@ structure_check() searches for nearby cultist structures required for the invoca
L.say(invocation, language = /datum/language/common, ignore_spam = TRUE)
if(invoke_damage)
L.apply_damage(invoke_damage, BRUTE)
to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
to_chat(L, "<span class='cult italic'>[src] saps your strength!</span>")
do_invoke_glow()
/obj/effect/rune/proc/do_invoke_glow()
@@ -201,12 +201,12 @@ structure_check() searches for nearby cultist structures required for the invoca
var/obj/item/paper/talisman/talisman_type
var/list/possible_talismans = list()
if(!papers_on_rune.len)
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
to_chat(user, "<span class='cult italic'>There must be a blank paper on top of [src]!</span>")
fail_invoke()
log_game("Talisman Creation rune failed - no blank papers on rune")
return
if(rune_in_use)
to_chat(user, "<span class='cultitalic'>[src] can only support one ritual at a time!</span>")
to_chat(user, "<span class='cult italic'>[src] can only support one ritual at a time!</span>")
fail_invoke()
log_game("Talisman Creation rune failed - already in use")
return
@@ -222,7 +222,7 @@ structure_check() searches for nearby cultist structures required for the invoca
return
papers_on_rune = checkpapers()
if(!papers_on_rune.len)
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
to_chat(user, "<span class='cult italic'>There must be a blank paper on top of [src]!</span>")
fail_invoke()
log_game("Talisman Creation rune failed - no blank papers on rune")
return
@@ -394,9 +394,9 @@ structure_check() searches for nearby cultist structures required for the invoca
SSticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/tome(get_turf(src))
convertee.mind.special_role = "Cultist"
to_chat(convertee, "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
to_chat(convertee, "<span class='cult italic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>")
to_chat(convertee, "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
to_chat(convertee, "<span class='cult italic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
</b></span>")
return 1
@@ -412,7 +412,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/big_sac = FALSE
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
for(var/M in invokers)
to_chat(M, "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
to_chat(M, "<span class='cult italic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
return FALSE
if(sacrificial.mind)
@@ -515,10 +515,10 @@ structure_check() searches for nearby cultist structures required for the invoca
message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
..()
//Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people GLOB.sacrificed
//Rite of Resurrection: Requires a dead or inactive cultist. When reviving the dead, you can only perform one revival for every sacrifice your cult has carried out.
/obj/effect/rune/raise_dead
cultist_name = "Resurrect Cultist"
cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived."
cultist_name = "Revive Cultist"
cultist_desc = "requires a dead, mindless, or inactive cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be given a new life."
invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below
icon_state = "1"
color = RUNE_COLOR_MEDIUMRED
@@ -539,16 +539,11 @@ structure_check() searches for nearby cultist structures required for the invoca
return
rune_in_use = TRUE
for(var/mob/living/M in T.contents)
if(iscultist(M) && M.stat == DEAD)
if(iscultist(M) && (M.stat == DEAD || !M.client || M.client.is_afk()))
potential_revive_mobs |= M
if(!potential_revive_mobs.len)
to_chat(user, "<span class='cultitalic'>There are no dead cultists on the rune!</span>")
log_game("Raise Dead rune failed - no corpses to revive")
fail_invoke()
rune_in_use = FALSE
return
if(LAZYLEN(GLOB.sacrificed) <= revives_used)
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
to_chat(user, "<span class='cult italic'>There are no dead cultists on the rune!</span>")
log_game("Raise Dead rune failed - no cultists to revive")
fail_invoke()
rune_in_use = FALSE
return
@@ -564,9 +559,25 @@ structure_check() searches for nearby cultist structures required for the invoca
else
invocation = initial(invocation)
..()
revives_used++
mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it!
mob_to_revive.grab_ghost()
if(mob_to_revive.stat == DEAD)
if(LAZYLEN(GLOB.sacrificed) <= revives_used)
to_chat(user, "<span class='warning'>Your cult must carry out another sacrifice before it can revive a cultist!</span>")
fail_invoke()
rune_in_use = FALSE
return
revives_used++
mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it!
mob_to_revive.grab_ghost()
else if(!mob_to_revive.client || mob_to_revive.client.is_afk())
set waitfor = FALSE
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [mob_to_revive.name], an inactive blood cultist?", "[name]", null, "Blood Cultist", 50, mob_to_revive)
var/mob/dead/observer/theghost = null
if(candidates.len)
theghost = pick(candidates)
to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.")
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.")
mob_to_revive.ghostize(0)
mob_to_revive.key = theghost.key
to_chat(mob_to_revive, "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>")
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.</span>", \
"<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
@@ -582,13 +593,13 @@ structure_check() searches for nearby cultist structures required for the invoca
fail_invoke()
return FALSE
if(!(target_mob in T.contents))
to_chat(user, "<span class='cultitalic'>The cultist to revive has been moved!</span>")
to_chat(user, "<span class='cult italic'>The cultist to revive has been moved!</span>")
fail_invoke()
log_game("Raise Dead rune failed - revival target moved")
return FALSE
var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE)
if(!ghost && (!target_mob.mind || !target_mob.mind.active))
to_chat(user, "<span class='cultitalic'>The corpse to revive has no spirit!</span>")
to_chat(user, "<span class='cult italic'>The corpse to revive has no spirit!</span>")
fail_invoke()
log_game("Raise Dead rune failed - revival target has no ghost")
return FALSE
@@ -655,16 +666,16 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/spirit/examine(mob/user)
..()
if(affecting)
to_chat(user, "<span class='cultitalic'>A translucent field encases [affecting] above the rune!</span>")
to_chat(user, "<span class='cult italic'>A translucent field encases [affecting] above the rune!</span>")
/obj/effect/rune/spirit/can_invoke(mob/living/user)
if(rune_in_use)
to_chat(user, "<span class='cultitalic'>[src] cannot support more than one body!</span>")
to_chat(user, "<span class='cult italic'>[src] cannot support more than one body!</span>")
log_game("Spirit Sight rune failed - more than one user")
return list()
var/turf/T = get_turf(src)
if(!(user in T))
to_chat(user, "<span class='cultitalic'>You must be standing on top of [src]!</span>")
to_chat(user, "<span class='cult italic'>You must be standing on top of [src]!</span>")
log_game("Spirit Sight rune failed - user not standing on rune")
return list()
return ..()
@@ -694,11 +705,11 @@ structure_check() searches for nearby cultist structures required for the invoca
if(affecting.stat == UNCONSCIOUS)
if(prob(1))
var/mob/dead/observer/G = affecting.get_ghost()
to_chat(G, "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>")
to_chat(G, "<span class='cult italic'>You feel the link between you and your body weakening... you must hurry!</span>")
else if(affecting.stat == DEAD)
affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
var/mob/dead/observer/G = affecting.get_ghost()
to_chat(G, "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>")
to_chat(G, "<span class='cult italic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>")
break
sleep(1)
affecting = null
@@ -722,7 +733,7 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/wall/examine(mob/user)
..()
if(density)
to_chat(user, "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>")
to_chat(user, "<span class='cult italic'>There is a barely perceptible shimmering of the air above [src].</span>")
/obj/effect/rune/wall/Destroy()
density = FALSE
@@ -744,7 +755,7 @@ structure_check() searches for nearby cultist structures required for the invoca
spread_density()
var/carbon_user = iscarbon(user)
user.visible_message("<span class='warning'>[user] [carbon_user ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
"<span class='cultitalic'>You channel [carbon_user ? "your life ":""]energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
"<span class='cult italic'>You channel [carbon_user ? "your life ":""]energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
if(carbon_user)
var/mob/living/carbon/C = user
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
@@ -806,17 +817,17 @@ structure_check() searches for nearby cultist structures required for the invoca
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
return
if(!cultist_to_summon)
to_chat(user, "<span class='cultitalic'>You require a summoning target!</span>")
to_chat(user, "<span class='cult italic'>You require a summoning target!</span>")
fail_invoke()
log_game("Summon Cultist rune failed - no target")
return
if(cultist_to_summon.stat == DEAD)
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] has died!</span>")
to_chat(user, "<span class='cult italic'>[cultist_to_summon] has died!</span>")
fail_invoke()
log_game("Summon Cultist rune failed - target died")
return
if(!iscultist(cultist_to_summon))
to_chat(user, "<span class='cultitalic'>[cultist_to_summon] is not a follower of the Geometer!</span>")
to_chat(user, "<span class='cult italic'>[cultist_to_summon] is not a follower of the Geometer!</span>")
fail_invoke()
log_game("Summon Cultist rune failed - target was deconverted")
return
@@ -826,7 +837,7 @@ structure_check() searches for nearby cultist structures required for the invoca
log_game("Summon Cultist rune failed - target in away mission")
return
cultist_to_summon.visible_message("<span class='warning'>[cultist_to_summon] suddenly disappears in a flash of red light!</span>", \
"<span class='cultitalic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
"<span class='cult italic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
..()
visible_message("<span class='warning'>A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!</span>")
cultist_to_summon.forceMove(get_turf(src))
@@ -914,17 +925,17 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/manifest/can_invoke(mob/living/user)
if(!(user in get_turf(src)))
to_chat(user, "<span class='cultitalic'>You must be standing on [src]!</span>")
to_chat(user, "<span class='cult italic'>You must be standing on [src]!</span>")
fail_invoke()
log_game("Manifest rune failed - user not standing on rune")
return list()
if(user.has_status_effect(STATUS_EFFECT_SUMMONEDGHOST))
to_chat(user, "<span class='cultitalic'>Ghosts can't summon more ghosts!</span>")
to_chat(user, "<span class='cult italic'>Ghosts can't summon more ghosts!</span>")
fail_invoke()
log_game("Manifest rune failed - user is a ghost")
return list()
if(ghosts >= ghost_limit)
to_chat(user, "<span class='cultitalic'>You are sustaining too many ghosts to summon more!</span>")
to_chat(user, "<span class='cult italic'>You are sustaining too many ghosts to summon more!</span>")
fail_invoke()
log_game("Manifest rune failed - too many summoned ghosts")
return list()
@@ -933,7 +944,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
ghosts_on_rune += O
if(!ghosts_on_rune.len)
to_chat(user, "<span class='cultitalic'>There are no spirits near [src]!</span>")
to_chat(user, "<span class='cult italic'>There are no spirits near [src]!</span>")
fail_invoke()
log_game("Manifest rune failed - no nearby ghosts")
return list()
@@ -955,13 +966,13 @@ structure_check() searches for nearby cultist structures required for the invoca
ghosts++
playsound(src, 'sound/magic/exit_blood.ogg', 50, 1)
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.</span>")
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
to_chat(user, "<span class='cult italic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
var/turf/T = get_turf(src)
var/obj/structure/emergency_shield/invoker/N = new(T)
new_human.key = ghost_to_spawn.key
SSticker.mode.add_cultist(new_human.mind, 0)
to_chat(new_human, "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>")
to_chat(new_human, "<span class='cult italic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>")
while(!QDELETED(src) && !QDELETED(user) && !QDELETED(new_human) && (user in T))
if(user.stat || new_human.InCritical())
+12 -12
View File
@@ -39,7 +39,7 @@
invocation = "Ra'sha yoka!"
/obj/item/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
to_chat(user, "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>")
to_chat(user, "<span class='cult italic'>You feel a pain in your head. The Geometer is displeased.</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.apply_damage(10, BRUTE, "head")
@@ -79,7 +79,7 @@
to_chat(user, "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>")
return ..(user, 0)
user.visible_message("<span class='warning'>Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!</span>", \
"<span class='cultitalic'>You speak the words of the talisman and find yourself somewhere else!</span>", "<i>You hear a sharp crack.</i>")
"<span class='cult italic'>You speak the words of the talisman and find yourself somewhere else!</span>", "<i>You hear a sharp crack.</i>")
user.forceMove(target)
target.visible_message("<span class='warning'>There is a boom of outrushing air as something appears above the rune!</span>", null, "<i>You hear a boom.</i>")
return ..()
@@ -96,10 +96,10 @@
/obj/item/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
. = ..()
user.visible_message("<span class='warning'>[user]'s hand glows red for a moment.</span>", \
"<span class='cultitalic'>You speak the words of the talisman!</span>")
"<span class='cult italic'>You speak the words of the talisman!</span>")
new /obj/item/tome(get_turf(user))
user.visible_message("<span class='warning'>A tome appears at [user]'s feet!</span>", \
"<span class='cultitalic'>An arcane tome materializes at your feet.</span>")
"<span class='cult italic'>An arcane tome materializes at your feet.</span>")
/obj/item/paper/talisman/true_sight
cultist_name = "Talisman of Veiling"
@@ -115,14 +115,14 @@
. = ..()
if(!revealing)
user.visible_message("<span class='warning'>Thin grey dust falls from [user]'s hand!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, hiding nearby runes.</span>")
"<span class='cult italic'>You speak the words of the talisman, hiding nearby runes.</span>")
invocation = "Nikt'o barada kla'atu!"
revealing = TRUE
for(var/obj/effect/rune/R in range(4,user))
R.talismanhide()
else
user.visible_message("<span class='warning'>A flash of light shines from [user]'s hand!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, revealing nearby runes.</span>")
"<span class='cult italic'>You speak the words of the talisman, revealing nearby runes.</span>")
for(var/obj/effect/rune/R in range(3,user))
R.talismanreveal()
@@ -137,7 +137,7 @@
/obj/item/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
. = ..()
user.visible_message("<span class='warning'>[user]'s hand flashes a bright blue!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, emitting an EMP blast.</span>")
"<span class='cult italic'>You speak the words of the talisman, emitting an EMP blast.</span>")
empulse(src, 4, 8)
@@ -162,7 +162,7 @@
if(iscultist(user))
invoke(user, 1)
user.visible_message("<span class='warning'>[user] holds up [src], which explodes in a flash of red light!</span>", \
"<span class='cultitalic'>You stun [target] with the talisman!</span>")
"<span class='cult italic'>You stun [target] with the talisman!</span>")
var/obj/item/nullrod/N = locate() in target
if(N)
target.visible_message("<span class='warning'>[target]'s holy weapon absorbs the talisman's light!</span>", \
@@ -197,7 +197,7 @@
/obj/item/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
. = ..()
user.visible_message("<span class='warning'>Otherworldly armor suddenly appears on [user]!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, arming yourself!</span>")
"<span class='cult italic'>You speak the words of the talisman, arming yourself!</span>")
user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
@@ -226,7 +226,7 @@
/obj/item/paper/talisman/horror/afterattack(mob/living/target, mob/living/user)
if(iscultist(user) && (get_dist(user, target) < 7))
if(iscarbon(target))
to_chat(user, "<span class='cultitalic'>You disturb [target] with visions of madness!</span>")
to_chat(user, "<span class='cult italic'>You disturb [target] with visions of madness!</span>")
var/mob/living/carbon/H = target
H.reagents.add_reagent("mindbreaker", 12)
if(is_servant_of_ratvar(target))
@@ -254,7 +254,7 @@
/obj/item/paper/talisman/construction/attack(obj/M,mob/living/user)
if(iscultist(user))
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>")
to_chat(user, "<span class='cult italic'>This talisman will only work on a stack of metal or plasteel sheets!</span>")
log_game("Construct talisman failed - not a valid target")
else
..()
@@ -306,7 +306,7 @@
/obj/item/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
if(iscultist(user) && istype(target))
if(target.stat == DEAD)
user.visible_message("<span class='cultitalic'>This talisman's magic does not affect the dead!</span>")
user.visible_message("<span class='cult italic'>This talisman's magic does not affect the dead!</span>")
return
CuffAttack(target, user)
return
+1 -1
View File
@@ -34,7 +34,7 @@
var/boost = 0
bloodcrawl = BLOODCRAWL_EAT
var/list/consumed_mobs = list()
var/playstyle_string = "<B><font size=3 color='red'>You are an imp,</font> a mischevious creature from hell. You are the lowest rank on the hellish totem pole \
var/playstyle_string = "<span class='big bold'>You are an imp,</span><B> a mischevious creature from hell. You are the lowest rank on the hellish totem pole \
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
of intentionally harming a fellow devil.</B>"
@@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
sleep(30)
if(!owner || QDELETED(owner))
return
priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg')
priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/ai/aimalf.ogg')
set_security_level("delta")
var/obj/machinery/doomsday_device/DOOM = new(owner_AI)
owner_AI.nuking = TRUE
@@ -367,12 +367,12 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
var/sec_left = seconds_remaining()
if(!sec_left)
timing = FALSE
detonate(T.z)
detonate()
else if(world.time >= next_announce)
minor_announce("[sec_left] SECONDS UNTIL DOOMSDAY DEVICE ACTIVATION!", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", TRUE)
next_announce += DOOMSDAY_ANNOUNCE_INTERVAL
/obj/machinery/doomsday_device/proc/detonate(z_level = ZLEVEL_STATION_PRIMARY)
/obj/machinery/doomsday_device/proc/detonate()
sound_to_playing_players('sound/machines/alarm.ogg')
sleep(100)
for(var/i in GLOB.mob_living_list)
+1 -2
View File
@@ -105,7 +105,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/Move()
if(z != z_original || loc == dest)
qdel(src)
return
return FALSE
. = ..() //process movement...
@@ -317,7 +317,6 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/meaty/xeno/New()
meteordrop += subtypesof(/obj/item/organ/alien)
meteordrop -= /obj/item/organ/alien/eggsac
..()
/obj/effect/meteor/meaty/xeno/ram_turf(turf/T)
@@ -300,11 +300,10 @@
/obj/item/organ/heart/gland/plasma/activate()
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
sleep(150)
if(!owner)
return
to_chat(owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>")
sleep(50)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>"), 150)
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
if(!owner)
return
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
@@ -322,10 +322,6 @@
to_chat(S, "<span class='warning'>This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.</span>")
return FALSE
/obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.</span>")
return FALSE
/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.</span>")
return FALSE
@@ -1,8 +1,8 @@
/datum/round_event_control/spawn_swarmer
name = "Spawn Swarmer Shell"
typepath = /datum/round_event/spawn_swarmer
weight = 0
max_occurrences = 0 //Only once okay fam
weight = 7
max_occurrences = 1 //Only once okay fam
earliest_start = 18000 //30 minutes
min_players = 15
@@ -16,7 +16,7 @@
return 0
new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway))
if(prob(25)) //25% chance to announce it to the crew
var/swarmer_report = "<font size=3><b>[command_name()] High-Priority Update</b></span>"
var/swarmer_report = "<span class='big bold'>[command_name()] High-Priority Update</span>"
swarmer_report += "<br><br>Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come through."
print_command_report(swarmer_report, announce=TRUE)
@@ -41,7 +41,7 @@
/mob/living/simple_animal/hostile/morph,
/obj/effect))
var/playstyle_string = "<b><font size=3 color='red'>You are a morph,</font> an abomination of science created primarily with changeling cells. \
var/playstyle_string = "<span class='big bold'>You are a morph,</span></b> an abomination of science created primarily with changeling cells. \
You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \
observers, and can only be performed once every five seconds. While morphed, you move faster, but do \
less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \
@@ -64,7 +64,7 @@
/mob/living/simple_animal/revenant/Login()
..()
to_chat(src, "<span class='deadsay'><font size=3><b>You are a revenant.</b></font></span>")
to_chat(src, "<span class='deadsay'><span class='big bold'>You are a revenant.</span></span>")
to_chat(src, "<b>Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.</b>")
to_chat(src, "<b>You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.</b>")
to_chat(src, "<b>You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.</b>")
@@ -35,7 +35,7 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
var/boost = 0
bloodcrawl = BLOODCRAWL_EAT
var/playstyle_string = "<B><font size=3 color='red'>You are a slaughter demon,</font> a terrible creature from another realm. You have a single desire: To kill. \
var/playstyle_string = "<span class='big bold'>You are a slaughter demon,</span><B> a terrible creature from another realm. You have a single desire: To kill. \
You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \
Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. </B>"
@@ -136,8 +136,8 @@
// Keep the people we hug!
var/list/consumed_mobs = list()
playstyle_string = "<B><font size=3 color='red'>You are a laughter \
demon,</font> a wonderful creature from another realm. You have a single \
playstyle_string = "<span class='big bold'>You are a laughter \
demon,</span><B> a wonderful creature from another realm. You have a single \
desire: <span class='clown'>To hug and tickle.</span><BR>\
You may use the \"Blood Crawl\" ability near blood pools to travel \
through them, appearing and disappearing from the station at will. \
+2 -2
View File
@@ -141,8 +141,8 @@
/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H)
var/obj/item/device/radio/R = H.ears
R.set_frequency(GLOB.SYND_FREQ)
R.freqlock = 1
R.set_frequency(FREQ_SYNDICATE)
R.freqlock = TRUE
if(command_radio)
R.command = TRUE
+1 -1
View File
@@ -572,4 +572,4 @@ This is here to make the tiles around the station mininuke change when it's arme
user.visible_message("<span class='suicide'>[user] is pretending to go delta! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(src, 'sound/machines/alarm.ogg', 30, -1, 1)
addtimer(CALLBACK(src, .proc/manual_suicide, user), 101)
return MANUAL_SUICIDE
return MANUAL_SUICIDE
+9 -9
View File
@@ -1,6 +1,6 @@
/datum/objective
var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code.
var/datum/objective_team/team //An alternative to 'owner': a team. Use this when writing new code.
var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code.
var/explanation_text = "Nothing" //What that person is supposed to do.
var/team_explanation_text //For when there are multiple owners.
var/datum/mind/target = null //If they are focused on a particular person.
@@ -47,9 +47,9 @@
. = list()
for(var/V in GLOB.data_core.locked)
var/datum/data/record/R = V
var/mob/M = R.fields["reference"]
if(M && M.mind)
. += M.mind
var/datum/mind/M = R.fields["mindref"]
if(M)
. += M
/datum/objective/proc/find_target()
var/list/datum/mind/owners = get_owners()
@@ -524,7 +524,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/list/otherwise = M.GetAllContents()
for(var/obj/item/disk/tech_disk/TD in otherwise)
TD.stored_research.copy_research_to(checking)
return checking.researched_nodes.len >= target
return checking.researched_nodes.len >= target_amount
/datum/objective/capture
@@ -537,25 +537,25 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/captured_amount = 0
var/area/centcom/holding/A = locate() in GLOB.sortedAreas
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat==2)//Dead folks are worth less.
if(M.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
continue
captured_amount+=1
for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
captured_amount+=0.1
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
if(M.stat==2)
if(M.stat == DEAD)
captured_amount+=0.5
continue
captured_amount+=1
for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans.
if(istype(M, /mob/living/carbon/alien/humanoid/royal/queen))//Queens are worth three times as much as humans.
if(M.stat==2)
if(M.stat == DEAD)
captured_amount+=1.5
else
captured_amount+=3
continue
if(M.stat==2)
if(M.stat == DEAD)
captured_amount+=1
continue
captured_amount+=2
+1 -1
View File
@@ -27,7 +27,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
//items that shouldn't spawn on the floor because they would bug or act weird
var/global/list/spawn_forbidden = list(
/obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you
/obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai,
/obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/device/pda/ai,
/obj/item/smallDelivery, /obj/item/projectile,
/obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_module)
+2 -2
View File
@@ -47,7 +47,7 @@
for(var/datum/mind/wizard in wizards)
if(isliving(wizard.current) && wizard.current.stat!=DEAD)
return FALSE
for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead()
if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard))
return FALSE
@@ -55,7 +55,7 @@
if(SSevents.wizardmode) //If summon events was active, turn it off
SSevents.toggleWizardmode()
SSevents.resetFrequency()
return TRUE
/datum/game_mode/wizard/set_round_result()
+2 -2
View File
@@ -15,7 +15,7 @@
state_open = TRUE
circuit = /obj/item/circuitboard/machine/sleeper
var/efficiency = 1
var/min_health = 30
var/min_health = -25
var/list/available_chems
var/controls_inside = FALSE
var/list/possible_chems = list(
@@ -42,7 +42,7 @@
I += M.rating
efficiency = initial(efficiency)* E
min_health = initial(min_health) - (10*E)
min_health = initial(min_health) - (10*(E-1)) // CIT CHANGE - changes min health equation to be min_health - (matterbin rating * 10)
available_chems = list()
for(var/i in 1 to I)
available_chems |= possible_chems[i]
+24 -28
View File
@@ -8,7 +8,7 @@
/obj/machinery/door/airlock/receive_signal(datum/signal/signal)
if(!signal || signal.encryption)
if(!signal)
return
if(id_tag != signal.data["tag"] || !signal.data["command"])
@@ -52,15 +52,13 @@
/obj/machinery/door/airlock/proc/send_status()
if(radio_connection)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = id_tag
signal.data["timestamp"] = world.time
signal.data["door_status"] = density?("closed"):("open")
signal.data["lock_status"] = locked?("locked"):("unlocked")
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK)
var/datum/signal/signal = new(list(
"tag" = id_tag,
"timestamp" = world.time,
"door_status" = density ? "closed" : "open",
"lock_status" = locked ? "locked" : "unlocked"
))
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
/obj/machinery/door/airlock/open(surpress_send)
@@ -79,10 +77,10 @@
SSradio.remove_object(src, frequency)
if(new_frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_AIRLOCK)
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
/obj/machinery/door/airlock/Destroy()
if(frequency && SSradio)
if(frequency)
SSradio.remove_object(src,frequency)
return ..()
@@ -97,7 +95,7 @@
var/id_tag
var/master_tag
var/frequency = 1449
var/frequency = FREQ_AIRLOCK_CONTROL
var/datum/radio_frequency/radio_connection
@@ -115,36 +113,34 @@
icon_state = "airlock_sensor_off"
/obj/machinery/airlock_sensor/attack_hand(mob/user)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = master_tag
signal.data["command"] = "cycle"
var/datum/signal/signal = new(list(
"tag" = master_tag,
"command" = "cycle"
))
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK)
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
flick("airlock_sensor_cycle", src)
/obj/machinery/airlock_sensor/process()
if(on)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = id_tag
signal.data["timestamp"] = world.time
var/datum/gas_mixture/air_sample = return_air()
var/pressure = round(air_sample.return_pressure(),0.1)
alert = (pressure < ONE_ATMOSPHERE*0.8)
signal.data["pressure"] = num2text(pressure)
var/datum/signal/signal = new(list(
"tag" = id_tag,
"timestamp" = world.time,
"pressure" = num2text(pressure)
))
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK)
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
update_icon()
/obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_AIRLOCK)
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
/obj/machinery/airlock_sensor/Initialize()
. = ..()
@@ -152,4 +148,4 @@
/obj/machinery/airlock_sensor/Destroy()
SSradio.remove_object(src,frequency)
return ..()
return ..()
+1 -1
View File
@@ -53,7 +53,7 @@
radio = new(src)
radio.keyslot = new radio_key
radio.subspace_transmission = 1
radio.subspace_transmission = TRUE
radio.canhear_range = 0
radio.recalculateChannels()
+4 -5
View File
@@ -44,8 +44,7 @@
/obj/item/grenade/chem_grenade/glitter/blue = 1,
/obj/item/grenade/chem_grenade/glitter/white = 1,
/obj/item/toy/eightball = 2,
/obj/item/toy/windupToolbox = 2,
/obj/item/toy/sword/cx = 2)
/obj/item/toy/windupToolbox = 2)
light_color = LIGHT_COLOR_GREEN
@@ -418,17 +417,17 @@
dat += "<br>You ran out of food and starved."
if(emagged)
user.nutrition = 0 //yeah you pretty hongry
to_chat(user, "<span class='userdanger'><font size=3>Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.</span>")
to_chat(user, "<span class='userdanger'>Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.</span>")
if(fuel <= 0)
dat += "<br>You ran out of fuel, and drift, slowly, into a star."
if(emagged)
var/mob/living/M = user
M.adjust_fire_stacks(5)
M.IgniteMob() //flew into a star, so you're on fire
to_chat(user, "<span class='userdanger'><font size=3>You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames.</span>")
to_chat(user, "<span class='userdanger'>You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames.</span>")
if(emagged)
to_chat(user, "<span class='userdanger'><font size=3>You're never going to make it to Orion...</span></font>")
to_chat(user, "<span class='userdanger'>You're never going to make it to Orion...</span>")
user.death()
emagged = FALSE //removes the emagged status after you lose
gameStatus = ORION_STATUS_START
+3 -3
View File
@@ -6,7 +6,7 @@
icon_keyboard = "atmos_key"
var/list/priority_alarms = list()
var/list/minor_alarms = list()
var/receive_frequency = 1437
var/receive_frequency = FREQ_ATMOS_ALARMS
var/datum/radio_frequency/radio_connection
light_color = LIGHT_COLOR_CYAN
@@ -57,10 +57,10 @@
/obj/machinery/computer/atmos_alert/proc/set_frequency(new_frequency)
SSradio.remove_object(src, receive_frequency)
receive_frequency = new_frequency
radio_connection = SSradio.add_object(src, receive_frequency, GLOB.RADIO_ATMOSIA)
radio_connection = SSradio.add_object(src, receive_frequency, RADIO_ATMOSIA)
/obj/machinery/computer/atmos_alert/receive_signal(datum/signal/signal)
if(!signal || signal.encryption)
if(!signal)
return
var/zone = signal.data["zone"]
+14 -19
View File
@@ -11,7 +11,7 @@
var/on = TRUE
var/id_tag
var/frequency = 1441
var/frequency = FREQ_ATMOS_STORAGE
var/datum/radio_frequency/radio_connection
/obj/machinery/air_sensor/update_icon()
@@ -19,31 +19,29 @@
/obj/machinery/air_sensor/process_atmos()
if(on)
var/datum/signal/signal = new
var/datum/gas_mixture/air_sample = return_air()
signal.transmission_method = 1 //radio signal
signal.data = list(
var/datum/signal/signal = new(list(
"sigtype" = "status",
"id_tag" = id_tag,
"timestamp" = world.time,
"pressure" = air_sample.return_pressure(),
"temperature" = air_sample.temperature,
"gases" = list()
)
))
var/total_moles = air_sample.total_moles()
if(total_moles)
for(var/gas_id in air_sample.gases)
var/gas_name = air_sample.gases[gas_id][GAS_META][META_GAS_NAME]
signal.data["gases"][gas_name] = air_sample.gases[gas_id][MOLES] / total_moles * 100
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
/obj/machinery/air_sensor/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
/obj/machinery/air_sensor/Initialize()
. = ..()
@@ -66,7 +64,7 @@
icon_keyboard = "atmos_key"
circuit = /obj/item/circuitboard/computer/atmos_control
var/frequency = 1441
var/frequency = FREQ_ATMOS_STORAGE
var/list/sensors = list(
"n2_sensor" = "Nitrogen Tank",
"o2_sensor" = "Oxygen Tank",
@@ -117,7 +115,7 @@
return data
/obj/machinery/computer/atmos_control/receive_signal(datum/signal/signal)
if(!signal || signal.encryption)
if(!signal)
return
var/id_tag = signal.data["id_tag"]
@@ -129,7 +127,7 @@
/obj/machinery/computer/atmos_control/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
/////////////////////////////////////////////////////////////
// LARGE TANK CONTROL
@@ -138,7 +136,7 @@
/obj/machinery/computer/atmos_control/tank
var/input_tag
var/output_tag
frequency = 1441
frequency = FREQ_ATMOS_STORAGE
circuit = /obj/item/circuitboard/computer/atmos_control/tank
var/list/input_info
@@ -147,7 +145,7 @@
// This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this
/obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user)
var/list/IO = list()
var/datum/radio_frequency/freq = SSradio.return_frequency(1441)
var/datum/radio_frequency/freq = SSradio.return_frequency(FREQ_ATMOS_STORAGE)
var/list/devices = freq.devices["_default"]
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices)
var/list/text = splittext(U.id_tag, "_")
@@ -194,10 +192,7 @@
/obj/machinery/computer/atmos_control/tank/ui_act(action, params)
if(..() || !radio_connection)
return
var/datum/signal/signal = new
signal.transmission_method = 1
signal.source = src
signal.data = list("sigtype" = "command")
var/datum/signal/signal = new(list("sigtype" = "command"))
switch(action)
if("reconnect")
reconnect(usr)
@@ -214,10 +209,10 @@
target = CLAMP(target, 0, 50 * ONE_ATMOSPHERE)
signal.data += list("tag" = output_tag, "set_internal_pressure" = target)
. = TRUE
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
/obj/machinery/computer/atmos_control/tank/receive_signal(datum/signal/signal)
if(!signal || signal.encryption)
if(!signal)
return
var/id_tag = signal.data["tag"]
@@ -227,4 +222,4 @@
else if(output_tag == id_tag)
output_info = signal.data
else
..(signal)
..(signal)
@@ -311,6 +311,9 @@
else if(isspaceturf(T))
to_chat(user, "<span class='sevtug_small'>[prob(1) ? "Servant cannot into space." : "You can't teleport into space."]</span>")
return
else if(T.flags_1 & NOJAUNT_1)
to_chat(user, "<span class='sevtug_small'>This tile is blessed by holy water and deflects the warp.</span>")
return
var/area/AR = get_area(T)
if(!AR.clockwork_warp_allowed)
to_chat(user, "<span class='sevtug_small'>[AR.clockwork_warp_fail]</span>")
+7 -10
View File
@@ -28,7 +28,6 @@
var/const/STATE_TOGGLE_EMERGENCY = 10
var/const/STATE_PURCHASE = 11
var/status_display_freq = "1435"
var/stat_msg1
var/stat_msg2
@@ -136,6 +135,7 @@
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
var/input = stripped_multiline_input(usr, "Please choose a message to transmit to allied stations. Please be aware that this process is very expensive, and abuse will lead to... termination.", "Send a message to an allied station.", "")
if(!input || !(usr in view(1,src)))
return
@@ -228,7 +228,7 @@
log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]")
if(currmsg)
currmsg.answer_callback.Invoke()
state = STATE_VIEWMESSAGE
if("status")
state = STATE_STATUSDISPLAY
@@ -464,8 +464,9 @@
if (authenticated==2)
dat += "<BR><BR><B>Captain Functions</B>"
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=announce'>Make a Captain's Announcement</A> \]"
if(CONFIG_GET(string/cross_server_address))
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to an allied station</A> \]"
var/cross_servers_count = length(CONFIG_GET(keyed_string_list/cross_server))
if(cross_servers_count)
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to [cross_servers_count == 1 ? "an " : ""]allied station[cross_servers_count > 1 ? "s" : ""]</A> \]"
if(SSmapping.config.allow_custom_shuttles)
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=purchase_menu'>Purchase Shuttle</A> \]"
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=changeseclevel'>Change Alert Level</A> \]"
@@ -693,16 +694,12 @@
/obj/machinery/computer/communications/proc/post_status(command, data1, data2)
var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
if(!frequency)
return
var/datum/signal/status_signal = new
status_signal.source = src
status_signal.transmission_method = 1
status_signal.data["command"] = command
var/datum/signal/status_signal = new(list("command" = command))
switch(command)
if("message")
status_signal.data["msg1"] = data1
+36 -36
View File
@@ -108,9 +108,9 @@
else
scanner_status = "Closed"
if(connected.locked)
scanner_status += " <span class='bad'>(Locked)</span>"
scanner_status += "<span class='bad'>(Locked)</span>"
else
scanner_status += " <span class='good'>(Unlocked)</span>"
scanner_status += "<span class='good'>(Unlocked)</span>"
else
@@ -143,27 +143,27 @@
status += "<div class='line'><div class='statusLabel'>Pulse Duration:</div><div class='statusValue'>[radduration]</div></div>"
status += "<div class='line'><div class='statusLabel'>&nbsp;&nbsp;\> Accuracy:</div><div class='statusValue'>[chance_to_hit]</div></div>"
status += "<br></div>" // Close statusDisplay div
var/list/buttons = list("<a href='?src=[REF(src)];'>Scan</a> ")
var/list/buttons = list("<a href='?src=[REF(src)];'>Scan</a>")
if(connected)
buttons += " <a href='?src=[REF(src)];task=toggleopen;'>[connected.state_open ? "Close" : "Open"] Scanner</a> "
buttons += "<a href='?src=[REF(src)];task=toggleopen;'>[connected.state_open ? "Close" : "Open"] Scanner</a>"
if (connected.state_open)
buttons += "<span class='linkOff'>[connected.locked ? "Unlock" : "Lock"] Scanner</span> "
buttons += "<span class='linkOff'>[connected.locked ? "Unlock" : "Lock"] Scanner</span>"
else
buttons += "<a href='?src=[REF(src)];task=togglelock;'>[connected.locked ? "Unlock" : "Lock"] Scanner</a> "
buttons += "<a href='?src=[REF(src)];task=togglelock;'>[connected.locked ? "Unlock" : "Lock"] Scanner</a>"
else
buttons += "<span class='linkOff'>Open Scanner</span> <span class='linkOff'>Lock Scanner</span> "
buttons += "<span class='linkOff'>Open Scanner</span> <span class='linkOff'>Lock Scanner</span>"
if(viable_occupant)
buttons += "<a href='?src=[REF(src)];task=rejuv'>Inject Rejuvenators</a> "
buttons += "<a href='?src=[REF(src)];task=rejuv'>Inject Rejuvenators</a>"
else
buttons += "<span class='linkOff'>Inject Rejuvenators</span> "
buttons += "<span class='linkOff'>Inject Rejuvenators</span>"
if(diskette)
buttons += "<a href='?src=[REF(src)];task=ejectdisk'>Eject Disk</a> "
buttons += "<a href='?src=[REF(src)];task=ejectdisk'>Eject Disk</a>"
else
buttons += "<span class='linkOff'>Eject Disk</span> "
buttons += "<span class='linkOff'>Eject Disk</span>"
if(current_screen == "buffer")
buttons += "<a href='?src=[REF(src)];task=screen;text=mainmenu;'>Radiation Emitter Menu</a> "
buttons += "<a href='?src=[REF(src)];task=screen;text=mainmenu;'>Radiation Emitter Menu</a>"
else
buttons += "<a href='?src=[REF(src)];task=screen;text=buffer;'>Buffer Menu</a> "
buttons += "<a href='?src=[REF(src)];task=screen;text=buffer;'>Buffer Menu</a>"
switch(current_screen)
if("working")
@@ -182,15 +182,15 @@
if( !buffer_slot || !buffer_slot.len || !buffer_slot["name"] || !((buffer_slot["UI"] && buffer_slot["UE"]) || buffer_slot["SE"]) )
temp_html += "<br>\tNo Data"
if(viable_occupant)
temp_html += "<br><a href='?src=[REF(src)];task=setbuffer;num=[i];'>Save to Buffer</a> "
temp_html += "<br><a href='?src=[REF(src)];task=setbuffer;num=[i];'>Save to Buffer</a>"
else
temp_html += "<br><span class='linkOff'>Save to Buffer</span> "
temp_html += "<span class='linkOff'>Clear Buffer</span> "
temp_html += "<br><span class='linkOff'>Save to Buffer</span>"
temp_html += "<span class='linkOff'>Clear Buffer</span>"
if(diskette)
temp_html += "<a href='?src=[REF(src)];task=loaddisk;num=[i];'>Load from Disk</a> "
temp_html += "<a href='?src=[REF(src)];task=loaddisk;num=[i];'>Load from Disk</a>"
else
temp_html += "<span class='linkOff'>Load from Disk</span> "
temp_html += "<span class='linkOff'>Save to Disk</span> "
temp_html += "<span class='linkOff'>Load from Disk</span>"
temp_html += "<span class='linkOff'>Save to Disk</span>"
else
var/ui = buffer_slot["UI"]
var/se = buffer_slot["SE"]
@@ -204,10 +204,10 @@
temp_html += "<br>\tBlood Type: [blood_type]"
temp_html += "<br>\tUE: [ue] "
if(viable_occupant)
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=ue'>Occupant</a> "
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=ue'>Occupant</a>"
else
temp_html += "<span class='linkOff'>Occupant</span>"
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_UE]'>Occupant:Delayed</a> "
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_UE]'>Occupant:Delayed</a>"
if(injectorready < world.time)
temp_html += "<a href='?src=[REF(src)];task=injector;num=[i];text=ue'>Injector</a>"
else
@@ -218,10 +218,10 @@
if(ui)
temp_html += "<br>\tUI: [ui] "
if(viable_occupant)
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=ui'>Occupant</a> "
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=ui'>Occupant</a>"
else
temp_html += "<span class='linkOff'>Occupant</span>"
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_UI]'>Occupant:Delayed</a> "
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_UI]'>Occupant:Delayed</a>"
if(injectorready < world.time)
temp_html += "<a href='?src=[REF(src)];task=injector;num=[i];text=ui'>Injector</a>"
else
@@ -231,10 +231,10 @@
if(ue && name && blood_type && ui)
temp_html += "<br>\tUI+UE: [ui]/[ue] "
if(viable_occupant)
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=mixed'>Occupant</a> "
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=mixed'>Occupant</a>"
else
temp_html += "<span class='linkOff'>Occupant</span>"
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_MIXED]'>Occupant:Delayed</a> "
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_MIXED]'>Occupant:Delayed</a>"
if(injectorready < world.time)
temp_html += "<a href='?src=[REF(src)];task=injector;num=[i];text=mixed'>UI+UE Injector</a>"
else
@@ -242,10 +242,10 @@
if(se)
temp_html += "<br>\tSE: [se] "
if(viable_occupant)
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=se'>Occupant</a> "
temp_html += "<a href='?src=[REF(src)];task=transferbuffer;num=[i];text=se'>Occupant</a>"
else
temp_html += "<span class='linkOff'>Occupant</span> "
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_SE]'>Occupant:Delayed</a> "
temp_html += "<span class='linkOff'>Occupant</span>"
temp_html += "<a href='?src=[REF(src)];task=setdelayed;num=[i];delayaction=[SCANNER_ACTION_SE]'>Occupant:Delayed</a>"
if(injectorready < world.time )
temp_html += "<a href='?src=[REF(src)];task=injector;num=[i];text=se'>Injector</a>"
else
@@ -253,18 +253,18 @@
else
temp_html += "<br>\tSE: No Data"
if(viable_occupant)
temp_html += "<br><a href='?src=[REF(src)];task=setbuffer;num=[i];'>Save to Buffer</a> "
temp_html += "<br><a href='?src=[REF(src)];task=setbuffer;num=[i];'>Save to Buffer</a>"
else
temp_html += "<br><span class='linkOff'>Save to Buffer</span> "
temp_html += "<a href='?src=[REF(src)];task=clearbuffer;num=[i];'>Clear Buffer</a> "
temp_html += "<br><span class='linkOff'>Save to Buffer</span>"
temp_html += "<a href='?src=[REF(src)];task=clearbuffer;num=[i];'>Clear Buffer</a>"
if(diskette)
temp_html += "<a href='?src=[REF(src)];task=loaddisk;num=[i];'>Load from Disk</a> "
temp_html += "<a href='?src=[REF(src)];task=loaddisk;num=[i];'>Load from Disk</a>"
else
temp_html += "<span class='linkOff'>Load from Disk</span> "
temp_html += "<span class='linkOff'>Load from Disk</span>"
if(diskette && !diskette.read_only)
temp_html += "<a href='?src=[REF(src)];task=savedisk;num=[i];'>Save to Disk</a> "
temp_html += "<a href='?src=[REF(src)];task=savedisk;num=[i];'>Save to Disk</a>"
else
temp_html += "<span class='linkOff'>Save to Disk</span> "
temp_html += "<span class='linkOff'>Save to Disk</span>"
else
temp_html += status
temp_html += buttons
@@ -528,7 +528,7 @@
var/mob/living/carbon/viable_occupant = null
if(connected)
viable_occupant = connected.occupant
if(!istype(viable_occupant) || !viable_occupant.dna || (viable_occupant.has_disability(DISABILITY_NOCLONE)))
if(!istype(viable_occupant) || !viable_occupant.dna || (RADIMMUNE in viable_occupant.dna.species.species_traits) || (viable_occupant.has_disability(DISABILITY_NOCLONE)))
viable_occupant = null
return viable_occupant
@@ -156,8 +156,6 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
..()
var/list/nukeops = get_antagonists(/datum/antagonist/nukeop)
var/danger = GLOB.joined_player_list.len - nukeops.len
// var/list/nukeops = get_antagonists(/datum/antagonist/nukeop)
// var/danger = GLOB.joined_player_list.len - nukeops.len
danger = CEILING(danger, 10)
scaleTC(danger)
+2 -6
View File
@@ -173,12 +173,8 @@
if(M.stat == DEAD)
if(M.timeofdeath + 6000 < world.time)
continue
var/turf/T = get_turf(M)
if(!T)
continue
if(T.z == ZLEVEL_CENTCOM)
continue
L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I
if(is_eligible(I))
L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I
var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L
target = L[desc]
@@ -257,4 +257,5 @@
for(var/X in components)
var/obj/item/I = X
I.forceMove(loc)
..()
+14 -12
View File
@@ -34,7 +34,7 @@
#define AIRLOCK_INTEGRITY_N 300 // Normal airlock integrity
#define AIRLOCK_INTEGRITY_MULTIPLIER 1.5 // How much reinforced doors health increases
#define AIRLOCK_DAMAGE_DEFLECTION_N 20 // Normal airlock damage deflection
#define AIRLOCK_DAMAGE_DEFLECTION_N 20 // Normal airlock damage deflection // CIT CHANGE - CHANGES DEFAULT AIRLOCK DEFLECTION FROM 21 TO 20
#define AIRLOCK_DAMAGE_DEFLECTION_R 30 // Reinforced airlock damage deflection
#define NOT_ELECTRIFIED 0
@@ -209,23 +209,27 @@
/obj/machinery/door/airlock/narsie_act()
var/turf/T = get_turf(src)
var/runed = prob(20)
var/obj/machinery/door/airlock/cult/A
if(glass)
if(runed)
new/obj/machinery/door/airlock/cult/glass(T)
A = new/obj/machinery/door/airlock/cult/glass(T)
else
new/obj/machinery/door/airlock/cult/unruned/glass(T)
A = new/obj/machinery/door/airlock/cult/unruned/glass(T)
else
if(runed)
new/obj/machinery/door/airlock/cult(T)
A = new/obj/machinery/door/airlock/cult(T)
else
new/obj/machinery/door/airlock/cult/unruned(T)
A = new/obj/machinery/door/airlock/cult/unruned(T)
A.name = name
qdel(src)
/obj/machinery/door/airlock/ratvar_act() //Airlocks become pinion airlocks that only allow servants
var/obj/machinery/door/airlock/clockwork/A
if(glass)
new/obj/machinery/door/airlock/clockwork/brass(get_turf(src))
A = new/obj/machinery/door/airlock/clockwork/brass(get_turf(src))
else
new/obj/machinery/door/airlock/clockwork(get_turf(src))
A = new/obj/machinery/door/airlock/clockwork(get_turf(src))
A.name = name
qdel(src)
/obj/machinery/door/airlock/Destroy()
@@ -251,16 +255,13 @@
note = null
update_icon()
/obj/machinery/door/airlock/proc/unzap() //for addtimer
justzap = FALSE
/obj/machinery/door/airlock/bumpopen(mob/living/user) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite
if(!issilicon(usr))
if(isElectrified())
if(!justzap)
if(shock(user, 100))
justzap = TRUE
addtimer(CALLBACK(src, .proc/unzap), 10)
addtimer(VARSET_CALLBACK(src, justzap, FALSE) , 10)
return
else
return
@@ -568,6 +569,8 @@
/obj/machinery/door/airlock/examine(mob/user)
..()
if(emagged)
to_chat(user, "<span class='warning'>Its access panel is smoking slightly.</span>")
if(charge && !panel_open && in_range(user, src))
to_chat(user, "<span class='warning'>The maintenance panel seems haphazardly fastened.</span>")
if(charge && panel_open)
@@ -1231,7 +1234,6 @@
if(!open())
update_icon(AIRLOCK_CLOSED, 1)
emagged = TRUE
desc = "<span class='warning'>Its access panel is smoking slightly.</span>"
lights = FALSE
locked = TRUE
loseMainPower()
+11 -31
View File
@@ -79,69 +79,49 @@
opacity = 0
glass = TRUE
/obj/machinery/door/airlock/glass_command
icon = 'icons/obj/doors/airlocks/station/command.dmi'
/obj/machinery/door/airlock/command/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_com
glass = TRUE
normal_integrity = 400
/obj/machinery/door/airlock/glass_engineering
icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
/obj/machinery/door/airlock/engineering/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_eng
glass = TRUE
/obj/machinery/door/airlock/glass_security
icon = 'icons/obj/doors/airlocks/station/security.dmi'
/obj/machinery/door/airlock/security/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_sec
glass = TRUE
normal_integrity = 400
/obj/machinery/door/airlock/glass_security/abandoned
/obj/machinery/door/airlock/security/glass/abandoned
abandoned = TRUE
/obj/machinery/door/airlock/glass_medical
icon = 'icons/obj/doors/airlocks/station/medical.dmi'
/obj/machinery/door/airlock/medical/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_med
glass = TRUE
/obj/machinery/door/airlock/glass_research
icon = 'icons/obj/doors/airlocks/station/research.dmi'
/obj/machinery/door/airlock/research/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_research
glass = TRUE
/obj/machinery/door/airlock/glass_mining
icon = 'icons/obj/doors/airlocks/station/mining.dmi'
/obj/machinery/door/airlock/mining/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_min
glass = TRUE
/obj/machinery/door/airlock/glass_atmos
icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
/obj/machinery/door/airlock/atmos/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_atmo
glass = TRUE
/obj/machinery/door/airlock/glass_science
icon = 'icons/obj/doors/airlocks/station/science.dmi'
/obj/machinery/door/airlock/science/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_science
glass = TRUE
/obj/machinery/door/airlock/glass_virology
icon = 'icons/obj/doors/airlocks/station/virology.dmi'
/obj/machinery/door/airlock/virology/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_viro
glass = TRUE
/obj/machinery/door/airlock/glass_maintenance
icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
/obj/machinery/door/airlock/maintenance/glass
opacity = 0
assemblytype = /obj/structure/door_assembly/door_assembly_mai
glass = TRUE
/obj/machinery/door/airlock/maintenance/external/glass
+3 -3
View File
@@ -7,7 +7,7 @@
glass = TRUE
var/datum/radio_frequency/air_connection
var/air_frequency = 1437
var/air_frequency = FREQ_ATMOS_ALARMS
autoclose = FALSE
/obj/machinery/door/airlock/alarmlock/New()
@@ -22,7 +22,7 @@
/obj/machinery/door/airlock/alarmlock/Initialize()
. = ..()
SSradio.remove_object(src, air_frequency)
air_connection = SSradio.add_object(src, air_frequency, GLOB.RADIO_TO_AIRALARM)
air_connection = SSradio.add_object(src, air_frequency, RADIO_TO_AIRALARM)
open()
/obj/machinery/door/airlock/alarmlock/receive_signal(datum/signal/signal)
@@ -41,4 +41,4 @@
close()
if("minor", "clear")
autoclose = FALSE
open()
open()
+2 -2
View File
@@ -112,8 +112,8 @@
return 0
if(!forced)
Radio.set_frequency(GLOB.SEC_FREQ)
Radio.talk_into(src, "Timer has expired. Releasing prisoner.", GLOB.SEC_FREQ, get_default_language())
Radio.set_frequency(FREQ_SECURITY)
Radio.talk_into(src, "Timer has expired. Releasing prisoner.", FREQ_SECURITY)
timing = FALSE
activation_time = null
+18 -2
View File
@@ -32,11 +32,27 @@
var/datum/effect_system/spark_spread/spark_system
var/damage_deflection = 10
var/real_explosion_block //ignore this, just use explosion_block
var/red_alert_access = FALSE //if TRUE, this door will always open on red alert
/obj/machinery/door/examine(mob/user)
..()
if(red_alert_access)
if(GLOB.security_level >= SEC_LEVEL_RED)
to_chat(user, "<span class='notice'>Due to a security threat, its access requirements have been lifted!</span>")
else
to_chat(user, "<span class='notice'>In the event of a red alert, its access requirements will automatically lift.</span>")
to_chat(user, "<span class='notice'>Its maintenance panel is <b>screwed</b> in place.</span>")
/obj/machinery/door/check_access(access)
if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED)
return TRUE
return ..()
/obj/machinery/door/check_access_list(list/access_list)
if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED)
return TRUE
return ..()
/obj/machinery/door/New()
..()
if(density)
@@ -96,7 +112,7 @@
/obj/machinery/door/Move()
var/turf/T = loc
..()
. = ..()
move_update_air(T)
/obj/machinery/door/CanPass(atom/movable/mover, turf/target)
@@ -195,7 +211,7 @@
/obj/machinery/door/emp_act(severity)
if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
INVOKE_ASYNC(src, .proc/open)
if(prob(40/severity))
if(prob(severity*10 - 20))
if(secondsElectrified == 0)
secondsElectrified = -1
shockedby += "\[[time_stamp()]\]EM Pulse"
+1 -1
View File
@@ -26,4 +26,4 @@
/obj/machinery/door/poddoor/shutters/close(ignorepower = 0)
..()
layer = CLOSED_DOOR_LAYER
layer = CLOSED_DOOR_LAYER
+22 -22
View File
@@ -1,25 +1,25 @@
/obj/machinery/door/unpowered
/obj/machinery/door/unpowered
/obj/machinery/door/unpowered/CollidedWith(atom/movable/AM)
if(src.locked)
return
..()
return
/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params)
if(locked)
return
else
return ..()
/obj/machinery/door/unpowered/emag_act()
return
/obj/machinery/door/unpowered/shuttle
icon = 'icons/turf/shuttle.dmi'
name = "door"
icon_state = "door1"
opacity = 1
if(src.locked)
return
..()
return
/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params)
if(locked)
return
else
return ..()
/obj/machinery/door/unpowered/emag_act()
return
/obj/machinery/door/unpowered/shuttle
icon = 'icons/turf/shuttle.dmi'
name = "door"
icon_state = "door1"
opacity = 1
density = TRUE
explosion_block = 1
+2 -1
View File
@@ -192,7 +192,8 @@
add_atom_colour("#7D1919", FIXED_COLOUR_PRIORITY)
/obj/machinery/door/window/ratvar_act()
new/obj/machinery/door/window/clockwork(src.loc, dir)
var/obj/machinery/door/window/clockwork/C = new(loc, dir)
C.name = name
qdel(src)
/obj/machinery/door/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+4
View File
@@ -19,6 +19,10 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
GLOB.doppler_arrays -= src
return ..()
/obj/machinery/doppler_array/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>")
/obj/machinery/doppler_array/process()
return PROCESS_KILL
@@ -17,7 +17,7 @@
var/target_state = AIRLOCK_STATE_CLOSED
var/sensor_pressure = null
/datum/computer/file/embedded_program/airlock_controller/receive_signal(datum/signal/signal, receive_method, receive_param)
/datum/computer/file/embedded_program/airlock_controller/receive_signal(datum/signal/signal)
var/receive_tag = signal.data["tag"]
if(!receive_tag)
return
@@ -68,19 +68,17 @@
state = AIRLOCK_STATE_CLOSED
process_again = 1
else
var/datum/signal/signal = new
signal.data["tag"] = interior_door_tag
signal.data["command"] = "secure_close"
post_signal(signal)
post_signal(new /datum/signal(list(
"tag" = interior_door_tag,
"command" = "secure_close"
)))
else
if(memory["pump_status"] != "off")
var/datum/signal/signal = new
signal.data = list(
post_signal(new /datum/signal(list(
"tag" = airpump_tag,
"power" = 0,
"sigtype"="command"
)
post_signal(signal)
"sigtype" = "command"
)))
if(AIRLOCK_STATE_PRESSURIZE)
if(target_state < state)
@@ -89,16 +87,15 @@
state = AIRLOCK_STATE_INOPEN
process_again = 1
else
var/datum/signal/signal = new
signal.data["tag"] = interior_door_tag
signal.data["command"] = "secure_open"
post_signal(signal)
post_signal(new /datum/signal(list(
"tag" = interior_door_tag,
"command" = "secure_open"
)))
else
var/datum/signal/signal = new
signal.data = list(
var/datum/signal/signal = new(list(
"tag" = airpump_tag,
"sigtype"="command"
)
"sigtype" = "command"
))
if(memory["pump_status"] == "siphon")
signal.data["stabalize"] = 1
else if(memory["pump_status"] != "release")
@@ -114,29 +111,27 @@
state = AIRLOCK_STATE_DEPRESSURIZE
process_again = 1
else
var/datum/signal/signal = new
signal.data["tag"] = interior_door_tag
signal.data["command"] = "secure_close"
post_signal(signal)
post_signal(new /datum/signal(list(
"tag" = interior_door_tag,
"command" = "secure_close"
)))
else if(target_state < state)
if(memory["exterior_status"] == "closed")
state = AIRLOCK_STATE_PRESSURIZE
process_again = 1
else
var/datum/signal/signal = new
signal.data["tag"] = exterior_door_tag
signal.data["command"] = "secure_close"
post_signal(signal)
post_signal(new /datum/signal(list(
"tag" = exterior_door_tag,
"command" = "secure_close"
)))
else
if(memory["pump_status"] != "off")
var/datum/signal/signal = new
signal.data = list(
post_signal(new /datum/signal(list(
"tag" = airpump_tag,
"power" = 0,
"sigtype"="command"
)
post_signal(signal)
"sigtype" = "command"
)))
if(AIRLOCK_STATE_DEPRESSURIZE)
var/target_pressure = ONE_ATMOSPHERE*0.05
@@ -148,10 +143,10 @@
if(memory["exterior_status"] == "open")
state = AIRLOCK_STATE_OUTOPEN
else
var/datum/signal/signal = new
signal.data["tag"] = exterior_door_tag
signal.data["command"] = "secure_open"
post_signal(signal)
post_signal(new /datum/signal(list(
"tag" = exterior_door_tag,
"command" = "secure_open"
)))
else if(target_state < state)
state = AIRLOCK_STATE_CLOSED
process_again = 1
@@ -159,12 +154,10 @@
state = AIRLOCK_STATE_CLOSED
process_again = 1
else
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data = list(
var/datum/signal/signal = new(list(
"tag" = airpump_tag,
"sigtype"="command"
)
"sigtype" = "command"
))
if(memory["pump_status"] == "release")
signal.data["purge"] = 1
else if(memory["pump_status"] != "siphon")
@@ -181,19 +174,17 @@
state = AIRLOCK_STATE_CLOSED
process_again = 1
else
var/datum/signal/signal = new
signal.data["tag"] = exterior_door_tag
signal.data["command"] = "secure_close"
post_signal(signal)
post_signal(new /datum/signal(list(
"tag" = exterior_door_tag,
"command" = "secure_close"
)))
else
if(memory["pump_status"] != "off")
var/datum/signal/signal = new
signal.data = list(
post_signal(new /datum/signal(list(
"tag" = airpump_tag,
"power" = 0,
"sigtype"="command"
)
post_signal(signal)
"sigtype" = "command"
)))
memory["sensor_pressure"] = sensor_pressure
memory["processing"] = state != target_state
@@ -209,7 +200,7 @@
name = "airlock console"
density = FALSE
frequency = 1449
frequency = FREQ_AIRLOCK_CONTROL
power_channel = ENVIRON
// Setup parameters only
@@ -293,4 +284,4 @@
</div>
[state_options]"}
return output
return output
@@ -11,7 +11,7 @@
/datum/computer/file/embedded_program/proc/receive_user_command(command)
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal)
return null
/datum/computer/file/embedded_program/process()
@@ -43,13 +43,9 @@
/obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line)
return 0
/obj/machinery/embedded_controller/receive_signal(datum/signal/signal, receive_method, receive_param)
if(!signal || signal.encryption)
return
if(program)
program.receive_signal(signal, receive_method, receive_param)
//spawn(5) program.process() //no, program.process sends some signals and machines respond and we here again and we lag -rastaf0
/obj/machinery/embedded_controller/receive_signal(datum/signal/signal)
if(istype(signal) && program)
program.receive_signal(signal)
/obj/machinery/embedded_controller/Topic(href, href_list)
if(..())
@@ -5,34 +5,27 @@
/datum/computer/file/embedded_program/simple_vent_controller/receive_user_command(command)
switch(command)
if("vent_inactive")
var/datum/signal/signal = new
signal.data = list(
post_signal(new /datum/signal(list(
"tag" = airpump_tag,
"sigtype"="command"
)
signal.data["power"] = 0
post_signal(signal)
"sigtype" = "command",
"power" = 0
)))
if("vent_pump")
var/datum/signal/signal = new
signal.data = list(
post_signal(new /datum/signal(list(
"tag" = airpump_tag,
"sigtype"="command"
)
signal.data["stabalize"] = 1
signal.data["power"] = 1
post_signal(signal)
"sigtype" = "command",
"stabalize" = 1,
"power" = 1
)))
if("vent_clear")
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data = list(
post_signal(new /datum/signal(list(
"tag" = airpump_tag,
"sigtype"="command"
)
signal.data["purge"] = 1
signal.data["power"] = 1
post_signal(signal)
"sigtype" = "command",
"purge" = 1,
"power" = 1
)))
/datum/computer/file/embedded_program/simple_vent_controller/process()
return 0
@@ -45,7 +38,7 @@
name = "vent controller"
density = FALSE
frequency = 1229
frequency = FREQ_ATMOS_CONTROL
power_channel = ENVIRON
// Setup parameters only
+1 -1
View File
@@ -213,4 +213,4 @@
to_chat(user, "<span class='notice'>[attached ? attached : "No one"] is attached.</span>")
#undef IV_TAKING
#undef IV_INJECTING
#undef IV_INJECTING
+9 -17
View File
@@ -15,7 +15,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 50
var/freq = 1449 // radio frequency
var/freq = FREQ_MAGNETS // radio frequency
var/electricity_level = 1 // intensity of the magnetic pull
var/magnetic_field = 1 // the range of magnetic attraction
var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something
@@ -33,7 +33,7 @@
var/turf/T = loc
hide(T.intact)
center = T
SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS)
SSradio.add_object(src, freq, RADIO_MAGNETS)
return INITIALIZE_HINT_LATELOAD
/obj/machinery/magnetic_module/LateInitialize()
@@ -198,7 +198,7 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 45
var/frequency = 1449
var/frequency = FREQ_MAGNETS
var/code = 0
var/list/magnets = list()
var/title = "Magnetic Control Console"
@@ -224,7 +224,7 @@
if(path) // check for default path
filter_path() // renders rpath
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS)
radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS)
/obj/machinery/magnetic_controller/Destroy()
SSradio.remove_object(src, frequency)
@@ -278,11 +278,7 @@
if(href_list["radio-op"])
// Prepare signal beforehand, because this is a radio operation
var/datum/signal/signal = new
signal.transmission_method = 1 // radio transmission
signal.source = src
signal.frequency = frequency
signal.data["code"] = code
var/datum/signal/signal = new(list("code" = code))
// Apply any necessary commands
switch(href_list["radio-op"])
@@ -302,7 +298,7 @@
// Broadcast the signal
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_MAGNETS)
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
spawn(1)
updateUsrDialog() // pretty sure this increases responsiveness
@@ -345,11 +341,7 @@
looping = 1
// Prepare the radio signal
var/datum/signal/signal = new
signal.transmission_method = 1 // radio transmission
signal.source = src
signal.frequency = frequency
signal.data["code"] = code
var/datum/signal/signal = new(list("code" = code))
if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
pathpos = 1
@@ -370,7 +362,7 @@
// Broadcast the signal
spawn()
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_MAGNETS)
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
if(speed == 10)
sleep(1)
@@ -393,4 +385,4 @@
if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore
rpath += copytext(path, i, i+1) // else, add to list
// there doesn't HAVE to be separators but it makes paths syntatically visible
// there doesn't HAVE to be separators but it makes paths syntatically visible
+2 -2
View File
@@ -15,7 +15,7 @@
var/open = FALSE // true if cover is open
var/locked = TRUE // true if controls are locked
var/freq = 1445 // radio frequency
var/freq = FREQ_NAV_BEACON
var/location = "" // location response text
var/list/codes // assoc. list of transponder codes
var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value"
@@ -205,4 +205,4 @@ Transponder Codes:<UL>"}
codes[newkey] = newval
updateDialog()
updateDialog()
+3 -3
View File
@@ -15,17 +15,17 @@
var/teleporting = 0 //if it's in the process of teleporting
var/power_efficiency = 1
var/obj/machinery/quantumpad/linked_pad
//mapping
var/static/list/mapped_quantum_pads = list()
var/map_pad_id = "" as text //what's my name
var/map_pad_link_id = "" as text //who's my friend
/obj/machinery/quantumpad/Initialize()
. = ..()
if(map_pad_id)
mapped_quantum_pads[map_pad_id] = src
/obj/machinery/quantumpad/Destroy()
mapped_quantum_pads -= map_pad_id
return ..()
+15 -15
View File
@@ -315,13 +315,13 @@ GLOBAL_LIST_EMPTY(allConsoles)
var/radio_freq
switch(text2num(href_list["emergency"]))
if(1) //Security
radio_freq = GLOB.SEC_FREQ
radio_freq = FREQ_SECURITY
emergency = "Security"
if(2) //Engineering
radio_freq = GLOB.ENG_FREQ
radio_freq = FREQ_ENGINEERING
emergency = "Engineering"
if(3) //Medical
radio_freq = GLOB.MED_FREQ
radio_freq = FREQ_MEDICAL
emergency = "Medical"
if(radio_freq)
Radio.set_frequency(radio_freq)
@@ -341,28 +341,28 @@ GLOBAL_LIST_EMPTY(allConsoles)
sending += "<br>"
screen = 7 //if it's successful, this will get overrwritten (7 = unsufccessfull, 6 = successfull)
if (sending)
var/pass = 0
for (var/obj/machinery/message_server/MS in GLOB.machines)
if(!MS.active)
continue
MS.send_rc_message(href_list["department"],department,log_msg,msgStamped,msgVerified,priority)
pass = 1
var/pass = FALSE
var/datum/data_rc_msg/log = new(href_list["department"], department, log_msg, msgStamped, msgVerified, priority)
for (var/obj/machinery/telecomms/message_server/MS in GLOB.telecomms_list)
if (MS.toggled)
MS.rc_msgs += log
pass = TRUE
if(pass)
var/radio_freq = 0
switch(href_list["department"])
if("bridge")
radio_freq = GLOB.COMM_FREQ
radio_freq = FREQ_COMMAND
if("medbay")
radio_freq = GLOB.MED_FREQ
radio_freq = FREQ_MEDICAL
if("science")
radio_freq = GLOB.SCI_FREQ
radio_freq = FREQ_SCIENCE
if("engineering")
radio_freq = GLOB.ENG_FREQ
radio_freq = FREQ_ENGINEERING
if("security")
radio_freq = GLOB.SEC_FREQ
radio_freq = FREQ_SECURITY
if("cargobay" || "mining")
radio_freq = GLOB.SUPP_FREQ
radio_freq = FREQ_SUPPLY
Radio.set_frequency(radio_freq)
var/authentic
if(msgVerified || msgStamped)
+23 -7
View File
@@ -22,7 +22,7 @@
/obj/structure/emergency_shield/Move()
var/turf/T = loc
..()
. = ..()
move_update_air(T)
/obj/structure/emergency_shield/emp_act(severity)
@@ -180,19 +180,25 @@
anchored = FALSE
else if(W.GetID())
if(allowed(user))
if(allowed(user) && !emagged)
locked = !locked
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the controls.</span>")
else if(emagged)
to_chat(user, "<span class='danger'>Error, access controller damaged!</span>")
else
to_chat(user, "<span class='danger'>Access denied.</span>")
else
return ..()
/obj/machinery/shieldgen/emag_act()
if(!(stat & BROKEN))
stat |= BROKEN
update_icon()
/obj/machinery/shieldgen/emag_act(mob/user)
if(emagged)
to_chat(user, "<span class='warning'>The access controller is damaged!</span>")
return
emagged = TRUE
locked = FALSE
playsound(src, "sparks", 100, 1)
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
/obj/machinery/shieldgen/update_icon()
if(active)
@@ -337,9 +343,11 @@
default_unfasten_wrench(user, W, 0)
else if(W.GetID())
if(allowed(user))
if(allowed(user) && !emagged)
locked = !locked
to_chat(user, "<span class='notice'>You [src.locked ? "lock" : "unlock"] the controls.</span>")
else if(emagged)
to_chat(user, "<span class='danger'>Error, access controller damaged!</span>")
else
to_chat(user, "<span class='danger'>Access denied.</span>")
@@ -372,6 +380,14 @@
update_activity()
add_fingerprint(user)
/obj/machinery/shieldwallgen/emag_act(mob/user)
if(emagged)
to_chat(user, "<span class='warning'>The access controller is damaged!</span>")
return
emagged = TRUE
locked = FALSE
playsound(src, "sparks", 100, 1)
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
//////////////Containment Field START
/obj/machinery/shieldwall
+1 -1
View File
@@ -32,7 +32,7 @@
var/index1 // display index for scrolling messages or 0 if non-scrolling
var/index2
var/frequency = 1435 // radio frequency
var/frequency = FREQ_STATUS_DISPLAYS
var/supply_display = 0 // true if a supply shuttle display
var/shuttle_id // Id used for "generic shuttle timer" mode
+115 -106
View File
@@ -53,132 +53,141 @@
**/
// Subtype of /datum/signal with additional processing information.
/datum/signal/subspace
transmission_method = TRANSMISSION_SUBSPACE
var/server_type = /obj/machinery/telecomms/server
var/datum/signal/subspace/original
var/list/levels
/proc/Broadcast_Message(var/atom/movable/AM,
var/vmask, var/obj/item/device/radio/radio,
var/message, var/name, var/job, var/realname,
var/data, var/compression, var/list/level, var/freq, var/list/spans,
var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell, var/datum/language/language)
/datum/signal/subspace/New(data)
src.data = data || list()
/datum/signal/subspace/proc/copy()
var/datum/signal/subspace/copy = new
copy.original = src
copy.source = source
copy.levels = levels
copy.frequency = frequency
copy.server_type = server_type
copy.transmission_method = transmission_method
copy.data = data.Copy()
return copy
/datum/signal/subspace/proc/mark_done()
var/datum/signal/subspace/current = src
while (current)
current.data["done"] = TRUE
current = current.original
/datum/signal/subspace/proc/send_to_receivers()
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
R.receive_signal(src)
for(var/obj/machinery/telecomms/allinone/R in GLOB.telecomms_list)
R.receive_signal(src)
/datum/signal/subspace/proc/broadcast()
set waitfor = FALSE
message = copytext(message, 1, MAX_BROADCAST_LEN)
// Vocal transmissions (i.e. using saycode).
// Despite "subspace" in the name, these transmissions can also be RADIO
// (intercoms and SBRs) or SUPERSPACE (CentCom).
/datum/signal/subspace/vocal
var/atom/movable/virtualspeaker/virt
var/datum/language/language
/datum/signal/subspace/vocal/New(
obj/source, // the originating radio
frequency, // the frequency the signal is taking place on
atom/movable/virtualspeaker/speaker, // representation of the method's speaker
datum/language/language, // the langauge of the message
message, // the text content of the message
spans // the list of spans applied to the message
)
src.source = source
src.frequency = frequency
src.language = language
virt = speaker
var/datum/language/lang_instance = GLOB.language_datum_instances[language]
data = list(
"name" = speaker.name,
"job" = speaker.job,
"message" = message,
"compression" = rand(35, 65),
"language" = lang_instance.name,
"spans" = spans
)
var/turf/T = get_turf(source)
levels = list(T.z)
/datum/signal/subspace/vocal/copy()
var/datum/signal/subspace/vocal/copy = new(source, frequency, virt, language)
copy.original = src
copy.data = data.Copy()
copy.levels = levels
return copy
// This is the meat function for making radios hear vocal transmissions.
/datum/signal/subspace/vocal/broadcast()
set waitfor = FALSE
// Perform final composition steps on the message.
var/message = copytext(data["message"], 1, MAX_BROADCAST_LEN)
if(!message)
return
var/list/radios = list()
var/atom/movable/virtualspeaker/virt = new /atom/movable/virtualspeaker(null)
virt.name = name
virt.job = job
virt.source = AM
virt.radio = radio
virt.verb_say = verb_say
virt.verb_ask = verb_ask
virt.verb_exclaim = verb_exclaim
virt.verb_yell = verb_yell
var/compression = data["compression"]
if(compression > 0)
message = Gibberish(message, compression + 40)
// --- Broadcast only to intercom devices ---
// Assemble the list of radios
var/list/radios = list()
switch (transmission_method)
if (TRANSMISSION_SUBSPACE)
// Reaches any radios on the levels
for(var/obj/item/device/radio/R in GLOB.all_radios["[frequency]"])
if(R.can_receive(frequency, levels))
radios += R
if(data == 1)
for(var/obj/item/device/radio/intercom/R in GLOB.all_radios["[freq]"])
if(R.receive_range(freq, level) > -1)
radios += R
// Syndicate radios can hear all well-known radio channels
if (num2text(frequency) in GLOB.reverseradiochannels)
for(var/obj/item/device/radio/R in GLOB.all_radios["[FREQ_SYNDICATE]"])
if(R.can_receive(FREQ_SYNDICATE, list(R.z)))
radios |= R
// --- Broadcast only to intercoms and station-bounced radios ---
if (TRANSMISSION_RADIO)
// Only radios not currently in subspace mode
for(var/obj/item/device/radio/R in GLOB.all_radios["[frequency]"])
if(!R.subspace_transmission && R.can_receive(frequency, levels))
radios += R
else if(data == 2)
if (TRANSMISSION_SUPERSPACE)
// Only radios which are independent
for(var/obj/item/device/radio/R in GLOB.all_radios["[frequency]"])
if(R.independent && R.can_receive(frequency, levels))
radios += R
for(var/obj/item/device/radio/R in GLOB.all_radios["[freq]"])
if(R.subspace_transmission)
continue
// From the list of radios, find all mobs who can hear those.
var/list/receive = get_mobs_in_radio_ranges(radios)
if(R.receive_range(freq, level) > -1)
radios += R
// --- This space left blank for Syndicate data ---
// --- CentCom radio, yo. ---
else if(data == 5)
for(var/obj/item/device/radio/R in GLOB.all_radios["[freq]"])
if(!R.independent)
continue
if(R.receive_range(freq, level) > -1)
radios += R
// --- Broadcast to ALL radio devices ---
else
for(var/obj/item/device/radio/R in GLOB.all_radios["[freq]"])
if(R.receive_range(freq, level) > -1)
radios += R
var/freqtext = num2text(freq)
for(var/obj/item/device/radio/R in GLOB.all_radios["[GLOB.SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving.
if(R.receive_range(GLOB.SYND_FREQ, list(R.z)) > -1 && freqtext in GLOB.reverseradiochannels)
radios |= R
// Get a list of mobs who can hear from the radios we collected.
var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers.
for(var/mob/R in receive) //Filter receiver list.
if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
// Cut out mobs with clients who are admins and have radio chatter disabled.
for(var/mob/R in receive)
if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO))
receive -= R
for(var/mob/M in GLOB.player_list)
if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO))
// Add observers who have ghost radio enabled.
for(var/mob/dead/observer/M in GLOB.player_list)
if(M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO))
receive |= M
var/rendered = virt.compose_message(virt, language, message, freq, spans) //Always call this on the virtualspeaker to advoid issues.
// Render the message and have everybody hear it.
// Always call this on the virtualspeaker to avoid issues.
var/spans = data["spans"]
var/rendered = virt.compose_message(virt, language, message, frequency, spans)
for(var/atom/movable/hearer in receive)
hearer.Hear(rendered, virt, language, message, freq, spans)
hearer.Hear(rendered, virt, language, message, frequency, spans)
// This following recording is intended for research and feedback in the use of department radio channels
if(length(receive))
// --- This following recording is intended for research and feedback in the use of department radio channels ---
SSblackbox.LogBroadcast(freq)
SSblackbox.LogBroadcast(frequency)
sleep(50)
if(!QDELETED(virt)) //It could happen to YOU
qdel(virt)
//Use this to test if an obj can communicate with a Telecommunications Network
/atom/proc/test_telecomms()
var/datum/signal/signal = telecomms_process()
var/turf/position = get_turf(src)
return (position.z in signal.data["level"] && signal.data["done"])
/atom/proc/telecomms_process()
// First, we want to generate a new radio signal
var/datum/signal/signal = new
signal.transmission_method = 2 // 2 would be a subspace transmission.
var/turf/pos = get_turf(src)
// --- Finally, tag the actual signal with the appropriate values ---
signal.data = list(
"slow" = 0, // how much to sleep() before broadcasting - simulates net lag
"message" = "TEST",
"compression" = rand(45, 50), // If the signal is compressed, compress our message too.
"traffic" = 0, // dictates the total traffic sum that the signal went through
"type" = 4, // determines what type of radio input it is: test broadcast
"reject" = 0,
"done" = 0,
"level" = pos.z // The level it is being broadcasted at.
)
signal.frequency = 1459// Common channel
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
R.receive_signal(signal)
sleep(rand(10,25))
return signal
QDEL_IN(virt, 50) // Make extra sure the virtualspeaker gets qdeleted
@@ -0,0 +1,456 @@
/*
The monitoring computer for the messaging server.
Lets you read PDA and request console messages.
*/
// The monitor itself.
/obj/machinery/computer/message_monitor
name = "message monitor console"
desc = "Used to monitor the crew's PDA messages, as well as request console messages."
icon_screen = "comm_logs"
circuit = /obj/item/circuitboard/computer/message_monitor
//Server linked to.
var/obj/machinery/telecomms/message_server/linkedServer = null
//Sparks effect - For emag
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
//Messages - Saves me time if I want to change something.
var/noserver = "<span class='alert'>ALERT: No server detected.</span>"
var/incorrectkey = "<span class='warning'>ALERT: Incorrect decryption key!</span>"
var/defaultmsg = "<span class='notice'>Welcome. Please select an option.</span>"
var/rebootmsg = "<span class='warning'>%$&(: Critical %$$@ Error // !RestArting! <lOadiNg backUp iNput ouTput> - ?pLeaSe wAit!</span>"
//Computer properties
var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message
var/hacking = 0 // Is it being hacked into by the AI/Cyborg
var/message = "<span class='notice'>System bootup complete. Please select an option.</span>" // The message that shows on the main menu.
var/auth = 0 // Are they authenticated?
var/optioncount = 7
// Custom Message Properties
var/customsender = "System Administrator"
var/obj/item/device/pda/customrecepient = null
var/customjob = "Admin"
var/custommessage = "This is a test, please ignore."
light_color = LIGHT_COLOR_GREEN
/obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params)
if(istype(O, /obj/item/screwdriver) && emagged)
//Stops people from just unscrewing the monitor and putting it back to get the console working again.
to_chat(user, "<span class='warning'>It is too hot to mess with!</span>")
else
return ..()
/obj/machinery/computer/message_monitor/emag_act(mob/user)
if(emagged)
return
if(!isnull(linkedServer))
emagged = TRUE
screen = 2
spark_system.set_up(5, 0, src)
src.spark_system.start()
var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
// Will help make emagging the console not so easy to get away with.
MK.info += "<br><br><font color='red'>%@%(*$%&(&?*(%&/{}</font>"
var/time = 100 * length(linkedServer.decryptkey)
addtimer(CALLBACK(src, .proc/UnmagConsole), time)
message = rebootmsg
else
to_chat(user, "<span class='notice'>A no server error appears on the screen.</span>")
/obj/machinery/computer/message_monitor/Initialize()
..()
return INITIALIZE_HINT_LATELOAD
/obj/machinery/computer/message_monitor/LateInitialize()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
for(var/obj/machinery/telecomms/message_server/S in GLOB.telecomms_list)
linkedServer = S
break
/obj/machinery/computer/message_monitor/attack_hand(mob/living/user)
if(..())
return
//If the computer is being hacked or is emagged, display the reboot message.
if(hacking || emagged)
message = rebootmsg
var/dat = "<center><font color='blue'[message]</font>/</center>"
if(auth)
dat += "<h4><dd><A href='?src=[REF(src)];auth=1'>&#09;<font color='green'>\[Authenticated\]</font></a>&#09;/"
dat += " Server Power: <A href='?src=[REF(src)];active=1'>[src.linkedServer && src.linkedServer.toggled ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</a></h4>"
else
dat += "<h4><dd><A href='?src=[REF(src)];auth=1'>&#09;<font color='red'>\[Unauthenticated\]</font></a>&#09;/"
dat += " Server Power: <u>[src.linkedServer && src.linkedServer.toggled ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</u></h4>"
if(hacking || emagged)
screen = 2
else if(!auth || !linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
screen = 0
switch(screen)
//Main menu
if(0)
//&#09; = TAB
var/i = 0
dat += "<dd><A href='?src=[REF(src)];find=1'>&#09;[++i]. Link To A Server</a></dd>"
if(auth)
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
dat += "<dd><A>&#09;ERROR: Server not found!</A><br></dd>"
else
dat += "<dd><A href='?src=[REF(src)];view=1'>&#09;[++i]. View Message Logs </a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];viewr=1'>&#09;[++i]. View Request Console Logs </a></br></dd>"
dat += "<dd><A href='?src=[REF(src)];clear=1'>&#09;[++i]. Clear Message Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];clearr=1'>&#09;[++i]. Clear Request Console Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];pass=1'>&#09;[++i]. Set Custom Key</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];msg=1'>&#09;[++i]. Send Admin Message</a><br></dd>"
else
for(var/n = ++i; n <= optioncount; n++)
dat += "<dd><font color='blue'>&#09;[n]. ---------------</font><br></dd>"
if(issilicon(usr) && is_special_character(usr))
//Malf/Traitor AIs can bruteforce into the system to gain the Key.
dat += "<dd><A href='?src=[REF(src)];hack=1'><i><font color='Red'>*&@#. Bruteforce Key</font></i></font></a><br></dd>"
else
dat += "<br>"
//Bottom message
if(!auth)
dat += "<br><hr><dd><span class='notice'>Please authenticate with the server in order to show additional options.</span>"
else
dat += "<br><hr><dd><span class='warning'>Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties.</span>"
//Message Logs
if(1)
var/index = 0
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];refresh=1'>Refresh</a></center><hr>"
dat += "<table border='1' width='100%'><tr><th width = '5%'>X</th><th width='15%'>Sender</th><th width='15%'>Recipient</th><th width='300px' word-wrap: break-word>Message</th></tr>"
for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
index++
if(index > 3000)
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
dat += "<tr><td width = '5%'><center><A href='?src=[REF(src)];delete=[REF(pda)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[pda.sender]</td><td width='15%'>[pda.recipient]</td><td width='300px'>[pda.message][pda.photo ? " <a href='byond://?src=[REF(pda)];photo=1'>(Photo)</a>":""]</td></tr>"
dat += "</table>"
//Hacking screen.
if(2)
if(isAI(user) || iscyborg(user))
dat += "Brute-forcing for server key.<br> It will take 20 seconds for every character that the password has."
dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time."
else
//It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever.
dat += {"01000010011100100111010101110100011001010010110<br>
10110011001101111011100100110001101101001011011100110011<br>
10010000001100110011011110111001000100000011100110110010<br>
10111001001110110011001010111001000100000011010110110010<br>
10111100100101110001000000100100101110100001000000111011<br>
10110100101101100011011000010000001110100011000010110101<br>
10110010100100000001100100011000000100000011100110110010<br>
10110001101101111011011100110010001110011001000000110011<br>
00110111101110010001000000110010101110110011001010111001<br>
00111100100100000011000110110100001100001011100100110000<br>
10110001101110100011001010111001000100000011101000110100<br>
00110000101110100001000000111010001101000011001010010000<br>
00111000001100001011100110111001101110111011011110111001<br>
00110010000100000011010000110000101110011001011100010000<br>
00100100101101110001000000111010001101000011001010010000<br>
00110110101100101011000010110111001110100011010010110110<br>
10110010100101100001000000111010001101000011010010111001<br>
10010000001100011011011110110111001110011011011110110110<br>
00110010100100000011000110110000101101110001000000111001<br>
00110010101110110011001010110000101101100001000000111100<br>
10110111101110101011100100010000001110100011100100111010<br>
10110010100100000011010010110111001110100011001010110111<br>
00111010001101001011011110110111001110011001000000110100<br>
10110011000100000011110010110111101110101001000000110110<br>
00110010101110100001000000111001101101111011011010110010<br>
10110111101101110011001010010000001100001011000110110001<br>
10110010101110011011100110010000001101001011101000010111<br>
00010000001001101011000010110101101100101001000000111001<br>
10111010101110010011001010010000001101110011011110010000<br>
00110100001110101011011010110000101101110011100110010000<br>
00110010101101110011101000110010101110010001000000111010<br>
00110100001100101001000000111001001101111011011110110110<br>
10010000001100100011101010111001001101001011011100110011<br>
10010000001110100011010000110000101110100001000000111010<br>
001101001011011010110010100101110"}
//Fake messages
if(3)
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];Reset=1'>Reset</a></center><hr>"
dat += {"<table border='1' width='100%'>
<tr><td width='20%'><A href='?src=[REF(src)];select=Sender'>Sender</a></td>
<td width='20%'><A href='?src=[REF(src)];select=RecJob'>Sender's Job</a></td>
<td width='20%'><A href='?src=[REF(src)];select=Recepient'>Recipient</a></td>
<td width='300px' word-wrap: break-word><A href='?src=[REF(src)];select=Message'>Message</a></td></tr>"}
//Sender - Sender's Job - Recepient - Message
//Al Green- Your Dad - Your Mom - WHAT UP!?
dat += {"<tr><td width='20%'>[customsender]</td>
<td width='20%'>[customjob]</td>
<td width='20%'>[customrecepient ? customrecepient.owner : "NONE"]</td>
<td width='300px'>[custommessage]</td></tr>"}
dat += "</table><br><center><A href='?src=[REF(src)];select=Send'>Send</a>"
//Request Console Logs
if(4)
var/index = 0
/* data_rc_msg
X - 5%
var/rec_dpt = "Unspecified" //name of the person - 15%
var/send_dpt = "Unspecified" //name of the sender- 15%
var/message = "Blank" //transferred message - 300px
var/stamp = "Unstamped" - 15%
var/id_auth = "Unauthenticated" - 15%
var/priority = "Normal" - 10%
*/
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];refresh=1'>Refresh</a></center><hr>"
dat += {"<table border='1' width='100%'><tr><th width = '5%'>X</th><th width='15%'>Sending Dep.</th><th width='15%'>Receiving Dep.</th>
<th width='300px' word-wrap: break-word>Message</th><th width='15%'>Stamp</th><th width='15%'>ID Auth.</th><th width='15%'>Priority.</th></tr>"}
for(var/datum/data_rc_msg/rc in src.linkedServer.rc_msgs)
index++
if(index > 3000)
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
dat += {"<tr><td width = '5%'><center><A href='?src=[REF(src)];deleter=[REF(rc)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[rc.send_dpt]</td>
<td width='15%'>[rc.rec_dpt]</td><td width='300px'>[rc.message]</td><td width='15%'>[rc.stamp]</td><td width='15%'>[rc.id_auth]</td><td width='15%'>[rc.priority]</td></tr>"}
dat += "</table>"
message = defaultmsg
var/datum/browser/popup = new(user, "hologram_console", name, 700, 700)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/message_monitor/proc/BruteForce(mob/user)
if(isnull(linkedServer))
to_chat(user, "<span class='warning'>Could not complete brute-force: Linked Server Disconnected!</span>")
else
var/currentKey = src.linkedServer.decryptkey
to_chat(user, "<span class='warning'>Brute-force completed! The key is '[currentKey]'.</span>")
src.hacking = 0
src.screen = 0 // Return the screen back to normal
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
emagged = FALSE
/obj/machinery/computer/message_monitor/proc/ResetMessage()
customsender = "System Administrator"
customrecepient = null
custommessage = "This is a test, please ignore."
customjob = "Admin"
/obj/machinery/computer/message_monitor/Topic(href, href_list)
if(..())
return
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr))
//Authenticate
if (href_list["auth"])
if(!linkedServer || linkedServer.stat & (NOPOWER|BROKEN))
message = noserver
else
if(auth)
auth = 0
screen = 0
else
var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
auth = 1
else
message = incorrectkey
//Turn the server on/off.
if (href_list["active"])
if(auth)
linkedServer.toggled = !linkedServer.toggled
//Find a server
if (href_list["find"])
var/list/message_servers = list()
for (var/obj/machinery/telecomms/message_server/M in GLOB.telecomms_list)
message_servers += M
if(message_servers.len > 1)
linkedServer = input(usr, "Please select a server.", "Select a server.", null) as null|anything in message_servers
message = "<span class='alert'>NOTICE: Server selected.</span>"
else if(message_servers.len > 0)
linkedServer = message_servers[1]
message = "<span class='notice'>NOTICE: Only Single Server Detected - Server selected.</span>"
else
message = noserver
//View the logs - KEY REQUIRED
if (href_list["view"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 1
//Clears the logs - KEY REQUIRED
if (href_list["clear"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.linkedServer.pda_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
//Clears the request console logs - KEY REQUIRED
if (href_list["clearr"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.linkedServer.rc_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
//Change the password - KEY REQUIRED
if (href_list["pass"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
var/dkey = trim(stripped_input(usr, "Please enter the decryption key."))
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
if(length(newkey) <= 3)
message = "<span class='notice'>NOTICE: Decryption key too short!</span>"
else if(length(newkey) > 16)
message = "<span class='notice'>NOTICE: Decryption key too long!</span>"
else if(newkey && newkey != "")
src.linkedServer.decryptkey = newkey
message = "<span class='notice'>NOTICE: Decryption key set.</span>"
else
message = incorrectkey
//Hack the Console to get the password
if (href_list["hack"])
if(issilicon(usr) && is_special_character(usr))
src.hacking = 1
src.screen = 2
//Time it takes to bruteforce is dependant on the password length.
spawn(100*length(src.linkedServer.decryptkey))
if(src && src.linkedServer && usr)
BruteForce(usr)
//Delete the log.
if (href_list["delete"])
//Are they on the view logs screen?
if(screen == 1)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.pda_msgs -= locate(href_list["delete"])
message = "<span class='notice'>NOTICE: Log Deleted!</span>"
//Delete the request console log.
if (href_list["deleter"])
//Are they on the view logs screen?
if(screen == 4)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.rc_msgs -= locate(href_list["deleter"])
message = "<span class='notice'>NOTICE: Log Deleted!</span>"
//Create a custom message
if (href_list["msg"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 3
//Fake messaging selection - KEY REQUIRED
if (href_list["select"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
screen = 0
else
switch(href_list["select"])
//Reset
if("Reset")
ResetMessage()
//Select Your Name
if("Sender")
customsender = stripped_input(usr, "Please enter the sender's name.") || customsender
//Select Receiver
if("Recepient")
//Get out list of viable PDAs
var/list/obj/item/device/pda/sendPDAs = get_viewable_pdas()
if(GLOB.PDAs && GLOB.PDAs.len > 0)
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortNames(sendPDAs)
else
customrecepient = null
//Enter custom job
if("RecJob")
customjob = stripped_input(usr, "Please enter the sender's job.") || customjob
//Enter message
if("Message")
custommessage = stripped_input(usr, "Please enter your message.") || custommessage
//Send message
if("Send")
if(isnull(customsender) || customsender == "")
customsender = "UNKNOWN"
if(isnull(customrecepient))
message = "<span class='notice'>NOTICE: No recepient selected!</span>"
return src.attack_hand(usr)
if(isnull(custommessage) || custommessage == "")
message = "<span class='notice'>NOTICE: No message entered!</span>"
return src.attack_hand(usr)
var/datum/signal/subspace/pda/signal = new(src, list(
"name" = "[customsender]",
"job" = "[customjob]",
"message" = custommessage,
"targets" = list("[customrecepient.owner] ([customrecepient.ownjob])")
))
// this will log the signal and transmit it to the target
linkedServer.receive_information(signal, null)
//Request Console Logs - KEY REQUIRED
if(href_list["viewr"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 4
if (href_list["back"])
src.screen = 0
return src.attack_hand(usr)
/obj/item/paper/monitorkey
name = "monitor decryption key"
/obj/item/paper/monitorkey/Initialize(mapload, obj/machinery/telecomms/message_server/server)
..()
if (server)
print(server)
return INITIALIZE_HINT_NORMAL
else
return INITIALIZE_HINT_LATELOAD
/obj/item/paper/monitorkey/proc/print(obj/machinery/telecomms/message_server/server)
info = "<center><h2>Daily Key Reset</h2></center><br>The new message monitor key is '[server.decryptkey]'.<br>Please keep this a secret and away from the clown.<br>If necessary, change the password to a more secure one."
info_links = info
add_overlay("paper_words")
/obj/item/paper/monitorkey/LateInitialize()
for (var/obj/machinery/telecomms/message_server/server in GLOB.telecomms_list)
if (server.decryptkey)
print(server)
break
@@ -102,23 +102,8 @@
dat += "</font>"
temp = ""
user << browse(dat, "window=tcommachine;size=520x500;can_resize=0")
onclose(user, "dormitory")
// Off-Site Relays
//
// You are able to send/receive signals from the station's z level (changeable in the ZLEVEL_STATION_PRIMARY #define) if
/obj/machinery/telecomms/relay/proc/toggle_level()
var/turf/position = get_turf(src)
// Toggle on/off getting signals from the station or the current Z level
if(listening_level in GLOB.station_z_levels) // equals the station
listening_level = position.z
return TRUE
return FALSE
onclose(user, "tcommachine")
return TRUE
// Returns a multitool from a user depending on their mobtype.
@@ -234,7 +219,7 @@
if(newfreq && canAccess(usr))
if(findtext(num2text(newfreq), "."))
newfreq *= 10 // shift the decimal one place
if(newfreq == GLOB.SYND_FREQ)
if(newfreq == FREQ_SYNDICATE)
temp = "<font color = #FF0000>-% Error: Interference preventing filtering frequency: \"[newfreq] GHz\" %-</font color>"
else
if(!(newfreq in freq_listening) && newfreq < 10000)
@@ -11,50 +11,31 @@
anchored = TRUE
use_power = NO_POWER_USE
idle_power_usage = 0
machinetype = 6
var/intercept = FALSE // if TRUE, broadcasts all syndie messages to syndicate channel
var/intercept = FALSE // If true, only works on the Syndicate frequency.
/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal)
/obj/machinery/telecomms/allinone/Initialize()
..()
if (intercept)
freq_listening = list(FREQ_SYNDICATE)
if(!on) // has to be on to receive messages
/obj/machinery/telecomms/allinone/receive_signal(datum/signal/subspace/signal)
if(!istype(signal) || signal.transmission_method != TRANSMISSION_SUBSPACE) // receives on subspace only
return
if(!on || !is_freq_listening(signal)) // has to be on to receive messages
return
if (!intercept && !(z in signal.levels) && !(0 in signal.levels)) // has to be syndicate or on the right level
return
if(is_freq_listening(signal)) // detect subspace signals
// Decompress the signal and mark it done
if (intercept)
signal.levels += 0 // Signal is broadcast to agents anywhere
signal.data["done"] = 1 // mark the signal as being broadcasted
signal.data["compression"] = 0
// Search for the original signal and mark it as done as well
var/datum/signal/original = signal.data["original"]
if(original)
original.data["done"] = 1
if(signal.data["slow"] > 0)
sleep(signal.data["slow"]) // simulate the network lag if necessary
/* ###### Copy all syndie communications to the Syndicate Frequency ###### */
if(intercept && signal.frequency == GLOB.SYND_FREQ)
Broadcast_Message(signal.data["mob"],
signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"],, signal.data["compression"], list(0, z), GLOB.SYND_FREQ, signal.data["spans"],
signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"],
signal.data["language"])
/* ###### Broadcast a message using signal.data ###### */
else if(!intercept)
Broadcast_Message(signal.data["mob"],
signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency, signal.data["spans"],
signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"],
signal.data["language"])
signal.data["compression"] = 0
signal.mark_done()
if(signal.data["slow"] > 0)
sleep(signal.data["slow"]) // simulate the network lag if necessary
signal.broadcast()
/obj/machinery/telecomms/allinone/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/device/multitool))
attack_hand(user)
@@ -16,70 +16,45 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 25
machinetype = 5
circuit = /obj/item/circuitboard/machine/telecomms/broadcaster
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from)
// Don't broadcast rejected signals
if(!istype(signal))
return
if(signal.data["reject"])
return
if(!signal.data["message"])
return
if(signal.data["message"])
// Prevents massive radio spam
signal.mark_done()
var/datum/signal/subspace/original = signal.original
if(original && ("compression" in signal.data))
original.data["compression"] = signal.data["compression"]
var/turf/T = get_turf(src)
if (T)
signal.levels |= T.z
// Prevents massive radio spam
signal.data["done"] = 1 // mark the signal as being broadcasted
// Search for the original signal and mark it as done as well
var/datum/signal/original = signal.data["original"]
if(original)
original.data["done"] = 1
original.data["compression"] = signal.data["compression"]
original.data["level"] = signal.data["level"]
var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["name"]]"
if(signal_message in GLOB.recentmessages)
return
GLOB.recentmessages.Add(signal_message)
var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]"
if(signal_message in GLOB.recentmessages)
return
GLOB.recentmessages.Add(signal_message)
if(signal.data["slow"] > 0)
sleep(signal.data["slow"]) // simulate the network lag if necessary
if(signal.data["slow"] > 0)
sleep(signal.data["slow"]) // simulate the network lag if necessary
signal.broadcast()
signal.data["level"] |= listening_level
if(!GLOB.message_delay)
GLOB.message_delay = 1
spawn(10)
GLOB.message_delay = 0
GLOB.recentmessages = list()
/** #### - Normal Broadcast - #### **/
if(signal.data["type"] == 0)
/* ###### Broadcast a message using signal.data ###### */
Broadcast_Message(signal.data["mob"],
signal.data["vmask"], signal.data["radio"],
signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"],
0, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"],
signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"], signal.data["language"])
/** #### - Artificial Broadcast - #### **/
// (Imitates a mob)
if(signal.data["type"] == 2)
/* ###### Broadcast a message using signal.data ###### */
// Parameter "data" as 4: AI can't track this person/mob
Broadcast_Message(signal.data["mob"],
signal.data["vmask"],
signal.data["radio"], signal.data["message"],
signal.data["name"], signal.data["job"],
signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"],
signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"], signal.data["language"])
if(!GLOB.message_delay)
GLOB.message_delay = 1
spawn(10)
GLOB.message_delay = 0
GLOB.recentmessages = list()
/* --- Do a snazzy animation! --- */
flick("broadcaster_send", src)
/* --- Do a snazzy animation! --- */
flick("broadcaster_send", src)
/obj/machinery/telecomms/broadcaster/Destroy()
// In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore.
+26 -29
View File
@@ -16,68 +16,65 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 50
machinetype = 2
netspeed = 40
circuit = /obj/item/circuitboard/machine/telecomms/bus
var/change_frequency = 0
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
/obj/machinery/telecomms/bus/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from)
if(!istype(signal) || !is_freq_listening(signal))
return
if(is_freq_listening(signal))
if(change_frequency)
if(signal.frequency != GLOB.SYND_FREQ)
signal.frequency = change_frequency
if(change_frequency && signal.frequency != FREQ_SYNDICATE)
signal.frequency = change_frequency
if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it
// send to one linked processor unit
var/send_to_processor = relay_information(signal, "/obj/machinery/telecomms/processor")
if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it
// send to one linked processor unit
if(relay_information(signal, /obj/machinery/telecomms/processor))
return
if(send_to_processor)
return
// failed to send to a processor, relay information anyway
signal.data["slow"] += rand(1, 5) // slow the signal down only slightly
src.receive_information(signal, src)
// failed to send to a processor, relay information anyway
signal.data["slow"] += rand(1, 5) // slow the signal down only slightly
// Try sending it!
var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster", "/obj/machinery/telecomms/bus")
var/i = 0
for(var/send in try_send)
if(i)
signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
i++
var/can_send = relay_information(signal, send)
if(can_send)
break
// Try sending it!
var/list/try_send = list(signal.server_type, /obj/machinery/telecomms/hub, /obj/machinery/telecomms/broadcaster, /obj/machinery/telecomms/bus)
var/i = 0
for(var/send in try_send)
if(i)
signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
i++
if(relay_information(signal, send))
break
//Preset Buses
/obj/machinery/telecomms/bus/preset_one
id = "Bus 1"
network = "tcommsat"
freq_listening = list(GLOB.SCI_FREQ, GLOB.MED_FREQ)
freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL)
autolinkers = list("processor1", "science", "medical")
/obj/machinery/telecomms/bus/preset_two
id = "Bus 2"
network = "tcommsat"
freq_listening = list(GLOB.SUPP_FREQ,GLOB.SERV_FREQ)
freq_listening = list(FREQ_SUPPLY, FREQ_SERVICE)
autolinkers = list("processor2", "supply", "service")
/obj/machinery/telecomms/bus/preset_three
id = "Bus 3"
network = "tcommsat"
freq_listening = list(GLOB.SEC_FREQ, GLOB.COMM_FREQ)
freq_listening = list(FREQ_SECURITY, FREQ_COMMAND)
autolinkers = list("processor3", "security", "command")
/obj/machinery/telecomms/bus/preset_four
id = "Bus 4"
network = "tcommsat"
freq_listening = list(GLOB.ENG_FREQ)
freq_listening = list(FREQ_ENGINEERING)
autolinkers = list("processor4", "engineering", "common")
/obj/machinery/telecomms/bus/preset_four/Initialize()
. = ..()
for(var/i = 1441, i < 1489, i += 2)
for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2)
freq_listening |= i
/obj/machinery/telecomms/bus/preset_one/birdstation
+12 -11
View File
@@ -1,4 +1,3 @@
/*
The HUB idles until it receives information. It then passes on that information
depending on where it came from.
@@ -17,20 +16,22 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 80
machinetype = 7
long_range_link = 1
long_range_link = TRUE
netspeed = 40
circuit = /obj/item/circuitboard/machine/telecomms/hub
/obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
if(istype(machine_from, /obj/machinery/telecomms/receiver))
//If the signal is compressed, send it to the bus.
relay_information(signal, "/obj/machinery/telecomms/bus", 1) // ideally relay the copied information to bus units
else
// Get a list of relays that we're linked to, then send the signal to their levels.
relay_information(signal, "/obj/machinery/telecomms/relay", 1)
relay_information(signal, "/obj/machinery/telecomms/broadcaster", 1) // Send it to a broadcaster.
if(!is_freq_listening(signal))
return
if(istype(machine_from, /obj/machinery/telecomms/receiver))
// It's probably compressed so send it to the bus.
relay_information(signal, /obj/machinery/telecomms/bus, TRUE)
else
// Send it to each relay so their levels get added...
relay_information(signal, /obj/machinery/telecomms/relay)
// Then broadcast that signal to
relay_information(signal, /obj/machinery/telecomms/broadcaster)
//Preset HUB
@@ -0,0 +1,180 @@
/*
The equivalent of the server, for PDA and request console messages.
Without it, PDA and request console messages cannot be transmitted.
PDAs require the rest of the telecomms setup, but request consoles only
require the message server.
*/
// A decorational representation of SSblackbox, usually placed alongside the message server.
/obj/machinery/blackbox_recorder
icon = 'icons/obj/stationobjs.dmi'
icon_state = "blackbox"
name = "Blackbox Recorder"
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
// The message server itself.
/obj/machinery/telecomms/message_server
icon = 'icons/obj/machines/research.dmi'
icon_state = "server"
name = "Messaging Server"
desc = "A machine that attempts to gather the secret knowledge of the universe."
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
id = "Messaging Server"
network = "tcommsat"
autolinkers = list("common")
var/list/datum/data_pda_msg/pda_msgs = list()
var/list/datum/data_rc_msg/rc_msgs = list()
var/decryptkey
/obj/machinery/telecomms/message_server/Initialize()
. = ..()
if (!decryptkey)
decryptkey = GenerateKey()
pda_msgs += new /datum/data_pda_msg("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.")
/obj/machinery/telecomms/message_server/proc/GenerateKey()
var/newKey
newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le")
newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai")
newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
return newKey
/obj/machinery/telecomms/message_server/process()
if(toggled && (stat & (BROKEN|NOPOWER)))
toggled = FALSE
update_icon()
/obj/machinery/telecomms/message_server/receive_information(datum/signal/subspace/pda/signal, obj/machinery/telecomms/machine_from)
// can't log non-PDA signals
if(!istype(signal) || !signal.data["message"] || !toggled)
return
// log the signal
var/datum/data_pda_msg/M = new(signal.format_target(), "[signal.data["name"]] ([signal.data["job"]])", signal.data["message"], signal.data["photo"])
pda_msgs += M
signal.logged = M
// pass it along to either the hub or the broadcaster
if(!relay_information(signal, /obj/machinery/telecomms/hub))
relay_information(signal, /obj/machinery/telecomms/broadcaster)
/obj/machinery/telecomms/message_server/update_icon()
if((stat & (BROKEN|NOPOWER)))
icon_state = "server-nopower"
else if (!toggled)
icon_state = "server-off"
else
icon_state = "server-on"
// Repath for maps
/obj/machinery/message_server
parent_type = /obj/machinery/telecomms/message_server
// PDA signal datum
/datum/signal/subspace/pda
frequency = FREQ_COMMON
server_type = /obj/machinery/telecomms/message_server
var/datum/data_pda_msg/logged
/datum/signal/subspace/pda/New(source, data)
src.source = source
src.data = data
var/turf/T = get_turf(source)
levels = list(T.z)
/datum/signal/subspace/pda/copy()
var/datum/signal/subspace/pda/copy = new(source, data.Copy())
copy.original = src
copy.levels = levels
return copy
/datum/signal/subspace/pda/proc/format_target()
if (length(data["targets"]) > 1)
return "Everyone"
return data["targets"][1]
/datum/signal/subspace/pda/proc/format_message()
if (logged && data["photo"])
return "\"[data["message"]]\" (<a href='byond://?src=[REF(logged)];photo=1'>Photo</a>)"
return "\"[data["message"]]\""
/datum/signal/subspace/pda/broadcast()
if (!logged) // Can only go through if a message server logs it
return
for (var/obj/item/device/pda/P in GLOB.PDAs)
if ("[P.owner] ([P.ownjob])" in data["targets"])
P.receive_message(src)
// Log datums stored by the message server.
/datum/data_pda_msg
var/sender = "Unspecified"
var/recipient = "Unspecified"
var/message = "Blank" // transferred message
var/icon/photo // attached photo
/datum/data_pda_msg/New(param_rec, param_sender, param_message, param_photo)
if(param_rec)
recipient = param_rec
if(param_sender)
sender = param_sender
if(param_message)
message = param_message
if(param_photo)
photo = param_photo
/datum/data_pda_msg/Topic(href,href_list)
..()
if(href_list["photo"])
var/mob/M = usr
M << browse_rsc(photo, "pda_photo.png")
M << browse("<html><head><title>PDA Photo</title></head>" \
+ "<body style='overflow:hidden;margin:0;text-align:center'>" \
+ "<img src='pda_photo.png' width='192' style='-ms-interpolation-mode:nearest-neighbor' />" \
+ "</body></html>", "window=pdaphoto;size=192x192")
onclose(M, "pdaphoto")
/datum/data_rc_msg
var/rec_dpt = "Unspecified" // receiving department
var/send_dpt = "Unspecified" // sending department
var/message = "Blank"
var/stamp = "Unstamped"
var/id_auth = "Unauthenticated"
var/priority = "Normal"
/datum/data_rc_msg/New(param_rec, param_sender, param_message, param_stamp, param_id_auth, param_priority)
if(param_rec)
rec_dpt = param_rec
if(param_sender)
send_dpt = param_sender
if(param_message)
message = param_message
if(param_stamp)
stamp = param_stamp
if(param_id_auth)
id_auth = param_id_auth
if(param_priority)
switch(param_priority)
if(1)
priority = "Normal"
if(2)
priority = "High"
if(3)
priority = "Extreme"
else
priority = "Undetermined"
@@ -1,4 +1,3 @@
/*
The processor is a very simple machine that decompresses subspace signals and
transfers them back to the original bus. It is essential in producing audible
@@ -15,24 +14,23 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 30
machinetype = 3
circuit = /obj/item/circuitboard/machine/telecomms/processor
var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals
/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
/obj/machinery/telecomms/processor/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from)
if(!is_freq_listening(signal))
return
if(is_freq_listening(signal))
if (!process_mode)
signal.data["compression"] = 100 // even more compressed signal
else if (signal.data["compression"])
signal.data["compression"] = 0 // uncompress subspace signal
if(process_mode)
signal.data["compression"] = 0 // uncompress subspace signal
else
signal.data["compression"] = 100 // even more compressed signal
if(istype(machine_from, /obj/machinery/telecomms/bus))
relay_direct_information(signal, machine_from) // send the signal back to the machine
else // no bus detected - send the signal to servers instead
signal.data["slow"] += rand(5, 10) // slow the signal down
relay_information(signal, "/obj/machinery/telecomms/server")
if(istype(machine_from, /obj/machinery/telecomms/bus))
relay_direct_information(signal, machine_from) // send the signal back to the machine
else // no bus detected - send the signal to servers instead
signal.data["slow"] += rand(5, 10) // slow the signal down
relay_information(signal, signal.server_type)
//Preset Processors
@@ -57,4 +55,4 @@
autolinkers = list("processor4")
/obj/machinery/telecomms/processor/preset_one/birdstation
name = "Processor"
name = "Processor"
@@ -1,4 +1,3 @@
/*
The receiver idles and receives messages from subspace-compatible radio equipment;
primarily headsets. They then just relay this information to all linked devices,
@@ -15,40 +14,30 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 30
machinetype = 1
circuit = /obj/item/circuitboard/machine/telecomms/receiver
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal)
if(!on) // has to be on to receive messages
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/subspace/signal)
if(!on || !istype(signal) || !check_receive_level(signal) || signal.transmission_method != TRANSMISSION_SUBSPACE)
return
if(!signal)
if(!is_freq_listening(signal))
return
if(!check_receive_level(signal))
return
if(signal.transmission_method == 2)
if(is_freq_listening(signal)) // detect subspace signals
signal.levels = list()
//Remove the level and then start adding levels that it is being broadcasted in.
signal.data["level"] = list()
// send the signal to the hub if possible, or a bus otherwise
if(!relay_information(signal, /obj/machinery/telecomms/hub))
relay_information(signal, /obj/machinery/telecomms/bus)
var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub") // ideally relay the copied information to relays
if(!can_send)
relay_information(signal, "/obj/machinery/telecomms/bus") // Send it to a bus instead, if it's linked to one
/obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/subspace/signal)
if (z in signal.levels)
return TRUE
/obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/signal)
for(var/obj/machinery/telecomms/hub/H in links)
for(var/obj/machinery/telecomms/relay/R in H.links)
if(R.can_receive(signal) && R.z in signal.levels)
return TRUE
if(signal.data["level"] != listening_level)
for(var/obj/machinery/telecomms/hub/H in links)
var/list/connected_levels = list()
for(var/obj/machinery/telecomms/relay/R in H.links)
if(R.can_receive(signal))
connected_levels |= R.listening_level
if(signal.data["level"] in connected_levels)
return 1
return 0
return 1
return FALSE
//Preset Receivers
@@ -58,7 +47,7 @@
id = "Receiver A"
network = "tcommsat"
autolinkers = list("receiverA") // link to relay
freq_listening = list(GLOB.SCI_FREQ, GLOB.MED_FREQ, GLOB.SUPP_FREQ, GLOB.SERV_FREQ) // science, medical, supply, service
freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL, FREQ_SUPPLY, FREQ_SERVICE)
//--PRESET RIGHT--//
@@ -67,14 +56,14 @@
id = "Receiver B"
network = "tcommsat"
autolinkers = list("receiverB") // link to relay
freq_listening = list(GLOB.COMM_FREQ, GLOB.ENG_FREQ, GLOB.SEC_FREQ) //command, engineering, security
freq_listening = list(FREQ_COMMAND, FREQ_ENGINEERING, FREQ_SECURITY)
//Common and other radio frequencies for people to freely use
/obj/machinery/telecomms/receiver/preset_right/Initialize()
. = ..()
for(var/i = 1441, i < 1489, i += 2)
for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2)
freq_listening |= i
/obj/machinery/telecomms/receiver/preset_left/birdstation
name = "Receiver"
freq_listening = list()
freq_listening = list()
@@ -14,17 +14,17 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 30
machinetype = 8
netspeed = 5
long_range_link = 1
circuit = /obj/item/circuitboard/machine/telecomms/relay
var/broadcasting = 1
var/receiving = 1
/obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
/obj/machinery/telecomms/relay/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from)
// Add our level and send it back
if(can_send(signal))
signal.data["level"] |= listening_level
var/turf/T = get_turf(src)
if(can_send(signal) && T)
signal.levels |= T.z
// Checks to see if it can send/receive.
@@ -52,7 +52,6 @@
/obj/machinery/telecomms/relay/preset/station
id = "Station Relay"
listening_level = 1
autolinkers = list("s_relay")
/obj/machinery/telecomms/relay/preset/telecomms
@@ -1,4 +1,3 @@
/*
The server logs all traffic and signal data. Once it records the signal, it sends
it to the subspace broadcaster.
@@ -6,7 +5,6 @@
Store a maximum of 100 logs and then deletes them.
*/
/obj/machinery/telecomms/server
name = "telecommunication server"
icon_state = "comm_server"
@@ -15,112 +13,57 @@
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 15
machinetype = 4
circuit = /obj/item/circuitboard/machine/telecomms/server
var/list/log_entries = list()
var/list/stored_names = list()
var/list/TrafficActions = list()
var/logs = 0 // number of logs
var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes)
var/list/memory = list() // stored memory
var/encryption = "null" // encryption key: ie "password"
var/salt = "null" // encryption salt: ie "123comsat"
// would add up to md5("password123comsat")
var/language = "human"
var/obj/item/device/radio/headset/server_radio = null
var/last_signal = 0 // Last time it sent a signal
/obj/machinery/telecomms/server/Initialize()
. = ..()
server_radio = new
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(signal.data["message"])
/obj/machinery/telecomms/server/receive_information(datum/signal/subspace/vocal/signal, obj/machinery/telecomms/machine_from)
// can't log non-vocal signals
if(!istype(signal) || !signal.data["message"] || !is_freq_listening(signal))
return
if(is_freq_listening(signal))
if(traffic > 0)
totaltraffic += traffic // add current traffic to total traffic
if(traffic > 0)
totaltraffic += traffic // add current traffic to total traffic
// Delete particularly old logs
if (log_entries.len >= 400)
log_entries.Cut(1, 2)
//Is this a test signal? Bypass logging
if(signal.data["type"] != 4)
// If signal has a message and appropriate frequency
update_logs()
var/datum/comm_log_entry/log = new
// Copy the signal.data entries we want
log.parameters["mobtype"] = signal.data["mobtype"]
log.parameters["job"] = signal.data["job"]
log.parameters["key"] = signal.data["key"]
log.parameters["message"] = signal.data["message"]
log.parameters["name"] = signal.data["name"]
log.parameters["realname"] = signal.data["realname"]
//log.parameters["uspeech"] = signal.data["languages"] & HUMAN //good enough
// TODO languages: ^ I don't know what this does
// If the signal is still compressed, make the log entry gibberish
if(signal.data["compression"] > 0)
log.parameters["message"] = Gibberish(signal.data["message"], signal.data["compression"] + 50)
log.parameters["job"] = Gibberish(signal.data["job"], signal.data["compression"] + 50)
log.parameters["name"] = Gibberish(signal.data["name"], signal.data["compression"] + 50)
log.parameters["realname"] = Gibberish(signal.data["realname"], signal.data["compression"] + 50)
log.input_type = "Corrupt File"
// Log and store everything that needs to be logged
log_entries.Add(log)
if(!(signal.data["name"] in stored_names))
stored_names.Add(signal.data["name"])
logs++
signal.data["server"] = src
// Give the log a name
var/identifier = num2text( rand(-1000,1000) + world.time )
log.name = "data packet ([md5(identifier)])"
var/can_send = relay_information(signal, "/obj/machinery/telecomms/hub")
if(!can_send)
relay_information(signal, "/obj/machinery/telecomms/broadcaster")
/obj/machinery/telecomms/server/proc/update_logs()
// start deleting the very first log entry
if(logs >= 400)
for(var/i = 1, i <= logs, i++) // locate the first garbage collectable log entry and remove it
var/datum/comm_log_entry/L = log_entries[i]
if(L.garbage_collector)
log_entries.Remove(L)
logs--
break
/obj/machinery/telecomms/server/proc/add_entry(content, input)
var/datum/comm_log_entry/log = new
var/identifier = num2text( rand(-1000,1000) + world.time )
log.name = "[input] ([md5(identifier)])"
log.input_type = input
log.parameters["message"] = content
log_entries.Add(log)
update_logs()
log.parameters["mobtype"] = signal.virt.source.type
log.parameters["name"] = signal.data["name"]
log.parameters["job"] = signal.data["job"]
log.parameters["message"] = signal.data["message"]
// If the signal is still compressed, make the log entry gibberish
var/compression = signal.data["compression"]
if(compression > 0)
log.input_type = "Corrupt File"
log.parameters["name"] = Gibberish(signal.data["name"], compression + 50)
log.parameters["job"] = Gibberish(signal.data["job"], compression + 50)
log.parameters["message"] = Gibberish(signal.data["message"], compression + 50)
// Give the log a name and store it
var/identifier = num2text( rand(-1000,1000) + world.time )
log.name = "data packet ([md5(identifier)])"
log_entries.Add(log)
var/can_send = relay_information(signal, /obj/machinery/telecomms/hub)
if(!can_send)
relay_information(signal, /obj/machinery/telecomms/broadcaster)
// Simple log entry datum
/datum/comm_log_entry
var/parameters = list() // carbon-copy to signal.data[]
var/name = "data packet (#)"
var/garbage_collector = 1 // if set to 0, will not be garbage collected
var/input_type = "Speech File"
var/name = "data packet (#)"
var/parameters = list() // copied from signal.data above
//Preset Servers
// Preset Servers
/obj/machinery/telecomms/server/presets
network = "tcommsat"
@@ -131,22 +74,22 @@
/obj/machinery/telecomms/server/presets/science
id = "Science Server"
freq_listening = list(GLOB.SCI_FREQ)
freq_listening = list(FREQ_SCIENCE)
autolinkers = list("science")
/obj/machinery/telecomms/server/presets/medical
id = "Medical Server"
freq_listening = list(GLOB.MED_FREQ)
freq_listening = list(FREQ_MEDICAL)
autolinkers = list("medical")
/obj/machinery/telecomms/server/presets/supply
id = "Supply Server"
freq_listening = list(GLOB.SUPP_FREQ)
freq_listening = list(FREQ_SUPPLY)
autolinkers = list("supply")
/obj/machinery/telecomms/server/presets/service
id = "Service Server"
freq_listening = list(GLOB.SERV_FREQ)
freq_listening = list(FREQ_SERVICE)
autolinkers = list("service")
/obj/machinery/telecomms/server/presets/common
@@ -154,26 +97,25 @@
freq_listening = list()
autolinkers = list("common")
//Common and other radio frequencies for people to freely use
// 1441 to 1489
//Common and other radio frequencies for people to freely use
/obj/machinery/telecomms/server/presets/common/Initialize()
. = ..()
for(var/i = 1441, i < 1489, i += 2)
for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2)
freq_listening |= i
/obj/machinery/telecomms/server/presets/command
id = "Command Server"
freq_listening = list(GLOB.COMM_FREQ)
freq_listening = list(FREQ_COMMAND)
autolinkers = list("command")
/obj/machinery/telecomms/server/presets/engineering
id = "Engineering Server"
freq_listening = list(GLOB.ENG_FREQ)
freq_listening = list(FREQ_ENGINEERING)
autolinkers = list("engineering")
/obj/machinery/telecomms/server/presets/security
id = "Security Server"
freq_listening = list(GLOB.SEC_FREQ)
freq_listening = list(FREQ_SECURITY)
autolinkers = list("security")
/obj/machinery/telecomms/server/presets/common/birdstation/Initialize()
@@ -26,15 +26,13 @@ GLOBAL_LIST_EMPTY(telecomms_list)
var/list/freq_listening = list() // list of frequencies to tune into: if none, will listen to all
var/machinetype = 0 // just a hacky way of preventing alike machines from pairing
var/toggled = TRUE // Is it toggled on
var/on = TRUE
var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub)
var/hide = 0 // Is it a hidden machine?
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
var/toggled = TRUE // Is it toggled on
var/long_range_link = FALSE // Can you link it across Z levels or on the otherside of the map? (Relay & Hub)
var/hide = FALSE // Is it a hidden machine?
/obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20)
/obj/machinery/telecomms/proc/relay_information(datum/signal/subspace/signal, filter, copysig, amount = 20)
// relay signal to all linked machinery that are of type [filter]. If signal has been sent [amount] times, stop sending
if(!on)
@@ -46,70 +44,26 @@ GLOBAL_LIST_EMPTY(telecomms_list)
if(netlag > signal.data["slow"])
signal.data["slow"] = netlag
// Loop through all linked machines and send the signal or copy.
// Loop through all linked machines and send the signal or copy.
for(var/obj/machinery/telecomms/machine in links)
if(filter && !istype( machine, text2path(filter) ))
if(filter && !istype( machine, filter ))
continue
if(!machine.on)
continue
if(amount && send_count >= amount)
break
if(machine.loc.z != listening_level)
if(long_range_link == 0 && machine.long_range_link == 0)
continue
// If we're sending a copy, be sure to create the copy for EACH machine and paste the data
var/datum/signal/copy = new
if(copysig)
copy.transmission_method = 2
copy.frequency = signal.frequency
// Copy the main data contents! Workaround for some nasty bug where the actual array memory is copied and not its contents.
copy.data = list(
"mob" = signal.data["mob"],
"mobtype" = signal.data["mobtype"],
"realname" = signal.data["realname"],
"name" = signal.data["name"],
"job" = signal.data["job"],
"key" = signal.data["key"],
"vmask" = signal.data["vmask"],
"compression" = signal.data["compression"],
"message" = signal.data["message"],
"radio" = signal.data["radio"],
"slow" = signal.data["slow"],
"traffic" = signal.data["traffic"],
"type" = signal.data["type"],
"server" = signal.data["server"],
"reject" = signal.data["reject"],
"level" = signal.data["level"],
"spans" = signal.data["spans"],
"verb_say" = signal.data["verb_say"],
"verb_ask" = signal.data["verb_ask"],
"verb_exclaim" = signal.data["verb_exclaim"],
"verb_yell" = signal.data["verb_yell"],
"language" = signal.data["language"]
)
// Keep the "original" signal constant
if(!signal.data["original"])
copy.data["original"] = signal
else
copy.data["original"] = signal.data["original"]
else
copy = null
if(z != machine.loc.z && !long_range_link && !machine.long_range_link)
continue
send_count++
if(machine.is_freq_listening(signal))
machine.traffic++
if(copysig && copy)
machine.receive_information(copy, src)
if(copysig)
machine.receive_information(signal.copy(), src)
else
machine.receive_information(signal, src)
if(send_count > 0 && is_freq_listening(signal))
traffic++
@@ -121,28 +75,16 @@ GLOBAL_LIST_EMPTY(telecomms_list)
/obj/machinery/telecomms/proc/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
// receive information from linked machinery
..()
/obj/machinery/telecomms/proc/is_freq_listening(datum/signal/signal)
// return TRUE if found, FALSE if not found
if(!signal)
return FALSE
if((signal.frequency in freq_listening) || (!freq_listening.len))
return TRUE
else
return FALSE
return signal && (!freq_listening.len || (signal.frequency in freq_listening))
/obj/machinery/telecomms/New()
GLOB.telecomms_list += src
..()
//Set the listening_level if there's none.
if(!listening_level)
//Defaults to our Z level!
var/turf/position = get_turf(src)
listening_level = position.z
/obj/machinery/telecomms/Initialize(mapload)
. = ..()
if(mapload && autolinkers.len)
+2
View File
@@ -24,3 +24,5 @@
if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi')
occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon)
..()
+1
View File
@@ -63,3 +63,4 @@
/obj/mecha/combat/gygax/dark/RemoveActions(mob/living/user, human_occupant = 0)
..()
thrusters_action.Remove(user)
+2
View File
@@ -141,3 +141,5 @@
for (var/i=0;i<6;i++)
color = color+pick(colors)
return color
+86 -86
View File
@@ -1,90 +1,90 @@
/obj/mecha/combat/marauder
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
name = "\improper Marauder"
icon_state = "marauder"
step_in = 5
max_integrity = 500
deflect_chance = 25
armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 60000
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
infra_luminosity = 3
/obj/mecha/combat/marauder
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
name = "\improper Marauder"
icon_state = "marauder"
step_in = 5
max_integrity = 500
deflect_chance = 25
armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 60000
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
infra_luminosity = 3
operation_req_access = list(ACCESS_CENT_SPECOPS)
wreckage = /obj/structure/mecha_wreckage/marauder
add_req_access = 0
internal_damage_threshold = 25
force = 45
max_equip = 4
bumpsmash = 1
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
..()
smoke_action.Grant(user, src)
thrusters_action.Grant(user, src)
zoom_action.Grant(user, src)
/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0)
..()
smoke_action.Remove(user)
thrusters_action.Remove(user)
zoom_action.Remove(user)
/obj/mecha/combat/marauder/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "\improper Seraph"
icon_state = "seraph"
wreckage = /obj/structure/mecha_wreckage/marauder
add_req_access = 0
internal_damage_threshold = 25
force = 45
max_equip = 4
bumpsmash = 1
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
..()
smoke_action.Grant(user, src)
thrusters_action.Grant(user, src)
zoom_action.Grant(user, src)
/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0)
..()
smoke_action.Remove(user)
thrusters_action.Remove(user)
zoom_action.Remove(user)
/obj/mecha/combat/marauder/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "\improper Seraph"
icon_state = "seraph"
operation_req_access = list(ACCESS_CENT_SPECOPS)
step_in = 3
step_in = 3
max_integrity = 550
wreckage = /obj/structure/mecha_wreckage/seraph
internal_damage_threshold = 20
force = 55
max_equip = 5
/obj/mecha/combat/marauder/seraph/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
name = "\improper Mauler"
icon_state = "mauler"
wreckage = /obj/structure/mecha_wreckage/seraph
internal_damage_threshold = 20
force = 55
max_equip = 5
/obj/mecha/combat/marauder/seraph/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
name = "\improper Mauler"
icon_state = "mauler"
operation_req_access = list(ACCESS_SYNDICATE)
wreckage = /obj/structure/mecha_wreckage/mauler
max_equip = 5
/obj/mecha/combat/marauder/mauler/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
wreckage = /obj/structure/mecha_wreckage/mauler
max_equip = 5
/obj/mecha/combat/marauder/mauler/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
+27 -27
View File
@@ -1,28 +1,28 @@
/obj/mecha/combat/reticence
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
name = "\improper reticence"
icon_state = "reticence"
step_in = 2
dir_in = 1 //Facing North.
max_integrity = 100
deflect_chance = 3
armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 15000
wreckage = /obj/structure/mecha_wreckage/reticence
/obj/mecha/combat/reticence
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
name = "\improper reticence"
icon_state = "reticence"
step_in = 2
dir_in = 1 //Facing North.
max_integrity = 100
deflect_chance = 3
armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
max_temperature = 15000
wreckage = /obj/structure/mecha_wreckage/reticence
operation_req_access = list(ACCESS_THEATRE)
add_req_access = 0
internal_damage_threshold = 25
max_equip = 2
step_energy_drain = 3
color = "#87878715"
stepsound = null
turnsound = null
opacity = 0
/obj/mecha/combat/reticence/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT
ME.attach(src)
return
add_req_access = 0
internal_damage_threshold = 25
max_equip = 2
step_energy_drain = 3
color = "#87878715"
stepsound = null
turnsound = null
opacity = 0
/obj/mecha/combat/reticence/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT
ME.attach(src)
return
+6 -8
View File
@@ -34,15 +34,13 @@
"Misc"
)
var/datum/component/material_container/materials
/obj/machinery/mecha_part_fabricator/Initialize()
materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
stored_research = new
return ..()
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
stored_research = new
return ..()
/obj/machinery/mecha_part_fabricator/RefreshParts()
var/T = 0
+1 -1
View File
@@ -247,7 +247,7 @@
radio.name = "[src] radio"
radio.icon = icon
radio.icon_state = icon_state
radio.subspace_transmission = 1
radio.subspace_transmission = TRUE
/obj/mecha/proc/can_use(mob/user)
if(user != occupant)
+1 -1
View File
@@ -284,7 +284,7 @@
if(href_list["rfreq"])
var/new_frequency = (radio.frequency + afilter.getNum("rfreq"))
if (!radio.freerange || (radio.frequency < 1200 || radio.frequency > 1600))
if (!radio.freerange || (radio.frequency < MIN_FREE_FREQ || radio.frequency > MAX_FREE_FREQ))
new_frequency = sanitize_frequency(new_frequency)
radio.set_frequency(new_frequency)
send_byjax(src.occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
+1
View File
@@ -26,6 +26,7 @@
aSignal = new(src)
aSignal.name = "[name] core"
aSignal.code = rand(1,100)
aSignal.frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ)
if(ISMULTIPLE(aSignal.frequency, 2))//signaller frequencies are always uneven!
aSignal.frequency++
@@ -19,6 +19,7 @@
LAZYREMOVE(AllTeleporters, src)
return ..()
/obj/effect/bump_teleporter/singularity_act()
return
+1 -1
View File
@@ -14,7 +14,6 @@
if(e_name)
name = e_name
desc = "A [name] vandalizing the station."
if(alt_icon)
icon = alt_icon
if(type)
@@ -28,3 +27,4 @@
if(main)
paint_colour = main
add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY)
@@ -236,7 +236,7 @@
/obj/structure/foamedmetal/Move()
var/turf/T = loc
..()
. = ..()
move_update_air(T)
/obj/structure/foamedmetal/attack_paw(mob/user)
+43 -10
View File
@@ -16,7 +16,7 @@
/obj/effect/landmark/start
name = "start"
icon = 'icons/mob/screen_gen.dmi'
icon = 'icons/mob/landmarks.dmi'
icon_state = "x"
anchored = TRUE
var/jobspawn_override = FALSE
@@ -40,9 +40,9 @@
// START LANDMARKS FOLLOW. Don't change the names unless
// you are refactoring shitty landmark code.
/obj/effect/landmark/start/assistant
name = "Assistant"
icon_state = "Assistant"
/obj/effect/landmark/start/assistant/override
jobspawn_override = TRUE
@@ -50,102 +50,135 @@
/obj/effect/landmark/start/janitor
name = "Janitor"
icon_state = "Janitor"
/obj/effect/landmark/start/cargo_technician
name = "Cargo Technician"
icon_state = "Cargo Technician"
/obj/effect/landmark/start/bartender
name = "Bartender"
icon_state = "Bartender"
/obj/effect/landmark/start/clown
name = "Clown"
icon_state = "Clown"
/obj/effect/landmark/start/mime
name = "Mime"
icon_state = "Mime"
/obj/effect/landmark/start/quartermaster
name = "Quartermaster"
icon_state = "Quartermaster"
/obj/effect/landmark/start/atmospheric_technician
name = "Atmospheric Technician"
icon_state = "Atmospheric Technician"
/obj/effect/landmark/start/cook
name = "Cook"
icon_state = "Cook"
/obj/effect/landmark/start/shaft_miner
name = "Shaft Miner"
icon_state = "Shaft Miner"
/obj/effect/landmark/start/security_officer
name = "Security Officer"
icon_state = "Security Officer"
/obj/effect/landmark/start/botanist
name = "Botanist"
icon_state = "Botanist"
/obj/effect/landmark/start/head_of_security
name = "Head of Security"
/obj/effect/landmark/start/ai
name = "AI"
delete_after_roundstart = FALSE
icon_state = "Head of Security"
/obj/effect/landmark/start/captain
name = "Captain"
icon_state = "Captain"
/obj/effect/landmark/start/detective
name = "Detective"
icon_state = "Detective"
/obj/effect/landmark/start/warden
name = "Warden"
icon_state = "Warden"
/obj/effect/landmark/start/chief_engineer
name = "Chief Engineer"
/obj/effect/landmark/start/cyborg
name = "Cyborg"
icon_state = "Chief Engineer"
/obj/effect/landmark/start/head_of_personnel
name = "Head of Personnel"
icon_state = "Head of Personnel"
/obj/effect/landmark/start/librarian
name = "Curator"
icon_state = "Curator"
/obj/effect/landmark/start/lawyer
name = "Lawyer"
icon_state = "Lawyer"
/obj/effect/landmark/start/station_engineer
name = "Station Engineer"
icon_state = "Station Engineer"
/obj/effect/landmark/start/medical_doctor
name = "Medical Doctor"
icon_state = "Medical Doctor"
/obj/effect/landmark/start/scientist
name = "Scientist"
icon_state = "Scientist"
/obj/effect/landmark/start/chemist
name = "Chemist"
icon_state = "Chemist"
/obj/effect/landmark/start/roboticist
name = "Roboticist"
icon_state = "Roboticist"
/obj/effect/landmark/start/research_director
name = "Research Director"
icon_state = "Research Director"
/obj/effect/landmark/start/geneticist
name = "Geneticist"
icon_state = "Geneticist"
/obj/effect/landmark/start/chief_medical_officer
name = "Chief Medical Officer"
icon_state = "Chief Medical Officer"
/obj/effect/landmark/start/virologist
name = "Virologist"
icon_state = "Virologist"
/obj/effect/landmark/start/chaplain
name = "Chaplain"
icon_state = "Chaplain"
/obj/effect/landmark/start/cyborg
name = "Cyborg"
icon_state = "Cyborg"
/obj/effect/landmark/start/ai
name = "AI"
icon_state = "AI"
delete_after_roundstart = FALSE
//Department Security spawns
/obj/effect/landmark/start/depsec
name = "department_sec"
icon_state = "Security Officer"
/obj/effect/landmark/start/depsec/New()
..()
@@ -358,4 +391,4 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
/obj/effect/landmark/ruin/Destroy()
GLOB.ruin_landmarks -= src
ruin_template = null
. = ..()
. = ..()
+1
View File
@@ -65,3 +65,4 @@
/obj/effect/abstract/marker/at
name = "active turf marker"

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