Merge branch 'master' into holy-chapel

This commit is contained in:
warior4356
2021-06-28 20:31:34 -07:00
684 changed files with 25456 additions and 31090 deletions
+4
View File
@@ -383,6 +383,9 @@
/datum/action/item_action/hands_free/activate
name = "Activate"
/datum/action/item_action/hands_free/activate/always
check_flags = null
/datum/action/item_action/toggle_research_scanner
name = "Toggle Research Scanner"
button_icon_state = "scan_mode"
@@ -426,6 +429,7 @@
desc = "Activates the jump boot's internal propulsion system, allowing the user to dash over 4-wide gaps."
icon_icon = 'icons/mob/actions/actions.dmi'
button_icon_state = "jetboot"
use_itemicon = FALSE
///prset for organ actions
/datum/action/item_action/organ_action
+3 -3
View File
@@ -130,13 +130,13 @@
/datum/component/material_container/proc/insert_stack(obj/item/stack/S, amt, multiplier = 1)
if(isnull(amt))
amt = S.amount
amt = S.get_amount()
if(amt <= 0)
return FALSE
if(amt > S.amount)
amt = S.amount
if(amt > S.get_amount())
amt = S.get_amount()
var/material_amt = get_item_material_amount(S)
if(!material_amt)
-123
View File
@@ -5,129 +5,6 @@
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/list/locked = list()
/datum/datacore/proc/get_manifest(monochrome, OOC)
var/list/heads = new()
var/list/sec = new()
var/list/eng = new()
var/list/med = new()
var/list/sci = new()
var/list/ser = new()
var/list/sup = new()
var/list/bot = new()
var/list/misc = new()
var/list/isactive = new()
var/dat = {"
<head><style>
.manifest {border-collapse:collapse;}
.manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em}
.manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]}
.manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] }
.manifest td:first-child {text-align:right}
.manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]}
</style></head>
<table class="manifest" width='350px'>
<tr class='head'><th>Name</th><th>Rank</th><th>Activity</th></tr>
"}
var/even = 0
// sort mobs
for(var/datum/data/record/t in GLOB.data_core.general)
var/name = t.fields["name"]
var/rank = t.fields["rank"]
var/real_rank = t.fields["real_rank"]
if(OOC)
var/activetext = "Inactive"
for(var/thing in GLOB.human_list)
var/mob/living/carbon/human/H = thing
if(H.real_name != name)
continue
if(H.client && H.client.inactivity <= 6000)
activetext = "Active"
break
if(isLivingSSD(H))
activetext = "SSD"
break
isactive[name] = activetext
else
isactive[name] = t.fields["p_stat"]
var/department = 0
if(real_rank in GLOB.command_positions)
heads[name] = rank
department = 1
if(real_rank in GLOB.security_positions)
sec[name] = rank
department = 1
if(real_rank in GLOB.engineering_positions)
eng[name] = rank
department = 1
if(real_rank in GLOB.medical_positions)
med[name] = rank
department = 1
if(real_rank in GLOB.science_positions)
sci[name] = rank
department = 1
if(real_rank in GLOB.service_positions)
ser[name] = rank
department = 1
if(real_rank in GLOB.supply_positions)
sup[name] = rank
department = 1
if(real_rank in GLOB.nonhuman_positions)
bot[name] = rank
department = 1
if(!department && !(name in heads))
misc[name] = rank
if(heads.len > 0)
dat += "<tr><th colspan=3>Heads</th></tr>"
for(var/name in heads)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[heads[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sec.len > 0)
dat += "<tr><th colspan=3>Security</th></tr>"
for(var/name in sec)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sec[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(eng.len > 0)
dat += "<tr><th colspan=3>Engineering</th></tr>"
for(var/name in eng)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[eng[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(med.len > 0)
dat += "<tr><th colspan=3>Medical</th></tr>"
for(var/name in med)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[med[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sci.len > 0)
dat += "<tr><th colspan=3>Science</th></tr>"
for(var/name in sci)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sci[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(ser.len > 0)
dat += "<tr><th colspan=3>Service</th></tr>"
for(var/name in ser)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[ser[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(sup.len > 0)
dat += "<tr><th colspan=3>Supply</th></tr>"
for(var/name in sup)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[sup[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(bot.len > 0)
dat += "<tr><th colspan=3>Silicon</th></tr>"
for(var/name in bot)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[bot[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
if(misc.len > 0)
dat += "<tr><th colspan=3>Miscellaneous</th></tr>"
for(var/name in misc)
dat += "<tr[even ? " class='alt'" : ""]><td>[name]</td><td>[misc[name]]</td><td>[isactive[name]]</td></tr>"
even = !even
dat += "</table>"
dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
dat = replacetext(dat, "\t", "")
return dat
/*
We can't just insert in HTML into the TGUI so we need the raw data to play with.
Instead of creating this list over and over when someone leaves their PDA open to the page
@@ -31,6 +31,8 @@ BONUS
to_chat(M, "<span class='warning'>[pick("Your scalp itches.", "Your skin feels flakey.")]</span>")
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(NO_HAIR in H.dna.species.species_traits)
return // Hair can't fall out if you don't have any
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
switch(A.stage)
if(3, 4)
+41
View File
@@ -124,6 +124,10 @@
name = "Pyromancer REAL_NAME"
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "ONI SOMA!")
/datum/dog_fashion/head/black_wizard
name = "Necromancer REAL_NAME"
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
/datum/dog_fashion/head/cardborg
name = "Borgi"
speak = list("Ping!","Beep!","Woof!")
@@ -148,6 +152,8 @@
name = "Corgi Tech REAL_NAME"
desc = "The reason your yellow gloves have chew-marks."
/datum/dog_fashion/head/softcap
/datum/dog_fashion/head/reindeer
name = "REAL_NAME the red-nosed Corgi"
emote_hear = list("lights the way!", "illuminates.", "yaps!")
@@ -208,3 +214,38 @@
/datum/dog_fashion/head/fried_vox_empty
name = "Colonel REAL_NAME"
desc = "Keep away from live vox."
/datum/dog_fashion/head/HoS
name = "Head of Security REAL_NAME"
desc = "Probably better than the last HoS."
/datum/dog_fashion/head/beret/sec
name = "Officer REAL_NAME"
desc = "Ever-loyal, ever-vigilant."
/datum/dog_fashion/head/bowlerhat
name = "REAL_NAME"
desc = "A sophisticated city gent."
/datum/dog_fashion/head/surgery
name = "Nurse-in-Training REAL_NAME"
desc = "The most adorable bed-side manner ever."
/datum/dog_fashion/head/bucket
name = "REAL_NAME"
desc = "A janitor's best friend."
/datum/dog_fashion/head/justice_wig
name = "Arbiter REAL_NAME"
desc = "Head of the High Court of Cute."
/datum/dog_fashion/head/wizard/magus
name = "Battlemage REAL_NAME"
/datum/dog_fashion/head/wizard/marisa
name = "Witch REAL_NAME"
desc = "Flying broom not included."
/datum/dog_fashion/head/roman
name = "Imperator REAL_NAME"
desc = "For the Senate and the people of Rome!"
@@ -47,7 +47,7 @@
/datum/construction/proc/custom_action(step, used_atom, user)
if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.amount<4)
if(C.get_amount() < 4)
to_chat(user, ("<span class='warning'>There's not enough cable to finish the task.</span>"))
return 0
else
@@ -55,7 +55,7 @@
playsound(holder, C.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack))
var/obj/item/stack/S = used_atom
if(S.amount < 5)
if(S.get_amount() < 5)
to_chat(user, ("<span class='warning'>There's not enough material in this stack.</span>"))
return 0
else
@@ -113,7 +113,7 @@
// STACKS
if(istype(used_atom,/obj/item/stack))
var/obj/item/stack/stack=used_atom
if(stack.amount < amount)
if(stack.get_amount() < amount)
to_chat(user, "<span class='warning'>You don't have enough [stack]! You need at least [amount].</span>")
return 0
stack.use(amount)
+7 -3
View File
@@ -31,6 +31,8 @@
var/falloff_exponent
var/muted = TRUE
var/falloff_distance
/// Channel of the audio, random otherwise
var/channel
/datum/looping_sound/New(list/_output_atoms = list(), start_immediately = FALSE, _direct = FALSE)
if(!mid_sounds)
@@ -75,14 +77,16 @@
var/list/atoms_cache = output_atoms
var/sound/S = sound(soundfile)
if(direct)
S.channel = SSsounds.random_available_channel()
S.volume = volume
S.channel = channel || SSsounds.random_available_channel()
for(var/i in 1 to atoms_cache.len)
var/atom/thing = atoms_cache[i]
if(direct)
if(ismob(thing))
var/mob/M = thing
S.volume = volume * (USER_VOLUME(M, channel) || 1)
SEND_SOUND(thing, S)
else
playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance)
playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance, channel = channel)
/datum/looping_sound/proc/get_sound(looped, _mid_sounds)
if(!_mid_sounds)
@@ -16,3 +16,4 @@
falloff_exponent = 10
falloff_distance = 5
vary = TRUE
channel = CHANNEL_ENGINE
+12 -38
View File
@@ -1375,46 +1375,20 @@
switch(href_list["silicon"])
if("unemag")
var/mob/living/silicon/robot/R = current
if(istype(R))
R.emagged = 0
if(R.module)
if(R.activated(R.module.emag))
R.module_active = null
if(R.module_state_1 == R.module.emag)
R.module_state_1 = null
R.contents -= R.module.emag
else if(R.module_state_2 == R.module.emag)
R.module_state_2 = null
R.contents -= R.module.emag
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
R.clear_supplied_laws()
R.laws = new /datum/ai_laws/crewsimov
log_admin("[key_name(usr)] has un-emagged [key_name(current)]")
message_admins("[key_name_admin(usr)] has un-emagged [key_name_admin(current)]")
if(!istype(R))
return
R.unemag()
log_admin("[key_name(usr)] has un-emagged [key_name(current)]")
message_admins("[key_name_admin(usr)] has un-emagged [key_name_admin(current)]")
if("unemagcyborgs")
if(isAI(current))
var/mob/living/silicon/ai/ai = current
for(var/mob/living/silicon/robot/R in ai.connected_robots)
R.emagged = 0
if(R.module)
if(R.activated(R.module.emag))
R.module_active = null
if(R.module_state_1 == R.module.emag)
R.module_state_1 = null
R.contents -= R.module.emag
else if(R.module_state_2 == R.module.emag)
R.module_state_2 = null
R.contents -= R.module.emag
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
R.clear_supplied_laws()
R.laws = new /datum/ai_laws/crewsimov
log_admin("[key_name(usr)] has unemagged [key_name(ai)]'s cyborgs")
message_admins("[key_name_admin(usr)] has unemagged [key_name_admin(ai)]'s cyborgs")
if(!isAI(current))
return
var/mob/living/silicon/ai/ai = current
for(var/mob/living/silicon/robot/R in ai.connected_robots)
R.unemag()
log_admin("[key_name(usr)] has unemagged [key_name(ai)]'s cyborgs")
message_admins("[key_name_admin(usr)] has unemagged [key_name_admin(ai)]'s cyborgs")
else if(href_list["common"])
switch(href_list["common"])
+2
View File
@@ -111,6 +111,8 @@
for(var/path in backpack_contents)
var/number = backpack_contents[path]
if(!number)
number = 1
for(var/i in 1 to number)
H.equip_or_collect(new path(H), slot_in_backpack)
+85 -20
View File
@@ -3,7 +3,7 @@
/datum/outfit/admin/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(!visualsOnly)
if(!visualsOnly && H.mind)
H.mind.assigned_role = name
H.job = name
@@ -627,6 +627,10 @@
/obj/item/implanter/death_alarm = 1,
)
implants = list(/obj/item/implant/mindshield,
/obj/item/implant/death_alarm
)
/datum/outfit/admin/solgov_rep/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
@@ -634,33 +638,44 @@
var/obj/item/card/id/I = H.wear_id
if(istype(I))
apply_to_card(I, H, get_all_accesses(), name, "lifetimeid")
apply_to_card(I, H, get_all_centcom_access(), name, "lifetimeid")
I.assignment = "Solar Federation Representative"
H.sec_hud_set_ID()
/datum/outfit/admin/solgov
name = "Solar Federation Marine"
uniform = /obj/item/clothing/under/solgov
suit = /obj/item/clothing/suit/armor/bulletproof
back = /obj/item/storage/backpack/security
belt = /obj/item/storage/belt/military/assault
head = /obj/item/clothing/head/soft/solgov
glasses = /obj/item/clothing/glasses/hud/security/night
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
id = /obj/item/card/id
l_hand = /obj/item/gun/projectile/automatic/ar
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
backpack_contents = list(
/obj/item/storage/box/responseteam = 1,
/obj/item/ammo_box/magazine/m556 = 3,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/gun/projectile/automatic/pistol/m1911 = 1,
/obj/item/ammo_box/magazine/m45 = 2
/obj/item/whetstone = 1,
/obj/item/clothing/mask/gas/explorer/marines = 1,
/obj/item/reagent_containers/hypospray/autoinjector/survival = 1
)
var/is_tsf_lieutenant = FALSE
cybernetic_implants = list(
/obj/item/organ/internal/cyberimp/arm/flash,
/obj/item/organ/internal/cyberimp/chest/nutriment,
/obj/item/organ/internal/cyberimp/eyes/hud/security
)
implants = list(/obj/item/implant/mindshield,
/obj/item/implant/death_alarm
)
var/is_solgov_lieutenant = FALSE
/datum/outfit/admin/solgov/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -668,31 +683,80 @@
if(visualsOnly)
return
if(is_tsf_lieutenant)
if(is_solgov_lieutenant)
H.real_name = "Lieutenant [pick(GLOB.last_names)]"
else
H.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(GLOB.last_names)]"
H.name = H.real_name
var/obj/item/card/id/I = H.wear_id
if(istype(I))
apply_to_card(I, H, get_all_accesses(), name, "lifetimeid")
I.assignment = name
if(istype(I) && is_solgov_lieutenant)
apply_to_card(I, H, get_centcom_access("Emergency Response Team Leader"), name, "lifetimeid")
else if(istype(I))
apply_to_card(I, H, get_centcom_access("Emergency Response Team Member"), name, "lifetimeid")
H.sec_hud_set_ID()
/datum/outfit/admin/solgov/lieutenant
name = "Solar Federation Lieutenant"
uniform = /obj/item/clothing/under/solgov/command
head = /obj/item/clothing/head/soft/solgov/command
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_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/melee/classic_baton/telescopic = 1,
/obj/item/storage/box/handcuffs = 1,
/obj/item/clothing/shoes/magboots/advance = 1,
/obj/item/gun/projectile/automatic/pistol/deagle = 1,
/obj/item/ammo_box/magazine/m50 = 2
/obj/item/reagent_containers/hypospray/autoinjector/survival = 1,
/obj/item/clothing/mask/gas/explorer/marines = 1,
/obj/item/ammo_box/magazine/m50 = 3
)
is_tsf_lieutenant = TRUE
is_solgov_lieutenant = TRUE
/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
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(
/obj/item/organ/internal/cyberimp/eyes/hud/security,
/obj/item/organ/internal/cyberimp/chest/nutriment,
/obj/item/organ/internal/cyberimp/brain/anti_stun/hardened,
/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
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
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
)
is_solgov_lieutenant = TRUE
/datum/outfit/admin/sol_trader
name = "Sol Trader"
@@ -720,6 +784,7 @@
var/obj/item/card/id/I = H.wear_id
if(istype(I))
apply_to_card(I, H, list(ACCESS_TRADE_SOL, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS), name)
H.sec_hud_set_ID()
/datum/outfit/admin/chrono
name = "Chrono Legionnaire"
-8
View File
@@ -51,14 +51,6 @@
cost = 20
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/syndicate_base
name = "Syndicate Lava Base"
id = "lava-base"
description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents."
suffix = "lavaland_surface_syndicate_base1.dmm"
cost = 20
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/free_golem
name = "Free Golem Ship"
id = "golem-ship"
+9
View File
@@ -258,6 +258,15 @@
always_place = TRUE
cost = 0
/datum/map_template/ruin/space/syndicate_space_base
name = "Syndicate Space Base"
id = "syndie-space-base"
description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents."
suffix = "syndie_space_base.dmm"
cost = 0
always_place = TRUE
allow_duplicates = FALSE
/datum/map_template/ruin/space/syndiecakesfactory
id = "Syndiecakes Factory"
suffix = "syndiecakesfactory.dmm"
+1 -1
View File
@@ -11,7 +11,7 @@
/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1, mob/living/user = usr)
var/thearea = before_cast(targets)
if(!thearea || !cast_check(TRUE, FALSE, user))
if(!thearea || !cast_check(FALSE, FALSE, user))
revert_cast()
return
invocation(thearea)
+8 -3
View File
@@ -52,7 +52,7 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone
name = "Summon Soulstone"
desc = "This spell reaches into Nar'Sie's realm, summoning one of the legendary fragments across time and space"
desc = "This spell reaches into Redspace, summoning one of the legendary fragments across time and space"
action_icon_state = "summonsoulstone"
action_background_icon_state = "bg_cult"
school = "conjuration"
@@ -72,7 +72,7 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/pylon
name = "Cult Pylon"
desc = "This spell conjures a fragile crystal from Nar'Sie's realm. Makes for a convenient light source."
desc = "This spell conjures a fragile crystal from Redspace. Makes for a convenient light source."
action_icon_state = "pylon"
action_background_icon_state = "bg_cult"
school = "conjuration"
@@ -125,7 +125,12 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/do_jaunt(mob/living/target)
target.set_light(0)
..()
target.set_light(2, 3, l_color = SSticker.cultdat ? SSticker.cultdat.construct_glow : LIGHT_COLOR_BLOOD_MAGIC)
if(isconstruct(target))
var/mob/living/simple_animal/hostile/construct/C = target
if(C.holy)
C.set_light(3, 5, LIGHT_COLOR_DARK_BLUE)
else
C.set_light(2, 3, l_color = SSticker.cultdat ? SSticker.cultdat.construct_glow : LIGHT_COLOR_BLOOD_MAGIC)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc)
return
+2 -2
View File
@@ -95,7 +95,7 @@
if((ABSTRACT in item.flags) || (NODROP in item.flags))
continue
marked_item = item
to_chat(M, "<span class='warning'>You begin to focus your very being into the [item.name]...</span>")
to_chat(M, "<span class='warning'>You begin to focus your very being into [item]...</span>")
break
if(!marked_item)
@@ -104,7 +104,7 @@
spawn(50)
if(marked_item.loc != M) //I changed my mind I don't want to put my soul in a cheeseburger!
to_chat(M, "<span class='warning'>Your soul snaps back to your body as you drop the [marked_item.name]!</span>")
to_chat(M, "<span class='warning'>Your soul snaps back to your body as you drop [marked_item]!</span>")
marked_item = null
return
name = "RISE!"
+2 -2
View File
@@ -21,7 +21,7 @@
if(!usr.mind.miming)
to_chat(usr, "<span class='notice'>You must dedicate yourself to silence first.</span>")
return
invocation = "<B>[usr.real_name]</B> looks as if a wall is in front of [usr.p_them()]."
invocation = "<B>[usr.name]</B> looks as if a wall is in front of [usr.p_them()]."
else
invocation_type ="none"
..()
@@ -86,7 +86,7 @@
if(!usr.mind.miming)
to_chat(usr, "<span class='notice'>You must dedicate yourself to silence first.</span>")
return
invocation = "<B>[usr.real_name]</B> looks as if a blockade is in front of [usr.p_them()]."
invocation = "<B>[usr.name]</B> looks as if a blockade is in front of [usr.p_them()]."
else
invocation_type ="none"
..()
+4 -4
View File
@@ -80,7 +80,7 @@
var/obj/item/organ/external/part = X
if(item_to_retrieve in part.embedded_objects)
part.embedded_objects -= item_to_retrieve
to_chat(C, "<span class='warning'>The [item_to_retrieve] that was embedded in your [part] has mysteriously vanished. How fortunate!</span>")
to_chat(C, "<span class='warning'>\The [item_to_retrieve] that was embedded in your [part] has mysteriously vanished. How fortunate!</span>")
if(!C.has_embedded_objects())
C.clear_alert("embeddedobject")
break
@@ -99,7 +99,7 @@
if(!item_to_retrieve)
return
item_to_retrieve.loc.visible_message("<span class='warning'>The [item_to_retrieve.name] suddenly disappears!</span>")
item_to_retrieve.loc.visible_message("<span class='warning'>\The [item_to_retrieve] suddenly disappears!</span>")
if(target.hand) //left active hand
@@ -112,10 +112,10 @@
butterfingers = 1
if(butterfingers)
item_to_retrieve.loc = target.loc
item_to_retrieve.loc.visible_message("<span class='caution'>The [item_to_retrieve.name] suddenly appears!</span>")
item_to_retrieve.loc.visible_message("<span class='caution'>\The [item_to_retrieve] suddenly appears!</span>")
playsound(get_turf(target),'sound/magic/summonitems_generic.ogg',50,1)
else
item_to_retrieve.loc.visible_message("<span class='caution'>The [item_to_retrieve.name] suddenly appears in [target]'s hand!</span>")
item_to_retrieve.loc.visible_message("<span class='caution'>\The [item_to_retrieve] suddenly appears in [target]'s hand!</span>")
playsound(get_turf(target),'sound/magic/summonitems_generic.ogg',50,1)
if(message)
+1 -1
View File
@@ -374,7 +374,7 @@
for(var/am in thrownatoms)
var/atom/movable/AM = am
if(AM == user || AM.anchored)
if(AM == user || AM.anchored || AM.move_resist == INFINITY)
continue
throwtarget = get_edge_target_turf(user, get_dir(user, get_step_away(AM, user)))
+8
View File
@@ -935,6 +935,14 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
containername = "surgery crate"
access = ACCESS_MEDICAL
/datum/supply_packs/medical/gloves
name = "Nitrile Glove Crate"
contains = list(/obj/item/clothing/gloves/color/latex/nitrile,
/obj/item/clothing/gloves/color/latex/nitrile,
/obj/item/clothing/gloves/color/latex/nitrile,
/obj/item/clothing/gloves/color/latex/nitrile)
cost = 50
containername = "nitrile glove crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Science /////////////////////////////////////////
+26 -12
View File
@@ -1,39 +1,53 @@
/// Will our restart be slower?
GLOBAL_VAR_INIT(slower_restart, FALSE)
/proc/server_announce_global(announcement_text)
to_chat(world, "<span style='color: #ff00ff'>\[Server] [announcement_text]</span>")
/proc/server_announce_adminonly(announcement_text)
to_chat(GLOB.admins, "<span style='color: #ff00ff'>\[Server] \[Admin] [announcement_text]</span>")
/datum/tgs_event_handler/impl
var/datum/timedevent/reattach_timer
/datum/tgs_event_handler/impl/HandleEvent(event_code, ...)
switch(event_code)
if(TGS_EVENT_REBOOT_MODE_CHANGE)
var/list/reboot_mode_lookup = list ("[TGS_REBOOT_MODE_NORMAL]" = "be normal", "[TGS_REBOOT_MODE_SHUTDOWN]" = "shutdown the server", "[TGS_REBOOT_MODE_RESTART]" = "hard restart the server")
var/old_reboot_mode = args[2]
var/new_reboot_mode = args[3]
message_admins("\[Server]\[Info] Reboot will no longer [reboot_mode_lookup["[old_reboot_mode]"]], it will instead [reboot_mode_lookup["[new_reboot_mode]"]]")
if(new_reboot_mode == TGS_REBOOT_MODE_SHUTDOWN)
GLOB.slower_restart = TRUE
else
GLOB.slower_restart = FALSE
server_announce_adminonly("\[Info] Reboot will no longer [reboot_mode_lookup["[old_reboot_mode]"]], it will instead [reboot_mode_lookup["[new_reboot_mode]"]]")
if(TGS_EVENT_PORT_SWAP)
message_admins("\[Server]\[Info] Changing port from [world.port] to [args[2]]")
server_announce_adminonly("\[Info] Changing port from [world.port] to [args[2]]")
if(TGS_EVENT_INSTANCE_RENAMED)
message_admins("\[Server]\[Info] Instance renamed to from [world.TgsInstanceName()] to [args[2]]")
server_announce_adminonly("\[Info] Instance renamed to from [world.TgsInstanceName()] to [args[2]]")
if(TGS_EVENT_COMPILE_START)
message_admins("\[Server]\[Info] Code deployment started, new game version incoming next round...")
server_announce_adminonly("\[Info] Code deployment started, new game version incoming next round...")
if(TGS_EVENT_COMPILE_CANCELLED)
message_admins("\[Server]\[Warning] Code deployment cancelled!")
server_announce_adminonly("\[Warning] Code deployment cancelled! Consult a maintainer/host to see if this was intentional!")
if(TGS_EVENT_COMPILE_FAILURE)
message_admins("\[Server]\[Error] Code deployment failed! Inform a maintainer/host immediately!")
server_announce_adminonly("\[Error] Code deployment failed! Inform a maintainer/host immediately!")
if(TGS_EVENT_DEPLOYMENT_COMPLETE)
message_admins("\[Server]\[Info] Code deployment complete!")
to_chat(world, "<span class='boldannounce'>Server updated, changes will be applied on the next round...</span>")
server_announce_adminonly("\[Info] Code deployment complete!")
server_announce_global("Server update complete. Changes will be applied on the next round.")
if(TGS_EVENT_WATCHDOG_DETACH)
message_admins("\[Server]\[Info] Server manager restarting...")
server_announce_adminonly("\[Info] Server manager restarting...")
reattach_timer = addtimer(CALLBACK(src, .proc/LateOnReattach), 1 MINUTES, TIMER_STOPPABLE)
if(TGS_EVENT_WATCHDOG_REATTACH)
var/datum/tgs_version/old_version = world.TgsVersion()
var/datum/tgs_version/new_version = args[2]
if(!old_version.Equals(new_version))
message_admins("\[Server]\[Info] Manager back online. TGS has been updated to v[new_version.deprefixed_parameter]")
server_announce_adminonly("\[Info] Server manager back online. TGS has been updated to v[new_version.deprefixed_parameter]")
else
message_admins("\[Server]\[Info] Manager back online")
server_announce_adminonly("\[Info] Server manager back online")
if(reattach_timer)
deltimer(reattach_timer)
reattach_timer = null
/datum/tgs_event_handler/impl/proc/LateOnReattach()
message_admins("\[Server]\[Warning] TGS hasn't notified us of it coming back for a full minute! Is there a problem?")
server_announce_adminonly("\[Warning] TGS hasn't notified us of it coming back for a full minute! Is there a problem?")
+10 -1
View File
@@ -864,6 +864,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "CQC"
item = /obj/item/CQC_manual
cost = 13
cant_discount = TRUE
/datum/uplink_item/stealthy_weapons/cameraflash
name = "Camera Flash"
@@ -952,6 +953,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/toy/carpplushie/dehy_carp
cost = 2
/datum/uplink_item/stealthy_weapons/combat_plus
name = "Combat Gloves Plus"
desc = "Combat gloves with installed nanochips that teach you Krav Maga when worn, great as a cheap backup weapon. Warning, the nanochips will override any other fighting styles such as CQC."
reference = "CGP"
item = /obj/item/clothing/gloves/color/black/krav_maga/combat
cost = 5
gamemodes = list(/datum/game_mode/nuclear)
// GRENADES AND EXPLOSIVES
/datum/uplink_item/explosives
@@ -1417,7 +1426,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Power Sink"
desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. Ordering this sends you a small beacon that will teleport the power sink to your location on activation."
reference = "PS"
item = /obj/item/powersink
item = /obj/item/radio/beacon/syndicate/power_sink
cost = 10
/datum/uplink_item/device_tools/singularity_beacon
+4 -5
View File
@@ -209,7 +209,7 @@
/**
* Proc called to determine if the user can see wire define information, such as "Contraband", "Door Bolts", etc.
*
* If the user is an admin, or has a multitool which reveals wire information in their active hand, the proc returns TRUE.
* If the user is an admin, or has an item which reveals wire information in their active hand, the proc returns TRUE.
*
* Arguments:
* * user - the mob who is interacting with the wires.
@@ -217,10 +217,9 @@
/datum/wires/proc/can_see_wire_info(mob/user)
if(user.can_admin_interact())
return TRUE
else if(istype(user.get_active_hand(), /obj/item/multitool))
var/obj/item/multitool/M = user.get_active_hand()
if(M.shows_wire_information)
return TRUE
var/obj/item/held_item = user.get_active_hand()
if(istype(held_item) && HAS_TRAIT(held_item, TRAIT_SHOW_WIRE_INFO))
return TRUE
return FALSE
/**