Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Cydia
2020-10-11 01:58:21 -05:00
966 changed files with 140801 additions and 206076 deletions
+2
View File
@@ -68,6 +68,7 @@
buckled_mobs |= M
M.update_canmove()
M.throw_alert("buckled", /obj/screen/alert/restrained/buckled)
M.set_glide_size(glide_size)
post_buckle_mob(M)
SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force)
@@ -87,6 +88,7 @@
buckled_mob.anchored = initial(buckled_mob.anchored)
buckled_mob.update_canmove()
buckled_mob.clear_alert("buckled")
buckled_mob.set_glide_size(DELAY_TO_GLIDE_SIZE(buckled_mob.total_multiplicative_slowdown()))
buckled_mobs -= buckled_mob
SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force)
+1 -1
View File
@@ -20,7 +20,7 @@
/obj/effect/countdown/examine(mob/user)
. = ..()
to_chat(user, "This countdown is displaying: [displayed_text].")
. += "This countdown is displaying: [displayed_text]."
/obj/effect/countdown/proc/attach(atom/A)
attached_to = A
@@ -179,9 +179,7 @@
. += "You recognise the footprints as belonging to:\n"
for(var/shoe in shoe_types)
var/obj/item/clothing/shoes/S = shoe
. += "[icon2html(initial(S.icon), user)] Some <B>[initial(S.name)]</B>.\n"
to_chat(user, .)
. += "some <B>[initial(S.name)]</B> [icon2html(initial(S.icon), user)]"
/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C)
if(blood_state != C.blood_state) //We only replace footprints of the same type as us
+1 -1
View File
@@ -15,7 +15,7 @@
qdel(src)
/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T)
return isspaceturf(T) || isclosedturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T)
return isclosedturf(T) || isgroundlessturf(T)
/obj/effect/decal/ex_act(severity, target)
qdel(src)
+4
View File
@@ -4,6 +4,7 @@
/obj/effect
icon = 'icons/effects/effects.dmi'
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
move_resist = INFINITY
obj_flags = 0
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
@@ -57,6 +58,9 @@
/obj/effect/abstract/singularity_act()
return
/obj/effect/abstract/has_gravity(turf/T)
return FALSE
/obj/effect/dummy/singularity_pull()
return
+1 -1
View File
@@ -36,7 +36,7 @@
/obj/structure/glowshroom/examine(mob/user)
. = ..()
to_chat(user, "This is a [generation]\th generation [name]!")
. += "This is a [generation]\th generation [name]!"
/obj/structure/glowshroom/Destroy()
if(myseed)
+49
View File
@@ -432,3 +432,52 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
GLOB.ruin_landmarks -= src
ruin_template = null
. = ..()
//------Station Rooms Landmarks------------//
/obj/effect/landmark/stationroom
var/list/templates = list()
layer = BULLET_HOLE_LAYER
/obj/effect/landmark/stationroom/New()
..()
GLOB.stationroom_landmarks += src
/obj/effect/landmark/stationroom/Destroy()
if(src in GLOB.stationroom_landmarks)
GLOB.stationroom_landmarks -= src
return ..()
/obj/effect/landmark/stationroom/proc/load(template_name)
var/turf/T = get_turf(src)
if(!T)
return FALSE
if(!template_name)
for(var/t in templates)
if(!SSmapping.station_room_templates[t])
log_world("Station room spawner placed at ([T.x], [T.y], [T.z]) has invalid ruin name of \"[t]\" in its list")
templates -= t
template_name = pickweight(templates)
if(!template_name)
GLOB.stationroom_landmarks -= src
qdel(src)
return FALSE
var/datum/map_template/template = SSmapping.station_room_templates[template_name]
if(!template)
return FALSE
testing("Room \"[template_name]\" placed at ([T.x], [T.y], [T.z])")
template.load(T, centered = FALSE)
template.loaded++
GLOB.stationroom_landmarks -= src
qdel(src)
return TRUE
// The landmark for the Engine on Box
/obj/effect/landmark/stationroom/box/engine
templates = list("Engine SM" = 3, "Engine Singulo" = 3, "Engine Tesla" = 3)
icon = 'icons/rooms/box/engine.dmi'
/obj/effect/landmark/stationroom/box/engine/New()
. = ..()
templates = CONFIG_GET(keyed_list/box_random_engine)
+10
View File
@@ -128,6 +128,16 @@
else
..()
/obj/structure/spider/spiderling/attack_hand(mob/user)
. = ..()
if(user.a_intent != INTENT_HELP)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("<span class='warning'>[user] splats [src].</span>", "<span class='warning'>You splat [src].</span>", "<span class='italics'>You hear a splat...</span>")
playsound(loc, 'sound/effects/snap.ogg', 25)
qdel(src)
return TRUE
/obj/structure/spider/spiderling/process()
if(travelling_in_vent)
if(isturf(loc))
+31 -18
View File
@@ -187,14 +187,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
src.loc = T
/obj/item/examine(mob/user) //This might be spammy. Remove?
..()
var/pronoun
if(src.gender == PLURAL)
pronoun = "They are"
. = ..()
. += "[gender == PLURAL ? "They are" : "It is"] a [weightclass2text(w_class)] item."
if(resistance_flags & INDESTRUCTIBLE)
. += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!"
else
pronoun = "It is"
var/size = weightclass2text(src.w_class)
to_chat(user, "[pronoun] a [size] item." )
if(resistance_flags & LAVA_PROOF)
. += "[src] is made of an extremely heat-resistant material, it'd probably be able to withstand lava!"
if(resistance_flags & (ACID_PROOF | UNACIDABLE))
. += "[src] looks pretty robust! It'd probably be able to withstand acid!"
if(resistance_flags & FREEZE_PROOF)
. += "[src] is made of cold-resistant materials."
if(resistance_flags & FIRE_PROOF)
. += "[src] is made of fire-retardant materials."
if(!user.research_scanner)
return
@@ -229,7 +236,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
else
research_msg += "None"
research_msg += "."
to_chat(user, research_msg.Join())
. += research_msg.Join()
/obj/item/interact(mob/user)
add_fingerprint(user)
@@ -543,21 +550,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
else
return
/obj/item/throw_impact(atom/A, datum/thrownthing/throwingdatum)
if(A && !QDELETED(A))
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, A, throwingdatum)
if(is_hot() && isliving(A))
var/mob/living/L = A
/obj/item/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(hit_atom && !QDELETED(hit_atom))
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
if(get_temperature() && isliving(hit_atom))
var/mob/living/L = hit_atom
L.IgniteMob()
var/itempush = 1
if(w_class < 4)
itempush = 0 //too light to push anything
return A.hitby(src, 0, itempush)
return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum)
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
thrownby = thrower
callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
. = ..(target, range, speed, thrower, spin, diagonals_first, callback)
callback = CALLBACK(src, .proc/after_throw, callback, (spin && messy_throw)) //replace their callback with our own
. = ..(target, range, speed, thrower, spin, diagonals_first, callback, force)
/obj/item/proc/after_throw(datum/callback/callback)
if (callback) //call the original callback
@@ -619,6 +626,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
/obj/item/proc/is_sharp()
return sharpness
/obj/item/proc/get_temperature()
return heat
/obj/item/proc/get_sharpness()
return sharpness
/obj/item/proc/get_dismemberment_chance(obj/item/bodypart/affecting)
if(affecting.can_dismember(src))
if((sharpness || damtype == BURN) && w_class >= WEIGHT_CLASS_NORMAL && force >= 10)
@@ -648,7 +661,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
else
. = ""
/obj/item/hitby(atom/movable/AM)
/obj/item/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
return
/obj/item/attack_hulk(mob/living/carbon/human/user)
+1 -1
View File
@@ -25,7 +25,7 @@ AI MODULES
materials = list(MAT_GOLD=50)
/obj/item/aiModule/examine(var/mob/user as mob)
..()
. = ..()
if(Adjacent(user))
show_laws(user)
+4 -4
View File
@@ -47,11 +47,11 @@ RLD
/obj/item/construction/examine(mob/user)
. = ..()
to_chat(user, "It currently holds [matter]/[max_matter] matter-units." )
. += "\A [src]. It currently holds [matter]/[max_matter] matter-units."
if(upgrade & RCD_UPGRADE_FRAMES)
to_chat(user, "It contains the design for machine frames, computer frames and deconstruction." )
. += "It contains the design for machine frames, computer frames and deconstruction."
if(upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)
to_chat(user, "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells.")
. += "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
/obj/item/construction/Destroy()
QDEL_NULL(spark_system)
@@ -875,4 +875,4 @@ RLD
#undef GLOW_MODE
#undef LIGHT_MODE
#undef REMOVE_MODE
#undef REMOVE_MODE
+2 -2
View File
@@ -79,9 +79,9 @@
..()
/obj/item/twohanded/rcl/examine(mob/user)
..()
. = ..()
if(loaded)
to_chat(user, "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>")
. += "<span class='info'>It contains [loaded.amount]/[max_amount] cables.</span>"
/obj/item/twohanded/rcl/Destroy()
QDEL_NULL(loaded)
+4 -4
View File
@@ -20,8 +20,8 @@ RSF
w_class = WEIGHT_CLASS_NORMAL
/obj/item/rsf/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It currently holds [matter]/30 fabrication-units.</span>")
. = ..()
. += "<span class='notice'>It currently holds [matter]/30 fabrication-units.</span>"
/obj/item/rsf/cyborg
matter = 30
@@ -127,8 +127,8 @@ RSF
w_class = WEIGHT_CLASS_NORMAL
/obj/item/cookiesynth/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It currently holds [matter]/10 cookie-units.</span>")
. = ..()
. += "<span class='notice'>It currently holds [matter]/10 cookie-units.</span>"
/obj/item/cookiesynth/attackby()
return
+3 -4
View File
@@ -91,9 +91,9 @@
/obj/item/airlock_painter/examine(mob/user)
..()
. = ..()
if(!ink)
to_chat(user, "<span class='notice'>It doesn't have a toner cartridge installed.</span>")
. += "<span class='notice'>It doesn't have a toner cartridge installed.</span>"
return
var/ink_level = "high"
if(ink.charges < 1)
@@ -102,8 +102,7 @@
ink_level = "low"
else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit)
ink_level = "dangerously high"
to_chat(user, "<span class='notice'>Its ink levels look [ink_level].</span>")
. += "<span class='notice'>Its ink levels look [ink_level].</span>"
/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/toner))
+2 -2
View File
@@ -46,10 +46,10 @@
/obj/item/bodybag/bluespace/examine(mob/user)
..()
. = ..()
if(contents.len)
var/s = contents.len == 1 ? "" : "s"
to_chat(user, "<span class='notice'>You can make out the shape[s] of [contents.len] object[s] through the fabric.</span>")
. += "<span class='notice'>You can make out the shape[s] of [contents.len] object[s] through the fabric.</span>"
/obj/item/bodybag/bluespace/Destroy()
for(var/atom/movable/A in contents)
+28 -2
View File
@@ -122,6 +122,9 @@
user.visible_message("<span class='warning'>[src] fizzles and sparks. It seems like it's out of charges.</span>")
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
/obj/item/card/emag/examine(mob/user)
. = ..()
. += "<span class='notice'>It has <b>[uses ? uses : "no"]</b> charges left.</span>"
/obj/item/card/emagfake
desc = "It's a card with a magnetic strip attached to some circuitry. Closer inspection shows that this card is a poorly made replica, with a \"DonkCo\" logo stamped on the back."
@@ -173,9 +176,9 @@
return
/obj/item/card/id/examine(mob/user)
..()
. = ..()
if(mining_points)
to_chat(user, "There's [mining_points] mining equipment redemption point\s loaded onto this card.")
. += "There's [mining_points] mining equipment redemption point\s loaded onto this card."
/obj/item/card/id/GetAccess()
return access
@@ -434,3 +437,26 @@ update_label("John Doe", "Clowny")
name = "APC Access ID"
desc = "A special ID card that allows access to APC terminals."
access = list(ACCESS_ENGINE_EQUIP)
/obj/item/card/id/away/snowdin
name = "a perfectly generic identification card"
desc = "A perfectly generic identification card. Looks like it could use some flavor."
icon_state = "centcom"
/obj/item/card/id/away/snowdin/eng
name = "Arctic Station Engineer's ID card"
desc = "A faded Arctic Station ID card. You can make out the rank \"Station Engineer\"."
assignment = "Arctic Station Engineer"
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_ENGINE, ACCESS_AWAY_MAINT)
/obj/item/card/id/away/snowdin/sci
name = "Arctic Station Scientist's ID card"
desc = "A faded Arctic Station ID card. You can make out the rank \"Scientist\"."
assignment = "Arctic Station Scientist"
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MAINT)
/obj/item/card/id/away/snowdin/med
name = "Arctic Station Doctor's ID card"
desc = "A faded Arctic Station ID card. You can make out the rank \"Doctor\"."
assignment = "Arctic Station Doctor"
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MED, ACCESS_AWAY_MAINT)
+9 -1
View File
@@ -81,7 +81,15 @@
set_station_name(designation)
minor_announce("[ureal_name] has designated your station as [station_name()]", "Captain's Charter", 0)
log_game("[ukey] has renamed the station as [station_name()].")
if (designation == "Black Mesa")
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 3000))
var/list/bmeastereggmusic = list('sound/music/half-life07.ogg','sound/music/half-life13.ogg','sound/music/bms_inbounda.ogg')
var/selectedmusic = pick(bmeastereggmusic)
for(var/mob/M in GLOB.player_list)
SEND_SOUND(M, selectedmusic)
to_chat(M, "<span class='boldannounce'>You feel the fabric of reality distort for a moment... Prepare for unforeseen... Consequences...</span>")
message_admins("The station has been renamed to Black Mesa.")
log_game("The station has been renamed to Black Mesa.")
name = "station charter for [station_name()]"
desc = "An official document entrusting the governance of \
[station_name()] and surrounding space to Captain [uname]."
+15 -12
View File
@@ -265,13 +265,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/dromedary
desc = "A DromedaryCo brand cigarette."
list_reagents = list("nicotine" = 7.5, "silicon" = 7.5)
/obj/item/clothing/mask/cigarette/uplift
desc = "An Uplift Smooth brand cigarette."
list_reagents = list("nicotine" = 7.5, "menthol" = 7.5)
/obj/item/clothing/mask/cigarette/robust
desc = "A Robust brand cigarette."
list_reagents = list("nicotine" = 7.5, "grenadine" = 7.5)
/obj/item/clothing/mask/cigarette/robustgold
desc = "A Robust Gold brand cigarette."
@@ -279,7 +281,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/carp
desc = "A Carp Classic brand cigarette."
list_reagents = list("nicotine" = 7.5, "sodiumchloride" = 7.5)
/obj/item/clothing/mask/cigarette/syndicate
desc = "An unknown brand cigarette."
list_reagents = list("nicotine" = 15, "omnizine" = 15)
@@ -911,7 +914,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if (O.heat > 500)
if (reagents && reagents.total_volume) //if there's stuff in the bong
var/lighting_text = O.ignition_effect(src, user)
if(lighting_text)
if(lighting_text)
//Logic regarding igniting it on
if (firecharges == 0)
user.show_message("<span class='notice'>You light the [src] with the [O]!</span>", 1)
@@ -948,18 +951,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.show_message("<span class='notice'>You quench the flame.</span>", 1)
/obj/item/bong/examine(mob/user)
..()
. = ..()
if(!reagents.total_volume)
to_chat(user, "<span class='notice'>The bowl is empty.</span>")
. += "<span class='notice'>The bowl is empty.</span>"
else if (reagents.total_volume > 80)
to_chat(user, "<span class='notice'>The bowl is filled to the brim.</span>")
. += "<span class='notice'>The bowl is filled to the brim.</span>"
else if (reagents.total_volume > 40)
to_chat(user, "<span class='notice'>The bowl has plenty weed in it.</span>")
. += "<span class='notice'>The bowl has plenty weed in it.</span>"
else
to_chat(user, "<span class='notice'>The bowl has some weed in it.</span>")
. += "<span class='notice'>The bowl has some weed in it.</span>"
to_chat(user, "<span class='notice'>Ctrl+Shift-click to empty.</span>")
to_chat(user, "<span class='notice'>Alt-click to extinguish.</span>")
. += "<span class='notice'>Ctrl+Shift-click to empty.</span>"
. += "<span class='notice'>Alt-click to extinguish.</span>"
/obj/item/bong/ignition_effect(atom/A, mob/user)
if(firecharges)
@@ -1020,7 +1023,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new
s.set_up(reagents, hit_strength, 18, user.loc)
s.start()
s.start()
reagents.reaction(user, INGEST, fraction)
if(!reagents.trans_to(user, fraction))
@@ -1058,4 +1061,4 @@ CIGARETTE PACKETS ARE IN FANCY.DM
name = "coconut bong"
icon_off = "coconut_bong"
icon_on = "coconut_bong_lit"
desc = "A water bong used for smoking dried plants. This one's made out of a coconut and some bamboo"
desc = "A water bong used for smoking dried plants. This one's made out of a coconut and some bamboo"
@@ -56,7 +56,7 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
M.RefreshParts()
/obj/item/circuitboard/machine/examine(mob/user)
..()
. = ..()
if(LAZYLEN(req_components))
var/list/nice_list = list()
for(var/B in req_components)
@@ -64,4 +64,4 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
if(!ispath(A))
continue
nice_list += list("[req_components[A]] [initial(A.name)]")
to_chat(user,"<span class='notice'>Required components: [english_list(nice_list)].</span>")
. += "<span class='notice'>Required components: [english_list(nice_list)].</span>"
@@ -73,8 +73,8 @@
return ..()
/obj/item/circuitboard/computer/card/minor/examine(user)
..()
to_chat(user, "Currently set to \"[dept_list[target_dept]]\".")
. = ..()
. += "Currently set to \"[dept_list[target_dept]]\"."
//obj/item/circuitboard/computer/shield
// name = "Shield Control (Computer Board)"
@@ -434,8 +434,8 @@
return ..()
/obj/item/circuitboard/machine/smartfridge/examine(mob/user)
..()
to_chat(user, "<span class='info'>[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it.</span>")
. = ..()
. += "<span class='info'>[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it.</span>"
/obj/item/circuitboard/machine/biogenerator
name = "Biogenerator (Machine Board)"
@@ -780,7 +780,7 @@
/obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user)
. = ..()
to_chat(user, "Cloud ID is currently set to [cloud_id].")
. += "Cloud ID is currently set to [cloud_id]."
/obj/item/circuitboard/machine/nanite_program_hub
name = "Nanite Program Hub (Machine Board)"
@@ -941,9 +941,9 @@
needs_anchored = FALSE
/obj/item/circuitboard/machine/dish_drive/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.</span>")
to_chat(user, "<span class='notice'>Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch.</span>")
. = ..()
. += "<span class='notice'>Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.</span>"
. += "<span class='notice'>Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch.</span>"
/obj/item/circuitboard/machine/dish_drive/attack_self(mob/living/user)
suction = !suction
+4 -4
View File
@@ -667,10 +667,10 @@
/obj/item/toy/crayon/spraycan/examine(mob/user)
. = ..()
if(charges_left)
to_chat(user, "It has [charges_left] use\s left.")
. += "It has [charges_left] use\s left."
else
to_chat(user, "It is empty.")
to_chat(user, "<span class='notice'>Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"].</span>")
. += "It is empty."
. += "<span class='notice'>Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"].</span>"
/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity, params)
if(!proximity)
@@ -831,7 +831,7 @@
/obj/item/toy/crayon/spraycan/gang/examine(mob/user)
. = ..()
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/gang) || isobserver(user))
to_chat(user, "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster.")
. += "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster."
/obj/item/toy/crayon/spraycan/infinite
name = "infinite spraycan"
+4 -5
View File
@@ -103,12 +103,11 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/examine(mob/user)
. = ..()
var/dat = id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
. += id ? "<span class='notice'>Alt-click to remove the id.</span>" : ""
if(inserted_item && (!isturf(loc)))
dat += "\n<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
. += "<span class='notice'>Ctrl-click to remove [inserted_item].</span>"
if(LAZYLEN(GLOB.pda_reskins))
dat += "\n<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
to_chat(user, dat)
. += "<span class='notice'>Ctrl-shift-click it to reskin it.</span>"
/obj/item/pda/Initialize()
. = ..()
@@ -1137,4 +1136,4 @@ GLOBAL_LIST_EMPTY(PDAs)
#undef PDA_OVERLAY_ID
#undef PDA_OVERLAY_ITEM
#undef PDA_OVERLAY_LIGHT
#undef PDA_OVERLAY_PAI
#undef PDA_OVERLAY_PAI
@@ -12,9 +12,9 @@
var/mode = 0
/obj/item/compressionkit/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It has [charges] charges left. Recharge with bluespace crystals.</span>")
to_chat(user, "<span class='notice'>Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).</span>")
. = ..()
. += "<span class='notice'>It has [charges] charges left. Recharge with bluespace crystals.</span>"
. += "<span class='notice'>Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).</span>"
/obj/item/compressionkit/attack_self(mob/user)
if(mode == 0)
@@ -112,6 +112,18 @@
else
O.update_size()
O.update_appearance()
return
else //shrink them overall
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
victim.visible_message("<span class='warning'>[user] is preparing to shrink [victim] with their bluespace compression kit!</span>")
if(do_mob(user, victim, 40) && charges > 0 && victim.size_multiplier > RESIZE_A_TINYMICRO)
victim.visible_message("<span class='warning'>[user] has shrunk [victim]!")
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
sparks()
flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
charges -= 1
victim.resize(victim.size_multiplier-0.2)
return
@@ -124,4 +136,4 @@
if(B.amount > 1)
B.amount -= 1
else
qdel(I)
qdel(I)
@@ -35,8 +35,8 @@
return ..()
/obj/item/doorCharge/examine(mob/user)
..()
. = ..()
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/traitor)) //No nuke ops because the device is excluded from nuclear
to_chat(user, "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within.")
. += "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within."
else
to_chat(user, "A small, suspicious object that feels lukewarm when held.")
. += "A small, suspicious object that feels lukewarm when held."
@@ -16,11 +16,11 @@
maptext = "[circuits]"
/obj/item/electroadaptive_pseudocircuit/examine(mob/user)
..()
. = ..()
if(iscyborg(user))
to_chat(user, "<span class='notice'>It has material for <b>[circuits]</b> circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.</span>")
to_chat(user, "<span class='notice'>Serves as a substitute for <b>fire/air alarm</b>, <b>firelock</b>, and <b>APC</b> electronics.</span>")
to_chat(user, "<span class='notice'>It can also be used on an APC with no power cell to <b>fabricate a low-capacity cell</b> at a high power cost.</span>")
. += "<span class='notice'>It has material for <b>[circuits]</b> circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.</span>"
. += "<span class='notice'>Serves as a substitute for <b>fire/air alarm</b>, <b>firelock</b>, and <b>APC</b> electronics.</span>"
. += "<span class='notice'>It can also be used on an APC with no power cell to <b>fabricate a low-capacity cell</b> at a high power cost.</span>"
/obj/item/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
if(QDELETED(R) || !istype(R))
@@ -52,9 +52,9 @@
qdel(F)
/obj/item/forcefield_projector/examine(mob/user)
..()
. = ..()
var/percent_charge = round((shield_integrity/max_shield_integrity)*100)
to_chat(user, "<span class='notice'>It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.</span>")
. += "<span class='notice'>It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [percent_charge]% charged.</span>"
/obj/item/forcefield_projector/Initialize(mapload)
. = ..()
@@ -18,6 +18,7 @@
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_BELT
rad_flags = RAD_NO_CONTAMINATE
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
var/grace = RAD_GRACE_PERIOD
@@ -38,6 +39,7 @@
/obj/item/geiger_counter/Destroy()
STOP_PROCESSING(SSobj, src)
QDEL_NULL(soundloop)
return ..()
/obj/item/geiger_counter/process()
@@ -63,28 +65,28 @@
current_tick_amount = 0
/obj/item/geiger_counter/examine(mob/user)
..()
. = ..()
if(!scanning)
return 1
to_chat(user, "<span class='info'>Alt-click it to clear stored radiation levels.</span>")
return
. += "<span class='info'>Alt-click it to clear stored radiation levels.</span>"
if(obj_flags & EMAGGED)
to_chat(user, "<span class='warning'>The display seems to be incomprehensible.</span>")
return 1
. += "<span class='warning'>The display seems to be incomprehensible.</span>"
return
switch(radiation_count)
if(-INFINITY to RAD_LEVEL_NORMAL)
to_chat(user, "<span class='notice'>Ambient radiation level count reports that all is well.</span>")
. += "<span class='notice'>Ambient radiation level count reports that all is well.</span>"
if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
to_chat(user, "<span class='disarm'>Ambient radiation levels slightly above average.</span>")
. += "<span class='disarm'>Ambient radiation levels slightly above average.</span>"
if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
to_chat(user, "<span class='warning'>Ambient radiation levels above average.</span>")
. += "<span class='warning'>Ambient radiation levels above average.</span>"
if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
to_chat(user, "<span class='danger'>Ambient radiation levels highly above average.</span>")
. += "<span class='danger'>Ambient radiation levels highly above average.</span>"
if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
to_chat(user, "<span class='suicide'>Ambient radiation levels nearing critical level.</span>")
. += "<span class='suicide'>Ambient radiation levels nearing critical level.</span>"
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
to_chat(user, "<span class='boldannounce'>Ambient radiation levels above critical level!</span>")
. += "<span class='boldannounce'>Ambient radiation levels above critical level!</span>"
to_chat(user, "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>")
. += "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>"
/obj/item/geiger_counter/update_icon()
if(!scanning)
+2 -2
View File
@@ -14,8 +14,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
/obj/item/gps/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>")
. = ..()
. += "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>"
/obj/item/gps/Initialize()
. = ..()
@@ -73,8 +73,8 @@
..()
/obj/item/lightreplacer/examine(mob/user)
..()
to_chat(user, status_string())
. = ..()
. += status_string()
/obj/item/lightreplacer/attackby(obj/item/W, mob/user, params)
+3 -3
View File
@@ -33,11 +33,11 @@
var/mode = 0
/obj/item/multitool/examine(mob/user)
..()
. = ..()
if(selected_io)
to_chat(user, "<span class='notice'>Activate [src] to detach the data wire.</span>")
. += "<span class='notice'>Activate [src] to detach the data wire.</span>"
if(buffer)
to_chat(user, "<span class='notice'>Its buffer contains [buffer].</span>")
. += "<span class='notice'>Its buffer contains [buffer].</span>"
/obj/item/multitool/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!</span>")
@@ -26,5 +26,5 @@
paint_color = input("Which colour do you want to use?","Pipe painter") in GLOB.pipe_paint_colors
/obj/item/pipe_painter/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It is set to [paint_color].</span>")
. = ..()
. += "<span class='notice'>It is set to [paint_color].</span>"
@@ -10,12 +10,12 @@
var/obj/machinery/quantumpad/qpad
/obj/item/quantum_keycard/examine(mob/user)
..()
. = ..()
if(qpad)
to_chat(user, "It's currently linked to a quantum pad.")
to_chat(user, "<span class='notice'>Alt-click to unlink the keycard.</span>")
. += "It's currently linked to a quantum pad."
. += "<span class='notice'>Alt-click to unlink the keycard.</span>"
else
to_chat(user, "<span class='notice'>Insert [src] into an active quantum pad to link it.</span>")
. += "<span class='notice'>Insert [src] into an active quantum pad to link it.</span>"
/obj/item/quantum_keycard/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
@@ -21,7 +21,7 @@
for(var/i in channels)
examine_text_list += "[GLOB.channel_tokens[i]] - [lowertext(i)]"
to_chat(user, "<span class='notice'>It can access the following channels; [jointext(examine_text_list, ", ")].</span>")
. += "<span class='notice'>It can access the following channels; [jointext(examine_text_list, ", ")].</span>"
/obj/item/encryptionkey/syndicate
name = "syndicate encryption key"
@@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
return TOXLOSS
/obj/item/radio/headset/examine(mob/user)
..()
. = ..()
if(item_flags & IN_INVENTORY && loc == user)
// construction of frequency description
@@ -45,12 +45,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
avail_chans += "use [MODE_TOKEN_DEPARTMENT] or [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
else
avail_chans += "use [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
to_chat(user, "<span class='notice'>A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)].")
. += "<span class='notice'>A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)]."
if(command)
to_chat(user, "<span class='info'>Alt-click to toggle the high-volume mode.</span>")
. += "<span class='info'>Alt-click to toggle the high-volume mode.</span>"
else
to_chat(user, "<span class='notice'>A small screen on the headset flashes, it's too small to read without holding or wearing the headset.</span>")
. += "<span class='notice'>A small screen on the headset flashes, it's too small to read without holding or wearing the headset.</span>"
/obj/item/radio/headset/Initialize()
. = ..()
@@ -49,11 +49,11 @@
return ..()
/obj/item/radio/intercom/examine(mob/user)
..()
. = ..()
if(!unfastened)
to_chat(user, "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>")
. += "<span class='notice'>It's <b>screwed</b> and secured to the wall.</span>"
else
to_chat(user, "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>")
. += "<span class='notice'>It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.</span>"
/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/screwdriver))
@@ -319,11 +319,11 @@
/obj/item/radio/examine(mob/user)
..()
. = ..()
if (unscrewed)
to_chat(user, "<span class='notice'>It can be attached and modified.</span>")
. += "<span class='notice'>It can be attached and modified.</span>"
else
to_chat(user, "<span class='notice'>It cannot be modified or attached.</span>")
. += "<span class='notice'>It cannot be modified or attached.</span>"
/obj/item/radio/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
+2 -2
View File
@@ -533,7 +533,7 @@ GENE SCANNER
/obj/item/analyzer/examine(mob/user)
. = ..()
to_chat(user, "<span class='notice'>Alt-click [src] to activate the barometer function.</span>")
. += "<span class='notice'>Alt-click [src] to activate the barometer function.</span>"
/obj/item/analyzer/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!</span>")
@@ -841,4 +841,4 @@ GENE SCANNER
display += copytext(temp, 1 + i*DNA_MUTATION_BLOCKS, DNA_MUTATION_BLOCKS*(1+i) + 1)
to_chat(user, "<span class='boldnotice'>- [mut_name] > [display]</span>")
to_chat(user, "<span class='boldnotice'>- [mut_name] > [display]</span>")
@@ -29,9 +29,8 @@
/obj/item/taperecorder/examine(mob/user)
..()
to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
. = ..()
. += "The wire panel is [open_panel ? "opened" : "closed"]."
/obj/item/taperecorder/attackby(obj/item/I, mob/user, params)
if(!mytape && istype(I, /obj/item/tape))
+11 -3
View File
@@ -45,6 +45,7 @@
var/list/special_faces = list() //entries should match up to sides var if used
var/can_be_rigged = TRUE
var/rigged = FALSE
var/unique = FALSE
/obj/item/dice/Initialize()
. = ..()
@@ -160,7 +161,7 @@
/obj/item/dice/attack_self(mob/user)
diceroll(user)
/obj/item/dice/throw_impact(atom/target)
/obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
diceroll(thrownby)
. = ..()
@@ -171,10 +172,17 @@
result = rigged
var/fake_result = roll(sides)//Daredevil isn't as good as he used to be
var/comment = ""
if(sides == 20 && result == 20)
if(sides == 20 && result == 20 && !unique)
comment = "NAT 20!"
else if(sides == 20 && result == 1)
else if(sides == 20 && result == 1 && !unique)
comment = "Ouch, bad luck."
//patreon reward code
if(sides == 20 && result == 20 && unique)
comment = "Lady Luck takes pity on you."
else if(sides == 20 && result == 1 && unique)
comment = "Yep. The dice hate you."
update_icon()
if(initial(icon_state) == "d00")
result = (result - 1)*10
+10
View File
@@ -140,6 +140,16 @@
desc = "It's a small world after all."
add_mutations = list(DWARFISM)
/obj/item/dnainjector/antigiant
name = "\improper DNA injector (Anti-Giantism)"
desc = "Makes you small and weak."
remove_mutations = list(GIANTISM)
/obj/item/dnainjector/giant
name = "\improper DNA injector (Giantism)"
desc = "Makes you bigger."
add_mutations = list(GIANTISM)
/obj/item/dnainjector/clumsymut
name = "\improper DNA injector (Clumsy)"
desc = "Makes clown minions."
+3 -3
View File
@@ -106,11 +106,11 @@
return ..()
/obj/item/extinguisher/examine(mob/user)
..()
to_chat(user, "The safety is [safety ? "on" : "off"].")
. = ..()
. += "The safety is [safety ? "on" : "off"]."
if(reagents.total_volume)
to_chat(user, "<span class='notice'>You can loose its <b>screws</b> to empty it.</span>")
. += "<span class='notice'>You can loose its <b>screws</b> to empty it.</span>"
/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user)
if(istype(target, tanktype) && target.Adjacent(user))
+2 -2
View File
@@ -145,9 +145,9 @@
update_icon()
/obj/item/flamethrower/examine(mob/user)
..()
. = ..()
if(ptank)
to_chat(user, "<span class='notice'>\The [src] has \a [ptank] attached. Alt-click to remove it.</span>")
. += "<span class='notice'>\The [src] has \a [ptank] attached. Alt-click to remove it.</span>"
/obj/item/flamethrower/proc/toggle_igniter(mob/user)
if(!ptank)
@@ -27,19 +27,19 @@
/obj/item/grenade/chem_grenade/examine(mob/user)
display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state
..()
. = ..()
if(user.can_see_reagents())
var/count = 0
if(beakers.len)
to_chat(user, "<span class='notice'>You scan the grenade and detect the following reagents:</span>")
. += "<span class='notice'>You scan the grenade and detect the following reagents:</span>"
for(var/obj/item/reagent_containers/glass/G in beakers)
var/textcount = thtotext(++count)
for(var/datum/reagent/R in G.reagents.reagent_list)
to_chat(user, "<span class='notice'>[R.volume] units of [R.name] in the [textcount] beaker.</span>")
. += "<span class='notice'>[R.volume] units of [R.name] in the [textcount] beaker.</span>"
if(beakers.len == 1)
to_chat(user, "<span class='notice'>You detect no second beaker in the grenade.</span>")
. += "<span class='notice'>You detect no second beaker in the grenade.</span>"
else
to_chat(user, "<span class='notice'>You scan the grenade, but detect nothing.</span>")
. += "<span class='notice'>You scan the grenade, but detect nothing.</span>"
/obj/item/grenade/chem_grenade/attack_self(mob/user)
@@ -56,5 +56,5 @@
qdel(src)
/obj/item/grenade/iedcasing/examine(mob/user)
..()
to_chat(user, "You can't tell when it will explode!")
. = ..()
. += "You can't tell when it will explode!"
+3 -3
View File
@@ -47,12 +47,12 @@
/obj/item/grenade/examine(mob/user)
..()
. = ..()
if(display_timer)
if(det_time > 1)
to_chat(user, "The timer is set to [DisplayTimeText(det_time)].")
. += "The timer is set to [DisplayTimeText(det_time)]."
else
to_chat(user, "\The [src] is set for instant detonation.")
. += "\The [src] is set for instant detonation."
/obj/item/grenade/attack_self(mob/user)
+2 -2
View File
@@ -340,7 +340,7 @@
return
playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1)
/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
return//abort
var/mob/living/carbon/C = hit_atom
@@ -368,7 +368,7 @@
w_class = WEIGHT_CLASS_SMALL
breakouttime = 60
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(iscarbon(hit_atom))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
B.Crossed(hit_atom)
+8 -8
View File
@@ -52,23 +52,23 @@
return
/obj/item/his_grace/examine(mob/user)
..()
. = ..()
if(awakened)
switch(bloodthirst)
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
to_chat(user, "<span class='his_grace'>[src] isn't very hungry. Not yet.</span>")
. += "<span class='his_grace'>[src] isn't very hungry. Not yet.</span>"
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
to_chat(user, "<span class='his_grace'>[src] would like a snack.</span>")
. += "<span class='his_grace'>[src] would like a snack.</span>"
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
to_chat(user, "<span class='his_grace'>[src] is quite hungry now.</span>")
. += "<span class='his_grace'>[src] is quite hungry now.</span>"
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
to_chat(user, "<span class='his_grace'>[src] is openly salivating at the sight of you. Be careful.</span>")
. += "<span class='his_grace'>[src] is openly salivating at the sight of you. Be careful.</span>"
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
to_chat(user, "<span class='his_grace bold'>You walk a fine line. [src] is very close to devouring you.</span>")
. += "<span class='his_grace bold'>You walk a fine line. [src] is very close to devouring you.</span>"
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
to_chat(user, "<span class='his_grace bold'>[src] is shaking violently and staring directly at you.</span>")
. += "<span class='his_grace bold'>[src] is shaking violently and staring directly at you.</span>"
else
to_chat(user, "<span class='his_grace'>[src] is latched closed.</span>")
. += "<span class='his_grace'>[src] is latched closed.</span>"
/obj/item/his_grace/relaymove(mob/living/user) //Allows changelings, etc. to climb out of Him after they revive, provided He isn't active
if(!awakened)
+2 -2
View File
@@ -490,10 +490,10 @@
possessed = TRUE
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
var/list/mob/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
var/mob/C = pick(candidates)
var/mob/living/simple_animal/shade/S = new(src)
S.real_name = name
S.name = name
+2 -2
View File
@@ -81,9 +81,9 @@
/obj/item/hot_potato/examine(mob/user)
. = ..()
if(active)
to_chat(user, "<span class='warning'>[src] is flashing red-hot! You should probably get rid of it!</span>")
. += "<span class='warning'>[src] is flashing red-hot! You should probably get rid of it!</span>"
if(show_timer)
to_chat(user, "<span class='warning'>[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!</span>")
. += "<span class='warning'>[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!</span>"
/obj/item/hot_potato/equipped(mob/user)
. = ..()
@@ -0,0 +1,77 @@
/obj/item/implant/slave
name = "slave implant"
desc = "Turns criminals into security's new pet."
resistance_flags = INDESTRUCTIBLE
activated = 0
/obj/item/implant/slave/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
<b>Name:</b> Alternative Criminal Reassignment Implant<BR>
<b>Life:</b> Ten years.<BR>
<b>Important Notes:</b> Incompatible with mindshield-class implants. Implant should be reserved for criminal punishment only. Recreational use is heavily frowned upon.<BR>
<HR>
<b>Implant Details:</b><BR>
<b>Function:</b> Overrides the host's mental functions with an innate desire to serve security personnel, obeying nearly any command.<BR>
<b>Special Features:</b> Will cure, but not block most other forms of brainwashing.<BR>
<b>Integrity:</b> Implant will last so long as the implant remains within the host."}
return dat
/obj/item/implant/slave/implant(mob/living/target, mob/user, silent = FALSE)
if(..())
if(!target.mind)
return FALSE //Can't be a pet without having a mind!
if(target.mind.has_antag_datum(/datum/antagonist/brainwashed))
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.unconvertable || target.mind.has_antag_datum(/datum/antagonist/gang/boss) || target.mind.assigned_role == "Security Officer" || target.mind.assigned_role == "Detective" || target.mind.assigned_role == "Warden" || target.mind.assigned_role == "Head of Security" || HAS_TRAIT(target, TRAIT_MINDSHIELD))
if(!silent)
if(target.mind.assigned_role == "Security Officer" || target.mind.assigned_role == "Detective" || target.mind.assigned_role == "Warden" || target.mind.assigned_role == "Head of Security")
target.visible_message("<span class='warning'>[target] seems to resist the implant! You can't enslave a member of security!</span>", "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
else
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
var/obj/item/implanter/I = loc
removed(target, 1)
qdel(src)
if(istype(I))
I.imp = null
I.update_icon()
return FALSE
var/datum/antagonist/gang/gang = target.mind.has_antag_datum(/datum/antagonist/gang)
var/datum/antagonist/rev/rev = target.mind.has_antag_datum(/datum/antagonist/rev)
if(rev)
rev.remove_revolutionary(FALSE, user)
if(gang)
target.mind.remove_antag_datum(/datum/antagonist/gang)
if(!silent)
if(target.mind in SSticker.mode.cult)
to_chat(target, "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
else
to_chat(target, "<span class='notice'>You feel a sense of peace and security. You are now enslaved!</span>")
var/slave_objective = "[(target.client?.prefs.lewdchem?"Security has enslaved you into being their pet! Obey their commands, but remember: a good pet is not violent.":"You've been neutralized by security! Follow their orders, but remember: neutralization also means nonviolence.")]"
brainwash(target, slave_objective)
target.sec_hud_set_implants()
return TRUE
return FALSE
/obj/item/implant/slave/removed(mob/target, silent = FALSE, special = 0)
if(..())
if(isliving(target))
var/mob/living/L = target
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
L.sec_hud_set_implants()
if(target.stat != DEAD && !silent)
to_chat(target, "<span class='boldnotice'>Your mind suddenly feels free from burden. You are no longer enslaved!</span>")
return 1
return 0
/obj/item/implanter/slave
name = "implanter (slave)"
imp_type = /obj/item/implant/slave
/obj/item/implantcase/slave
name = "implant case - 'Slave'"
desc = "A glass case containing a slave implant."
imp_type = /obj/item/implant/slave
+4 -4
View File
@@ -155,13 +155,13 @@
/obj/item/inducer/examine(mob/living/M)
..()
. = ..()
if(cell)
to_chat(M, "<span class='notice'>Its display shows: [DisplayEnergy(cell.charge)].</span>")
. += "<span class='notice'>Its display shows: [DisplayEnergy(cell.charge)].</span>"
else
to_chat(M,"<span class='notice'>Its display is dark.</span>")
. += "<span class='notice'>Its display is dark.</span>"
if(opened)
to_chat(M,"<span class='notice'>Its battery compartment is open.</span>")
. += "<span class='notice'>Its battery compartment is open.</span>"
/obj/item/inducer/update_icon()
cut_overlays()
+1 -1
View File
@@ -169,7 +169,7 @@
It can cook multiple items at once.
<h2>Processor:</h2>
Use it to process certain ingredients (meat into faggot, doughslice into spaghetti, potato into fries,etc...)
Use it to process certain ingredients (meat into meatball, doughslice into spaghetti, potato into fries,etc...)
<h2>Gibber:</h2>
Stuff an animal in it to grind it into meat.
+8 -7
View File
@@ -212,11 +212,12 @@
if(!iscyborg(target))
return
else
if(cooldown <= world.time)
if(cooldown < world.time)
if(target.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
playsound(target, 'sound/weapons/genhit.ogg', 50, 1)
return
if(ishuman(target))
var/mob/living/carbon/human/H = target
if (H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
return
if(check_martial_counter(H, user))
return
playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1)
@@ -329,13 +330,13 @@
if(proximity_flag)
consume_everything(target)
/obj/item/melee/supermatter_sword/throw_impact(target)
/obj/item/melee/supermatter_sword/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
..()
if(ismob(target))
var/mob/M
if(ismob(hit_atom))
var/mob/M = hit_atom
if(src.loc == M)
M.dropItemToGround(src)
consume_everything(target)
consume_everything(hit_atom)
/obj/item/melee/supermatter_sword/pickup(user)
..()
+2 -2
View File
@@ -118,8 +118,8 @@
reagents.add_reagent(refill_reagent, refill_rate)
/obj/item/mop/advanced/examine(mob/user)
..()
to_chat(user, "<span class='notice'>The condenser switch is set to <b>[refill_enabled ? "ON" : "OFF"]</b>.</span>")
. = ..()
. += "<span class='notice'>The condenser switch is set to <b>[refill_enabled ? "ON" : "OFF"]</b>.</span>"
/obj/item/mop/advanced/Destroy()
if(refill_enabled)
+5 -5
View File
@@ -43,17 +43,17 @@
..()
/obj/item/pet_carrier/examine(mob/user)
..()
. = ..()
if(occupants.len)
for(var/V in occupants)
var/mob/living/L = V
to_chat(user, "<span class='notice'>It has [L] inside.</span>")
. += "<span class='notice'>It has [L] inside.</span>"
else
to_chat(user, "<span class='notice'>It has nothing inside.</span>")
. += "<span class='notice'>It has nothing inside.</span>"
if(user.canUseTopic(src))
to_chat(user, "<span class='notice'>Activate it in your hand to [open ? "close" : "open"] its door.</span>")
. += "<span class='notice'>Activate it in your hand to [open ? "close" : "open"] its door.</span>"
if(!open)
to_chat(user, "<span class='notice'>Alt-click to [locked ? "unlock" : "lock"] its door.</span>")
. += "<span class='notice'>Alt-click to [locked ? "unlock" : "lock"] its door.</span>"
/obj/item/pet_carrier/attack_self(mob/living/user)
if(open)
+1 -1
View File
@@ -79,7 +79,7 @@
/obj/item/pinpointer/crew/proc/trackable(mob/living/carbon/human/H)
var/turf/here = get_turf(src)
if((H.z == 0 || H.z == here.z) && istype(H.w_uniform, /obj/item/clothing/under))
if(H && (H.z == 0 || H.z == here.z) && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
// Suit sensors must be on maximum.
+26
View File
@@ -649,6 +649,13 @@
icon_state = "suru"
item_state = "suru"
/obj/item/toy/plush/mothplushie/moffplush
name = "moth plushie"
desc = "A plushie depicting an adorable mothperson. It's a huggable bug!"
icon_state = "moffplush"
item_state = "moffplush"
squeak_override = list('modular_citadel/sound/voice/scream_moth.ogg' = 1)
/obj/item/toy/plush/xeno
name = "xenohybrid plushie"
desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember."
@@ -708,6 +715,18 @@
icon_state = "scrubpuppy"
item_state = "scrubpuppy"
/obj/item/toy/plush/borgplushie/meddrake
name = "MediDrake Plushie"
desc = "An adorable stuffed toy of a Medidrake."
icon_state = "meddrake"
item_state = "meddrake"
/obj/item/toy/plush/borgplushie/secdrake
name = "SecDrake Plushie"
desc = "An adorable stuffed toy of a Secdrake."
icon_state = "secdrake"
item_state = "secdrake"
/obj/item/toy/plush/borgplushie/seeking
icon_state = "seeking"
item_state = "seeking"
@@ -750,6 +769,13 @@
icon_state = "jewel"
item_state = "jewel"
/obj/item/toy/plush/bird/kenk
name = "kenku plushie"
desc = "An adorable stuffed plushie that resembles a kenku, perfect to sit on."
icon_state = "kenk"
item_state = "kenk"
squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1)
/obj/item/toy/plush/sergal
name = "sergal plushie"
desc = "An adorable stuffed plushie that resembles a sagaru."
+4 -6
View File
@@ -55,17 +55,15 @@
return automatic
/obj/item/pneumatic_cannon/examine(mob/user)
..()
var/list/out = list()
. = ..()
if(!in_range(user, src))
out += "<span class='notice'>You'll need to get closer to see any more.</span>"
. += "<span class='notice'>You'll need to get closer to see any more.</span>"
return
for(var/obj/item/I in loadedItems)
out += "<span class='info'>[icon2html(I, user)] It has \a [I] loaded.</span>"
. += "<span class='info'>[icon2html(I, user)] It has \a [I] loaded.</span>"
CHECK_TICK
if(tank)
out += "<span class='notice'>[icon2html(tank, user)] It has \a [tank] mounted onto it.</span>"
to_chat(user, out.Join("<br>"))
. += "<span class='notice'>[icon2html(tank, user)] It has \a [tank] mounted onto it.</span>"
/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/user, params)
if(user.a_intent == INTENT_HARM)
+3 -3
View File
@@ -20,12 +20,12 @@
/obj/item/melee/powerfist/examine(mob/user)
..()
. = ..()
if(!in_range(user, src))
to_chat(user, "<span class='notice'>You'll need to get closer to see any more.</span>")
. += "<span class='notice'>You'll need to get closer to see any more.</span>"
return
if(tank)
to_chat(user, "<span class='notice'>[icon2html(tank, user)] It has \a [tank] mounted onto it.</span>")
. += "<span class='notice'>[icon2html(tank, user)] It has \a [tank] mounted onto it.</span>"
/obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params)
+2 -2
View File
@@ -16,9 +16,9 @@
var/warcry
/obj/item/banner/examine(mob/user)
..()
. = ..()
if(inspiration_available)
to_chat(user, "<span class='notice'>Activate it in your hand to inspire nearby allies of this banner's allegiance!</span>")
. += "<span class='notice'>Activate it in your hand to inspire nearby allies of this banner's allegiance!</span>"
/obj/item/banner/attack_self(mob/living/carbon/human/user)
if(!inspiration_available)
+4 -6
View File
@@ -11,11 +11,9 @@
var/charge_cost = 30
/obj/item/borg/stun/attack(mob/living/M, mob/living/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK))
playsound(M, 'sound/weapons/genhit.ogg', 50, 1)
return FALSE
if(M.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK))
playsound(M, 'sound/weapons/genhit.ogg', 50, 1)
return FALSE
if(iscyborg(user))
var/mob/living/silicon/robot/R = user
if(!R.cell.use(charge_cost))
@@ -944,4 +942,4 @@
/obj/item/borg/apparatus/circuit/pre_attack(atom/A, mob/living/user, params)
. = ..()
if(istype(A, /obj/item/aiModule) && !stored) //If an admin wants a borg to upload laws, who am I to stop them? Otherwise, we can hint that it fails
to_chat(user, "<span class='warning'>This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up.</span>")
to_chat(user, "<span class='warning'>This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up.</span>")
+3 -3
View File
@@ -105,10 +105,10 @@
playsound(src.loc, "sparks", 50, 1)
shock(M)
/obj/item/twohanded/mjollnir/throw_impact(atom/target)
/obj/item/twohanded/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(isliving(target))
shock(target)
if(isliving(hit_atom))
shock(hit_atom)
/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
+1 -1
View File
@@ -35,7 +35,7 @@
/obj/item/stack/ore/bluespace_crystal/proc/blink_mob(mob/living/L)
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom)
/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(!..()) // not caught in mid-air
visible_message("<span class='notice'>[src] fizzles and disappears upon impact!</span>")
var/turf/T = get_turf(hit_atom)
@@ -92,6 +92,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
null, \
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("micro powered fan assembly", /obj/machinery/fan_assembly, 10, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
))
/obj/item/stack/sheet/metal
@@ -148,6 +149,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
GLOBAL_LIST_INIT(plasteel_recipes, list ( \
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = TRUE), \
new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), \
new/datum/stack_recipe("solar assembly", /obj/item/solar_assembly/, 6, time = 60), \
null, \
new /datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 6, time = 50, one_per_turf = 1, on_floor = 1), \
+9 -9
View File
@@ -76,23 +76,23 @@
. = ..()
/obj/item/stack/examine(mob/user)
..()
. = ..()
if (is_cyborg)
if(singular_name)
to_chat(user, "There is enough energy for [get_amount()] [singular_name]\s.")
. += "There is enough energy for [get_amount()] [singular_name]\s."
else
to_chat(user, "There is enough energy for [get_amount()].")
. += "There is enough energy for [get_amount()]."
return
if(singular_name)
if(get_amount()>1)
to_chat(user, "There are [get_amount()] [singular_name]\s in the stack.")
. += "There are [get_amount()] [singular_name]\s in the stack."
else
to_chat(user, "There is [get_amount()] [singular_name] in the stack.")
. += "There is [get_amount()] [singular_name] in the stack."
else if(get_amount()>1)
to_chat(user, "There are [get_amount()] in the stack.")
. += "There are [get_amount()] in the stack."
else
to_chat(user, "There is [get_amount()] in the stack.")
to_chat(user, "<span class='notice'>Alt-click to take a custom amount.</span>")
. += "There is [get_amount()] in the stack."
. += "<span class='notice'>Alt-click to take a custom amount.</span>"
/obj/item/stack/proc/get_amount()
if(is_cyborg)
@@ -335,7 +335,7 @@
merge(o)
. = ..()
/obj/item/stack/hitby(atom/movable/AM, skip, hitpush)
/obj/item/stack/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
if(istype(AM, merge_type))
merge(AM)
. = ..()
@@ -0,0 +1,164 @@
/////////////////////
// Tile reskinning //
/////////////////////
// Q: What is this?
// A: A simple function to allow you to change what tiles you place with a stack of tiles.
// Q: Why do it this way?
// A: This allows players more freedom to do beautiful-looking builds. Having five types of titanium tile would be clunky as heck.
// Q: Great! Can I use this for all floors?
// A: Unfortunately, this does not work on subtypes of plasteel and instead we must change the icon_state of these turfs instead, as the icon_regular_floor var that "saves" what type of floor a plasteel subtype turf was so once repaired...
// ... it'll go back to the floor it was instead of grey (medical floors turn white even after crowbaring the tile and putting it back). This stops changing turf_type from working.
/obj/item/stack/tile/mineral/titanium/attack_self(mob/user)
var/static/list/choices = list(
"Titanium" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle"),
"Yellow Titanium" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_yellow"),
"Blue Titanium" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_blue"),
"White Titanium" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_white"),
"Purple Titanium" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_purple"),
"Titanium Tile" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_old"),
"Yellow Titanium Tile" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_yellow"),
"Blue Titanium Tile" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_blue"),
"White Titanium Tile" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_white"),
"Purple Titanium Tile" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_purple"),
)
var/choice = show_radial_menu(user, src, choices, radius = 48, require_near = TRUE)
switch(choice)
if("Titanium")
turf_type = /turf/open/floor/mineral/titanium
icon_state = "tile_shuttle"
desc = "Sleek titanium tiles."
if("Yellow Titanium")
turf_type = /turf/open/floor/mineral/titanium/yellow
icon_state = "tile_shuttle_yellow"
desc = "Sleek yellow titanium tiles."
if("Blue Titanium")
turf_type = /turf/open/floor/mineral/titanium/blue
icon_state = "tile_shuttle_blue"
desc = "Sleek blue titanium tiles."
if("White Titanium")
turf_type = /turf/open/floor/mineral/titanium/white
icon_state = "tile_shuttle_white"
desc = "Sleek white titanium tiles."
if("Purple Titanium")
turf_type = /turf/open/floor/mineral/titanium/purple
icon_state = "tile_shuttle_purple"
desc = "Sleek purple titanium tiles."
if("Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old
icon_state = "tile_shuttle_old"
desc = "Titanium floor tiles."
if("Yellow Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/yellow
icon_state = "tile_shuttle_old_yellow"
desc = "Yellow titanium floor tiles."
if("Blue Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/blue
icon_state = "tile_shuttle_old_blue"
desc = "Blue titanium floor tiles."
if("White Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/white
icon_state = "tile_shuttle_old_white"
desc = "White titanium floor tiles."
if("Purple Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/purple
icon_state = "tile_shuttle_old_purple"
desc = "Purple titanium floor tiles."
/obj/item/stack/tile/plasteel
desc = "Metal tiles that can be placed on top of plating. Press Z or use these to change tiles."
var/tile_reskin_mode
tile_reskin_mode = "plasteel"
/obj/item/stack/tile/plasteel/attack_self(mob/user)
var/static/list/choices = list(
"Plasteel" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_plasteel"),
"White Plasteel" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_white"),
"Dark Plasteel" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_dark"),
"Chapel Flooring" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_chapel"),
"Shower" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_shower"),
"Freezer" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_freezer"),
"Kitchen" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_kitchen"),
"Grimy" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_grimy"),
"Solar Panel" = image(icon = 'icons/obj/tiles.dmi', icon_state = "tile_solar"),
)
var/choice = show_radial_menu(user, src, choices, radius = 48, require_near = TRUE)
switch(choice)
if("Plasteel")
turf_type = /turf/open/floor/plasteel
icon_state = "tile_plasteel"
desc = "Metal floor tiles."
tile_reskin_mode = "plasteel"
if("White Plasteel")
turf_type = /turf/open/floor/plasteel/white
icon_state = "tile_white"
desc = "White metal floor tiles."
tile_reskin_mode = "white plasteel"
if("Dark Plasteel")
turf_type = /turf/open/floor/plasteel/dark
icon_state = "tile_dark"
desc = "Dark metal floor tiles."
tile_reskin_mode = "dark plasteel"
if("Chapel Flooring")
turf_type = /turf/open/floor/plasteel/chapel
icon_state = "tile_chapel"
desc = "Those very dark floor tiles you find in the chapel a lot."
tile_reskin_mode = "chapel"
if("Shower")
turf_type = /turf/open/floor/plasteel/showroomfloor
icon_state = "tile_shower"
desc = "Tiles for showers, bathrooms and wetrooms."
tile_reskin_mode = "shower"
if("Freezer")
turf_type = /turf/open/floor/plasteel/freezer
icon_state = "tile_freezer"
desc = "High-grip flooring for walk-in freezers and chillers."
tile_reskin_mode = "freezer"
if("Kitchen")
turf_type = /turf/open/floor/plasteel/cafeteria
icon_state = "tile_kitchen"
desc = "Chequered pattern plasteel tiles."
tile_reskin_mode = "kitchen"
if("Grimy")
turf_type = /turf/open/floor/plasteel/grimy
icon_state = "tile_grimy"
desc = "I'm sure it'll look nice somewhere?"
tile_reskin_mode = "grimy"
if("Solar Panel")
turf_type = /turf/open/floor/plasteel/airless/solarpanel
icon_state = "tile_solar"
desc = "Flooring usually placed below solar panels. Using this indoors is an intergalactic fashion crime."
tile_reskin_mode = "solar"
/turf/open/floor/plasteel/attackby(obj/item/reskinstack, mob/user, params)
if(istype(reskinstack, /obj/item/stack/tile/plasteel))
var/obj/item/stack/tile/plasteel/hitfloor = reskinstack
switch(hitfloor.tile_reskin_mode)
if("plasteel")
icon_state = "floor"
icon_regular_floor = "floor"
if("white plasteel")
icon_state = "white"
icon_regular_floor = "white"
if("dark plasteel")
icon_state = "darkfull"
icon_regular_floor = "darkfull"
if("chapel")
icon_state = "chapel_alt"
icon_regular_floor = "chapel_alt"
if("shower")
icon_state = "showroomfloor"
icon_regular_floor = "showroomfloor"
if("freezer")
icon_state = "freezerfloor"
icon_regular_floor = "freezerfloor"
if("kitchen")
icon_state = "cafeteria"
icon_regular_floor = "cafeteria"
if("grimy")
icon_state = "grimy"
icon_regular_floor = "grimy"
if("solar")
icon_state = "solarpanel"
icon_regular_floor = "solarpanel"
else return
+1 -1
View File
@@ -66,7 +66,7 @@
return
if(!istype(target))
return
if(target.anchored)
if(target.anchored || (user in target))
return
if(isitem(target))
+34 -2
View File
@@ -230,6 +230,38 @@
new /obj/item/melee/baton/loaded(src)
update_icon()
/obj/item/storage/belt/slut
name = "slutcurity belt"
desc = "Holds a variety of gear for \"alternative\" peacekeeping."
icon_state = "slutbelt"
item_state = "slut"
obj/item/storage/belt/slut/ComponentInitialize()
. = ..()
GET_COMPONENT(STR, /datum/component/storage)
STR.max_items = 5
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.can_hold = typecacheof(list(
/obj/item/melee/baton,
/obj/item/melee/classic_baton,
/obj/item/grenade,
/obj/item/reagent_containers/spray/pepper,
/obj/item/restraints/handcuffs,
/obj/item/assembly/flash/handheld,
/obj/item/clothing/glasses,
/obj/item/reagent_containers/food/snacks/donut,
/obj/item/flashlight/seclite,
/obj/item/melee/classic_baton/telescopic,
/obj/item/radio,
/obj/item/clothing/gloves,
/obj/item/restraints/legcuffs/bola,
/obj/item/dildo,
/obj/item/leash,
/obj/item/condom,
/obj/item/bdsm_whip,
/obj/item/clothing/mask/gas/sechailer/slut
))
/obj/item/storage/belt/mining
name = "explorer's webbing"
desc = "A versatile chest rig, cherished by miners and hunters alike."
@@ -732,9 +764,9 @@
STR.can_hold = typecacheof(fitting_swords)
/obj/item/storage/belt/sabre/examine(mob/user)
..()
. = ..()
if(length(contents))
to_chat(user, "<span class='notice'>Alt-click it to quickly draw the blade.</span>")
. += "<span class='notice'>Alt-click it to quickly draw the blade.</span>"
/obj/item/storage/belt/sabre/AltClick(mob/user)
if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+3 -3
View File
@@ -963,7 +963,7 @@
/obj/item/storage/box/ingredients/italian/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/reagent_containers/food/snacks/grown/tomato(src)
new /obj/item/reagent_containers/food/snacks/faggot(src)
new /obj/item/reagent_containers/food/snacks/meatball(src)
new /obj/item/reagent_containers/food/drinks/bottle/wine(src)
/obj/item/storage/box/ingredients/vegetarian
@@ -986,7 +986,7 @@
new /obj/item/reagent_containers/food/snacks/grown/potato(src)
new /obj/item/reagent_containers/food/snacks/grown/tomato(src)
new /obj/item/reagent_containers/food/snacks/grown/corn(src)
new /obj/item/reagent_containers/food/snacks/faggot(src)
new /obj/item/reagent_containers/food/snacks/meatball(src)
/obj/item/storage/box/ingredients/fruity
theme_name = "fruity"
@@ -1042,7 +1042,7 @@
new /obj/item/reagent_containers/food/snacks/carpmeat(src)
new /obj/item/reagent_containers/food/snacks/meat/slab/xeno(src)
new /obj/item/reagent_containers/food/snacks/meat/slab/corgi(src)
new /obj/item/reagent_containers/food/snacks/faggot(src)
new /obj/item/reagent_containers/food/snacks/meatball(src)
/obj/item/storage/box/ingredients/exotic
theme_name = "exotic"
+5 -5
View File
@@ -37,12 +37,12 @@
icon_state = "[icon_type]box"
/obj/item/storage/fancy/examine(mob/user)
..()
. = ..()
if(fancy_open)
if(length(contents) == 1)
to_chat(user, "There is one [icon_type] left.")
. += "There is one [icon_type] left."
else
to_chat(user, "There are [contents.len <= 0 ? "no" : "[contents.len]"] [icon_type]s left.")
. += "There are [contents.len <= 0 ? "no" : "[contents.len]"] [icon_type]s left."
/obj/item/storage/fancy/attack_self(mob/user)
fancy_open = !fancy_open
@@ -144,8 +144,8 @@
STR.can_hold = typecacheof(list(/obj/item/clothing/mask/cigarette, /obj/item/lighter))
/obj/item/storage/fancy/cigarettes/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to extract contents.</span>")
. = ..()
. += "<span class='notice'>Alt-click to extract contents.</span>"
/obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+1 -1
View File
@@ -352,7 +352,7 @@
/////////////
/obj/item/storage/belt/organbox
name = "Organ Storge"
name = "Organ Storage"
desc = "A compact box that helps hold massive amounts of implants, organs, and some tools. Has a belt clip for easy carrying"
w_class = WEIGHT_CLASS_BULKY
icon = 'icons/obj/mysterybox.dmi'
+3 -3
View File
@@ -106,10 +106,10 @@
STR.can_hold = typecacheof(list(/obj/item/clothing/accessory/medal))
/obj/item/storage/lockbox/medal/examine(mob/user)
..()
. = ..()
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
if(!locked)
to_chat(user, "<span class='notice'>Alt-click to [open ? "close":"open"] it.</span>")
. += "<span class='notice'>Alt-click to [open ? "close":"open"] it.</span>"
/obj/item/storage/lockbox/medal/AltClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE))
@@ -195,4 +195,4 @@
/obj/item/storage/lockbox/medal/medical/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/accessory/medal/ribbon/medical_doctor(src)
new /obj/item/clothing/accessory/medal/ribbon/medical_doctor(src)
+2 -2
View File
@@ -31,8 +31,8 @@
STR.max_combined_w_class = 14
/obj/item/storage/secure/examine(mob/user)
..()
to_chat(user, text("The service panel is currently <b>[open ? "unscrewed" : "screwed shut"]</b>."))
. = ..()
. += "The service panel is currently <b>[open ? "unscrewed" : "screwed shut"]</b>."
/obj/item/storage/secure/attackby(obj/item/W, mob/user, params)
if(SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED))
+13 -1
View File
@@ -1,7 +1,7 @@
/obj/item/storage/box/syndicate
/obj/item/storage/box/syndicate/PopulateContents()
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1, "stando" = 1)))
if("bloodyspai") // 30 tc now this is more right
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
new /obj/item/clothing/mask/chameleon(src) // Goes with above
@@ -144,6 +144,18 @@
new /obj/item/card/id/syndicate(src) // 2 tc
new /obj/item/chameleon(src) // 7 tc
if("stando") // 31~ tc worth
new /obj/item/clothing/head/delinquent(src) // Just like your favorite anime
new /obj/item/clothing/suit/chameleon(src) // part 2 of the outfit
new /obj/item/clothing/under/chameleon(src) // part 3 of the outfit
new /obj/item/clothing/mask/chameleon(src) // for sounding like your favorite anime protagonist
new /obj/item/encryptionkey/syndicate(src) // 2 tc
new /obj/item/card/id/syndicate(src) // 2 tc,
new /obj/item/clothing/gloves/rapid(src) // 8 tc
new /obj/item/storage/box/syndie_kit/guardian(src) // 15 tc
/obj/item/storage/box/syndie_kit
name = "box"
desc = "A sleek, sturdy box."
+7 -9
View File
@@ -40,7 +40,7 @@
cell = new preload_cell_type(src)
update_icon()
/obj/item/melee/baton/throw_impact(atom/hit_atom)
/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
..()
//Only mob/living types have stun handling
if(status && prob(throw_hit_chance) && iscarbon(hit_atom))
@@ -90,9 +90,9 @@
. = ..()
var/obj/item/stock_parts/cell/copper_top = get_cell()
if(copper_top)
to_chat(user, "<span class='notice'>\The [src] is [round(copper_top.percent())]% charged.</span>")
. += "<span class='notice'>\The [src] is [round(copper_top.percent())]% charged.</span>"
else
to_chat(user, "<span class='warning'>\The [src] does not have a power source installed.</span>")
. += "<span class='warning'>\The [src] does not have a power source installed.</span>"
/obj/item/melee/baton/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/cell))
@@ -167,11 +167,9 @@
/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user)
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return FALSE
if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return FALSE
var/stunpwr = stunforce
var/obj/item/stock_parts/cell/our_cell = get_cell()
if(!our_cell)
@@ -250,4 +248,4 @@
sparkler?.activate()
. = ..()
#undef STUNBATON_CHARGE_LENIENCY
#undef STUNBATON_CHARGE_LENIENCY
+4 -4
View File
@@ -74,15 +74,15 @@
/obj/item/tank/examine(mob/user)
var/obj/icon = src
..()
. = ..()
if (istype(src.loc, /obj/item/assembly))
icon = src.loc
if(!in_range(src, user))
if (icon == src)
to_chat(user, "<span class='notice'>If you want any more information you'll need to get closer.</span>")
. += "<span class='notice'>If you want any more information you'll need to get closer.</span>"
return
to_chat(user, "<span class='notice'>The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa.</span>")
. += "<span class='notice'>The pressure gauge reads [round(src.air_contents.return_pressure(),0.01)] kPa.</span>"
var/celsius_temperature = src.air_contents.temperature-T0C
var/descriptive
@@ -100,7 +100,7 @@
else
descriptive = "furiously hot"
to_chat(user, "<span class='notice'>It feels [descriptive].</span>")
. += "<span class='notice'>It feels [descriptive].</span>"
/obj/item/tank/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
+1 -1
View File
@@ -235,7 +235,7 @@
if(proximity && ismovableatom(O) && O != sliver)
Consume(O, user)
/obj/item/hemostat/supermatter/throw_impact(atom/hit_atom) // no instakill supermatter javelins
/obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins
if(sliver)
sliver.forceMove(loc)
to_chat(usr, "<span class='notice'>\The [sliver] falls out of \the [src] as you throw them.</span>")
+2 -2
View File
@@ -220,8 +220,8 @@
/obj/item/weldingtool/examine(mob/user)
..()
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
. = ..()
. += "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."
/obj/item/weldingtool/is_hot()
return welding * heat
+10 -10
View File
@@ -84,7 +84,7 @@
else
return ..()
/obj/item/toy/balloon/throw_impact(atom/hit_atom)
/obj/item/toy/balloon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(!..()) //was it caught by a mob?
balloon_burst(hit_atom)
@@ -148,8 +148,8 @@
var/bullets = 7
/obj/item/toy/gun/examine(mob/user)
..()
to_chat(user, "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left.")
. = ..()
. += "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left."
/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, params)
@@ -204,8 +204,8 @@
src.icon_state = text("357OLD-[]", src.amount_left)
/obj/item/toy/ammo/gun/examine(mob/user)
..()
to_chat(user, "There [amount_left == 1 ? "is" : "are"] [amount_left] cap\s left.")
. = ..()
. += "There [amount_left == 1 ? "is" : "are"] [amount_left] cap\s left."
/*
* Toy swords
@@ -384,7 +384,7 @@
/obj/item/toy/snappop/fire_act(exposed_temperature, exposed_volume)
pop_burst()
/obj/item/toy/snappop/throw_impact(atom/hit_atom)
/obj/item/toy/snappop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(!..())
pop_burst()
@@ -1007,7 +1007,7 @@
icon_state = "minimeteor"
w_class = WEIGHT_CLASS_SMALL
/obj/item/toy/minimeteor/throw_impact(atom/hit_atom)
/obj/item/toy/minimeteor/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(!..())
playsound(src, 'sound/effects/meteorimpact.ogg', 40, 1)
for(var/mob/M in urange(10, src))
@@ -1056,7 +1056,7 @@
if(user.dropItemToGround(src))
throw_at(target, throw_range, throw_speed)
/obj/item/toy/snowball/throw_impact(atom/hit_atom)
/obj/item/toy/snowball/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(!..())
playsound(src, 'sound/effects/pop.ogg', 20, 1)
qdel(src)
@@ -1098,8 +1098,8 @@
to_chat(user, "<span class='alert'>The cogwheels are already turning!</span>")
/obj/item/toy/clockwork_watch/examine(mob/user)
..()
to_chat(user, "<span class='info'>Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]")
. = ..()
. += "<span class='info'>Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]"
/*
* Toy Dagger
+8
View File
@@ -68,6 +68,14 @@
resistance_flags = NONE
grind_results = list("aluminium" = 10)
/obj/item/trash/soy_food
name = "soyfood"
icon_state = "soy_food"
/obj/item/trash/carbonnanotube_noodles
name = "carbon nanotube noodles"
icon_state = "carbonnanotube_noodles"
/obj/item/trash/attack(mob/M, mob/living/user)
return
+2 -2
View File
@@ -521,9 +521,9 @@
AddComponent(/datum/component/jousting)
/obj/item/twohanded/spear/examine(mob/user)
..()
. = ..()
if(explosive)
to_chat(user, "<span class='notice'>Use in your hands to activate the attached explosive.</span><br><span class='notice'>Alt-click to set your war cry.</span><br><span class='notice'>Right-click in combat mode to wield</span>")
. += "<span class='notice'>Use in your hands to activate the attached explosive.</span><br><span class='notice'>Alt-click to set your war cry.</span><br><span class='notice'>Right-click in combat mode to wield</span>"
/obj/item/twohanded/spear/update_icon()
if(explosive)
+4 -4
View File
@@ -30,14 +30,14 @@
name = "\improper [machine_name] restocking unit"
/obj/item/vending_refill/examine(mob/user)
..()
. = ..()
var/num = get_part_rating()
if (num == INFINITY)
to_chat(user, "It's sealed tight, completely full of supplies.")
. += "It's sealed tight, completely full of supplies."
else if (num == 0)
to_chat(user, "It's empty!")
. += "It's empty!"
else
to_chat(user, "It can restock [num] item\s.")
. += "It can restock [num] item\s."
/obj/item/vending_refill/get_part_rating()
if (!products || !contraband || !premium)
+35 -3
View File
@@ -125,10 +125,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
qdel(src) //If this ever happens, it's because you lost an arm
/obj/item/claymore/highlander/examine(mob/user)
..()
to_chat(user, "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade.")
. = ..()
. += "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade."
if(nuke_disk)
to_chat(user, "<span class='boldwarning'>It's holding the nuke disk!</span>")
. += "<span class='boldwarning'>It's holding the nuke disk!</span>"
/obj/item/claymore/highlander/attack(mob/living/target, mob/living/user)
. = ..()
@@ -663,3 +663,35 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
to_chat(user, "<span class='warning'>[M] is too close to use [src] on.</span>")
return
M.attack_hand(user)
/obj/item/bdsm_whip
name = "bdsm whip"
desc = "A less lethal version of the whip the librarian has. Still hurts, but just the way you like it."
icon_state = "whip"
item_state = "chain"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
damtype = AROUSAL
throwforce = 0
force = 5
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
hitsound = 'sound/weapons/whip.ogg'
/obj/item/bdsm_whip/ridingcrop
name = "riding crop"
desc = "For teaching a lesson in a more compact fashion."
icon_state = "ridingcrop"
force = 10
/obj/item/bdsm_whip/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is getting just a little too kinky!</span>")
return (OXYLOSS)
/obj/item/bdsm_whip/attack(mob/M, mob/user)
if(user.zone_selected == BODY_ZONE_PRECISE_GROIN)
playsound(loc, 'sound/weapons/whip.ogg', 30)
M.visible_message("<span class='userdanger'>[user] has [pick(attack_verb)] [M] on the ass!</span>")
else
return ..(M, user)
+12 -1
View File
@@ -46,7 +46,7 @@
if(BURN)
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
/obj/hitby(atom/movable/AM)
/obj/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
..()
var/throwdamage = AM.throwforce
if(isobj(AM))
@@ -126,6 +126,17 @@
if(. && !play_soundeffect)
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
/obj/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
return TRUE
/obj/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
collision_damage(pusher, force, direction)
return TRUE
/obj/proc/collision_damage(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10)
take_damage(amt, BRUTE)
/obj/attack_slime(mob/living/simple_animal/slime/user)
if(!user.is_adult)
return
+5 -5
View File
@@ -80,8 +80,8 @@
SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue)
anchored = anchorvalue
/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
..()
/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
. = ..()
if(obj_flags & FROZEN)
visible_message("<span class='danger'>[src] shatters into a million pieces!</span>")
qdel(src)
@@ -224,11 +224,11 @@
.["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]"
/obj/examine(mob/user)
..()
. = ..()
if(obj_flags & UNIQUE_RENAME)
to_chat(user, "<span class='notice'>Use a pen on it to rename it or change its description.</span>")
. += "<span class='notice'>Use a pen on it to rename it or change its description.</span>"
if(unique_reskin && (!current_skin || always_reskinnable))
to_chat(user, "<span class='notice'>Alt-click it to reskin it.</span>")
. += "<span class='notice'>Alt-click it to reskin it.</span>"
/obj/AltClick(mob/user)
. = ..()
+4 -4
View File
@@ -88,15 +88,15 @@
structureclimber = null
/obj/structure/examine(mob/user)
..()
. = ..()
if(!(resistance_flags & INDESTRUCTIBLE))
if(resistance_flags & ON_FIRE)
to_chat(user, "<span class='warning'>It's on fire!</span>")
. += "<span class='warning'>It's on fire!</span>"
if(broken)
to_chat(user, "<span class='notice'>It appears to be broken.</span>")
. += "<span class='notice'>It appears to be broken.</span>"
var/examine_status = examine_status(user)
if(examine_status)
to_chat(user, examine_status)
. += examine_status
/obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls.
var/healthpercent = (obj_integrity/max_integrity) * 100
+1 -1
View File
@@ -39,7 +39,7 @@
/obj/structure/AIcore/latejoin_inactive/examine(mob/user)
. = ..()
to_chat(user, "Its transmitter seems to be [active? "on" : "off"].")
. += "Its transmitter seems to be [active? "on" : "off"]."
/obj/structure/AIcore/latejoin_inactive/proc/is_available() //If people still manage to use this feature to spawn-kill AI latejoins ahelp them.
if(!available)
@@ -23,9 +23,9 @@
var/bolts = TRUE
/obj/structure/bed/examine(mob/user)
..()
. = ..()
if(bolts)
to_chat(user, "<span class='notice'>It's held together by a couple of <b>bolts</b>.</span>")
. += "<span class='notice'>It's held together by a couple of <b>bolts</b>.</span>"
/obj/structure/bed/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
@@ -148,8 +148,8 @@
..()
/obj/item/roller/robo/examine(mob/user)
..()
to_chat(user, "The dock is [loaded ? "loaded" : "empty"].")
. = ..()
. += "The dock is [loaded ? "loaded" : "empty"]."
/obj/item/roller/robo/deploy_roller(mob/user, atom/location)
if(loaded)
@@ -200,6 +200,12 @@
. = ..()
update_owner(M)
/obj/structure/bed/secbed
name = "security pet bed"
desc = "A comfy-looking pet bed, now in the classic security colors."
icon_state = "secbed"
anchored = FALSE
/obj/structure/bed/alien
name = "resting contraption"
desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?"
@@ -15,10 +15,10 @@
layer = OBJ_LAYER
/obj/structure/chair/examine(mob/user)
..()
to_chat(user, "<span class='notice'>It's held together by a couple of <b>bolts</b>.</span>")
. = ..()
. += "<span class='notice'>It's held together by a couple of <b>bolts</b>.</span>"
if(!has_buckled_mobs())
to_chat(user, "<span class='notice'>Drag your sprite to sit in it.</span>")
. += "<span class='notice'>Drag your sprite to sit in it.</span>"
/obj/structure/chair/Initialize()
. = ..()
+4 -4
View File
@@ -292,13 +292,13 @@ LINEN BINS
var/obj/item/hidden = null
/obj/structure/bedsheetbin/examine(mob/user)
..()
. = ..()
if(amount < 1)
to_chat(user, "There are no bed sheets in the bin.")
. += "There are no sheets in the bin."
else if(amount == 1)
to_chat(user, "There is one bed sheet in the bin.")
. += "There is one sheet in the bin."
else
to_chat(user, "There are [amount] bed sheets in the bin.")
. += "There are [amount] sheets in the bin."
/obj/structure/bedsheetbin/update_icon()
@@ -85,22 +85,22 @@
add_overlay("unlocked")
/obj/structure/closet/examine(mob/user)
..()
. = ..()
if(welded)
to_chat(user, "<span class='notice'>It's <b>welded</b> shut.</span>")
. += "<span class='notice'>It's <b>welded</b> shut.</span>"
if(anchored)
to_chat(user, "<span class='notice'>It is <b>bolted</b> to the ground.</span>")
. += "<span class='notice'>It is <b>bolted</b> to the ground.</span>"
if(opened)
to_chat(user, "<span class='notice'>The parts are <b>welded</b> together.</span>")
. += "<span class='notice'>The parts are <b>welded</b> together.</span>"
else if(secure && !opened)
else if(broken)
to_chat(user, "<span class='notice'>The lock is <b>screwed</b> in.</span>")
. += "<span class='notice'>The lock is <b>screwed</b> in.</span>"
else if(secure)
to_chat(user, "<span class='notice'>Alt-click to [locked ? "unlock" : "lock"].</span>")
. += "<span class='notice'>Alt-click to [locked ? "unlock" : "lock"].</span>"
if(isliving(user))
var/mob/living/L = user
if(HAS_TRAIT(L, TRAIT_SKITTISH))
to_chat(user, "<span class='notice'>Ctrl-Shift-click [src] to jump inside.</span>")
. += "<span class='notice'>Ctrl-Shift-click [src] to jump inside.</span>"
/obj/structure/closet/CanPass(atom/movable/mover, turf/target)
if(wall_mounted)
@@ -5,9 +5,9 @@
var/registered_name = null
/obj/structure/closet/secure_closet/personal/examine(mob/user)
..()
. = ..()
if(registered_name)
to_chat(user, "<span class='notice'>The display reads, \"Owned by [registered_name]\".</span>")
. += "<span class='notice'>The display reads, \"Owned by [registered_name]\".</span>"
/obj/structure/closet/secure_closet/personal/check_access(obj/item/card/id/I)
. = ..()
+5 -5
View File
@@ -38,14 +38,14 @@
return ..()
/obj/structure/displaycase/examine(mob/user)
..()
. = ..()
if(alert)
to_chat(user, "<span class='notice'>Hooked up with an anti-theft system.</span>")
. += "<span class='notice'>Hooked up with an anti-theft system.</span>"
if(showpiece)
to_chat(user, "<span class='notice'>There's [showpiece] inside.</span>")
. += "<span class='notice'>There's [showpiece] inside.</span>"
if(trophy_message)
to_chat(user, "The plaque reads:")
to_chat(user, trophy_message)
. += "The plaque reads:"
. += trophy_message
/obj/structure/displaycase/proc/dump()
+12 -10
View File
@@ -26,28 +26,28 @@
..()
/obj/structure/door_assembly/examine(mob/user)
..()
. = ..()
var/doorname = ""
if(created_name)
doorname = ", written on it is '[created_name]'"
switch(state)
if(AIRLOCK_ASSEMBLY_NEEDS_WIRES)
if(anchored)
to_chat(user, "<span class='notice'>The anchoring bolts are <b>wrenched</b> in place, but the maintenance panel lacks <i>wiring</i>.</span>")
. += "<span class='notice'>The anchoring bolts are <b>wrenched</b> in place, but the maintenance panel lacks <i>wiring</i>.</span>"
else
to_chat(user, "<span class='notice'>The assembly is <b>welded together</b>, but the anchoring bolts are <i>unwrenched</i>.</span>")
. += "<span class='notice'>The assembly is <b>welded together</b>, but the anchoring bolts are <i>unwrenched</i>.</span>"
if(AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS)
to_chat(user, "<span class='notice'>The maintenance panel is <b>wired</b>, but the circuit slot is <i>empty</i>.</span>")
. += "<span class='notice'>The maintenance panel is <b>wired</b>, but the circuit slot is <i>empty</i>.</span>"
if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
to_chat(user, "<span class='notice'>The circuit is <b>connected loosely</b> to its slot, but the maintenance panel is <i>unscrewed and open</i>.</span>")
. += "<span class='notice'>The circuit is <b>connected loosely</b> to its slot, but the maintenance panel is <i>unscrewed and open</i>.</span>"
if(!mineral && !glass && !noglass)
to_chat(user, "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname]. There are <i>empty</i> slots for glass windows and mineral covers.</span>")
. += "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname]. There are <i>empty</i> slots for glass windows and mineral covers.</span>"
else if(!mineral && glass && !noglass)
to_chat(user, "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname]. There are <i>empty</i> slots for mineral covers.</span>")
. += "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname]. There are <i>empty</i> slots for mineral covers.</span>"
else if(mineral && !glass && !noglass)
to_chat(user, "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname]. There are <i>empty</i> slots for glass windows.</span>")
. += "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname]. There are <i>empty</i> slots for glass windows.</span>"
else
to_chat(user, "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname].</span>")
. += "<span class='notice'>There is a small <i>paper</i> placard on the assembly[doorname].</span>"
/obj/structure/door_assembly/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/pen))
@@ -205,6 +205,9 @@
if(!mineral)
if(istype(G, /obj/item/stack/sheet/mineral) && G.sheettype)
var/M = G.sheettype
var/mineralassembly = text2path("/obj/structure/door_assembly/door_assembly_[M]")
if(!mineralassembly)
return
if(G.get_amount() >= 2)
playsound(src, 'sound/items/crowbar.ogg', 100, 1)
user.visible_message("[user] adds [G.name] to the airlock assembly.", \
@@ -214,7 +217,6 @@
return
to_chat(user, "<span class='notice'>You install [M] plating into the airlock assembly.</span>")
G.use(2)
var/mineralassembly = text2path("/obj/structure/door_assembly/door_assembly_[M]")
var/obj/structure/door_assembly/MA = new mineralassembly(loc)
transfer_assembly_vars(src, MA, TRUE)
else
+2 -2
View File
@@ -22,8 +22,8 @@
stored_extinguisher = new /obj/item/extinguisher(src)
/obj/structure/extinguisher_cabinet/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to [opened ? "close":"open"] it.</span>")
. = ..()
. += "<span class='notice'>Alt-click to [opened ? "close":"open"] it.</span>"
/obj/structure/extinguisher_cabinet/Destroy()
if(stored_extinguisher)
+5 -15
View File
@@ -23,24 +23,14 @@
var/current_action = 0 // What's currently happening to the femur breaker
/obj/structure/femur_breaker/examine(mob/user)
..()
var/msg = ""
msg += "It is [anchored ? "secured to the floor." : "unsecured."]<br/>"
. = ..()
. += "It is [anchored ? "secured to the floor." : "unsecured."]"
if (slat_status == BREAKER_SLAT_RAISED)
msg += "The breaker slat is in a neutral position."
. += "The breaker slat is in a neutral position."
else
msg += "The breaker slat is lowered, and must be raised."
. += "The breaker slat is lowered, and must be raised."
if (LAZYLEN(buckled_mobs))
msg += "<br/>"
msg += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
to_chat(user, msg)
return msg
. += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
/obj/structure/femur_breaker/attack_hand(mob/user)
add_fingerprint(user)
+3 -4
View File
@@ -29,13 +29,12 @@
update_cut_status()
/obj/structure/fence/examine(mob/user)
.=..()
. = ..()
switch(hole_size)
if(MEDIUM_HOLE)
user.show_message("There is a large hole in \the [src].")
. += "There is a large hole in \the [src]."
if(LARGE_HOLE)
user.show_message("\The [src] has been completely cut through.")
. += "\The [src] has been completely cut through."
/obj/structure/fence/end
icon_state = "end"
+2 -1
View File
@@ -1,12 +1,13 @@
/obj/structure/flora
resistance_flags = FLAMMABLE
max_integrity = 150
max_integrity = 25
anchored = TRUE
//trees
/obj/structure/flora/tree
name = "tree"
desc = "A large tree."
max_integrity = 80
density = TRUE
pixel_x = -16
layer = FLY_LAYER
@@ -44,6 +44,7 @@
roundstart = FALSE
death = FALSE
anchored = FALSE
move_resist = MOVE_FORCE_NORMAL
density = FALSE
flavour_text = "<span class='big bold'>You are an ash walker.</span><b> Your tribe worships <span class='danger'>the Necropolis</span>. The wastes are sacred ground, its monsters a blessed bounty. \
You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest.</b>"
@@ -118,6 +119,7 @@
roundstart = FALSE
death = FALSE
anchored = FALSE
move_resist = MOVE_FORCE_NORMAL
density = FALSE
var/has_owner = FALSE
var/can_transfer = TRUE //if golems can switch bodies to this new shell
@@ -210,6 +212,7 @@
conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... "
assignedrole = "Hermit"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/hermit/Initialize(mapload)
. = ..()
@@ -248,6 +251,112 @@
new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src))
return ..()
//Duo malfunctioning cryostasis sleepers: Spawns in big makeshift shelters in lavaland.
/obj/effect/mob_spawn/human/duohermit
name = "malfunctioning cryostasis sleeper"
desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed."
mob_name = "a stranded hermit"
job_description = "Lavaland Hermit"
icon = 'icons/obj/lavaland/spawners.dmi'
icon_state = "cryostasis_sleeper"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "<span class='big bold'>You and another have been stranded in this planet for quite some time now.</span><b> Each day you barely scrape by, and between the terrible \
conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you and your friend got here... "
assignedrole = "Hermit"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/duohermit/Initialize(mapload)
. = ..()
var/arrpee = rand(1,3)
switch(arrpee)
if(1)
flavour_text += "you were an intern at a rather odd deep space facility. You weren't quite sure how things worked or what they were doing there, but it was your first day on the \
job. A day that was abruptly interrupted by gunfire and alarms. Luckily enough, your handy crowbar skills managed to get you to an escape pod before it was too late.</b>"
outfit.uniform = /obj/item/clothing/under/assistantformal
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
outfit.back = /obj/item/storage/backpack
if(2)
flavour_text += "you were a volunteer test subject for a state of the art deep space facility. You didn't care much about who you were working with, but in the end, the paycheck \
was really, really good. To this day, you're not quite sure which sort of prototype implants were used on you, as you seem to remember little but the headache that struck you once \
the escape pod finally hit the ground and your seatbelt failed to keep you buckled.</b>"
outfit.uniform = /obj/item/clothing/under/rank/scientist
outfit.suit = /obj/item/clothing/suit/toggle/labcoat
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
outfit.back = /obj/item/storage/backpack
if(3)
flavour_text += "you were a doctor at a state of the art deep space facility. For who exactly you were conducting research for, not even you are quite sure. Only that the paycheck \
at the end of the month was good enough. In the end, when said facility was attacked by Nanotransen, you and another were the only ones to have made it out alive. Or so it seemed.</b>"
outfit.uniform = /obj/item/clothing/under/rank/medical
outfit.suit = /obj/item/clothing/suit/toggle/labcoat
outfit.back = /obj/item/storage/backpack/medic
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
/obj/effect/mob_spawn/human/duohermit/Destroy()
new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src))
return ..()
//Exiles: Stranded exiles that have been left in Snowdin. Can be easily adapted for other roles as well.
/obj/effect/mob_spawn/human/exiled
name = "used bed"
desc = "Still warm."
mob_name = "exiled"
job_description = "Exiles"
icon = 'icons/obj/objects.dmi'
icon_state = "bed"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "As the last escape shuttle left the sector, you were left for dead, stranded in a cold hell where you make do, until hopefully someone finds you. \
Every day, you pause and recollect your memories from before it all happened... "
assignedrole = "Arctic Exile"
mirrorcanloadappearance = TRUE
ghost_usable = FALSE
/obj/effect/mob_spawn/human/exiled/Initialize(mapload)
. = ..()
delayusability(9000, FALSE) //Probably should not show up on the menu? It gives it away that snowdin is the away mission.
var/arrpee = rand(1,3)
switch(arrpee)
if(1)
flavour_text += "You were a lowly engineer, hired by Kinaris to make sure the turbines from their mining operation remained functional. \
You remember the day the mining team descended for the very last time into the depths of the shafts, only to never return. \
The agonizing screams from whatever now haunts those mines still brings a shiver down your spine."
outfit.uniform = /obj/item/clothing/under/rank/engineer
outfit.suit = /obj/item/clothing/suit/hooded/wintercoat/engineering
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
outfit.back = /obj/item/storage/backpack/industrial
outfit.id = /obj/item/card/id/away/snowdin/eng
outfit.implants = list(/obj/item/implant/exile) //Made it so they cannot simply exit through the gateway at will.
if(2)
flavour_text += "You were a plasma researcher, hired by Kinaris to oversee a small research division in a remote, isolated little icy planet, \
you remember the day the mining team descended for the very last time into the depths of the shafts, only to never return. \
While you haven't heard them yourself, reports say the sounds that were heard over radio were likely not of this world."
outfit.uniform = /obj/item/clothing/under/rank/scientist
outfit.suit = /obj/item/clothing/suit/hooded/wintercoat/science
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
outfit.back = /obj/item/storage/backpack/science
outfit.id = /obj/item/card/id/away/snowdin/sci
outfit.implants = list(/obj/item/implant/exile) //Made it so they cannot simply exit through the gateway at will.
if(3)
flavour_text += "You were a junior doctor, hired by Kinaris to oversee the mental state of a plasma mining operation's miners. \
Over and over you reported that the miners were having constant, similar types of hallucinations and that perhaps the whole operation should pause \
until further investigation was concluded, but command shrugged it off as an episode of mass hallucination... Until the miners never came back."
outfit.uniform = /obj/item/clothing/under/rank/medical
outfit.suit = /obj/item/clothing/suit/hooded/wintercoat/medical
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
outfit.back = /obj/item/storage/backpack/medic
outfit.id = /obj/item/card/id/away/snowdin/med
outfit.implants = list(/obj/item/implant/exile) //Made it so they cannot simply exit through the gateway at will.
/obj/effect/mob_spawn/human/exiled/Destroy()
new/obj/structure/bed(get_turf(src))
return ..()
//Broken rejuvenation pod: Spawns in animal hospitals in lavaland. Ghosts become disoriented interns and are advised to search for help.
/obj/effect/mob_spawn/human/doctor/alive/lavaland
name = "broken rejuvenation pod"
@@ -258,6 +367,7 @@
everyone's gone. One of the cats scratched you just a few minutes ago. That's why you were in the pod - to heal the scratch. The scabs are still fresh; you see them right now. So where is \
everyone? Where did they go? What happened to the hospital? And is that <i>smoke</i> you smell? You need to find someone else. Maybe they can tell you what happened.</b>"
assignedrole = "Translocated Vet"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/doctor/alive/lavaland/Destroy()
var/obj/structure/fluff/empty_sleeper/S = new(drop_location())
@@ -318,6 +428,7 @@
flavour_text = "<span class='big bold'>You are a staff member of a top-of-the-line space hotel!</span><b> Cater to guests and <font size=6><b>DON'T</b></font> leave the hotel, lest the manager fire you for\
dereliction of duty!</b>"
assignedrole = "Hotel Staff"
mirrorcanloadappearance = TRUE
/datum/outfit/hotelstaff
name = "Hotel Staff"
@@ -335,6 +446,7 @@
flavour_text = "<span class='big bold'>You are a peacekeeper</span><b> assigned to this hotel to protect the interests of the company while keeping the peace between \
guests and the staff. Do <font size=6>NOT</font> leave the hotel, as that is grounds for contract termination.</b>"
objectives = "Do not leave your assigned hotel. Try and keep the peace between staff and guests, non-lethal force heavily advised if possible."
mirrorcanloadappearance = TRUE
/datum/outfit/hotelstaff/security
name = "Hotel Secuirty"
@@ -431,6 +543,7 @@
<br>\
<span class='danger'><b>The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives.</b></span></font>"
outfit = /datum/outfit/syndicate_empty/SBC
mirrorcanloadappearance = TRUE
/datum/outfit/syndicate_empty/SBC
name = "Syndicate Battlecruiser Ship Operative"
@@ -444,6 +557,7 @@
<br>\
<span class='danger'><b>Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!</b></span></span>"
outfit = /datum/outfit/syndicate_empty/SBC/assault
mirrorcanloadappearance = TRUE
/datum/outfit/syndicate_empty/SBC/assault
name = "Syndicate Battlecruiser Assault Operative"
@@ -463,6 +577,7 @@
<span class='danger'><b>As the captain, this whole operation falls on your shoulders.</b></span> You do not need to nuke the station, causing sufficient damage and preventing your ship from being destroyed will be enough.</span>"
outfit = /datum/outfit/syndicate_empty/SBC/assault/captain
id_access_list = list(150,151)
mirrorcanloadappearance = TRUE
/datum/outfit/syndicate_empty/SBC/assault/captain
name = "Syndicate Battlecruiser Captain"
@@ -497,6 +612,7 @@
l_pocket = /obj/item/assembly/flash/handheld
job_description = "Oldstation Crew"
assignedrole = "Ancient Crew"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/oldsec/Destroy()
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
@@ -523,6 +639,7 @@
gloves = /obj/item/clothing/gloves/color/fyellow/old
l_pocket = /obj/item/tank/internals/emergency_oxygen
assignedrole = "Ancient Crew"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/oldeng/Destroy()
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
@@ -548,6 +665,7 @@
l_pocket = /obj/item/stack/medical/bruise_pack
assignedrole = "Ancient Crew"
job_description = "Oldstation Crew"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/oldsci/Destroy()
new/obj/structure/showcase/machinery/oldpod/used(drop_location())

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