Merge remote-tracking branch 'citadel/master' into combat_patches_1
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
var/turf/target
|
||||
var/acid_level = 0 // Removed from obj, so it goes here now
|
||||
|
||||
|
||||
/obj/effect/acid/Initialize(mapload, acid_pwr, acid_amt)
|
||||
@@ -42,7 +43,7 @@
|
||||
|
||||
for(var/obj/O in target)
|
||||
if(prob(20) && !(resistance_flags & UNACIDABLE))
|
||||
if(O.acid_level < acid_level*0.3)
|
||||
if(O.acid_level() < acid_level*0.3)
|
||||
var/acid_used = min(acid_level*0.05, 20)
|
||||
O.acid_act(10, acid_used)
|
||||
acid_level = max(0, acid_level - acid_used*10)
|
||||
|
||||
@@ -24,55 +24,86 @@
|
||||
var/range = 3
|
||||
var/hits_left = 3
|
||||
var/range_left = 3
|
||||
var/firstmove = TRUE
|
||||
var/list/hit
|
||||
|
||||
/obj/effect/decal/chempuff/blob_act(obj/structure/blob/B)
|
||||
return
|
||||
|
||||
/obj/effect/decal/chempuff/Initialize(mapload, stream_mode, speed, range, hits_left)
|
||||
/obj/effect/decal/chempuff/Initialize(mapload, stream_mode, speed, range, hits_left, size)
|
||||
. = ..()
|
||||
create_reagents(size, NONE, NO_REAGENTS_VALUE)
|
||||
stream = stream_mode
|
||||
src.speed = speed
|
||||
src.range = src.range_left = range
|
||||
src.hits_left = hits_left
|
||||
hit = list()
|
||||
|
||||
/obj/effect/decal/chempuff/proc/hit_thing(atom/A)
|
||||
/obj/effect/decal/chempuff/Destroy()
|
||||
hit = null
|
||||
return ..()
|
||||
|
||||
/// proc called to handle us hitting something
|
||||
/obj/effect/decal/chempuff/proc/hit_thing(atom/A, bump_hit)
|
||||
// if the thing is invisible it usually is abstract/underfloor. also, don't hit ourselves.
|
||||
if(A == src || A.invisibility)
|
||||
return
|
||||
if(!hits_left)
|
||||
// don't hit anything on the first move unless overridden (see: we're colliding a wall blocking our move out of the first tile)
|
||||
if(firstmove && !bump_hit)
|
||||
return
|
||||
if(stream)
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(!M.lying || !range_left)
|
||||
reagents.reaction(M, VAPOR)
|
||||
hits_left--
|
||||
else
|
||||
if(!range_left)
|
||||
reagents.reaction(A, VAPOR)
|
||||
else
|
||||
reagents.reaction(A)
|
||||
if(ismob(A))
|
||||
hits_left--
|
||||
// we're out of hits or we already hit it
|
||||
if(!hits_left || hit[A])
|
||||
return
|
||||
var/living = isliving(A)
|
||||
// if it's not dense and we're a stream instead of a mist, and we're not out of range
|
||||
if(!A.density && stream && range_left && !bump_hit)
|
||||
return
|
||||
// non living mobs are effectively abstract
|
||||
if(ismob(A) && !living)
|
||||
return
|
||||
hit[A] = TRUE
|
||||
reagents.reaction(A, VAPOR)
|
||||
// mobs absorb enough to decrement hits_left, as well as stuff blocking us.
|
||||
if(ismob(A) || bump_hit)
|
||||
hits_left--
|
||||
|
||||
/obj/effect/decal/chempuff/Crossed(atom/movable/AM, oldloc)
|
||||
. = ..()
|
||||
// bump things moving into us as long as we're not on our first move/moving out of origin tile
|
||||
hit_thing(AM)
|
||||
|
||||
/obj/effect/decal/chempuff/Bump(atom/A)
|
||||
. = ..()
|
||||
// if we hit something blocking our movement, collide it regardless even if we're still on our origin tile
|
||||
hit_thing(A, TRUE)
|
||||
|
||||
/obj/effect/decal/chempuff/proc/run_puff(atom/target)
|
||||
set waitfor = FALSE
|
||||
for(var/i in 1 to range)
|
||||
var/safety = 255
|
||||
while(range_left)
|
||||
if(!safety--)
|
||||
CRASH("Spray ran out of safety.")
|
||||
// move towards new turf
|
||||
step_towards(src, target)
|
||||
if(firstmove)
|
||||
// mark first movement so future Cross()es result in collisions
|
||||
firstmove = FALSE
|
||||
// decrement range
|
||||
range_left--
|
||||
// if we got nullspaced, exit
|
||||
if(!isturf(loc))
|
||||
break
|
||||
// hit everything in it
|
||||
for(var/atom/T in loc)
|
||||
hit_thing(T)
|
||||
// if we got deleted or ran out of hits, stop
|
||||
if(!hits_left || !isturf(loc))
|
||||
break
|
||||
if(hits_left && isturf(loc) && (!stream || !range_left))
|
||||
reagents.reaction(loc, VAPOR)
|
||||
hits_left--
|
||||
if(!hits_left)
|
||||
if(!hits_left || !isturf(loc))
|
||||
// yeah yeah sue me it's copypasted code but I don't want to declare a var.
|
||||
break
|
||||
// hit the turf
|
||||
hit_thing(loc)
|
||||
sleep(speed)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/fakelattice
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
line = null
|
||||
if(qdel_in)
|
||||
QDEL_IN(PB, qdel_in)
|
||||
d
|
||||
|
||||
/obj/effect/projectile/tracer
|
||||
name = "beam"
|
||||
icon = 'icons/obj/projectiles_tracer.dmi'
|
||||
|
||||
@@ -352,15 +352,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
C.update_damage_overlays()
|
||||
return
|
||||
|
||||
if(acid_level > 20 && ismob(loc))// so we can still remove the clothes on us that have acid.
|
||||
var/mob/living/carbon/C = user
|
||||
if(istype(C))
|
||||
if(!C.gloves || (!(C.gloves.resistance_flags & (UNACIDABLE|ACID_PROOF))))
|
||||
to_chat(user, "<span class='warning'>The acid on [src] burns your hand!</span>")
|
||||
var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
|
||||
if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
|
||||
C.update_damage_overlays()
|
||||
|
||||
if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup.
|
||||
return
|
||||
|
||||
|
||||
@@ -387,6 +387,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
throwforce = 0
|
||||
grind_results = list(/datum/reagent/carbon = 2)
|
||||
|
||||
/obj/item/cigbutt/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/trash)
|
||||
|
||||
/obj/item/cigbutt/cigarbutt
|
||||
name = "cigar butt"
|
||||
desc = "A manky old cigar butt."
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/obj/item/restraints
|
||||
breakouttime = 600
|
||||
var/demoralize_criminals = TRUE // checked on carbon/carbon.dm to decide wheter to apply the handcuffed negative moodlet or not.
|
||||
/// allow movement at all during breakout
|
||||
var/allow_breakout_movement = FALSE
|
||||
|
||||
/obj/item/restraints/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -243,6 +245,7 @@
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
slowdown = 7
|
||||
allow_breakout_movement = TRUE
|
||||
breakouttime = 300 //Deciseconds = 30s = 0.5 minute
|
||||
|
||||
/obj/item/restraints/legcuffs/proc/on_removed()
|
||||
@@ -312,7 +315,7 @@
|
||||
trap_damage = 0
|
||||
item_flags = DROPDEL
|
||||
flags_1 = NONE
|
||||
breakouttime = 25
|
||||
breakouttime = 50
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/New()
|
||||
..()
|
||||
@@ -328,7 +331,7 @@
|
||||
. = ..()
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/cyborg
|
||||
breakouttime = 20 // Cyborgs shouldn't have a strong restraint
|
||||
breakouttime = 40 // Cyborgs shouldn't have a strong restraint
|
||||
|
||||
/obj/item/restraints/legcuffs/bola
|
||||
name = "bola"
|
||||
@@ -379,7 +382,7 @@
|
||||
icon_state = "ebola"
|
||||
hitsound = 'sound/weapons/taserhit.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
breakouttime = 25
|
||||
breakouttime = 50
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy/on_removed()
|
||||
do_sparks(1, TRUE, src)
|
||||
|
||||
@@ -457,6 +457,18 @@
|
||||
playsound(src.loc, on_sound, 50, 1)
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/melee/classic_baton/telescopic/newspaper
|
||||
name = "The Daily Whiplash"
|
||||
desc = "A newspaper wrapped around a telescopic baton in such a way that it looks like you're beating people with a rolled up newspaper."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "newspaper"
|
||||
lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
|
||||
on_sound = 'sound/weapons/batonextend.ogg'
|
||||
on_icon_state = "newspaper2"
|
||||
off_icon_state = "newspaper"
|
||||
on_item_state = "newspaper"
|
||||
|
||||
/obj/item/melee/classic_baton/telescopic/contractor_baton
|
||||
name = "contractor baton"
|
||||
desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets."
|
||||
|
||||
@@ -612,6 +612,12 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
icon_state = "kobold"
|
||||
item_state = "kobold"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/kobold
|
||||
name = "spacelizard plushie"
|
||||
desc = "An adorable stuffed toy that resembles a lizard in a suit."
|
||||
icon_state = "plushie_spacelizard"
|
||||
item_state = "plushie_spacelizard"
|
||||
|
||||
/obj/item/toy/plush/nukeplushie
|
||||
name = "operative plushie"
|
||||
desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
|
||||
@@ -643,17 +649,17 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
/obj/item/toy/plush/beeplushie
|
||||
name = "bee plushie"
|
||||
desc = "A cute toy that resembles an even cuter bee."
|
||||
icon_state = "plushie_h"
|
||||
item_state = "plushie_h"
|
||||
icon_state = "plushie_bee"
|
||||
item_state = "plushie_bee"
|
||||
attack_verb = list("stung")
|
||||
gender = FEMALE
|
||||
squeak_override = list('modular_citadel/sound/voice/scream_moth.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mothplushie
|
||||
name = "insect plushie"
|
||||
name = "moth plushie"
|
||||
desc = "An adorable stuffed toy that resembles some kind of insect."
|
||||
icon_state = "bumble"
|
||||
item_state = "bumble"
|
||||
icon_state = "moff"
|
||||
item_state = "moff"
|
||||
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
@@ -665,6 +671,20 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
attack_verb = list("lit", "flickered", "flashed")
|
||||
squeak_override = list('sound/weapons/magout.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/drake
|
||||
name = "drake plushie"
|
||||
desc = "A large beast from lavaland turned into a marketable plushie!"
|
||||
icon_state = "drake"
|
||||
item_state = "drake"
|
||||
attack_verb = list("bit", "devoured", "burned")
|
||||
|
||||
/obj/item/toy/plush/deer
|
||||
name = "deer plushie"
|
||||
desc = "Oh deer, a plushie!"
|
||||
icon_state = "deer"
|
||||
item_state = "deer"
|
||||
attack_verb = list("bleated", "rammed", "kicked")
|
||||
|
||||
/obj/item/toy/plush/box
|
||||
name = "cardboard plushie"
|
||||
desc = "A toy box plushie, it holds cotten. Only a baddie would place a bomb through the postal system..."
|
||||
@@ -694,7 +714,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
attack_verb = list("scanned", "beeped", "stared")
|
||||
|
||||
/obj/item/toy/plush/borgplushie
|
||||
name = "robot plushie"
|
||||
name = "K9 plushie"
|
||||
desc = "An adorable stuffed toy of a robot."
|
||||
icon_state = "securityk9"
|
||||
item_state = "securityk9"
|
||||
@@ -702,25 +722,28 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
squeak_override = list('sound/machines/beep.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/borgplushie/medihound
|
||||
name = "medihound plushie"
|
||||
icon_state = "medihound"
|
||||
item_state = "medihound"
|
||||
|
||||
/obj/item/toy/plush/borgplushie/scrubpuppy
|
||||
name = "scrubpuppy plushie"
|
||||
icon_state = "scrubpuppy"
|
||||
item_state = "scrubpuppy"
|
||||
|
||||
/obj/item/toy/plush/borgplushie/pupdozer
|
||||
name = "pupdozer plushie"
|
||||
icon_state = "pupdozer"
|
||||
item_state = "pupdozer"
|
||||
|
||||
/obj/item/toy/plush/aiplush
|
||||
name = "AI plushie"
|
||||
desc = "A little stuffed toy AI core... it appears to be malfunctioning."
|
||||
icon_state = "exo"
|
||||
item_state = "exo"
|
||||
icon_state = "malfai"
|
||||
item_state = "malfai"
|
||||
attack_verb = list("hacked", "detonated", "overloaded")
|
||||
squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mammal/fox
|
||||
icon_state = "fox"
|
||||
item_state = "fox"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie
|
||||
name = "snake plushie"
|
||||
desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing."
|
||||
@@ -732,6 +755,72 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
/obj/item/toy/plush/mammal
|
||||
name = "mammal plushie"
|
||||
desc = "An adorable stuffed toy resembling some sort of crew member."
|
||||
icon_state = "ych"
|
||||
item_state = "ych"
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/mammal/fox
|
||||
name = "fox plushie"
|
||||
desc = "An adorable stuffed toy resembling a fox."
|
||||
icon_state = "fox"
|
||||
item_state = "fox"
|
||||
attack_verb = list("yipped", "geckered", "yapped")
|
||||
|
||||
/obj/item/toy/plush/mammal/dog
|
||||
name = "dog plushie"
|
||||
icon_state = "corgi"
|
||||
item_state = "corgi"
|
||||
desc = "An adorable stuffed toy that resembles a dog."
|
||||
attack_verb = list("barked", "boofed", "borked")
|
||||
squeak_override = list(
|
||||
'modular_citadel/sound/voice/bark1.ogg' = 1,
|
||||
'modular_citadel/sound/voice/bark2.ogg' = 1
|
||||
)
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/fcorgi
|
||||
name = "corgi plushie"
|
||||
icon_state = "girlycorgi"
|
||||
item_state = "girlycorgi"
|
||||
desc = "An adorable stuffed toy that resembles a dog. This one dons a pink ribbon."
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/borgi
|
||||
name = "borgi plushie"
|
||||
icon_state = "borgi"
|
||||
item_state = "borgi"
|
||||
desc = "An adorable stuffed toy that resembles a robot dog."
|
||||
|
||||
/obj/item/toy/plush/xeno
|
||||
name = "xenohybrid plushie"
|
||||
desc = "An adorable stuffed toy that resembles a xenomorphic crewmember."
|
||||
icon_state = "xeno"
|
||||
item_state = "xeno"
|
||||
squeak_override = list('sound/voice/hiss2.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/bird
|
||||
name = "bird plushie"
|
||||
desc = "An adorable stuffed plushie that resembles an avian."
|
||||
icon_state = "bird"
|
||||
item_state = "bird"
|
||||
attack_verb = list("peeped", "beeped", "poofed")
|
||||
squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/sergal
|
||||
name = "sergal plushie"
|
||||
desc = "An adorable stuffed plushie that resembles a sagaru."
|
||||
icon_state = "sergal"
|
||||
item_state = "sergal"
|
||||
squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/catgirl
|
||||
name = "feline plushie"
|
||||
desc = "An adorable stuffed toy that resembles a feline."
|
||||
icon_state = "cat"
|
||||
item_state = "cat"
|
||||
attack_verb = list("headbutt", "scritched", "bit")
|
||||
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/catgirl/fermis
|
||||
@@ -742,40 +831,25 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
attack_verb = list("cuddled", "petpatted", "wigglepurred")
|
||||
squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/xeno
|
||||
name = "xenohybrid plushie"
|
||||
desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember."
|
||||
squeak_override = list('sound/voice/hiss2.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
/obj/item/toy/plush/teddybear
|
||||
name = "teddy"
|
||||
desc = "It's a teddy bear!"
|
||||
icon_state = "teddy"
|
||||
item_state = "teddy"
|
||||
|
||||
/obj/item/toy/plush/bird
|
||||
name = "bird plushie"
|
||||
desc = "An adorable stuffed plushie that resembles an avian."
|
||||
attack_verb = list("peeped", "beeped", "poofed")
|
||||
squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/sergal
|
||||
name = "sergal plushie"
|
||||
desc = "An adorable stuffed plushie that resembles a sagaru."
|
||||
squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/mammal/dog
|
||||
desc = "An adorable stuffed toy that resembles a canine."
|
||||
attack_verb = list("barked", "boofed", "borked")
|
||||
squeak_override = list(
|
||||
'modular_citadel/sound/voice/bark1.ogg' = 1,
|
||||
'modular_citadel/sound/voice/bark2.ogg' = 1
|
||||
)
|
||||
|
||||
/obj/item/toy/plush/catgirl
|
||||
name = "feline plushie"
|
||||
desc = "An adorable stuffed toy that resembles a feline."
|
||||
attack_verb = list("headbutt", "scritched", "bit")
|
||||
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
/obj/item/toy/plush/crab
|
||||
name = "crab plushie"
|
||||
desc = "Fewer pinches than a real one, but it still clicks."
|
||||
icon_state = "crab"
|
||||
item_state = "crab"
|
||||
attack_verb = list("clicked", "clacked", "pinched")
|
||||
|
||||
/obj/item/toy/plush/gondola
|
||||
name = "gondola plushie"
|
||||
desc = "Just looking at it seems to calm you down. Please do not eat it though."
|
||||
icon_state = "gondola"
|
||||
item_state = "gondola"
|
||||
attack_verb = list("calmed", "smiled", "peaced")
|
||||
|
||||
/obj/item/toy/plush/hairball
|
||||
name = "Hairball"
|
||||
|
||||
@@ -266,6 +266,7 @@
|
||||
. += tank.icon_state
|
||||
|
||||
/obj/item/pneumatic_cannon/proc/fill_with_type(type, amount)
|
||||
set waitfor = FALSE
|
||||
if(!ispath(type, /obj) && !ispath(type, /mob))
|
||||
return FALSE
|
||||
var/loaded = 0
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
GLOBAL_LIST_INIT(human_recipes, list( \
|
||||
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \
|
||||
new/datum/stack_recipe("human skin hat", /obj/item/clothing/head/human_leather, 1), \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/animalhide/human/get_main_recipes()
|
||||
|
||||
@@ -179,6 +179,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("plasteel keg", /obj/structure/custom_keg, 10, time = 50), \
|
||||
new/datum/stack_recipe("micro powered fan assembly", /obj/machinery/fan_assembly, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new /datum/stack_recipe_list("crates", list( \
|
||||
new /datum/stack_recipe("gray crate", /obj/structure/closet/crate, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
|
||||
@@ -67,6 +67,12 @@
|
||||
item_state = "crowbar"
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/crowbar/large/heavy
|
||||
name = "heavy crowbar"
|
||||
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big. It feels oddly heavy.."
|
||||
force = 20
|
||||
icon_state = "crowbar_powergame"
|
||||
|
||||
/obj/item/crowbar/cyborg
|
||||
name = "hydraulic crowbar"
|
||||
desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
|
||||
|
||||
@@ -23,13 +23,13 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
|
||||
var/random_color = TRUE
|
||||
var/static/list/wirecutter_colors = list(
|
||||
"blue" = "#1861d5",
|
||||
"red" = "#951710",
|
||||
"pink" = "#d5188d",
|
||||
"brown" = "#a05212",
|
||||
"green" = "#0e7f1b",
|
||||
"cyan" = "#18a2d5",
|
||||
"yellow" = "#d58c18"
|
||||
"blue" = rgb(24, 97, 213),
|
||||
"red" = rgb(255, 0, 0),
|
||||
"pink" = rgb(213, 24, 141),
|
||||
"brown" = rgb(160, 82, 18),
|
||||
"green" = rgb(14, 127, 27),
|
||||
"cyan" = rgb(24, 162, 213),
|
||||
"yellow" = rgb(255, 165, 0)
|
||||
)
|
||||
|
||||
|
||||
@@ -49,6 +49,23 @@
|
||||
base_overlay.appearance_flags = RESET_COLOR
|
||||
. += base_overlay
|
||||
|
||||
/obj/item/wirecutters/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
|
||||
. = ..()
|
||||
if(isinhands && random_color)
|
||||
var/mutable_appearance/M = mutable_appearance(icon_file, "cutters_cutty_thingy")
|
||||
M.appearance_flags = RESET_COLOR
|
||||
. += M
|
||||
|
||||
/obj/item/wirecutters/get_belt_overlay()
|
||||
if(random_color)
|
||||
var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "cutters")
|
||||
var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "cutters_cutty_thingy")
|
||||
body.color = color
|
||||
head.add_overlay(body)
|
||||
return head
|
||||
else
|
||||
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state)
|
||||
|
||||
/obj/item/wirecutters/attack(mob/living/carbon/C, mob/user)
|
||||
if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable))
|
||||
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
resistance_flags = FLAMMABLE
|
||||
|
||||
/obj/item/trash/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/trash)
|
||||
|
||||
/obj/item/trash/raisins
|
||||
name = "\improper 4no raisins"
|
||||
icon_state= "4no_raisins"
|
||||
@@ -80,6 +84,3 @@
|
||||
name = "boritos bag"
|
||||
icon_state = "boritos"
|
||||
grind_results = list(/datum/reagent/aluminium = 1) //from the mylar bag
|
||||
|
||||
/obj/item/trash/attack(mob/M, mob/living/user)
|
||||
return
|
||||
|
||||
@@ -204,32 +204,23 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
|
||||
//the obj's reaction when touched by acid
|
||||
/obj/acid_act(acidpwr, acid_volume)
|
||||
if(!(resistance_flags & UNACIDABLE) && acid_volume)
|
||||
|
||||
if(!acid_level)
|
||||
SSacid.processing[src] = src
|
||||
update_icon()
|
||||
var/acid_cap = acidpwr * 300 //so we cannot use huge amounts of weak acids to do as well as strong acids.
|
||||
if(acid_level < acid_cap)
|
||||
acid_level = min(acid_level + acidpwr * acid_volume, acid_cap)
|
||||
AddComponent(/datum/component/acid, acidpwr, acid_volume)
|
||||
return 1
|
||||
|
||||
//the proc called by the acid subsystem to process the acid that's on the obj
|
||||
/obj/proc/acid_processing()
|
||||
. = 1
|
||||
if(!(resistance_flags & ACID_PROOF))
|
||||
if(prob(33))
|
||||
playsound(loc, 'sound/items/welder.ogg', 150, 1)
|
||||
take_damage(min(1 + round(sqrt(acid_level)*0.3), 300), BURN, "acid", 0)
|
||||
|
||||
acid_level = max(acid_level - (5 + 3*round(sqrt(acid_level))), 0)
|
||||
if(!acid_level)
|
||||
return 0
|
||||
|
||||
//called when the obj is destroyed by acid.
|
||||
/obj/proc/acid_melt()
|
||||
SSacid.processing -= src
|
||||
var/datum/component/acid/acid = GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
acid.RemoveComponent()
|
||||
deconstruct(FALSE)
|
||||
|
||||
/obj/proc/acid_level()
|
||||
var/datum/component/acid/acid = GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
return acid.level
|
||||
else
|
||||
return 0
|
||||
|
||||
//// FIRE
|
||||
|
||||
/obj/fire_act(exposed_temperature, exposed_volume)
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
|
||||
var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
|
||||
|
||||
var/acid_level = 0 //how much acid is on that obj
|
||||
|
||||
var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
|
||||
var/current_skin //the item reskin
|
||||
var/list/unique_reskin //List of options to reskin.
|
||||
@@ -369,8 +367,6 @@
|
||||
|
||||
/obj/update_overlays()
|
||||
. = ..()
|
||||
if(acid_level)
|
||||
. += GLOB.acid_overlay
|
||||
if(resistance_flags & ON_FIRE)
|
||||
. += GLOB.fire_overlay
|
||||
|
||||
|
||||
@@ -48,14 +48,34 @@
|
||||
return // no message spam
|
||||
..()
|
||||
|
||||
/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user)
|
||||
if(broken || !istype(user) || !I.force)
|
||||
return ..()
|
||||
|
||||
. = ..()
|
||||
if(broken) // breaking a mirror truly gets you bad luck!
|
||||
to_chat(user, "<span class='warning'>A chill runs down your spine as [src] shatters...</span>")
|
||||
user.AddComponent(/datum/component/omen, silent=TRUE) // we have our own message
|
||||
|
||||
/obj/structure/mirror/bullet_act(obj/item/projectile/P)
|
||||
if(broken || !isliving(P.firer) || !P.damage)
|
||||
return ..()
|
||||
|
||||
. = ..()
|
||||
if(broken) // breaking a mirror truly gets you bad luck!
|
||||
var/mob/living/unlucky_dude = P.firer
|
||||
to_chat(unlucky_dude, "<span class='warning'>A chill runs down your spine as [src] shatters...</span>")
|
||||
unlucky_dude.AddComponent(/datum/component/omen, silent=TRUE) // we have our own message
|
||||
|
||||
/obj/structure/mirror/obj_break(damage_flag, mapload)
|
||||
if(!broken && !(flags_1 & NODECONSTRUCT_1))
|
||||
icon_state = "mirror_broke"
|
||||
if(!mapload)
|
||||
playsound(src, "shatter", 70, 1)
|
||||
if(desc == initial(desc))
|
||||
desc = "Oh no, seven years of bad luck!"
|
||||
broken = TRUE
|
||||
if(broken || (flags_1 & NODECONSTRUCT_1))
|
||||
return
|
||||
icon_state = "mirror_broke"
|
||||
if(!mapload)
|
||||
playsound(src, "shatter", 70, TRUE)
|
||||
if(desc == initial(desc))
|
||||
desc = "Oh no, seven years of bad luck!"
|
||||
broken = TRUE
|
||||
|
||||
/obj/structure/mirror/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
|
||||
@@ -121,6 +121,7 @@
|
||||
|
||||
|
||||
/obj/structure/transit_tube/station/proc/launch_pod()
|
||||
set waitfor = FALSE
|
||||
if(launch_cooldown >= world.time)
|
||||
return
|
||||
for(var/obj/structure/transit_tube_pod/pod in loc)
|
||||
|
||||
@@ -354,10 +354,10 @@
|
||||
. = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
. = O.clean_blood()
|
||||
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
if(isitem(O))
|
||||
var/obj/item/I = O
|
||||
I.acid_level = 0
|
||||
I.extinguish()
|
||||
var/datum/component/acid/acid = O.GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
acid.level = 0
|
||||
O.extinguish()
|
||||
|
||||
/obj/machinery/shower/proc/wash_turf()
|
||||
if(isturf(loc))
|
||||
@@ -601,7 +601,9 @@
|
||||
busy = FALSE
|
||||
SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
O.clean_blood()
|
||||
O.acid_level = 0
|
||||
var/datum/component/acid/acid = O.GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
acid.level = 0
|
||||
create_reagents(5)
|
||||
reagents.add_reagent(dispensedreagent, 5)
|
||||
reagents.reaction(O, TOUCH)
|
||||
|
||||
Reference in New Issue
Block a user