Hard upstream sync (#6951)

* maps - none of our changes included yet i'll get them in after i finish up the rest of the sync

* sync part 1 - underscore folders in code

* controllers folder

* datums folder

* game folder

* cmon, work

* modules - admin to awaymissions

* cargo to events

* fields to lighting

* mapping > ruins

* rest of the code folder

* rest of the folders in the root directory

* DME

* fixes compiling errors. it compiles so it works

* readds map changes

* fixes dogborg module select

* fixes typo in moduleselect_alternate_icon filepath
This commit is contained in:
deathride58
2018-05-31 23:03:18 +00:00
committed by kevinz000
parent b6e608cb4c
commit 2f9e3e403d
395 changed files with 134016 additions and 26287 deletions
+23 -20
View File
@@ -1,47 +1,50 @@
/mob/living/carbon/human/virtual_reality
var/mob/living/carbon/human/real_me //The human controlling us, can be any human (including virtual ones... inception...)
var/datum/mind/real_mind // where is my mind t. pixies
var/obj/machinery/vr_sleeper/vr_sleeper
var/datum/action/quit_vr/quit_action
/mob/living/carbon/human/virtual_reality/Initialize()
. = ..()
quit_action = new()
quit_action.Grant(src)
/mob/living/carbon/human/virtual_reality/death()
revert_to_reality()
..()
/mob/living/carbon/human/virtual_reality/Destroy()
revert_to_reality()
return ..()
/mob/living/carbon/human/virtual_reality/Life()
. = ..()
if(real_mind)
var/mob/living/real_me = real_mind.current
if (real_me && real_me.stat == CONSCIOUS)
return
revert_to_reality(FALSE)
/mob/living/carbon/human/virtual_reality/ghostize()
stack_trace("Ghostize was called on a virtual reality mob")
/mob/living/carbon/human/virtual_reality/ghost()
set category = "OOC"
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
var/mob/living/carbon/human/H = real_me
revert_to_reality(FALSE, FALSE)
if(H)
H.ghost()
revert_to_reality(FALSE)
/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(refcleanup = TRUE, deathchecks = TRUE)
if(real_me && mind)
mind.transfer_to(real_me)
if(deathchecks && vr_sleeper && vr_sleeper.you_die_in_the_game_you_die_for_real)
real_me.death(0)
if(refcleanup)
/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(deathchecks = TRUE)
if(real_mind && mind)
real_mind.current.ckey = ckey
real_mind.current.stop_sound_channel(CHANNEL_HEARTBEAT)
if(deathchecks && vr_sleeper)
if(vr_sleeper.you_die_in_the_game_you_die_for_real)
to_chat(real_mind, "<span class='warning'>You feel everything fading away...</span>")
real_mind.current.death(0)
if(deathchecks && vr_sleeper)
vr_sleeper.vr_human = null
vr_sleeper = null
real_me = null
real_mind = null
/datum/action/quit_vr
name = "Quit Virtual Reality"
@@ -52,6 +55,6 @@
if(..())
if(istype(owner, /mob/living/carbon/human/virtual_reality))
var/mob/living/carbon/human/virtual_reality/VR = owner
VR.revert_to_reality(FALSE, FALSE)
VR.revert_to_reality(FALSE)
else
Remove(owner)
+92 -50
View File
@@ -10,33 +10,32 @@
state_open = TRUE
anchored = TRUE
occupant_typecache = list(/mob/living/carbon/human) // turned into typecache in Initialize
circuit = /obj/item/circuitboard/machine/vr_sleeper
var/you_die_in_the_game_you_die_for_real = FALSE
var/datum/effect_system/spark_spread/sparks
var/mob/living/carbon/human/virtual_reality/vr_human
var/static/list/available_vr_spawnpoints
var/vr_category = "default" //Specific category of spawn points to pick from
var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games
var/outfit = /datum/outfit/vr_basic
var/only_current_user_can_interact = FALSE
/obj/machinery/vr_sleeper/Initialize()
. = ..()
sparks = new /datum/effect_system/spark_spread()
sparks.set_up(2,0)
sparks.attach(src)
build_spawnpoints()
update_icon()
/obj/machinery/vr_sleeper/attack_hand(mob/user)
. = ..()
if(.)
/obj/machinery/vr_sleeper/attackby(obj/item/I, mob/user, params)
if(!state_open && !occupant)
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I))
return
if(default_change_direction_wrench(user, I))
return
if(occupant)
ui_interact(user)
else
if(state_open)
close_machine()
else
open_machine()
if(default_pry_open(I))
return
if(default_deconstruction_crowbar(I))
return
return ..()
/obj/machinery/vr_sleeper/relaymove(mob/user)
open_machine()
@@ -50,12 +49,18 @@
QDEL_NULL(sparks)
return ..()
/obj/machinery/vr_sleeper/hugbox
desc = "A sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds. Seems slightly more secure."
flags_1 = NODECONSTRUCT_1
only_current_user_can_interact = TRUE
/obj/machinery/vr_sleeper/hugbox/emag_act(mob/user)
return
/obj/machinery/vr_sleeper/emag_act(mob/user)
you_die_in_the_game_you_die_for_real = TRUE
sparks.start()
addtimer(CALLBACK(src, .proc/emagNotify), 150)
/obj/machinery/vr_sleeper/update_icon()
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
@@ -63,15 +68,15 @@
/obj/machinery/vr_sleeper/open_machine()
if(!state_open)
if(vr_human)
vr_human.revert_to_reality(FALSE, FALSE)
vr_human.revert_to_reality(FALSE)
if(occupant)
SStgui.close_user_uis(occupant, src)
..()
/obj/machinery/vr_sleeper/close_machine()
..()
if(occupant)
ui_interact(occupant)
/obj/machinery/vr_sleeper/MouseDrop_T(mob/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
return
close_machine(target)
/obj/machinery/vr_sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
@@ -85,20 +90,21 @@
switch(action)
if("vr_connect")
var/mob/living/carbon/human/human_occupant = occupant
if(human_occupant && human_occupant.mind)
if(human_occupant && human_occupant.mind && usr == occupant)
to_chat(occupant, "<span class='warning'>Transferring to virtual reality...</span>")
if(vr_human)
vr_human.revert_to_reality(FALSE, FALSE)
human_occupant.mind.transfer_to(vr_human)
vr_human.real_me = occupant
if(vr_human && vr_human.stat == CONSCIOUS && !vr_human.real_mind)
SStgui.close_user_uis(occupant, src)
vr_human.real_mind = human_occupant.mind
vr_human.ckey = human_occupant.ckey
to_chat(vr_human, "<span class='notice'>Transfer successful! you are now playing as [vr_human] in VR!</span>")
SStgui.close_user_uis(vr_human, src)
else
if(allow_creating_vr_humans)
to_chat(occupant, "<span class='warning'>Virtual avatar not found, attempting to create one...</span>")
var/turf/T = get_vr_spawnpoint()
var/obj/effect/landmark/vr_spawn/V = get_vr_spawnpoint()
var/turf/T = get_turf(V)
if(T)
build_virtual_human(occupant, T)
SStgui.close_user_uis(occupant, src)
build_virtual_human(occupant, T, V.vr_outfit)
to_chat(vr_human, "<span class='notice'>Transfer successful! you are now playing as [vr_human] in VR!</span>")
else
to_chat(occupant, "<span class='warning'>Virtual world misconfigured, aborting transfer</span>")
@@ -108,14 +114,14 @@
if("delete_avatar")
if(!occupant || usr == occupant)
if(vr_human)
qdel(vr_human)
cleanup_vr_human()
else
to_chat(usr, "<span class='warning'>The VR Sleeper's safeties prevent you from doing that.</span>")
. = TRUE
if("toggle_open")
if(state_open)
close_machine()
else
else if ((!occupant || usr == occupant) || !only_current_user_can_interact)
open_machine()
. = TRUE
@@ -124,58 +130,70 @@
if(vr_human && !QDELETED(vr_human))
data["can_delete_avatar"] = TRUE
var/status
switch(user.stat)
switch(vr_human.stat)
if(CONSCIOUS)
status = "Conscious"
if(DEAD)
status = "Dead"
if(UNCONSCIOUS)
status = "Unconscious"
if(SOFT_CRIT)
status = "Barely Conscious"
data["vr_avatar"] = list("name" = vr_human.name, "status" = status, "health" = vr_human.health, "maxhealth" = vr_human.maxHealth)
data["toggle_open"] = state_open
data["emagged"] = you_die_in_the_game_you_die_for_real
data["isoccupant"] = (user == occupant)
return data
/obj/machinery/vr_sleeper/proc/get_vr_spawnpoint() //proc so it can be overriden for team games or something
return safepick(available_vr_spawnpoints[vr_category])
return safepick(GLOB.vr_spawnpoints[vr_category])
/obj/machinery/vr_sleeper/proc/build_spawnpoints(rebuild = FALSE)
if (rebuild)
available_vr_spawnpoints = null
if(!available_vr_spawnpoints || !available_vr_spawnpoints.len) //(re)build spawnpoint lists
available_vr_spawnpoints = list()
for(var/obj/effect/landmark/vr_spawn/V in GLOB.landmarks_list)
available_vr_spawnpoints[V.vr_category] = list()
var/turf/T = get_turf(V)
if(T)
available_vr_spawnpoints[V.vr_category] |= T
/obj/machinery/vr_sleeper/proc/build_spawnpoints() // used to rebuild the list for admins if need be
GLOB.vr_spawnpoints = list()
for(var/obj/effect/landmark/vr_spawn/V in GLOB.landmarks_list)
GLOB.vr_spawnpoints[V.vr_category] = V
/obj/machinery/vr_sleeper/proc/build_virtual_human(mob/living/carbon/human/H, location, transfer = TRUE)
/obj/machinery/vr_sleeper/proc/build_virtual_human(mob/living/carbon/human/H, location, var/datum/outfit/outfit, transfer = TRUE)
if(H)
cleanup_vr_human()
vr_human = new /mob/living/carbon/human/virtual_reality(location)
vr_human.mind_initialize()
vr_human.vr_sleeper = src
vr_human.real_me = H
vr_human.real_mind = H.mind
H.dna.transfer_identity(vr_human)
vr_human.name = H.name
vr_human.real_name = H.real_name
vr_human.socks = H.socks
vr_human.undershirt = H.undershirt
vr_human.underwear = H.underwear
vr_human.updateappearance(1,1,1)
vr_human.updateappearance(TRUE, TRUE, TRUE)
if(outfit)
var/datum/outfit/O = new outfit()
O.equip(vr_human)
if(transfer && H.mind)
H.mind.transfer_to(vr_human)
SStgui.close_user_uis(H, src)
vr_human.ckey = H.ckey
/obj/machinery/vr_sleeper/proc/cleanup_vr_human()
if(vr_human)
vr_human.death(FALSE)
vr_human.vr_sleeper = null // Prevents race condition where a new human could get created out of order and set to null.
QDEL_NULL(vr_human)
/obj/machinery/vr_sleeper/proc/emagNotify()
if(vr_human)
vr_human.Dizzy(10)
/obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint()
var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc.
var/vr_outfit = /datum/outfit/vr
/obj/effect/landmark/vr_spawn/Initialize()
. = ..()
LAZYADD(GLOB.vr_spawnpoints[vr_category], src)
/obj/effect/landmark/vr_spawn/Destroy()
LAZYREMOVE(GLOB.vr_spawnpoints[vr_category], src)
return ..()
/obj/effect/landmark/vr_spawn/team_1
vr_category = "team_1"
@@ -183,7 +201,31 @@
/obj/effect/landmark/vr_spawn/team_2
vr_category = "team_2"
/datum/outfit/vr_basic
name = "basic vr"
uniform = /obj/item/clothing/under/color/random
shoes = /obj/item/clothing/shoes/sneakers/black
/obj/effect/landmark/vr_spawn/admin
vr_category = "event"
/obj/effect/landmark/vr_spawn/syndicate // Multiple missions will use syndicate gear
vr_outfit = /datum/outfit/vr/syndicate
/obj/effect/vr_clean_master // Will keep VR areas that have this relatively clean.
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
color = "#00FF00"
invisibility = INVISIBILITY_ABSTRACT
var/area/vr_area
/obj/effect/vr_clean_master/Initialize()
. = ..()
vr_area = get_area(src)
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
/obj/effect/vr_clean_master/proc/clean_up()
if (vr_area)
for (var/obj/item/ammo_casing/casing in vr_area)
qdel(casing)
for(var/obj/effect/decal/cleanable/C in vr_area)
qdel(C)
for (var/mob/living/carbon/human/virtual_reality/H in vr_area)
if (H.stat == DEAD && !H.vr_sleeper && !H.real_mind)
qdel(H)
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
+1 -1
View File
@@ -645,7 +645,7 @@
T.ChangeTurf(chosen)
else
var/atom/A = new chosen(usr.loc)
A.admin_spawned = TRUE
A.flags_1 |= ADMIN_SPAWNED_1
log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -258,7 +258,7 @@ GLOBAL_PROTECT(protected_ranks)
for(var/A in GLOB.admin_datums + GLOB.deadmins)
if(A == "[J]") //this admin was already loaded from txt override
continue
new /datum/admins(ckeyEx(rank_names[json["admins"]["[J]"]]), ckey("[J]"))
new /datum/admins(rank_names[ckeyEx(json["admins"]["[J]"])], ckey("[J]"))
#ifdef TESTING
var/msg = "Admins Built:\n"
for(var/ckey in GLOB.admin_datums)
+7 -7
View File
@@ -2014,10 +2014,9 @@
var/X = offset.len > 0 ? text2num(offset[1]) : 0
var/Y = offset.len > 1 ? text2num(offset[2]) : 0
var/Z = offset.len > 2 ? text2num(offset[3]) : 0
var/tmp_dir = href_list["object_dir"]
var/obj_dir = tmp_dir ? text2num(tmp_dir) : 2
if(!obj_dir || !(obj_dir in list(1,2,4,8,5,6,9,10)))
obj_dir = 2
var/obj_dir = text2num(href_list["object_dir"])
if(obj_dir && !(obj_dir in list(1,2,4,8,5,6,9,10)))
obj_dir = null
var/obj_name = sanitize(href_list["object_name"])
@@ -2060,9 +2059,10 @@
N.name = obj_name
else
var/atom/O = new path(target)
if(O)
O.admin_spawned = TRUE
O.setDir(obj_dir)
if(!QDELETED(O))
O.flags_1 |= ADMIN_SPAWNED_1
if(obj_dir)
O.setDir(obj_dir)
if(obj_name)
O.name = obj_name
if(ismob(O))
-6
View File
@@ -8,9 +8,6 @@
if(!holder)
to_chat(src, "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>")
return
if(holder && !check_rights(R_ADMIN, TRUE))
to_chat(src, "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>")
return
if( !ismob(M) || !M.client )
return
cmd_admin_pm(M.client,null)
@@ -23,9 +20,6 @@
if(!holder)
to_chat(src, "<font color='red'>Error: Admin-PM-Panel: Only administrators may use this command.</font>")
return
if(holder && !check_rights(R_ADMIN, TRUE))
to_chat(src, "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>")
return
var/list/client/targets[0]
for(var/client/T)
if(T.mob)
+1 -1
View File
@@ -17,6 +17,6 @@ GLOBAL_VAR_INIT(terrorism, FALSE)
qdel(I)
var/obj/item/gun/energy/laser/LaserAK/AK = new(src)
if(!GLOB.terrorism)
AK.admin_spawned = TRUE //To prevent announcing
AK.flags_1 |= ADMIN_SPAWNED_1 //To prevent announcing
put_in_hands(AK)
AK.pickup(src) //For the stun shielding
+1 -1
View File
@@ -630,7 +630,7 @@ GLOBAL_PROTECT(VVpixelmovement)
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]")
log_admin("[key_name(src)] modified [original_name]'s [variable] to from [html_encode("[var_value]")] to [html_encode("[var_new]")]")
log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]")
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]"
message_admins(msg)
admin_ticket_log(O, msg)
@@ -285,7 +285,7 @@
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
/obj/item/organ/heart/gland/electric/proc/zap()
tesla_zap(owner, 4, 8000, FALSE, TRUE)
tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, 1)
/obj/item/organ/heart/gland/chem
@@ -204,6 +204,9 @@
return null
/obj/structure/blob/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(severity > 0)
if(overmind)
overmind.blob_reagent_datum.emp_reaction(src, severity)
@@ -117,6 +117,9 @@
to_chat(user, "<span class='warning'>As you unsecure [src] from the floor, you see cracks appear in its surface!</span>")
/obj/structure/destructible/clockwork/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(anchored && unanchored_icon)
anchored = FALSE
update_anchored(null, obj_integrity > max_integrity * 0.25)
@@ -203,6 +206,9 @@
toggle()
/obj/structure/destructible/clockwork/powered/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(forced_disable(TRUE))
new /obj/effect/temp_visual/emp(loc)
@@ -159,7 +159,7 @@
SSticker.mode.servants_of_ratvar -= owner
SSticker.mode.update_servant_icons_removed(owner)
if(!silent)
owner.current.visible_message("<span class='deconversion_message'>[owner] seems to have remembered [owner.p_their()] true allegiance!</span>", null, null, null, owner.current)
owner.current.visible_message("<span class='deconversion_message'>[owner.current] seems to have remembered [owner.current.p_their()] true allegiance!</span>", null, null, null, owner.current)
to_chat(owner, "<span class='userdanger'>A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.</span>")
owner.current.log_message("<font color=#BE8700>Has renounced the cult of Ratvar!</font>", INDIVIDUAL_ATTACK_LOG)
owner.special_role = null
+1 -1
View File
@@ -128,7 +128,7 @@
SSticker.mode.cult -= owner
SSticker.mode.update_cult_icons_removed(owner)
if(!silent)
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.p_their()] old faith!</span>", null, null, null, owner.current)
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith!</span>", null, null, null, owner.current)
to_chat(owner.current, "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.</span>")
owner.current.log_message("<font color=#960000>Has renounced the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client)
+1 -1
View File
@@ -387,7 +387,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
return H.reagents.has_reagent("holy water")
return 0
if(BANISH_COFFIN)
return (body && istype(body.loc, /obj/structure/closet/coffin))
return (body && istype(body.loc, /obj/structure/closet/crate/coffin))
if(BANISH_FORMALDYHIDE)
if(iscarbon(body))
var/mob/living/carbon/H = body
@@ -65,7 +65,7 @@
sword = new(H)
if(!GLOB.highlander)
sword.admin_spawned = TRUE //To prevent announcing
sword.flags_1 |= ADMIN_SPAWNED_1 //To prevent announcing
sword.pickup(H) //For the stun shielding
H.put_in_hands(sword)
@@ -7,6 +7,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
/obj/item/nuclear_challenge
name = "Declaration of War (Challenge Mode)"
icon = 'icons/obj/device.dmi'
icon_state = "gangtool-red"
item_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
@@ -396,9 +396,9 @@
return
qdel(src)
/obj/machinery/nuclearbomb/tesla_act(power, explosive)
/obj/machinery/nuclearbomb/tesla_act(power, tesla_flags)
..()
if(explosive)
if(tesla_flags & TESLA_MACHINE_EXPLOSIVE)
qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over
#define NUKERANGE 127
@@ -201,7 +201,7 @@
/datum/antagonist/rev/farewell()
if(ishuman(owner.current))
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.p_theyve()] just remembered [owner.p_their()] real allegiance!</span>", null, null, null, owner.current)
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!</span>", null, null, null, owner.current)
to_chat(owner, "<span class='userdanger'>You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...</span>")
else if(issilicon(owner.current))
owner.current.visible_message("<span class='deconversion_message'>The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.</span>", null, null, null, owner.current)
@@ -128,6 +128,9 @@
return ..() | SPAN_ROBOT
/mob/living/simple_animal/hostile/swarmer/emp_act()
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(health > 1)
adjustHealth(health-1)
else
@@ -554,6 +557,9 @@
playsound(src, 'sound/items/welder.ogg', 100, 1)
/obj/structure/swarmer/emp_act()
. = ..()
if(. & EMP_PROTECT_SELF)
return
qdel(src)
/obj/structure/swarmer/trap
@@ -98,8 +98,10 @@
icon_state = "reality"
pixel_x = -96
pixel_y = -96
grav_pull = 6
dissipate = 0
move_self = 0
consume_range = 3
grav_pull = 4
current_size = STAGE_FOUR
allowed_size = STAGE_FOUR
@@ -114,7 +114,7 @@
var/obj/item/soulstone/SS = O
if(!iscultist(user) && !iswizard(user) && !SS.usability)
to_chat(user, "<span class='danger'>An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly.</span>")
user.Dizzy(120)
user.Dizzy(30)
return
SS.transfer_soul("CONSTRUCT",src,user)
SS.was_used()
@@ -222,7 +222,7 @@
if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode)
SSticker.mode.add_cultist(newstruct.mind, 0)
if(iscultist(stoner) || cultoverride)
to_chat(newstruct, "<b>You are still bound to serve the cult[stoner ? " and [stoner]":""], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.</b>")
to_chat(newstruct, "<b>You are still bound to serve the cult[stoner ? " and [stoner]":""], follow [stoner ? stoner.p_their() : "their"] orders and help [stoner ? stoner.p_them() : "them"] complete [stoner ? stoner.p_their() : "their"] goals at all costs.</b>")
else if(stoner)
to_chat(newstruct, "<b>You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.</b>")
newstruct.clear_alert("bloodsense")
+4 -2
View File
@@ -153,11 +153,13 @@
to_chat(user, "<span class='danger'>[src] emits a blinding light!</span>")
/obj/item/assembly/flash/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(!try_use_flash())
return FALSE
return
AOE_flash()
burn_out()
. = ..()
/obj/item/assembly/flash/activate()//AOE flash on signal recieved
if(!..())
+1 -1
View File
@@ -13,4 +13,4 @@ Name: IsAssemblyHolder
Desc: If true is an object that can hold an assemblyholder object
*/
/obj/proc/IsAssemblyHolder()
return FALSE
return FALSE
+11 -3
View File
@@ -34,27 +34,35 @@
update_icon()
return TRUE
/obj/item/assembly/prox_sensor/on_detach()
. = ..()
if(!.)
return
else
proximity_monitor.SetHost(src,src)
/obj/item/assembly/prox_sensor/toggle_secure()
secured = !secured
if(!secured)
if(scanning)
toggle_scan()
proximity_monitor.host = src
proximity_monitor.SetHost(src,src)
timing = FALSE
STOP_PROCESSING(SSobj, src)
else
START_PROCESSING(SSobj, src)
proximity_monitor.host = loc
proximity_monitor.SetHost(loc,src)
update_icon()
return secured
/obj/item/assembly/prox_sensor/HasProximity(atom/movable/AM as mob|obj)
if (istype(AM, /obj/effect/beam))
return
sense()
/obj/item/assembly/prox_sensor/proc/sense()
if(!scanning || !secured || next_activate > world.time)
return FALSE
@@ -238,9 +238,6 @@
if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired)
M.experience_pressure_difference(pressure_difference, pressure_direction)
/turf/closed/proc/high_pressure_movements()
return
/atom/movable/var/pressure_resistance = 10
/atom/movable/var/last_high_pressure_movement_air_cycle = 0
@@ -38,6 +38,7 @@ Pipelines + Other Objects -> Pipe network
var/construction_type
var/pipe_state //icon_state as a pipe item
var/on = FALSE
/obj/machinery/atmospherics/examine(mob/user)
..()
@@ -20,7 +20,6 @@ Acts like a normal vent, but has an input AND output.
var/id = null
var/datum/radio_frequency/radio_connection
var/on = FALSE
var/pump_direction = 1 //0 = siphoning, 1 = releasing
var/external_pressure_bound = ONE_ATMOSPHERE
@@ -31,12 +30,12 @@ Acts like a normal vent, but has an input AND output.
//EXT_BOUND: Do not pass external_pressure_bound
//INPUT_MIN: Do not pass input_pressure_min
//OUTPUT_MAX: Do not pass output_pressure_max
/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
pixel_y = -PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer3
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
@@ -45,12 +44,12 @@ Acts like a normal vent, but has an input AND output.
/obj/machinery/atmospherics/components/binary/dp_vent_pump/on
on = TRUE
icon_state = "dpvent_map_on"
/obj/machinery/atmospherics/components/binary/dp_vent_pump/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
pixel_y = -PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/dp_vent_pump/on/layer3
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
@@ -62,12 +61,12 @@ Acts like a normal vent, but has an input AND output.
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume
name = "large dual-port air vent"
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
pixel_y = -PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer3
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
@@ -76,12 +75,12 @@ Acts like a normal vent, but has an input AND output.
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/on
on = TRUE
icon_state = "dpvent_map_on"
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
pixel_y = -PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/on/layer3
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
@@ -16,7 +16,6 @@ Passive gate is similar to the regular pump except:
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
var/on = FALSE
var/target_pressure = ONE_ATMOSPHERE
var/frequency = 0
@@ -25,7 +24,7 @@ Passive gate is similar to the regular pump except:
construction_type = /obj/item/pipe/directional
pipe_state = "passivegate"
/obj/machinery/atmospherics/components/binary/passive_gate/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -19,7 +19,6 @@ Thus, the two variables affect pump operation are set in New():
can_unwrench = TRUE
var/on = FALSE
var/target_pressure = ONE_ATMOSPHERE
var/frequency = 0
@@ -20,7 +20,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
pipe_state = "mvalve"
var/switching = FALSE
/obj/machinery/atmospherics/components/binary/valve/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -31,15 +31,15 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/valve/open
open = TRUE
/obj/machinery/atmospherics/components/binary/valve/open/layer1
/obj/machinery/atmospherics/components/binary/valve/on
on = TRUE
/obj/machinery/atmospherics/components/binary/valve/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
pixel_y = -PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/valve/open/layer3
/obj/machinery/atmospherics/components/binary/valve/on/layer3
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
@@ -47,11 +47,11 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
/obj/machinery/atmospherics/components/binary/valve/update_icon_nopipes(animation = 0)
normalize_dir()
if(animation)
flick("[valve_type]valve_[open][!open]",src)
icon_state = "[valve_type]valve_[open?"on":"off"]"
flick("[valve_type]valve_[on][!on]",src)
icon_state = "[valve_type]valve_[on?"on":"off"]"
/obj/machinery/atmospherics/components/binary/valve/proc/open()
open = TRUE
on = TRUE
update_icon_nopipes()
update_parents()
var/datum/pipeline/parent1 = parents[1]
@@ -59,7 +59,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
investigate_log("was opened by [usr ? key_name(usr) : "a remote signal"]", INVESTIGATE_ATMOS)
/obj/machinery/atmospherics/components/binary/valve/proc/close()
open = FALSE
on = FALSE
update_icon_nopipes()
investigate_log("was closed by [usr ? key_name(usr) : "a remote signal"]", INVESTIGATE_ATMOS)
@@ -76,14 +76,10 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
return
switching = TRUE
sleep(10)
if(open)
if(on)
close()
else
open()
var/turf/T = get_turf(src)
var/area/A = get_area(src)
investigate_log("Valve, [src.name], was manipiulated by [key_name(usr)] at [x], [y], [z], [A]", "atmos")
message_admins("Valve, [src.name], was manipulated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(T)], [A]")
switching = FALSE
/obj/machinery/atmospherics/components/binary/valve/digital // can be controlled by AI
@@ -93,7 +89,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
valve_type = "d"
pipe_state = "dvalve"
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_OPEN | INTERACT_MACHINE_OPEN_SILICON
/obj/machinery/atmospherics/components/binary/valve/digital/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -104,6 +100,19 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/valve/digital/on
on = TRUE
/obj/machinery/atmospherics/components/binary/valve/digital/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
pixel_y = -PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/valve/digital/on/layer3
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/valve/digital/update_icon_nopipes(animation)
if(!is_operational())
normalize_dir()
@@ -19,7 +19,6 @@ Thus, the two variables affect pump operation are set in New():
can_unwrench = TRUE
var/on = FALSE
var/transfer_rate = MAX_TRANSFER_RATE
var/frequency = 0
@@ -28,7 +27,7 @@ Thus, the two variables affect pump operation are set in New():
construction_type = /obj/item/pipe/directional
pipe_state = "volumepump"
/obj/machinery/atmospherics/components/binary/volume_pump/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -56,7 +55,7 @@ Thus, the two variables affect pump operation are set in New():
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/binary/volume_pump/update_icon_nopipes()
if(!is_operational())
icon_state = "volpump_off"
@@ -129,13 +128,10 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/volume_pump/ui_act(action, params)
if(..())
return
var/turf/T = get_turf(src)
var/area/A = get_area(src)
switch(action)
if("power")
on = !on
investigate_log("Volume Pump, [src.name], was turned [on ? "on" : "off"] by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Volume Pump, [src.name], turned [on ? "on" : "off"] by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("rate")
var/rate = params["rate"]
@@ -186,11 +182,6 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/volume_pump/can_unwrench(mob/user)
. = ..()
var/area/A = get_area(src)
if(. && on && is_operational())
to_chat(user, "<span class='warning'>You cannot unwrench [src], turn it off first!</span>")
return FALSE
else
investigate_log("Volume Pump, [src.name], was unwrenched by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Volume Pump, [src.name], was unwrenched by [ADMIN_LOOKUPFLW(usr)] at [A]")
return
@@ -4,7 +4,6 @@
desc = "Very useful for filtering gasses."
density = FALSE
can_unwrench = TRUE
var/on = FALSE
var/target_pressure = ONE_ATMOSPHERE
var/filter_type = null
var/frequency = 0
@@ -22,11 +21,11 @@
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/trinary/filter/flipped
icon_state = "filter_off_f"
flipped = TRUE
/obj/machinery/atmospherics/components/trinary/filter/flipped/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -58,7 +57,7 @@
/obj/machinery/atmospherics/components/trinary/filter/atmos //Used for atmos waste loops
on = TRUE
icon_state = "filter_on"
/obj/machinery/atmospherics/components/trinary/filter/atmos/n2
name = "nitrogen filter"
filter_type = "n2"
@@ -78,7 +77,7 @@
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped //This feels wrong, I know
icon_state = "filter_on_f"
flipped = TRUE
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2
name = "nitrogen filter"
filter_type = "n2"
@@ -94,7 +93,7 @@
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma
name = "plasma filter"
filter_type = "plasma"
/obj/machinery/atmospherics/components/trinary/filter/update_icon()
cut_overlays()
for(var/direction in GLOB.cardinals)
@@ -6,8 +6,6 @@
can_unwrench = TRUE
desc = "Very useful for mixing gasses."
var/on = FALSE
var/target_pressure = ONE_ATMOSPHERE
var/node1_concentration = 0.5
var/node2_concentration = 0.5
@@ -26,7 +24,7 @@
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/trinary/mixer/flipped
icon_state = "mixer_off_f"
flipped = TRUE
@@ -40,7 +38,7 @@
piping_layer = PIPING_LAYER_MAX
pixel_x = PIPING_LAYER_P_X
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/trinary/mixer/airmix //For standard airmix to distro
name = "air mixer"
icon_state = "mixer_on"
@@ -48,19 +46,19 @@
node2_concentration = O2STANDARD
on = TRUE
target_pressure = MAX_OUTPUT_PRESSURE
/obj/machinery/atmospherics/components/trinary/mixer/airmix/inverse
node1_concentration = O2STANDARD
node2_concentration = N2STANDARD
/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped
icon_state = "mixer_on_f"
flipped = TRUE
/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse
node1_concentration = O2STANDARD
node2_concentration = N2STANDARD
/obj/machinery/atmospherics/components/trinary/mixer/update_icon()
cut_overlays()
for(var/direction in GLOB.cardinals)
@@ -14,7 +14,6 @@
pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
occupant_typecache = list(/mob/living/carbon, /mob/living/simple_animal)
var/on = FALSE
var/autoeject = FALSE
var/volume = 100
@@ -6,7 +6,6 @@
can_unwrench = TRUE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF //really helpful in building gas chambers for xenomorphs
var/on = FALSE
var/injecting = 0
var/volume_rate = 50
@@ -19,7 +18,7 @@
layer = GAS_SCRUBBER_LAYER
pipe_state = "injector"
/obj/machinery/atmospherics/components/unary/outlet_injector/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -75,7 +74,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/on
on = TRUE
/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -13,7 +13,6 @@
circuit = /obj/item/circuitboard/machine/thermomachine
pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
var/on = FALSE
var/min_temperature = 0
var/max_temperature = 0
var/target_temperature = T20C
@@ -164,11 +163,11 @@
max_temperature = T20C
min_temperature = 170 //actual minimum temperature is defined by RefreshParts()
circuit = /obj/item/circuitboard/machine/thermomachine/freezer
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on
on = TRUE
icon_state = "freezer_1"
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/Initialize()
. = ..()
if(target_temperature == initial(target_temperature))
@@ -193,7 +192,7 @@
/obj/machinery/atmospherics/components/unary/thermomachine/heater/on
on = TRUE
icon_state = "heater_1"
/obj/machinery/atmospherics/components/unary/thermomachine/heater/RefreshParts()
..()
var/L
@@ -16,7 +16,6 @@
layer = GAS_SCRUBBER_LAYER
var/id_tag = null
var/on = FALSE
var/pump_direction = RELEASING
var/pressure_checks = EXT_BOUND
@@ -32,7 +31,7 @@
var/radio_filter_in
pipe_state = "uvent"
/obj/machinery/atmospherics/components/unary/vent_pump/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -46,7 +45,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on
on = TRUE
icon_state = "vent_map_on"
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -62,7 +61,7 @@
pressure_checks = INT_BOUND
internal_pressure_bound = 4000
external_pressure_bound = 0
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -76,7 +75,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on
on = TRUE
icon_state = "vent_map_siphon_on"
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -126,8 +125,9 @@
/obj/machinery/atmospherics/components/unary/vent_pump/Destroy()
var/area/A = get_area(src)
A.air_vent_names -= id_tag
A.air_vent_info -= id_tag
if (A)
A.air_vent_names -= id_tag
A.air_vent_info -= id_tag
SSradio.remove_object(src,frequency)
radio_connection = null
@@ -136,7 +136,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume
name = "large air vent"
power_channel = EQUIP
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -150,7 +150,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/on
on = TRUE
icon_state = "vent_map_on"
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -166,7 +166,7 @@
pressure_checks = INT_BOUND
internal_pressure_bound = 2000
external_pressure_bound = 0
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -180,7 +180,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/on
on = TRUE
icon_state = "vent_map_siphon_on"
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -14,7 +14,6 @@
layer = GAS_SCRUBBER_LAYER
var/id_tag = null
var/on = FALSE
var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing
var/filter_types = list(/datum/gas/carbon_dioxide)
@@ -29,7 +28,7 @@
var/radio_filter_in
pipe_state = "scrubber"
/obj/machinery/atmospherics/components/unary/vent_scrubber/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -52,7 +51,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on
on = TRUE
icon_state = "scrub_map_on"
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1
piping_layer = PIPING_LAYER_MIN
pixel_x = -PIPING_LAYER_P_X
@@ -65,15 +64,13 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy()
var/area/A = get_area(src)
A.air_scrub_names -= id_tag
A.air_scrub_info -= id_tag
if (A)
A.air_scrub_names -= id_tag
A.air_scrub_info -= id_tag
SSradio.remove_object(src,frequency)
radio_connection = null
for(var/I in adjacent_turfs)
I = null
adjacent_turfs.Cut()
return ..()
/obj/machinery/atmospherics/components/unary/vent_scrubber/auto_use_power()
@@ -219,7 +219,7 @@
continue
GL += P.return_air()
for(var/obj/machinery/atmospherics/components/binary/valve/V in P.other_atmosmch)
if(V.open)
if(V.on)
PL |= V.parents[1]
PL |= V.parents[2]
for(var/obj/machinery/atmospherics/components/unary/portables_connector/C in P.other_atmosmch)
@@ -58,6 +58,9 @@
air_update_turf() // Update the environment if needed.
/obj/machinery/portable_atmospherics/pump/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(is_operational())
if(prob(50 / severity))
on = !on
@@ -65,7 +68,6 @@
direction = PUMP_OUT
pump.target_pressure = rand(0, 100 * ONE_ATMOSPHERE)
update_icon()
..()
/obj/machinery/portable_atmospherics/pump/replace_tank(mob/living/user, close_valve)
. = ..()
@@ -56,11 +56,13 @@
air_update_turf()
/obj/machinery/portable_atmospherics/scrubber/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(is_operational())
if(prob(50 / severity))
on = !on
update_icon()
..()
/obj/machinery/portable_atmospherics/scrubber/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
@@ -29,8 +29,7 @@
/area/awaymission/moonoutpost19/hive
name = "The Hive"
always_unpowered = FALSE
has_gravity = FALSE
always_unpowered = TRUE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
@@ -0,0 +1,41 @@
/obj/structure/window/reinforced/fulltile/indestructable
name = "robust window"
flags_1 = PREVENT_CLICK_UNDER_1 | NODECONSTRUCT_1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/structure/grille/indestructable
flags_1 = CONDUCT_1 | NODECONSTRUCT_1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/effect/spawner/structure/window/reinforced/indestructable
spawn_list = list(/obj/structure/grille/indestructable, /obj/structure/window/reinforced/fulltile/indestructable)
/obj/structure/barricade/security/murderdome
name = "respawnable barrier"
desc = "A barrier. Provides cover in firefights."
deploy_time = 0
deploy_message = 0
/obj/structure/barricade/security/murderdome/make_debris()
new /obj/effect/murderdome/dead_barricade(get_turf(src))
/obj/effect/murderdome/dead_barricade
name = "dead barrier"
desc = "It provided cover in fire fights. And now it's gone."
icon = 'icons/obj/objects.dmi'
icon_state = "barrier0"
alpha = 100
/obj/effect/murderdome/dead_barricade/Initialize()
. = ..()
addtimer(CALLBACK(src, .proc/respawn), 3 MINUTES)
/obj/effect/murderdome/dead_barricade/proc/respawn()
if(!QDELETED(src))
new /obj/structure/barricade/security/murderdome(get_turf(src))
qdel(src)
/area/awaymission/vr/murderdome
name = "Murderdome"
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
@@ -606,6 +606,15 @@
id = /obj/item/card/id/syndicate
implants = list(/obj/item/implant/exile)
/datum/outfit/vr/snowtide
name = "Snowdin Outfit"
shoes = /obj/item/clothing/shoes/winterboots
suit = /obj/item/clothing/suit/hooded/wintercoat
back = /obj/item/storage/backpack
mask = /obj/item/clothing/mask/breath
r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
internals_slot = SLOT_R_STORE
/obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive/female
mob_gender = FEMALE
@@ -666,4 +675,5 @@
/obj/effect/turf_decal/snowdin_station_sign/up/seven
icon_state = "AOPU7"
/obj/effect/landmark/vr_spawn/snowdin
vr_outfit = /datum/outfit/vr/snowtide
+38 -16
View File
@@ -7,33 +7,55 @@
var/question = "Travel back?"
var/list/zlevels
/obj/structure/signpost/New()
/obj/structure/signpost/Initialize()
. = ..()
set_light(2)
zlevels = SSmapping.levels_by_trait(ZTRAIT_STATION)
/obj/structure/signpost/attackby(obj/item/W, mob/user, params)
return attack_hand(user)
/obj/structure/signpost/attack_hand(mob/user)
/obj/structure/signpost/interact(mob/user)
. = ..()
if(.)
return
switch(alert(question,name,"Yes","No"))
if("Yes")
var/turf/T = find_safe_turf(zlevels=zlevels)
if(alert(question,name,"Yes","No") == "Yes" && Adjacent(user))
var/turf/T = find_safe_turf(zlevels=zlevels)
if(T)
user.forceMove(T)
to_chat(user, "<span class='notice'>You blink and find yourself in [get_area_name(T)].</span>")
else
to_chat(user, "Nothing happens. You feel that this is a bad sign.")
if("No")
return
if(T)
var/atom/movable/AM = user.pulling
if(AM)
AM.forceMove(T)
user.forceMove(T)
if(AM)
user.start_pulling(AM)
to_chat(user, "<span class='notice'>You blink and find yourself in [get_area_name(T)].</span>")
else
to_chat(user, "Nothing happens. You feel that this is a bad sign.")
/obj/structure/signpost/attackby(obj/item/W, mob/user, params)
return interact(user)
/obj/structure/signpost/attack_paw(mob/user)
return interact(user)
/obj/structure/signpost/attack_hulk(mob/user, does_attack_animation = 0)
return interact(user)
/obj/structure/signpost/attack_larva(mob/user)
return interact(user)
/obj/structure/signpost/attack_robot(mob/user)
if (Adjacent(user))
return interact(user)
/obj/structure/signpost/attack_slime(mob/user)
return interact(user)
/obj/structure/signpost/attack_animal(mob/user)
return interact(user)
/obj/structure/signpost/salvation
name = "\proper salvation"
desc = "In the darkest times, we will find our way home."
resistance_flags = INDESTRUCTIBLE
/obj/structure/signpost/exit
name = "exit"
@@ -41,7 +63,7 @@
exit the area."
question = "Leave? You might never come back."
/obj/structure/signpost/exit/New()
/obj/structure/signpost/exit/Initialize()
. = ..()
zlevels = list()
for(var/i in 1 to world.maxz)
@@ -5,6 +5,7 @@
icon = 'icons/obj/structures.dmi'
icon_state = "speaking_tile"
layer = 5
resistance_flags = INDESTRUCTIBLE
var/speaking = FALSE
var/times_spoken_to = 0
var/list/shenanigans = list()
@@ -88,6 +89,27 @@
speaking = FALSE
times_spoken_to++
/obj/structure/speaking_tile/attackby(obj/item/W, mob/user, params)
return interact(user)
/obj/structure/speaking_tile/attack_paw(mob/user)
return interact(user)
/obj/structure/speaking_tile/attack_hulk(mob/user, does_attack_animation = 0)
return interact(user)
/obj/structure/speaking_tile/attack_larva(mob/user)
return interact(user)
/obj/structure/speaking_tile/attack_ai(mob/user)
return interact(user)
/obj/structure/speaking_tile/attack_slime(mob/user)
return interact(user)
/obj/structure/speaking_tile/attack_animal(mob/user)
return interact(user)
/obj/structure/speaking_tile/proc/SpeakPeace(list/statements)
for(var/i in 1 to statements.len)
say("<span class='deadsay'>[statements[i]]</span>")
+270
View File
@@ -0,0 +1,270 @@
/datum/bounty/item/assistant/strange_object
name = "Strange Object"
description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away."
reward = 1200
wanted_types = list(/obj/item/relic)
/datum/bounty/item/assistant/scooter
name = "Scooter"
description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up."
reward = 1080 // the mat hoffman
wanted_types = list(/obj/vehicle/ridden/scooter)
include_subtypes = FALSE
/datum/bounty/item/assistant/skateboard
name = "Skateboard"
description = "Nanotrasen has determined walking to be a wasteful. Ship a skateboard to CentCom to speed operations up."
reward = 900 // the tony hawk
wanted_types = list(/obj/vehicle/ridden/scooter/skateboard)
/datum/bounty/item/assistant/stunprod
name = "Stunprod"
description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it."
reward = 1300
wanted_types = list(/obj/item/melee/baton/cattleprod)
/datum/bounty/item/assistant/soap
name = "Soap"
description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs."
reward = 2000
required_count = 3
wanted_types = list(/obj/item/soap)
/datum/bounty/item/assistant/spear
name = "Spears"
description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears."
reward = 2000
required_count = 5
wanted_types = list(/obj/item/twohanded/spear)
/datum/bounty/item/assistant/toolbox
name = "Toolboxes"
description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution."
reward = 2000
required_count = 6
wanted_types = list(/obj/item/storage/toolbox)
/datum/bounty/item/assistant/statue
name = "Statue"
description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible."
reward = 2000
wanted_types = list(/obj/structure/statue)
/datum/bounty/item/assistant/clown_box
name = "Clown Box"
description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out."
reward = 1500
wanted_types = list(/obj/item/storage/box/clown)
/datum/bounty/item/assistant/cheesiehonkers
name = "Cheesie Honkers"
description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!"
reward = 1200
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/cheesiehonkers)
/datum/bounty/item/assistant/baseball_bat
name = "Baseball Bat"
description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream."
reward = 2000
required_count = 5
wanted_types = list(/obj/item/melee/baseball_bat)
/datum/bounty/item/assistant/extendohand
name = "Extendo-Hand"
description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out."
reward = 2500
wanted_types = list(/obj/item/extendohand)
/datum/bounty/item/assistant/donut
name = "Donuts"
description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale."
reward = 3000
required_count = 10
wanted_types = list(/obj/item/reagent_containers/food/snacks/donut)
/datum/bounty/item/assistant/donkpocket
name = "Donk-Pockets"
description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately."
reward = 3000
required_count = 10
wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket)
/datum/bounty/item/assistant/briefcase
name = "Briefcase"
description = "Central Command will be holding a business convention this year. Ship a few briefcases in support."
reward = 2500
required_count = 5
wanted_types = list(/obj/item/storage/briefcase)
/datum/bounty/item/assistant/sunglasses
name = "Sunglasses"
description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this."
reward = 3000
required_count = 2
wanted_types = list(/obj/item/clothing/glasses/sunglasses)
/datum/bounty/item/assistant/gondola_hide
name = "Gondola Hide"
description = "Central Command has recently learned of strange creatures called Gondolas. If you catch one, ship its hide back to CentCom."
reward = 5000
wanted_types = list(/obj/item/stack/sheet/animalhide/gondola)
/datum/bounty/item/assistant/monkey_hide
name = "Monkey Hide"
description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it."
reward = 1500
wanted_types = list(/obj/item/stack/sheet/animalhide/monkey)
/datum/bounty/item/assistant/heart
name = "Heart"
description = "Commander Johnson is in critical condition after suffering a heart attack. Doctors say he needs a new heart fast. Ship one, pronto!"
reward = 3000
wanted_types = list(/obj/item/organ/heart)
/datum/bounty/item/assistant/lung
name = "Lungs"
description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded."
reward = 3000
required_count = 1
wanted_types = list(/obj/item/organ/lungs)
/datum/bounty/item/assistant/appendix
name = "Appendix"
description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay."
reward = 3000
wanted_types = list(/obj/item/organ/appendix)
/datum/bounty/item/assistant/lizard_tail
name = "Lizard Tail"
description = "The Wizard Federation has made off with Nanotrasen's supply of lizard tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?"
reward = 3000
wanted_types = list(/obj/item/organ/tail/lizard)
/datum/bounty/item/assistant/shard
name = "Shards"
description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed."
reward = 1500
required_count = 15
wanted_types = list(/obj/item/shard)
/datum/bounty/item/assistant/comfy_chair
name = "Comfy Chairs"
description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him. "
reward = 1500
required_count = 5
wanted_types = list(/obj/structure/chair/comfy)
/datum/bounty/item/assistant/revolver
name = "Revolver"
description = "Captain Johann of station 12 has challenged Captain Vic of station 11 to a duel. He's asked for help securing an appropriate revolver to use."
reward = 2000
wanted_types = list(/obj/item/gun/ballistic/revolver)
/datum/bounty/item/assistant/hand_tele
name = "Hand Tele"
description = "Central Command has come up with a genius idea: Why not teleport cargo rather than ship it? Send over a hand tele, receive payment, then wait 6-8 years while they deliberate."
reward = 2000
wanted_types = list(/obj/item/hand_tele)
/datum/bounty/item/assistant/geranium
name = "Geraniums"
description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you."
reward = 4000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium)
/datum/bounty/item/assistant/poppy
name = "Poppies"
description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you."
reward = 1000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy)
include_subtypes = FALSE
/datum/bounty/item/assistant/shadyjims
name = "Shady Jim's"
description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats."
reward = 500
wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims)
/datum/bounty/item/assistant/potted_plants
name = "Potted Plants"
description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants."
reward = 2000
required_count = 8
wanted_types = list(/obj/item/twohanded/required/kirbyplants)
/datum/bounty/item/assistant/earmuffs
name = "Earmuffs"
description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance."
reward = 1000
wanted_types = list(/obj/item/clothing/ears/earmuffs)
/datum/bounty/item/assistant/handcuffs
name = "Handcuffs"
description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)."
reward = 1000
required_count = 5
wanted_types = list(/obj/item/restraints/handcuffs)
/datum/bounty/item/assistant/monkey_cubes
name = "Monkey Cubes"
description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes."
reward = 2000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube)
/datum/bounty/item/assistant/chainsaw
name = "Chainsaw"
description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please."
reward = 2500
wanted_types = list(/obj/item/twohanded/required/chainsaw)
/datum/bounty/item/assistant/ied
name = "IED"
description = "Nanotrasen's maximum security prison at CentCom is undergoing personnel training. Ship a handful of IEDs to serve as a training tools."
reward = 2000
required_count = 3
wanted_types = list(/obj/item/grenade/iedcasing)
/datum/bounty/item/assistant/bonfire
name = "Lit Bonfire"
description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Ship a lit bonfire to warm them up."
reward = 5000
wanted_types = list(/obj/structure/bonfire)
/datum/bounty/item/assistant/bonfire/applies_to(obj/O)
if(!..())
return FALSE
var/obj/structure/bonfire/B = O
return !!B.burning
/datum/bounty/item/assistant/plasma_tank
name = "Full Tank of Plasma"
description = "Station 12 has requested supplies to set up a singularity engine. In particular, they request 28 moles of plasma."
reward = 2500
wanted_types = list(/obj/item/tank)
var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact.
/datum/bounty/item/assistant/plasma_tank/applies_to(obj/O)
if(!..())
return FALSE
var/obj/item/tank/T = O
if(!T.air_contents.gases[/datum/gas/plasma])
return FALSE
return T.air_contents.gases[/datum/gas/plasma][MOLES] >= moles_required
/datum/bounty/item/assistant/corgimeat
name = "Raw Corgi Meat"
description = "The Syndicate recently stole all of CentCom's corgi meat. Ship out a replacement immediately."
reward = 3000
wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi)
/datum/bounty/item/chef/action_figures
name = "Action Figures"
description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints."
reward = 4000
required_count = 5
wanted_types = list(/obj/item/toy/figure)
+138
View File
@@ -0,0 +1,138 @@
/datum/bounty/item/chef/birthday_cake
name = "Birthday Cake"
description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!"
reward = 4000
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday)
/datum/bounty/item/chef/soup
name = "Soup"
description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup."
reward = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/soup)
/datum/bounty/item/chef/popcorn
name = "Popcorn Bags"
description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion."
reward = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn)
/datum/bounty/item/chef/onionrings
name = "Onion Rings"
description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support."
reward = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings)
/datum/bounty/item/chef/icecreamsandwich
name = "Ice Cream Sandwiches"
description = "Upper management has been screaming non-stop for ice cream. Please send some."
reward = 4000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/icecreamsandwich)
/datum/bounty/item/chef/bread
name = "Bread"
description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions."
reward = 1000
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase)
/datum/bounty/item/chef/pie
name = "Pie"
description = "3.14159? No! CentCom management wants edible pie! Ship a whole one."
reward = 3142
wanted_types = list(/obj/item/reagent_containers/food/snacks/pie)
/datum/bounty/item/chef/salad
name = "Salad or Rice Bowls"
description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls."
reward = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/salad)
/datum/bounty/item/chef/carrotfries
name = "Carrot Fries"
description = "Night sight can mean life or death! A shipment of carrot fries is the order."
reward = 3500
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries)
/datum/bounty/item/chef/superbite
name = "Super Bite Burger"
description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him."
reward = 12000
wanted_types = list(/obj/item/reagent_containers/food/snacks/burger/superbite)
/datum/bounty/item/chef/poppypretzel
name = "Poppy Pretzel"
description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test."
reward = 3000
wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel)
/datum/bounty/item/chef/cubancarp
name = "Cuban Carp"
description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom."
reward = 8000
wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp)
/datum/bounty/item/chef/hotdog
name = "Hot Dog"
description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate."
reward = 8000
wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog)
/datum/bounty/item/chef/lemon
name = "Lemons"
description = "A commander claims he can turn lemons into money. Ship him a few and he'll deposit the money into the station's account."
reward = 4444
required_count = 10
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lemon)
/datum/bounty/item/chef/eggplantparm
name = "Eggplant Parmigianas"
description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!"
reward = 3500
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm)
/datum/bounty/item/chef/muffin
name = "Muffins"
description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this."
reward = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/muffin)
/datum/bounty/item/chef/chawanmushi
name = "Chawanmushi"
description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately."
reward = 8000
wanted_types = list(/obj/item/reagent_containers/food/snacks/chawanmushi)
/datum/bounty/item/chef/kebab
name = "Kebabs"
description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises."
reward = 3500
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab)
/datum/bounty/item/chef/soylentgreen
name = "Soylent Green"
description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus."
reward = 5000
wanted_types = list(/obj/item/reagent_containers/food/snacks/soylentgreen)
/datum/bounty/item/chef/pancakes
name = "Pancakes"
description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen."
reward = 5000
required_count = 13
wanted_types = list(/datum/crafting_recipe/food/pancakes)
/datum/bounty/item/chef/nuggies
name = "Chicken Nuggets"
description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?"
reward = 4000
required_count = 6
wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget)
+35
View File
@@ -0,0 +1,35 @@
/datum/bounty/item
var/required_count = 1
var/shipped_count = 0
var/list/wanted_types // Types accepted for the bounty.
var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type.
var/list/exclude_types // Types excluded.
/datum/bounty/item/New()
..()
wanted_types = typecacheof(wanted_types)
exclude_types = typecacheof(exclude_types)
/datum/bounty/item/completion_string()
return {"[shipped_count]/[required_count]"}
/datum/bounty/item/can_claim()
return ..() && shipped_count >= required_count
/datum/bounty/item/applies_to(obj/O)
if(!include_subtypes && !(O.type in wanted_types))
return FALSE
if(include_subtypes && (!is_type_in_typecache(O, wanted_types) || is_type_in_typecache(O, exclude_types)))
return FALSE
if(O.flags_1 & HOLOGRAM_1)
return FALSE
return shipped_count < required_count
/datum/bounty/item/ship(obj/O)
if(!applies_to(O))
return
shipped_count += 1
/datum/bounty/item/compatible_with(datum/other_bounty)
return type != other_bounty.type
+40
View File
@@ -0,0 +1,40 @@
/datum/bounty/item/mech/New()
..()
description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment."
/datum/bounty/item/mech/ship(obj/O)
if(!applies_to(O))
return
if(istype(O, /obj/mecha))
var/obj/mecha/M = O
M.wreckage = null // So the mech doesn't explode.
..()
/datum/bounty/item/mech/mark_high_priority(scale_reward)
return ..(max(scale_reward * 0.7, 1.2))
/datum/bounty/item/mech/ripley
name = "APLU \"Ripley\""
reward = 13000
wanted_types = list(/obj/mecha/working/ripley)
/datum/bounty/item/mech/odysseus
name = "Odysseus"
reward = 11000
wanted_types = list(/obj/mecha/medical/odysseus)
/datum/bounty/item/mech/gygax
name = "Gygax"
reward = 28000
wanted_types = list(/obj/mecha/combat/gygax)
/datum/bounty/item/mech/durand
name = "Durand"
reward = 20000
wanted_types = list(/obj/mecha/combat/durand)
/datum/bounty/item/mech/phazon
name = "Phazon"
reward = 50000
wanted_types = list(/obj/mecha/combat/phazon)
+172
View File
@@ -0,0 +1,172 @@
/datum/bounty/reagent
var/required_volume = 10
var/shipped_volume = 0
var/datum/reagent/wanted_reagent
/datum/bounty/reagent/completion_string()
return {"[round(shipped_volume)]/[required_volume] Units"}
/datum/bounty/reagent/can_claim()
return ..() && shipped_volume >= required_volume
/datum/bounty/reagent/applies_to(obj/O)
if(!istype(O, /obj/item/reagent_containers))
return FALSE
if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.id))
return FALSE
if(O.flags_1 & HOLOGRAM_1)
return FALSE
return shipped_volume < required_volume
/datum/bounty/reagent/ship(obj/O)
if(!applies_to(O))
return
shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.id)
if(shipped_volume > required_volume)
shipped_volume = required_volume
/datum/bounty/reagent/compatible_with(other_bounty)
if(!istype(other_bounty, /datum/bounty/reagent))
return TRUE
var/datum/bounty/reagent/R = other_bounty
return wanted_reagent.id != R.wanted_reagent.id
/datum/bounty/reagent/simple_drink
name = "Simple Drink"
reward = 1500
datum/bounty/reagent/simple_drink/New()
// Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped.
var/static/list/possible_reagents = list(\
/datum/reagent/consumable/ethanol/antifreeze,\
/datum/reagent/consumable/ethanol/andalusia,\
/datum/reagent/consumable/tea/arnold_palmer,\
/datum/reagent/consumable/ethanol/b52,\
/datum/reagent/consumable/ethanol/bananahonk,\
/datum/reagent/consumable/ethanol/beepsky_smash,\
/datum/reagent/consumable/ethanol/between_the_sheets,\
/datum/reagent/consumable/ethanol/bilk,\
/datum/reagent/consumable/ethanol/black_russian,\
/datum/reagent/consumable/ethanol/bloody_mary,\
/datum/reagent/consumable/ethanol/brave_bull,\
/datum/reagent/consumable/ethanol/martini,\
/datum/reagent/consumable/ethanol/cuba_libre,\
/datum/reagent/consumable/ethanol/eggnog,\
/datum/reagent/consumable/ethanol/erikasurprise,\
/datum/reagent/consumable/ethanol/ginfizz,\
/datum/reagent/consumable/ethanol/gintonic,\
/datum/reagent/consumable/ethanol/grappa,\
/datum/reagent/consumable/ethanol/grog,\
/datum/reagent/consumable/ethanol/hooch,\
/datum/reagent/consumable/ethanol/iced_beer,\
/datum/reagent/consumable/ethanol/irishcarbomb,\
/datum/reagent/consumable/ethanol/manhattan,\
/datum/reagent/consumable/ethanol/margarita,\
/datum/reagent/consumable/ethanol/gargle_blaster,\
/datum/reagent/consumable/ethanol/rum_coke,\
/datum/reagent/consumable/ethanol/screwdrivercocktail,\
/datum/reagent/consumable/ethanol/snowwhite,\
/datum/reagent/consumable/soy_latte,\
/datum/reagent/consumable/cafe_latte,\
/datum/reagent/consumable/ethanol/syndicatebomb,\
/datum/reagent/consumable/ethanol/tequila_sunrise,\
/datum/reagent/consumable/ethanol/manly_dorf,\
/datum/reagent/consumable/ethanol/thirteenloko,\
/datum/reagent/consumable/triple_citrus,\
/datum/reagent/consumable/ethanol/vodkamartini,\
/datum/reagent/consumable/ethanol/whiskeysoda,\
/datum/reagent/consumable/ethanol/beer/green,\
/datum/reagent/consumable/ethanol/demonsblood,\
/datum/reagent/consumable/ethanol/crevice_spike,\
/datum/reagent/consumable/ethanol/singulo,\
/datum/reagent/consumable/ethanol/whiskey_sour)
var/reagent_type = pick(possible_reagents)
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst."
reward += rand(0, 2) * 500
/datum/bounty/reagent/complex_drink
name = "Complex Drink"
reward = 4000
datum/bounty/reagent/complex_drink/New()
// Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped.
var/static/list/possible_reagents = list(\
/datum/reagent/consumable/ethanol/atomicbomb,\
/datum/reagent/consumable/ethanol/bacchus_blessing,\
/datum/reagent/consumable/ethanol/bastion_bourbon,\
/datum/reagent/consumable/ethanol/booger,\
/datum/reagent/consumable/ethanol/hippies_delight,\
/datum/reagent/consumable/ethanol/drunkenblumpkin,\
/datum/reagent/consumable/ethanol/fetching_fizz,\
/datum/reagent/consumable/ethanol/goldschlager,\
/datum/reagent/consumable/ethanol/hearty_punch,\
/datum/reagent/consumable/ethanol/manhattan_proj,\
/datum/reagent/consumable/ethanol/narsour,\
/datum/reagent/consumable/ethanol/neurotoxin,\
/datum/reagent/consumable/ethanol/patron,\
/datum/reagent/consumable/ethanol/quadruple_sec,\
/datum/reagent/consumable/ethanol/quintuple_sec,\
/datum/reagent/consumable/bluecherryshake,\
/datum/reagent/consumable/doctor_delight,\
/datum/reagent/consumable/ethanol/silencer)
var/reagent_type = pick(possible_reagents)
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize."
reward += rand(0, 4) * 500
/datum/bounty/reagent/chemical
name = "Chemical"
reward = 4000
required_volume = 30
datum/bounty/reagent/chemical/New()
// Don't worry about making this comprehensive. It doesn't matter if some chems are skipped.
var/static/list/possible_reagents = list(\
/datum/reagent/medicine/leporazine,\
/datum/reagent/medicine/clonexadone,\
/datum/reagent/medicine/pyroxadone,\
/datum/reagent/medicine/rezadone,\
/datum/reagent/medicine/mine_salve,\
/datum/reagent/medicine/pen_acid,\
/datum/reagent/medicine/perfluorodecalin,\
/datum/reagent/medicine/ephedrine,\
/datum/reagent/medicine/diphenhydramine,\
/datum/reagent/medicine/atropine,\
/datum/reagent/medicine/strange_reagent,\
/datum/reagent/medicine/regen_jelly,\
/datum/reagent/drug/space_drugs,\
/datum/reagent/drug/crank,\
/datum/reagent/drug/krokodil,\
/datum/reagent/drug/methamphetamine,\
/datum/reagent/drug/bath_salts,\
/datum/reagent/drug/aranesp,\
/datum/reagent/nitroglycerin,\
/datum/reagent/blackpowder,\
/datum/reagent/napalm,\
/datum/reagent/teslium,\
/datum/reagent/firefighting_foam,\
/datum/reagent/consumable/honey,\
/datum/reagent/consumable/mayonnaise,\
/datum/reagent/consumable/frostoil,\
/datum/reagent/toxin/slimejelly,\
/datum/reagent/toxin/itching_powder,\
/datum/reagent/toxin/amanitin,\
/datum/reagent/toxin/coniine,\
/datum/reagent/toxin/cyanide,\
/datum/reagent/toxin/heparin,\
/datum/reagent/toxin/skewium,\
/datum/reagent/toxin/anacea,\
/datum/reagent/toxin/mimesbane,\
/datum/reagent/pax)
var/reagent_type = pick(possible_reagents)
wanted_reagent = new reagent_type
name = wanted_reagent.name
description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded."
reward += rand(0, 4) * 500
+72
View File
@@ -0,0 +1,72 @@
/datum/bounty/item/science/boh
name = "Bag of Holding"
description = "Nanotrasen would make good use of high-capacity backpacks. If you have any, please ship them."
reward = 10000
wanted_types = list(/obj/item/storage/backpack/holding)
/datum/bounty/item/science/tboh
name = "Trash Bag of Holding"
description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them."
reward = 10000
wanted_types = list(/obj/item/storage/backpack/holding)
/datum/bounty/item/science/bluespace_syringe
name = "Bluespace Syringe"
description = "Nanotrasen would make good use of high-capacity syringes. If you have any, please ship them."
reward = 10000
wanted_types = list(/obj/item/reagent_containers/syringe/bluespace)
/datum/bounty/item/science/bluespace_body_bag
name = "Bluespace Body Bag"
description = "Nanotrasen would make good use of high-capacity body bags. If you have any, please ship them."
reward = 10000
wanted_types = list(/obj/item/bodybag/bluespace)
/datum/bounty/item/science/nightvision_goggles
name = "Night Vision Goggles"
description = "An electrical storm has busted all the lights at CentCom. While management is waiting for replacements, perhaps some night vision goggles can be shipped?"
reward = 10000
wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night)
/datum/bounty/item/science/experimental_welding_tool
name = "Experimental Welding Tool"
description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded."
reward = 10000
required_count = 3
wanted_types = list(/obj/item/weldingtool/experimental)
/datum/bounty/item/science/cryostasis_beaker
name = "Cryostasis Beaker"
description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment."
reward = 10000
wanted_types = list(/obj/item/reagent_containers/glass/beaker/noreact)
/datum/bounty/item/science/diamond_drill
name = "Diamond Mining Drill"
description = "Central Command is willing to pay three months salary in exchange for one diamond mining drill."
reward = 15000
wanted_types = list(/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill)
/datum/bounty/item/science/floor_buffer
name = "Floor Buffer Upgrade"
description = "One of CentCom's janitors made a small fortune betting on carp races. Now they'd like to commission an upgrade to their floor buffer."
reward = 10000
wanted_types = list(/obj/item/janiupgrade)
/datum/bounty/item/science/flightsuit
name = "Flight Suit"
description = "According to all known laws of physics, flight suits are cool. CentCom will pay at a premium for them, so get shipping!"
reward = 30000
wanted_types = list(/obj/item/clothing/suit/space/hardsuit/flightsuit)
/datum/bounty/item/science/advanced_mop
name = "Advanced Mop"
description = "Excuse me. I'd like to request $17 for a push broom rebristling. Either that, or an advanced mop."
reward = 10000
wanted_types = list(/obj/item/mop/advanced)
/datum/bounty/item/science/advanced_egun
name = "Advanced Energy Gun"
description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay."
reward = 10000
wanted_types = list(/obj/item/gun/energy/e_gun/nuclear)
+62
View File
@@ -0,0 +1,62 @@
/datum/bounty/item/security/headset
name = "Security Headset"
description = "Nanotrasen wants to ensure that their encryption is working correctly. Ship them a security headset so that they can check."
reward = 800
wanted_types = list(/obj/item/radio/headset/headset_sec, /obj/item/radio/headset/heads/hos)
/datum/bounty/item/security/securitybelt
name = "Security Belt"
description = "CentCom is having difficulties with their security belts. Ship one from the station to receive compensation."
reward = 800
wanted_types = list(/obj/item/storage/belt/security)
/datum/bounty/item/security/sechuds
name = "Security HUDSunglasses"
description = "CentCom screwed up and ordered the wrong type of security sunglasses. They request the station ship some of theirs."
reward = 800
wanted_types = list(/obj/item/clothing/glasses/hud/security/sunglasses)
/datum/bounty/item/security/riotshotgun
name = "Riot Shotguns"
description = "Hooligans have boarded CentCom! Ship riot shotguns quick, or things are going to get dirty."
reward = 5000
required_count = 2
wanted_types = list(/obj/item/gun/ballistic/shotgun/riot)
/datum/bounty/item/security/pinpointer
name = "Nuclear Pinpointer"
description = "There's a teeny-tiny itty-bitty chance CentCom may have lost a nuke disk. Can the station spare a pinpointer to help out?"
reward = 1500
wanted_types = list(/obj/item/pinpointer/nuke)
/datum/bounty/item/security/captains_spare
name = "Captain's Spare"
description = "Captain Bart of Station 12 has forgotten his ID! Ship him your station's spare, would you?"
reward = 1500
wanted_types = list(/obj/item/card/id/captains_spare)
/datum/bounty/item/security/hardsuit
name = "Security Hardsuit"
description = "Space pirates are heading towards CentCom! Quick! Ship a security hardsuit to aid the fight!"
reward = 2000
wanted_types = list(/obj/item/clothing/suit/space/hardsuit/security)
/datum/bounty/item/security/krav_maga
name = "Krav Maga Gloves"
description = "Chef Howerwitz of CentCom is trying to take a kung-fu Pizza out of the oven, but his mitts aren't up to the task. Ship them a pair of Krav Maga gloves to do the job right."
reward = 2000
wanted_types = list(/obj/item/clothing/gloves/krav_maga)
/datum/bounty/item/security/recharger
name = "Rechargers"
description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped."
reward = 2000
required_count = 3
wanted_types = list(/obj/machinery/recharger)
/datum/bounty/item/security/sabre
name = "Officer's Sabre"
description = "A 3-hour LARP session will be held at CentCom in the upcoming months. A shipped officer's sabre would make a good prop."
reward = 2500
wanted_types = list(/obj/item/melee/sabre)
+39
View File
@@ -0,0 +1,39 @@
/datum/bounty/item/slime
reward = 3000
/datum/bounty/item/slime/New()
..()
description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it."
reward += rand(0, 4) * 500
/datum/bounty/item/slime/green
name = "Green Slime Extract"
wanted_types = list(/obj/item/slime_extract/green)
/datum/bounty/item/slime/pink
name = "Pink Slime Extract"
wanted_types = list(/obj/item/slime_extract/pink)
/datum/bounty/item/slime/gold
name = "Gold Slime Extract"
wanted_types = list(/obj/item/slime_extract/gold)
/datum/bounty/item/slime/oil
name = "Oil Slime Extract"
wanted_types = list(/obj/item/slime_extract/oil)
/datum/bounty/item/slime/black
name = "Black Slime Extract"
wanted_types = list(/obj/item/slime_extract/black)
/datum/bounty/item/slime/lightpink
name = "Light Pink Slime Extract"
wanted_types = list(/obj/item/slime_extract/lightpink)
/datum/bounty/item/slime/adamantine
name = "Adamantine Slime Extract"
wanted_types = list(/obj/item/slime_extract/adamantine)
/datum/bounty/item/slime/rainbow
name = "Rainbow Slime Extract"
wanted_types = list(/obj/item/slime_extract/rainbow)
+41
View File
@@ -0,0 +1,41 @@
/datum/bounty/item/alien_organs
name = "Alien Organs"
description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thouroughly compensated."
reward = 25000
required_count = 3
wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo)
/datum/bounty/item/syndicate_documents
name = "Syndicate Documents"
description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives."
reward = 10000
wanted_types = list(/obj/item/documents/syndicate, /obj/item/documents/photocopy)
/datum/bounty/item/syndicate_documents/applies_to(obj/O)
if(!..())
return FALSE
if(istype(O, /obj/item/documents/photocopy))
var/obj/item/documents/photocopy/Copy = O
return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate))
return TRUE
/datum/bounty/more_bounties
name = "More Bounties"
description = "Complete enough bounties and CentCom will issue new ones!"
reward = 3 // number of bounties
var/required_bounties = 5
/datum/bounty/more_bounties/can_claim()
return ..() && completed_bounty_count() >= required_bounties
/datum/bounty/more_bounties/completion_string()
return "[min(required_bounties, completed_bounty_count())]/[required_bounties] Bounties"
/datum/bounty/more_bounties/reward_string()
return "Up to [reward] new bounties"
/datum/bounty/more_bounties/claim()
if(can_claim())
claimed = TRUE
for(var/i = 0; i < reward; ++i)
try_add_bounty(random_bounty())
+81
View File
@@ -0,0 +1,81 @@
/datum/bounty/virus
reward = 5000
var/shipped = FALSE
var/stat_value = 0
var/stat_name = ""
/datum/bounty/virus/New()
..()
stat_value = rand(4, 11)
if(rand(3) == 1)
stat_value *= -1
name = "Virus ([stat_name] of [stat_value])"
description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus."
reward += rand(0, 4) * 500
/datum/bounty/virus/completion_string()
return shipped ? "Shipped" : "Not Shipped"
/datum/bounty/virus/can_claim()
return ..() && shipped
/datum/bounty/virus/applies_to(obj/O)
if(shipped)
return FALSE
if(O.flags_1 & HOLOGRAM_1)
return FALSE
if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list))
return FALSE
var/datum/reagent/blood/B = locate() in O.reagents.reagent_list
if(!B)
return FALSE
for(var/V in B.get_diseases())
if(!istype(V, /datum/disease/advance))
continue
if(accepts_virus(V))
return TRUE
return FALSE
/datum/bounty/virus/ship(obj/O)
if(!applies_to(O))
return
shipped = TRUE
/datum/bounty/virus/compatible_with(datum/other_bounty)
if(!istype(other_bounty, /datum/bounty/virus))
return TRUE
var/datum/bounty/virus/V = other_bounty
return type != V.type || stat_value != V.stat_value
/datum/bounty/virus/proc/accepts_virus(V)
return TRUE
/datum/bounty/virus/resistance
stat_name = "resistance"
/datum/bounty/virus/resistance/accepts_virus(V)
var/datum/disease/advance/A = V
return A.totalResistance() == stat_value
/datum/bounty/virus/stage_speed
stat_name = "stage speed"
/datum/bounty/virus/stage_speed/accepts_virus(V)
var/datum/disease/advance/A = V
return A.totalStageSpeed() == stat_value
/datum/bounty/virus/stealth
stat_name = "stealth"
/datum/bounty/virus/stealth/accepts_virus(V)
var/datum/disease/advance/A = V
return A.totalStealth() == stat_value
/datum/bounty/virus/transmit
stat_name = "transmittable"
/datum/bounty/virus/transmit/accepts_virus(V)
var/datum/disease/advance/A = V
return A.totalTransmittable() == stat_value
+148
View File
@@ -0,0 +1,148 @@
GLOBAL_LIST_EMPTY(bounties_list)
/datum/bounty
var/name
var/description
var/reward = 1000 // In credits.
var/claimed = FALSE
var/high_priority = FALSE
// Displayed on bounty UI screen.
/datum/bounty/proc/completion_string()
return ""
// Displayed on bounty UI screen.
/datum/bounty/proc/reward_string()
return "[reward] Credits"
/datum/bounty/proc/can_claim()
return !claimed
// Called when the claim button is clicked. Override to provide fancy rewards.
/datum/bounty/proc/claim()
if(can_claim())
SSshuttle.points += reward
claimed = TRUE
// If an item sent in the cargo shuttle can satisfy the bounty.
/datum/bounty/proc/applies_to(obj/O)
return FALSE
// Called when an object is shipped on the cargo shuttle.
/datum/bounty/proc/ship(obj/O)
return
// When randomly generating the bounty list, duplicate bounties must be avoided.
// This proc is used to determine if two bounties are duplicates, or incompatible in general.
/datum/bounty/proc/compatible_with(other_bounty)
return TRUE
/datum/bounty/proc/mark_high_priority(scale_reward = 2)
if(high_priority)
return
high_priority = TRUE
reward = round(reward * scale_reward)
// This proc is called when the shuttle docks at CentCom.
// It handles items shipped for bounties.
/proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE)
if(!GLOB.bounties_list.len)
setup_bounties()
var/list/matched_one = FALSE
for(var/thing in reverseRange(AM.GetAllContents()))
var/matched_this = FALSE
for(var/datum/bounty/B in GLOB.bounties_list)
if(B.applies_to(thing))
matched_one = TRUE
matched_this = TRUE
if(!dry_run)
B.ship(thing)
if(!dry_run && matched_this)
qdel(thing)
return matched_one
// Returns FALSE if the bounty is incompatible with the current bounties.
/proc/try_add_bounty(datum/bounty/new_bounty)
if(!new_bounty || !new_bounty.name || !new_bounty.description)
return FALSE
for(var/i in GLOB.bounties_list)
var/datum/bounty/B = i
if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B))
return FALSE
GLOB.bounties_list += new_bounty
return TRUE
// Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
/proc/random_bounty()
switch(rand(1, 9))
if(1)
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
return new subtype
if(2)
var/subtype = pick(subtypesof(/datum/bounty/item/mech))
return new subtype
if(3)
var/subtype = pick(subtypesof(/datum/bounty/item/chef))
return new subtype
if(4)
var/subtype = pick(subtypesof(/datum/bounty/item/security))
return new subtype
if(5)
if(rand(2) == 1)
return new /datum/bounty/reagent/simple_drink
return new /datum/bounty/reagent/complex_drink
if(6)
return new /datum/bounty/reagent/chemical
if(7)
var/subtype = pick(subtypesof(/datum/bounty/virus))
return new subtype
if(8)
var/subtype = pick(subtypesof(/datum/bounty/item/science))
return new subtype
if(9)
var/subtype = pick(subtypesof(/datum/bounty/item/slime))
return new subtype
// Called lazily at startup to populate GLOB.bounties_list with random bounties.
/proc/setup_bounties()
for(var/i = 0; i < 3; ++i)
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
try_add_bounty(new subtype)
for(var/i = 0; i < 1; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/item/mech))
try_add_bounty(new subtype)
for(var/i = 0; i < 2; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/item/chef))
try_add_bounty(new subtype)
for(var/i = 0; i < 1; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/item/security))
try_add_bounty(new subtype)
try_add_bounty(new /datum/bounty/reagent/simple_drink)
try_add_bounty(new /datum/bounty/reagent/complex_drink)
try_add_bounty(new /datum/bounty/reagent/chemical)
for(var/i = 0; i < 1; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/virus))
try_add_bounty(new subtype)
var/datum/bounty/B = pick(GLOB.bounties_list)
B.mark_high_priority()
// Generate these last so they can't be high priority.
try_add_bounty(new /datum/bounty/item/alien_organs)
try_add_bounty(new /datum/bounty/item/syndicate_documents)
try_add_bounty(new /datum/bounty/more_bounties)
/proc/completed_bounty_count()
var/count = 0
for(var/i in GLOB.bounties_list)
var/datum/bounty/B = i
if(B.claimed)
++count
return count
+94
View File
@@ -0,0 +1,94 @@
#define PRINTER_TIMEOUT 10
/obj/machinery/computer/bounty
name = "Nanotrasen bounty console"
desc = "Used to check and claim bounties offered by Nanotrasen"
icon_screen = "bounty"
circuit = /obj/item/circuitboard/computer/bounty
light_color = "#E2853D"//orange
var/printer_ready = 0 //cooldown var
/obj/machinery/computer/bounty/Initialize()
. = ..()
printer_ready = world.time + PRINTER_TIMEOUT
/obj/machinery/computer/bounty/proc/print_paper()
new /obj/item/paper/bounty_printout(loc)
/obj/item/paper/bounty_printout
name = "paper - Bounties"
/obj/item/paper/bounty_printout/Initialize()
. = ..()
info = "<h2>Nanotrasen Cargo Bounties</h2></br>"
for(var/datum/bounty/B in GLOB.bounties_list)
if(B.claimed)
continue
info += "<h3>[B.name]</h3>"
info += "<ul><li>Reward: [B.reward_string()]</li>"
info += "<li>Completed: [B.completion_string()]</li></ul>"
/obj/machinery/computer/bounty/ui_interact(mob/user)
. = ..()
if(!GLOB.bounties_list.len)
setup_bounties()
var/dat = ""
dat += "<a href='?src=[REF(src)];refresh=1'>Refresh</a>"
dat += "<a href='?src=[REF(src)];refresh=1;choice=Print'>Print Paper</a>"
dat += "<p>Credits: <b>[SSshuttle.points]</b></p>"
dat += {"<table style="text-align:center;" border="1" cellspacing="0" width="100%">"}
dat += "<tr><th>Name</th><th>Description</th><th>Reward</th><th>Completion</th><th>Status</th></tr>"
for(var/datum/bounty/B in GLOB.bounties_list)
var/background
if(B.can_claim())
background = "'background-color:#4F7529;'"
else if(B.claimed)
background = "'background-color:#294675;'"
else
background = "'background-color:#990000;'"
dat += "<tr style=[background]>"
if(B.high_priority)
dat += text("<td><b>[]</b></td>", B.name)
dat += text("<td><b>High Priority:</b> []</td>", B.description)
dat += text("<td><b>[]</b></td>", B.reward_string())
else
dat += text("<td>[]</td>", B.name)
dat += text("<td>[]</td>", B.description)
dat += text("<td>[]</td>", B.reward_string())
dat += text("<td>[]</td>", B.completion_string())
if(B.can_claim())
dat += text("<td><A href='?src=[REF(src)];refresh=1;choice=Claim;d_rec=[REF(B)]'>Claim</a></td>")
else if(B.claimed)
dat += text("<td>Claimed</td>")
else
dat += text("<td>Unclaimed</td>")
dat += "</tr>"
dat += "</table>"
var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/machinery/computer/bounty/Topic(href, href_list)
if(..())
return
switch(href_list["choice"])
if("Print")
if(printer_ready < world.time)
printer_ready = world.time + PRINTER_TIMEOUT
print_paper()
if("Claim")
var/datum/bounty/B = locate(href_list["d_rec"])
if(B in GLOB.bounties_list)
B.claim()
if(href_list["refresh"])
playsound(src, "terminal_type", 25, 0)
updateUsrDialog()
+3 -2
View File
@@ -1,6 +1,6 @@
/obj/item/export_scanner
name = "export scanner"
desc = "A device used to check objects against Nanotrasen exports database."
desc = "A device used to check objects against Nanotrasen exports and bounty database."
icon = 'icons/obj/device.dmi'
icon_state = "export_scanner"
item_state = "radio"
@@ -31,8 +31,9 @@
// Before you fix it:
// yes, checking manifests is a part of intended functionality.
var/price = export_item_and_contents(O, cargo_console.contraband, (cargo_console.obj_flags & EMAGGED), dry_run=TRUE)
if(price)
to_chat(user, "<span class='notice'>Scanned [O], value: <b>[price]</b> credits[O.contents.len ? " (contents included)" : ""].</span>")
else
to_chat(user, "<span class='warning'>Scanned [O], no export value.</span>")
if(bounty_ship_item_and_contents(O, dry_run=TRUE))
to_chat(user, "<span class='notice'>Scanned item is eligible for one or more bounties.</span>")
+13 -59
View File
@@ -1,8 +1,5 @@
// Armor, gloves, space suits - it all goes here
/datum/export/gear
// Security gear
/datum/export/gear/sec_helmet
cost = 100
unit_name = "helmet"
@@ -12,37 +9,13 @@
cost = 100
unit_name = "armor vest"
export_types = list(/obj/item/clothing/suit/armor/vest)
include_subtypes = FALSE
/datum/export/gear/riot_helmet
cost = 250
unit_name = "riot helmet"
export_types = list(/obj/item/clothing/head/helmet/riot)
/datum/export/gear/riot_armor
cost = 250
unit_name = "riot armor suit"
export_types = list(/obj/item/clothing/suit/armor/riot)
/datum/export/gear/bulletproof_armor
cost = 250
unit_name = "bulletproof armor vest"
export_types = list(/obj/item/clothing/suit/armor/bulletproof)
/datum/export/gear/reflector_armor
cost = 650
unit_name = "reflector armor vest"
export_types = list(/obj/item/clothing/suit/armor/laserproof)
/datum/export/gear/riot_shield
cost = 400
cost = 100
unit_name = "riot shield"
export_types = list(/obj/item/shield/riot)
// Masks
/datum/export/gear/mask/breath
cost = 2
unit_name = "breath mask"
@@ -55,47 +28,30 @@
include_subtypes = FALSE
// EVA gear
/datum/export/gear/space
/datum/export/gear/space/helmet
cost = 75
unit_name = "space helmet"
export_types = list(/obj/item/clothing/head/helmet/space, /obj/item/clothing/head/helmet/space/eva, /obj/item/clothing/head/helmet/space/nasavoid)
include_subtypes = FALSE
/datum/export/gear/space/helmet
cost = 500
unit_name = "space helmet"
export_types = list(/obj/item/clothing/head/helmet/space, /obj/item/clothing/head/helmet/space/eva)
/datum/export/gear/space/suit
cost = 600
cost = 150
unit_name = "space suit"
export_types = list(/obj/item/clothing/suit/space, /obj/item/clothing/suit/space/eva)
/datum/export/gear/space/voidhelmet
cost = 550
unit_name = "void helmet"
export_types = list(/obj/item/clothing/head/helmet/space/nasavoid)
/datum/export/gear/space/voidsuit
cost = 650
unit_name = "void suit"
export_types = list(/obj/item/clothing/suit/space/nasavoid)
export_types = list(/obj/item/clothing/suit/space, /obj/item/clothing/suit/space/eva, /obj/item/clothing/suit/space/nasavoid)
include_subtypes = FALSE
/datum/export/gear/space/syndiehelmet
cost = 1000
cost = 150
unit_name = "Syndicate space helmet"
export_types = list(/obj/item/clothing/head/helmet/space/syndicate)
include_subtypes = TRUE
/datum/export/gear/space/syndiesuit
cost = 1500
cost = 300
unit_name = "Syndicate space suit"
export_types = list(/obj/item/clothing/suit/space/syndicate)
include_subtypes = TRUE
// Radsuits
/datum/export/gear/radhelmet
cost = 50
unit_name = "radsuit hood"
@@ -106,7 +62,6 @@
unit_name = "radsuit"
export_types = list(/obj/item/clothing/suit/radiation)
// Biosuits
/datum/export/gear/biohood
cost = 50
unit_name = "biosuit hood"
@@ -117,13 +72,12 @@
unit_name = "biosuit"
export_types = list(/obj/item/clothing/suit/bio_suit)
// Bombsuits
/datum/export/gear/bombhelmet
cost = 100
cost = 50
unit_name = "bomb suit hood"
export_types = list(/obj/item/clothing/head/bomb_hood)
/datum/export/gear/bombsuit
cost = 300
cost = 100
unit_name = "bomb suit"
export_types = list(/obj/item/clothing/suit/bomb_suit)
export_types = list(/obj/item/clothing/suit/bomb_suit)
+10 -87
View File
@@ -1,6 +1,3 @@
// Large objects that don't fit in crates, but must be sellable anyway.
// Crates, boxes, lockers.
/datum/export/large/crate
cost = 500
k_elasticity = 0
@@ -29,9 +26,11 @@
export_types = list(/obj/structure/closet/crate/wooden)
exclude_types = list()
/datum/export/large/crate/coffin
cost = 250//50 wooden crates cost 2000 points, and you can make 10 coffins in seconds with those planks. Each coffin selling for 250 means you can make a net gain of 500 points for wasting your time making coffins.
unit_name = "coffin"
export_types = list(/obj/structure/closet/crate/coffin)
// Reagent dispensers.
/datum/export/large/reagent_dispenser
cost = 100 // +0-400 depending on amount of reagents left
var/contents_cost = 400
@@ -58,19 +57,18 @@
// Heavy engineering equipment. Singulo/Tesla parts mostly.
/datum/export/large/emitter
cost = 400
cost = 200
unit_name = "emitter"
export_types = list(/obj/machinery/power/emitter)
/datum/export/large/field_generator
cost = 400
cost = 200
unit_name = "field generator"
export_types = list(/obj/machinery/field/generator)
/datum/export/large/collector
cost = 600
cost = 200
unit_name = "collector"
export_types = list(/obj/machinery/power/rad_collector)
@@ -94,89 +92,14 @@
unit_name = "supermatter shard"
export_types = list(/obj/machinery/power/supermatter_crystal/shard)
// Misc
/datum/export/large/iv
cost = 300
cost = 50
unit_name = "iv drip"
export_types = list(/obj/machinery/iv_drip)
/datum/export/large/barrier
cost = 100
cost = 25
unit_name = "security barrier"
export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security)
//Mecha
/datum/export/large/mech
export_types = list(/obj/mecha)
var/sellable
/datum/export/large/mech/applies_to(obj/O)
if(!..())
return FALSE
var/obj/mecha/ME = O
ME.wreckage = null // So the mech doesn't blow up in the cargo shuttle
if(sellable)
return TRUE
/datum/export/large/mech/sellable
export_types = list()
sellable = TRUE
/datum/export/large/mech/sellable/ripley
cost = 7500 //boards cost 2500 and takes another 1566 worth of materials (glass, metal, plaseel) to build + significant labor
unit_name = "APLU \"Ripley\""
export_types = list(/obj/mecha/working/ripley)
exclude_types = list(/obj/mecha/working/ripley/firefighter)
/datum/export/large/mech/sellable/firefighter
cost = 9000 //same as a ripley but takes 10 more plasteel and 5 less metal
unit_name = "APLU \"Firefighter\""
export_types = list(/obj/mecha/working/ripley/firefighter)
/datum/export/large/mech/sellable/odysseus
cost = 6000 // 1540 of material + 2000 price boards + labor
unit_name = "odysseus"
export_types = list(/obj/mecha/medical/odysseus)
/datum/export/large/mech/sellable/gygax
cost = 25000 // The material is worth 22631 alone. Not as big of a premium as one would expect, since R&D would have provided upgrades by then.
unit_name = "gygax"
export_types = list(/obj/mecha/combat/gygax)
exclude_types = list(/obj/mecha/combat/gygax/dark)
/datum/export/large/mech/sellable/honkmech
cost = 80000 // The bananium alone is worth around 64887 credits
unit_name = "H.O.N.K"
message = "- HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONKHONKHONKHONK"
export_types = list(/obj/mecha/combat/honker)
/datum/export/large/mech/sellable/durand
cost = 12000 // 7586 worth of material. That's less than a gygax. Players will be disappointed by the durand's comparative lack of worth but oh well. Still a large premium because this requires significant cooperation between R&D, robotics, and cargo.
unit_name = "durand"
export_types = list(/obj/mecha/combat/durand)
/datum/export/large/mech/sellable/phazon
cost = 50000 // 15767 material + anomaly core. Fuck it, if you're willing to try selling one of these you should get BIG FUCKING MONEY
unit_name = "phazon"
export_types = list(/obj/mecha/combat/phazon)
/datum/export/large/mech/sellable/syndiegygax
cost = 50000 // You somehow stole a nuke op's gygax and sold it to nanotrasen. Go you.
unit_name = "captured syndicate gygax"
export_types = list(/obj/mecha/combat/gygax/dark)
/datum/export/large/mech/sellable/syndiegygax/syndie
cost = 25000 // You somehow stole a nuke op's gygax and sold it back to the syndicate. Why would you do this?
unit_name = "gygax"
emagged = TRUE
/datum/export/large/mech/sellable/mauler
cost = 87500 // Whoa, momma.
unit_name = "captured mauler"
export_types = list(/obj/mecha/combat/marauder/mauler)
/datum/export/large/mech/sellable/mauler/syndie
cost = 43750 // Just like the mauler is worth 1.75x the telecrystals compared to the gygax, the price reflects this
unit_name = "mauler"
emagged = TRUE
+11 -19
View File
@@ -29,65 +29,57 @@
// Materials. Nothing but plasma is really worth selling. Better leave it all to RnD and sell some plasma instead.
// Bananium. Exporting it makes the clown cry. Priceless.
/datum/export/material/bananium
cost = 5000
cost = 1000
material_id = MAT_BANANIUM
message = "cm3 of bananium"
// Diamonds. Rare and expensive.
/datum/export/material/diamond
cost = 2500
cost = 500
material_id = MAT_DIAMOND
message = "cm3 of diamonds"
// Plasma. The oil of 26 century. The reason why you are here.
/datum/export/material/plasma
cost = 300
cost = 200
k_elasticity = 0
material_id = MAT_PLASMA
message = "cm3 of plasma"
// Uranium. Still useful for both power generation and nuclear annihilation.
/datum/export/material/uranium
cost = 400
cost = 100
material_id = MAT_URANIUM
message = "cm3 of uranium"
// Gold. Used in electronics and corrosion-resistant plating.
/datum/export/material/gold
cost = 250
cost = 125
material_id = MAT_GOLD
message = "cm3 of gold"
// Silver.
/datum/export/material/silver
cost = 100
cost = 50
material_id = MAT_SILVER
message = "cm3 of silver"
// Titanium.
/datum/export/material/titanium
cost = 250
cost = 125
material_id = MAT_TITANIUM
message = "cm3 of titanium"
// Plastitanium.
/datum/export/material/plastitanium
cost = 550
material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium, so ((250 x 250) + (250 x 500)) / 250
cost = 325 // plasma + titanium costs
material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium
message = "cm3 of plastitanium"
// Metal. Common building material.
/datum/export/material/metal
cost = 5
message = "cm3 of metal"
material_id = MAT_METAL
export_types = list(
/obj/item/stack/sheet/metal, /obj/item/stack/tile/plasteel,
/obj/item/stack/rods, /obj/item/stack/ore, /obj/item/coin)
// Glass. Common building material.
/datum/export/material/glass
cost = 5
message = "cm3 of glass"
material_id = MAT_GLASS
export_types = list(/obj/item/stack/sheet/glass, /obj/item/stack/ore,
+1 -1
View File
@@ -1,5 +1,5 @@
/datum/export/seed
cost = 100 // Gets multiplied by potency
cost = 50 // Gets multiplied by potency
k_elasticity = 1 //price inelastic/quantity elastic, only need to export a few samples
unit_name = "new plant species sample"
export_types = list(/obj/item/seeds)
+15 -47
View File
@@ -1,7 +1,3 @@
//
// Sheet Exports
//
/datum/export/stack
unit_name = "sheet"
@@ -11,106 +7,87 @@
return S.amount
return 0
// Hides
// Leather, skin and other farming by-products.
/datum/export/stack/skin
unit_name = ""
// Monkey hide. Cheap.
/datum/export/stack/skin/monkey
cost = 150
cost = 50
unit_name = "monkey hide"
export_types = list(/obj/item/stack/sheet/animalhide/monkey)
// Human skin. Illegal
/datum/export/stack/skin/human
cost = 2000
cost = 100
contraband = TRUE
unit_name = "piece"
message = "of human skin"
export_types = list(/obj/item/stack/sheet/animalhide/human)
// Goliath hide. Expensive.
/datum/export/stack/skin/goliath_hide
cost = 2500
cost = 200
unit_name = "goliath hide"
export_types = list(/obj/item/stack/sheet/animalhide/goliath_hide)
// Cat hide. Just in case Runtime is catsploding again.
/datum/export/stack/skin/cat
cost = 2000
cost = 150
contraband = TRUE
unit_name = "cat hide"
export_types = list(/obj/item/stack/sheet/animalhide/cat)
// Corgi hide. You monster.
/datum/export/stack/skin/corgi
cost = 2500
cost = 200
contraband = TRUE
unit_name = "corgi hide"
export_types = list(/obj/item/stack/sheet/animalhide/corgi)
// Lizard hide. Very expensive.
/datum/export/stack/skin/lizard
cost = 5000
cost = 150
unit_name = "lizard hide"
export_types = list(/obj/item/stack/sheet/animalhide/lizard)
// Gondola hide. Mindbogglingly expensive.
/datum/export/stack/skin/gondola
cost = 10000
cost = 500
unit_name = "gondola hide"
export_types = list(/obj/item/stack/sheet/animalhide/gondola)
// Alien hide. Extremely expensive.
/datum/export/stack/skin/xeno
cost = 3000
cost = 500
unit_name = "alien hide"
export_types = list(/obj/item/stack/sheet/animalhide/xeno)
// Common materials.
// For base materials, see materials.dm
// Plasteel. Lightweight, strong and contains some plasma too.
/datum/export/stack/plasteel
cost = 305 // 2000u of plasma + 2000u of metal.
cost = 155 // 2000u of plasma + 2000u of metal.
message = "of plasteel"
export_types = list(/obj/item/stack/sheet/plasteel)
// Reinforced Glass. Common building material. 1 glass + 0.5 metal, cost is rounded up.
// 1 glass + 0.5 metal, cost is rounded up.
/datum/export/stack/rglass
cost = 8
message = "of reinforced glass"
export_types = list(/obj/item/stack/sheet/rglass)
// Bluespace Polycrystals. Uncommon.
/datum/export/stack/bscrystal
cost = 750
cost = 300
message = "of bluespace crystals"
export_types = list(/obj/item/stack/sheet/bluespace_crystal)
// Wood. Quite expensive in the grim and dark 26 century.
/datum/export/stack/wood
cost = 50
cost = 30
unit_name = "wood plank"
export_types = list(/obj/item/stack/sheet/mineral/wood)
// Cardboard. Cheap.
/datum/export/stack/cardboard
cost = 2
message = "of cardboard"
export_types = list(/obj/item/stack/sheet/cardboard)
// Sandstone. Literally dirt cheap.
/datum/export/stack/sandstone
cost = 1
unit_name = "block"
message = "of sandstone"
export_types = list(/obj/item/stack/sheet/mineral/sandstone)
// Cable.
/datum/export/stack/cable
cost = 0.2
unit_name = "cable piece"
@@ -118,23 +95,14 @@
// Weird Stuff
// Alien Alloy. Like plasteel, but better.
// Major players would pay a lot to get some, so you can get a lot of money from producing and selling those.
// Just don't forget to fire all your production staff before the end of month.
/datum/export/stack/abductor
cost = 5000
cost = 1000
message = "of alien alloy"
export_types = list(/obj/item/stack/sheet/mineral/abductor)
// Adamantine. Does not occur naurally.
/datum/export/stack/adamantine
unit_name = "bar"
cost = 7500
cost = 500
message = "of adamantine"
export_types = list(/obj/item/stack/sheet/mineral/adamantine)
// Mythril. Does not occur naurally.
/datum/export/stack/mythril
cost = 15000
message = "of mythril"
export_types = list(/obj/item/stack/sheet/mineral/mythril)
+3 -10
View File
@@ -1,5 +1,3 @@
// Various tools and handheld engineering devices.
/datum/export/toolbox
cost = 4
unit_name = "toolbox"
@@ -34,7 +32,6 @@
export_types = list(/obj/item/wirecutters)
// Welding tools
/datum/export/weldingtool
cost = 5
unit_name = "welding tool"
@@ -52,7 +49,6 @@
export_types = list(/obj/item/weldingtool/largetank, /obj/item/weldingtool/hugetank)
// Fire extinguishers
/datum/export/extinguisher
cost = 15
unit_name = "fire extinguisher"
@@ -65,7 +61,6 @@
export_types = list(/obj/item/extinguisher/mini)
// Flashlights
/datum/export/flashlight
cost = 5
unit_name = "flashlight"
@@ -83,7 +78,6 @@
export_types = list(/obj/item/flashlight/seclite)
// Analyzers and Scanners
/datum/export/analyzer
cost = 5
unit_name = "analyzer"
@@ -102,18 +96,17 @@
exclude_types = list(/obj/item/radio/mech)
// High-tech tools.
/datum/export/rcd
cost = 100 // 15 metal -> 75 credits, +25 credits for production
cost = 100
unit_name = "rapid construction device"
export_types = list(/obj/item/construction/rcd)
/datum/export/rcd_ammo
cost = 60 // 6 metal, 4 glass -> 50 credits, +10 credits
cost = 60
unit_name = "compressed matter cardridge"
export_types = list(/obj/item/rcd_ammo)
/datum/export/rpd
cost = 350 // 37.5 metal, 18.75 glass -> 281.25 credits, + some
cost = 100
unit_name = "rapid piping device"
export_types = list(/obj/item/pipe_dispenser)
+10 -11
View File
@@ -11,18 +11,18 @@
include_subtypes = TRUE
/datum/export/weapon/knife
cost = 750
cost = 100
unit_name = "combat knife"
export_types = list(/obj/item/kitchen/knife/combat)
/datum/export/weapon/taser
cost = 250
cost = 200
unit_name = "advanced taser"
export_types = list(/obj/item/gun/energy/e_gun/advtaser)
/datum/export/weapon/laser
cost = 250
cost = 200
unit_name = "laser gun"
export_types = list(/obj/item/gun/energy/laser)
@@ -32,35 +32,34 @@
export_types = list(/obj/item/gun/energy/disabler)
/datum/export/weapon/energy_gun
cost = 900
cost = 300
unit_name = "energy gun"
export_types = list(/obj/item/gun/energy/e_gun)
/datum/export/weapon/wt550
cost = 1400
cost = 300
unit_name = "WT-550 automatic rifle"
export_types = list(/obj/item/gun/ballistic/automatic/wt550)
/datum/export/weapon/shotgun
cost = 350
cost = 300
unit_name = "combat shotgun"
export_types = list(/obj/item/gun/ballistic/shotgun/automatic/combat)
/datum/export/weapon/flashbang
cost = 15
cost = 5
unit_name = "flashbang grenade"
export_types = list(/obj/item/grenade/flashbang)
/datum/export/weapon/teargas
cost = 15
cost = 5
unit_name = "tear gas grenade"
export_types = list(/obj/item/grenade/chem_grenade/teargas)
/datum/export/weapon/flash
cost = 10
cost = 5
unit_name = "handheld flash"
export_types = list(/obj/item/assembly/flash)
include_subtypes = TRUE
@@ -97,7 +96,7 @@
cost = 40000
unit_name = "Blood Contract"
export_types = list(/obj/item/blood_contract)
//Artifacts of lavaland
/datum/export/weapon/immortality_talisman
+80 -21
View File
@@ -1,23 +1,38 @@
#define MAX_EMAG_ROCKETS 8
#define BEACON_COST 5000
#define SP_LINKED 1
#define SP_READY 2
#define SP_LAUNCH 3
#define SP_UNLINK 4
#define SP_UNREADY 5
/obj/machinery/computer/cargo/express
name = "express supply console"
desc = "This console allows the user to purchase a package \
with 1/40th of the delivery time: made possible by NanoTrasen's new \"Drop Pod Railgun\".\
with 1/40th of the delivery time: made possible by NanoTrasen's new \"1500mm Orbital Railgun\".\
All sales are near instantaneous - please choose carefully"
icon_screen = "supply_express"
circuit = /obj/item/circuitboard/computer/cargo/express
blockade_warning = "Bluespace instability detected. Delivery impossible."
req_access = list(ACCESS_QM)
var/message
var/locked = TRUE
var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names.
var/list/meme_pack_data
var/podID = 0//0 is your standard supply droppod (requires dissassembly after landing), 1 is the bluespace drop pod (teleports out after landing)
var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon
var/area/landingzone = /area/quartermaster/storage //where we droppin boys
var/podID = POD_STANDARD //0 is your standard supply supplypod (requires dissassembly after landing), 1 is the bluespace supply pod (teleports out after landing)
var/cooldown = 0 //cooldown to prevent printing supplypod beacon spam
var/locked = TRUE //is the console locked? unlock with ID
var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in
/obj/machinery/computer/cargo/express/Initialize()
. = ..()
packin_up()
/obj/machinery/computer/cargo/express/Destroy()
if(beacon)
beacon.unlink_console()
return ..()
/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params)
if((istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) && allowed(user))
@@ -25,17 +40,24 @@
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the interface.</span>")
return
else if(istype(W, /obj/item/disk/cargo/bluespace_pod))
podID = 1//doesnt effect circuit board, so that reversal is possible
podID = POD_BLUESPACE//doesnt effect circuit board, making reversal possible
to_chat(user, "<span class='notice'>You insert the disk into [src], allowing for advanced supply delivery vehicles.</span>")
qdel(W)
return TRUE
else if(istype(W, /obj/item/supplypod_beacon))
var/obj/item/supplypod_beacon/sb = W
if (sb.express_console != src)
sb.link_console(src, user)
return TRUE
else
to_chat(user, "<span class='notice'>[src] is already linked to [sb].</span>")
..()
/obj/machinery/computer/cargo/express/emag_act(mob/living/user)
if(obj_flags & EMAGGED)
return
user.visible_message("<span class='warning'>[user] swipes a suspicious card through [src]!</span>",
"<span class='notice'>You change the routing protocols, allowing the Drop Pod to land anywhere on the station.</span>")
"<span class='notice'>You change the routing protocols, allowing the Supply Pod to land anywhere on the station.</span>")
obj_flags |= EMAGGED
// This also sets this on the circuit board
var/obj/item/circuitboard/computer/cargo/board = circuit
@@ -68,29 +90,58 @@
ui = new(user, src, ui_key, "cargo_express", name, 1000, 800, master_ui, state)
ui.open()
/obj/machinery/computer/cargo/express/ui_data(mob/user)
var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
var/list/data = list()
data["locked"] = locked
data["locked"] = locked//swipe an ID to unlock
data["siliconUser"] = user.has_unlimited_silicon_privilege
data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay?
data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
data["canBuyBeacon"] = cooldown <= 0 && SSshuttle.points >= BEACON_COST
data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
data["hasBeacon"] = beacon != null//is there a linked beacon?
data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
data["points"] = SSshuttle.points
data["supplies"] = list()
message = "Sales are near-instantaneous - please choose carefully."
if(SSshuttle.supplyBlocked)
message = blockade_warning
if(usingBeacon && !beacon)
message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed
else if (usingBeacon && !canBeacon)
message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf
if(obj_flags & EMAGGED)
message = "(&!#@ERROR: ROUTING_#PROTOCOL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD."
data["message"] = message
if(!meme_pack_data)
packin_up()
stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]")
data["supplies"] = meme_pack_data
if (cooldown > 0)//cooldown used for printing beacons
cooldown--
return data
/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
switch(action)
if("LZCargo")
usingBeacon = FALSE
if (beacon)
beacon.update_status(SP_UNREADY) //ready light on beacon will turn off
if("LZBeacon")
usingBeacon = TRUE
if (beacon)
beacon.update_status(SP_READY) //turns on the beacon's ready light
if("printBeacon")
if (SSshuttle.points >= BEACON_COST)
cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
beacon.name = "Supply Pod Beacon #[printed_beacons]"
SSshuttle.points -= BEACON_COST
if("add")//Generate Supply Order first
var/id = text2path(params["id"])
var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
@@ -108,35 +159,43 @@
rank = "Silicon"
var/reason = ""
var/list/empty_turfs
var/area/landingzone
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
if(!(obj_flags & EMAGGED))
if(SO.pack.cost <= SSshuttle.points)
landingzone = locate(/area/quartermaster/storage) in GLOB.sortedAreas
for(var/turf/open/floor/T in landingzone.contents)
if(is_blocked_turf(T))
continue
LAZYADD(empty_turfs, T)
CHECK_TICK
if(empty_turfs && empty_turfs.len)
var/LZ = empty_turfs[rand(empty_turfs.len-1)]
var/LZ
if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay
LZ = get_turf(beacon)
beacon.update_status(SP_LAUNCH)
else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay
landingzone = locate(/area/quartermaster/storage) in GLOB.sortedAreas
if (!landingzone)
WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.")
landingzone = get_area(src)
for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone
if(is_blocked_turf(T))
continue
LAZYADD(empty_turfs, T)
CHECK_TICK
if(empty_turfs && empty_turfs.len)
LZ = pick(empty_turfs)
if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call
SSshuttle.points -= SO.pack.cost
new /obj/effect/DPtarget(LZ, SO, podID)
. = TRUE
update_icon()
else
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^)
landingzone = locate(pick(GLOB.the_station_areas)) in GLOB.sortedAreas
landingzone = locate(pick(GLOB.the_station_areas)) in GLOB.sortedAreas //override default landing zone
for(var/turf/open/floor/T in landingzone.contents)
if(is_blocked_turf(T))
continue
LAZYADD(empty_turfs, T)
CHECK_TICK
if(empty_turfs && empty_turfs.len)
SSshuttle.points -= SO.pack.cost * (1.2*MAX_EMAG_ROCKETS)
SSshuttle.points -= SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)
SO.generateRequisition(get_turf(src))
for(var/i in 1 to MAX_EMAG_ROCKETS)
var/LZ = empty_turfs[rand(empty_turfs.len-1)]
var/LZ = pick(empty_turfs)
LAZYREMOVE(empty_turfs, LZ)
new /obj/effect/DPtarget(LZ, SO, podID)
. = TRUE
+86 -16
View File
@@ -32,11 +32,12 @@
if (admin_spawned)
for(var/item in contains)
var/atom/A = new item(C)
A.admin_spawned = TRUE
A.flags_1 |= ADMIN_SPAWNED_1
else
for(var/item in contains)
new item(C)
// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Emergency ///////////////////////////////////////
@@ -715,7 +716,7 @@
//////////////////////////////////////////////////////////////////////////////
//////////////////////// Engine Construction /////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/engine
group = "Engine Construction"
@@ -851,7 +852,7 @@
crate_name = "supermatter shard crate"
crate_type = /obj/structure/closet/crate/secure/engineering
dangerous = TRUE
/datum/supply_pack/engine/tesla_coils
name = "Tesla Coil Crate"
desc = "Whether it's high-voltage executions, creating research points, or just plain old power generation: This pack of four Tesla coils can do it all!"
@@ -1406,7 +1407,7 @@
/obj/item/vending_refill/cola,
/obj/item/vending_refill/cola)
crate_name = "soft drinks supply crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Organic /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -1430,7 +1431,7 @@
name = "Beekeeping Starter Crate"
desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!"
cost = 1500
contains = list(/obj/structure/beebox,
contains = list(/obj/structure/beebox/unwrenched,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
@@ -1706,14 +1707,6 @@
/datum/supply_pack/costumes_toys
group = "Costumes & Toys"
/datum/supply_pack/costumes_toys/autodrobe
name = "Autodrobe Supply Crate"
desc = "Autodrobe missing your favorite dress? Solve that issue today with these two autodrobe refills."
cost = 1500
contains = list(/obj/item/vending_refill/autodrobe,
/obj/item/vending_refill/autodrobe)
crate_name = "autodrobe supply crate"
/datum/supply_pack/costumes_toys/randomised
name = "Collectable Hats Crate"
desc = "Flaunt your status with three unique, highly-collectable hats!"
@@ -1942,6 +1935,73 @@
var/item = pick_n_take(L)
new item(C)
/datum/supply_pack/costumes_toys/wardrobes/autodrobe
name = "Autodrobe Supply Crate"
desc = "Autodrobe missing your favorite dress? Solve that issue today with these two autodrobe refills."
cost = 1500
contains = list(/obj/item/vending_refill/autodrobe,
/obj/item/vending_refill/autodrobe)
crate_name = "autodrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/cargo
name = "Cargo Department Supply Crate"
desc = "This crate contains a refill for the CargoDrobe."
cost = 750
contains = list(/obj/item/vending_refill/wardrobe/cargo_wardrobe)
crate_name = "cargo department supply crate"
/datum/supply_pack/costumes_toys/wardrobes/engineering
name = "Engineering Department Wardrobe Supply Crate"
desc = "This crate contains refills for the EngiDrobe and AtmosDrobe."
cost = 1500
contains = list(/obj/item/vending_refill/wardrobe/engi_wardrobe,
/obj/item/vending_refill/wardrobe/atmos_wardrobe)
crate_name = "engineering department wardrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/general
name = "General Wardrobes Supply Crate"
desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe."
cost = 3750
contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe,
/obj/item/vending_refill/wardrobe/bar_wardrobe,
/obj/item/vending_refill/wardrobe/chef_wardrobe,
/obj/item/vending_refill/wardrobe/jani_wardrobe,
/obj/item/vending_refill/wardrobe/chap_wardrobe)
crate_name = "general wardrobes vendor refills"
/datum/supply_pack/costumes_toys/wardrobes/hydroponics
name = "Hydrobe Supply Crate"
desc = "This crate contains a refill for the Hydrobe."
cost = 750
contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe)
crate_name = "hydrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/medical
name = "Medical Department Wardrobe Supply Crate"
desc = "This crate contains refills for the MediDrobe, ChemDrobe, GeneDrobe, and ViroDrobe."
cost = 3000
contains = list(/obj/item/vending_refill/wardrobe/medi_wardrobe,
/obj/item/vending_refill/wardrobe/chem_wardrobe,
/obj/item/vending_refill/wardrobe/gene_wardrobe,
/obj/item/vending_refill/wardrobe/viro_wardrobe)
crate_name = "medical department wardrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/science
name = "Science Department Wardrobe Supply Crate"
desc = "This crate contains refills for the SciDrobe and RoboDrobe."
cost = 1500
contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe,
/obj/item/vending_refill/wardrobe/science_wardrobe)
crate_name = "science department wardrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/security
name = "Security Department Supply Crate"
desc = "This crate contains refills for the SecDrobe and LawDrobe."
cost = 1500
contains = list(/obj/item/vending_refill/wardrobe/sec_wardrobe,
/obj/item/vending_refill/wardrobe/law_wardrobe)
crate_name = "security department supply crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Miscellaneous ///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -2033,6 +2093,17 @@
contains = list(/obj/item/storage/box/fountainpens)
crate_type = /obj/structure/closet/crate/wooden
/datum/supply_pack/misc/funeral
name = "Funeral Supply crate"
desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers."
cost = 600
contains = list(/obj/item/clothing/under/burial,
/obj/item/reagent_containers/food/snacks/grown/harebell,
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium
)
crate_name = "coffin"
crate_type = /obj/structure/closet/crate/coffin
/datum/supply_pack/misc/religious_supplies
name = "Religious Supplies Crate"
desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
@@ -2042,9 +2113,8 @@
/obj/item/storage/book/bible/booze,
/obj/item/storage/book/bible/booze,
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial)
/obj/item/clothing/suit/hooded/chaplain_hoodie
)
crate_name = "religious supplies crate"
/datum/supply_pack/misc/toner
+93
View File
@@ -0,0 +1,93 @@
/obj/item/supplypod_beacon
name = "Supply Pod Beacon"
desc = "A device that can be linked to an Express Supply Console for precision supply pod deliveries. Alt-click to remove link."
icon = 'icons/obj/device.dmi'
icon_state = "supplypod_beacon"
item_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
var/obj/machinery/computer/cargo/express/express_console
var/linked = FALSE
var/ready = FALSE
var/launched = FALSE
/obj/item/supplypod_beacon/proc/update_status(var/consoleStatus)
switch(consoleStatus)
if (SP_LINKED)
linked = TRUE
playsound(src,'sound/machines/twobeep.ogg',50,0)
if (SP_READY)
ready = TRUE
if (SP_LAUNCH)
launched = TRUE
playsound(src,'sound/machines/triple_beep.ogg',50,0)
playsound(src,'sound/machines/warning-buzzer.ogg',50,0)
addtimer(CALLBACK(src, .proc/endLaunch), 33)//wait 3.3 seconds (time it takes for supplypod to land), then update icon
if (SP_UNLINK)
linked = FALSE
playsound(src,'sound/machines/synth_no.ogg',50,0)
if (SP_UNREADY)
ready = FALSE
update_icon()
/obj/item/supplypod_beacon/update_icon()
cut_overlays()
if (launched)
add_overlay("sp_green")
else if (ready)
add_overlay("sp_yellow")
else if (linked)
add_overlay("sp_orange")
/obj/item/supplypod_beacon/proc/endLaunch()
launched = FALSE
update_status()
/obj/item/supplypod_beacon/examine(user)
..()
if(!express_console)
to_chat(user, "<span class='notice'>[src] is not currently linked to a Express Supply console.</span>")
/obj/item/supplypod_beacon/Destroy()
if(express_console)
express_console.beacon = null
return ..()
/obj/item/supplypod_beacon/proc/unlink_console()
if(express_console)
express_console.beacon = null
express_console = null
update_status(SP_UNLINK)
update_status(SP_UNREADY)
/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user)
if (C.beacon)//if new console has a beacon, then...
C.beacon.unlink_console()//unlink the old beacon from new console
if (express_console)//if this beacon has an express console
express_console.beacon = null//remove the connection the expressconsole has from beacons
express_console = C//set the linked console var to the console
express_console.beacon = src//out with the old in with the news
update_status(SP_LINKED)
if (express_console.usingBeacon)
update_status(SP_READY)
to_chat(user, "<span class='notice'>[src] linked to [C].</span>")
/obj/item/supplypod_beacon/AltClick(mob/user)
if (!user.canUseTopic(src, !issilicon(user)))
return
if (express_console)
unlink_console()
else
to_chat(user, "<span class='notice'>There is no linked console!</span>")
/obj/item/supplypod_beacon/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/pen)) //give a tag that is visible from the linked express console
var/new_beacon_name = stripped_input(user, "What would you like the tag to be?")
if(!user.canUseTopic(src, BE_CLOSE))
return
if(new_beacon_name)
name += " ([tag])"
return
else
return ..()
+2 -1
View File
@@ -1,4 +1,4 @@
/client/verb/who()
/*/client/verb/who() Commenting this file out to be overridden in modular_citadel
set name = "Who"
set category = "OOC"
@@ -87,3 +87,4 @@
msg += "<span class='info'>Adminhelps are also sent to Discord. If no admins are available in game adminhelp anyways and an admin on Discord will see it and respond.</span>"
to_chat(src, msg)
*/
+133 -3
View File
@@ -68,6 +68,73 @@
return 1
/datum/action/chameleon_outfit
name = "Select Chameleon Outfit"
button_icon_state = "chameleon_outfit"
var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first.
/datum/action/chameleon_outfit/New()
..()
initialize_outfits()
/datum/action/chameleon_outfit/proc/initialize_outfits()
var/static/list/standard_outfit_options
if(!standard_outfit_options)
standard_outfit_options = list()
for(var/path in subtypesof(/datum/outfit/job))
var/datum/outfit/O = path
if(initial(O.can_be_admin_equipped))
standard_outfit_options[initial(O.name)] = path
sortTim(standard_outfit_options, /proc/cmp_text_asc)
outfit_options = standard_outfit_options
/datum/action/chameleon_outfit/Trigger()
return select_outfit(owner)
/datum/action/chameleon_outfit/proc/select_outfit(mob/user)
if(!user || !IsAvailable())
return FALSE
var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options
if(!IsAvailable() || QDELETED(src) || QDELETED(user))
return FALSE
var/outfit_type = outfit_options[selected]
if(!outfit_type)
return FALSE
var/datum/outfit/O = new outfit_type()
var/list/outfit_types = O.get_chameleon_disguise_info()
for(var/V in user.chameleon_item_actions)
var/datum/action/item_action/chameleon/change/A = V
var/done = FALSE
for(var/T in outfit_types)
for(var/name in A.chameleon_list)
if(A.chameleon_list[name] == T)
A.update_look(user, T)
outfit_types -= T
done = TRUE
break
if(done)
break
//hardsuit helmets/suit hoods
if(O.toggle_helmet && (ispath(O.suit, /obj/item/clothing/suit/space/hardsuit) || ispath(O.suit, /obj/item/clothing/suit/hooded)) && ishuman(user))
var/mob/living/carbon/human/H = user
//make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat
if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon))
var/helmet_type
if(ispath(O.suit, /obj/item/clothing/suit/space/hardsuit))
var/obj/item/clothing/suit/space/hardsuit/hardsuit = O.suit
helmet_type = initial(hardsuit.helmettype)
else
var/obj/item/clothing/suit/hooded/hooded = O.suit
helmet_type = initial(hooded.hoodtype)
if(helmet_type)
var/obj/item/clothing/head/chameleon/hat = H.head
hat.chameleon_action.update_look(user, helmet_type)
qdel(O)
return TRUE
/datum/action/item_action/chameleon/change
name = "Chameleon Change"
var/list/chameleon_blacklist = list() //This is a typecache
@@ -77,6 +144,24 @@
var/emp_timer
/datum/action/item_action/chameleon/change/Grant(mob/M)
if(M && (owner != M))
if(!M.chameleon_item_actions)
M.chameleon_item_actions = list(src)
var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit()
O.Grant(M)
else
M.chameleon_item_actions |= src
..()
/datum/action/item_action/chameleon/change/Remove(mob/M)
if(M && (M == owner))
LAZYREMOVE(M.chameleon_item_actions, src)
if(!LAZYLEN(M.chameleon_item_actions))
var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions
qdel(O)
..()
/datum/action/item_action/chameleon/change/proc/initialize_disguises()
if(button)
button.name = "Change [chameleon_name] Appearance"
@@ -85,9 +170,7 @@
for(var/V in typesof(chameleon_type))
if(ispath(V) && ispath(V, /obj/item))
var/obj/item/I = V
if(chameleon_blacklist[V] || (initial(I.flags_1) & ABSTRACT_1))
continue
if(!initial(I.icon_state) || !initial(I.item_state))
if(chameleon_blacklist[V] || (initial(I.flags_1) & ABSTRACT_1) || !initial(I.icon_state))
continue
var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])"
chameleon_list[chameleon_item_name] = I
@@ -195,6 +278,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/under/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/under/chameleon/broken/Initialize()
@@ -221,6 +307,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/suit/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/suit/chameleon/broken/Initialize()
@@ -246,6 +335,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/glasses/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/glasses/chameleon/broken/Initialize()
@@ -272,6 +364,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/gloves/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/gloves/chameleon/broken/Initialize()
@@ -298,6 +393,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/head/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/head/chameleon/broken/Initialize()
@@ -345,6 +443,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/mask/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/mask/chameleon/broken/Initialize()
@@ -395,6 +496,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/shoes/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/shoes/chameleon/noslip
@@ -420,6 +524,9 @@
chameleon_action.initialize_disguises()
/obj/item/storage/backpack/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/storage/backpack/chameleon/broken/Initialize()
@@ -445,6 +552,9 @@
STR.silent = TRUE
/obj/item/storage/belt/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/storage/belt/chameleon/broken/Initialize()
@@ -463,6 +573,9 @@
chameleon_action.initialize_disguises()
/obj/item/radio/headset/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/radio/headset/chameleon/broken/Initialize()
@@ -482,8 +595,25 @@
chameleon_action.initialize_disguises()
/obj/item/pda/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/pda/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/stamp/chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/stamp/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/stamp
chameleon_action.chameleon_name = "Stamp"
chameleon_action.initialize_disguises()
/obj/item/stamp/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
+1 -1
View File
@@ -90,7 +90,7 @@
for(var/variable in user_vars_to_edit)
if(variable in user.vars)
LAZYSET(user_vars_remembered, variable, user.vars[variable])
user.vars[variable] = user_vars_to_edit[variable]
user.vv_edit_var(variable, user_vars_to_edit[variable])
/obj/item/clothing/examine(mob/user)
..()
+6 -2
View File
@@ -286,8 +286,10 @@
glass_colour_type = /datum/client_colour/glass_colour/red
/obj/item/clothing/glasses/thermal/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
thermal_overload()
..()
/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete
name = "chameleon thermals"
@@ -305,7 +307,9 @@
chameleon_action.initialize_disguises()
/obj/item/clothing/glasses/thermal/syndi/emp_act(severity)
..()
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
/obj/item/clothing/glasses/thermal/monocle
+7 -2
View File
@@ -17,7 +17,8 @@
H.remove_hud_from(user)
/obj/item/clothing/glasses/hud/emp_act(severity)
if(obj_flags & EMAGGED)
. = ..()
if(obj_flags & EMAGGED || . & EMP_PROTECT_SELF)
return
obj_flags |= EMAGGED
desc = "[desc] The display is flickering slightly."
@@ -96,6 +97,8 @@
/obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
chameleon_action.emp_randomise()
@@ -192,5 +195,7 @@
user.update_inv_glasses()
/obj/item/clothing/glasses/hud/toggle/thermal/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
thermal_overload()
..()
-6
View File
@@ -233,12 +233,6 @@
icon_state = "knight_red"
item_state = "knight_red"
/obj/item/clothing/head/helmet/knight/templar
name = "crusader helmet"
desc = "Deus Vult."
icon_state = "knight_templar"
item_state = "knight_templar"
/obj/item/clothing/head/helmet/skull
name = "skull helmet"
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
-18
View File
@@ -55,24 +55,6 @@
flags_inv = HIDEHAIR
flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/cage
name = "cage"
desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is."
alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
icon_state = "cage"
item_state = "cage"
worn_x_dimension = 64
worn_y_dimension = 64
dynamic_hair_suffix = ""
/obj/item/clothing/head/witchunter_hat
name = "witchunter hat"
desc = "This hat saw much use back in the day."
icon_state = "witchhunterhat"
item_state = "witchhunterhat"
flags_cover = HEADCOVERSEYES
//Detective
/obj/item/clothing/head/fedora/det_hat
name = "detective's fedora"
+39
View File
@@ -0,0 +1,39 @@
/datum/outfit/vr
name = "Basic VR"
uniform = /obj/item/clothing/under/color/random
shoes = /obj/item/clothing/shoes/sneakers/black
ears = /obj/item/radio/headset
id = /obj/item/card/id
/datum/outfit/vr/post_equip(mob/living/carbon/human/H)
var/datum/job/captain/J = new/datum/job/captain
var/obj/item/card/id/id = H.wear_id
if (id)
id.access |= J.get_access()
/datum/outfit/vr/syndicate
name = "Syndicate VR Operative - Basic"
uniform = /obj/item/clothing/under/syndicate
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
back = /obj/item/storage/backpack
id = /obj/item/card/id/syndicate
belt = /obj/item/gun/ballistic/automatic/pistol
l_pocket = /obj/item/paper/fluff/vr/fluke_ops
backpack_contents = list(/obj/item/storage/box/syndie=1,\
/obj/item/kitchen/knife/combat/survival)
/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H)
. = ..()
var/obj/item/radio/uplink/U = new /obj/item/radio/uplink/nuclear_restricted(H, H.key, 80)
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
W.implant(H)
var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
E.implant(H)
H.faction |= ROLE_SYNDICATE
H.update_icons()
/obj/item/paper/fluff/vr/fluke_ops
name = "Where is my uplink?"
info = "Use the radio in your backpack."
@@ -67,6 +67,9 @@
return ..()
/obj/item/clothing/suit/space/chronos/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
var/mob/living/carbon/human/user = src.loc
switch(severity)
if(1)
@@ -189,11 +189,13 @@
. = ..()
/obj/item/flightpack/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
var/damage = severity == 1 ? emp_strong_damage : emp_weak_damage
if(emp_damage <= (emp_disable_threshold * 1.5))
emp_damage += damage
usermessage("WARNING: Class [severity] EMP detected! Circuit damage at [(emp_damage/emp_disable_threshold)*100]%!", "boldwarning")
return ..()
//Proc to change amount of momentum the wearer has, or dampen all momentum by a certain amount.
/obj/item/flightpack/proc/adjust_momentum(amountx, amounty, reduce_amount_total = 0)
@@ -758,7 +760,7 @@
item_state = "flightsuit"
strip_delay = 30
w_class = WEIGHT_CLASS_BULKY
resistance_flags = FIRE_PROOF
resistance_flags = FIRE_PROOF | ACID_PROOF
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/flightsuit
jetpack = null
actions_types = list(/datum/action/item_action/flightsuit/toggle_helmet, /datum/action/item_action/flightsuit/toggle_boots, /datum/action/item_action/flightsuit/toggle_flightpack, /datum/action/item_action/flightsuit/lock_suit)
@@ -1079,12 +1081,12 @@
icon_state = "flighthelmet"
item_state = "flighthelmet"
item_color = "flight"
resistance_flags = FIRE_PROOF
resistance_flags = FIRE_PROOF | ACID_PROOF
brightness_on = 7
light_color = "#30ffff"
armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 100)
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
var/list/datahuds = list(DATA_HUD_SECURITY_BASIC, DATA_HUD_MEDICAL_BASIC, DATA_HUD_DIAGNOSTIC_BASIC) //CITADEL NERF
var/list/datahuds = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_BASIC)
var/zoom_range = 12
var/zoom = FALSE
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/flightpack/zoom)
+1 -1
View File
@@ -86,7 +86,7 @@
soundloop.last_radiation = rad_record
/obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity)
..()
. = ..()
display_visor_message("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!")
-6
View File
@@ -234,9 +234,3 @@
/obj/item/clothing/suit/armor/riot/knight/red
icon_state = "knight_red"
item_state = "knight_red"
/obj/item/clothing/suit/armor/riot/knight/templar
name = "crusader armour"
desc = "God wills it!"
icon_state = "knight_templar"
item_state = "knight_templar"
-16
View File
@@ -23,22 +23,6 @@
allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/assembly/flash/handheld, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
//Chaplain
/obj/item/clothing/suit/hooded/chaplain_hoodie
name = "chaplain hoodie"
desc = "This suit says to you 'hush'!"
icon_state = "chaplain_hoodie"
item_state = "chaplain_hoodie"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
hoodtype = /obj/item/clothing/head/hooded/chaplain_hood
/obj/item/clothing/head/hooded/chaplain_hood
name = "chaplain hood"
desc = "For protecting your identity when immolating demons."
icon_state = "chaplain_hood"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
/obj/item/clothing/suit/nun
name = "nun robe"
desc = "Maximum piety in this star system."
+1 -1
View File
@@ -5,7 +5,7 @@
item_state = "labcoat"
blood_overlay_type = "coat"
body_parts_covered = CHEST|ARMS
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman,/obj/item/hypospray) //CITADEL ADD, Hyposprays to laboats
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
togglename = "buttons"
species_exception = list(/datum/species/golem)
+17 -7
View File
@@ -52,11 +52,13 @@
return
/obj/item/clothing/suit/armor/reactive/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
active = 0
icon_state = "reactiveoff"
item_state = "reactiveoff"
reactivearmor_cooldown = world.time + 200
..()
//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!)
/obj/item/clothing/suit/armor/reactive/teleport
@@ -152,12 +154,21 @@
siemens_coefficient = -1
var/tesla_power = 25000
var/tesla_range = 20
var/tesla_boom = FALSE
var/tesla_stun = FALSE
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
/obj/item/clothing/suit/armor/reactive/tesla/dropped(mob/user)
..()
if(istype(user))
user.flags_1 &= ~TESLA_IGNORE_1
/obj/item/clothing/suit/armor/reactive/tesla/equipped(mob/user, slot)
..()
if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item?
user.flags_1 |= TESLA_IGNORE_1
/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!active)
return 0
return FALSE
if(prob(hit_reaction_chance))
if(world.time < reactivearmor_cooldown)
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
@@ -166,10 +177,9 @@
owner.visible_message("<span class='danger'>The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks.</span>")
return
owner.visible_message("<span class='danger'>[src] blocks [attack_text], sending out arcs of lightning!</span>")
tesla_zap(owner,tesla_range,tesla_power,tesla_boom, tesla_stun)
tesla_zap(owner, tesla_range, tesla_power, tesla_flags)
reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
return 1
return TRUE
//Repulse
@@ -614,7 +614,6 @@
/obj/item/clothing/under/plasmaman
name = "plasma envirosuit"
desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy."
icon = 'icons/obj/device.dmi'
icon_state = "plasmaman"
item_state = "plasmaman"
item_color = "plasmaman"
@@ -0,0 +1,20 @@
/datum/round_event_control/high_priority_bounty
name = "High Priority Bounty"
typepath = /datum/round_event/high_priority_bounty
max_occurrences = 3
weight = 20
earliest_start = 10
/datum/round_event/high_priority_bounty/announce(fake)
priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program")
/datum/round_event/high_priority_bounty/start()
var/datum/bounty/B
for(var/attempts = 0; attempts < 50; ++attempts)
B = random_bounty()
if(!B)
continue
B.mark_high_priority(3)
if(try_add_bounty(B))
break
+2
View File
@@ -62,6 +62,8 @@
temp.update_icon()
else if(istype(O, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/temp = O
if(temp.critical_machine) //Skip doors in critical positions, such as the SM chamber.
continue
temp.prison_open()
else if(istype(O, /obj/machinery/door_timer))
var/obj/machinery/door_timer/temp = O
+2 -1
View File
@@ -24,7 +24,8 @@
/datum/round_event/vent_clog/setup()
endWhen = rand(25, 100)
for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent in GLOB.machines)
if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
var/turf/T = get_turf(temp_vent)
if(T && is_station_level(T.z) && !temp_vent.welded)
vents += temp_vent
if(!vents.len)
return kill()
@@ -320,7 +320,7 @@
desc = "A bottle of pure Fernet Bronca, produced in Cordoba Space Station"
icon_state = "fernetbottle"
list_reagents = list("fernet" = 100)
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
@@ -314,7 +314,9 @@
return FALSE
/obj/machinery/smartfridge/drying_rack/emp_act(severity)
..()
. = ..()
if(. & EMP_PROTECT_SELF)
return
atmos_spawn_air("TEMP=1000")
+3 -1
View File
@@ -162,8 +162,10 @@
nerf(!(obj_flags & EMAGGED))
/obj/machinery/computer/holodeck/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
emergency_shutdown()
return ..()
/obj/machinery/computer/holodeck/ex_act(severity, target)
emergency_shutdown()
@@ -18,7 +18,7 @@
/mob/living/carbon/human/bee_friendly()
if(dna && dna.species && dna.species.id == "pod") //bees pollinate plants, duh.
return 1
if (wear_suit && head && is_type_in_typecache(wear_suit, GLOB.typecache_clothing) && is_type_in_typecache(wear_suit, GLOB.typecache_clothing))
if (wear_suit && head && istype(wear_suit, /obj/item/clothing) && istype(head, /obj/item/clothing))
var/obj/item/clothing/CS = wear_suit
var/obj/item/clothing/CH = head
if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL)
@@ -263,3 +263,6 @@
if(HF.loc == src)
HF.forceMove(drop_location())
qdel(src)
/obj/structure/beebox/unwrenched
anchored = FALSE
@@ -13,7 +13,7 @@
var/list/assembly_components = list()
var/max_components = IC_MAX_SIZE_BASE
var/max_complexity = IC_COMPLEXITY_BASE
var/opened = FALSE
var/opened = TRUE
var/obj/item/stock_parts/cell/battery // Internal cell which most circuits need to work.
var/cell_type = /obj/item/stock_parts/cell
var/can_charge = TRUE //Can it be charged in a recharger?
@@ -450,7 +450,8 @@
else
for(var/obj/item/integrated_circuit/input/S in assembly_components)
S.attackby_react(I,user,user.a_intent)
return ..()
if(user.a_intent != INTENT_HELP)
return ..()
/obj/item/electronic_assembly/attack_self(mob/user)
@@ -489,9 +490,11 @@
choice.ask_for_input(user)
/obj/item/electronic_assembly/emp_act(severity)
..()
for(var/i in 1 to contents.len)
var/atom/movable/AM = contents[i]
. = ..()
if(. & EMP_PROTECT_CONTENTS)
return
for(var/I in src)
var/atom/movable/AM = I
AM.emp_act(severity)
// Returns true if power was successfully drawn.
@@ -742,4 +745,4 @@
if(EAST)
pixel_x = -31
if(WEST)
pixel_x = 31
pixel_x = 31
@@ -259,8 +259,10 @@
if(program["requires_upgrades"] && !upgraded && !debug)
to_chat(usr, "<span class='warning'>This program uses unknown component designs. Printer upgrade is required to proceed.</span>")
return
if(program["unsupported_circuit"] && !debug)
to_chat(usr, "<span class='warning'>This program uses components not supported by the specified assembly. Please change the assembly type in the save file to a supported one.</span>")
return
else if(fast_clone || debug)
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
if(debug || materials.use_amount_type(program["metal_cost"], MAT_METAL))
@@ -129,10 +129,6 @@
if(initial(desc) != desc)
assembly_params["desc"] = desc
// Save panel status
if(opened)
assembly_params["opened"] = TRUE
// Save modified color
if(initial(detail_color) != detail_color)
assembly_params["detail_color"] = detail_color
@@ -162,10 +158,6 @@
if(assembly_params["desc"])
desc = assembly_params["desc"]
// Load panel status
if(assembly_params["opened"])
opened = TRUE
if(assembly_params["detail_color"])
detail_color = assembly_params["detail_color"]
@@ -883,6 +883,7 @@
return FALSE
set_pin_data(IC_OUTPUT, 1, WEAKREF(A))
push_data()
to_chat(user, "<span class='notice'>You scan [A] with [assembly].</span>")
activate_pin(1)
return TRUE
@@ -915,6 +916,7 @@
return FALSE
set_pin_data(IC_OUTPUT, 1, WEAKREF(A))
push_data()
to_chat(user, "<span class='notice'>You scan [A] with [assembly].</span>")
activate_pin(1)
return TRUE
@@ -941,6 +943,7 @@
user.transferItemToLoc(A,drop_location())
set_pin_data(IC_OUTPUT, 1, WEAKREF(A))
push_data()
to_chat(user, "<span class='notice'>You let [assembly] scan [A].</span>")
activate_pin(1)
return TRUE
+4
View File
@@ -50,6 +50,8 @@ Captain
implants = list(/obj/item/implant/mindshield)
accessory = /obj/item/clothing/accessory/medal/gold/captain
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain)
/*
Head of Personnel
*/
@@ -98,3 +100,5 @@ Head of Personnel
head = /obj/item/clothing/head/hopcap
backpack_contents = list(/obj/item/storage/box/ids=1,\
/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/hop)
@@ -28,6 +28,8 @@ Quartermaster
glasses = /obj/item/clothing/glasses/sunglasses
l_hand = /obj/item/clipboard
chameleon_extras = /obj/item/stamp/qm
/*
Cargo Technician
*/
@@ -97,6 +99,8 @@ Shaft Miner
duffelbag = /obj/item/storage/backpack/duffelbag
box = /obj/item/storage/box/survival_mining
chameleon_extras = /obj/item/gun/energy/kinetic_accelerator
/datum/outfit/job/miner/asteroid
name = "Shaft Miner (Asteroid)"
uniform = /obj/item/clothing/under/rank/miner
+5 -1
View File
@@ -44,6 +44,8 @@ Clown
box = /obj/item/storage/box/hug/survival
chameleon_extras = /obj/item/stamp/clown
/datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -137,7 +139,7 @@ Curator
l_hand = /obj/item/storage/bag/books
r_pocket = /obj/item/key/displaycase
l_pocket = /obj/item/laser_pointer
//CITADEL EDIT removes runtimes from this pocket protector
accessory = /obj/item/clothing/accessory/pocketprotector/full
backpack_contents = list(
/obj/item/melee/curator_whip = 1,
/obj/item/soapstone = 1,
@@ -186,6 +188,8 @@ Lawyer
l_pocket = /obj/item/laser_pointer
r_pocket = /obj/item/clothing/accessory/lawyers_badge
chameleon_extras = /obj/item/stamp/law
/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -48,6 +48,7 @@ Chief Engineer
duffelbag = /obj/item/storage/backpack/duffelbag/engineering
box = /obj/item/storage/box/engineer
pda_slot = SLOT_L_STORE
chameleon_extras = /obj/item/stamp/ce
/datum/outfit/job/ce/rig
name = "Chief Engineer (Hardsuit)"

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