This commit is contained in:
Linzolle
2019-12-08 14:17:00 -06:00
378 changed files with 12243 additions and 8059 deletions

View File

@@ -720,20 +720,44 @@
if(!check_rights(R_SPAWN))
return
var/turf/T = get_turf(usr)
var/chosen = pick_closest_path(object)
if(!chosen)
return
if(ispath(chosen, /turf))
var/turf/T = get_turf(usr.loc)
T.ChangeTurf(chosen)
else
var/atom/A = new chosen(usr.loc)
var/atom/A = new chosen(T)
A.flags_1 |= ADMIN_SPAWNED_1
log_admin("[key_name(usr)] spawned [chosen] at [AREACOORD(usr)]")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/podspawn_atom(object as text)
set category = "Debug"
set desc = "(atom path) Spawn an atom via supply drop"
set name = "Podspawn"
if(!check_rights(R_SPAWN))
return
var/chosen = pick_closest_path(object)
if(!chosen)
return
var/turf/T = get_turf(usr)
if(ispath(chosen, /turf))
T.ChangeTurf(chosen)
else
var/obj/structure/closet/supplypod/centcompod/pod = new()
var/atom/A = new chosen(pod)
A.flags_1 |= ADMIN_SPAWNED_1
new /obj/effect/abstract/DPtarget(T, pod)
log_admin("[key_name(usr)] pod-spawned [chosen] at [AREACOORD(usr)]")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Podspawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/spawn_cargo(object as text)
set category = "Debug"
set desc = "(atom path) Spawn a cargo crate"
@@ -875,7 +899,7 @@
/datum/admins/proc/dynamic_mode_options(mob/user)
var/dat = {"
<center><B><h2>Dynamic Mode Options</h2></B></center><hr>
<br/>
<br/>
<h3>Common options</h3>
<i>All these options can be changed midround.</i> <br/>
<br/>

View File

@@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/roll_dices //CIT CHANGE - Adds dice verb
))
GLOBAL_PROTECT(admin_verbs_fun)
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))
GLOBAL_PROTECT(admin_verbs_spawn)
GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer())
/world/proc/AVerbsServer()

View File

@@ -2355,7 +2355,7 @@
var/atom/target //Where the object will be spawned
var/where = href_list["object_where"]
if (!( where in list("onfloor","inhand","inmarked") ))
if (!( where in list("onfloor","frompod","inhand","inmarked") ))
where = "onfloor"
@@ -2366,7 +2366,7 @@
where = "onfloor"
target = usr
if("onfloor")
if("onfloor", "frompod")
switch(href_list["offset_type"])
if ("absolute")
target = locate(0 + X,0 + Y,0 + Z)
@@ -2382,7 +2382,10 @@
else
target = marked_datum
var/obj/structure/closet/supplypod/centcompod/pod
if(target)
if(where == "frompod")
pod = new()
for (var/path in paths)
for (var/i = 0; i < number; i++)
if(path in typesof(/turf))
@@ -2391,7 +2394,11 @@
if(N && obj_name)
N.name = obj_name
else
var/atom/O = new path(target)
var/atom/O
if(where == "frompod")
O = new path(pod)
else
O = new path(target)
if(!QDELETED(O))
O.flags_1 |= ADMIN_SPAWNED_1
if(obj_dir)
@@ -2411,6 +2418,8 @@
R.module.add_module(I, TRUE, TRUE)
R.activate_module(I)
if(pod)
new /obj/effect/abstract/DPtarget(target, pod)
if (number == 1)
log_admin("[key_name(usr)] created a [english_list(paths)]")

View File

@@ -1249,7 +1249,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(!check_rights(R_ADMIN) || !check_rights(R_FUN))
return
var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD)
var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
@@ -1277,6 +1277,22 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
var/turf/startT = spaceDebrisStartLoc(startside, T.z)
var/turf/endT = spaceDebrisFinishLoc(startside, T.z)
new /obj/effect/immovablerod(startT, endT,target)
if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK)
var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text
var/obj/structure/closet/supplypod/centcompod/pod = new()
pod.damage = 40
pod.explosionSize = list(0,0,0,2)
pod.effectStun = TRUE
if (isnull(target_path)) //The user pressed "Cancel"
return
if (target_path != "empty")//if you didn't type empty, we want to load the pod with a delivery
var/delivery = text2path(target_path)
if(!ispath(delivery))
delivery = pick_closest_path(target_path)
if(!delivery)
alert("ERROR: Incorrect / improper path given.")
new delivery(pod)
new /obj/effect/abstract/DPtarget(get_turf(target), pod)
if(ADMIN_PUNISHMENT_SUPPLYPOD)
var/datum/centcom_podlauncher/plaunch = new(usr)
if(!holder)
@@ -1289,6 +1305,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
plaunch.temp_pod.explosionSize = list(0,0,0,2)
plaunch.temp_pod.effectStun = TRUE
plaunch.ui_interact(usr)
return //We return here because punish_log() is handled by the centcom_podlauncher datum
if(ADMIN_PUNISHMENT_MAZING)
if(!puzzle_imprison(target))
@@ -1298,11 +1315,13 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target))
creamy.splat(target)
var/msg = "[key_name_admin(usr)] punished [key_name_admin(target)] with [punishment]."
message_admins(msg)
admin_ticket_log(target, msg)
log_admin("[key_name(usr)] punished [key_name(target)] with [punishment].")
punish_log(target, punishment)
/client/proc/punish_log(var/whom, var/punishment)
var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]."
message_admins(msg)
admin_ticket_log(whom, msg)
log_admin("[key_name(usr)] punished [key_name(whom)] with [punishment].")
/client/proc/trigger_centcom_recall()
if(!check_rights(R_ADMIN))

View File

@@ -244,6 +244,7 @@
return ..()
/obj/structure/blob/proc/chemeffectreport()
RETURN_TYPE(/list)
. = list()
if(overmind)
. += "<b>Material: <font color=\"[overmind.blob_reagent_datum.color]\">[overmind.blob_reagent_datum.name]</font><span class='notice'>.</span></b>"
@@ -253,6 +254,7 @@
. += "<b>No Material Detected!</b><br>"
/obj/structure/blob/proc/typereport()
RETURN_TYPE(/list)
. = list("<b>Blob Type:</b> <span class='notice'>[uppertext(initial(name))]</span>")
. += "<b>Health:</b> <span class='notice'>[obj_integrity]/[max_integrity]</span>"
. += "<b>Effects:</b> <span class='notice'>[scannerreport()]</span>"

View File

@@ -128,7 +128,8 @@
current.clear_alert("bloodsense")
if(ishuman(current))
var/mob/living/carbon/human/H = current
H.eye_color = initial(H.eye_color)
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
H.eye_color = eyes?.eye_color || initial(H.eye_color)
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
REMOVE_TRAIT(H, TRAIT_CULT_EYES, "valid_cultist")
H.update_body()

View File

@@ -48,18 +48,17 @@
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
A.malf_picker.remove_malf_verbs(A)
qdel(A.malf_picker)
/datum/antagonist/traitor/proc/handle_hearing(datum/source, list/hearing_args)
var/message = hearing_args[HEARING_MESSAGE]
message = GLOB.syndicate_code_phrase_regex.Replace(message, "<span class='blue'>$1</span>")
message = GLOB.syndicate_code_response_regex.Replace(message, "<span class='red'>$1</span>")
hearing_args[HEARING_MESSAGE] = message
SSticker.mode.traitors -= owner
if(!silent && owner.current)
to_chat(owner.current,"<span class='userdanger'> You are no longer the [special_role]! </span>")
owner.special_role = null
..()
. = ..()
/datum/antagonist/traitor/proc/handle_hearing(datum/source, list/hearing_args)
var/message = hearing_args[HEARING_RAW_MESSAGE]
message = GLOB.syndicate_code_phrase_regex.Replace(message, "<span class='blue'>$1</span>")
message = GLOB.syndicate_code_response_regex.Replace(message, "<span class='red'>$1</span>")
hearing_args[HEARING_RAW_MESSAGE] = message
/datum/antagonist/traitor/proc/add_objective(datum/objective/O)
objectives += O
@@ -261,16 +260,20 @@
/datum/antagonist/traitor/apply_innate_effects(mob/living/mob_override)
. = ..()
update_traitor_icons_added()
var/mob/living/silicon/ai/A = mob_override || owner.current
if(istype(A) && traitor_kind == TRAITOR_AI)
var/mob/M = mob_override || owner.current
if(isAI(M) && traitor_kind == TRAITOR_AI)
var/mob/living/silicon/ai/A = M
A.hack_software = TRUE
RegisterSignal(M, COMSIG_MOVABLE_HEAR, .proc/handle_hearing)
/datum/antagonist/traitor/remove_innate_effects(mob/living/mob_override)
. = ..()
update_traitor_icons_removed()
var/mob/living/silicon/ai/A = mob_override || owner.current
if(istype(A) && traitor_kind == TRAITOR_AI)
var/mob/M = mob_override || owner.current
if(isAI(M) && traitor_kind == TRAITOR_AI)
var/mob/living/silicon/ai/A = M
A.hack_software = FALSE
UnregisterSignal(M, COMSIG_MOVABLE_HEAR)
/datum/antagonist/traitor/proc/give_codewords()
if(!owner.current)

View File

@@ -72,11 +72,13 @@
air.copy_from(copy)
/turf/return_air()
RETURN_TYPE(/datum/gas_mixture)
var/datum/gas_mixture/GM = new
GM.copy_from_turf(src)
return GM
/turf/open/return_air()
RETURN_TYPE(/datum/gas_mixture)
return air
/turf/temperature_expose()

View File

@@ -4,7 +4,7 @@
desc = "Very useful for filtering gasses."
density = FALSE
can_unwrench = TRUE
var/target_pressure = ONE_ATMOSPHERE
var/transfer_rate = MAX_TRANSFER_RATE
var/filter_type = null
var/frequency = 0
var/datum/radio_frequency/radio_connection
@@ -15,7 +15,7 @@
/obj/machinery/atmospherics/components/trinary/filter/examine(mob/user)
. = ..()
. += "<span class='notice'>You can hold <b>Ctrl</b> and click on it to toggle it on and off.</span>"
. += "<span class='notice'>You can hold <b>Alt</b> and click on it to maximize its pressure.</span>"
. += "<span class='notice'>You can hold <b>Alt</b> and click on it to maximize its flow rate.</span>"
/obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user)
var/area/A = get_area(src)
@@ -31,8 +31,8 @@
var/area/A = get_area(src)
var/turf/T = get_turf(src)
if(user.canUseTopic(src, BE_CLOSE, FALSE,))
target_pressure = MAX_OUTPUT_PRESSURE
to_chat(user,"<span class='notice'>You maximize the pressure on the [src].</span>")
transfer_rate = MAX_TRANSFER_RATE
to_chat(user,"<span class='notice'>You maximize the flow rate on the [src].</span>")
investigate_log("Filter, [src.name], was maximized by [key_name(usr)] at [x], [y], [z], [A]", INVESTIGATE_ATMOS)
message_admins("Filter, [src.name], was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
@@ -150,24 +150,19 @@
var/datum/gas_mixture/air2 = airs[2]
var/datum/gas_mixture/air3 = airs[3]
var/output_starting_pressure = air3.return_pressure()
var/input_starting_pressure = air1.return_pressure()
if(output_starting_pressure >= target_pressure)
//No need to transfer if target is already full!
if((input_starting_pressure < 0.01))
return
//Calculate necessary moles to transfer using PV=nRT
var/pressure_delta = target_pressure - output_starting_pressure
var/transfer_moles
if(air1.temperature > 0)
transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
var/transfer_ratio = transfer_rate/air1.volume
//Actually transfer the gas
if(transfer_moles > 0)
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
if(transfer_ratio > 0)
var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio)
if(!removed)
return
@@ -188,10 +183,13 @@
removed.gases[filter_type] = 0
GAS_GARBAGE_COLLECT(removed.gases)
var/datum/gas_mixture/target = (air2.return_pressure() < target_pressure ? air2 : air1) //if there's no room for the filtered gas; just leave it in air1
var/datum/gas_mixture/target = (air2.return_pressure() < 9000 ? air2 : air1)
target.merge(filtered_out)
air3.merge(removed)
if(air3.return_pressure() <= 9000)
air3.merge(removed)
else
air1.merge(removed) // essentially just leaving it in
update_parents()
@@ -209,8 +207,8 @@
/obj/machinery/atmospherics/components/trinary/filter/ui_data()
var/data = list()
data["on"] = on
data["pressure"] = round(target_pressure)
data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
data["rate"] = round(transfer_rate)
data["max_rate"] = round(MAX_TRANSFER_RATE)
data["filter_types"] = list()
data["filter_types"] += list(list("name" = "Nothing", "path" = "", "selected" = !filter_type))
@@ -227,21 +225,21 @@
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
. = TRUE
if("pressure")
var/pressure = params["pressure"]
if(pressure == "max")
pressure = MAX_OUTPUT_PRESSURE
if("rate")
var/rate = params["rate"]
if(rate == "max")
rate = MAX_TRANSFER_RATE
. = TRUE
else if(pressure == "input")
pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
if(!isnull(pressure) && !..())
else if(rate == "input")
rate = input("New transfer rate (0-[MAX_TRANSFER_RATE] L/s):", name, transfer_rate) as num|null
if(!isnull(rate) && !..())
. = TRUE
else if(text2num(pressure) != null)
pressure = text2num(pressure)
else if(text2num(rate) != null)
rate = text2num(rate)
. = TRUE
if(.)
target_pressure = CLAMP(pressure, 0, MAX_OUTPUT_PRESSURE)
investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
transfer_rate = CLAMP(rate, 0, MAX_TRANSFER_RATE)
investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", INVESTIGATE_ATMOS)
if("filter")
filter_type = null
var/filter_name = "nothing"

View File

@@ -201,10 +201,10 @@
wanted_types = list(/obj/item/restraints/legcuffs/bola)
/datum/bounty/item/assistant/metalshields
name = "Metal Shields"
name = "Metal Shields" //I didnt realise how much work it was to make these, you need 2 Cloth, 3 Leather, Tools, 10 Metal, and a Cable Coil Stack for each one.
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
reward = 3000
required_count = 2
wanted_types = list(/obj/item/shield/makeshift)
/datum/bounty/item/assistant/toolbelts

View File

@@ -19,7 +19,7 @@
//Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc
//Some effect groups are choices, while other are booleans. This is because some effects can stack, while others dont (ex: you can stack explosion and quiet, but you cant stack ordered launch and random launch)
/datum/centcom_podlauncher
var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/DPtarget, /obj/effect/supplypod_selector ))
var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/abstract/DPtarget, /obj/effect/supplypod_selector ))
var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back
var/client/holder //client of whoever is using this datum
var/area/bay //What bay we're using to launch shit from.
@@ -29,9 +29,10 @@
var/damageChoice = 0 //Determines if we do no damage (0), custom amnt of damage (1), or gib + 5000dmg (2)
var/launcherActivated = FALSE //check if we've entered "launch mode" (when we click a pod is launched). Used for updating mouse cursor
var/effectBurst = FALSE //Effect that launches 5 at once in a 3x3 area centered on the target
var/effectAnnounce = TRUE
var/numTurfs = 0 //Counts the number of turfs with things we can launch in the chosen bay (in the centcom map)
var/launchCounter = 1 //Used with the "Ordered" launch mode (launchChoice = 1) to see what item is launched
var/specificTarget //Do we want to target a specific mob instead of where we click? Also used for smiting
var/atom/specificTarget //Do we want to target a specific mob instead of where we click? Also used for smiting
var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1)
var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea
var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs
@@ -66,12 +67,14 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
data["launchChoice"] = launchChoice //Launch turfs all at once (0), ordered (1), or randomly(1)
data["explosionChoice"] = explosionChoice //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2)
data["damageChoice"] = damageChoice //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2)
data["fallDuration"] = temp_pod.fallDuration //How long the pod's falling animation lasts
data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching
data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing
data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom)
data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod.
data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish!
data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands
data["effectOrgans"] = temp_pod.effectOrgans //If true, yeets the organs out of any bodies caught under the pod when it lands
data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing
data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isnt displayed on the turf where the pod will land
data["effectQuiet"] = temp_pod.effectQuiet //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc)
@@ -81,12 +84,14 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites
data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc)
data["effectAnnounce"] = effectAnnounce
data["giveLauncher"] = launcherActivated //If true, the user is in launch mode, and whenever they click a pod will be launched (either at their mouse position or at a specific target)
data["numObjects"] = numTurfs //Counts the number of turfs that contain a launchable object in the centcom supplypod bay
data["fallingSound"] = temp_pod.fallingSound != initial(temp_pod.fallingSound)//Admin sound to play as the pod falls
data["landingSound"] = temp_pod.landingSound //Admin sound to play when the pod lands
data["openingSound"] = temp_pod.openingSound //Admin sound to play when the pod opens
data["leavingSound"] = temp_pod.leavingSound //Admin sound to play when the pod leaves
data["soundVolume"] = temp_pod.soundVolume != 50 //Admin sound to play when the pod leaves
data["soundVolume"] = temp_pod.soundVolume != initial(temp_pod.soundVolume) //Admin sound to play when the pod leaves
return data
/datum/centcom_podlauncher/ui_act(action, params)
@@ -227,6 +232,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if("effectLimb") //Toggle: Anyone carbon mob under the pod loses a limb when it lands
temp_pod.effectLimb = !temp_pod.effectLimb
. = TRUE
if("effectOrgans") //Toggle: Any carbon mob under the pod loses every limb and organ
temp_pod.effectOrgans = !temp_pod.effectOrgans
. = TRUE
if("effectBluespace") //Toggle: Deletes the pod after landing
temp_pod.bluespace = !temp_pod.bluespace
. = TRUE
@@ -245,6 +253,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if("effectBurst") //Toggle: Launch 5 pods (with a very slight delay between) in a 3x3 area centered around the target
effectBurst = !effectBurst
. = TRUE
if("effectAnnounce") //Toggle: Sends a ghost announcement.
effectAnnounce = !effectAnnounce
. = TRUE
if("effectReverse") //Toggle: Don't send any items. Instead, after landing, close (taking any objects inside) and go back to the centcom bay it came from
temp_pod.reversing = !temp_pod.reversing
. = TRUE
@@ -261,11 +272,23 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
. = TRUE
////////////////////////////TIMER DELAYS//////////////////
if("fallDuration") //Change the falling animation duration
if (temp_pod.fallDuration != initial(temp_pod.fallDuration)) //If the fall duration has already been changed when we push the "change value" button, then set it to default
temp_pod.fallDuration = initial(temp_pod.fallDuration)
return
var/timeInput = input("Enter the duration of the pod's falling animation, in seconds", "Delay Time", initial(temp_pod.fallDuration) * 0.1) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default
alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallDuration)*0.1]) instead.")
timeInput = initial(temp_pod.fallDuration)
temp_pod.fallDuration = 10 * timeInput
. = TRUE
if("landingDelay") //Change the time it takes the pod to land, after firing
if (temp_pod.landingDelay != initial(temp_pod.landingDelay)) //If the landing delay has already been changed when we push the "change value" button, then set it to default
temp_pod.landingDelay = initial(temp_pod.landingDelay)
return
var/timeInput = input("Delay Time", "Enter the time it takes for the pod to land, in seconds", 0.5) as null|num
var/timeInput = input("Enter the time it takes for the pod to land, in seconds", "Delay Time", initial(temp_pod.landingDelay) * 0.1) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default
@@ -277,7 +300,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if (temp_pod.openingDelay != initial(temp_pod.openingDelay)) //If the opening delay has already been changed when we push the "change value" button, then set it to default
temp_pod.openingDelay = initial(temp_pod.openingDelay)
return
var/timeInput = input("Delay Time", "Enter the time it takes for the pod to open after landing, in seconds", 3) as null|num
var/timeInput = input("Enter the time it takes for the pod to open after landing, in seconds", "Delay Time", initial(temp_pod.openingDelay) * 0.1) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput)) //Sanitize input
@@ -289,7 +312,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if (temp_pod.departureDelay != initial(temp_pod.departureDelay)) //If the departure delay has already been changed when we push the "change value" button, then set it to default
temp_pod.departureDelay = initial(temp_pod.departureDelay)
return
var/timeInput = input("Delay Time", "Enter the time it takes for the pod to leave after opening, in seconds", 3) as null|num
var/timeInput = input("Enter the time it takes for the pod to leave after opening, in seconds", "Delay Time", initial(temp_pod.departureDelay) * 0.1) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput))
@@ -299,31 +322,57 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
. = TRUE
////////////////////////////ADMIN SOUNDS//////////////////
if("fallingSound") //Admin sound from a local file that plays when the pod falls
if ((temp_pod.fallingSound) != initial(temp_pod.fallingSound))
temp_pod.fallingSound = initial(temp_pod.fallingSound)
temp_pod.fallingSoundLength = initial(temp_pod.fallingSoundLength)
return
var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! NOTICE: Take a note of exactly how long the sound is.", "Pick a Sound File") as null|sound
if (isnull(soundInput))
return
var/timeInput = input(holder, "What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num
if (isnull(timeInput))
return
if (!isnum(timeInput))
alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.")
temp_pod.fallingSound = soundInput
temp_pod.fallingSoundLength = 10 * timeInput
. = TRUE
if("landingSound") //Admin sound from a local file that plays when the pod lands
if (!isnull(temp_pod.landingSound))
temp_pod.landingSound = null
return
temp_pod.landingSound = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound
var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound
if (isnull(soundInput))
return
temp_pod.landingSound = soundInput
. = TRUE
if("openingSound") //Admin sound from a local file that plays when the pod opens
if (!isnull(temp_pod.openingSound))
temp_pod.openingSound = null
return
temp_pod.openingSound = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound
var/soundInput = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound
if (isnull(soundInput))
return
temp_pod.openingSound = soundInput
. = TRUE
if("leavingSound") //Admin sound from a local file that plays when the pod leaves
if (!isnull(temp_pod.leavingSound))
temp_pod.leavingSound = null
return
temp_pod.leavingSound = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound
var/soundInput = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound
if (isnull(soundInput))
return
temp_pod.leavingSound = soundInput
. = TRUE
if("soundVolume") //Admin sound from a local file that plays when the pod leaves
if (temp_pod.soundVolume != 50)
temp_pod.soundVolume = 50
if (temp_pod.soundVolume != initial(temp_pod.soundVolume))
temp_pod.soundVolume = initial(temp_pod.soundVolume)
return
temp_pod.soundVolume = input(holder, "Please pick a volume. Default is between 1 and 100 with 50 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num
if (isnull(temp_pod.soundVolume))
temp_pod.soundVolume = 50
var/soundInput = input(holder, "Please pick a volume. Default is between 1 and 100 with 80 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num
if (isnull(soundInput))
return
temp_pod.soundVolume = soundInput
. = TRUE
////////////////////////////STYLE CHANGES//////////////////
//Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines)
@@ -364,6 +413,9 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if("styleGondola")
temp_pod.setStyle(STYLE_GONDOLA)
. = TRUE
if("styleSeeThrough")
temp_pod.setStyle(STYLE_SEETHROUGH)
. = TRUE
if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod
refreshBay()
. = TRUE
@@ -403,12 +455,17 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if(left_click) //When we left click:
preLaunch() //Fill the acceptableTurfs list from the orderedArea list. Then, fill up the launchList list with items from the acceptableTurfs list based on the manner of launch (ordered, random, etc)
if (!isnull(specificTarget))
target = get_turf(specificTarget) //if we have a specific mob target, then always launch the pod at the turf of the mob
target = get_turf(specificTarget) //if we have a specific target, then always launch the pod at the turf of the target
else if (target)
target = get_turf(target) //Make sure we're aiming at a turf rather than an item or effect or something
else
return //if target is null and we don't have a specific target, cancel
if (effectAnnounce)
deadchat_broadcast("<span class='deadsay'>A special package is being launched at the station!</span>", turf_target = target)
var/list/bouttaDie = list()
for (var/mob/living/M in target)
bouttaDie.Add(M)
supplypod_punish_log(bouttaDie)
if (!effectBurst) //If we're not using burst mode, just launch normally.
launch(target)
else
@@ -422,7 +479,6 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
else
launch(target) //If we couldn't locate an adjacent turf, just launch at the normal target
sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire.
log_admin("Centcom Supplypod Launch: [key_name(user)] launched a supplypod in [AREACOORD(target)]")
/datum/centcom_podlauncher/proc/refreshBay() //Called whenever the bay is switched, as well as wheneber a pod is launched
orderedArea = createOrderedArea(bay) //Create an ordered list full of turfs form the bay
@@ -486,11 +542,11 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those
for (var/atom/movable/O in launchList)
DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod
new /obj/effect/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location
new /obj/effect/abstract/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location
else
for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList
O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod
new /obj/effect/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location
new /obj/effect/abstract/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location
if (launchClone)
launchCounter++ //We only need to increment launchCounter if we are cloning objects.
//If we aren't cloning objects, taking and removing the first item each time from the acceptableTurfs list will inherently iterate through the list in order
@@ -508,4 +564,26 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm
updateCursor(FALSE) //Make sure our moues cursor resets to default. False means we are not in launch mode
qdel(temp_pod) //Delete the temp_pod
qdel(selector) //Delete the selector effect
. = ..()
. = ..()
/datum/centcom_podlauncher/proc/supplypod_punish_log(var/list/whoDyin)
var/podString = effectBurst ? "5 pods" : "a pod"
var/whomString = ""
if (LAZYLEN(whoDyin))
for (var/mob/living/M in whoDyin)
whomString += "[key_name(M)], "
var/delayString = temp_pod.landingDelay == initial(temp_pod.landingDelay) ? "" : " Delay=[temp_pod.landingDelay*0.1]s"
var/damageString = temp_pod.damage == 0 ? "" : " Dmg=[temp_pod.damage]"
var/explosionString = ""
var/explosion_sum = temp_pod.explosionSize[1] + temp_pod.explosionSize[2] + temp_pod.explosionSize[3] + temp_pod.explosionSize[4]
if (explosion_sum != 0)
explosionString = " Boom=|"
for (var/X in temp_pod.explosionSize)
explosionString += "[X]|"
var/msg = "launched [podString][whomString].[delayString][damageString][explosionString]]"
message_admins("[key_name_admin(usr)] [msg] in [AREACOORD(specificTarget)].")
if (!isemptylist(whoDyin))
for (var/mob/living/M in whoDyin)
admin_ticket_log(M, "[key_name_admin(usr)] [msg]")

View File

@@ -183,7 +183,7 @@
LZ = pick(empty_turfs)
if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call
SSshuttle.points -= SO.pack.cost
new /obj/effect/DPtarget(LZ, podType, SO)
new /obj/effect/abstract/DPtarget(LZ, podType, SO)
. = TRUE
update_icon()
else
@@ -200,7 +200,7 @@
for(var/i in 1 to MAX_EMAG_ROCKETS)
var/LZ = pick(empty_turfs)
LAZYREMOVE(empty_turfs, LZ)
new /obj/effect/DPtarget(LZ, podType, SO)
new /obj/effect/abstract/DPtarget(LZ, podType, SO)
. = TRUE
update_icon()
CHECK_TICK

View File

@@ -39,7 +39,14 @@
set name = "Release Contents"
set category = "Gondola"
set desc = "Release any contents stored within your vast belly."
linked_pod.open(src)
linked_pod.open(src, forced = TRUE)
/mob/living/simple_animal/pet/gondola/gondolapod/examine(mob/user)
..()
if (contents.len)
to_chat(user, "<span class='notice'>It looks like it hasn't made its delivery yet.</b><span>")
else
to_chat(user, "<span class='notice'>It looks like it has already made its delivery.</b><span>")
/mob/living/simple_animal/pet/gondola/gondolapod/verb/check()
set name = "Count Contents"
@@ -47,7 +54,7 @@
set desc = "Take a deep look inside youself, and count up what's inside"
var/total = contents.len
if (total)
to_chat(src, "<span class='notice'>You detect [total] object[total > 1 ? "s" : ""] within your incredibly vast belly.</span>")
to_chat(src, "<span class='notice'>You detect [total] object\s within your incredibly vast belly.</span>")
else
to_chat(src, "<span class='notice'>A closer look inside yourself reveals... nothing.</span>")

View File

@@ -61,7 +61,7 @@
/datum/supply_pack/security/armory/dragnetgun
name = "DRAGnet gun Crate"
desc = "Contains two DRAGnet gun. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open."
desc = "Contains two DRAGnet guns. A Dynamic Rapid-Apprehension of the Guilty net the revolution in law enforcement technology that YOU Want! Requires Armory access to open."
cost = 3250
contains = list(/obj/item/gun/energy/e_gun/dragnet,
/obj/item/gun/energy/e_gun/dragnet)

View File

@@ -44,8 +44,51 @@
crate_name = "emergency crate"
crate_type = /obj/structure/closet/crate/internals
/datum/supply_pack/emergency/medicalemergency
name = "Emergency Medical Supplies" //Almost all of this can be ordered seperatly for a much cheaper price, but the HUD increases it.
desc = "Emergency supplies for a front-line medic. Contains two boxes of body bags, a medical HUD, a defib unit, medical belt, toxin bottles, epipens, and several types of medical kits."
cost = 10000
contains = list(/obj/item/storage/box/bodybags,
/obj/item/storage/box/bodybags,
/obj/item/clothing/glasses/hud/health,
/obj/item/defibrillator/loaded,
/obj/item/storage/belt/medical,
/obj/item/storage/firstaid/toxin,
/obj/item/storage/firstaid/o2,
/obj/item/storage/firstaid/brute,
/obj/item/storage/firstaid/fire,
/obj/item/reagent_containers/glass/bottle/toxin,
/obj/item/reagent_containers/glass/bottle/toxin,
/obj/item/storage/box/medipens)
crate_name = "medical emergency crate"
crate_type = /obj/structure/closet/crate/medical
/datum/supply_pack/emergency/medemergencylite
name = "Emergency Medical Supplies (Lite)"
desc = "A less than optimal, but still effective, set of tools for emergency care. Contains a box of bodybags, some normal (and advanced) health analyzers, healing sprays, a single first aid kit, charcoal, some gauze, a bottle of toxins, and some spare medipens."
cost = 2800
contains = list(/obj/item/storage/box/bodybags,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/gauze,
/obj/item/healthanalyzer,
/obj/item/healthanalyzer,
/obj/item/healthanalyzer/advanced,
/obj/item/storage/firstaid/regular,
/obj/item/reagent_containers/medspray/styptic,
/obj/item/reagent_containers/medspray/silver_sulf,
/obj/item/reagent_containers/medspray/synthflesh,
/obj/item/reagent_containers/glass/bottle/charcoal,
/obj/item/reagent_containers/glass/bottle/charcoal,
/obj/item/reagent_containers/glass/bottle/toxin,
/obj/item/reagent_containers/hypospray/medipen,
/obj/item/reagent_containers/hypospray/medipen,
/obj/item/reagent_containers/hypospray/medipen,
/obj/item/reagent_containers/hypospray/medipen)
crate_name = "medical emergency crate (lite)"
crate_type = /obj/structure/closet/crate/medical
/datum/supply_pack/emergency/radiatione_emergency
name = "Emergenc Radiation Protection Crate"
name = "Emergency Radiation Protection Crate"
desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning."
cost = 2500
contains = list(/obj/item/clothing/head/radiation,
@@ -61,7 +104,7 @@
/datum/supply_pack/emergency/rcds
name = "Emergency RCDs"
desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of Rcds to be able to easily fix up any problem you may have!"
desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of RCDs to be able to easily fix up any problem you may have!"
cost = 1500
contains = list(/obj/item/construction/rcd,
/obj/item/construction/rcd)
@@ -70,7 +113,7 @@
/datum/supply_pack/emergency/soft_suit
name = "Emergency Space Suit "
desc = "Is there bombs going off left and right? Is there meteors shooting around the station? Well we have two fragile space suit for emergencys as well as air and masks."
desc = "Are there bombs going off left and right? Are there meteors shooting around the station? Well then! Here's two fragile space suit for emergencies. Comes with air and masks."
cost = 1200
contains = list(/obj/item/tank/internals/air,
/obj/item/tank/internals/air,
@@ -137,6 +180,18 @@
/obj/item/storage/box/metalfoam)
crate_name = "metal foam grenade crate"
/datum/supply_pack/emergency/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."
cost = 2000
contains = list(/obj/item/storage/box/mre/menu1/safe,
/obj/item/storage/box/mre/menu1/safe,
/obj/item/storage/box/mre/menu2/safe,
/obj/item/storage/box/mre/menu2/safe,
/obj/item/storage/box/mre/menu3,
/obj/item/storage/box/mre/menu4/safe)
crate_name = "MRE crate (emergency rations)"
/datum/supply_pack/emergency/syndicate
name = "NULL_ENTRY"
desc = "(#@&^$THIS PACKAGE CONTAINS 30TC WORTH OF SOME RANDOM SYNDICATE GEAR WE HAD LYING AROUND THE WAREHOUSE. GIVE EM HELL, OPERATIVE@&!*() "
@@ -205,7 +260,6 @@
name = "Space Suit Crate"
desc = "Contains two aging suits from Space-Goodwill. Requires EVA access to open."
cost = 3000
access = ACCESS_EVA
contains = list(/obj/item/clothing/suit/space,
/obj/item/clothing/suit/space,
/obj/item/clothing/head/helmet/space,
@@ -254,22 +308,3 @@
crate_name = "weed control crate"
crate_type = /obj/structure/closet/crate/secure/hydroponics
/datum/supply_pack/medical/anitvirus
name = "Virus Containment Crate"
desc = "Viro let out a death plague Mk II again? Someone didnt wash there hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it brakes out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot."
cost = 3000
access = ACCESS_MEDICAL
contains = list(/mob/living/simple_animal/bot/medbot,
/obj/item/clothing/head/bio_hood,
/obj/item/clothing/head/bio_hood,
/obj/item/clothing/suit/bio_suit,
/obj/item/clothing/suit/bio_suit,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/storage/box/syringes,
/obj/item/storage/box/beakers)
crate_name = "virus containment unit crate"
crate_type = /obj/structure/closet/crate/secure/plasma

View File

@@ -56,6 +56,7 @@
name = "Engineering Hardsuit"
desc = "Poly 'Who stole all the hardsuits!' Well now you can get more hardsuits if needed! NOTE ONE HARDSUIT IS IN THIS CRATE, as well as one air tank and mask!"
cost = 2250
access = ACCESS_ENGINE
contains = list(/obj/item/tank/internals/air,
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/space/hardsuit/engine)
@@ -65,7 +66,7 @@
name = "Atmospherics Hardsuit"
desc = "Too many techs and not enough hardsuits? Time to buy some more! Comes with gas mask and air tank. Ask the CE to open."
cost = 5000
access = ACCESS_CE
access = ACCESS_CE //100% Fire and Bio resistance
contains = list(/obj/item/tank/internals/air,
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/space/hardsuit/engine/atmos)
@@ -74,7 +75,7 @@
/datum/supply_pack/engineering/industrialrcd
name = "Industrial RCD"
desc = "A industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Dose not contain spare ammo for the industrial RCD or any other RCD modles."
desc = "An industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Does not contain spare ammo for the industrial RCD or any other RCD models."
cost = 4500
access = ACCESS_CE
contains = list(/obj/item/construction/rcd/industrial)
@@ -91,15 +92,11 @@
crate_name = "insulated gloves crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
/obj/item/stock_parts/cell/inducer_supply
maxcharge = 5000
charge = 5000
/datum/supply_pack/engineering/inducers
name = "NT-75 Electromagnetic Power Inducers Crate"
desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers."
cost = 2300
contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently.
contains = list(/obj/item/inducer/sci/supply, /obj/item/inducer/sci/supply)
crate_name = "inducer crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
@@ -121,18 +118,6 @@
crate_name = "power cell crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
/datum/supply_pack/engineering/siezedpower
name = "Siezed Power Cell Crate"
desc = "We took the means of power! Contains three high-voltage plus power cells."
cost = 1300
contraband = TRUE
contains = list(/obj/item/stock_parts/cell/high/plus,
/obj/item/stock_parts/cell/high/plus,
/obj/item/stock_parts/cell/high/plus)
crate_name = "siezed crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
/datum/supply_pack/engineering/shuttle_engine
name = "Shuttle Engine Crate"
desc = "Through advanced bluespace-shenanigans, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open."
@@ -142,22 +127,6 @@
crate_name = "shuttle engine crate"
crate_type = /obj/structure/closet/crate/secure/engineering
/datum/supply_pack/engineering/siezedproduction
name = "The Means of Production"
desc = "We will win for we have took over the production! S five metal sheets, five wire, three matter bins, one manipulater and one sheet of glass."
cost = 1500
contraband = TRUE
contains = list(/obj/item/stock_parts/cell/high/plus,
/obj/item/circuitboard/machine/autolathe,
/obj/item/stack/cable_coil/random/five,
/obj/item/stack/sheet/metal/five,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/manipulator,
/obj/item/stack/sheet/glass,)
crate_name = "siezed crate"
/datum/supply_pack/engineering/tools
name = "Toolbox Crate"
desc = "Any robust spaceman is never far from their trusty toolbox. Contains three electrical toolboxes and three mechanical toolboxes."
@@ -184,7 +153,7 @@
/datum/supply_pack/engineering/dna_vault
name = "DNA Vault Parts"
desc = "Secure the longevity of the current state of humanity within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes."
desc = "Secure the longevity of the current state of civilization within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." //C'mon now, it's nae just humans on the station these days
cost = 12000
special = TRUE
contains = list(

View File

@@ -58,7 +58,7 @@
name = "Chicken Crate"
desc = "The chicken goes bwaak!"
cost = 2000
contains = list( /mob/living/simple_animal/chick)
contains = list(/mob/living/simple_animal/chick)
crate_name = "chicken crate"
/datum/supply_pack/critter/crab
@@ -135,7 +135,7 @@
/obj/item/clothing/neck/petcollar)
crate_name = "pug crate"
/datum/supply_pack/organic/critter/kiwi
/datum/supply_pack/critter/kiwi
name = "Space kiwi Crate"
cost = 2000
contains = list( /mob/living/simple_animal/kiwi)
@@ -150,6 +150,18 @@
/mob/living/simple_animal/hostile/retaliate/poison/snake)
crate_name = "snake crate"
/datum/supply_pack/critter/mouse
name = "Mouse Crate"
desc = "Good for snakes and lizards of all ages. Contains ~12 feeder mice."
cost = 2000
contains = list(/mob/living/simple_animal/mouse,)
crate_name = "mouse crate"
/datum/supply_pack/critter/mouse/generate()
. = ..()
for(var/i in 1 to 11)
new /mob/living/simple_animal/mouse(.)
/datum/supply_pack/critter/secbat
name = "Security Bat Crate"
desc = "Contains five security bats, perfect to Bat-up any security officer."

View File

@@ -9,6 +9,10 @@
/datum/supply_pack/materials
group = "Canisters & Materials"
//////////////////////////////////////////////////////////////////////////////
///////////////////////////// Materials //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/materials/cardboard50
name = "50 Cardboard Sheets"
desc = "Create a bunch of boxes."
@@ -58,6 +62,13 @@
contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty)
crate_name = "sandstone blocks crate"
/datum/supply_pack/materials/rawlumber
name = "50 Towercap Logs"
desc = "Raw logs from towercaps. Contains fifty logs."
cost = 1000
contains = list(/obj/item/grown/log)
crate_name = "lumber crate"
/datum/supply_pack/materials/wood50
name = "50 Wood Planks"
desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!"
@@ -65,22 +76,31 @@
contains = list(/obj/item/stack/sheet/mineral/wood/fifty)
crate_name = "wood planks crate"
/datum/supply_pack/organic/rawcotton
/datum/supply_pack/materials/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
cost = 800 // 100 net cost, 20 x 20 = 400. 300 profit 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/materials/rawcottonbulk
name = "Raw Cotton Crate (Bulk)"
desc = "We have so much of this stuff we need to get rid of it in -bulk- now. This crate contains 240 raw cotton sheets."
cost = 1300 // 100 net cost (per 40 cotton) , 20 x 20 = 400. 300 profit 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/thirty,
/obj/item/stack/sheet/cotton/thirty,
/obj/item/stack/sheet/cotton/thirty,
/obj/item/stack/sheet/cotton/thirty,
/obj/item/stack/sheet/cotton/thirty,
/obj/item/stack/sheet/cotton/thirty,
/obj/item/stack/sheet/cotton/thirty,
)
crate_name = "bulk cotton crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/critter/animal_feed/generate()
. = ..()
@@ -89,7 +109,7 @@
/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."
desc = "This crate contains sixteen RCD compressed matter packs, to help with any holes or projects people might be working on."
cost = 3750
contains = list(/obj/item/rcd_ammo,
/obj/item/rcd_ammo,
@@ -109,6 +129,18 @@
/obj/item/rcd_ammo)
crate_name = "rcd ammo"
/datum/supply_pack/materials/loom
name = "Loom"
desc = "A large pre-made loom."
cost = 1000
contains = list(/obj/structure/loom/unanchored)
crate_name = "loom crate"
crate_type = /obj/structure/closet/crate/large
//////////////////////////////////////////////////////////////////////////////
///////////////////////////// Canisters //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/materials/bz
name = "BZ Canister Crate"
desc = "Contains a canister of BZ. Requires Toxins access to open."
@@ -159,6 +191,10 @@
crate_name = "water vapor canister crate"
crate_type = /obj/structure/closet/crate/large
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Tanks ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/materials/fueltank
name = "Fuel Tank Crate"
desc = "Contains a welding fuel tank. Caution, highly flammable."
@@ -191,18 +227,4 @@
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

View File

@@ -10,6 +10,16 @@
group = "Medical"
crate_type = /obj/structure/closet/crate/medical
/datum/supply_pack/medical/bodybags
name = "Bodybags"
desc = "For when the bodies hit the floor. Contains 4 boxes of bodybags."
cost = 1200
contains = list(/obj/item/storage/box/bodybags,
/obj/item/storage/box/bodybags,
/obj/item/storage/box/bodybags,
/obj/item/storage/box/bodybags,)
crate_name = "bodybag crate"
/datum/supply_pack/medical/firstaidbruises
name = "Bruise Treatment Kit Crate"
desc = "Contains three first aid kits focused on healing bruises and broken bones."
@@ -30,9 +40,10 @@
/datum/supply_pack/medical/bloodpacks
name = "Blood Pack Variety Crate"
desc = "Contains ten different blood packs for reintroducing blood to patients."
desc = "Contains nine different blood packs for reintroducing blood to patients, plus two universal synthetic blood packs."
cost = 3000
contains = list(/obj/item/reagent_containers/blood/random,
contains = list(/obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/random,
/obj/item/reagent_containers/blood/APlus,
/obj/item/reagent_containers/blood/AMinus,
@@ -46,18 +57,6 @@
crate_name = "blood freezer"
crate_type = /obj/structure/closet/crate/freezer
/datum/supply_pack/medical/bloodpackssynth
name = "Synthetics Blood Pack Crate"
desc = "Contains five synthetics blood packs for reintroducing blood to patients."
cost = 3000
contains = list(/obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/synthetics)
crate_name = "blood freezer"
crate_type = /obj/structure/closet/crate/freezer
/datum/supply_pack/medical/defibs
name = "Defibrillator Crate"
desc = "Contains two defibrillators for bringing the recently deceased back to life."
@@ -85,7 +84,7 @@
/datum/supply_pack/science/adv_surgery_tools
name = "Med-Co Advanced surgery tools"
desc = "A full set of Med-Co advanced surgery tools, this crate also comes with a spay of synth flesh as well as a can of . Requires Surgery access to open."
desc = "A full set of Med-Co advanced surgery tools! In addition to that it contains both a can of synthflesh and a can of sterilizine. Requires Surgery access to open."
cost = 5500
access = ACCESS_SURGERY
contains = list(/obj/item/storage/belt/medical/surgery_belt_adv,
@@ -96,8 +95,9 @@
/datum/supply_pack/medical/medicalhardsuit
name = "Medical Hardsuit"
desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers."
desc = "Got people being spaced left and right? Hole in the same room as the dead body of Hos or cap? Fear not, now you can buy one medical hardsuit with a mask and air tank to save your fellow crewmembers. Requires medical access to open."
cost = 2750
access = ACCESS_MEDICAL
contains = list(/obj/item/tank/internals/air,
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/space/hardsuit/medical)
@@ -174,7 +174,7 @@
/datum/supply_pack/medical/advrad
name = "Radiation Treatment Crate Deluxe"
desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pill bottle, as well as a radiation treatment deluxe pill bottle!"
desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pills, as well as a radiation treatment deluxe pill bottle!"
cost = 3500
contains = list(/obj/item/storage/pill_bottle/antirad_plus,
/obj/item/storage/pill_bottle/mutarad,
@@ -226,3 +226,23 @@
crate_name = "virus crate"
crate_type = /obj/structure/closet/crate/secure/plasma
dangerous = TRUE
/datum/supply_pack/medical/anitvirus
name = "Virus Containment Crate"
desc = "Viro let out a death plague Mk II again? Someone didnt wash their hands? Old plagues born anew? Well this crate is for you! Hope you cure it before it breaks out of the station... This crate needs medical access to open and has two bio suits, a box of needles and beakers, five spaceacillin needles, and a medibot."
cost = 3000
access = ACCESS_MEDICAL
contains = list(/mob/living/simple_animal/bot/medbot,
/obj/item/clothing/head/bio_hood,
/obj/item/clothing/head/bio_hood,
/obj/item/clothing/suit/bio_suit,
/obj/item/clothing/suit/bio_suit,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/reagent_containers/syringe/antiviral,
/obj/item/storage/box/syringes,
/obj/item/storage/box/beakers)
crate_name = "virus containment unit crate"
crate_type = /obj/structure/closet/crate/secure/plasma

View File

@@ -9,6 +9,21 @@
/datum/supply_pack/misc
group = "Miscellaneous Supplies"
//////////////////////////////////////////////////////////////////////////////
//////////////////// Paperwork and Writing Supplies //////////////////////////
//////////////////////////////////////////////////////////////////////////////
/* I did it Kevin
/datum/supply_pack/misc/abandonedcrate
name = "Abandoned Crate"
desc = "Someone keeps finding these locked crates out in the boonies. How about you take a crack at it, we've had our fill. WARNING: EXPLOSIVE"
contraband = TRUE
cost = 12800
contains = list(/obj/structure/closet/crate/secure/loot)
crate_name = "abandoned crate"
crate_type = /obj/structure/closet/crate/large
dangerous = TRUE
*/
/datum/supply_pack/misc/artsupply
name = "Art Supplies"
desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!"
@@ -29,39 +44,6 @@
crate_name = "art supply crate"
crate_type = /obj/structure/closet/crate/wooden
/datum/supply_pack/misc/captain_pen
name = "Captain Pen"
desc = "A spare Captain fountain pen."
access = ACCESS_CAPTAIN
cost = 10000
contains = list(/obj/item/pen/fountain/captain)
crate_name = "captain pen"
crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen
/datum/supply_pack/misc/bicycle
name = "Bicycle"
desc = "Nanotrasen reminds all employees to never toy with powers outside their control."
cost = 1000000
contains = list(/obj/vehicle/ridden/bicycle)
crate_name = "Bicycle Crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/misc/bigband
name = "Big Band Instrument Collection"
desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!"
cost = 5000
crate_name = "Big band musical instruments collection"
contains = list(/obj/item/instrument/violin,
/obj/item/instrument/guitar,
/obj/item/instrument/glockenspiel,
/obj/item/instrument/accordion,
/obj/item/instrument/saxophone,
/obj/item/instrument/trombone,
/obj/item/instrument/recorder,
/obj/item/instrument/harmonica,
/obj/structure/piano/unanchored)
crate_type = /obj/structure/closet/crate/wooden
/datum/supply_pack/misc/book_crate
name = "Book Crate"
desc = "Surplus from the Nanotrasen Archives, these five books are sure to be good reads."
@@ -98,6 +80,15 @@
/obj/item/storage/briefcase)
crate_name = "bureaucracy crate"
/datum/supply_pack/misc/captain_pen
name = "Captain Pen"
desc = "A spare Captain fountain pen."
access = ACCESS_CAPTAIN
cost = 10000
contains = list(/obj/item/pen/fountain/captain)
crate_name = "captain pen"
crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen
/datum/supply_pack/misc/fountainpens
name = "Calligraphy Crate"
desc = "Sign death warrants in style with these seven executive fountain pens."
@@ -107,14 +98,6 @@
crate_type = /obj/structure/closet/crate/wooden
crate_name = "calligraphy crate"
/datum/supply_pack/misc/wrapping_paper
name = "Festive Wrapping Paper Crate"
desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, the Clown's severed head? You can do all that, with this crate full of wrapping paper."
cost = 1000
contains = list(/obj/item/stack/wrapping_paper)
crate_type = /obj/structure/closet/crate/wooden
crate_name = "festive wrapping paper crate"
/datum/supply_pack/misc/paper_work
name = "Freelance Paper work"
desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (20) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up.
@@ -143,16 +126,134 @@
)
crate_name = "Paperwork"
/datum/supply_pack/misc/funeral
name = "Funeral Supply crate"
desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers."
cost = 800
contains = list(/obj/item/clothing/under/burial,
/obj/item/reagent_containers/food/snacks/grown/harebell,
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium
)
crate_name = "coffin"
crate_type = /obj/structure/closet/crate/coffin
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////// Entertainment ///////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/misc/randombedsheets
name = "Bedsheet Crate (R)"
desc = "Snuggle up in some sweet sheets with this assorted bedsheet crate. Each set comes with eight random bedsheets for your slumbering pleasure!"
cost = 2000
contains = list(/obj/item/bedsheet/random,
/obj/item/bedsheet/random,
/obj/item/bedsheet/random,
/obj/item/bedsheet/random,
/obj/item/bedsheet/random,
/obj/item/bedsheet/random,
/obj/item/bedsheet/random,
/obj/item/bedsheet/random) //I'm lazy, and I copy paste stuff.
crate_name = "random bedsheet crate"
/datum/supply_pack/misc/coloredsheets
name = "Bedsheet Crate (C)"
desc = "Give your night life a splash of color with this crate filled with bedsheets! Contains a total of nine different-colored sheets."
cost = 1250
contains = list(/obj/item/bedsheet/blue,
/obj/item/bedsheet/green,
/obj/item/bedsheet/orange,
/obj/item/bedsheet/purple,
/obj/item/bedsheet/red,
/obj/item/bedsheet/yellow,
/obj/item/bedsheet/brown,
/obj/item/bedsheet/black,
/obj/item/bedsheet/rainbow)
crate_name = "colored bedsheet crate"
/datum/supply_pack/misc/bicycle
name = "Bicycle"
desc = "Nanotrasen reminds all employees to never toy with powers outside their control."
cost = 1000000
contains = list(/obj/vehicle/ridden/bicycle)
crate_name = "Bicycle Crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/misc/bigband
name = "Big Band Instrument Collection"
desc = "Get your sad station movin' and groovin' with this fine collection! Contains nine different instruments!"
cost = 5000
crate_name = "Big band musical instruments collection"
contains = list(/obj/item/instrument/violin,
/obj/item/instrument/guitar,
/obj/item/instrument/glockenspiel,
/obj/item/instrument/accordion,
/obj/item/instrument/saxophone,
/obj/item/instrument/trombone,
/obj/item/instrument/recorder,
/obj/item/instrument/harmonica,
/obj/structure/piano/unanchored)
crate_type = /obj/structure/closet/crate/wooden
/datum/supply_pack/misc/cbtpack
name = "CBT Equipment"
desc = "(*!&@#CBT is a special term coined by high ranking syndicate operatives for a special form of information extraction. While the training required to use this shipment is highly classified, the distribution of it's contents are not. In addition to this crates unusual contents, we have added a bar of soap.#@*$"
hidden = TRUE
cost = 2400
contains = list(/mob/living/simple_animal/chicken,
/obj/item/toy/beach_ball/holoball,
/obj/item/melee/baton/cattleprod,
/obj/item/soap/syndie)
crate_name = "cbt crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/misc/casinocrate
name = "Casino Crate"
desc = "Start up your own grand casino with this crate filled with slot machine and arcade boards!"
cost = 3000
contains = list(/obj/item/circuitboard/computer/arcade/battle,
/obj/item/circuitboard/computer/arcade/battle,
/obj/item/circuitboard/computer/arcade/orion_trail,
/obj/item/circuitboard/computer/arcade/orion_trail,
/obj/item/circuitboard/computer/arcade/minesweeper,
/obj/item/circuitboard/computer/arcade/minesweeper,
/obj/item/circuitboard/computer/slot_machine,
/obj/item/circuitboard/computer/slot_machine,
/obj/item/circuitboard/computer/slot_machine,
/obj/item/circuitboard/computer/slot_machine,
/obj/item/circuitboard/computer/slot_machine,
/obj/item/circuitboard/computer/slot_machine)
crate_name = "casino crate"
/datum/supply_pack/misc/coincrate
name = "Coin Crate"
desc = "Psssst, hey, you. Yes, you. I've heard that coins can do some special things on your station, give you access to some pretty cool stuff. Here's the deal, you give me some credits, and I give so some coins. Sound like a deal? I'll give you 10 for 10000 creds."
contraband = TRUE
cost = 10000
contains = list(/obj/item/coin/silver)
crate_name = "coin crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/misc/coincrate/generate()
. = ..()
for(var/i in 1 to 9)
new /obj/item/coin/silver(.)
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////// Misc Supplies ///////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/misc/exoticfootwear
name = "Exotic Footwear Crate"
desc = "Popularised by lizards and exotic dancers, the footwear included in this shipment is sure to give your feet the breathing room they deserve. Sweet Kicks Inc. is not responsible for any damage, distress, or @r0u$a1 caused by this shipment."
cost = 4337
contains = list(/obj/item/clothing/shoes/wraps,
/obj/item/clothing/shoes/wraps,
/obj/item/clothing/shoes/wraps/silver,
/obj/item/clothing/shoes/wraps/silver,
/obj/item/clothing/shoes/wraps/red,
/obj/item/clothing/shoes/wraps/red,
/obj/item/clothing/shoes/wraps/blue,
/obj/item/clothing/shoes/wraps/blue,
/obj/item/clothing/shoes/clown_shoes,
/obj/item/clothing/shoes/kindleKicks)
crate_name = "footie crate"
/datum/supply_pack/misc/wrapping_paper
name = "Festive Wrapping Paper Crate"
desc = "Want to mail your loved ones gift-wrapped chocolates, stuffed animals, or the Clown's severed head? You can do all that, with this crate full of wrapping paper."
cost = 1000
contains = list(/obj/item/stack/wrapping_paper)
crate_type = /obj/structure/closet/crate/wooden
crate_name = "festive wrapping paper crate"
/datum/supply_pack/misc/jukebox
name = "Jukebox"
@@ -160,9 +261,147 @@
contains = list(/obj/machinery/jukebox)
crate_name = "Jukebox"
/datum/supply_pack/misc/potted_plants
name = "Potted Plants Crate"
desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown."
cost = 730
contains = list(/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random)
crate_name = "potted plants crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/misc/religious_supplies
name = "Religious Supplies Crate"
desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
cost = 4000 // it costs so much because the Space Church is ran by Space Jews
contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
/obj/item/reagent_containers/food/drinks/bottle/holywater,
/obj/item/storage/book/bible/booze,
/obj/item/storage/book/bible/booze,
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/suit/hooded/chaplain_hoodie
)
crate_name = "religious supplies crate"
/datum/supply_pack/misc/funeral
name = "Funeral Supplies"
desc = "Mourn your dead properly buy sending them off with love filled notes, clean clothes, and a proper ceremony. Contains two candle packs, funeral garb, flowers, a paperbin , and crayons to help aid in religious rituals. Coffin included."
cost = 1200
contains = list(/obj/item/clothing/under/burial,
/obj/item/storage/fancy/candle_box,
/obj/item/storage/fancy/candle_box,
/obj/item/reagent_containers/food/snacks/grown/harebell,
/obj/item/reagent_containers/food/snacks/grown/harebell,
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium,
/obj/item/reagent_containers/food/snacks/grown/poppy/lily,
/obj/item/reagent_containers/food/snacks/grown/poppy/lily,
/obj/item/storage/crayons,
/obj/item/paper_bin
)
crate_name = "coffin"
crate_type = /obj/structure/closet/crate/coffin
/datum/supply_pack/misc/shower
name = "Shower Supplies"
desc = "Everyone needs a bit of R&R. Make sure you get can get yours by ordering this crate filled with towels, rubber duckies, and some soap!"
cost = 1000
contains = list(/obj/item/reagent_containers/rag/towel,
/obj/item/reagent_containers/rag/towel,
/obj/item/reagent_containers/rag/towel,
/obj/item/reagent_containers/rag/towel,
/obj/item/reagent_containers/rag/towel,
/obj/item/reagent_containers/rag/towel,
/obj/item/bikehorn/rubberducky,
/obj/item/bikehorn/rubberducky,
/obj/item/soap/nanotrasen)
crate_name = "shower crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Misc + Decor ////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/misc/carpet_exotic
name = "Exotic Carpet Crate"
desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
cost = 7000
contains = list(/obj/item/stack/tile/carpet/blue/fifty,
/obj/item/stack/tile/carpet/blue/fifty,
/obj/item/stack/tile/carpet/cyan/fifty,
/obj/item/stack/tile/carpet/cyan/fifty,
/obj/item/stack/tile/carpet/green/fifty,
/obj/item/stack/tile/carpet/green/fifty,
/obj/item/stack/tile/carpet/orange/fifty,
/obj/item/stack/tile/carpet/orange/fifty,
/obj/item/stack/tile/carpet/purple/fifty,
/obj/item/stack/tile/carpet/purple/fifty,
/obj/item/stack/tile/carpet/red/fifty,
/obj/item/stack/tile/carpet/red/fifty,
/obj/item/stack/tile/carpet/royalblue/fifty,
/obj/item/stack/tile/carpet/royalblue/fifty,
/obj/item/stack/tile/carpet/royalblack/fifty,
/obj/item/stack/tile/carpet/royalblack/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty)
crate_name = "exotic carpet crate"
/datum/supply_pack/misc/carpet
name = "Premium Carpet Crate"
desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains some classic carpet, along with black, red, and monochrome varients."
cost = 1350
contains = list(/obj/item/stack/tile/carpet/fifty,
/obj/item/stack/tile/carpet/fifty,
/obj/item/stack/tile/carpet/black/fifty,
/obj/item/stack/tile/carpet/black/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty)
crate_name = "premium carpet crate"
/datum/supply_pack/misc/party
name = "Party Equipment"
desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, a drinking shaker, and a bottle of patron & goldschlager!"
cost = 2000
contains = list(/obj/item/storage/box/drinkingglasses,
/obj/item/reagent_containers/food/drinks/shaker,
/obj/item/reagent_containers/food/drinks/bottle/patron,
/obj/item/reagent_containers/food/drinks/bottle/goldschlager,
/obj/item/reagent_containers/food/drinks/ale,
/obj/item/reagent_containers/food/drinks/ale,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/flashlight/glowstick,
/obj/item/flashlight/glowstick/red,
/obj/item/flashlight/glowstick/blue,
/obj/item/flashlight/glowstick/cyan,
/obj/item/flashlight/glowstick/orange,
/obj/item/flashlight/glowstick/yellow,
/obj/item/flashlight/glowstick/pink)
crate_name = "party equipment crate"
/datum/supply_pack/misc/noslipfloor
name = "High-traction Floor Tiles"
desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!"
cost = 2000
contains = list(/obj/item/stack/tile/noslip/thirty,
/obj/item/stack/tile/noslip/thirty)
crate_name = "high-traction floor tiles crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////// Lewd Supplies ///////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/misc/lewd
name = "Lewd Crate" // OwO
desc = "Psss want to have a good time with your sluts? Well I got what you want maid clothing, dildos, collars and more!"
desc = "Pssst, want to have a good time with your sluts? Well I got what you want! Maid clothing, dildos, collars and more!"
cost = 5250
contraband = TRUE
contains = list(/obj/item/dildo/custom,
@@ -191,40 +430,4 @@
crate_name = "deluxe keg"
crate_type = /obj/structure/closet/crate
/datum/supply_pack/misc/religious_supplies
name = "Religious Supplies Crate"
desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
cost = 4000 // it costs so much because the Space Church is ran by Space Jews
contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
/obj/item/reagent_containers/food/drinks/bottle/holywater,
/obj/item/storage/book/bible/booze,
/obj/item/storage/book/bible/booze,
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/suit/hooded/chaplain_hoodie
)
crate_name = "religious supplies crate"
/datum/supply_pack/misc/randomised/promiscuous
name = "Promiscuous Organs"
desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick."
cost = 4000 //Only get 2!
contraband = TRUE
var/num_contained = 2
contains = list(/obj/item/autosurgeon/penis,
/obj/item/autosurgeon/testicles,
/obj/item/autosurgeon/vagina,
/obj/item/autosurgeon/breasts,
/obj/item/autosurgeon/womb)
crate_name = "promiscuous organs"
/datum/supply_pack/misc/toner
name = "Toner Crate"
desc = "Spent too much ink printing butt pictures? Fret not, with these six toner refills, you'll be printing butts 'till the cows come home!'"
cost = 1000
contains = list(/obj/item/toner,
/obj/item/toner,
/obj/item/toner,
/obj/item/toner,
/obj/item/toner,
/obj/item/toner)
crate_name = "toner crate"

View File

@@ -10,35 +10,13 @@
group = "Food & Hydroponics"
crate_type = /obj/structure/closet/crate/freezer
/datum/supply_pack/organic/hydroponics/beekeeping_suits
name = "Beekeeper Suit Crate"
desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear."
cost = 1300
contains = list(/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit)
crate_name = "beekeeper suits"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/hydroponics/beekeeping_fullkit
name = "Beekeeping Starter Crate"
desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!"
cost = 1800
contains = list(/obj/structure/beebox/unwrenched,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/queen_bee/bought,
/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
/obj/item/melee/flyswatter)
crate_name = "beekeeping starter crate"
crate_type = /obj/structure/closet/crate/hydroponics
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Food /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/organic/candy/randomised
name = "Candy Crate"
desc = "For people that have a insatiable sweet tooth! Has ten candies to be eaten up.."
desc = "For people that have an insatiable sweet tooth! Has ten candies to be eaten up.."
cost = 2500
var/num_contained = 10 //number of items picked to be contained in a randomised crate
contains = list(/obj/item/reagent_containers/food/snacks/candy,
@@ -69,28 +47,9 @@
/obj/item/storage/fancy/donut_box)
crate_name = "candy crate"
/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"
desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, a enzyme and sugar bottle, and three slabs of monkeymeat."
desc = "Get things cooking with this crate full of useful ingredients! Contains a two dozen eggs, three bananas, and two bags of flour and rice, two cartons of milk, soymilk, as well as salt and pepper shakers, an enzyme and sugar bottle, and three slabs of monkeymeat."
cost = 1000
contains = list(/obj/item/reagent_containers/food/condiment/flour,
/obj/item/reagent_containers/food/condiment/flour,
@@ -113,6 +72,24 @@
/obj/item/reagent_containers/food/snacks/grown/banana)
crate_name = "food crate"
/datum/supply_pack/organic/fiestatortilla
name = "Fiesta Crate"
desc = "Spice up the kitchen with this fiesta themed food order! Contains 8 tortilla based food items, as well as a sombrero, moustache, and cloak!"
cost = 2750
contains = list(/obj/item/clothing/head/sombrero,
/obj/item/clothing/suit/hooded/cloak/david,
/obj/item/clothing/mask/fakemoustache,
/obj/item/reagent_containers/food/snacks/taco,
/obj/item/reagent_containers/food/snacks/taco,
/obj/item/reagent_containers/food/snacks/taco/plain,
/obj/item/reagent_containers/food/snacks/taco/plain,
/obj/item/reagent_containers/food/snacks/enchiladas,
/obj/item/reagent_containers/food/snacks/enchiladas,
/obj/item/reagent_containers/food/snacks/carneburrito,
/obj/item/reagent_containers/food/snacks/cheesyburrito,
/obj/item/reagent_containers/glass/bottle/capsaicin,
/obj/item/reagent_containers/glass/bottle/capsaicin)
crate_name = "fiesta crate"
/datum/supply_pack/organic/fruit_1
name = "Fruit Basic Crate"
@@ -140,7 +117,7 @@
/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."
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, peaches, and lastly seven strawberry. Includes one serving tray."
cost = 3500
contains = list(/obj/item/reagent_containers/food/snacks/grown/berries,
/obj/item/reagent_containers/food/snacks/grown/berries,
@@ -166,6 +143,9 @@
/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/peach,
/obj/item/reagent_containers/food/snacks/grown/peach,
/obj/item/reagent_containers/food/snacks/grown/peach,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
/obj/item/reagent_containers/food/snacks/grown/strawberry,
@@ -173,9 +153,7 @@
/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/storage/bag/tray)
crate_name = "fruit crate"
/datum/supply_pack/organic/cream_piee
@@ -188,84 +166,51 @@
access = ACCESS_THEATRE
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/organic/hunting
name = "Huntting gear"
desc = "Even in space, we can fine prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a huntting shotgun. "
cost = 3500
/datum/supply_pack/organic/fakemeat
name = "Meat Crate"
desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 12 slabs of meat product, and 4 slabs of *carp*."
cost = 1200 // Buying 3 food crates nets you 9 meat for 900 points, plus like, 6 bags of rice, flour, and egg boxes. This is 12 for 500, but you -only- get meat and carp.
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
/obj/item/reagent_containers/food/snacks/carpmeat/imitation)
crate_name = "meaty crate"
crate_type = /obj/structure/closet/crate/freezer
/datum/supply_pack/organic/monkeydripmeat
name = "*Meat* Crate"
desc = "Need some meat? With this do-it-yourself kit you'll be swimming in it! Contains a monkey cube, an IV drip, and some cryoxadone!"
cost = 2150
contraband = TRUE
contains = list(/obj/item/clothing/head/flatcap,
/obj/item/clothing/suit/hooded/wintercoat/captain,
/obj/item/reagent_containers/food/drinks/bottle/cognac,
/obj/item/storage/fancy/cigarettes/cigars/havana,
/obj/item/clothing/gloves/color/white,
/obj/item/clothing/under/rank/curator,
/obj/item/gun/ballistic/shotgun/lethal)
access = ACCESS_ARMORY
crate_name = "sporting crate"
crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:(
contains = list(/obj/item/reagent_containers/food/snacks/monkeycube,
/obj/item/restraints/handcuffs/cable,
/obj/machinery/iv_drip,
/obj/item/reagent_containers/glass/beaker/cryoxadone,
/obj/item/reagent_containers/glass/beaker/cryoxadone)
crate_name = "monkey meat crate"
/datum/supply_pack/organic/hydroponics
name = "Hydroponics Crate"
desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
cost = 1750
contains = list(/obj/item/reagent_containers/spray/plantbgone,
/obj/item/reagent_containers/spray/plantbgone,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/hatchet,
/obj/item/cultivator,
/obj/item/plant_analyzer,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/suit/apron)
crate_name = "hydroponics crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/hydroponics/hydrotank
name = "Hydroponics Backpack Crate"
desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open."
cost = 1200
access = ACCESS_HYDROPONICS
contains = list(/obj/item/watertank)
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."
cost = 2000
contains = list(/obj/item/storage/box/mre/menu1/safe,
/obj/item/storage/box/mre/menu1/safe,
/obj/item/storage/box/mre/menu2/safe,
/obj/item/storage/box/mre/menu2/safe,
/obj/item/storage/box/mre/menu3,
/obj/item/storage/box/mre/menu4/safe)
crate_name = "MRE crate (emergency rations)"
/datum/supply_pack/organic/mixedboxes
name = "Mixed Ingredient Boxes"
desc = "Get overwhelmed with inspiration by ordering these boxes of surprise ingredients! Get four boxes filled with an assortment of products!"
cost = 2300
contains = list(/obj/item/storage/box/ingredients/wildcard,
/obj/item/storage/box/ingredients/wildcard,
/obj/item/storage/box/ingredients/wildcard,
/obj/item/storage/box/ingredients/wildcard)
crate_name = "wildcard food crate"
crate_type = /obj/structure/closet/crate/freezer
/datum/supply_pack/organic/pizza
name = "Pizza Crate"
@@ -301,16 +246,105 @@
considered <b>\[REDACTED\]</b> and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \
of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.")
/datum/supply_pack/organic/potted_plants
name = "Potted Plants Crate"
desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown."
cost = 730
contains = list(/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random,
/obj/item/twohanded/required/kirbyplants/random)
crate_name = "potted plants crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Hydroponics /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/organic/hydroponics/beekeeping_suits
name = "Beekeeper Suit Crate"
desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear."
cost = 1300
contains = list(/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit)
crate_name = "beekeeper suits"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/hydroponics/beekeeping_fullkit
name = "Beekeeping Starter Crate"
desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit & helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!"
cost = 1800
contains = list(/obj/structure/beebox/unwrenched,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/queen_bee/bought,
/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
/obj/item/melee/flyswatter)
crate_name = "beekeeping starter crate"
crate_type = /obj/structure/closet/crate/hydroponics
/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
/* Maintenance Garden Crate basically does this and more.
/datum/supply_pack/organic/hydroponics
name = "Hydroponics Crate"
desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
cost = 1750
contains = list(/obj/item/reagent_containers/spray/plantbgone,
/obj/item/reagent_containers/spray/plantbgone,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/hatchet,
/obj/item/cultivator,
/obj/item/plant_analyzer,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/suit/apron)
crate_name = "hydroponics crate"
crate_type = /obj/structure/closet/crate/hydroponics
*/
/datum/supply_pack/organic/hydroponics/hydrotank
name = "Hydroponics Backpack Crate"
desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O. Requires hydroponics access to open."
cost = 1200
access = ACCESS_HYDROPONICS
contains = list(/obj/item/watertank)
crate_name = "hydroponics backpack crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/organic/hydroponics/maintgarden
name = "Maintenance Garden Crate"
desc = "Set up your own tiny paradise with do-it-yourself botany kit. Contains sandstone for dirt plots, pest spray, ammonia, a portable seed generator, basic botanical tools, and some seeds to start off with."
cost = 2700
contains = list(/obj/item/storage/bag/plants/portaseeder,
/obj/item/reagent_containers/spray/pestspray,
/obj/item/stack/sheet/mineral/sandstone/twelve,
/obj/item/reagent_containers/glass/bucket,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/hatchet,
/obj/item/cultivator,
/obj/item/plant_analyzer,
/obj/item/flashlight,
/obj/item/seeds/carrot,
/obj/item/seeds/carrot,
/obj/item/seeds/tower,
/obj/item/seeds/tower,
/obj/item/seeds/watermelon,
/obj/item/seeds/watermelon,
/obj/item/seeds/grass,
/obj/item/seeds/grass)
crate_name = "maint garden crate"
crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/seeds
@@ -333,9 +367,29 @@
crate_name = "seeds crate"
crate_type = /obj/structure/closet/crate/hydroponics
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// Misc /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/organic/hunting
name = "Hunting Gear"
desc = "Even in space, we can find prey to hunt, this crate contains everthing a fine hunter needs to have a sporting time. This crate needs armory access to open. A true huntter only needs a fine bottle of cognac, a nice coat, some good o' cigars, and of cource a hunting shotgun. "
cost = 3500
contraband = TRUE
contains = list(/obj/item/clothing/head/flatcap,
/obj/item/clothing/suit/hooded/wintercoat/captain,
/obj/item/reagent_containers/food/drinks/bottle/cognac,
/obj/item/storage/fancy/cigarettes/cigars/havana,
/obj/item/clothing/gloves/color/white,
/obj/item/clothing/under/rank/curator,
/obj/item/gun/ballistic/shotgun/lethal)
access = ACCESS_ARMORY
crate_name = "sporting crate"
crate_type = /obj/structure/closet/crate/secure // Would have liked a wooden crate but access >:(
/datum/supply_pack/organic/vday
name = "Surplus Valentine Crate"
desc = "Turns out we got warehouses of this love-y dove-y crap. Were sending out small barged buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards."
desc = "Turns out we got warehouses of this love-y dove-y crap. We're sending out small bargain buddle of Valentine gear. This crate has two boxes of chocolate, three poppy flowers, five candy hearts, and three cards."
cost = 3000
contraband = TRUE
contains = list(/obj/item/storage/fancy/heart_box,

View File

@@ -131,7 +131,7 @@
/datum/supply_pack/science/relic
name = "Relic Crate"
desc = "Ever want to play with old discounted toys? Look no more. Contains two relics."
desc = "Ever wanted to play with old discounted toys? Look no further. Contains two relics."
cost = 1000
contraband = TRUE
contains = list(/obj/item/relic,

View File

@@ -9,143 +9,25 @@
/datum/supply_pack/service
group = "Service"
/datum/supply_pack/service/advlighting
name = "Advanced Lighting crate"
desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!"
cost = 2750
contains = list(/obj/item/construction/rld,
/obj/item/flashlight/lamp,
/obj/item/flashlight/lamp,
/obj/item/flashlight/lamp/green,
/obj/item/storage/box/lights/mixed)
crate_name = "advanced lighting crate"
crate_type = /obj/structure/closet/crate/secure
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Cargo ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/service/cargo_supples
name = "Cargo Supplies Crate"
desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping."
desc = "Sold everything that wasn't bolted down? You can get right back to work with this crate containing stamps, an export scanner, destination tagger, hand labeler and some package wrapping. Now with extra toner cartidges!"
cost = 1000
contains = list(/obj/item/stamp,
/obj/item/stamp/denied,
/obj/item/export_scanner,
/obj/item/destTagger,
/obj/item/hand_labeler,
/obj/item/toner,
/obj/item/toner,
/obj/item/stack/packageWrap,
/obj/item/stack/packageWrap)
crate_name = "cargo supplies crate"
/datum/supply_pack/service/carpet_exotic
name = "Exotic Carpet Crate"
desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
cost = 7000
contains = list(/obj/item/stack/tile/carpet/blue/fifty,
/obj/item/stack/tile/carpet/blue/fifty,
/obj/item/stack/tile/carpet/cyan/fifty,
/obj/item/stack/tile/carpet/cyan/fifty,
/obj/item/stack/tile/carpet/green/fifty,
/obj/item/stack/tile/carpet/green/fifty,
/obj/item/stack/tile/carpet/orange/fifty,
/obj/item/stack/tile/carpet/orange/fifty,
/obj/item/stack/tile/carpet/purple/fifty,
/obj/item/stack/tile/carpet/purple/fifty,
/obj/item/stack/tile/carpet/red/fifty,
/obj/item/stack/tile/carpet/red/fifty,
/obj/item/stack/tile/carpet/royalblue/fifty,
/obj/item/stack/tile/carpet/royalblue/fifty,
/obj/item/stack/tile/carpet/royalblack/fifty,
/obj/item/stack/tile/carpet/royalblack/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty)
crate_name = "exotic carpet crate"
/datum/supply_pack/service/food_cart
name = "Food Cart Crate"
desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!"
cost = 1000
contains = list(/obj/machinery/food_cart)
crate_name = "food cart crate"
crate_type = /obj/structure/closet/crate
/datum/supply_pack/service/noslipfloor
name = "High-traction Floor Tiles"
desc = "Make slipping a thing of the past with sixty industrial-grade anti-slip floortiles!"
cost = 2000
contains = list(/obj/item/stack/tile/noslip/thirty,
/obj/item/stack/tile/noslip/thirty)
crate_name = "high-traction floor tiles crate"
/datum/supply_pack/service/icecream_cart
name = "Ice Cream Cart Crate"
desc = "Plasma fire a to hot for you, want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream."
cost = 2750 //Comes prestocked with basic ingredients
contains = list(/obj/machinery/icecream_vat)
crate_name = "ice cream vat crate"
crate_type = /obj/structure/closet/crate
/datum/supply_pack/service/janitor
name = "Janitorial Supplies Crate"
desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag."
cost = 1300
contains = list(/obj/item/reagent_containers/glass/bucket,
/obj/item/reagent_containers/glass/bucket,
/obj/item/reagent_containers/glass/bucket,
/obj/item/mop,
/obj/item/caution,
/obj/item/caution,
/obj/item/caution,
/obj/item/storage/bag/trash,
/obj/item/reagent_containers/spray/cleaner,
/obj/item/reagent_containers/rag,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/soap/nanotrasen)
crate_name = "janitorial supplies crate"
/datum/supply_pack/service/janitor/janicart
name = "Janitorial Cart and Galoshes Crate"
desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart."
cost = 2000
contains = list(/obj/structure/janitorialcart,
/obj/item/clothing/shoes/galoshes)
crate_name = "janitorial cart crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/service/janitor/janitank
name = "Janitor Backpack Crate"
desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open."
cost = 1000
access = ACCESS_JANITOR
contains = list(/obj/item/watertank/janitor)
crate_name = "janitor backpack crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/service/janitor/janpremium
name = "Janitor Premium Supplies"
desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia."
cost = 1750
access = ACCESS_JANITOR
contains = list(/obj/item/caution,
/obj/item/caution,
/obj/item/caution,
/obj/item/reagent_containers/rag,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/spray/drying_agent)
crate_name = "janitor backpack crate"
/datum/supply_pack/service/janitor/janpimp
name = "Custodial Cruiser"
desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!"
cost = 3000
access = ACCESS_JANITOR
contains = list(/obj/vehicle/ridden/janicart,
/obj/item/key/janitor)
crate_name = "janitor ride crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/service/mule
name = "MULEbot Crate"
desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!"
@@ -154,59 +36,6 @@
crate_name = "\improper MULEbot Crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/service/party
name = "Party Equipment"
desc = "Celebrate both life and death on the station with Nanotrasen's Party Essentials(tm)! Contains seven colored glowsticks, four beers, two ales, and a bottle of patron, goldschlager, and shaker!"
cost = 2000
contains = list(/obj/item/storage/box/drinkingglasses,
/obj/item/reagent_containers/food/drinks/shaker,
/obj/item/reagent_containers/food/drinks/bottle/patron,
/obj/item/reagent_containers/food/drinks/bottle/goldschlager,
/obj/item/reagent_containers/food/drinks/ale,
/obj/item/reagent_containers/food/drinks/ale,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/reagent_containers/food/drinks/beer,
/obj/item/flashlight/glowstick,
/obj/item/flashlight/glowstick/red,
/obj/item/flashlight/glowstick/blue,
/obj/item/flashlight/glowstick/cyan,
/obj/item/flashlight/glowstick/orange,
/obj/item/flashlight/glowstick/yellow,
/obj/item/flashlight/glowstick/pink)
crate_name = "party equipment crate"
/datum/supply_pack/service/carpet
name = "Premium Carpet Crate"
desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains the classics."
cost = 1000
contains = list(/obj/item/stack/tile/carpet/fifty,
/obj/item/stack/tile/carpet/fifty,
/obj/item/stack/tile/carpet/black/fifty,
/obj/item/stack/tile/carpet/black/fifty)
crate_name = "premium carpet crate"
/datum/supply_pack/service/carpet2
name = "Premium Carpet Crate #2"
desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome"
cost = 1000
contains = list(/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty)
crate_name = "premium carpet crate #2"
/datum/supply_pack/service/lightbulbs
name = "Replacement Lights"
desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer."
cost = 1200
contains = list(/obj/item/storage/box/lights/mixed,
/obj/item/storage/box/lights/mixed,
/obj/item/storage/box/lights/mixed,
/obj/item/lightreplacer)
crate_name = "replacement lights"
/datum/supply_pack/service/minerkit
name = "Shaft Miner Starter Kit"
desc = "All the miners died too fast? Assistant wants to get a taste of life off-station? Either way, this kit is the best way to turn a regular crewman into an ore-producing, monster-slaying machine. Contains meson goggles, a pickaxe, advanced mining scanner, cargo headset, ore bag, gasmask, and explorer suit. Requires QM access to open."
@@ -223,9 +52,188 @@
crate_type = /obj/structure/closet/crate/secure
//////////////////////////////////////////////////////////////////////////////
/////////////////////////// Vending Restocks /////////////////////////////////
/////////////////////// Chef, Botanist, Bartender ////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/service/buildabar
name = "Build a Bar Crate"
desc = "Looking to set up your own little safe haven? Maintenance bar too much of a bummer to work on? Maybe you just want to set up shop right in front of the bartender. Whatever your reasons, get a jump-start on this with this handy kit. Contains circuitboards for bar equipment, some parts, and some basic bartending supplies. (Batteries not Included)"
cost = 3750
contains = list(/obj/item/storage/box/drinkingglasses,
/obj/item/storage/box/drinkingglasses,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/manipulator,
/obj/item/stock_parts/manipulator,
/obj/item/stock_parts/manipulator,
/obj/item/stock_parts/capacitor,
/obj/item/stock_parts/capacitor,
/obj/item/stack/sheet/metal/ten,
/obj/item/stack/sheet/metal/five,
/obj/item/stack/sheet/glass/five,
/obj/item/stack/cable_coil/random,
/obj/item/reagent_containers/rag,
/obj/item/book/manual/wiki/barman_recipes,
/obj/item/book/granter/action/drink_fling,
/obj/item/reagent_containers/food/drinks/shaker,
/obj/item/circuitboard/machine/chem_dispenser/drinks/beer,
/obj/item/circuitboard/machine/chem_dispenser/drinks,
/obj/item/circuitboard/machine/dish_drive)
crate_name = "build a bar crate"
/datum/supply_pack/service/food_cart
name = "Food Cart Crate"
desc = "Want to sell food on the go? Cook lost their cart? Well we just so happen to have a few carts to spare!"
cost = 1000
contains = list(/obj/machinery/food_cart)
crate_name = "food cart crate"
crate_type = /obj/structure/closet/crate
/datum/supply_pack/service/icecream_cart
name = "Ice Cream Cart Crate"
desc = "Plasma fire too hot for you? Want a nice treat after a hard days work? Well now we have the cart for you! This Ice Cream Vat has everthing you need to make you and your friends so ice cream treats! This cart comes stocked with some ingredients for each type of scoopable icecream."
cost = 2750 //Comes prestocked with basic ingredients
contains = list(/obj/machinery/icecream_vat)
crate_name = "ice cream vat crate"
crate_type = /obj/structure/closet/crate
/datum/supply_pack/service/cutlery
name = "Kitchen Cutlery Deluxe Set"
desc = "Need to slice and dice away those ''Tomatoes''? 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, //Deluxe for a reason
/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,
/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"
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Janitor //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/service/advlighting
name = "Advanced Lighting crate"
desc = "Thanks to advanced lighting tech we here at the Lamp Factory have be able to produce more lamps and lamp items! This crate has three lamps, a box of lights and a state of the art rapid-light-device!"
cost = 2750
contains = list(/obj/item/construction/rld,
/obj/item/flashlight/lamp,
/obj/item/flashlight/lamp,
/obj/item/flashlight/lamp/green,
/obj/item/storage/box/lights/mixed)
crate_name = "advanced lighting crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/service/lightbulbs
name = "Replacement Lights" //Subgrouping this with Advanced Lighting Crate, they're both lighting related.
desc = "May the light of Aether shine upon this station! Or at least, the light of forty two light tubes and twenty one light bulbs as well as a light replacer."
cost = 1200
contains = list(/obj/item/storage/box/lights/mixed,
/obj/item/storage/box/lights/mixed,
/obj/item/storage/box/lights/mixed,
/obj/item/lightreplacer)
crate_name = "replacement lights"
/datum/supply_pack/service/janitor/advanced
name = "Advanced Sanitation Crate"
desc = "Contains all the essentials for an advanced spacefaring cleanup crew. This kit includes a trashbag, an advanced mop, a bottle of space cleaner, a floor buffer, and a holosign projector. Requires Janitorial Access to Open"
cost = 5700
access = ACCESS_JANITOR
contains = list(/obj/item/storage/bag/trash/bluespace,
/obj/item/reagent_containers/spray/cleaner,
/obj/item/mop/advanced,
/obj/item/lightreplacer,
/obj/item/janiupgrade,
/obj/item/holosign_creator)
crate_name = "advanced santation crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/service/janitor/janpimp
name = "Custodial Cruiser"
desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!"
cost = 3000
access = ACCESS_JANITOR
contains = list(/obj/vehicle/ridden/janicart,
/obj/item/key/janitor)
crate_name = "janitor ride crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/service/janitor/janitank
name = "Janitor Backpack Crate"
desc = "Call forth divine judgement upon dirt and grime with this high capacity janitor backpack. Contains 500 units of station-cleansing cleaner. Requires janitor access to open."
cost = 1000
access = ACCESS_JANITOR
contains = list(/obj/item/watertank/janitor)
crate_name = "janitor backpack crate"
crate_type = /obj/structure/closet/crate/secure
/datum/supply_pack/service/janitor/janpremium
name = "Janitor Supplies (Premium)"
desc = "The custodial union is in a tizzy, so we've gathered up some better supplies for you. In this crate you can get a brand new chem, Drying Agent. This stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, several cleaning grenades, some spare bottles of ammonia, and an MCE (or Massive Cleaning Explosive)."
cost = 2700
contains = list(/obj/item/grenade/clusterbuster/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/reagent_containers/rag,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/spray/drying_agent)
crate_name = "premium janitorial crate"
/datum/supply_pack/service/janitor/starter
name = "Janitorial Supplies (Standard)"
desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, NT soap and a trash bag."
cost = 1300
contains = list(/obj/item/reagent_containers/glass/bucket,
/obj/item/reagent_containers/glass/bucket,
/obj/item/reagent_containers/glass/bucket,
/obj/item/mop,
/obj/item/caution,
/obj/item/caution,
/obj/item/caution,
/obj/item/storage/bag/trash,
/obj/item/reagent_containers/spray/cleaner,
/obj/item/reagent_containers/rag,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/soap/nanotrasen)
crate_name = "standard janitorial crate"
/datum/supply_pack/service/janitor/janicart
name = "Janicart and Galoshes Crate"
desc = "The keystone to any successful janitor. As long as you have feet, this pair of galoshes will keep them firmly planted on the ground. Also contains a janitorial cart."
cost = 2000
contains = list(/obj/structure/janitorialcart,
/obj/item/clothing/shoes/galoshes)
crate_name = "janitorial cart crate"
crate_type = /obj/structure/closet/crate/large
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Vendor Refills //////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/service/vending/bartending
name = "Bartending Supply Crate"
desc = "Bring on the booze with vending machine refills, as well as a free book containing the well-kept secrets to the bartending trade!"

View File

@@ -15,15 +15,17 @@
armor = list("melee" = 30, "bullet" = 50, "laser" = 50, "energy" = 100, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80)
anchored = TRUE //So it cant slide around after landing
anchorable = FALSE
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
//*****NOTE*****: Many of these comments are similarly described in centcom_podlauncher.dm. If you change them here, please consider doing so in the centcom podlauncher code as well!
var/adminNamed = FALSE //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc)
var/bluespace = FALSE //If true, the pod deletes (in a shower of sparks) after landing
var/landingDelay = 30 //How long the pod takes to land after launching
var/openingDelay = 30 //How long the pod takes to open after landing
var/departureDelay = 30 //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom)
var/departureDelay = 30 //How long the pod takes to leave after opening. If bluespace = TRUE, it deletes. If reversing = TRUE, it flies back to centcom.
var/damage = 0 //Damage that occurs to any mob under the pod when it lands.
var/effectStun = FALSE //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish!
var/effectLimb = FALSE //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands
var/effectOrgans = FALSE //If true, yeets out every limb and organ from anyone caught under the pod when it lands
var/effectGib = FALSE //If true, anyone under the pod will be gibbed when it lands
var/effectStealth = FALSE //If true, a target icon isnt displayed on the turf where the pod will land
var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc)
@@ -31,10 +33,13 @@
var/effectCircle = FALSE //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here
var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod.
var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
var/fallDuration = 4
var/fallingSoundLength = 11
var/fallingSound = 'sound/weapons/mortar_long_whistle.ogg'//Admin sound to play before the pod lands
var/landingSound //Admin sound to play when the pod lands
var/openingSound //Admin sound to play when the pod opens
var/leavingSound //Admin sound to play when the pod leaves
var/soundVolume = 50 //Volume to play sounds at. Ignores the cap
var/soundVolume = 80 //Volume to play sounds at. Ignores the cap
var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map.
var/list/explosionSize = list(0,0,2,3)
@@ -48,16 +53,18 @@
style = STYLE_CENTCOM
bluespace = TRUE
explosionSize = list(0,0,0,0)
landingDelay = 5 //Very speedy!
landingDelay = 20 //Very speedy!
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/structure/closet/supplypod/Initialize()
..()
. = ..()
setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly
/obj/structure/closet/supplypod/update_icon()
cut_overlays()
if (style != STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays
if (style == STYLE_SEETHROUGH || style == STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays
return
else
if (opened)
add_overlay("[icon_state]_open")
else
@@ -75,7 +82,7 @@
update_icon()
/obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user)
if (bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways.
if(bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways.
return FALSE
else
..()
@@ -86,9 +93,6 @@
/obj/structure/closet/supplypod/contents_explosion() //Supplypods also protect their contents from the harmful effects of fucking exploding.
return
/obj/structure/closet/supplypod/prevent_content_explosion() //Useful for preventing epicenter explosions from damaging contents
return TRUE
/obj/structure/closet/supplypod/toggle(mob/living/user) //Supplypods shouldn't be able to be manually opened under any circumstances, as the open() proc generates supply order datums
return
@@ -101,17 +105,33 @@
if (effectLimb && iscarbon(M)) //If effectLimb is true (which means we pop limbs off when we hit people):
var/mob/living/carbon/CM = M
for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands
if(bodypart.body_part != HEAD && bodypart.body_zone != CHEST)//we dont want to kill him, just teach em a lesson!
if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson!
if (bodypart.dismemberable)
bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half!
break
if (effectOrgans && iscarbon(M)) //effectOrgans means remove every organ in our mob
var/mob/living/carbon/CM = M
for(var/X in CM.internal_organs)
var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in
var/obj/item/organ/O = X
O.Remove(CM) //Note that this isn't the same proc as for lists
O.forceMove(T) //Move the organ outta the body
O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away
sleep(1)
for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands
var/destination = get_edge_target_turf(T, pick(GLOB.alldirs))
if (bodypart.dismemberable)
bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half!
bodypart.throw_at(destination, 2, 3)
sleep(1)
if (effectGib) //effectGib is on, that means whatever's underneath us better be fucking oof'd on
M.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em)
M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs
M.adjustBruteLoss(damage)
if (B[1] || B[2] || B[3] || B[4]) //If the explosion list isn't all zeroes, call an explosion
else
M.adjustBruteLoss(damage)
var/explosion_sum = B[1] + B[2] + B[3] + B[4]
if (explosion_sum != 0) //If the explosion list isn't all zeroes, call an explosion
explosion(get_turf(src), B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing
else if (!effectQuiet) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true)
playsound(src, "explosion", landingSound ? 15 : 80, 1)
@@ -128,22 +148,31 @@
/obj/structure/closet/supplypod/open(atom/movable/holder, var/broken = FALSE, var/forced = FALSE) //The holder var represents an atom whose contents we will be working with
var/turf/T = get_turf(holder) //Get the turf of whoever's contents we're talking about
if (!holder)
return
if(opened)
return
opened = TRUE //This is to ensure we don't open something that has already been opened
var/mob/M
if (istype(holder, /mob)) //Allows mobs to assume the role of the holder, meaning we look at the mob's contents rather than the supplypod's contents. Typically by this point the supplypod's contents have already been moved over to the mob's contents
M = holder
if (M.key && !forced && !broken) //If we are player controlled, then we shouldnt open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter)
return
opened = TRUE //This is to ensure we don't open something that has already been opened
if (openingSound)
playsound(get_turf(holder), openingSound, soundVolume, 0, 0)
playsound(get_turf(holder), openingSound, soundVolume, 0, 0) //Special admin sound to play
INVOKE_ASYNC(holder, .proc/setOpened) //Use the INVOKE_ASYNC proc to call setOpened() on whatever the holder may be, without giving the atom/movable base class a setOpened() proc definition
if (style == STYLE_SEETHROUGH)
update_icon()
for (var/atom/movable/O in holder.contents) //Go through the contents of the holder
O.forceMove(T) //move everything from the contents of the holder to the turf of the holder
if (!effectQuiet) //If we aren't being quiet, play an open sound
if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH) //If we aren't being quiet, play the default pod open sound
playsound(get_turf(holder), open_sound, 15, 1, -3)
if (broken) //If the pod is opening because it's been destroyed, we end here
return
addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time
if (style == STYLE_SEETHROUGH)
depart(src)
else
addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time
/obj/structure/closet/supplypod/proc/depart(atom/movable/holder)
if (leavingSound)
@@ -151,7 +180,7 @@
if (reversing) //If we're reversing, we call the close proc. This sends the pod back up to centcom
close(holder)
else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists)
if (style != STYLE_INVISIBLE)
if (!effectQuiet && style != STYLE_INVISIBLE && style != STYLE_SEETHROUGH)
do_sparks(5, TRUE, holder) //Create some sparks right before closing
qdel(src) //Delete ourselves and the holder
if (holder != src)
@@ -164,13 +193,14 @@
if (ismob(O) && !isliving(O)) //We dont want to take ghosts with us
continue
O.forceMove(holder) //Put objects inside before we close
var/obj/effect/temp_visual/risingPod = new /obj/effect/temp_visual/DPfall(get_turf(holder), src) //Make a nice animation of flying back up
var/obj/effect/temp_visual/risingPod = new /obj/effect/abstract/DPfall(get_turf(holder), src) //Make a nice animation of flying back up
risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot
holder.forceMove(bay) //Move the pod back to centcom, where it belongs
animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod
QDEL_IN(risingPod, 10)
reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() )
bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever
open(holder, forced = TRUE)
return
/obj/structure/closet/supplypod/proc/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open() proc for more details
update_icon()
@@ -179,12 +209,11 @@
update_icon()
/obj/structure/closet/supplypod/Destroy()
if (!opened) //If we havent opened yet, we're opening because we've been destroyed. Lets dump our contents by opening up
open(src, broken = TRUE)
return ..()
open(src, broken = TRUE) //Lets dump our contents by opening up
. = ..()
//------------------------------------FALLING SUPPLY POD-------------------------------------//
/obj/effect/temp_visual/DPfall //Falling pod
/obj/effect/abstract/DPfall //Falling pod
name = ""
icon = 'icons/obj/supplypods.dmi'
pixel_x = -16
@@ -192,17 +221,22 @@
pixel_z = 200
desc = "Get out of the way!"
layer = FLY_LAYER//that wasnt flying, that was falling with style!
randomdir = FALSE
icon_state = ""
/obj/effect/temp_visual/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod)
if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible
/obj/effect/abstract/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod)
if (pod.style == STYLE_SEETHROUGH)
pixel_x = -16
pixel_y = 0
for (var/atom/movable/O in pod.contents)
var/icon/I = getFlatIcon(O) //im so sorry
add_overlay(I)
else if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible
icon_state = "[pod.icon_state]_falling"
name = pod.name
. = ..()
//------------------------------------TEMPORARY_VISUAL-------------------------------------//
/obj/effect/DPtarget //This is the object that forceMoves the supplypod to it's location
/obj/effect/abstract/DPtarget //This is the object that forceMoves the supplypod to it's location
name = "Landing Zone Indicator"
desc = "A holographic projection designating the landing zone of something. It's probably best to stand back."
icon = 'icons/mob/actions/actions_items.dmi'
@@ -212,45 +246,60 @@
var/obj/effect/temp_visual/fallingPod //Temporary "falling pod" that we animate
var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this target
/obj/effect/ex_act()
return
/obj/effect/DPtarget/Initialize(mapload, podParam, var/datum/supply_order/SO = null)
/obj/effect/abstract/DPtarget/Initialize(mapload, podParam, single_order = null)
. = ..()
if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does)
podParam = new podParam() //If its just a path, instantiate it
pod = podParam
if (SO)
SO.generate(pod)
for (var/mob/living/M in podParam) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace)
if (single_order)
if (istype(single_order, /datum/supply_order))
var/datum/supply_order/SO = single_order
SO.generate(pod)
else if (istype(single_order, /atom/movable))
var/atom/movable/O = single_order
O.forceMove(pod)
for (var/mob/living/M in pod) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace)
M.forceMove(src)
if(pod.effectStun) //If effectStun is true, stun any mobs caught on this target until the pod gets a chance to hit them
for (var/mob/living/M in get_turf(src))
M.Stun(pod.landingDelay+10, ignore_canstun = TRUE)//you aint goin nowhere, kid.
if (pod.effectStealth) //If effectStealth is true we want to be invisible
alpha = 255
icon_state = ""
if (pod.fallDuration == initial(pod.fallDuration) && pod.landingDelay + pod.fallDuration < pod.fallingSoundLength)
pod.fallingSoundLength = 3 //The default falling sound is a little long, so if the landing time is shorter than the default falling sound, use a special, shorter default falling sound
pod.fallingSound = 'sound/weapons/mortar_whistle.ogg'
var/soundStartTime = pod.landingDelay - pod.fallingSoundLength + pod.fallDuration
if (soundStartTime < 0)
soundStartTime = 1
if (!pod.effectQuiet)
addtimer(CALLBACK(src, .proc/playFallingSound), soundStartTime)
addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.landingDelay)
/obj/effect/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle
fallingPod = new /obj/effect/temp_visual/DPfall(drop_location(), pod)
/obj/effect/abstract/DPtarget/proc/playFallingSound()
playsound(src, pod.fallingSound, pod.soundVolume, 1, 6)
/obj/effect/abstract/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle
fallingPod = new /obj/effect/abstract/DPfall(drop_location(), pod)
var/matrix/M = matrix(fallingPod.transform) //Create a new matrix that we can rotate
var/angle = effectCircle ? rand(0,360) : rand(70,110) //The angle that we can come in from
fallingPod.pixel_x = cos(angle)*200 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target
fallingPod.pixel_z = sin(angle)*200
fallingPod.pixel_x = cos(angle)*400 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target
fallingPod.pixel_z = sin(angle)*400
var/rotation = Get_Pixel_Angle(fallingPod.pixel_z, fallingPod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps
M.Turn(rotation) //Turn our matrix accordingly
fallingPod.transform = M //Transform the animated pod according to the matrix
M = matrix(pod.transform) //Make another matrix based on the pod
M.Turn(rotation) //Turn the matrix
pod.transform = M //Turn the actual pod (Won't be visible until endLaunch() proc tho)
animate(fallingPod, pixel_z = 0, pixel_x = -16, time = 3, , easing = LINEAR_EASING) //Make the pod fall! At an angle!
addtimer(CALLBACK(src, .proc/endLaunch), 3, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
animate(fallingPod, pixel_z = 0, pixel_x = -16, time = pod.fallDuration, , easing = LINEAR_EASING) //Make the pod fall! At an angle!
addtimer(CALLBACK(src, .proc/endLaunch), pod.fallDuration, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
/obj/effect/DPtarget/proc/endLaunch()
/obj/effect/abstract/DPtarget/proc/endLaunch()
pod.update_icon()
pod.forceMove(drop_location()) //The fallingPod animation is over, now's a good time to forceMove the actual pod into position
QDEL_NULL(fallingPod) //Delete the falling pod effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears
for (var/mob/living/M in src) //Remember earlier (initialization) when we moved mobs into the DPTarget so they wouldnt get lost in nullspace? Time to get them out
M.forceMove(pod)
pod.preOpen() //Begin supplypod open procedures. Here effects like explosions, damage, and other dangerous (and potentially admin-caused, if the centcom_podlauncher datum was used) memes will take place
QDEL_NULL(fallingPod) //The fallingPod's (the animated effect, not the actual pod) purpose is complete. It can rest easy now
qdel(src) //ditto
//------------------------------------UPGRADES-------------------------------------//

View File

@@ -62,7 +62,7 @@
if(ismecha(M.loc)) // stops inventory actions in a mech
return
if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand))
if(!. && !M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
add_fingerprint(usr)

View File

@@ -18,7 +18,7 @@
/obj/item/clothing/ears/earmuffs/ComponentInitialize()
. = ..()
AddComponent(/datum/component/earhealing)
AddElement(/datum/element/earhealing)
AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS))
/obj/item/clothing/ears/headphones

View File

@@ -0,0 +1,44 @@
/obj/item/clothing/glasses/phantomthief
name = "suspicious paper mask"
desc = "A cheap, Syndicate-branded paper face mask. They'll never see it coming."
alternate_worn_icon = 'icons/mob/mask.dmi'
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "s-ninja"
item_state = "s-ninja"
/obj/item/clothing/glasses/phantomthief/ComponentInitialize()
. = ..()
AddComponent(/datum/component/wearertargeting/phantomthief)
/obj/item/clothing/glasses/phantomthief/syndicate
name = "suspicious plastic mask"
desc = "A cheap, bulky, Syndicate-branded plastic face mask. You have to break in to break out."
var/nextadrenalinepop
/obj/item/clothing/glasses/phantomthief/syndicate/examine(mob/user)
. = ..()
if(user.get_item_by_slot(SLOT_GLASSES) == src)
if(world.time >= nextadrenalinepop)
. += "<span class='notice'>The built-in adrenaline injector is ready for use.</span>"
else
. += "<span class='notice'>[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again."
/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate)
if(istype(user) && combatmodestate && world.time >= nextadrenalinepop)
nextadrenalinepop = world.time + 5 MINUTES
user.reagents.add_reagent("syndicateadrenals", 5)
user.playsound_local(user, 'sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE)
/obj/item/clothing/glasses/phantomthief/syndicate/equipped(mob/user, slot)
. = ..()
if(!istype(user))
return
if(slot != SLOT_GLASSES)
return
RegisterSignal(user, COMSIG_COMBAT_TOGGLED, .proc/injectadrenaline)
/obj/item/clothing/glasses/phantomthief/syndicate/dropped(mob/user)
. = ..()
if(!istype(user))
return
UnregisterSignal(user, COMSIG_COMBAT_TOGGLED)

View File

@@ -41,14 +41,14 @@
H.update_inv_head()
///Special throw_impact for hats to frisbee hats at people to place them on their heads/attempt to de-hat them.
///Special throw_impact for hats to frisbee hats at people to place them on their heads.
/obj/item/clothing/head/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing)
. = ..()
///if the thrown object's target zone isn't the head
if(thrownthing.target_zone != BODY_ZONE_HEAD)
return
///ignore any hats with the tinfoil counter-measure enabled
if(clothing_flags & ANTI_TINFOIL_MANEUVER)
///ignore any hats with downsides when worn
if(clothing_flags & IGNORE_HAT_TOSS)
return
///if the hat happens to be capable of holding contents and has something in it. mostly to prevent super cheesy stuff like stuffing a mini-bomb in a hat and throwing it
if(LAZYLEN(contents))
@@ -57,20 +57,8 @@
var/mob/living/carbon/H = hit_atom
if(istype(H.head, /obj/item))
var/obj/item/WH = H.head
///check if the item has NODROP
if(HAS_TRAIT(WH, TRAIT_NODROP))
H.visible_message("<span class='warning'>[src] bounces off [H]'s [WH.name]!", "<span class='warning'>[src] bounces off your [WH.name], falling to the floor.</span>")
return
///check if the item is an actual clothing head item, since some non-clothing items can be worn
if(istype(WH, /obj/item/clothing/head))
var/obj/item/clothing/head/WHH = WH
///SNUG_FIT hats are immune to being knocked off
if(WHH.clothing_flags & SNUG_FIT)
H.visible_message("<span class='warning'>[src] bounces off [H]'s [WHH.name]!", "<span class='warning'>[src] bounces off your [WHH.name], falling to the floor.</span>")
return
///if the hat manages to knock something off
if(H.dropItemToGround(WH))
H.visible_message("<span class='warning'>[src] knocks [WH] off [H]'s head!</span>", "<span class='warning'>[WH] is suddenly knocked off your head by [src]!</span>")
H.visible_message("<span class='warning'>[src] bounces off [H]'s [WH.name]!", "<span class='warning'>[src] bounces off your [WH.name], falling to the floor.</span>")
return
if(H.equip_to_slot_if_possible(src, SLOT_HEAD, FALSE, TRUE))
H.visible_message("<span class='notice'>[src] lands neatly on [H]'s head!", "<span class='notice'>[src] lands perfectly onto your head!</span>")
return
@@ -84,6 +72,8 @@
R.visible_message("<span class='notice'>[src] lands neatly on top of [R].", "<span class='notice'>[src] lands perfectly on top of you.</span>")
R.place_on_head(src) //hats aren't designed to snugly fit borg heads or w/e so they'll always manage to knock eachother off
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
. = list()
if(!isinhands)

View File

@@ -13,14 +13,12 @@
/obj/item/clothing/head/collectable/slime
name = "collectable slime cap!"
desc = "It just latches right in place!"
clothing_flags = SNUG_FIT
icon_state = "slime"
dynamic_hair_suffix = ""
/obj/item/clothing/head/collectable/xenom
name = "collectable xenomorph helmet!"
desc = "Hiss hiss hiss!"
clothing_flags = SNUG_FIT
icon_state = "xenom"
/obj/item/clothing/head/collectable/chef
@@ -29,7 +27,6 @@
icon_state = "chef"
item_state = "chef"
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/chef
/obj/item/clothing/head/collectable/paper
@@ -73,14 +70,13 @@
desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!"
icon_state = "welding"
item_state = "welding"
clothing_flags = SNUG_FIT
resistance_flags = NONE
/obj/item/clothing/head/collectable/slime
name = "collectable slime hat"
desc = "Just like a real brain slug!"
icon_state = "headslime"
item_state = "headslime"
clothing_flags = SNUG_FIT
/obj/item/clothing/head/collectable/flatcap
name = "collectable flat cap"
@@ -124,7 +120,6 @@
/obj/item/clothing/head/collectable/hardhat
name = "collectable hard hat"
desc = "WARNING! Offers no real protection, or luminosity, but damn, is it fancy!"
clothing_flags = SNUG_FIT
icon_state = "hardhat0_yellow"
item_state = "hardhat0_yellow"
@@ -147,7 +142,7 @@
desc = "Go Red! I mean Green! I mean Red! No Green!"
icon_state = "thunderdome"
item_state = "thunderdome"
clothing_flags = SNUG_FIT
resistance_flags = NONE
flags_inv = HIDEHAIR
/obj/item/clothing/head/collectable/swat
@@ -155,5 +150,5 @@
desc = "That's not real blood. That's red paint." //Reference to the actual description
icon_state = "swat"
item_state = "swat"
clothing_flags = SNUG_FIT
resistance_flags = NONE
flags_inv = HIDEHAIR

View File

@@ -11,7 +11,6 @@
armor = list("melee" = 15, "bullet" = 5, "laser" = 20,"energy" = 10, "bomb" = 20, "bio" = 10, "rad" = 20, "fire" = 100, "acid" = 50)
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
clothing_flags = SNUG_FIT
resistance_flags = FIRE_PROOF
dynamic_hair_suffix = "+generic"

View File

@@ -10,7 +10,7 @@
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
clothing_flags = SNUG_FIT
resistance_flags = NONE
flags_cover = HEADCOVERSEYES
flags_inv = HIDEHAIR

View File

@@ -51,6 +51,11 @@
dog_fashion = null
/obj/item/clothing/head/caphat/beret/white
name = "captain's white beret"
desc = "A white beret fit for a leader."
icon_state = "beret_captain_white"
//Head of Personnel
/obj/item/clothing/head/hopcap
name = "head of personnel's cap"
@@ -67,6 +72,11 @@
dog_fashion = null
/obj/item/clothing/head/hopcap/beret/white
name = "head of personnel's white beret"
desc = "The symbol of true bureaucratic micromanagement, although in a fancy form."
icon_state = "beret_white_hop"
//Chaplain
/obj/item/clothing/head/nun_hood
name = "nun hood"
@@ -119,6 +129,16 @@
desc = "A black beret, perfect for war veterans and dark, brooding, anti-hero mimes."
icon_state = "beretblack"
/obj/item/clothing/head/beret/purple
name = "purple beret"
desc = "A purple beret."
icon_state = "beret_purple"
/obj/item/clothing/head/beret/blue
name = "blue beret"
desc = "A blue beret"
icon_state = "beret_blue"
/obj/item/clothing/head/beret/highlander
desc = "That was white fabric. <i>Was.</i>"
dog_fashion = null //THIS IS FOR SLAUGHTER, NOT PUPPIES
@@ -146,6 +166,11 @@
desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection."
icon_state = "hosberetblack"
/obj/item/clothing/head/HoS/beret/officer
name = "head of security officer beret"
desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection."
icon_state = "beret_centcom_officer"
/obj/item/clothing/head/HoS/beret/syndicate
name = "syndicate beret"
desc = "A black beret with thick armor padding inside. Stylish and robust."
@@ -242,8 +267,11 @@
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
strip_delay = 60
/obj/item/clothing/head/beret/sec/corporatewarden
name = "warden's corporate beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "beret_corporate_warden"
/obj/item/clothing/head/beret/sec/navyofficer
desc = "A special beret with the security insignia emblazoned on it. For officers with class."
@@ -261,18 +289,71 @@
desc = "A fancy beret with a green cross, signifying your status in the station's medbay."
icon_state = "cmoberet"
/obj/item/clothing/head/beret/cmo/blue
name = "chief medical officer's blue beret"
desc = "A fancy beret with a blue and white cross, try not to be chief malpractice officer in it."
icon_state = "beret_blue_cmo"
//Medical
/obj/item/clothing/head/beret/med
name = "medical officer's beret"
desc = "A fancy beret with a blue cross, smells sterile"
icon_state = "beret_med"
/obj/item/clothing/head/beret/chem
name = "chemist's beret"
desc = "A fancy beret with a orange beaker, you're not sure if you should smell it"
icon_state = "beret_chem"
/obj/item/clothing/head/beret/viro
name = "virologist's beret"
desc = "A fancy beret with a green gross, hopefully it's virus free!"
icon_state = "beret_viro"
//Research Director
/obj/item/clothing/head/beret/rd
name = "research director's beret"
desc = "A beret worn only by highly intelligent people."
icon_state = "rdberet"
//Scientist
/obj/item/clothing/head/beret/sci
name = "scientist's beret"
desc = "A Scientist's beret, looks like it's covered in slime."
icon_state = "beret_sci"
//Roboticist
/obj/item/clothing/head/beret/robo
name = "roboticist's beret"
desc = "A Roboticist's beret, almost more oil than hat."
icon_state = "beret_robot"
//Chief Engineer
/obj/item/clothing/head/beret/ce
name = "chief engineer's beret"
desc = "A beret that will surely make you look way cooler than a hard hat, although lack of protection is the price."
icon_state = "ceberet"
/obj/item/clothing/head/beret/ce/white
name = "chief engineer's white beret"
desc = "A beret that will surely make you look way cooler than a hard hat, although lack of protection is the price."
icon_state = "beret_ce_white"
//Atmos
/obj/item/clothing/head/beret/atmos
name = "atmospheric technician's beret"
desc = "An Atmospheric Technician's beret. Smells like plasma fire."
icon_state = "beret_atmos"
//Engineer
/obj/item/clothing/head/beret/eng
name = "engineer's beret"
desc = "An Engineer's beret, try not to lose it to space wind."
icon_state = "beret_engineering"
//Quartermaster
/obj/item/clothing/head/beret/qm
name = "quartermaster's beret"

View File

@@ -67,14 +67,12 @@
desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
mutantrace_variation = MUTANTRACE_VARIATION
clothing_flags = SNUG_FIT
/obj/item/clothing/head/cueball
name = "cueball helmet"
desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?"
icon_state = "cueball"
item_state="cueball"
clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
@@ -83,7 +81,6 @@
desc = "A ball of white styrofoam. So festive."
icon_state = "snowman_h"
item_state = "snowman_h"
clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
@@ -93,7 +90,6 @@
icon_state = "justicered"
item_state = "justicered"
flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/justice/blue
@@ -117,10 +113,8 @@
desc = "Wearing these makes you look useless, and only good for your sex appeal."
icon_state = "bunny"
dynamic_hair_suffix = ""
dog_fashion = /datum/dog_fashion/head/rabbit
/obj/item/clothing/head/flatcap
name = "flat cap"
desc = "A working man's cap."
@@ -165,7 +159,6 @@
icon_state = "chickenhead"
item_state = "chickensuit"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
clothing_flags = SNUG_FIT
/obj/item/clothing/head/griffin
name = "griffon head"
@@ -173,7 +166,6 @@
icon_state = "griffinhat"
item_state = "griffinhat"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
clothing_flags = SNUG_FIT
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
@@ -187,7 +179,6 @@
item_state = "xenos_helm"
desc = "A helmet made out of chitinous alien hide."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
clothing_flags = SNUG_FIT
/obj/item/clothing/head/fedora
name = "fedora"
@@ -212,7 +203,6 @@
item_state = "sombrero"
desc = "You can practically taste the fiesta."
flags_inv = HIDEHAIR
dog_fashion = /datum/dog_fashion/head/sombrero
/obj/item/clothing/head/sombrero/green
@@ -309,7 +299,6 @@
desc = "When everything's going to crab, protecting your head is the best choice."
icon_state = "lobster_hat"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
clothing_flags = SNUG_FIT
/obj/item/clothing/head/drfreezehat
name = "doctor freeze's wig"
@@ -377,3 +366,17 @@
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
/obj/item/clothing/head/hotel
name = "Telegram cap"
desc = "A bright red cap warn by hotel staff. Or people who want to be a singing telegram"
icon_state = "telegramhat"
item_color = "telegramhat"
dog_fashion = null
/obj/item/clothing/head/colour
name = "Singer cap"
desc = "A light white hat that has bands of color. Just makes you want to sing and dance!"
icon_state = "colour"
item_color = "colour"
dog_fashion = /datum/dog_fashion/head/colour

View File

@@ -29,7 +29,6 @@
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = FIRE_PROOF
mutantrace_variation = MUTANTRACE_VARIATION
clothing_flags = SNUG_FIT
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
@@ -116,7 +115,6 @@
item_state = "hardhat0_pumpkin"
item_color = "pumpkin"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
clothing_flags = SNUG_FIT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
brightness_on = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
@@ -165,7 +163,6 @@
desc = "A helmet made out of a box."
icon_state = "cardborg_h"
item_state = "cardborg_h"
clothing_flags = SNUG_FIT
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
@@ -230,7 +227,6 @@
desc = "A crude helmet made out of bronze plates. It offers very little in the way of protection."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_helmet_old"
clothing_flags = SNUG_FIT
flags_inv = HIDEEARS|HIDEHAIR
armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
@@ -243,7 +239,7 @@
equip_delay_other = 140
var/datum/brain_trauma/mild/phobia/paranoia
var/warped = FALSE
clothing_flags = ANTI_TINFOIL_MANEUVER
clothing_flags = IGNORE_HAT_TOSS
/obj/item/clothing/head/foilhat/Initialize(mapload)
. = ..()
@@ -258,9 +254,8 @@
return
if(paranoia)
QDEL_NULL(paranoia)
paranoia = new()
user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC, "conspiracies")
paranoia = new("conspiracies")
user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC)
to_chat(user, "<span class='warning'>As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. </span>")
/obj/item/clothing/head/foilhat/MouseDrop(atom/over_object)
@@ -302,3 +297,16 @@
. = ..()
if(!warped)
warp_up()
/obj/item/clothing/head/flakhelm //Actually the M1 Helmet
name = "flak helmet"
icon_state = "m1helm"
item_state = "helmet"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0.1, "bio" = 0, "rad" = 0, "fire" = -10, "acid" = -15)
desc = "A dilapidated helmet used in ancient wars. This one is brittle and essentially useless. An ace of spades is tucked into the band around the outer shell."
pocket_storage_component_path = /datum/component/storage/concrete/pockets/tiny/spacenam //So you can stuff other things in the elastic band instead of it simply being a fluff thing.
//The "pocket" for the M1 helmet so you can tuck things into the elastic band
/datum/component/storage/concrete/pockets/tiny/spacenam
attack_hand_interact = TRUE //So you can actually see what you stuff in there

View File

@@ -139,4 +139,4 @@
flags_inv = HIDEEYES|HIDEFACE
armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90)
strip_delay = 90 //You dont take a Major Leage cap
dog_fashion = null
dog_fashion = null

View File

@@ -4,7 +4,7 @@
name = "space helmet"
icon_state = "spaceold"
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SNUG_FIT
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
item_state = "spaceold"
permeability_coefficient = 0.01
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)

View File

@@ -65,7 +65,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg)
var/mob/wearer = loc
if(msg && ishuman(wearer))
wearer.show_message("[icon2html(src, wearer)]<b><span class='robot'>[msg]</span></b>", 1)
wearer.show_message("[icon2html(src, wearer)]<b><span class='robot'>[msg]</span></b>", MSG_VISUAL)
/obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity)
. = ..()

View File

@@ -4,7 +4,7 @@
icon_state = "bio"
desc = "A hood that protects the head and face from biological contaminants."
permeability_coefficient = 0.01
clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT
clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
resistance_flags = ACID_PROOF

View File

@@ -69,7 +69,6 @@
icon_state = "golhood"
desc = "A protective & concealing hood."
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
clothing_flags = SNUG_FIT
flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
/obj/item/clothing/suit/hooded/cloak/drake
@@ -89,7 +88,6 @@
icon_state = "dragon"
desc = "The skull of a dragon."
armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100)
clothing_flags = SNUG_FIT
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF

View File

@@ -505,6 +505,21 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
/obj/item/clothing/suit/hooded/wintercoat/centcom
name = "centcom winter coat"
icon_state = "coatcentcom"
item_state = "coatcentcom"
armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize()
. = ..()
allowed = GLOB.security_wintercoat_allowed
/obj/item/clothing/head/hooded/winterhood/centcom
icon_state = "winterhood_centcom"
armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
@@ -723,6 +738,15 @@
/obj/item/clothing/head/hooded/winterhood/qm
icon_state = "winterhood_qm"
/obj/item/clothing/suit/hooded/wintercoat/aformal
name = "assistant's formal winter coat"
icon_state = "coataformal"
item_state = "coataformal"
hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal
/obj/item/clothing/head/hooded/winterhood/aformal
icon_state = "winterhood_aformal"
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
@@ -734,6 +758,27 @@
/obj/item/clothing/head/hooded/winterhood/miner
icon_state = "winterhood_miner"
/obj/item/clothing/suit/hooded/wintercoat/ratvar
name = "ratvarian winter coat"
icon_state = "coatratvar"
item_state = "coatratvar"
hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar
/obj/item/clothing/head/hooded/winterhood/ratvar
icon_state = "winterhood_ratvar"
light_range = 3
light_power = 1
light_color = "#B18B25" //clockwork slab background top color
/obj/item/clothing/suit/hooded/wintercoat/narsie
name = "narsian winter coat"
icon_state = "coatnarsie"
item_state = "coatnarsie"
hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie
/obj/item/clothing/head/hooded/winterhood/narsie
icon_state = "winterhood_narsie"
/obj/item/clothing/suit/spookyghost
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
@@ -763,6 +808,17 @@
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD
alternate_worn_layer = UNDER_HEAD_LAYER
/obj/item/clothing/suit/flakjack
name = "flak jacket"
desc = "A dilapidated jacket made of a supposedly bullet-proof material (Hint: It isn't.). Smells faintly of napalm."
icon_state = "flakjack"
item_state = "redtag"
blood_overlay_type = "armor"
body_parts_covered = CHEST
resistance_flags = NONE
mutantrace_variation = NO_MUTANTRACE_VARIATION
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid
/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 Battleforce</i>\"."

View File

@@ -58,7 +58,7 @@
name = "bomb hood"
desc = "Use in case of bomb."
icon_state = "bombsuit"
clothing_flags = THICKMATERIAL | SNUG_FIT
clothing_flags = THICKMATERIAL
armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dynamic_hair_suffix = ""
@@ -123,7 +123,7 @@
name = "radiation hood"
icon_state = "rad"
desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'"
clothing_flags = THICKMATERIAL|SNUG_FIT
clothing_flags = THICKMATERIAL
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30)
strip_delay = 60

View File

@@ -7,7 +7,6 @@
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
strip_delay = 50
equip_delay_other = 50
clothing_flags = SNUG_FIT
resistance_flags = FIRE_PROOF | ACID_PROOF
dog_fashion = /datum/dog_fashion/head/blue_wizard

View File

@@ -5,6 +5,7 @@
item_color = "red_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
/obj/item/clothing/under/pj/blue
name = "blue pj's"
desc = "Sleepwear."
@@ -12,6 +13,7 @@
item_color = "blue_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
/obj/item/clothing/under/patriotsuit
name = "Patriotic Suit"
desc = "Motorcycle not included."
@@ -19,6 +21,7 @@
item_state = "ek"
item_color = "ek"
can_adjust = FALSE
/obj/item/clothing/under/scratch
name = "white suit"
desc = "A white suit, suitable for an excellent host."
@@ -43,6 +46,7 @@
icon_state = "sl_suit"
item_color = "sl_suit"
can_adjust = FALSE
/obj/item/clothing/under/roman
name = "\improper Roman armor"
desc = "Ancient Roman armor. Made of metallic and leather straps."
@@ -52,6 +56,7 @@
can_adjust = FALSE
strip_delay = 100
resistance_flags = NONE
/obj/item/clothing/under/waiter
name = "waiter's outfit"
desc = "It's a very smart uniform with a special pocket for tip."
@@ -59,6 +64,7 @@
item_state = "waiter"
item_color = "waiter"
can_adjust = FALSE
/obj/item/clothing/under/rank/prisoner
name = "prison jumpsuit"
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
@@ -85,12 +91,14 @@
icon_state = "mailman"
item_state = "b_suit"
item_color = "mailman"
/obj/item/clothing/under/rank/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
item_state = "p_suit"
item_color = "psyche"
/obj/item/clothing/under/rank/clown/sexy
name = "sexy-clown suit"
desc = "It makes you look HONKable!"
@@ -98,6 +106,7 @@
item_state = "sexyclown"
item_color = "sexyclown"
can_adjust = FALSE
/obj/item/clothing/under/jabroni
name = "Jabroni Outfit"
desc = "The leather club is two sectors down."
@@ -105,6 +114,7 @@
item_state = "darkholme"
item_color = "darkholme"
can_adjust = FALSE
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision."
@@ -112,6 +122,7 @@
item_state = "gy_suit"
item_color = "vice"
can_adjust = FALSE
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentCom Officers."
name = "\improper CentCom officer's jumpsuit"
@@ -119,12 +130,14 @@
item_state = "g_suit"
item_color = "officer"
alt_covers_chest = TRUE
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
@@ -141,6 +154,7 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = NONE
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
icon_state = "syndicate"
@@ -157,24 +171,28 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/under/owl
name = "owl uniform"
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
icon_state = "owl"
item_color = "owl"
can_adjust = FALSE
/obj/item/clothing/under/griffin
name = "griffon uniform"
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
icon_state = "griffin"
item_color = "griffin"
can_adjust = FALSE
/obj/item/clothing/under/cloud
name = "cloud"
desc = "cloud"
icon_state = "cloud"
item_color = "cloud"
can_adjust = FALSE
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "captain's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
@@ -218,18 +236,21 @@
item_state = "bl_suit"
item_color = "black_suit"
can_adjust = FALSE
/obj/item/clothing/under/suit_jacket/really_black
name = "executive suit"
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
item_color = "really_black_suit"
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
desc = "A formal trouser suit for women, intended for the station's finest."
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
item_color = "black_suit_fem"
/obj/item/clothing/under/suit_jacket/green
name = "green suit"
desc = "A green suit and yellow necktie. Baller."
@@ -237,48 +258,56 @@
item_state = "dg_suit"
item_color = "green_suit"
can_adjust = FALSE
/obj/item/clothing/under/suit_jacket/red
name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
icon_state = "red_suit"
item_state = "r_suit"
item_color = "red_suit"
/obj/item/clothing/under/suit_jacket/charcoal
name = "charcoal suit"
desc = "A charcoal suit and red tie. Very professional."
icon_state = "charcoal_suit"
item_state = "charcoal_suit"
item_color = "charcoal_suit"
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
desc = "A navy suit and red tie, intended for the station's finest."
icon_state = "navy_suit"
item_state = "navy_suit"
item_color = "navy_suit"
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
desc = "A burgundy suit and black tie. Somewhat formal."
icon_state = "burgundy_suit"
item_state = "burgundy_suit"
item_color = "burgundy_suit"
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
icon_state = "checkered_suit"
item_state = "checkered_suit"
item_color = "checkered_suit"
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit with a yellow tie. Smart, but casual."
icon_state = "tan_suit"
item_state = "tan_suit"
item_color = "tan_suit"
/obj/item/clothing/under/suit_jacket/white
name = "white suit"
desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!"
icon_state = "white_suit"
item_state = "white_suit"
item_color = "white_suit"
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
@@ -286,6 +315,7 @@
item_state = "burial"
item_color = "burial"
has_sensor = NO_SENSORS
/obj/item/clothing/under/skirt/black
name = "black skirt"
desc = "A black skirt, very fancy!"
@@ -294,6 +324,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/skirt/blue
name = "blue skirt"
desc = "A blue, casual skirt."
@@ -303,6 +334,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/skirt/red
name = "red skirt"
desc = "A red, casual skirt."
@@ -312,6 +344,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/skirt/purple
name = "purple skirt"
desc = "A purple, casual skirt."
@@ -321,6 +354,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/schoolgirl
name = "blue schoolgirl uniform"
desc = "It's just like one of my Japanese animes!"
@@ -330,21 +364,25 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/schoolgirl/red
name = "red schoolgirl uniform"
icon_state = "schoolgirlred"
item_state = "schoolgirlred"
item_color = "schoolgirlred"
/obj/item/clothing/under/schoolgirl/green
name = "green schoolgirl uniform"
icon_state = "schoolgirlgreen"
item_state = "schoolgirlgreen"
item_color = "schoolgirlgreen"
/obj/item/clothing/under/schoolgirl/orange
name = "orange schoolgirl uniform"
icon_state = "schoolgirlorange"
item_state = "schoolgirlorange"
item_color = "schoolgirlorange"
/obj/item/clothing/under/overalls
name = "laborer's overalls"
desc = "A set of durable overalls for getting the job done."
@@ -352,6 +390,7 @@
item_state = "lb_suit"
item_color = "overalls"
can_adjust = FALSE
/obj/item/clothing/under/pirate
name = "pirate outfit"
desc = "Yarr."
@@ -359,6 +398,7 @@
item_state = "pirate"
item_color = "pirate"
can_adjust = FALSE
/obj/item/clothing/under/soviet
name = "soviet uniform"
desc = "For the Motherland!"
@@ -366,6 +406,7 @@
item_state = "soviet"
item_color = "soviet"
can_adjust = FALSE
/obj/item/clothing/under/redcoat
name = "redcoat uniform"
desc = "Looks old."
@@ -373,6 +414,7 @@
item_state = "redcoat"
item_color = "redcoat"
can_adjust = FALSE
/obj/item/clothing/under/kilt
name = "kilt"
desc = "Includes shoes and plaid."
@@ -382,6 +424,7 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/kilt/highlander
desc = "You're the only one worthy of this kilt."
@@ -398,6 +441,7 @@
body_parts_covered = CHEST|GROIN|LEGS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/gladiator
name = "gladiator uniform"
desc = "Are you not entertained? Is that not why you are here?"
@@ -408,9 +452,11 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
/obj/item/clothing/under/gladiator/ash_walker
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
has_sensor = NO_SENSORS
/obj/item/clothing/under/sundress
name = "sundress"
desc = "Makes you want to frolic in a field of daisies."
@@ -420,6 +466,7 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/captainparade
name = "captain's parade uniform"
desc = "A captain's luxury-wear, for special occasions."
@@ -427,6 +474,7 @@
item_state = "by_suit"
item_color = "captain_parade"
can_adjust = FALSE
/obj/item/clothing/under/hosparademale
name = "head of security's parade uniform"
desc = "A male head of security's luxury-wear, for special occasions."
@@ -434,6 +482,7 @@
item_state = "r_suit"
item_color = "hos_parade_male"
can_adjust = FALSE
/obj/item/clothing/under/hosparadefem
name = "head of security's parade uniform"
desc = "A female head of security's luxury-wear, for special occasions."
@@ -442,6 +491,7 @@
item_color = "hos_parade_fem"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/assistantformal
name = "assistant's formal uniform"
desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown."
@@ -449,6 +499,7 @@
item_state = "gy_suit"
item_color = "assistant_formal"
can_adjust = FALSE
/obj/item/clothing/under/blacktango
name = "black tango dress"
desc = "Filled with Latin fire."
@@ -457,6 +508,7 @@
item_color = "black_tango"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/stripeddress
name = "striped dress"
desc = "Fashion in space."
@@ -466,6 +518,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_FULL
can_adjust = FALSE
/obj/item/clothing/under/sailordress
name = "sailor dress"
desc = "Formal wear for a leading lady."
@@ -475,6 +528,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/redeveninggown
name = "red evening gown"
desc = "Fancy dress for space bar singers."
@@ -483,6 +537,7 @@
item_color = "red_evening_gown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/maid
name = "maid costume"
desc = "Maid in China."
@@ -492,10 +547,12 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/maid/Initialize()
. = ..()
var/obj/item/clothing/accessory/maidapron/A = new (src)
attach_accessory(A)
/obj/item/clothing/under/janimaid
name = "maid uniform"
desc = "A simple maid uniform for housekeeping."
@@ -505,6 +562,7 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/plaid_skirt
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
@@ -514,6 +572,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
/obj/item/clothing/under/plaid_skirt/blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
@@ -523,6 +582,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
/obj/item/clothing/under/plaid_skirt/purple
name = "purple plaid skirt"
desc = "A preppy purple skirt with a white blouse."
@@ -532,6 +592,7 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
/obj/item/clothing/under/singery
name = "yellow performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -542,6 +603,7 @@
fitted = NO_FEMALE_UNIFORM
alternate_worn_layer = ABOVE_SHOES_LAYER
can_adjust = FALSE
/obj/item/clothing/under/singerb
name = "blue performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -552,6 +614,7 @@
alternate_worn_layer = ABOVE_SHOES_LAYER
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/plaid_skirt/green
name = "green plaid skirt"
desc = "A preppy green skirt with a white blouse."
@@ -561,14 +624,17 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
/obj/item/clothing/under/jester
name = "jester suit"
desc = "A jolly dress, well suited to entertain your master, nuncle."
icon_state = "jester"
item_color = "jester"
can_adjust = FALSE
/obj/item/clothing/under/jester/alt
icon_state = "jester2"
/obj/item/clothing/under/geisha
name = "geisha suit"
desc = "Cute space ninja senpai not included."
@@ -576,12 +642,14 @@
item_color = "geisha"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
/obj/item/clothing/under/villain
name = "villain suit"
desc = "A change of wardrobe is necessary if you ever want to catch a real superhero."
icon_state = "villain"
item_color = "villain"
can_adjust = FALSE
/obj/item/clothing/under/sailor
name = "sailor suit"
desc = "Skipper's in the wardroom drinkin gin'."
@@ -650,6 +718,7 @@
icon_state = "hostanclothes"
item_state = "hostanclothes"
item_color = "hostanclothes"
/obj/item/clothing/under/mummy
name = "mummy wrapping"
desc = "Return the slab or suffer my stale references."
@@ -660,6 +729,7 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
/obj/item/clothing/under/scarecrow
name = "scarecrow clothes"
desc = "Perfect camouflage for hiding in botany."
@@ -670,6 +740,7 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
/obj/item/clothing/under/draculass
name = "draculass coat"
desc = "A dress inspired by the ancient \"Victorian\" era."
@@ -679,6 +750,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
/obj/item/clothing/under/drfreeze
name = "doctor freeze's jumpsuit"
desc = "A modified scientist jumpsuit to look extra cool."
@@ -686,6 +758,7 @@
item_state = "drfreeze"
item_color = "drfreeze"
can_adjust = FALSE
/obj/item/clothing/under/lobster
name = "foam lobster suit"
desc = "Who beheaded the college mascot?"
@@ -694,6 +767,7 @@
item_color = "lobster"
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
/obj/item/clothing/under/gondola
name = "gondola hide suit"
desc = "Now you're cooking."
@@ -701,6 +775,7 @@
item_state = "lb_suit"
item_color = "gondola"
can_adjust = FALSE
/obj/item/clothing/under/skeleton
name = "skeleton jumpsuit"
desc = "A black jumpsuit with a white bone pattern printed on it. Spooky!"
@@ -720,6 +795,14 @@
body_parts_covered = CHEST|GROIN
can_adjust = FALSE
/obj/item/clothing/under/telegram
name = "telegram suit"
desc = "Bright and red, hard to miss. Mostly warn by hotel staff or singing telegram."
icon_state = "telegram"
item_state = "telegram"
body_parts_covered = CHEST|GROIN
can_adjust = FALSE
/obj/item/clothing/under/durathread
name = "durathread jumpsuit"
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."

View File

@@ -45,6 +45,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
throwforce = 100
density = TRUE
anchored = TRUE
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
var/mob/living/wizard
var/z_original = 0
var/destination
@@ -100,9 +101,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
/obj/effect/immovablerod/ex_act(severity, target)
return 0
/obj/structure/closet/supplypod/prevent_content_explosion()
return TRUE
/obj/effect/immovablerod/singularity_act()
return

View File

@@ -21,7 +21,7 @@
/datum/round_event/meteor_wave/setup()
announceWhen = 1
startWhen = rand(180, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
startWhen = rand(60, 90) //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

View File

@@ -133,7 +133,7 @@
shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator)
if(RUSKY_PARTY)
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/service/party]
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/misc/party]
pack.generate(pick_n_take(empty_shuttle_turfs))
shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian)

View File

@@ -21,7 +21,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/datum/hallucination/delusion = 2,
/datum/hallucination/shock = 1,
/datum/hallucination/death = 1,
/datum/hallucination/oh_yeah = 1
/datum/hallucination/oh_yeah = 1,
/datum/hallucination/sleeping_carp = 1
))
@@ -1294,3 +1295,26 @@ GLOBAL_LIST_INIT(hallucination_list, list(
H.preparePixelProjectile(target, start)
H.fire()
qdel(src)
/datum/hallucination/sleeping_carp
/datum/hallucination/sleeping_carp/New(mob/living/carbon/C, forced = TRUE)
set waitfor = FALSE
..()
var/list/mobsyup
for (var/mob/living/carbon/A in orange(C,1))
if (get_dist(C,A) < 2)
LAZYADD(mobsyup,A)
if (!LAZYLEN(mobsyup))
qdel(src)
return
var/mob/living/carbon/G = pick(mobsyup)
if (prob(50))
C.visible_message("<span class='warning'>[C] falls to the ground screaming and clutching [C.p_their()] wrist!</span>", \
"<span class='userdanger'>[G] grabs your wrist and violently wrenches it to the side!</span>")
C.emote("scream")
C.dropItemToGround(C.get_active_held_item())
C.Knockdown(60)
else
to_chat(C,"<span class='userdanger'>[G] violently grabs you!</span>")
qdel(src)

View File

@@ -16,7 +16,7 @@
w_class = WEIGHT_CLASS_SMALL
volume = 80
var/ingMax = 12
var/ingMax = 32
var/list/ingredients = list()
var/ingredients_placement = INGREDIENTS_FILL
var/customname = "custom"
@@ -32,6 +32,8 @@
if(ingredients.len>5)
size = "big"
if(ingredients.len>8)
size = "huge"
if(ingredients.len>16)
size = "monster"
. += "It contains [ingredients.len?"[ingredients_listed]":"no ingredient, "]making a [size]-sized [initial(name)]."

View File

@@ -319,13 +319,13 @@ All foods are distributed among various categories. Use common sense.
if(iscorgi(M))
var/mob/living/L = M
if(bitecount == 0 || prob(50))
M.emote("me", 1, "nibbles away at \the [src]")
M.emote("me", EMOTE_VISIBLE, "nibbles away at \the [src]")
bitecount++
L.taste(reagents) // why should carbons get all the fun?
if(bitecount >= 5)
var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [src] was")
if(sattisfaction_text)
M.emote("me", 1, "[sattisfaction_text]")
M.emote("me", EMOTE_VISIBLE, "[sattisfaction_text]")
qdel(src)
// //////////////////////////////////////////////Store////////////////////////////////////////

View File

@@ -386,7 +386,7 @@
tastes = list("pastry" = 1, "sweetness" = 1)
foodtype = GRAIN
#define PANCAKE_MAX_STACK 10
#define PANCAKE_MAX_STACK 30
/obj/item/reagent_containers/food/snacks/pancakes
name = "pancake"

View File

@@ -4,8 +4,9 @@
#define ICECREAM_PEACH 4
#define ICECREAM_GRAPE 5
#define ICECREAM_BLUE 6
#define CONE_WAFFLE 7
#define CONE_CHOC 8
#define ICECREAM_CUSTOM 7
#define CONE_WAFFLE 8
#define CONE_CHOC 9
@@ -22,17 +23,18 @@
var/list/product_types = list()
var/dispense_flavour = ICECREAM_VANILLA
var/flavour_name = "vanilla"
var/obj/item/reagent_containers/beaker = null
var/static/list/icecream_vat_reagents = list(
"milk" = 5,
"flour" = 5,
"sugar" = 5,
"ice" = 5,
"cocoa" = 5,
"vanilla" = 5,
"berryjuice" = 5,
"singulo" = 5,
"peachjuice" = 5,
"grapejuice" = 5)
"milk" = 6,
"flour" = 6,
"sugar" = 6,
"ice" = 6,
"cocoa" = 6,
"vanilla" = 6,
"berryjuice" = 6,
"singulo" = 6,
"peachjuice" = 6,
"grapejuice" = 6)
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -40,6 +42,8 @@
return list("milk", "ice", "cocoa")
if(ICECREAM_STRAWBERRY)
return list("milk", "ice", "berryjuice")
if(ICECREAM_CUSTOM)
return list("milk", "ice")
if(ICECREAM_PEACH)
return list("milk", "ice", "peachjuice")
if(ICECREAM_GRAPE)
@@ -66,6 +70,8 @@
return "grape"
if(ICECREAM_BLUE)
return "blue"
if(ICECREAM_CUSTOM)
return "custom"
if(CONE_WAFFLE)
return "waffle"
if(CONE_CHOC)
@@ -76,7 +82,7 @@
/obj/machinery/icecream_vat/Initialize()
. = ..()
while(product_types.len < 8)
while(product_types.len < 9)
product_types.Add(5)
create_reagents(100, OPENCONTAINER | NO_REACT)
for(var/reagent in icecream_vat_reagents)
@@ -87,16 +93,23 @@
var/dat
dat += "<b>ICE CREAM</b><br><div class='statusDisplay'>"
dat += "<b>Dispensing: [flavour_name] icecream </b> <br><br>"
dat += "<b>Vanilla ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)<br>"
dat += "<b>Vanilla ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice, vanilla)<br>"
dat += "<b>Strawberry ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_STRAWBERRY]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_STRAWBERRY];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_STRAWBERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)<br>"
dat += "<b>Chocolate ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_CHOCOLATE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CHOCOLATE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CHOCOLATE];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)<br>"
dat += "<b>Peach ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_PEACH]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_PEACH];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_PEACH];amount=5'><b>x5</b></a> [product_types[ICECREAM_PEACH]] dollops left. (Ingredients: milk, ice, peach juice)<br>"
dat += "<b>Grape ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_GRAPE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_GRAPE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_GRAPE];amount=5'><b>x5</b></a> [product_types[ICECREAM_GRAPE]] dollops left. (Ingredients: milk, ice, grape juice)<br>"
dat += "<b>Blue ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br></div>"
dat += "<b>Blue ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br>"
dat += "<b>Custom ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_CUSTOM]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CUSTOM];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CUSTOM];amount=5'><b>x5</b></a> [product_types[ICECREAM_CUSTOM]] dollops left. (Ingredients: milk, ice, optional flavoring)<br></div>"
dat += "<br><b>CONES</b><br><div class='statusDisplay'>"
dat += "<b>Waffle cones:</b> <a href='?src=[REF(src)];cone=[CONE_WAFFLE]'><b>Dispense</b></a> <a href='?src=[REF(src)];make=[CONE_WAFFLE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[CONE_WAFFLE];amount=5'><b>x5</b></a> [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)<br>"
dat += "<b>Chocolate cones:</b> <a href='?src=[REF(src)];cone=[CONE_CHOC]'><b>Dispense</b></a> <a href='?src=[REF(src)];make=[CONE_CHOC];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[CONE_CHOC];amount=5'><b>x5</b></a> [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)<br></div>"
dat += "<br>"
if(beaker)
dat += "<b>BEAKER CONTENT</b><br><div class='statusDisplay'>"
for(var/datum/reagent/R in beaker.reagents.reagent_list)
dat += "[R.name]: [R.volume]u<br>"
dat += "<a href='?src=[REF(src)];refill=1'><b>Refill from beaker</b></a></div>"
dat += "<br>"
dat += "<b>VAT CONTENT</b><br>"
for(var/datum/reagent/R in reagents.reagent_list)
dat += "[R.name]: [R.volume]"
@@ -114,36 +127,60 @@
if(product_types[dispense_flavour] > 0)
visible_message("[icon2html(src, viewers(src))] <span class='info'>[user] scoops delicious [flavour_name] ice cream into [I].</span>")
product_types[dispense_flavour] -= 1
if(beaker && beaker.reagents.total_volume)
I.add_ice_cream(flavour_name, beaker.reagents)
else
I.add_ice_cream(flavour_name)
I.add_ice_cream(flavour_name)
// if(beaker)
// beaker.reagents.trans_to(I, 10)
if(I.reagents.total_volume < 10)
I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume)
updateDialog()
else
to_chat(user, "<span class='warning'>There is not enough ice cream left!</span>")
else
to_chat(user, "<span class='notice'>[O] already has ice cream in it.</span>")
return 1
if(istype(O, /obj/item/reagent_containers) && !(O.item_flags & ABSTRACT) && O.is_open_container())
. = TRUE //no afterattack
var/obj/item/reagent_containers/B = O
if(!user.transferItemToLoc(B, src))
return
replace_beaker(user, B)
to_chat(user, "<span class='notice'>You add [B] to [src].</span>")
updateUsrDialog()
update_icon()
return
else if(O.is_drainable())
return
else
return ..()
/obj/machinery/icecream_vat/proc/RefillFromBeaker()
if(!beaker || !beaker.reagents)
return
for(var/datum/reagent/R in beaker.reagents.reagent_list)
if(R.type in icecream_vat_reagents)
beaker.reagents.trans_id_to(src, R.type, R.volume)
say("Internalizing reagent.")
playsound(src, 'sound/items/drink.ogg', 25, 1)
return
/obj/machinery/icecream_vat/proc/make(mob/user, make_type, amount)
var/recipe_amount = amount * 3 //prevents reagent duping by requring roughly the amount of reagenst you gain back by grinding.
for(var/R in get_ingredient_list(make_type))
if(reagents.has_reagent(R, amount))
if(reagents.has_reagent(R, recipe_amount))
continue
amount = 0
break
if(amount)
for(var/R in get_ingredient_list(make_type))
reagents.remove_reagent(R, amount)
reagents.remove_reagent(R, recipe_amount)
product_types[make_type] += amount
var/flavour = get_flavour_name(make_type)
if(make_type > 4)
src.visible_message("<span class='info'>[user] cooks up some [flavour] cones.</span>")
if(make_type > 7)
visible_message("<span class='info'>[user] cooks up some [flavour] cones.</span>")
else
src.visible_message("<span class='info'>[user] whips up some [flavour] icecream.</span>")
visible_message("<span class='info'>[user] whips up some [flavour] icecream.</span>")
else
to_chat(user, "<span class='warning'>You don't have the ingredients to make this!</span>")
@@ -172,7 +209,10 @@
make(usr, C, amount)
if(href_list["disposeI"])
reagents.del_reagent(href_list["disposeI"])
reagents.del_reagent(text2path(href_list["disposeI"]))
if(href_list["refill"])
RefillFromBeaker()
updateDialog()
@@ -189,15 +229,16 @@
desc = "Delicious waffle cone, but no ice cream."
icon = 'icons/obj/kitchen.dmi'
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
list_reagents = list("nutriment" = 4)
tastes = list("cream" = 2, "waffle" = 1)
var/ice_creamed = 0
var/cone_type
bitesize = 3
foodtype = DAIRY
bitesize = 4
foodtype = DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/icecream/Initialize()
. = ..()
create_reagents(20)
reagents.add_reagent("nutriment", 4)
reagents.maximum_volume = 20
/obj/item/reagent_containers/food/snacks/icecream/proc/set_cone_type(var/cone_name)
cone_type = cone_name
@@ -211,30 +252,53 @@
desc = "Delicious [cone_name] cone, but no ice cream."
/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour_name)
/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(flavour_name, datum/reagents/R = null)
name = "[flavour_name] icecream"
src.add_overlay("icecream_[flavour_name]")
switch (flavour_name) // adding the actual reagents advertised in the ingredient list
if ("vanilla")
desc = "A delicious [cone_type] cone filled with vanilla ice cream. All the other ice creams take content from it."
reagents.add_reagent("vanilla", 3)
filling_color = "#ECE1C1"
if ("chocolate")
desc = "A delicious [cone_type] cone filled with chocolate ice cream. Surprisingly, made with real cocoa."
reagents.add_reagent("cocoa", 2)
reagents.add_reagent("cocoa", 3)
filling_color = "#93673B"
if ("strawberry")
desc = "A delicious [cone_type] cone filled with strawberry ice cream. Definitely not made with real strawberries."
reagents.add_reagent("berryjuice", 2)
reagents.add_reagent("berryjuice", 3)
filling_color = "#EFB4B4"
if ("peach")
desc = "A delicious [cone_type] cone filled with peach ice cream. Definitely made with real peaches!"
reagents.add_reagent("peachjuice", 2)
reagents.add_reagent("peachjuice", 3)
filling_color = "#E78108"
if ("grape")
desc = "A delicious [cone_type] cone filled with grape ice cream. Surprisingly, made with real pink grape, likely not real sugarcanes used."
reagents.add_reagent("grapejuice", 2)
reagents.add_reagent("grapejuice", 3)
filling_color = "#FF1493"
if ("blue")
desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?"
reagents.add_reagent("singulo", 2)
reagents.add_reagent("singulo", 3)
filling_color = "#ACBCED"
if ("mob")
desc = "A suspicious [cone_type] cone filled with bright red ice cream. That's probably not strawberry..."
reagents.add_reagent("liquidgibs", 2)
reagents.add_reagent("liquidgibs", 3)
filling_color = "#EFB4B4"
if ("custom")
if(R && R.total_volume >= 4) //consumable reagents have stronger taste so higher volume will allow non-food flavourings to break through better.
var/mutable_appearance/flavoring = mutable_appearance(icon,"icecream_custom")
var/datum/reagent/master = R.get_master_reagent()
flavoring.color = master.color
filling_color = master.color
name = "[master.name] icecream"
desc = "A delicious [cone_type] cone filled with artisanal icecream. Made with real [master.name]. Ain't that something."
R.trans_to(src, 4)
add_overlay(flavoring)
else
name = "bland icecream"
desc = "A delicious [cone_type] cone filled with anemic, flavorless icecream.You wonder why this was ever scooped.."
add_overlay("icecream_custom")
if(flavour_name != "custom")
src.add_overlay("icecream_[flavour_name]")
ice_creamed = 1
/obj/item/reagent_containers/food/snacks/icecream/proc/add_mob_flavor(var/mob/M)
@@ -246,6 +310,22 @@
new /obj/item/stack/sheet/metal(loc, 4)
qdel(src)
/obj/machinery/icecream_vat/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
replace_beaker(user)
/obj/machinery/icecream_vat/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
beaker.forceMove(drop_location())
if(user && Adjacent(user) && !issiliconoradminghost(user))
user.put_in_hands(beaker)
if(new_beaker)
beaker = new_beaker
else
beaker = null
updateDialog()
return TRUE
#undef ICECREAM_VANILLA
#undef ICECREAM_CHOCOLATE
@@ -253,5 +333,6 @@
#undef ICECREAM_PEACH
#undef ICECREAM_GRAPE
#undef ICECREAM_BLUE
#undef ICECREAM_CUSTOM
#undef CONE_WAFFLE
#undef CONE_CHOC

View File

@@ -144,7 +144,7 @@
else
O.forceMove(src)
return TRUE
///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge
/obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M)
if(!M.put_in_hands(O))
@@ -388,20 +388,27 @@
/obj/machinery/smartfridge/organ
name = "smart organ storage"
desc = "A refrigerated storage unit for organ storage."
max_n_of_items = 20 //vastly lower to prevent processing too long
max_n_of_items = 25 //vastly lower to prevent processing too long
var/repair_rate = 0
/obj/machinery/smartfridge/organ/accept_check(obj/item/O)
if(istype(O, /obj/item/organ))
return TRUE
if(istype(O, /obj/item/reagent_containers/syringe))
return TRUE
if(istype(O, /obj/item/reagent_containers/glass/bottle))
return TRUE
if(istype(O, /obj/item/reagent_containers/medspray))
return TRUE
return FALSE
/obj/machinery/smartfridge/organ/load(obj/item/O)
. = ..()
if(!.) //if the item loads, clear can_decompose
return
var/obj/item/organ/organ = O
organ.organ_flags |= ORGAN_FROZEN
if(istype(O, /obj/item/organ))
var/obj/item/organ/organ = O
organ.organ_flags |= ORGAN_FROZEN
/obj/machinery/smartfridge/organ/RefreshParts()
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
@@ -420,6 +427,17 @@
if(istype(AM))
AM.organ_flags &= ~ORGAN_FROZEN
/obj/machinery/smartfridge/organ/preloaded
initial_contents = list(
/obj/item/reagent_containers/medspray/synthtissue = 1,
/obj/item/reagent_containers/medspray/sterilizine = 1)
/obj/machinery/smartfridge/organ/preloaded/Initialize()
..()
var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach)
var/newtype = pick(list)
load(new newtype(src.loc))
// -----------------------------
// Chemistry Medical Smartfridge
// -----------------------------

View File

@@ -382,7 +382,7 @@
results = list("neurotoxin" = 2)
required_reagents = list("gargleblaster" = 1, "morphine" = 1)
//FermiChem vars: Easy to make, but hard to make potent
OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMin = 100 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 950 // Upper end for above
ExplodeTemp = 999 //Temperature at which reaction explodes
OptimalpHMin = 4.6 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)

View File

@@ -252,12 +252,11 @@
// Spooky Uplink Items //
/////////////////////////
/datum/uplink_item/dangerous/crossbow/candy
/datum/uplink_item/stealthy_weapons/crossbow/candy
name = "Candy Corn Crossbow"
desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!"
category = "Holiday"
item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
cost = 12
surplus = 0
/datum/uplink_item/device_tools/emag/hack_o_lantern

View File

@@ -4,7 +4,7 @@
desc = "Keeps the lil buzzing buggers out of your eyes."
icon_state = "beekeeper"
item_state = "beekeeper"
clothing_flags = THICKMATERIAL | SNUG_FIT
clothing_flags = THICKMATERIAL
/obj/item/clothing/suit/beekeeper_suit

View File

@@ -89,7 +89,7 @@
icon_state = "seed-orange"
species = "orange"
plantname = "Extradimensional Orange Tree"
product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange
product = /obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d
lifespan = 60
endurance = 50
yield = 5
@@ -98,10 +98,10 @@
icon_grow = "lime-grow"
icon_dead = "lime-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05, "haloperidol" = 0.15)
/obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d
seed = /obj/item/seeds/orange
seed = /obj/item/seeds/orange_3d
name = "extradminesional orange"
desc = "You can hardly wrap your head around this thing."
icon_state = "orang"

View File

@@ -1,79 +1,79 @@
/obj/item/seeds/cotton
name = "pack of cotton seeds"
desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
icon_state = "seed-cotton"
species = "cotton"
plantname = "Cotton"
icon_harvest = "cotton-harvest"
product = /obj/item/grown/cotton
lifespan = 35
endurance = 25
maturation = 15
production = 1
yield = 2
potency = 50
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing.dmi'
icon_dead = "cotton-dead"
mutatelist = list(/obj/item/seeds/cotton/durathread)
/obj/item/grown/cotton
seed = /obj/item/seeds/cotton
name = "cotton bundle"
desc = "A fluffy bundle of cotton."
icon_state = "cotton"
force = 0
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 2
throw_range = 3
attack_verb = list("pomfed")
var/cotton_type = /obj/item/stack/sheet/cotton
var/cotton_name = "raw cotton"
/obj/item/grown/cotton/attack_self(mob/user)
user.show_message("<span class='notice'>You pull some [cotton_name] out of the [name]!</span>", 1)
var/seed_modifier = 0
if(seed)
seed_modifier = round(seed.potency / 25)
var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
var/old_cotton_amount = cotton.amount
for(var/obj/item/stack/ST in user.loc)
if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
ST.attackby(cotton, user)
if(cotton.amount > old_cotton_amount)
to_chat(user, "<span class='notice'>You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].</span>")
qdel(src)
//reinforced mutated variant
/obj/item/seeds/cotton/durathread
name = "pack of durathread seeds"
desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly."
icon_state = "seed-durathread"
species = "durathread"
plantname = "Durathread"
icon_harvest = "durathread-harvest"
product = /obj/item/grown/cotton/durathread
lifespan = 80
endurance = 50
maturation = 15
production = 1
yield = 2
potency = 50
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing.dmi'
icon_dead = "cotton-dead"
/obj/item/grown/cotton/durathread
seed = /obj/item/seeds/cotton/durathread
name = "durathread bundle"
desc = "A tough bundle of durathread, good luck unraveling this."
icon_state = "durathread"
force = 5
throwforce = 5
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 2
throw_range = 3
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
cotton_type = /obj/item/stack/sheet/cotton/durathread
cotton_name = "raw durathread"
/obj/item/seeds/cotton
name = "pack of cotton seeds"
desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
icon_state = "seed-cotton"
species = "cotton"
plantname = "Cotton"
icon_harvest = "cotton-harvest"
product = /obj/item/grown/cotton
lifespan = 35
endurance = 25
maturation = 15
production = 1
yield = 2
potency = 50
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing.dmi'
icon_dead = "cotton-dead"
mutatelist = list(/obj/item/seeds/cotton/durathread)
/obj/item/grown/cotton
seed = /obj/item/seeds/cotton
name = "cotton bundle"
desc = "A fluffy bundle of cotton."
icon_state = "cotton"
force = 0
throwforce = 0
w_class = WEIGHT_CLASS_TINY
throw_speed = 2
throw_range = 3
attack_verb = list("pomfed")
var/cotton_type = /obj/item/stack/sheet/cotton
var/cotton_name = "raw cotton"
/obj/item/grown/cotton/attack_self(mob/user)
user.show_message("<span class='notice'>You pull some [cotton_name] out of the [name]!</span>", MSG_VISUAL)
var/seed_modifier = 0
if(seed)
seed_modifier = round(seed.potency / 25)
var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
var/old_cotton_amount = cotton.amount
for(var/obj/item/stack/ST in user.loc)
if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
ST.attackby(cotton, user)
if(cotton.amount > old_cotton_amount)
to_chat(user, "<span class='notice'>You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].</span>")
qdel(src)
//reinforced mutated variant
/obj/item/seeds/cotton/durathread
name = "pack of durathread seeds"
desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly."
icon_state = "seed-durathread"
species = "durathread"
plantname = "Durathread"
icon_harvest = "durathread-harvest"
product = /obj/item/grown/cotton/durathread
lifespan = 80
endurance = 50
maturation = 15
production = 1
yield = 2
potency = 50
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing.dmi'
icon_dead = "cotton-dead"
/obj/item/grown/cotton/durathread
seed = /obj/item/seeds/cotton/durathread
name = "durathread bundle"
desc = "A tough bundle of durathread, good luck unraveling this."
icon_state = "durathread"
force = 5
throwforce = 5
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 2
throw_range = 3
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
cotton_type = /obj/item/stack/sheet/cotton/durathread
cotton_name = "raw durathread"

View File

@@ -56,11 +56,41 @@
/obj/item/reagent_containers/food/snacks/grown/grass/fairy
seed = /obj/item/seeds/grass/fairy
name = "fairygrass"
desc = "Blue, glowing, and smells fainly of mushrooms."
desc = "Glowing, and smells fainly of mushrooms."
icon_state = "fairygrassclump"
filling_color = "#3399ff"
stacktype = /obj/item/stack/tile/fairygrass
/obj/item/reagent_containers/food/snacks/grown/grass/fairy/attack_self(mob/user)
var/datum/plant_gene/trait/glow/G = null
for(var/datum/plant_gene/trait/glow/gene in seed.genes)
G = gene
break
stacktype = initial(stacktype)
if(G)
switch(G.type)
if(/datum/plant_gene/trait/glow/white)
stacktype = /obj/item/stack/tile/fairygrass/white
if(/datum/plant_gene/trait/glow/red)
stacktype = /obj/item/stack/tile/fairygrass/red
if(/datum/plant_gene/trait/glow/yellow)
stacktype = /obj/item/stack/tile/fairygrass/yellow
if(/datum/plant_gene/trait/glow/green)
stacktype = /obj/item/stack/tile/fairygrass/green
if(/datum/plant_gene/trait/glow/blue)
stacktype = /obj/item/stack/tile/fairygrass/blue
if(/datum/plant_gene/trait/glow/purple)
stacktype = /obj/item/stack/tile/fairygrass/purple
if(/datum/plant_gene/trait/glow/pink)
stacktype = /obj/item/stack/tile/fairygrass/pink
. = ..()
// Carpet
/obj/item/seeds/grass/carpet
name = "pack of carpet seeds"

View File

@@ -226,9 +226,12 @@
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
icon_state = "cherry_bomb_lit"
playsound(src, 'sound/effects/fuse.ogg', seed.potency, 0)
addtimer(CALLBACK(src, /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate), rand(50, 100))
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate()
reagents.chem_temp = 1000 //Sets off the black powder
reagents.handle_reactions()
// Lavaland cactus
/obj/item/seeds/lavaland/cactus

View File

@@ -29,7 +29,7 @@
/obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params)
if(W.get_sharpness())
user.show_message("<span class='notice'>You carve a face into [src]!</span>", 1)
user.show_message("<span class='notice'>You carve a face into [src]!</span>", MSG_VISUAL)
new /obj/item/clothing/head/hardhat/pumpkinhead(user.loc)
qdel(src)
return

View File

@@ -51,7 +51,7 @@
/obj/item/grown/log/attackby(obj/item/W, mob/user, params)
if(W.sharpness)
user.show_message("<span class='notice'>You make [plank_name] out of \the [src]!</span>", 1)
user.show_message("<span class='notice'>You make [plank_name] out of \the [src]!</span>", MSG_VISUAL)
var/seed_modifier = 0
if(seed)
seed_modifier = round(seed.potency / 25)

View File

@@ -299,7 +299,7 @@
rate = 0.04
glow_color = "#AAD84B"
datum/plant_gene/trait/glow/white
/datum/plant_gene/trait/glow/white
name = "White Bioluminescence"
glow_color = "#FFFFFF"

View File

@@ -36,7 +36,7 @@
qdel(lateJoinCore)
var/mob/living/silicon/ai/AI = H
AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked.
AI.set_core_display_icon(null, M.client)
AI.set_core_display_icon(M.client)
//we may have been created after our borg
if(SSticker.current_state == GAME_STATE_SETTING_UP)

View File

@@ -7,9 +7,9 @@
/* CIT CHANGE - Pffffffffffffhahahahahhaha-- No.
//aliens are immune to stamina damage.
/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_stamina = 1)
/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1)
return
/mob/living/carbon/alien/setStaminaLoss(amount, updating_stamina = 1)
/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1)
return
*/

View File

@@ -789,9 +789,13 @@
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)))
stat = UNCONSCIOUS
blind_eyes(1)
if(combatmode)
toggle_combat_mode(TRUE, TRUE)
else
if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT))
stat = SOFT_CRIT
if(combatmode)
toggle_combat_mode(TRUE, TRUE)
else
stat = CONSCIOUS
adjust_blindness(-1)
@@ -952,3 +956,8 @@
if(mood)
if(mood.sanity < SANITY_UNSTABLE)
return TRUE
/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE)
if(combatmode)
toggle_combat_mode(TRUE, TRUE)
return ..()

View File

@@ -157,6 +157,11 @@
O.applyOrganDamage(amount, maximum)
O.onDamage(amount, maximum)
/mob/living/carbon/proc/getFailingOrgans()
.=list()
for(var/obj/item/organ/O in internal_organs)
if(O.organ_flags & ORGAN_FAILING)
.+=O
////////////////////////////////////////////

View File

@@ -7,13 +7,15 @@
if(!gibbed)
emote("deathgasp")
if(combatmode)
toggle_combat_mode(TRUE, TRUE)
. = ..()
for(var/T in get_traumas())
var/datum/brain_trauma/BT = T
BT.on_death()
if(SSticker.mode)
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
@@ -63,3 +65,8 @@
var/obj/item/bodypart/BP = X
BP.drop_limb()
BP.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
/mob/living/carbon/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE)
if(combatmode)
toggle_combat_mode(TRUE, TRUE)
return ..()

View File

@@ -38,7 +38,7 @@
continue
. += "<span class='warning'><B>[t_His] [parse_zone(t)] is missing!</B></span>"
var/list/msg = list("<span class='warning'>")
var/list/msg = list()
var/temp = getBruteLoss()
if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy
if(temp)
@@ -78,9 +78,8 @@
if(pulledby && pulledby.grab_state)
msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n"
msg += "</span>"
. += msg.Join("")
if(msg.len)
. += "<span class='warning'>[msg.Join("")]</span>"
if(!appears_dead)
if(stat == UNCONSCIOUS)

View File

@@ -113,7 +113,7 @@
. += "[dicc.desc]"
var/cursed_stuff = attempt_vr(src,"examine_bellies",args) //vore Code
if(!isnull(cursed_stuff))
if(cursed_stuff)
. += cursed_stuff
//END OF CIT CHANGES
@@ -169,7 +169,7 @@
var/r_limbs_missing = 0
for(var/t in missing)
if(t==BODY_ZONE_HEAD)
msg += "<span class='deadsay'><B>[t_His] [parse_zone(t)] is missing!</B><span class='warning'>\n"
msg += "<span class='deadsay'><B>[t_His] [parse_zone(t)] is missing!</B></span>\n"
continue
if(t == BODY_ZONE_L_ARM || t == BODY_ZONE_L_LEG)
l_limbs_missing++
@@ -272,11 +272,10 @@
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
if(reagents.has_reagent("astral"))
msg += "[t_He] have wild, spacey eyes"
if(mind)
msg += " and have a strange, abnormal look to them.\n"
msg += "[t_He] has wild, spacey eyes and they have a strange, abnormal look to them.\n"
else
msg += " and don't look like they're all there.\n"
msg += "[t_He] has wild, spacey eyes and they don't look like they're all there.\n"
if(isliving(user))
var/mob/living/L = user
@@ -287,7 +286,7 @@
msg += "[t_He] seem[p_s()] winded.\n"
if (getToxLoss() >= 10)
msg += "[t_He] seem[p_s()] sickly.\n"
var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
var/datum/component/mood/mood = GetComponent(/datum/component/mood)
if(mood.sanity <= SANITY_DISTURBED)
msg += "[t_He] seem[p_s()] distressed.\n"
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src)
@@ -299,8 +298,6 @@
if (HAS_TRAIT(src, TRAIT_DEAF))
msg += "[t_He] appear[p_s()] to not be responding to noises.\n"
msg += "</span>"
var/obj/item/organ/vocal_cords/Vc = user.getorganslot(ORGAN_SLOT_VOICE)
if(Vc)
if(istype(Vc, /obj/item/organ/vocal_cords/velvet))
@@ -360,7 +357,7 @@
if(R)
. += "<a href='?src=[REF(src)];hud=m;evaluation=1'>\[Medical evaluation\]</a>"
if(traitstring)
. += "<span class='info'>Detected physiological traits:\n[traitstring]"
. += "<span class='info'>Detected physiological traits:\n[traitstring]</span>"

View File

@@ -1043,6 +1043,21 @@
/mob/living/carbon/human/species/golem/plastic
race = /datum/species/golem/plastic
/mob/living/carbon/human/species/golem/bronze
race = /datum/species/golem/bronze
/mob/living/carbon/human/species/golem/cardboard
race = /datum/species/golem/cardboard
/mob/living/carbon/human/species/golem/leather
race = /datum/species/golem/leather
/mob/living/carbon/human/species/golem/bone
race = /datum/species/golem/bone
/mob/living/carbon/human/species/golem/durathread
race = /datum/species/golem/durathread
/mob/living/carbon/human/species/golem/clockwork
race = /datum/species/golem/clockwork

View File

@@ -661,6 +661,12 @@
if(health >= 0)
if(src == M)
if(has_status_effect(STATUS_EFFECT_CHOKINGSTRAND))
to_chat(src, "<span class='notice'>You attempt to remove the durathread strand from around your neck.</span>")
if(do_after(src, 35, null, src))
to_chat(src, "<span class='notice'>You succesfuly remove the durathread strand.</span>")
remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
return
var/to_send = ""
visible_message("[src] examines [p_them()]self.", \
"<span class='notice'>You check yourself for injuries.</span>")

View File

@@ -252,7 +252,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
QDEL_NULL(eyes)
if(should_have_eyes && !eyes)
eyes = new mutanteyes
eyes.Insert(C)
eyes.Insert(C, TRUE)
if(ears && (replace_current || !should_have_ears))
ears.Remove(C,1)
@@ -1537,6 +1537,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.lastattacker = user.real_name
target.lastattackerckey = user.ckey
user.dna.species.spec_unarmedattacked(user, target)
if(user.limb_destroyer)
target.dismembering_strike(user, affecting.body_zone)
@@ -1550,6 +1551,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else if(target.lying)
target.forcesay(GLOB.hit_appends)
/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
return
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
// CITADEL EDIT slap mouthy gits and booty
var/aim_for_mouth = user.zone_selected == "mouth"

View File

@@ -862,27 +862,27 @@
if(M.stat == DEAD) //F
return
if(M == H)
H.show_message("<span class='narsiesmall'>You cringe with pain as your body rings around you!</span>", 2)
H.show_message("<span class='narsiesmall'>You cringe with pain as your body rings around you!</span>", MSG_AUDIBLE)
H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
H.soundbang_act(2, 0, 100, 1)
H.jitteriness += 7
var/distance = max(0,get_dist(get_turf(H),get_turf(M)))
switch(distance)
if(0 to 1)
M.show_message("<span class='narsiesmall'>GONG!</span>", 2)
M.show_message("<span class='narsiesmall'>GONG!</span>", MSG_AUDIBLE)
M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
M.soundbang_act(1, 0, 30, 3)
M.confused += 10
M.jitteriness += 4
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
if(2 to 3)
M.show_message("<span class='cult'>GONG!</span>", 2)
M.show_message("<span class='cult'>GONG!</span>", MSG_AUDIBLE)
M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE)
M.soundbang_act(1, 0, 15, 2)
M.jitteriness += 3
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
else
M.show_message("<span class='warning'>GONG!</span>", 2)
M.show_message("<span class='warning'>GONG!</span>", MSG_AUDIBLE)
M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE)
@@ -944,6 +944,21 @@
grab_sound = 'sound/weapons/whipgrab.ogg'
attack_sound = 'sound/weapons/whip.ogg'
/datum/species/golem/durathread
name = "Durathread Golem"
id = "durathread golem"
prefix = "Durathread"
limbs_id = "d_golem"
special_names = list("Boll","Weave")
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES)
fixed_mut_color = null
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
info_text = "As a <span class='danger'>Durathread Golem</span>, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well."
/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
. = ..()
target.apply_status_effect(STATUS_EFFECT_CHOKINGSTRAND)
/datum/species/golem/bone
name = "Bone Golem"
id = "bone golem"

View File

@@ -85,7 +85,7 @@
return not_handled
/mob/living/carbon/doUnEquip(obj/item/I)
/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
. = ..() //Sets the default return value to what the parent returns.
if(!. || !I) //We don't want to set anything to null if the parent returned 0.
return

View File

@@ -98,7 +98,7 @@
var/datum/gas_mixture/breath
if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || (lungs && lungs.organ_flags & ORGAN_FAILING))
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || HAS_TRAIT(src, TRAIT_MAGIC_CHOKE) || (lungs && lungs.organ_flags & ORGAN_FAILING))
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
else if(health <= crit_threshold)

View File

@@ -63,8 +63,6 @@
var/amount
if(reagents.has_reagent("morphine"))
amount = -1
if(reagents.has_reagent("nuka_cola"))
amount = -1
if(amount)
add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)

View File

@@ -225,10 +225,10 @@
/mob/living/proc/getStaminaLoss()
return staminaloss
/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
/mob/living/proc/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE)
return
/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
/mob/living/proc/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE)
return
// heal ONE external organ, organ gets randomly selected from damaged ones.

View File

@@ -232,12 +232,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// Recompose message for AI hrefs, language incomprehension.
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
show_message(message, 2, deaf_message, deaf_type)
return message
/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
show_message(message, MSG_AUDIBLE, deaf_message, deaf_type)
return message
/mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode)

View File

@@ -36,7 +36,7 @@
var/can_be_carded = TRUE
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
var/viewalerts = 0
var/icon/holo_icon//Default is assigned when AI is created.
var/icon/holo_icon//Female is assigned when AI is created.
var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not.
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
@@ -93,6 +93,7 @@
var/list/all_eyes = list()
var/max_multicams = 6
var/display_icon_override
var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it.
/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
. = ..()
@@ -130,7 +131,7 @@
set_core_display_icon()
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default"))
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"female"))
spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
@@ -175,13 +176,13 @@
fire_stacks = 0
. = ..()
/mob/living/silicon/ai/proc/set_core_display_icon(input, client/C)
/mob/living/silicon/ai/proc/set_core_display_icon(client/C)
if(client && !C)
C = client
if(!input && !C?.prefs?.preferred_ai_core_display)
icon_state = initial(icon_state)
if(!(C?.prefs?.preferred_ai_core_display))
icon_state = display_icon_override || initial(icon_state)
else
var/preferred_icon = input ? input : C.prefs.preferred_ai_core_display
var/preferred_icon = display_icon_override || C.prefs.preferred_ai_core_display
icon_state = resolve_ai_icon(preferred_icon)
/mob/living/silicon/ai/verb/pick_icon()
@@ -202,7 +203,7 @@
if(!ai_core_icon || incapacitated())
return
display_icon_override = ai_core_icon
set_core_display_icon(ai_core_icon)
set_core_display_icon()
/mob/living/silicon/ai/Stat()
..()
@@ -599,12 +600,12 @@
if(incapacitated())
return
var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Thinking", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow")
var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
emote_display = input("Please, select a status!", "AI Status", null, null) in ai_emotions
for (var/each in GLOB.ai_status_displays) //change status of displays
var/obj/machinery/status_display/ai/M = each
M.emotion = emote
M.emotion = emote_display
M.update()
if (emote == "Friend Computer")
if (emote_display == "Friend Computer")
var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
if(!frequency)
@@ -670,10 +671,13 @@
holo_icon = getHologramIcon(icon(icon_list[input], input))
else
var/list/icon_list = list(
"default" = 'icons/mob/ai.dmi',
"female" = 'icons/mob/ai.dmi',
"male" = 'icons/mob/ai.dmi',
"floating face" = 'icons/mob/ai.dmi',
"green face" = 'icons/mob/ai.dmi',
"xeno queen" = 'icons/mob/alien.dmi',
"horror" = 'icons/mob/ai.dmi'
"horror" = 'icons/mob/ai.dmi',
"creature" = 'icons/mob/ai.dmi'
)
input = input("Please select a hologram:") as null|anything in icon_list
@@ -823,7 +827,7 @@
var/rendered = "<i><span class='game say'>[start]<span class='name'>[hrefpart][namepart] ([jobpart])</a> </span><span class='message'>[raw_message]</span></span></i>"
show_message(rendered, 2)
show_message(rendered, MSG_AUDIBLE)
/mob/living/silicon/ai/fully_replace_character_name(oldname,newname)
..()
@@ -883,7 +887,7 @@
. = ..()
if(.) //successfully ressuscitated from death
set_eyeobj_visible(TRUE)
set_core_display_icon(display_icon_override)
set_core_display_icon()
/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
malfhack = null

View File

@@ -3,18 +3,16 @@
if (stat == DEAD)
. += "<span class='deadsay'>It appears to be powered-down.</span>"
else
. += "<span class='warning'>"
if (getBruteLoss())
if (getBruteLoss() < 30)
. += "It looks slightly dented."
. += "<span class='warning'>It looks slightly dented.</span>"
else
. += "<B>It looks severely dented!</B>"
. += "<span class='danger'>It looks severely dented!</span>"
if (getFireLoss())
if (getFireLoss() < 30)
. += "It looks slightly charred."
. += "<span class='warning'>It looks slightly charred.</span>"
else
. += "<B>Its casing is melted and heat-warped!</B>"
. += "</span>"
. += "<span class='danger'>Its casing is melted and heat-warped!</span>"
if(deployed_shell)
. += "The wireless networking light is blinking."
else if (!shunted && !client)

View File

@@ -4,7 +4,7 @@
for(var/each in GLOB.ai_status_displays) //change status
var/obj/machinery/status_display/ai/O = each
O.mode = 1
O.emotion = "Neutral"
O.emotion = emote_display
O.update()
set_eyeobj_visible(TRUE)
if(multicam_on)

View File

@@ -30,10 +30,10 @@
/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
return FALSE
/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE)//immune to stamina damage.
/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)//immune to stamina damage.
return FALSE
/mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1)
/mob/living/silicon/setStaminaLoss(amount, updating_health = 1)
return FALSE
/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500)

View File

@@ -1098,9 +1098,9 @@
status_flags &= ~CANPUSH
if(module.clean_on_move)
AddComponent(/datum/component/cleaning)
AddElement(/datum/element/cleaning)
else
qdel(GetComponent(/datum/component/cleaning))
RemoveElement(/datum/element/cleaning)
hat_offset = module.hat_offset
@@ -1295,6 +1295,6 @@
bellyup = 1
update_icons()
/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1)
/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_health = 1)
if(istype(cell))
cell.charge -= amount*5

View File

@@ -13,6 +13,7 @@
mob_biotypes = list(MOB_ROBOTIC)
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
speech_span = SPAN_ROBOT
flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1
no_vore = TRUE
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
@@ -71,9 +72,6 @@
/mob/living/silicon/contents_explosion(severity, target)
return
/mob/living/silicon/prevent_content_explosion()
return TRUE
/mob/living/silicon/proc/cancelAlarm()
return

View File

@@ -57,3 +57,9 @@
return
to_chat(A, "[src] projects into your mind, <b><i> \"[message]\"</b></i>")
log_game("FERMICHEM: [src] has astrally transmitted [message] into [A]")
//Delete the mob if there's no mind! Pay that mob no mind.
/mob/living/simple_animal/astral/Life()
if(!mind)
qdel(src)
. = ..()

View File

@@ -135,7 +135,7 @@
var/atom/Tsec = drop_location()
var/obj/item/bot_assembly/secbot/Sa = new (Tsec)
Sa.build_step = 1
Sa.build_step = ASSEMBLY_SECOND_STEP
Sa.add_overlay("hs_hole")
Sa.created_name = name
new /obj/item/assembly/prox_sensor(Tsec)

View File

@@ -674,11 +674,11 @@ Pass a positive integer as an argument to override a bot's default speed.
destination = nearest_beacon
//PDA control. Some bots, especially MULEs, may have more parameters.
/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, turf/user_turf, list/user_access = list())
/mob/living/simple_animal/bot/proc/bot_control(command, mob/user, list/user_access = list())
if(!on || emagged == 2 || remote_disabled) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands.
return TRUE //ACCESS DENIED
if(client)
bot_control_message(command,user,user_turf,user_access)
bot_control_message(command, user)
// process control input
switch(command)
if("patroloff")
@@ -690,7 +690,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if("summon")
bot_reset()
summon_target = user_turf
summon_target = get_turf(user)
if(user_access.len != 0)
access_card.access = user_access + prev_access //Adds the user's access, if any.
mode = BOT_SUMMON
@@ -702,15 +702,14 @@ Pass a positive integer as an argument to override a bot's default speed.
return
//
/mob/living/simple_animal/bot/proc/bot_control_message(command,user,user_turf,user_access)
/mob/living/simple_animal/bot/proc/bot_control_message(command, user)
switch(command)
if("patroloff")
to_chat(src, "<span class='warning big'>STOP PATROL</span>")
if("patrolon")
to_chat(src, "<span class='warning big'>START PATROL</span>")
if("summon")
var/area/a = get_area(user_turf)
to_chat(src, "<span class='warning big'>PRIORITY ALERT:[user] in [a.name]!</span>")
to_chat(src, "<span class='warning big'>PRIORITY ALERT:[user] in [get_area_name(user)]!</span>")
if("stop")
to_chat(src, "<span class='warning big'>STOP!</span>")

View File

@@ -101,7 +101,7 @@
if(ASSEMBLY_FOURTH_STEP)
if(istype(W, /obj/item/weldingtool))
if(W.use_tool(src, user, 0, volume=40) && build_step == 4)
if(W.use_tool(src, user, 0, volume=40) && build_step == ASSEMBLY_FOURTH_STEP)
name = "shielded frame assembly"
to_chat(user, "<span class='notice'>You weld the vest to [src].</span>")
build_step++

View File

@@ -379,7 +379,7 @@ Auto Patrol[]"},
var/atom/Tsec = drop_location()
var/obj/item/bot_assembly/ed209/Sa = new (Tsec)
Sa.build_step = 1
Sa.build_step = ASSEMBLY_SECOND_STEP
Sa.add_overlay("hs_hole")
Sa.created_name = name
new /obj/item/assembly/prox_sensor(Tsec)

View File

@@ -218,7 +218,7 @@
bot_control(action, usr) // Kill this later.
. = TRUE
/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0, turf/user_turf, list/user_access = list())
/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = FALSE)
if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires.
return

View File

@@ -411,7 +411,7 @@ Auto Patrol: []"},
var/atom/Tsec = drop_location()
var/obj/item/bot_assembly/secbot/Sa = new (Tsec)
Sa.build_step = 1
Sa.build_step = ASSEMBLY_SECOND_STEP
Sa.add_overlay("hs_hole")
Sa.created_name = name
new /obj/item/assembly/prox_sensor(Tsec)

View File

@@ -169,40 +169,40 @@
/mob/living/simple_animal/pet/cat/Life()
if(!stat && !buckled && !client)
if(prob(1))
emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
emote("me", EMOTE_VISIBLE, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
icon_state = "[icon_living]_rest"
collar_type = "[initial(collar_type)]_rest"
resting = 1
update_canmove()
else if (prob(1))
emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert."))
emote("me", EMOTE_VISIBLE, pick("sits down.", "crouches on its hind legs.", "looks alert."))
icon_state = "[icon_living]_sit"
collar_type = "[initial(collar_type)]_sit"
resting = 1
update_canmove()
else if (prob(1))
if (resting)
emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting."))
emote("me", EMOTE_VISIBLE, pick("gets up and meows.", "walks around.", "stops resting."))
icon_state = "[icon_living]"
collar_type = "[initial(collar_type)]"
resting = 0
update_canmove()
else
emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
emote("me", EMOTE_VISIBLE, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
//MICE!
if((src.loc) && isturf(src.loc))
if(!stat && !resting && !buckled)
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat && Adjacent(M))
emote("me", 1, "splats \the [M]!")
emote("me", EMOTE_VISIBLE, "splats \the [M]!")
M.splat()
movement_target = null
stop_automated_movement = 0
break
for(var/obj/item/toy/cattoy/T in view(1,src))
if (T.cooldown < (world.time - 400))
emote("me", 1, "bats \the [T] around with its paw!")
emote("me", EMOTE_VISIBLE, "bats \the [T] around with its paw!")
T.cooldown = world.time
..()
@@ -241,10 +241,10 @@
if(change > 0)
if(M && stat != DEAD)
new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "purrs!")
emote("me", EMOTE_VISIBLE, "purrs!")
else
if(M && stat != DEAD)
emote("me", 1, "hisses!")
emote("me", EMOTE_VISIBLE, "hisses!")
/mob/living/simple_animal/pet/cat/cak //I told you I'd do it, Remie
name = "Keeki"
@@ -310,6 +310,7 @@
emote_see = list("looks at you eagerly for pets!", "wiggles enthusiastically.")
gold_core_spawnable = NO_SPAWN
var/pseudo_death = FALSE
var/mob/living/carbon/human/origin
/mob/living/simple_animal/pet/cat/custom_cat/death()
if (pseudo_death == TRUE) //secret cat chem

View File

@@ -459,10 +459,10 @@
movement_target.attack_animal(src)
else if(ishuman(movement_target.loc) )
if(prob(20))
emote("me", 1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
emote("me", EMOTE_VISIBLE, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
if(prob(1))
emote("me", 1, pick("dances around.","chases its tail!"))
emote("me", EMOTE_VISIBLE, pick("dances around.","chases its tail!"))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
setDir(i)
@@ -618,7 +618,7 @@
if(!stat && !resting && !buckled)
if(prob(1))
emote("me", 1, pick("dances around.","chases her tail."))
emote("me", EMOTE_VISIBLE, pick("dances around.","chases her tail."))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
setDir(i)
@@ -629,7 +629,7 @@
if(!stat && !resting && !buckled)
if(prob(1))
emote("me", 1, pick("chases its tail."))
emote("me", EMOTE_VISIBLE, pick("chases its tail."))
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
setDir(i)
@@ -648,8 +648,8 @@
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "yaps happily!")
emote("me", EMOTE_VISIBLE, "yaps happily!")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "pet_corgi", /datum/mood_event/pet_corgi)
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
emote("me", 1, "growls!")
emote("me", EMOTE_VISIBLE, "growls!")

View File

@@ -3,8 +3,8 @@
ranged = 1 //technically
ranged_message = "charges"
ranged_cooldown_time = 20
damage_coeff = list(BRUTE = 0, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5)
playstyle_string = "<span class='holoparasite'>As a <b>charger</b> type you do medium damage, take half damage, immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding.</span>"
damage_coeff = list(BRUTE = 0.2, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5)
playstyle_string = "<span class='holoparasite'>As a <b>charger</b> type you do medium damage, take half damage, have near immunity to brute damage, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding.</span>"
magic_fluff_string = "<span class='holoparasite'>..And draw the Hunter, an alien master of rapid assault.</span>"
tech_fluff_string = "<span class='holoparasite'>Boot sequence complete. Charge modules loaded. Holoparasite swarm online.</span>"
carp_fluff_string = "<span class='holoparasite'>CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs...</span>"

View File

@@ -6,8 +6,8 @@
attack_sound = 'sound/items/welder.ogg'
attacktext = "ignites"
melee_damage_type = BURN
damage_coeff = list(BRUTE = 0.7, BURN = 0, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
playstyle_string = "<span class='holoparasite'>As a <b>chaos</b> type, you take 30% damage reduction to all but burn, which you are immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you.</span>"
damage_coeff = list(BRUTE = 0.7, BURN = 0.1, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
playstyle_string = "<span class='holoparasite'>As a <b>chaos</b> type, you take 30% damage reduction to all but burn, which you are almost immune to. You will ignite any enemy you bump into. in addition, your melee attacks will cause human targets to see everyone as you.</span>"
magic_fluff_string = "<span class='holoparasite'>..And draw the Wizard, bringer of endless chaos!</span>"
tech_fluff_string = "<span class='holoparasite'>Boot sequence complete. Crowd control modules activated. Holoparasite swarm online.</span>"
carp_fluff_string = "<span class='holoparasite'>CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish.</span>"

View File

@@ -168,6 +168,7 @@
/mob/living/simple_animal/hostile/alien/maid/Initialize(mapload)
. = ..()
AddElement(/datum/element/cleaning)
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
if(ismovableatom(target))

View File

@@ -364,7 +364,7 @@
/mob/living/simple_animal/hostile/proc/Aggro()
vision_range = aggro_vision_range
if(target && emote_taunt.len && prob(taunt_chance))
emote("me", 1, "[pick(emote_taunt)] at [target].")
emote("me", EMOTE_VISIBLE, "[pick(emote_taunt)] at [target].")
taunt_chance = max(taunt_chance-7,2)

View File

@@ -651,7 +651,7 @@ Difficulty: Very Hard
L.heal_overall_damage(heal_power, heal_power)
new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse = TRUE, special = FALSE)
/mob/living/simple_animal/hostile/lightgeist/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE)
. = ..()
if(.)
death()

View File

@@ -80,7 +80,7 @@ Difficulty: Medium
return FALSE
return ..()
/mob/living/simple_animal/hostile/megafauna/dragon/visible_message()
/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs)
if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit
return
return ..()

View File

@@ -25,6 +25,7 @@
mob_size = MOB_SIZE_LARGE
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
var/list/crusher_loot
var/medal_type
var/score_type = BOSS_SCORE
@@ -41,9 +42,6 @@
QDEL_NULL(internal)
. = ..()
/mob/living/simple_animal/hostile/megafauna/prevent_content_explosion()
return TRUE
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
if(health > 0)
return
@@ -118,8 +116,10 @@
recovery_time = world.time + buffer_time
/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill)
if(!medal_type || (flags_1 & ADMIN_SPAWNED_1) || !SSmedals.hub_enabled) //Don't award medals if the medal type isn't set
if(!medal_type || (flags_1 & ADMIN_SPAWNED_1)) //Don't award medals if the medal type isn't set
return FALSE
if(!SSmedals.hub_enabled) // This allows subtypes to carry on other special rewards not tied with medals. (such as bubblegum's arena shuttle)
return TRUE
for(var/mob/living/L in view(7,src))
if(L.stat || !L.client)

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