Merge remote-tracking branch 'refs/remotes/ParadiseSS13/master' into logic

This commit is contained in:
FalseIncarnate
2016-04-05 19:15:11 -04:00
434 changed files with 16507 additions and 12215 deletions
@@ -18,7 +18,6 @@ var/global/list/image/splatter_cache=list()
var/list/viruses = list()
blood_DNA = list()
var/basecolor="#A10808" // Color when wet.
var/list/datum/disease2/disease/virus2 = list()
var/amount = 5
appearance_flags = NO_CLIENT_COLOR
@@ -198,20 +197,20 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions)
spawn (0)
var/direction = pick(directions)
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
sleep(3)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
b.basecolor = src.basecolor
b.update_icon()
for(var/datum/disease2/disease/D in src.viruses)
var/datum/disease2/disease/ND = D.getcopy()
b.viruses += ND
if (step_to(src, get_step(src, direction), 0))
break
set waitfor = 0
var/direction = pick(directions)
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
sleep(3)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
b.basecolor = src.basecolor
b.update_icon()
for(var/datum/disease/D in src.viruses)
var/datum/disease/ND = D.Copy(1)
b.viruses += ND
ND.holder = b
if (step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/blood/old/New()
@@ -221,29 +220,3 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/gibs/old/New()
..()
dry()
/obj/effect/decal/cleanable/mucus
name = "mucus"
desc = "Disgusting mucus."
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")
var/list/datum/disease2/disease/virus2 = list()
var/dry=0 // Keeps the lag down
/obj/effect/decal/cleanable/mucus/New()
spawn(DRYING_TIME * 2)
dry=1
/obj/effect/decal/cleanable/blood/viralsputum
name = "viral sputum"
desc = "It's black and nasty."
// basecolor="#030303"
icon = 'icons/mob/robots.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
@@ -114,7 +114,6 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
var/list/datum/disease2/disease/virus2 = list()
noclear = 1
/obj/effect/decal/cleanable/vomit/New()
@@ -133,17 +132,6 @@
reagents.remove_reagent("vomit", 5)
reagents.add_reagent("green_vomit", 5)
/obj/effect/decal/cleanable/poop
name = "poop"
desc = "Gosh, how unpleasant."
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/poop.dmi'
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
var/list/datum/disease2/disease/virus2 = list()
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
desc = "It's red."
@@ -194,3 +182,14 @@
/obj/effect/decal/cleanable/fungus/New()
..()
reagents.add_reagent("fungus", 10)
/obj/effect/decal/cleanable/confetti //PARTY TIME!
name = "confetti"
desc = "Party time!"
gender = PLURAL
icon = 'icons/obj/objects.dmi'
icon_state = "confetti1"
random_icon_states = list("confetti1", "confetti2", "confetti3")
anchored = 1
@@ -157,8 +157,8 @@ var/global/list/image/fluidtrack_cache=list()
dryname = "dried tracks"
desc = "Whoops..."
drydesc = "Whoops..."
coming_state = "wheels"
going_state = ""
coming_state = "wheels1"
going_state = "wheels2"
desc = "They look like tracks left by wheels."
gender = PLURAL
random_icon_states = null
+101 -90
View File
@@ -925,6 +925,13 @@ steam.start() -- spawns the effect
sleep(30)
if(metal)
var/turf/T = get_turf(src)
if(istype(T, /turf/space))
T.ChangeTurf(/turf/simulated/floor/plating/metalfoam)
var/turf/simulated/floor/plating/metalfoam/MF = get_turf(src)
MF.metal = metal
MF.update_icon()
var/obj/structure/foamedmetal/M = new(src.loc)
M.metal = metal
M.updateicon()
@@ -994,51 +1001,49 @@ steam.start() -- spawns the effect
var/list/carried_reagents // the IDs of reagents present when the foam was mixed
var/metal = 0 // 0=foam, 1=metalfoam, 2=ironfoam
/datum/effect/system/foam_spread/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metalfoam = 0)
amount = round(sqrt(amt / 3), 1)
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
carried_reagents = list()
metal = metalfoam
set_up(amt=5, loca, var/datum/reagents/carry = null, var/metalfoam = 0)
amount = round(sqrt(amt / 3), 1)
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
carried_reagents = list()
metal = metalfoam
// bit of a hack here. Foam carries along any reagent also present in the glass it is mixed
// with (defaults to water if none is present). Rather than actually transfer the reagents,
// this makes a list of the reagent ids and spawns 1 unit of that reagent when the foam disolves.
// bit of a hack here. Foam carries along any reagent also present in the glass it is mixed
// with (defaults to water if none is present). Rather than actually transfer the reagents,
// this makes a list of the reagent ids and spawns 1 unit of that reagent when the foam disolves.
if(carry && !metal)
for(var/datum/reagent/R in carry.reagent_list)
carried_reagents += R.id
/datum/effect/system/foam_spread/start()
spawn(0)
var/obj/effect/effect/foam/F = locate() in location
if(F)
F.amount += amount
return
if(carry && !metal)
for(var/datum/reagent/R in carry.reagent_list)
carried_reagents += R.id
F = new(src.location, metal)
F.amount = amount
start()
spawn(0)
var/obj/effect/effect/foam/F = locate() in location
if(F)
F.amount += amount
return
if(!metal) // don't carry other chemicals if a metal foam
F.create_reagents(10)
F = new(src.location, metal)
F.amount = amount
if(!metal) // don't carry other chemicals if a metal foam
F.create_reagents(10)
if(carried_reagents)
for(var/id in carried_reagents)
F.reagents.add_reagent(id,1)
else
F.reagents.add_reagent("water", 1)
if(carried_reagents)
for(var/id in carried_reagents)
F.reagents.add_reagent(id,1)
else
F.reagents.add_reagent("water", 1)
// wall formed by metal foams
// dense and opaque, but easy to break
/obj/structure/foamedmetal
icon = 'icons/effects/effects.dmi'
icon_state = "metalfoam"
@@ -1047,79 +1052,85 @@ steam.start() -- spawns the effect
anchored = 1
name = "foamed metal"
desc = "A lightweight foamed metal wall."
var/metal = 1 // 1=aluminum, 2=iron
var/metal = MFOAM_ALUMINUM
New()
..()
air_update_turf(1)
/obj/structure/foamedmetal/New()
..()
air_update_turf(1)
Destroy()
density = 0
air_update_turf(1)
return ..()
/obj/structure/foamedmetal/Destroy()
density = 0
air_update_turf(1)
return ..()
Move()
var/turf/T = loc
..()
move_update_air(T)
/obj/structure/foamedmetal/Move()
var/turf/T = loc
..()
move_update_air(T)
proc/updateicon()
if(metal == 1)
icon_state = "metalfoam"
else
icon_state = "ironfoam"
/obj/structure/foamedmetal/proc/updateicon()
if(metal == MFOAM_ALUMINUM)
icon_state = "metalfoam"
else
icon_state = "ironfoam"
ex_act(severity)
/obj/structure/foamedmetal/ex_act(severity)
qdel(src)
/obj/structure/foamedmetal/blob_act()
qdel(src)
/obj/structure/foamedmetal/bullet_act()
if(metal==MFOAM_ALUMINUM || prob(50))
qdel(src)
blob_act()
/obj/structure/foamedmetal/attack_hand(var/mob/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if ((HULK in user.mutations) || (prob(75 - metal*25)))
user.visible_message("<span class='warning'>[user] smashes through \the [src].</span>", "<span class='notice'>You smash through \the [src].</span>")
qdel(src)
else
user << "<span class='notice'>You hit the metal foam but bounce off it.</span>"
bullet_act()
if(metal==1 || prob(50))
qdel(src)
attack_hand(var/mob/user)
if ((HULK in user.mutations) || (prob(75 - metal*25)))
user << "\blue You smash through the metal foam wall."
for(var/mob/O in oviewers(user))
if ((O.client && !( O.blinded )))
O << "\red [user] smashes through the foamed metal."
qdel(src)
else
user << "\blue You hit the metal foam but bounce off it."
/obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if (istype(I, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = I
G.affecting.loc = src.loc
user.visible_message("<span class='warning'>[G.assailant] smashes [G.affecting] through the foamed metal wall.</span>")
qdel(I)
qdel(src)
return
if(prob(I.force*20 - metal*25))
user.visible_message("<span class='warning'>[user] smashes through the foamed metal with \the [I].</span>", "<span class='notice'>You smash through the foamed metal with \the [I].</span>")
qdel(src)
else
user << "<span class='warning'>You hit the metal foam to no effect.</span>"
attackby(var/obj/item/I, var/mob/user, params)
/obj/structure/foamedmetal/attack_animal(mob/living/simple_animal/M)
M.do_attack_animation(src)
if(M.melee_damage_upper == 0)
M.visible_message("<span class='notice'>[M] nudges \the [src].</span>")
else
if(M.attack_sound)
playsound(loc, M.attack_sound, 50, 1, 1)
M.visible_message("<span class='danger'>\The [M] [M.attacktext] [src]!</span>")
qdel(src)
if (istype(I, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = I
G.affecting.loc = src.loc
for(var/mob/O in viewers(src))
if (O.client)
O << "\red [G.assailant] smashes [G.affecting] through the foamed metal wall."
qdel(I)
qdel(src)
return
/obj/structure/foamedmetal/attack_alien(mob/living/carbon/alien/humanoid/M)
M.visible_message("<span class='danger'>[M] tears apart \the [src]!</span>");
qdel(src)
if(prob(I.force*20 - metal*25))
user << "\blue You smash through the foamed metal with \the [I]."
for(var/mob/O in oviewers(user))
if ((O.client && !( O.blinded )))
O << "\red [user] smashes through the foamed metal."
qdel(src)
else
user << "\blue You hit the metal foam to no effect."
/obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(air_group) return 0
return !density
CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
if(air_group) return 0
return !density
CanAtmosPass()
return !density
/obj/structure/foamedmetal/CanAtmosPass()
return !density
/datum/effect/system/reagents_explosion
var/amount // TNT equivalent
+10
View File
@@ -43,6 +43,16 @@
icon_state = "purplecrack"
duration = 6
/obj/effect/overlay/temp/guardian
randomdir = 0
/obj/effect/overlay/temp/guardian/phase
duration = 5
icon_state = "phasein"
/obj/effect/overlay/temp/guardian/phase/out
icon_state = "phaseout"
/obj/effect/overlay/temp/emp
name = "emp sparks"
icon = 'icons/effects/effects.dmi'
+1 -1
View File
@@ -179,7 +179,7 @@
A.name = str
usr << "<span class='notice'>You rename the '[prevname]' to '[str]'.</span>"
interact()
return
return 1
/obj/item/areaeditor/proc/set_area_machinery_title(var/area/A,var/title,var/oldtitle)
+3 -9
View File
@@ -187,19 +187,13 @@ REAGENT SCANNER
if (istype(M, /mob/living/carbon))
if(upgraded)
chemscan(user, M)
if(M:virus2.len) // WHAT IS TYPECASTING
var/mob/living/carbon/C = M
for (var/ID in C.virus2)
if (ID in virusDB)
var/datum/data/record/V = virusDB[ID]
user.show_message(text("\red Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]"))
// user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood."))
for(var/datum/disease/D in M.viruses)
if(!(D.visibility_flags & HIDDEN_SCANNER))
user << "<span class='alert'><b>Warning: [D.form] detected</b>\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]</span>"
if(M.getStaminaLoss())
user.show_message("<span class='info'>Subject appears to be suffering from fatigue.</span>")
if (M.getCloneLoss())
user.show_message("<span class='warning'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
// if (M.reagents && M.reagents.get_reagent_amount("epinephrine"))
// user.show_message("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.")
if (M.has_brain_worms())
user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.")
else if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain))
@@ -5,6 +5,22 @@
icon_state = "sheet-hide"
origin_tech = ""
var/global/list/datum/stack_recipe/human_recipes = list( \
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/bloated_human, 5, on_floor = 1), \
new/datum/stack_recipe("bloated human costume head", /obj/item/clothing/head/human_head, 5, on_floor = 1), \
)
/obj/item/stack/sheet/animalhide/human/New(var/loc, var/amount=null)
recipes = human_recipes
return ..()
/obj/item/stack/sheet/animalhide/generic
name = "generic skin"
desc = "A piece of generic skin."
singular_name = "generic skin piece"
icon_state = "sheet-hide"
origin_tech = null
/obj/item/stack/sheet/animalhide/corgi
name = "corgi hide"
desc = "The by-product of corgi farming."
@@ -5,6 +5,7 @@ Mineral Sheets
- Diamond
- Uranium
- Plasma
- Plastic
- Gold
- Silver
- Bananium
@@ -191,4 +192,4 @@ var/global/list/datum/stack_recipe/mime_recipes = list ( \
name = "enriched uranium"
icon_state = "sheet-enruranium"
origin_tech = "materials=6"
materials = list(MAT_URANIUM=3000)
materials = list(MAT_URANIUM=3000)
@@ -51,6 +51,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
@@ -87,7 +88,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
/obj/item/stack/sheet/metal
name = "metal"
desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
desc = "Sheets made out of metal."
singular_name = "metal sheet"
icon_state = "sheet-metal"
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
@@ -97,7 +98,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
/obj/item/stack/sheet/metal/cyborg
name = "metal"
desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
desc = "Sheets made out of metal."
singular_name = "metal sheet"
icon_state = "sheet-metal"
materials = list()
@@ -108,7 +109,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
recipes = metal_recipes
return ..()
/*
* Plasteel
*/
@@ -117,8 +117,6 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
new/datum/stack_recipe("Surgery Table", /obj/machinery/optable, 5, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), \
new/datum/stack_recipe("Mass Driver frame", /obj/machinery/mass_driver_frame, 3, time = 50, one_per_turf = 1), \
// new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/rust_fuel_assembly_port_frame, 12, time = 50, one_per_turf = 1), \
// new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/rust_fuel_compressor_frame, 12, time = 50, one_per_turf = 1), \
)
+1 -1
View File
@@ -272,4 +272,4 @@
New(title, recipes, req_amount = 1)
src.title = title
src.recipes = recipes
src.req_amount = req_amount
src.req_amount = req_amount
@@ -95,6 +95,10 @@
if(!get_location_accessible(H, "mouth"))
user << "<span class='warning'>The mask is in the way.</span>"
return
if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one...
if(!H.client.prefs.rlimb_data["head"])
user << "<span class='warning'>You find yourself disappointed at the appalling lack of facial hair.</span>"
return
if(H.f_style == "Shaved")
user << "<span class='notice'>Already clean-shaven.</span>"
return
@@ -123,6 +127,10 @@
if(!get_location_accessible(H, "head"))
user << "<span class='warning'>The headgear is in the way.</span>"
return
if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one...
if(!H.client.prefs.rlimb_data["head"])
user << "<span class='warning'>You find yourself disappointed at the appalling lack of hair.</span>"
return
if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead")
user << "<span class='notice'>There is not enough hair left to shave...</span>"
return
+162
View File
@@ -0,0 +1,162 @@
/*
* Contains:
* Traitor fiber wire
* Improvised garrotes
*/
/obj/item/weapon/twohanded/garrote // 12TC traitor item
name = "fiber wire"
desc = "A length of razor-thin wire with an elegant wooden handle on either end.<br>You suspect you'd have to be behind the target to use this weapon effectively."
icon_state = "garrot_wrap"
w_class = 1
var/mob/living/carbon/human/strangling
var/improvised = 0
var/garrote_time
/obj/item/weapon/twohanded/garrote/update_icon()
if(strangling) // If we're strangling someone we want our icon to stay wielded
icon_state = "garrot_unwrap"
return
icon_state = "garrot_[wielded ? "un" : ""]wrap"
/obj/item/weapon/twohanded/garrote/improvised // Made via tablecrafting
name = "garrote"
desc = "A length of cable with a shoddily-carved wooden handle tied to either end.<br>You suspect you'd have to be behind the target to use this weapon effectively."
icon_state = "garrot_I_wrap"
improvised = 1
/obj/item/weapon/twohanded/garrote/improvised/update_icon()
if(strangling)
icon_state = "garrot_I_unwrap"
return
icon_state = "garrot_I_[wielded ? "un" : ""]wrap"
/obj/item/weapon/twohanded/garrote/wield(mob/living/carbon/user)
if(strangling)
user.visible_message("<span class='info'>[user] removes the [src] from [strangling]'s neck.</span>", \
"<span class='warning'>You remove the [src] from [strangling]'s neck.</span>")
strangling = null
update_icon()
processing_objects.Remove(src)
else
..()
/obj/item/weapon/twohanded/garrote/attack(mob/living/carbon/M as mob, mob/user as mob)
if(garrote_time > world.time) // Cooldown
return
if(!istype(user, /mob/living/carbon/human)) // spap_hand is a proc of /mob/living, user is simply /mob
return
var/mob/living/carbon/human/U = user
if(!wielded)
user << "<span class = 'warning'>You must use both hands to garrote [M]!</span>"
return
if(!istype(M, /mob/living/carbon/human))
user << "<span class = 'warning'>You don't think that garroting [M] would be very effective...</span>"
return
if(M == U)
U.suicide() // This will display a prompt for confirmation first.
return
if(M.dir != U.dir)
user << "<span class='warning'>You cannot use [src] on [M] from that angle!</span>"
return
if(improvised && ((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))) // Improvised garrotes are blocked by mouth-covering items.
user << "<span class = 'warning'>[M]'s neck is blocked by something they're wearing!</span>"
if(strangling)
user << "<span class = 'warning'>You cannot use [src] on two people at once!</span>"
return
unwield(U)
U.swap_hand() // For whatever reason the grab will not properly work if we don't have the free hand active.
M.grabbedby(U, 1)
var/obj/item/weapon/grab/G = U.get_active_hand()
U.swap_hand()
if(G && istype(G))
if(improvised) // Improvised garrotes start you off with a passive grab, but keep you stunned like an agressive grab.
M.Stun(1)
else
G.state = GRAB_NECK
G.hud.icon_state = "kill"
G.hud.name = "kill"
M.silent += 1
garrote_time = world.time + 10
processing_objects.Add(src)
strangling = M
update_icon()
playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1)
M.visible_message("<span class='danger'>[U] comes from behind and begins garroting [M] with the [src]!</span>", \
"<span class='userdanger'>[U]\ begins garroting you with the [src]![improvised ? "" : " You are unable to speak!"]</span>", \
"You hear struggling and wire strain against flesh!")
return
/obj/item/weapon/twohanded/garrote/process()
if(!istype(loc, /mob/living/carbon/human))
strangling = null
update_icon()
processing_objects.Remove(src)
return
var/mob/living/carbon/human/user = loc
var/obj/item/weapon/grab/G
if(src == user.r_hand && istype(user.l_hand, /obj/item/weapon/grab))
G = user.l_hand
else if(src == user.l_hand && istype(user.r_hand, /obj/item/weapon/grab))
G = user.r_hand
else
user.visible_message("<span class='warning'>[user] loses his grip on [strangling]'s neck.</span>", \
"<span class='warning'>You lose your grip on [strangling]'s neck.</span>")
strangling = null
update_icon()
processing_objects.Remove(src)
return
if(!G.affecting)
user.visible_message("<span class='warning'>[user] loses his grip on [strangling]'s neck.</span>", \
"<span class='warning'>You lose your grip on [strangling]'s neck.</span>")
strangling = null
update_icon()
processing_objects.Remove(src)
return
if(G.state < GRAB_NECK) // Only possible with improvised garrotes, essentially this will stun people as if they were aggressively grabbed. Allows for resisting out if you're quick, but not running away.
strangling.Stun(3)
if(improvised)
strangling.stuttering = max(strangling.stuttering, 3)
strangling.apply_damage(2, OXY, "head")
return
strangling.silent = max(strangling.silent, 3) // Non-improvised effects
strangling.apply_damage(4, OXY, "head")
/obj/item/weapon/twohanded/garrote/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is wrapping the [src] around \his neck and pulling the handles! It looks like \he's trying to commit suicide.</span>")
playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1)
return (OXYLOSS)
@@ -0,0 +1,16 @@
/obj/item/weapon/grenade/confetti
name = "party grenade"
desc = "Party time!"
icon_state = "confetti"
var/spawner_type = /obj/effect/decal/cleanable/confetti
/obj/item/weapon/grenade/confetti/prime()
var/turf/T = get_turf(src)
playsound(T, 'sound/effects/confetti_partywhistle.ogg', 100, 1)
for(var/i in 1 to 20) //20 confettis. Yes.
var/atom/movable/x = new spawner_type
x.loc = T
for(var/j in 1 to rand(1, 4))
step(x, pick(NORTH,SOUTH,EAST,WEST))
qdel(src)
+16 -2
View File
@@ -34,8 +34,14 @@
if(H.species)
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
if(H.species.name in tmp_facial.species_allowed)
if(H.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
species_facial_hair += i
else
if(H.species.flags & ALL_RPARTS)
if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_facial.species_allowed))
species_facial_hair += i
else
return
else
species_facial_hair = facial_hair_styles_list
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
@@ -44,8 +50,16 @@
if(H.species)
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
if(H.species.name in tmp_hair.species_allowed)
if(H.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
if((H.species.flags & ALL_RPARTS) && !("head" in H.client.prefs.rlimb_data))
return
species_hair += i
else
if(H.species.flags & ALL_RPARTS)
if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_hair.species_allowed))
species_facial_hair += i
else
return
else
species_hair = hair_styles_list
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair
@@ -69,6 +69,10 @@
origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
return
/obj/item/weapon/storage/lockbox/hear_talk(mob/living/M as mob, msg)
/obj/item/weapon/storage/lockbox/hear_message(mob/living/M as mob, msg)
/obj/item/weapon/storage/lockbox/large
name = "Large lockbox"
desc = "A large lockbox"
@@ -147,6 +147,9 @@
usr << "<span class='notice'>[src] is locked!</span>"
return 0
/obj/item/weapon/storage/secure/hear_talk(mob/living/M as mob, msg)
/obj/item/weapon/storage/secure/hear_message(mob/living/M as mob, msg)
// -----------------------------
// Secure Briefcase
@@ -462,6 +462,16 @@
O.emp_act(severity)
..()
/obj/item/weapon/storage/hear_talk(mob/living/M as mob, msg)
..()
for(var/obj/O in contents)
O.hear_talk(M, msg)
/obj/item/weapon/storage/hear_message(mob/living/M as mob, msg)
..()
for(var/obj/O in contents)
O.hear_message(M, msg)
// BubbleWrap - A box can be folded up to make card
/obj/item/weapon/storage/attack_self(mob/user as mob)
+3
View File
@@ -268,3 +268,6 @@ a {
tesla_zap(src, 3, power_bounced)
spawn(10)
being_shocked = 0
/obj/proc/CanAStarPass()
. = !density
+6
View File
@@ -122,6 +122,12 @@
else
return !density
/obj/structure/grille/CanAStarPass(ID, dir, caller)
. = !density
if(ismovableatom(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSGRILLE)
/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
+115 -36
View File
@@ -1,5 +1,33 @@
//////Kitchen Spike
/obj/structure/kitchenspike_frame
name = "meatspike frame"
icon = 'icons/obj/kitchen.dmi'
icon_state = "spikeframe"
desc = "The frame of a meat spike."
density = 1
anchored = 0
/obj/structure/kitchenspike_frame/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
if(istype(I, /obj/item/weapon/wrench))
if(anchored)
user << "<span class='notice'>You unwrench [src] from the floor.</span>"
anchored = 0
else
user << "<span class='notice'>You wrench [src] into place.</span>"
anchored = 1
else if(istype(I, /obj/item/stack/rods))
var/obj/item/stack/rods/R = I
if(R.get_amount() >= 4)
R.use(4)
user << "<span class='notice'>You add spikes to the frame.</span>"
new /obj/structure/kitchenspike(loc)
add_fingerprint(user)
qdel(src)
/obj/structure/kitchenspike
name = "a meat spike"
icon = 'icons/obj/kitchen.dmi'
@@ -7,54 +35,105 @@
desc = "A spike for collecting meat from animals."
density = 1
anchored = 1
var/meat = 0
var/occupied
var/meat_type
var/victim_name = "corpse"
buckle_lying = 0
can_buckle = 1
/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
if(istype(G, /obj/item/weapon/crowbar))
if(!buckled_mob)
playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
if(do_after(user, 20, target = src))
user << "<span class='notice'>You pry the spikes out of the frame.</span>"
new /obj/item/stack/rods(loc, 4)
new /obj/structure/kitchenspike_frame(loc)
add_fingerprint(user)
qdel(src)
else
user << "<span class='notice'>You can't do that while something's on the spike!</span>"
return
if(!istype(G, /obj/item/weapon/grab) || !G.affecting)
return
if(occupied)
if(buckled_mob)
user << "<span class = 'danger'>The spike already has something on it, finish collecting its meat first!</span>"
else
if(spike(G.affecting))
visible_message("<span class = 'danger'>[user] has forced [G.affecting] onto the spike, killing them instantly!</span>")
qdel(G.affecting)
qdel(G)
else
user << "<span class='danger'>They are too big for the spike, try something smaller!</span>"
if(isliving(G.affecting))
if(!buckled_mob)
if(do_mob(user, src, 120))
if(spike(G.affecting))
G.affecting.visible_message("<span class='danger'>[user] slams [G.affecting] onto the meat spike!</span>", "<span class='userdanger'>[user] slams you onto the meat spike!</span>", "<span class='italics'>You hear a squishy wet noise.</span>")
qdel(G)
return
user << "<span class='danger'>You can't use that on the spike!</span>"
return
/obj/structure/kitchenspike/proc/spike(var/mob/living/victim)
if(!istype(victim))
return
if(istype(victim, /mob/living/carbon/human))
var/mob/living/carbon/human/H = victim
if(!H.species.is_small)
return 0
meat_type = H.species.meat_type
icon_state = "spikebloody"
else if(istype(victim, /mob/living/carbon/alien))
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
icon_state = "spikebloodygreen"
else
return 0
victim_name = victim.name
occupied = 1
meat = 5
if(buckled_mob) //to prevent spam/queing up attacks
return 0
if(victim.buckled)
return 0
var/mob/living/H = victim
playsound(loc, "sound/effects/splat.ogg", 25, 1)
H.forceMove(loc)
H.emote("scream")
if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere
var/turf/simulated/pos = get_turf(H)
pos.add_blood_floor(H)
H.adjustBruteLoss(30)
H.buckled = src
H.dir = 2
buckled_mob = H
var/matrix/m180 = matrix()
m180.Turn(180)
animate(H, transform = m180, time = 3)
H.pixel_y = H.get_standard_pixel_y_offset(180)
return 1
/obj/structure/kitchenspike/attack_hand(mob/user as mob)
if(..() || !occupied)
return
meat--
new meat_type(get_turf(src))
if(src.meat > 1)
user << "You remove some meat from \the [victim_name]."
else if(src.meat == 1)
user << "You remove the last piece of meat from \the [victim_name]!"
icon_state = "spike"
occupied = 0
/obj/structure/kitchenspike/user_buckle_mob(mob/living/M, mob/living/user) //Don't want them getting put on the rack other than by spiking
return
/obj/structure/kitchenspike/user_unbuckle_mob(mob/living/carbon/human/user)
if(buckled_mob && buckled_mob.buckled == src)
var/mob/living/M = buckled_mob
if(M != user)
M.visible_message(\
"[user.name] tries to pull [M.name] free of the [src]!",\
"<span class='notice'>[user.name] is trying to pull you off of [src], opening up fresh wounds!</span>",\
"<span class='italics'>You hear a squishy wet noise.</span>")
if(!do_after(user, 300, target = src))
if(M && M.buckled)
M.visible_message(\
"[user.name] fails to free [M.name]!",\
"<span class='notice'>[user.name] fails to pull you off of [src].</span>")
return
else
M.visible_message(\
"<span class='warning'>[M.name] struggles to break free from the [src]!</span>",\
"<span class='notice'>You struggle to break free from the [src], exacerbating your wounds! (Stay still for two minutes.)</span>",\
"<span class='italics'>You hear a wet squishing noise..</span>")
M.adjustBruteLoss(30)
if(!do_after(M, 1200, target = src))
if(M && M.buckled)
M << "<span class='warning'>You fail to free yourself!</span>"
return
if(!M.buckled)
return
var/matrix/m180 = matrix(M.transform)
m180.Turn(180)
animate(M, transform = m180, time = 3)
M.pixel_y = M.get_standard_pixel_y_offset(180)
M.adjustBruteLoss(30)
visible_message("<span class='danger'>[M] falls free of the [src]!</span>")
unbuckle_mob()
M.emote("scream")
M.AdjustWeakened(10)
+17 -2
View File
@@ -201,6 +201,22 @@
connected = null
return ..()
/obj/structure/tray/m_tray/CanPass(atom/movable/mover, turf/target, height=0)
if(height == 0)
return 1
if(istype(mover) && mover.checkpass(PASSTABLE))
return 1
if(locate(/obj/structure/table) in get_turf(mover))
return 1
else
return 0
/obj/structure/tray/m_tray/CanAStarPass(ID, dir, caller)
. = !density
if(ismovableatom(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSTABLE)
/*
* Crematorium
@@ -479,5 +495,4 @@
if (istype(B.loc,/obj/structure/morgue))
Morgue = B.loc
if (Morgue)
Morgue.update()
Morgue.update()
@@ -140,6 +140,12 @@
return 1
return 0
/obj/structure/table/CanAStarPass(ID, dir, caller)
. = !density
if(ismovableatom(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSTABLE)
//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops.
/obj/structure/table/proc/check_cover(obj/item/projectile/P, turf/from)
var/turf/cover = flipped ? get_turf(src) : get_step(loc, get_dir(from, loc))
@@ -661,6 +667,12 @@
else
return 0
/obj/structure/rack/CanAStarPass(ID, dir, caller)
. = !density
if(ismovableatom(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSTABLE)
/obj/structure/rack/MouseDrop_T(obj/O as obj, mob/user as mob)
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
return
+1 -1
View File
@@ -82,7 +82,7 @@
if(open)
GM.visible_message("<span class='danger'>[user] starts to give [GM] a swirlie!</span>", "<span class='userdanger'>[user] starts to give [GM] a swirlie...</span>")
swirlie = GM
if(do_after(user, 30, 5, 0, target = src))
if(do_after(user, 30, 0, target = src))
GM.visible_message("<span class='danger'>[user] gives [GM] a swirlie!</span>", "<span class='userdanger'>[user] gives [GM] a swirlie!</span>", "<span class='italics'>You hear a toilet flushing.</span>")
if(iscarbon(GM))
var/mob/living/carbon/C = GM
+8
View File
@@ -97,6 +97,14 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
else
return 1
/obj/structure/window/CanAStarPass(ID, to_dir)
if(!density)
return 1
if((dir == SOUTHWEST) || (dir == to_dir))
return 0
return 1
/obj/structure/window/hitby(AM as mob|obj)
..()
var/tforce = 0