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:
+23
-20
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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!
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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(!..())
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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())
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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)
|
||||
|
||||
*/
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!")
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user