Merge branch 'master' into more_implants
This commit is contained in:
@@ -345,7 +345,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
||||
A = get_turf(A)
|
||||
var/can_make_pipe = (isturf(A) || is_type_in_typecache(A, make_pipe_whitelist))
|
||||
|
||||
. = FALSE
|
||||
. = TRUE
|
||||
|
||||
if((mode & DESTROY_MODE) && istype(A, /obj/item/pipe) || istype(A, /obj/structure/disposalconstruct) || istype(A, /obj/structure/c_transit_tube) || istype(A, /obj/structure/c_transit_tube_pod) || istype(A, /obj/item/pipe_meter))
|
||||
to_chat(user, "<span class='notice'>You start destroying a pipe...</span>")
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
L.Remove()
|
||||
|
||||
// make some colorful reagent, and apply it to the lungs
|
||||
L.create_reagents(10)
|
||||
L.create_reagents(10, NONE, NO_REAGENTS_VALUE)
|
||||
L.reagents.add_reagent(/datum/reagent/colorful_reagent, 10)
|
||||
L.reagents.reaction(L, TOUCH, 1)
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
if(!boomingandboxing)
|
||||
var/list/tracklist = list()
|
||||
for(var/datum/track/S in SSjukeboxes.songs)
|
||||
if(istype(S) && S.song_associated_id in availabletrackids)
|
||||
if(istype(S) && (S.song_associated_id in availabletrackids))
|
||||
tracklist[S.song_name] = S
|
||||
var/selected = input(user, "Play song", "Track:") as null|anything in tracklist
|
||||
if(QDELETED(src) || !selected || !istype(tracklist[selected], /datum/track))
|
||||
|
||||
@@ -250,6 +250,7 @@ update_label("John Doe", "Clowny")
|
||||
name = "agent card"
|
||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE)
|
||||
var/anyone = FALSE //Can anyone forge the ID or just syndicate?
|
||||
var/forged = FALSE //have we set a custom name and job assignment, or will we use what we're given when we chameleon change?
|
||||
|
||||
/obj/item/card/id/syndicate/Initialize()
|
||||
. = ..()
|
||||
@@ -265,26 +266,52 @@ update_label("John Doe", "Clowny")
|
||||
var/obj/item/card/id/I = O
|
||||
src.access |= I.access
|
||||
if(isliving(user) && user.mind)
|
||||
if(user.mind.special_role)
|
||||
if(user.mind.special_role || anyone)
|
||||
to_chat(usr, "<span class='notice'>The card's microscanners activate as you pass it over the ID, copying its access.</span>")
|
||||
|
||||
/obj/item/card/id/syndicate/attack_self(mob/user)
|
||||
if(isliving(user) && user.mind)
|
||||
if(user.mind.special_role || anyone)
|
||||
if(alert(user, "Action", "Agent ID", "Show", "Forge") == "Forge")
|
||||
var/input_name = reject_bad_name(stripped_input(user, "What name would you like to put on this card?", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN), TRUE)
|
||||
if(!input_name)
|
||||
return
|
||||
var/first_use = registered_name ? FALSE : TRUE
|
||||
if(!(user.mind.special_role || anyone)) //Unless anyone is allowed, only syndies can use the card, to stop metagaming.
|
||||
if(first_use) //If a non-syndie is the first to forge an unassigned agent ID, then anyone can forge it.
|
||||
anyone = TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
var/u = stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant", MAX_MESSAGE_LEN)
|
||||
if(!u)
|
||||
registered_name = ""
|
||||
return
|
||||
assignment = u
|
||||
update_label()
|
||||
to_chat(user, "<span class='notice'>You successfully forge the ID card.</span>")
|
||||
var/popup_input = alert(user, "Choose Action", "Agent ID", "Show", "Forge/Reset")
|
||||
if(user.incapacitated())
|
||||
return
|
||||
if(popup_input == "Forge/Reset" && !forged)
|
||||
var/input_name = stripped_input(user, "What name would you like to put on this card? Leave blank to randomise.", "Agent card name", registered_name ? registered_name : (ishuman(user) ? user.real_name : user.name), MAX_NAME_LEN)
|
||||
input_name = reject_bad_name(input_name)
|
||||
if(!input_name)
|
||||
// Invalid/blank names give a randomly generated one.
|
||||
if(user.gender == MALE)
|
||||
input_name = "[pick(GLOB.first_names_male)] [pick(GLOB.last_names)]"
|
||||
else if(user.gender == FEMALE)
|
||||
input_name = "[pick(GLOB.first_names_female)] [pick(GLOB.last_names)]"
|
||||
else
|
||||
input_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]"
|
||||
|
||||
var/target_occupation = stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", assignment ? assignment : "Assistant", MAX_MESSAGE_LEN)
|
||||
if(!target_occupation)
|
||||
return
|
||||
..()
|
||||
registered_name = input_name
|
||||
assignment = target_occupation
|
||||
update_label()
|
||||
forged = TRUE
|
||||
to_chat(user, "<span class='notice'>You successfully forge the ID card.</span>")
|
||||
log_game("[key_name(user)] has forged \the [initial(name)] with name \"[registered_name]\" and occupation \"[assignment]\".")
|
||||
return
|
||||
else if (popup_input == "Forge/Reset" && forged)
|
||||
registered_name = initial(registered_name)
|
||||
assignment = initial(assignment)
|
||||
log_game("[key_name(user)] has reset \the [initial(name)] named \"[src]\" to default.")
|
||||
update_label()
|
||||
forged = FALSE
|
||||
to_chat(user, "<span class='notice'>You successfully reset the ID card.</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/card/id/syndicate/anyone
|
||||
anyone = TRUE
|
||||
|
||||
@@ -122,7 +122,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
/obj/item/clothing/mask/cigarette/Initialize()
|
||||
. = ..()
|
||||
create_reagents(chem_volume, INJECTABLE | NO_REACT) // so it doesn't react until you light it
|
||||
create_reagents(chem_volume, INJECTABLE | NO_REACT, NO_REAGENTS_VALUE) // so it doesn't react until you light it
|
||||
if(list_reagents)
|
||||
reagents.add_reagent_list(list_reagents)
|
||||
if(starts_lit)
|
||||
@@ -717,7 +717,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
/obj/item/clothing/mask/vape/Initialize(mapload, param_color)
|
||||
. = ..()
|
||||
create_reagents(chem_volume, NO_REACT) // so it doesn't react until you light it
|
||||
create_reagents(chem_volume, NO_REACT, NO_REAGENTS_VALUE) // so it doesn't react until you light it
|
||||
reagents.add_reagent(/datum/reagent/drug/nicotine, 50)
|
||||
if(!icon_state)
|
||||
if(!param_color)
|
||||
|
||||
@@ -35,6 +35,10 @@
|
||||
/obj/item/stock_parts/manipulator = 1,
|
||||
/obj/item/stack/sheet/glass = 1)
|
||||
|
||||
/obj/item/circuitboard/machine/autolathe/secure
|
||||
name = "Secure Autolathe (Machine Board)"
|
||||
build_path = /obj/machinery/autolathe/secure
|
||||
|
||||
/obj/item/circuitboard/machine/bloodbankgen
|
||||
name = "Blood Bank Generator (Machine Board)"
|
||||
build_path = /obj/machinery/bloodbankgen
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
charges_left = charges
|
||||
|
||||
if(!reagents)
|
||||
create_reagents(charges_left * volume_multiplier)
|
||||
create_reagents(charges_left * volume_multiplier, NONE, NO_REAGENTS_VALUE)
|
||||
reagents.clear_reagents()
|
||||
|
||||
var/total_weight = 0
|
||||
@@ -619,7 +619,7 @@
|
||||
is_capped = TRUE
|
||||
self_contained = FALSE // Don't disappear when they're empty
|
||||
can_change_colour = TRUE
|
||||
|
||||
|
||||
reagent_contents = list(/datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol = 1)
|
||||
|
||||
pre_noise = TRUE
|
||||
|
||||
@@ -563,22 +563,22 @@ Code:
|
||||
if (53) // Newscaster
|
||||
menu = "<h4>[PDAIMG(notes)] Newscaster Access</h4>"
|
||||
menu += "<br> Current Newsfeed: <A href='byond://?src=[REF(src)];choice=Newscaster Switch Channel'>[current_channel ? current_channel : "None"]</a> <br>"
|
||||
var/datum/newscaster/feed_channel/current
|
||||
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
var/datum/news/feed_channel/current
|
||||
for(var/datum/news/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
if (chan.channel_name == current_channel)
|
||||
current = chan
|
||||
if(!current)
|
||||
menu += "<h5> ERROR : NO CHANNEL FOUND </h5>"
|
||||
return
|
||||
var/i = 1
|
||||
for(var/datum/newscaster/feed_message/msg in current.messages)
|
||||
for(var/datum/news/feed_message/msg in current.messages)
|
||||
menu +="-[msg.returnBody(-1)] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[msg.returnAuthor(-1)]</FONT>\]</FONT><BR>"
|
||||
menu +="<b><font size=1>[msg.comments.len] comment[msg.comments.len > 1 ? "s" : ""]</font></b><br>"
|
||||
if(msg.img)
|
||||
user << browse_rsc(msg.img, "tmp_photo[i].png")
|
||||
menu +="<img src='tmp_photo[i].png' width = '180'><BR>"
|
||||
i++
|
||||
for(var/datum/newscaster/feed_comment/comment in msg.comments)
|
||||
for(var/datum/news/feed_comment/comment in msg.comments)
|
||||
menu +="<font size=1><small>[comment.body]</font><br><font size=1><small><small><small>[comment.author] [comment.time_stamp]</small></small></small></small></font><br>"
|
||||
menu += "<br> <A href='byond://?src=[REF(src)];choice=Newscaster Message'>Post Message</a>"
|
||||
|
||||
@@ -682,8 +682,8 @@ Code:
|
||||
if("Newscaster Message")
|
||||
var/host_pda_owner_name = host_pda.id ? "[host_pda.id.registered_name] ([host_pda.id.assignment])" : "Unknown"
|
||||
var/message = host_pda.msg_input()
|
||||
var/datum/newscaster/feed_channel/current
|
||||
for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
var/datum/news/feed_channel/current
|
||||
for(var/datum/news/feed_channel/chan in GLOB.news_network.network_channels)
|
||||
if (chan.channel_name == current_channel)
|
||||
current = chan
|
||||
if(current.locked && current.author != host_pda_owner_name)
|
||||
|
||||
@@ -89,25 +89,6 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Anomalous error. Summon a coder.</span>")
|
||||
|
||||
else if(ishuman(target) && user.zone_selected == BODY_ZONE_PRECISE_GROIN)
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(!P)
|
||||
return
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
|
||||
H.visible_message("<span class='warning'>[user] is preparing to shrink [H]\'s [P.name] with their bluespace compression kit!</span>")
|
||||
if(do_mob(user, H, 40) && charges > 0 && P.length > 0)
|
||||
H.visible_message("<span class='warning'>[user] has shrunk [H]\'s [P.name]!</span>")
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
|
||||
sparks()
|
||||
flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
|
||||
charges -= 1
|
||||
var/p_name = P.name
|
||||
P.modify_size(-5)
|
||||
if(QDELETED(P))
|
||||
H.visible_message("<span class='warning'>[H]\'s [p_name] vanishes!</span>")
|
||||
|
||||
|
||||
/obj/item/compressionkit/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/ore/bluespace_crystal))
|
||||
@@ -117,4 +98,4 @@
|
||||
if(B.amount > 1)
|
||||
B.amount -= 1
|
||||
else
|
||||
qdel(I)
|
||||
qdel(I)
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
/obj/item/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user)
|
||||
add_fingerprint(user)
|
||||
if(istype(M) && on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))
|
||||
if(istype(M) && on && (user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH)))
|
||||
|
||||
if((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) //too dumb to use flashlight properly
|
||||
return ..() //just hit them in the head
|
||||
@@ -390,7 +390,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/flashlight/emp/attack(mob/living/M, mob/living/user)
|
||||
if(on && user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH)) // call original attack when examining organs
|
||||
if(on && (user.zone_selected in list(BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH))) // call original attack when examining organs
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
/obj/item/geiger_counter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/obj/item/geiger_counter/process()
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
if(!O.reagents)
|
||||
continue
|
||||
var/reagent_list = pretty_string_from_reagent_list(O.reagents)
|
||||
user.log_message("removed [O] ([reagent_list]) from [src]")
|
||||
user.log_message("removed [O] ([reagent_list]) from [src]", LOG_GAME)
|
||||
beakers = list()
|
||||
to_chat(user, "<span class='notice'>You open the [initial(name)] assembly and remove the payload.</span>")
|
||||
return // First use of the wrench remove beakers, then use the wrench to remove the activation mechanism.
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/obj/item/mop/New()
|
||||
..()
|
||||
create_reagents(mopcap)
|
||||
create_reagents(mopcap, NONE, NO_REAGENTS_VALUE)
|
||||
|
||||
|
||||
/obj/item/mop/proc/clean(turf/A)
|
||||
|
||||
@@ -44,9 +44,9 @@
|
||||
if(H.stat == DEAD || H == user)
|
||||
continue
|
||||
if(H.mind && (has_job_loyalties || has_role_loyalties))
|
||||
if(has_job_loyalties && H.mind.assigned_role in job_loyalties)
|
||||
if(has_job_loyalties && (H.mind.assigned_role in job_loyalties))
|
||||
inspired += H
|
||||
else if(has_role_loyalties && H.mind.special_role in role_loyalties)
|
||||
else if(has_role_loyalties && (H.mind.special_role in role_loyalties))
|
||||
inspired += H
|
||||
else if(check_inspiration(H))
|
||||
inspired += H
|
||||
|
||||
@@ -236,6 +236,7 @@
|
||||
throwforce = 15 //Massive pice of metal
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = SLOWS_WHILE_IN_HAND
|
||||
transparent = FALSE
|
||||
|
||||
/obj/item/shield/riot/implant
|
||||
name = "riot tower shield"
|
||||
@@ -252,4 +253,4 @@
|
||||
/obj/item/shield/riot/implant/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(attack_type == PROJECTILE_ATTACK)
|
||||
final_block_chance = 60 //Massive shield
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -51,6 +51,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null, \
|
||||
new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("trash bin", /obj/structure/closet/crate/bin, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE),\
|
||||
null, \
|
||||
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
|
||||
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
|
||||
@@ -733,7 +734,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
|
||||
new /datum/stack_recipe("opaque plastic flaps", /obj/structure/plasticflaps/opaque, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
|
||||
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
|
||||
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
|
||||
new /datum/stack_recipe("large trash cart", /obj/structure/closet/crate/bin,50),\
|
||||
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
|
||||
|
||||
/obj/item/stack/sheet/plastic
|
||||
|
||||
@@ -399,10 +399,12 @@
|
||||
/obj/item/storage/bag/bio/ComponentInitialize()
|
||||
. = ..()
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL //Allows you to pick up Lungs, Liver, and Stomach
|
||||
STR.max_combined_w_class = 200
|
||||
STR.max_items = 25
|
||||
STR.insert_preposition = "in"
|
||||
STR.can_hold = typecacheof(list(/obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/food/snacks/deadmouse, /obj/item/reagent_containers/food/snacks/monkeycube))
|
||||
STR.can_hold = typecacheof(list(/obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/blood, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/food/snacks/deadmouse, /obj/item/reagent_containers/food/snacks/monkeycube, /obj/item/organ, /obj/item/reagent_containers/food/snacks/meat/slab, /obj/item/bodypart))
|
||||
STR.cant_hold = typecacheof(list(/obj/item/organ/brain, /obj/item/organ/liver/cybernetic, /obj/item/organ/heart/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/tongue/cybernetic, /obj/item/organ/ears/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/cyberimp))
|
||||
|
||||
/obj/item/storage/bag/bio/holding
|
||||
name = "bio bag of holding"
|
||||
|
||||
@@ -612,6 +612,21 @@
|
||||
/obj/item/ammo_casing
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/quiver
|
||||
name = "leather quiver"
|
||||
desc = "A quiver made from the hide of some animal. Used to hold arrows."
|
||||
icon_state = "quiver"
|
||||
item_state = "quiver"
|
||||
|
||||
/obj/item/storage/belt/quiver/ComponentInitialize()
|
||||
. = ..()
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_items = 15
|
||||
STR.display_numerical_stacking = TRUE
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/ammo_casing/caseless/arrow
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/medolier
|
||||
name = "medolier"
|
||||
desc = "A medical bandolier for holding smartdarts."
|
||||
|
||||
@@ -138,14 +138,17 @@
|
||||
|
||||
/obj/item/hand_tele/pre_attack(atom/target, mob/user, params)
|
||||
if(try_dispel_portal(target, user))
|
||||
return FALSE
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user)
|
||||
if(is_parent_of_portal(target))
|
||||
/obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user, delay = 30)
|
||||
var/datum/beam/B = user.Beam(target)
|
||||
if(is_parent_of_portal(target) && (!delay || do_after(user, delay, target = target)))
|
||||
qdel(target)
|
||||
to_chat(user, "<span class='notice'>You dispel [target] with \the [src]!</span>")
|
||||
qdel(B)
|
||||
return TRUE
|
||||
qdel(B)
|
||||
return FALSE
|
||||
|
||||
/obj/item/hand_tele/afterattack(atom/target, mob/user)
|
||||
|
||||
Reference in New Issue
Block a user