Merge branch 'master' into ghost-rad-hud
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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, \
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
################################################################
|
||||
|
||||
|
||||
@@ -48,7 +48,6 @@ Bob Johnson
|
||||
Crush McStompbones
|
||||
Hank Chesthair
|
||||
Killing McKillingalot
|
||||
Mancrush McBrorape
|
||||
Rex Dudekiller VII
|
||||
Seamus McTosterone
|
||||
Hans Testosteroneson
|
||||
|
||||
|
Before Width: | Height: | Size: 932 KiB After Width: | Height: | Size: 935 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 248 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 509 KiB After Width: | Height: | Size: 506 KiB |
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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:
|
||||
{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"},
|
||||
{(contract.objective.reward_credits || 0) + " Credits"})
|
||||
{contract.objective.extraction_name}<br />
|
||||
({(contract.objective.rewards.tc || 0) + " TC"},
|
||||
{(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,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;
|
||||
|
||||
@@ -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"
|
||||
|
||||