mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 15:45:25 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
anchored = TRUE
|
||||
layer = TURF_DECAL_LAYER
|
||||
icon = 'icons/turf/snow.dmi'
|
||||
icon_state = "snow"
|
||||
|
||||
/obj/effect/decal/snow/clean/edge
|
||||
icon_state = "snow_corner"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
burn_state = LAVA_PROOF | FIRE_PROOF
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
anchored = 1
|
||||
can_be_hit = FALSE
|
||||
|
||||
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
|
||||
@@ -7,6 +7,12 @@
|
||||
opacity = 0
|
||||
density = 1
|
||||
unacidable = 1
|
||||
var/lifetime = 30 SECONDS
|
||||
|
||||
/obj/effect/forcefield/New()
|
||||
..()
|
||||
if(lifetime)
|
||||
QDEL_IN(src, lifetime)
|
||||
|
||||
/obj/effect/forcefield/CanAtmosPass(turf/T)
|
||||
return !density
|
||||
@@ -29,12 +35,6 @@
|
||||
icon_state = "empty"
|
||||
name = "invisible wall"
|
||||
desc = "You have a bad feeling about this."
|
||||
var/lifetime = 30 SECONDS
|
||||
|
||||
/obj/effect/forcefield/mime/New()
|
||||
..()
|
||||
if(lifetime)
|
||||
QDEL_IN(src, lifetime)
|
||||
|
||||
/obj/effect/forcefield/mime/advanced
|
||||
name = "invisible blockade"
|
||||
|
||||
@@ -88,6 +88,10 @@
|
||||
emergencyresponseteamspawn += loc
|
||||
qdel(src)
|
||||
|
||||
if("Syndicate Officer")
|
||||
syndicateofficer += loc
|
||||
qdel(src)
|
||||
|
||||
GLOB.landmarks_list += src
|
||||
return 1
|
||||
|
||||
|
||||
@@ -53,6 +53,15 @@
|
||||
if(isliving(victim))
|
||||
victim.Weaken(stun_time)
|
||||
|
||||
/obj/effect/mine/depot
|
||||
name = "sentry mine"
|
||||
|
||||
/obj/effect/mine/depot/mineEffect(mob/living/victim)
|
||||
var/area/syndicate_depot/core/depotarea = areaMaster
|
||||
if(istype(depotarea))
|
||||
if(depotarea.mine_triggered(victim))
|
||||
explosion(loc, 1, 0, 0, 1) // devastate the tile you are on, but leave everything else untouched
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
name = "Radiation Mine"
|
||||
var/radiation_amount
|
||||
|
||||
@@ -66,4 +66,5 @@
|
||||
desc = "A portal capable of bypassing bluespace interference."
|
||||
icon_state = "portal1"
|
||||
failchance = 0
|
||||
precision = 0
|
||||
ignore_tele_proof_area_setting = TRUE
|
||||
@@ -0,0 +1,140 @@
|
||||
/obj/effect/snowcloud
|
||||
name = "snow cloud"
|
||||
desc = "Let it snow, let it snow, let it snow!"
|
||||
icon_state = "snowcloud"
|
||||
layer = FLY_LAYER
|
||||
anchored = TRUE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/obj/machinery/snow_machine/parent_machine
|
||||
|
||||
/obj/effect/snowcloud/New(turf, obj/machinery/snow_machine/SM)
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
if(SM && istype(SM))
|
||||
parent_machine = SM
|
||||
|
||||
/obj/effect/snowcloud/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/snowcloud/process()
|
||||
if(QDELETED(parent_machine))
|
||||
parent_machine = null
|
||||
var/turf/T = get_turf(src)
|
||||
if(isspaceturf(T))
|
||||
qdel(src)
|
||||
return
|
||||
var/turf_hotness
|
||||
if(issimulatedturf(T))
|
||||
var/turf/simulated/S = T
|
||||
turf_hotness = S.air.temperature
|
||||
if(turf_hotness > T0C && prob(10 * (turf_hotness - T0C))) //Cloud disappears if it's too warm
|
||||
qdel(src)
|
||||
return
|
||||
if(!parent_machine || !parent_machine.active || parent_machine.stat & NOPOWER) //All reasons a cloud could dissipate
|
||||
if(prob(10))
|
||||
qdel(src)
|
||||
return
|
||||
try_to_snow()
|
||||
try_to_spread_cloud()
|
||||
parent_machine.affect_turf_temperature(T, 0.25 * parent_machine.cooling_speed)
|
||||
|
||||
/obj/effect/snowcloud/proc/try_to_snow()
|
||||
var/turf/T = get_turf(src)
|
||||
if(locate(/obj/effect/snow, T))
|
||||
return
|
||||
if(issimulatedturf(T))
|
||||
var/turf/simulated/S = T
|
||||
if(prob(75 + S.air.temperature - T0C)) //Colder turf = more chance of snow
|
||||
return
|
||||
new /obj/effect/snow(T)
|
||||
|
||||
/obj/effect/snowcloud/proc/try_to_spread_cloud()
|
||||
if(prob(95 - parent_machine.cooling_speed * 5)) //10 / 15 / 20 / 25% chance to spawn a new cloud
|
||||
return
|
||||
var/list/random_dirs = shuffle(cardinal)
|
||||
for(var/potential in random_dirs)
|
||||
var/turf/T = get_turf(get_step(src, potential))
|
||||
if(isspaceturf(T) || T.density)
|
||||
continue
|
||||
if(!T.CanAtmosPass(T))
|
||||
continue
|
||||
if(parent_machine.make_snowcloud(T))
|
||||
return
|
||||
|
||||
|
||||
//Snow stuff below
|
||||
|
||||
/obj/effect/snow
|
||||
desc = "Perfect for making snow angels, or throwing at other people!"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "snow"
|
||||
layer = ABOVE_ICYOVERLAY_LAYER
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/snow/New()
|
||||
processing_objects.Add(src)
|
||||
icon_state = "snow[rand(1,6)]"
|
||||
..()
|
||||
|
||||
/obj/effect/snow/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/snow/process()
|
||||
var/turf/T = get_turf(src)
|
||||
if(isspaceturf(T))
|
||||
qdel(src)
|
||||
return
|
||||
else if(issimulatedturf(T))
|
||||
var/turf/simulated/S = T
|
||||
if(S.air.temperature <= T0C)
|
||||
return
|
||||
if(prob(10 + S.air.temperature - T0C))
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/snow/attack_hand(mob/living/carbon/human/user)
|
||||
if(!istype(user)) //Nonhumans don't have the balls to fight in the snow
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
var/obj/item/snowball/SB = new(get_turf(user))
|
||||
user.put_in_hands(SB)
|
||||
to_chat(user, "<span class='notice'>You scoop up some snow and make \a [SB]!</span>")
|
||||
|
||||
/obj/effect/snow/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/shovel))
|
||||
var/obj/item/shovel/S = I
|
||||
user.visible_message("<span class='notice'>[user] is clearing away [src]...</span>", "<span class='notice'>You begin clearing away [src]...</span>", "<span class='warning'>You hear a wettish digging sound.</span>")
|
||||
playsound(loc, S.usesound, 50, TRUE)
|
||||
if(!do_after(user, 50 * S.toolspeed, target = src))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] clears away [src]!</span>", "<span class='notice'>You clear away [src]!</span>")
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/effect/snow/fire_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/snow/ex_act(severity)
|
||||
if(severity == 3 && prob(50))
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
/obj/item/snowball
|
||||
name = "snowball"
|
||||
desc = "Get ready for a snowball fight!"
|
||||
force = 0
|
||||
throwforce = 10
|
||||
icon_state = "snowball"
|
||||
damtype = STAMINA
|
||||
|
||||
/obj/item/snowball/throw_impact(atom/target)
|
||||
..()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/snowball/fire_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/snowball/ex_act(severity)
|
||||
qdel(src)
|
||||
@@ -98,6 +98,7 @@
|
||||
/obj/item/poster/random_contraband = 10,
|
||||
/obj/item/crowbar = 10,
|
||||
/obj/item/crowbar/red = 10,
|
||||
/obj/item/restraints/handcuffs/toy = 5,
|
||||
/obj/item/extinguisher = 90,
|
||||
//obj/item/gun/projectile/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
|
||||
/obj/item/hand_labeler = 10,
|
||||
@@ -152,7 +153,8 @@
|
||||
/obj/item/toy/cards/deck/syndicate = 2,
|
||||
/obj/item/storage/secure/briefcase/syndie = 2,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 2,
|
||||
"" = 70
|
||||
/obj/item/storage/pill_bottle/fakedeath = 2,
|
||||
"" = 68
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/crate_spawner // for ruins
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/pizzabomb
|
||||
name = "50pc trap pizza"
|
||||
result = list(/obj/item/pizzabox/meat = 1,
|
||||
/obj/item/pizzabox/hawaiian = 1,
|
||||
/obj/item/pizza_bomb/autoarm = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/medbot
|
||||
@@ -169,7 +170,7 @@
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/mine
|
||||
name = "50pc trap landmine"
|
||||
result = list(/datum/nothing = 1,
|
||||
/obj/effect/mine/explosive = 1)
|
||||
/obj/effect/mine/depot = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/documents
|
||||
name = "66pc trapped documents"
|
||||
@@ -188,7 +189,6 @@
|
||||
// Loot schema: costumes, toys, useless gimmick items, trapped items
|
||||
result = list(/datum/nothing = 13,
|
||||
/obj/item/storage/toolbox/syndicate = 1,
|
||||
/obj/item/storage/toolbox/syndicate/trapped = 1,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 1,
|
||||
/obj/item/toy/cards/deck/syndicate = 1,
|
||||
/obj/item/storage/secure/briefcase/syndie = 1,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//TODO: Flash range does nothing currently
|
||||
|
||||
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null)
|
||||
/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null, breach = TRUE)
|
||||
src = null //so we don't abort once src is deleted
|
||||
epicenter = get_turf(epicenter)
|
||||
|
||||
@@ -132,7 +132,10 @@
|
||||
if(AM && AM.simulated)
|
||||
AM.ex_act(dist)
|
||||
CHECK_TICK
|
||||
T.ex_act(dist)
|
||||
if(breach)
|
||||
T.ex_act(dist)
|
||||
else
|
||||
T.ex_act(3)
|
||||
|
||||
CHECK_TICK
|
||||
//--- THROW ITEMS AROUND ---
|
||||
|
||||
@@ -35,6 +35,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
var/list/actions = list() //list of /datum/action's that this item has.
|
||||
var/list/actions_types = list() //list of paths of action datums to give to the item on New().
|
||||
var/list/action_icon = list() //list of icons-sheets for a given action to override the icon.
|
||||
var/list/action_icon_state = list() //list of icon states for a given action to override the icon_state.
|
||||
|
||||
var/list/materials = list()
|
||||
//Since any item can now be a piece of clothing, this has to be put here so all items share it.
|
||||
@@ -100,7 +102,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
/obj/item/New()
|
||||
..()
|
||||
for(var/path in actions_types)
|
||||
new path(src)
|
||||
new path(src, action_icon[path], action_icon_state[path])
|
||||
|
||||
if(!hitsound)
|
||||
if(damtype == "fire")
|
||||
@@ -206,6 +208,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
msg += "*--------*"
|
||||
to_chat(user, msg)
|
||||
|
||||
/obj/item/afterattack(atom/target, mob/user, proximity, params)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity, params)
|
||||
..()
|
||||
|
||||
/obj/item/attack_hand(mob/user as mob, pickupfireoverride = FALSE)
|
||||
if(!user) return 0
|
||||
@@ -252,6 +257,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
return 0
|
||||
|
||||
pickup(user)
|
||||
|
||||
add_fingerprint(user)
|
||||
user.put_in_active_hand(src)
|
||||
return 1
|
||||
@@ -306,6 +312,25 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
else if(S.can_be_inserted(src))
|
||||
S.handle_item_insertion(src)
|
||||
else if(istype(I, /obj/item/stack/tape_roll))
|
||||
if(istype(src, /obj/item/storage)) //Don't tape the bag if we can put the duct tape inside it instead
|
||||
var/obj/item/storage/bag = src
|
||||
if(bag.can_be_inserted(I))
|
||||
return ..()
|
||||
var/obj/item/stack/tape_roll/TR = I
|
||||
var/list/clickparams = params2list(params)
|
||||
var/x_offset = text2num(clickparams["icon-x"])
|
||||
var/y_offset = text2num(clickparams["icon-y"])
|
||||
if(GetComponent(/datum/component/ducttape))
|
||||
to_chat(user, "<span class='notice'>[src] already has some tape attached!</span>")
|
||||
return
|
||||
if(TR.use(1))
|
||||
to_chat(user, "<span class='notice'>You apply some tape to [src].</span>")
|
||||
AddComponent(/datum/component/ducttape, src, user, x_offset, y_offset)
|
||||
anchored = TRUE
|
||||
user.transfer_fingerprints_to(src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You don't have enough tape to do that!</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -329,7 +354,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
// called just as an item is picked up (loc is not yet changed)
|
||||
/obj/item/proc/pickup(mob/user)
|
||||
return
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user)
|
||||
|
||||
// called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called.
|
||||
/obj/item/proc/on_exit_storage(obj/item/storage/S as obj)
|
||||
@@ -507,10 +532,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
itempush = 0 // too light to push anything
|
||||
return A.hitby(src, 0, itempush)
|
||||
|
||||
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
|
||||
/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force)
|
||||
thrownby = thrower
|
||||
callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own
|
||||
. = ..(target, range, speed, thrower, spin, diagonals_first, callback)
|
||||
. = ..(target, range, speed, thrower, spin, diagonals_first, callback, force)
|
||||
|
||||
/obj/item/proc/after_throw(datum/callback/callback)
|
||||
if(callback) //call the original callback
|
||||
@@ -569,4 +594,4 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
target.visible_message("<span class='danger'>[target.name] blocks [src] and twists [user]'s arm behind [user.p_their()] back!</span>",
|
||||
"<span class='userdanger'>You block the attack!</span>")
|
||||
user.Stun(2)
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
|
||||
/obj/item/flash/armimplant
|
||||
name = "photon projector"
|
||||
desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocals fix the flashbulb if it ever burns out."
|
||||
desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out."
|
||||
var/flashcd = 20
|
||||
var/overheat = 0
|
||||
var/obj/item/organ/internal/cyberimp/arm/flash/I = null
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
actions_types = list(/datum/action/item_action/toggle_light)
|
||||
var/on = FALSE
|
||||
var/brightness_on = 4 //luminosity when on
|
||||
var/togglesound = 'sound/weapons/empty.ogg'
|
||||
|
||||
/obj/item/flashlight/Initialize()
|
||||
. = ..()
|
||||
@@ -35,7 +36,7 @@
|
||||
|
||||
return 0
|
||||
on = !on
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
|
||||
playsound(user, togglesound, 100, 1)
|
||||
update_brightness(user)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
@@ -153,22 +154,24 @@ obj/item/flashlight/lamp/bananalamp
|
||||
/obj/item/flashlight/flare
|
||||
name = "flare"
|
||||
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
brightness_on = 8 // Made it brighter (from 7 to 8).
|
||||
light_color = "#ff0000" // changed colour to a more brighter red.
|
||||
brightness_on = 8
|
||||
light_color = "#ff0000"
|
||||
icon_state = "flare"
|
||||
item_state = "flare"
|
||||
togglesound = 'sound/goonstation/misc/matchstick_light.ogg'
|
||||
var/fuel = 0
|
||||
var/on_damage = 7
|
||||
var/produce_heat = 1500
|
||||
var/fuel_lower = 800
|
||||
var/fuel_upp = 1000
|
||||
|
||||
/obj/item/flashlight/flare/New()
|
||||
fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds.
|
||||
fuel = rand(fuel_lower, fuel_upp)
|
||||
..()
|
||||
|
||||
/obj/item/flashlight/flare/process()
|
||||
var/turf/pos = get_turf(src)
|
||||
if(pos)
|
||||
if(pos && produce_heat)
|
||||
pos.hotspot_expose(produce_heat, 5)
|
||||
fuel = max(fuel - 1, 0)
|
||||
if(!fuel || !on)
|
||||
@@ -177,6 +180,10 @@ obj/item/flashlight/lamp/bananalamp
|
||||
src.icon_state = "[initial(icon_state)]-empty"
|
||||
processing_objects -= src
|
||||
|
||||
/obj/item/flashlight/flare/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/item/flashlight/flare/proc/turn_off()
|
||||
on = 0
|
||||
src.force = initial(src.force)
|
||||
@@ -207,11 +214,84 @@ obj/item/flashlight/lamp/bananalamp
|
||||
. = ..()
|
||||
// All good, turn it on.
|
||||
if(.)
|
||||
user.visible_message("<span class='notice'>[user] activates the flare.</span>", "<span class='notice'>You pull the cord on the flare, activating it!</span>")
|
||||
user.visible_message("<span class='notice'>[user] activates [src].</span>", "<span class='notice'>You activate [src].</span>")
|
||||
src.force = on_damage
|
||||
src.damtype = "fire"
|
||||
processing_objects += src
|
||||
|
||||
// GLOWSTICKS
|
||||
|
||||
/obj/item/flashlight/flare/glowstick
|
||||
name = "green glowstick"
|
||||
desc = "A military-grade glowstick."
|
||||
brightness_on = 4
|
||||
color = LIGHT_COLOR_GREEN
|
||||
icon_state = "glowstick"
|
||||
item_state = "glowstick"
|
||||
togglesound = 'sound/effects/bone_break_1.ogg'
|
||||
produce_heat = 0
|
||||
fuel_lower = 1600
|
||||
fuel_upp = 2000
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/Initialize()
|
||||
light_color = color
|
||||
..()
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/update_icon()
|
||||
item_state = "glowstick"
|
||||
cut_overlays()
|
||||
if(!fuel)
|
||||
icon_state = "glowstick-empty"
|
||||
cut_overlays()
|
||||
update_brightness(0)
|
||||
else if(on)
|
||||
var/mutable_appearance/glowstick_overlay = mutable_appearance(icon, "glowstick-glow")
|
||||
glowstick_overlay.color = color
|
||||
add_overlay(glowstick_overlay)
|
||||
item_state = "glowstick-on"
|
||||
update_brightness(brightness_on)
|
||||
else
|
||||
icon_state = "glowstick"
|
||||
cut_overlays()
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/red
|
||||
name = "red glowstick"
|
||||
color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/blue
|
||||
name = "blue glowstick"
|
||||
color = LIGHT_COLOR_BLUE
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/orange
|
||||
name = "orange glowstick"
|
||||
color = LIGHT_COLOR_ORANGE
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/yellow
|
||||
name = "yellow glowstick"
|
||||
color = LIGHT_COLOR_YELLOW
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/pink
|
||||
name = "pink glowstick"
|
||||
color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/emergency
|
||||
name = "emergency glowstick"
|
||||
desc = "A cheap looking, mass produced glowstick. You can practically feel it was made on a tight budget."
|
||||
color = LIGHT_COLOR_BLUE
|
||||
fuel_lower = 30
|
||||
fuel_upp = 90
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/random
|
||||
name = "random colored glowstick"
|
||||
icon_state = "random_glowstick"
|
||||
color = null
|
||||
|
||||
/obj/item/flashlight/flare/glowstick/random/Initialize()
|
||||
..()
|
||||
var/T = pick(typesof(/obj/item/flashlight/flare/glowstick) - /obj/item/flashlight/flare/glowstick/random - /obj/item/flashlight/flare/glowstick/emergency)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/flashlight/flare/torch
|
||||
name = "torch"
|
||||
desc = "A torch fashioned from some leaves and a log."
|
||||
@@ -301,101 +381,4 @@ obj/item/flashlight/lamp/bananalamp
|
||||
anchored = TRUE
|
||||
var/range = null
|
||||
unacidable = TRUE
|
||||
burn_state = LAVA_PROOF
|
||||
|
||||
/obj/item/flashlight/glowstick
|
||||
name = "green glowstick"
|
||||
desc = "A military-grade glowstick."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
brightness_on = 4
|
||||
color = LIGHT_COLOR_GREEN
|
||||
icon_state = "glowstick"
|
||||
item_state = "glowstick"
|
||||
var/fuel = 0
|
||||
|
||||
/obj/item/flashlight/glowstick/Initialize()
|
||||
fuel = rand(1600, 2000)
|
||||
light_color = color
|
||||
. = ..()
|
||||
|
||||
/obj/item/flashlight/glowstick/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/flashlight/glowstick/process()
|
||||
fuel = max(fuel - 1, 0)
|
||||
if(!fuel)
|
||||
turn_off()
|
||||
processing_objects.Remove(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/flashlight/glowstick/proc/turn_off()
|
||||
on = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/item/flashlight/glowstick/update_icon()
|
||||
item_state = "glowstick"
|
||||
cut_overlays()
|
||||
if(!fuel)
|
||||
icon_state = "glowstick-empty"
|
||||
cut_overlays()
|
||||
update_brightness(0)
|
||||
else if(on)
|
||||
var/mutable_appearance/glowstick_overlay = mutable_appearance(icon, "glowstick-glow")
|
||||
glowstick_overlay.color = color
|
||||
add_overlay(glowstick_overlay)
|
||||
item_state = "glowstick-on"
|
||||
update_brightness(brightness_on)
|
||||
else
|
||||
icon_state = "glowstick"
|
||||
cut_overlays()
|
||||
|
||||
/obj/item/flashlight/glowstick/attack_self(mob/user)
|
||||
if(!fuel)
|
||||
to_chat(user, "<span class='notice'>[src] is spent.</span>")
|
||||
return
|
||||
if(on)
|
||||
to_chat(user, "<span class='notice'>[src] is already lit.</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
if(.)
|
||||
user.visible_message("<span class='notice'>[user] cracks and shakes [src].</span>", "<span class='notice'>You crack and shake [src], turning it on!</span>")
|
||||
activate()
|
||||
|
||||
/obj/item/flashlight/glowstick/proc/activate()
|
||||
if(!on)
|
||||
on = TRUE
|
||||
processing_objects.Add(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/flashlight/glowstick/red
|
||||
name = "red glowstick"
|
||||
color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/item/flashlight/glowstick/blue
|
||||
name = "blue glowstick"
|
||||
color = LIGHT_COLOR_BLUE
|
||||
|
||||
/obj/item/flashlight/glowstick/orange
|
||||
name = "orange glowstick"
|
||||
color = LIGHT_COLOR_ORANGE
|
||||
|
||||
/obj/item/flashlight/glowstick/yellow
|
||||
name = "yellow glowstick"
|
||||
color = LIGHT_COLOR_YELLOW
|
||||
|
||||
/obj/item/flashlight/glowstick/pink
|
||||
name = "pink glowstick"
|
||||
color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/item/flashlight/glowstick/random
|
||||
name = "random colored glowstick"
|
||||
icon_state = "random_glowstick"
|
||||
color = null
|
||||
|
||||
/obj/item/flashlight/glowstick/random/Initialize()
|
||||
..()
|
||||
var/T = pick(typesof(/obj/item/flashlight/glowstick) - /obj/item/flashlight/glowstick/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
burn_state = LAVA_PROOF
|
||||
@@ -102,4 +102,4 @@
|
||||
|
||||
/obj/item/pizza_bomb/autoarm
|
||||
timer_set = 1
|
||||
timer = 10
|
||||
timer = 30 // 3 seconds
|
||||
@@ -8,6 +8,7 @@
|
||||
var/emagged = 0
|
||||
var/syndicate = 0
|
||||
var/area_bypass = FALSE
|
||||
var/cc_beacon = FALSE //set if allowed to teleport to even if on zlevel2
|
||||
|
||||
/obj/item/radio/beacon/New()
|
||||
..()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
/obj/item/encryptionkey/
|
||||
/obj/item/encryptionkey
|
||||
name = "Standard Encryption Key"
|
||||
desc = "An encyption key for a radio headset. Contains cypherkeys."
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
|
||||
@@ -256,9 +256,10 @@ var/global/list/default_medbay_channels = list(
|
||||
break
|
||||
if(jammed)
|
||||
message = Gibberish(message, 100)
|
||||
var/list/message_pieces = message_to_multilingual(message)
|
||||
Broadcast_Message(connection, A,
|
||||
0, "*garbled automated announcement*", src,
|
||||
message, from, "Automated Announcement", from, "synthesized voice",
|
||||
message_pieces, from, "Automated Announcement", from, "synthesized voice",
|
||||
4, 0, zlevel, connection.frequency, follow_target = follow_target)
|
||||
qdel(A)
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ var/list/world_uplinks = list()
|
||||
|
||||
var/job = null
|
||||
var/show_descriptions = 0
|
||||
var/temp_category
|
||||
var/uplink_type = "traitor"
|
||||
|
||||
/obj/item/uplink/nano_host()
|
||||
return loc
|
||||
@@ -233,6 +235,7 @@ var/list/world_uplinks = list()
|
||||
if(!nanoui_items)
|
||||
generate_items(user)
|
||||
data["nano_items"] = nanoui_items
|
||||
data["category_choice"] = temp_category
|
||||
data += nanoui_data
|
||||
|
||||
return data
|
||||
@@ -260,9 +263,6 @@ var/list/world_uplinks = list()
|
||||
hidden_crystals = 0
|
||||
ui.close()
|
||||
return 1
|
||||
if(href_list["return"])
|
||||
nanoui_menu = round(nanoui_menu/10)
|
||||
update_nano_data()
|
||||
if(href_list["menu"])
|
||||
nanoui_menu = text2num(href_list["menu"])
|
||||
update_nano_data(href_list["id"])
|
||||
@@ -272,6 +272,9 @@ var/list/world_uplinks = list()
|
||||
if(href_list["descriptions"])
|
||||
show_descriptions = !show_descriptions
|
||||
update_nano_data()
|
||||
if(href_list["category"])
|
||||
temp_category = href_list["category"]
|
||||
update_nano_data()
|
||||
|
||||
SSnanoui.update_uis(src)
|
||||
return 1
|
||||
@@ -325,6 +328,21 @@ var/list/world_uplinks = list()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.trigger(user)
|
||||
|
||||
/obj/item/radio/uplink/nuclear/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "nuclear"
|
||||
GLOB.nuclear_uplink_list += src
|
||||
|
||||
/obj/item/radio/uplink/nuclear/Destroy()
|
||||
GLOB.nuclear_uplink_list -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/radio/uplink/sst/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "sst"
|
||||
|
||||
/obj/item/multitool/uplink/New()
|
||||
hidden_uplink = new(src)
|
||||
|
||||
@@ -338,4 +356,4 @@ var/list/world_uplinks = list()
|
||||
/obj/item/radio/headset/uplink/New()
|
||||
..()
|
||||
hidden_uplink = new(src)
|
||||
hidden_uplink.uses = 20
|
||||
hidden_uplink.uses = 20
|
||||
@@ -9,8 +9,7 @@
|
||||
var/list/types = list(/obj/item/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize)
|
||||
var/T = pick(types)
|
||||
new T(loc)
|
||||
spawn(1)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
// -------------------------------------
|
||||
// Random cleanables, clearly this makes sense
|
||||
@@ -24,8 +23,7 @@
|
||||
var/list/list = subtypesof(/obj/effect/decal/cleanable) - list(/obj/effect/decal/cleanable/random,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2)
|
||||
var/T = pick(list)
|
||||
new T(loc)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/stack/sheet/animalhide/random
|
||||
@@ -33,11 +31,10 @@
|
||||
|
||||
/obj/item/stack/sheet/animalhide/random/New()
|
||||
..()
|
||||
spawn(1)
|
||||
var/htype = pick(/obj/item/stack/sheet/animalhide/cat,/obj/item/stack/sheet/animalhide/corgi,/obj/item/stack/sheet/animalhide/human,/obj/item/stack/sheet/animalhide/lizard,/obj/item/stack/sheet/animalhide/monkey)
|
||||
var/obj/item/stack/S = new htype(loc)
|
||||
S.amount = amount
|
||||
qdel(src)
|
||||
var/htype = pick(/obj/item/stack/sheet/animalhide/cat,/obj/item/stack/sheet/animalhide/corgi,/obj/item/stack/sheet/animalhide/human,/obj/item/stack/sheet/animalhide/lizard,/obj/item/stack/sheet/animalhide/monkey)
|
||||
var/obj/item/stack/S = new htype(loc)
|
||||
S.amount = amount
|
||||
qdel(src)
|
||||
|
||||
// -------------------------------------
|
||||
// Not yet identified chemical.
|
||||
@@ -121,8 +118,7 @@
|
||||
icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red")
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/random_meds
|
||||
name = "unlabelled pillbottle"
|
||||
@@ -158,16 +154,10 @@
|
||||
|
||||
/obj/structure/closet/crate/secure/unknownchemicals/New()
|
||||
..()
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_chem(src)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_chem(src)
|
||||
for(var/i in 1 to 7)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
for(var/i in 1 to 3)
|
||||
new/obj/item/reagent_containers/glass/bottle/random_chem(src)
|
||||
while(prob(50))
|
||||
new/obj/item/reagent_containers/glass/bottle/random_reagent(src)
|
||||
|
||||
@@ -193,7 +183,7 @@
|
||||
B.name = "unlabelled bottle"
|
||||
B.desc = "Looks like the label fell off."
|
||||
// B.identify_probability = 0
|
||||
|
||||
//
|
||||
/*
|
||||
/obj/structure/closet/crate/bin/flowers
|
||||
name = "flower barrel"
|
||||
@@ -243,11 +233,8 @@
|
||||
|
||||
/obj/structure/closet/secure_closet/random_drinks/New()
|
||||
..()
|
||||
new/obj/item/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
for(var/i in 1 to 5)
|
||||
new/obj/item/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
while(prob(25))
|
||||
new/obj/item/reagent_containers/food/drinks/bottle/random_reagent(src)
|
||||
|
||||
@@ -272,12 +259,12 @@
|
||||
visible_message("<span class='warning'>Something falls out of the [src]!</span>")
|
||||
var/obj/item/grenade/clusterbuster/C = new(src.loc)
|
||||
C.prime()
|
||||
spawn(10)
|
||||
new menace(src.loc)
|
||||
while(prob(15))
|
||||
new menace(get_step_rand(src.loc))
|
||||
..()
|
||||
return 1
|
||||
sleep(10)
|
||||
new menace(src.loc)
|
||||
while(prob(15))
|
||||
new menace(get_step_rand(src.loc))
|
||||
..()
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -296,19 +283,15 @@
|
||||
|
||||
/obj/structure/largecrate/schrodinger/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/crowbar))
|
||||
var/mob/living/simple_animal/pet/cat/Cat1 = new(loc)
|
||||
Cat1.apply_damage(250)//,TOX)
|
||||
Cat1.name = "Schrodinger's Cat"
|
||||
Cat1.desc = "It seems it's been dead for a while."
|
||||
|
||||
var/mob/living/simple_animal/pet/cat/Cat2 = new(loc)
|
||||
Cat2.name = "Schrodinger's Cat"
|
||||
Cat2.desc = "It's was alive the whole time!"
|
||||
sleep(2)
|
||||
var/mob/living/simple_animal/pet/cat/Cat = new(loc)
|
||||
Cat.name = "Schrodinger's Cat"
|
||||
|
||||
if(prob(50))
|
||||
qdel(Cat1)
|
||||
Cat.apply_damage(250,TOX)
|
||||
Cat.desc = "It seems it's been dead for a while."
|
||||
else
|
||||
qdel(Cat2)
|
||||
Cat.desc = "It was alive the whole time!"
|
||||
return ..()
|
||||
|
||||
// --------------------------------------
|
||||
@@ -326,16 +309,6 @@
|
||||
|
||||
/obj/item/storage/box/grenades/New()
|
||||
..()
|
||||
var/nade1 = pick(grenadelist)
|
||||
var/nade2 = pick(grenadelist)
|
||||
var/nade3 = pick(grenadelist)
|
||||
var/nade4 = pick(grenadelist)
|
||||
var/nade5 = pick(grenadelist)
|
||||
var/nade6 = pick(grenadelist)
|
||||
|
||||
new nade1(src)
|
||||
new nade2(src)
|
||||
new nade3(src)
|
||||
new nade4(src)
|
||||
new nade5(src)
|
||||
new nade6(src)
|
||||
for(var/i in 1 to 6)
|
||||
var/nade = pick(grenadelist)
|
||||
new nade(src)
|
||||
@@ -58,6 +58,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
|
||||
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("firelock frame", /obj/structure/firelock_frame, 3, time = 50, 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),
|
||||
new /datum/stack_recipe("reflector frame", /obj/structure/reflector, 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),
|
||||
|
||||
@@ -38,4 +38,7 @@
|
||||
amount = 5
|
||||
|
||||
/obj/item/stack/telecrystal/twenty
|
||||
amount = 20
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/telecrystal/fifty
|
||||
amount = 50
|
||||
|
||||
@@ -1650,3 +1650,13 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
icon_state = "conch"
|
||||
use_action = "pulls the string"
|
||||
possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
|
||||
|
||||
/*
|
||||
*Fake cuffs (honk honk)
|
||||
*/
|
||||
|
||||
/obj/item/restraints/handcuffs/toy
|
||||
desc = "Toy handcuffs. Plastic and extremely cheaply made."
|
||||
throwforce = 0
|
||||
breakouttime = 0
|
||||
ignoresClumsy = TRUE
|
||||
@@ -85,6 +85,7 @@
|
||||
else
|
||||
icon_state = "rcl-0"
|
||||
item_state = "rcl-0"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
|
||||
update_icon()
|
||||
|
||||
@@ -319,6 +319,10 @@
|
||||
name = "agent card"
|
||||
initial_access = list(access_maint_tunnels, access_vox, access_external_airlocks)
|
||||
|
||||
/obj/item/card/id/syndicate/command
|
||||
initial_access = list(access_maint_tunnels, access_syndicate, access_syndicate_leader, access_syndicate_command, access_external_airlocks)
|
||||
icon_state = "commander"
|
||||
|
||||
/obj/item/card/id/syndicate/afterattack(var/obj/item/O as obj, mob/user as mob, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
@@ -196,7 +196,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
if(is_being_smoked) // if it's being smoked, transfer reagents to the mob
|
||||
var/mob/living/carbon/C = loc
|
||||
for (var/datum/reagent/R in reagents.reagent_list)
|
||||
reagents.trans_to(C, REAGENTS_METABOLISM)
|
||||
reagents.trans_id_to(C, R.id, max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem
|
||||
if(!reagents.total_volume) // There were reagents, but now they're gone
|
||||
to_chat(C, "<span class='notice'>Your [name] loses its flavor.</span>")
|
||||
else // else just remove some of the reagents
|
||||
@@ -232,7 +232,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
type_butt = /obj/item/cigbutt/roach
|
||||
throw_speed = 0.5
|
||||
item_state = "spliffoff"
|
||||
smoketime = 180
|
||||
smoketime = 250
|
||||
chem_volume = 100
|
||||
|
||||
/obj/item/clothing/mask/cigarette/rollie/New()
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
desc = "Damn son, where'd you find this?"
|
||||
icon_state = "air_horn"
|
||||
origin_tech = "materials=4;engineering=4"
|
||||
honk_sounds = list('sound/items/airhorn2.ogg' = 1)
|
||||
honk_sounds = list('sound/items/Airhorn2.ogg' = 1)
|
||||
|
||||
/obj/item/bikehorn/golden
|
||||
name = "golden bike horn"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
/obj/item/grenade/gas
|
||||
name = "Plasma Fire Grenade"
|
||||
name = "plasma fire grenade"
|
||||
desc = "A compressed plasma grenade, used to start horrific plasma fires."
|
||||
origin_tech = "materials=3;magnets=4;syndicate=3"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
@@ -18,7 +18,33 @@
|
||||
target_turf.air_update_turf()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/gas/plasma
|
||||
icon_state = "plasma"
|
||||
|
||||
/obj/item/grenade/gas/knockout
|
||||
name = "Knockout Grenade"
|
||||
name = "knockout grenade"
|
||||
desc = "A grenade that completely removes all air and heat from its detonation area."
|
||||
spawn_contents = SPAWN_20C | SPAWN_N2O
|
||||
spawn_contents = SPAWN_20C | SPAWN_N2O
|
||||
|
||||
/obj/item/grenade/gluon
|
||||
desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also wet any nearby floors."
|
||||
name = "gluon grenade"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "gluon"
|
||||
item_state = "flashbang"
|
||||
var/range = 4
|
||||
var/rad_damage = 60
|
||||
var/stamina_damage = 30
|
||||
|
||||
/obj/item/grenade/gluon/prime()
|
||||
update_mob()
|
||||
playsound(loc, 'sound/effects/empulse.ogg', 50, 1)
|
||||
for(var/turf/T in view(range, loc))
|
||||
if(isfloorturf(T))
|
||||
var/turf/simulated/F = T
|
||||
F.MakeSlippery(TURF_WET_PERMAFROST)
|
||||
for(var/mob/living/carbon/L in T)
|
||||
L.adjustStaminaLoss(stamina_damage)
|
||||
L.apply_effect(rad_damage, IRRADIATE)
|
||||
L.adjust_bodytemperature(-230)
|
||||
qdel(src)
|
||||
@@ -526,20 +526,20 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/grenade/chem_grenade/facid
|
||||
name = "acid grenade"
|
||||
desc = "Used for melting armoured opponents."
|
||||
payload_name = "acid smoke"
|
||||
desc = "Use to chew up opponents from the inside out."
|
||||
stage = READY
|
||||
|
||||
/obj/item/grenade/chem_grenade/facid/New()
|
||||
..()
|
||||
var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("facid", 280)
|
||||
B1.reagents.add_reagent("facid", 80)
|
||||
B1.reagents.add_reagent("potassium", 20)
|
||||
B2.reagents.add_reagent("phosphorus", 20)
|
||||
B2.reagents.add_reagent("sugar", 20)
|
||||
B2.reagents.add_reagent("facid", 260)
|
||||
B2.reagents.add_reagent("facid", 60)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
|
||||
//Bang
|
||||
if((loc == M) || loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection
|
||||
if(get_turf(M) == get_turf(src))//Holding on person or being exactly where lies is significantly more dangerous and voids protection
|
||||
M.Stun(10)
|
||||
M.Weaken(10)
|
||||
if(!ear_safety)
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/obj/item/grenade/frag
|
||||
name = "frag grenade"
|
||||
desc = "Fire in the hole."
|
||||
icon_state = "frag"
|
||||
item_state = "flashbang"
|
||||
origin_tech = "materials=3;magnets=4"
|
||||
var/range = 5
|
||||
var/max_shrapnel = 4
|
||||
var/embed_prob = 100 //reduced by armor
|
||||
var/embedded_type = /obj/item/embedded/shrapnel
|
||||
|
||||
/obj/item/grenade/frag/prime()
|
||||
update_mob()
|
||||
var/turf/epicenter = get_turf(src)
|
||||
for(var/mob/living/carbon/human/H in epicenter)
|
||||
if(H.resting) //grenade is jumped on but get real fucked up
|
||||
embed_shrapnel(H, max_shrapnel)
|
||||
range = 1
|
||||
explosion(loc, 0, 1, range, breach = FALSE)
|
||||
for(var/turf/T in view(range, loc))
|
||||
for(var/mob/living/carbon/human/H in T)
|
||||
var/shrapnel_amount = max_shrapnel - T.Distance(epicenter)
|
||||
if(shrapnel_amount > 0)
|
||||
embed_shrapnel(H, shrapnel_amount)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/frag/proc/embed_shrapnel(mob/living/carbon/human/H, amount)
|
||||
for(var/i = 0, i < amount, i++)
|
||||
if(prob(embed_prob - H.getarmor(null, "bomb")))
|
||||
var/obj/item/embedded/S = new embedded_type(src)
|
||||
H.hitby(S, skipcatch = 1)
|
||||
S.throwforce = 1
|
||||
S.throw_speed = 1
|
||||
S.sharp = FALSE
|
||||
else
|
||||
to_chat(H, "<span class='warning'>Shrapnel bounces off your armor!</span>")
|
||||
|
||||
/obj/item/embedded/shrapnel
|
||||
name = "shrapnel"
|
||||
icon = 'icons/obj/shards.dmi'
|
||||
throwforce = 10
|
||||
throw_speed = EMBED_THROWSPEED_THRESHOLD
|
||||
embed_chance = 100
|
||||
embedded_fall_chance = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
sharp = TRUE
|
||||
hitsound = 'sound/weapons/pierce.ogg'
|
||||
|
||||
/obj/item/embedded/shrapnel/New()
|
||||
icon_state = pick("shrapnel1", "shrapnel2", "shrapnel3")
|
||||
@@ -8,5 +8,5 @@
|
||||
|
||||
/obj/item/grenade/syndieminibomb/prime()
|
||||
update_mob()
|
||||
explosion(src.loc,1,2,4,flame_range = 2)
|
||||
qdel(src)
|
||||
explosion(loc, 1, 2, 4, flame_range = 2)
|
||||
qdel(src)
|
||||
@@ -15,6 +15,7 @@
|
||||
breakouttime = 600 //Deciseconds = 60s = 1 minutes
|
||||
var/cuffsound = 'sound/weapons/handcuffs.ogg'
|
||||
var/trashtype = null //For disposable cuffs
|
||||
var/ignoresClumsy = FALSE
|
||||
|
||||
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
@@ -23,7 +24,7 @@
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
if(CLUMSY in user.mutations && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50) && (!ignoresClumsy))
|
||||
to_chat(user, "<span class='warning'>Uh... how do those things work?!</span>")
|
||||
apply_cuffs(user,user)
|
||||
|
||||
|
||||
@@ -448,6 +448,7 @@
|
||||
|
||||
if(praying)
|
||||
to_chat(user, "<span class='notice'>You are already using [src].</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='info'>[user] kneels[M == user ? null : " next to [M]"] and begins to utter a prayer to [ticker.Bible_deity_name].</span>", \
|
||||
"<span class='info'>You kneel[M == user ? null : " next to [M]"] and begin a prayer to [ticker.Bible_deity_name].</span>")
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
hidden_uplink.uses = 10
|
||||
..()
|
||||
|
||||
/obj/item/implant/uplink/sit/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "sit"
|
||||
|
||||
/obj/item/implant/uplink/admin/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "admin"
|
||||
|
||||
/obj/item/implant/uplink/implant(mob/source)
|
||||
var/obj/item/implant/imp_e = locate(src.type) in source
|
||||
if(imp_e && imp_e != src)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
* Butcher's cleaver
|
||||
* Rolling Pins
|
||||
* Candy Moulds
|
||||
* Sushi Mat
|
||||
*/
|
||||
|
||||
/obj/item/kitchen
|
||||
@@ -249,3 +250,17 @@
|
||||
name = "sucker mould"
|
||||
desc = "It has the shape of a sucker imprinted into it."
|
||||
icon_state = "mould_loli"
|
||||
|
||||
/*
|
||||
* Sushi Mat
|
||||
*/
|
||||
/obj/item/kitchen/sushimat
|
||||
name = "Sushi Mat"
|
||||
desc = "A wooden mat used for efficient sushi crafting."
|
||||
icon_state = "sushi_mat"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 3
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("rolled", "cracked", "battered", "thrashed")
|
||||
@@ -30,6 +30,9 @@
|
||||
var/whatdpipe = PIPE_DISPOSALS_STRAIGHT //What kind of disposals pipe is it?
|
||||
var/spawndelay = RPD_COOLDOWN_TIME
|
||||
var/walldelay = RPD_WALLBUILD_TIME
|
||||
var/ranged = FALSE
|
||||
var/primary_sound = 'sound/machines/click.ogg'
|
||||
var/alt_sound = null
|
||||
|
||||
/obj/item/rpd/New()
|
||||
..()
|
||||
@@ -41,11 +44,24 @@
|
||||
QDEL_NULL(spark_system)
|
||||
return ..()
|
||||
|
||||
/obj/item/rpd/bluespace
|
||||
name = "bluespace rapid pipe dispenser"
|
||||
desc = "This device can rapidly dispense atmospherics and disposals piping, manipulate loose piping, and recycle any detached pipes it is applied to, at any range."
|
||||
icon_state = "brpd"
|
||||
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500, MAT_SILVER = 3000)
|
||||
origin_tech = "engineering=4;materials=2;bluespace=3"
|
||||
ranged = TRUE
|
||||
primary_sound = 'sound/items/PSHOOM.ogg'
|
||||
alt_sound = 'sound/items/PSHOOM_2.ogg'
|
||||
|
||||
//Procs
|
||||
|
||||
/obj/item/rpd/proc/activate_rpd(delay) //Maybe makes sparks and activates cooldown if there is a delay
|
||||
playsound(loc, "sound/machines/click.ogg", 50, 1)
|
||||
if(prob(15))
|
||||
if(alt_sound && prob(3))
|
||||
playsound(src, alt_sound, 50, 1)
|
||||
else
|
||||
playsound(src, primary_sound, 50, 1)
|
||||
if(prob(15) && !ranged)
|
||||
spark_system.start()
|
||||
if(delay)
|
||||
lastused = world.time
|
||||
@@ -188,7 +204,7 @@ var/list/pipemenu = list(
|
||||
..()
|
||||
if(loc != user)
|
||||
return
|
||||
if(!proximity)
|
||||
if(!proximity && !ranged)
|
||||
return
|
||||
if(world.time < lastused + spawndelay)
|
||||
return
|
||||
@@ -201,6 +217,8 @@ var/list/pipemenu = list(
|
||||
if(target.rpd_act(user, src) == TRUE)
|
||||
// If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else.
|
||||
// Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile.
|
||||
if(ranged)
|
||||
user.Beam(T, icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5)
|
||||
return
|
||||
|
||||
// If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile.
|
||||
@@ -212,6 +230,8 @@ var/list/pipemenu = list(
|
||||
return
|
||||
|
||||
// If we get here, then we're effectively acting on the turf, probably placing a pipe.
|
||||
if(ranged) //woosh beam if bluespaced at a distance
|
||||
user.Beam(T,icon_state="rped_upgrade", icon='icons/effects/effects.dmi', time=5)
|
||||
T.rpd_act(user, src)
|
||||
|
||||
#undef RPD_COOLDOWN_TIME
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
/obj/item/storage/backpack/holding/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/storage/backpack/holding))
|
||||
var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No")
|
||||
var/response = alert(user, "This creates a singularity, destroying you and much of the station. Are you SURE?","IMMINENT DEATH!", "No", "Yes")
|
||||
if(response == "Yes")
|
||||
user.visible_message("<span class='warning'>[user] grins as [user.p_they()] begin[user.p_s()] to put a Bag of Holding into a Bag of Holding!</span>", "<span class='warning'>You begin to put the Bag of Holding into the Bag of Holding!</span>")
|
||||
if(do_after(user, 30, target=src))
|
||||
@@ -98,6 +98,7 @@
|
||||
new /obj/item/clothing/mask/gas/voice/clown(src)
|
||||
new /obj/item/radio/headset/headset_service(src)
|
||||
new /obj/item/pda/clown(src)
|
||||
new /obj/item/storage/box/survival(src)
|
||||
new /obj/item/reagent_containers/food/snacks/grown/banana(src)
|
||||
new /obj/item/stamp/clown(src)
|
||||
new /obj/item/toy/crayon/rainbow(src)
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/belt/utility/chief
|
||||
name = "Chief Engineer's toolbelt"
|
||||
name = "advanced toolbelt"
|
||||
desc = "Holds tools, looks snazzy"
|
||||
icon_state = "utilitybelt_ce"
|
||||
item_state = "utility_ce"
|
||||
@@ -139,7 +139,7 @@
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
max_combined_w_class = 17
|
||||
use_to_pickup = 1
|
||||
name = "Surgical Belt"
|
||||
name = "surgical belt"
|
||||
desc = "Can hold various surgical tools."
|
||||
storage_slots = 9
|
||||
use_item_overlays = 1
|
||||
@@ -302,6 +302,48 @@
|
||||
item_state = "utility"
|
||||
use_item_overlays = 1 // So it will still show tools in it in case sec get lazy and just glance at it.
|
||||
|
||||
/obj/item/storage/belt/grenade
|
||||
name = "grenadier belt"
|
||||
desc = "A belt for holding grenades."
|
||||
icon_state = "assaultbelt"
|
||||
item_state = "assault"
|
||||
storage_slots = 30
|
||||
max_combined_w_class = 60
|
||||
display_contents_with_number = 1
|
||||
can_hold = list(
|
||||
/obj/item/grenade,
|
||||
/obj/item/lighter,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/molotov
|
||||
)
|
||||
|
||||
/obj/item/storage/belt/grenade/full/New()
|
||||
..()
|
||||
new /obj/item/grenade/smokebomb(src) //4
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/grenade/empgrenade(src) //2
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/gluon(src) //4
|
||||
new /obj/item/grenade/gluon(src)
|
||||
new /obj/item/grenade/gluon(src)
|
||||
new /obj/item/grenade/gluon(src)
|
||||
new /obj/item/grenade/chem_grenade/facid(src) //1
|
||||
new /obj/item/grenade/gas/plasma(src) //2
|
||||
new /obj/item/grenade/gas/plasma(src)
|
||||
new /obj/item/grenade/frag(src) //10
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/frag(src)
|
||||
new /obj/item/grenade/syndieminibomb(src) //2
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
|
||||
/obj/item/storage/belt/military/abductor
|
||||
name = "agent belt"
|
||||
desc = "A belt used by abductor agents."
|
||||
|
||||
@@ -72,8 +72,31 @@
|
||||
new /obj/item/clothing/mask/breath( src )
|
||||
new /obj/item/tank/emergency_oxygen( src )
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector( src )
|
||||
new /obj/item/flashlight/flare/glowstick/emergency( src )
|
||||
return
|
||||
|
||||
/obj/item/storage/box/survival_vox
|
||||
icon_state = "box_vox"
|
||||
|
||||
/obj/item/storage/box/survival_vox/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/breath/vox(src)
|
||||
new /obj/item/tank/emergency_oxygen/nitrogen(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/flashlight/flare/glowstick/emergency(src)
|
||||
|
||||
/obj/item/storage/box/survival_plasmaman
|
||||
icon_state = "box_plasma"
|
||||
|
||||
/obj/item/storage/box/survival_plasmaman/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/tank/emergency_oxygen/plasma(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/flashlight/flare/glowstick/emergency(src)
|
||||
|
||||
/obj/item/storage/box/engineer
|
||||
icon_state = "box_eng"
|
||||
New()
|
||||
@@ -82,6 +105,7 @@
|
||||
new /obj/item/clothing/mask/breath( src )
|
||||
new /obj/item/tank/emergency_oxygen/engi( src )
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector( src )
|
||||
new /obj/item/flashlight/flare/glowstick/emergency( src )
|
||||
return
|
||||
|
||||
/obj/item/storage/box/survival_mining
|
||||
@@ -93,6 +117,18 @@
|
||||
new /obj/item/tank/emergency_oxygen/engi(src)
|
||||
new /obj/item/crowbar/red(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/flashlight/flare/glowstick/emergency(src)
|
||||
|
||||
/obj/item/storage/box/survival_syndi
|
||||
icon_state = "box_syndi"
|
||||
New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
new /obj/item/tank/emergency_oxygen/syndi(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
new /obj/item/reagent_containers/food/pill/initropidril(src)
|
||||
new /obj/item/flashlight/flare/glowstick/red(src)
|
||||
|
||||
/obj/item/storage/box/gloves
|
||||
name = "box of latex gloves"
|
||||
|
||||
@@ -330,3 +330,9 @@
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/fakedeath/New()
|
||||
..()
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
@@ -94,15 +94,11 @@
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/clothing/gloves/combat(src)
|
||||
|
||||
|
||||
/obj/item/storage/toolbox/syndicate/trapped
|
||||
name = "suspicious looking toolbox"
|
||||
desc = "Danger. Very robust. Has a small red marker by the handle."
|
||||
|
||||
/obj/item/storage/toolbox/syndicate/trapped/New()
|
||||
..()
|
||||
new /obj/item/grenade/chem_grenade/explosion/mine_armed(src)
|
||||
|
||||
/obj/item/storage/toolbox/fakesyndi
|
||||
name = "suspicous looking toolbox"
|
||||
icon_state = "syndicate"
|
||||
item_state = "toolbox_syndi"
|
||||
desc = "Danger. Very Robust. The paint is still wet."
|
||||
|
||||
/obj/item/storage/toolbox/drone
|
||||
name = "mechanical toolbox"
|
||||
|
||||
@@ -207,12 +207,12 @@
|
||||
|
||||
/obj/item/storage/box/syndie_kit/caneshotgun/New()
|
||||
..()
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/gun/projectile/revolver/doublebarrel/improvised/cane(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/mimery
|
||||
@@ -283,4 +283,4 @@ To apply, hold the injector a short distance away from the outer thigh before ap
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/balaclava(src)
|
||||
new /obj/item/clothing/accessory/stethoscope(src)
|
||||
new /obj/item/book/manual/engineering_hacking(src)
|
||||
new /obj/item/book/manual/engineering_hacking(src)
|
||||
@@ -27,6 +27,9 @@
|
||||
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
|
||||
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
|
||||
|
||||
obj/item/tank/oxygen/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/oxygen/yellow
|
||||
desc = "A tank of oxygen, this one is yellow."
|
||||
@@ -142,11 +145,19 @@
|
||||
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
|
||||
user << sound('sound/effects/alert.ogg')
|
||||
|
||||
obj/item/tank/emergency_oxygen/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/emergency_oxygen/engi
|
||||
name = "extended-capacity emergency oxygen tank"
|
||||
icon_state = "emergency_engi"
|
||||
volume = 6
|
||||
|
||||
obj/item/tank/emergency_oxygen/engi/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/emergency_oxygen/syndi
|
||||
name = "suspicious emergency oxygen tank"
|
||||
icon_state = "emergency_syndi"
|
||||
@@ -158,6 +169,10 @@
|
||||
icon_state = "emergency_double"
|
||||
volume = 10
|
||||
|
||||
obj/item/tank/emergency_oxygen/double/empty/New()
|
||||
..()
|
||||
air_contents.oxygen = null
|
||||
|
||||
/obj/item/tank/emergency_oxygen/double/full
|
||||
name = "pressurized double emergency oxygen tank"
|
||||
desc = "Used for \"emergencies,\" it actually contains a fair amount of oxygen."
|
||||
|
||||
@@ -5,59 +5,42 @@
|
||||
icon_state = "taperoll"
|
||||
singular_name = "tape roll"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
amount = 25
|
||||
max_amount = 25
|
||||
|
||||
/obj/item/stack/tape_roll/New(var/loc, var/amount=null)
|
||||
..()
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M as mob, mob/living/user as mob)
|
||||
/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M, mob/living/user)
|
||||
if(!istype(M)) //What good is a duct tape mask if you are unable to speak?
|
||||
return
|
||||
if(M.wear_mask)
|
||||
to_chat(user, "Remove [M.p_their()] mask first!")
|
||||
else if(amount < 2)
|
||||
to_chat(user, "You'll need more tape for this!")
|
||||
else if(!M.check_has_mouth())
|
||||
to_chat(user, "[M.p_they(TRUE)] [M.p_have()] no mouth to tape over!")
|
||||
else
|
||||
if(M == user)
|
||||
to_chat(user, "You try to tape your own mouth shut.")
|
||||
else
|
||||
to_chat(user, "You try to tape [M]'s mouth shut.")
|
||||
M.visible_message("<span class='warning'>[user] tries to tape [M]'s mouth closed!</span>")
|
||||
if(do_after(user, 50, target = M))
|
||||
if(M == user)
|
||||
to_chat(user, "You cover your own mouth with a piece of duct tape.")
|
||||
else
|
||||
to_chat(user, "You cover [M]'s mouth with a piece of duct tape. That will shut [M.p_them()] up!")
|
||||
M.visible_message("<span class='warning'>[user] tapes [M]'s mouth shut!</span>")
|
||||
var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
|
||||
M.equip_to_slot(G, slot_wear_mask)
|
||||
G.add_fingerprint(user)
|
||||
amount = amount - 2
|
||||
if(amount <= 0)
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
/* -- Disabled for now until it has a use --
|
||||
/obj/item/stack/tape_roll/attack_self(mob/user as mob)
|
||||
to_chat(user, "You remove a length of tape from [src].")
|
||||
|
||||
var/obj/item/ducttape/tape = new()
|
||||
user.put_in_hands(tape)
|
||||
*/
|
||||
|
||||
/obj/item/stack/tape_roll/proc/stick(var/obj/item/W, mob/user)
|
||||
if(!istype(W, /obj/item/paper))
|
||||
return
|
||||
|
||||
user.unEquip(W)
|
||||
var/obj/item/ducttape/tape = new(get_turf(src))
|
||||
tape.attach(W)
|
||||
user.put_in_hands(tape)
|
||||
if(amount < 2)
|
||||
to_chat(user, "You'll need more tape for this!")
|
||||
return
|
||||
if(!M.check_has_mouth())
|
||||
to_chat(user, "[M.p_they(TRUE)] [M.p_have()] no mouth to tape over!")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] is taping [M]'s mouth closed!</span>",
|
||||
"<span class='notice'>You try to tape [M == user ? "your own" : "[M]'s"] mouth shut!</span>",
|
||||
"<span class='warning'>You hear tape ripping.</span>")
|
||||
if(!do_after(user, 50, target = M))
|
||||
return
|
||||
if(!use(2))
|
||||
to_chat(user, "<span class='notice'>You don't have enough tape!</span>")
|
||||
return
|
||||
if(M.wear_mask)
|
||||
to_chat(user, "<span class='notice'>[M == user ? user : M]'s mouth is already covered!</span>")
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] tapes [M]'s mouth shut!</span>",
|
||||
"<span class='notice'>You cover [M == user ? "your own" : "[M]'s"] mouth with a piece of duct tape.[M == user ? null : " That will shut them up."]</span>")
|
||||
var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
|
||||
M.equip_to_slot(G, slot_wear_mask)
|
||||
G.add_fingerprint(user)
|
||||
|
||||
/obj/item/stack/tape_roll/update_icon()
|
||||
var/amount = get_amount()
|
||||
@@ -71,73 +54,4 @@
|
||||
icon_state = "taperoll-4"
|
||||
else
|
||||
icon_state = "taperoll-4"
|
||||
|
||||
/obj/item/ducttape
|
||||
name = "tape"
|
||||
desc = "A piece of sticky tape."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "tape"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
layer = 4
|
||||
anchored = 1 //it's sticky, no you cant move it
|
||||
|
||||
var/obj/item/stuck = null
|
||||
|
||||
/obj/item/ducttape/New()
|
||||
..()
|
||||
flags |= NOBLUDGEON
|
||||
|
||||
/obj/item/ducttape/examine(mob/user)
|
||||
return stuck.examine(user)
|
||||
|
||||
/obj/item/ducttape/proc/attach(var/obj/item/W)
|
||||
stuck = W
|
||||
W.forceMove(src)
|
||||
icon_state = W.icon_state + "_taped"
|
||||
name = W.name + " (taped)"
|
||||
overlays = W.overlays
|
||||
|
||||
/obj/item/ducttape/attack_self(mob/user)
|
||||
if(!stuck)
|
||||
return
|
||||
|
||||
to_chat(user, "You remove \the [initial(name)] from [stuck].")
|
||||
|
||||
user.unEquip(src)
|
||||
stuck.forceMove(get_turf(src))
|
||||
user.put_in_hands(stuck)
|
||||
stuck = null
|
||||
overlays = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/ducttape/afterattack(var/A, mob/user, flag, params)
|
||||
if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck)
|
||||
return
|
||||
|
||||
var/turf/target_turf = get_turf(A)
|
||||
var/turf/source_turf = get_turf(user)
|
||||
|
||||
var/dir_offset = 0
|
||||
if(target_turf != source_turf)
|
||||
dir_offset = get_dir(source_turf, target_turf)
|
||||
if(!(dir_offset in cardinal))
|
||||
to_chat(user, "You cannot reach that from here.")// can only place stuck papers in cardinal directions, to
|
||||
return // reduce papers around corners issue.
|
||||
|
||||
user.unEquip(src)
|
||||
forceMove(source_turf)
|
||||
|
||||
if(params)
|
||||
var/list/mouse_control = params2list(params)
|
||||
if(mouse_control["icon-x"])
|
||||
pixel_x = text2num(mouse_control["icon-x"]) - 16
|
||||
if(dir_offset & EAST)
|
||||
pixel_x += 32
|
||||
else if(dir_offset & WEST)
|
||||
pixel_x -= 32
|
||||
if(mouse_control["icon-y"])
|
||||
pixel_y = text2num(mouse_control["icon-y"]) - 16
|
||||
if(dir_offset & NORTH)
|
||||
pixel_y += 32
|
||||
else if(dir_offset & SOUTH)
|
||||
pixel_y -= 32
|
||||
|
||||
@@ -368,6 +368,7 @@
|
||||
else
|
||||
icon_state = "[initial(icon_state)][ratio]"
|
||||
update_torch()
|
||||
..()
|
||||
|
||||
/obj/item/weldingtool/process()
|
||||
switch(welding)
|
||||
|
||||
@@ -91,9 +91,6 @@
|
||||
O.unwield(user)
|
||||
return unwield(user)
|
||||
|
||||
/obj/item/twohanded/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/twohanded/attack_self(mob/user)
|
||||
..()
|
||||
if(wielded) //Trying to unwield it
|
||||
@@ -182,6 +179,7 @@
|
||||
|
||||
/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "fireaxe[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/fireaxe/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
@@ -208,6 +206,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/w_class_on = WEIGHT_CLASS_BULKY
|
||||
force_unwielded = 3
|
||||
force_wielded = 34
|
||||
wieldsound = 'sound/weapons/saberon.ogg'
|
||||
@@ -232,6 +231,7 @@
|
||||
else
|
||||
icon_state = "dualsaber0"
|
||||
set_light(0)
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/user)
|
||||
if(HULK in user.mutations)
|
||||
@@ -278,6 +278,7 @@
|
||||
/obj/item/twohanded/dualsaber/unwield()
|
||||
..()
|
||||
hitsound = "swing_hit"
|
||||
w_class = initial(w_class)
|
||||
|
||||
/obj/item/twohanded/dualsaber/IsReflect()
|
||||
if(wielded)
|
||||
@@ -289,6 +290,7 @@
|
||||
return
|
||||
..()
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
w_class = w_class_on
|
||||
|
||||
/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
|
||||
if(ismultitool(W))
|
||||
@@ -327,6 +329,7 @@
|
||||
icon_state = "spearbomb[wielded]"
|
||||
else
|
||||
icon_state = "spearglass[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
|
||||
if(!proximity)
|
||||
@@ -509,6 +512,7 @@
|
||||
icon_state = "chainsaw[wielded]"
|
||||
else
|
||||
icon_state = "chainsaw0"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/chainsaw/attack(mob/target, mob/living/user)
|
||||
if(wielded)
|
||||
@@ -565,6 +569,7 @@
|
||||
|
||||
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
|
||||
for(var/atom/movable/X in orange(5, pull))
|
||||
@@ -640,6 +645,7 @@
|
||||
|
||||
/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/knighthammer
|
||||
name = "singuloth knight's hammer"
|
||||
@@ -670,6 +676,7 @@
|
||||
|
||||
/obj/item/twohanded/knighthammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "knighthammer[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/knighthammer/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
@@ -725,6 +732,7 @@
|
||||
icon_state = "fireaxe2"
|
||||
else
|
||||
icon_state = "fireaxe0"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/energizedfireaxe/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
|
||||
@@ -87,6 +87,17 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
|
||||
return TRUE
|
||||
|
||||
/obj/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
|
||||
collision_damage(pusher, force, direction)
|
||||
return TRUE
|
||||
|
||||
/obj/proc/collision_damage(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
|
||||
var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10)
|
||||
take_damage(amt, BRUTE)
|
||||
|
||||
/obj/blob_act(obj/structure/blob/B)
|
||||
if(isturf(loc))
|
||||
var/turf/T = loc
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
return
|
||||
|
||||
/obj/proc/update_icon()
|
||||
return
|
||||
SEND_SIGNAL(src, COMSIG_OBJ_UPDATE_ICON)
|
||||
|
||||
/mob/proc/unset_machine()
|
||||
if(machine)
|
||||
|
||||
@@ -49,9 +49,9 @@
|
||||
|
||||
/obj/structure/closet/lasertag/red/New()
|
||||
..()
|
||||
new /obj/item/gun/energy/laser/redtag(src)
|
||||
new /obj/item/gun/energy/laser/redtag(src)
|
||||
new /obj/item/gun/energy/laser/redtag(src)
|
||||
new /obj/item/gun/energy/laser/tag/red(src)
|
||||
new /obj/item/gun/energy/laser/tag/red(src)
|
||||
new /obj/item/gun/energy/laser/tag/red(src)
|
||||
new /obj/item/clothing/suit/redtag(src)
|
||||
new /obj/item/clothing/suit/redtag(src)
|
||||
new /obj/item/clothing/suit/redtag(src)
|
||||
@@ -65,9 +65,9 @@
|
||||
|
||||
/obj/structure/closet/lasertag/blue/New()
|
||||
..()
|
||||
new /obj/item/gun/energy/laser/bluetag(src)
|
||||
new /obj/item/gun/energy/laser/bluetag(src)
|
||||
new /obj/item/gun/energy/laser/bluetag(src)
|
||||
new /obj/item/gun/energy/laser/tag/blue(src)
|
||||
new /obj/item/gun/energy/laser/tag/blue(src)
|
||||
new /obj/item/gun/energy/laser/tag/blue(src)
|
||||
new /obj/item/clothing/suit/bluetag(src)
|
||||
new /obj/item/clothing/suit/bluetag(src)
|
||||
new /obj/item/clothing/suit/bluetag(src)
|
||||
|
||||
@@ -42,3 +42,4 @@
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/clothing/head/soft(src)
|
||||
new /obj/item/door_remote/quartermaster(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/meson(src)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
anchored = 1
|
||||
health = 200
|
||||
req_access = list()
|
||||
layer = 2.9 // ensures the loot they drop always appears on top of them.
|
||||
var/is_armory = FALSE
|
||||
var/ignore_use = FALSE
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
new /obj/item/door_remote/chief_engineer(src)
|
||||
new /obj/item/rpd(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/ce(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/meson(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_electrical
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src)
|
||||
new /obj/item/toy/crayon/rainbow(src)
|
||||
new /obj/item/seeds/banana(src)
|
||||
new /obj/item/restraints/handcuffs/toy(src)
|
||||
|
||||
|
||||
|
||||
@@ -45,4 +46,18 @@
|
||||
new /obj/item/storage/backpack/mime(src)
|
||||
new /obj/item/toy/crayon/mime(src)
|
||||
new /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing(src)
|
||||
new /obj/item/cane(src)
|
||||
new /obj/item/cane(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate_officer
|
||||
name = "officer's locker"
|
||||
req_access = list(access_syndicate_command)
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate_officer/New()
|
||||
..()
|
||||
new /obj/item/storage/box/syndie_kit/elite_hardsuit(src)
|
||||
new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate(src)
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src)
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src)
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src)
|
||||
new /obj/item/clothing/glasses/thermal(src)
|
||||
new /obj/item/megaphone(src)
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
new /obj/item/laser_pointer(src)
|
||||
new /obj/item/door_remote/research_director(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/rd(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/research_reagents
|
||||
|
||||
@@ -123,6 +123,7 @@
|
||||
new /obj/item/gun/energy/gun/hos(src)
|
||||
new /obj/item/door_remote/head_of_security(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/hos(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/security(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/warden
|
||||
@@ -245,6 +246,7 @@
|
||||
new /obj/item/restraints/handcuffs(src)
|
||||
new /obj/item/melee/baton/loaded(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses/read_only(src)
|
||||
new /obj/item/clothing/glasses/hud/health/health_advanced
|
||||
new /obj/item/clothing/head/beret/centcom/officer(src)
|
||||
new /obj/item/clothing/head/beret/centcom/officer/navy(src)
|
||||
|
||||
@@ -637,3 +637,8 @@
|
||||
icon_state = "electricalcrate"
|
||||
icon_opened = "electricalcrateopen"
|
||||
icon_closed = "electricalcrate"
|
||||
|
||||
/obj/structure/closet/crate/tape/New()
|
||||
if(prob(10))
|
||||
new /obj/item/bikehorn/rubberducky(src)
|
||||
..()
|
||||
|
||||
@@ -9,17 +9,17 @@
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
var/has_overloaded = FALSE
|
||||
|
||||
/obj/structure/fusionreactor/Initialize()
|
||||
..()
|
||||
/obj/structure/fusionreactor/New()
|
||||
. = ..()
|
||||
// Do not attempt to put the code below into Initialize() or even LateInitialize() with a "return INITIALIZE_HINT_LATELOAD". It won't work!
|
||||
depotarea = areaMaster
|
||||
if(istype(depotarea))
|
||||
depotarea.reactor = src
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/structure/fusionreactor/LateInitialize()
|
||||
for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc))
|
||||
if(!istype(T.depotarea))
|
||||
T.depotarea = depotarea
|
||||
for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc))
|
||||
if(!istype(T.depotarea))
|
||||
T.depotarea = depotarea
|
||||
else
|
||||
log_debug("[src] at [x],[y],[z] failed depotarea istype check during New()! Either it was spawned outside the depot area (bad idea), or a bug is happening.")
|
||||
|
||||
/obj/structure/fusionreactor/Destroy()
|
||||
if(istype(depotarea))
|
||||
@@ -84,8 +84,9 @@
|
||||
var/max_fire_range = 9
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
|
||||
/obj/effect/overload/Initialize()
|
||||
/obj/effect/overload/New()
|
||||
. = ..()
|
||||
// Do not attempt to put the code below into Initialize() or even LateInitialize() with a "return INITIALIZE_HINT_LATELOAD". It won't work!
|
||||
processing_objects.Add(src)
|
||||
depotarea = areaMaster
|
||||
if(istype(depotarea))
|
||||
@@ -93,6 +94,8 @@
|
||||
depotarea.used_self_destruct = TRUE // Silences all further alerts from this point onwards.
|
||||
depotarea.updateicon()
|
||||
depotarea.shields_down()
|
||||
else
|
||||
log_debug("[src] at [x],[y],[z] failed depotarea istype check during New()! Either it was spawned outside the depot area (bad idea), or a bug is happening.")
|
||||
|
||||
/obj/effect/overload/process()
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -116,6 +119,8 @@
|
||||
L.open()
|
||||
for(var/mob/living/M in range(30, T))
|
||||
M.gib()
|
||||
for(var/obj/mecha/E in range(30, T))
|
||||
E.Destroy()
|
||||
explosion(get_turf(src), 25, 35, 45, 55, 1, 1, 60, 0, 0)
|
||||
processing_objects.Remove(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -107,6 +107,7 @@ var/global/list/captain_display_cases = list()
|
||||
var/image/occupant_overlay = null
|
||||
var/obj/item/airlock_electronics/circuit
|
||||
var/start_showpiece_type = null //add type for items on display
|
||||
var/alarm_needs_power = TRUE
|
||||
|
||||
/obj/structure/displaycase/New()
|
||||
. = ..()
|
||||
@@ -122,6 +123,13 @@ var/global/list/captain_display_cases = list()
|
||||
req_access = list(access_captain)
|
||||
start_showpiece_type = /obj/item/gun/energy/laser/captain
|
||||
|
||||
/obj/structure/displaycase/stechkin
|
||||
name = "officer's display case"
|
||||
desc = "A display case containing a humble stechkin pistol. Never forget your roots."
|
||||
locked = 1
|
||||
req_access = list(access_syndicate_command)
|
||||
start_showpiece_type = /obj/item/gun/projectile/automatic/pistol
|
||||
|
||||
/obj/structure/displaycase/Destroy()
|
||||
dump()
|
||||
QDEL_NULL(circuit)
|
||||
@@ -184,7 +192,12 @@ var/global/list/captain_display_cases = list()
|
||||
playsound(get_turf(src), "shatter", 70, 1)
|
||||
update_icon()
|
||||
spawn(0)
|
||||
burglar_alarm()
|
||||
if(!alarm_needs_power)
|
||||
burglar_alarm()
|
||||
else
|
||||
var/area/a = get_area(src)
|
||||
if(isarea(a) && a.power_equip)
|
||||
burglar_alarm()
|
||||
else
|
||||
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
return
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
/obj/structure/reflector
|
||||
name = "reflector frame"
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "box_0"
|
||||
desc = "A frame to create a reflector.\n<span class='notice'>Use <b>5</b> sheets of <b>glass</b> to create a 1 way reflector.\nUse <b>10</b> sheets of <b>reinforced glass</b> to create a 2 way reflector.\nUse <b>1 diamond</b> to create a reflector cube.</span>"
|
||||
anchored = 0
|
||||
density = 1
|
||||
layer = 3
|
||||
var/finished = 0
|
||||
|
||||
|
||||
/obj/structure/reflector/bullet_act(obj/item/projectile/P)
|
||||
var/turf/reflector_turf = get_turf(src)
|
||||
var/turf/reflect_turf
|
||||
var/new_dir = get_reflection(dir, P.dir)
|
||||
if(!istype(P, /obj/item/projectile/beam))
|
||||
return ..()
|
||||
if(new_dir)
|
||||
reflect_turf = get_step(reflect_turf, new_dir)
|
||||
else
|
||||
visible_message("<span class='notice'>[src] is hit by [P]!</span>")
|
||||
new_dir = 0
|
||||
return ..() //Hits as normal, explodes or emps or whatever
|
||||
|
||||
visible_message("<span class='notice'>[P] bounces off of [src]</span>")
|
||||
reflect_turf = get_step(loc,new_dir)
|
||||
|
||||
P.original = reflect_turf
|
||||
P.starting = reflector_turf
|
||||
P.current = reflector_turf
|
||||
P.yo = reflect_turf.y - reflector_turf.y
|
||||
P.xo = reflect_turf.x - reflector_turf.x
|
||||
new_dir = 0
|
||||
return -1
|
||||
|
||||
|
||||
/obj/structure/reflector/attackby(obj/item/W, mob/user, params)
|
||||
if(iswrench(W))
|
||||
if(anchored)
|
||||
to_chat(user, "Unweld [src] first!")
|
||||
return
|
||||
playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
to_chat(user, "You begin to dismantle [src].")
|
||||
if(do_after(user, 80, target = src))
|
||||
playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
to_chat(user, "You dismantle [src].")
|
||||
new /obj/item/stack/sheet/metal(src.loc, 5)
|
||||
qdel(src)
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if(!anchored)
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(user, 'sound/items/Welder2.ogg', 50, 1)
|
||||
user.visible_message("[user.name] starts to weld [src.name] to the floor.", \
|
||||
"<span class='notice'>You start to weld [src] to the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,20, target = src))
|
||||
if(!src || !WT.isOn())
|
||||
return
|
||||
anchored = 1
|
||||
to_chat(user, "<span class='notice'>You weld [src] to the floor.</span>")
|
||||
else
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(user, 'sound/items/Welder2.ogg', 50, 1)
|
||||
user.visible_message("[user] starts to cut [src] free from the floor.", \
|
||||
"<span class='notice'>You start to cut [src] free from the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,20, target = src))
|
||||
if(!src || !WT.isOn())
|
||||
return
|
||||
anchored = 0
|
||||
to_chat(user, "<span class='notice'>You cut [src] free from the floor.</span>")
|
||||
//Finishing the frame
|
||||
if(istype(W,/obj/item/stack/sheet))
|
||||
if(finished)
|
||||
return
|
||||
var/obj/item/stack/sheet/S = W
|
||||
if(istype(W, /obj/item/stack/sheet/glass))
|
||||
if(S.get_amount() < 5)
|
||||
to_chat(user, "<span class='warning'>You need five sheets of glass to create a reflector!</span>")
|
||||
return
|
||||
else
|
||||
S.use(5)
|
||||
new /obj/structure/reflector/single (src.loc)
|
||||
qdel(src)
|
||||
if(istype(W,/obj/item/stack/sheet/rglass))
|
||||
if(S.get_amount() < 10)
|
||||
to_chat(user, "<span class='warning'>You need ten sheets of reinforced glass to create a double reflector!</span>")
|
||||
return
|
||||
else
|
||||
S.use(10)
|
||||
new /obj/structure/reflector/double (src.loc)
|
||||
qdel(src)
|
||||
if(istype(W, /obj/item/stack/sheet/mineral/diamond))
|
||||
if(S.get_amount() >= 1)
|
||||
S.use(1)
|
||||
new /obj/structure/reflector/box (src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/reflector/proc/get_reflection(srcdir,pdir)
|
||||
return 0
|
||||
|
||||
|
||||
/obj/structure/reflector/verb/rotate()
|
||||
set name = "Rotate"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(anchored)
|
||||
to_chat(usr, "<span class='warning'>It is fastened to the floor!</span>")
|
||||
return 0
|
||||
dir = turn(dir, 270)
|
||||
return 1
|
||||
|
||||
|
||||
/obj/structure/reflector/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
else
|
||||
rotate()
|
||||
|
||||
|
||||
//TYPES OF REFLECTORS, SINGLE, DOUBLE, BOX
|
||||
|
||||
//SINGLE
|
||||
|
||||
/obj/structure/reflector/single
|
||||
name = "reflector"
|
||||
icon = 'icons/obj/reflector.dmi'
|
||||
icon_state = "reflector"
|
||||
desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle."
|
||||
finished = 1
|
||||
var/static/list/rotations = list("[NORTH]" = list("[SOUTH]" = WEST, "[EAST]" = NORTH),
|
||||
"[EAST]" = list("[SOUTH]" = EAST, "[WEST]" = NORTH),
|
||||
"[SOUTH]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH),
|
||||
"[WEST]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH) )
|
||||
|
||||
/obj/structure/reflector/single/get_reflection(srcdir,pdir)
|
||||
var/new_dir = rotations["[srcdir]"]["[pdir]"]
|
||||
return new_dir
|
||||
|
||||
//DOUBLE
|
||||
|
||||
/obj/structure/reflector/double
|
||||
name = "double sided reflector"
|
||||
icon = 'icons/obj/reflector.dmi'
|
||||
icon_state = "reflector_double"
|
||||
desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle."
|
||||
finished = 1
|
||||
var/static/list/double_rotations = list("[NORTH]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH, "[SOUTH]" = EAST, "[WEST]" = NORTH),
|
||||
"[EAST]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH, "[SOUTH]" = WEST, "[EAST]" = NORTH),
|
||||
"[SOUTH]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH, "[SOUTH]" = WEST, "[EAST]" = NORTH),
|
||||
"[WEST]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH, "[SOUTH]" = EAST, "[WEST]" = NORTH) )
|
||||
|
||||
/obj/structure/reflector/double/get_reflection(srcdir,pdir)
|
||||
var/new_dir = double_rotations["[srcdir]"]["[pdir]"]
|
||||
return new_dir
|
||||
|
||||
//BOX
|
||||
|
||||
/obj/structure/reflector/box
|
||||
name = "reflector box"
|
||||
icon = 'icons/obj/reflector.dmi'
|
||||
icon_state = "reflector_box"
|
||||
desc = "A box with an internal set of mirrors that reflects all laser fire in a single direction."
|
||||
finished = 1
|
||||
var/static/list/box_rotations = list("[NORTH]" = list("[SOUTH]" = NORTH, "[EAST]" = NORTH, "[WEST]" = NORTH, "[NORTH]" = NORTH),
|
||||
"[EAST]" = list("[SOUTH]" = EAST, "[EAST]" = EAST, "[WEST]" = EAST, "[NORTH]" = EAST),
|
||||
"[SOUTH]" = list("[SOUTH]" = SOUTH, "[EAST]" = SOUTH, "[WEST]" = SOUTH, "[NORTH]" = SOUTH),
|
||||
"[WEST]" = list("[SOUTH]" = WEST, "[EAST]" = WEST, "[WEST]" = WEST, "[NORTH]" = WEST) )
|
||||
|
||||
/obj/structure/reflector/box/get_reflection(srcdir,pdir)
|
||||
var/new_dir = box_rotations["[srcdir]"]["[pdir]"]
|
||||
return new_dir
|
||||
@@ -313,17 +313,6 @@
|
||||
icon = 'icons/obj/statuelarge.dmi'
|
||||
icon_state = "venus"
|
||||
|
||||
/*
|
||||
/obj/structure/statue/snow
|
||||
hardness = 0.5
|
||||
material_drop_type = /obj/item/stack/sheet/mineral/snow
|
||||
|
||||
/obj/structure/statue/snow/snowman
|
||||
name = "snowman"
|
||||
desc = "Several lumps of snow put together to form a snowman."
|
||||
icon_state = "snowman"
|
||||
*/
|
||||
|
||||
/obj/structure/statue/tranquillite
|
||||
hardness = 0.5
|
||||
material_drop_type = /obj/item/stack/sheet/mineral/tranquillite
|
||||
@@ -349,8 +338,30 @@
|
||||
desc = "Seems someone made a snowman here."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "snowman"
|
||||
anchored = 1
|
||||
density = 1
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/snowman/built
|
||||
desc = "Just like the ones you remember from childhood!"
|
||||
max_integrity = 50
|
||||
|
||||
/obj/structure/snowman/built/Destroy()
|
||||
new /obj/item/reagent_containers/food/snacks/grown/carrot(drop_location())
|
||||
new /obj/item/grown/log(drop_location())
|
||||
new /obj/item/grown/log(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/structure/snowman/built/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/snowball) && obj_integrity < max_integrity)
|
||||
to_chat(user, "<span class='notice'>You patch some of the damage on [src] with [I].</span>")
|
||||
obj_integrity = max_integrity
|
||||
qdel(I)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/snowman/built/fire_act()
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/kidanstatue
|
||||
name = "Obsidian Kidan warrior statue"
|
||||
|
||||
@@ -174,7 +174,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.visible_message("<span class='notice'>Something knocks on [src].</span>")
|
||||
add_fingerprint(user)
|
||||
playsound(src, 'sound/effects/Glassknock.ogg', 50, 1)
|
||||
playsound(src, 'sound/effects/glassknock.ogg', 50, 1)
|
||||
|
||||
/obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
|
||||
if(!can_be_reached(user))
|
||||
|
||||
Reference in New Issue
Block a user