mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 13:37:58 +01:00
Merge remote-tracking branch 'upstream/master' into just-defibrillator-things
This commit is contained in:
@@ -287,7 +287,7 @@
|
||||
A.Grant(S)
|
||||
|
||||
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENT, FALSE, 100, source = S, role_cleanname = "pyroclastic anomaly slime")
|
||||
if(LAZYLEN(candidates))
|
||||
if(length(candidates) && !QDELETED(S))
|
||||
var/mob/dead/observer/chosen = pick(candidates)
|
||||
S.key = chosen.key
|
||||
S.mind.special_role = SPECIAL_ROLE_PYROCLASTIC_SLIME
|
||||
|
||||
@@ -67,6 +67,11 @@
|
||||
/obj/effect/mapping_helpers/no_lava
|
||||
icon_state = "no_lava"
|
||||
|
||||
/obj/effect/mapping_helpers/no_lava/New()
|
||||
var/turf/T = get_turf(src)
|
||||
T.flags |= NO_LAVA_GEN
|
||||
..()
|
||||
|
||||
/obj/effect/mapping_helpers/airlock
|
||||
layer = DOOR_HELPER_LAYER
|
||||
|
||||
@@ -78,13 +83,9 @@
|
||||
if(!mapload)
|
||||
log_world("### MAP WARNING, [src] spawned outside of mapload!")
|
||||
return
|
||||
var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in src.loc
|
||||
if(airlock)
|
||||
airlock.unres_sides ^= dir
|
||||
var/obj/machinery/door/door = locate(/obj/machinery/door) in loc
|
||||
if(door)
|
||||
door.unres_sides ^= dir
|
||||
else
|
||||
log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]")
|
||||
..()
|
||||
/obj/effect/mapping_helpers/no_lava/New()
|
||||
var/turf/T = get_turf(src)
|
||||
T.flags |= NO_LAVA_GEN
|
||||
. = ..()
|
||||
..()
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
//generic procs copied from obj/effect/alien
|
||||
#define SPIDER_SOFT_CAP 30
|
||||
#define SPIDER_HARD_CAP 40
|
||||
/obj/structure/spider
|
||||
name = "web"
|
||||
desc = "it's stringy and sticky"
|
||||
@@ -67,7 +69,11 @@
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/structure/spider/eggcluster/process()
|
||||
amount_grown += rand(0,2)
|
||||
if(SSmobs.giant_spiders > SPIDER_SOFT_CAP) //eggs gonna chill out until there is less spiders
|
||||
return
|
||||
|
||||
amount_grown += rand(0, 2)
|
||||
|
||||
if(amount_grown >= 100)
|
||||
var/num = rand(3, 12)
|
||||
for(var/i in 1 to num)
|
||||
@@ -75,7 +81,7 @@
|
||||
S.faction = faction.Copy()
|
||||
S.master_commander = master_commander
|
||||
if(player_spiders)
|
||||
S.player_spiders = 1
|
||||
S.player_spiders = TRUE
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/spider/spiderling
|
||||
@@ -168,9 +174,13 @@
|
||||
if(isturf(loc))
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
if(SSmobs.giant_spiders > SPIDER_HARD_CAP)
|
||||
qdel(src)
|
||||
return
|
||||
if(!grow_as)
|
||||
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(loc)
|
||||
SSmobs.giant_spiders++
|
||||
S.faction = faction.Copy()
|
||||
S.master_commander = master_commander
|
||||
if(player_spiders && !selecting_player)
|
||||
@@ -178,7 +188,7 @@
|
||||
spawn()
|
||||
var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as a giant spider?", ROLE_GSPIDER, TRUE, source = S)
|
||||
|
||||
if(candidates.len)
|
||||
if(length(candidates) && !QDELETED(S))
|
||||
var/mob/C = pick(candidates)
|
||||
if(C)
|
||||
S.key = C.key
|
||||
|
||||
@@ -43,14 +43,14 @@
|
||||
|
||||
/obj/effect/temp_visual/ratvar/window
|
||||
icon_state = "ratvarwindowglow"
|
||||
layer = ABOVE_OBJ_LAYER
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/window/single
|
||||
icon_state = "ratvarwindowglow_s"
|
||||
|
||||
/obj/effect/temp_visual/ratvar/gear
|
||||
icon_state = "ratvargearglow"
|
||||
layer = BELOW_OBJ_LAYER
|
||||
layer = ABOVE_OBJ_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/grille
|
||||
icon_state = "ratvargrilleglow"
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
/**
|
||||
* Will cause an EMP on the given epicenter.
|
||||
* This proc can sleep depending on the affected objects. So assume it sleeps!
|
||||
*
|
||||
* epicenter - The center of the EMP. Can be an atom, as long as the given atom is on a turf (in)directly
|
||||
* heavy_range - The max distance from the epicenter where objects will be get heavy EMPed
|
||||
* light_range - The max distance from the epicenter where objects will get light EMPed
|
||||
* log - Whether or not this action should be logged or not. Will use the cause if provided
|
||||
* cause - The cause of the EMP. Used for the logging
|
||||
*/
|
||||
/proc/empulse(turf/epicenter, heavy_range, light_range, log = FALSE, cause = null)
|
||||
if(!epicenter) return
|
||||
|
||||
|
||||
@@ -329,5 +329,6 @@
|
||||
..()
|
||||
|
||||
/obj/item/paicard/extinguish_light()
|
||||
pai.extinguish_light()
|
||||
set_light(0)
|
||||
if(pai)
|
||||
pai.extinguish_light()
|
||||
set_light(0)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/painter
|
||||
name = "modular painter"
|
||||
icon = 'icons/obj/painting.dmi'
|
||||
icon_state = "floor_painter"
|
||||
usesound = 'sound/effects/spray2.ogg'
|
||||
flags = CONDUCT | NOBLUDGEON
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
@@ -307,12 +307,18 @@
|
||||
icon_state = "com_headset_alt"
|
||||
item_state = "com_headset_alt"
|
||||
|
||||
/obj/item/radio/headset/ert/alt/solgov
|
||||
name = "\improper Trans-Solar Federation Marine's bowman headset"
|
||||
|
||||
/obj/item/radio/headset/ert/alt/commander
|
||||
name = "ERT commander's bowman headset"
|
||||
desc = "The headset of the boss. Protects ears from flashbangs. Can transmit even if telecomms are down."
|
||||
requires_tcomms = FALSE
|
||||
instant = TRUE
|
||||
|
||||
/obj/item/radio/headset/ert/alt/commander/solgov
|
||||
name = "\improper Trans-Solar Federation Lieutenant's bowman headset"
|
||||
|
||||
/obj/item/radio/headset/centcom
|
||||
name = "centcom officer's bowman headset"
|
||||
desc = "The headset of final authority. Protects ears from flashbangs. Can transmit even if telecomms are down."
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "station intercom (General)"
|
||||
desc = "Talk through this."
|
||||
icon_state = "intercom"
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
anchored = 1
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
canhear_range = 2
|
||||
|
||||
@@ -197,15 +197,15 @@
|
||||
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.window_checks && !valid_window_location(usr.loc, usr.dir))
|
||||
if(R.window_checks && !valid_window_location(get_turf(src), usr.dir))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] won't fit here!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.one_per_turf && (locate(R.result_type) in usr.drop_location()))
|
||||
if(R.one_per_turf && (locate(R.result_type) in get_turf(src)))
|
||||
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.on_floor && !istype(usr.drop_location(), /turf/simulated))
|
||||
if(R.on_floor && !istype(get_turf(src), /turf/simulated))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -215,13 +215,13 @@
|
||||
if(!is_level_reachable(usr.z))
|
||||
to_chat(usr, "<span class='warning'>The energies of this place interfere with the metal shaping!</span>")
|
||||
return
|
||||
if(locate(/obj/structure/cult) in usr.drop_location())
|
||||
if(locate(/obj/structure/cult) in get_turf(src))
|
||||
to_chat(usr, "<span class='warning'>There is a structure here!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.time)
|
||||
to_chat(usr, "<span class='notice'>Building [R.title] ...</span>")
|
||||
if(!do_after(usr, R.time, target = usr))
|
||||
to_chat(usr, "<span class='notice'>Building [R.title]...</span>")
|
||||
if(!do_after(usr, R.time, target = loc))
|
||||
return 0
|
||||
|
||||
if(get_amount() < R.req_amount * multiplier)
|
||||
@@ -229,9 +229,9 @@
|
||||
|
||||
var/atom/O
|
||||
if(R.max_res_amount > 1) //Is it a stack?
|
||||
O = new R.result_type(usr.drop_location(), R.res_amount * multiplier)
|
||||
O = new R.result_type(get_turf(src), R.res_amount * multiplier)
|
||||
else
|
||||
O = new R.result_type(usr.drop_location())
|
||||
O = new R.result_type(get_turf(src))
|
||||
O.setDir(usr.dir)
|
||||
use(R.req_amount * multiplier)
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -0,0 +1,282 @@
|
||||
//Items for nuke theft, supermatter theft traitor objective
|
||||
|
||||
|
||||
// STEALING THE NUKE
|
||||
|
||||
//the nuke core, base item
|
||||
/obj/item/nuke_core
|
||||
name = "plutonium core"
|
||||
desc = "Extremely radioactive. Wear goggles."
|
||||
icon = 'icons/obj/nuke_tools.dmi'
|
||||
icon_state = "plutonium_core"
|
||||
item_state = "plutoniumcore"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
flags_2 = RAD_NO_CONTAMINATE_2 //Don't have the item itself become irradiated when it makes radiation.
|
||||
var/pulse = 0
|
||||
var/cooldown = 0
|
||||
var/pulseicon = "plutonium_core_pulse"
|
||||
|
||||
/obj/item/nuke_core/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/nuke_core/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/nuke_core/attackby(obj/item/nuke_core_container/container, mob/user)
|
||||
if(istype(container))
|
||||
container.load(src, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/nuke_core/process()
|
||||
if(cooldown < world.time - 6 SECONDS)
|
||||
cooldown = world.time
|
||||
flick(pulseicon, src)
|
||||
radiation_pulse(src, 400, 2)
|
||||
|
||||
/obj/item/nuke_core/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is rubbing [src] against [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/nuke_core/plutonium //The steal objective, so it doesnt mess with the SM sliver on pinpointers and objectives
|
||||
|
||||
//nuke core box, for carrying the core
|
||||
/obj/item/nuke_core_container
|
||||
name = "nuke core container"
|
||||
desc = "A solid container for radioactive objects."
|
||||
icon = 'icons/obj/nuke_tools.dmi'
|
||||
icon_state = "core_container_empty"
|
||||
item_state = "metal"
|
||||
var/obj/item/nuke_core/plutonium/core
|
||||
|
||||
/obj/item/nuke_core_container/Destroy()
|
||||
QDEL_NULL(core)
|
||||
return ..()
|
||||
|
||||
/obj/item/nuke_core_container/proc/load(obj/item/nuke_core/plutonium/new_core, mob/user)
|
||||
if(core || !istype(new_core))
|
||||
return
|
||||
new_core.forceMove(src)
|
||||
core = new_core
|
||||
icon_state = "core_container_loaded"
|
||||
to_chat(user, "<span class='warning'>Container is sealing...</span>")
|
||||
addtimer(CALLBACK(src, .proc/seal), 10 SECONDS)
|
||||
|
||||
/obj/item/nuke_core_container/proc/seal()
|
||||
if(!QDELETED(core))
|
||||
STOP_PROCESSING(SSobj, core)
|
||||
icon_state = "core_container_sealed"
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 60, TRUE)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='warning'>[src] is permanently sealed, [core]'s radiation is contained.</span>")
|
||||
|
||||
/obj/item/nuke_core_container/attackby(obj/item/nuke_core/plutonium/core, mob/user)
|
||||
if(!istype(core))
|
||||
return ..()
|
||||
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[core] is stuck to your hand!</span>")
|
||||
return
|
||||
else
|
||||
load(core, user)
|
||||
|
||||
/obj/item/paper/guides/antag/nuke_instructions
|
||||
info = "How to break into a Nanotrasen nuclear device and remove its plutonium core:<br>\
|
||||
<ul>\
|
||||
<li>Use a screwdriver with a very thin tip (provided) to unscrew the terminal's front panel.</li>\
|
||||
<li>Dislodge and remove the front panel with a crowbar.</li>\
|
||||
<li>Cut the inner metal plate with a welding tool.</li>\
|
||||
<li>Pry off the inner plate with a crowbar to expose the radioactive core.</li>\
|
||||
<li>Pull the core out of the nuclear device. </li>\
|
||||
<li>Put the core in the provided container, which will take some time to seal. </li>\
|
||||
<li>???</li>\
|
||||
</ul>"
|
||||
|
||||
// STEALING SUPERMATTER.
|
||||
|
||||
/obj/item/paper/guides/antag/supermatter_sliver
|
||||
info = "How to safely extract a supermatter sliver:<br>\
|
||||
<ul>\
|
||||
<li>Approach an active supermatter crystal with radiation shielded personal protective equipment. DO NOT MAKE PHYSICAL CONTACT.</li>\
|
||||
<li>Use a supermatter scalpel (provided) to slice off a sliver of the crystal.</li>\
|
||||
<li>Use supermatter extraction tongs (also provided) to safely pick up the sliver you sliced off.</li>\
|
||||
<li>Physical contact of any object with the sliver will dust the object, as well as yourself.</li>\
|
||||
<li>Use the tongs to place the sliver into the provided container, which will take some time to seal.</li>\
|
||||
<li>Get the hell out before the crystal delaminates.</li>\
|
||||
<li>???</li>\
|
||||
</ul>"
|
||||
|
||||
/obj/item/nuke_core/supermatter_sliver
|
||||
name = "supermatter sliver"
|
||||
desc = "A tiny, highly volatile sliver of a supermatter crystal. Do not handle without protection!"
|
||||
icon_state = "supermatter_sliver"
|
||||
pulseicon = "supermatter_sliver_pulse"
|
||||
|
||||
/obj/item/nuke_core/supermatter_sliver/attack_tk(mob/user) // no TK dusting memes
|
||||
return
|
||||
|
||||
/obj/item/nuke_core/supermatter_sliver/can_be_pulled(user) // no drag memes
|
||||
return FALSE
|
||||
|
||||
/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/retractor/supermatter))
|
||||
var/obj/item/retractor/supermatter/tongs = I
|
||||
if(tongs.sliver)
|
||||
to_chat(user, "<span class='warning'>[tongs] are already holding a supermatter sliver!</span>")
|
||||
return FALSE
|
||||
forceMove(tongs)
|
||||
tongs.sliver = src
|
||||
tongs.icon_state = "supermatter_tongs_loaded"
|
||||
tongs.item_state = "supermatter_tongs_loaded"
|
||||
to_chat(user, "<span class='notice'>You carefully pick up [src] with [tongs].</span>")
|
||||
else if(istype(I, /obj/item/scalpel/supermatter) || istype(I, /obj/item/nuke_core_container/supermatter)) // we don't want it to dust
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='danger'>As it touches [src], both [src] and [I] burst into dust!</span>")
|
||||
radiation_pulse(user, 100)
|
||||
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/nuke_core/supermatter_sliver/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
if(!isliving(hit_atom))
|
||||
return ..()
|
||||
var/mob/living/victim = hit_atom
|
||||
if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
|
||||
return ..()
|
||||
if(throwingdatum?.thrower)
|
||||
var/mob/user = throwingdatum.thrower
|
||||
add_attack_logs(user, victim, "[victim] consumed by [src] thrown by [user] ")
|
||||
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(user)].")
|
||||
investigate_log("has consumed [key_name(victim)], thrown by [key_name(user)]", "supermatter")
|
||||
else
|
||||
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)] via throw impact.")
|
||||
investigate_log("has consumed [key_name(victim)] via throw impact.", "supermatter")
|
||||
victim.visible_message("<span class='danger'>As [victim] is hit by [src], both flash into dust and silence fills the room...</span>",
|
||||
"<span class='userdanger'>You're hit by [src] and everything suddenly goes silent.\n[src] flashes into dust, and soon as you can register this, you do as well.</span>",
|
||||
"<span class='hear'>Everything suddenly goes silent.</span>")
|
||||
victim.dust()
|
||||
radiation_pulse(src, 500, 2)
|
||||
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/nuke_core/supermatter_sliver/pickup(mob/living/user)
|
||||
..()
|
||||
if(!isliving(user) || user.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
|
||||
return FALSE
|
||||
user.visible_message("<span class='danger'>[user] reaches out and tries to pick up [src]. [user.p_their()] body starts to glow and bursts into flames before flashing into dust!</span>",
|
||||
"<span class='userdanger'>You reach for [src] with your hands. That was dumb.</span>",
|
||||
"<span class='hear'>Everything suddenly goes silent.</span>")
|
||||
radiation_pulse(user, 500, 2)
|
||||
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
|
||||
user.dust()
|
||||
|
||||
/obj/item/nuke_core_container/supermatter
|
||||
name = "supermatter bin"
|
||||
desc = "A tiny receptacle that releases an inert hyper-noblium mix upon sealing, allowing a sliver of a supermatter crystal to be safely stored."
|
||||
var/obj/item/nuke_core/supermatter_sliver/sliver
|
||||
|
||||
/obj/item/nuke_core_container/supermatter/Destroy()
|
||||
QDEL_NULL(sliver)
|
||||
return ..()
|
||||
|
||||
/obj/item/nuke_core_container/supermatter/load(obj/item/retractor/supermatter/I, mob/user)
|
||||
if(!istype(I) || !I.sliver)
|
||||
return
|
||||
I.sliver.forceMove(src)
|
||||
sliver = I.sliver
|
||||
I.sliver = null
|
||||
I.icon_state = "supermatter_tongs"
|
||||
I.item_state = "supermatter_tongs"
|
||||
icon_state = "supermatter_container_loaded"
|
||||
to_chat(user, "<span class='warning'>Container is sealing...</span>")
|
||||
addtimer(CALLBACK(src, .proc/seal), 10 SECONDS)
|
||||
|
||||
/obj/item/nuke_core_container/supermatter/seal()
|
||||
if(!QDELETED(sliver))
|
||||
STOP_PROCESSING(SSobj, sliver)
|
||||
icon_state = "supermatter_container_sealed"
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 60, TRUE)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='warning'>[src] is permanently sealed, [sliver] is safely contained.</span>")
|
||||
|
||||
/obj/item/nuke_core_container/supermatter/attackby(obj/item/retractor/supermatter/tongs, mob/user)
|
||||
if(istype(tongs))
|
||||
//try to load shard into core
|
||||
load(tongs, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/scalpel/supermatter
|
||||
name = "supermatter scalpel"
|
||||
desc = "A scalpel with a fragile tip of condensed hyper-noblium gas, searingly cold to the touch, that can safely shave a sliver off a supermatter crystal."
|
||||
icon = 'icons/obj/nuke_tools.dmi'
|
||||
icon_state = "supermatter_scalpel"
|
||||
toolspeed = 0.5
|
||||
damtype = BURN
|
||||
usesound = 'sound/weapons/bladeslice.ogg'
|
||||
var/uses_left
|
||||
|
||||
/obj/item/scalpel/supermatter/Initialize()
|
||||
. = ..()
|
||||
uses_left = rand(2, 4)
|
||||
|
||||
/obj/item/retractor/supermatter
|
||||
name = "supermatter extraction tongs"
|
||||
desc = "A pair of tongs made from condensed hyper-noblium gas, searingly cold to the touch, that can safely grip a supermatter sliver."
|
||||
icon = 'icons/obj/nuke_tools.dmi'
|
||||
icon_state = "supermatter_tongs"
|
||||
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
|
||||
item_state = "supermatter_tongs"
|
||||
toolspeed = 0.75
|
||||
damtype = BURN
|
||||
var/obj/item/nuke_core/supermatter_sliver/sliver
|
||||
|
||||
/obj/item/retractor/supermatter/Destroy()
|
||||
QDEL_NULL(sliver)
|
||||
return ..()
|
||||
|
||||
/obj/item/retractor/supermatter/afterattack(atom/O, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!sliver)
|
||||
return
|
||||
if(proximity && ismovable(O) && O != sliver)
|
||||
Consume(O, user)
|
||||
|
||||
/obj/item/retractor/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins
|
||||
if(sliver)
|
||||
sliver.forceMove(loc)
|
||||
visible_message("<span class='notice'>[sliver] falls out of [src] as it hits the ground.</span>")
|
||||
sliver = null
|
||||
icon_state = "supermatter_tongs"
|
||||
item_state = "supermatter_tongs"
|
||||
return ..()
|
||||
|
||||
/obj/item/retractor/supermatter/proc/Consume(atom/movable/AM, mob/living/user)
|
||||
if(ismob(AM))
|
||||
if(!isliving(AM))
|
||||
return
|
||||
var/mob/living/victim = AM
|
||||
if(victim.incorporeal_move || victim.status_flags & GODMODE) //try to keep this in sync with supermatter's consume fail conditions
|
||||
return
|
||||
victim.dust()
|
||||
message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)].")
|
||||
investigate_log("has irradiated [key_name(victim)].", "supermatter")
|
||||
else if(istype(AM, /obj/singularity))
|
||||
return
|
||||
else
|
||||
investigate_log("has consumed [AM].", "supermatter")
|
||||
qdel(AM)
|
||||
|
||||
if(user)
|
||||
add_attack_logs(user, AM, "[AM] and [user] consumed by melee attack with [src] by [user]")
|
||||
user.visible_message("<span class='danger'>As [user] touches [AM] with [src], both flash into dust and silence fills the room...</span>",
|
||||
"<span class='userdanger'>You touch [AM] with [src], and everything suddenly goes silent.\n[AM] and [sliver] flash into dust, and soon as you can register this, you do as well.</span>",
|
||||
"<span class='hear'>Everything suddenly goes silent.</span>")
|
||||
user.dust()
|
||||
radiation_pulse(src, 500, 2)
|
||||
playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE)
|
||||
QDEL_NULL(sliver)
|
||||
@@ -27,6 +27,7 @@
|
||||
desc = "A screwdriver with an ultra thin tip."
|
||||
icon_state = "screwdriver_nuke"
|
||||
toolspeed = 0.5
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/screwdriver/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm")
|
||||
qdel(src)
|
||||
if("emp")
|
||||
var/name = prob(50) ? t.name : pick(GLOB.teleportlocs)
|
||||
var/name = prob(50) ? t.name : pick(SSmapping.teleportlocs)
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm")
|
||||
else
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm")
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon_state = "explosive"
|
||||
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate/always)
|
||||
var/detonating = FALSE
|
||||
var/weak = 2
|
||||
var/medium = 0.8
|
||||
var/heavy = 0.4
|
||||
@@ -26,16 +27,20 @@
|
||||
activate("death")
|
||||
|
||||
/obj/item/implant/explosive/activate(cause)
|
||||
if(!cause || !imp_in) return 0
|
||||
if(!cause || !imp_in)
|
||||
return FALSE
|
||||
if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your microbomb implant? This will cause you to explode!", "Microbomb Implant Confirmation", "Yes", "No") != "Yes")
|
||||
return 0
|
||||
return FALSE
|
||||
if(detonating)
|
||||
return FALSE
|
||||
heavy = round(heavy)
|
||||
medium = round(medium)
|
||||
weak = round(weak)
|
||||
to_chat(imp_in, "<span class='notice'>You activate your microbomb implant.</span>")
|
||||
detonating = TRUE
|
||||
to_chat(imp_in, "<span class='danger'>You activate your microbomb implant.</span>")
|
||||
//If the delay is short, just blow up already jeez
|
||||
if(delay <= 7)
|
||||
explosion(src,heavy,medium,weak,weak, flame_range = weak)
|
||||
explosion(src, heavy, medium, weak, weak, flame_range = weak)
|
||||
if(imp_in)
|
||||
imp_in.gib()
|
||||
qdel(src)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
/obj/item/implant/emp/activate()
|
||||
uses--
|
||||
empulse(imp_in, 3, 5, 1)
|
||||
INVOKE_ASYNC(GLOBAL_PROC, .proc/empulse, get_turf(imp_in), 3, 5, 1)
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -61,6 +61,9 @@
|
||||
return
|
||||
if(istype(W, /obj/item))
|
||||
var/obj/item/IW = W
|
||||
if(IW.flags & (ABSTRACT | NODROP | DROPDEL))
|
||||
to_chat(user, "<span class='warning'>You can't put [IW] into [src]!</span>")
|
||||
return
|
||||
if((loadedWeightClass + IW.w_class) > maxWeightClass)
|
||||
to_chat(user, "<span class='warning'>\The [IW] won't fit into \the [src]!</span>")
|
||||
return
|
||||
|
||||
@@ -47,12 +47,12 @@
|
||||
|
||||
var/A
|
||||
|
||||
A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in GLOB.teleportlocs
|
||||
A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in SSmapping.teleportlocs
|
||||
|
||||
if(!A)
|
||||
return
|
||||
|
||||
var/area/thearea = GLOB.teleportlocs[A]
|
||||
var/area/thearea = SSmapping.teleportlocs[A]
|
||||
|
||||
if(user.stat || user.restrained())
|
||||
return
|
||||
|
||||
@@ -584,3 +584,9 @@
|
||||
name = "emergency response team janitor backpack"
|
||||
desc = "A spacious backpack with lots of pockets, worn by janitorial members of a Nanotrasen Emergency Response Team."
|
||||
icon_state = "ert_janitor"
|
||||
|
||||
//Solgov
|
||||
/obj/item/storage/backpack/ert/solgov
|
||||
name = "\improper TSF marine backpack"
|
||||
desc = "A spacious backpack with lots of pockets, worn by marines of the Trans-Solar Federation."
|
||||
icon_state = "ert_solgov"
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
/// No message on putting items in.
|
||||
var/silent = FALSE
|
||||
/// List of objects which this item can store (if set, it can't store anything else)
|
||||
var/list/can_hold = new/list()
|
||||
var/list/can_hold = list()
|
||||
/// List of objects which this item can't store (in effect only if can_hold isn't set)
|
||||
var/list/cant_hold = new/list()
|
||||
var/list/cant_hold = list()
|
||||
/// Max size of objects that this object can store (in effect only if can_hold isn't set)
|
||||
var/max_w_class = WEIGHT_CLASS_SMALL
|
||||
/// The sum of the w_classes of all the items in this storage item.
|
||||
@@ -42,6 +42,9 @@
|
||||
/// How much of the stack item do you get.
|
||||
var/foldable_amt = 0
|
||||
|
||||
/// Lazy list of mobs which are currently viewing the storage inventory.
|
||||
var/list/mobs_viewing
|
||||
|
||||
/obj/item/storage/Initialize(mapload)
|
||||
. = ..()
|
||||
can_hold = typecacheof(can_hold)
|
||||
@@ -73,6 +76,15 @@
|
||||
closer.plane = ABOVE_HUD_PLANE
|
||||
orient2hud()
|
||||
|
||||
/obj/item/storage/Destroy()
|
||||
for(var/obj/O in contents)
|
||||
O.mouse_opacity = initial(O.mouse_opacity)
|
||||
|
||||
QDEL_NULL(boxes)
|
||||
QDEL_NULL(closer)
|
||||
LAZYCLEARLIST(mobs_viewing)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/MouseDrop(obj/over_object)
|
||||
if(!ismob(usr)) //so monkeys can take off their backpacks -- Urist
|
||||
return
|
||||
@@ -177,11 +189,13 @@
|
||||
user.client.screen += closer
|
||||
user.client.screen += contents
|
||||
user.s_active = src
|
||||
LAZYADDOR(mobs_viewing, user)
|
||||
|
||||
/**
|
||||
* Hides the current container interface from `user`.
|
||||
*/
|
||||
/obj/item/storage/proc/hide_from(mob/user)
|
||||
LAZYREMOVE(mobs_viewing, user) // Remove clientless mobs too
|
||||
if(!user.client)
|
||||
return
|
||||
user.client.screen -= boxes
|
||||
@@ -190,6 +204,16 @@
|
||||
if(user.s_active == src)
|
||||
user.s_active = null
|
||||
|
||||
/**
|
||||
* Checks all mobs currently viewing the storage inventory, and hides it if they shouldn't be able to see it.
|
||||
*/
|
||||
/obj/item/storage/proc/update_viewers()
|
||||
for(var/_M in mobs_viewing)
|
||||
var/mob/M = _M
|
||||
if(!QDELETED(M) && M.s_active == src && (M in range(1, loc)))
|
||||
continue
|
||||
hide_from(M)
|
||||
|
||||
/obj/item/storage/proc/open(mob/user)
|
||||
if(use_sound)
|
||||
playsound(loc, use_sound, 50, TRUE, -5)
|
||||
@@ -374,6 +398,12 @@
|
||||
prevent_warning = TRUE
|
||||
I.forceMove(src)
|
||||
I.on_enter_storage(src)
|
||||
|
||||
for(var/_M in mobs_viewing)
|
||||
var/mob/M = _M
|
||||
if((M.s_active == src) && M.client)
|
||||
M.client.screen += I
|
||||
|
||||
if(usr)
|
||||
if(usr.client && usr.s_active != src)
|
||||
usr.client.screen -= I
|
||||
@@ -412,7 +442,8 @@
|
||||
var/obj/item/storage/fancy/F = src
|
||||
F.update_icon(TRUE)
|
||||
|
||||
for(var/mob/M in range(1, loc))
|
||||
for(var/_M in mobs_viewing)
|
||||
var/mob/M = _M
|
||||
if((M.s_active == src) && M.client)
|
||||
M.client.screen -= I
|
||||
|
||||
@@ -498,6 +529,10 @@
|
||||
close(M)
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/storage/equipped(mob/user, slot, initial)
|
||||
. = ..()
|
||||
update_viewers()
|
||||
|
||||
/obj/item/storage/attack_ghost(mob/user)
|
||||
if(isobserver(user))
|
||||
// Revenants don't get to play with the toys.
|
||||
@@ -539,14 +574,6 @@
|
||||
/obj/item/storage/proc/populate_contents()
|
||||
return // Override
|
||||
|
||||
/obj/item/storage/Destroy()
|
||||
for(var/obj/O in contents)
|
||||
O.mouse_opacity = initial(O.mouse_opacity)
|
||||
|
||||
QDEL_NULL(boxes)
|
||||
QDEL_NULL(closer)
|
||||
return ..()
|
||||
|
||||
/obj/item/storage/emp_act(severity)
|
||||
..()
|
||||
for(var/I in contents)
|
||||
|
||||
@@ -309,3 +309,24 @@ To apply, hold the injector a short distance away from the outer thigh before ap
|
||||
new /obj/item/reagent_containers/syringe/capulettium_plus(src)
|
||||
new /obj/item/reagent_containers/syringe/sarin(src)
|
||||
new /obj/item/reagent_containers/syringe/pancuronium(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/nuke
|
||||
name = "box" //Bit of stealth, since you spawn with it
|
||||
desc = "It's just an ordinary box."
|
||||
icon_state = "box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/nuke/populate_contents()
|
||||
new /obj/item/screwdriver/nuke(src)
|
||||
new /obj/item/nuke_core_container(src)
|
||||
new /obj/item/paper/guides/antag/nuke_instructions(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/supermatter
|
||||
name = "box"
|
||||
desc = "It's just an ordinary box."
|
||||
icon_state = "box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/supermatter/populate_contents()
|
||||
new /obj/item/scalpel/supermatter(src)
|
||||
new /obj/item/retractor/supermatter(src)
|
||||
new /obj/item/nuke_core_container/supermatter(src)
|
||||
new /obj/item/paper/guides/antag/supermatter_sliver(src)
|
||||
|
||||
@@ -71,18 +71,18 @@
|
||||
icon_opened = "fireclosetopen"
|
||||
|
||||
/obj/structure/closet/firecloset/populate_contents()
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/tank/internals/oxygen/red(src)
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/head/hardhat/red(src)
|
||||
|
||||
/obj/structure/closet/firecloset/full/populate_contents()
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/flashlight(src)
|
||||
new /obj/item/tank/internals/oxygen/red(src)
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/head/hardhat/red(src)
|
||||
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
trigger_alarm()
|
||||
|
||||
emagged = TRUE
|
||||
toggle_lock()
|
||||
|
||||
/obj/structure/displaycase/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -110,12 +111,12 @@
|
||||
/obj/structure/displaycase/attackby(obj/item/I, mob/user, params)
|
||||
if(I.GetID() && !broken && openable)
|
||||
if(allowed(user) || emagged)
|
||||
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
|
||||
toggle_lock(user)
|
||||
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
|
||||
toggle_lock()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
else if(open && !showpiece)
|
||||
if(user.drop_item())
|
||||
if(!(I.flags & (ABSTRACT | DROPDEL)) && user.drop_item())
|
||||
I.forceMove(src)
|
||||
showpiece = I
|
||||
to_chat(user, "<span class='notice'>You put [I] on display</span>")
|
||||
@@ -151,14 +152,14 @@
|
||||
if(!I.use_tool(src, user, 20, volume = I.tool_volume))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You [open ? "close":"open"] [src].</span>")
|
||||
toggle_lock(user)
|
||||
toggle_lock()
|
||||
|
||||
/obj/structure/displaycase/welder_act(mob/user, obj/item/I)
|
||||
. = TRUE
|
||||
if(default_welder_repair(user, I))
|
||||
broken = FALSE
|
||||
|
||||
/obj/structure/displaycase/proc/toggle_lock(mob/user)
|
||||
/obj/structure/displaycase/proc/toggle_lock()
|
||||
open = !open
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
if(GIRDER_DISASSEMBLED)
|
||||
. += "<span class='notice'>[src] is disassembled! You probably shouldn't be able to see this examine message.</span>"
|
||||
|
||||
/obj/structre/girder/detailed_examine()
|
||||
/obj/structure/girder/detailed_examine()
|
||||
return "Use metal sheets on this to build a normal wall. Adding plasteel instead will make a reinforced wall.<br>\
|
||||
A false wall can be made by using a crowbar on this girder, and then adding metal or plasteel.<br>\
|
||||
You can dismantle the girder with a wrench."
|
||||
|
||||
@@ -46,9 +46,16 @@
|
||||
/obj/structure/inflatable/CanAtmosPass(turf/T)
|
||||
return !density
|
||||
|
||||
/obj/structure/inflatable/attack_hand(mob/user as mob)
|
||||
/obj/structure/inflatable/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/inflatable/attackby(obj/item/I, mob/living/user, params)
|
||||
if(I.sharp || is_type_in_typecache(I, GLOB.pointed_types))
|
||||
user.do_attack_animation(src, used_item = I)
|
||||
deconstruct(FALSE)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/structure/inflatable/AltClick()
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
|
||||
@@ -203,6 +203,7 @@
|
||||
windoor.req_one_access = electronics.selected_accesses
|
||||
else
|
||||
windoor.req_access = electronics.selected_accesses
|
||||
windoor.unres_sides = electronics.unres_access_from
|
||||
windoor.electronics = src.electronics
|
||||
electronics.forceMove(windoor)
|
||||
electronics = null
|
||||
|
||||
@@ -702,21 +702,17 @@
|
||||
reinf = FALSE
|
||||
var/made_glow = FALSE
|
||||
|
||||
/obj/structure/window/reinforced/clockwork/Initialize(mapload, direct)
|
||||
. = ..()
|
||||
if(fulltile)
|
||||
made_glow = TRUE
|
||||
if(fulltile)
|
||||
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
|
||||
|
||||
/obj/structure/window/reinforced/clockwork/spawnDebris(location)
|
||||
. = list()
|
||||
. += new /obj/item/stack/tile/brass(location, (fulltile ? 2 : 1))
|
||||
|
||||
/obj/structure/window/reinforced/clockwork/setDir(direct)
|
||||
if(!made_glow)
|
||||
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
|
||||
E.setDir(direct)
|
||||
if(fulltile)
|
||||
new /obj/effect/temp_visual/ratvar/window(get_turf(src))
|
||||
else
|
||||
var/obj/effect/E = new /obj/effect/temp_visual/ratvar/window/single(get_turf(src))
|
||||
E.setDir(direct)
|
||||
made_glow = TRUE
|
||||
..()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user