mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-07-18 19:53:35 +01:00
Merge branch 'master' into upstream-merge-13267
This commit is contained in:
@@ -173,3 +173,17 @@ if (!(DATUM.datum_flags & DF_ISPROCESSING)) {\
|
||||
#define LOGIN_TYPE_NORMAL 1
|
||||
#define LOGIN_TYPE_AI 2
|
||||
#define LOGIN_TYPE_ROBOT 3
|
||||
|
||||
// Computer Hardware
|
||||
#define PART_CPU /obj/item/weapon/computer_hardware/processor_unit // CPU. Without it the computer won't run. Better CPUs can run more programs at once.
|
||||
#define PART_NETWORK /obj/item/weapon/computer_hardware/network_card // Network Card component of this computer. Allows connection to NTNet
|
||||
#define PART_HDD /obj/item/weapon/computer_hardware/hard_drive // Hard Drive component of this computer. Stores programs and files.
|
||||
|
||||
// Optional hardware (improves functionality, but is not critical for computer to work in most cases)
|
||||
#define PART_BATTERY /obj/item/weapon/computer_hardware/battery_module // An internal power source for this computer. Can be recharged.
|
||||
#define PART_CARD /obj/item/weapon/computer_hardware/card_slot // ID Card slot component of this computer. Mostly for HoP modification console that needs ID slot for modification.
|
||||
#define PART_PRINTER /obj/item/weapon/computer_hardware/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs.
|
||||
//#define PART_DRIVE /obj/item/weapon/computer_hardware/hard_drive/portable // Portable data storage
|
||||
//#define PART_AI /obj/item/weapon/computer_hardware/ai_slot // AI slot, an intellicard housing that allows modifications of AIs.
|
||||
#define PART_TESLA /obj/item/weapon/computer_hardware/tesla_link // Tesla Link, Allows remote charging from nearest APC.
|
||||
//#define PART_SCANNER /obj/item/weapon/computer_hardware/scanner // One of several optional scanner attachments.
|
||||
|
||||
@@ -149,10 +149,25 @@
|
||||
#define PROGRAM_STATE_BACKGROUND 1
|
||||
#define PROGRAM_STATE_ACTIVE 2
|
||||
|
||||
#define PROG_MISC "Miscellaneous"
|
||||
#define PROG_ENG "Engineering"
|
||||
#define PROG_OFFICE "Office Work"
|
||||
#define PROG_COMMAND "Command"
|
||||
#define PROG_SUPPLY "Supply and Shuttles"
|
||||
#define PROG_ADMIN "NTNet Administration"
|
||||
#define PROG_UTIL "Utility"
|
||||
#define PROG_SEC "Security"
|
||||
#define PROG_MONITOR "Monitoring"
|
||||
|
||||
// Caps for NTNet logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it.
|
||||
#define MAX_NTNET_LOGS 500
|
||||
#define MIN_NTNET_LOGS 10
|
||||
|
||||
//Built-in email accounts
|
||||
#define EMAIL_DOCUMENTS "document.server@virgo.local"
|
||||
#define EMAIL_SYSADMIN "admin@virgo.local"
|
||||
#define EMAIL_BROADCAST "broadcast@virgo.local"
|
||||
|
||||
|
||||
// Special return values from bullet_act(). Positive return values are already used to indicate the blocked level of the projectile.
|
||||
#define PROJECTILE_CONTINUE -1 //if the projectile should continue flying after calling bullet_act()
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
#define PTO_CARGO "Cargo"
|
||||
#define PTO_CIVILIAN "Civilian"
|
||||
#define PTO_CYBORG "Cyborg"
|
||||
#define PTO_TALON "Talon Contractor"
|
||||
|
||||
#define DEPARTMENT_TALON "ITV Talon"
|
||||
|
||||
|
||||
+11
-1
@@ -217,6 +217,17 @@ This actually tests if they have the same entries and values.
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/*
|
||||
Checks if a list has the same entries and values as an element of big.
|
||||
*/
|
||||
/proc/in_as_list(var/list/little, var/list/big)
|
||||
if(!islist(big))
|
||||
return 0
|
||||
for(var/element in big)
|
||||
if(same_entries(little, element))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/*
|
||||
* Returns list containing entries that are in either list but not both.
|
||||
* If skipref = 1, repeated elements are treated as one.
|
||||
@@ -870,4 +881,3 @@ var/global/list/json_cache = list()
|
||||
else
|
||||
used_key_list[input_key] = 1
|
||||
return input_key
|
||||
|
||||
@@ -6,6 +6,16 @@
|
||||
return number
|
||||
return default
|
||||
|
||||
// Checks if the given input is a valid list index; returns true/false and doesn't change anything.
|
||||
/proc/is_valid_index(input, list/given_list)
|
||||
if(!isnum(input))
|
||||
return FALSE
|
||||
if(input != round(input))
|
||||
return FALSE
|
||||
if(input < 1 || input > length(given_list))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/proc/sanitize_text(text, default="")
|
||||
if(istext(text))
|
||||
return text
|
||||
@@ -44,3 +54,60 @@
|
||||
if(65 to 70) . += ascii2text(ascii+32) //letters A to F - translates to lowercase
|
||||
else return default
|
||||
return .
|
||||
|
||||
//Valid format codes: YY, YEAR, MM, DD, hh, mm, ss, :, -. " " (space). Invalid format will return default.
|
||||
/proc/sanitize_time(time, default, format = "hh:mm")
|
||||
if(!istext(time) || !(length(time) == length(format)))
|
||||
return default
|
||||
var/fragment = ""
|
||||
. = list()
|
||||
for(var/i = 1, i <= length(format), i++)
|
||||
fragment += copytext(format,i,i+1)
|
||||
if(fragment in list("YY", "YEAR", "MM", "DD", "hh", "mm", "ss"))
|
||||
. += sanitize_one_time(copytext(time, i - length(fragment) + 1, i + 1), copytext(default, i - length(fragment) + 1, i + 1), fragment)
|
||||
fragment = ""
|
||||
else if(fragment in list(":", "-", " "))
|
||||
. += fragment
|
||||
fragment = ""
|
||||
if(fragment)
|
||||
return default //This means the format was improper.
|
||||
return JOINTEXT(.)
|
||||
|
||||
//Internal proc, expects valid format and text input of equal length to format.
|
||||
/proc/sanitize_one_time(input, default, format)
|
||||
var/list/ainput = list()
|
||||
for(var/i = 1, i <= length(input), i++)
|
||||
ainput += text2ascii(input, i)
|
||||
switch(format)
|
||||
if("YY")
|
||||
if(!(ainput[1] in 48 to 57) || !(ainput[2] in 48 to 57))//0 to 9
|
||||
return (default || "00")
|
||||
return input
|
||||
if("YEAR")
|
||||
for(var/i = 1, i <= 4, i++)
|
||||
if(!(ainput[i] in 48 to 57))//0 to 9
|
||||
return (default || "0000")
|
||||
return input
|
||||
if("MM")
|
||||
var/early = (ainput[1] == 48) && (ainput[2] in 49 to 57) //01 to 09
|
||||
var/late = (ainput[1] == 49) && (ainput[2] in 48 to 50) //10 to 12
|
||||
if(!(early || late))
|
||||
return (default || "01")
|
||||
return input
|
||||
if("DD")
|
||||
var/early = (ainput[1] == 48) && (ainput[2] in 49 to 57) //01 to 09
|
||||
var/mid = (ainput[1] in 49 to 50) && (ainput[2] in 48 to 57) //10 to 29
|
||||
var/late = (ainput[1] == 51) && (ainput[2] in 48 to 49) //30 to 31
|
||||
if(!(early || mid || late))
|
||||
return (default || "01")
|
||||
return input
|
||||
if("hh")
|
||||
var/early = (ainput[1] in 48 to 49) && (ainput[2] in 48 to 57) //00 to 19
|
||||
var/late = (ainput[1] == 50) && (ainput[2] in 48 to 51) //20 to 23
|
||||
if(!(early || late))
|
||||
return (default || "00")
|
||||
return input
|
||||
if("mm", "ss")
|
||||
if(!(ainput[1] in 48 to 53) || !(ainput[2] in 48 to 57)) //0 to 5, 0 to 9
|
||||
return (default || "00")
|
||||
return input
|
||||
|
||||
@@ -410,6 +410,58 @@
|
||||
t = replacetext(t, "\[editorbr\]", "")
|
||||
return t
|
||||
|
||||
//pencode translation to html for tags exclusive to digital files (currently email, nanoword, report editor fields,
|
||||
//modular scanner data and txt file printing) and prints from them
|
||||
/proc/digitalPencode2html(var/text)
|
||||
text = replacetext(text, "\[pre\]", "<pre>")
|
||||
text = replacetext(text, "\[/pre\]", "</pre>")
|
||||
text = replacetext(text, "\[fontred\]", "<font color=\"red\">") //</font> to pass html tag integrity unit test
|
||||
text = replacetext(text, "\[fontblue\]", "<font color=\"blue\">")//</font> to pass html tag integrity unit test
|
||||
text = replacetext(text, "\[fontgreen\]", "<font color=\"green\">")
|
||||
text = replacetext(text, "\[/font\]", "</font>")
|
||||
text = replacetext(text, "\[redacted\]", "<span class=\"redacted\">R E D A C T E D</span>")
|
||||
return pencode2html(text)
|
||||
|
||||
//Will kill most formatting; not recommended.
|
||||
/proc/html2pencode(t)
|
||||
t = replacetext(t, "<pre>", "\[pre\]")
|
||||
t = replacetext(t, "</pre>", "\[/pre\]")
|
||||
t = replacetext(t, "<font color=\"red\">", "\[fontred\]")//</font> to pass html tag integrity unit test
|
||||
t = replacetext(t, "<font color=\"blue\">", "\[fontblue\]")//</font> to pass html tag integrity unit test
|
||||
t = replacetext(t, "<font color=\"green\">", "\[fontgreen\]")
|
||||
t = replacetext(t, "</font>", "\[/font\]")
|
||||
t = replacetext(t, "<BR>", "\[br\]")
|
||||
t = replacetext(t, "<br>", "\[br\]")
|
||||
t = replacetext(t, "<B>", "\[b\]")
|
||||
t = replacetext(t, "</B>", "\[/b\]")
|
||||
t = replacetext(t, "<I>", "\[i\]")
|
||||
t = replacetext(t, "</I>", "\[/i\]")
|
||||
t = replacetext(t, "<U>", "\[u\]")
|
||||
t = replacetext(t, "</U>", "\[/u\]")
|
||||
t = replacetext(t, "<center>", "\[center\]")
|
||||
t = replacetext(t, "</center>", "\[/center\]")
|
||||
t = replacetext(t, "<H1>", "\[h1\]")
|
||||
t = replacetext(t, "</H1>", "\[/h1\]")
|
||||
t = replacetext(t, "<H2>", "\[h2\]")
|
||||
t = replacetext(t, "</H2>", "\[/h2\]")
|
||||
t = replacetext(t, "<H3>", "\[h3\]")
|
||||
t = replacetext(t, "</H3>", "\[/h3\]")
|
||||
t = replacetext(t, "<li>", "\[*\]")
|
||||
t = replacetext(t, "<HR>", "\[hr\]")
|
||||
t = replacetext(t, "<ul>", "\[list\]")
|
||||
t = replacetext(t, "</ul>", "\[/list\]")
|
||||
t = replacetext(t, "<table>", "\[grid\]")
|
||||
t = replacetext(t, "</table>", "\[/grid\]")
|
||||
t = replacetext(t, "<tr>", "\[row\]")
|
||||
t = replacetext(t, "<td>", "\[cell\]")
|
||||
t = replacetext(t, "<img src = ntlogo.png>", "\[logo\]")
|
||||
t = replacetext(t, "<img src = redntlogo.png>", "\[redlogo\]")
|
||||
t = replacetext(t, "<img src = sglogo.png>", "\[sglogo\]")
|
||||
t = replacetext(t, "<span class=\"paper_field\"></span>", "\[field\]")
|
||||
t = replacetext(t, "<span class=\"redacted\">R E D A C T E D</span>", "\[redacted\]")
|
||||
t = strip_html_properly(t)
|
||||
return t
|
||||
|
||||
// Random password generator
|
||||
/proc/GenerateKey()
|
||||
//Feel free to move to Helpers.
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
continue
|
||||
if(vent.welded)
|
||||
continue
|
||||
if(istype(get_area(vent), /area/crew_quarters/sleep)) //No going to dorms
|
||||
var/area/A = get_area(vent)
|
||||
if(A.forbid_events)
|
||||
continue
|
||||
vent_list += vent
|
||||
if(!vent_list.len)
|
||||
|
||||
+3
-1
@@ -42,4 +42,6 @@
|
||||
|
||||
#define WORLD_ICON_SIZE 32 //Needed for the R-UST port
|
||||
|
||||
#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port
|
||||
#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port
|
||||
|
||||
#define JOINTEXT(X) jointext(X, null)
|
||||
|
||||
@@ -63,10 +63,11 @@ SUBSYSTEM_DEF(persist)
|
||||
LAZYINITLIST(C.play_hours)
|
||||
var/dept_hours = C.department_hours
|
||||
var/play_hours = C.play_hours
|
||||
if(isnum(dept_hours[department_earning]))
|
||||
dept_hours[department_earning] += pto_factored
|
||||
else
|
||||
dept_hours[department_earning] = pto_factored
|
||||
if(!(J.playtime_only))
|
||||
if(isnum(dept_hours[department_earning]))
|
||||
dept_hours[department_earning] += pto_factored
|
||||
else
|
||||
dept_hours[department_earning] = pto_factored
|
||||
|
||||
// If they're earning PTO they must be in a useful job so are earning playtime in that department
|
||||
if(J.timeoff_factor > 0)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
if(!msg_sanitized)
|
||||
message = sanitize(message, extra = 0)
|
||||
message_title = sanitizeSafe(message_title)
|
||||
message_title = sanitizeSafe(message_title)
|
||||
|
||||
var/list/zlevels
|
||||
if(zlevel)
|
||||
|
||||
@@ -806,11 +806,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "\improper Shuttle Dock Hallway - Dock One"
|
||||
icon_state = "entry_D1"
|
||||
base_turf = /turf/space
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/hallway/secondary/entry/D2
|
||||
name = "\improper Shuttle Dock Hallway - Dock Two"
|
||||
icon_state = "entry_D2"
|
||||
base_turf = /turf/space
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/hallway/secondary/entry/D2/arrivals
|
||||
name = "\improper Shuttle Dock Hallway - Dock Two"
|
||||
@@ -822,6 +824,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "\improper Shuttle Dock Hallway - Dock Three"
|
||||
icon_state = "entry_D3"
|
||||
base_turf = /turf/space
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/hallway/secondary/entry/D4
|
||||
name = "\improper Shuttle Dock Hallway - Dock Four"
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
/area/surface/outpost/main/dorms
|
||||
name = "\improper Main Outpost Dorms"
|
||||
soundproofed = TRUE
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/surface/outpost/main/dorms/dorm_1
|
||||
name = "\improper Main Outpost Dorm One"
|
||||
@@ -72,6 +73,7 @@
|
||||
|
||||
/area/crew_quarters/sleep
|
||||
soundproofed = TRUE
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_1
|
||||
limit_mob_size = FALSE
|
||||
@@ -110,4 +112,5 @@
|
||||
limit_mob_size = FALSE
|
||||
|
||||
/area/medical/cryo/autoresleeve
|
||||
name = "\improper Medical Autoresleeving"
|
||||
name = "\improper Medical Autoresleeving"
|
||||
forbid_events = TRUE
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
//Time required in the department as other jobs before playing this one (in hours)
|
||||
var/dept_time_required = 0
|
||||
|
||||
//Do we forbid ourselves from earning PTO?
|
||||
var/playtime_only = FALSE
|
||||
|
||||
// Check client-specific availability rules.
|
||||
/datum/job/proc/player_has_enough_pto(client/C)
|
||||
return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0)
|
||||
|
||||
@@ -355,7 +355,7 @@ var/global/datum/controller/occupations/job_master
|
||||
return 1
|
||||
|
||||
|
||||
/datum/controller/occupations/proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
|
||||
/datum/controller/occupations/proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0, var/announce = TRUE)
|
||||
if(!H) return null
|
||||
|
||||
var/datum/job/job = GetJob(rank)
|
||||
@@ -494,7 +494,7 @@ var/global/datum/controller/occupations/job_master
|
||||
return H
|
||||
|
||||
// TWEET PEEP
|
||||
if(rank == "Site Manager")
|
||||
if(rank == "Site Manager" && announce)
|
||||
var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP) ? null : sound('sound/misc/boatswain.ogg', volume=20)
|
||||
captain_announcement.Announce("All hands, [alt_title ? alt_title : "Site Manager"] [H.real_name] on deck!", new_sound = announce_sound, zlevel = H.z)
|
||||
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
walk_to(src, target_atom, 5)
|
||||
if(prob(25))
|
||||
src.visible_message("<span class='notice'>\The [src] skitters[pick(" away"," around","")].</span>")
|
||||
else if(prob(5))
|
||||
else if(amount_grown < 75 && prob(5))
|
||||
//vent crawl!
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
|
||||
if(!v.welded)
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
add_fingerprint(user)
|
||||
user.set_machine(src)
|
||||
show_ui(user)
|
||||
|
||||
|
||||
/obj/item/device/tvcamera/proc/show_ui(mob/user)
|
||||
var/dat = list()
|
||||
dat += "Channel name is: <a href='?src=\ref[src];channel=1'>[channel ? channel : "unidentified broadcast"]</a><br>"
|
||||
@@ -93,7 +93,7 @@
|
||||
/obj/item/device/tvcamera/proc/show_tvs(atom/thing)
|
||||
if(showing)
|
||||
hide_tvs(showing)
|
||||
|
||||
|
||||
showing = weakref(thing)
|
||||
showing_name = "[thing]"
|
||||
for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens)
|
||||
@@ -126,7 +126,7 @@
|
||||
/obj/item/device/tvcamera/process()
|
||||
if(!showing)
|
||||
return PROCESS_KILL
|
||||
|
||||
|
||||
var/atom/A = showing.resolve()
|
||||
if(!A || QDELETED(A))
|
||||
show_tvs(loc)
|
||||
@@ -148,3 +148,76 @@
|
||||
H.update_inv_l_hand()
|
||||
H.update_inv_belt()
|
||||
|
||||
|
||||
//Assembly by roboticist
|
||||
|
||||
/obj/item/robot_parts/head/attackby(var/obj/item/device/assembly/S, mob/user as mob)
|
||||
if(!istype(S, /obj/item/device/assembly/infra))
|
||||
..()
|
||||
return
|
||||
var/obj/item/weapon/TVAssembly/A = new(user)
|
||||
qdel(S)
|
||||
user.put_in_hands(A)
|
||||
to_chat(user, "<span class='notice'>You add the infrared sensor to the robot head.</span>")
|
||||
user.drop_from_inventory(src)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/weapon/TVAssembly
|
||||
name = "\improper TV Camera Assembly"
|
||||
desc = "A robotic head with an infrared sensor inside."
|
||||
icon = 'icons/obj/robot_parts.dmi'
|
||||
icon_state = "head"
|
||||
item_state = "head"
|
||||
var/buildstep = 0
|
||||
w_class = ITEMSIZE_LARGE
|
||||
|
||||
/obj/item/weapon/TVAssembly/attackby(W, mob/user)
|
||||
switch(buildstep)
|
||||
if(0)
|
||||
if(istype(W, /obj/item/robot_parts/robot_component/camera))
|
||||
var/obj/item/robot_parts/robot_component/camera/CA = W
|
||||
to_chat(user, "<span class='notice'>You add the camera module to [src]</span>")
|
||||
user.drop_item()
|
||||
qdel(CA)
|
||||
desc = "This TV camera assembly has a camera module."
|
||||
buildstep++
|
||||
if(1)
|
||||
if(istype(W, /obj/item/device/taperecorder))
|
||||
var/obj/item/device/taperecorder/T = W
|
||||
user.drop_item()
|
||||
qdel(T)
|
||||
buildstep++
|
||||
to_chat(user, "<span class='notice'>You add the tape recorder to [src]</span>")
|
||||
if(2)
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if(!C.use(3))
|
||||
to_chat(user, "<span class='notice'>You need six cable coils to wire the devices.</span>")
|
||||
..()
|
||||
return
|
||||
C.use(3)
|
||||
buildstep++
|
||||
to_chat(user, "<span class='notice'>You wire the assembly</span>")
|
||||
desc = "This TV camera assembly has wires sticking out"
|
||||
return
|
||||
if(3)
|
||||
if(istype(W, /obj/item/weapon/tool/wirecutters))
|
||||
to_chat(user, "<span class='notice'> You trim the wires.</span>")
|
||||
buildstep++
|
||||
desc = "This TV camera assembly needs casing."
|
||||
return
|
||||
if(4)
|
||||
if(istype(W, /obj/item/stack/material/steel))
|
||||
var/obj/item/stack/material/steel/S = W
|
||||
buildstep++
|
||||
S.use(1)
|
||||
to_chat(user, "<span class='notice'>You encase the assembly in a Ward-Takeshi casing.</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
new /obj/item/device/tvcamera(T)
|
||||
user.drop_from_inventory(src)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -19,3 +19,26 @@
|
||||
if(istype(AM, /obj/item/weapon/gun))
|
||||
to_chat(user, "You have chosen \the [AM]. Say hello to your new best friend.")
|
||||
qdel(src)
|
||||
|
||||
/*
|
||||
* Site Manager's Box
|
||||
*/
|
||||
/obj/item/gunbox/captain
|
||||
name = "Captain's sidearm box"
|
||||
desc = "A secure box containing a sidearm befitting of the site manager. Includes both lethal and non-lethal munitions, beware what's loaded!"
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "gunbox"
|
||||
/obj/item/gunbox/captain/attack_self(mob/living/user)
|
||||
var/list/options = list()
|
||||
options["M1911 (.45)"] = list(/obj/item/weapon/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45)
|
||||
options["MT Mk58 (.45)"] = list(/obj/item/weapon/gun/projectile/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45)
|
||||
options["LAEP80 \"Thor\" (Stun/Laser)"] = list(/obj/item/weapon/gun/energy/gun, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
|
||||
options["MarsTech P92X (9mm)"] = list(/obj/item/weapon/gun/projectile/p92x/rubber, /obj/item/ammo_magazine/m9mm/rubber, /obj/item/ammo_magazine/m9mm)
|
||||
var/choice = tgui_input_list(user,"Would you prefer a ballistic pistol or an energy gun?", "Gun!", options)
|
||||
if(src && choice)
|
||||
var/list/things_to_spawn = options[choice]
|
||||
for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
|
||||
var/atom/movable/AM = new new_type(get_turf(src))
|
||||
if(istype(AM, /obj/item/weapon/gun))
|
||||
to_chat(user, "You have chosen \the [AM]. Say hello to your new friend.")
|
||||
qdel(src)
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
R.key = ghost.key
|
||||
|
||||
R.set_stat(CONSCIOUS)
|
||||
R.add_robot_verbs()
|
||||
dead_mob_list -= R
|
||||
living_mob_list |= R
|
||||
R.notify_ai(ROBOT_NOTIFICATION_NEW_UNIT)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
target = src
|
||||
|
||||
var/turf/T = get_turf(target)
|
||||
if(T.z in using_map.station_levels)
|
||||
if((T.z in using_map.station_levels) || (T.z in using_map.admin_levels))
|
||||
target.visible_message("<span class='danger'>\The [src] lets out a loud beep as safeties trigger, before imploding and falling apart.</span>")
|
||||
target.cut_overlay(image_overlay, TRUE)
|
||||
qdel(src)
|
||||
|
||||
@@ -192,9 +192,9 @@
|
||||
/obj/item/weapon/storage/lockbox/medal,
|
||||
/obj/item/device/radio/headset/heads/captain,
|
||||
/obj/item/device/radio/headset/heads/captain/alt,
|
||||
/obj/item/weapon/gun/energy/gun,
|
||||
/obj/item/gunbox/captain,
|
||||
/obj/item/weapon/melee/telebaton,
|
||||
/obj/item/device/flash,
|
||||
/obj/item/weapon/storage/box/ids,
|
||||
/obj/item/weapon/melee/rapier,
|
||||
/obj/item/clothing/accessory/holster/machete/rapier)
|
||||
/obj/item/clothing/accessory/holster/machete/rapier)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
(<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.mob.x];Y=[src.mob.y];Z=[src.mob.z]'>JMP</a>)")
|
||||
|
||||
#define LIGHTNING_REDIRECT_RANGE 28 // How far in tiles certain things draw lightning from.
|
||||
#define LIGHTNING_ZAP_RANGE 3 // How far the tesla effect zaps, as well as the bad effects from a direct strike.
|
||||
#define LIGHTNING_ZAP_RANGE 1 // How far the tesla effect zaps, as well as the bad effects from a direct strike.
|
||||
#define LIGHTNING_POWER 20000 // How much 'zap' is in a strike, used for tesla_zap().
|
||||
|
||||
// The real lightning proc.
|
||||
|
||||
@@ -529,7 +529,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
//If desired, apply equipment.
|
||||
if(equipment)
|
||||
if(charjob)
|
||||
job_master.EquipRank(new_character, charjob, 1)
|
||||
job_master.EquipRank(new_character, charjob, 1, announce)
|
||||
new_character.mind.assigned_role = charjob
|
||||
new_character.mind.role_alt_title = job_master.GetPlayerAltTitle(new_character, charjob)
|
||||
equip_custom_items(new_character) //CHOMPEdit readded to enable custom_item.txt
|
||||
@@ -550,10 +550,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
log_admin("[admin] has spawned [player_key]'s character [new_character.real_name].")
|
||||
message_admins("[admin] has spawned [player_key]'s character [new_character.real_name].", 1)
|
||||
|
||||
|
||||
|
||||
|
||||
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
// Drop pods
|
||||
if(showy == "Polite")
|
||||
var/turf/T = get_turf(new_character)
|
||||
@@ -1078,7 +1078,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set name = "Drop Pod Atom"
|
||||
set desc = "Spawn a new atom/movable in a drop pod where you are."
|
||||
set category = "Fun"
|
||||
|
||||
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
|
||||
@@ -1099,7 +1099,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
chosen = tgui_input_list(usr, "Select a movable type:", "Spawn in Drop Pod", matches)
|
||||
if(!chosen)
|
||||
return
|
||||
|
||||
|
||||
var/podtype = tgui_alert(src,"Destructive drop pods cause damage in a 3x3 and may break turfs. Polite drop pods lightly damage the turfs but won't break through.", "Drop Pod", list("Polite", "Destructive", "Cancel"))
|
||||
if(podtype == "Cancel")
|
||||
return
|
||||
@@ -1120,14 +1120,14 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set name = "Drop Pod Deploy"
|
||||
set desc = "Drop an existing mob where you are in a drop pod."
|
||||
set category = "Fun"
|
||||
|
||||
|
||||
if(!check_rights(R_SPAWN))
|
||||
return
|
||||
|
||||
var/mob/living/L = tgui_input_list(usr, "Select the mob to drop:", "Mob Picker", living_mob_list)
|
||||
if(!L)
|
||||
return
|
||||
|
||||
|
||||
var/podtype = tgui_alert(src,"Destructive drop pods cause damage in a 3x3 and may break turfs. Polite drop pods lightly damage the turfs but won't break through.", "Drop Pod", list("Polite", "Destructive", "Cancel"))
|
||||
if(podtype == "Cancel")
|
||||
return
|
||||
|
||||
@@ -16,6 +16,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
"diona" = 1, // 12
|
||||
"mutineer" = 1, // 13
|
||||
"loyalist" = 1, // 14
|
||||
"GHOST" = 0, // CHOMPEDIT - add seperate section for ghost roles
|
||||
"pAI candidate" = 1, // 15
|
||||
//VOREStation Add
|
||||
"lost drone" = 1, // 16
|
||||
@@ -51,7 +52,12 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
. += "<b>Be [i]:</b> <font color=red><b> \[BANNED]</b></font><br>"
|
||||
else
|
||||
. += "<b>Be [i]:</b> <a href='?src=\ref[src];be_special=[n]'><b>[pref.be_special&(1<<n) ? "Yes" : "No"]</b></a><br>"
|
||||
n++
|
||||
// CHOMPEdit Start - Add header for Ghost roles section
|
||||
if(i == "GHOST")
|
||||
. += "<h4><u>GHOST ROLES</u> - Roles that are joinable as ghosts, but not true antags.</h4><br>"
|
||||
else
|
||||
//CHOMPEdit End
|
||||
n++
|
||||
|
||||
/datum/category_item/player_setup_item/antagonism/candidacy/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(href_list["be_special"])
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
preference = list(preference)
|
||||
for(var/p in preference)
|
||||
var/datum/client_preference/cp = get_client_preference(p)
|
||||
if(!cp || !(cp.key in prefs.preferences_enabled))
|
||||
if(!prefs || !cp || !(cp.key in prefs.preferences_enabled))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -11,9 +11,8 @@
|
||||
spawncount = rand(2 * severity, 6 * severity)
|
||||
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
|
||||
//CHOMPEdit: Added a couple areas to the exclusion. Also made this actually work.
|
||||
var/in_area = get_area(temp_vent)
|
||||
if(istype(in_area, /area/crew_quarters/sleep) || istype(in_area, /area/hallway/secondary/entry))
|
||||
var/area/A = get_area(temp_vent)
|
||||
if(A.forbid_events)
|
||||
continue
|
||||
if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels))
|
||||
if(temp_vent.network.normal_members.len > 10) //CHOMP Edit: Most our networks are 40. SM is 4 and toxins is 2. This needed to change in order to spawn.
|
||||
|
||||
@@ -22,8 +22,10 @@
|
||||
if(istype(in_area, /area/crew_quarters/sleep) || istype(in_area, /area/hallway/secondary/entry))
|
||||
continue
|
||||
if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels))
|
||||
if(temp_vent.network.normal_members.len > 10) //CHOMP Edit: Most our networks are 40. SM is 4 and toxins is 2. This needed to change in order to spawn.
|
||||
vents += temp_vent
|
||||
if(temp_vent.network.normal_members.len > 10) //CHOMP Edit: Most our networks are 40. SM is 4 and toxins is 2. This needed to change to 10 from 50 in order for spawns to work.
|
||||
var/area/A = get_area(temp_vent)
|
||||
if(!(A.forbid_events))
|
||||
vents += temp_vent
|
||||
|
||||
while((spawncount >= 1) && vents.len)
|
||||
var/obj/vent = pick(vents)
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
new /datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), //VOREStation Add
|
||||
@@ -74,7 +73,7 @@
|
||||
icon_base = "stone"
|
||||
icon_reinf = "reinf_stone"
|
||||
integrity = 65 //a bit stronger than regular wood
|
||||
hardness = 20
|
||||
hardness = 20
|
||||
weight = 20 //likewise, heavier
|
||||
|
||||
/datum/material/wood/hardwood/generate_recipes()
|
||||
|
||||
@@ -807,6 +807,8 @@
|
||||
|
||||
if(adjusted_pressure >= species.hazard_high_pressure)
|
||||
var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
|
||||
if(stat==DEAD)
|
||||
pressure_damage = pressure_damage/2
|
||||
take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure")
|
||||
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
|
||||
else if(adjusted_pressure >= species.warning_high_pressure)
|
||||
@@ -818,7 +820,10 @@
|
||||
else
|
||||
if( !(COLD_RESISTANCE in mutations))
|
||||
if(!isSynthetic() || !nif || !nif.flag_check(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER)) //VOREStation Edit - NIF pressure seals
|
||||
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
|
||||
var/pressure_damage = LOW_PRESSURE_DAMAGE
|
||||
if(stat==DEAD)
|
||||
pressure_damage = pressure_damage/2
|
||||
take_overall_damage(brute=pressure_damage, used_weapon = "Low Pressure")
|
||||
if(getOxyLoss() < 55) // 12 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute
|
||||
var/pressure_dam = 3 // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds
|
||||
// (Extra 1 oxyloss from failed breath)
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
ASSERT(src)
|
||||
ASSERT(istype(H))
|
||||
var/datum/species/new_copy = new src.type()
|
||||
new_copy.race_key = race_key
|
||||
|
||||
if(selects_bodytype && custom_base) //If race selects a bodytype, retrieve the custom_base species and copy needed variables.
|
||||
var/datum/species/S = GLOB.all_species[custom_base]
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
set desc = "Sets OOC notes about yourself or your RP preferences or status."
|
||||
set category = "OOC"
|
||||
|
||||
var/new_metadata = sanitize(tgui_input_text(usr, "Enter any information you'd like others to see, such as Roleplay-preferences. This will not be saved permanently, only for this round.", "Game Preference" , html_decode(ooc_notes), , prevent_enter = TRUE), extra = 0)
|
||||
var/new_metadata = sanitize(tgui_input_text(usr, "Enter any information you'd like others to see, such as Roleplay-preferences. This will not be saved permanently, only for this round.", "Game Preference" , html_decode(ooc_notes), multiline = TRUE, prevent_enter = TRUE), extra = 0)
|
||||
if(new_metadata && CanUseTopic(usr))
|
||||
ooc_notes = new_metadata
|
||||
to_chat(usr, "OOC notes updated.")
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
add_language(LANGUAGE_GUTTER, 1)
|
||||
add_language(LANGUAGE_EAL, 1)
|
||||
add_language(LANGUAGE_TERMINUS, 1)
|
||||
add_language(LANGUAGE_SIGN, 0)
|
||||
add_language(LANGUAGE_SIGN, 1)
|
||||
|
||||
verbs += /mob/living/silicon/pai/proc/choose_chassis
|
||||
verbs += /mob/living/silicon/pai/proc/choose_verbs
|
||||
|
||||
@@ -319,7 +319,7 @@
|
||||
/mob/living/simple_mob/Bump(var/atom/A)
|
||||
if(mobcard && istype(A, /obj/machinery/door))
|
||||
var/obj/machinery/door/D = A
|
||||
if(!istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && !istype(D, /obj/machinery/door/airlock/lift) && D.check_access(mobcard))
|
||||
if(client && !istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && !istype(D, /obj/machinery/door/airlock/lift) && D.check_access(mobcard))
|
||||
D.open()
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -58,7 +58,8 @@
|
||||
// Release belly contents before being gc'd!
|
||||
/mob/living/simple_mob/Destroy()
|
||||
release_vore_contents()
|
||||
prey_excludes.Cut()
|
||||
if(prey_excludes)
|
||||
prey_excludes.Cut()
|
||||
return ..()
|
||||
|
||||
//For all those ID-having mobs
|
||||
|
||||
@@ -10,21 +10,30 @@ var/global/datum/ntnet/ntnet_global = new()
|
||||
var/list/available_news = list()
|
||||
var/list/chat_channels = list()
|
||||
var/list/fileservers = list()
|
||||
var/list/email_accounts = list() // I guess we won't have more than 999 email accounts active at once in single round, so this will do until Servers are implemented someday.
|
||||
/// Holds all the email accounts that exists. Hopefully won't exceed 999
|
||||
var/list/email_accounts = list()
|
||||
var/list/banned_nids = list()
|
||||
// Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly.
|
||||
// High values make displaying logs much laggier.
|
||||
/// A list of nid - os datum pairs. An OS in this list is not necessarily connected to NTNet or visible on it.
|
||||
var/list/registered_nids = list()
|
||||
/// Amount of log entries the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly. High values make displaying logs much laggier.
|
||||
var/setting_maxlogcount = 100
|
||||
|
||||
// These only affect wireless. LAN (consoles) are unaffected since it would be possible to create scenario where someone turns off NTNet, and is unable to turn it back on since it refuses connections
|
||||
var/setting_softwaredownload = 1
|
||||
var/setting_peertopeer = 1
|
||||
var/setting_communication = 1
|
||||
var/setting_systemcontrol = 1
|
||||
var/setting_disabled = 0 // Setting to 1 will disable all wireless, independently on relays status.
|
||||
/// Programs requiring NTNET_SOFTWAREDOWNLOAD won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
|
||||
var/setting_softwaredownload = TRUE
|
||||
/// Programs requiring NTNET_PEERTOPEER won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
|
||||
var/setting_peertopeer = TRUE
|
||||
/// Programs requiring NTNET_COMMUNICATION won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
|
||||
var/setting_communication = TRUE
|
||||
/// Programs requiring NTNET_SYSTEMCONTROL won't work if this is set to FALSE and public-facing device they are connecting with is wireless.
|
||||
var/setting_systemcontrol = TRUE
|
||||
|
||||
var/intrusion_detection_enabled = 1 // Whether the IDS warning system is enabled
|
||||
var/intrusion_detection_alarm = 0 // Set when there is an IDS warning due to malicious (antag) software.
|
||||
/// Setting to TRUE will disable all wireless connections, independently off relays status.
|
||||
var/setting_disabled = FALSE
|
||||
|
||||
/// Whether the IDS warning system is enabled
|
||||
var/intrusion_detection_enabled = TRUE
|
||||
/// Set when there is an IDS warning due to malicious (antag) software.
|
||||
var/intrusion_detection_alarm = FALSE
|
||||
|
||||
|
||||
// If new NTNet datum is spawned, it replaces the old one.
|
||||
@@ -62,7 +71,13 @@ var/global/datum/ntnet/ntnet_global = new()
|
||||
else
|
||||
break
|
||||
|
||||
/datum/ntnet/proc/check_banned(var/NID)
|
||||
/datum/ntnet/proc/get_os_by_nid(NID)
|
||||
return registered_nids["[NID]"]
|
||||
|
||||
/datum/ntnet/proc/unregister(NID)
|
||||
registered_nids -= "[NID]"
|
||||
|
||||
/datum/ntnet/proc/check_banned(NID)
|
||||
if(!relays || !relays.len)
|
||||
return FALSE
|
||||
|
||||
@@ -138,10 +153,12 @@ var/global/datum/ntnet/ntnet_global = new()
|
||||
// Resets the IDS alarm
|
||||
/datum/ntnet/proc/resetIDS()
|
||||
intrusion_detection_alarm = 0
|
||||
add_log("-!- INTRUSION DETECTION ALARM RESET BY SYSTEM OPERATOR -!-")
|
||||
|
||||
/datum/ntnet/proc/toggleIDS()
|
||||
resetIDS()
|
||||
intrusion_detection_enabled = !intrusion_detection_enabled
|
||||
add_log("Configuration Updated. Intrusion Detection [intrusion_detection_enabled ? "enabled" : "disabled"].")
|
||||
|
||||
// Removes all logs
|
||||
/datum/ntnet/proc/purge_logs()
|
||||
@@ -185,4 +202,3 @@ var/global/datum/ntnet/ntnet_global = new()
|
||||
for(var/datum/ntnet_conversation/chan in chat_channels)
|
||||
if(chan.id == id)
|
||||
return chan
|
||||
|
||||
|
||||
@@ -1,12 +1,22 @@
|
||||
/datum/computer_file/data/email_account/
|
||||
var/list/inbox = list()
|
||||
var/list/outbox = list()
|
||||
var/list/spam = list()
|
||||
var/list/deleted = list()
|
||||
|
||||
var/login = ""
|
||||
var/password = ""
|
||||
var/can_login = TRUE // Whether you can log in with this account. Set to false for system accounts
|
||||
var/suspended = FALSE // Whether the account is banned by the SA.
|
||||
/// Whether you can log in with this account. Set to FALSE for system accounts.
|
||||
var/can_login = TRUE
|
||||
/// Whether the account is banned by the SA.
|
||||
var/suspended = FALSE
|
||||
var/connected_clients = list()
|
||||
|
||||
var/fullname = "N/A"
|
||||
var/assignment = "N/A"
|
||||
|
||||
var/notification_mute = FALSE
|
||||
var/notification_sound = "*beep*"
|
||||
|
||||
/datum/computer_file/data/email_account/calculate_size()
|
||||
size = 1
|
||||
@@ -64,7 +74,28 @@
|
||||
can_login = FALSE
|
||||
|
||||
/datum/computer_file/data/email_account/service/broadcaster/
|
||||
login = "broadcast@internal-services.nt"
|
||||
login = EMAIL_BROADCAST
|
||||
|
||||
/datum/computer_file/data/email_account/service/broadcaster/receive_mail(var/datum/computer_file/data/email_message/received_message, var/relayed)
|
||||
if(suspended || !istype(received_message) || relayed)
|
||||
return FALSE
|
||||
// Possibly exploitable for user spamming so keep admins informed.
|
||||
if(!received_message.spam)
|
||||
log_and_message_admins("Broadcast email address used by [usr]. Message title: [received_message.title].")
|
||||
|
||||
spawn(0)
|
||||
for(var/datum/computer_file/data/email_account/email_account in ntnet_global.email_accounts)
|
||||
var/datum/computer_file/data/email_message/new_message = received_message.clone()
|
||||
send_mail(email_account.login, new_message, 1)
|
||||
sleep(2)
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/computer_file/data/email_account/service/document
|
||||
login = EMAIL_DOCUMENTS
|
||||
|
||||
/datum/computer_file/data/email_account/service/sysadmin
|
||||
login = EMAIL_SYSADMIN
|
||||
|
||||
/datum/computer_file/data/email_account/service/broadcaster/receive_mail(var/datum/computer_file/data/email_message/received_message, var/relayed)
|
||||
if(!istype(received_message) || relayed)
|
||||
@@ -79,4 +110,4 @@
|
||||
send_mail(email_account.login, new_message, 1)
|
||||
sleep(2)
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -53,4 +53,12 @@
|
||||
var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs.
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage
|
||||
var/obj/item/weapon/computer_hardware/ai_slot/ai_slot // AI slot, an intellicard housing that allows modifications of AIs.
|
||||
var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC.
|
||||
var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC.
|
||||
|
||||
var/modifiable = TRUE // can't be modified or damaged if false
|
||||
|
||||
var/stores_pen = FALSE
|
||||
var/obj/item/weapon/pen/stored_pen
|
||||
|
||||
var/interact_sounds
|
||||
var/interact_sound_volume = 40
|
||||
|
||||
@@ -1,18 +1,35 @@
|
||||
var/global/file_uid = 0
|
||||
|
||||
/datum/computer_file/
|
||||
var/filename = "NewFile" // Placeholder. No spacebars
|
||||
var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case
|
||||
var/size = 1 // File size in GQ. Integers only!
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/holder // Holder that contains this file.
|
||||
var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means.
|
||||
var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc.
|
||||
var/uid // UID of this file
|
||||
/// Placeholder. Whitespace and most special characters are not allowed.
|
||||
var/filename = "NewFile"
|
||||
/// File full names are [filename].[filetype] so like NewFile.XXX in this case
|
||||
var/filetype = "XXX"
|
||||
/// File size in GQ. Integers only!
|
||||
var/size = 1
|
||||
/// Holder that contains this file.
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/holder
|
||||
//// Whether the file may be sent to someone via NTNet transfer, email or other means.
|
||||
var/unsendable = FALSE
|
||||
/// Whether the file may be deleted. Setting to TRUE prevents deletion/renaming/etc.
|
||||
var/undeletable = FALSE
|
||||
/// Whether the file is hidden from view in the OS
|
||||
var/hidden = FALSE
|
||||
/// Protects files that should never be edited by the user due to special properties.
|
||||
var/read_only = FALSE
|
||||
/// UID of this file
|
||||
var/uid
|
||||
/// Any metadata the file uses.
|
||||
var/list/metadata
|
||||
/// Paper type to use for printing
|
||||
var/papertype = /obj/item/weapon/paper
|
||||
|
||||
/datum/computer_file/New()
|
||||
/datum/computer_file/New(list/md = null)
|
||||
..()
|
||||
uid = file_uid
|
||||
file_uid++
|
||||
if(islist(md))
|
||||
metadata = md.Copy()
|
||||
|
||||
/datum/computer_file/Destroy()
|
||||
if(!holder)
|
||||
@@ -30,10 +47,13 @@ var/global/file_uid = 0
|
||||
var/datum/computer_file/temp = new type
|
||||
temp.unsendable = unsendable
|
||||
temp.undeletable = undeletable
|
||||
temp.hidden = hidden
|
||||
temp.size = size
|
||||
if(metadata)
|
||||
temp.metadata = metadata.Copy()
|
||||
if(rename)
|
||||
temp.filename = filename + "(Copy)"
|
||||
else
|
||||
temp.filename = filename
|
||||
temp.filetype = filetype
|
||||
return temp
|
||||
return temp
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
// /data/ files store data in string format.
|
||||
// They don't contain other logic for now.
|
||||
/datum/computer_file/data
|
||||
var/stored_data = "" // Stored data in string format.
|
||||
filetype = "DAT"
|
||||
|
||||
var/stored_data = "" // Stored data in string format.
|
||||
var/block_size = 250
|
||||
var/do_not_edit = 0 // Whether the user will be reminded that the file probably shouldn't be edited.
|
||||
var/do_not_edit = FALSE // Whether the user will be reminded that the file probably shouldn't be edited.
|
||||
|
||||
/datum/computer_file/data/clone()
|
||||
var/datum/computer_file/data/temp = ..()
|
||||
@@ -15,5 +16,43 @@
|
||||
/datum/computer_file/data/proc/calculate_size()
|
||||
size = max(1, round(length(stored_data) / block_size))
|
||||
|
||||
/datum/computer_file/data/proc/generate_file_data(mob/user)
|
||||
return digitalPencode2html(stored_data)
|
||||
|
||||
/datum/computer_file/data/logfile
|
||||
filetype = "LOG"
|
||||
|
||||
/datum/computer_file/data/text
|
||||
filetype = "TXT"
|
||||
|
||||
/// Mapping tool - creates a named modular computer file in a computer's storage on late initialize.
|
||||
/// Use this to do things like automatic records and blackboxes. Alternative for paper records.
|
||||
/// Values can be in the editor for each map or as a subtype.
|
||||
/// This is an obj because raw atoms can't be placed in DM or third-party mapping tools.
|
||||
///obj/effect/computer_file_creator
|
||||
// name = "computer file creator"
|
||||
// desc = "This is a mapping tool used for installing text files onto a modular device when it's mapped on top of them. If you see it, it's bugged."
|
||||
// icon = 'icons/effects/landmarks.dmi'
|
||||
// icon_state = "x3"
|
||||
// anchored = TRUE
|
||||
// unacidable = TRUE
|
||||
// simulated = FALSE
|
||||
// invisibility = 101
|
||||
// /// The name that the file will have once it's created.
|
||||
// var/file_name = "helloworld"
|
||||
// /// The contents of this file. Uses paper formatting.
|
||||
// var/file_info = "Hello World!"
|
||||
|
||||
///obj/effect/computer_file_creator/Initialize()
|
||||
// . = ..()
|
||||
// return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
///obj/effect/computer_file_creator/LateInitialize()
|
||||
// var/turf/T = get_turf(src)
|
||||
// for (var/obj/O in T)
|
||||
// if (!istype(O, /obj/machinery/computer/modular) && !istype(O, /obj/item/modular_computer))
|
||||
// continue
|
||||
// var/datum/extension/interactive/ntos/os = get_extension(O, /datum/extension/interactive/ntos)
|
||||
// if (os)
|
||||
// os.create_data_file(file_name, file_info, /datum/computer_file/data/text)
|
||||
// qdel(src)
|
||||
|
||||
@@ -1,30 +1,39 @@
|
||||
// /program/ files are executable programs that do things.
|
||||
/datum/computer_file/program
|
||||
filetype = "PRG"
|
||||
filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET!
|
||||
filetype = "PRG"
|
||||
|
||||
var/required_access = null // List of required accesses to run/download the program.
|
||||
var/requires_access_to_run = 1 // Whether the program checks for required_access when run.
|
||||
var/requires_access_to_download = 1 // Whether the program checks for required_access when downloading.
|
||||
|
||||
// TGUIModule
|
||||
var/datum/tgui_module/TM = null // If the program uses TGUIModule, put it here and it will be automagically opened. Otherwise implement tgui_interact.
|
||||
var/tguimodule_path = null // Path to tguimodule, make sure to set this if implementing new program.
|
||||
// Etc Program stuff
|
||||
var/program_state = PROGRAM_STATE_KILLED// PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running.
|
||||
var/obj/item/modular_computer/computer // Device that runs this program.
|
||||
|
||||
var/filedesc = "Unknown Program" // User-friendly name of this program.
|
||||
var/extended_desc = "N/A" // Short description of this program's function.
|
||||
/// Category that this program belongs to.
|
||||
var/category = PROG_MISC
|
||||
var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
|
||||
|
||||
var/program_icon_state = null // Program-specific screen icon state
|
||||
var/program_key_state = "standby_key" // Program-specific keyboard icon state
|
||||
var/program_menu_icon = "newwin" // Icon to use for program's link in main menu
|
||||
var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images!
|
||||
|
||||
var/requires_ntnet = 0 // Set to 1 for program to require nonstop NTNet connection to run. If NTNet connection is lost program crashes.
|
||||
var/requires_ntnet_feature = 0 // Optional, if above is set to 1 checks for specific function of NTNet (currently NTNET_SOFTWAREDOWNLOAD, NTNET_PEERTOPEER, NTNET_SYSTEMCONTROL and NTNET_COMMUNICATION)
|
||||
var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc.
|
||||
var/usage_flags = PROGRAM_ALL // Bitflags (PROGRAM_CONSOLE, PROGRAM_LAPTOP, PROGRAM_TABLET combination) or PROGRAM_ALL
|
||||
var/network_destination = null // Optional string that describes what NTNet server/system this program connects to. Used in default logging.
|
||||
|
||||
var/ntnet_status = 1 // NTNet status, updated every tick by computer running this program. Don't use this for checks if NTNet works, computers do that. Use this for calculations, etc.
|
||||
var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable.
|
||||
var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable.
|
||||
|
||||
// Misc
|
||||
var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick
|
||||
var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images!
|
||||
var/ntnet_speed = 0 // GQ/s - current network connectivity transfer rate
|
||||
/// Name of the tgui interface
|
||||
var/tgui_id
|
||||
@@ -230,4 +239,4 @@
|
||||
|
||||
/datum/computer_file/program/proc/relaymove(var/mob/M, direction)
|
||||
if(TM)
|
||||
return TM.relaymove(M, direction)
|
||||
return TM.relaymove(M, direction)
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
program_menu_icon = "zoomin"
|
||||
extended_desc = "This very advanced piece of software uses adaptive programming and large database of cipherkeys to bypass most encryptions used on camera networks. Be warned that system administrator may notice this."
|
||||
size = 73 // Very large, a price for bypassing ID checks completely.
|
||||
available_on_ntnet = 0
|
||||
available_on_syndinet = 1
|
||||
available_on_ntnet = FALSE
|
||||
available_on_syndinet = TRUE
|
||||
|
||||
/datum/computer_file/program/camera_monitor/hacked/process_tick()
|
||||
..()
|
||||
|
||||
@@ -7,5 +7,6 @@
|
||||
program_menu_icon = "key"
|
||||
extended_desc = "Program for programming crew ID cards."
|
||||
required_access = access_change_ids
|
||||
requires_ntnet = 0
|
||||
requires_ntnet = FALSE
|
||||
size = 8
|
||||
category = PROG_COMMAND
|
||||
|
||||
@@ -12,10 +12,11 @@
|
||||
tguimodule_path = /datum/tgui_module/communications/ntos
|
||||
extended_desc = "Used to command and control. Can relay long-range communications. This program can not be run on tablet computers."
|
||||
required_access = access_heads
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
size = 12
|
||||
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
|
||||
network_destination = "long-range communication array"
|
||||
category = PROG_COMMAND
|
||||
var/datum/comm_message_listener/message_core = new
|
||||
|
||||
/datum/computer_file/program/comm/clone()
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
program_menu_icon = "alert"
|
||||
extended_desc = "This program provides visual interface for the engineering alarm system."
|
||||
required_access = access_engine
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "alarm monitoring network"
|
||||
size = 5
|
||||
category = PROG_MONITOR
|
||||
var/has_alert = 0
|
||||
|
||||
/datum/computer_file/program/alarm_monitor/process_tick()
|
||||
|
||||
@@ -7,8 +7,9 @@
|
||||
program_menu_icon = "shuffle"
|
||||
extended_desc = "This program allows remote control of air alarms. This program can not be run on tablet computers."
|
||||
required_access = access_atmospherics
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "atmospheric control system"
|
||||
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
||||
usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE
|
||||
category = PROG_ENG
|
||||
size = 17
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
extended_desc = "This program connects to sensors to provide information about electrical systems"
|
||||
ui_header = "power_norm.gif"
|
||||
required_access = access_engine
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "power monitoring system"
|
||||
size = 9
|
||||
category = PROG_ENG
|
||||
var/has_alert = 0
|
||||
|
||||
/datum/computer_file/program/power_monitor/process_tick()
|
||||
|
||||
@@ -7,8 +7,9 @@
|
||||
program_menu_icon = "power"
|
||||
extended_desc = "This program allows remote control of power distribution systems. This program can not be run on tablet computers."
|
||||
required_access = access_engine
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "RCON remote control system"
|
||||
requires_ntnet_feature = NTNET_SYSTEMCONTROL
|
||||
usage_flags = PROGRAM_LAPTOP | PROGRAM_CONSOLE
|
||||
size = 19
|
||||
category = PROG_ENG
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
program_menu_icon = "wrench"
|
||||
extended_desc = "This program allows for remote monitoring and control of emergency shutoff valves."
|
||||
required_access = access_engine
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "shutoff valve control computer"
|
||||
size = 5
|
||||
category = PROG_ENG
|
||||
var/has_alert = 0
|
||||
|
||||
+2
-1
@@ -8,9 +8,10 @@
|
||||
extended_desc = "This program connects to specially calibrated supermatter sensors to provide information on the status of supermatter-based engines."
|
||||
ui_header = "smmon_0.gif"
|
||||
required_access = access_engine
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "supermatter monitoring system"
|
||||
size = 5
|
||||
category = PROG_ENG
|
||||
var/last_status = 0
|
||||
|
||||
/datum/computer_file/program/supermatter_monitor/process_tick()
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
size = 12
|
||||
available_on_ntnet = 1
|
||||
requires_ntnet = 1
|
||||
category = PROG_MONITOR
|
||||
|
||||
// ERT Variant of the program
|
||||
/datum/computer_file/program/camera_monitor/ert
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
unsendable = 1
|
||||
undeletable = 1
|
||||
size = 4
|
||||
available_on_ntnet = 0
|
||||
requires_ntnet = 0
|
||||
available_on_ntnet = FALSE
|
||||
requires_ntnet = FALSE
|
||||
tguimodule_path = /datum/tgui_module/computer_configurator
|
||||
usage_flags = PROGRAM_ALL
|
||||
category = PROG_UTIL
|
||||
|
||||
@@ -6,10 +6,12 @@
|
||||
program_key_state = "generic_key"
|
||||
program_menu_icon = "mail-closed"
|
||||
size = 7
|
||||
requires_ntnet = 1
|
||||
available_on_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
available_on_ntnet = TRUE
|
||||
var/stored_login = ""
|
||||
var/stored_password = ""
|
||||
usage_flags = PROGRAM_ALL
|
||||
category = PROG_OFFICE
|
||||
|
||||
tguimodule_path = /datum/tgui_module/email_client
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
var/open_file
|
||||
var/error
|
||||
usage_flags = PROGRAM_ALL
|
||||
category = PROG_UTIL
|
||||
|
||||
/datum/computer_file/program/filemanager/tgui_act(action, list/params, datum/tgui/ui)
|
||||
if(..())
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
///Determines which boss image to use on the UI.
|
||||
var/boss_id = 1
|
||||
|
||||
usage_flags = PROGRAM_ALL
|
||||
|
||||
// This is the primary game loop, which handles the logic of being defeated or winning.
|
||||
/datum/computer_file/program/game/proc/game_check(mob/user)
|
||||
sleep(5)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
size = 4
|
||||
requires_ntnet = TRUE
|
||||
available_on_ntnet = TRUE
|
||||
|
||||
usage_flags = PROGRAM_ALL
|
||||
tgui_id = "NtosNewsBrowser"
|
||||
|
||||
var/datum/computer_file/data/news_article/loaded_article
|
||||
@@ -118,4 +118,3 @@
|
||||
if("PRG_toggle_archived")
|
||||
. = TRUE
|
||||
show_archived = !show_archived
|
||||
|
||||
|
||||
@@ -16,12 +16,19 @@
|
||||
|
||||
var/datum/computer_file/program/downloaded_file = null
|
||||
var/hacked_download = 0
|
||||
var/download_completion = 0 //GQ of downloaded data.
|
||||
///GQ of downloaded data.
|
||||
var/download_completion = 0
|
||||
var/download_netspeed = 0
|
||||
var/downloaderror = ""
|
||||
var/obj/item/modular_computer/my_computer = null
|
||||
var/list/downloads_queue[0]
|
||||
|
||||
var/file_info
|
||||
var/server
|
||||
usage_flags = PROGRAM_ALL
|
||||
category = PROG_UTIL
|
||||
|
||||
var/obj/item/modular_computer/my_computer = null
|
||||
|
||||
/datum/computer_file/program/ntnetdownload/kill_program()
|
||||
..()
|
||||
abort_file_download()
|
||||
|
||||
@@ -12,12 +12,16 @@
|
||||
ui_header = "ntnrc_idle.gif"
|
||||
available_on_ntnet = 1
|
||||
tgui_id = "NtosNetChat"
|
||||
var/last_message // Used to generate the toolbar icon
|
||||
/// Used to generate the toolbar icon
|
||||
var/last_message
|
||||
var/username
|
||||
var/active_channel
|
||||
var/list/channel_history = list()
|
||||
var/operator_mode = FALSE // Channel operator mode
|
||||
var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords)
|
||||
/// Channel operator mode
|
||||
var/operator_mode = FALSE
|
||||
/// Administrator mode (invisible to other users + bypasses passwords)
|
||||
var/netadmin_mode = FALSE
|
||||
usage_flags = PROGRAM_ALL
|
||||
|
||||
/datum/computer_file/program/chatclient/New()
|
||||
username = "DefaultUser[rand(100, 999)]"
|
||||
@@ -169,7 +173,7 @@
|
||||
var/list/data = list()
|
||||
data["can_admin"] = can_run(user, FALSE, access_network)
|
||||
return data
|
||||
|
||||
|
||||
/datum/computer_file/program/chatclient/tgui_data(mob/user)
|
||||
if(!ntnet_global || !ntnet_global.chat_channels)
|
||||
return list()
|
||||
@@ -223,4 +227,4 @@
|
||||
data["authed"] = FALSE
|
||||
data["messages"] = list()
|
||||
|
||||
return data
|
||||
return data
|
||||
|
||||
@@ -8,11 +8,12 @@ var/global/nttransfer_uid = 0
|
||||
program_key_state = "generic_key"
|
||||
program_menu_icon = "transferthick-e-w"
|
||||
size = 7
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
requires_ntnet_feature = NTNET_PEERTOPEER
|
||||
network_destination = "other device via P2P tunnel"
|
||||
available_on_ntnet = 1
|
||||
available_on_ntnet = TRUE
|
||||
tgui_id = "NtosNetTransfer"
|
||||
category = PROG_UTIL
|
||||
|
||||
var/error = "" // Error screen
|
||||
var/server_password = "" // Optional password to download the file.
|
||||
@@ -23,7 +24,7 @@ var/global/nttransfer_uid = 0
|
||||
var/download_completion = 0 // Download progress in GQ
|
||||
var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed.
|
||||
var/unique_token // UID of this program
|
||||
var/upload_menu = 0 // Whether we show the program list and upload menu
|
||||
var/upload_menu = FALSE // Whether we show the program list and upload menu
|
||||
|
||||
/datum/computer_file/program/nttransfer/New()
|
||||
unique_token = nttransfer_uid
|
||||
@@ -86,14 +87,14 @@ var/global/nttransfer_uid = 0
|
||||
data["download_progress"] = download_completion
|
||||
data["download_netspeed"] = actual_netspeed
|
||||
data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]"
|
||||
|
||||
|
||||
data["uploading"] = !!provided_file
|
||||
if(provided_file)
|
||||
data["upload_uid"] = unique_token
|
||||
data["upload_clients"] = connected_clients.len
|
||||
data["upload_haspassword"] = server_password ? 1 : 0
|
||||
data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]"
|
||||
|
||||
|
||||
data["upload_filelist"] = list()
|
||||
if(upload_menu)
|
||||
var/list/all_files = list()
|
||||
@@ -104,7 +105,7 @@ var/global/nttransfer_uid = 0
|
||||
"size" = F.size
|
||||
)))
|
||||
data["upload_filelist"] = all_files
|
||||
|
||||
|
||||
data["servers"] = list()
|
||||
if(!(downloaded_file || provided_file || upload_menu))
|
||||
var/list/all_servers = list()
|
||||
|
||||
@@ -9,12 +9,15 @@
|
||||
available_on_ntnet = TRUE
|
||||
tgui_id = "NtosWordProcessor"
|
||||
|
||||
var/browsing
|
||||
var/browsing = FALSE
|
||||
var/open_file
|
||||
var/loaded_data
|
||||
var/error
|
||||
var/is_edited
|
||||
|
||||
usage_flags = PROGRAM_ALL
|
||||
category = PROG_OFFICE
|
||||
|
||||
/datum/computer_file/program/wordprocessor/proc/get_file(var/filename)
|
||||
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
|
||||
if(!HDD)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
program_menu_icon = "heart"
|
||||
extended_desc = "This program connects to life signs monitoring system to provide basic information on crew health."
|
||||
required_access = access_medical
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "crew lifesigns monitoring system"
|
||||
size = 11
|
||||
category = PROG_MONITOR
|
||||
|
||||
+3
-2
@@ -6,10 +6,11 @@
|
||||
program_key_state = "generic_key"
|
||||
program_menu_icon = "mail-open"
|
||||
size = 12
|
||||
requires_ntnet = 1
|
||||
available_on_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
available_on_ntnet = TRUE
|
||||
tgui_id = "NtosEmailAdministration"
|
||||
required_access = access_network
|
||||
category = PROG_ADMIN
|
||||
|
||||
var/datum/computer_file/data/email_account/current_account = null
|
||||
var/datum/computer_file/data/email_message/current_message = null
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
required_access = access_network
|
||||
available_on_ntnet = TRUE
|
||||
tgui_id = "NtosNetMonitor"
|
||||
category = PROG_ADMIN
|
||||
|
||||
/datum/computer_file/program/ntnetmonitor/tgui_data(mob/user)
|
||||
if(!ntnet_global)
|
||||
@@ -90,4 +91,4 @@
|
||||
var/nid = tgui_input_number(usr,"Enter NID of device which you want to unblock from the network:", "Enter NID")
|
||||
if(nid && tgui_status(usr, state) == STATUS_INTERACTIVE)
|
||||
ntnet_global.banned_nids -= nid
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -17,11 +17,12 @@ var/warrant_uid = 0
|
||||
program_icon_state = "warrant"
|
||||
program_key_state = "security_key"
|
||||
program_menu_icon = "star"
|
||||
requires_ntnet = 1
|
||||
available_on_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
available_on_ntnet = TRUE
|
||||
required_access = access_security
|
||||
usage_flags = PROGRAM_ALL
|
||||
tgui_id = "NtosDigitalWarrant"
|
||||
category = PROG_SEC
|
||||
|
||||
var/datum/data/record/warrant/activewarrant
|
||||
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
program_menu_icon = "pin-s"
|
||||
extended_desc = "Displays a ship's location in the sector."
|
||||
required_access = null
|
||||
requires_ntnet = 1
|
||||
requires_ntnet = TRUE
|
||||
network_destination = "ship position sensors"
|
||||
size = 4
|
||||
|
||||
@@ -3,33 +3,46 @@
|
||||
desc = "Unknown Hardware."
|
||||
icon = 'icons/obj/modular_components.dmi'
|
||||
var/obj/item/modular_computer/holder2 = null
|
||||
var/power_usage = 0 // If the hardware uses extra power, change this.
|
||||
var/enabled = 1 // If the hardware is turned off set this to 0.
|
||||
var/critical = 1 // Prevent disabling for important component, like the HDD.
|
||||
var/hardware_size = 1 // Limits which devices can contain this component. 1: Tablets/Laptops/Consoles, 2: Laptops/Consoles, 3: Consoles only
|
||||
var/damage = 0 // Current damage level
|
||||
var/max_damage = 100 // Maximal damage level.
|
||||
var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
|
||||
var/damage_failure = 50 // "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
|
||||
var/malfunction_probability = 10// Chance of malfunction when the component is damaged
|
||||
|
||||
/obj/item/weapon/computer_hardware/attackby(var/obj/item/W as obj, var/mob/living/user as mob)
|
||||
/// If the hardware uses extra power, change this.
|
||||
var/power_usage = 0
|
||||
/// If the hardware is turned off set this to FALSE.
|
||||
var/enabled = TRUE
|
||||
/// Prevent disabling for important component, like the HDD.
|
||||
var/critical = 1
|
||||
/// Limits which devices can contain this component. 1: All, 2: Laptops/Consoles, 3: Consoles only
|
||||
var/hardware_size = 1
|
||||
/// Current damage level
|
||||
var/damage = 0
|
||||
/// Maximal damage level.
|
||||
var/max_damage = 100
|
||||
/// "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
|
||||
var/damage_malfunction = 20
|
||||
/// "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
|
||||
var/damage_failure = 50
|
||||
/// Chance of malfunction when the component is damaged
|
||||
var/malfunction_probability = 10
|
||||
var/usage_flags = PROGRAM_ALL
|
||||
/// Whether attackby will be passed on it even with a closed panel
|
||||
var/external_slot
|
||||
|
||||
/obj/item/weapon/computer_hardware/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
// Multitool. Runs diagnostics
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
to_chat(user, "***** DIAGNOSTICS REPORT *****")
|
||||
diagnostics(user)
|
||||
to_chat(user, "******************************")
|
||||
return 1
|
||||
return TRUE
|
||||
// Nanopaste. Repair all damage if present for a single unit.
|
||||
var/obj/item/stack/S = W
|
||||
if(istype(S, /obj/item/stack/nanopaste))
|
||||
if(!damage)
|
||||
to_chat(user, "\The [src] doesn't seem to require repairs.")
|
||||
return 1
|
||||
return TRUE
|
||||
if(S.use(1))
|
||||
to_chat(user, "You apply a bit of \the [W] to \the [src]. It immediately repairs all damage.")
|
||||
damage = 0
|
||||
return 1
|
||||
return TRUE
|
||||
// Cable coil. Works as repair method, but will probably require multiple applications and more cable.
|
||||
if(istype(S, /obj/item/stack/cable_coil))
|
||||
if(!damage)
|
||||
@@ -38,11 +51,11 @@
|
||||
if(S.use(1))
|
||||
to_chat(user, "You patch up \the [src] with a bit of \the [W].")
|
||||
take_damage(-10)
|
||||
return 1
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
|
||||
// Called on multitool click, prints diagnostic information to the user.
|
||||
/// Returns a list of lines containing diagnostic information for display.
|
||||
/obj/item/weapon/computer_hardware/proc/diagnostics(var/mob/user)
|
||||
to_chat(user, "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]")
|
||||
|
||||
@@ -57,20 +70,20 @@
|
||||
holder2 = null
|
||||
return ..()
|
||||
|
||||
// Handles damage checks
|
||||
/// Handles damage checks
|
||||
/obj/item/weapon/computer_hardware/proc/check_functionality()
|
||||
// Turned off
|
||||
if(!enabled)
|
||||
return 0
|
||||
return FALSE
|
||||
// Too damaged to work at all.
|
||||
if(damage > damage_failure)
|
||||
return 0
|
||||
return FALSE
|
||||
// Still working. Well, sometimes...
|
||||
if(damage > damage_malfunction)
|
||||
if(prob(malfunction_probability))
|
||||
return 0
|
||||
return FALSE
|
||||
// Good to go.
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/computer_hardware/examine(var/mob/user)
|
||||
. = ..()
|
||||
@@ -81,8 +94,7 @@
|
||||
else if(damage)
|
||||
. += "It seems to be slightly damaged."
|
||||
|
||||
// Damages the component. Contains necessary checks. Negative damage "heals" the component.
|
||||
/// Damages the component. Contains necessary checks. Negative damage "heals" the component.
|
||||
/obj/item/weapon/computer_hardware/take_damage(var/amount)
|
||||
damage += round(amount) // We want nice rounded numbers here.
|
||||
damage = between(0, damage, max_damage) // Clamp the value.
|
||||
|
||||
|
||||
@@ -5,9 +5,13 @@
|
||||
icon_state = "hdd_normal"
|
||||
hardware_size = 1
|
||||
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
|
||||
|
||||
var/max_capacity = 128
|
||||
var/used_capacity = 0
|
||||
var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
|
||||
/// List of stored files on this drive. DO NOT MODIFY DIRECTLY!
|
||||
var/list/stored_files = list()
|
||||
/// Whether drive is protected against changes
|
||||
var/read_only = FALSE
|
||||
|
||||
/obj/item/weapon/computer_hardware/hard_drive/advanced
|
||||
name = "advanced hard drive"
|
||||
@@ -60,6 +64,7 @@
|
||||
// 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space.
|
||||
to_chat(user, "NT-NFS File Table Status: [stored_files.len]/999")
|
||||
to_chat(user, "Storage capacity: [used_capacity]/[max_capacity]GQ")
|
||||
to_chat(user, "Read-only mode: [(read_only ? "ON" : "OFF")]")
|
||||
|
||||
// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
|
||||
/obj/item/weapon/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
|
||||
@@ -164,4 +169,4 @@
|
||||
|
||||
/obj/item/weapon/computer_hardware/hard_drive/New()
|
||||
install_default_programs()
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -8,12 +8,20 @@ var/global/ntnet_card_uid = 1
|
||||
critical = 0
|
||||
icon_state = "netcard_basic"
|
||||
hardware_size = 1
|
||||
var/identification_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user.
|
||||
var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user.
|
||||
var/long_range = 0
|
||||
var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks.
|
||||
malfunction_probability = 1
|
||||
|
||||
/// Identification ID. Technically MAC address of this device. Can't be changed by user.
|
||||
var/identification_id = null
|
||||
/// Identification string, technically nickname seen in the network. Can be set by user.
|
||||
var/identification_string = ""
|
||||
|
||||
/// Long-range cards have stronger connections, letting them reach relays from connected Z-levels.
|
||||
var/long_range = 0
|
||||
/// Hard-wired, therefore always on, ignores NTNet wireless checks.
|
||||
var/ethernet = 0
|
||||
/// If set, uses the value to funnel connections through another network card.
|
||||
var/proxy_id
|
||||
|
||||
/obj/item/weapon/computer_hardware/network_card/diagnostics(var/mob/user)
|
||||
..()
|
||||
to_chat(user, "NIX Unique ID: [identification_id]")
|
||||
|
||||
@@ -65,12 +65,12 @@
|
||||
/datum/persistent/storage/smartfridge/produce
|
||||
name = "fruit storage"
|
||||
max_storage = 50
|
||||
store_per_type = FALSE
|
||||
store_per_type = TRUE
|
||||
target_type = /obj/machinery/smartfridge/produce
|
||||
|
||||
/datum/persistent/storage/smartfridge/produce/lossy
|
||||
name = "fruit storage lossy"
|
||||
go_missing_chance = 12.5 // 10% loss between rounds
|
||||
go_missing_chance = 10 // 10% loss chance between rounds
|
||||
|
||||
/datum/persistent/storage/smartfridge/produce/generate_items(var/list/L) // Mostly same as storage/generate_items() but without converting string to path
|
||||
. = list()
|
||||
|
||||
@@ -447,7 +447,7 @@ var/datum/planet/sif/planet_sif = null
|
||||
light_color = "#FF0000"
|
||||
flight_failure_modifier = 25
|
||||
transition_chances = list(
|
||||
WEATHER_BLOODMOON = 100
|
||||
WEATHER_BLOOD_MOON = 100
|
||||
)
|
||||
observed_message = "Everything is red. Something really wrong is going on."
|
||||
transition_messages = list(
|
||||
|
||||
@@ -395,7 +395,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
if(show_message)
|
||||
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
|
||||
var/target_zone = pick(BP_ALL)
|
||||
var/amount_blocked = H.run_armor_check(target_zone, "melee")
|
||||
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
|
||||
@@ -419,7 +419,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
light_color = "#FF0000"
|
||||
flight_failure_modifier = 25
|
||||
transition_chances = list(
|
||||
WEATHER_BLOODMOON = 100
|
||||
WEATHER_BLOOD_MOON = 100
|
||||
)
|
||||
observed_message = "Everything is red. Something really ominous is going on."
|
||||
transition_messages = list(
|
||||
|
||||
@@ -150,7 +150,7 @@ var/datum/planet/virgo3c/planet_virgo3c = null
|
||||
WEATHER_CLEAR = 60,
|
||||
WEATHER_OVERCAST = 20,
|
||||
WEATHER_LIGHT_SNOW = 1,
|
||||
WEATHER_BLOODMOON = 1,
|
||||
WEATHER_BLOOD_MOON = 1,
|
||||
WEATHER_EMBERFALL = 0.5)
|
||||
transition_messages = list(
|
||||
"The sky clears up.",
|
||||
@@ -410,7 +410,7 @@ var/datum/planet/virgo3c/planet_virgo3c = null
|
||||
temp_low = 273.15 // 0c
|
||||
flight_failure_modifier = 25
|
||||
transition_chances = list(
|
||||
WEATHER_BLOODMOON = 25,
|
||||
WEATHER_BLOOD_MOON = 25,
|
||||
WEATHER_CLEAR = 75
|
||||
)
|
||||
observed_message = "Everything is red. Something really ominous is going on."
|
||||
|
||||
@@ -392,7 +392,7 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
temp_low = 283.15 // 10c
|
||||
flight_failure_modifier = 25
|
||||
transition_chances = list(
|
||||
WEATHER_BLOODMOON = 100
|
||||
WEATHER_BLOOD_MOON = 100
|
||||
)
|
||||
observed_message = "Everything is red. Something really ominous is going on."
|
||||
transition_messages = list(
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
/obj/item/weapon/light/bulb/large
|
||||
brightness_range = 6
|
||||
brightness_power = 1
|
||||
|
||||
|
||||
nightshift_range = 6
|
||||
nightshift_power = 0.45
|
||||
|
||||
@@ -208,4 +208,4 @@
|
||||
icon_state = "big_flamp-construct-stage2"
|
||||
if(3)
|
||||
icon_state = "big_flamp-empty"
|
||||
*/
|
||||
*/
|
||||
@@ -365,7 +365,8 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity)
|
||||
return 0
|
||||
|
||||
// VOREStation Edit Start
|
||||
if(istype(get_area(T), /area/crew_quarters/sleep)) //No going to dorms
|
||||
var/area/A = get_area(T)
|
||||
if(A.forbid_events) //No going to dorms
|
||||
return 0
|
||||
// VOREStation Edit End
|
||||
|
||||
|
||||
@@ -315,6 +315,8 @@ GLOBAL_LIST_EMPTY(smeses)
|
||||
"<span class='filter_notice'><span class='notice'>[user.name] has added cables to the [src].</span></span>",\
|
||||
"<span class='filter_notice'><span class='notice'>You added cables to the [src].</span></span>")
|
||||
stat = 0
|
||||
if(!powernet)
|
||||
connect_to_network()
|
||||
return FALSE
|
||||
|
||||
else if(W.is_wirecutter() && !building_terminal)
|
||||
@@ -418,7 +420,7 @@ GLOBAL_LIST_EMPTY(smeses)
|
||||
switch(io)
|
||||
if(SMES_TGUI_INPUT)
|
||||
set_input(target)
|
||||
if(SMES_TGUI_OUTPUT)
|
||||
if(SMES_TGUI_OUTPUT)
|
||||
set_output(target)
|
||||
|
||||
|
||||
|
||||
@@ -115,6 +115,8 @@
|
||||
spawn_reagent = "watermelonjuice"
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon
|
||||
spawn_reagent = "lemonjuice"
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/grapesoda
|
||||
spawn_reagent = "grapesoda"
|
||||
|
||||
// Bar, coffee
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge
|
||||
//CHOMP - Chems that are used but not meant for cargo supplies, at least for now. - Jack
|
||||
champagne spawn_reagent = "champagne"
|
||||
grapesoda spawn_reagent = "grapesoda"
|
||||
singulo spawn_reagent = "singulo"
|
||||
doctorsdelight spawn_reagent = "doctorsdelight"
|
||||
nothing spawn_reagent = "nothing"
|
||||
|
||||
@@ -31,7 +31,8 @@
|
||||
dispense_reagents = list(
|
||||
"hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", "sodium",
|
||||
"aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron",
|
||||
"copper", "mercury", "radium", "water", "ethanol", "sugar", "sacid", "tungsten"
|
||||
"copper", "mercury", "radium", "water", "ethanol", "sugar", "sacid", "tungsten",
|
||||
"calcium"
|
||||
)
|
||||
|
||||
/obj/machinery/chemical_dispenser/ert
|
||||
@@ -58,5 +59,5 @@
|
||||
/obj/machinery/chemical_dispenser/bar_coffee
|
||||
dispense_reagents = list(
|
||||
"coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice",
|
||||
"orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint", "decaf"
|
||||
"orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint", "decaf", "greentea"
|
||||
)
|
||||
|
||||
@@ -84,7 +84,8 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/grapesoda
|
||||
)
|
||||
|
||||
/obj/machinery/chemical_dispenser/bar_alc
|
||||
@@ -115,7 +116,8 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cider,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ale,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/mead
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/mead,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/bitters
|
||||
)
|
||||
|
||||
/obj/machinery/chemical_dispenser/bar_coffee
|
||||
|
||||
@@ -62,7 +62,8 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/calcium
|
||||
)
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
@@ -73,6 +74,12 @@
|
||||
/datum/supply_pack/alcohol_reagents
|
||||
name = "Bar alcoholic dispenser refill"
|
||||
contains = list(
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/beer,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/kahlua,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/whiskey,
|
||||
@@ -84,6 +91,7 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cider,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ale,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/mead,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/bitters
|
||||
@@ -114,7 +122,8 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/grapesoda
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate
|
||||
@@ -130,8 +139,16 @@
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/milk,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/cream,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tea,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ice
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/mint,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/berry,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/greentea,
|
||||
/obj/item/weapon/reagent_containers/chem_disp_cartridge/decaf
|
||||
)
|
||||
cost = 50
|
||||
containertype = /obj/structure/closet/crate
|
||||
|
||||
@@ -712,6 +712,9 @@
|
||||
if(new_color)
|
||||
glow_color = new_color
|
||||
|
||||
/obj/item
|
||||
var/trash_eatable = TRUE
|
||||
|
||||
/mob/living/proc/eat_trash()
|
||||
set name = "Eat Trash"
|
||||
set category = "Abilities"
|
||||
@@ -730,6 +733,10 @@
|
||||
to_chat(src, "<span class='warning'>You are not allowed to eat this.</span>")
|
||||
return
|
||||
|
||||
if(!I.trash_eatable)
|
||||
to_chat(src, "<span class='warning'>You can't eat that so casually!</span>")
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/device/paicard))
|
||||
var/obj/item/device/paicard/palcard = I
|
||||
var/mob/living/silicon/pai/pocketpal = palcard.pai
|
||||
|
||||
@@ -586,6 +586,14 @@
|
||||
host.stumble_vore = !host.stumble_vore
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_nutrition_ex")
|
||||
host.nutrition_message_visible = !host.nutrition_message_visible
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_weight_ex")
|
||||
host.weight_message_visible = !host.weight_message_visible
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
|
||||
/datum/vore_look/proc/pick_from_inside(mob/user, params)
|
||||
var/atom/movable/target = locate(params["pick"])
|
||||
@@ -1247,12 +1255,6 @@
|
||||
if("b_save_digest_mode")
|
||||
host.vore_selected.save_digest_mode = !host.vore_selected.save_digest_mode
|
||||
. = TRUE
|
||||
if("toggle_nutrition_ex")
|
||||
host.nutrition_message_visible = !host.nutrition_message_visible
|
||||
. = TRUE
|
||||
if("toggle_weight_ex")
|
||||
host.weight_message_visible = !host.weight_message_visible
|
||||
. = TRUE
|
||||
if("b_del")
|
||||
var/alert = tgui_alert(usr, "Are you sure you want to delete your [lowertext(host.vore_selected.name)]?","Confirmation",list("Cancel","Delete"))
|
||||
if(!(alert == "Delete"))
|
||||
|
||||
@@ -158,7 +158,9 @@
|
||||
/proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H)
|
||||
if(!istype(H))
|
||||
return 1
|
||||
if(istype(get_area(H),/area/crew_quarters/sleep)) return 0 //VOREStation Edit - Dorms are protected from anomalies
|
||||
var/area/A = get_area(H)
|
||||
if(A.forbid_events)
|
||||
return 0
|
||||
var/protected = 0
|
||||
|
||||
//anomaly suits give best protection, but excavation suits are almost as good
|
||||
|
||||
@@ -13,6 +13,14 @@
|
||||
var/scan_duration = 50
|
||||
var/obj/scanned_object
|
||||
var/report_num = 0
|
||||
var/list/priority_objects = list(/obj/machinery/artifact,
|
||||
/obj/machinery/auto_cloner,
|
||||
/obj/machinery/power/supermatter,
|
||||
/obj/structure/constructshell,
|
||||
/obj/machinery/giga_drill,
|
||||
/obj/structure/cult/pylon,
|
||||
/obj/machinery/replicator,
|
||||
/obj/structure/crystal)
|
||||
|
||||
/obj/machinery/artifact_analyser/Initialize()
|
||||
. = ..()
|
||||
@@ -49,9 +57,9 @@
|
||||
/obj/machinery/artifact_analyser/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
|
||||
switch(action)
|
||||
if("scan")
|
||||
if(scan_in_progress)
|
||||
@@ -62,6 +70,7 @@
|
||||
reconnect_scanner()
|
||||
if(owned_scanner)
|
||||
var/artifact_in_use = 0
|
||||
var/obj/secondary_priority
|
||||
for(var/obj/O in owned_scanner.loc)
|
||||
if(O == owned_scanner)
|
||||
continue
|
||||
@@ -78,13 +87,22 @@
|
||||
if(artifact_in_use)
|
||||
atom_say("Cannot scan. Too much interference.")
|
||||
else
|
||||
scanned_object = O
|
||||
scan_in_progress = 1
|
||||
scan_completion_time = world.time + scan_duration
|
||||
atom_say("Scanning begun.")
|
||||
break
|
||||
for(var/otype in priority_objects)
|
||||
if(istype(O, otype))
|
||||
scanned_object = O
|
||||
break
|
||||
if(scanned_object)
|
||||
break
|
||||
else
|
||||
secondary_priority = O
|
||||
if(secondary_priority && !scanned_object)
|
||||
scanned_object = secondary_priority
|
||||
if(!scanned_object)
|
||||
atom_say("Unable to isolate scan target.")
|
||||
else
|
||||
scan_in_progress = 1
|
||||
scan_completion_time = world.time + scan_duration
|
||||
atom_say("Scanning begun.")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/artifact_analyser/process()
|
||||
@@ -115,7 +133,7 @@
|
||||
var/obj/machinery/artifact/A = scanned_object
|
||||
A.anchored = FALSE
|
||||
A.being_used = 0
|
||||
scanned_object = null
|
||||
scanned_object = null
|
||||
|
||||
//hardcoded responses, oh well
|
||||
/obj/machinery/artifact_analyser/proc/get_scan_info(var/obj/scanned_obj)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/unit_test/apc_area_test
|
||||
name = "MAP: Area Test APC / Scrubbers / Vents Z level 1"
|
||||
name = "MAP: Area Test APC / Scrubbers / Vents (Defined Z-Levels)"
|
||||
|
||||
/datum/unit_test/apc_area_test/start_test()
|
||||
var/list/bad_areas = list()
|
||||
@@ -47,17 +47,16 @@
|
||||
var/area_good = 1
|
||||
var/bad_msg = "--------------- [A.name]([A.type])"
|
||||
|
||||
|
||||
if(isnull(A.apc) && !(A.type in exempt_from_apc))
|
||||
log_unit_test("[bad_msg] lacks an APC.")
|
||||
log_unit_test("[bad_msg] lacks an APC. (X[A.x]|Y[A.y]) - Z[A.z])")
|
||||
area_good = 0
|
||||
|
||||
if(!A.air_scrub_info.len && !(A.type in exempt_from_atmos))
|
||||
log_unit_test("[bad_msg] lacks an Air scrubber.")
|
||||
log_unit_test("[bad_msg] lacks an Air scrubber. (X[A.x]|Y[A.y]) - (Z[A.z])")
|
||||
area_good = 0
|
||||
|
||||
if(!A.air_vent_info.len && !(A.type in exempt_from_atmos))
|
||||
log_unit_test("[bad_msg] lacks an Air vent.")
|
||||
log_unit_test("[bad_msg] lacks an Air vent. (X[A.x]|Y[A.y]) - (Z[A.z])")
|
||||
area_good = 0
|
||||
|
||||
if(!area_good)
|
||||
@@ -71,7 +70,7 @@
|
||||
return 1
|
||||
|
||||
/datum/unit_test/wire_test
|
||||
name = "MAP: Cable Test Z level 1"
|
||||
name = "MAP: Cable Test (Defined Z-Levels)"
|
||||
|
||||
/datum/unit_test/wire_test/start_test()
|
||||
var/wire_test_count = 0
|
||||
@@ -81,11 +80,13 @@
|
||||
var/list/cable_turfs = list()
|
||||
var/list/dirs_checked = list()
|
||||
|
||||
var/list/zs_to_test = using_map.unit_test_z_levels || list(1) //Either you set it, or you just get z1
|
||||
|
||||
for(C in world)
|
||||
T = null
|
||||
|
||||
T = get_turf(C)
|
||||
if(T && T.z == 1)
|
||||
if(T && (T.z in zs_to_test))
|
||||
cable_turfs |= get_turf(C)
|
||||
|
||||
for(T in cable_turfs)
|
||||
@@ -121,12 +122,12 @@
|
||||
var/a_gas = ""
|
||||
for(var/gas in E.A.air.gas)
|
||||
a_gas += "[gas]=[E.A.air.gas[gas]]"
|
||||
|
||||
|
||||
var/b_temp
|
||||
var/b_moles
|
||||
var/b_vol
|
||||
var/b_gas = ""
|
||||
|
||||
|
||||
// Two zones mixing
|
||||
if(istype(E, /connection_edge/zone))
|
||||
var/connection_edge/zone/Z = E
|
||||
@@ -144,11 +145,11 @@
|
||||
b_vol = "Unsim"
|
||||
for(var/gas in U.air.gas)
|
||||
b_gas += "[gas]=[U.air.gas[gas]]"
|
||||
|
||||
|
||||
edge_log += "Active Edge [E] ([E.type])"
|
||||
edge_log += "Edge side A: T:[a_temp], Mol:[a_moles], Vol:[a_vol], Gas:[a_gas]"
|
||||
edge_log += "Edge side B: T:[b_temp], Mol:[b_moles], Vol:[b_vol], Gas:[b_gas]"
|
||||
|
||||
|
||||
for(var/turf/T in E.connecting_turfs)
|
||||
edge_log += "+--- Connecting Turf [T] ([T.type]) @ [T.x], [T.y], [T.z] ([T.loc])"
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 504 KiB After Width: | Height: | Size: 504 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 22 KiB |
+44
-24
@@ -515,9 +515,6 @@
|
||||
/obj/machinery/atmospherics/unary/vent_pump/on,
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/medical/virology)
|
||||
"bt" = (
|
||||
/turf/simulated/wall/r_wall,
|
||||
/area/groundbase/science)
|
||||
"bu" = (
|
||||
/obj/machinery/door/airlock/freezer{
|
||||
name = "Kitchen";
|
||||
@@ -2131,6 +2128,11 @@
|
||||
outdoors = 0
|
||||
},
|
||||
/area/groundbase/cargo/office)
|
||||
"go" = (
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/light/small/fairylights,
|
||||
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
|
||||
/area/groundbase/level2/nw)
|
||||
"gq" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "2-4"
|
||||
@@ -4039,6 +4041,10 @@
|
||||
},
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/groundbase/medical/Chemistry)
|
||||
"lM" = (
|
||||
/obj/machinery/light/small/fairylights,
|
||||
/turf/simulated/floor/outdoors/grass/virgo3c,
|
||||
/area/groundbase/level2/nw)
|
||||
"lN" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-8"
|
||||
@@ -10352,6 +10358,10 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/medical/virology)
|
||||
"EZ" = (
|
||||
/obj/machinery/light/small/fairylights,
|
||||
/turf/simulated/floor/outdoors/newdirt/virgo3c,
|
||||
/area/groundbase/level2/nw)
|
||||
"Fa" = (
|
||||
/obj/machinery/door/firedoor,
|
||||
/obj/machinery/door/airlock/command{
|
||||
@@ -11152,6 +11162,16 @@
|
||||
},
|
||||
/turf/simulated/floor/bmarble,
|
||||
/area/groundbase/civilian/chapel)
|
||||
"Hr" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/structure/disposalpipe/segment,
|
||||
/obj/machinery/light/small/fairylights,
|
||||
/turf/simulated/floor/outdoors/sidewalk/virgo3c,
|
||||
/area/groundbase/level2/nw)
|
||||
"Hs" = (
|
||||
/obj/structure/cable/yellow{
|
||||
icon_state = "4-8"
|
||||
@@ -22339,7 +22359,7 @@ Rh
|
||||
EJ
|
||||
YI
|
||||
ng
|
||||
bt
|
||||
PD
|
||||
AH
|
||||
lO
|
||||
Ga
|
||||
@@ -22481,7 +22501,7 @@ Rh
|
||||
bO
|
||||
AZ
|
||||
ff
|
||||
bt
|
||||
PD
|
||||
IO
|
||||
qW
|
||||
PZ
|
||||
@@ -22623,7 +22643,7 @@ Rh
|
||||
ff
|
||||
AZ
|
||||
ff
|
||||
bt
|
||||
PD
|
||||
nw
|
||||
qW
|
||||
lw
|
||||
@@ -22765,7 +22785,7 @@ Rh
|
||||
Fk
|
||||
AZ
|
||||
yw
|
||||
bt
|
||||
PD
|
||||
ws
|
||||
qW
|
||||
lw
|
||||
@@ -22907,7 +22927,7 @@ Rh
|
||||
vh
|
||||
Nb
|
||||
Ys
|
||||
bt
|
||||
PD
|
||||
aB
|
||||
PR
|
||||
lw
|
||||
@@ -23049,7 +23069,7 @@ Rh
|
||||
PD
|
||||
qU
|
||||
PD
|
||||
bt
|
||||
PD
|
||||
Ov
|
||||
PR
|
||||
lw
|
||||
@@ -23704,13 +23724,13 @@ bY
|
||||
bY
|
||||
pw
|
||||
pw
|
||||
LT
|
||||
lM
|
||||
ml
|
||||
LT
|
||||
pw
|
||||
EZ
|
||||
pw
|
||||
bY
|
||||
bY
|
||||
lM
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
@@ -23846,13 +23866,13 @@ bY
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
pw
|
||||
EZ
|
||||
ml
|
||||
pw
|
||||
lM
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
lM
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
@@ -23988,13 +24008,13 @@ Hm
|
||||
Hm
|
||||
Hm
|
||||
Hm
|
||||
Hm
|
||||
Hr
|
||||
pJ
|
||||
sF
|
||||
sF
|
||||
go
|
||||
sF
|
||||
vV
|
||||
sF
|
||||
go
|
||||
sF
|
||||
sF
|
||||
sF
|
||||
@@ -24130,13 +24150,13 @@ bY
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
pw
|
||||
EZ
|
||||
sN
|
||||
pw
|
||||
bY
|
||||
lM
|
||||
bY
|
||||
Oa
|
||||
bY
|
||||
lM
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
@@ -24272,13 +24292,13 @@ bY
|
||||
bY
|
||||
bY
|
||||
bY
|
||||
yS
|
||||
lM
|
||||
sN
|
||||
bY
|
||||
bY
|
||||
lM
|
||||
bY
|
||||
Oa
|
||||
yS
|
||||
lM
|
||||
bY
|
||||
Aq
|
||||
bY
|
||||
|
||||
@@ -357,6 +357,7 @@
|
||||
/area/groundbase/civilian/arrivals
|
||||
name = "Arrivals"
|
||||
lightswitch = 1
|
||||
forbid_events = TRUE
|
||||
/area/groundbase/civilian/toolstorage
|
||||
name = "Tool Storage"
|
||||
lightswitch = 1
|
||||
@@ -408,17 +409,16 @@
|
||||
/area/groundbase/civilian/gameroom
|
||||
name = "Gamatorium"
|
||||
sound_env = SMALL_SOFTFLOOR
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
/area/groundbase/civilian/mensrestroom
|
||||
name = "Men's Restroom"
|
||||
sound_env = SOUND_ENVIRONMENT_BATHROOM
|
||||
lightswitch = 1
|
||||
forbid_events = TRUE
|
||||
/area/groundbase/civilian/womensrestroom
|
||||
name = "Women's Restroom"
|
||||
sound_env = SOUND_ENVIRONMENT_BATHROOM
|
||||
lightswitch = 1
|
||||
>>>>>>> d8515387bc... Merge pull request #12695 from Very-Soft/gbtweaks
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/groundbase/exploration
|
||||
name = "Exploration"
|
||||
@@ -550,4 +550,4 @@
|
||||
excluded |= /area/groundbase/level3/se/open
|
||||
excluded |= /area/groundbase/level3/sw/open
|
||||
excluded |= /area/groundbase/level3/escapepad
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -124,6 +124,9 @@
|
||||
default_skybox = /datum/skybox_settings/groundbase
|
||||
|
||||
unit_test_exempt_areas = list( //These are all outside
|
||||
/area/groundbase/cargo/bay,
|
||||
/area/groundbase/civilian/bar/upper,
|
||||
/area/groundbase/exploration/shuttlepad,
|
||||
/area/groundbase/level1,
|
||||
/area/groundbase/level1/ne,
|
||||
/area/groundbase/level1/nw,
|
||||
@@ -140,11 +143,20 @@
|
||||
/area/groundbase/level2/nw,
|
||||
/area/groundbase/level2/se,
|
||||
/area/groundbase/level2/sw,
|
||||
/area/groundbase/level2/northspur,
|
||||
/area/groundbase/level2/eastspur,
|
||||
/area/groundbase/level2/westspur,
|
||||
/area/groundbase/level2/southeastspur,
|
||||
/area/groundbase/level2/southwestspur,
|
||||
/area/groundbase/level3,
|
||||
/area/groundbase/level3/ne,
|
||||
/area/groundbase/level3/nw,
|
||||
/area/groundbase/level3/se,
|
||||
/area/groundbase/level3/sw,
|
||||
/area/groundbase/level3/ne/open,
|
||||
/area/groundbase/level3/nw/open,
|
||||
/area/groundbase/level3/se/open,
|
||||
/area/groundbase/level3/sw/open,
|
||||
/area/maintenance/groundbase/level1/netunnel,
|
||||
/area/maintenance/groundbase/level1/nwtunnel,
|
||||
/area/maintenance/groundbase/level1/setunnel,
|
||||
@@ -184,6 +196,11 @@
|
||||
|
||||
unit_test_exempt_from_atmos = list()
|
||||
|
||||
unit_test_z_levels = list(
|
||||
Z_LEVEL_GB_BOTTOM,
|
||||
Z_LEVEL_GB_MIDDLE,
|
||||
Z_LEVEL_GB_TOP
|
||||
)
|
||||
|
||||
lateload_z_levels = list(
|
||||
list("Groundbase - Central Command"),
|
||||
@@ -558,5 +575,8 @@
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
<<<<<<< HEAD
|
||||
|
||||
>>>>>>> ae6ecf6fb4... Merge pull request #12817 from Very-Soft/gbwilds
|
||||
=======
|
||||
>>>>>>> 26e29da7c4... Merge pull request #13242 from ItsSelis/selis-multiz
|
||||
|
||||
@@ -13,6 +13,23 @@
|
||||
/obj/item/weapon/tool/wrench,
|
||||
/turf/simulated/floor/tiled/white,
|
||||
/area/groundbase/science/outpost/toxins_mixing)
|
||||
"ab" = (
|
||||
/obj/machinery/artifact_scanpad,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/groundbase/science/outpost/anomaly_lab)
|
||||
"ac" = (
|
||||
/obj/machinery/artifact_analyser,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/groundbase/science/outpost/anomaly_lab)
|
||||
"ad" = (
|
||||
/obj/structure/table/standard,
|
||||
/obj/item/device/flashlight/lamp,
|
||||
/obj/machinery/vending/wallmed1{
|
||||
pixel_x = 30
|
||||
},
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/on,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/groundbase/science/outpost/anomaly_lab)
|
||||
"am" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/visible/blue{
|
||||
dir = 9
|
||||
@@ -438,11 +455,6 @@
|
||||
},
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/groundbase/science/outpost/anomaly_lab)
|
||||
"gg" = (
|
||||
/obj/machinery/artifact_scanpad,
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/on,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/groundbase/science/outpost/anomaly_lab)
|
||||
"gi" = (
|
||||
/obj/structure/table/standard,
|
||||
/obj/machinery/computer/atmoscontrol/laptop{
|
||||
@@ -958,11 +970,6 @@
|
||||
},
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/groundbase/science/outpost/toxins_lab)
|
||||
"lq" = (
|
||||
/obj/machinery/artifact_analyser,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/groundbase/science/outpost/anomaly_lab)
|
||||
"lw" = (
|
||||
/obj/structure/cable/green{
|
||||
icon_state = "1-2"
|
||||
@@ -2667,15 +2674,6 @@
|
||||
/obj/machinery/atmospherics/portables_connector,
|
||||
/turf/simulated/floor,
|
||||
/area/groundbase/science/outpost/atmos)
|
||||
"DN" = (
|
||||
/obj/structure/table/standard,
|
||||
/obj/item/device/flashlight/lamp,
|
||||
/obj/machinery/vending/wallmed1{
|
||||
pixel_x = 30
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/turf/simulated/floor/tiled/dark,
|
||||
/area/groundbase/science/outpost/anomaly_lab)
|
||||
"DP" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/visible/supply,
|
||||
/obj/machinery/meter,
|
||||
@@ -18599,9 +18597,9 @@ MY
|
||||
qy
|
||||
Sh
|
||||
mh
|
||||
gg
|
||||
lq
|
||||
DN
|
||||
ab
|
||||
ac
|
||||
ad
|
||||
bp
|
||||
hm
|
||||
qg
|
||||
|
||||
@@ -791,6 +791,7 @@ z
|
||||
/area/hallway/primary/firstdeck/auxdockaft
|
||||
name = "\improper First Deck Aft Auxiliary Dock"
|
||||
icon_state = "docking_hallway"
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/hallway/primary/firstdeck/auxdockfore
|
||||
name = "\improper First Deck Fore Auxiliary Dock"
|
||||
|
||||
@@ -272,8 +272,10 @@
|
||||
|
||||
/area/stellardelight/deck3/transitgateway
|
||||
name = "Transit Gateway"
|
||||
forbid_events = TRUE
|
||||
/area/stellardelight/deck3/cryo
|
||||
name = "Cryogenic Storage"
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/stellardelight/deck3/readingroom
|
||||
name = "Reading Rooms"
|
||||
@@ -281,7 +283,7 @@
|
||||
flags = RAD_SHIELDED| BLUE_SHIELDED |AREA_FLAG_IS_NOT_PERSISTENT
|
||||
soundproofed = TRUE
|
||||
block_suit_sensors = TRUE
|
||||
forbid_events = TRUE
|
||||
forbid_events = TRUE
|
||||
|
||||
/area/stellardelight/deck3/portdock
|
||||
name = "Port Dock"
|
||||
|
||||
@@ -124,6 +124,11 @@
|
||||
|
||||
unit_test_exempt_from_atmos = list() //it maint
|
||||
|
||||
unit_test_z_levels = list(
|
||||
Z_LEVEL_SHIP_LOW,
|
||||
Z_LEVEL_SHIP_MID,
|
||||
Z_LEVEL_SHIP_HIGH
|
||||
)
|
||||
|
||||
lateload_z_levels = list(
|
||||
list("Ship - Central Command"),
|
||||
|
||||
@@ -151,6 +151,13 @@
|
||||
/area/tether/surfacebase/lowernortheva/external, //it outside
|
||||
/area/tether/surfacebase/security/gasstorage) //it maint
|
||||
|
||||
unit_test_z_levels = list(
|
||||
Z_LEVEL_SURFACE_LOW,
|
||||
Z_LEVEL_SURFACE_MID,
|
||||
Z_LEVEL_SURFACE_HIGH,
|
||||
Z_LEVEL_TRANSIT,
|
||||
Z_LEVEL_SPACE_LOW
|
||||
)
|
||||
|
||||
lateload_z_levels = list(
|
||||
list("Tether - Centcom","Tether - Misc","Tether - Underdark","Tether - Plains"), //Stock Tether lateload maps
|
||||
|
||||
@@ -25,7 +25,10 @@
|
||||
selection_color = "#999999"
|
||||
economic_modifier = 7
|
||||
minimal_player_age = 14
|
||||
pto_type = null
|
||||
playtime_only = TRUE
|
||||
pto_type = PTO_TALON
|
||||
timeoff_factor = 1
|
||||
dept_time_required = 60
|
||||
access = list(access_talon)
|
||||
minimal_access = list(access_talon)
|
||||
alt_titles = list("Talon Commander" = /datum/alt_title/talon_commander)
|
||||
@@ -49,7 +52,9 @@
|
||||
selection_color = "#aaaaaa"
|
||||
economic_modifier = 5
|
||||
minimal_player_age = 14
|
||||
pto_type = null
|
||||
playtime_only = TRUE
|
||||
pto_type = PTO_TALON
|
||||
timeoff_factor = 1
|
||||
access = list(access_talon)
|
||||
minimal_access = list(access_talon)
|
||||
alt_titles = list("Talon Medic" = /datum/alt_title/talon_medic)
|
||||
@@ -74,7 +79,9 @@
|
||||
selection_color = "#aaaaaa"
|
||||
economic_modifier = 5
|
||||
minimal_player_age = 14
|
||||
pto_type = null
|
||||
playtime_only = TRUE
|
||||
pto_type = PTO_TALON
|
||||
timeoff_factor = 1
|
||||
access = list(access_talon)
|
||||
minimal_access = list(access_talon)
|
||||
alt_titles = list("Talon Technician" = /datum/alt_title/talon_tech)
|
||||
@@ -99,7 +106,9 @@
|
||||
selection_color = "#aaaaaa"
|
||||
economic_modifier = 5
|
||||
minimal_player_age = 14
|
||||
pto_type = null
|
||||
playtime_only = TRUE
|
||||
pto_type = PTO_TALON
|
||||
timeoff_factor = 1
|
||||
access = list(access_talon)
|
||||
minimal_access = list(access_talon)
|
||||
alt_titles = list("Talon Helmsman" = /datum/alt_title/talon_helmsman)
|
||||
@@ -124,7 +133,9 @@
|
||||
selection_color = "#aaaaaa"
|
||||
economic_modifier = 5
|
||||
minimal_player_age = 14
|
||||
pto_type = null
|
||||
playtime_only = TRUE
|
||||
pto_type = PTO_TALON
|
||||
timeoff_factor = 1
|
||||
access = list(access_talon)
|
||||
minimal_access = list(access_talon)
|
||||
alt_titles = list("Talon Security" = /datum/alt_title/talon_security)
|
||||
@@ -148,7 +159,9 @@
|
||||
selection_color = "#aaaaaa"
|
||||
economic_modifier = 5
|
||||
minimal_player_age = 14
|
||||
pto_type = null
|
||||
playtime_only = TRUE
|
||||
pto_type = PTO_TALON
|
||||
timeoff_factor = 1
|
||||
access = list(access_talon)
|
||||
minimal_access = list(access_talon)
|
||||
alt_titles = list("Talon Excavator" = /datum/alt_title/talon_excavator)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Fragment } from 'inferno';
|
||||
import { useBackend, useLocalState } from '../backend';
|
||||
import { Box, Button, Icon, Input, LabeledList, Section, Tabs } from '../components';
|
||||
import { ComplexModal, modalOpen } from '../interfaces/common/ComplexModal';
|
||||
import { ComplexModal, modalOpen } from './common/ComplexModal';
|
||||
import { Window } from '../layouts';
|
||||
import { LoginInfo } from './common/LoginInfo';
|
||||
import { LoginScreen } from './common/LoginScreen';
|
||||
@@ -43,7 +43,7 @@ export const GeneralRecords = (_properties, context) => {
|
||||
}
|
||||
|
||||
return (
|
||||
<Window width={800} height={640} resizable>
|
||||
<Window width={800} height={640} resizable scrollable>
|
||||
<ComplexModal />
|
||||
<Window.Content className="Layout__content--flexColumn">
|
||||
<LoginInfo />
|
||||
|
||||
+1
-4
@@ -1,10 +1,7 @@
|
||||
import { useBackend } from '../backend';
|
||||
import { NtosWindow } from '../layouts';
|
||||
import { CommunicationsConsoleContent } from './CommunicationsConsole';
|
||||
|
||||
export const NtosCommunicationsConsole = (props, context) => {
|
||||
const { act, data } = useBackend(context);
|
||||
|
||||
export const NtosCommunicationsConsole = () => {
|
||||
return (
|
||||
<NtosWindow width={400} height={600} resizable>
|
||||
<NtosWindow.Content scrollable>
|
||||
@@ -0,0 +1,12 @@
|
||||
import { NtosWindow } from '../layouts';
|
||||
import { CrewManifestContent } from './CrewManifest';
|
||||
|
||||
export const NtosCrewManifest = () => {
|
||||
return (
|
||||
<NtosWindow width={800} height={600} resizable>
|
||||
<NtosWindow.Content>
|
||||
<CrewManifestContent />
|
||||
</NtosWindow.Content>
|
||||
</NtosWindow>
|
||||
);
|
||||
};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user