Merge branch 'master' into job-menu-improvements
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
var/F = file("[GLOB.log_directory]/[subject].html")
|
||||
WRITE_FILE(F, "<small>[TIME_STAMP("hh:mm:ss", FALSE)] [REF(src)] ([x],[y],[z])</small> || [src] [message]<br>")
|
||||
|
||||
/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT, INVESTIGATE_NANITES) )
|
||||
/client/proc/investigate_show(subject in list("notes, memos, watchlist", INVESTIGATE_RCD, INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_CIRCUIT, INVESTIGATE_NANITES) )
|
||||
set name = "Investigate"
|
||||
set category = "Admin"
|
||||
if(!holder)
|
||||
|
||||
@@ -78,13 +78,13 @@ GLOBAL_LIST(round_end_notifiees)
|
||||
/datum/tgs_chat_command/notify
|
||||
name = "notify"
|
||||
help_text = "Pings the invoker when the round ends"
|
||||
admin_only = TRUE
|
||||
admin_only = FALSE
|
||||
|
||||
/datum/tgs_chat_command/notify/Run(datum/tgs_chat_user/sender, params)
|
||||
if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted())
|
||||
return "[sender.mention], the round has already ended!"
|
||||
LAZYINITLIST(GLOB.round_end_notifiees)
|
||||
GLOB.round_end_notifiees[sender.mention] = TRUE
|
||||
GLOB.round_end_notifiees["<@[sender.mention]>"] = TRUE
|
||||
return "I will notify [sender.mention] when the round ends."
|
||||
|
||||
/datum/tgs_chat_command/sdql
|
||||
@@ -140,4 +140,4 @@ GLOBAL_LIST(round_end_notifiees)
|
||||
|
||||
log_admin("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
|
||||
message_admins("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
|
||||
return "[params] has been added to the current round's bunker bypass list."
|
||||
return "[params] has been added to the current round's bunker bypass list."
|
||||
|
||||
@@ -21,8 +21,9 @@
|
||||
|
||||
/obj/item/clockwork/construct_chassis/Destroy()
|
||||
GLOB.poi_list -= src
|
||||
var/list/spawners = GLOB.mob_spawners[name]
|
||||
LAZYREMOVE(spawners, src)
|
||||
LAZYREMOVE(GLOB.mob_spawners[name], src)
|
||||
if(!LAZYLEN(GLOB.mob_spawners[name]))
|
||||
GLOB.mob_spawners -= name
|
||||
. = ..()
|
||||
|
||||
/obj/item/clockwork/construct_chassis/examine(mob/user)
|
||||
|
||||
@@ -1,13 +1,21 @@
|
||||
|
||||
//Harvest; activated ly clicking the target, will try to drain their essence.
|
||||
/mob/living/simple_animal/revenant/ClickOn(atom/A, params) //revenants can't interact with the world directly.
|
||||
A.examine(src)
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["alt"])
|
||||
AltClickNoInteract(src, A)
|
||||
return
|
||||
|
||||
if(ishuman(A))
|
||||
if(A in drained_mobs)
|
||||
to_chat(src, "<span class='revenwarning'>[A]'s soul is dead and empty.</span>" )
|
||||
else if(in_range(src, A))
|
||||
Harvest(A)
|
||||
|
||||
|
||||
//Harvest; activated ly clicking the target, will try to drain their essence.
|
||||
/mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target)
|
||||
if(!castcheck(0))
|
||||
return
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
/datum/antagonist/traitor/on_gain()
|
||||
if(owner.current && isAI(owner.current))
|
||||
traitor_kind = TRAITOR_AI
|
||||
|
||||
|
||||
SSticker.mode.traitors += owner
|
||||
owner.special_role = special_role
|
||||
if(give_objectives)
|
||||
@@ -48,7 +48,7 @@
|
||||
A.verbs -= /mob/living/silicon/ai/proc/choose_modules
|
||||
A.malf_picker.remove_malf_verbs(A)
|
||||
qdel(A.malf_picker)
|
||||
|
||||
|
||||
SSticker.mode.traitors -= owner
|
||||
if(!silent && owner.current)
|
||||
to_chat(owner.current,"<span class='userdanger'> You are no longer the [special_role]! </span>")
|
||||
@@ -244,14 +244,16 @@
|
||||
return
|
||||
var/mob/traitor_mob=owner.current
|
||||
|
||||
to_chat(traitor_mob, "<U><B>The Syndicate provided you with the following information on how to identify their agents:</B></U>")
|
||||
to_chat(traitor_mob, "<B>Code Phrase</B>: <span class='danger'>[GLOB.syndicate_code_phrase]</span>")
|
||||
to_chat(traitor_mob, "<B>Code Response</B>: <span class='danger'>[GLOB.syndicate_code_response]</span>")
|
||||
var/phrases = jointext(GLOB.syndicate_code_phrase, ", ")
|
||||
var/responses = jointext(GLOB.syndicate_code_response, ", ")
|
||||
|
||||
antag_memory += "<b>Code Phrase</b>: [GLOB.syndicate_code_phrase]<br>"
|
||||
antag_memory += "<b>Code Response</b>: [GLOB.syndicate_code_response]<br>"
|
||||
var/dat = "<U><B>The Syndicate have provided you with the following codewords to identify fellow agents:</B></U>\n"
|
||||
dat += "<B>Code Phrase</B>: <span class='blue'>[phrases]</span>\n"
|
||||
dat += "<B>Code Response</B>: <span class='red'>[responses]</span>"
|
||||
to_chat(traitor_mob, dat)
|
||||
|
||||
to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.")
|
||||
antag_memory += "<b>Code Phrase</b>: <span class='blue'>[phrases]</span><br>"
|
||||
antag_memory += "<b>Code Response</b>: <span class='red'>[responses]</span><br>"
|
||||
|
||||
/datum/antagonist/traitor/proc/add_law_zero()
|
||||
var/mob/living/silicon/ai/killer = owner.current
|
||||
|
||||
@@ -1,18 +1,22 @@
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine
|
||||
name = "thermomachine"
|
||||
desc = "Heats or cools gas in connected pipes."
|
||||
icon = 'icons/obj/atmospherics/components/thermomachine.dmi'
|
||||
icon_state = "freezer"
|
||||
var/icon_state_off = "freezer"
|
||||
var/icon_state_on = "freezer_1"
|
||||
var/icon_state_open = "freezer-o"
|
||||
|
||||
name = "thermomachine"
|
||||
desc = "Heats or cools gas in connected pipes."
|
||||
|
||||
density = TRUE
|
||||
max_integrity = 300
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30)
|
||||
layer = OBJ_LAYER
|
||||
circuit = /obj/item/circuitboard/machine/thermomachine
|
||||
|
||||
pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
|
||||
|
||||
var/icon_state_off = "freezer"
|
||||
var/icon_state_on = "freezer_1"
|
||||
var/icon_state_open = "freezer-o"
|
||||
|
||||
var/min_temperature = 0
|
||||
var/max_temperature = 0
|
||||
var/target_temperature = T20C
|
||||
@@ -45,6 +49,13 @@
|
||||
if(showpipe)
|
||||
add_overlay(getpipeimage(icon, "scrub_cap", initialize_directions))
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>The thermostat is set to [target_temperature]K ([(T0C-target_temperature)*-1]C).</span>"
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Efficiency <b>[(heat_capacity/5000)*100]%</b>.</span>"
|
||||
. += "<span class='notice'>Temperature range <b>[min_temperature]K - [max_temperature]K ([(T0C-min_temperature)*-1]C - [(T0C-max_temperature)*-1]C)</b>.</span>"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/process_atmos()
|
||||
..()
|
||||
if(!on || !nodes[1])
|
||||
@@ -155,6 +166,16 @@
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/CtrlClick(mob/living/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
on = !on
|
||||
update_icon()
|
||||
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
message_admins("[src.name] was turned [on ? "on" : "off"] [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/freezer
|
||||
name = "freezer"
|
||||
icon_state = "freezer"
|
||||
@@ -174,6 +195,13 @@
|
||||
if(target_temperature == initial(target_temperature))
|
||||
target_temperature = min_temperature
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom
|
||||
name = "cold room freezer"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom/Initialize()
|
||||
. = ..()
|
||||
target_temperature = T0C-80
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/RefreshParts()
|
||||
..()
|
||||
var/L
|
||||
@@ -181,6 +209,15 @@
|
||||
L += M.rating
|
||||
min_temperature = max(T0C - (initial(min_temperature) + L * 15), TCMB) //73.15K with T1 stock parts
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/AltClick(mob/living/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
target_temperature = min_temperature
|
||||
investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
message_admins("[src.name] was minimized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/heater
|
||||
name = "heater"
|
||||
icon_state = "heater"
|
||||
@@ -201,3 +238,12 @@
|
||||
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
|
||||
L += M.rating
|
||||
max_temperature = T20C + (initial(max_temperature) * L) //573.15K with T1 stock parts
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/thermomachine/heater/AltClick(mob/living/user)
|
||||
var/area/A = get_area(src)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
target_temperature = max_temperature
|
||||
investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
message_admins("[src.name] was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
|
||||
|
||||
@@ -72,9 +72,9 @@
|
||||
/obj/effect/mob_spawn/Destroy()
|
||||
GLOB.poi_list -= src
|
||||
var/job_name = job_description ? job_description : name
|
||||
GLOB.mob_spawners -= job_name
|
||||
LAZYREMOVE(GLOB.mob_spawners[job_name], src)
|
||||
if(!LAZYLEN(GLOB.mob_spawners[job_name]))
|
||||
LAZYREMOVE(GLOB.mob_spawners[job_name], src)
|
||||
GLOB.mob_spawners -= job_name
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/proc/can_latejoin() //If it can be taken from the lobby.
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc)
|
||||
var/effectMissile = FALSE //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground
|
||||
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/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/landingSound //Admin sound to play when the pod lands
|
||||
var/openingSound //Admin sound to play when the pod opens
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
/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.
|
||||
return FALSE
|
||||
return FALSE
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -86,13 +86,15 @@
|
||||
/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
|
||||
|
||||
/obj/structure/closet/supplypod/proc/preOpen() //Called before the open() proc. Handles anything that occurs right as the pod lands.
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/B = explosionSize //Mostly because B is more readable than explosionSize :p
|
||||
var/boomTotal = 0 //A counter used to check if the explosion does nothing
|
||||
if (landingSound)
|
||||
playsound(get_turf(src), landingSound, soundVolume, 0, 0)
|
||||
for (var/mob/living/M in T)
|
||||
@@ -108,10 +110,8 @@
|
||||
M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs
|
||||
M.adjustBruteLoss(damage)
|
||||
|
||||
for (var/i in B)
|
||||
boomTotal += i //Count up all the values of the explosion
|
||||
|
||||
if (boomTotal != 0) //If the explosion list isn't all zeroes, call an explosion
|
||||
if (B[1] || B[2] || B[3] || B[4]) //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)
|
||||
@@ -150,10 +150,10 @@
|
||||
playsound(get_turf(holder), leavingSound, soundVolume, 0, 0)
|
||||
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)
|
||||
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)
|
||||
do_sparks(5, TRUE, holder) //Create some sparks right before closing
|
||||
qdel(src) //Delete ourselves and the holder
|
||||
qdel(src) //Delete ourselves and the holder
|
||||
if (holder != src)
|
||||
qdel(holder)
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
name = "captain's beret"
|
||||
desc = "A beret fit for a leader."
|
||||
icon_state = "capberet"
|
||||
dynamic_hair_suffix = ""
|
||||
|
||||
dog_fashion = null
|
||||
|
||||
@@ -62,6 +63,7 @@
|
||||
name = "head of personnel's beret"
|
||||
desc = "The symbol of true bureaucratic micromanagement, although in a fancy form."
|
||||
icon_state = "hopberet"
|
||||
dynamic_hair_suffix = ""
|
||||
|
||||
dog_fashion = null
|
||||
|
||||
|
||||
@@ -100,6 +100,9 @@ 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
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
continue
|
||||
if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
|
||||
continue
|
||||
if(!(MOB_ORGANIC in H.mob_biotypes)) //biotype sleeper bugs strike again, once again making appendicitis pick a target that can't take it
|
||||
continue
|
||||
var/foundAlready = FALSE //don't infect someone that already has appendicitis
|
||||
for(var/datum/disease/appendicitis/A in H.diseases)
|
||||
foundAlready = TRUE
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Food.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Note: When adding food items with dummy parents, make sure to add
|
||||
/// the parent to the exclusion list in code/__HELPERS/unsorted.dm's
|
||||
/// get_random_food proc.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/obj/item/reagent_containers/food
|
||||
possible_transfer_amounts = list()
|
||||
volume = 50 //Sets the default container amount for all food items.
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
"blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"),
|
||||
"cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"),
|
||||
"sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"),
|
||||
"mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."))
|
||||
"mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."),
|
||||
"peanut_butter" = list("peanutbutter", "peanut butter jar", "A deliciously and sticky spread made from peanuts."))
|
||||
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/suicide_act(mob/living/carbon/user)
|
||||
|
||||
@@ -52,6 +52,33 @@
|
||||
list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2)
|
||||
foodtype = GRAIN | FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/jellysandwich/pbj
|
||||
name = "\improper PB & J sandwich"
|
||||
desc = "A grand creation of peanut butter, jelly and bread! An all-american classic."
|
||||
icon_state = "pbjsandwich"
|
||||
tastes = list("bread" = 1, "jelly" = 1, "peanuts" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry
|
||||
bonus_reagents = list("cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
|
||||
foodtype = GRAIN | FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime
|
||||
bonus_reagents = list("slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 2, "slimejelly" = 5, "peanut_butter" = 5, "vitamin" = 2)
|
||||
foodtype = GRAIN | TOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
|
||||
name = "peanut butter sandwich"
|
||||
desc = "You wish you had some jelly to go with this..."
|
||||
icon = 'icons/obj/food/burgerbread.dmi'
|
||||
icon_state = "peanutbuttersandwich"
|
||||
trash = /obj/item/trash/plate
|
||||
bitesize = 3
|
||||
bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 2, "peanut_butter" = 5, "vitamin" = 2)
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/notasandwich
|
||||
name = "not-a-sandwich"
|
||||
desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache."
|
||||
@@ -83,6 +110,19 @@
|
||||
list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2)
|
||||
foodtype = GRAIN | TOXIC | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/peanut_buttertoast
|
||||
name = "peanut butter toast"
|
||||
desc = "A slice of toast covered with delicious peanut butter."
|
||||
icon = 'icons/obj/food/burgerbread.dmi'
|
||||
icon_state = "peanutbuttertoast"
|
||||
trash = /obj/item/trash/plate
|
||||
bitesize = 3
|
||||
bonus_reagents = list("peanut_butter" = 5, "vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 1, "peanut_butter" = 5, "vitamin" = 2)
|
||||
tastes = list("toast" = 1, "peanuts" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/twobread
|
||||
name = "two bread"
|
||||
desc = "This seems awfully bitter."
|
||||
|
||||
@@ -138,6 +138,10 @@
|
||||
for (var/mob/M in src)
|
||||
M.forceMove(drop_location())
|
||||
|
||||
/obj/machinery/processor/container_resist(mob/living/user)
|
||||
user.forceMove(drop_location())
|
||||
user.visible_message("<span class='notice'>[user] crawls free of the processor!</span>")
|
||||
|
||||
/obj/machinery/processor/slime
|
||||
name = "slime processor"
|
||||
desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating."
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/jelliedyoast
|
||||
/datum/crafting_recipe/food/jelliedtoast
|
||||
name = "Jellied toast"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/cherryjelly = 5,
|
||||
@@ -125,6 +125,15 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/peanutbuttertoast
|
||||
name = "Peanut butter toast"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/peanut_butter = 5,
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/peanut_buttertoast
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/twobread
|
||||
name = "Two bread"
|
||||
reqs = list(
|
||||
|
||||
@@ -43,6 +43,48 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/pbj_slimesandwich
|
||||
name = "PB&J sandwich"
|
||||
reqs = list(
|
||||
/datum/reagent/toxin/slimejelly = 5,
|
||||
/datum/reagent/consumable/peanut_butter = 5,
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/pbj_slimesandwich/alt
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/jelliedtoast/slime = 1,
|
||||
/obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
|
||||
)
|
||||
|
||||
/datum/crafting_recipe/food/pbj_sandwich
|
||||
name = "PB&J sandwich"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/cherryjelly = 5,
|
||||
/datum/reagent/consumable/peanut_butter = 5,
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
/datum/crafting_recipe/food/pbj_sandwich/alt
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry = 1,
|
||||
/obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
|
||||
)
|
||||
|
||||
/datum/crafting_recipe/peanutbutter_sandwich
|
||||
name = "Peanut butter sandwich"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/peanut_butter = 5,
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/notasandwich
|
||||
name = "Not a sandwich"
|
||||
reqs = list(
|
||||
|
||||
@@ -303,6 +303,7 @@ h1.alert, h2.alert {color: #000000;}
|
||||
.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
|
||||
.danger {color: #ff0000;}
|
||||
.warning {color: #ff0000; font-style: italic;}
|
||||
.alertwarning {color: #FF0000; font-weight: bold}
|
||||
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
|
||||
.announce {color: #228b22; font-weight: bold;}
|
||||
.boldannounce {color: #ff0000; font-weight: bold;}
|
||||
@@ -316,6 +317,8 @@ h1.alert, h2.alert {color: #000000;}
|
||||
.unconscious {color: #0000ff; font-weight: bold;}
|
||||
.suicide {color: #ff5050; font-style: italic;}
|
||||
.green {color: #03ff39;}
|
||||
.red {color: #FF0000}
|
||||
.blue {color: #215cff}
|
||||
.nicegreen {color: #14a833;}
|
||||
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
|
||||
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
|
||||
|
||||
30
code/modules/hydroponics/grown/peanuts.dm
Normal file
30
code/modules/hydroponics/grown/peanuts.dm
Normal file
@@ -0,0 +1,30 @@
|
||||
/obj/item/seeds/peanutseed
|
||||
name = "pack of peanut seeds"
|
||||
desc = "These seeds grow to produce fruits botanically classified as legumes, but mundanely referred as nuts."
|
||||
icon_state = "seed-peanut"
|
||||
species = "peanut"
|
||||
plantname = "Peanut Vines"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/peanut
|
||||
yield = 6
|
||||
growthstages = 4
|
||||
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
|
||||
reagents_add = list("vitamin" = 0.02, "nutriment" = 0.15, "cooking_oil" = 0.03)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/peanut
|
||||
seed = /obj/item/seeds/peanutseed
|
||||
name = "peanut"
|
||||
desc = "Peanuts for the peanut gallery!" //get me a better description, boys.
|
||||
icon_state = "peanut"
|
||||
filling_color = "#C4AE7A"
|
||||
bitesize = 100
|
||||
foodtype = VEGETABLES
|
||||
dried_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/roasted_peanuts
|
||||
name = "roasted peanuts"
|
||||
desc = "A handful of roasted peanuts, with or without salt."
|
||||
icon_state = "roasted_peanuts"
|
||||
foodtype = VEGETABLES
|
||||
list_reagents = list("nutriment" = 6, "vitamin" = 1)
|
||||
juice_results = list("peanut_butter" = 3)
|
||||
@@ -112,7 +112,7 @@
|
||||
var/brightness = get_pin_data(IC_INPUT, 2)
|
||||
|
||||
if(new_color && isnum(brightness))
|
||||
brightness = CLAMP(brightness, 0, 4)
|
||||
brightness = CLAMP(brightness, 0, 10)
|
||||
light_rgb = new_color
|
||||
light_brightness = brightness
|
||||
|
||||
@@ -411,4 +411,4 @@
|
||||
if(assembly)
|
||||
assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT)
|
||||
else
|
||||
investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
|
||||
investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@
|
||||
default_color = "00FF90"
|
||||
say_mod = "chirps"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
|
||||
mutantlungs = /obj/item/organ/lungs/slime
|
||||
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur") //CIT CHANGE
|
||||
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None") //CIT CHANGE
|
||||
inherent_traits = list(TRAIT_TOXINLOVER)
|
||||
|
||||
@@ -250,38 +250,39 @@
|
||||
//MIASMA
|
||||
if(breath_gases[/datum/gas/miasma])
|
||||
var/miasma_partialpressure = (breath_gases[/datum/gas/miasma]/breath.total_moles())*breath_pressure
|
||||
if(miasma_partialpressure > MINIMUM_MOLES_DELTA_TO_MOVE)
|
||||
|
||||
if(prob(1 * miasma_partialpressure))
|
||||
var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
|
||||
miasma_disease.name = "Unknown"
|
||||
ForceContractDisease(miasma_disease, TRUE, TRUE)
|
||||
if(prob(0.05 * miasma_partialpressure))
|
||||
var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
|
||||
miasma_disease.name = "Unknown"
|
||||
ForceContractDisease(miasma_disease, TRUE, TRUE)
|
||||
|
||||
//Miasma side effects
|
||||
switch(miasma_partialpressure)
|
||||
if(1 to 5)
|
||||
// At lower pp, give out a little warning
|
||||
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
if(prob(5))
|
||||
to_chat(src, "<span class='notice'>There is an unpleasant smell in the air.</span>")
|
||||
if(5 to 20)
|
||||
//At somewhat higher pp, warning becomes more obvious
|
||||
if(prob(15))
|
||||
to_chat(src, "<span class='warning'>You smell something horribly decayed inside this room.</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
|
||||
if(15 to 30)
|
||||
//Small chance to vomit. By now, people have internals on anyway
|
||||
if(prob(5))
|
||||
to_chat(src, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
vomit()
|
||||
if(30 to INFINITY)
|
||||
//Higher chance to vomit. Let the horror start
|
||||
if(prob(25))
|
||||
to_chat(src, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
vomit()
|
||||
else
|
||||
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
//Miasma side effects
|
||||
switch(miasma_partialpressure)
|
||||
if(1 to 5)
|
||||
// At lower pp, give out a little warning
|
||||
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
if(prob(5))
|
||||
to_chat(src, "<span class='notice'>There is an unpleasant smell in the air.</span>")
|
||||
if(5 to 20)
|
||||
//At somewhat higher pp, warning becomes more obvious
|
||||
if(prob(15))
|
||||
to_chat(src, "<span class='warning'>You smell something horribly decayed inside this room.</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
|
||||
if(15 to 30)
|
||||
//Small chance to vomit. By now, people have internals on anyway
|
||||
if(prob(5))
|
||||
to_chat(src, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
vomit()
|
||||
if(30 to INFINITY)
|
||||
//Higher chance to vomit. Let the horror start
|
||||
if(prob(25))
|
||||
to_chat(src, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
vomit()
|
||||
else
|
||||
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
|
||||
|
||||
//Clear all moods if no miasma at all
|
||||
@@ -344,7 +345,7 @@
|
||||
|
||||
var/list/cached_gases = miasma_turf.air.gases
|
||||
|
||||
cached_gases[/datum/gas/miasma] += 0.02
|
||||
cached_gases[/datum/gas/miasma] += 0.1
|
||||
|
||||
/mob/living/carbon/proc/handle_blood()
|
||||
return
|
||||
|
||||
@@ -39,10 +39,21 @@
|
||||
else
|
||||
. = initial(dt.flags) & TONGUELESS_SPEECH
|
||||
|
||||
/mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
|
||||
. = ..()
|
||||
if(!client)
|
||||
return
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/trauma = T
|
||||
message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
|
||||
message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
|
||||
|
||||
if (src.mind.has_antag_datum(/datum/antagonist/traitor))
|
||||
for (var/codeword in GLOB.syndicate_code_phrase)
|
||||
var/regex/codeword_match = new("([codeword])", "ig")
|
||||
message = codeword_match.Replace(message, "<span class='blue'>$1</span>")
|
||||
|
||||
for (var/codeword in GLOB.syndicate_code_response)
|
||||
var/regex/codeword_match = new("([codeword])", "ig")
|
||||
message = codeword_match.Replace(message, "<span class='red'>$1</span>")
|
||||
|
||||
return message
|
||||
|
||||
@@ -229,9 +229,14 @@ 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)
|
||||
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)
|
||||
var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE)
|
||||
var/eavesdrop_range = 0
|
||||
@@ -389,8 +394,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
|
||||
say("#[message]", bubble_type, spans, sanitize, language)
|
||||
/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
|
||||
say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced)
|
||||
|
||||
/mob/living/get_language_holder(shadow=TRUE)
|
||||
if(mind && shadow)
|
||||
|
||||
@@ -580,6 +580,19 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/I) //TODO: make fucking everything up there in that attackby() proc use the proper tool_act() procs. But honestly, who has time for that? 'cause I know for sure that you, the person reading this, sure as hell doesn't.
|
||||
var/validbreakout = FALSE
|
||||
for(var/obj/item/dogborg/sleeper/S in held_items)
|
||||
if(!LAZYLEN(S.contents))
|
||||
continue
|
||||
if(!validbreakout)
|
||||
visible_message("<span class='notice'>[user] wedges [I] into the crevice separating [S] from [src]'s chassis, and begins to pry...</span>", "<span class='notice'>You wedge [I] into the crevice separating [S] from [src]'s chassis, and begin to pry...</span>")
|
||||
validbreakout = TRUE
|
||||
S.go_out()
|
||||
if(validbreakout)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/robot/verb/unlock_own_cover()
|
||||
set category = "Robot Commands"
|
||||
set name = "Unlock Cover"
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
/mob/living/silicon/contents_explosion(severity, target)
|
||||
return
|
||||
|
||||
/mob/living/silicon/prevent_content_explosion()
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/proc/cancelAlarm()
|
||||
return
|
||||
|
||||
|
||||
@@ -28,13 +28,29 @@
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1)
|
||||
childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5)
|
||||
animal_species = /mob/living/simple_animal/pet/dog
|
||||
var/shaved = 0
|
||||
var/obj/item/inventory_head
|
||||
var/obj/item/inventory_back
|
||||
var/nofur = 0 //Corgis that have risen past the material plane of existence.
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
can_be_held = TRUE
|
||||
collar_type = "corgi"
|
||||
var/obj/item/inventory_head
|
||||
var/obj/item/inventory_back
|
||||
var/shaved = FALSE
|
||||
var/nofur = FALSE //Corgis that have risen past the material plane of existence.
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Destroy()
|
||||
QDEL_NULL(inventory_head)
|
||||
QDEL_NULL(inventory_back)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/handle_atom_del(atom/A)
|
||||
if(A == inventory_head)
|
||||
inventory_head = null
|
||||
update_corgi_fluff()
|
||||
regenerate_icons()
|
||||
if(A == inventory_back)
|
||||
inventory_back = null
|
||||
update_corgi_fluff()
|
||||
regenerate_icons()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/pet/dog/pug
|
||||
name = "\improper pug"
|
||||
@@ -80,23 +96,17 @@
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/show_inv(mob/user)
|
||||
user.set_machine(src)
|
||||
if(user.stat)
|
||||
if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = "<div align='center'><b>Inventory of [name]</b></div><p>"
|
||||
if(inventory_head)
|
||||
dat += "<br><b>Head:</b> [inventory_head] (<a href='?src=[REF(src)];remove_inv=head'>Remove</a>)"
|
||||
else
|
||||
dat += "<br><b>Head:</b> <a href='?src=[REF(src)];add_inv=head'>Nothing</a>"
|
||||
if(inventory_back)
|
||||
dat += "<br><b>Back:</b> [inventory_back] (<a href='?src=[REF(src)];remove_inv=back'>Remove</a>)"
|
||||
else
|
||||
dat += "<br><b>Back:</b> <a href='?src=[REF(src)];add_inv=back'>Nothing</a>"
|
||||
dat += "<br><B>Head:</B> <A href='?src=[REF(src)];[inventory_head ? "remove_inv=head'>[inventory_head]" : "add_inv=head'>Nothing"]</A>"
|
||||
dat += "<br><B>Back:</B> <A href='?src=[REF(src)];[inventory_back ? "remove_inv=back'>[inventory_back]" : "add_inv=back'>Nothing"]</A>"
|
||||
dat += "<br><B>Collar:</B> <A href='?src=[REF(src)];[pcollar ? "remove_inv=collar'>[pcollar]" : "add_inv=collar'>Nothing"]</A>"
|
||||
|
||||
user << browse(dat, text("window=mob[];size=325x500", real_name))
|
||||
onclose(user, "mob[real_name]")
|
||||
return
|
||||
user << browse(dat, "window=mob[REF(src)];size=325x500")
|
||||
onclose(user, "mob[REF(src)]")
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/getarmor(def_zone, type)
|
||||
var/armorval = 0
|
||||
@@ -128,7 +138,7 @@
|
||||
if(do_after(user, 50, target = src))
|
||||
user.visible_message("[user] shaves [src]'s hair using \the [O].")
|
||||
playsound(loc, 'sound/items/welder2.ogg', 20, 1)
|
||||
shaved = 1
|
||||
shaved = TRUE
|
||||
icon_living = "[initial(icon_living)]_shaved"
|
||||
icon_dead = "[initial(icon_living)]_shaved_dead"
|
||||
if(stat == CONSCIOUS)
|
||||
@@ -147,18 +157,18 @@
|
||||
L.visible_message("<span class='warning'>[L] scoops up [src]!</span>")
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Topic(href, href_list)
|
||||
if(usr.stat)
|
||||
if(!(iscarbon(usr) || iscyborg(usr)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
usr << browse(null, "window=mob[REF(src)]")
|
||||
usr.unset_machine()
|
||||
return
|
||||
|
||||
//Removing from inventory
|
||||
if(href_list["remove_inv"])
|
||||
if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr)))
|
||||
return
|
||||
var/remove_from = href_list["remove_inv"]
|
||||
switch(remove_from)
|
||||
if(BODY_ZONE_HEAD)
|
||||
if(inventory_head)
|
||||
inventory_head.forceMove(drop_location())
|
||||
usr.put_in_hands(inventory_head)
|
||||
inventory_head = null
|
||||
update_corgi_fluff()
|
||||
regenerate_icons()
|
||||
@@ -167,24 +177,32 @@
|
||||
return
|
||||
if("back")
|
||||
if(inventory_back)
|
||||
inventory_back.forceMove(drop_location())
|
||||
usr.put_in_hands(inventory_back)
|
||||
inventory_back = null
|
||||
update_corgi_fluff()
|
||||
regenerate_icons()
|
||||
else
|
||||
to_chat(usr, "<span class='danger'>There is nothing to remove from its [remove_from].</span>")
|
||||
return
|
||||
if("collar")
|
||||
if(pcollar)
|
||||
usr.put_in_hands(pcollar)
|
||||
pcollar = null
|
||||
update_corgi_fluff()
|
||||
regenerate_icons()
|
||||
|
||||
show_inv(usr)
|
||||
|
||||
//Adding things to inventory
|
||||
else if(href_list["add_inv"])
|
||||
if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr)))
|
||||
return
|
||||
|
||||
var/add_to = href_list["add_inv"]
|
||||
|
||||
switch(add_to)
|
||||
if("collar")
|
||||
add_collar(usr.get_active_held_item(), usr)
|
||||
update_corgi_fluff()
|
||||
|
||||
if(BODY_ZONE_HEAD)
|
||||
place_on_head(usr.get_active_held_item(),usr)
|
||||
|
||||
@@ -229,7 +247,7 @@
|
||||
|
||||
show_inv(usr)
|
||||
else
|
||||
..()
|
||||
return ..()
|
||||
|
||||
//Corgis are supposed to be simpler, so only a select few objects can actually be put
|
||||
//to be compatible with them. The objects are below.
|
||||
@@ -560,7 +578,7 @@
|
||||
icon_state = "void_puppy"
|
||||
icon_living = "void_puppy"
|
||||
icon_dead = "void_puppy_dead"
|
||||
nofur = 1
|
||||
nofur = TRUE
|
||||
unsuitable_atmos_damage = 0
|
||||
minbodytemp = TCMB
|
||||
maxbodytemp = T0C + 40
|
||||
|
||||
@@ -2,21 +2,30 @@
|
||||
icon = 'icons/mob/pets.dmi'
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
|
||||
var/obj/item/clothing/neck/petcollar/pcollar
|
||||
var/collar_type
|
||||
var/unique_pet = FALSE
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
var/unique_pet = FALSE // if the mob can be renamed
|
||||
var/obj/item/clothing/neck/petcollar/pcollar
|
||||
var/collar_type //if the mob has collar sprites, define them.
|
||||
|
||||
/mob/living/simple_animal/pet/handle_atom_del(atom/A)
|
||||
if(A == pcollar)
|
||||
pcollar = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/pet/proc/add_collar(obj/item/clothing/neck/petcollar/P, mob/user)
|
||||
if(QDELETED(P) || pcollar)
|
||||
return
|
||||
if(!user.transferItemToLoc(P, src))
|
||||
return
|
||||
pcollar = P
|
||||
regenerate_icons()
|
||||
to_chat(user, "<span class='notice'>You put the [P] around [src]'s neck.</span>")
|
||||
if(P.tagname && !unique_pet)
|
||||
fully_replace_character_name(null, "\proper [P.tagname]")
|
||||
|
||||
/mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar && collar_type)
|
||||
var/obj/item/clothing/neck/petcollar/P = O
|
||||
pcollar = P.type
|
||||
regenerate_icons()
|
||||
to_chat(user, "<span class='notice'>You put the [P] around [src]'s neck.</span>")
|
||||
if(P.tagname && !unique_pet)
|
||||
real_name = "\proper [P.tagname]"
|
||||
name = real_name
|
||||
qdel(P)
|
||||
add_collar(O, user)
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/newspaper))
|
||||
@@ -35,12 +44,16 @@
|
||||
pcollar = new(src)
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/pet/Destroy()
|
||||
QDEL_NULL(pcollar)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/pet/revive(full_heal = 0, admin_revive = 0)
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
if(collar_type)
|
||||
collar_type = "[initial(collar_type)]"
|
||||
regenerate_icons()
|
||||
. = TRUE
|
||||
|
||||
/mob/living/simple_animal/pet/death(gibbed)
|
||||
..(gibbed)
|
||||
@@ -50,7 +63,8 @@
|
||||
|
||||
/mob/living/simple_animal/pet/gib()
|
||||
if(pcollar)
|
||||
new pcollar(drop_location())
|
||||
pcollar.forceMove(drop_location())
|
||||
pcollar = null
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/pet/regenerate_icons()
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
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
|
||||
|
||||
@@ -181,94 +181,85 @@
|
||||
*/
|
||||
/mob/living/simple_animal/parrot/show_inv(mob/user)
|
||||
user.set_machine(src)
|
||||
var/dat = "<div align='center'><b>Inventory of [name]</b></div><p>"
|
||||
if(ears)
|
||||
dat += "<br><b>Headset:</b> [ears] (<a href='?src=[REF(src)];remove_inv=ears'>Remove</a>)"
|
||||
else
|
||||
dat += "<br><b>Headset:</b> <a href='?src=[REF(src)];add_inv=ears'>Nothing</a>"
|
||||
|
||||
user << browse(dat, "window=mob[real_name];size=325x500")
|
||||
onclose(user, "mob[real_name]")
|
||||
var/dat = "<div align='center'><b>Inventory of [name]</b></div><p>"
|
||||
dat += "<br><B>Headset:</B> <A href='?src=[REF(src)];[ears ? "remove_inv=ears'>[ears]" : "add_inv=ears'>Nothing"]</A>"
|
||||
|
||||
user << browse(dat, "window=mob[REF(src)];size=325x500")
|
||||
onclose(user, "window=mob[REF(src)]")
|
||||
|
||||
|
||||
/mob/living/simple_animal/parrot/Topic(href, href_list)
|
||||
|
||||
//Can the usr physically do this?
|
||||
if(usr.incapacitated() || !usr.Adjacent(loc))
|
||||
if(!(iscarbon(usr) || iscyborg(usr)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
usr << browse(null, "window=mob[REF(src)]")
|
||||
usr.unset_machine()
|
||||
return
|
||||
|
||||
//Is the usr's mob type able to do this? (lolaliens)
|
||||
if(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr))
|
||||
//Removing from inventory
|
||||
if(href_list["remove_inv"])
|
||||
var/remove_from = href_list["remove_inv"]
|
||||
switch(remove_from)
|
||||
if("ears")
|
||||
if(!ears)
|
||||
to_chat(usr, "<span class='warning'>There is nothing to remove from its [remove_from]!</span>")
|
||||
return
|
||||
if(!stat)
|
||||
say("[available_channels.len ? "[pick(available_channels)] " : null]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
ears.forceMove(drop_location())
|
||||
ears = null
|
||||
for(var/possible_phrase in speak)
|
||||
if(copytext(possible_phrase,1,3) in GLOB.department_radio_keys)
|
||||
possible_phrase = copytext(possible_phrase,3)
|
||||
|
||||
//Removing from inventory
|
||||
if(href_list["remove_inv"])
|
||||
var/remove_from = href_list["remove_inv"]
|
||||
switch(remove_from)
|
||||
if("ears")
|
||||
if(ears)
|
||||
if(!stat)
|
||||
if(available_channels.len)
|
||||
src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
else
|
||||
src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||
ears.forceMove(src.loc)
|
||||
ears = null
|
||||
for(var/possible_phrase in speak)
|
||||
if(copytext(possible_phrase,1,3) in GLOB.department_radio_keys)
|
||||
possible_phrase = copytext(possible_phrase,3)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>There is nothing to remove from its [remove_from]!</span>")
|
||||
//Adding things to inventory
|
||||
else if(href_list["add_inv"])
|
||||
var/add_to = href_list["add_inv"]
|
||||
if(!usr.get_active_held_item())
|
||||
to_chat(usr, "<span class='warning'>You have nothing in your hand to put on its [add_to]!</span>")
|
||||
return
|
||||
switch(add_to)
|
||||
if("ears")
|
||||
if(ears)
|
||||
to_chat(usr, "<span class='warning'>It's already wearing something!</span>")
|
||||
return
|
||||
else
|
||||
var/obj/item/item_to_add = usr.get_active_held_item()
|
||||
if(!item_to_add)
|
||||
return
|
||||
|
||||
//Adding things to inventory
|
||||
else if(href_list["add_inv"])
|
||||
var/add_to = href_list["add_inv"]
|
||||
if(!usr.get_active_held_item())
|
||||
to_chat(usr, "<span class='warning'>You have nothing in your hand to put on its [add_to]!</span>")
|
||||
return
|
||||
switch(add_to)
|
||||
if("ears")
|
||||
if(ears)
|
||||
to_chat(usr, "<span class='warning'>It's already wearing something!</span>")
|
||||
if( !istype(item_to_add, /obj/item/radio/headset) )
|
||||
to_chat(usr, "<span class='warning'>This object won't fit!</span>")
|
||||
return
|
||||
else
|
||||
var/obj/item/item_to_add = usr.get_active_held_item()
|
||||
if(!item_to_add)
|
||||
return
|
||||
|
||||
if( !istype(item_to_add, /obj/item/radio/headset) )
|
||||
to_chat(usr, "<span class='warning'>This object won't fit!</span>")
|
||||
return
|
||||
var/obj/item/radio/headset/headset_to_add = item_to_add
|
||||
|
||||
var/obj/item/radio/headset/headset_to_add = item_to_add
|
||||
if(!usr.transferItemToLoc(headset_to_add, src))
|
||||
return
|
||||
ears = headset_to_add
|
||||
to_chat(usr, "<span class='notice'>You fit the headset onto [src].</span>")
|
||||
|
||||
if(!usr.transferItemToLoc(headset_to_add, src))
|
||||
return
|
||||
src.ears = headset_to_add
|
||||
to_chat(usr, "<span class='notice'>You fit the headset onto [src].</span>")
|
||||
clearlist(available_channels)
|
||||
for(var/ch in headset_to_add.channels)
|
||||
switch(ch)
|
||||
if("Engineering")
|
||||
available_channels.Add(":e")
|
||||
if("Command")
|
||||
available_channels.Add(":c")
|
||||
if("Security")
|
||||
available_channels.Add(":s")
|
||||
if("Science")
|
||||
available_channels.Add(":n")
|
||||
if("Medical")
|
||||
available_channels.Add(":m")
|
||||
if("Supply")
|
||||
available_channels.Add(":u")
|
||||
if("Service")
|
||||
available_channels.Add(":v")
|
||||
|
||||
clearlist(available_channels)
|
||||
for(var/ch in headset_to_add.channels)
|
||||
switch(ch)
|
||||
if("Engineering")
|
||||
available_channels.Add(":e")
|
||||
if("Command")
|
||||
available_channels.Add(":c")
|
||||
if("Security")
|
||||
available_channels.Add(":s")
|
||||
if("Science")
|
||||
available_channels.Add(":n")
|
||||
if("Medical")
|
||||
available_channels.Add(":m")
|
||||
if("Supply")
|
||||
available_channels.Add(":u")
|
||||
if("Service")
|
||||
available_channels.Add(":v")
|
||||
|
||||
if(headset_to_add.translate_binary)
|
||||
available_channels.Add(":b")
|
||||
else
|
||||
..()
|
||||
if(headset_to_add.translate_binary)
|
||||
available_channels.Add(":b")
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
break
|
||||
|
||||
if(Target in view(1,src))
|
||||
if(issilicon(Target))
|
||||
if(!CanFeedon(Target)) //If they're not able to be fed upon, ignore them.
|
||||
if(!Atkcool)
|
||||
Atkcool = 1
|
||||
spawn(45)
|
||||
@@ -600,7 +600,8 @@
|
||||
phrases += "[M]... friend..."
|
||||
if (nutrition < get_hunger_nutrition())
|
||||
phrases += "[M]... feed me..."
|
||||
say (pick(phrases))
|
||||
if(!stat)
|
||||
say (pick(phrases))
|
||||
|
||||
/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it
|
||||
if (is_adult)
|
||||
|
||||
@@ -48,34 +48,58 @@
|
||||
var/mob/living/simple_animal/slime/S = owner
|
||||
S.Feed()
|
||||
|
||||
/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M)
|
||||
/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M, silent = FALSE)
|
||||
if(!Adjacent(M))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(buckled)
|
||||
Feedstop()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(issilicon(M))
|
||||
return FALSE
|
||||
|
||||
if(isanimal(M))
|
||||
var/mob/living/simple_animal/S = M
|
||||
if(S.damage_coeff[TOX] <= 0 && S.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us.
|
||||
if(silent)
|
||||
return FALSE
|
||||
to_chat(src, "<span class='warning'>[pick("This subject is incompatible", \
|
||||
"This subject does not have life energy", "This subject is empty", \
|
||||
"I am not satisified", "I can not feed from this subject", \
|
||||
"I do not feel nourished", "This subject is not food")]!</span>")
|
||||
return FALSE
|
||||
|
||||
if(isslime(M))
|
||||
if(silent)
|
||||
return FALSE
|
||||
to_chat(src, "<span class='warning'><i>I can't latch onto another slime...</i></span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(docile)
|
||||
if(silent)
|
||||
return FALSE
|
||||
to_chat(src, "<span class='notice'><i>I'm not hungry anymore...</i></span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(stat)
|
||||
if(silent)
|
||||
return FALSE
|
||||
to_chat(src, "<span class='warning'><i>I must be conscious to do this...</i></span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(M.stat == DEAD)
|
||||
if(silent)
|
||||
return FALSE
|
||||
to_chat(src, "<span class='warning'><i>This subject does not have a strong enough life energy...</i></span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(locate(/mob/living/simple_animal/slime) in M.buckled_mobs)
|
||||
if(silent)
|
||||
return FALSE
|
||||
to_chat(src, "<span class='warning'><i>Another slime is already feeding on this subject...</i></span>")
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/slime/proc/Feedon(mob/living/M)
|
||||
M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon())
|
||||
|
||||
@@ -91,14 +91,15 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
|
||||
if(!totalMembers.len)
|
||||
return
|
||||
|
||||
for(var/X in totalMembers)
|
||||
var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type.
|
||||
if(!A.pipe_vision_img)
|
||||
A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir)
|
||||
A.pipe_vision_img.plane = ABOVE_HUD_PLANE
|
||||
pipes_shown += A.pipe_vision_img
|
||||
if(client)
|
||||
client.images += A.pipe_vision_img
|
||||
if(client)
|
||||
for(var/X in totalMembers)
|
||||
var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type.
|
||||
if(in_view_range(client.mob, A))
|
||||
if(!A.pipe_vision_img)
|
||||
A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir)
|
||||
A.pipe_vision_img.plane = ABOVE_HUD_PLANE
|
||||
client.images += A.pipe_vision_img
|
||||
pipes_shown += A.pipe_vision_img
|
||||
movement_type |= VENTCRAWLING
|
||||
|
||||
|
||||
|
||||
@@ -18,8 +18,8 @@ It is possible to destroy the net by the occupant or someone else.
|
||||
can_buckle = 1
|
||||
buckle_lying = 0
|
||||
buckle_prevents_pull = TRUE
|
||||
var/mob/living/carbon/affecting//Who it is currently affecting, if anyone.
|
||||
var/mob/living/carbon/master//Who shot web. Will let this person know if the net was successful or failed.
|
||||
var/mob/living/carbon/affecting //Who it is currently affecting, if anyone.
|
||||
var/mob/living/carbon/master //Who shot web. Will let this person know if the net was successful or failed.
|
||||
var/check = 15//30 seconds before teleportation. Could be extended I guess.
|
||||
var/success = FALSE
|
||||
|
||||
|
||||
@@ -7,28 +7,26 @@
|
||||
//If there's only one valid target, let's actually try to capture it, rather than forcing
|
||||
//the user to fiddle with the dialog displaying a list of one
|
||||
//Also, let's make this smarter and not list mobs you can't currently net.
|
||||
var/Candidates[]
|
||||
for(var/mob/mob in oview(H))
|
||||
if(!mob.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
|
||||
//to_chat(H, "<span class='warning'>[C.p_they(TRUE)] will bring no honor to your Clan!</span>")
|
||||
var/list/candidates
|
||||
for(var/mob/M in oview(H))
|
||||
if(!M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
|
||||
continue
|
||||
if(locate(/obj/structure/energy_net) in get_turf(mob))//Check if they are already being affected by an energy net.
|
||||
//to_chat(H, "<span class='warning'>[C.p_they(TRUE)] are already trapped inside an energy net!</span>")
|
||||
continue
|
||||
for(var/turf/T in getline(get_turf(H), get_turf(mob)))
|
||||
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
|
||||
//to_chat(H, "<span class='warning'>You may not use an energy net through solid obstacles!</span>")
|
||||
for(var/obj/structure/energy_net/E in get_turf(M))//Check if they are already being affected by an energy net.
|
||||
if(E.affecting == M)
|
||||
continue
|
||||
Candidates+=mob
|
||||
LAZYADD(candidates, M)
|
||||
|
||||
if(Candidates.len == 1)
|
||||
C = Candidates[1]
|
||||
if(!LAZYLEN(candidates))
|
||||
return FALSE
|
||||
|
||||
if(candidates.len == 1)
|
||||
C = candidates[1]
|
||||
else
|
||||
C = input("Select who to capture:","Capture who?",null) as null|mob in Candidates
|
||||
C = input("Select who to capture:","Capture who?",null) as null|mob in candidates
|
||||
|
||||
|
||||
if(QDELETED(C)||!(C in oview(H)))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(!ninjacost(200,N_STEALTH_CANCEL))
|
||||
H.Beam(C,"n_beam",time=15)
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
pressure_resistance = 2
|
||||
grind_results = list("iron" = 2, "iodine" = 1)
|
||||
var/colour = "black" //what colour the ink is!
|
||||
var/traitor_unlock_degrees = 0
|
||||
var/degrees = 0
|
||||
var/font = PEN_FONT
|
||||
|
||||
|
||||
@@ -653,6 +653,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
else
|
||||
L.show_message("<span class='italics'>You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.</span>", 2)
|
||||
|
||||
//Do not blow up our internal radio
|
||||
/obj/machinery/power/supermatter_crystal/contents_explosion(severity, target)
|
||||
return
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/prevent_content_explosion()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/engine
|
||||
is_main_engine = TRUE
|
||||
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
|
||||
if (..()) //successfully firing
|
||||
moveToNullspace()
|
||||
return 1
|
||||
QDEL_NULL(src)
|
||||
return TRUE
|
||||
else
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/obj/item/ammo_casing/caseless/update_icon()
|
||||
..()
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
/obj/item/ammo_casing/caseless/a84mm
|
||||
desc = "An 84mm anti-armour rocket."
|
||||
/obj/item/ammo_casing/caseless/rocket
|
||||
name = "\improper PM-9HE"
|
||||
desc = "An 84mm High Explosive rocket. Fire at people and pray."
|
||||
caliber = "84mm"
|
||||
icon_state = "s-casing-live"
|
||||
icon_state = "srm-8"
|
||||
projectile_type = /obj/item/projectile/bullet/a84mm_he
|
||||
|
||||
/obj/item/ammo_casing/caseless/rocket/hedp
|
||||
name = "\improper PM-9HEDP"
|
||||
desc = "An 84mm High Explosive Dual Purpose rocket. Pointy end toward mechs."
|
||||
caliber = "84mm"
|
||||
icon_state = "84mm-hedp"
|
||||
projectile_type = /obj/item/projectile/bullet/a84mm
|
||||
|
||||
/obj/item/ammo_casing/caseless/a75
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
max_ammo = 1
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/rocketlauncher
|
||||
name = "grenade launcher internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/a84mm
|
||||
name = "rocket launcher internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/rocket
|
||||
caliber = "84mm"
|
||||
max_ammo = 1
|
||||
|
||||
@@ -32,9 +32,10 @@
|
||||
var/fire_delay = 0 //rate of fire for burst firing and semi auto
|
||||
var/firing_burst = 0 //Prevent the weapon from firing again while already firing
|
||||
var/semicd = 0 //cooldown handler
|
||||
var/weapon_weight = WEAPON_LIGHT
|
||||
var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy
|
||||
var/spread = 0 //Spread induced by the gun itself.
|
||||
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
|
||||
var/inaccuracy_modifier = 1
|
||||
|
||||
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
|
||||
@@ -170,7 +171,7 @@
|
||||
return
|
||||
|
||||
if(weapon_weight == WEAPON_HEAVY && user.get_inactive_held_item())
|
||||
to_chat(user, "<span class='userdanger'>You need both hands free to fire [src]!</span>")
|
||||
to_chat(user, "<span class='userdanger'>You need both hands free to fire \the [src]!</span>")
|
||||
return
|
||||
|
||||
//DUAL (or more!) WIELDING
|
||||
@@ -422,7 +423,7 @@
|
||||
if(alight)
|
||||
alight.Remove(user)
|
||||
|
||||
/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params)
|
||||
/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
|
||||
if(!ishuman(user) || !ishuman(target))
|
||||
return
|
||||
|
||||
@@ -438,7 +439,7 @@
|
||||
|
||||
semicd = TRUE
|
||||
|
||||
if(!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)
|
||||
if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
|
||||
if(user)
|
||||
if(user == target)
|
||||
user.visible_message("<span class='notice'>[user] decided not to shoot.</span>")
|
||||
@@ -538,3 +539,13 @@
|
||||
if(A == chambered)
|
||||
chambered = null
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/proc/getinaccuracy(mob/living/user)
|
||||
if(!iscarbon(user))
|
||||
return FALSE
|
||||
else
|
||||
var/mob/living/carbon/holdingdude = user
|
||||
if(istype(holdingdude) && holdingdude.combatmode)
|
||||
return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier)
|
||||
else
|
||||
return ((weapon_weight * 25) * inaccuracy_modifier)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
|
||||
var/obj/item/ammo_box/magazine/magazine
|
||||
var/casing_ejector = TRUE //whether the gun ejects the chambered casing
|
||||
var/magazine_wording = "magazine"
|
||||
|
||||
/obj/item/gun/ballistic/Initialize()
|
||||
. = ..()
|
||||
@@ -57,7 +58,7 @@
|
||||
if (!magazine && istype(AM, mag_type))
|
||||
if(user.transferItemToLoc(AM, src))
|
||||
magazine = AM
|
||||
to_chat(user, "<span class='notice'>You load a new magazine into \the [src].</span>")
|
||||
to_chat(user, "<span class='notice'>You load a new [magazine_wording] into \the [src].</span>")
|
||||
if(magazine.ammo_count())
|
||||
playsound(src, "gun_insert_full_magazine", 70, 1)
|
||||
if(!chambered)
|
||||
@@ -72,7 +73,7 @@
|
||||
to_chat(user, "<span class='warning'>You cannot seem to get \the [src] out of your hands!</span>")
|
||||
return
|
||||
else if (magazine)
|
||||
to_chat(user, "<span class='notice'>There's already a magazine in \the [src].</span>")
|
||||
to_chat(user, "<span class='notice'>There's already a [magazine_wording] in \the [src].</span>")
|
||||
if(istype(A, /obj/item/suppressor))
|
||||
var/obj/item/suppressor/S = A
|
||||
if(!can_suppress)
|
||||
@@ -222,7 +223,7 @@
|
||||
|
||||
/obj/item/suppressor
|
||||
name = "suppressor"
|
||||
desc = "A universal syndicate small-arms suppressor for maximum espionage."
|
||||
desc = "A syndicate small-arms suppressor for maximum espionage."
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "suppressor"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
@@ -231,6 +232,4 @@
|
||||
|
||||
/obj/item/suppressor/specialoffer
|
||||
name = "cheap suppressor"
|
||||
desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits all weapons."
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "suppressor"
|
||||
desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits some weapons."
|
||||
|
||||
@@ -74,25 +74,92 @@
|
||||
update_icon()
|
||||
chamber_round()
|
||||
|
||||
/obj/item/gun/ballistic/automatic/atlauncher
|
||||
desc = "A pre-loaded, single shot anti-armour launcher."
|
||||
name = "anti-armour grenade launcher"
|
||||
/obj/item/gun/ballistic/rocketlauncher
|
||||
name = "\improper PML-9"
|
||||
desc = "A reusable rocket propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel."
|
||||
icon_state = "rocketlauncher"
|
||||
item_state = "rocketlauncher"
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher
|
||||
fire_sound = 'sound/weapons/rocketlaunch.ogg'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
can_suppress = FALSE
|
||||
pin = /obj/item/firing_pin/implant/pindicate
|
||||
burst_size = 1
|
||||
fire_delay = 0
|
||||
select = 0
|
||||
actions_types = list()
|
||||
inaccuracy_modifier = 0.7
|
||||
casing_ejector = FALSE
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
magazine_wording = "rocket"
|
||||
|
||||
/obj/item/gun/ballistic/automatic/atlauncher/attack_self()
|
||||
return
|
||||
/obj/item/gun/ballistic/rocketlauncher/unrestricted
|
||||
pin = /obj/item/firing_pin
|
||||
|
||||
/obj/item/gun/ballistic/automatic/atlauncher/update_icon()
|
||||
..()
|
||||
icon_state = "rocketlauncher[magazine ? "-[get_ammo(1)]" : ""]"
|
||||
/obj/item/gun/ballistic/rocketlauncher/handle_atom_del(atom/A)
|
||||
if(A == chambered)
|
||||
chambered = null
|
||||
if(!QDELETED(magazine))
|
||||
QDEL_NULL(magazine)
|
||||
if(A == magazine)
|
||||
magazine = null
|
||||
if(!QDELETED(chambered))
|
||||
QDEL_NULL(chambered)
|
||||
update_icon()
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/can_shoot()
|
||||
return chambered?.BB
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user)
|
||||
return //too difficult to remove the rocket with TK
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/attack_self(mob/living/user)
|
||||
if(magazine)
|
||||
var/obj/item/ammo_casing/AC = chambered
|
||||
if(AC)
|
||||
if(!user.put_in_hands(AC))
|
||||
AC.bounce_away(FALSE, NONE)
|
||||
to_chat(user, "<span class='notice'>You remove \the [AC] from \the [src]!</span>")
|
||||
playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, TRUE)
|
||||
chambered = null
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's no [magazine_wording] in [src].</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params)
|
||||
if(magazine && istype(A, /obj/item/ammo_casing))
|
||||
if(user.temporarilyRemoveItemFromInventory(A))
|
||||
if(!chambered)
|
||||
to_chat(user, "<span class='notice'>You load a new [A] into \the [src].</span>")
|
||||
playsound(src, "gun_insert_full_magazine", 70, 1)
|
||||
chamber_round()
|
||||
update_icon()
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You cannot seem to get \the [A] out of your hands!</span>")
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/update_icon()
|
||||
icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]"
|
||||
|
||||
/obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='warning'>[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!</span>", \
|
||||
"<span class='userdanger'>You aim [src] at the ground to perform a bisnasty rocket jump...</span>")
|
||||
if(can_shoot())
|
||||
user.notransform = TRUE
|
||||
playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, 1, 5)
|
||||
animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING)
|
||||
sleep(70)
|
||||
animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING)
|
||||
sleep(5)
|
||||
user.notransform = FALSE
|
||||
process_fire(user, user, TRUE)
|
||||
if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good.
|
||||
user.gib()
|
||||
return MANUAL_SUICIDE
|
||||
else
|
||||
sleep(5)
|
||||
shoot_with_empty_chamber(user)
|
||||
sleep(20)
|
||||
user.visible_message("<span class='warning'>[user] looks about the room realizing [user.p_theyre()] still there. [user.p_they(TRUE)] proceed to shove [src] down their throat and choke [user.p_them()]self with it!</span>", \
|
||||
"<span class='userdanger'>You look around after realizing you're still here, then proceed to choke yourself to death with [src]!</span>")
|
||||
sleep(20)
|
||||
return OXYLOSS
|
||||
|
||||
@@ -243,7 +243,7 @@
|
||||
|
||||
/obj/item/gun/energy/printer
|
||||
name = "cyborg lmg"
|
||||
desc = "A machinegun that fires 3d-printed flechettes slowly regenerated using a cyborg's internal power source."
|
||||
desc = "A LMG that fires 3D-printed flechettes. They are slowly resupplied using the cyborg's internal power source."
|
||||
icon_state = "l6closed0"
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
cell_type = "/obj/item/stock_parts/cell/secborg"
|
||||
|
||||
@@ -9,13 +9,14 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/projectile/bullet/a84mm
|
||||
name ="anti-armour rocket"
|
||||
name ="\improper HEDP rocket"
|
||||
desc = "USE A WEEL GUN"
|
||||
icon_state= "atrocket"
|
||||
icon_state= "84mm-hedp"
|
||||
damage = 80
|
||||
var/anti_armour_damage = 200
|
||||
armour_penetration = 100
|
||||
dismemberment = 100
|
||||
ricochets_max = 0
|
||||
|
||||
/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
|
||||
..()
|
||||
@@ -29,17 +30,17 @@
|
||||
S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25)
|
||||
return TRUE
|
||||
|
||||
/obj/item/projectile/bullet/srmrocket
|
||||
name ="SRM-8 Rocket"
|
||||
/obj/item/projectile/bullet/a84mm_he
|
||||
name ="\improper HE missile"
|
||||
desc = "Boom."
|
||||
icon_state = "missile"
|
||||
damage = 30
|
||||
ricochets_max = 0 //it's a MISSILE
|
||||
|
||||
/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0)
|
||||
/obj/item/projectile/bullet/a84mm_he/on_hit(atom/target, blocked=0)
|
||||
..()
|
||||
if(!isliving(target)) //if the target isn't alive, so is a wall or something
|
||||
explosion(target, 0, 1, 2, 4)
|
||||
else
|
||||
explosion(target, 0, 0, 2, 4)
|
||||
return TRUE
|
||||
return TRUE
|
||||
@@ -438,6 +438,14 @@
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/peanut_butter
|
||||
name = "Peanut Butter"
|
||||
id = "peanut_butter"
|
||||
description = "A popular food paste made from ground dry-roasted peanuts."
|
||||
color = "#C29261"
|
||||
nutriment_factor = 15 * REAGENTS_METABOLISM
|
||||
taste_description = "peanuts"
|
||||
|
||||
/datum/reagent/consumable/cornoil
|
||||
name = "Corn Oil"
|
||||
id = "cornoil"
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
|
||||
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
|
||||
T.visible_message("<span class='danger'>The slime extract starts to feel extremely cold!</span>")
|
||||
addtimer(CALLBACK(src, .proc/freeze, holder), 50)
|
||||
var/obj/item/slime_extract/M = holder.my_atom
|
||||
deltimer(M.qdel_timer)
|
||||
@@ -227,7 +227,8 @@
|
||||
if(holder && holder.my_atom)
|
||||
var/turf/open/T = get_turf(holder.my_atom)
|
||||
if(istype(T))
|
||||
T.atmos_spawn_air("nitrogen=50;TEMP=2.7")
|
||||
var/datum/gas/gastype = /datum/gas/nitrogen
|
||||
T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7")
|
||||
|
||||
/datum/chemical_reaction/slime/slimefireproof
|
||||
name = "Slime Fireproof"
|
||||
@@ -370,6 +371,11 @@
|
||||
|
||||
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder)
|
||||
for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
|
||||
if(slime.docile) //Undoes docility, but doesn't make rabid.
|
||||
slime.visible_message("<span class='danger'>[slime] forgets its training, becoming wild once again!</span>")
|
||||
slime.docile = FALSE
|
||||
slime.update_name()
|
||||
continue
|
||||
slime.rabid = 1
|
||||
slime.visible_message("<span class='danger'>The [slime] is driven into a frenzy!</span>")
|
||||
..()
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
|
||||
. = ..()
|
||||
if((!proximity) || !check_allowed_items(target,target_self=1))
|
||||
if((!proximity) || !spillable || !check_allowed_items(target,target_self=1))
|
||||
return
|
||||
|
||||
if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it.
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
|
||||
/datum/design/mech_missile_rack
|
||||
name = "Exosuit Weapon (SRM-8 Missile Rack)"
|
||||
desc = "Allows for the construction of SRM-8 Missile Rack."
|
||||
desc = "Allows for the construction of an SRM-8 Missile Rack."
|
||||
id = "mech_missile_rack"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
|
||||
|
||||
@@ -330,8 +330,8 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/suppressor
|
||||
name = "Universal Suppressor"
|
||||
desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels."
|
||||
name = "Suppressor"
|
||||
desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels."
|
||||
id = "suppressor"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
|
||||
|
||||
@@ -70,9 +70,13 @@
|
||||
rogue_types = list(/datum/nanite_program/brain_decay)
|
||||
|
||||
/datum/nanite_program/brain_heal/check_conditions()
|
||||
if(!host_mob.getBrainLoss())
|
||||
return FALSE
|
||||
return ..()
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(length(C.get_traumas()))
|
||||
return ..()
|
||||
if(host_mob.getBrainLoss())
|
||||
return ..()
|
||||
return FALSE
|
||||
|
||||
/datum/nanite_program/brain_heal/active_effect()
|
||||
host_mob.adjustBrainLoss(-1, TRUE)
|
||||
@@ -187,10 +191,14 @@
|
||||
rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire)
|
||||
|
||||
/datum/nanite_program/brain_heal_advanced/check_conditions()
|
||||
if(!host_mob.getBrainLoss())
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(length(C.get_traumas()))
|
||||
return ..()
|
||||
if(host_mob.getBrainLoss())
|
||||
return ..()
|
||||
return FALSE
|
||||
|
||||
/datum/nanite_program/brain_heal_advanced/active_effect()
|
||||
host_mob.adjustBrainLoss(-2, TRUE)
|
||||
if(iscarbon(host_mob) && prob(10))
|
||||
|
||||
@@ -186,6 +186,7 @@ Chilling extracts:
|
||||
|
||||
/obj/item/slimecross/chilling/sepia/do_effect(mob/user)
|
||||
user.visible_message("<span class='warning'>[src] shatters, freezing time itself!</span>")
|
||||
allies -= user //support class
|
||||
new /obj/effect/timestop(get_turf(user), 2, 300, allies)
|
||||
..()
|
||||
|
||||
@@ -267,7 +268,7 @@ Chilling extracts:
|
||||
addtimer(CALLBACK(src, .proc/boom), 50)
|
||||
|
||||
/obj/item/slimecross/chilling/oil/proc/boom()
|
||||
explosion(get_turf(src), -1, -1, 3, 10) //Large radius, but mostly light damage.
|
||||
explosion(get_turf(src), -1, -1, 10, 0) //Large radius, but mostly light damage, and no flash.
|
||||
qdel(src)
|
||||
|
||||
/obj/item/slimecross/chilling/black
|
||||
@@ -307,4 +308,4 @@ Chilling extracts:
|
||||
user.visible_message("<span class='warning'>[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!</span>")
|
||||
for(var/obj/machinery/door/airlock/door in area)
|
||||
new /obj/effect/forcefield/slimewall/rainbow(door.loc)
|
||||
return ..()
|
||||
return ..()
|
||||
@@ -633,6 +633,12 @@
|
||||
to_chat(user, "<span class='warning'>The slime is dead!</span>")
|
||||
return
|
||||
|
||||
if(M.rabid) //Stops being rabid, but doesn't become truly docile.
|
||||
to_chat(M, "<span class='warning'>You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.</span>")
|
||||
to_chat(user, "<span class='notice'>You feed the slime the potion, calming its rabid rage.</span>")
|
||||
M.rabid = FALSE
|
||||
qdel(src)
|
||||
return
|
||||
M.docile = 1
|
||||
M.nutrition = 700
|
||||
to_chat(M, "<span class='warning'>You absorb the potion and feel your intense desire to feed melt away.</span>")
|
||||
|
||||
@@ -35,7 +35,9 @@
|
||||
|
||||
/obj/item/assault_pod/attack_self(mob/living/user)
|
||||
var/target_area
|
||||
target_area = input("Area to land", "Select a Landing Zone", target_area) in GLOB.teleportlocs
|
||||
target_area = input("Area to land", "Select a Landing Zone", target_area) as null|anything in GLOB.teleportlocs
|
||||
if(!target_area)
|
||||
return
|
||||
var/area/picked_area = GLOB.teleportlocs[target_area]
|
||||
if(!src || QDELETED(src))
|
||||
return
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null)
|
||||
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null, silent = FALSE)
|
||||
if(!isnum(set_coefficient))
|
||||
var/security_num = seclevel2num(get_security_level())
|
||||
switch(security_num)
|
||||
@@ -228,7 +228,8 @@
|
||||
else
|
||||
SSshuttle.emergencyLastCallLoc = null
|
||||
|
||||
priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority")
|
||||
if(!silent)
|
||||
priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority")
|
||||
|
||||
/obj/docking_port/mobile/emergency/cancel(area/signalOrigin)
|
||||
if(mode != SHUTTLE_CALL)
|
||||
|
||||
@@ -42,6 +42,7 @@ GLOBAL_LIST_INIT(summoned_guns, list(
|
||||
/obj/item/gun/ballistic/revolver/grenadelauncher,
|
||||
/obj/item/gun/ballistic/revolver/golden,
|
||||
/obj/item/gun/ballistic/automatic/sniper_rifle,
|
||||
/obj/item/gun/ballistic/rocketlauncher,
|
||||
/obj/item/gun/medbeam,
|
||||
/obj/item/gun/energy/laser/scatter,
|
||||
/obj/item/gun/energy/gravity_gun))
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
/obj/item/organ/cyberimp/chest/reviver
|
||||
name = "Reviver implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
|
||||
desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!"
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#AD0000"
|
||||
slot = ORGAN_SLOT_HEART_AID
|
||||
|
||||
@@ -288,51 +288,52 @@
|
||||
gas_breathed = breath_gases[/datum/gas/stimulum]
|
||||
if (gas_breathed > gas_stimulation_min)
|
||||
var/existing = H.reagents.get_reagent_amount("stimulum")
|
||||
H.reagents.add_reagent("stimulum",max(0, 1 - existing))
|
||||
H.reagents.add_reagent("stimulum", max(0, 5 - existing))
|
||||
breath_gases[/datum/gas/stimulum]-=gas_breathed
|
||||
|
||||
// Miasma
|
||||
if (breath_gases[/datum/gas/miasma])
|
||||
var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma])
|
||||
if(miasma_pp > MINIMUM_MOLES_DELTA_TO_MOVE)
|
||||
|
||||
//Miasma sickness
|
||||
if(prob(0.5 * miasma_pp))
|
||||
var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
|
||||
miasma_disease.name = "Unknown"
|
||||
miasma_disease.try_infect(owner)
|
||||
//Miasma sickness
|
||||
if(prob(0.05 * miasma_pp))
|
||||
var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
|
||||
miasma_disease.name = "Unknown"
|
||||
miasma_disease.try_infect(owner)
|
||||
|
||||
// Miasma side effects
|
||||
switch(miasma_pp)
|
||||
if(1 to 5)
|
||||
// At lower pp, give out a little warning
|
||||
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
if(prob(5))
|
||||
to_chat(owner, "<span class='notice'>There is an unpleasant smell in the air.</span>")
|
||||
if(5 to 15)
|
||||
//At somewhat higher pp, warning becomes more obvious
|
||||
if(prob(15))
|
||||
to_chat(owner, "<span class='warning'>You smell something horribly decayed inside this room.</span>")
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
|
||||
if(15 to 30)
|
||||
//Small chance to vomit. By now, people have internals on anyway
|
||||
if(prob(5))
|
||||
to_chat(owner, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
owner.vomit()
|
||||
if(30 to INFINITY)
|
||||
//Higher chance to vomit. Let the horror start
|
||||
if(prob(15))
|
||||
to_chat(owner, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
owner.vomit()
|
||||
else
|
||||
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
// Miasma side effects
|
||||
switch(miasma_pp)
|
||||
if(1 to 5)
|
||||
// At lower pp, give out a little warning
|
||||
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
if(prob(5))
|
||||
to_chat(owner, "<span class='notice'>There is an unpleasant smell in the air.</span>")
|
||||
if(5 to 15)
|
||||
//At somewhat higher pp, warning becomes more obvious
|
||||
if(prob(15))
|
||||
to_chat(owner, "<span class='warning'>You smell something horribly decayed inside this room.</span>")
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
|
||||
if(15 to 30)
|
||||
//Small chance to vomit. By now, people have internals on anyway
|
||||
if(prob(5))
|
||||
to_chat(owner, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
owner.vomit()
|
||||
if(30 to INFINITY)
|
||||
//Higher chance to vomit. Let the horror start
|
||||
if(prob(15))
|
||||
to_chat(owner, "<span class='warning'>The stench of rotting carcasses is unbearable!</span>")
|
||||
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
|
||||
owner.vomit()
|
||||
else
|
||||
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
|
||||
|
||||
// In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds
|
||||
// Then again, this is a purely hypothetical scenario and hardly reachable
|
||||
owner.adjust_disgust(0.1 * miasma_pp)
|
||||
// In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds
|
||||
// Then again, this is a purely hypothetical scenario and hardly reachable
|
||||
owner.adjust_disgust(0.1 * miasma_pp)
|
||||
|
||||
breath_gases[/datum/gas/miasma]-=gas_breathed
|
||||
breath_gases[/datum/gas/miasma]-=gas_breathed
|
||||
|
||||
// Clear out moods when no miasma at all
|
||||
else
|
||||
@@ -442,3 +443,14 @@
|
||||
heat_level_1_threshold = 400 // better adapted for heat, obv. Lavaland standard is 300
|
||||
heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3
|
||||
|
||||
/obj/item/organ/lungs/slime
|
||||
name = "vacuole"
|
||||
desc = "A large organelle designed to store oxygen and other important gasses."
|
||||
|
||||
safe_toxins_max = 0 //We breathe this to gain POWER.
|
||||
|
||||
/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if (breath.gases[/datum/gas/plasma])
|
||||
var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma])
|
||||
owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
|
||||
|
||||
@@ -57,4 +57,3 @@
|
||||
/obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/uplink, owner, TRUE, FALSE, null, tc_amount)
|
||||
traitor_unlock_degrees = 360
|
||||
|
||||
@@ -85,18 +85,18 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
return pick(4;0.75,2;0.5,1;0.25)
|
||||
|
||||
/datum/uplink_item/proc/purchase(mob/user, datum/component/uplink/U)
|
||||
var/atom/A = spawn_item(item, user)
|
||||
var/atom/A = spawn_item(item, user, U)
|
||||
if(purchase_log_vis && U.purchase_log)
|
||||
U.purchase_log.LogPurchase(A, src, cost)
|
||||
|
||||
/datum/uplink_item/proc/spawn_item(spawn_item, mob/user)
|
||||
if(!spawn_item)
|
||||
/datum/uplink_item/proc/spawn_item(spawn_path, mob/user, datum/component/uplink/U)
|
||||
if(!spawn_path)
|
||||
return
|
||||
var/atom/A
|
||||
if(ispath(spawn_item))
|
||||
A = new spawn_item(get_turf(user))
|
||||
if(ispath(spawn_path))
|
||||
A = new spawn_path(get_turf(user))
|
||||
else
|
||||
A = spawn_item
|
||||
A = spawn_path
|
||||
if(ishuman(user) && istype(A, /obj/item))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.put_in_hands(A))
|
||||
@@ -117,23 +117,23 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/bundles_TC/chemical
|
||||
name = "Bioterror bundle"
|
||||
desc = "For the madman: Contains Bioterror spray, Bioterror grenade, chemicals, syringe gun, box of syringes,\
|
||||
Donksoft assault rifle, and some darts. Remember: Seal suit and equip internals before use."
|
||||
desc = "For the madman: Contains a handheld Bioterror chem sprayer, a Bioterror foam grenade, a box of lethal chemicals, a dart pistol, \
|
||||
box of syringes, Donksoft assault rifle, and some riot darts. Remember: Seal suit and equip internals before use."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
|
||||
cost = 30 // normally 42
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/bulldog
|
||||
name = "Bulldog bundle"
|
||||
desc = "Lean and mean: Optimised for people that want to get up close and personal. Contains the popular \
|
||||
Bulldog shotgun, two 12g drums, and a pair of Thermal imaging goggles."
|
||||
desc = "Lean and mean: Optimized for people that want to get up close and personal. Contains the popular \
|
||||
Bulldog shotgun, a 12g buckshot drum, a 12g taser slug drum and a pair of Thermal imaging goggles."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle
|
||||
cost = 13 // normally 16
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/c20r
|
||||
name = "C-20r bundle"
|
||||
desc = "Old faithful: The classic C-20r, bundled with two magazines, and a (surplus) suppressor at discount price."
|
||||
desc = "Old Faithful: The classic C-20r, bundled with two magazines, and a (surplus) suppressor at discount price."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/c20rbundle
|
||||
cost = 14 // normally 16
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -147,8 +147,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/bundles_TC/medical
|
||||
name = "Medical bundle"
|
||||
desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a Donksoft machine gun, \
|
||||
a box of ammo, and a pair of magboots to rescue your friends in no-gravity environments."
|
||||
desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \
|
||||
a Donksoft LMG, a box of riot darts and a pair of magboots to rescue your friends in no-gravity environments."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
|
||||
cost = 15 // normally 20
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -170,15 +170,18 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/bundles_TC/sniper
|
||||
name = "Sniper bundle"
|
||||
desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, a hollow-point \
|
||||
a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie."
|
||||
desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, \
|
||||
two soporific knockout magazines, a free surplus supressor, and a sharp-looking tactical turtleneck suit. \
|
||||
We'll throw in a free red tie if you order NOW."
|
||||
item = /obj/item/storage/briefcase/sniperbundle
|
||||
cost = 20 // normally 26
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/bundles_TC/firestarter
|
||||
name = "Spetsnaz Pyro bundle"
|
||||
desc = "For systematic suppression of carbon lifeforms in close range: Contains a specialist Pyrotechnic equipment, foreign pistol, two magazines, a pipebomb, and a stimulant syringe."
|
||||
desc = "For systematic suppression of carbon lifeforms in close quarters: Contains a lethal New Russian backpack spray, Elite hardsuit, \
|
||||
Stechkin APS pistol, two magazines, a minibomb and a stimulant syringe. \
|
||||
Order NOW and comrade Boris will throw in an extra tracksuit."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/firestarter
|
||||
cost = 30
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -187,7 +190,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
name = "Syndicate Bundle"
|
||||
desc = "Syndicate Bundles are specialized groups of items that arrive in a plain box. \
|
||||
These items are collectively worth more than 20 telecrystals, but you do not know which specialization \
|
||||
you will receive."
|
||||
you will receive. May contain discontinued and/or exotic items."
|
||||
item = /obj/item/storage/box/syndicate
|
||||
cost = 20
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -216,7 +219,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
var/list/uplink_items = get_uplink_items(SSticker && SSticker.mode? SSticker.mode : null, FALSE)
|
||||
|
||||
var/crate_value = starting_crate_value
|
||||
var/obj/structure/closet/crate/C = spawn_item(/obj/structure/closet/crate, user)
|
||||
var/obj/structure/closet/crate/C = spawn_item(/obj/structure/closet/crate, user, U)
|
||||
if(U.purchase_log)
|
||||
U.purchase_log.LogPurchase(C, src, cost)
|
||||
while(crate_value)
|
||||
@@ -287,6 +290,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
/datum/uplink_item/dangerous
|
||||
category = "Conspicuous and Dangerous Weapons"
|
||||
|
||||
/datum/uplink_item/dangerous/rawketlawnchair
|
||||
name = "84mm Rocket Propelled Grenade Launcher"
|
||||
desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \
|
||||
Guaranteed to send your target out with a bang or your money back!"
|
||||
item = /obj/item/gun/ballistic/rocketlauncher
|
||||
cost = 8
|
||||
surplus = 30
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/dangerous/antitank
|
||||
name = "Anti Tank Pistol"
|
||||
desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all), \
|
||||
@@ -327,7 +339,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/dangerous/bioterror
|
||||
name = "Biohazardous Chemical Sprayer"
|
||||
desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \
|
||||
desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \
|
||||
Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \
|
||||
Use with extreme caution, to prevent exposure to yourself and your fellow operatives."
|
||||
item = /obj/item/reagent_containers/spray/chemsprayer/bioterror
|
||||
@@ -418,7 +430,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
surplus = 30
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/badass/rapid
|
||||
/datum/uplink_item/dangerous/rapid
|
||||
name = "Gloves of the North Star"
|
||||
desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk."
|
||||
item = /obj/item/clothing/gloves/rapid
|
||||
@@ -427,7 +439,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
/datum/uplink_item/dangerous/guardian
|
||||
name = "Holoparasites"
|
||||
desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \
|
||||
organic host as a home base and source of fuel."
|
||||
organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
|
||||
item = /obj/item/storage/box/syndie_kit/guardian
|
||||
cost = 15
|
||||
refundable = TRUE
|
||||
@@ -450,7 +462,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
/datum/uplink_item/dangerous/carbine
|
||||
name = "M-90gl Carbine"
|
||||
desc = "A fully-loaded, specialized three-round burst carbine that fires 5.56mm ammunition from a 30 round magazine \
|
||||
with a togglable 40mm under-barrel grenade launcher."
|
||||
with a toggleable 40mm underbarrel grenade launcher."
|
||||
item = /obj/item/gun/ballistic/automatic/m90
|
||||
cost = 18
|
||||
surplus = 50
|
||||
@@ -490,7 +502,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/dangerous/revolver
|
||||
name = "Syndicate Revolver"
|
||||
desc = "A brutally simple syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
|
||||
desc = "A brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
|
||||
item = /obj/item/gun/ballistic/revolver/syndie
|
||||
cost = 13
|
||||
surplus = 50
|
||||
@@ -498,7 +510,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/dangerous/foamsmg
|
||||
name = "Toy Submachine Gun"
|
||||
desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
|
||||
desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine."
|
||||
item = /obj/item/gun/ballistic/automatic/c20r/toy
|
||||
cost = 5
|
||||
surplus = 0
|
||||
@@ -514,7 +526,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
|
||||
|
||||
/datum/uplink_item/dangerous/foampistol
|
||||
name = "Toy Gun with Riot Darts"
|
||||
name = "Toy Pistol with Riot Darts"
|
||||
desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade \
|
||||
darts effective at incapacitating a target."
|
||||
item = /obj/item/gun/ballistic/automatic/toy/pistol/riot
|
||||
@@ -594,7 +606,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/romerol_kit
|
||||
name = "Romerol"
|
||||
desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
|
||||
desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. \
|
||||
On death, these nodules take control of the dead body, causing limited revivification, \
|
||||
along with slurred speech, aggression, and the ability to infect others with this agent."
|
||||
item = /obj/item/storage/box/syndie_kit/romerol
|
||||
cost = 25
|
||||
cant_discount = TRUE
|
||||
@@ -604,7 +618,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
name = "Sleepy Pen"
|
||||
desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a \
|
||||
strong anesthetic and a chemical that prevents the target from speaking. \
|
||||
The pen holds one dose of the mixture, and can be refilled. Note that before the target \
|
||||
The pen holds one dose of the mixture, and can be refilled with any chemicals. Note that before the target \
|
||||
falls asleep, they will be able to move and act."
|
||||
item = /obj/item/pen/sleepy
|
||||
cost = 4
|
||||
@@ -618,9 +632,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
include_modes = list(/datum/game_mode/nuclear/clown_ops)
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/suppressor
|
||||
name = "Universal Suppressor"
|
||||
desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the \
|
||||
shots of the weapon for increased stealth and superior ambushing capability."
|
||||
name = "Suppressor"
|
||||
desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. \
|
||||
It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns."
|
||||
item = /obj/item/suppressor
|
||||
cost = 1
|
||||
surplus = 10
|
||||
@@ -655,21 +669,24 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/ammo/pistolap
|
||||
name = "10mm Armour Piercing Magazine"
|
||||
desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. These rounds are less effective at injuring the target but penetrate protective gear."
|
||||
desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \
|
||||
These rounds are less effective at injuring the target but penetrate protective gear."
|
||||
item = /obj/item/ammo_box/magazine/m10mm/ap
|
||||
cost = 2
|
||||
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
|
||||
|
||||
/datum/uplink_item/ammo/pistolhp
|
||||
name = "10mm Hollow Point Magazine"
|
||||
desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. These rounds are more damaging but ineffective against armour."
|
||||
desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \
|
||||
These rounds are more damaging but ineffective against armour."
|
||||
item = /obj/item/ammo_box/magazine/m10mm/hp
|
||||
cost = 3
|
||||
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
|
||||
|
||||
/datum/uplink_item/ammo/pistolfire
|
||||
name = "10mm Incendiary Magazine"
|
||||
desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. Loaded with incendiary rounds which ignite the target."
|
||||
desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \
|
||||
Loaded with incendiary rounds which inflict little damage, but ignite the target."
|
||||
item = /obj/item/ammo_box/magazine/m10mm/fire
|
||||
cost = 2
|
||||
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
|
||||
@@ -706,7 +723,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/ammo/shotgun/meteor
|
||||
name = "12g Meteorslug Shells"
|
||||
desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \
|
||||
Great for blasting airlocks off their frames."
|
||||
Great for blasting airlocks off their frames and knocking down enemies."
|
||||
item = /obj/item/ammo_box/magazine/m12g/meteor
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
@@ -750,13 +767,12 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
name = ".45 Ammo Duffel Bag"
|
||||
desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/ammo/smg
|
||||
cost = 20
|
||||
cost = 20 //instead of 27 TC
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/smg
|
||||
name = ".45 SMG Magazine"
|
||||
desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun. \
|
||||
These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
|
||||
desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun."
|
||||
item = /obj/item/ammo_box/magazine/smgm45
|
||||
cost = 3
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -786,7 +802,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/ammo/carbine
|
||||
name = "5.56mm Toploader Magazine"
|
||||
desc = "An additional 30-round 5.56mm magazine; suitable for use with the M-90gl carbine. \
|
||||
These bullets pack less punch than 1.95mm rounds, but they still offer more power than .45 ammo."
|
||||
These bullets pack less punch than 7.12x82mm rounds, but they still offer more power than .45 ammo."
|
||||
item = /obj/item/ammo_box/magazine/m556
|
||||
cost = 4
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -799,7 +815,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/ammo/machinegun/basic
|
||||
name = "1.95x129mm Box Magazine"
|
||||
desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \
|
||||
By the time you need to use this, you'll already be on a pile of corpses."
|
||||
By the time you need to use this, you'll already be standing on a pile of corpses"
|
||||
item = /obj/item/ammo_box/magazine/mm195x129
|
||||
|
||||
/datum/uplink_item/ammo/machinegun/ap
|
||||
@@ -821,9 +837,25 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn."
|
||||
item = /obj/item/ammo_box/magazine/mm195x129/incen
|
||||
|
||||
/datum/uplink_item/ammo/rocket
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/rocket/basic
|
||||
name = "84mm HE Rocket"
|
||||
desc = "A low-yield anti-personnel HE rocket. Gonna take you out in style!"
|
||||
item = /obj/item/ammo_casing/caseless/rocket
|
||||
cost = 4
|
||||
|
||||
/datum/uplink_item/ammo/rocket/hedp
|
||||
name = "84mm HEDP Rocket"
|
||||
desc = "A high-yield HEDP rocket; extremely effective against armored targets, as well as surrounding personnel. \
|
||||
Strike fear into the hearts of your enemies."
|
||||
item = /obj/item/ammo_casing/caseless/rocket/hedp
|
||||
cost = 6
|
||||
|
||||
/datum/uplink_item/ammo/pistolaps
|
||||
name = "9mm Handgun Magazine"
|
||||
desc = "An additional 15-round 9mm magazine, compatible with the Stetchkin APS pistol, found in the Spetsnaz Pyro bundle."
|
||||
desc = "An additional 15-round 9mm magazine, compatible with the Stechkin APS pistol, found in the Spetsnaz Pyro bundle."
|
||||
item = /obj/item/ammo_box/magazine/pistolm9mm
|
||||
cost = 2
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -847,7 +879,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/ammo/toydarts
|
||||
name = "Box of Riot Darts"
|
||||
desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
|
||||
desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!"
|
||||
item = /obj/item/ammo_box/foambox/riot
|
||||
cost = 2
|
||||
surplus = 0
|
||||
@@ -871,7 +903,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
category = "Grenades and Explosives"
|
||||
|
||||
/datum/uplink_item/explosives/bioterrorfoam
|
||||
name = "Chemical Foam Grenade"
|
||||
name = "Bioterror Foam Grenade"
|
||||
desc = "A powerful chemical foam grenade which creates a deadly torrent of foam that will mute, blind, confuse, \
|
||||
mutate, and irritate carbon lifeforms. Specially brewed by Tiger Cooperative chemical weapons specialists \
|
||||
using additional spore toxin. Ensure suit is sealed before use."
|
||||
@@ -901,7 +933,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/explosives/c4
|
||||
name = "Composition C-4"
|
||||
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, sabotage equipment, or connect \
|
||||
an assembly to it in order to alter the way it detonates. It has a modifiable timer with a \
|
||||
an assembly to it in order to alter the way it detonates. It can be attached to almost all objects and has a modifiable timer with a \
|
||||
minimum setting of 10 seconds."
|
||||
item = /obj/item/grenade/plastic/c4
|
||||
cost = 1
|
||||
@@ -915,8 +947,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/explosives/x4bag
|
||||
name = "Bag of X-4 explosives"
|
||||
desc = "Contains 3 X-4 plastic explosives. Similar, but more powerful than C-4. X-4 can be placed on a solid surface, such as a wall or window, and it will \
|
||||
blast through the wall, injuring anything on the opposite side, while being safer to the user. For when you want a wider, deeper, hole."
|
||||
desc = "Contains 3 X-4 shaped plastic explosives. Similar to C4, but with a stronger blast that is directional instead of circular. \
|
||||
X-4 can be placed on a solid surface, such as a wall or window, and it will blast through the wall, injuring anything on the opposite side, while being safer to the user. \
|
||||
For when you want a controlled explosion that leaves a wider, deeper, hole."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/x4
|
||||
cost = 4 //
|
||||
cant_discount = TRUE
|
||||
@@ -937,16 +970,15 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
name = "Detomatix PDA Cartridge"
|
||||
desc = "When inserted into a personal digital assistant, this cartridge gives you four opportunities to \
|
||||
detonate PDAs of crewmembers who have their message feature enabled. \
|
||||
The concussive effect from the explosion will knock the recipient out for a short period, and deafen \
|
||||
them for longer. Beware, it has a chance to detonate your PDA."
|
||||
The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer."
|
||||
item = /obj/item/cartridge/virus/syndicate
|
||||
cost = 5
|
||||
restricted = TRUE
|
||||
|
||||
/datum/uplink_item/explosives/emp
|
||||
name = "EMP Grenades and Implanter Kit"
|
||||
desc = "A box that contains two EMP grenades and an EMP implant. Useful to disrupt communication, \
|
||||
security's energy weapons, and silicon lifeforms when you're in a tight spot."
|
||||
desc = "A box that contains five EMP grenades and an EMP implant with three uses. Useful to disrupt communications, \
|
||||
security's energy weapons and silicon lifeforms when you're in a tight spot."
|
||||
item = /obj/item/storage/box/syndie_kit/emp
|
||||
cost = 2
|
||||
|
||||
@@ -963,7 +995,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/explosives/grenadier
|
||||
name = "Grenadier's belt"
|
||||
desc = "A belt of a large variety of lethally dangerous and destructive grenades."
|
||||
desc = "A belt containing 26 lethally dangerous and destructive grenades. Comes with an extra multitool and screwdriver."
|
||||
item = /obj/item/storage/belt/grenade/full
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
cost = 22
|
||||
@@ -1050,7 +1082,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/support/reinforcement/assault_borg
|
||||
name = "Syndicate Assault Cyborg"
|
||||
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel."
|
||||
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \
|
||||
Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar."
|
||||
item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
|
||||
refundable = TRUE
|
||||
cost = 65
|
||||
@@ -1058,17 +1091,18 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/support/reinforcement/medical_borg
|
||||
name = "Syndicate Medical Cyborg"
|
||||
desc = "A combat medic cyborg, with potent healing reagents and a medical beam gun, but limited offensive potential."
|
||||
desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities. \
|
||||
It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \
|
||||
Thanks to its organ storage bag, it can perform surgery as well as any humanoid."
|
||||
item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
|
||||
refundable = TRUE
|
||||
cost = 35
|
||||
restricted = TRUE
|
||||
|
||||
/datum/uplink_item/support/gygax
|
||||
name = "Gygax Exosuit"
|
||||
name = "Dark Gygax Exosuit"
|
||||
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \
|
||||
for hit-and-run style attacks. This model lacks a method of space propulsion, and therefore it is \
|
||||
advised to utilize the drop pod if you wish to make use of it."
|
||||
for hit-and-run style attacks. Features an incendiary carbine, flash bang launcher, teleporter, ion thrusters and a Tesla energy array."
|
||||
item = /obj/mecha/combat/gygax/dark/loaded
|
||||
cost = 80
|
||||
|
||||
@@ -1081,8 +1115,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/support/mauler
|
||||
name = "Mauler Exosuit"
|
||||
desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring, \
|
||||
and deployable smoke."
|
||||
desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring \
|
||||
and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array."
|
||||
item = /obj/mecha/combat/marauder/mauler/loaded
|
||||
cost = 140
|
||||
|
||||
@@ -1111,7 +1145,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/stealthy_tools/chameleon
|
||||
name = "Chameleon Kit"
|
||||
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more!"
|
||||
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
|
||||
Due to budget cuts, the shoes don't provide protection against slipping."
|
||||
item = /obj/item/storage/box/syndie_kit/chameleon
|
||||
cost = 2
|
||||
exclude_modes = list(/datum/game_mode/nuclear)
|
||||
@@ -1125,7 +1160,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/stealthy_tools/codespeak_manual
|
||||
name = "Codespeak Manual"
|
||||
desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited used."
|
||||
desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. \
|
||||
This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited uses."
|
||||
item = /obj/item/codespeak_manual/unlimited
|
||||
cost = 3
|
||||
|
||||
@@ -1141,12 +1177,31 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/stealthy_tools/emplight
|
||||
name = "EMP Flashlight"
|
||||
desc = "A small, self-charging, short-ranged EMP device disguised as a flashlight. \
|
||||
Useful for disrupting headsets, cameras, and borgs during stealth operations."
|
||||
desc = "A small, self-recharging, short-ranged EMP device disguised as a working flashlight. \
|
||||
Useful for disrupting headsets, cameras, doors, lockers and borgs during stealth operations. \
|
||||
Attacking a target with this flashlight will direct an EM pulse at it and consumes a charge."
|
||||
item = /obj/item/flashlight/emp
|
||||
cost = 2
|
||||
surplus = 30
|
||||
|
||||
/datum/uplink_item/stealthy_tools/failsafe
|
||||
name = "Failsafe Uplink Code"
|
||||
desc = "When entered the uplink will self-destruct immidiately."
|
||||
item = /obj/effect/gibspawner/generic
|
||||
cost = 1
|
||||
surplus = 0
|
||||
restricted = TRUE
|
||||
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
|
||||
|
||||
/datum/uplink_item/stealthy_tools/failsafe/spawn_item(spawn_path, mob/user, datum/component/uplink/U)
|
||||
if(!U)
|
||||
return
|
||||
U.failsafe_code = U.generate_code()
|
||||
to_chat(user, "The new failsafe code for this uplink is now : [U.failsafe_code].")
|
||||
if(user.mind)
|
||||
user.mind.store_memory("Failsafe code for [U.parent] : [U.failsafe_code]")
|
||||
return U.parent //For log icon
|
||||
|
||||
/datum/uplink_item/stealthy_tools/mulligan
|
||||
name = "Mulligan"
|
||||
desc = "Screwed up and have security on your tail? This handy syringe will give you a completely new identity \
|
||||
@@ -1173,7 +1228,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/stealthy_tools/jammer
|
||||
name = "Radio Jammer"
|
||||
desc = "This device will disrupt any nearby outgoing radio communication when activated."
|
||||
desc = "This device will disrupt any nearby outgoing radio communication when activated. Does not affect binary chat."
|
||||
item = /obj/item/jammer
|
||||
cost = 5
|
||||
|
||||
@@ -1204,7 +1259,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/suits/space_suit
|
||||
name = "Syndicate Space Suit"
|
||||
desc = "This red and black syndicate space suit is less encumbering than Nanotrasen variants, \
|
||||
desc = "This red and black Syndicate space suit is less encumbering than Nanotrasen variants, \
|
||||
fits inside bags, and has a weapon slot. Nanotrasen crew members are trained to report red space suit \
|
||||
sightings, however."
|
||||
item = /obj/item/storage/box/syndie_kit/space
|
||||
@@ -1212,7 +1267,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/suits/hardsuit
|
||||
name = "Syndicate Hardsuit"
|
||||
desc = "The feared suit of a syndicate nuclear agent. Features slightly better armoring and a built in jetpack \
|
||||
desc = "The feared suit of a Syndicate nuclear agent. Features slightly better armoring and a built in jetpack \
|
||||
that runs off standard atmospheric tanks. Toggling the suit in and out of \
|
||||
combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \
|
||||
Additionally the suit is collapsible, making it small enough to fit within a backpack. \
|
||||
@@ -1223,8 +1278,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/suits/hardsuit/elite
|
||||
name = "Elite Syndicate Hardsuit"
|
||||
desc = "An upgraded, elite version of the syndicate hardsuit. It features fireproofing, and also \
|
||||
provides the user with superior armor and mobility compared to the standard syndicate hardsuit."
|
||||
desc = "An upgraded, elite version of the Syndicate hardsuit. It features fireproofing, and also \
|
||||
provides the user with superior armor and mobility compared to the standard Syndicate hardsuit."
|
||||
item = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
cost = 8
|
||||
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
|
||||
@@ -1232,7 +1287,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/suits/hardsuit/shielded
|
||||
name = "Shielded Syndicate Hardsuit"
|
||||
desc = "An upgraded version of the standard syndicate hardsuit. It features a built-in energy shielding system. \
|
||||
desc = "An upgraded version of the standard Syndicate hardsuit. It features a built-in energy shielding system. \
|
||||
The shields can handle up to three impacts within a short duration and will rapidly recharge while not under fire."
|
||||
item = /obj/item/clothing/suit/space/hardsuit/shielded/syndi
|
||||
cost = 30
|
||||
@@ -1245,15 +1300,15 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/device_tools/cutouts
|
||||
name = "Adaptive Cardboard Cutouts"
|
||||
desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \
|
||||
crayon for changing their appearances."
|
||||
desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. \
|
||||
This pack contains three as well as a crayon for changing their appearances."
|
||||
item = /obj/item/storage/box/syndie_kit/cutouts
|
||||
cost = 1
|
||||
surplus = 20
|
||||
|
||||
/datum/uplink_item/device_tools/assault_pod
|
||||
name = "Assault Pod Targeting Device"
|
||||
desc = "Use to select the landing zone of your assault pod."
|
||||
desc = "Use this to select the landing zone of your assault pod."
|
||||
item = /obj/item/assault_pod
|
||||
cost = 30
|
||||
surplus = 0
|
||||
@@ -1298,8 +1353,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/device_tools/camera_bug
|
||||
name = "Camera Bug"
|
||||
desc = "Enables you to view all cameras on the network and track a target. Bugging cameras allows you \
|
||||
to disable them remotely."
|
||||
desc = "Enables you to view all cameras on the main network, set up motion alerts and track a target. \
|
||||
Bugging cameras allows you to disable them remotely."
|
||||
item = /obj/item/camera_bug
|
||||
cost = 1
|
||||
surplus = 90
|
||||
@@ -1326,7 +1381,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/device_tools/fakenucleardisk
|
||||
name = "Decoy Nuclear Authentication Disk"
|
||||
desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. Don't try to give this to us to complete your objective, we know better!"
|
||||
desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \
|
||||
Don't try to give this to us to complete your objective, we know better!"
|
||||
item = /obj/item/disk/nuclear/fake
|
||||
cost = 1
|
||||
surplus = 1
|
||||
@@ -1334,7 +1390,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/device_tools/frame
|
||||
name = "F.R.A.M.E. PDA Cartridge"
|
||||
desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \
|
||||
when used cause the targeted PDA to become a new uplink with zero TCs, and immediately become unlocked. \
|
||||
when used cause the targeted PDA to become a new uplink with zero TCs, and immediately become unlocked. \
|
||||
You will receive the unlock code upon activating the virus, and the new uplink may be charged with \
|
||||
telecrystals normally."
|
||||
item = /obj/item/cartridge/virus/frame
|
||||
@@ -1343,7 +1399,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/device_tools/toolbox
|
||||
name = "Full Syndicate Toolbox"
|
||||
desc = "The syndicate toolbox is a suspicious black and red. It comes loaded with a full tool set including a \
|
||||
desc = "The Syndicate toolbox is a suspicious black and red. It comes loaded with a full tool set including a \
|
||||
multitool and combat gloves that are resistant to shocks and heat."
|
||||
item = /obj/item/storage/toolbox/syndicate
|
||||
cost = 1
|
||||
@@ -1366,7 +1422,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/device_tools/medgun
|
||||
name = "Medbeam Gun"
|
||||
desc = "A wonder of Syndicate engineering, the Medbeam gun, or Medi-Gun enables a medic to keep his fellow \
|
||||
operatives in the fight, even while under fire."
|
||||
operatives in the fight, even while under fire. Don't cross the streams!"
|
||||
item = /obj/item/gun/medbeam
|
||||
cost = 15
|
||||
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
|
||||
@@ -1388,9 +1444,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/device_tools/powersink
|
||||
name = "Power Sink"
|
||||
desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \
|
||||
desc = "When screwed to wiring attached to a power grid and activated, this large device lights up and places excessive \
|
||||
load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \
|
||||
traditional bags and boxes."
|
||||
traditional bags and boxes. Caution: Will explode if the powernet contains sufficient amounts of energy."
|
||||
item = /obj/item/powersink
|
||||
cost = 6
|
||||
|
||||
@@ -1399,7 +1455,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a \
|
||||
powerful burst of radiation, which, after a short delay, can incapacitate all but the most protected \
|
||||
of humanoids. It has two settings: intensity, which controls the power of the radiation, \
|
||||
and wavelength, which controls how long the radiation delay is."
|
||||
and wavelength, which controls the delay before the effect kicks in."
|
||||
item = /obj/item/healthanalyzer/rad_laser
|
||||
cost = 3
|
||||
|
||||
@@ -1414,7 +1470,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/device_tools/medkit
|
||||
name = "Syndicate Combat Medic Kit"
|
||||
desc = "This first aid kit is a suspicious brown and red. Included is a combat stimulant injector \
|
||||
for rapid healing, a medical HUD for quick identification of injured personnel, \
|
||||
for rapid healing, a medical night vision HUD for quick identification of injured personnel, \
|
||||
and other supplies helpful for a field medic."
|
||||
item = /obj/item/storage/firstaid/tactical
|
||||
cost = 4
|
||||
@@ -1429,7 +1485,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/device_tools/surgerybag_adv
|
||||
name = "Advanced Syndicate Surgery Duffel Bag"
|
||||
desc = "The Syndicate surgery duffel bag is a toolkit containing all newest surgery tools, surgical drapes, \
|
||||
desc = "The Syndicate surgery duffel bag is a toolkit containing all advanced surgery tools, surgical drapes, \
|
||||
a Syndicate brand MMI, a straitjacket, a muzzle, and a full Syndicate Combat Medic Kit."
|
||||
item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv
|
||||
cost = 10
|
||||
@@ -1445,7 +1501,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/device_tools/syndietome
|
||||
name = "Syndicate Tome"
|
||||
desc = "Using rare artifacts acquired at great cost, the syndicate has reverse engineered \
|
||||
desc = "Using rare artifacts acquired at great cost, the Syndicate has reverse engineered \
|
||||
the seemingly magical books of a certain cult. Though lacking the esoteric abilities \
|
||||
of the originals, these inferior copies are still quite useful, being able to provide \
|
||||
both weal and woe on the battlefield, even if they do occasionally bite off a finger."
|
||||
@@ -1464,7 +1520,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/device_tools/potion
|
||||
name = "Syndicate Sentience Potion"
|
||||
item = /obj/item/slimepotion/slime/sentience/nuclear
|
||||
desc = "A potion recovered at great risk by undercover syndicate operatives and then subsequently modified with syndicate technology. Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors."
|
||||
desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \
|
||||
Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors."
|
||||
cost = 2
|
||||
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
|
||||
restricted = TRUE
|
||||
@@ -1478,7 +1535,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/implants/adrenal
|
||||
name = "Adrenal Implant"
|
||||
desc = "An implant injected into the body, and later activated at the user's will. It will inject a chemical \
|
||||
cocktail which has a mild healing effect along with removing all stuns and increasing movement speed."
|
||||
cocktail which removes all incapacitating effects, lets the user run faster and has a mild healing effect."
|
||||
item = /obj/item/storage/box/syndie_kit/imp_adrenal
|
||||
cost = 8
|
||||
player_minimum = 25
|
||||
@@ -1517,28 +1574,30 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/implants/radio
|
||||
name = "Internal Syndicate Radio Implant"
|
||||
desc = "An implant injected into the body, allowing the use of an internal syndicate radio. Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
|
||||
desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \
|
||||
Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
|
||||
item = /obj/item/storage/box/syndie_kit/imp_radio
|
||||
cost = 4
|
||||
restricted = TRUE
|
||||
|
||||
/datum/uplink_item/implants/reviver
|
||||
name = "Reviver Implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness. Comes with an autosurgeon."
|
||||
desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon."
|
||||
item = /obj/item/autosurgeon/reviver
|
||||
cost = 8
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/implants/stealthimplant
|
||||
name = "Stealth Implant"
|
||||
desc = "This one-of-a-kind implant will make you almost invisible if you play your cards right."
|
||||
desc = "This one-of-a-kind implant will make you almost invisible as long as you don't don't excessively move around. \
|
||||
On activation, it will conceal you inside a chameleon cardboard box that is only revealed once someone bumps into it."
|
||||
item = /obj/item/implanter/stealth
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/implants/storage
|
||||
name = "Storage Implant"
|
||||
desc = "An implant injected into the body, and later activated at the user's will. It will open a small bluespace \
|
||||
pocket capable of storing two items."
|
||||
pocket capable of storing two regular-sized items."
|
||||
item = /obj/item/storage/box/syndie_kit/imp_storage
|
||||
cost = 8
|
||||
|
||||
@@ -1551,7 +1610,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/implants/uplink
|
||||
name = "Uplink Implant"
|
||||
desc = "An implant injected into the body, and later activated at the user's will. Has no telecrystals, must be charged by the use of physical telecrystals. Undetectable (except via surgery), and excellent for escaping confinement."
|
||||
desc = "An implant injected into the body, and later activated at the user's will. Has no telecrystals and must be charged by the use of physical telecrystals. \
|
||||
Undetectable (except via surgery), and excellent for escaping confinement."
|
||||
item = /obj/item/storage/box/syndie_kit/imp_uplink
|
||||
cost = 4
|
||||
// An empty uplink is kinda useless.
|
||||
@@ -1610,7 +1670,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
with a minimum of 60 seconds, and can be bolted to the floor with a wrench to prevent \
|
||||
movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \
|
||||
transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \
|
||||
be defused, and some crew may attempt to do so."
|
||||
be defused, and some crew may attempt to do so. \
|
||||
The bomb core can be pried out and manually detonated with other explosives."
|
||||
item = /obj/item/sbeacondrop/clownbomb
|
||||
cost = 15
|
||||
restricted_roles = list("Clown")
|
||||
@@ -1638,7 +1699,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/role_restricted/haunted_magic_eightball
|
||||
name = "Haunted Magic Eightball"
|
||||
desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking."
|
||||
desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. \
|
||||
Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking."
|
||||
item = /obj/item/toy/eightball/haunted
|
||||
cost = 2
|
||||
restricted_roles = list("Curator")
|
||||
@@ -1657,14 +1719,16 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/role_restricted/explosive_hot_potato
|
||||
name = "Exploding Hot Potato"
|
||||
desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead."
|
||||
desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \
|
||||
The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead."
|
||||
item = /obj/item/hot_potato/syndicate
|
||||
cost = 4
|
||||
restricted_roles = list("Cook", "Botanist", "Clown", "Mime")
|
||||
|
||||
/datum/uplink_item/role_restricted/ez_clean_bundle
|
||||
name = "EZ Clean Grenade Bundle"
|
||||
desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. The acid only affects carbon-based creatures."
|
||||
desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. \
|
||||
The acid only affects carbon-based creatures."
|
||||
item = /obj/item/storage/box/syndie_kit/ez_clean
|
||||
cost = 6
|
||||
surplus = 20
|
||||
@@ -1679,7 +1743,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/role_restricted/mimery
|
||||
name = "Guide to Advanced Mimery Series"
|
||||
desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. Obviously only works for Mimes."
|
||||
desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. \
|
||||
Obviously only works for Mimes."
|
||||
cost = 12
|
||||
item = /obj/item/storage/box/syndie_kit/mimery
|
||||
restricted_roles = list("Mime")
|
||||
@@ -1694,7 +1759,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/role_restricted/pressure_mod
|
||||
name = "Kinetic Accelerator Pressure Mod"
|
||||
desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
|
||||
desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. \
|
||||
Occupies 35% mod capacity."
|
||||
item = /obj/item/borg/upgrade/modkit/indoors
|
||||
cost = 5 //you need two for full damage, so total of 10 for maximum damage
|
||||
limited_stock = 2 //you can't use more than two!
|
||||
@@ -1702,7 +1768,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/role_restricted/kitchen_gun
|
||||
name = "Kitchen Gun (TM)"
|
||||
desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!"
|
||||
desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! \
|
||||
Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!"
|
||||
cost = 10
|
||||
surplus = 40
|
||||
restricted_roles = list("Cook", "Janitor")
|
||||
@@ -1717,7 +1784,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/role_restricted/magillitis_serum
|
||||
name = "Magillitis Serum Autoinjector"
|
||||
desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
|
||||
desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \
|
||||
Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
|
||||
item = /obj/item/reagent_containers/hypospray/magillitis
|
||||
cost = 15
|
||||
restricted_roles = list("Geneticist", "Chief Medical Officer")
|
||||
@@ -1767,7 +1835,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/badass/costumes/obvious_chameleon
|
||||
name = "Broken Chameleon Kit"
|
||||
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! Please note that this kit did NOT pass quality control."
|
||||
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
|
||||
Please note that this kit did NOT pass quality control."
|
||||
item = /obj/item/storage/box/syndie_kit/chameleon/broken
|
||||
|
||||
/datum/uplink_item/badass/costumes
|
||||
@@ -1777,7 +1846,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
|
||||
/datum/uplink_item/badass/costumes/centcom_official
|
||||
name = "CentCom Official Costume"
|
||||
desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. Radio headset does not include key. No gun included."
|
||||
desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. \
|
||||
Radio headset does not include encryption key. No gun included."
|
||||
item = /obj/item/storage/box/syndie_kit/centcom_costume
|
||||
|
||||
/datum/uplink_item/badass/costumes/clown
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
var/datum/component/riding/D = GetComponent(/datum/component/riding)
|
||||
//1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have
|
||||
//if that made no sense this simply makes the wheelchair speed change along with movement speed delay
|
||||
D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / min(user.get_num_arms(), 2)
|
||||
D.vehicle_move_delay = round((CONFIG_GET(number/movedelay/run_delay) * 4) / min(user.get_num_arms(), 2), world.tick_lag)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/ridden/wheelchair/Moved()
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
/obj/item/seeds/lime = 3,
|
||||
/obj/item/seeds/onion = 3,
|
||||
/obj/item/seeds/orange = 3,
|
||||
/obj/item/seeds/peanutseed = 3,
|
||||
/obj/item/seeds/pineapple = 3,
|
||||
/obj/item/seeds/potato = 3,
|
||||
/obj/item/seeds/poppy = 3,
|
||||
|
||||
Reference in New Issue
Block a user