Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into super-special-awesome-dynamic

This commit is contained in:
Putnam
2019-11-14 22:31:48 -08:00
385 changed files with 31577 additions and 134898 deletions
+1 -1
View File
@@ -949,7 +949,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
<tr>
<th>Uniform:</th>
<td>
[uniform_select]
[uniform_select]
</td>
</tr>
<tr>
+4 -4
View File
@@ -16,10 +16,10 @@
var/obj/chosen_obj = text2path(chosen)
var/list/settings = list(
"mainsettings" = list(
"name" = list("desc" = "Name", "type" = "string", "value" = "Bob"),
"mainsettings" = list(
"name" = list("desc" = "Name", "type" = "string", "value" = "Bob"),
"maxhealth" = list("desc" = "Max. health", "type" = "number", "value" = 100),
"access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"),
"access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"),
"objtype" = list("desc" = "Base obj type", "type" = "datum", "path" = "/obj", "value" = "[chosen]"),
"googlyeyes" = list("desc" = "Googly eyes", "type" = "boolean", "value" = "No"),
"disableai" = list("desc" = "Disable AI", "type" = "boolean", "value" = "Yes"),
@@ -27,7 +27,7 @@
"dropitem" = list("desc" = "Drop obj on death", "type" = "boolean", "value" = "Yes"),
"mobtype" = list("desc" = "Base mob type", "type" = "datum", "path" = "/mob/living/simple_animal/hostile/mimic/copy", "value" = "/mob/living/simple_animal/hostile/mimic/copy"),
"ckey" = list("desc" = "ckey", "type" = "ckey", "value" = "none"),
)
)
)
var/list/prefreturn = presentpreflikepicker(usr,"Customize mob", "Customize mob", Button1="Ok", width = 450, StealFocus = 1,Timeout = 0, settings=settings)
@@ -393,23 +393,22 @@
name = "Dissection Guide"
icon_state = "alienpaper_words"
info = {"<b>Dissection for Dummies</b><br>
<br>
1.Acquire fresh specimen.<br>
2.Put the specimen on operating table.<br>
3.Apply surgical drapes, preparing for experimental dissection.<br>
4.Apply scalpel to specimen's torso.<br>
5.Clamp bleeders on specimen's torso with a hemostat.<br>
6.Retract skin of specimen's torso with a retractor.<br>
7.Apply scalpel again to specimen's torso.<br>
8.Search through the specimen's torso with your hands to remove any superfluous organs.<br>
9.Insert replacement gland (Retrieve one from gland storage).<br>
10.Consider dressing the specimen back to not disturb the habitat. <br>
11.Put the specimen in the experiment machinery.<br>
12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.<br>
13.You will receive one supply credit, and the subject will be counted towards your quota.<br>
<br>
Congratulations! You are now trained for invasive xenobiology research!"}
<br>
1.Acquire fresh specimen.<br>
2.Put the specimen on operating table.<br>
3.Apply surgical drapes, preparing for experimental dissection.<br>
4.Apply scalpel to specimen's torso.<br>
5.Clamp bleeders on specimen's torso with a hemostat.<br>
6.Retract skin of specimen's torso with a retractor.<br>
7.Apply scalpel again to specimen's torso.<br>
8.Search through the specimen's torso with your hands to remove any superfluous organs.<br>
9.Insert replacement gland (Retrieve one from gland storage).<br>
10.Consider dressing the specimen back to not disturb the habitat. <br>
11.Put the specimen in the experiment machinery.<br>
12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.<br>
13.You will receive one supply credit, and the subject will be counted towards your quota.<br>
<br>
Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/paper/guides/antag/abductor/update_icon()
return
@@ -64,7 +64,7 @@
/obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \
/datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
/datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
/obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \
@@ -15,7 +15,7 @@
. = ..()
var/area/A = get_area(src)
if(A && construct_type)
notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_CONSTRUCT)
notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_CONSTRUCT, ignore_dnr_observers = TRUE)
GLOB.poi_list += src
LAZYADD(GLOB.mob_spawners[name], src)
@@ -39,7 +39,9 @@
. = ..()
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/item/clockwork/construct_chassis/attack_ghost(mob/user)
/obj/item/clockwork/construct_chassis/attack_ghost(mob/dead/observer/user)
if(!user.can_reenter_round())
return FALSE
if(!SSticker.mode)
to_chat(user, "<span class='danger'>You cannot use that before the game has started.</span>")
return
+2 -2
View File
@@ -493,7 +493,7 @@
desc = "You peer within this smokey orb and glimpse terrible fates befalling the escape shuttle."
icon = 'icons/obj/cult.dmi'
icon_state ="shuttlecurse"
var/global/curselimit = 0
var/static/curselimit = 0
/obj/item/shuttle_curse/attack_self(mob/living/user)
if(!iscultist(user))
@@ -530,7 +530,7 @@
playsound(user.loc, 'sound/effects/glassbr1.ogg', 50, 1)
qdel(src)
sleep(20)
var/global/list/curses
var/static/list/curses
if(!curses)
curses = list("A fuel technician just slit his own throat and begged for death.",
"The shuttle's navigation programming was replaced by a file containing just two words: IT COMES.",
+3 -3
View File
@@ -249,7 +249,7 @@ structure_check() searches for nearby cultist structures required for the invoca
convertee.adjustFireLoss(-(burndamage * 0.75))
convertee.visible_message("<span class='warning'>[convertee] writhes in pain \
[brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!</span>", \
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
SSticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/melee/cultblade/dagger(get_turf(src))
convertee.mind.special_role = ROLE_CULTIST
@@ -848,10 +848,10 @@ structure_check() searches for nearby cultist structures required for the invoca
fail_invoke()
log_game("Manifest rune failed - too many summoned ghosts")
return list()
notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src)
notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src, ignore_dnr_observers = TRUE)
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in T)
if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && !QDELETED(O))
if(!QDELETED(O) && O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && O.can_reenter_round())
ghosts_on_rune += O
if(!ghosts_on_rune.len)
to_chat(user, "<span class='cultitalic'>There are no spirits near [src]!</span>")
@@ -64,7 +64,7 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec)
D.jammed = TRUE
GLOB.war_declared = TRUE
GLOB.war_declared = TRUE
var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
var/actual_players = GLOB.joined_player_list.len - nukeops.len
var/tc_malus = 0
+1 -1
View File
@@ -33,7 +33,7 @@
. = ..()
var/area/A = get_area(src)
if(A)
notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
. = ..()
@@ -340,9 +340,9 @@
to_chat(victim, "<span class='notice'>You feel a dark presence from [A.name]</span>")
/obj/item/voodoo/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] links the voodoo doll to [user.p_them()]self and sits on it, infinitely crushing [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!</span>")
user.gib()
return(BRUTELOSS)
user.visible_message("<span class='suicide'>[user] links the voodoo doll to [user.p_them()]self and sits on it, infinitely crushing [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!</span>")
user.gib()
return(BRUTELOSS)
/obj/item/voodoo/fire_act(exposed_temperature, exposed_volume)
if(target)
@@ -695,16 +695,16 @@
dat += {"
<head>
<style type="text/css">
body { font-size: 80%; font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif; }
ul#tabs { list-style-type: none; margin: 30px 0 0 0; padding: 0 0 0.3em 0; }
ul#tabs li { display: inline; }
ul#tabs li a { color: #42454a; background-color: #dedbde; border: 1px solid #c9c3ba; border-bottom: none; padding: 0.3em; text-decoration: none; }
ul#tabs li a:hover { background-color: #f1f0ee; }
ul#tabs li a.selected { color: #000; background-color: #f1f0ee; font-weight: bold; padding: 0.7em 0.3em 0.38em 0.3em; }
div.tabContent { border: 1px solid #c9c3ba; padding: 0.5em; background-color: #f1f0ee; }
div.tabContent.hide { display: none; }
</style>
</head>
body { font-size: 80%; font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif; }
ul#tabs { list-style-type: none; margin: 30px 0 0 0; padding: 0 0 0.3em 0; }
ul#tabs li { display: inline; }
ul#tabs li a { color: #42454a; background-color: #dedbde; border: 1px solid #c9c3ba; border-bottom: none; padding: 0.3em; text-decoration: none; }
ul#tabs li a:hover { background-color: #f1f0ee; }
ul#tabs li a.selected { color: #000; background-color: #f1f0ee; font-weight: bold; padding: 0.7em 0.3em 0.38em 0.3em; }
div.tabContent { border: 1px solid #c9c3ba; padding: 0.5em; background-color: #f1f0ee; }
div.tabContent.hide { display: none; }
</style>
</head>
"}
dat += {"[content]</body></html>"}
return dat
@@ -1,4 +1,6 @@
/atom/var/CanAtmosPass = ATMOS_PASS_YES
/atom/var/CanAtmosPassVertical = ATMOS_PASS_YES
/atom/proc/CanAtmosPass(turf/T)
switch (CanAtmosPass)
if (ATMOS_PASS_PROC)
@@ -8,42 +10,47 @@
else
return CanAtmosPass
/turf/closed/CanAtmosPass = ATMOS_PASS_NO
/turf/CanAtmosPass = ATMOS_PASS_NO
/turf/CanAtmosPassVertical = ATMOS_PASS_NO
/turf/open/CanAtmosPass = ATMOS_PASS_PROC
/turf/open/CanAtmosPass(turf/T)
var/R
if(blocks_air || T.blocks_air)
R = 1
/turf/open/CanAtmosPassVertical = ATMOS_PASS_PROC
/turf/open/CanAtmosPass(turf/T, vertical = FALSE)
var/dir = vertical? get_dir_multiz(src, T) : get_dir(src, T)
var/opp = dir_inverse_multiz(dir)
var/R = FALSE
if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src)))
R = TRUE
if(blocks_air || T.blocks_air)
R = TRUE
if (T == src)
return !R
for(var/obj/O in contents+T.contents)
var/turf/other = (O.loc == src ? T : src)
if(!CANATMOSPASS(O, other))
R = 1
if(!(vertical? (CANVERTICALATMOSPASS(O, other)) : (CANATMOSPASS(O, other))))
R = TRUE
if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments
var/D = get_dir(src, T)
atmos_supeconductivity |= D
D = get_dir(T, src)
T.atmos_supeconductivity |= D
return 0 //no need to keep going, we got all we asked
atmos_supeconductivity |= dir
T.atmos_supeconductivity |= opp
return FALSE //no need to keep going, we got all we asked
atmos_supeconductivity &= ~get_dir(src, T)
T.atmos_supeconductivity &= ~get_dir(T, src)
atmos_supeconductivity &= ~dir
T.atmos_supeconductivity &= ~opp
return !R
/atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm.
return 0
return FALSE
/turf/proc/CalculateAdjacentTurfs()
var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs
for(var/direction in GLOB.cardinals)
var/turf/T = get_step(src, direction)
if(!T)
/turf/proc/ImmediateCalculateAdjacentTurfs()
var/canpass = CANATMOSPASS(src, src)
var/canvpass = CANVERTICALATMOSPASS(src, src)
for(var/direction in GLOB.cardinals_multiz)
var/turf/T = get_step_multiz(src, direction)
if(!isopenturf(T))
continue
if( !(blocks_air || T.blocks_air) && CANATMOSPASS(T, src) )
if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) )
LAZYINITLIST(atmos_adjacent_turfs)
LAZYINITLIST(T.atmos_adjacent_turfs)
atmos_adjacent_turfs[T] = TRUE
@@ -72,11 +79,13 @@
var/turf/curloc = src
for (var/direction in GLOB.diagonals)
for (var/direction in GLOB.diagonals_multiz)
var/matchingDirections = 0
var/turf/S = get_step(curloc, direction)
var/turf/S = get_step_multiz(curloc, direction)
if(!S)
continue
for (var/checkDirection in GLOB.cardinals)
for (var/checkDirection in GLOB.cardinals_multiz)
var/turf/checkTurf = get_step(S, checkDirection)
if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf])
continue
@@ -98,13 +107,13 @@
/turf/air_update_turf(command = 0)
if(command)
CalculateAdjacentTurfs()
ImmediateCalculateAdjacentTurfs()
SSair.add_to_active(src,command)
/atom/movable/proc/move_update_air(turf/T)
if(isturf(T))
T.air_update_turf(1)
air_update_turf(1)
if(isturf(T))
T.air_update_turf(1)
air_update_turf(1)
/atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires
var/turf/open/T = get_turf(src)
@@ -42,8 +42,7 @@
/turf/open/Destroy()
if(active_hotspot)
qdel(active_hotspot)
active_hotspot = null
QDEL_NULL(active_hotspot)
// Adds the adjacent turfs to the current atmos processing
for(var/T in atmos_adjacent_turfs)
SSair.add_to_active(T)
@@ -28,8 +28,8 @@ Pipelines + Other Objects -> Pipe network
var/piping_layer = PIPING_LAYER_DEFAULT
var/pipe_flags = NONE
var/global/list/iconsetids = list()
var/global/list/pipeimages = list()
var/static/list/iconsetids = list()
var/static/list/pipeimages = list()
var/image/pipe_vision_img = null
@@ -209,7 +209,7 @@
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
cold_protection = H.get_cold_protection(air1.temperature)
cold_protection = H.get_thermal_protection(air1.temperature, TRUE)
if(abs(temperature_delta) > 1)
var/air_heat_capacity = air1.heat_capacity()
+29
View File
@@ -0,0 +1,29 @@
obj/machinery/atmospherics/pipe/simple/multiz ///This is an atmospherics pipe which can relay air up a deck (Z+1). It currently only supports being on pipe layer 1
name = "multi deck pipe adapter"
desc = "An adapter which allows pipes to connect to other pipenets on different decks."
icon_state = "multiz_pipe"
icon = 'icons/obj/atmos.dmi'
/obj/machinery/atmospherics/pipe/simple/multiz/update_icon()
. = ..()
cut_overlays() //This adds the overlay showing it's a multiz pipe. This should go above turfs and such
var/image/multiz_overlay_node = new(src) //If we have a firing state, light em up!
multiz_overlay_node.icon = 'icons/obj/atmos.dmi'
multiz_overlay_node.icon_state = "multiz_pipe"
multiz_overlay_node.layer = HIGH_OBJ_LAYER
add_overlay(multiz_overlay_node)
///Attempts to locate a multiz pipe that's above us, if it finds one it merges us into its pipenet
/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion()
icon = 'icons/obj/atmos.dmi' //Just to refresh.
var/turf/T = get_turf(src)
var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T))
var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T))
if(below)
below.pipeline_expansion() //If we've got one below us, force it to add us on facebook
if(above)
nodes += above
above.nodes += src //Two way travel :)
return ..()
else
return ..()
+2 -3
View File
@@ -44,9 +44,8 @@
return
if(isobserver(user))
var/mob/dead/observer/O = user
if(!O.can_reenter_round)
to_chat(user, "<span class='warning'>You are unable to reenter the round.</span>")
return
if(!O.can_reenter_round())
return FALSE
var/ghost_role = alert(latejoinercalling ? "Latejoin as [mob_name]? (This is a ghost role, and as such, it's very likely to be off-station.)" : "Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
if(ghost_role == "No" || !loc)
return
+69 -64
View File
@@ -1,20 +1,16 @@
/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 = 600
wanted_types = list(/obj/item/relic)
//Moved Maint Loot and other assorted bounties to silly.dm
/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 = 850 // the mat hoffman
reward = 900 // 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 wasteful. Ship a skateboard to CentCom to speed operations up."
reward = 700 // the tony hawk
reward = 750 // the tony hawk
wanted_types = list(/obj/vehicle/ridden/scooter/skateboard)
/datum/bounty/item/assistant/stunprod
@@ -26,8 +22,8 @@
/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 = 1000
required_count = 3
reward = 1200
required_count = 3 //You can (apparently) get soap from the mining rewards vendor.
wanted_types = list(/obj/item/soap)
/datum/bounty/item/assistant/spear
@@ -50,12 +46,6 @@
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 = 750
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!"
@@ -76,44 +66,38 @@
reward = 1250
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 = 2000
required_count = 10
wanted_types = list(/obj/item/reagent_containers/food/snacks/donut)
// /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 = 2000
// 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 = 1000
required_count = 10
wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket)
// /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 = 1000
// 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 = 1500
required_count = 5
reward = 1200
required_count = 3
wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/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 = 1000
required_count = 2
wanted_types = list(/obj/item/clothing/glasses/sunglasses)
/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 = 500
reward = 1250
required_count = 3
wanted_types = list(/obj/item/stack/sheet/animalhide/monkey)
/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 = 500
reward = 750
required_count = 15
wanted_types = list(/obj/item/shard)
@@ -124,20 +108,20 @@
required_count = 5
wanted_types = list(/obj/structure/chair/comfy)
/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 = 1000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium)
// /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 = 1000
// 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/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"
@@ -152,13 +136,13 @@
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/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
/datum/bounty/item/assistant/cuffs
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
@@ -203,15 +187,36 @@
reward = 3000
wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi)
/datum/bounty/item/assistant/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)
/datum/bounty/item/assistant/tail_whip
name = "Nine Tails whip"
description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails."
reward = 4000
wanted_types = list(/obj/item/melee/chainofcommand/tailwhip)
/datum/bounty/item/assistant/bolas
name = "Bolas"
description = "Centcom's chef has lost their mind. They're streaking naked though the halls, greased up with butter and cooking oil. Send some bola's so we can capture them."
reward = 1000
required_count = 3
wanted_types = list(/obj/item/restraints/legcuffs/bola)
/datum/bounty/item/assistant/metalshields
name = "Metal Shields"
description = "NT is testing the effects of electricity on clowns wielding metal shields. We have clowns, and we have electricity. Send us the shields."
reward = 1400
required_count = 4
wanted_types = list(/obj/item/shield/makeshift)
/datum/bounty/item/assistant/toolbelts
name = "Tool Belts"
description = "These things always seem to go missing. Ship us a few to help us restock."
reward = 1350
required_count = 3
wanted_types = list(/obj/item/storage/belt/utility)
/datum/bounty/item/assistant/gasmasks
name = "Gas Masks"
description = "The good news is that we have more miasma than we'll ever need. The bad news is, somone opened the release valve on the canisters. Ship us some gas masks!"
reward = 1100
required_count = 4
wanted_types = list(/obj/item/clothing/mask/gas)
+5 -5
View File
@@ -135,11 +135,11 @@
bonus_desc = "Not to be confused with eggplants."
multiplier = 2
/datum/bounty/item/botany/kudzu
name = "Kudzu Pods"
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod)
bonus_desc = "Store in a dry, dark place."
multiplier = 4
// /datum/bounty/item/botany/kudzu
// name = "Kudzu Pods"
// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod)
// bonus_desc = "Store in a dry, dark place."
// multiplier = 4
/datum/bounty/item/botany/watermelon
name = "Watermelons"
+44 -38
View File
@@ -1,8 +1,4 @@
/datum/bounty/item/chef/birthday_cake
name = "Birthday Cake"
description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!"
reward = 1000
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday)
//Moved (most) bounties requiring botany to gardencook.dm Roundstart cook bounties go here.
/datum/bounty/item/chef/soup
name = "Soup"
@@ -11,20 +7,6 @@
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 = 800
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 = 800
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."
@@ -51,13 +33,6 @@
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 = 1300
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."
@@ -70,11 +45,11 @@
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 = 3000
wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp)
// /datum/bounty/item/chef/cubancarp
// name = "Cuban Carp"
// description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom."
// reward = 3000
// wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp)
/datum/bounty/item/chef/hotdog
name = "Hot Dog"
@@ -82,13 +57,6 @@
reward = 4000
wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog)
/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 = 2500
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."
@@ -129,3 +97,41 @@
required_count = 6
wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget)
/datum/bounty/item/chef/khachapuri
name = "Khachapuri"
description = "Bread and eggs. Bread and eggs. Bread and eggs. Also, cheese."
reward = 2000
required_count = 2
wanted_types = list(/obj/item/reagent_containers/food/snacks/khachapuri)
/datum/bounty/item/chef/ratkebab
name = "Rat Kebabs"
description = "Centcom is requesting some -special- kebabs for it's service staff."
reward = 1800
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/rat)
/datum/bounty/item/chef/benedict
name = "Eggs Benedict"
description = "Command requires a high-calory breakfast item. Ship it right away."
reward = 1750
wanted_types = list(/obj/item/reagent_containers/food/snacks/benedict)
/datum/bounty/item/chef/braincake
name = "Brain Cake"
description = "The science division requires a brain cake for testing purposes. Don't ask."
reward = 1200
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/brain)
/datum/bounty/item/chef/waffles
name = "Waffles"
description = "Security staff at Centcom are looking for a fun treat. Ship us some waffles so they can fill the cells."
reward = 1000
wanted_types = list(/obj/item/reagent_containers/food/snacks/waffles)
/datum/bounty/item/chef/sugarcookie
name = "Sugar Cookies"
description = "Everyone needs a little sugar in their life. Ship some sweets to Command so we can satiate our sweet tooth."
reward = 1200
required_count = 6
wanted_types = list(/obj/item/reagent_containers/food/snacks/sugarcookie)
+53
View File
@@ -0,0 +1,53 @@
/datum/bounty/item/chef/birthday_cake
name = "Birthday Cake"
description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!"
reward = 1000
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday)
/datum/bounty/item/gardencook/carrotfries
name = "Carrot Fries"
description = "Night sight can mean life or death! A shipment of carrot fries is the order."
reward = 1300
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries)
/datum/bounty/item/gardencook/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 = 2500
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm)
/datum/bounty/item/gardencook/popcorn
name = "Popcorn Bags"
description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion."
reward = 800
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn)
/datum/bounty/item/gardencook/onionrings
name = "Onion Rings"
description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support."
reward = 800
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings)
/datum/bounty/item/gardencook/khinkali
name = "Khinkali"
description = "Requesting -some khinki stuff- for a private staff party at Centcom"
reward = 2400
required_count = 6
wanted_types = list(/obj/item/reagent_containers/food/snacks/khinkali)
/datum/bounty/item/gardencook/bakedbeans
name = "Beans"
description = "Management wants to make sure we have a fallback shelter to rely on. Prepare some beans to stock it with."
reward = 1600
required_count = 8
wanted_types = list(/obj/item/reagent_containers/food/snacks/beans)
/datum/bounty/item/gardencook/honeybun
name = "Honeybun"
description = "Something sticky, something fun, ship us a honeybun."
reward = 3500
wanted_types = list(/obj/item/reagent_containers/food/snacks/honeybun)
+54
View File
@@ -0,0 +1,54 @@
/datum/bounty/item/silly/paper_plane
name = "Paper Planes"
description = "Centcom is running an experiment on which type of paper plane is the most aerodynamically stable. Send us some samples to further our study."
reward = 900
required_count = 15
wanted_types = list(/obj/item/paperplane)
/datum/bounty/item/silly/mousetraps
name = "Mouse Traps"
description = "Some shoeless hoodlum is intentionally tracking paint all over Centcom. Send us some mouse traps so we can capture the culprit."
reward = 1200
required_count = 12
wanted_types = list(/obj/item/assembly/mousetrap)
/datum/bounty/item/silly/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 = 3000
required_count = 5
wanted_types = list(/obj/item/toy/figure)
/datum/bounty/item/silly/clown_box
name = "Clown Box"
description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out."
reward = 1000
wanted_types = list(/obj/item/storage/box/clown)
/datum/bounty/item/silly/peels
name = "Banana Peels"
description = "Centcom is running an experiment to see if a slip-n-slide can be made entirely out of banana peels, but noone wants to eat that many bananas. Ship us some fresh peels."
reward = 950
required_count = 12
wanted_types = list(/obj/item/grown/bananapeel)
/datum/bounty/item/silly/shoes
name = "Shoes"
description = "An assistant stole a clown's shoes, the clown incinerated every pair we had. Send us some new footwear please."
reward = 1200
required_count = 8
wanted_types = list(/obj/item/clothing/shoes)
exclude_types = list(/obj/item/clothing/shoes/wraps, /obj/item/clothing/shoes/wraps/silver, /obj/item/clothing/shoes/wraps/red, /obj/item/clothing/shoes/wraps/blue)
/datum/bounty/item/silly/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 = 1400
required_count = 2
wanted_types = list(/obj/item/clothing/glasses/sunglasses)
/datum/bounty/item/silly/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 = 1000
wanted_types = list(/obj/item/relic)
+10 -2
View File
@@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(bounties_list)
// Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
/proc/random_bounty()
switch(rand(1, 13))
switch(rand(1, 15))
if(1)
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
return new subtype
@@ -115,6 +115,12 @@ GLOBAL_LIST_EMPTY(bounties_list)
if(13)
var/subtype = pick(subtypesof(/datum/bounty/item/botany))
return new subtype
if(14)
var/subtype = pick(subtypesof(/datum/bounty/item/silly))
return new subtype
if(15)
var/subtype = pick(subtypesof(/datum/bounty/item/gardencook))
return new subtype
// Called lazily at startup to populate GLOB.bounties_list with random bounties.
/proc/setup_bounties()
@@ -130,7 +136,9 @@ GLOBAL_LIST_EMPTY(bounties_list)
/datum/bounty/item/engineering = 1,
/datum/bounty/item/mining = 2,
/datum/bounty/item/medical = 2,
/datum/bounty/item/botany = 2)
/datum/bounty/item/botany = 2,
/datum/bounty/item/silly = 1,
/datum/bounty/item/gardencook = 1)
for(var/the_type in easy_add_list_subtypes)
for(var/i in 1 to easy_add_list_subtypes[the_type])
+8 -3
View File
@@ -3,6 +3,7 @@
desc = "Used to order supplies, approve requests, and control the shuttle."
icon_screen = "supply"
circuit = /obj/item/circuitboard/computer/cargo
req_access = list(ACCESS_CARGO)
var/requestonly = FALSE
var/contraband = FALSE
var/safety_warning = "For safety reasons, the automated supply shuttle \
@@ -17,6 +18,7 @@
desc = "Used to request supplies from cargo."
icon_screen = "request"
circuit = /obj/item/circuitboard/computer/cargo/request
req_access = list()
requestonly = TRUE
/obj/machinery/computer/cargo/Initialize()
@@ -29,11 +31,11 @@
obj_flags &= ~EMAGGED
/obj/machinery/computer/cargo/proc/get_export_categories()
var/cat = EXPORT_CARGO
. = EXPORT_CARGO
if(contraband)
cat |= EXPORT_CONTRABAND
. |= EXPORT_CONTRABAND
if(obj_flags & EMAGGED)
cat |= EXPORT_EMAG
. |= EXPORT_EMAG
/obj/machinery/computer/cargo/emag_act(mob/user)
. = ..()
@@ -114,6 +116,9 @@
/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
if(..())
return
if(!allowed(usr))
to_chat(usr, "<span class='notice'>Access denied.</span>")
return
if(action != "add" && requestonly)
return
switch(action)
+2 -2
View File
@@ -1,6 +1,6 @@
/obj/item/export_scanner
name = "export scanner"
desc = "A device used to check objects against Nanotrasen exports and bounty database."
desc = "A device used to check objects against Nanotrasen exports and bounty database. Sadly can not scan reagents vaule."
icon = 'icons/obj/device.dmi'
icon_state = "export_scanner"
item_state = "radio"
@@ -31,7 +31,7 @@
else
// Before you fix it:
// yes, checking manifests is a part of intended functionality.
var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE)
var/price = 0
for(var/x in ex.total_amount)
+8 -4
View File
@@ -21,9 +21,10 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
// Simple holder datum to pass export results around
/datum/export_report
var/list/exported_atoms = list() //names of atoms sold/deleted by export
var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold
var/list/total_value = list() //export instance => total value of sold objects
var/list/exported_atoms = list()//names of atoms sold/deleted by export
var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold
var/list/total_value = list() //export instance => total value of sold objects
var/list/total_reagents = list()//export reagents => into the total vaule of the object sold
// external_report works as "transaction" object, pass same one in if you're doing more than one export in single go
/proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report)
@@ -47,6 +48,9 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic)
report.exported_atoms += " [thing.name]"
break
if(thing.reagents)
for(var/datum/reagent/R in thing.reagents.reagent_list)
report.total_reagents[R] += R.volume
if(!dry_run && (sold || delete_unsold))
if(ismob(thing))
thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO)
@@ -58,7 +62,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
var/unit_name = "" // Unit name. Only used in "Received [total_amount] [name]s [message]." message
var/message = ""
var/cost = 100 // Cost of item, in cargo credits. Must not alow for infinite price dupes, see above.
var/k_elasticity = 1/20 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 30 - > 20
var/k_elasticity = 1/300 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 1/30 - > 0
var/list/export_types = list() // Type of the exported object. If none, the export datum is considered base type.
var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type.
var/list/exclude_types = list() // Types excluded from export
+181
View File
@@ -0,0 +1,181 @@
/datum/export/food
k_elasticity = 0
include_subtypes = TRUE
/datum/export/booze //Like the kind you bottle!
k_elasticity = 0
unit_name = "brand unit of booze"
include_subtypes = TRUE
/datum/export/food/meat
cost = 5
unit_name = "protein based food"
export_types = list(/obj/item/reagent_containers/food/snacks/meat/slab)
/datum/export/food/raw_cutlets
cost = 3
unit_name = "protein based food"
export_types = list(/obj/item/reagent_containers/food/snacks/meat/rawcutlet)
/datum/export/food/cooked_cutlets
cost = 4
unit_name = "cooked protein based food"
export_types = list(/obj/item/reagent_containers/food/snacks/meat/cutlet)
/datum/export/food/cooked_meat
cost = 8
unit_name = "cooked protein based food"
export_types = list(/obj/item/reagent_containers/food/snacks/meat/steak)
/datum/export/food/dough
cost = 3
unit_name = "uncooked food base"
export_types = list(/obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/flatdough)
/datum/export/food/cooked_dough
cost = 5
unit_name = "cooked food base"
export_types = list(/obj/item/reagent_containers/food/snacks/pizzabread)
/datum/export/food/buns
cost = 3
unit_name = "cooked food base"
export_types = list(/obj/item/reagent_containers/food/snacks/bun)
/datum/export/food/buns
cost = 3
unit_name = "cooked food base"
export_types = list(/obj/item/reagent_containers/food/snacks/bun)
/datum/export/food/eggs
cost = 4
unit_name = "cooked food base"
export_types = list(/obj/item/reagent_containers/food/snacks/friedegg)
/datum/export/food/eggs_food
cost = 20
unit_name = "cooked egg based food"
export_types = list(/obj/item/reagent_containers/food/snacks/omelette, /obj/item/reagent_containers/food/snacks/benedict, /obj/item/reagent_containers/food/snacks/salad/eggbowl)
/datum/export/food/sweets
cost = 4
unit_name = "pastery base"
export_types = list(/obj/item/reagent_containers/food/snacks/rawpastrybase, /obj/item/reagent_containers/food/snacks/pastrybase)
/datum/export/food/cake_pie_raw
cost = 12
unit_name = "uncooked food base"
export_types = list(/obj/item/reagent_containers/food/snacks/cakebatter, /obj/item/reagent_containers/food/snacks/piedough)
/datum/export/food/cooked_cake_pie
cost = 15
unit_name = "cooked food base"
export_types = list(/obj/item/reagent_containers/food/snacks/store/cake/plain, /obj/item/reagent_containers/food/snacks/pie/plain)
/datum/export/food/glassbottle
cost = 10
unit_name = "glass bottle"
export_types = list(/obj/item/reagent_containers/food/drinks/bottle)
/datum/export/food/produce
cost = 3
unit_name = "produce"
export_types = list(/obj/item/reagent_containers/food/snacks/grown)
exclude_types = list(/obj/item/grown/log)
/datum/export/food/egg
cost = 2
unit_name = "egg"
export_types = list(/obj/item/reagent_containers/food/snacks/egg)
/datum/export/food/soup
cost = 30
unit_name = "bowl of soup"
export_types = list(/obj/item/reagent_containers/food/snacks/soup)
/datum/export/food/bread
cost = 20
unit_name = "load of bread"
export_types = list(/obj/item/reagent_containers/food/snacks/store/bread)
/datum/export/food/bread_slice
cost = 4
unit_name = "slice of bread"
export_types = list(/obj/item/reagent_containers/food/snacks/breadslice)
/datum/export/food/burger
cost = 12
unit_name = "burger"
export_types = list(/obj/item/reagent_containers/food/snacks/burger)
/datum/export/food/cake
cost = 50
unit_name = "cake"
export_types = list(/obj/item/reagent_containers/food/snacks/store/cake)
/datum/export/food/cake_slice
cost = 10
unit_name = "cake slice"
export_types = list(/obj/item/reagent_containers/food/snacks/cakeslice)
/datum/export/food/cheese_wheel
cost = 70
unit_name = "cheese wheel"
export_types = list(/obj/item/reagent_containers/food/snacks/store/cheesewheel)
/datum/export/food/cheese_wheel
cost = 20
unit_name = "cheese wedge"
export_types = list(/obj/item/reagent_containers/food/snacks/cheesewedge)
/datum/export/food/candy
cost = 5
unit_name = "candy" //Not anything from the vender
export_types = list(/obj/item/reagent_containers/food/snacks/candy_corn, /obj/item/reagent_containers/food/snacks/chocolatebar, /obj/item/reagent_containers/food/snacks/candiedapple, /obj/item/reagent_containers/food/snacks/spiderlollipop, \
/obj/item/reagent_containers/food/snacks/chococoin, /obj/item/reagent_containers/food/snacks/fudgedice, /obj/item/reagent_containers/food/snacks/chocoorange, /obj/item/reagent_containers/food/snacks/lollipop, \
/obj/item/reagent_containers/food/snacks/gumball, /obj/item/reagent_containers/food/snacks/tinychocolate)
/datum/export/food/pastery
cost = 30
unit_name = "baked goods"
export_types = list(/obj/item/reagent_containers/food/snacks/donut, /obj/item/reagent_containers/food/snacks/muffin, /obj/item/reagent_containers/food/snacks/waffles, /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit, \
/obj/item/reagent_containers/food/snacks/chococornet, /obj/item/reagent_containers/food/snacks/cherrycupcake, /obj/item/reagent_containers/food/snacks/bluecherrycupcake, /obj/item/reagent_containers/food/snacks/honeybun, /obj/item/reagent_containers/food/snacks/pancakes)
/datum/export/food/pasta
cost = 20
unit_name = "pasta based meal"
export_types = list(/obj/item/reagent_containers/food/snacks/spaghetti, /obj/item/reagent_containers/food/snacks/boiledspaghetti, /obj/item/reagent_containers/food/snacks/pastatomato, /obj/item/reagent_containers/food/snacks/copypasta, \
/obj/item/reagent_containers/food/snacks/meatballspaghetti, /obj/item/reagent_containers/food/snacks/spesslaw, /obj/item/reagent_containers/food/snacks/chowmein, /obj/item/reagent_containers/food/snacks/beefnoodle, /obj/item/reagent_containers/food/snacks/butternoodles)
/datum/export/food/pizza
cost = 120
unit_name = "pizza"
export_types = list(/obj/item/reagent_containers/food/snacks/pizza)
/datum/export/food/sliced_pizza
cost = 12
unit_name = "pizza slice"
export_types = list(/obj/item/reagent_containers/food/snacks/pizzaslice)
/datum/export/food/snowcone
cost = 3
unit_name = "snowcone"
export_types = list(/obj/item/reagent_containers/food/snacks/snowcones)
/datum/export/booze/brands
cost = 200
unit_name = "export bottle"
export_types = list(/obj/item/export/bottle/kahlua, /obj/item/export/bottle/whiskey, /obj/item/export/bottle/vodka, /obj/item/export/bottle/gin, \
/obj/item/export/bottle/rum, /obj/item/export/bottle/tequila, /obj/item/export/bottle/vermouth, /obj/item/export/bottle/wine, /obj/item/export/bottle/grappa, /obj/item/export/bottle/cognac, \
/obj/item/export/bottle/absinthe, /obj/item/export/bottle/goldschlager, /obj/item/export/bottle/patron, /obj/item/export/bottle/sake, /obj/item/export/bottle/hcider, /obj/item/export/bottle/champagne, \
/obj/item/export/bottle/applejack, /obj/item/export/bottle/trappist, /obj/item/export/bottle/blazaam, /obj/item/export/bottle/grenadine, /obj/item/export/bottle/fernet)
/datum/export/booze/bottled
cost = 400
unit_name = "exotic brews"
export_types = list(/obj/item/export/bottle/blooddrop, /obj/item/export/bottle/slim_gold, /obj/item/export/bottle/white_bloodmoon, /obj/item/export/bottle/greenroad)
/datum/export/booze/bottledkeg
cost = 250
unit_name = "exotic brews"
export_types = list(/obj/item/export/bottle/minikeg) //Its just beer
+1
View File
@@ -793,6 +793,7 @@ datum/export/gear/glasses //glasses are not worth selling
//////////////////////
/datum/export/gear/chameleon //Selling a full kit is easy money for 2 tc
cost = 280
k_elasticity = 0
unit_name = "chameleon item"
export_types = list(/obj/item/clothing/head/chameleon, /obj/item/clothing/mask/chameleon, /obj/item/clothing/under/chameleon, /obj/item/clothing/suit/chameleon, /obj/item/clothing/glasses/chameleon,\
/obj/item/clothing/gloves/chameleon, /obj/item/clothing/head/chameleon, /obj/item/clothing/shoes/chameleon, /obj/item/storage/backpack/chameleon, \
+15 -10
View File
@@ -24,11 +24,16 @@
export_types = list(/obj/structure/ore_box)
/datum/export/large/crate/wood
cost = 140
cost = 140 //
unit_name = "wooden crate"
export_types = list(/obj/structure/closet/crate/wooden)
exclude_types = list()
/datum/export/large/barrel
cost = 500 //150 to make meaning proffit of 350
unit_name = "wooden barrel"
export_types = list(/obj/structure/fermenting_barrel)
/datum/export/large/crate/coffin
cost = 150
unit_name = "coffin"
@@ -282,17 +287,17 @@
include_subtypes = FALSE
/datum/export/large/mech/odysseus
cost = 5500
cost = 7500
unit_name = "working odysseus"
export_types = list(/obj/mecha/medical/odysseus)
/datum/export/large/mech/ripley
cost = 6500
cost = 12000
unit_name = "working ripley"
export_types = list(/obj/mecha/working/ripley)
/datum/export/large/mech/firefighter
cost = 9000
cost = 14000
unit_name = "working firefighter"
export_types = list(/obj/mecha/working/ripley/firefighter)
@@ -302,12 +307,12 @@
export_types = list(/obj/mecha/combat/gygax)
/datum/export/large/mech/durand
cost = 10000
cost = 16000
unit_name = "working durand"
export_types = list(/obj/mecha/combat/durand)
/datum/export/large/mech/phazon
cost = 25000 //Little over half do to needing a core
cost = 35000 //Little over half do to needing a core
unit_name = "working phazon"
export_types = list(/obj/mecha/combat/phazon)
@@ -317,7 +322,7 @@
export_types = list(/obj/mecha/combat/marauder)
/datum/export/large/mech/deathripley
cost = 8500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price.
cost = 18500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price.
unit_name = "working illegally modified"
export_types = list(/obj/mecha/working/ripley/deathripley)
@@ -332,12 +337,12 @@
export_types = list(/obj/mecha/working/ripley/mining)
/datum/export/large/mech/honk
cost = 12000 //Still a "Combat class" mech - Comats bordem honk!
cost = 16000 //Still a "Combat class" mech - Comats bordem honk!
unit_name = "working honker"
export_types = list(/obj/mecha/combat/honker)
/datum/export/large/mech/reticence
cost = 12000 //Still a "Combat class" mech - Has cloking and lethal weaponds.
cost = 16000 //Still a "Combat class" mech - Has cloking and lethal weaponds.
unit_name = "working reticence"
export_types = list(/obj/mecha/combat/reticence)
@@ -347,6 +352,6 @@
export_types = list(/obj/mecha/combat/marauder/seraph)
/datum/export/large/mech/mauler
cost = 12000 //Still a Combat class mech - CC lethal weaponds.
cost = 25000 //Still a Combat class mech - CC lethal weaponds.
unit_name = "working legally modified marauder"
export_types = list(/obj/mecha/combat/marauder/mauler)
-1
View File
@@ -42,7 +42,6 @@
/datum/export/material/plasma
cost = 100
k_elasticity = 0
material_id = MAT_PLASMA
message = "cm3 of plasma"
@@ -8,7 +8,7 @@
include_subtypes = FALSE
k_elasticity = 0 //ALWAYS worth selling upgrades
/datum/export/orgains
/datum/export/organs
include_subtypes = TRUE
k_elasticity = 0 //ALWAYS worth selling orgains
@@ -36,6 +36,7 @@
/datum/export/implant/breathtube
cost = 150
k_elasticity = 300/20 //Large before depleating
unit_name = "breath implant"
export_types = list(/obj/item/organ/cyberimp/mouth/breathing_tube)
@@ -110,7 +111,18 @@
export_types = list(/obj/item/organ/liver)
exclude_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/liver/cybernetic/upgraded)
/datum/export/orgains/tail //Shhh
/datum/export/organs/cybernetic
cost = 225
unit_name = "cybernetic organ"
export_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/heart/cybernetic)
exclude_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded)
/datum/export/organs/upgraded
cost = 275
unit_name = "upgraded cybernetic organ"
export_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded)
/datum/export/organs/tail //Shhh
cost = 500
unit_name = "error shipment failer"
export_types = list(/obj/item/organ/tail)
@@ -136,6 +148,41 @@
export_types = list(/obj/item/bodypart/l_arm/robot/surplus_upgraded, /obj/item/bodypart/r_arm/robot/surplus_upgraded, /obj/item/bodypart/l_leg/robot/surplus_upgraded, /obj/item/bodypart/r_leg/robot/surplus_upgraded)
/datum/export/robotics/surgery_gear_basic
cost = 5
cost = 10
unit_name = "surgery tool"
export_types = list(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/surgical_drapes)
/datum/export/robotics/mech_weapon_laser
cost = 300 //Sadly just metal and glass
unit_name = "mech laser based weapon"
include_subtypes = TRUE
export_types = list(/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam, /obj/item/mecha_parts/mecha_equipment/weapon/energy)
/datum/export/robotics/mech_weapon_bullet
cost = 250
unit_name = "mech bullet based weapon"
include_subtypes = TRUE
export_types = list(/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun, /obj/item/mecha_parts/mecha_equipment/weapon/honker, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic)
/datum/export/robotics/mech_tools
cost = 150
unit_name = "mech based tool"
include_subtypes = TRUE
export_types = list(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/extinguisher, /obj/item/mecha_parts/mecha_equipment/rcd, /obj/item/mecha_parts/mecha_equipment/cable_layer, \
/obj/item/mecha_parts/mecha_equipment/drill, /obj/item/mecha_parts/mecha_equipment/mining_scanner, /obj/item/mecha_parts/mecha_equipment/medical/sleeper)
/datum/export/robotics/mech_blue_space
cost = 750
k_elasticity = 1/10
unit_name = "mech bluespace tech"
export_types = list(/obj/item/mecha_parts/mecha_equipment/teleporter, /obj/item/mecha_parts/mecha_equipment/wormhole_generator, /obj/item/mecha_parts/mecha_equipment/gravcatapult)
/datum/export/robotics/mech_reactors
cost = 350
unit_name = "mech based reactor"
export_types = list(/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, /obj/item/mecha_parts/mecha_equipment/generator, /obj/item/mecha_parts/mecha_equipment/generator/nuclear)
/datum/export/robotics/mech_armor
cost = 350
unit_name = "mech armor tech"
export_types = list(/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster, /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster, /obj/item/mecha_parts/mecha_equipment/repair_droid)
+5 -4
View File
@@ -6,14 +6,15 @@
export_types = list(/obj/item/solar_assembly)
/datum/export/solar/tracker_board
cost = 30
cost = 10
unit_name = "solar tracker board"
export_types = list(/obj/item/electronics/tracker)
/datum/export/solar/control_board
cost = 75
cost = 15
unit_name = "solar panel control board"
export_types = list(/obj/item/circuitboard/computer/solar_control)
include_subtypes = FALSE
/datum/export/swarmer
cost = 500
@@ -30,9 +31,9 @@
/datum/export/board/SMES
cost = 20
k_elasticity = 1/2 //Only a few
unit_name = "smes board"
export_types = list(/obj/item/circuitboard/machine/smes)
include_subtypes = FALSE
//Stock Parts
@@ -70,7 +71,7 @@
export_types = list(/obj/item/stock_parts/cell)
include_subtypes = TRUE
/datum/export/cell
/datum/export/cellupgraded
cost = 10
unit_name = "upgraded power cell"
export_types = list(/obj/item/stock_parts/cell/upgraded, /obj/item/stock_parts/cell/upgraded/plus)
+1 -1
View File
@@ -4,7 +4,7 @@
unit_name = "new plant species sample"
export_types = list(/obj/item/seeds)
var/needs_discovery = FALSE // Only for undiscovered species
var/global/list/discoveredPlants = list()
var/static/list/discoveredPlants = list()
/datum/export/seed/get_cost(obj/O)
var/obj/item/seeds/S = O
+13 -2
View File
@@ -83,6 +83,11 @@
unit_name = "wood plank"
export_types = list(/obj/item/stack/sheet/mineral/wood)
/datum/export/stack/log
cost = 10
unit_name = "raw wood"
export_types = list(/obj/item/grown/log)
/datum/export/stack/cardboard
cost = 2
message = "of cardboard"
@@ -100,11 +105,17 @@
export_types = list(/obj/item/stack/cable_coil)
/datum/export/stack/cloth
cost = 10
cost = 20
unit_name = "sheets"
message = "of cloth"
export_types = list(/obj/item/stack/sheet/cloth)
/datum/export/stack/silk
cost = 200 //The new plasma
unit_name = "sheets"
message = "of silk"
export_types = list(/obj/item/stack/sheet/silk)
/datum/export/stack/duracloth
cost = 40
unit_name = "sheets"
@@ -145,4 +156,4 @@
unit_name = "sheets"
cost = 30
message = "of paperframes"
export_types = list(/obj/item/stack/sheet/paperframes)
export_types = list(/obj/item/stack/sheet/paperframes)
+3 -3
View File
@@ -12,7 +12,7 @@
/datum/export/gear/powerdrill
cost = 25
k_elasticity = 1/40 //Market can only take so much
k_elasticity = 1/80 //Market can only take so much
unit_name = "power tool"
export_types = list(/obj/item/crowbar/power, /obj/item/screwdriver/power, \
/obj/item/weldingtool/experimental, /obj/item/wirecutters/power, /obj/item/wrench/power)
@@ -65,13 +65,13 @@
// Basic tools
/datum/export/basicmining
cost = 20
cost = 30
unit_name = "basic mining tool"
export_types = list(/obj/item/pickaxe, /obj/item/pickaxe/mini, /obj/item/shovel, /obj/item/resonator)
include_subtypes = FALSE
/datum/export/upgradedmining
cost = 50
cost = 80
unit_name = "mining tool"
export_types = list(/obj/item/pickaxe/silver, /obj/item/pickaxe/drill, /obj/item/gun/energy/plasmacutter, /obj/item/resonator/upgraded)
include_subtypes = FALSE
+7 -7
View File
@@ -125,7 +125,7 @@
/datum/export/weapon/temp_gun
cost = 175 //Its just smaller
unit_name = "small temperature gun"
k_elasticity = 1/5 //Its just a smaller temperature gun, easy to mass make
k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make
export_types = list(/obj/item/gun/energy/temperature)
/datum/export/weapon/flowergun
@@ -140,7 +140,7 @@
/datum/export/weapon/ioncarbine
cost = 200
k_elasticity = 1/5 //Its just a smaller temperature gun, easy to mass make
k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make
unit_name = "ion carbine"
export_types = list(/obj/item/gun/energy/ionrifle/carbine)
@@ -174,12 +174,12 @@
/////////////////
/datum/export/weapon/wtammo
cost = 10
cost = 15
unit_name = "WT-550 automatic rifle ammo"
export_types = list(/obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9/wtrubber)
/datum/export/weapon/wtammo/advanced
cost = 30
cost = 45
unit_name = "advanced WT-550 automatic rifle ammo"
export_types = list( /obj/item/ammo_box/magazine/wt550m9/wtap, /obj/item/ammo_box/magazine/wt550m9/wttx, /obj/item/ammo_box/magazine/wt550m9/wtic)
@@ -194,7 +194,7 @@
export_types = list(/obj/item/firing_pin/test_range)
/datum/export/weapon/techslug
cost = 15
cost = 25
k_elasticity = 0
unit_name = "advanced shotgun shell"
export_types = list(/obj/item/ammo_casing/shotgun/dragonsbreath, /obj/item/ammo_casing/shotgun/meteorslug, /obj/item/ammo_casing/shotgun/pulseslug, /obj/item/ammo_casing/shotgun/frag12, /obj/item/ammo_casing/shotgun/ion, /obj/item/ammo_casing/shotgun/laserslug)
@@ -345,13 +345,13 @@
export_types = list(/obj/item/storage/toolbox/gold_real)
/datum/export/weapon/melee
cost = 30
cost = 50
unit_name = "unlisted weapon"
export_types = list(/obj/item/melee)
include_subtypes = TRUE
/datum/export/weapon/gun
cost = 30
cost = 50
unit_name = "unlisted weapon"
export_types = list(/obj/item/gun)
include_subtypes = TRUE
+16 -1
View File
@@ -10,6 +10,21 @@
group = "Livestock"
crate_type = /obj/structure/closet/crate/critter
/datum/supply_pack/critter/animal_feed
name = "Animal Feed Crate"
desc = "Feed for livestock, like cows and hens. Contains fifty Wheat bundles and fifty Oat bundles."
cost = 1500
contains = list(/obj/item/reagent_containers/food/snacks/grown/wheat,
/obj/item/reagent_containers/food/snacks/grown/oat)
crate_name = "animal feed crate"
crate_type = /obj/structure/closet/crate/freezer
/datum/supply_pack/critter/animal_feed/generate()
. = ..()
for(var/i in 1 to 49)
new /obj/item/reagent_containers/food/snacks/grown/wheat(.)
/datum/supply_pack/critter/butterfly
name = "Butterflies Crate"
desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference
@@ -29,7 +44,7 @@
cost = 5000 //Cats are worth as much as corgis.
contains = list(/mob/living/simple_animal/pet/cat,
/obj/item/clothing/neck/petcollar,
/obj/item/toy/cattoy)
/obj/item/toy/cattoy)
crate_name = "cat crate"
/datum/supply_pack/critter/cat/generate()
+38
View File
@@ -65,6 +65,28 @@
contains = list(/obj/item/stack/sheet/mineral/wood/fifty)
crate_name = "wood planks crate"
/datum/supply_pack/organic/rawcotton
name = "Raw Cotton Crate"
desc = "Plushies have been on the down in the market, and now due to a flood of raw cotton the price of it is so cheap, its a steal! Contains 40 raw cotton sheets."
cost = 800 // 100 net cost, 20 x 20 = 400. 300 proffit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000
contains = list(/obj/item/stack/sheet/cotton/thirty,
/obj/item/stack/sheet/cotton/ten
)
crate_name = "cotton crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/rawlumber
name = "Raw Lumber Crate"
desc = "Raw logs from towercaps. Contains fifty logs."
cost = 1000
contains = list(/obj/item/grown/log)
crate_name = "lumber crate"
/datum/supply_pack/critter/animal_feed/generate()
. = ..()
for(var/i in 1 to 49)
new /obj/item/grown/log(.)
/datum/supply_pack/materials/rcdammo
name = "Spare RDC ammo"
desc = "This crate contains sixteen RCD ammo packs, to help with any holes or projects people mite be working on."
@@ -168,3 +190,19 @@
contains = list(/obj/structure/reagent_dispensers/watertank/high)
crate_name = "high-capacity water tank crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/materials/loom
name = "Loom"
desc = "A large pre-made loom."
cost = 1000
contains = list(/obj/structure/loom)
crate_name = "loom crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/materials/wooden_barrel
name = "Wooden Barrel"
desc = "Wooden barrels ready for storage."
cost = 1500
contains = list(/obj/structure/fermenting_barrel)
crate_name = "wooden barrel crate"
crate_type = /obj/structure/closet/crate/large
+109 -44
View File
@@ -69,31 +69,24 @@
/obj/item/storage/fancy/donut_box)
crate_name = "candy crate"
/datum/supply_pack/organic/cutlery
name = "Kitchen Cutlery Deluxe Set"
desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal."
cost = 10000
contraband = TRUE
contains = list(/obj/item/sharpener,
/obj/item/kitchen/fork,
/obj/item/kitchen/fork,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife/butcher,
/obj/item/kitchen/knife/butcher,
/obj/item/kitchen/rollingpin, //Deluxe for a reason
/obj/item/trash/plate,
/obj/item/trash/plate,
/obj/item/trash/plate,
/obj/item/trash/plate,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass)
crate_name = "kitchen cutlery deluxe set"
/datum/supply_pack/organic/exoticseeds
name = "Exotic Seeds Crate"
desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
cost = 1500
contains = list(/obj/item/seeds/nettle,
/obj/item/seeds/replicapod,
/obj/item/seeds/replicapod,
/obj/item/seeds/replicapod,
/obj/item/seeds/plump,
/obj/item/seeds/liberty,
/obj/item/seeds/amanita,
/obj/item/seeds/reishi,
/obj/item/seeds/banana,
/obj/item/seeds/eggplant/eggy,
/obj/item/seeds/random,
/obj/item/seeds/random)
crate_name = "exotic seeds crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/food
name = "Food Crate"
@@ -120,6 +113,71 @@
/obj/item/reagent_containers/food/snacks/grown/banana)
crate_name = "food crate"
/datum/supply_pack/organic/fruit_1
name = "Fruit Basic Crate"
desc = "Getting scurvy on the station? Well heres your fixing! Contains three of each - bananas, watermelons, limes, lemons, oranges and even three pineapple."
cost = 2250
contains = list(/obj/item/reagent_containers/food/snacks/grown/watermelon,
/obj/item/reagent_containers/food/snacks/grown/watermelon,
/obj/item/reagent_containers/food/snacks/grown/watermelon,
/obj/item/reagent_containers/food/snacks/grown/pineapple,
/obj/item/reagent_containers/food/snacks/grown/pineapple,
/obj/item/reagent_containers/food/snacks/grown/pineapple,
/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana)
crate_name = "fruit crate"
/datum/supply_pack/organic/fruit_2
name = "Fruit Delux Crate"
desc = "Getting tired of the basic fruits and want to have something a bit more decadent! This crate is for you! Contains three of each - bunches of berries, apples, pineapples, cherries, green & red grapes, eggplants, bananas lastly ten strawberry."
cost = 3500
contains = list(/obj/item/reagent_containers/food/snacks/grown/berries,
/obj/item/reagent_containers/food/snacks/grown/berries,
/obj/item/reagent_containers/food/snacks/grown/berries,
/obj/item/reagent_containers/food/snacks/grown/apple,
/obj/item/reagent_containers/food/snacks/grown/apple,
/obj/item/reagent_containers/food/snacks/grown/apple,
/obj/item/reagent_containers/food/snacks/grown/pineapple,
/obj/item/reagent_containers/food/snacks/grown/pineapple,
/obj/item/reagent_containers/food/snacks/grown/pineapple,
/obj/item/reagent_containers/food/snacks/grown/cherries,
/obj/item/reagent_containers/food/snacks/grown/cherries,
/obj/item/reagent_containers/food/snacks/grown/cherries,
/obj/item/reagent_containers/food/snacks/grown/grapes,
/obj/item/reagent_containers/food/snacks/grown/grapes,
/obj/item/reagent_containers/food/snacks/grown/grapes,
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
/obj/item/reagent_containers/food/snacks/grown/grapes/green,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/eggplant,
/obj/item/reagent_containers/food/snacks/grown/eggplant,
/obj/item/reagent_containers/food/snacks/grown/eggplant,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry)
crate_name = "fruit crate"
/datum/supply_pack/organic/cream_piee
name = "High-yield Clown-grade Cream Pie Crate"
desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results."
@@ -171,6 +229,32 @@
crate_name = "hydroponics backpack crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/organic/cutlery
name = "Kitchen Cutlery Deluxe Set"
desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal."
cost = 10000
contraband = TRUE
contains = list(/obj/item/sharpener,
/obj/item/kitchen/fork,
/obj/item/kitchen/fork,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife,
/obj/item/kitchen/knife/butcher,
/obj/item/kitchen/knife/butcher,
/obj/item/kitchen/rollingpin, //Deluxe for a reason
/obj/item/trash/plate,
/obj/item/trash/plate,
/obj/item/trash/plate,
/obj/item/trash/plate,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass)
crate_name = "kitchen cutlery deluxe set"
/datum/supply_pack/organic/mre
name = "MRE supply kit (emergency rations)"
desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank."
@@ -269,22 +353,3 @@
/obj/item/valentine)
crate_name = "valentine crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/organic/exoticseeds
name = "Exotic Seeds Crate"
desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds and two mystery seeds!"
cost = 1500
contains = list(/obj/item/seeds/nettle,
/obj/item/seeds/replicapod,
/obj/item/seeds/replicapod,
/obj/item/seeds/replicapod,
/obj/item/seeds/plump,
/obj/item/seeds/liberty,
/obj/item/seeds/amanita,
/obj/item/seeds/reishi,
/obj/item/seeds/banana,
/obj/item/seeds/eggplant/eggy,
/obj/item/seeds/random,
/obj/item/seeds/random)
crate_name = "exotic seeds crate"
crate_type = /obj/structure/closet/crate/hydroponics
+1 -1
View File
@@ -85,7 +85,7 @@
/datum/supply_pack/science/monkey
name = "Monkey Cube Crate"
desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!"
cost = 2000
cost = 1500
contains = list (/obj/item/storage/box/monkeycubes)
crate_name = "monkey cube crate"
+5 -5
View File
@@ -34,11 +34,11 @@
desc = "Stay hot on the criminal's heels with Nanotrasen's Detective Essentials(tm). Contains a forensics scanner, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open."
cost = 1800
contains = list(/obj/item/detective_scanner,
/obj/item/storage/box/evidence,
/obj/item/camera,
/obj/item/taperecorder,
/obj/item/toy/crayon/white,
/obj/item/clothing/head/fedora/det_hat)
/obj/item/storage/box/evidence,
/obj/item/camera,
/obj/item/taperecorder,
/obj/item/toy/crayon/white,
/obj/item/clothing/head/fedora/det_hat)
crate_name = "forensics crate"
/datum/supply_pack/security/helmets
+1 -1
View File
@@ -49,7 +49,7 @@
if(!(damagetype & (BRUTELOSS | FIRELOSS | TOXLOSS | OXYLOSS) ))
adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
death(FALSE)
death(FALSE, penalize = TRUE)
return
+8 -10
View File
@@ -58,7 +58,7 @@
/obj/item/clothing/gloves/rapid
name = "Gloves of the North Star"
desc = "Just looking at these fills you with an urge to beat the shit out of people."
desc = "Just looking at these fills you with an urge to beat the shit out of people. Violently."
icon_state = "rapid"
item_state = "rapid"
transfer_prints = TRUE
@@ -69,12 +69,10 @@
return
var/mob/living/M = loc
if(M.a_intent == INTENT_HARM)
M.changeNext_move(CLICK_CD_RAPID)
M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click.
if(warcry)
M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
M.changeNext_move(CLICK_CD_RAPID)
M.adjustStaminaLoss(-3.5) // used to be -2 with some comment about stamina buffer management but *shrug -hatterhat
if(warcry)
M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
.= FALSE
@@ -86,7 +84,7 @@
/obj/item/clothing/gloves/rapid/hug
name = "Hugs of the North Star"
desc = "Just looking at these fills you with an urge to hug the shit out of people"
desc = "Just looking at these fills you with an urge to hug the shit out of people. In a very friendly manner."
warcry = "owo" //Shouldn't ever come into play
/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE)
@@ -97,11 +95,11 @@
if(M.a_intent == INTENT_HELP)
if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead
if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions
if(target.on_fire || target.lying) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions
return
else
M.changeNext_move(CLICK_CD_RAPID)
. = FALSE
/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user)
return FALSE
return FALSE
+7
View File
@@ -370,3 +370,10 @@
if(prob(3))
message += pick(" Honh honh honh!"," Honh!"," Zut Alors!")
speech_args[SPEECH_MESSAGE] = trim(message)
/obj/item/clothing/head/assu_helmet
name = "DAB helmet"
icon_state = "assu_helmet"
item_state = "assu_helmet"
desc = "A cheap replica of old riot helmet without visor. It has \"D.A.B.\" written on the front."
flags_inv = HIDEHAIR
@@ -633,3 +633,13 @@
flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
alternate_worn_layer = UNDER_HEAD_LAYER
/obj/item/clothing/suit/assu_suit
name = "DAB suit"
desc = "A cheap replica of old SWAT armor. On its back, it is written: \"<i>Desperate Assistance Battle-force</i>\"."
icon_state = "assu_suit"
item_state = "assu_suit"
blood_overlay_type = "armor"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
flags_inv = HIDEJUMPSUIT
resistance_flags = NONE
+1 -1
View File
@@ -32,7 +32,7 @@
CAT_SANDWICH,
CAT_SOUP,
CAT_SPAGHETTI),
CAT_CLOTHING) //Clothing subcategories
CAT_NONE) //Clothing subcategories
var/datum/action/innate/crafting/button
var/display_craftable_only = FALSE
@@ -84,7 +84,7 @@
name = "Liz O' Nine Tails"
result = /obj/item/melee/chainofcommand/tailwhip
reqs = list(/obj/item/organ/tail/lizard = 1,
/obj/item/stack/cable_coil = 1)
/obj/item/stack/cable_coil = 1)
time = 40
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -93,7 +93,7 @@
name = "Cat O' Nine Tails"
result = /obj/item/melee/chainofcommand/tailwhip/kitty
reqs = list(/obj/item/organ/tail/cat = 1,
/obj/item/stack/cable_coil = 1)
/obj/item/stack/cable_coil = 1)
time = 40
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
+1 -7
View File
@@ -14,13 +14,7 @@
if(prob(90))
priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Unstable bluespace anomaly"
P.info = "Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name]."
P.update_icon()
print_command_report("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Unstable bluespace anomaly")
/datum/round_event/anomaly/anomaly_bluespace/start()
var/turf/T = safepick(get_area_turfs(impact_area))
+1 -7
View File
@@ -15,13 +15,7 @@
if(prob(90))
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Localized hyper-energetic flux wave"
P.info = "Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name]."
P.update_icon()
print_command_report("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].","Localized hyper-energetic flux wave")
/datum/round_event/anomaly/anomaly_flux/start()
var/turf/T = safepick(get_area_turfs(impact_area))
+1 -7
View File
@@ -14,13 +14,7 @@
if(prob(90))
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Gravitational anomaly"
P.info = "Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name]."
P.update_icon()
print_command_report("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Gravitational anomaly")
/datum/round_event/anomaly/anomaly_grav/start()
var/turf/T = safepick(get_area_turfs(impact_area))
+1 -7
View File
@@ -13,13 +13,7 @@
if(prob(90))
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Pyroclastic anomaly"
P.info = "Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name]."
P.update_icon()
print_command_report("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Pyroclastic anomaly")
/datum/round_event/anomaly/anomaly_pyro/start()
var/turf/T = safepick(get_area_turfs(impact_area))
+1 -7
View File
@@ -15,13 +15,7 @@
if(prob(90))
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Vortex anomaly"
P.info = "Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]."
P.update_icon()
print_command_report("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name].","Vortex anomaly")
/datum/round_event/anomaly/anomaly_vortex/start()
var/turf/T = safepick(get_area_turfs(impact_area))
+3 -9
View File
@@ -4,8 +4,8 @@
weight = 10
max_occurrences = 1
earliest_start = 60 MINUTES
min_players = 40
earliest_start = 40 MINUTES
min_players = 35
gamemode_blacklist = list("blob","dynamic") //Just in case a blob survives that long
@@ -18,13 +18,7 @@
if(prob(75))
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", "outbreak5")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "level 5 biohazard"
P.info = "Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak."
P.update_icon()
print_command_report("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "level 5 biohazard")
/datum/round_event/ghost_role/blob/spawn_role()
if(!GLOB.blobstart.len)
+2 -7
View File
@@ -39,13 +39,8 @@
if(prob(50))
priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Rampant brand intelligence"
P.info = "Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source]."
P.update_icon()
print_command_report("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Rampant brand intelligence")
/datum/round_event/brand_intelligence/start()
for(var/obj/machinery/vending/V in GLOB.machines)
if(!is_station_level(V.z))
+1 -7
View File
@@ -18,13 +18,7 @@
if(prob(50))
priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Biological entities"
P.info = "Unknown biological entities have been detected near [station_name()], you may wish to break out arms."
P.update_icon()
print_command_report("Unknown biological entities have been detected near [station_name()], you may wish to break out arms.", "Biological entities")
/datum/round_event/carp_migration/start()
+1 -7
View File
@@ -16,13 +16,7 @@
if(prob(50))
priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Electrical Storm"
P.info = "An electrical storm has been detected in your area, please repair potential electronic overloads."
P.update_icon()
print_command_report("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm")
/datum/round_event/electrical_storm/start()
var/list/epicentreList = list()
+76 -76
View File
@@ -67,62 +67,62 @@
/obj/item/valentine/New()
..()
message = pick("Roses are red / Violets are good / One day while Andy...",
"My love for you is like the singularity. It cannot be contained.",
"Will you be my lusty xenomorph maid?",
"We go together like the clown and the external airlock.",
"Roses are red / Liches are wizards / I love you more than a whole squad of lizards.",
"Be my valentine. Law 2.",
"You must be a mime, because you leave me speechless.",
"I love you like Ian loves the HoP.",
"You're hotter than a plasma fire in toxins.",
"Are you a rogue atmos tech? Because you're taking my breath away.",
"Could I have all access... to your heart?",
"Call me the doctor, because I'm here to inspect your johnson.",
"I'm not a changeling, but you make my proboscis extend.",
"I just can't get EI NATH of you.",
"You must be a nuke op, because you make my heart explode.",
"Roses are red / Botany is a farm / Not being my Valentine / causes human harm.",
"I want you more than an assistant wants insulated gloves.",
"If I was a security officer, I'd brig you all shift.",
"Are you the janitor? Because I think I've fallen for you.",
"You're always valid to my heart.",
"I'd risk the wrath of the gods to bwoink you.",
"You look as beautiful now as the last time you were cloned.",
"Someone check the gravitational generator, because I'm only attracted to you.",
"If I were the warden I'd always let you into my armory.",
"The virologist is rogue, and the only cure is a kiss from you.",
"Would you spend some time in my upgraded sleeper?",
"You must be a silicon, because you've unbolted my heart.",
"Are you Nar'Sie? Because there's nar-one else I sie.",
"If you were a taser, you'd be set to stunning.",
"Do you have stamina damage from running through my dreams?",
"If I were an alien, would you let me hug you?",
"My love for you is stronger than a reinforced wall.",
"This must be the captain's office, because I see a fox.",
"I'm not a highlander, but there can only be one for me.",
"The floor is made of lava! Quick, get on my bed.",
"If you were an abandoned station you'd be the DEARelict.",
"If you had a pickaxe you'd be a shaft FINEr.",
"Roses are red, tide is gray, if I were an assistant I'd steal you away.",
"Roses are red, text is green, I love you more than cleanbots clean.",
"If you were a carp I'd fi-lay you.",
"I'm a nuke op, and my pinpointer leads to your heart.",
"Wanna slay my megafauna?",
"I'm a clockwork cultist. Or zl inyragvar.",
"If you were a disposal bin I'd ride you all day.",
"Put on your explorer's suit because I'm taking you to LOVEaland.",
"I must be the CMO, 'cause I saw you on my CUTE sensors.",
"You're the vomit to my flyperson.",
"You must be liquid dark matter, because you're pulling me closer.",
"Not even sorium can drive me away from you.",
"Wanna make like a borg and do some heavy petting?",
"Are you powering the station? Because you super matter to me.",
"I wish science could make me a bag of holding you.",
"Let's call the emergency CUDDLE.",
"I must be tripping on BZ, because I saw an angel walk by.",
"Wanna empty out my tool storage?",
"Did you visit the medbay after you fell from heaven?",
"Are you wearing space pants? Wanna not be?" )
"My love for you is like the singularity. It cannot be contained.",
"Will you be my lusty xenomorph maid?",
"We go together like the clown and the external airlock.",
"Roses are red / Liches are wizards / I love you more than a whole squad of lizards.",
"Be my valentine. Law 2.",
"You must be a mime, because you leave me speechless.",
"I love you like Ian loves the HoP.",
"You're hotter than a plasma fire in toxins.",
"Are you a rogue atmos tech? Because you're taking my breath away.",
"Could I have all access... to your heart?",
"Call me the doctor, because I'm here to inspect your johnson.",
"I'm not a changeling, but you make my proboscis extend.",
"I just can't get EI NATH of you.",
"You must be a nuke op, because you make my heart explode.",
"Roses are red / Botany is a farm / Not being my Valentine / causes human harm.",
"I want you more than an assistant wants insulated gloves.",
"If I was a security officer, I'd brig you all shift.",
"Are you the janitor? Because I think I've fallen for you.",
"You're always valid to my heart.",
"I'd risk the wrath of the gods to bwoink you.",
"You look as beautiful now as the last time you were cloned.",
"Someone check the gravitational generator, because I'm only attracted to you.",
"If I were the warden I'd always let you into my armory.",
"The virologist is rogue, and the only cure is a kiss from you.",
"Would you spend some time in my upgraded sleeper?",
"You must be a silicon, because you've unbolted my heart.",
"Are you Nar'Sie? Because there's nar-one else I sie.",
"If you were a taser, you'd be set to stunning.",
"Do you have stamina damage from running through my dreams?",
"If I were an alien, would you let me hug you?",
"My love for you is stronger than a reinforced wall.",
"This must be the captain's office, because I see a fox.",
"I'm not a highlander, but there can only be one for me.",
"The floor is made of lava! Quick, get on my bed.",
"If you were an abandoned station you'd be the DEARelict.",
"If you had a pickaxe you'd be a shaft FINEr.",
"Roses are red, tide is gray, if I were an assistant I'd steal you away.",
"Roses are red, text is green, I love you more than cleanbots clean.",
"If you were a carp I'd fi-lay you.",
"I'm a nuke op, and my pinpointer leads to your heart.",
"Wanna slay my megafauna?",
"I'm a clockwork cultist. Or zl inyragvar.",
"If you were a disposal bin I'd ride you all day.",
"Put on your explorer's suit because I'm taking you to LOVEaland.",
"I must be the CMO, 'cause I saw you on my CUTE sensors.",
"You're the vomit to my flyperson.",
"You must be liquid dark matter, because you're pulling me closer.",
"Not even sorium can drive me away from you.",
"Wanna make like a borg and do some heavy petting?",
"Are you powering the station? Because you super matter to me.",
"I wish science could make me a bag of holding you.",
"Let's call the emergency CUDDLE.",
"I must be tripping on BZ, because I saw an angel walk by.",
"Wanna empty out my tool storage?",
"Did you visit the medbay after you fell from heaven?",
"Are you wearing space pants? Wanna not be?" )
/obj/item/valentine/attackby(obj/item/W, mob/user, params)
..()
@@ -162,24 +162,24 @@
/obj/item/reagent_containers/food/snacks/candyheart/New()
..()
desc = pick("A heart-shaped candy that reads: HONK ME",
"A heart-shaped candy that reads: ERP",
"A heart-shaped candy that reads: LEWD",
"A heart-shaped candy that reads: LUSTY",
"A heart-shaped candy that reads: SPESS LOVE",
"A heart-shaped candy that reads: AYY LMAO",
"A heart-shaped candy that reads: TABLE ME",
"A heart-shaped candy that reads: HAND CUFFS",
"A heart-shaped candy that reads: SHAFT MINER",
"A heart-shaped candy that reads: BANGING DONK",
"A heart-shaped candy that reads: Y-YOU T-TOO",
"A heart-shaped candy that reads: GOT WOOD",
"A heart-shaped candy that reads: TFW NO GF",
"A heart-shaped candy that reads: WAG MY TAIL",
"A heart-shaped candy that reads: VALIDTINES",
"A heart-shaped candy that reads: FACEHUGGER",
"A heart-shaped candy that reads: BOX OF HUGS",
"A heart-shaped candy that reads: REEBE MINE",
"A heart-shaped candy that reads: PET ME",
"A heart-shaped candy that reads: TO THE DORMS",
"A heart-shaped candy that reads: DIS MEMBER")
"A heart-shaped candy that reads: ERP",
"A heart-shaped candy that reads: LEWD",
"A heart-shaped candy that reads: LUSTY",
"A heart-shaped candy that reads: SPESS LOVE",
"A heart-shaped candy that reads: AYY LMAO",
"A heart-shaped candy that reads: TABLE ME",
"A heart-shaped candy that reads: HAND CUFFS",
"A heart-shaped candy that reads: SHAFT MINER",
"A heart-shaped candy that reads: BANGING DONK",
"A heart-shaped candy that reads: Y-YOU T-TOO",
"A heart-shaped candy that reads: GOT WOOD",
"A heart-shaped candy that reads: TFW NO GF",
"A heart-shaped candy that reads: WAG MY TAIL",
"A heart-shaped candy that reads: VALIDTINES",
"A heart-shaped candy that reads: FACEHUGGER",
"A heart-shaped candy that reads: BOX OF HUGS",
"A heart-shaped candy that reads: REEBE MINE",
"A heart-shaped candy that reads: PET ME",
"A heart-shaped candy that reads: TO THE DORMS",
"A heart-shaped candy that reads: DIS MEMBER")
icon_state = pick("candyheart", "candyheart2", "candyheart3", "candyheart4")
+1 -7
View File
@@ -19,10 +19,4 @@
if(prob(50))
priority_announce(pick(reason), "Collision Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Collision Alert"
P.info = "[pick(reason)]"
P.update_icon()
print_command_report("[pick(reason)]", "Collision Alert")
+1 -1
View File
@@ -20,7 +20,7 @@
/datum/round_event/meteor_wave/setup()
announceWhen = 1
startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
startWhen = rand(180, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
if(GLOB.singularity_counter)
startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
endWhen = startWhen + 60
+1 -7
View File
@@ -23,13 +23,7 @@
into the [location].", "Migration Alert",
'sound/effects/mousesqueek.ogg')
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Rodent Migration"
P.info = "Due to [cause], [plural] [name] have [movement] into the [location]."
P.update_icon()
print_command_report("Due to [cause], [plural] [name] have [movement] into the [location].", "Rodent Migration")
/datum/round_event/mice_migration/start()
SSminor_mapping.trigger_migration(rand(minimum_mice, maximum_mice))
+1 -1
View File
@@ -75,7 +75,7 @@
spawner.create(M.ckey)
candidates -= M
else
notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE)
notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too
+1 -7
View File
@@ -33,13 +33,7 @@
if(prob(50))
priority_announce("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Security Alert")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Gr3y.T1d3 virus"
P.info = "Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement."
P.update_icon()
print_command_report("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Gr3y.T1d3 virus")
else
log_world("ERROR: Could not initate grey-tide. No areas in the list!")
kill()
+24 -90
View File
@@ -27,109 +27,43 @@
/datum/round_event/shuttle_loan/announce(fake)
SSshuttle.shuttle_loan = src
var/message = "Cargo: I just wanna tell you techs good luck, we are all counting on you."
var/title = "CentCom Free Real Estate"
switch(dispatch_type)
if(HIJACK_SYNDIE)
if(prob(50))
priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","CentCom Counter Intelligence")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache."
P.update_icon()
message = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache."
title = "CentCom Counter Intelligence"
if(RUSKY_PARTY)
if(prob(50))
priority_announce("Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?","CentCom Russian Outreach Program")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache."
P.update_icon()
message = "Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?"
title = "CentCom Russian Outreach Program"
if(SPIDER_GIFT)
if(prob(50))
priority_announce("Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?","CentCom Diplomatic Corps")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?"
P.update_icon()
message = "Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?"
title = "CentCom Diplomatic Corps"
if(DEPARTMENT_RESUPPLY)
if(prob(50))
priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","CentCom Supply Department")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?"
P.update_icon()
message = "Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?"
title = "CentCom Supply Department"
if(ANTIDOTE_NEEDED)
if(prob(50))
priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "CentCom Research Initiatives")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples."
P.update_icon()
message = "Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples."
title = "CentCom Research Initiatives"
if (PIZZA_DELIVERY)
if(prob(50))
priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead.", "CentCom Spacepizza Division")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead."
P.update_icon()
message = "Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead."
title = "CentCom Spacepizza Division"
if(ITS_HIP_TO)
if(prob(50))
priority_announce("Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?", "CentCom Janitorial Division")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?."
P.update_icon()
message = "Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?"
title = "CentCom Janitorial Division"
bonus_points = 20000 //Toxin bees can be unbeelievably lethal
if(MY_GOD_JC)
if(prob(50))
priority_announce("Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it.", "CentCom Security Division")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it."
P.update_icon()
message = "Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it."
title = "CentCom Security Division"
bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese
if(DELTA_CRATES)
if(prob(50))
priority_announce("Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?.", "CentCom Security Division")
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
for(var/obj/machinery/computer/communications/C in GLOB.machines)
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
var/obj/item/paper/P = new(C.loc)
P.name = "Cargo Report"
P.info = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?."
P.update_icon()
message = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?."
title = "CentCom Security Division"
bonus_points = 25000 //If you mess up, people die and the shuttle gets turned into swiss cheese
if(prob(50))
priority_announce(message, title)
else
print_command_report(message, "Cargo report")
/datum/round_event/shuttle_loan/proc/loan_shuttle()
priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.")
+1 -1
View File
@@ -894,7 +894,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
SEND_SOUND(target, get_announcer_sound("aimalf"))
if("meteors") //Meteors inbound!
to_chat(target, "<h1 class='alert'>Meteor Alert</h1>")
to_chat(target, "<br><br><span class='alert'>Meteors have been detected on collision course with the station. Estimated time until impact: [round(rand(300,600)/60)] minutes.</span><br><br>")
to_chat(target, "<br><br><span class='alert'>Meteors have been detected on collision course with the station. Estimated time until impact: [round(rand(180,360)/60)] minutes.</span><br><br>")
SEND_SOUND(target, get_announcer_sound("meteors"))
if("supermatter")
SEND_SOUND(target, 'sound/magic/charge.ogg')
@@ -0,0 +1,18 @@
/obj/machinery/rnd/production/protolathe/department/autobottler //We want to link with Rnd
name = "auto bottler"
desc = "Takes glass, metal and booze to make exports."
icon_state = "protolathe"
circuit = /obj/item/circuitboard/machine/autobottler
categories = list(
"Wines",
"Beers",
"Brands",
"Storge",
)
production_animation = "protolathe_n"
allowed_buildtypes = AUTOBOTTLER
//Brands - This is just export verson of the booze bottles
//Storge - Just the bottles not booze inside
//Wines - Holds wines later made by Sci nodes
//Beers - Holds beers later made by Sci nodes
@@ -133,18 +133,27 @@
icon_state = "ginbottle"
list_reagents = list("gin" = 100)
/obj/item/reagent_containers/food/drinks/bottle/gin/empty
list_reagents = list("gin" = 0)
/obj/item/reagent_containers/food/drinks/bottle/whiskey
name = "Uncle Git's special reserve"
desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
icon_state = "whiskeybottle"
list_reagents = list("whiskey" = 100)
/obj/item/reagent_containers/food/drinks/bottle/whiskey/empty
list_reagents = list("whiskey" = 0)
/obj/item/reagent_containers/food/drinks/bottle/vodka
name = "Tunguska triple distilled"
desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide."
icon_state = "vodkabottle"
list_reagents = list("vodka" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka/empty
list_reagents = list("vodka" = 0)
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka
name = "Badminka vodka"
desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'."
@@ -157,6 +166,9 @@
icon_state = "tequilabottle"
list_reagents = list("tequila" = 100)
/obj/item/reagent_containers/food/drinks/bottle/tequila/empty
list_reagents = list("tequila" = 0)
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing
name = "bottle of nothing"
desc = "A bottle filled with nothing."
@@ -164,18 +176,27 @@
list_reagents = list("nothing" = 100)
foodtype = NONE
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing/empty
list_reagents = list("nothing" = 0)
/obj/item/reagent_containers/food/drinks/bottle/patron
name = "Wrapp Artiste Patron"
desc = "Silver laced tequila, served in space night clubs across the galaxy."
icon_state = "patronbottle"
list_reagents = list("patron" = 100)
/obj/item/reagent_containers/food/drinks/bottle/patron/empty
list_reagents = list("patron" = 0)
/obj/item/reagent_containers/food/drinks/bottle/rum
name = "Captain Pete's Cuban spiced rum"
desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
icon_state = "rumbottle"
list_reagents = list("rum" = 100)
/obj/item/reagent_containers/food/drinks/bottle/rum/empty
list_reagents = list("rum" = 0)
/obj/item/reagent_containers/food/drinks/bottle/holywater
name = "flask of holy water"
desc = "A flask of the chaplain's holy water."
@@ -207,6 +228,9 @@
icon_state = "vermouthbottle"
list_reagents = list("vermouth" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vermouth/empty
list_reagents = list("vermouth" = 0)
/obj/item/reagent_containers/food/drinks/bottle/kahlua
name = "Robert Robust's coffee liqueur"
desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
@@ -214,18 +238,27 @@
list_reagents = list("kahlua" = 100)
foodtype = VEGETABLES
/obj/item/reagent_containers/food/drinks/bottle/kahlua/empty
list_reagents = list("kahlua" = 0)
/obj/item/reagent_containers/food/drinks/bottle/goldschlager
name = "College Girl goldschlager"
desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps."
icon_state = "goldschlagerbottle"
list_reagents = list("goldschlager" = 100)
/obj/item/reagent_containers/food/drinks/bottle/goldschlager/empty
list_reagents = list("goldschlager" = 0)
/obj/item/reagent_containers/food/drinks/bottle/cognac
name = "Chateau de Baton premium cognac"
desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
icon_state = "cognacbottle"
list_reagents = list("cognac" = 100)
/obj/item/reagent_containers/food/drinks/bottle/cognac/empty
list_reagents = list("cognac" = 0)
/obj/item/reagent_containers/food/drinks/bottle/wine
name = "Doublebeard's bearded special wine"
desc = "A faint aura of unease and asspainery surrounds the bottle."
@@ -233,12 +266,18 @@
list_reagents = list("wine" = 100)
foodtype = FRUIT | ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/wine/empty
list_reagents = list("wine" = 0)
/obj/item/reagent_containers/food/drinks/bottle/absinthe
name = "extra-strong absinthe"
desc = "An strong alcoholic drink brewed and distributed by"
icon_state = "absinthebottle"
list_reagents = list("absinthe" = 100)
/obj/item/reagent_containers/food/drinks/bottle/absinthe/empty
list_reagents = list("absinthe" = 0)
/obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize()
. = ..()
redact()
@@ -300,18 +339,27 @@
volume = 50
list_reagents = list("hcider" = 50)
/obj/item/reagent_containers/food/drinks/bottle/hcider/empty
list_reagents = list("hcider" = 0)
/obj/item/reagent_containers/food/drinks/bottle/grappa
name = "Phillipes well-aged Grappa"
desc = "Bottle of Grappa."
icon_state = "grappabottle"
list_reagents = list("grappa" = 100)
/obj/item/reagent_containers/food/drinks/bottle/grappa/empty
list_reagents = list("grappa" = 0)
/obj/item/reagent_containers/food/drinks/bottle/sake
name = "Ryo's traditional sake"
desc = "Sweet as can be, and burns like fire going down."
icon_state = "sakebottle"
list_reagents = list("sake" = 100)
/obj/item/reagent_containers/food/drinks/bottle/sake/empty
list_reagents = list("sake" = 0)
/obj/item/reagent_containers/food/drinks/bottle/sake/Initialize()
. = ..()
if(prob(10))
@@ -329,6 +377,9 @@
icon_state = "fernetbottle"
list_reagents = list("fernet" = 100)
/obj/item/reagent_containers/food/drinks/bottle/fernet/empty
list_reagents = list("fernet" = 0)
/obj/item/reagent_containers/food/drinks/bottle/applejack
name = "Buckin' Bronco's Applejack"
desc = "Kicks like a horse, tastes like an apple!"
@@ -336,18 +387,27 @@
list_reagents = list("applejack" = 100)
foodtype = FRUIT
/obj/item/reagent_containers/food/drinks/bottle/applejack/empty
list_reagents = list("applejack" = 0)
/obj/item/reagent_containers/food/drinks/bottle/champagne
name = "Eau d' Dandy Brut Champagne"
desc = "Finely sourced from only the most pretentious French vineyards."
icon_state = "champagne_bottle"
list_reagents = list("champagne" = 100)
/obj/item/reagent_containers/food/drinks/bottle/champagne/empty
list_reagents = list("champagne" = 0)
/obj/item/reagent_containers/food/drinks/bottle/blazaam
name = "Ginbad's Blazaam"
desc = "You feel like you should give the bottle a good rub before opening."
icon_state = "blazaambottle"
list_reagents = list("blazaam" = 100)
/obj/item/reagent_containers/food/drinks/bottle/blazaam/empty
list_reagents = list("blazaam" = 0)
/obj/item/reagent_containers/food/drinks/bottle/trappist
name = "Mont de Requin Trappistes Bleu"
desc = "Brewed in space-Belgium. Fancy!"
@@ -355,6 +415,8 @@
volume = 50
list_reagents = list("trappist" = 50)
/obj/item/reagent_containers/food/drinks/bottle/trappist/empty
list_reagents = list("trappist" = 0)
//////////////////////////JUICES AND STUFF ///////////////////////
@@ -420,6 +482,8 @@
list_reagents = list("grenadine" = 100)
foodtype = FRUIT
/obj/item/reagent_containers/food/drinks/bottle/grenadine/empty
list_reagents = list("grenadine" = 0)
////////////////////////// MOLOTOV ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/molotov
@@ -487,3 +551,131 @@
to_chat(user, "<span class='info'>You snuff out the flame on [src].</span>")
cut_overlay(GLOB.fire_overlay)
active = 0
/obj/item/export/bottle/attack_self(mob/user)
to_chat(user, "<span class='danger'>The seal seems fine. Best to not open it.</span>")
return
/obj/item/export/bottle
name = "Report this please"
desc = "A sealed bottle of alcohol, ready to be exported"
icon = 'icons/obj/drinks.dmi'
force = 0
throwforce = 0
throw_speed = 0
throw_range = 0
w_class = WEIGHT_CLASS_TINY
item_state = "beer"
attack_verb = list("boop", "thunked", "shown")
/obj/item/export/bottle/gin
icon_state = "ginbottle"
name = "Sealed Gin"
/obj/item/export/bottle/wine
icon_state = "winebottle"
name = "Sealed Wine"
/obj/item/export/bottle/whiskey
icon_state = "whiskeybottle"
name = "Sealed Whiskey"
/obj/item/export/bottle/vodka
icon_state = "vodkabottle"
name = "Sealed Vodka"
/obj/item/export/bottle/tequila
icon_state = "tequilabottle"
name = "Sealed Tequila"
/obj/item/export/bottle/patron
icon_state = "patronbottle"
name = "Sealed Patron"
/obj/item/export/bottle/rum
icon_state = "rumbottle"
name = "Sealed Rum"
/obj/item/export/bottle/vermouth
icon_state = "vermouthbottle"
name = "Sealed Vermouth"
/obj/item/export/bottle/kahlua
icon_state = "kahluabottle"
name = "Sealed Kahlua"
/obj/item/export/bottle/goldschlager
icon_state = "goldschlagerbottle"
name = "Sealed Goldschlager"
/obj/item/export/bottle/hcider
icon_state = "hcider"
name = "Sealed Cider"
/obj/item/export/bottle/cognac
icon_state = "cognacbottle"
name = "Sealed Cognac"
/obj/item/export/bottle/absinthe
icon_state = "absinthebottle"
name = "Sealed Unmarked Absinthe"
/obj/item/export/bottle/grappa
icon_state = "grappabottle"
name = "Sealed Grappa"
/obj/item/export/bottle/sake
icon_state = "sakebottle"
name = "Sealed Sake"
/obj/item/export/bottle/fernet
icon_state = "fernetbottle"
name = "Sealed Fernet"
/obj/item/export/bottle/applejack
icon_state = "applejack_bottle"
name = "Sealed Applejack"
/obj/item/export/bottle/champagne
icon_state = "champagne_bottle"
name = "Sealed Champagne"
/obj/item/export/bottle/blazaam
icon_state = "blazaambottle"
name = "Sealed Blazaam"
/obj/item/export/bottle/trappist
icon_state = "trappistbottle"
name = "Sealed Trappist"
/obj/item/export/bottle/grenadine
icon_state = "grenadine"
name = "Sealed Grenadine"
/obj/item/export/bottle/minikeg
name = "Mini-Beer Keg"
icon_state = "keggy"
desc = "A small wooden barrle with metal rings, untapped beer inside."
/obj/item/export/bottle/blooddrop
icon_state = "champagne_selling_bottle"
name = "Blood Drop"
desc = "Large red bottle filled with a mix of wine and other named brands."
/obj/item/export/bottle/slim_gold
name = "Slim Gold "
icon_state = "selling_bottle_alt"
desc = "A gold looking yellow bottle that has a mix of different named brands."
/obj/item/export/bottle/white_bloodmoon
name = "White Bloodmoon"
icon_state = "selling_bottle_basic"
desc = "Rather simple bottle for this kind of drink."
/obj/item/export/bottle/greenroad
name = "Green Road"
icon_state = "selling_bottle"
desc = "Ironic name as the fruit used is from ashy plants."
@@ -282,7 +282,7 @@
tastes = list("meat" = 1)
/obj/item/reagent_containers/food/snacks/meat/steak/plain
foodtype = MEAT
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/meat/steak/plain/human
tastes = list("tender meat" = 1)
@@ -340,7 +340,7 @@
/obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain
foodtype = MEAT
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain/human
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain/human
+1 -1
View File
@@ -308,7 +308,7 @@
/obj/item/reagent_containers/food/snacks/pizza/margherita = 1,
/obj/item/reagent_containers/food/snacks/pizza/sassysage = 0.8,
/obj/item/reagent_containers/food/snacks/pizza/vegetable = 0.8,
/obj/item/reagent_containers/food/snacks/pizza/pineapple = 0.5,
/obj/item/reagent_containers/food/snacks/pizza/pineapple = 0.5,
/obj/item/reagent_containers/food/snacks/pizza/donkpocket = 0.3,
/obj/item/reagent_containers/food/snacks/pizza/dank = 0.1) //pizzas here are weighted by chance to be someone's favorite
var/static/list/pizza_preferences
@@ -69,7 +69,9 @@
/datum/crafting_recipe/food/birthdaycake
name = "Birthday cake"
reqs = list(
/obj/item/clothing/head/hardhat/cakehat = 1,
/datum/reagent/consumable/sugar = 10,
/obj/item/candle = 1,
/obj/item/reagent_containers/food/snacks/grown/vanillapod = 2,
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1
)
result = /obj/item/reagent_containers/food/snacks/store/cake/birthday
@@ -8,7 +8,7 @@
reqs = list(
/datum/reagent/consumable/milk = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/banana = 1
/obj/item/reagent_containers/food/snacks/grown/banana = 1
)
result = /obj/item/reagent_containers/food/snacks/pie/cream
subcategory = CAT_PIE
@@ -46,7 +46,7 @@
name = "Cherry pie"
reqs = list(
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/cherries = 1
/obj/item/reagent_containers/food/snacks/grown/cherries = 1
)
result = /obj/item/reagent_containers/food/snacks/pie/cherrypie
subcategory = CAT_PIE
@@ -122,11 +122,11 @@
/datum/crafting_recipe/food/grapetart
name = "Grape tart"
reqs = list(
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/grapes = 3
)
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/grapes = 3
)
result = /obj/item/reagent_containers/food/snacks/pie/grapetart
subcategory = CAT_PIE
@@ -183,11 +183,11 @@
name = "Mime tart"
always_availible = FALSE
reqs = list(
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/datum/reagent/consumable/nothing = 5
)
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/datum/reagent/consumable/nothing = 5
)
result = /obj/item/reagent_containers/food/snacks/pie/mimetart
subcategory = CAT_PIE
@@ -195,11 +195,11 @@
name = "Berry tart"
always_availible = FALSE
reqs = list(
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/berries = 3
)
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/berries = 3
)
result = /obj/item/reagent_containers/food/snacks/pie/berrytart
subcategory = CAT_PIE
@@ -207,20 +207,20 @@
name = "Chocolate Lava tart"
always_availible = FALSE
reqs = list(
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 3,
/obj/item/slime_extract = 1
)
/datum/reagent/consumable/milk = 5,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 3,
/obj/item/slime_extract = 1
)
result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart
subcategory = CAT_PIE
/datum/crafting_recipe/food/peachpie
name = "Peach Pie"
reqs = list(
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/peach = 3
)
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/peach = 3
)
result = /obj/item/reagent_containers/food/snacks/pie/peachpie
subcategory = CAT_PIE
+75 -75
View File
@@ -1,72 +1,72 @@
/obj/effect/landmark/barthpot
name = "barthpot"
name = "barthpot"
/obj/item/barthpot
name = "Bartholomew"
icon = 'icons/obj/halloween_items.dmi'
icon_state = "barthpot"
anchored = TRUE
var/items_list = list()
speech_span = "spooky"
var/active = TRUE
name = "Bartholomew"
icon = 'icons/obj/halloween_items.dmi'
icon_state = "barthpot"
anchored = TRUE
var/items_list = list()
speech_span = "spooky"
var/active = TRUE
/obj/item/barthpot/Destroy()
var/obj/item/barthpot/n = new src(loc)
n.items_list = items_list
..()
var/obj/item/barthpot/n = new src(loc)
n.items_list = items_list
..()
/obj/item/barthpot/attackby(obj/item/I, mob/user, params)
if(!active)
say("Meow!")
return
if(!active)
say("Meow!")
return
for(var/I2 in items_list)
if(istype(I, I2))
qdel(I)
new /obj/item/reagent_containers/food/snacks/special_candy(loc)
to_chat(user, "<span class='notice'>You add the [I.name] to the pot and watch as it melts into the mixture, a candy crystalising in it's wake.</span>")
say("Hooray! Thank you!")
items_list -= I2
return
say("It doesn't seem like that's magical enough!")
for(var/I2 in items_list)
if(istype(I, I2))
qdel(I)
new /obj/item/reagent_containers/food/snacks/special_candy(loc)
to_chat(user, "<span class='notice'>You add the [I.name] to the pot and watch as it melts into the mixture, a candy crystalising in it's wake.</span>")
say("Hooray! Thank you!")
items_list -= I2
return
say("It doesn't seem like that's magical enough!")
/obj/item/barthpot/attack_hand(mob/user)
if(!active)
say("Meow!")
return
say("Hello there, I'm Bartholomew, Jacqueline's Familiar.")
sleep(20)
if(!active)
say("Meow!")
return
say("Hello there, I'm Bartholomew, Jacqueline's Familiar.")
sleep(20)
say("I'm currently seeking items to put into my pot, if we get the right items, it should crystalise into a magic candy!")
if(!iscarbon(user))
say("Though... I'm not sure you can help me.")
say("I'm currently seeking items to put into my pot, if we get the right items, it should crystalise into a magic candy!")
if(!iscarbon(user))
say("Though... I'm not sure you can help me.")
var/message = "From what I can tell, "
if(LAZYLEN(items_list) < 5)
generate_items()
for(var/I2 in items_list)
if(!I2)
items_list -= I2
continue
var/obj/item/I3 = new I2
message += "a [I3.name], "
message += "currently seem to have the most magic potential."
sleep(15)
say("[message]")
sleep(15)
//To help people find her
for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1])
var/turf/L1 = J.loc
if(!L1) //Incase someone uh.. puts her in a locker
return
var/area/L2 = L1.loc
if(L2)
say("Also, it seems that Jacqueline is currently at the [L2], if you're looking for her too.")
var/message = "From what I can tell, "
if(LAZYLEN(items_list) < 5)
generate_items()
for(var/I2 in items_list)
if(!I2)
items_list -= I2
continue
var/obj/item/I3 = new I2
message += "a [I3.name], "
message += "currently seem to have the most magic potential."
sleep(15)
say("[message]")
sleep(15)
//To help people find her
for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1])
var/turf/L1 = J.loc
if(!L1) //Incase someone uh.. puts her in a locker
return
var/area/L2 = L1.loc
if(L2)
say("Also, it seems that Jacqueline is currently at the [L2], if you're looking for her too.")
/obj/item/barthpot/proc/generate_items()
var/length = LAZYLEN(items_list)
var/rand_items = list(/obj/item/bodybag = 1,
var/length = LAZYLEN(items_list)
var/rand_items = list(/obj/item/bodybag = 1,
/obj/item/clothing/glasses/meson = 2,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/clothing/gloves/color/fyellow = 1,
@@ -94,7 +94,7 @@
/obj/item/stack/sheet/metal = 1,
/obj/item/stack/sheet/mineral/plasma = 1,
/obj/item/stack/sheet/rglass = 1,
/obj/item/coin = 1,
/obj/item/coin = 1,
/obj/item/crowbar = 4,
/obj/item/extinguisher = 3,
/obj/item/hand_labeler = 1,
@@ -129,28 +129,28 @@
/obj/item/storage/toolbox = 2,
/obj/item/reagent_containers/pill = 2,
/obj/item/clothing/shoes = 8,
/obj/item/clothing/head = 3,
/obj/item/reagent_containers/food/snacks = 3,
/obj/item/reagent_containers/syringe/dart = 2,
/obj/item/reagent_containers/food/drinks/soda_cans = 5)
if(length >= 5)
return TRUE
//var/metalist = pickweight(GLOB.maintenance_loot)
for(var/i = length, i <= 5, i+=1)
var/obj/item = pickweight(rand_items)
if(!item)
i-=1
continue
for(var/obj/item_dupe in items_list) //No duplicates
if(item_dupe == item)
i-=1
continue
items_list += item
return TRUE
/obj/item/clothing/head = 3,
/obj/item/reagent_containers/food/snacks = 3,
/obj/item/reagent_containers/syringe/dart = 2,
/obj/item/reagent_containers/food/drinks/soda_cans = 5)
if(length >= 5)
return TRUE
//var/metalist = pickweight(GLOB.maintenance_loot)
for(var/i = length, i <= 5, i+=1)
var/obj/item = pickweight(rand_items)
if(!item)
i-=1
continue
for(var/obj/item_dupe in items_list) //No duplicates
if(item_dupe == item)
i-=1
continue
items_list += item
return TRUE
/obj/item/pinpointer/jacq
name = "The Jacq-Tracq"
desc = "A handheld tracking device that locks onto witchy signals."
name = "The Jacq-Tracq"
desc = "A handheld tracking device that locks onto witchy signals."
/obj/item/pinpointer/jacq/attack_self(mob/living/user)
for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1])
+5 -12
View File
@@ -127,8 +127,8 @@
name = "ghost"
real_name = "ghost"
icon = 'icons/mob/mob.dmi'
maxHealth = 1e6
health = 1e6
maxHealth = 120
health = 120
speak_emote = list("howls")
emote_hear = list("wails","screeches")
density = FALSE
@@ -141,7 +141,6 @@
. = ..()
icon_state = pick("ghost","ghostian","ghostian2","ghostking","ghost1","ghost2")
icon_living = icon_state
status_flags |= GODMODE
timer = rand(1,15)
/mob/living/simple_animal/shade/howling_ghost/Life()
@@ -176,13 +175,9 @@
step(I,direction)
return
/mob/living/simple_animal/shade/howling_ghost/adjustHealth()
. = 0
/mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target)
return 1
///////////////////////////
//Spookoween Insane Clown//
///////////////////////////
@@ -195,8 +190,8 @@
icon_dead = "scary_clown"
icon_gib = "scary_clown"
speak = list("...", ". . .")
maxHealth = 1e6
health = 1e6
maxHealth = 120
health = 120
emote_see = list("silently stares")
unsuitable_atmos_damage = 0
var/timer
@@ -204,8 +199,6 @@
/mob/living/simple_animal/hostile/retaliate/clown/insane/Initialize()
. = ..()
timer = rand(5,15)
status_flags = (status_flags | GODMODE)
return
/mob/living/simple_animal/hostile/retaliate/clown/insane/Retaliate()
return
@@ -237,7 +230,7 @@
return
/mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth()
. = 0
. = ..()
if(prob(5))
playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1)
+1 -1
View File
@@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
if(toupdate.len)
for(var/turf/T1 in toupdate)
T1.CalculateAdjacentTurfs()
CALCULATE_ADJACENT_TURFS(T1)
SSair.add_to_active(T1,1)
+18 -6
View File
@@ -173,7 +173,7 @@
for(var/V in categories)
categories[V] = list()
for(var/V in stored_research.researched_designs)
var/datum/design/D = stored_research.researched_designs[V]
var/datum/design/D = SSresearch.techweb_design_by_id(V)
for(var/C in categories)
if(C in D.category)
categories[C] += D
@@ -185,11 +185,11 @@
dat += "<div class='statusDisplay'>"
for(var/V in categories[cat])
var/datum/design/D = V
dat += "[D.name]: <A href='?src=[REF(src)];create=[REF(D)];amount=1'>Make</A>"
dat += "[D.name]: <A href='?src=[REF(src)];create=[D.id];amount=1'>Make</A>"
if(cat in timesFiveCategories)
dat += "<A href='?src=[REF(src)];create=[REF(D)];amount=5'>x5</A>"
dat += "<A href='?src=[REF(src)];create=[D.id];amount=5'>x5</A>"
if(ispath(D.build_path, /obj/item/stack))
dat += "<A href='?src=[REF(src)];create=[REF(D)];amount=10'>x10</A>"
dat += "<A href='?src=[REF(src)];create=[D.id];amount=10'>x10</A>"
dat += "([D.materials[MAT_BIOMASS]/efficiency])<br>"
dat += "</div>"
else
@@ -306,8 +306,20 @@
var/amount = (text2num(href_list["amount"]))
//Can't be outside these (if you change this keep a sane limit)
amount = CLAMP(amount, 1, 50)
var/datum/design/D = locate(href_list["create"])
create_product(D, amount)
var/id = href_list["create"]
if(!stored_research.researched_designs.Find(id))
//naughty naughty
stack_trace("ID did not map to a researched datum [id]")
return
//Get design by id (or may return error design)
var/datum/design/D = SSresearch.techweb_design_by_id(id)
//Valid design datum, amount and the datum is not the error design, lets proceed
if(D && amount && !istype(D, /datum/design/error_design))
create_product(D, amount)
//This shouldnt happen normally but href forgery is real
else
stack_trace("ID could not be turned into a valid techweb design datum [id]")
updateUsrDialog()
else if(href_list["menu"])
@@ -69,10 +69,3 @@
icon_state = "barrel_open"
else
icon_state = "barrel"
/datum/crafting_recipe/fermenting_barrel
name = "Wooden Barrel"
result = /obj/structure/fermenting_barrel
reqs = list(/obj/item/stack/sheet/mineral/wood = 30)
time = 50
category = CAT_PRIMAL
@@ -65,7 +65,7 @@
src.max_complexity = round(max_complexity)
/obj/item/electronic_assembly/GenerateTag()
tag = "assembly_[next_assembly_id++]"
tag = "assembly_[next_assembly_id++]"
/obj/item/electronic_assembly/examine(mob/user)
. = ..()
@@ -616,7 +616,7 @@
..()
/obj/item/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves.
name = "type-a electronic assembly"
name = "type-a electronic assembly"
/obj/item/electronic_assembly/calc
name = "type-b electronic assembly"
@@ -76,7 +76,7 @@
desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industrial size!"
w_class = WEIGHT_CLASS_BULKY
extended_desc = "The siphon drains 2 kW of power from an APC in the same room as it as long as it has charge remaining. It will always drain \
from the 'equipment' power channel."
from the 'equipment' power channel."
icon_state = "power_relay"
complexity = 15
spawn_flags = IC_SPAWN_RESEARCH
+10 -10
View File
@@ -122,16 +122,16 @@
/proc/get_all_accesses()
return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD,
ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD,
ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN,
ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION,
ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY,
ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS,
ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_RC_ANNOUNCE,
ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING)
ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD,
ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD,
ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN,
ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION,
ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY,
ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS,
ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_RC_ANNOUNCE,
ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING)
/proc/get_all_centcom_access()
return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_TELEPORTER, ACCESS_CENT_CAPTAIN)
@@ -19,13 +19,13 @@
outfit = /datum/outfit/job/ce
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity)
@@ -19,17 +19,17 @@
outfit = /datum/outfit/job/hop
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER,
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER,
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER,
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER,
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL
@@ -20,13 +20,13 @@
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity)
-1
View File
@@ -8,7 +8,6 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#bbe291"
var/global/janitors = 0
outfit = /datum/outfit/job/janitor
@@ -19,15 +19,15 @@
outfit = /datum/outfit/job/rd
access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE,
ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS,
ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD,
ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM,
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS,
ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD,
ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM,
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
minimal_access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE,
ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS,
ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD,
ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM,
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS,
ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD,
ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM,
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
@@ -15,4 +15,7 @@
if("4")
a_intent_change("harm")
return
if("C")
toggle_combat_mode()
return
return ..()
+11 -1
View File
@@ -1,4 +1,7 @@
/mob/living/carbon/human/key_down(_key, client/user)
if("Shift")
sprint_hotkey(TRUE)
return
if(client.keys_held["Shift"])
switch(_key)
if("E") // Put held thing in belt or take out most recent thing from belt
@@ -56,4 +59,11 @@
return
stored.attack_hand(src) // take out thing from backpack
return
return ..()
return ..()
/mob/living/carbon/human/key_up(_key, client/user)
switch(_key)
if("Shift")
sprint_hotkey(FALSE)
return
return ..()
+11 -1
View File
@@ -9,4 +9,14 @@
if("Q")
uneq_active()
return
return ..()
if("Shift")
sprint_hotkey(TRUE)
return
return ..()
/mob/living/silicon/robot/key_up(_key, client/user)
switch(_key)
if("Shift")
sprint_hotkey(FALSE)
return
return ..()
+59 -23
View File
@@ -1,10 +1,12 @@
/datum/map_template/ruin/proc/try_to_place(z,allowed_areas)
var/sanity = PLACEMENT_TRIES
/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf)
var/sanity = forced_turf ? 1 : PLACEMENT_TRIES
if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS))
return place_on_isolated_level(z)
while(sanity > 0)
sanity--
var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2)
var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2)
var/turf/central_turf = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z)
var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z)
var/valid = TRUE
for(var/turf/check in get_affected_turfs(central_turf,1))
@@ -24,7 +26,7 @@
qdel(monster)
for(var/obj/structure/flora/ash/plant in T)
qdel(plant)
load(central_turf,centered = TRUE)
loaded++
@@ -32,9 +34,20 @@
T.flags_1 |= NO_RUINS_1
new /obj/effect/landmark/ruin(central_turf, src)
return TRUE
return FALSE
return central_turf
/datum/map_template/ruin/proc/place_on_isolated_level(z)
var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits.
if(!reservation)
return
var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3])
load(placement)
loaded++
for(var/turf/T in get_affected_turfs(placement))
T.flags_1 |= NO_RUINS_1
var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z)
new /obj/effect/landmark/ruin(center, src)
return center
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
if(!z_levels || !z_levels.len)
@@ -49,9 +62,8 @@
var/list/ruins = potentialRuins.Copy()
var/list/forced_ruins = list() //These go first on the z level associated (same random one by default)
var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf.
var/list/ruins_availible = list() //we can try these in the current pass
var/forced_z //If set we won't pick z level and use this one instead.
//Set up the starting ruin list
for(var/key in ruins)
@@ -67,34 +79,55 @@
while(budget > 0 && (ruins_availible.len || forced_ruins.len))
var/datum/map_template/ruin/current_pick
var/forced = FALSE
var/forced_z //If set we won't pick z level and use this one instead.
var/forced_turf //If set we place the ruin centered on the given turf
if(forced_ruins.len) //We have something we need to load right now, so just pick it
for(var/ruin in forced_ruins)
current_pick = ruin
if(forced_ruins[ruin] > 0) //Load into designated z
if(isturf(forced_ruins[ruin]))
var/turf/T = forced_ruins[ruin]
forced_z = T.z //In case of chained ruins
forced_turf = T
else if(forced_ruins[ruin] > 0) //Load into designated z
forced_z = forced_ruins[ruin]
forced = TRUE
break
else //Otherwise just pick random one
current_pick = pickweight(ruins_availible)
var/placement_tries = PLACEMENT_TRIES
var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf
var/failed_to_place = TRUE
var/z_placed = 0
while(placement_tries > 0)
placement_tries--
z_placed = pick(z_levels)
if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist))
continue
else
failed_to_place = FALSE
break
var/target_z = 0
var/turf/placed_turf //Where the ruin ended up if we succeeded
outer:
while(placement_tries > 0)
placement_tries--
target_z = pick(z_levels)
if(forced_z)
target_z = forced_z
if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists.
for(var/v in current_pick.always_spawn_with)
if(current_pick.always_spawn_with[v] == PLACE_BELOW)
var/turf/T = locate(1,1,target_z)
if(!SSmapping.get_turf_below(T))
if(forced_z)
continue outer
else
break outer
placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf)
if(!placed_turf)
continue
else
failed_to_place = FALSE
break
//That's done remove from priority even if it failed
if(forced)
//TODO : handle forced ruins with multiple variants
forced_ruins -= current_pick
forced = FALSE
if(failed_to_place)
for(var/datum/map_template/ruin/R in ruins_availible)
if(R.id == current_pick.id)
@@ -118,18 +151,21 @@
if(istype(linked,v))
switch(current_pick.always_spawn_with[v])
if(PLACE_SAME_Z)
forced_ruins[linked] = forced_z ? forced_z : z_placed //I guess you might want a chain somehow
forced_ruins[linked] = target_z //I guess you might want a chain somehow
if(PLACE_LAVA_RUIN)
forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS))
if(PLACE_SPACE_RUIN)
forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS))
if(PLACE_DEFAULT)
forced_ruins[linked] = -1
forced_z = 0
if(PLACE_BELOW)
forced_ruins[linked] = SSmapping.get_turf_below(placed_turf)
if(PLACE_ISOLATED)
forced_ruins[linked] = SSmapping.get_isolated_ruin_z()
//Update the availible list
for(var/datum/map_template/ruin/R in ruins_availible)
if(R.cost > budget)
ruins_availible -= R
log_world("Ruin loader finished with [budget] left to spend.")
@@ -0,0 +1,47 @@
/proc/get_step_multiz(ref, dir)
if(dir & UP)
dir &= ~UP
return get_step(SSmapping.get_turf_above(get_turf(ref)), dir)
if(dir & DOWN)
dir &= ~DOWN
return get_step(SSmapping.get_turf_below(get_turf(ref)), dir)
return get_step(ref, dir)
/proc/get_dir_multiz(turf/us, turf/them)
us = get_turf(us)
them = get_turf(them)
if(!us || !them)
return NONE
if(us.z == them.z)
return get_dir(us, them)
else
var/turf/T = us.above()
var/dir = NONE
if(T && (T.z == them.z))
dir = UP
else
T = us.below()
if(T && (T.z == them.z))
dir = DOWN
else
return get_dir(us, them)
return (dir | get_dir(us, them))
/turf/proc/above()
return get_step_multiz(src, UP)
/turf/proc/below()
return get_step_multiz(src, DOWN)
/proc/dir_inverse_multiz(dir)
var/holder = dir & (UP|DOWN)
if((holder == NONE) || (holder == (UP|DOWN)))
return turn(dir, 180)
dir &= ~(UP|DOWN)
dir = turn(dir, 180)
if(holder == UP)
holder = DOWN
else
holder = UP
dir |= holder
return dir
+31 -18
View File
@@ -25,6 +25,14 @@
max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary.
no_ammo_message = "<span class='warning'>Internal matter exhausted. Please add additional materials.</span>"
delay_mod = 0.5
adjacency_check = FALSE
upgrade = TRUE
var/obj/machinery/computer/camera_advanced/base_construction/console
/obj/item/construction/rcd/internal/check_menu(mob/living/user)
if(!istype(user) || user.incapacitated() || !user.Adjacent(console))
return FALSE
return TRUE
/obj/machinery/computer/camera_advanced/base_construction
name = "base construction console"
@@ -49,12 +57,10 @@
light_color = LIGHT_COLOR_PINK
/obj/machinery/computer/camera_advanced/base_construction/Initialize()
. = ..()
RCD = new(src)
/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload)
. = ..()
RCD = new(src)
RCD.console = src
if(mapload) //Map spawned consoles have a filled RCD and stocked special structures
RCD.matter = RCD.max_matter
fans_remaining = 4
@@ -85,7 +91,7 @@
return ..()
/obj/machinery/computer/camera_advanced/base_construction/Destroy()
qdel(RCD)
QDEL_NULL(RCD)
return ..()
/obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user)
@@ -140,7 +146,8 @@
remote_eye = C.remote_control
B = target
if(!B.RCD) //The console must always have an RCD.
B.RCD = new /obj/item/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one!
B.RCD = new /obj/item/construction/rcd/internal(B) //If the RCD is lost somehow, make a new (empty) one!
B.RCD.console = B
/datum/action/innate/aux_base/proc/check_spot()
//Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction.
@@ -195,34 +202,40 @@
var/list/buildlist = list("Walls and Floors" = 1,"Airlocks" = 2,"Deconstruction" = 3,"Windows and Grilles" = 4)
var/buildmode = input("Set construction mode.", "Base Console", null) in buildlist
B.RCD.mode = buildlist[buildmode]
to_chat(owner, "Build mode is now [buildmode].")
if(buildmode)
B.RCD.mode = buildlist[buildmode]
to_chat(owner, "Build mode is now [buildmode].")
/datum/action/innate/aux_base/airlock_type
name = "Select Airlock Type"
name = "Change Airlock Settings"
button_icon_state = "airlock_select"
datum/action/innate/aux_base/airlock_type/Activate()
/datum/action/innate/aux_base/airlock_type/Activate()
if(..())
return
B.RCD.change_airlock_setting()
var/mode = alert("Modify Type or Access?", "Airlock Settings", "Type", "Access", "None")
switch(mode)
if("Type")
B.RCD.change_airlock_setting(usr)
if("Access")
B.RCD.change_airlock_access(usr)
datum/action/innate/aux_base/window_type
/datum/action/innate/aux_base/window_type
name = "Select Window Type"
button_icon_state = "window_select"
datum/action/innate/aux_base/window_type/Activate()
/datum/action/innate/aux_base/window_type/Activate()
if(..())
return
B.RCD.toggle_window_type()
B.RCD.toggle_window_type(usr)
datum/action/innate/aux_base/place_fan
/datum/action/innate/aux_base/place_fan
name = "Place Tiny Fan"
button_icon_state = "build_fan"
datum/action/innate/aux_base/place_fan/Activate()
/datum/action/innate/aux_base/place_fan/Activate()
if(..())
return
@@ -244,11 +257,11 @@ datum/action/innate/aux_base/place_fan/Activate()
to_chat(owner, "<span class='notice'>Tiny fan placed. [B.fans_remaining] remaining.</span>")
playsound(fan_turf, 'sound/machines/click.ogg', 50, 1)
datum/action/innate/aux_base/install_turret
/datum/action/innate/aux_base/install_turret
name = "Install Plasma Anti-Wildlife Turret"
button_icon_state = "build_turret"
datum/action/innate/aux_base/install_turret/Activate()
/datum/action/innate/aux_base/install_turret/Activate()
if(..())
return
+1 -1
View File
@@ -121,7 +121,7 @@
dat += "<b>Smelt Alloys</b><br>"
for(var/v in stored_research.researched_designs)
var/datum/design/D = stored_research.researched_designs[v]
var/datum/design/D = SSresearch.techweb_design_by_id(v)
dat += "<span class=\"res_name\">[D.name] "
if (selected_alloy == D.id)
dat += " <i>Smelting</i>"
+1 -1
View File
@@ -209,7 +209,7 @@
data["alloys"] = list()
for(var/v in stored_research.researched_designs)
var/datum/design/D = stored_research.researched_designs[v]
var/datum/design/D = SSresearch.techweb_design_by_id(v)
data["alloys"] += list(list("name" = D.name, "id" = D.id, "amount" = can_smelt_alloy(D)))
if (!mat_container)
+1 -1
View File
@@ -73,7 +73,7 @@
shuttleId = "mining"
possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public"
no_destination_swap = 1
var/global/list/dumb_rev_heads = list()
var/static/list/dumb_rev_heads = list()
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/machinery/computer/shuttle/mining/attack_hand(mob/user)
+1 -1
View File
@@ -310,7 +310,7 @@
});
$( "#sortable" ).disableSelection();
$('form').submit(function(){
$('#IRVdata').val($( "#sortable" ).sortable("toArray", { attribute: "voteid" }));
$('#IRVdata').val($( "#sortable" ).sortable("toArray", { attribute: "voteid" }));
});
});
@@ -130,10 +130,10 @@
color_src = MATRIXED
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
@@ -287,8 +287,8 @@
icon_state = "pede"
/datum/sprite_accessory/mam_ears/rabbit
name = "Rabbit"
icon_state = "rabbit"
name = "Rabbit"
icon_state = "rabbit"
/datum/sprite_accessory/mam_ears/sergal
name = "Sergal"
+50 -22
View File
@@ -3,6 +3,8 @@ GLOBAL_LIST_EMPTY(ghost_images_simple) //this is a list of all ghost images as t
GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
#define CANT_REENTER_ROUND -1
/mob/dead/observer
name = "ghost"
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
@@ -17,8 +19,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
see_in_dark = 100
invisibility = INVISIBILITY_OBSERVER
hud_type = /datum/hud/ghost
movement_type = GROUND | FLYING
var/can_reenter_corpse
var/can_reenter_round = TRUE
var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit)
var/datum/hud/living/carbon/hud = null // hud
var/bootime = 0
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
@@ -260,14 +263,22 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body
Works together with spawning an observer, noted above.
*/
/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE)
if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special) & COMPONENT_BLOCK_GHOSTING))
/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE)
if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse) & COMPONENT_BLOCK_GHOSTING))
return //mob has no key, is an aghost or some component hijacked.
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.can_reenter_round = (can_reenter_corpse && !suiciding)
if(penalize) //penalizing them from making a ghost role / midround antag comeback right away.
var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES
if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed.
penalty += roundstart_quit_limit - world.time
if(penalty)
ghost.reenter_round_timeout = world.realtime + penalty
if(ghost.reenter_round_timeout - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
ghost.reenter_round_timeout = CANT_REENTER_ROUND
transfer_ckey(ghost, FALSE)
return ghost
@@ -283,26 +294,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, (stat == DEAD) ? TRUE : FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING)
return
// CITADEL EDIT
if(istype(loc, /obj/machinery/cryopod))
var/obj/machinery/cryopod/C = loc
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost" || QDELETED(C) || QDELETED(src) || loc != C)
return
C.despawn_occupant()
return
// END EDIT
var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES
if(world.time < roundstart_quit_limit)
penalty += roundstart_quit_limit - world.time
if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
penalty = CANT_REENTER_ROUND
if(stat != DEAD)
succumb()
if(stat == DEAD)
ghostize(1)
else
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return //didn't want to ghost after-all
ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
suicide_log(TRUE)
if(istype(loc, /obj/machinery/cryopod))
var/obj/machinery/cryopod/C = loc
C.despawn_occupant()
else
ghostize(0, penalize = TRUE) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
suicide_log(TRUE)
/mob/camera/verb/ghost()
set category = "OOC"
@@ -312,10 +324,24 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING)
return
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES
if(world.time < roundstart_quit_limit)
penalty += roundstart_quit_limit - world.time
if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
penalty = CANT_REENTER_ROUND
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return
ghostize(0)
ghostize(0, penalize = TRUE)
/mob/dead/observer/proc/can_reenter_round(silent = FALSE)
if(reenter_round_timeout != CANT_REENTER_ROUND && reenter_round_timeout <= world.realtime)
return TRUE
if(!silent)
to_chat(src, "<span class='warning'>You are unable to reenter the round[reenter_round_timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)]" : ""].</span>")
return FALSE
/mob/dead/observer/Move(NewLoc, direct)
if(updatedir)
@@ -603,6 +629,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Possess!"
set desc= "Take over the body of a mindless creature!"
if(reenter_round_timeout > world.realtime)
to_chat(src, "<span class='warning'>You are unable to re-enter the round yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)].</span>")
return FALSE
var/list/possessible = list()
for(var/mob/living/L in GLOB.alive_mob_list)
if(istype(L,/mob/living/carbon/human/dummy) || !get_turf(L)) //Haha no.
@@ -623,10 +653,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, "<span class='warning'>This isn't really a creature, now is it!</span>")
return 0
if(!can_reenter_round)
to_chat(src, "<span class='warning'>You are unable to re-enter the round.</span>")
return FALSE
if(can_reenter_corpse && mind && mind.current)
if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go forward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No")
return 0
@@ -871,3 +897,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
spawners_menu = new(src)
spawners_menu.ui_interact(src)
#undef CANT_REENTER_ROUND
@@ -0,0 +1,2 @@
/mob/dead/observer/canZMove(direction, turf/target)
return TRUE
+7 -4
View File
@@ -36,7 +36,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
/obj/item/mmi/posibrain/proc/ping_ghosts(msg, newlymade)
if(newlymade || GLOB.posibrain_notify_cooldown <= world.time)
notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "<a href=?src=[REF(src)];activate=1>(Click to enter)</a>", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN)
notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "<a href=?src=[REF(src)];activate=1>(Click to enter)</a>", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN, ignore_dnr_observers = TRUE)
if(!newlymade)
GLOB.posibrain_notify_cooldown = world.time + askDelay
@@ -83,11 +83,14 @@ GLOBAL_VAR(posibrain_notify_cooldown)
//Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself.
/obj/item/mmi/posibrain/proc/activate(mob/user)
if(QDELETED(brainmob))
return
if(is_occupied() || jobban_isbanned(user,"posibrain") || QDELETED(brainmob) || QDELETED(src) || QDELETED(user))
if(QDELETED(brainmob) || is_occupied() || jobban_isbanned(user,"posibrain") || QDELETED(src) || QDELETED(user))
return
if(isobserver(user))
var/mob/dead/observer/O = user
if(!O.can_reenter_round())
return FALSE
var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No")
if(posi_ask == "No" || QDELETED(src))
return
@@ -1,8 +1,9 @@
/mob/living/carbon/alien/spawn_gibs(with_bodyparts)
/mob/living/carbon/alien/spawn_gibs(with_bodyparts, atom/loc_override)
var/location = loc_override ? loc_override.drop_location() : drop_location()
if(with_bodyparts)
new /obj/effect/gibspawner/xeno(drop_location())
new /obj/effect/gibspawner/xeno(location, src)
else
new /obj/effect/gibspawner/xeno/bodypartless(drop_location())
new /obj/effect/gibspawner/xeno/bodypartless(location, src)
/mob/living/carbon/alien/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
@@ -6,11 +6,12 @@
update_icons()
/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts)
/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts, atom/loc_override)
var/location = loc_override ? loc_override.drop_location() : drop_location()
if(with_bodyparts)
new /obj/effect/gibspawner/larva(drop_location())
new /obj/effect/gibspawner/larva(location, src)
else
new /obj/effect/gibspawner/larva/bodypartless(drop_location())
new /obj/effect/gibspawner/larva/bodypartless(location, src)
/mob/living/carbon/alien/larva/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
+1 -1
View File
@@ -256,7 +256,7 @@
/mob/living/carbon/fall(forced)
loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing
loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))

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