Merge remote-tracking branch 'citadel/master' into tgsync

This commit is contained in:
silicons
2021-01-08 00:33:57 -08:00
231 changed files with 8727 additions and 6166 deletions
+21 -2
View File
@@ -1,6 +1,13 @@
/obj/effect/decal/cleanable
gender = PLURAL
layer = ABOVE_NORMAL_TURF_LAYER
/// Is this kind of cleanable decal persistent
var/persistent = FALSE
/// Can we stack multiple in one tile?
var/persistence_allow_stacking = FALSE
/// Are we deleted by turf changes?
var/wiped_by_floor_change = FALSE
var/list/random_icon_states = null
var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
@@ -29,9 +36,21 @@
addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, beauty)), 0)
/**
* A data list is passed into this.
* This should return null to skip saving, or the type of data to save. Type must be /cleanable.
*/
/obj/effect/decal/cleanable/proc/PersistenceSave(list/data)
return type
/**
* Loads from a data list.
*/
/obj/effect/decal/cleanable/proc/PersistenceLoad(list/data)
return
/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(mergeable_decal)
qdel(C)
return mergeable_decal
/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks))
@@ -6,6 +6,7 @@
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
mergeable_decal = FALSE
bloodiness = 0 //This isn't supposed to be bloody.
persistent = TRUE
var/body_colors = "#e3ba84" //a default color just in case.
var/gibs_reagent_id = /datum/reagent/liquidgibs
var/gibs_bloodtype = "A+"
@@ -31,6 +32,10 @@
flesh.color = body_colors
add_overlay(flesh)
/obj/effect/decal/cleanable/blood/gibs/PersistenceSave(list/data)
. = ..()
return /obj/effect/decal/cleanable/blood/gibs/old
/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
return
@@ -159,6 +164,10 @@
. = ..()
update_icon()
/obj/effect/decal/cleanable/blood/gibs/slime/PersistenceSave(list/data)
. = ..()
return type
/obj/effect/decal/cleanable/blood/gibs/slime/update_icon()
add_atom_colour(body_colors, FIXED_COLOUR_PRIORITY)
cut_overlays()
@@ -198,6 +207,10 @@
. = ..()
update_icon()
/obj/effect/decal/cleanable/blood/gibs/synth/PersistenceSave(list/data)
. = ..()
return type
//IPCs
/obj/effect/decal/cleanable/blood/gibs/ipc
desc = "They look sharp yet oozing."
@@ -209,6 +222,10 @@
. = ..()
update_icon()
/obj/effect/decal/cleanable/blood/gibs/ipc/PersistenceSave(list/data)
. = ..()
return type
/obj/effect/decal/cleanable/blood/gibs/ipc/update_icon()
add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY)
cut_overlays()
@@ -8,12 +8,18 @@
bloodiness = BLOOD_AMOUNT_PER_DECAL
color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere.
beauty = -100
persistent = TRUE
var/fixed_color = FALSE
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
if(C.fixed_color)
qdel(C)
return FALSE
if (C.blood_DNA)
blood_DNA |= C.blood_DNA
qdel(C)
update_icon()
..()
return FALSE
/obj/effect/decal/cleanable/blood/transfer_blood_dna()
..()
@@ -24,7 +30,22 @@
update_icon()
/obj/effect/decal/cleanable/blood/update_icon()
color = blood_DNA_to_color()
. = ..()
if(!fixed_color)
add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY)
/obj/effect/decal/cleanable/blood/PersistenceSave(list/data)
. = ..()
data["color"] = color
/obj/effect/decal/cleanable/blood/PersistenceLoad(list/data)
. = ..()
if(data["color"])
fixed_color = TRUE
add_atom_colour(data["color"], FIXED_COLOUR_PRIORITY)
name = "dried blood"
desc = "Looks like it's been here a while. Eew"
bloodiness = 0
/obj/effect/decal/cleanable/blood/old
name = "dried blood"
@@ -38,6 +59,7 @@
/obj/effect/decal/cleanable/blood/splats
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
persistence_allow_stacking = TRUE
/obj/effect/decal/cleanable/blood/splatter
random_icon_states = list("splatter1", "splatter2", "splatter3", "splatter4", "splatter5")
@@ -48,16 +70,43 @@
random_icon_states = null
beauty = -50
/obj/effect/decal/cleanable/blood/tracks/PersistenceSave(list/data)
. = ..()
data["dir"] = dir
/obj/effect/decal/cleanable/blood/tracks/PersistenceLoad(list/data)
. = ..()
if(data["dir"])
setDir(text2num(data["dir"]))
/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
name = "blood"
icon_state = "ltrails_1"
desc = "Your instincts say you shouldn't be following these."
random_icon_states = null
beauty = -50
persistent = TRUE
persistence_allow_stacking = TRUE
var/list/existing_dirs = list()
var/fixed_color = FALSE
/obj/effect/decal/cleanable/trail_holder/PersistenceSave(list/data)
. = ..()
data["dir"] = dir
data["color"] = color
/obj/effect/decal/cleanable/trail_holder/PersistenceLoad(list/data)
. = ..()
if(data["dir"])
setDir(text2num(data["dir"]))
if(data["color"])
fixed_color = TRUE
add_atom_colour(data["color"], FIXED_COLOUR_PRIORITY)
/obj/effect/decal/cleanable/trail_holder/update_icon()
color = blood_DNA_to_color()
. = ..()
if(!fixed_color)
add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY)
/obj/effect/cleanable/trail_holder/Initialize()
. = ..()
@@ -84,8 +133,19 @@
var/entered_dirs = 0
var/exited_dirs = 0
blood_state = BLOOD_STATE_BLOOD //the icon state to load images from
persistent = TRUE
persistence_allow_stacking = TRUE
var/list/shoe_types = list()
/obj/effect/decal/cleanable/blood/footprints/PersistenceSave(list/data)
. = ..()
data["dir"] = dir
/obj/effect/decal/cleanable/blood/footprints/PersistenceLoad(list/data)
. = ..()
if(data["dir"])
setDir(text2num(data["dir"]))
/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O)
if(ishuman(O))
var/mob/living/carbon/human/H = O
@@ -143,7 +203,7 @@
return
if(color != C.color)
return
..()
return ..()
/obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in()
if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
@@ -12,6 +12,8 @@
icon_state = "ash"
mergeable_decal = FALSE
beauty = -50
persistent = TRUE
persistence_allow_stacking = TRUE
/obj/effect/decal/cleanable/ash/Initialize()
. = ..()
@@ -38,6 +40,8 @@
icon = 'icons/obj/shards.dmi'
icon_state = "tiny"
beauty = -100
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/glass/Initialize()
. = ..()
@@ -53,10 +57,33 @@
name = "dirt"
desc = "Someone should clean that up."
icon_state = "dirt"
alpha = 127
canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall)
smooth = SMOOTH_FALSE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
beauty = -75
mergeable_decal = TRUE
persistent = TRUE
wiped_by_floor_change = TRUE
/obj/effect/decal/cleanable/dirt/Initialize(mapload)
. = ..()
alpha = CONFIG_GET(number/dirt_alpha_starting)
/obj/effect/decal/cleanable/dirt/proc/dirty(strength = 1)
if(alpha < 255)
alpha += strength
if(alpha > 255)
alpha = 255
/obj/effect/decal/cleanable/dirt/PersistenceSave(list/data)
. = ..()
data["alpha"] = alpha
/obj/effect/decal/cleanable/dirt/PersistenceLoad(list/data)
. = ..()
if(data["alpha"])
alpha = text2num(data["alpha"])
/obj/effect/decal/cleanable/dirt/Initialize()
. = ..()
@@ -94,6 +121,8 @@
light_color = LIGHT_COLOR_GREEN
icon_state = "greenglow"
beauty = -300
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/greenglow/Initialize(mapload)
. = ..()
@@ -122,6 +151,8 @@
icon_state = "molten"
mergeable_decal = FALSE
beauty = -150
persistent = TRUE
persistence_allow_stacking = TRUE
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
@@ -136,6 +167,7 @@
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
beauty = -150
persistent = TRUE
/obj/effect/decal/cleanable/vomit/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
if(ishuman(user))
@@ -151,6 +183,10 @@
reagents.trans_to(H, reagents.total_volume)
qdel(src)
/obj/effect/decal/cleanable/vomit/PersistenceSave(list/data)
. = ..()
return /obj/effect/decal/cleanable/vomit/old
/obj/effect/decal/cleanable/vomit/old
name = "crusty dried vomit"
desc = "You try not to look at the chunks, and fail."
@@ -166,12 +202,16 @@
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
beauty = -100
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/plant_smudge
name = "plant smudge"
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_plant")
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/egg_smudge
name = "smashed egg"
@@ -179,6 +219,8 @@
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/pie_smudge //honk
name = "smashed pie"
@@ -186,6 +228,8 @@
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/chem_pile
name = "chemical pile"
@@ -193,6 +237,8 @@
gender = NEUTER
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/shreds
name = "shreds"
@@ -200,6 +246,8 @@
icon_state = "shreds"
gender = PLURAL
mergeable_decal = FALSE
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/shreds/ex_act(severity, target)
if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
@@ -222,6 +270,8 @@
desc = "The herpes of arts and crafts."
icon = 'icons/effects/atmospherics.dmi'
gender = NEUTER
mergeable_decal = TRUE
persistent = TRUE
/obj/effect/decal/cleanable/glitter/pink
name = "pink glitter"
@@ -247,3 +297,5 @@
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
mergeable_decal = TRUE
persistent = TRUE
@@ -11,6 +11,7 @@
bloodiness = BLOOD_AMOUNT_PER_DECAL
mergeable_decal = FALSE
beauty = -50
persistent = TRUE
/obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -52,6 +53,7 @@
blood_state = BLOOD_STATE_OIL
bloodiness = BLOOD_AMOUNT_PER_DECAL
beauty = -100
persistent = TRUE
/obj/effect/decal/cleanable/oil/Initialize()
. = ..()
@@ -61,8 +63,10 @@
/obj/effect/decal/cleanable/oil/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
beauty = -50
persistent = TRUE
/obj/effect/decal/cleanable/oil/slippery
persistent = FALSE
/obj/effect/decal/cleanable/oil/slippery/Initialize()
. = ..()
@@ -5,6 +5,8 @@
icon_state = "rune1"
plane = ABOVE_WALL_PLANE //makes the graffiti visible over a wall.
gender = NEUTER
persistent = TRUE
persistence_allow_stacking = TRUE
mergeable_decal = FALSE
var/do_icon_rotate = TRUE
var/rotation = 0
@@ -29,3 +31,35 @@
if(main)
paint_colour = main
add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY)
/obj/effect/decal/cleanable/crayon/PersistenceSave(list/data)
. = ..()
if(icon != initial(icon)) // no support for alticons yet, awful system anyways
return null
data["icon_state"] = icon_state
data["paint_color"] = paint_colour
if(do_icon_rotate)
data["rotation"] = rotation
data["name"] = name
if(pixel_x != initial(pixel_x))
data["pixel_x"] = pixel_x
if(pixel_y != initial(pixel_y))
data["pixel_y"] = pixel_y
/obj/effect/decal/cleanable/crayon/PersistenceLoad(list/data)
. = ..()
if(data["name"])
name = data["name"]
if(do_icon_rotate && data["rotation"])
var/matrix/M = matrix()
M.Turn(text2num(data["rotation"]))
transform = M
if(data["paint_color"])
paint_colour = data["paint_color"]
add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY)
if(data["icon_state"])
icon_state = data["icon_state"]
if(data["pixel_x"])
pixel_x = data["pixel_x"]
if(data["pixel_y"])
pixel_y = data["pixel_y"]
@@ -80,6 +80,17 @@
to_chat(user, "<span class='notice'>You insert the credits into [src].</span>")
update_icon()
qdel(H)
if(istype(I, /obj/item/card/id))
var/obj/item/card/id/ID = I
if(!ID.registered_account)
to_chat(user, "<span class='warning'>[ID] doesn't have a linked account to deposit into!</span>")
return
for(var/obj/item/holochip/money in src.loc.contents)
ID.attackby(money, user)
for(var/obj/item/stack/spacecash/money in src.loc.contents)
ID.attackby(money, user)
for(var/obj/item/coin/money in src.loc.contents)
ID.attackby(money, user)
/obj/item/holochip/AltClick(mob/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+3 -3
View File
@@ -16,9 +16,9 @@ GLOBAL_LIST_EMPTY(power_sinks)
throw_speed = 1
throw_range = 2
custom_materials = list(/datum/material/iron=750)
var/drain_rate = 1600000 // amount of power to drain per tick
var/drain_rate = 2000000 // amount of power to drain per tick. Currently 2MJ.
var/power_drained = 0 // has drained this much power
var/max_power = 1e10 // maximum power that can be drained before exploding
var/max_power = 2000000000 // maximum power that can be drained before exploding. Currently 2GJ. About 17 minutes to explode at the max rate.
var/mode = 0 // 0 = off, 1=clamped (off), 2=operating
var/admins_warned = FALSE // stop spam, only warn the admins once that we are about to boom
@@ -155,5 +155,5 @@ GLOBAL_LIST_EMPTY(power_sinks)
if(power_drained >= max_power)
STOP_PROCESSING(SSobj, src)
explosion(src.loc, 4,8,16,32)
explosion(src.loc, 3,7,14,28)
qdel(src)
@@ -264,6 +264,30 @@ effective or pretty fucking useless.
GLOB.active_jammers -= src
update_icon()
/*portable turret*/
/obj/item/storage/toolbox/emergency/turret
desc = "You feel a strange urge to hit this with a wrench."
/obj/item/storage/toolbox/emergency/turret/PopulateContents()
new /obj/item/screwdriver(src)
new /obj/item/wrench(src)
new /obj/item/weldingtool(src)
new /obj/item/crowbar(src)
new /obj/item/analyzer(src)
new /obj/item/wirecutters(src)
/obj/item/storage/toolbox/emergency/turret/attackby(obj/item/I, mob/living/user, params)
if(I.tool_behaviour == TOOL_WRENCH && user.a_intent == INTENT_HARM)
user.visible_message("<span class='danger'>[user] bashes [src] with [I]!</span>", \
"<span class='danger'>You bash [src] with [I]!</span>", null, COMBAT_MESSAGE_RANGE)
playsound(src, "sound/items/drill_use.ogg", 80, TRUE, -1)
var/obj/machinery/porta_turret/syndicate/pod/toolbox/turret = new(get_turf(loc))
turret.faction = list("[REF(user)]")
qdel(src)
return
..()
/obj/item/headsetupgrader
name = "headset upgrader"
desc = "A tool that can be used to upgrade a normal headset to be able to protect from flashbangs."
+2 -1
View File
@@ -19,6 +19,7 @@
var/boom_sizes = list(0, 0, 3)
var/can_attach_mob = FALSE
var/full_damage_on_mobs = FALSE
var/can_gib_mobs = FALSE
/obj/item/grenade/plastic/Initialize()
. = ..()
@@ -72,7 +73,7 @@
explosion(get_step(T, aim_dir), boom_sizes[1], boom_sizes[2], boom_sizes[3])
else
explosion(location, boom_sizes[1], boom_sizes[2], boom_sizes[3])
if(ismob(target))
if(ismob(target) && can_gib_mobs)
var/mob/M = target
M.gib()
qdel(src)
-14
View File
@@ -1,17 +1,3 @@
/obj/item/caution
desc = "Caution! Wet Floor!"
name = "wet floor sign"
icon = 'icons/obj/janitor.dmi'
icon_state = "caution"
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
force = 1
throwforce = 3
throw_speed = 2
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("warned", "cautioned", "smashed")
/obj/item/choice_beacon
name = "choice beacon"
desc = "Hey, why are you viewing this?!! Please let Centcom know about this odd occurance."
+6 -2
View File
@@ -24,13 +24,17 @@
create_reagents(mopcap, NONE, NO_REAGENTS_VALUE)
/obj/item/mop/proc/clean(turf/A)
/obj/item/mop/proc/clean(turf/A, mob/user)
if(reagents.has_reagent(/datum/reagent/water, 1) || reagents.has_reagent(/datum/reagent/water/holywater, 1) || reagents.has_reagent(/datum/reagent/consumable/ethanol/vodka, 1) || reagents.has_reagent(/datum/reagent/space_cleaner, 1))
SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
A.clean_blood()
var/cleaned_something = FALSE
for(var/obj/effect/O in A)
if(is_cleanable(O))
cleaned_something = TRUE
qdel(O)
if(cleaned_something && user && user.client)
user.client.increment_progress("janitor", 1)
reagents.reaction(A, TOUCH, 10) //Needed for proper floor wetting.
reagents.remove_any(1) //reaction() doesn't use up the reagents
@@ -59,7 +63,7 @@
if(!L.UseStaminaBuffer(stamusage, warn = TRUE))
return
user.visible_message("[user] cleans \the [T] with [src].", "<span class='notice'>You clean \the [T] with [src].</span>")
clean(T)
clean(T, user)
user.DelayNextAction(CLICK_CD_MELEE)
user.do_attack_animation(T, used_item = src)
playsound(T, "slosh", 50, 1)
@@ -392,6 +392,7 @@
created_name = new_name
else
created_name = ""
log_game("[key_name(usr)] renamed [src] ([REF(src)]) to [created_name].")
else if(href_list["Master"])
forced_ai = select_active_ai(usr)
+14
View File
@@ -33,6 +33,20 @@
. = ..()
update_desc()
/obj/item/stack/spacecash/attackby(obj/item/W, mob/user, params)
. = ..()
if(istype(W, /obj/item/card/id))
var/obj/item/card/id/ID = W
if(!ID.registered_account)
to_chat(user, "<span class='warning'>[ID] doesn't have a linked account to deposit into!</span>")
return
for(var/obj/item/holochip/money in src.loc.contents)
ID.attackby(money, user)
for(var/obj/item/stack/spacecash/money in src.loc.contents)
ID.attackby(money, user)
for(var/obj/item/coin/money in src.loc.contents)
ID.attackby(money, user)
/obj/item/stack/spacecash/c1
icon_state = "spacecash"
singular_name = "one credit bill"
@@ -253,7 +253,6 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\
new/datum/stack_recipe("training bokken", /obj/item/melee/bokken, 10, time = 15),\
null, \
new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
@@ -794,7 +793,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("duct", /obj/item/stack/ducts,1), \
new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2)))
/obj/item/stack/sheet/plastic
name = "plastic"
+3 -1
View File
@@ -802,7 +802,8 @@
. += "<span class='notice'>Alt-click it to quickly draw the blade.</span>"
/obj/item/storage/belt/sabre/PopulateContents()
new starting_sword(src)
if(starting_sword)
new starting_sword(src)
/obj/item/storage/belt/sabre/rapier
name = "rapier sheath"
@@ -864,6 +865,7 @@
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 2
STR.max_w_class = WEIGHT_CLASS_BULKY + WEIGHT_CLASS_NORMAL //katana and waki.
STR.max_combined_w_class = 7
/obj/item/melee/smith/twohand/katana/on_exit_storage(datum/component/storage/S)
var/obj/item/storage/belt/sabre/twin/B = S.parent
@@ -103,6 +103,39 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents()
return
/obj/item/storage/toolbox/mechanical/old/clean // the assistant traitor toolbox, damage scales with TC inside
name = "toolbox"
desc = "An old, blue toolbox. It menaces with a sickening miasma of robust energies. You sure about this, Brain?"
icon_state = "toolbox_blue_clean"
force = 19
throwforce = 22
wound_bonus = 0
bare_wound_bonus = 10
/obj/item/storage/toolbox/mechanical/old/clean/proc/calc_damage()
var/power = 0
for (var/obj/item/stack/telecrystal/TC in GetAllContents())
power += TC.amount
force = 19 + power
throwforce = 22 + power
/obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user)
calc_damage() // one damage for one telecrystal equals about thirty seven(?) damage if you pour ALL your tc
..()
/obj/item/storage/toolbox/mechanical/old/clean/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
calc_damage()
..()
/obj/item/storage/toolbox/mechanical/old/clean/PopulateContents()
new /obj/item/screwdriver(src)
new /obj/item/wrench(src)
new /obj/item/weldingtool(src)
new /obj/item/crowbar(src)
new /obj/item/wirecutters(src)
new /obj/item/multitool(src)
new /obj/item/clothing/gloves/color/yellow(src)
/obj/item/storage/toolbox/electrical
name = "electrical toolbox"
icon_state = "yellow"
+122 -17
View File
@@ -296,8 +296,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
force = 7 //how much harm mode damage we do
var/stamina_damage_increment = 4 //how much extra damage do we do when in non-harm mode
force = 10 //how much harm mode damage we do
var/stamina_damage_increment = 5 //how much extra damage do we do when in non-harm mode
throwforce = 10
damtype = STAMINA
attack_verb = list("whacked", "smacked", "struck")
@@ -310,11 +310,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
var/quick_parry = FALSE // false = default parry, true = really small parry window
item_flags = ITEM_CAN_PARRY
block_parry_data = /datum/block_parry_data/bokken
var/default_parry_data = /datum/block_parry_data/bokken
var/quick_parry_data = /datum/block_parry_data/bokken/quick_parry
bare_wound_bonus = 0
wound_bonus = 0
/datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries
parry_stamina_cost = 8 // be wise about when you parry, though, else you won't be able to fight enough to make it count
parry_stamina_cost = 10 // be wise about when you parry, though, else you won't be able to fight enough to make it count
parry_time_windup = 0
parry_time_active = 10 // small parry window
parry_time_spindown = 0
@@ -330,11 +332,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
)
parry_failed_stagger_duration = 3 SECONDS
parry_data = list(
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5
)
/datum/block_parry_data/bokken/quick_parry // emphasizing REALLY SHORT PARRIES
parry_stamina_cost = 6 // still more costly than most parries, but less than a full bokken parry
parry_stamina_cost = 8 // still more costly than most parries, but less than a full bokken parry
parry_time_active = 5 // REALLY small parry window
parry_time_perfect = 2.5 // however...
parry_time_perfect_leeway = 2 // the entire time, the parry is perfect
@@ -371,9 +373,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
. = ..()
quick_parry = !quick_parry
if(quick_parry)
block_parry_data = /datum/block_parry_data/bokken/quick_parry
block_parry_data = quick_parry_data
else
block_parry_data = /datum/block_parry_data/bokken
block_parry_data = default_parry_data
to_chat(user, "<span class='notice'>[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].</span>")
/obj/item/melee/bokken/attackby(obj/item/I, mob/living/user, params)
@@ -410,23 +412,76 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
if(burnt)
. += " Burned into the \"blade\" is [burned_in]."
/obj/item/melee/bokken/steelwood
name = "steelwood bokken"
desc = "A misnomer of sorts, this is effectively a blunt katana made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh."
icon_state = "bokken_steel"
item_state = "bokken_steel"
force = 12
stamina_damage_increment = 3
/obj/item/melee/bokken/waki
name = "wakizashi bokken"
desc = "A space-Japanese training sword made of wood and shaped like a wakizashi."
icon_state = "wakibokken"
item_state = "wakibokken"
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_NORMAL
force = 6
stamina_damage_increment = 4
block_parry_data = /datum/block_parry_data/bokken/waki
default_parry_data = /datum/block_parry_data/bokken/waki
quick_parry_data = /datum/block_parry_data/bokken/waki/quick_parry
/datum/block_parry_data/bokken/waki // weaker parries than the bigger variant, but cheaper and faster recovery, like quick parry
parry_stamina_cost = 4
parry_time_windup = 0
parry_time_active = 6
parry_time_spindown = 0
parry_time_perfect = 1.5
parry_time_perfect_leeway = 1
parry_imperfect_falloff_percent = 7.5
parry_efficiency_to_counterattack = 120
parry_efficiency_considered_successful = 65
parry_efficiency_perfect = 120
parry_efficiency_perfect_override = list(
TEXT_ATTACK_TYPE_PROJECTILE = 30,
)
parry_failed_stagger_duration = 2 SECONDS
parry_data = list(
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1.5, // 6*1.5 = 9, 7*1.5 = 10.5, 8*1.5 = 12, 9*1.5 = 13.5
)
/datum/block_parry_data/bokken/waki/quick_parry //For the parry spammer in you
parry_stamina_cost = 2 // Slam that parry button
parry_time_active = 2.5
parry_time_perfect = 1
parry_time_perfect_leeway = 1
parry_failed_stagger_duration = 1 SECONDS
parry_failed_clickcd_duration = 1 SECONDS
/datum/block_parry_data/bokken/waki/quick_parry/proj
parry_efficiency_perfect_override = list()
/obj/item/melee/bokken/waki/steelwood
name = "wakizashi steelwood bokken"
desc = "A misnomer of sorts, this is effectively a blunt wakizashi made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh."
icon_state = "wakibokken_steel"
item_state = "wakibokken_steel"
force = 8
stamina_damage_increment = 2
/obj/item/melee/bokken/debug
name = "funny debug parrying stick"
desc = "if you see this you've fucked up somewhere my good man"
block_parry_data = /datum/block_parry_data/bokken/debug
/obj/item/melee/bokken/debug/AltClick(mob/user)
quick_parry = !quick_parry
if(quick_parry)
block_parry_data = /datum/block_parry_data/bokken/quick_parry/debug
else
block_parry_data = /datum/block_parry_data/bokken/debug
to_chat(user, "<span class='notice'>[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].</span>")
default_parry_data = /datum/block_parry_data/bokken/debug
quick_parry_data = /datum/block_parry_data/bokken/quick_parry/debug
/datum/block_parry_data/bokken/debug
parry_efficiency_perfect_override = list()
parry_data = list(
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5
PARRY_DISARM_ATTACKER = TRUE,
PARRY_KNOCKDOWN_ATTACKER = 10,
PARRY_STAGGER_ATTACKER = 10,
@@ -436,13 +491,63 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/datum/block_parry_data/bokken/quick_parry/debug
parry_efficiency_perfect_override = list()
parry_data = list(
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25
PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5
PARRY_DISARM_ATTACKER = TRUE,
PARRY_KNOCKDOWN_ATTACKER = 10,
PARRY_STAGGER_ATTACKER = 10,
PARRY_DAZE_ATTACKER = 10,
)
/// BOKKEN CRAFTNG PIECES
/obj/item/bokken_blade
name = "training bokken wooden blade"
desc = "The blade piece of a bokken katana."
icon = 'icons/obj/smith.dmi'
icon_state = "bokken"
item_state = "bone_dagger"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
/obj/item/bokken_steelblade
name = "training bokken steelwood blade"
desc = "The blade piece of a steelwood bokken katana."
icon = 'icons/obj/smith.dmi'
icon_state = "bokken_steel"
item_state = "switchblade_ext"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
/obj/item/wakibokken_blade
name = "training bokken wooden wakizashi blade"
desc = "The blade piece of a bokken wakizashi."
icon = 'icons/obj/smith.dmi'
icon_state = "wakibokken"
item_state = "bone_dagger"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
/obj/item/wakibokken_steelblade
name = "training bokken steelwood wakizashi blade"
desc = "The blade piece of a steelwood bokken katana."
icon = 'icons/obj/smith.dmi'
icon_state = "wakibokken_steel"
item_state = "switchblade_ext"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
/obj/item/bokken_hilt
name = "training bokken hilt"
desc = "The hilt piece of a bokken. This hilt is appropriate for any potential blade length or material."
icon = 'icons/obj/smith.dmi'
icon_state = "bokken_hilt"
item_state = "bone_dagger"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
/obj/item/wirerod
name = "wired rod"
+25 -2
View File
@@ -243,7 +243,7 @@ LINEN BINS
/obj/item/bedsheet/random/Initialize()
..()
var/type = pick(typesof(/obj/item/bedsheet) - list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon))
var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable)))
new type(loc)
return INITIALIZE_HINT_QDEL
@@ -257,9 +257,32 @@ LINEN BINS
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/bedsheet
chameleon_action.chameleon_name = "Bedsheet"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random), only_root_path = TRUE)
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random, /obj/item/bedsheet/unlockable), only_root_path = FALSE)
chameleon_action.initialize_disguises()
//unlockable bedsheets
/obj/item/bedsheet/unlockable
name = "unlockable bedsheet"
desc = "this shouldn't be here!"
//janitor: clean 100 messes with mop as janitor
/obj/item/bedsheet/unlockable/janitor
name = "janitor bedsheet"
desc = "A white bedsheet, with a warning sign on the front."
icon_state = "sheetjanitor"
//cook: use microwave 100 times properly (contents must make one good item) as cook
/obj/item/bedsheet/unlockable/cook
name = "cook bedsheet"
desc = "A grey bedsheet, with a microwave on the front."
icon_state = "sheetcook"
//miner: redeem 100,000 mining points
/obj/item/bedsheet/unlockable/miner
name = "miner bedsheet"
desc = "A red and black bedsheet. It seems to be made with goliath hide."
icon_state = "sheetminer"
//bedsheet bin
/obj/structure/bedsheetbin
name = "linen bin"
@@ -70,7 +70,7 @@
new /obj/item/melee/flyswatter(src)
new /obj/item/flashlight(src)
for(var/i in 1 to 3)
new /obj/item/caution(src)
new /obj/item/clothing/suit/caution(src)
new /obj/item/holosign_creator(src)
new /obj/item/lightreplacer(src)
new /obj/item/soap(src)
@@ -47,6 +47,25 @@
new /obj/item/clothing/glasses/hud/health(src)
return
/obj/structure/closet/secure_closet/paramedic
name = "paramedic's locker"
req_access = list(ACCESS_MEDICAL)
icon_state = "paramed_secure"
/obj/structure/closet/secure_closet/paramedic/PopulateContents()
..()
new /obj/item/clothing/suit/toggle/labcoat/paramedic(src)
new /obj/item/clothing/under/rank/medical/paramedic(src)
new /obj/item/clothing/under/rank/medical/paramedic/skirt(src)
new /obj/item/radio/headset/headset_med(src)
new /obj/item/defibrillator/loaded(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/storage/belt/medical(src)
new /obj/item/clothing/glasses/hud/health(src)
new /obj/item/pinpointer/crew(src)
new /obj/item/sensor_device(src)
return
/obj/structure/closet/secure_closet/CMO
name = "\proper chief medical officer's locker"
req_access = list(ACCESS_CMO)
+2 -2
View File
@@ -73,7 +73,7 @@
l.janicart_insert(user,src)
else
to_chat(user, fail_msg)
else if(istype(I, /obj/item/caution))
else if(istype(I, /obj/item/clothing/suit/caution))
if(signs < max_signs)
put_in_cart(I, user)
signs++
@@ -104,7 +104,7 @@
items += list("Spray bottle" = image(icon = myspray.icon, icon_state = myspray.icon_state))
if(myreplacer)
items += list("Light replacer" = image(icon = myreplacer.icon, icon_state = myreplacer.icon_state))
var/obj/item/caution/sign = locate() in src
var/obj/item/clothing/suit/caution/sign = locate() in src
if(sign)
items += list("Sign" = image(icon = sign.icon, icon_state = sign.icon_state))