Merge branch 'master' into ghost-rad-hud

This commit is contained in:
chafla
2021-08-14 17:28:16 -07:00
89 changed files with 18015 additions and 22648 deletions
+17112 -22427
View File
File diff suppressed because it is too large Load Diff
+29 -27
View File
@@ -1620,6 +1620,7 @@
/obj/structure/sign/securearea{
pixel_x = -32
},
/obj/machinery/suit_storage_unit/gamma,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"fW" = (
@@ -3547,6 +3548,12 @@
/obj/structure/flora/ausbushes/sparsegrass,
/turf/simulated/floor/grass,
/area/centcom/control)
"nb" = (
/obj/machinery/autolathe/upgraded/gamma,
/obj/item/stack/sheet/glass/fifty,
/obj/item/stack/sheet/metal/fifty,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"nc" = (
/obj/machinery/door/airlock/centcom{
name = "Gamma Armory";
@@ -4076,18 +4083,12 @@
/area/centcom/gamma)
"oJ" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/gun/projectile/automatic/pistol{
name = "pistol"
},
/obj/item/gun/projectile/automatic/pistol{
name = "pistol"
},
/obj/item/gun/projectile/automatic/pistol{
name = "pistol"
},
/obj/item/ammo_box/magazine/smgm9mm,
/obj/item/ammo_box/magazine/smgm9mm,
/obj/item/ammo_box/magazine/smgm9mm,
/obj/item/gun/projectile/automatic/proto,
/obj/item/gun/projectile/automatic/proto,
/obj/item/gun/projectile/automatic/proto,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"oN" = (
@@ -4258,14 +4259,6 @@
/obj/structure/flora/ausbushes,
/turf/simulated/floor/grass,
/area/centcom/specops)
"pk" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/item/ammo_casing/rocket,
/obj/item/ammo_casing/rocket,
/obj/item/ammo_casing/rocket,
/obj/item/gun/rocketlauncher,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"pl" = (
/obj/structure/window/reinforced{
dir = 1
@@ -4317,9 +4310,7 @@
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"pu" = (
/obj/mecha/combat/durand/loaded{
operation_req_access = list(1)
},
/obj/mecha/combat/marauder/ares/loaded,
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -4527,6 +4518,11 @@
},
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
"qf" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/item/gun/medbeam,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"qh" = (
/obj/structure/holowindow,
/turf/simulated/floor/holofloor{
@@ -9964,6 +9960,12 @@
icon_state = "red"
},
/area/holodeck/source_knightarena)
"LN" = (
/obj/machinery/recharger/wallcharger{
pixel_x = -24
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/gamma/space)
"LO" = (
/obj/machinery/autolathe/upgraded{
hacked = 1
@@ -25459,8 +25461,8 @@ th
fm
of
oB
pf
pf
LN
nb
pf
fV
of
@@ -25717,7 +25719,7 @@ fm
of
oJ
pf
pk
po
pf
pq
of
@@ -25974,7 +25976,7 @@ fm
of
oW
pf
po
qf
pf
pu
of
+1 -1
View File
@@ -40,7 +40,6 @@
#define BELOW_OPEN_DOOR_LAYER 2.6
#define BLASTDOOR_LAYER 2.65
#define OPEN_DOOR_LAYER 2.7
#define DOOR_HELPER_LAYER 2.71 //keep this above OPEN_DOOR_LAYER
#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
#define TABLE_LAYER 2.8
#define BELOW_OBJ_LAYER 2.9
@@ -52,6 +51,7 @@
#define SHUTTER_LAYER 3.12 // HERE BE DRAGONS
#define ABOVE_OBJ_LAYER 3.2
#define ABOVE_WINDOW_LAYER 3.3
#define DOOR_HELPER_LAYER 3.31 // Keep this above doors and windoors
#define SIGN_LAYER 3.4
#define NOT_HIGH_OBJ_LAYER 3.5
#define HIGH_OBJ_LAYER 3.6
+2
View File
@@ -130,6 +130,8 @@
#define SOUTH_OF_TURF(T) locate(T.x, T.y - 1, T.z)
#define WEST_OF_TURF(T) locate(T.x - 1, T.y, T.z)
#define ATOM_COORDS(A) list(A.x, A.y, A.z)
#define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50
+1 -1
View File
@@ -50,7 +50,7 @@ GLOBAL_PROTECT(log_end)
/proc/log_access_in(client/new_client)
if(GLOB.configuration.logging.access_logging)
var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version].[new_client.byond_build]"
rustg_log_write(GLOB.world_game_log, "ACCESS IN: [message][GLOB.log_end]")
/proc/log_access_out(mob/last_mob)
+3 -3
View File
@@ -43,9 +43,9 @@
return num
//Returns the hex value of a number given a value assumed to be a base-ten value
/proc/num2hex(num, placeholder)
if(!isnum(num)) return
if(placeholder == null) placeholder = 2
/proc/num2hex(num, placeholder = 2)
if(!isnum(num) || num < 0)
return
var/hex = ""
while(num)
+1 -1
View File
@@ -616,7 +616,7 @@ so as to remain in compliance with the most up-to-date laws."
if(stone)
if(alert(usr, "Do you want to be captured by [stoner]'s soul stone? This will destroy your corpse and make it \
impossible for you to get back into the game as your regular character.",, "No", "Yes") == "Yes")
stone.opt_in = TRUE
stone?.opt_in = TRUE
/obj/screen/alert/notify_soulstone/Destroy()
stone = null
@@ -14,6 +14,8 @@
var/shutdown_shell_command = null
/// 2FA backend server host
var/_2fa_auth_host = null
/// List of IP addresses which bypass world topic rate limiting
var/list/topic_ip_ratelimit_bypass = list()
/datum/configuration_section/system_configuration/load_data(list/data)
// Use the load wrappers here. That way the default isnt made 'null' if you comment out the config line
@@ -24,3 +26,5 @@
CONFIG_LOAD_STR(medal_hub_password, data["medal_hub_password"])
CONFIG_LOAD_STR(shutdown_shell_command, data["shutdown_shell_command"])
CONFIG_LOAD_STR(_2fa_auth_host, data["_2fa_auth_host"])
CONFIG_LOAD_LIST(topic_ip_ratelimit_bypass, data["topic_ip_ratelimit_bypass"])
-1
View File
@@ -37,7 +37,6 @@ SUBSYSTEM_DEF(shuttle)
var/list/shoppinglist = list()
var/list/requestlist = list()
var/list/supply_packs = list()
var/datum/round_event/shuttle_loan/shuttle_loan
var/sold_atoms = ""
var/list/hidden_shuttle_turfs = list() //all turfs hidden from navigation computers associated with a list containing the image hiding them and the type of the turf they are pretending to be
var/list/hidden_shuttle_turf_images = list() //only the images from the above list
+1 -1
View File
@@ -119,7 +119,7 @@ SUBSYSTEM_DEF(tgui)
* Close all UIs attached to src_object.
* Returns the number of UIs closed.
*
* * datum/src_objectThe object/datum which owns the UIs.
* * datum/src_object - The object/datum which owns the UIs.
*/
/datum/controller/subsystem/tgui/proc/close_uis(datum/src_object)
if(!src_object.unique_datum_id) // First check if the datum has an UID set
+29 -23
View File
@@ -41,7 +41,7 @@ SUBSYSTEM_DEF(vote)
CHECK_TICK
/datum/controller/subsystem/vote/proc/autotransfer()
initiate_vote("crew_transfer","the server")
initiate_vote("crew transfer", "the server")
/datum/controller/subsystem/vote/proc/reset()
initiator = null
@@ -95,7 +95,7 @@ SUBSYSTEM_DEF(vote)
choices[GLOB.master_mode] += non_voters
if(choices[GLOB.master_mode] >= greatest_votes)
greatest_votes = choices[GLOB.master_mode]
else if(mode == "crew_transfer")
else if(mode == "crew transfer")
var/factor = 0.5
switch(world.time / (10 * 60)) // minutes
if(0 to 60)
@@ -174,9 +174,9 @@ SUBSYSTEM_DEF(vote)
if(!SSticker.ticker_going)
SSticker.ticker_going = TRUE
to_chat(world, "<font color='red'><b>The round will start soon.</b></font>")
if("crew_transfer")
if("crew transfer")
if(. == "Initiate Crew Transfer")
init_shift_change(null, 1)
init_shift_change(null, TRUE)
if("map")
// Find target map.
var/datum/map/top_voted_map
@@ -222,7 +222,7 @@ SUBSYSTEM_DEF(vote)
if(SSticker.current_state >= 2)
return 0
choices.Add(GLOB.configuration.gamemode.votable_modes)
if("crew_transfer")
if("crew transfer")
if(check_rights(R_ADMIN|R_MOD))
if(SSticker.current_state <= 2)
return 0
@@ -266,16 +266,16 @@ SUBSYSTEM_DEF(vote)
<a href='?src=[UID()];vote=open'>Click here or type vote to place your vote.</a>
You have [GLOB.configuration.vote.vote_time / 10] seconds to vote.</font>"})
switch(vote_type)
if("crew_transfer", "gamemode", "custom", "map")
if("crew transfer", "gamemode", "custom", "map")
SEND_SOUND(world, sound('sound/ambience/alarm4.ogg'))
if(mode == "gamemode" && SSticker.ticker_going)
SSticker.ticker_going = FALSE
to_chat(world, "<font color='red'><b>Round start has been delayed.</b></font>")
if(mode == "crew_transfer" && GLOB.ooc_enabled)
if(mode == "crew transfer" && GLOB.ooc_enabled)
auto_muted = TRUE
GLOB.ooc_enabled = FALSE
to_chat(world, "<b>The OOC channel has been automatically disabled due to a crew transfer vote.</b>")
log_admin("OOC was toggled automatically due to crew_transfer vote.")
log_admin("OOC was toggled automatically due to crew transfer vote.")
message_admins("OOC has been toggled off automatically.")
if(mode == "gamemode" && GLOB.ooc_enabled)
auto_muted = TRUE
@@ -314,37 +314,41 @@ SUBSYSTEM_DEF(vote)
dat += "(<a href='?src=[UID()];vote=cancel'>Cancel Vote</a>) "
else
dat += "<div id='vote_div'><h2>Start a vote:</h2><hr><ul><li>"
//restart
if(admin || GLOB.configuration.vote.allow_restart_votes)
dat += "<a href='?src=[UID()];vote=restart'>Restart</a>"
else
dat += "<font color='grey'>Restart (Disallowed)</font>"
dat += "</li><li>"
// Crew transfer
if(admin || GLOB.configuration.vote.allow_restart_votes)
dat += "<a href='?src=[UID()];vote=crew_transfer'>Crew Transfer</a>"
else
dat += "<font color='grey'>Crew Transfer (Disallowed)</font>"
dat += "</li><li>"
// Restart
if(admin || GLOB.configuration.vote.allow_restart_votes)
dat += "<a href='?src=[UID()];vote=restart'>Restart</a>"
else
dat += "<font color='grey'>Restart (Disallowed)</font>"
if(admin)
dat += "\t(<a href='?src=[UID()];vote=toggle_restart'>[GLOB.configuration.vote.allow_restart_votes ? "Allowed" : "Disallowed"]</a>)"
dat += "</li><li>"
//gamemode
// Gamemode
if(admin || GLOB.configuration.vote.allow_mode_votes)
dat += "<a href='?src=[UID()];vote=gamemode'>GameMode</a>"
dat += "<a href='?src=[UID()];vote=gamemode'>Gamemode</a>"
else
dat += "<font color='grey'>GameMode (Disallowed)</font>"
dat += "<font color='grey'>Gamemode (Disallowed)</font>"
if(admin)
dat += "\t(<a href='?src=[UID()];vote=toggle_gamemode'>[GLOB.configuration.vote.allow_mode_votes ? "Allowed" : "Disallowed"]</a>)"
dat += "</li><li>"
// Map
if(admin)
dat += "<a href='?src=[UID()];vote=map'>Map</a>"
else
dat += "<font color='grey'>Map (Disallowed)</font>"
dat += "</li><li>"
dat += "</li>"
//custom
// Custom
if(admin)
dat += "<li><a href='?src=[UID()];vote=custom'>Custom</a></li>"
dat += "<a href='?src=[UID()];vote=custom'>Custom</a></li>"
dat += "</ul></div><hr>"
var/datum/browser/popup = new(C.mob, "vote", "Voting Panel", nref=src)
popup.set_content(dat)
@@ -387,14 +391,16 @@ SUBSYSTEM_DEF(vote)
var/votedesc = capitalize(mode)
if(mode == "custom")
votedesc += " ([question])"
log_and_message_admins("cancelled the running [votedesc] vote.")
log_and_message_admins("cancelled the running '[votedesc]' vote.")
reset()
if("toggle_restart")
if(admin)
GLOB.configuration.vote.allow_restart_votes = !GLOB.configuration.vote.allow_restart_votes
log_and_message_admins("has [GLOB.configuration.vote.allow_restart_votes ? "enabled" : "disabled"] public restart voting.")
if("toggle_gamemode")
if(admin)
GLOB.configuration.vote.allow_mode_votes = !GLOB.configuration.vote.allow_mode_votes
log_and_message_admins("has [GLOB.configuration.vote.allow_mode_votes ? "enabled" : "disabled"] public gamemode voting.")
if("restart")
if(GLOB.configuration.vote.allow_restart_votes || admin)
initiate_vote("restart",usr.key)
@@ -406,7 +412,7 @@ SUBSYSTEM_DEF(vote)
initiate_vote("map", usr.key)
if("crew_transfer")
if(GLOB.configuration.vote.allow_restart_votes || admin)
initiate_vote("crew_transfer",usr.key)
initiate_vote("crew transfer", usr.key)
if("custom")
if(admin)
initiate_vote("custom",usr.key)
+12 -13
View File
@@ -647,20 +647,20 @@
name = "Solar Federation Marine"
uniform = /obj/item/clothing/under/solgov
suit = /obj/item/clothing/suit/armor/bulletproof
back = /obj/item/storage/backpack/security
back = /obj/item/storage/backpack/ert/solgov
belt = /obj/item/storage/belt/military/assault/marines/full
head = /obj/item/clothing/head/soft/solgov/marines
glasses = /obj/item/clothing/glasses/night
gloves = /obj/item/clothing/gloves/combat
shoes = /obj/item/clothing/shoes/combat
l_ear = /obj/item/radio/headset/ert
l_ear = /obj/item/radio/headset/ert/alt/solgov
id = /obj/item/card/id
l_hand = /obj/item/gun/projectile/automatic/shotgun/bulldog
suit_store = /obj/item/gun/projectile/automatic/pistol/m1911
r_pocket = /obj/item/flashlight/seclite
pda = /obj/item/pda
box = /obj/item/storage/box/responseteam
backpack_contents = list(
/obj/item/storage/box/responseteam = 1,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/whetstone = 1,
/obj/item/clothing/mask/gas/explorer/marines = 1,
@@ -702,13 +702,12 @@
head = /obj/item/clothing/head/beret/solgov/command
glasses = /obj/item/clothing/glasses/night
back = /obj/item/storage/backpack/satchel
l_ear = /obj/item/radio/headset/ert/alt/commander
l_ear = /obj/item/radio/headset/ert/alt/commander/solgov
l_hand = null
belt = /obj/item/melee/baton/loaded
suit_store = /obj/item/gun/projectile/automatic/pistol/deagle
l_pocket = /obj/item/pinpointer/advpinpointer
backpack_contents = list(
/obj/item/storage/box/responseteam = 1,
/obj/item/storage/box/handcuffs = 1,
/obj/item/clothing/shoes/magboots/advance = 1,
/obj/item/reagent_containers/hypospray/autoinjector/survival = 1,
@@ -720,14 +719,14 @@
/datum/outfit/admin/solgov/elite
name = "Solar Federation Specops Marine"
uniform = /obj/item/clothing/under/solgov/elite
head = /obj/item/clothing/head/soft/solgov/marines/elite
suit = /obj/item/clothing/suit/space/hardsuit/ert/solgov
head = null
mask = /obj/item/clothing/mask/gas/explorer/marines
belt = /obj/item/storage/belt/military/assault/marines/elite/full
l_hand = /obj/item/gun/projectile/automatic/ar
backpack_contents = list(
/obj/item/storage/box/responseteam = 1,
/obj/item/clothing/shoes/magboots/advance = 1,
/obj/item/whetstone = 1,
/obj/item/clothing/mask/gas/explorer/marines = 1,
/obj/item/reagent_containers/hypospray/autoinjector/survival = 1
)
cybernetic_implants = list(
@@ -737,22 +736,22 @@
/obj/item/organ/internal/cyberimp/arm/flash,
/obj/item/organ/internal/eyes/cybernetic/shield
)
/datum/outfit/admin/solgov/elite/lieutenant
name = "Solar Federation Specops Lieutenant"
uniform = /obj/item/clothing/under/solgov/command/elite
head = /obj/item/clothing/head/beret/solgov/command/elite
suit = /obj/item/clothing/suit/space/hardsuit/ert/solgov/command
head = null
mask = /obj/item/clothing/mask/gas/explorer/marines
glasses = /obj/item/clothing/glasses/night
back = /obj/item/storage/backpack/satchel
belt = /obj/item/melee/baton/loaded
l_hand = null
suit_store = /obj/item/gun/projectile/automatic/pistol/deagle
l_pocket = /obj/item/pinpointer/advpinpointer
l_ear = /obj/item/radio/headset/ert/alt/commander
l_ear = /obj/item/radio/headset/ert/alt/commander/solgov
backpack_contents = list(
/obj/item/storage/box/responseteam = 1,
/obj/item/storage/box/handcuffs = 1,
/obj/item/clothing/shoes/magboots/advance = 1,
/obj/item/clothing/mask/gas/explorer/marines = 1,
/obj/item/reagent_containers/hypospray/autoinjector/survival = 1,
/obj/item/ammo_box/magazine/m50 = 3
)
+1 -1
View File
@@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","E
name = "changeling"
config_tag = "changeling"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
protected_species = list("Machine")
required_players = 15
required_enemies = 1
+1 -1
View File
@@ -185,7 +185,7 @@
owner.visible_message("<span class='warning'>[owner]'s body flashes a bright blue!</span>", \
"<span class='cultitalic'>You speak the cursed words, channeling an electromagnetic pulse from your body.</span>")
owner.emp_act(2)
empulse(owner, 2, 5, cause = "cult")
INVOKE_ASYNC(GLOBAL_PROC, /proc/empulse, owner, 2, 5, TRUE, "cult")
owner.whisper(invocation)
charges--
if(charges <= 0)
+1 -1
View File
@@ -48,7 +48,7 @@ GLOBAL_LIST_EMPTY(all_cults)
/datum/game_mode/cult
name = "cult"
config_tag = "cult"
restricted_jobs = list("Chaplain", "AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer")
restricted_jobs = list("Chaplain", "AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
protected_jobs = list()
required_players = 30
required_enemies = 3
+104 -18
View File
@@ -4,6 +4,10 @@
#define NUKE_SEALANT_OPEN 3
#define NUKE_UNWRENCHED 4
#define NUKE_MOBILE 5
#define NUKE_CORE_EVERYTHING_FINE 6
#define NUKE_CORE_PANEL_EXPOSED 7
#define NUKE_CORE_PANEL_UNWELDED 8
#define NUKE_CORE_FULLY_EXPOSED 9
GLOBAL_VAR(bomb_set)
@@ -25,12 +29,17 @@ GLOBAL_VAR(bomb_set)
var/yes_code = FALSE
var/safety = TRUE
var/obj/item/disk/nuclear/auth = null
var/removal_stage = NUKE_INTACT
var/obj/item/nuke_core/plutonium/core = null
var/lastentered
var/is_syndicate = FALSE
use_power = NO_POWER_USE
var/previous_level = ""
var/datum/wires/nuclearbomb/wires = null
var/removal_stage = NUKE_INTACT
///The same state removal stage is, until someone opens the panel of the nuke. This way we can have someone open the front of the nuke, while keeping track of where in the world we are on the anchoring bolts.
var/anchor_stage = NUKE_INTACT
///This is so that we can check if the internal components are sealed up properly when the outer hatch is closed.
var/core_stage = NUKE_CORE_EVERYTHING_FINE
/obj/machinery/nuclearbomb/syndicate
is_syndicate = TRUE
@@ -39,16 +48,19 @@ GLOBAL_VAR(bomb_set)
extended = FALSE
anchored = FALSE
/obj/machinery/nuclearbomb/New()
..()
r_code = rand(10000, 99999.0) // Creates a random code upon object spawn.
/obj/machinery/nuclearbomb/Initialize()
. = ..()
r_code = rand(10000, 99999) // Creates a random code upon object spawn.
wires = new/datum/wires/nuclearbomb(src)
previous_level = get_security_level()
GLOB.poi_list |= src
core = new /obj/item/nuke_core/plutonium(src)
STOP_PROCESSING(SSobj, core) //Let us not irradiate the vault by default.
/obj/machinery/nuclearbomb/Destroy()
SStgui.close_uis(wires)
QDEL_NULL(wires)
QDEL_NULL(core)
GLOB.poi_list.Remove(src)
return ..()
@@ -73,16 +85,41 @@ GLOBAL_VAR(bomb_set)
else
to_chat(user, "<span class='notice'>You need to deploy [src] first.</span>")
return
if(istype(O, /obj/item/stack/sheet/mineral/titanium) && removal_stage == NUKE_CORE_FULLY_EXPOSED)
if(do_after(user, 2 SECONDS, target = src))
var/obj/item/stack/S = O
if(!loc || !S || S.get_amount() < 5)
return
S.use(5)
user.visible_message("<span class='notice'>[user] repairs [src]'s inner core plate.</span>", "<span class='notice'>You repair [src]'s inner core plate. The radiation is contained.</span>")
removal_stage = NUKE_CORE_PANEL_UNWELDED
if(core)
STOP_PROCESSING(SSobj, core)
return
if(istype(O, /obj/item/stack/sheet/metal) && removal_stage == NUKE_CORE_PANEL_EXPOSED)
var/obj/item/stack/S = O
if(do_after(user, 2 SECONDS, target = src))
if(!loc || !S || S.get_amount() < 5)
return
S.use(5)
user.visible_message("<span class='notice'>[user] repairs [src]'s outer core plate.</span>", "<span class='notice'>You repair [src]'s outer core plate.</span>")
removal_stage = NUKE_CORE_EVERYTHING_FINE
return
if(istype(O, /obj/item/nuke_core/plutonium) && removal_stage == NUKE_CORE_FULLY_EXPOSED)
if(do_after(user, 2 SECONDS, target = src))
if(!user.unEquip(O))
to_chat(user, "<span class='notice'>The [O] is stuck to your hand!</span>")
return
user.visible_message("<span class='notice'>[user] puts [O] back in [src].</span>", "<span class='notice'>You put [O] back in [src].</span>")
O.forceMove(src)
core = O
else if(istype(O, /obj/item/disk/plantgene))
to_chat(user, "<span class='warning'>You try to plant the disk, but despite rooting around, it won't fit! After you branch out to read the instructions, you find out where the problem stems from. You've been bamboo-zled, this isn't a nuclear disk at all!</span>")
return
return ..()
/obj/machinery/nuclearbomb/crowbar_act(mob/user, obj/item/I)
if(!anchored)
return
if(removal_stage != NUKE_UNWRENCHED && removal_stage != NUKE_COVER_OFF)
return
. = TRUE
if(!I.tool_use_check(user, 0))
return
@@ -92,9 +129,26 @@ GLOBAL_VAR(bomb_set)
return
user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.")
removal_stage = NUKE_COVER_OPEN
else
if(removal_stage == NUKE_CORE_EVERYTHING_FINE)
user.visible_message("<span class='notice'>[user] starts removing [src]'s outer core plate...</span>", "<span class='notice'>You start removing [src]'s outer core plate...</span>")
if(!I.use_tool(src, user, 4 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_CORE_EVERYTHING_FINE)
return
user.visible_message("<span class='notice'>[user] finishes removing [src]'s outer core plate.</span>", "<span class='notice'>You finish removing [src]'s outer core plate.</span>")
new /obj/item/stack/sheet/metal(loc, 5)
removal_stage = NUKE_CORE_PANEL_EXPOSED
if(removal_stage == NUKE_CORE_PANEL_UNWELDED)
user.visible_message("<span class='notice'>[user] starts removing [src]'s inner core plate...</span>", "<span class='notice'>You start removing [src]'s inner core plate...</span>")
if(!I.use_tool(src, user, 8 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_CORE_PANEL_UNWELDED)
return
user.visible_message("<span class='notice'>[user] finishes removing [src]'s inner core plate.</span>", "<span class='notice'>You remove [src]'s inner core plate. You can see the core's green glow!</span>")
removal_stage = NUKE_CORE_FULLY_EXPOSED
new /obj/item/stack/sheet/mineral/titanium(loc, 5)
if(core)
START_PROCESSING(SSobj, core)
if(removal_stage == NUKE_UNWRENCHED)
user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...")
if(!I.use_tool(src, user, 80, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED)
if(!I.use_tool(src, user, 8 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED)
return
user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!")
anchored = FALSE
@@ -126,15 +180,19 @@ GLOBAL_VAR(bomb_set)
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
if(auth)
if(auth || (istype(I, /obj/item/screwdriver/nuke)))
if(!panel_open)
panel_open = TRUE
overlays += image(icon, "npanel_open")
to_chat(user, "You unscrew the control panel of [src].")
anchor_stage = removal_stage
removal_stage = core_stage
else
panel_open = FALSE
overlays -= image(icon, "npanel_open")
to_chat(user, "You screw the control panel of [src] back on.")
core_stage = removal_stage
removal_stage = anchor_stage
else
if(!panel_open)
to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.")
@@ -142,6 +200,8 @@ GLOBAL_VAR(bomb_set)
panel_open = FALSE
overlays -= image(icon, "npanel_open")
to_chat(user, "You screw the control panel of [src] back on.")
core_stage = removal_stage
removal_stage = anchor_stage
flick("nuclearbombc", src)
/obj/machinery/nuclearbomb/wirecutter_act(mob/user, obj/item/I)
@@ -154,8 +214,6 @@ GLOBAL_VAR(bomb_set)
/obj/machinery/nuclearbomb/welder_act(mob/user, obj/item/I)
. = TRUE
if(removal_stage != NUKE_INTACT && removal_stage != NUKE_COVER_OPEN)
return
if(!I.tool_use_check(user, 0))
return
if(removal_stage == NUKE_INTACT)
@@ -167,7 +225,20 @@ GLOBAL_VAR(bomb_set)
visible_message("<span class='notice'>[user] cuts through the bolt covers on [src].</span>",\
"<span class='notice'>You cut through the bolt cover.</span>")
removal_stage = NUKE_COVER_OFF
else if(removal_stage == NUKE_COVER_OPEN)
if(removal_stage == NUKE_CORE_PANEL_UNWELDED)
user.visible_message("<span class='notice'>[user] starts welding [src]'s inner core plate...</span>", "<span class='notice'>You start welding [src]'s inner core plate...</span>")
if(!I.use_tool(src, user, 4 SECONDS, 5, volume = I.tool_volume) || removal_stage != NUKE_CORE_PANEL_UNWELDED)
return
user.visible_message("<span class='notice'>[user] finishes welding [src]'s inner core plate...</span>", "<span class='notice'>You finish welding [src]'s inner core plate...</span>")
removal_stage = NUKE_CORE_PANEL_EXPOSED
else if(removal_stage == NUKE_CORE_PANEL_EXPOSED)
user.visible_message("<span class='notice'>[user] starts unwelding [src]'s inner core plate...</span>", "<span class='notice'>You start unwelding [src]'s inner core plate...</span>")
if(!I.use_tool(src, user, 4 SECONDS, 5, volume = I.tool_volume) || removal_stage != NUKE_CORE_PANEL_EXPOSED)
return
user.visible_message("<span class='notice'>[user] finishes unwelding [src]'s inner core plate...</span>", "<span class='notice'>You finish unwelding [src]'s inner core plate...</span>")
removal_stage = NUKE_CORE_PANEL_UNWELDED
if(removal_stage == NUKE_COVER_OPEN)
visible_message("<span class='notice'>[user] starts cutting apart the anchoring system sealant on [src].</span>",\
"<span class='notice'>You start cutting apart the anchoring system's sealant with [I]...</span>",\
"<span class='warning'>You hear welding.</span>")
@@ -181,10 +252,18 @@ GLOBAL_VAR(bomb_set)
attack_hand(user)
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
if(panel_open)
wires.Interact(user)
else
ui_interact(user)
if(!panel_open)
return ui_interact(user)
if(removal_stage != NUKE_CORE_FULLY_EXPOSED || !core)
return wires.Interact(user)
if(timing) //removing the core is less risk then cutting wires, and doesnt take long, so we should not let crew do it while the nuke is armed. You can however get to it, without the special screwdriver, if you put the NAD in.
to_chat(user, "<span class='warning'>[core] won't budge, metal clamps keep it in!</span>")
return
user.visible_message("<span class='notice'>[user] starts to pull [core] out of [src]!</span>", "<span class='notice'>You start to pull [core] out of [src]!</span>")
if(do_after(user, 5 SECONDS, target = src))
user.visible_message("<span class='notice'>[user] pulls [core] out of [src]!</span>", "<span class='notice'>You pull [core] out of [src]! Might want to put it somewhere safe.</span>")
core.forceMove(loc)
core = null
/obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
@@ -308,6 +387,9 @@ GLOBAL_VAR(bomb_set)
if(safety)
to_chat(usr, "<span class='notice'>The safety is still on.</span>")
return
if(!core)
to_chat(usr, "<span class='danger'>[src]'s screen blinks red! There is no plutonium core in [src]!</span>")
return
timing = !(timing)
if(timing)
if(!lighthack)
@@ -471,3 +553,7 @@ GLOBAL_VAR(bomb_set)
#undef NUKE_SEALANT_OPEN
#undef NUKE_UNWRENCHED
#undef NUKE_MOBILE
#undef NUKE_CORE_EVERYTHING_FINE
#undef NUKE_CORE_PANEL_EXPOSED
#undef NUKE_CORE_PANEL_UNWELDED
#undef NUKE_CORE_FULLY_EXPOSED
+22 -1
View File
@@ -389,8 +389,10 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
steal_target = O
explanation_text = "Steal [steal_target]. One was last seen in [get_location()]. "
if(length(O.protected_jobs))
if(length(O.protected_jobs) && O.job_possession)
explanation_text += "It may also be in the possession of the [english_list(O.protected_jobs, and_text = " or ")]."
if(steal_target.special_equipment)
give_kit(steal_target.special_equipment)
return
explanation_text = "Free Objective."
@@ -412,6 +414,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
else
steal_target = new new_target
explanation_text = "Steal [steal_target.name]."
if(steal_target.special_equipment)
give_kit(steal_target.special_equipment)
return steal_target
/datum/objective/steal/check_completion()
@@ -429,6 +433,23 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
if(I.type in steal_target.altitems)
return steal_target.check_special_completion(I)
/datum/objective/steal/proc/give_kit(obj/item/item_path)
var/mob/living/carbon/human/mob = owner.current
var/I = new item_path
var/list/slots = list(
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = mob.equip_in_one_of_slots(I, slots)
if(where)
to_chat(mob, "<br><br><span class='info'>In your [where] is a box containing <b>items and instructions</b> to help you with your steal objective.</span><br>")
else
to_chat(mob, "<span class='userdanger'>Unfortunately, you weren't able to get a stealing kit. This is very bad and you should adminhelp immediately (press F1).</span>")
message_admins("[ADMIN_LOOKUPFLW(mob)] Failed to spawn with their [item_path] theft kit.")
qdel(I)
/datum/objective/steal/exchange
martyr_compatible = 0
+1 -1
View File
@@ -74,7 +74,7 @@ Made by Xhuis
required_enemies = 2
recommended_enemies = 2
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
/datum/game_mode/shadowling/announce()
to_chat(world, "<b>The current game mode is - Shadowling!</b>")
+18
View File
@@ -12,6 +12,10 @@
var/list/altitems = list()
var/flags = 0
var/location_override
/// Do we have a special item we give to somewhen when they get this objective?
var/special_equipment = null
/// If a steal objective has forbidden jobs, and the forbidden jobs would not be in the possession of this item, set this to false
var/job_possession = TRUE
/datum/theft_objective/proc/check_completion(datum/mind/owner)
if(!owner.current)
@@ -138,6 +142,20 @@
protected_jobs = list("Head Of Security", "Warden")
location_override = "the Warden's Office"
/datum/theft_objective/supermatter_sliver
name = "a supermatter sliver"
typepath = /obj/item/nuke_core/supermatter_sliver
protected_jobs = list("Chief Engineer", "Engineer", "Atmospheric Technician") //Unlike other steal objectives, all jobs in the department have easy access, and would not be noticed at all stealing this
location_override = "Engineering. You can use the box and instructions provided to harvest the sliver"
special_equipment = /obj/item/storage/box/syndie_kit/supermatter
job_possession = FALSE //The CE / engineers / atmos techs do not carry around supermater slivers.
/datum/theft_objective/plutonium_core
name = "the plutonium core from the stations nuclear device"
typepath = /obj/item/nuke_core/plutonium
location_override = "the Vault. You can use the box and instructions provided to remove the core, with some extra tools"
special_equipment = /obj/item/storage/box/syndie_kit/nuke
/datum/theft_objective/number
var/min=0
var/max=0
+1 -1
View File
@@ -11,7 +11,7 @@
name = "traitor"
config_tag = "traitor"
restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
required_players = 0
required_enemies = 1
recommended_enemies = 4
+1 -1
View File
@@ -2,7 +2,7 @@
name = "traitor+vampire"
config_tag = "traitorvamp"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Solar Federation Brigadier General")
restricted_jobs = list("Cyborg")
secondary_restricted_jobs = list("AI")
required_players = 10
+1 -1
View File
@@ -9,7 +9,7 @@
name = "vampire"
config_tag = "vampire"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
protected_species = list("Machine")
required_players = 15
required_enemies = 1
+3 -1
View File
@@ -100,6 +100,8 @@
return get_all_centcom_access() + get_all_accesses()
if("Special Operations Officer")
return get_all_centcom_access() + get_all_accesses()
if("Solar Federation Brigadier General")
return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Representative")
return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Officer")
@@ -401,7 +403,7 @@
return list("VIP Guest","Custodian","Thunderdome Overseer","Emergency Response Team Member","Emergency Response Team Leader","Intel Officer","Medical Officer","Death Commando","Research Officer","Deathsquad Officer","Special Operations Officer","Nanotrasen Navy Representative","Nanotrasen Navy Officer","Nanotrasen Navy Captain","Supreme Commander")
/proc/get_all_solgov_jobs()
return list("Solar Federation Lieutenant","Solar Federation Specops Lieutenant","Solar Federation Marine","Solar Federation Specops Marine","Solar Federation Representative","Sol Trader")
return list("Solar Federation Lieutenant","Solar Federation Specops Lieutenant","Solar Federation Marine","Solar Federation Specops Marine","Solar Federation Representative","Sol Trader","Solar Federation Brigadier General")
//gets the actual job rank (ignoring alt titles)
//this is used solely for sechuds
+22 -2
View File
@@ -69,9 +69,9 @@
/datum/outfit/job/ntspecops
name = "Special Operations Officer"
jobtype = /datum/job/ntspecops
allow_backbag_choice = FALSE
uniform = /obj/item/clothing/under/rank/centcom/captain
suit = /obj/item/clothing/suit/space/deathsquad/officer
back = /obj/item/storage/backpack/ert/security
belt = /obj/item/storage/belt/military/assault
gloves = /obj/item/clothing/gloves/combat
shoes = /obj/item/clothing/shoes/combat
@@ -82,8 +82,8 @@
id = /obj/item/card/id/centcom
pda = /obj/item/pda/centcom
r_pocket = /obj/item/storage/box/matches
back = /obj/item/storage/backpack/satchel
box = /obj/item/storage/box/centcomofficer
backpack = /obj/item/storage/backpack/satchel
backpack_contents = list(
/obj/item/clothing/shoes/magboots/advance = 1,
/obj/item/storage/box/zipties = 1
@@ -104,3 +104,23 @@
if(visualsOnly)
return
H.mind.offstation_role = TRUE
/datum/job/ntspecops/solgovspecops
title = "Solar Federation Brigadier General"
outfit = /datum/outfit/job/ntspecops/solgovspecops
/datum/outfit/job/ntspecops/solgovspecops
name = "Solar Federation Brigadier General"
uniform = /obj/item/clothing/under/rank/centcom/captain/solgov
suit = /obj/item/clothing/suit/space/deathsquad/officer/solgov
head = /obj/item/clothing/head/helmet/space/deathsquad/beret/solgov
/datum/outfit/job/ntspecops/solgovspecops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return
var/obj/item/card/id/I = H.wear_id
if(istype(I))
apply_to_card(I, H, get_centcom_access(name), name, "lifetimeid")
H.sec_hud_set_ID()
H.mind.offstation_role = TRUE
+15
View File
@@ -66,6 +66,21 @@
component_parts += new /obj/item/stack/sheet/glass(null)
RefreshParts()
/obj/machinery/autolathe/upgraded/gamma/New()
. = ..()
component_parts = list()
component_parts += new /obj/item/circuitboard/autolathe(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stack/sheet/glass(null)
RefreshParts()
/obj/machinery/autolathe/upgraded/gamma/Initialize()
. = ..()
adjust_hacked(TRUE)
/obj/machinery/autolathe/Destroy()
SStgui.close_uis(wires)
QDEL_NULL(wires)
+1
View File
@@ -30,6 +30,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
var/list/blacklisted_full = list(
/datum/job/ntnavyofficer,
/datum/job/ntspecops,
/datum/job/ntspecops/solgovspecops,
/datum/job/civilian,
/datum/job/syndicateofficer,
/datum/job/explorer // blacklisted so that HOPs don't try prioritizing it, then wonder why that doesn't work
+7
View File
@@ -85,6 +85,13 @@
else
do_animate("deny")
/obj/machinery/door/window/unrestricted_side(mob/M)
var/mob_dir = get_dir(src, M)
if(mob_dir == 0) // If the mob is inside the tile
mob_dir = GetOppositeDir(dir) // Set it to the inside direction of the windoor
return mob_dir & unres_sides
/obj/machinery/door/window/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
+9
View File
@@ -110,6 +110,15 @@
/obj/machinery/suit_storage_unit/security/hos/secure
secure = TRUE
/obj/machinery/suit_storage_unit/gamma
name = "gamma shielded suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/shielded/gamma
mask_type = /obj/item/clothing/mask/gas/sechailer/swat
req_access = list(ACCESS_SECURITY)
/obj/machinery/suit_storage_unit/gamma/secure
secure = TRUE
/obj/machinery/suit_storage_unit/atmos
name = "atmospherics suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
+9 -2
View File
@@ -51,6 +51,11 @@
"Emergency Response Team Officer" = "dsquadradio",
"Nanotrasen Navy Officer" = "dsquadradio",
"Special Operations Officer" = "dsquadradio",
"Solar Federation Brigadier General" = "dsquadradio",
"Solar Federation Specops Lieutenant" = "dsquadradio",
"Solar Federation Specops Marine" = "dsquadradio",
"Solar Federation Lieutenant" = "dsquadradio",
"Solar Federation Marine" = "dsquadradio",
// Medical
"Chemist" = "medradio",
"Chief Medical Officer" = "medradio",
@@ -119,7 +124,9 @@
/// List of ERT jobs
var/list/ert_jobs = list("Emergency Response Team Officer", "Emergency Response Team Engineer", "Emergency Response Team Medic", "Emergency Response Team Leader", "Emergency Response Team Member")
/// List of CentComm jobs
var/list/cc_jobs = list("Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer")
var/list/cc_jobs = list("Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation Brigadier General")
/// List of SolGov Marine jobs
var/list/tsf_jobs = list("Solar Federation Specops Lieutenant", "Solar Federation Specops Marine", "Solar Federation Lieutenant", "Solar Federation Marine")
// Defined so code compiles and incase someone has a non-standard job
var/job_class = "radio"
// NOW FOR ACTUAL TOGGLES
@@ -278,7 +285,7 @@
// Makes heads of staff bold
if(toggle_command_bold)
var/job = tcm.sender_job
if((job in ert_jobs) || (job in heads) || (job in cc_jobs))
if((job in ert_jobs) || (job in heads) || (job in cc_jobs) || (job in tsf_jobs))
for(var/I in 1 to length(message_pieces))
var/datum/multilingual_say_piece/S = message_pieces[I]
if(!S.message)
+23
View File
@@ -44,6 +44,29 @@
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/ares
name = "Ares"
desc = "Heavy-duty, combat exosuit, adapted from rejected early versions of the Marauder to serve as a biohazard containment exosuit. This model, albeit rare, can be found among civilian populations."
icon_state = "ares"
initial_icon = "ares"
operation_req_access = list(ACCESS_SECURITY)
max_integrity = 450
armor = list(melee = 50, bullet = 40, laser = 20, energy = 20, bomb = 20, bio = 100, rad = 60, fire = 100, acid = 100)
max_temperature = 40000
wreckage = /obj/structure/mecha_wreckage/ares
max_equip = 4
/obj/mecha/combat/marauder/ares/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster(src)
ME.attach(src)
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "Seraph"
+5
View File
@@ -128,6 +128,11 @@
name = "\improper Marauder wreckage"
icon_state = "marauder-broken"
/obj/structure/mecha_wreckage/ares
name = "\improper Ares wreckage"
icon_state = "ares-broken"
desc = "The truth is you lost an expensive piece of Nanotrasen-issue equipment. That suit is going to come out of your pay, and you will remain in this corporation until you are five hundred and ten years old, which is the number of years it will take for you to pay for an Ares Biohazard Containment Exosuit you have lost!"
/obj/structure/mecha_wreckage/mauler
name = "\improper Mauler wreckage"
icon_state = "mauler-broken"
+11 -8
View File
@@ -67,6 +67,11 @@
/obj/effect/mapping_helpers/no_lava
icon_state = "no_lava"
/obj/effect/mapping_helpers/no_lava/New()
var/turf/T = get_turf(src)
T.flags |= NO_LAVA_GEN
..()
/obj/effect/mapping_helpers/airlock
layer = DOOR_HELPER_LAYER
@@ -78,13 +83,11 @@
if(!mapload)
log_world("### MAP WARNING, [src] spawned outside of mapload!")
return
var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in src.loc
if(airlock)
airlock.unres_sides ^= dir
var/obj/machinery/door/door = locate(/obj/machinery/door/airlock) in loc
if(!door)
door = locate(/obj/machinery/door/window) in loc
if(door)
door.unres_sides ^= dir
else
log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]")
..()
/obj/effect/mapping_helpers/no_lava/New()
var/turf/T = get_turf(src)
T.flags |= NO_LAVA_GEN
. = ..()
..()
@@ -43,14 +43,14 @@
/obj/effect/temp_visual/ratvar/window
icon_state = "ratvarwindowglow"
layer = ABOVE_OBJ_LAYER
layer = ABOVE_WINDOW_LAYER
/obj/effect/temp_visual/ratvar/window/single
icon_state = "ratvarwindowglow_s"
/obj/effect/temp_visual/ratvar/gear
icon_state = "ratvargearglow"
layer = BELOW_OBJ_LAYER
layer = ABOVE_OBJ_LAYER
/obj/effect/temp_visual/ratvar/grille
icon_state = "ratvargrilleglow"
@@ -307,12 +307,18 @@
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
/obj/item/radio/headset/ert/alt/solgov
name = "\improper Trans-Solar Federation Marine's bowman headset"
/obj/item/radio/headset/ert/alt/commander
name = "ERT commander's bowman headset"
desc = "The headset of the boss. Protects ears from flashbangs. Can transmit even if telecomms are down."
requires_tcomms = FALSE
instant = TRUE
/obj/item/radio/headset/ert/alt/commander/solgov
name = "\improper Trans-Solar Federation Lieutenant's bowman headset"
/obj/item/radio/headset/centcom
name = "centcom officer's bowman headset"
desc = "The headset of final authority. Protects ears from flashbangs. Can transmit even if telecomms are down."
+282
View File
@@ -0,0 +1,282 @@
//Items for nuke theft, supermatter theft traitor objective
// STEALING THE NUKE
//the nuke core, base item
/obj/item/nuke_core
name = "plutonium core"
desc = "Extremely radioactive. Wear goggles."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "plutonium_core"
item_state = "plutoniumcore"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags_2 = RAD_NO_CONTAMINATE_2 //Don't have the item itself become irradiated when it makes radiation.
var/pulse = 0
var/cooldown = 0
var/pulseicon = "plutonium_core_pulse"
/obj/item/nuke_core/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/nuke_core/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/nuke_core/attackby(obj/item/nuke_core_container/container, mob/user)
if(istype(container))
container.load(src, user)
else
return ..()
/obj/item/nuke_core/process()
if(cooldown < world.time - 6 SECONDS)
cooldown = world.time
flick(pulseicon, src)
radiation_pulse(src, 400, 2)
/obj/item/nuke_core/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is rubbing [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return TOXLOSS
/obj/item/nuke_core/plutonium //The steal objective, so it doesnt mess with the SM sliver on pinpointers and objectives
//nuke core box, for carrying the core
/obj/item/nuke_core_container
name = "nuke core container"
desc = "A solid container for radioactive objects."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "core_container_empty"
item_state = "metal"
var/obj/item/nuke_core/plutonium/core
/obj/item/nuke_core_container/Destroy()
QDEL_NULL(core)
return ..()
/obj/item/nuke_core_container/proc/load(obj/item/nuke_core/plutonium/new_core, mob/user)
if(core || !istype(new_core))
return
new_core.forceMove(src)
core = new_core
icon_state = "core_container_loaded"
to_chat(user, "<span class='warning'>Container is sealing...</span>")
addtimer(CALLBACK(src, .proc/seal), 10 SECONDS)
/obj/item/nuke_core_container/proc/seal()
if(!QDELETED(core))
STOP_PROCESSING(SSobj, core)
icon_state = "core_container_sealed"
playsound(src, 'sound/items/deconstruct.ogg', 60, TRUE)
if(ismob(loc))
to_chat(loc, "<span class='warning'>[src] is permanently sealed, [core]'s radiation is contained.</span>")
/obj/item/nuke_core_container/attackby(obj/item/nuke_core/plutonium/core, mob/user)
if(!istype(core))
return ..()
if(!user.drop_item())
to_chat(user, "<span class='warning'>[core] is stuck to your hand!</span>")
return
else
load(core, user)
/obj/item/paper/guides/antag/nuke_instructions
info = "How to break into a Nanotrasen nuclear device and remove its plutonium core:<br>\
<ul>\
<li>Use a screwdriver with a very thin tip (provided) to unscrew the terminal's front panel.</li>\
<li>Dislodge and remove the front panel with a crowbar.</li>\
<li>Cut the inner metal plate with a welding tool.</li>\
<li>Pry off the inner plate with a crowbar to expose the radioactive core.</li>\
<li>Pull the core out of the nuclear device. </li>\
<li>Put the core in the provided container, which will take some time to seal. </li>\
<li>???</li>\
</ul>"
// STEALING SUPERMATTER.
/obj/item/paper/guides/antag/supermatter_sliver
info = "How to safely extract a supermatter sliver:<br>\
<ul>\
<li>Approach an active supermatter crystal with radiation shielded personal protective equipment. DO NOT MAKE PHYSICAL CONTACT.</li>\
<li>Use a supermatter scalpel (provided) to slice off a sliver of the crystal.</li>\
<li>Use supermatter extraction tongs (also provided) to safely pick up the sliver you sliced off.</li>\
<li>Physical contact of any object with the sliver will dust the object, as well as yourself.</li>\
<li>Use the tongs to place the sliver into the provided container, which will take some time to seal.</li>\
<li>Get the hell out before the crystal delaminates.</li>\
<li>???</li>\
</ul>"
/obj/item/nuke_core/supermatter_sliver
name = "supermatter sliver"
desc = "A tiny, highly volatile sliver of a supermatter crystal. Do not handle without protection!"
icon_state = "supermatter_sliver"
pulseicon = "supermatter_sliver_pulse"
/obj/item/nuke_core/supermatter_sliver/attack_tk(mob/user) // no TK dusting memes
return
/obj/item/nuke_core/supermatter_sliver/can_be_pulled(user) // no drag memes
return FALSE
/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/retractor/supermatter))
var/obj/item/retractor/supermatter/tongs = I
if(tongs.sliver)
to_chat(user, "<span class='warning'>[tongs] are already holding a supermatter sliver!</span>")
return FALSE
forceMove(tongs)
tongs.sliver = src
tongs.icon_state = "supermatter_tongs_loaded"
tongs.item_state = "supermatter_tongs_loaded"
to_chat(user, "<span class='notice'>You carefully pick up [src] with [tongs].</span>")
else if(istype(I, /obj/item/scalpel/supermatter) || istype(I, /obj/item/nuke_core_container/supermatter)) // we don't want it to dust
return
else
to_chat(user, "<span class='danger'>As it touches [src], both [src] and [I] burst into dust!</span>")
radiation_pulse(user, 100)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
qdel(I)
qdel(src)
/obj/item/nuke_core/supermatter_sliver/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(!isliving(hit_atom))
return ..()
var/mob/living/victim = hit_atom
if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
return ..()
if(throwingdatum?.thrower)
var/mob/user = throwingdatum.thrower
add_attack_logs(user, victim, "[victim] consumed by [src] thrown by [user] ")
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(user)].")
investigate_log("has consumed [key_name(victim)], thrown by [key_name(user)]", "supermatter")
else
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)] via throw impact.")
investigate_log("has consumed [key_name(victim)] via throw impact.", "supermatter")
victim.visible_message("<span class='danger'>As [victim] is hit by [src], both flash into dust and silence fills the room...</span>",
"<span class='userdanger'>You're hit by [src] and everything suddenly goes silent.\n[src] flashes into dust, and soon as you can register this, you do as well.</span>",
"<span class='hear'>Everything suddenly goes silent.</span>")
victim.dust()
radiation_pulse(src, 500, 2)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
qdel(src)
/obj/item/nuke_core/supermatter_sliver/pickup(mob/living/user)
..()
if(!isliving(user) || user.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
return FALSE
user.visible_message("<span class='danger'>[user] reaches out and tries to pick up [src]. [user.p_their()] body starts to glow and bursts into flames before flashing into dust!</span>",
"<span class='userdanger'>You reach for [src] with your hands. That was dumb.</span>",
"<span class='hear'>Everything suddenly goes silent.</span>")
radiation_pulse(user, 500, 2)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
user.dust()
/obj/item/nuke_core_container/supermatter
name = "supermatter bin"
desc = "A tiny receptacle that releases an inert hyper-noblium mix upon sealing, allowing a sliver of a supermatter crystal to be safely stored."
var/obj/item/nuke_core/supermatter_sliver/sliver
/obj/item/nuke_core_container/supermatter/Destroy()
QDEL_NULL(sliver)
return ..()
/obj/item/nuke_core_container/supermatter/load(obj/item/retractor/supermatter/I, mob/user)
if(!istype(I) || !I.sliver)
return
I.sliver.forceMove(src)
sliver = I.sliver
I.sliver = null
I.icon_state = "supermatter_tongs"
I.item_state = "supermatter_tongs"
icon_state = "supermatter_container_loaded"
to_chat(user, "<span class='warning'>Container is sealing...</span>")
addtimer(CALLBACK(src, .proc/seal), 10 SECONDS)
/obj/item/nuke_core_container/supermatter/seal()
if(!QDELETED(sliver))
STOP_PROCESSING(SSobj, sliver)
icon_state = "supermatter_container_sealed"
playsound(src, 'sound/items/deconstruct.ogg', 60, TRUE)
if(ismob(loc))
to_chat(loc, "<span class='warning'>[src] is permanently sealed, [sliver] is safely contained.</span>")
/obj/item/nuke_core_container/supermatter/attackby(obj/item/retractor/supermatter/tongs, mob/user)
if(istype(tongs))
//try to load shard into core
load(tongs, user)
else
return ..()
/obj/item/scalpel/supermatter
name = "supermatter scalpel"
desc = "A scalpel with a fragile tip of condensed hyper-noblium gas, searingly cold to the touch, that can safely shave a sliver off a supermatter crystal."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "supermatter_scalpel"
toolspeed = 0.5
damtype = BURN
usesound = 'sound/weapons/bladeslice.ogg'
var/uses_left
/obj/item/scalpel/supermatter/Initialize()
. = ..()
uses_left = rand(2, 4)
/obj/item/retractor/supermatter
name = "supermatter extraction tongs"
desc = "A pair of tongs made from condensed hyper-noblium gas, searingly cold to the touch, that can safely grip a supermatter sliver."
icon = 'icons/obj/nuke_tools.dmi'
icon_state = "supermatter_tongs"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
item_state = "supermatter_tongs"
toolspeed = 0.75
damtype = BURN
var/obj/item/nuke_core/supermatter_sliver/sliver
/obj/item/retractor/supermatter/Destroy()
QDEL_NULL(sliver)
return ..()
/obj/item/retractor/supermatter/afterattack(atom/O, mob/user, proximity)
. = ..()
if(!sliver)
return
if(proximity && ismovable(O) && O != sliver)
Consume(O, user)
/obj/item/retractor/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins
if(sliver)
sliver.forceMove(loc)
visible_message("<span class='notice'>[sliver] falls out of [src] as it hits the ground.</span>")
sliver = null
icon_state = "supermatter_tongs"
item_state = "supermatter_tongs"
return ..()
/obj/item/retractor/supermatter/proc/Consume(atom/movable/AM, mob/living/user)
if(ismob(AM))
if(!isliving(AM))
return
var/mob/living/victim = AM
if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
return
victim.dust()
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)].")
investigate_log("has irradiated [key_name(victim)].", "supermatter")
else if(istype(AM, /obj/singularity))
return
else
investigate_log("has consumed [AM].", "supermatter")
qdel(AM)
if(user)
add_attack_logs(user, AM, "[AM] and [user] consumed by melee attack with [src] by [user]")
user.visible_message("<span class='danger'>As [user] touches [AM] with [src], both flash into dust and silence fills the room...</span>",
"<span class='userdanger'>You touch [AM] with [src], and everything suddenly goes silent.\n[AM] and [sliver] flash into dust, and soon as you can register this, you do as well.</span>",
"<span class='hear'>Everything suddenly goes silent.</span>")
user.dust()
radiation_pulse(src, 500, 2)
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
QDEL_NULL(sliver)
@@ -27,6 +27,7 @@
desc = "A screwdriver with an ultra thin tip."
icon_state = "screwdriver_nuke"
toolspeed = 0.5
random_color = FALSE
/obj/item/screwdriver/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -584,3 +584,9 @@
name = "emergency response team janitor backpack"
desc = "A spacious backpack with lots of pockets, worn by janitorial members of a Nanotrasen Emergency Response Team."
icon_state = "ert_janitor"
//Solgov
/obj/item/storage/backpack/ert/solgov
name = "\improper TSF marine backpack"
desc = "A spacious backpack with lots of pockets, worn by marines of the Trans-Solar Federation."
icon_state = "ert_solgov"
@@ -309,3 +309,24 @@ To apply, hold the injector a short distance away from the outer thigh before ap
new /obj/item/reagent_containers/syringe/capulettium_plus(src)
new /obj/item/reagent_containers/syringe/sarin(src)
new /obj/item/reagent_containers/syringe/pancuronium(src)
/obj/item/storage/box/syndie_kit/nuke
name = "box" //Bit of stealth, since you spawn with it
desc = "It's just an ordinary box."
icon_state = "box"
/obj/item/storage/box/syndie_kit/nuke/populate_contents()
new /obj/item/screwdriver/nuke(src)
new /obj/item/nuke_core_container(src)
new /obj/item/paper/guides/antag/nuke_instructions(src)
/obj/item/storage/box/syndie_kit/supermatter
name = "box"
desc = "It's just an ordinary box."
icon_state = "box"
/obj/item/storage/box/syndie_kit/supermatter/populate_contents()
new /obj/item/scalpel/supermatter(src)
new /obj/item/retractor/supermatter(src)
new /obj/item/nuke_core_container/supermatter(src)
new /obj/item/paper/guides/antag/supermatter_sliver(src)
@@ -203,6 +203,7 @@
windoor.req_one_access = electronics.selected_accesses
else
windoor.req_access = electronics.selected_accesses
windoor.unres_sides = electronics.unres_access_from
windoor.electronics = src.electronics
electronics.forceMove(windoor)
electronics = null
+5 -9
View File
@@ -702,21 +702,17 @@
reinf = FALSE
var/made_glow = FALSE
/obj/structure/window/reinforced/clockwork/Initialize(mapload, direct)
. = ..()
if(fulltile)
made_glow = TRUE
if(fulltile)
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
/obj/structure/window/reinforced/clockwork/spawnDebris(location)
. = list()
. += new /obj/item/stack/tile/brass(location, (fulltile ? 2 : 1))
/obj/structure/window/reinforced/clockwork/setDir(direct)
if(!made_glow)
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
if(fulltile)
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
else
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
E.setDir(direct)
made_glow = TRUE
..()
+1 -22
View File
@@ -52,9 +52,8 @@
hardness = 10
slicing_duration = 80
sheet_type = /obj/item/stack/tile/brass
sheet_amount = 1
sheet_amount = 2
girder_type = /obj/structure/clockwork/wall_gear
baseturf = /turf/simulated/floor/clockwork/reebe
var/heated
var/obj/effect/clockwork/overlay/wall/realappearance
@@ -77,25 +76,6 @@
animate(src, color = previouscolor, time = 8)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
/turf/simulated/wall/clockwork/dismantle_wall(devastated=0, explode=0)
if(devastated)
devastate_wall()
ChangeTurf(baseturf)
else
playsound(src, 'sound/items/welder.ogg', 100, 1)
var/newgirder = break_wall()
if(newgirder) //maybe we want a gear!
transfer_fingerprints_to(newgirder)
ChangeTurf(baseturf)
for(var/obj/O in src) //Eject contents!
if(istype(O, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = O
P.roll_and_drop(src)
else
O.forceMove(src)
return TRUE
/turf/simulated/wall/clockwork/devastate_wall()
for(var/i in 1 to 2)
new/obj/item/clockwork/alloy_shards/large(src)
@@ -116,4 +96,3 @@
if(heated)
to_chat(M.occupant, "<span class='userdanger'>The wall's intense heat completely reflects your [M.name]'s attack!</span>")
M.take_damage(20, BURN)
+8 -7
View File
@@ -85,15 +85,16 @@ GLOBAL_LIST_EMPTY(world_topic_handlers)
TGS_TOPIC
log_misc("WORLD/TOPIC: \"[T]\", from:[addr], master:[master], key:[key]")
// Handle spam prevention
if(!GLOB.world_topic_spam_prevention_handlers[address])
GLOB.world_topic_spam_prevention_handlers[address] = new /datum/world_topic_spam_prevention_handler
// Handle spam prevention, if their IP isnt in the whitelist
if(!(addr in GLOB.configuration.system.topic_ip_ratelimit_bypass))
if(!GLOB.world_topic_spam_prevention_handlers[addr])
GLOB.world_topic_spam_prevention_handlers[addr] = new /datum/world_topic_spam_prevention_handler(addr)
var/datum/world_topic_spam_prevention_handler/sph = GLOB.world_topic_spam_prevention_handlers[address]
var/datum/world_topic_spam_prevention_handler/sph = GLOB.world_topic_spam_prevention_handlers[addr]
// Lock the user out and cancel their topic if needed
if(sph.check_lockout())
return
// Lock the user out and cancel their topic if needed
if(sph.check_lockout())
return
var/list/input = params2list(T)
+1
View File
@@ -92,6 +92,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\] "
body += "\[<A href='?_src_=holder;getplaytimewindow=[M.UID()]'>" + M.client.get_exp_type(EXP_TYPE_CREW) + " as [EXP_TYPE_CREW]</a>\]"
body += "<br>BYOND account registration date: [M.client.byondacc_date || "ERROR"] [M.client.byondacc_age <= GLOB.configuration.general.byond_account_age_threshold ? "<b>" : ""]([M.client.byondacc_age] days old)[M.client.byondacc_age <= GLOB.configuration.general.byond_account_age_threshold ? "</b>" : ""]"
body += "<br>BYOND client version: [M.client.byond_version].[M.client.byond_build]"
body += "<br>Global Ban DB Lookup: [GLOB.configuration.url.centcom_ban_db_url ? "<a href='?_src_=holder;open_ccbdb=[M.client.ckey]'>Lookup</a>" : "<i>Disabled</i>"]"
body += "<br>"
+1 -1
View File
@@ -92,7 +92,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc
to_chat(usr, "<font color='blue'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</font>")
to_chat(usr, "<font color='#EB4E00'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</font>")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Advanced Proc-Call") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// All these vars are related to proc call protection
@@ -1,5 +1,4 @@
/datum/contractor_hub/ui_act(action, list/params)
/datum/contractor_hub/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
if(..())
return
@@ -44,7 +43,6 @@
if(!ui)
ui = new(user, src, ui_key, "Contractor", "Syndicate Contractor Uplink", 500, 600, master_ui, state)
ui.open()
ui.set_autoupdate(FALSE)
/datum/contractor_hub/ui_data(mob/user)
var/list/data = list()
@@ -67,6 +65,7 @@
switch(page)
if(HUB_PAGE_CONTRACTS)
var/contract_target
var/list/contracts_out = list()
data["contracts"] = contracts_out
for(var/c in contracts)
@@ -99,15 +98,26 @@
contract_data["dead_extraction"] = C.dead_extraction
if(CONTRACT_STATUS_FAILED)
contract_data["fail_reason"] = C.fail_reason
if(C.contract.extraction_zone)
contract_target = C.contract.target?.current
var/area/A = get_area(user)
contract_data["objective"] = list(
extraction_zone = C.contract.extraction_zone.map_name,
reward_tc = C.reward_tc[C.chosen_difficulty],
reward_credits = C.reward_credits,
extraction_name = C.contract.extraction_zone.map_name,
locs = list(
user_area_id = A.uid,
user_coords = ATOM_COORDS(user),
target_area_id = C.contract.extraction_zone.uid,
target_coords = ATOM_COORDS(C.contract.extraction_zone),
),
rewards = list(tc = C.reward_tc[C.chosen_difficulty], credits = C.reward_credits)
)
contracts_out += list(contract_data)
data["can_extract"] = current_contract?.contract.can_start_extraction_process(ui_host(), usr) || FALSE
data["can_extract"] = FALSE
if(contract_target)
data["can_extract"] = current_contract?.contract.can_start_extraction_process(user, contract_target)
if(HUB_PAGE_SHOP)
var/list/buyables = list()
for(var/p in purchases)
@@ -110,7 +110,6 @@
"AI Satellite Hallway",
"Bar",
"Cargo Office",
"Central Primary Hallway",
"Chemistry",
"Chief Engineer's office",
"Chief Medical Officer's office",
@@ -198,13 +198,7 @@
apply_mode()
/obj/machinery/alarm/New(loc, direction, building = 0)
. = ..()
GLOB.air_alarms += src
GLOB.air_alarms = sortAtom(GLOB.air_alarms)
wires = new(src)
if(building)
if(building) // Do this first since the Init uses this later on. TODO refactor to just use an Init
if(loc)
src.loc = loc
@@ -214,10 +208,15 @@
buildstage = 0
wiresexposed = 1
set_pixel_offsets_from_dir(-24, 24, -24, 24)
update_icon()
return
first_run()
. = ..()
GLOB.air_alarms += src
GLOB.air_alarms = sortAtom(GLOB.air_alarms)
wires = new(src)
if(!building)
first_run()
/obj/machinery/alarm/Destroy()
SStgui.close_uis(wires)
@@ -1,12 +1,11 @@
/obj/machinery/atmospherics/unary/heat_exchanger
icon = 'icons/obj/atmospherics/heat_exchanger.dmi'
icon_state = "intact"
density = 1
name = "heat exchanger"
desc = "Exchanges heat between two input gases. Setup for fast heat transfer"
can_unwrench = 1
can_unwrench = TRUE
var/obj/machinery/atmospherics/unary/heat_exchanger/partner = null
var/update_cycle
+1 -1
View File
@@ -531,7 +531,7 @@
var/watchreason = check_watchlist(ckey)
if(watchreason)
message_admins("<font color='red'><B>Notice: </B></font><font color='blue'>[key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]</font>")
message_admins("<font color='red'><B>Notice: </B></font><font color='#EB4E00'>[key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]</font>")
SSdiscord.send2discord_simple_noadmins("**\[Watchlist]** [key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]")
watchlisted = TRUE
+4 -2
View File
@@ -206,11 +206,13 @@
icon_state = "solgovcberet"
item_color = "solgovc"
dog_fashion = null
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
armor = list("melee" = 20, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
strip_delay = 80
/obj/item/clothing/head/beret/solgov/command/elite
name = "\improper Trans-Solar Federation Specops Lieutenant's beret"
desc = "A beret worn by marines of the Trans-Solar Federation Psiops division. The insignia signifies the wearer bears the rank of a Lieutenant."
desc = "A beret worn by marines of the Trans-Solar Federation Specops division. The insignia signifies the wearer bears the rank of a Lieutenant."
armor = list("melee" = 35, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 50, "fire" = 80, "acid" = 80)
icon_state = "solgovceliteberet"
item_color = "solgovcelite"
resistance_flags = FIRE_PROOF
+9 -5
View File
@@ -125,28 +125,32 @@
dog_fashion = null
/obj/item/clothing/head/soft/solgov/marines
armor = list("melee" = 35, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50)
strip_delay = 60
armor = list("melee" = 20, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
icon_state = "solgovsoft_flipped"
strip_delay = 60
flipped = TRUE
/obj/item/clothing/head/soft/solgov/marines/elite
name = "\improper Trans-Solar Federation Specops marine cap"
desc = "A soft cap worn by marines of the Trans-Solar Federation Specops division."
desc = "A cap worn by marines of the Trans-Solar Federation Specops division. You aren't quite sure how they made this bulletproof, but you are glad it is!"
armor = list("melee" = 35, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 50, "fire" = 80, "acid" = 80)
icon_state = "solgovelitesoft_flipped"
item_color = "solgovelite"
resistance_flags = FIRE_PROOF
/obj/item/clothing/head/soft/solgov/marines/command
name = "\improper Trans-Solar Federation lieutenant's cap"
desc = "A soft cap worn by marines of the Trans-Solar Federation. The insignia signifies the wearer bears the rank of a Lieutenant."
armor = list("melee" = 20, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
icon_state = "solgovcsoft_flipped"
item_color = "solgovc"
dog_fashion = null
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 60)
strip_delay = 80
/obj/item/clothing/head/soft/solgov/marines/command/elite
name = "\improper Trans-Solar Federation Specops Lieutenant's cap"
desc = "A soft cap worn by marines of the Trans-Solar Federation Specops division. The insignia signifies the wearer bears the rank of a Lieutenant."
desc = "A cap worn by marines of the Trans-Solar Federation Specops division. You aren't quite sure how they made this bulletproof, but you are glad it is! The insignia signifies the wearer bears the rank of a Lieutenant."
armor= list("melee" = 35, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 50, "fire" = 80, "acid" = 80)
icon_state = "solgovcelitesoft"
item_color = "solgovcelite"
resistance_flags = FIRE_PROOF
+35
View File
@@ -259,3 +259,38 @@
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker
armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100, fire = 80, acid = 80)
slowdown = 0
// Solgov
/obj/item/clothing/head/helmet/space/hardsuit/ert/solgov
name = "\improper Trans-Solar Federation Specops Marine helmet"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
desc = "A helmet worn by marines of the Trans-Solar Federation. Armored, space ready, and fireproof."
icon_state = "hardsuit0-solgovmarine"
item_state = "hardsuit0-solgovmarine"
item_color = "solgovmarine"
armor = list("melee" = 35, "bullet" = 60, "laser" = 15, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
/obj/item/clothing/suit/space/hardsuit/ert/solgov
name = "\improper Trans-Solar Federation Specops Marine hardsuit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
desc = "A suit worn by marines of the Trans-Solar Federation. Armored, space ready, and fireproof."
icon_state = "ert_solgov_marine"
item_state = "ert_solgov_marine"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/solgov
slowdown = 0
armor = list("melee" = 35, "bullet" = 60, "laser" = 15, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
/obj/item/clothing/head/helmet/space/hardsuit/ert/solgov/command
name = "\improper Trans-Solar Federation Specops Lieutenant helmet"
desc = "A helmet worn by Lieutenants of the Trans-Solar Federation Marines. Has gold highlights to denote the wearer's rank. Armored, space ready, and fireproof."
icon_state = "hardsuit0-solgovcommand"
item_state = "hardsuit0-solgovcommand"
item_color = "solgovcommand"
/obj/item/clothing/suit/space/hardsuit/ert/solgov/command
name = "\improper Trans-Solar Federation Specops Lieutenant hardsuit"
desc = "A suit worn by Lieutenants of the Trans-Solar Federation Marines. Has gold highlights to denote the wearer's rank. Armored, space ready, and fireproof."
icon_state = "ert_solgov_command"
item_state = "ert_solgov_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/solgov/command
@@ -711,3 +711,24 @@
item_state = "syndie_helm"
item_color = "syndi"
armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100)
//////Security Version (Gamma armory only)
/obj/item/clothing/suit/space/hardsuit/shielded/gamma
name = "shielded security hardsuit"
desc = "A more advanced version of the normal security hardsuit. Comes with built in energy shielding."
icon_state = "hardsuit-sec"
item_state = "sec-hardsuit"
armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/baton,/obj/item/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/restraints/handcuffs)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/gamma
/obj/item/clothing/head/helmet/space/hardsuit/shielded/gamma
name = "shielded security hardsuit helmet"
desc = "A more advanced version of the normal security hardsuit helmet. Comes with built in energy shielding."
icon_state = "hardsuit0-sec"
item_state = "sec_helm"
item_color = "sec"
armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
@@ -87,6 +87,11 @@
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
/obj/item/clothing/head/helmet/space/deathsquad/beret/solgov
name = "\improper Trans-Solar Federation commander's beret"
desc = "A camouflaged beret adorned with the star of the Trans-Solar Federation, worn by generals of the Trans-Solar Federation."
icon_state = "solgovceliteberet"
/obj/item/clothing/suit/space/deathsquad/officer
name = "officer jacket"
desc = "An armored jacket used in special operations."
@@ -99,6 +104,12 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
w_class = WEIGHT_CLASS_NORMAL
/obj/item/clothing/suit/space/deathsquad/officer/solgov
name = "\improper Trans-Solar Federation commander's jacket"
icon_state = "solgovcommander"
item_state = "solgovcommander"
//Space santa outfit suit
/obj/item/clothing/head/helmet/space/santahat
name = "Santa's hat"
@@ -129,6 +129,10 @@
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30)
displays_id = 0
/obj/item/clothing/under/rank/centcom/captain/solgov
name = "\improper Trans-Solar Federation commander's uniform"
desc = "Gold trim on space-black cloth, this uniform is worn by generals of the Trans-Solar Federation. It has exotic materials for protection."
/obj/item/clothing/under/rank/centcom/blueshield
name = "formal blueshield's uniform"
desc = "Gold trim on space-black cloth, this uniform bears \"Close Protection\" on the left shoulder. It's got exotic materials for protection."
+8 -1
View File
@@ -289,8 +289,15 @@
/obj/item/CQC_manual/attack_self(mob/living/carbon/human/user)
if(!istype(user) || !user)
return
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
if(user.mind) //Prevents changelings and vampires from being able to learn it
if(user.mind.changeling) //Changelings
to_chat(user, "<span class='warning'>We try multiple times, but we simply cannot grasp the basics of CQC!</span>")
return
else if(user.mind.vampire) //Vampires
to_chat(user, "<span class='warning'>Your blood lust distracts you from the basics of CQC!</span>")
return
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
var/datum/martial_art/cqc/CQC = new(null)
CQC.teach(user)
user.drop_item()
+15 -2
View File
@@ -88,7 +88,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
real_name = name
//starts ghosts off with all HUDs.
toggle_all_huds_on()
toggle_all_huds_on(body)
..()
/mob/dead/observer/Destroy()
@@ -330,10 +330,23 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
GLOB.ghost_hud_panel.ui_interact(src)
/mob/dead/observer/proc/toggle_all_huds_on()
/**
* Toggles on all HUDs for the ghost player.
*
* Enables antag HUD only if the ghost belongs to an admin.
*
* Arguments:
* * user - A reference to the ghost's old mob. This argument is required since `src` does not have a `client` at this point.
*/
/mob/dead/observer/proc/toggle_all_huds_on(mob/user)
show_me_the_hud(DATA_HUD_DIAGNOSTIC)
show_me_the_hud(DATA_HUD_SECURITY_ADVANCED)
show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED)
if(!check_rights((R_ADMIN | R_MOD), FALSE, user))
return
antagHUD = TRUE
for(var/datum/atom_hud/antag/H in GLOB.huds)
H.add_hud_to(src)
/mob/dead/observer/proc/set_radiation_view(enabled)
if (enabled)
@@ -129,6 +129,7 @@
status_flags = 0
construct_type = "juggernaut"
mob_size = MOB_SIZE_LARGE
move_resist = MOVE_FORCE_STRONG
construct_spells = list(/obj/effect/proc_holder/spell/targeted/night_vision, /obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
force_threshold = 11
playstyle_string = "<b>You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \
+2 -2
View File
@@ -20,10 +20,10 @@
spawn() alert("You have logged in already with another key this round, please log out of this one NOW or risk being banned!")
if(matches)
if(M.client)
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=[usr.UID()];priv_msg=[src.client.ckey]'>[key_name_admin(src)]</A> has the same [matches] as <A href='?src=[usr.UID()];priv_msg=[M.client.ckey]'>[key_name_admin(M)]</A>.</font>", 1)
message_admins("<font color='red'><B>Notice: </B><font color='#EB4E00'><A href='?src=[usr.UID()];priv_msg=[src.client.ckey]'>[key_name_admin(src)]</A> has the same [matches] as <A href='?src=[usr.UID()];priv_msg=[M.client.ckey]'>[key_name_admin(M)]</A>.</font>", 1)
log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)].")
else
message_admins("<font color='red'><B>Notice: </B><font color='blue'><A href='?src=[usr.UID()];priv_msg=[src.client.ckey]'>[key_name_admin(src)]</A> has the same [matches] as [key_name_admin(M)] (no longer logged in). </font>", 1)
message_admins("<font color='red'><B>Notice: </B><font color='#EB4E00'><A href='?src=[usr.UID()];priv_msg=[src.client.ckey]'>[key_name_admin(src)]</A> has the same [matches] as [key_name_admin(M)] (no longer logged in). </font>", 1)
log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).")
/mob/Login()
+1 -1
View File
@@ -172,7 +172,7 @@
if(alert(src,"Are you sure you wish to observe? You cannot normally join the round after doing this!","Player Setup","Yes","No") == "Yes")
if(!client)
return 1
var/mob/dead/observer/observer = new()
var/mob/dead/observer/observer = new(src)
src << browse(null, "window=playersetup")
spawning = 1
stop_sound_channel(CHANNEL_LOBBYMUSIC)
@@ -80,6 +80,7 @@
/datum/job/chaplain,
/datum/job/ntnavyofficer,
/datum/job/ntspecops,
/datum/job/ntspecops/solgovspecops,
/datum/job/civilian,
/datum/job/syndicateofficer
)
+14 -1
View File
@@ -730,7 +730,20 @@
return
if(moveable && default_unfasten_wrench(user, I, time = 20))
return
if(user.drop_item())
if(istype(I, /obj/item/scalpel/supermatter))
var/obj/item/scalpel/supermatter/scalpel = I
to_chat(user, "<span class='notice'>You carefully begin to scrape [src] with [I]...</span>")
if(I.use_tool(src, user, 10 SECONDS, volume = 100))
if(scalpel.uses_left)
to_chat(user, "<span class='danger'>You extract a sliver from [src], and it begins to react violently!</span>")
new /obj/item/nuke_core/supermatter_sliver(drop_location())
matter_power += 800
scalpel.uses_left--
if(!scalpel.uses_left)
to_chat(user, "<span class='boldwarning'>A tiny piece of [I] falls off, rendering it useless!</span>")
else
to_chat(user, "<span class='warning'>You fail to extract a sliver from [src]! [I] isn't sharp enough anymore.</span>")
else if(user.drop_item())
user.visible_message("<span class='danger'>As [user] touches [src] with \a [I], silence fills the room...</span>",\
"<span class='userdanger'>You touch [src] with [I], and everything suddenly goes silent.</span>\n<span class='notice'>[I] flashes into dust as you flinch away from [src].</span>",\
"<span class='italics'>Everything suddenly goes silent.</span>")
@@ -79,7 +79,7 @@
//Saber SMG//
/obj/item/gun/projectile/automatic/proto
name = "\improper Nanotrasen Saber SMG"
desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors."
desc = "A rejected prototype three-round burst 9mm submachine gun, designated 'SABR'. Surplus of this model are bouncing around armories of Nanotrasen Space Stations. Has a threaded barrel for suppressors."
icon_state = "saber"
mag_type = /obj/item/ammo_box/magazine/smgm9mm
origin_tech = "combat=4;materials=2"
@@ -133,7 +133,6 @@
color = "#A8A8A8" // rgb: 168, 168, 168
taste_description = "a CPU"
/datum/reagent/copper
name = "Copper"
id = "copper"
@@ -141,6 +140,13 @@
color = "#6E3B08" // rgb: 110, 59, 8
taste_description = "copper"
/datum/reagent/copper/reaction_obj(obj/O, volume)
if(istype(O, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
volume = round(min(volume, M.amount), 1)
new /obj/item/stack/tile/brass(get_turf(M), volume)
M.use(volume)
/datum/reagent/chromium
name = "Chromium"
id = "chromium"
@@ -78,6 +78,8 @@
for(var/atom/T in get_turf(D))
D.reagents.reaction(T)
sleep(3)
if(QDELETED(D))
return
qdel(D)
+1 -1
View File
@@ -858,7 +858,7 @@
next_request = world.time + 60 SECONDS //1 minute cooldown
to_chat(usr, "<span class='notice'>Your request has been recieved by Centcom.</span>")
log_admin("[key_name(usr)] requested to move the transport ferry to Centcom.")
message_admins("<b>FERRY: <font color='blue'>[key_name_admin(usr)] (<A HREF='?_src_=holder;secretsfun=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to Centcom.</font>")
message_admins("<b>FERRY: <font color='#EB4E00'>[key_name_admin(usr)] (<A HREF='?_src_=holder;secretsfun=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to Centcom.</font>")
return TRUE
+3 -5
View File
@@ -1,7 +1,6 @@
GLOBAL_LIST_EMPTY(GPS_list)
#define EMP_DISABLE_TIME 30 SECONDS
#define POS_VECTOR(A) list(A.x, A.y, A.z)
/**
* # GPS
@@ -83,11 +82,11 @@ GLOBAL_LIST_EMPTY(GPS_list)
return data
var/turf/T = get_turf(src)
data["area"] = get_area_name(src, TRUE)
data["position"] = POS_VECTOR(T)
data["position"] = ATOM_COORDS(T)
// Saved location
if(locked_location)
data["saved"] = POS_VECTOR(locked_location)
data["saved"] = ATOM_COORDS(locked_location)
else
data["saved"] = null
@@ -104,7 +103,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/list/signal = list("tag" = G.gpstag, "area" = null, "position" = null)
if(!G.emped)
signal["area"] = get_area_name(G, TRUE)
signal["position"] = POS_VECTOR(GT)
signal["position"] = ATOM_COORDS(GT)
signals += list(signal)
data["signals"] = signals
@@ -219,4 +218,3 @@ GLOBAL_LIST_EMPTY(GPS_list)
. = ..()
#undef EMP_DISABLE_TIME
#undef POS_VECTOR
-1
View File
@@ -97,4 +97,3 @@
trigger_armed_response_team(D, commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots)
else
return FALSE
@@ -2,6 +2,8 @@
#define WORLD_TOPIC_LOCKOUT_TIME 1 MINUTES
/datum/world_topic_spam_prevention_handler
/// IP. Used purely for select purposes.
var/ip = null
/// Amount of strikes. [WORLD_TOPIC_STRIKES_THRESHOLD] strikes is a lockout of [WORLD_TOPIC_LOCKOUT_TIME]
var/strikes = 0
/// Time of last request
@@ -11,6 +13,9 @@
/// Unlock time
var/unlock_time = 0
/datum/world_topic_spam_prevention_handler/New(_ip)
ip = _ip
/**
* Lockout handler
*
+1 -1
View File
@@ -21,7 +21,7 @@
var/sanitized = sanitize(input["msg"])
var/message = "<font color='red'>Discord PM from <b><a href='?discord_msg=1'>[input["sender"]]</a></b>: [sanitized]</font>"
var/amessage = "<font color='blue'>Discord PM from <a href='?discord_msg=1'>[input["sender"]]</a> to <b>[key_name_admin(C)]</b>: [sanitized]</font>"
var/amessage = "<font color='#EB4E00'>Discord PM from <a href='?discord_msg=1'>[input["sender"]]</a> to <b>[key_name_admin(C)]</b>: [sanitized]</font>"
// THESE TWO VARS DO VERY DIFFERENT THINGS. DO NOT ATTEMPT TO COMBINE THEM
C.received_discord_pm = world.time
+2 -1
View File
@@ -702,7 +702,8 @@ shutdown_on_reboot = false
#shutdown_shell_command = "taskkill /im dreamdaemon.exe /f"
# URL for the 2FA backend HTTP host. Do not use https:// or a trailing slash. Comment out to disable
#_2fa_auth_host = "http://127.0.0.1:8080"
# List of IP addresses to be ignored by the world/Topic rate limiting. Useful if you have other services
topic_ip_ratelimit_bypass = ["127.0.0.1"]
################################################################
-1
View File
@@ -48,7 +48,6 @@ Bob Johnson
Crush McStompbones
Hank Chesthair
Killing McKillingalot
Mancrush McBrorape
Rex Dudekiller VII
Seamus McTosterone
Hans Testosteroneson
Binary file not shown.

Before

Width:  |  Height:  |  Size: 932 KiB

After

Width:  |  Height:  |  Size: 935 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 509 KiB

After

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

+1
View File
@@ -853,6 +853,7 @@
#include "code\game\objects\items\mixing_bowl.dm"
#include "code\game\objects\items\random_items.dm"
#include "code\game\objects\items\shooting_range.dm"
#include "code\game\objects\items\theft_items.dm"
#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
#include "code\game\objects\items\devices\aicard.dm"
+7
View File
@@ -82,3 +82,10 @@ export const keyOfMatchingRange = (value, ranges) => {
}
}
};
/**
* Converts a value in radians to degrees.
*/
export const rad2deg = rad => {
return rad * (180 / Math.PI);
};
+41 -19
View File
@@ -1,3 +1,4 @@
import { rad2deg } from 'common/math';
import { Component, Fragment } from 'inferno';
import { useBackend, useLocalState } from '../backend';
import { Box, Button, Flex, Icon, LabeledList, Modal, Section, Tabs } from '../components';
@@ -260,7 +261,7 @@ const Contracts = (properties, context) => {
)}
</Box>
)}>
<Flex width="100%">
<Flex>
<Flex.Item grow="2" mr="0.5rem">
{contract.fluff_message}
{!!contract.completed_time && (
@@ -284,28 +285,26 @@ const Contracts = (properties, context) => {
</Box>
)}
</Flex.Item>
<Flex.Item grow="1" flexBasis="100%">
<Box mb="0.5rem" color="label">
Extraction Zone:
</Box>
<Flex.Item flexBasis="100%">
<Flex mb="0.5rem" color="label">
Extraction Zone:&nbsp;
{areaArrow(contract)}
</Flex>
{contract.difficulties?.map((difficulty, key) => (
<Fragment>
<Button.Confirm
disabled={!!contract_active}
content={difficulty.name + " (" + difficulty.reward + " TC)"}
onClick={() => act("activate", {
uid: contract.uid,
difficulty: key + 1,
})}
/>
<br />
</Fragment>
<Button.Confirm
disabled={!!contract_active}
content={difficulty.name + " (" + difficulty.reward + " TC)"}
onClick={() => act("activate", {
uid: contract.uid,
difficulty: key + 1,
})}
/>
))}
{!!contract.objective && (
<Box color="white" bold>
{contract.objective.extraction_zone}<br />
({(contract.objective.reward_tc || 0) + " TC"},&nbsp;
{(contract.objective.reward_credits || 0) + " Credits"})
{contract.objective.extraction_name}<br />
({(contract.objective.rewards.tc || 0) + " TC"},&nbsp;
{(contract.objective.rewards.credits || 0) + " Credits"})
</Box>
)}
</Flex.Item>
@@ -316,6 +315,29 @@ const Contracts = (properties, context) => {
);
};
const areaArrow = contract => {
if (!contract.objective || (contract.status > 1)) {
return;
} else {
const current_area_id = contract.objective.locs.user_area_id;
const c_coords = contract.objective.locs.user_coords;
const target_area_id = contract.objective.locs.target_area_id;
const t_coords = contract.objective.locs.target_coords;
const same_area = (current_area_id === target_area_id);
return (
<Flex.Item>
<Icon
name={same_area ? "dot-circle-o" : "arrow-alt-circle-right-o"}
color={same_area ? "green" : "yellow"}
rotation={same_area ? null : -rad2deg(Math.atan2(t_coords[1] - c_coords[1], t_coords[0] - c_coords[0]))}
lineHeight={same_area ? null : "0.85"} // Needed because it jumps upwards otherwise
size="1.5"
/>
</Flex.Item>
);
}
};
const Hub = (properties, context) => {
const { act, data } = useBackend(context);
const {
+1 -1
View File
@@ -1,3 +1,4 @@
import { rad2deg } from 'common/math';
import { Fragment } from 'inferno';
import { useBackend, useLocalState } from '../backend';
import { Box, Button, Flex, Icon, Input, LabeledList, Section, Table } from '../components';
@@ -5,7 +6,6 @@ import { Window } from '../layouts';
const vectorText = vector => vector ? "(" + vector.join(", ") + ")" : "ERROR";
const rad2deg = rad => rad * (180 / Math.PI);
const distanceToPoint = (from, to) => {
if (!from || !to) {
return;
+3 -3
View File
@@ -4431,9 +4431,9 @@ path-key@^2.0.0, path-key@^2.0.1:
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-to-regexp@0.1.7:
version "0.1.7"