mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-21 19:17:50 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into shadowling
Conflicts: code/modules/mob/living/carbon/human/human.dm code/setup.dm
This commit is contained in:
@@ -16,6 +16,10 @@
|
||||
icon_state = "ash"
|
||||
anchored = 1
|
||||
|
||||
/obj/effect/decal/cleanable/ash/New()
|
||||
..()
|
||||
reagents.add_reagent("ash", 10)
|
||||
|
||||
/obj/effect/decal/cleanable/dirt
|
||||
name = "dirt"
|
||||
desc = "Someone should clean that up."
|
||||
@@ -27,6 +31,14 @@
|
||||
icon_state = "dirt"
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/decal/cleanable/dirt/blackpowder
|
||||
name = "black powder"
|
||||
mouse_opacity = 1
|
||||
noscoop = 1
|
||||
|
||||
/obj/effect/decal/cleanable/dirt/blackpowder/New()
|
||||
..()
|
||||
reagents.add_reagent("blackpowder", 40) //size 2 explosion when activated
|
||||
|
||||
/obj/effect/decal/cleanable/flour
|
||||
name = "flour"
|
||||
@@ -103,6 +115,11 @@
|
||||
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()
|
||||
..()
|
||||
reagents.add_reagent("vomit", 5)
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/green
|
||||
@@ -111,6 +128,11 @@
|
||||
icon_state = "gvomit_1"
|
||||
random_icon_states = list("gvomit_1", "gvomit_2", "gvomit_3", "gvomit_4")
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/green/New()
|
||||
..()
|
||||
reagents.remove_reagent("vomit", 5)
|
||||
reagents.add_reagent("green_vomit", 5)
|
||||
|
||||
/obj/effect/decal/cleanable/poop
|
||||
name = "poop"
|
||||
desc = "Gosh, how unpleasant."
|
||||
@@ -148,3 +170,17 @@
|
||||
layer = 2
|
||||
icon = 'icons/effects/tomatodecal.dmi'
|
||||
random_icon_states = list("smashed_pie")
|
||||
|
||||
/obj/effect/decal/cleanable/fungus
|
||||
name = "space fungus"
|
||||
desc = "A fungal growth. Looks pretty nasty."
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = 2
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "flour"
|
||||
color = "#D5820B"
|
||||
|
||||
/obj/effect/decal/cleanable/fungus/New()
|
||||
..()
|
||||
reagents.add_reagent("fungus", 10)
|
||||
|
||||
@@ -1,7 +1,43 @@
|
||||
/obj/effect/decal/cleanable
|
||||
var/list/random_icon_states = list()
|
||||
var/targeted_by = null // Used so cleanbots can't claim a mess.
|
||||
var/noscoop = 0 //if it has this, don't let it be scooped up
|
||||
var/noclear = 0 //if it has this, don't delete it when its' scooped up
|
||||
|
||||
/obj/effect/decal/cleanable/New()
|
||||
if (random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
create_reagents(100)
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/attackby(obj/item/weapon/W as obj, mob/user as mob,)
|
||||
if(istype(W, /obj/item/weapon/reagent_containers/glass) || istype(W, /obj/item/weapon/reagent_containers/food/drinks))
|
||||
if(src.reagents && W.reagents && !noscoop)
|
||||
if(!src.reagents.total_volume)
|
||||
user << "<span class='notice'>There isn't enough [src] to scoop up!</span>"
|
||||
return
|
||||
if(W.reagents.total_volume >= W.reagents.maximum_volume)
|
||||
user << "<span class='notice'>[W] is full!</span>"
|
||||
return
|
||||
user << "<span class='notice'>You scoop the [src] into [W]!</span>"
|
||||
reagents.trans_to(W, reagents.total_volume)
|
||||
if(!reagents.total_volume && !noclear) //scooped up all of it
|
||||
qdel(src)
|
||||
return
|
||||
if(is_hot(W)) //todo: make heating a reagent holder proc
|
||||
if(istype(W, /obj/item/clothing/mask/cigarette)) return
|
||||
else
|
||||
src.reagents.chem_temp += 15
|
||||
src.reagents.handle_reactions()
|
||||
user << "<span class='notice'>You heat [src] with [W]!</span>"
|
||||
|
||||
/obj/effect/decal/cleanable/ex_act()
|
||||
if(reagents)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
R.on_ex_act()
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/fire_act()
|
||||
reagents.chem_temp += 30
|
||||
reagents.handle_reactions()
|
||||
..()
|
||||
@@ -22,9 +22,9 @@
|
||||
|
||||
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user, params)
|
||||
if(W.attack_verb.len)
|
||||
visible_message("\red <B>\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]")
|
||||
visible_message("<span class='danger'>[user] has [pick(W.attack_verb)] \the [src] with \the [W]!</span>")
|
||||
else
|
||||
visible_message("\red <B>\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]")
|
||||
visible_message("<span class='danger'>[user] has attacked \the [src] with \the [W]!</span>")
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
/obj/effect/spider/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300)
|
||||
@@ -54,17 +54,18 @@
|
||||
|
||||
/obj/effect/spider/stickyweb
|
||||
icon_state = "stickyweb1"
|
||||
New()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
|
||||
/obj/effect/spider/stickyweb/New()
|
||||
if(prob(50))
|
||||
icon_state = "stickyweb2"
|
||||
|
||||
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/giant_spider))
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
return 1
|
||||
else if(istype(mover, /mob/living))
|
||||
if(prob(50))
|
||||
mover << "\red You get stuck in \the [src] for a moment."
|
||||
mover << "<span class='danger'>You get stuck in \the [src] for a moment.</span>"
|
||||
return 0
|
||||
else if(istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
@@ -75,37 +76,40 @@
|
||||
desc = "They seem to pulse slightly with an inner life"
|
||||
icon_state = "eggs"
|
||||
var/amount_grown = 0
|
||||
New()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
processing_objects.Add(src)
|
||||
var/player_spiders = 0
|
||||
|
||||
/obj/effect/spider/eggcluster/New()
|
||||
pixel_x = rand(3,-3)
|
||||
pixel_y = rand(3,-3)
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/effect/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
var/num = rand(2,6)
|
||||
var/num = rand(3,12)
|
||||
for(var/i=0, i<num, i++)
|
||||
new /obj/effect/spider/spiderling(src.loc)
|
||||
del(src)
|
||||
var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(src.loc)
|
||||
if(player_spiders)
|
||||
S.player_spiders = 1
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/spiderling
|
||||
name = "spiderling"
|
||||
desc = "It never stays still for long."
|
||||
icon_state = "spiderling"
|
||||
anchored = 0
|
||||
layer = 2.7
|
||||
layer = 2.75
|
||||
health = 3
|
||||
var/amount_grown = -1
|
||||
var/amount_grown = 0
|
||||
var/grow_as = null
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
|
||||
var/travelling_in_vent = 0
|
||||
New()
|
||||
pixel_x = rand(6,-6)
|
||||
pixel_y = rand(6,-6)
|
||||
processing_objects.Add(src)
|
||||
//50% chance to grow up
|
||||
if(prob(50))
|
||||
amount_grown = 1
|
||||
var/player_spiders = 0
|
||||
|
||||
/obj/effect/spider/spiderling/New()
|
||||
pixel_x = rand(6,-6)
|
||||
pixel_y = rand(6,-6)
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/effect/spider/spiderling/Bump(atom/user)
|
||||
if(istype(user, /obj/structure/table))
|
||||
@@ -116,7 +120,7 @@
|
||||
/obj/effect/spider/spiderling/proc/die()
|
||||
visible_message("<span class='alert'>[src] dies!</span>")
|
||||
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
|
||||
del(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/spiderling/healthcheck()
|
||||
if(health <= 0)
|
||||
@@ -137,8 +141,9 @@
|
||||
entry_vent = null
|
||||
return
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = pick(vents)
|
||||
/*if(prob(50))
|
||||
src.visible_message("<B>[src] scrambles into the ventillation ducts!</B>")*/
|
||||
if(prob(50))
|
||||
visible_message("<B>[src] scrambles into the ventillation ducts!</B>", \
|
||||
"<span class='notice'>You hear something squeezing through the ventilation ducts.</span>")
|
||||
|
||||
spawn(rand(20,60))
|
||||
loc = exit_vent
|
||||
@@ -151,7 +156,7 @@
|
||||
return
|
||||
|
||||
if(prob(50))
|
||||
src.visible_message("\blue You hear something squeezing through the ventilation ducts.",2)
|
||||
audible_message("<span class='notice'>You hear something squeezing through the ventilation ducts.</span>")
|
||||
sleep(travel_time)
|
||||
|
||||
if(!exit_vent || exit_vent.welded)
|
||||
@@ -167,30 +172,34 @@
|
||||
entry_vent = null
|
||||
//=================
|
||||
|
||||
else if(prob(25))
|
||||
var/list/nearby = oview(5, src)
|
||||
else if(prob(33))
|
||||
var/list/nearby = oview(10, src)
|
||||
if(nearby.len)
|
||||
var/target_atom = pick(nearby)
|
||||
walk_to(src, target_atom, 5)
|
||||
if(prob(25))
|
||||
src.visible_message("\blue \the [src] skitters[pick(" away"," around","")].")
|
||||
else if(prob(5))
|
||||
walk_to(src, target_atom)
|
||||
if(prob(40))
|
||||
src.visible_message("<span class='notice'>\The [src] skitters[pick(" away"," around","")].</span>")
|
||||
else if(prob(10))
|
||||
//ventcrawl!
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
|
||||
if(!v.welded)
|
||||
entry_vent = v
|
||||
walk_to(src, entry_vent, 5)
|
||||
walk_to(src, entry_vent, 1)
|
||||
break
|
||||
|
||||
if(prob(1))
|
||||
src.visible_message("\blue \the [src] chitters.")
|
||||
if(isturf(loc) && amount_grown > 0)
|
||||
if(isturf(loc))
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
if(!grow_as)
|
||||
grow_as = pick(typesof(/mob/living/simple_animal/hostile/giant_spider))
|
||||
new grow_as(src.loc)
|
||||
del(src)
|
||||
grow_as = pick(typesof(/mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
var/mob/living/simple_animal/hostile/poison/giant_spider/S = new grow_as(src.loc)
|
||||
if(player_spiders)
|
||||
var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
|
||||
var/client/C = null
|
||||
|
||||
if(candidates.len)
|
||||
C = pick(candidates)
|
||||
S.key = C.key
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/cleanable/spiderling_remains
|
||||
name = "spiderling remains"
|
||||
@@ -204,11 +213,11 @@
|
||||
icon_state = "cocoon1"
|
||||
health = 60
|
||||
|
||||
New()
|
||||
/obj/effect/spider/cocoon/New()
|
||||
icon_state = pick("cocoon1","cocoon2","cocoon3")
|
||||
|
||||
/obj/effect/spider/cocoon/Destroy()
|
||||
src.visible_message("\red \the [src] splits open.")
|
||||
src.visible_message("<span class='danger'>\The [src] splits open.</span>")
|
||||
for(var/atom/movable/A in contents)
|
||||
A.loc = src.loc
|
||||
..()
|
||||
|
||||
@@ -605,7 +605,7 @@
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
if(M.ckey)
|
||||
msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)") //BS12 EDIT ALG
|
||||
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)") //BS12 EDIT ALG
|
||||
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
// APC HULL
|
||||
|
||||
/obj/item/apc_frame
|
||||
name = "APC frame"
|
||||
desc = "Used for repairing or building APCs"
|
||||
icon = 'icons/obj/apc_repair.dmi'
|
||||
icon_state = "apc_frame"
|
||||
flags = CONDUCT
|
||||
|
||||
/obj/item/apc_frame/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
..()
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 )
|
||||
del(src)
|
||||
|
||||
/obj/item/apc_frame/proc/try_build(turf/on_wall)
|
||||
if (get_dist(on_wall,usr)>1)
|
||||
return
|
||||
var/ndir = get_dir(usr,on_wall)
|
||||
if (!(ndir in cardinal))
|
||||
return
|
||||
var/turf/loc = get_turf(usr)
|
||||
var/area/A = loc.loc
|
||||
if (!istype(loc, /turf/simulated/floor))
|
||||
usr << "\red APC cannot be placed on this spot."
|
||||
return
|
||||
if (A.requires_power == 0 || A.name == "Space")
|
||||
usr << "\red APC cannot be placed in this area."
|
||||
return
|
||||
if (A.get_apc())
|
||||
usr << "\red This area already has APC."
|
||||
return //only one APC per area
|
||||
for(var/obj/machinery/power/terminal/T in loc)
|
||||
if (T.master)
|
||||
usr << "\red There is another network terminal here."
|
||||
return
|
||||
else
|
||||
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc)
|
||||
C.amount = 10
|
||||
usr << "You cut the cables and disassemble the unused power terminal."
|
||||
del(T)
|
||||
new /obj/machinery/power/apc(loc, ndir, 1)
|
||||
del(src)
|
||||
@@ -40,9 +40,9 @@
|
||||
|
||||
name = pick("lunar","vorpal","hardcore","willow", "void","loopy","electro", "cyber","heavy", "ninja", "hydro", "blue", "red", "green", "purple", "strong", "divine","carp" ,"deadly","dead","vicious" ,"wild" ,"demon", "chill", "solid", "liquid", "crazy", "super", "hyper", "space", "wizard", "rainbow", "star", "turbo", "prism", "sticky") + " " + pick("jack","zero","null","beat","nip","bubbles" ,"ice","medicine","venom","shock","solar" ,"spice" ,"shredder", "heart" , "heat", "pill","hopper","scum","fruit", "bolt", "deck", "butter", "runoff", "grease", "flair", "sweat", "zone", "blast")
|
||||
|
||||
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" ,"cryptobiolin", "hydrocodone", "psilocybin", "mindbreaker", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
|
||||
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" ,"cryptobiolin", "hydrocodone", "psilocybin", "mindbreaker", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
|
||||
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" ,"cryptobiolin", "hydrocodone", "psilocybin", "mindbreaker", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
|
||||
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
|
||||
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" ,"hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
|
||||
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -81,4 +81,62 @@
|
||||
colour = temp
|
||||
update_window(usr)
|
||||
else
|
||||
..()
|
||||
..()
|
||||
|
||||
|
||||
//Spraycan stuff
|
||||
|
||||
/obj/item/toy/crayon/spraycan
|
||||
icon_state = "spraycan_cap"
|
||||
desc = "A metallic container containing tasty paint."
|
||||
var/capped = 1
|
||||
instant = 1
|
||||
validSurfaces = list(/turf/simulated/floor,/turf/simulated/wall)
|
||||
|
||||
/obj/item/toy/crayon/spraycan/New()
|
||||
..()
|
||||
name = "NanoTrasen-brand Rapid Paint Applicator"
|
||||
update_icon()
|
||||
|
||||
/obj/item/toy/crayon/spraycan/attack_self(mob/living/user as mob)
|
||||
var/choice = input(user,"Spraycan options") in list("Toggle Cap","Change Drawing","Change Color")
|
||||
switch(choice)
|
||||
if("Toggle Cap")
|
||||
user << "<span class='notice'>You [capped ? "Remove" : "Replace"] the cap of the [src]</span>"
|
||||
capped = capped ? 0 : 1
|
||||
icon_state = "spraycan[capped ? "_cap" : ""]"
|
||||
update_icon()
|
||||
if("Change Drawing")
|
||||
..()
|
||||
if("Change Color")
|
||||
colour = input(user,"Choose Color") as color
|
||||
update_icon()
|
||||
|
||||
/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user as mob, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(capped)
|
||||
return
|
||||
else
|
||||
if(iscarbon(target))
|
||||
if(uses-10 > 0)
|
||||
uses = uses - 10
|
||||
var/mob/living/carbon/human/C = target
|
||||
user.visible_message("<span class='danger'> [user] sprays [src] into the face of [target]!</span>")
|
||||
if(C.client)
|
||||
C.eye_blurry = max(C.eye_blurry, 3)
|
||||
C.eye_blind = max(C.eye_blind, 1)
|
||||
if(C.eyecheck() <= 0) // no eye protection? ARGH IT BURNS.
|
||||
C.confused = max(C.confused, 3)
|
||||
C.Weaken(3)
|
||||
C.lip_style = "spray_face"
|
||||
C.lip_color = colour
|
||||
C.update_body()
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
|
||||
..()
|
||||
|
||||
/obj/item/toy/crayon/spraycan/update_icon()
|
||||
overlays.Cut()
|
||||
var/image/I = image('icons/obj/crayons.dmi',icon_state = "[capped ? "spraycan_cap_colors" : "spraycan_colors"]")
|
||||
I.color = colour
|
||||
overlays += I
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Dehydrated Carp
|
||||
* Instant carp, just add water
|
||||
*/
|
||||
|
||||
// Child of carpplushie because this should do everything the toy does and more
|
||||
/obj/item/toy/carpplushie/dehy_carp
|
||||
var/mob/owner = null // Carp doesn't attack owner, set when using in hand
|
||||
var/owned = 1 // Boolean, no owner to begin with
|
||||
|
||||
// Attack self
|
||||
/obj/item/toy/carpplushie/dehy_carp/attack_self(mob/user as mob)
|
||||
src.add_fingerprint(user) // Anyone can add their fingerprints to it with this
|
||||
if(owned)
|
||||
user << "<span class='notice'>[src] stares up at you with friendly eyes.</span>"
|
||||
owner = user
|
||||
owned = 0
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/toy/carpplushie/dehy_carp/afterattack(obj/O, mob/user,proximity)
|
||||
if(!proximity) return
|
||||
if(istype(O,/obj/structure/sink))
|
||||
user << "<span class='notice'>You place [src] under a stream of water...</span>"
|
||||
user.drop_item()
|
||||
loc = get_turf(O)
|
||||
return Swell()
|
||||
..()
|
||||
|
||||
/obj/item/toy/carpplushie/dehy_carp/proc/Swell()
|
||||
desc = "It's growing!"
|
||||
visible_message("<span class='notice'>[src] swells up!</span>")
|
||||
|
||||
// Animation
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
flick("carp_swell", src)
|
||||
// Wait for animation to end
|
||||
sleep(6)
|
||||
// Make space carp
|
||||
var/mob/living/simple_animal/hostile/carp/C = new /mob/living/simple_animal/hostile/carp(get_turf(src))
|
||||
// Make carp non-hostile to user, yes this means
|
||||
C.faction |= "\ref[owner]"
|
||||
qdel(src)
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been carded with [src.name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to card [M.name] ([M.ckey])</font>")
|
||||
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to card [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used the [src.name] to card [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
transfer_ai("AICORE", "AICARD", M, user)
|
||||
return
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
icon_override = 'icons/mob/in-hand/tools.dmi'
|
||||
force = 10
|
||||
var/datum/song/handheld/song
|
||||
hitsound = 'sound/effects/guitarsmash.ogg'
|
||||
|
||||
/obj/item/device/guitar/New()
|
||||
song = new("guitar", src)
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
|
||||
|
||||
bombers += "[key_name(user)] attached a [item] to a transfer valve."
|
||||
msg_admin_attack("[key_name_admin(user)] attached [item] to a transfer valve.")
|
||||
msg_admin_attack("[key_name_admin(user)][isAntag(user) ? "(ANTAG)" : ""] attached [item] to a transfer valve.")
|
||||
log_game("[key_name_admin(user)] attached [item] to a transfer valve.")
|
||||
attacher = user
|
||||
nanomanager.update_uis(src) // update all UIs attached to src
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
icon_state = "violin"
|
||||
item_state = "violin"
|
||||
force = 10
|
||||
hitsound = 'sound/weapons/smash.ogg'
|
||||
var/datum/song/handheld/song
|
||||
|
||||
/obj/item/device/violin/New()
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
AIR ALARM ITEM
|
||||
Handheld air alarm frame, for placing on walls
|
||||
Code shamelessly copied from apc_frame
|
||||
*/
|
||||
/obj/item/mounted/frame/alarm_frame
|
||||
name = "air alarm frame"
|
||||
desc = "Used for building Air Alarms"
|
||||
icon = 'icons/obj/monitors.dmi'
|
||||
icon_state = "alarm_bitem"
|
||||
m_amt = 2000
|
||||
mount_reqs = list("simfloor", "nospace")
|
||||
|
||||
/obj/item/mounted/frame/alarm_frame/do_build(turf/on_wall, mob/user)
|
||||
new /obj/machinery/alarm(get_turf(src), get_dir(on_wall, user), 1)
|
||||
qdel(src)
|
||||
@@ -0,0 +1,29 @@
|
||||
/obj/item/mounted/frame/apc_frame
|
||||
name = "APC frame"
|
||||
desc = "Used for repairing or building APCs"
|
||||
icon = 'icons/obj/apc_repair.dmi'
|
||||
icon_state = "apc_frame"
|
||||
mount_reqs = list("simfloor", "nospace")
|
||||
|
||||
/obj/item/mounted/frame/apc_frame/try_build(turf/on_wall, mob/user)
|
||||
if(..())
|
||||
var/turf/turf_loc = get_turf(user)
|
||||
var/area/area_loc = turf_loc.loc
|
||||
if (area_loc.get_apc())
|
||||
user << "<span class='rose'>This area already has an APC.</span>"
|
||||
return //only one APC per area
|
||||
for(var/obj/machinery/power/terminal/T in turf_loc)
|
||||
if (T.master)
|
||||
user << "<span class='rose'>There is another network terminal here.</span>"
|
||||
return
|
||||
else
|
||||
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(turf_loc)
|
||||
C.amount = 10
|
||||
user << "You cut the cables and disassemble the unused power terminal."
|
||||
qdel(T)
|
||||
return 1
|
||||
return
|
||||
|
||||
/obj/item/mounted/frame/apc_frame/do_build(turf/on_wall, mob/user)
|
||||
new /obj/machinery/power/apc(get_turf(src), get_dir(user, on_wall), 1)
|
||||
qdel(src)
|
||||
@@ -0,0 +1,10 @@
|
||||
/obj/item/mounted/frame/firealarm
|
||||
name = "fire alarm frame"
|
||||
desc = "Used for building Fire Alarms"
|
||||
icon = 'icons/obj/monitors.dmi'
|
||||
icon_state = "fire_bitem"
|
||||
mount_reqs = list("simfloor", "nospace")
|
||||
|
||||
/obj/item/mounted/frame/firealarm/do_build(turf/on_wall, mob/user)
|
||||
new /obj/machinery/firealarm(get_turf(src), get_dir(on_wall, user), 1)
|
||||
qdel(src)
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/item/mounted/frame
|
||||
name = "mountable frame"
|
||||
desc = "Place it on a wall."
|
||||
var/sheets_refunded = 2
|
||||
var/list/mount_reqs = list() //can contain simfloor, nospace. Used in try_build to see if conditions are needed, then met
|
||||
|
||||
/obj/item/mounted/frame/attackby(obj/item/weapon/W, mob/user)
|
||||
..()
|
||||
if (istype(W, /obj/item/weapon/wrench) && sheets_refunded)
|
||||
//new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded )
|
||||
var/obj/item/stack/sheet/metal/M = getFromPool(/obj/item/stack/sheet/metal, get_turf(src))
|
||||
M.amount = sheets_refunded
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mounted/frame/try_build(turf/on_wall, mob/user)
|
||||
if(..()) //if we pass the parent tests
|
||||
var/turf/turf_loc = get_turf(user)
|
||||
|
||||
if (src.mount_reqs.Find("simfloor") && !istype(turf_loc, /turf/simulated/floor))
|
||||
user << "<span class='rose'>[src] cannot be placed on this spot.</span>"
|
||||
return
|
||||
if (src.mount_reqs.Find("nospace") && (areaMaster.requires_power == 0 || areaMaster.name == "Space"))
|
||||
user << "<span class='rose'>[src] cannot be placed in this area.</span>"
|
||||
return
|
||||
return 1
|
||||
@@ -0,0 +1,39 @@
|
||||
/obj/item/mounted/frame/light_fixture
|
||||
name = "light fixture frame"
|
||||
desc = "Used for building lights."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "tube-construct-item"
|
||||
var/fixture_type = "tube"
|
||||
mount_reqs = list("simfloor")
|
||||
|
||||
/obj/item/mounted/frame/light_fixture/do_build(turf/on_wall, mob/user)
|
||||
user << "You begin attaching [src] to \the [on_wall]."
|
||||
playsound(get_turf(src), 'sound/machines/click.ogg', 75, 1)
|
||||
var/constrdir = user.dir
|
||||
var/constrloc = get_turf(user)
|
||||
if (!do_after(user, 30))
|
||||
return
|
||||
var/obj/machinery/light_construct/newlight
|
||||
switch(fixture_type)
|
||||
if("bulb")
|
||||
newlight = new /obj/machinery/light_construct/small(constrloc)
|
||||
if("tube")
|
||||
newlight = new /obj/machinery/light_construct(constrloc)
|
||||
else
|
||||
newlight = new /obj/machinery/light_construct/small(constrloc)
|
||||
newlight.dir = constrdir
|
||||
newlight.fingerprints = src.fingerprints
|
||||
newlight.fingerprintshidden = src.fingerprintshidden
|
||||
newlight.fingerprintslast = src.fingerprintslast
|
||||
|
||||
user.visible_message("[user] attaches \the [src] to \the [on_wall].", \
|
||||
"You attach \the [src] to \the [on_wall].")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mounted/frame/light_fixture/small
|
||||
name = "small light fixture frame"
|
||||
desc = "Used for building small lights."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "bulb-construct-item"
|
||||
fixture_type = "bulb"
|
||||
sheets_refunded = 1
|
||||
@@ -0,0 +1,34 @@
|
||||
/obj/item/mounted
|
||||
var/list/buildon_types = list(/turf/simulated/wall)
|
||||
|
||||
|
||||
/obj/item/mounted/afterattack(var/atom/A, mob/user, proximity_flag)
|
||||
var/found_type = 0
|
||||
for(var/turf_type in src.buildon_types)
|
||||
if(istype(A, turf_type))
|
||||
found_type = 1
|
||||
break
|
||||
|
||||
if(found_type)
|
||||
if(try_build(A, user, proximity_flag))
|
||||
return do_build(A, user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/mounted/proc/try_build(turf/on_wall, mob/user, proximity_flag) //checks
|
||||
if(!on_wall || !user)
|
||||
return
|
||||
if (proximity_flag != 1) //if we aren't next to the wall
|
||||
return
|
||||
if (!( get_dir(on_wall,user) in cardinal))
|
||||
user << "<span class='rose'>You need to be standing next to a wall to place \the [src].</span>"
|
||||
return
|
||||
|
||||
if(gotwallitem(get_turf(user), get_dir(on_wall,user)))
|
||||
user << "<span class='rose'>There's already an item on this wall!</span>"
|
||||
return
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/mounted/proc/do_build(turf/on_wall, mob/user) //the buildy bit after we pass the checks
|
||||
return
|
||||
@@ -0,0 +1,32 @@
|
||||
/obj/item/mounted/frame/newscaster_frame
|
||||
name = "newscaster frame"
|
||||
desc = "Used to build newscasters, just secure to the wall."
|
||||
icon_state = "newscaster"
|
||||
item_state = "syringe_kit"
|
||||
m_amt = 14000
|
||||
g_amt = 8000
|
||||
mount_reqs = list("simfloor", "nospace")
|
||||
|
||||
/obj/item/mounted/frame/newscaster_frame/try_build(turf/on_wall, mob/user)
|
||||
if(..())
|
||||
var/turf/loc = get_turf(usr)
|
||||
var/area/A = loc.loc
|
||||
if (!istype(loc, /turf/simulated/floor))
|
||||
usr << "<span class='alert'>Newscaster cannot be placed on this spot.</span>"
|
||||
return
|
||||
if (A.requires_power == 0 || A.name == "Space")
|
||||
usr << "<span class='alert'>Newscaster cannot be placed in this area.</span>"
|
||||
return
|
||||
|
||||
for(var/obj/machinery/newscaster/T in loc)
|
||||
usr << "<span class='alert'>There is another newscaster here.</span>"
|
||||
return
|
||||
|
||||
return 1
|
||||
return
|
||||
|
||||
/obj/item/mounted/frame/newscaster_frame/do_build(turf/on_wall, mob/user)
|
||||
var/obj/machinery/newscaster/N = new /obj/machinery/newscaster(get_turf(src), get_dir(on_wall, user), 1)
|
||||
N.pixel_y -= (loc.y - on_wall.y) * 32
|
||||
N.pixel_x -= (loc.x - on_wall.x) * 32
|
||||
qdel(src)
|
||||
@@ -61,7 +61,7 @@
|
||||
// identify_probability = 0
|
||||
New()
|
||||
..()
|
||||
var/global/list/chems_only = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","cryptobiolin","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","clonexadone","spaceacillin","carpotoxin","mindbreaker","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin")
|
||||
var/global/list/chems_only = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","clonexadone","spaceacillin","carpotoxin","mindbreaker","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin")
|
||||
var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
|
||||
|
||||
var/datum/reagent/R = pick(chems_only + rare_chems)
|
||||
@@ -123,7 +123,7 @@
|
||||
|
||||
New()
|
||||
..()
|
||||
var/global/list/meds_only = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","mutadone","mutagen","teporone","cryptobiolin","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","spaceacillin","carpotoxin","mindbreaker","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin")
|
||||
var/global/list/meds_only = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","spaceacillin","carpotoxin","mindbreaker","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin")
|
||||
var/global/list/rare_meds = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood")
|
||||
|
||||
var/i = 1
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
|
||||
if(M.ckey)
|
||||
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used the [src.name] to attack [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
|
||||
@@ -28,6 +28,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
|
||||
), 2), \
|
||||
null, \
|
||||
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
|
||||
new/datum/stack_recipe("glass table frame parts", /obj/item/weapon/table_parts/glass, 2), \
|
||||
new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
|
||||
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
@@ -63,12 +64,12 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
|
||||
), 4), \
|
||||
null, \
|
||||
new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
|
||||
new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
|
||||
new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
|
||||
new/datum/stack_recipe("light fixture frame", /obj/item/mounted/frame/light_fixture, 2), \
|
||||
new/datum/stack_recipe("small light fixture frame", /obj/item/mounted/frame/light_fixture/small, 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
|
||||
new/datum/stack_recipe("air alarm frame", /obj/item/alarm_frame, 2), \
|
||||
new/datum/stack_recipe("fire alarm frame", /obj/item/firealarm_frame, 2), \
|
||||
new/datum/stack_recipe("apc frame", /obj/item/mounted/frame/apc_frame, 2), \
|
||||
new/datum/stack_recipe("air alarm frame", /obj/item/mounted/frame/alarm_frame, 2), \
|
||||
new/datum/stack_recipe("fire alarm frame", /obj/item/mounted/frame/firealarm, 2), \
|
||||
null, \
|
||||
)
|
||||
|
||||
|
||||
@@ -451,6 +451,7 @@
|
||||
var/instant = 0
|
||||
var/colourName = "red" //for updateIcon purposes
|
||||
var/dat
|
||||
var/list/validSurfaces = list(/turf/simulated/floor)
|
||||
|
||||
/obj/item/toy/crayon/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.</span>")
|
||||
@@ -497,7 +498,7 @@
|
||||
if("random_letter")
|
||||
temp = pick(letters)
|
||||
if("letter")
|
||||
temp = input("Choose the letter.", "Crayon scribbles") in letters
|
||||
temp = input("Choose the letter.", "Scribbles") in letters
|
||||
if("random_rune")
|
||||
temp = "rune[rand(1,6)]"
|
||||
if("random_graffiti")
|
||||
@@ -511,7 +512,7 @@
|
||||
|
||||
/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(target,/turf/simulated/floor))
|
||||
if(is_type_in_list(target,validSurfaces))
|
||||
var/temp = "rune"
|
||||
if(letters.Find(drawtype))
|
||||
temp = "letter"
|
||||
@@ -524,18 +525,19 @@
|
||||
if(uses)
|
||||
uses--
|
||||
if(!uses)
|
||||
user << "<span class='danger'>You used up your crayon!</span>"
|
||||
user << "<span class='danger'>You used up your [src.name]!</span>"
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
|
||||
var/huffable = istype(src,/obj/item/toy/crayon/spraycan)
|
||||
if(M == user)
|
||||
user << "You take a bite of the crayon. Delicious!"
|
||||
user << "You take a [huffable ? "huff" : "bite"] of the [src.name]. Delicious!"
|
||||
user.nutrition += 5
|
||||
if(uses)
|
||||
uses -= 5
|
||||
if(uses <= 0)
|
||||
user << "<span class='danger'>You ate your crayon!</span>"
|
||||
user << "<span class='danger'>There is no more of [src.name] left!</span>"
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
@@ -1187,14 +1189,15 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
desc = "An adorable stuffed toy that resembles a space carp."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "carpplushie"
|
||||
attack_verb = list("bit", "ate", "fin slapped")
|
||||
attack_verb = list("bitten", "eaten", "fin slapped")
|
||||
var/bitesound = 'sound/weapons/bite.ogg'
|
||||
w_class = 2.0
|
||||
|
||||
/obj/item/toy/carpplushie/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
// Attack mob
|
||||
/obj/item/toy/carpplushie/attack(mob/M as mob, mob/user as mob)
|
||||
playsound(loc, bitesound, 20, 1) // Play bite sound in local area
|
||||
return ..()
|
||||
|
||||
// Attack self
|
||||
/obj/item/toy/carpplushie/attack_self(mob/user as mob)
|
||||
playsound(src.loc, bitesound, 20, 1)
|
||||
return ..()
|
||||
|
||||
@@ -7,35 +7,38 @@
|
||||
var/colour = "red"
|
||||
var/open = 0
|
||||
|
||||
|
||||
/obj/item/weapon/lipstick/purple
|
||||
name = "purple lipstick"
|
||||
colour = "purple"
|
||||
|
||||
/obj/item/weapon/lipstick/jade
|
||||
//It's still called Jade, but theres no HTML color for jade, so we use lime.
|
||||
name = "jade lipstick"
|
||||
colour = "jade"
|
||||
colour = "lime"
|
||||
|
||||
/obj/item/weapon/lipstick/black
|
||||
name = "black lipstick"
|
||||
colour = "black"
|
||||
|
||||
|
||||
/obj/item/weapon/lipstick/random
|
||||
name = "lipstick"
|
||||
|
||||
/obj/item/weapon/lipstick/random/New()
|
||||
colour = pick("red","purple","jade","black")
|
||||
colour = pick("red","purple","lime","black","green","blue","white")
|
||||
name = "[colour] lipstick"
|
||||
|
||||
|
||||
/obj/item/weapon/lipstick/attack_self(mob/user as mob)
|
||||
overlays.Cut()
|
||||
user << "<span class='notice'>You twist \the [src] [open ? "closed" : "open"].</span>"
|
||||
open = !open
|
||||
if(open)
|
||||
icon_state = "[initial(icon_state)]_[colour]"
|
||||
var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color")
|
||||
colored.color = colour
|
||||
icon_state = "lipstick_uncap"
|
||||
overlays += colored
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
icon_state = "lipstick"
|
||||
|
||||
/obj/item/weapon/lipstick/attack(mob/M as mob, mob/user as mob)
|
||||
if(!open) return
|
||||
@@ -50,7 +53,8 @@
|
||||
if(H == user)
|
||||
user.visible_message("<span class='notice'>[user] does their lips with \the [src].</span>", \
|
||||
"<span class='notice'>You take a moment to apply \the [src]. Perfect!</span>")
|
||||
H.lip_style = colour
|
||||
H.lip_style = "lipstick"
|
||||
H.lip_color = colour
|
||||
H.update_body()
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins to do [H]'s lips with \the [src].</span>", \
|
||||
@@ -58,33 +62,12 @@
|
||||
if(do_after(user, 20) && do_after(H, 20, 5, 0)) //user needs to keep their active hand, H does not.
|
||||
user.visible_message("<span class='notice'>[user] does [H]'s lips with \the [src].</span>", \
|
||||
"<span class='notice'>You apply \the [src].</span>")
|
||||
H.lip_style = colour
|
||||
H.lip_style = "lipstick"
|
||||
H.lip_color = colour
|
||||
H.update_body()
|
||||
else
|
||||
user << "<span class='notice'>Where are the lips on that?</span>"
|
||||
|
||||
//you can wipe off lipstick with paper!
|
||||
/obj/item/weapon/paper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(user.zone_sel.selecting == "mouth")
|
||||
if(!istype(M, /mob)) return
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H == user)
|
||||
user << "<span class='notice'>You wipe off the lipstick with [src].</span>"
|
||||
H.lip_style = null
|
||||
H.update_body()
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins to wipe [H]'s lipstick off with \the [src].</span>", \
|
||||
"<span class='notice'>You begin to wipe off [H]'s lipstick.</span>")
|
||||
if(do_after(user, 10) && do_after(H, 10, 5, 0)) //user needs to keep their active hand, H does not.
|
||||
user.visible_message("<span class='notice'>[user] wipes [H]'s lipstick off with \the [src].</span>", \
|
||||
"<span class='notice'>You wipe off [H]'s lipstick.</span>")
|
||||
H.lip_style = null
|
||||
H.update_body()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/razor
|
||||
name = "electric razor"
|
||||
desc = "The latest and greatest power razor born from the science of shaving."
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("space_drugs", 25)
|
||||
B1.reagents.add_reagent("mindbreaker", 25)
|
||||
B1.reagents.add_reagent("lsd", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
update_icon()
|
||||
else if(clown_check(user))
|
||||
// This used to go before the assembly check, but that has absolutely zero to do with priming the damn thing. You could spam the admins with it.
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
var/log_str = "[key_name(usr)][isAntag(usr) ? "(ANTAG)" : ""]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
msg_admin_attack(log_str)
|
||||
log_game(log_str)
|
||||
bombers += "[log_str]"
|
||||
@@ -137,7 +137,7 @@
|
||||
contained = "\[[contained]\]"
|
||||
var/turf/bombturf = get_turf(loc)
|
||||
var/area/A = bombturf.loc
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has completed [name] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a> [contained]."
|
||||
var/log_str = "[key_name(usr)][isAntag(usr) ? "(ANTAG)" : ""]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has completed [name] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a> [contained]."
|
||||
msg_admin_attack(log_str)
|
||||
log_game(log_str)
|
||||
else
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
add_fingerprint(user)
|
||||
var/turf/bombturf = get_turf(src)
|
||||
var/area/A = get_area(bombturf)
|
||||
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
var/log_str = "[key_name(usr)][isAntag(usr) ? "(ANTAG)" : ""]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
|
||||
msg_admin_attack(log_str)
|
||||
log_game(log_str)
|
||||
bombers += "[log_str]"
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Had the [src.name] used on them by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] on [M.name] ([M.ckey])</font>")
|
||||
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] on [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] used the [src.name] on [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
if(!iscarbon(user))
|
||||
M.LAssailant = null
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'> Implanted with [src.name] ([src.imp.name]) by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] ([src.imp.name]) to implant [M.name] ([M.ckey])</font>")
|
||||
msg_admin_attack("[user.name] ([user.ckey]) implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
user.show_message("\red You implanted the implant into [M].")
|
||||
if(src.imp.implanted(M, user))
|
||||
|
||||
@@ -177,6 +177,15 @@
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
//Syndie variant of Secure Briefcase. Contains space cash, slightly more robust.
|
||||
/obj/item/weapon/storage/secure/briefcase/syndie
|
||||
force = 15.0
|
||||
|
||||
/obj/item/weapon/storage/secure/briefcase/syndie/New()
|
||||
for(var/i = 0, i < storage_slots - 2, i++)
|
||||
new /obj/item/weapon/spacecash/c1000(src)
|
||||
return ..()
|
||||
|
||||
// -----------------------------
|
||||
// Secure Safe
|
||||
// -----------------------------
|
||||
|
||||
@@ -138,6 +138,17 @@
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/hardsuit
|
||||
name = "Boxed Blood Red Suit and Helmet"
|
||||
can_hold = list(/obj/item/clothing/suit/space/rig/syndi, /obj/item/clothing/head/helmet/space/rig/syndi)
|
||||
max_w_class = 3
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/hardsuit/New()
|
||||
..()
|
||||
new /obj/item/clothing/suit/space/rig/syndi(src)
|
||||
new /obj/item/clothing/head/helmet/space/rig/syndi(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/conversion
|
||||
name = "box (CK)"
|
||||
|
||||
|
||||
@@ -62,6 +62,21 @@
|
||||
del(src)
|
||||
return
|
||||
|
||||
/*
|
||||
* Glass Table Parts
|
||||
*/
|
||||
/obj/item/weapon/table_parts/glass/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
new /obj/item/stack/sheet/metal( user.loc )
|
||||
new /obj/item/stack/sheet/metal( user.loc )
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/table_parts/glass/attack_self(mob/user as mob)
|
||||
new /obj/structure/glasstable_frame( user.loc )
|
||||
user.drop_item()
|
||||
del(src)
|
||||
return
|
||||
|
||||
/*
|
||||
* Rack Parts
|
||||
*/
|
||||
|
||||
@@ -256,7 +256,7 @@
|
||||
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
|
||||
return
|
||||
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding)
|
||||
msg_admin_attack("[key_name_admin(user)] triggered a fueltank explosion.")
|
||||
msg_admin_attack("[key_name_admin(user)][isAntag(user) ? "(ANTAG)" : ""] triggered a fueltank explosion.")
|
||||
log_game("[key_name(user)] triggered a fueltank explosion.")
|
||||
user << "\red That was stupid of you."
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = O
|
||||
|
||||
@@ -355,6 +355,59 @@ obj/item/weapon/twohanded/
|
||||
desc = "A spear brought over from the Kidan homeworld."
|
||||
|
||||
|
||||
///CHAINSAW///
|
||||
|
||||
/obj/item/weapon/twohanded/chainsaw
|
||||
icon_override = 'icons/mob/in-hand/swords.dmi'
|
||||
icon_state = "chainsaw0"
|
||||
name = "Chainsaw"
|
||||
desc = "Perfect for felling trees or fellow spaceman."
|
||||
force = 15
|
||||
throwforce = 15
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 4.0 // can't fit in backpacks
|
||||
force_unwielded = 15 //still pretty robust
|
||||
force_wielded = 50 //you'll gouge their eye out! Or a limb...maybe even their entire body!
|
||||
wieldsound = 'sound/weapons/chainsawstart.ogg'
|
||||
hitsound = null
|
||||
flags = NOSHIELD
|
||||
origin_tech = "materials=6;syndicate=4"
|
||||
attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered")
|
||||
sharp = 1
|
||||
edge = 1
|
||||
no_embed = 1
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/chainsaw/update_icon()
|
||||
if(wielded)
|
||||
icon_state = "chainsaw[wielded]"
|
||||
else
|
||||
icon_state = "chainsaw0"
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/chainsaw/attack(mob/target as mob, mob/living/user as mob)
|
||||
if(wielded)
|
||||
playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1) //incredibly loud; you ain't goin' for stealth with this thing. Credit to Lonemonk of Freesound for this sound.
|
||||
if(isrobot(target))
|
||||
..()
|
||||
return
|
||||
if(!isliving(target))
|
||||
return
|
||||
else
|
||||
target.Weaken(4)
|
||||
..()
|
||||
return
|
||||
else
|
||||
playsound(loc, "swing_hit", 50, 1, -1)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/twohanded/chainsaw/IsShield() //Disarming someone with a chainsaw should be difficult.
|
||||
if(wielded)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
// SINGULOHAMMER
|
||||
|
||||
/obj/item/weapon/twohanded/singularityhammer
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
else
|
||||
M.LAssailant = user
|
||||
|
||||
msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
user << "\red You don't have the dexterity to do this!"
|
||||
|
||||
@@ -1,15 +1,24 @@
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair
|
||||
name = "electric chair"
|
||||
desc = "Looks absolutely SHOCKING!"
|
||||
icon_state = "echair0"
|
||||
var/on = 0
|
||||
var/obj/item/assembly/shock_kit/part = null
|
||||
var/last_time = 1.0
|
||||
var/delay_time = 50
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/New()
|
||||
..()
|
||||
overlays += image('icons/obj/objects.dmi', src, "echair_over", MOB_LAYER + 1, dir)
|
||||
spawn(2)
|
||||
if(isnull(part)) //This e-chair was not custom built
|
||||
part = new(src)
|
||||
var/obj/item/clothing/head/helmet/part1 = new(part)
|
||||
var/obj/item/device/radio/electropack/part2 = new(part)
|
||||
part2.frequency = 1445
|
||||
part2.code = 6
|
||||
part2.master = part
|
||||
part.part1 = part1
|
||||
part.part2 = part2
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
@@ -24,20 +33,17 @@
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/verb/toggle()
|
||||
set name = "Toggle Electric Chair"
|
||||
/obj/structure/stool/bed/chair/e_chair/verb/activate_e_chair()
|
||||
set name = "Activate Electric Chair"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
if(on)
|
||||
on = 0
|
||||
icon_state = "echair0"
|
||||
else
|
||||
on = 1
|
||||
icon_state = "echair1"
|
||||
shock()
|
||||
usr << "<span class='notice'>You switch [on ? "on" : "off"] [src].</span>"
|
||||
if(last_time + delay_time > world.time)
|
||||
usr << "<span class='warning'>\The [src] is not ready yet!</span>"
|
||||
return
|
||||
usr << "<span class='notice'>You activate \the [src].</span>"
|
||||
shock()
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/rotate()
|
||||
@@ -47,34 +53,36 @@
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/proc/shock()
|
||||
if(!on)
|
||||
return
|
||||
if(last_time + 50 > world.time)
|
||||
if(last_time + delay_time > world.time)
|
||||
return
|
||||
last_time = world.time
|
||||
|
||||
icon_state = "echair1"
|
||||
spawn(delay_time)
|
||||
icon_state = "echair0"
|
||||
|
||||
// special power handling
|
||||
var/area/A = get_area(src)
|
||||
if(!isarea(A))
|
||||
return
|
||||
if(!A.powered(EQUIP))
|
||||
return
|
||||
A.use_power(EQUIP, 5000)
|
||||
A.use_power(5000, EQUIP)
|
||||
var/light = A.power_light
|
||||
A.updateicon()
|
||||
|
||||
flick("echair1", src)
|
||||
flick("echair_shock", src)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(12, 1, src)
|
||||
s.start()
|
||||
visible_message("<span class='danger'>The electric chair went off!</span>", "<span class='danger'>You hear a deep sharp shock!</span>")
|
||||
if(buckled_mob)
|
||||
buckled_mob.burn_skin(85)
|
||||
buckled_mob.burn_skin(90)
|
||||
buckled_mob << "<span class='danger'>You feel a deep shock course through your body!</span>"
|
||||
sleep(1)
|
||||
buckled_mob.burn_skin(85)
|
||||
buckled_mob.Stun(600)
|
||||
on = 0
|
||||
visible_message("<span class='danger'>The electric chair went off!</span>", "<span class='danger'>You hear a deep sharp shock!</span>")
|
||||
buckled_mob.burn_skin(90)
|
||||
sleep(5)
|
||||
buckled_mob.burn_skin(max(rand(5,20),rand(5,20),rand(5,20)))
|
||||
|
||||
A.power_light = light
|
||||
A.updateicon()
|
||||
|
||||
@@ -136,12 +136,12 @@
|
||||
if(propelled || (pulling && (pulling.a_intent == "harm")))
|
||||
var/mob/living/occupant = buckled_mob
|
||||
unbuckle()
|
||||
|
||||
|
||||
if (pulling && (pulling.a_intent == "hurt"))
|
||||
occupant.throw_at(A, 3, 3, pulling)
|
||||
else if (propelled)
|
||||
occupant.throw_at(A, 3, propelled)
|
||||
|
||||
|
||||
occupant.apply_effect(6, STUN, 0)
|
||||
occupant.apply_effect(6, WEAKEN, 0)
|
||||
occupant.apply_effect(6, STUTTER, 0)
|
||||
@@ -157,7 +157,7 @@
|
||||
|
||||
pulling.attack_log += "\[[time_stamp()]\]<font color='red'> Crashed [occupant.name]'s ([occupant.ckey]) [name] into \a [A]</font>"
|
||||
occupant.attack_log += "\[[time_stamp()]\]<font color='orange'> Thrusted into \a [A] by [pulling.name] ([pulling.ckey]) with \the [name]</font>"
|
||||
msg_admin_attack("[pulling.name] ([pulling.ckey]) has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[pulling.x];Y=[pulling.y];Z=[pulling.z]'>JMP</a>)")
|
||||
msg_admin_attack("[pulling.name] ([pulling.ckey])[isAntag(pulling) ? "(ANTAG)" : ""] has thrusted [occupant.name]'s ([occupant.ckey]) [name] into \a [A] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[pulling.x];Y=[pulling.y];Z=[pulling.z]'>JMP</a>)")
|
||||
else
|
||||
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
|
||||
|
||||
|
||||
@@ -237,6 +237,22 @@
|
||||
icon_state = "wood_tabledir2"
|
||||
if(6)
|
||||
icon_state = "wood_tabledir3"
|
||||
else if(istype(src,/obj/structure/table/glass))
|
||||
switch(table_type)
|
||||
if(0)
|
||||
icon_state = "glass_table"
|
||||
if(1)
|
||||
icon_state = "glass_table_1tileendtable"
|
||||
if(2)
|
||||
icon_state = "glass_table_1tilethick"
|
||||
if(3)
|
||||
icon_state = "glass_table_dir"
|
||||
if(4)
|
||||
icon_state = "glass_table_middle"
|
||||
if(5)
|
||||
icon_state = "glass_tabledir2"
|
||||
if(6)
|
||||
icon_state = "glass_tabledir3"
|
||||
else
|
||||
switch(table_type)
|
||||
if(0)
|
||||
@@ -668,6 +684,113 @@
|
||||
|
||||
return 1
|
||||
|
||||
/obj/structure/glasstable_frame
|
||||
name = "glass table frame"
|
||||
desc = "A metal frame for a glass table."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "glass_table_frame"
|
||||
density = 1
|
||||
|
||||
/obj/structure/glasstable_frame/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if(istype(I, /obj/item/stack/sheet/glass))
|
||||
var/obj/item/stack/sheet/glass/G = I
|
||||
if(G.amount >= 2)
|
||||
user << "<span class='notice'>You start to add the glass to \the [src].</span>"
|
||||
if(do_after(user, 10))
|
||||
G.use(2)
|
||||
user << "<span class='notice'>You add the glass to \the [src].</span>"
|
||||
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
new /obj/structure/table/glass(loc)
|
||||
del(src)
|
||||
else
|
||||
user << "<span class='notice'>You don't have enough glass! You need at least 2 sheets.</span>"
|
||||
return
|
||||
|
||||
if(iswrench(I))
|
||||
user << "<span class='notice'>You start to deconstruct \the [src].</span>"
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
|
||||
if(do_after(user, 10))
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
|
||||
user << "<span class='notice'>You dismantle \the [src].</span>"
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
del(src)
|
||||
|
||||
/obj/structure/table/glass
|
||||
name = "glass table"
|
||||
desc = "Looks fragile. You should totally flip it. It is begging for it."
|
||||
icon_state = "glass_table"
|
||||
parts = /obj/item/weapon/table_parts/glass
|
||||
health = 10
|
||||
|
||||
/obj/structure/table/glass/flip(var/direction)
|
||||
src.collapse()
|
||||
|
||||
/obj/structure/table/glass/proc/collapse() //glass table collapse is called twice in this code, more efficent to just have a proc
|
||||
src.visible_message("<span class='warning'>\The [src] shatters, and the frame collapses!</span>", "<span class='warning'>You hear metal collapsing and glass shattering.</span>")
|
||||
new /obj/item/weapon/table_parts/glass(loc)
|
||||
getFromPool(/obj/item/weapon/shard, loc)
|
||||
if(prob(50)) //50% chance to spawn two shards
|
||||
getFromPool(/obj/item/weapon/shard, loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/table/glass/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
|
||||
if (istype(I, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = I
|
||||
if(G.affecting.buckled)
|
||||
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
|
||||
return
|
||||
if(G.state < GRAB_AGGRESSIVE)
|
||||
user << "<span class='notice'>You need a better grip to do that!</span>"
|
||||
return
|
||||
if(!G.confirm())
|
||||
return
|
||||
G.affecting.loc = src.loc
|
||||
G.affecting.Weaken(7)
|
||||
visible_message("<span class='warning'>[G.assailant] smashes [G.affecting] onto \the [src]!</span>")
|
||||
del(I)
|
||||
src.collapse()
|
||||
return
|
||||
|
||||
if (istype(I, /obj/item/weapon/wrench))
|
||||
user << "\blue Now disassembling the glass table"
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
sleep(50)
|
||||
new /obj/item/weapon/table_parts/glass( src.loc )
|
||||
new /obj/item/stack/sheet/glass( src.loc )
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
del(src)
|
||||
return
|
||||
|
||||
if(isrobot(user))
|
||||
return
|
||||
if(istype(I, /obj/item/weapon/melee/energy/blade))
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
for(var/mob/O in viewers(user, 4))
|
||||
O.show_message("<span class='notice'>\The [src] was sliced apart by [user]!</span>", 1, "<span class='warning'>You hear glass being sliced apart.</span>", 2)
|
||||
new /obj/item/weapon/table_parts/glass( src.loc )
|
||||
new /obj/item/stack/sheet/glass( src.loc )
|
||||
del(src)
|
||||
return
|
||||
|
||||
if(!(I.flags & ABSTRACT))
|
||||
if(user.drop_item())
|
||||
I.Move(loc)
|
||||
var/list/click_params = params2list(params)
|
||||
//Center the icon where the user clicked.
|
||||
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
|
||||
return
|
||||
//Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
|
||||
I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
||||
I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/*
|
||||
* Reinforced tables
|
||||
|
||||
@@ -135,7 +135,7 @@ var/global/wcColored
|
||||
var/pdiff=performWallPressureCheck(src.loc)
|
||||
if(pdiff>0)
|
||||
if(M)
|
||||
msg_admin_attack("Window with pdiff [pdiff] at [formatJumpTo(loc)] deanchored by [M.real_name] ([formatPlayerPanel(M,M.ckey)])!")
|
||||
msg_admin_attack("Window with pdiff [pdiff] at [formatJumpTo(loc)] deanchored by [M.real_name][isAntag(M) ? "(ANTAG)" : ""] ([formatPlayerPanel(M,M.ckey)])!")
|
||||
log_admin("Window with pdiff [pdiff] at [loc] deanchored by [M.real_name] ([M.ckey])!")
|
||||
else
|
||||
msg_admin_attack("Window with pdiff [pdiff] at [formatJumpTo(loc)] deanchored by [AM]!")
|
||||
@@ -144,7 +144,7 @@ var/global/wcColored
|
||||
var/pdiff=performWallPressureCheck(src.loc)
|
||||
if(pdiff>0)
|
||||
if(M)
|
||||
msg_admin_attack("Window with pdiff [pdiff] at [formatJumpTo(loc)] destroyed by [M.real_name] ([formatPlayerPanel(M,M.ckey)])!")
|
||||
msg_admin_attack("Window with pdiff [pdiff] at [formatJumpTo(loc)] destroyed by [M.real_name][isAntag(M) ? "(ANTAG)" : ""] ([formatPlayerPanel(M,M.ckey)])!")
|
||||
log_admin("Window with pdiff [pdiff] at [loc] destroyed by [M.real_name] ([M.ckey])!")
|
||||
else
|
||||
msg_admin_attack("Window with pdiff [pdiff] at [formatJumpTo(loc)] destroyed by [AM]!")
|
||||
@@ -158,7 +158,7 @@ var/global/wcColored
|
||||
user.visible_message("<span class='danger'>[user] smashes through [src]!</span>")
|
||||
var/pdiff=performWallPressureCheck(src.loc)
|
||||
if(pdiff>0)
|
||||
msg_admin_attack("Window destroyed by hulk [user.real_name] ([formatPlayerPanel(user,user.ckey)]) with pdiff [pdiff] at [formatJumpTo(loc)]!")
|
||||
msg_admin_attack("Window destroyed by hulk [user.real_name][isAntag(user) ? "(ANTAG)" : ""] ([formatPlayerPanel(user,user.ckey)]) with pdiff [pdiff] at [formatJumpTo(loc)]!")
|
||||
log_admin("Window destroyed by hulk [user.real_name] ([user.ckey]) with pdiff [pdiff] at [loc]!")
|
||||
destroy()
|
||||
else if (usr.a_intent == "harm")
|
||||
@@ -187,7 +187,7 @@ var/global/wcColored
|
||||
user.visible_message("<span class='danger'>[user] smashes through [src]!</span>")
|
||||
var/pdiff=performWallPressureCheck(src.loc)
|
||||
if(pdiff>0)
|
||||
msg_admin_attack("Window destroyed by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) with pdiff [pdiff] at [formatJumpTo(loc)]!")
|
||||
msg_admin_attack("Window destroyed by [user.real_name][isAntag(user) ? "(ANTAG)" : ""] ([formatPlayerPanel(user,user.ckey)]) with pdiff [pdiff] at [formatJumpTo(loc)]!")
|
||||
destroy()
|
||||
else //for nicer text~
|
||||
user.visible_message("<span class='danger'>[user] smashes into [src]!</span>")
|
||||
@@ -258,7 +258,7 @@ var/global/wcColored
|
||||
if(!anchored)
|
||||
var/pdiff=performWallPressureCheck(src.loc)
|
||||
if(pdiff>0)
|
||||
msg_admin_attack("Window with pdiff [pdiff] deanchored by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!")
|
||||
msg_admin_attack("Window with pdiff [pdiff] deanchored by [user.real_name][isAntag(user) ? "(ANTAG)" : ""] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!")
|
||||
log_admin("Window with pdiff [pdiff] deanchored by [user.real_name] ([user.ckey]) at [loc]!")
|
||||
else if(!reinf)
|
||||
anchored = !anchored
|
||||
@@ -268,7 +268,7 @@ var/global/wcColored
|
||||
if(!anchored)
|
||||
var/pdiff=performWallPressureCheck(src.loc)
|
||||
if(pdiff>0)
|
||||
msg_admin_attack("Window with pdiff [pdiff] deanchored by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!")
|
||||
msg_admin_attack("Window with pdiff [pdiff] deanchored by [user.real_name][isAntag(user) ? "(ANTAG)" : ""] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!")
|
||||
log_admin("Window with pdiff [pdiff] deanchored by [user.real_name] ([user.ckey]) at [loc]!")
|
||||
else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
|
||||
state = 1 - state
|
||||
@@ -310,7 +310,7 @@ var/global/wcColored
|
||||
step(src, get_dir(user, src))
|
||||
var/pdiff=performWallPressureCheck(src.loc)
|
||||
if(pdiff>0)
|
||||
msg_admin_attack("Window with pdiff [pdiff] deanchored by [user.real_name] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!")
|
||||
msg_admin_attack("Window with pdiff [pdiff] deanchored by [user.real_name][isAntag(user) ? "(ANTAG)" : ""] ([formatPlayerPanel(user,user.ckey)]) at [formatJumpTo(loc)]!")
|
||||
log_admin("Window with pdiff [pdiff] deanchored by [user.real_name] ([user.ckey]) at [loc]!")
|
||||
else
|
||||
playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
|
||||
Reference in New Issue
Block a user