mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 07:27:57 +01:00
@@ -6,6 +6,7 @@
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
burn_state = LAVA_PROOF | FIRE_PROOF
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
can_be_hit = FALSE
|
||||
|
||||
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
return
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
victim.apply_effect(radiation_amount, IRRADIATE, 0)
|
||||
if(ishuman(victim))
|
||||
var/mob/living/carbon/human/V = victim
|
||||
if(NO_DNA in V.species.species_traits)
|
||||
if(NO_DNA in V.dna.species.species_traits)
|
||||
return
|
||||
randmutb(victim)
|
||||
domutcheck(victim ,null)
|
||||
|
||||
@@ -26,12 +26,9 @@
|
||||
|
||||
/obj/effect/portal/Destroy()
|
||||
portals -= src
|
||||
if(istype(creator, /obj/item/hand_tele))
|
||||
var/obj/item/hand_tele/O = creator
|
||||
O.active_portals--
|
||||
else if(istype(creator, /obj/item/gun/energy/wormhole_projector))
|
||||
var/obj/item/gun/energy/wormhole_projector/P = creator
|
||||
P.portal_destroyed(src)
|
||||
if(istype(creator, /obj))
|
||||
var/obj/O = creator
|
||||
O.portal_destroyed(src)
|
||||
creator = null
|
||||
target = null
|
||||
return ..()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
// This needs to come before the initialization wave because
|
||||
// the thing it creates might need to be initialized too
|
||||
/obj/effect/spawner/random_barrier/New()
|
||||
/obj/effect/spawner/random_barrier/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
|
||||
@@ -2,27 +2,36 @@
|
||||
name = "random spawners"
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "x2"
|
||||
color = "#00FF00"
|
||||
var/list/result = list(
|
||||
/turf/simulated/floor/plasteel = 1,
|
||||
/turf/simulated/floor/plating = 1,
|
||||
/obj/effect/decal/cleanable/blood/splatter = 1,
|
||||
/obj/effect/decal/cleanable/blood/oil = 1,
|
||||
/obj/effect/decal/cleanable/fungus = 1)
|
||||
var/spawn_inside = null
|
||||
|
||||
// This needs to come before the initialization wave because
|
||||
// the thing it creates might need to be initialized too
|
||||
// This needs to use New() instead of Initialize() because the thing it creates might need to be initialized too
|
||||
/obj/effect/spawner/random_spawners/New()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
log_runtime(EXCEPTION("Spawner placed in nullspace!"), src)
|
||||
return
|
||||
randspawn(T)
|
||||
|
||||
/obj/effect/spawner/random_spawners/proc/randspawn(turf/T)
|
||||
var/thing_to_place = pickweight(result)
|
||||
if(ispath(thing_to_place, /turf))
|
||||
if(ispath(thing_to_place, /datum/nothing))
|
||||
// Nothing.
|
||||
else if(ispath(thing_to_place, /turf))
|
||||
T.ChangeTurf(thing_to_place)
|
||||
else
|
||||
new thing_to_place(T)
|
||||
if(ispath(spawn_inside, /obj))
|
||||
var/obj/O = new thing_to_place(T)
|
||||
var/obj/E = new spawn_inside(T)
|
||||
O.forceMove(E)
|
||||
else
|
||||
new thing_to_place(T)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spawner/random_spawners/blood_maybe
|
||||
@@ -108,3 +117,195 @@
|
||||
result = list(
|
||||
/turf/simulated/wall = 1,
|
||||
/obj/effect/decal/cleanable/fungus = 7)
|
||||
|
||||
|
||||
|
||||
// z6 DEPOT SPAWNERS
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate
|
||||
|
||||
|
||||
|
||||
// Turrets
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/turret
|
||||
name = "50pc int turret"
|
||||
icon_state = "x"
|
||||
result = list(/datum/nothing = 1,
|
||||
/obj/machinery/porta_turret/syndicate/interior = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/turret/external
|
||||
name = "50pc ext turret"
|
||||
result = list(/datum/nothing = 1,
|
||||
/obj/machinery/porta_turret/syndicate/exterior = 1)
|
||||
|
||||
|
||||
// Mobs
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/mob
|
||||
name = "50pc melee syndimob"
|
||||
icon_state = "x"
|
||||
color = "#333333"
|
||||
result = list(/datum/nothing = 1,
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot = 1)
|
||||
|
||||
|
||||
// Traps
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap
|
||||
icon_state = "x"
|
||||
color = "#000000"
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/pizzabomb
|
||||
name = "50pc trap pizza"
|
||||
result = list(/obj/item/pizzabox/meat = 1,
|
||||
/obj/item/pizza_bomb/autoarm = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/medbot
|
||||
name = "50pc trap medibot"
|
||||
result = list(/datum/nothing = 1,
|
||||
/mob/living/simple_animal/bot/medbot/syndicate/emagged = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/mine
|
||||
name = "50pc trap landmine"
|
||||
result = list(/datum/nothing = 1,
|
||||
/obj/effect/mine/explosive = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/trap/documents
|
||||
name = "66pc trapped documents"
|
||||
result = list(/obj/item/documents/syndicate/yellow = 1,
|
||||
/obj/item/documents/syndicate/yellow/trapped = 1)
|
||||
|
||||
|
||||
|
||||
|
||||
// Loot
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/loot
|
||||
name = "common loot"
|
||||
icon_state = "x3"
|
||||
spawn_inside = /obj/structure/closet/secure_closet/syndicate/depot
|
||||
// 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,
|
||||
/obj/item/toy/syndicateballoon = 1,
|
||||
/obj/item/soap/syndie = 1,
|
||||
/obj/item/clothing/under/syndicate = 1,
|
||||
/obj/item/clothing/under/syndicate/tacticool = 1,
|
||||
/obj/item/clothing/mask/gas/syndicate = 1,
|
||||
/obj/item/suppressor = 1,
|
||||
/obj/item/coin/antagtoken/syndicate = 1,
|
||||
/obj/item/storage/box/syndie_kit/cutouts = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/loot/level2
|
||||
name = "rare loot"
|
||||
// Loot schema: space gear, basic armor, basic ammo (10mm, rcd), drugs, more dangerous/useful gimmick items, lower-value minerals
|
||||
result = list(/datum/nothing = 27,
|
||||
/obj/item/storage/box/syndie_kit/space = 1,
|
||||
/obj/item/storage/box/syndie_kit/hardsuit = 1,
|
||||
/obj/item/clothing/shoes/magboots/syndie = 1,
|
||||
/obj/item/clothing/suit/armor/vest/combat = 1,
|
||||
/obj/item/ammo_box/magazine/m10mm = 1,
|
||||
/obj/item/storage/pill_bottle/happy = 1,
|
||||
/obj/item/storage/pill_bottle/zoom = 1,
|
||||
/obj/item/storage/pill_bottle/random_drug_bottle = 2,
|
||||
/obj/item/storage/backpack/duffel/syndie/surgery = 1,
|
||||
/obj/item/clothing/shoes/syndigaloshes = 1,
|
||||
/obj/item/storage/belt/military = 1,
|
||||
/obj/item/clothing/under/chameleon = 1,
|
||||
/obj/item/storage/backpack/satchel_flat = 1,
|
||||
/obj/item/rcd = 1,
|
||||
/obj/item/rcd_ammo = 1,
|
||||
/obj/item/stamp/chameleon = 1,
|
||||
/obj/item/flag/chameleon = 1,
|
||||
/obj/item/lighter/zippo/gonzofist = 1,
|
||||
/obj/item/clothing/gloves/fingerless/rapid = 1,
|
||||
/obj/item/grenade/spawnergrenade/manhacks = 1,
|
||||
/obj/item/grenade/syndieminibomb = 1,
|
||||
/obj/item/storage/box/syndie_kit/throwing_weapons = 1,
|
||||
/obj/item/pen/edagger = 1,
|
||||
/obj/item/stack/sheet/mineral/plasma{amount = 20} = 1,
|
||||
/obj/item/stack/sheet/mineral/silver{amount = 20} = 1,
|
||||
/obj/item/stack/sheet/mineral/gold{amount = 20} = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/loot/level3
|
||||
name = "officer loot"
|
||||
// Loot schema: medkits, very useful devices (jammer, illegal upgrade, RCD), better quality ammo (AP, fire), basic weapons (pistol, empgrenade), high value ores (diamond, uranium)
|
||||
result = list(/datum/nothing = 25,
|
||||
/obj/item/jammer = 1,
|
||||
/obj/item/storage/firstaid = 1,
|
||||
/obj/item/storage/box/syndie_kit/bonerepair = 1,
|
||||
/obj/item/gun/projectile/automatic/pistol = 1,
|
||||
/obj/item/stock_parts/cell/bluespace = 1,
|
||||
/obj/item/card/emag = 1,
|
||||
/obj/item/encryptionkey/binary = 1,
|
||||
/obj/item/pinpointer/advpinpointer = 1,
|
||||
/obj/item/borg/upgrade/vtec = 1,
|
||||
/obj/item/borg/upgrade/syndicate = 1,
|
||||
/obj/item/borg/upgrade/selfrepair = 1,
|
||||
/obj/item/stack/sheet/mineral/diamond{amount = 10} = 1,
|
||||
/obj/item/stack/sheet/mineral/uranium{amount = 10} = 1,
|
||||
/obj/item/clothing/shoes/magboots/syndie/advance = 1,
|
||||
/obj/item/grenade/empgrenade = 1,
|
||||
/obj/item/grenade/clown_grenade = 1,
|
||||
/obj/item/grenade/spawnergrenade/feral_cats = 1,
|
||||
/obj/item/ammo_box/magazine/m10mm/ap = 1,
|
||||
/obj/item/ammo_box/magazine/m10mm/fire = 1,
|
||||
/obj/item/ammo_box/magazine/m10mm/hp = 1,
|
||||
/obj/item/rad_laser = 1,
|
||||
/obj/item/storage/box/syndie_kit/emp = 1,
|
||||
/obj/item/batterer = 1,
|
||||
/obj/item/toy/carpplushie/dehy_carp = 1,
|
||||
/obj/item/clothing/glasses/hud/security/chameleon = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/loot/level4
|
||||
name = "armory loot"
|
||||
// Loot schema: high-power weapons (m90, esword, ebow, revolver), devices that negate depot challenges (thermal glasses, chameleon device), explosives
|
||||
result = list(/obj/item/gun/projectile/automatic/c20r = 1,
|
||||
/obj/item/gun/projectile/automatic/m90 = 1,
|
||||
/obj/item/gun/projectile/automatic/sniper_rifle/syndicate = 1,
|
||||
/obj/item/melee/energy/sword/saber = 1,
|
||||
/obj/item/gun/energy/kinetic_accelerator/crossbow = 1,
|
||||
/obj/item/gun/projectile/revolver = 1,
|
||||
/obj/item/clothing/gloves/color/yellow/power = 1,
|
||||
/obj/item/twohanded/chainsaw = 1,
|
||||
/obj/item/bee_briefcase = 1,
|
||||
/obj/item/twohanded/energizedfireaxe = 1,
|
||||
/obj/item/clothing/glasses/thermal = 1,
|
||||
/obj/item/chameleon = 1,
|
||||
/obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1,
|
||||
/obj/item/storage/box/syndie_kit/atmosgasgrenades = 1,
|
||||
/obj/item/grenade/plastic/x4 = 1)
|
||||
|
||||
|
||||
// Layout-affecting spawns
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/layout
|
||||
icon_state = "x2"
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/layout/door
|
||||
name = "50pc door 25pc falsewall 25pc wall"
|
||||
result = list(/obj/machinery/door/airlock/hatch/syndicate = 6,
|
||||
/turf/simulated/wall/r_wall = 2,
|
||||
/obj/structure/falsewall/reinforced = 2)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/layout/door/secret
|
||||
name = "50pc falsewall 50pc wall"
|
||||
result = list(/turf/simulated/wall/r_wall = 1,
|
||||
/obj/structure/falsewall/reinforced = 1)
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/layout/door/vault
|
||||
name = "60pc vaultdoor 20pc falsewall 20pc wall"
|
||||
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 6,
|
||||
/turf/simulated/wall/r_wall = 2,
|
||||
/obj/structure/falsewall/reinforced = 2)
|
||||
|
||||
|
||||
/obj/effect/spawner/random_spawners/syndicate/layout/spacepod
|
||||
name = "50pc loot spacepod"
|
||||
result = list(/obj/spacepod/syndi = 1,
|
||||
/obj/spacepod/syndi/unlocked = 1)
|
||||
@@ -8,33 +8,34 @@
|
||||
anchored = 1 // No sliding out while you prime
|
||||
|
||||
/obj/effect/spawner/window/Initialize()
|
||||
..()
|
||||
spawn(0)
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/obj/structure/grille/G in get_turf(src))
|
||||
// Complain noisily
|
||||
log_runtime(EXCEPTION("Extra grille on turf: ([T.x],[T.y],[T.z])"), src)
|
||||
qdel(G) //just in case mappers don't know what they are doing
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/obj/structure/grille/G in get_turf(src))
|
||||
// Complain noisily
|
||||
log_runtime(EXCEPTION("Extra grille on turf: ([T.x],[T.y],[T.z])"), src)
|
||||
qdel(G) //just in case mappers don't know what they are doing
|
||||
|
||||
if(!useFull)
|
||||
for(var/cdir in cardinal)
|
||||
for(var/obj/effect/spawner/window/WS in get_step(src,cdir))
|
||||
cdir = null
|
||||
break
|
||||
if(!cdir) continue
|
||||
var/obj/structure/window/WI = new windowtospawn(get_turf(src))
|
||||
WI.dir = cdir
|
||||
else
|
||||
var/obj/structure/window/W = new windowtospawn(get_turf(src))
|
||||
W.dir = SOUTHWEST
|
||||
if(!useFull)
|
||||
for(var/cdir in cardinal)
|
||||
for(var/obj/effect/spawner/window/WS in get_step(src,cdir))
|
||||
cdir = null
|
||||
break
|
||||
if(!cdir) continue
|
||||
var/obj/structure/window/WI = new windowtospawn(get_turf(src))
|
||||
WI.dir = cdir
|
||||
else
|
||||
var/obj/structure/window/W = new windowtospawn(get_turf(src))
|
||||
W.dir = SOUTHWEST
|
||||
|
||||
if(useGrille)
|
||||
new /obj/structure/grille(get_turf(src))
|
||||
if(useGrille)
|
||||
new /obj/structure/grille(get_turf(src))
|
||||
|
||||
src.air_update_turf(1) //atmos can pass otherwise
|
||||
|
||||
spawn(10)
|
||||
qdel(src)
|
||||
src.air_update_turf(1) //atmos can pass otherwise
|
||||
// Give some time for nearby window spawners to initialize
|
||||
spawn(10)
|
||||
qdel(src)
|
||||
// why is this line a no-op
|
||||
// QDEL_IN(src, 10)
|
||||
|
||||
|
||||
/obj/effect/spawner/window/reinforced
|
||||
|
||||
+13
-11
@@ -15,6 +15,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
var/inhand_x_dimension = 32
|
||||
var/inhand_y_dimension = 32
|
||||
|
||||
can_be_hit = FALSE
|
||||
|
||||
var/r_speed = 1.0
|
||||
var/health = null
|
||||
var/hitsound = null
|
||||
@@ -277,25 +279,25 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
// Due to storage type consolidation this should get used more now.
|
||||
// I have cleaned it up a little, but it could probably use more. -Sayu
|
||||
/obj/item/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W,/obj/item/storage))
|
||||
var/obj/item/storage/S = W
|
||||
/obj/item/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/storage))
|
||||
var/obj/item/storage/S = I
|
||||
if(S.use_to_pickup)
|
||||
if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one.
|
||||
if(isturf(src.loc))
|
||||
if(isturf(loc))
|
||||
var/list/rejections = list()
|
||||
var/success = 0
|
||||
var/failure = 0
|
||||
|
||||
for(var/obj/item/I in src.loc)
|
||||
if(I.type in rejections) // To limit bag spamming: any given type only complains once
|
||||
for(var/obj/item/IT in loc)
|
||||
if(IT.type in rejections) // To limit bag spamming: any given type only complains once
|
||||
continue
|
||||
if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no
|
||||
rejections += I.type // therefore full bags are still a little spammy
|
||||
if(!S.can_be_inserted(IT)) // Note can_be_inserted still makes noise when the answer is no
|
||||
rejections += IT.type // therefore full bags are still a little spammy
|
||||
failure = 1
|
||||
continue
|
||||
success = 1
|
||||
S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
|
||||
S.handle_item_insertion(IT, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
|
||||
if(success && !failure)
|
||||
to_chat(user, "<span class='notice'>You put everything in [S].</span>")
|
||||
else if(success)
|
||||
@@ -305,8 +307,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
else if(S.can_be_inserted(src))
|
||||
S.handle_item_insertion(src)
|
||||
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(prob(final_block_chance))
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if((HULK in H.mutations) || (NOGUNS in H.species.species_traits))
|
||||
if((HULK in H.mutations) || (NOGUNS in H.dna.species.species_traits))
|
||||
user << "<span class='warning'>Your fingers can't press the button!</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/abductor/H = user
|
||||
if(H && H.mind.abductor)
|
||||
if(isabductor(H))
|
||||
to_chat(user, "<span class='warning'>Megaphones can't project psionic communication!</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
@@ -59,6 +59,7 @@
|
||||
|
||||
/obj/item/megaphone/proc/saymsg(mob/living/user as mob, message)
|
||||
audible_message("<span class='game say'><span class='name'>[user]</span> broadcasts, <span class='reallybig'>\"[message]\"</span></span>", hearing_distance = 14)
|
||||
log_say(message, user)
|
||||
for(var/obj/O in oview(14, get_turf(src)))
|
||||
O.hear_talk(user, "<span class='reallybig'>[message]</span>")
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/pizza_bomb
|
||||
name = "pizza box"
|
||||
desc = "A box suited for pizzas."
|
||||
icon = 'icons/obj/food/food.dmi'
|
||||
icon = 'icons/obj/food/pizza.dmi'
|
||||
icon_state = "pizzabox1"
|
||||
var/timer = 10 //Adjustable timer
|
||||
var/timer_set = 0
|
||||
@@ -98,4 +98,8 @@
|
||||
|
||||
/obj/item/pizza_bomb/New()
|
||||
..()
|
||||
correct_wire = pick(wires)
|
||||
correct_wire = pick(wires)
|
||||
|
||||
/obj/item/pizza_bomb/autoarm
|
||||
timer_set = 1
|
||||
timer = 10
|
||||
@@ -54,9 +54,15 @@
|
||||
name = "suspicious beacon"
|
||||
desc = "A label on it reads: <i>Activate to have a singularity beacon teleported to your location</i>."
|
||||
origin_tech = "bluespace=6;syndicate=5"
|
||||
syndicate = 1
|
||||
syndicate = TRUE
|
||||
var/obj/machinery/computer/syndicate_depot/teleporter/mycomputer
|
||||
|
||||
/obj/item/radio/beacon/syndicate/attack_self(mob/user as mob)
|
||||
/obj/item/radio/beacon/syndicate/Destroy()
|
||||
if(mycomputer)
|
||||
mycomputer.mybeacon = null
|
||||
return ..()
|
||||
|
||||
/obj/item/radio/beacon/syndicate/attack_self(mob/user)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>Locked In</span>")
|
||||
new /obj/machinery/power/singularity_beacon/syndicate( user.loc )
|
||||
@@ -69,7 +75,7 @@
|
||||
desc = "A label on it reads: <i>Warning: Activating this device will send a high-ordinance explosive to your location</i>."
|
||||
origin_tech = "bluespace=5;syndicate=5"
|
||||
|
||||
/obj/item/radio/beacon/syndicate/bomb/attack_self(mob/user as mob)
|
||||
/obj/item/radio/beacon/syndicate/bomb/attack_self(mob/user)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>Locked In</span>")
|
||||
new /obj/machinery/syndicatebomb( user.loc )
|
||||
|
||||
@@ -27,3 +27,24 @@
|
||||
name = "'Blue' secret documents"
|
||||
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Blue\"."
|
||||
icon_state = "docs_blue"
|
||||
|
||||
/obj/item/documents/syndicate/yellow
|
||||
name = "'Yellow' secret documents"
|
||||
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Yellow\"."
|
||||
icon_state = "docs_yellow"
|
||||
|
||||
/obj/item/documents/syndicate/yellow/trapped
|
||||
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Yellow\", and have a thin film of clear material covering their surface."
|
||||
var/poison_type = "amanitin"
|
||||
var/poison_dose = 20
|
||||
var/poison_total = 60
|
||||
|
||||
/obj/item/documents/syndicate/yellow/trapped/pickup(user)
|
||||
if(ishuman(user) && poison_total > 0)
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
if(!istype(G) || G.transfer_prints)
|
||||
H.reagents.add_reagent(poison_type, poison_dose)
|
||||
poison_total -= poison_dose
|
||||
add_attack_logs(src, user, "Picked up [src], the trapped syndicate documents")
|
||||
..()
|
||||
@@ -130,8 +130,7 @@
|
||||
|
||||
/obj/item/storage/pill_bottle/random_meds/New()
|
||||
..()
|
||||
var/i = 1
|
||||
while(i < storage_slots)
|
||||
for(var/i in 1 to storage_slots)
|
||||
var/list/possible_medicines = standard_medicines.Copy()
|
||||
if(prob(50))
|
||||
possible_medicines += rare_medicines.Copy()
|
||||
@@ -144,7 +143,6 @@
|
||||
P.reagents.add_reagent(R, rand(2, 5)*10)
|
||||
P.name = "Unlabelled Pill"
|
||||
P.desc = "Something about this pill entices you to try it, against your better judgement."
|
||||
i++
|
||||
pixel_x = rand(-10, 10)
|
||||
pixel_y = rand(-10, 10)
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
var/self_delay = 20
|
||||
var/unique_handling = 0 //some things give a special prompt, do we want to bypass some checks in parent?
|
||||
var/stop_bleeding = 0
|
||||
var/healverb = "bandage"
|
||||
|
||||
/obj/item/stack/medical/attack(mob/living/M, mob/user)
|
||||
if(!iscarbon(M) && !isanimal(M))
|
||||
@@ -77,6 +78,42 @@
|
||||
"<span class='green'>You apply [src] on [M].</span>")
|
||||
use(1)
|
||||
|
||||
/obj/item/stack/medical/proc/heal(mob/living/M, mob/user)
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||
user.visible_message("<span class='green'>[user] [healverb]s the wounds on [H]'s [affecting.name].</span>", \
|
||||
"<span class='green'>You [healverb] the wounds on [H]'s [affecting.name].</span>" )
|
||||
|
||||
var/rembrute = max(0, heal_brute - affecting.brute_dam) // Maxed with 0 since heal_damage let you pass in a negative value
|
||||
var/remburn = max(0, heal_burn - affecting.burn_dam) // And deduct it from their health (aka deal damage)
|
||||
var/nrembrute = rembrute
|
||||
var/nremburn = remburn
|
||||
affecting.heal_damage(heal_brute, heal_burn)
|
||||
var/list/achildlist
|
||||
if(!isnull(affecting.children))
|
||||
achildlist = affecting.children.Copy()
|
||||
var/parenthealed = FALSE
|
||||
while(rembrute + remburn > 0) // Don't bother if there's not enough leftover heal
|
||||
var/obj/item/organ/external/E
|
||||
if(LAZYLEN(achildlist))
|
||||
E = pick_n_take(achildlist) // Pick a random children and then remove it from the list
|
||||
else if(affecting.parent && !parenthealed) // If there's a parent and no healing attempt was made on it
|
||||
E = affecting.parent
|
||||
parenthealed = TRUE
|
||||
else
|
||||
break // If the organ have no child left and no parent / parent healed, break
|
||||
if(E.status & ORGAN_ROBOT || E.open) // Ignore robotic or open limb
|
||||
continue
|
||||
else if(!E.brute_dam && !E.burn_dam) // Ignore undamaged limb
|
||||
continue
|
||||
nrembrute = max(0, rembrute - E.brute_dam) // Deduct the healed damage from the remain
|
||||
nremburn = max(0, remburn - E.burn_dam)
|
||||
E.heal_damage(rembrute, remburn)
|
||||
rembrute = nrembrute
|
||||
remburn = nremburn
|
||||
user.visible_message("<span class='green'>[user] [healverb]s the wounds on [H]'s [E.name] with the remaining medication.</span>", \
|
||||
"<span class='green'>You [healverb] the wounds on [H]'s [E.name] with the remaining medication.</span>" )
|
||||
|
||||
//Bruise Packs//
|
||||
|
||||
/obj/item/stack/medical/bruise_pack
|
||||
@@ -98,13 +135,12 @@
|
||||
if(affecting.open == 0)
|
||||
affecting.germ_level = 0
|
||||
|
||||
user.visible_message("<span class='green'>[user] bandages the wounds on [H]'s [affecting.name].</span>", \
|
||||
"<span class='green'>You bandage the wounds on [H]'s [affecting.name].</span>" )
|
||||
|
||||
if(stop_bleeding)
|
||||
if(!H.bleedsuppress) //so you can't stack bleed suppression
|
||||
H.suppress_bloodloss(stop_bleeding)
|
||||
affecting.heal_damage(heal_brute, heal_burn)
|
||||
|
||||
heal(H, user)
|
||||
|
||||
H.UpdateDamageIcon()
|
||||
use(1)
|
||||
else
|
||||
@@ -131,6 +167,7 @@
|
||||
singular_name = "ointment"
|
||||
icon_state = "ointment"
|
||||
origin_tech = "biotech=2"
|
||||
healverb = "salve"
|
||||
|
||||
/obj/item/stack/medical/ointment/attack(mob/living/M, mob/user)
|
||||
if(..())
|
||||
@@ -143,9 +180,8 @@
|
||||
if(affecting.open == 0)
|
||||
affecting.germ_level = 0
|
||||
|
||||
user.visible_message("<span class='green'>[user] salves the wounds on [H]'s [affecting.name].</span>", \
|
||||
"<span class='green'>You salve the wounds on [H]'s [affecting.name].</span>" )
|
||||
affecting.heal_damage(heal_brute, heal_burn)
|
||||
heal(H, user)
|
||||
|
||||
H.UpdateDamageIcon()
|
||||
use(1)
|
||||
else
|
||||
|
||||
@@ -362,7 +362,6 @@
|
||||
desc = "Mini-Mecha action figure! Collect them all! 4/11."
|
||||
icon_state = "gygaxtoy"
|
||||
|
||||
|
||||
/obj/item/toy/prize/durand
|
||||
name = "toy durand"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 5/11."
|
||||
@@ -399,18 +398,6 @@
|
||||
icon_state = "phazonprize"
|
||||
|
||||
|
||||
/obj/item/toy/katana
|
||||
name = "replica katana"
|
||||
desc = "Woefully underpowered in D20."
|
||||
icon_state = "katana"
|
||||
item_state = "katana"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT | SLOT_BACK
|
||||
force = 5
|
||||
throwforce = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
|
||||
|
||||
|
||||
/*
|
||||
|| A Deck of Cards for playing various games of chance ||
|
||||
@@ -450,7 +437,7 @@ obj/item/toy/cards/deck
|
||||
obj/item/toy/cards/deck/New()
|
||||
..()
|
||||
icon_state = "deck_[deckstyle]_full"
|
||||
for(var/i = 2; i <= 10; i++)
|
||||
for(var/i in 2 to 10)
|
||||
cards += "[i] of Hearts"
|
||||
cards += "[i] of Spades"
|
||||
cards += "[i] of Clubs"
|
||||
@@ -472,7 +459,6 @@ obj/item/toy/cards/deck/New()
|
||||
cards += "Ace of Clubs"
|
||||
cards += "Ace of Diamonds"
|
||||
|
||||
|
||||
obj/item/toy/cards/deck/attack_hand(mob/user as mob)
|
||||
var/choice = null
|
||||
if(cards.len == 0)
|
||||
@@ -489,12 +475,7 @@ obj/item/toy/cards/deck/attack_hand(mob/user as mob)
|
||||
H.pickup(user)
|
||||
user.put_in_active_hand(H)
|
||||
visible_message("<span class='notice'>[user] draws a card from the deck.</span>", "<span class='notice'>You draw a card from the deck.</span>")
|
||||
if(cards.len > 26)
|
||||
icon_state = "deck_[deckstyle]_full"
|
||||
else if(cards.len > 10)
|
||||
icon_state = "deck_[deckstyle]_half"
|
||||
else if(cards.len > 1)
|
||||
icon_state = "deck_[deckstyle]_low"
|
||||
update_icon()
|
||||
|
||||
obj/item/toy/cards/deck/attack_self(mob/user as mob)
|
||||
if(cooldown < world.time - 50)
|
||||
@@ -515,12 +496,7 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/singlecard/C, mob/living/use
|
||||
qdel(C)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
|
||||
if(cards.len > 26)
|
||||
icon_state = "deck_[deckstyle]_full"
|
||||
else if(cards.len > 10)
|
||||
icon_state = "deck_[deckstyle]_half"
|
||||
else if(cards.len > 1)
|
||||
icon_state = "deck_[deckstyle]_low"
|
||||
update_icon()
|
||||
|
||||
|
||||
obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user, params)
|
||||
@@ -535,12 +511,7 @@ obj/item/toy/cards/deck/attackby(obj/item/toy/cards/cardhand/C, mob/living/user,
|
||||
qdel(C)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
|
||||
if(cards.len > 26)
|
||||
icon_state = "deck_[deckstyle]_full"
|
||||
else if(cards.len > 10)
|
||||
icon_state = "deck_[deckstyle]_half"
|
||||
else if(cards.len > 1)
|
||||
icon_state = "deck_[deckstyle]_low"
|
||||
update_icon()
|
||||
|
||||
obj/item/toy/cards/deck/MouseDrop(atom/over_object)
|
||||
var/mob/M = usr
|
||||
@@ -566,7 +537,16 @@ obj/item/toy/cards/deck/MouseDrop(atom/over_object)
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You can't reach it from here.</span>")
|
||||
|
||||
|
||||
obj/item/toy/cards/deck/update_icon()
|
||||
switch(cards.len)
|
||||
if(0)
|
||||
icon_state = "deck_[deckstyle]_empty"
|
||||
if(1 to 10)
|
||||
icon_state = "deck_[deckstyle]_low"
|
||||
if(11 to 26)
|
||||
icon_state = "deck_[deckstyle]_half"
|
||||
else
|
||||
icon_state = "deck_[deckstyle]_full"
|
||||
|
||||
obj/item/toy/cards/cardhand
|
||||
name = "hand of cards"
|
||||
@@ -613,12 +593,7 @@ obj/item/toy/cards/cardhand/Topic(href, href_list)
|
||||
cardUser.visible_message("<span class='notice'>[cardUser] draws a card from [cardUser.p_their()] hand.</span>", "<span class='notice'>You take the [C.cardname] from your hand.</span>")
|
||||
|
||||
interact(cardUser)
|
||||
if(currenthand.len < 3)
|
||||
icon_state = "[deckstyle]_hand2"
|
||||
else if(src.currenthand.len < 4)
|
||||
icon_state = "[deckstyle]_hand3"
|
||||
else if(src.currenthand.len < 5)
|
||||
icon_state = "[deckstyle]_hand4"
|
||||
update_icon()
|
||||
if(currenthand.len == 1)
|
||||
var/obj/item/toy/cards/singlecard/N = new/obj/item/toy/cards/singlecard(src.loc)
|
||||
N.parentdeck = src.parentdeck
|
||||
@@ -639,12 +614,7 @@ obj/item/toy/cards/cardhand/attackby(obj/item/toy/cards/singlecard/C, mob/living
|
||||
user.unEquip(C)
|
||||
user.visible_message("<span class='notice'>[user] adds a card to [user.p_their()] hand.</span>", "<span class='notice'>You add the [C.cardname] to your hand.</span>")
|
||||
interact(user)
|
||||
if(currenthand.len > 4)
|
||||
icon_state = "[deckstyle]_hand5"
|
||||
else if(currenthand.len > 3)
|
||||
icon_state = "[deckstyle]_hand4"
|
||||
else if(currenthand.len > 2)
|
||||
icon_state = "[deckstyle]_hand3"
|
||||
update_icon()
|
||||
qdel(C)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
|
||||
@@ -697,7 +667,7 @@ obj/item/toy/cards/singlecard/verb/Flip()
|
||||
icon_state = "sc_Ace of Spades_[deckstyle]"
|
||||
name = "What Card"
|
||||
pixel_x = 5
|
||||
else if(flipped)
|
||||
else
|
||||
flipped = 0
|
||||
icon_state = "singlecard_down_[deckstyle]"
|
||||
name = "card"
|
||||
@@ -728,16 +698,24 @@ obj/item/toy/cards/singlecard/attackby(obj/item/I, mob/living/user, params)
|
||||
user.unEquip(src)
|
||||
user.visible_message("<span class='notice'>[user] adds a card to [user.p_their()] hand.</span>", "<span class='notice'>You add the [cardname] to your hand.</span>")
|
||||
H.interact(user)
|
||||
if(H.currenthand.len > 4)
|
||||
H.icon_state = "[deckstyle]_hand5"
|
||||
else if(H.currenthand.len > 3)
|
||||
H.icon_state = "[deckstyle]_hand4"
|
||||
else if(H.currenthand.len > 2)
|
||||
H.icon_state = "[deckstyle]_hand3"
|
||||
H.update_icon()
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't mix cards from other decks.</span>")
|
||||
|
||||
obj/item/toy/cards/cardhand/update_icon()
|
||||
switch(currenthand.len)
|
||||
if(0 to 1)
|
||||
return
|
||||
if(2)
|
||||
icon_state = "[deckstyle]_hand2"
|
||||
if(3)
|
||||
icon_state = "[deckstyle]_hand3"
|
||||
if(4)
|
||||
icon_state = "[deckstyle]_hand4"
|
||||
else
|
||||
icon_state = "[deckstyle]_hand5"
|
||||
|
||||
|
||||
obj/item/toy/cards/singlecard/attack_self(mob/user)
|
||||
if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
|
||||
@@ -813,10 +791,12 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
/obj/item/toy/therapy
|
||||
name = "therapy doll"
|
||||
desc = "A toy for therapeutic and recreational purposes."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "therapyred"
|
||||
item_state = "egg4"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/cooldown = 0
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/toy/therapy/New()
|
||||
if(item_color)
|
||||
@@ -836,7 +816,7 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "therapyred"
|
||||
|
||||
/obj/random/prize/item_to_spawn()
|
||||
/obj/random/therapy/item_to_spawn()
|
||||
return pick(subtypesof(/obj/item/toy/therapy)) //exclude the base type.
|
||||
|
||||
/obj/item/toy/therapy/red
|
||||
|
||||
@@ -57,16 +57,13 @@ RSF
|
||||
if(!proximity) return
|
||||
if(!(istype(A, /obj/structure/table) || istype(A, /turf/simulated/floor)))
|
||||
return
|
||||
|
||||
var spawn_location
|
||||
if(istype(A, /obj/structure/table))
|
||||
spawn_location = A.loc
|
||||
else if (istype(A, /obj/structure/table))
|
||||
spawn_location = A
|
||||
var/turf/T = get_turf(A)
|
||||
if(istype(T) && !T.density)
|
||||
spawn_location = T
|
||||
else
|
||||
to_chat(user, "The RSF can only create service items on tables, or floors.")
|
||||
return
|
||||
|
||||
if(isrobot(user))
|
||||
var/mob/living/silicon/robot/engy = user
|
||||
if(!engy.cell.use(configured_items[mode][2]))
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
icon_state = "id"
|
||||
item_state = "card-id"
|
||||
var/mining_points = 0 //For redeeming at mining equipment lockers
|
||||
var/access = list()
|
||||
var/list/access = list()
|
||||
var/registered_name = "Unknown" // The name registered_name on the card
|
||||
slot_flags = SLOT_ID
|
||||
var/untrackable // Can not be tracked by AI's
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
if(!get_location_accessible(H, "mouth"))
|
||||
to_chat(user, "<span class='warning'>The mask is in the way.</span>")
|
||||
return
|
||||
if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
|
||||
if((C.dna.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
|
||||
to_chat(user, "<span class='warning'>You find yourself disappointed at the appalling lack of facial hair.</span>")
|
||||
return
|
||||
if(C.f_style == "Shaved")
|
||||
@@ -130,13 +130,13 @@
|
||||
if(!get_location_accessible(H, "head"))
|
||||
to_chat(user, "<span class='warning'>The headgear is in the way.</span>")
|
||||
return
|
||||
if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
|
||||
if((C.dna.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
|
||||
to_chat(user, "<span class='warning'>You find yourself disappointed at the appalling lack of hair.</span>")
|
||||
return
|
||||
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
|
||||
to_chat(user, "<span class='notice'>There is not enough hair left to shave...</span>")
|
||||
return
|
||||
if(M.get_species() == "Skrell")
|
||||
if(isskrell(M))
|
||||
to_chat(user, "<span class='warning'>Your razor isn't going to cut through tentacles.</span>")
|
||||
return
|
||||
if(H == user) //shaving yourself
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
H = M
|
||||
|
||||
spawn(0) //Some mutations have sleeps in them, like monkey
|
||||
if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.species.species_traits))) // prevents drained people from having their DNA changed
|
||||
if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.dna.species.species_traits))) // prevents drained people from having their DNA changed
|
||||
var/prev_ue = M.dna.unique_enzymes
|
||||
var/mutflags = 0
|
||||
// UI in syringe.
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(NO_DNA in H.species.species_traits)
|
||||
if(NO_DNA in H.dna.species.species_traits)
|
||||
return 0
|
||||
|
||||
if(!user.IsAdvancedToolUser())
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(NO_DNA in H.species.species_traits)
|
||||
if(NO_DNA in H.dna.species.species_traits)
|
||||
to_chat(user, "<span class='warning'>You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.</span>")
|
||||
return
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
if(istype(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
scramble(1, H, 100)
|
||||
H.real_name = random_name(H.gender, H.species.name) //Give them a name that makes sense for their species.
|
||||
H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
|
||||
H.sync_organ_dna(assimilate = 1)
|
||||
H.update_body(0)
|
||||
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
|
||||
|
||||
@@ -159,6 +159,10 @@
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/mousetrap)
|
||||
|
||||
/obj/item/grenade/chem_grenade/explosion/mine_armed/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/assembly/mousetrap/armed)
|
||||
|
||||
|
||||
// Water + Potassium = Boom
|
||||
|
||||
@@ -198,6 +202,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
// Basic EMP grenade
|
||||
/obj/item/grenade/chem_grenade/emp
|
||||
payload_name = "EMP"
|
||||
|
||||
@@ -28,8 +28,9 @@
|
||||
var/obj/machinery/abductor/console/console
|
||||
if(ishuman(source))
|
||||
var/mob/living/carbon/human/H = source
|
||||
if(H.get_species() == "Abductor")
|
||||
console = get_team_console(H.mind.abductor.team)
|
||||
if(isabductor(H))
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
console = get_team_console(S.team)
|
||||
home = console.pad
|
||||
|
||||
if(!home)
|
||||
|
||||
@@ -2,28 +2,8 @@
|
||||
Rapid Pipe Dispenser
|
||||
*/
|
||||
|
||||
#define SIMPLE_CAP 20
|
||||
#define SUPPLY_CAP 32
|
||||
#define SCRUBBERS_CAP 33
|
||||
#define HE_EXCHANGER 17
|
||||
#define CONNECTOR 4
|
||||
#define UNARY_VENT 7
|
||||
#define PASSIVE_VENT 37
|
||||
#define GAS_SCRUBBER 10
|
||||
#define INJECTOR 34
|
||||
#define GAS_SENSOR 98
|
||||
#define METER 99
|
||||
#define DISPOSALS_JUNCTION 2
|
||||
#define ATMOS_MODE 1
|
||||
#define DISPOSALS_MODE 2
|
||||
#define ROTATION_MODE 3
|
||||
#define FLIP_MODE 4
|
||||
#define DELETE_MODE 5
|
||||
#define ATMOS_PIPING 1
|
||||
#define SUPPLY_PIPING 2
|
||||
#define SCRUBBERS_PIPING 3
|
||||
#define DEVICES 4
|
||||
#define HEAT_PIPING 5
|
||||
#define RPD_COOLDOWN_TIME 4 //How long should we have to wait between dispensing pipes?
|
||||
#define RPD_WALLBUILD_TIME 40 //How long should drilling into a wall take?
|
||||
|
||||
/obj/item/rpd
|
||||
name = "rapid pipe dispenser"
|
||||
@@ -43,13 +23,13 @@
|
||||
origin_tech = "engineering=4;materials=2"
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
var/lastused
|
||||
var/iconrotation = 0 //used to orient icons and pipes
|
||||
var/mode = 1 //Disposals, atmospherics, etc.
|
||||
var/pipetype = 1//For nanoUI menus
|
||||
var/whatpipe = 0 //What kind of pipe is it? See code/game/machinery/pipe/construction.dm for a list of defines
|
||||
var/whatdpipe = 0 //What kind of disposals pipe is it? See code/game/machinery/pipe/dispenser.dm for a list of defines
|
||||
var/spawndelay = 4 //How long should we have to wait between dispensing pipes?
|
||||
var/walldelay = 40 //How long should drilling into a wall take?
|
||||
var/iconrotation = 0 //Used to orient icons and pipes
|
||||
var/mode = RPD_ATMOS_MODE //Disposals, atmospherics, etc.
|
||||
var/pipe_category = RPD_ATMOS_PIPING//For nanoUI menus, this is a subtype of pipes e.g. scrubbers pipes, devices
|
||||
var/whatpipe = PIPE_SIMPLE_STRAIGHT //What kind of atmos pipe is it?
|
||||
var/whatdpipe = PIPE_DISPOSALS_STRAIGHT //What kind of disposals pipe is it?
|
||||
var/spawndelay = RPD_COOLDOWN_TIME
|
||||
var/walldelay = RPD_WALLBUILD_TIME
|
||||
|
||||
/obj/item/rpd/New()
|
||||
..()
|
||||
@@ -57,82 +37,112 @@
|
||||
spark_system.set_up(1, 0, src)
|
||||
spark_system.attach(src)
|
||||
|
||||
/obj/item/rpd/Destroy()
|
||||
QDEL_NULL(spark_system)
|
||||
return ..()
|
||||
|
||||
//Procs
|
||||
|
||||
/obj/item/rpd/proc/Activaterpd(delay)
|
||||
/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))
|
||||
spark_system.start()
|
||||
if(delay)
|
||||
lastused = world.time
|
||||
|
||||
/obj/item/rpd/proc/Manipulatepipes(subject, atmosverb, disposalsverb)
|
||||
if(istype(subject, /obj/item/pipe))
|
||||
call(subject, atmosverb)()
|
||||
else if(istype(subject, /obj/structure/disposalconstruct/))
|
||||
call(subject, disposalsverb)()
|
||||
/obj/item/rpd/proc/can_dispense_pipe(var/pipe_id, var/pipe_type) //Returns TRUE if this is a legit pipe we can dispense, otherwise returns FALSE
|
||||
for(var/list/L in GLOB.rpd_pipe_list)
|
||||
if(pipe_type != L["pipe_type"]) //Sometimes pipes in different categories have the same pipe_id, so we need to skip anything not in the category we want
|
||||
continue
|
||||
if(pipe_id == L["pipe_id"]) //Found the pipe, we can dispense it
|
||||
return TRUE
|
||||
|
||||
/obj/item/rpd/proc/create_atmos_pipe(mob/user, turf/T) //Make an atmos pipe, meter, or gas sensor
|
||||
if(!can_dispense_pipe(whatpipe, RPD_ATMOS_MODE))
|
||||
log_runtime(EXCEPTION("Failed to spawn [get_pipe_name(whatpipe, PIPETYPE_ATMOS)] - possible tampering detected")) //Damn dirty apes -- I mean hackers
|
||||
return
|
||||
var/obj/item/pipe/P
|
||||
if(whatpipe == PIPE_GAS_SENSOR)
|
||||
P = new /obj/item/pipe_gsensor(T)
|
||||
else if(whatpipe == PIPE_METER)
|
||||
P = new /obj/item/pipe_meter(T)
|
||||
else
|
||||
P = new(T, whatpipe, iconrotation) //Make the pipe, BUT WAIT! There's more!
|
||||
if(!iconrotation && P.is_bent_pipe()) //Automatically rotates dispensed pipes if the user selected auto-rotation
|
||||
P.dir = turn(user.dir, 135)
|
||||
else if(!iconrotation && P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
|
||||
P.flip()
|
||||
else if(iconrotation && P.is_bent_pipe()) //If user selected a rotation and the pipe is bent
|
||||
P.dir = turn(iconrotation, -45)
|
||||
else if(!iconrotation) //If user selected a rotation
|
||||
P.dir = user.dir
|
||||
to_chat(user, "<span class='notice'>[src] rapidly dispenses [P]!</span>")
|
||||
activate_rpd(TRUE)
|
||||
|
||||
/obj/item/rpd/proc/create_disposals_pipe(mob/user, turf/T) //Make a disposals pipe / construct
|
||||
if(!can_dispense_pipe(whatdpipe, RPD_DISPOSALS_MODE))
|
||||
log_runtime(EXCEPTION("Failed to spawn [get_pipe_name(whatdpipe, PIPETYPE_DISPOSAL)] - possible tampering detected"))
|
||||
return
|
||||
var/obj/structure/disposalconstruct/P = new(T, whatdpipe, iconrotation)
|
||||
if(!iconrotation) //Automatic rotation
|
||||
P.dir = user.dir
|
||||
if(!iconrotation && whatdpipe != PIPE_DISPOSALS_JUNCTION_RIGHT) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though
|
||||
P.flip()
|
||||
to_chat(user, "<span class='notice'>[src] rapidly dispenses [P]!</span>")
|
||||
activate_rpd(TRUE)
|
||||
|
||||
/obj/item/rpd/proc/rotate_all_pipes(mob/user, turf/T) //Rotate all pipes on a turf
|
||||
for(var/obj/item/pipe/P in T)
|
||||
P.rotate()
|
||||
for(var/obj/structure/disposalconstruct/D in T)
|
||||
D.rotate()
|
||||
|
||||
/obj/item/rpd/proc/flip_all_pipes(mob/user, turf/T) //Flip all pipes on a turf
|
||||
for(var/obj/item/pipe/P in T)
|
||||
P.flip()
|
||||
for(var/obj/structure/disposalconstruct/D in T)
|
||||
D.flip()
|
||||
|
||||
/obj/item/rpd/proc/delete_all_pipes(mob/user, turf/T) //Delete all pipes on a turf
|
||||
var/eaten
|
||||
for(var/obj/item/pipe/P in T)
|
||||
QDEL_NULL(P)
|
||||
eaten = TRUE
|
||||
for(var/obj/item/pipe_gsensor/G in T)
|
||||
QDEL_NULL(G)
|
||||
eaten = TRUE
|
||||
for(var/obj/item/pipe_meter/M in T)
|
||||
QDEL_NULL(M)
|
||||
eaten = TRUE
|
||||
for(var/obj/structure/disposalconstruct/D in T)
|
||||
if(!D.anchored)
|
||||
QDEL_NULL(D)
|
||||
eaten = TRUE
|
||||
if(eaten)
|
||||
to_chat(user, "<span class='notice'>[src] sucks up the loose pipes on [T].")
|
||||
activate_rpd()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There were no loose pipes on [T].</span>")
|
||||
|
||||
/obj/item/rpd/proc/delete_single_pipe(mob/user, obj/P) //Delete a single pipe
|
||||
to_chat(user, "<span class='notice'>[src] sucks up [P].</span>")
|
||||
QDEL_NULL(P)
|
||||
activate_rpd()
|
||||
|
||||
//Lists of things
|
||||
|
||||
var/list/pipelist = list( //id refers to the pipe_type found in construction.dm, icon refers to the name of the icon state in icons/obj/pipe-item.dmi. Icons are made with the asset-cache
|
||||
list("pipename" = "Straight pipe", "id" = 0, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "simple"),
|
||||
list("pipename" = "Bent pipe", "id" = 1, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1),
|
||||
list("pipename" = "T-manifold", "id" = 5, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "manifold"),
|
||||
list("pipename" = "4-way manifold", "id" = 19, "category" = ATMOS_PIPING, "orientations" = 1, "icon" = "manifold4w"),
|
||||
list("pipename" = "Pipe cap", "id" = 20, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "cap"),
|
||||
list("pipename" = "Manual valve", "id" = 8, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "mvalve"),
|
||||
list("pipename" = "Digital valve", "id" = 35, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "dvalve"),
|
||||
list("pipename" = "Manual T-valve", "id" = 18, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "tvalve"),
|
||||
list("pipename" = "Digital T-valve", "id" = 38, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "dtvalve"),
|
||||
list("pipename" = "Straight supply pipe", "id" = 24, "category" = SUPPLY_PIPING, "orientations" = 2, "icon" = "simple"),
|
||||
list("pipename" = "Bent supply pipe", "id" = 25, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1),
|
||||
list("pipename" = "Supply T-manifold", "id" = 28, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "manifold"),
|
||||
list("pipename" = "4-way supply manifold", "id" = 30, "category" = SUPPLY_PIPING, "orientations" = 1, "icon" = "manifold4w"),
|
||||
list("pipename" = "Supply pipe cap", "id" = 32, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "cap"),
|
||||
list("pipename" = "Straight scrubbers pipe", "id" = 26, "category" = SCRUBBERS_PIPING, "orientations" = 2, "icon" = "simple"),
|
||||
list("pipename" = "Bent scrubbers pipe", "id" = 27, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1),
|
||||
list("pipename" = "Scrubbers T-manifold", "id" = 29, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "manifold"),
|
||||
list("pipename" = "4-way scrubbers manifold", "id" = 31, "category" = SCRUBBERS_PIPING, "orientations" = 1, "icon" = "manifold4w"),
|
||||
list("pipename" = "Scrubbers pipe cap", "id" = 33, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "cap"),
|
||||
list("pipename" = "Universal pipe adapter", "id" = 23, "category" = DEVICES, "orientations" = 2, "icon" = "universal"),
|
||||
list("pipename" = "Connector", "id" = 4, "category" = DEVICES, "orientations" = 4, "icon" = "connector"),
|
||||
list("pipename" = "Unary vent", "id" = 7, "category" = DEVICES, "orientations" = 4, "icon" = "uvent"),
|
||||
list("pipename" = "Scrubber", "id" = 10, "category" = DEVICES, "orientations" = 4, "icon" = "scrubber"),
|
||||
list("pipename" = "Gas pump", "id" = 9, "category" = DEVICES, "orientations" = 4, "icon" = "pump"),
|
||||
list("pipename" = "Volume pump", "id" = 16, "category" = DEVICES, "orientations" = 4, "icon" = "volumepump"),
|
||||
list("pipename" = "Passive gate", "id" = 15, "category" = DEVICES, "orientations" = 4, "icon" = "passivegate"),
|
||||
list("pipename" = "Gas filter", "id" = 13, "category" = DEVICES, "orientations" = 4, "icon" = "filter"),
|
||||
list("pipename" = "Gas mixer", "id" = 14, "category" = DEVICES, "orientations" = 4, "icon" = "mixer"),
|
||||
list("pipename" = "Gas sensor", "id" = 98, "category" = DEVICES, "orientations" = 1, "icon" = "sensor"),
|
||||
list("pipename" = "Meter", "id" = 99, "category" = DEVICES, "orientations" = 1, "icon" = "meter"),
|
||||
list("pipename" = "Passive vent", "id" = 37, "category" = DEVICES, "orientations" = 4, "icon" = "passive vent"),
|
||||
list("pipename" = "Dual-port vent pump", "id" = 36, "category" = DEVICES, "orientations" = 2, "icon" = "dual-port vent"),
|
||||
list("pipename" = "Air injector", "id" = 34, "category" = DEVICES, "orientations" = 4, "icon" = "injector"),
|
||||
list("pipename" = "Straight HE pipe", "id" = 2, "category" = HEAT_PIPING, "orientations" = 2, "icon" = "he"),
|
||||
list("pipename" = "Bent HE pipe", "id" = 3, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "he", "bendy" = 1),
|
||||
list("pipename" = "Junction", "id" = 6, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "junction"),
|
||||
list("pipename" = "Heat exchanger", "id" = 17, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "heunary"))
|
||||
var/list/dpipelist = list(
|
||||
list("pipename" = "Straight pipe", "id" = 0, "orientations" = 2, "icon" = "conpipe-s"),
|
||||
list("pipename" = "Bent pipe", "id" = 1, "orientations" = 4, "icon" = "conpipe-c"),
|
||||
list("pipename" = "Junction", "id" = 2, "orientations" = 4, "icon" = "conpipe-j1"),
|
||||
list("pipename" = "Y-junction", "id" = 4, "orientations" = 4, "icon" = "conpipe-y"),
|
||||
list("pipename" = "Trunk", "id" = 5, "orientations" = 4, "icon" = "conpipe-t"),
|
||||
list("pipename" = "Bin", "id" = 6, "orientations" = 1, "icon" = "condisposal"),
|
||||
list("pipename" = "Outlet", "id" = 7, "orientations" = 4, "icon" = "outlet"),
|
||||
list("pipename" = "Chute", "id" = 8, "orientations" = 4, "icon" = "intake"))
|
||||
var/list/mainmenu = list(
|
||||
list("category" = "Atmospherics", "mode" = 1, "icon" = "wrench"),
|
||||
list("category" = "Disposals", "mode" = 2, "icon" = "recycle"),
|
||||
list("category" = "Rotate", "mode" = 3, "icon" = "rotate-right"),
|
||||
list("category" = "Flip", "mode" = 4, "icon" = "exchange"),
|
||||
list("category" = "Recycle", "mode" = 5, "icon" = "trash"))
|
||||
list("category" = "Atmospherics", "mode" = RPD_ATMOS_MODE, "icon" = "wrench"),
|
||||
list("category" = "Disposals", "mode" = RPD_DISPOSALS_MODE, "icon" = "recycle"),
|
||||
list("category" = "Rotate", "mode" = RPD_ROTATE_MODE, "icon" = "rotate-right"),
|
||||
list("category" = "Flip", "mode" = RPD_FLIP_MODE, "icon" = "exchange"),
|
||||
list("category" = "Recycle", "mode" = RPD_DELETE_MODE, "icon" = "trash"))
|
||||
var/list/pipemenu = list(
|
||||
list("pipecategory" = "Normal", "pipemode" = 1),
|
||||
list("pipecategory" = "Supply", "pipemode" = 2),
|
||||
list("pipecategory" = "Scrubber", "pipemode" = 3),
|
||||
list("pipecategory" = "Devices", "pipemode" = 4),
|
||||
list("pipecategory" = "Heat exchange", "pipemode" = 5))
|
||||
list("category" = "Normal", "pipemode" = RPD_ATMOS_PIPING),
|
||||
list("category" = "Supply", "pipemode" = RPD_SUPPLY_PIPING),
|
||||
list("category" = "Scrubber", "pipemode" = RPD_SCRUBBERS_PIPING),
|
||||
list("category" = "Devices", "pipemode" = RPD_DEVICES),
|
||||
list("category" = "Heat exchange", "pipemode" = RPD_HEAT_PIPING))
|
||||
|
||||
//NanoUI stuff
|
||||
|
||||
@@ -148,13 +158,12 @@ var/list/pipemenu = list(
|
||||
|
||||
/obj/item/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
|
||||
var/data[0]
|
||||
data["dpipelist"] = dpipelist
|
||||
data["iconrotation"] = iconrotation
|
||||
data["mainmenu"] = mainmenu
|
||||
data["mode"] = mode
|
||||
data["pipelist"] = pipelist
|
||||
data["pipelist"] = GLOB.rpd_pipe_list
|
||||
data["pipemenu"] = pipemenu
|
||||
data["pipetype"] = pipetype
|
||||
data["pipe_category"] = pipe_category
|
||||
data["whatdpipe"] = whatdpipe
|
||||
data["whatpipe"] = whatpipe
|
||||
return data
|
||||
@@ -167,99 +176,23 @@ var/list/pipemenu = list(
|
||||
whatpipe = text2num(sanitize(href_list["whatpipe"]))
|
||||
else if(href_list["whatdpipe"])
|
||||
whatdpipe = text2num(sanitize(href_list["whatdpipe"]))
|
||||
else if(href_list["pipetype"])
|
||||
pipetype = text2num(sanitize(href_list["pipetype"]))
|
||||
else if(href_list["pipe_category"])
|
||||
pipe_category = text2num(sanitize(href_list["pipe_category"]))
|
||||
else if(href_list["mode"])
|
||||
mode = text2num(sanitize(href_list["mode"]))
|
||||
else
|
||||
return
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
//What the RPD actually does
|
||||
|
||||
/obj/item/rpd/afterattack(atom/target, mob/user, proximity)
|
||||
..()
|
||||
var/turf/T = get_turf(target)
|
||||
if(loc != user || ismob(target) || istype(target, /obj/structure/window) || !proximity || world.time < lastused + spawndelay)
|
||||
if(loc != user)
|
||||
return
|
||||
if(!(T.flags & RPD_ALLOWED_HERE))
|
||||
to_chat(user, "<span class='notice'>[src] beeps, \"Unable to interface with [T]. Please try again later.\"</span>")
|
||||
if(!proximity)
|
||||
return
|
||||
if(mode == ATMOS_MODE)
|
||||
if(istype(T, /turf/simulated/wall)) //Drilling into walls takes time
|
||||
playsound(loc, "sound/weapons/circsawhit.ogg", 50, 1)
|
||||
user.visible_message("<span class = 'notice'>[user] starts drilling a hole in [T]...</span>", "<span class = 'notice'>You start drilling a hole in [T]...</span>", "<span class = 'warning'>You hear a drill.</span>")
|
||||
if(!do_after(user, walldelay, target = T))
|
||||
return
|
||||
user.visible_message("<span class = 'notice'>[user] finishes drilling a hole in [T]!</span>", "<span class = 'notice'>You finish drilling a hole in [T]!</span>", "<span class = 'warning'>You hear clanking.</span>")
|
||||
var/obj/item/pipe/P
|
||||
if(whatpipe == GAS_SENSOR)
|
||||
P = new /obj/item/pipe_gsensor(T)
|
||||
else if(whatpipe == METER)
|
||||
P = new /obj/item/pipe_meter(T)
|
||||
else
|
||||
P = new(T, pipe_type = whatpipe, dir = user.dir)
|
||||
if(iconrotation == 0 && P.is_bent_pipe()) //Automatic rotation of dispensed pipes
|
||||
P.dir = turn(user.dir, 135)
|
||||
else if(iconrotation == 0 && P.pipe_type in list(CONNECTOR, UNARY_VENT, GAS_SCRUBBER, HE_EXCHANGER, SIMPLE_CAP, SUPPLY_CAP, SCRUBBERS_CAP, INJECTOR, PASSIVE_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
|
||||
P.flip()
|
||||
else if(iconrotation != 0 && P.is_bent_pipe()) //If they selected a rotation and the pipe is bent
|
||||
P.dir = turn(iconrotation, -45)
|
||||
else if(iconrotation != 0)
|
||||
P.dir = iconrotation
|
||||
to_chat(user, "<span class = 'notice'>[src] rapidly dispenses [P]!</span>")
|
||||
Activaterpd(1)
|
||||
else if(mode == DISPOSALS_MODE && !istype(T, /turf/simulated/shuttle))
|
||||
if(istype(T, /turf/simulated/wall)) //No disposals pipes on walls
|
||||
to_chat(user, "<span class = 'warning'>That type of pipe won't fit on [T]!</span>")
|
||||
return
|
||||
var/obj/structure/disposalconstruct/P = new(T) //Now we make the pipe
|
||||
P.dir = iconrotation
|
||||
P.ptype = whatdpipe
|
||||
if(iconrotation == 0) //Automatic rotation
|
||||
P.dir = user.dir
|
||||
if(iconrotation == 0 && whatdpipe != DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though
|
||||
P.flip()
|
||||
P.update()
|
||||
to_chat(user, "<span class = 'notice'>[src] rapidly dispenses [P]!</span>")
|
||||
Activaterpd(1)
|
||||
else if(mode == ROTATION_MODE)
|
||||
for(var/obj/W in T)
|
||||
Manipulatepipes(W, /obj/item/pipe/verb/rotate, /obj/structure/disposalconstruct/verb/rotate)
|
||||
else if(mode == FLIP_MODE)
|
||||
for(var/obj/W in T)
|
||||
Manipulatepipes(W, /obj/item/pipe/verb/flip, /obj/structure/disposalconstruct/verb/flip)
|
||||
else if(mode == DELETE_MODE)
|
||||
var/eaten
|
||||
for(var/obj/W in T)
|
||||
if(istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor) || istype(W, /obj/structure/disposalconstruct) && !W.anchored)
|
||||
QDEL_NULL(W)
|
||||
eaten = TRUE
|
||||
if(eaten)
|
||||
to_chat(user, "<span class='notice'>[src] sucks up the loose pipes on [T].")
|
||||
Activaterpd()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There were no loose pipes on [T].</span>")
|
||||
if(world.time < lastused + spawndelay)
|
||||
return
|
||||
target.rpd_act(user, src) //Handle RPD effects in separate procs
|
||||
|
||||
#undef SIMPLE_CAP
|
||||
#undef SUPPLY_CAP
|
||||
#undef SCRUBBERS_CAP
|
||||
#undef HE_EXCHANGER
|
||||
#undef CONNECTOR
|
||||
#undef UNARY_VENT
|
||||
#undef PASSIVE_VENT
|
||||
#undef GAS_SCRUBBER
|
||||
#undef INJECTOR
|
||||
#undef GAS_SENSOR
|
||||
#undef METER
|
||||
#undef DISPOSALS_JUNCTION
|
||||
#undef ATMOS_MODE
|
||||
#undef DISPOSALS_MODE
|
||||
#undef ROTATION_MODE
|
||||
#undef FLIP_MODE
|
||||
#undef DELETE_MODE
|
||||
#undef ATMOS_PIPING
|
||||
#undef SUPPLY_PIPING
|
||||
#undef SCRUBBERS_PIPING
|
||||
#undef DEVICES
|
||||
#undef HEAT_PIPING
|
||||
#undef RPD_COOLDOWN_TIME
|
||||
#undef RPD_WALLBUILD_TIME
|
||||
|
||||
@@ -33,19 +33,19 @@
|
||||
var/list/species_facial_hair = list()
|
||||
var/obj/item/organ/external/head/C = H.get_organ("head")
|
||||
var/datum/robolimb/robohead = all_robolimbs[C.model]
|
||||
if(H.gender == MALE || H.get_species() == "Vulpkanin")
|
||||
if(C.species)
|
||||
if(H.gender == MALE || isvulpkanin(H))
|
||||
if(C.dna.species)
|
||||
for(var/i in facial_hair_styles_list)
|
||||
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
|
||||
if(C.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
|
||||
if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
|
||||
if(C.dna.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
|
||||
if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
|
||||
if(robohead.is_monitor)
|
||||
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s face worth cutting. How disappointing.</span>")
|
||||
return
|
||||
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
|
||||
species_facial_hair += i
|
||||
else
|
||||
if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
|
||||
if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
|
||||
if(!robohead.is_monitor)
|
||||
if("Human" in tmp_facial.species_allowed)
|
||||
species_facial_hair += i
|
||||
@@ -57,18 +57,18 @@
|
||||
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
|
||||
//handle normal hair
|
||||
var/list/species_hair = list()
|
||||
if(C.species)
|
||||
if(C.dna.species)
|
||||
for(var/i in hair_styles_public_list)
|
||||
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
|
||||
if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
|
||||
if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
|
||||
if(C.dna.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
|
||||
if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
|
||||
if(robohead.is_monitor)
|
||||
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s head worth cutting. How disappointing.</span>")
|
||||
return
|
||||
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
|
||||
species_hair += i
|
||||
else
|
||||
if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
|
||||
if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
|
||||
if(!robohead.is_monitor)
|
||||
if("Human" in tmp_hair.species_allowed)
|
||||
species_hair += i
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
to_chat(user, "<span class='notice'>You need to take that [target.name] off before cleaning it.</span>")
|
||||
else if(target == user && user.a_intent == INTENT_GRAB && ishuman(target))
|
||||
var/mob/living/carbon/human/muncher = user
|
||||
if(muncher && muncher.get_species() == "Drask")
|
||||
if(muncher && isdrask(muncher))
|
||||
to_chat(user, "You take a bite of the [name]. Delicious!")
|
||||
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
|
||||
user.nutrition += 2
|
||||
|
||||
@@ -371,7 +371,7 @@
|
||||
*/
|
||||
/obj/item/storage/bag/tray
|
||||
name = "tray"
|
||||
icon = 'icons/obj/food/food.dmi'
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "tray"
|
||||
desc = "A metal tray to lay food on."
|
||||
force = 5
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
/obj/item/storage/fancy/
|
||||
icon = 'icons/obj/food/food.dmi'
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "donutbox6"
|
||||
name = "donut box"
|
||||
burn_state = FLAMMABLE
|
||||
@@ -43,7 +43,6 @@
|
||||
*/
|
||||
|
||||
/obj/item/storage/fancy/donut_box
|
||||
icon = 'icons/obj/food/food.dmi'
|
||||
icon_state = "donutbox6"
|
||||
icon_type = "donut"
|
||||
name = "donut box"
|
||||
@@ -61,7 +60,6 @@
|
||||
*/
|
||||
|
||||
/obj/item/storage/fancy/egg_box
|
||||
icon = 'icons/obj/food/food.dmi'
|
||||
icon_state = "eggbox"
|
||||
icon_type = "egg"
|
||||
name = "egg box"
|
||||
|
||||
@@ -357,19 +357,22 @@
|
||||
remove_from_storage(Item, loc, burn)
|
||||
|
||||
//This proc is called when you want to place an item into the storage item.
|
||||
/obj/item/storage/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
/obj/item/storage/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
|
||||
if(istype(I, /obj/item/hand_labeler))
|
||||
var/obj/item/hand_labeler/labeler = I
|
||||
if(labeler.mode)
|
||||
return FALSE
|
||||
. = 1 //no afterattack
|
||||
if(isrobot(user))
|
||||
to_chat(user, "<span class='notice'>You're a robot. No.</span>")
|
||||
return 1//Robots can't interact with storage items.
|
||||
return //Robots can't interact with storage items.
|
||||
|
||||
if(!can_be_inserted(W))
|
||||
return 0
|
||||
|
||||
handle_item_insertion(W)
|
||||
return 1
|
||||
if(!can_be_inserted(I))
|
||||
if(contents.len >= storage_slots) //don't use items on the backpack if they don't fit
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
handle_item_insertion(I)
|
||||
|
||||
/obj/item/storage/attack_hand(mob/user as mob)
|
||||
playsound(src.loc, "rustle", 50, 1, -5)
|
||||
|
||||
@@ -86,6 +86,16 @@
|
||||
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/drone
|
||||
name = "mechanical toolbox"
|
||||
icon_state = "blue"
|
||||
|
||||
@@ -141,3 +141,6 @@ Frequency:
|
||||
active_portals++
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
/obj/item/hand_tele/portal_destroyed(obj/effect/portal/P)
|
||||
active_portals--
|
||||
@@ -58,7 +58,7 @@
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species.is_small)
|
||||
if(H.dna.species.is_small)
|
||||
to_chat(user, "<span class='warning'>It's too heavy for you to wield fully.</span>")
|
||||
return
|
||||
if(user.get_inactive_hand())
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/max = 30
|
||||
var/prefix = "sharpened"
|
||||
var/requires_sharpness = 1
|
||||
var/claw_damage_increase = 1
|
||||
|
||||
|
||||
/obj/item/whetstone/attackby(obj/item/I, mob/user, params)
|
||||
@@ -46,16 +47,24 @@
|
||||
playsound(get_turf(src), usesound, 50, 1)
|
||||
name = "worn out [name]"
|
||||
desc = "[desc] At least, it used to."
|
||||
used = 1
|
||||
used = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/item/whetstone/attack_self(mob/user as mob) //This is just fluff for now. Species datums are global and not newly created instances, so we can't adjust unarmed damage on a per mob basis.
|
||||
/obj/item/whetstone/attack_self(mob/user)
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>The whetstone is too worn to use again!</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/datum/unarmed_attack/attack = H.species.unarmed
|
||||
var/datum/unarmed_attack/attack = H.dna.species.unarmed
|
||||
if(istype(attack, /datum/unarmed_attack/claws))
|
||||
H.visible_message("<span class='notice'>[H] sharpens [H.p_their()] claws on the [src]!</span>", "<span class='notice'>You sharpen your claws on the [src].</span>")
|
||||
attack.damage += claw_damage_increase
|
||||
H.visible_message("<span class='notice'>[H] sharpens [H.p_their()] claws on [src]!</span>", "<span class='notice'>You sharpen your claws on [src].</span>")
|
||||
playsound(get_turf(H), usesound, 50, 1)
|
||||
name = "worn out [name]"
|
||||
desc = "[desc] At least, it used to."
|
||||
used = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/item/whetstone/super
|
||||
name = "super whetstone block"
|
||||
@@ -64,3 +73,4 @@
|
||||
max = 200
|
||||
prefix = "super-sharpened"
|
||||
requires_sharpness = 0
|
||||
claw_damage_increase = 200
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/integrity_failure = 0 //0 if we have no special broken behavior
|
||||
|
||||
var/resistance_flags = NONE // INDESTRUCTIBLE
|
||||
var/can_be_hit = TRUE //can this be bludgeoned by items?
|
||||
|
||||
var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it
|
||||
|
||||
@@ -24,6 +25,7 @@
|
||||
var/burntime = 10 //How long it takes to burn to ashes, in seconds
|
||||
var/burn_world_time //What world time the object will burn up completely
|
||||
var/being_shocked = 0
|
||||
var/speed_process = FALSE
|
||||
|
||||
var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart?
|
||||
var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created.
|
||||
@@ -65,9 +67,14 @@
|
||||
/obj/Destroy()
|
||||
machines -= src
|
||||
processing_objects -= src
|
||||
fast_processing -= src
|
||||
SSnanoui.close_uis(src)
|
||||
return ..()
|
||||
|
||||
/obj/rpd_act(mob/user, obj/item/rpd/our_rpd)
|
||||
var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs
|
||||
T.rpd_act(user, our_rpd)
|
||||
|
||||
/obj/proc/process()
|
||||
set waitfor = 0
|
||||
processing_objects.Remove(src)
|
||||
@@ -279,6 +286,24 @@ a {
|
||||
/obj/proc/on_mob_move(dir, mob/user)
|
||||
return
|
||||
|
||||
/obj/proc/makeSpeedProcess()
|
||||
if(speed_process)
|
||||
return
|
||||
speed_process = TRUE
|
||||
processing_objects.Remove(src)
|
||||
fast_processing.Add(src)
|
||||
|
||||
/obj/proc/makeNormalProcess()
|
||||
if(!speed_process)
|
||||
return
|
||||
speed_process = FALSE
|
||||
processing_objects.Add(src)
|
||||
fast_processing.Remove(src)
|
||||
|
||||
/obj/vv_get_dropdown()
|
||||
. = ..()
|
||||
.["Delete all of type"] = "?_src_=vars;delall=[UID()]"
|
||||
if(!speed_process)
|
||||
.["Make speed process"] = "?_src_=vars;makespeedy=[UID()]"
|
||||
else
|
||||
.["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]"
|
||||
|
||||
@@ -121,26 +121,25 @@
|
||||
if(!(opened ? close() : open()))
|
||||
to_chat(user, "<span class='notice'>It won't budge!</span>")
|
||||
|
||||
// this should probably use dump_contents()
|
||||
/obj/structure/closet/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
for(var/atom/movable/A in src)//pulls everything out of the locker and hits it with an explosion
|
||||
A.forceMove(loc)
|
||||
A.ex_act(severity++)
|
||||
dump_contents()
|
||||
qdel(src)
|
||||
if(2)
|
||||
if(prob(50))
|
||||
for(var/atom/movable/A in src)
|
||||
A.forceMove(loc)
|
||||
A.ex_act(severity++)
|
||||
dump_contents()
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
qdel(src)
|
||||
if(3)
|
||||
if(prob(5))
|
||||
for(var/atom/movable/A in src)
|
||||
A.forceMove(loc)
|
||||
A.ex_act(severity++)
|
||||
dump_contents()
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
qdel(src)
|
||||
|
||||
@@ -149,23 +148,20 @@
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
health -= Proj.damage
|
||||
if(health <= 0)
|
||||
for(var/atom/movable/A in src)
|
||||
A.forceMove(loc)
|
||||
dump_contents()
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/attack_animal(mob/living/simple_animal/user)
|
||||
if(user.environment_smash)
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='warning'>[user] destroys the [src].</span>")
|
||||
for(var/atom/movable/A in src)
|
||||
A.forceMove(loc)
|
||||
dump_contents()
|
||||
qdel(src)
|
||||
|
||||
// this should probably use dump_contents()
|
||||
/obj/structure/closet/blob_act()
|
||||
if(prob(75))
|
||||
for(var/atom/movable/A in src)
|
||||
A.forceMove(loc)
|
||||
dump_contents()
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/attackby(obj/item/W, mob/user, params)
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot
|
||||
name = "depot supply closet"
|
||||
desc = ""
|
||||
locked = 0
|
||||
anchored = 1
|
||||
health = 200
|
||||
req_access = list()
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/New()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/emag_act()
|
||||
. = ..()
|
||||
loot_pickup()
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/open()
|
||||
. = ..()
|
||||
if(opened)
|
||||
loot_pickup()
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/dump_contents()
|
||||
loot_pickup()
|
||||
. = ..()
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup()
|
||||
var/area/syndicate_depot/core/depotarea = areaMaster
|
||||
if(depotarea)
|
||||
depotarea.locker_looted()
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M)
|
||||
if(isanimal(M) && "syndicate" in M.faction)
|
||||
to_chat(M, "<span class='warning'>The [src] resists your attack!</span>")
|
||||
return
|
||||
return ..(M)
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/emp_act(severity)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/syndicate/depot/togglelock(mob/user)
|
||||
. = ..()
|
||||
if(!locked)
|
||||
loot_pickup()
|
||||
@@ -0,0 +1,106 @@
|
||||
|
||||
/obj/structure/fusionreactor
|
||||
name = "syndicate fusion reactor"
|
||||
desc = ""
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "powersink1"
|
||||
anchored = 1
|
||||
max_integrity = 50
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
|
||||
/obj/structure/fusionreactor/Initialize()
|
||||
. = ..()
|
||||
depotarea = areaMaster
|
||||
if(depotarea)
|
||||
depotarea.reactor = src
|
||||
|
||||
/obj/structure/fusionreactor/Destroy()
|
||||
if(depotarea)
|
||||
depotarea.reactor = null
|
||||
..()
|
||||
|
||||
/obj/structure/fusionreactor/ex_act(severity)
|
||||
if(severity < 3)
|
||||
obj_integrity = 0
|
||||
healthcheck()
|
||||
|
||||
/obj/structure/fusionreactor/bullet_act(obj/item/projectile/Proj)
|
||||
obj_integrity -= Proj.damage
|
||||
..()
|
||||
healthcheck()
|
||||
|
||||
/obj/structure/fusionreactor/proc/healthcheck()
|
||||
if(obj_integrity <= 0)
|
||||
overload(TRUE)
|
||||
|
||||
/obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params)
|
||||
if(iswrench(I))
|
||||
playsound(loc, I.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>The [src] is too well secured to the floor.</span>")
|
||||
else if(isscrewdriver(I))
|
||||
to_chat(user, "<span class='notice'>You try to screwdriver open [src], but accidentally release some radiation!</span>")
|
||||
if(prob(50))
|
||||
empulse(src, 4, 10)
|
||||
else
|
||||
for(var/mob/living/M in range(10, loc))
|
||||
M.apply_effect(rand(5, 25), IRRADIATE)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/fusionreactor/proc/overload(containment_failure)
|
||||
var/obj/effect/overload/O = new /obj/effect/overload(get_turf(src))
|
||||
if(containment_failure)
|
||||
playsound(loc, 'sound/machines/Alarm.ogg', 100, 0, 0)
|
||||
O.deliberate = TRUE
|
||||
O.max_cycles = 6
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/overload
|
||||
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
|
||||
icon_state = "energy_ball"
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
anchored = 1
|
||||
var/cycles = 0
|
||||
var/beepsound = 'sound/items/timer.ogg'
|
||||
var/deliberate = FALSE
|
||||
var/max_cycles = 10
|
||||
var/max_fire_range = 9
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
|
||||
/obj/effect/overload/Initialize()
|
||||
. = ..()
|
||||
processing_objects.Add(src)
|
||||
depotarea = areaMaster
|
||||
if(istype(depotarea))
|
||||
if(!depotarea.used_self_destruct)
|
||||
depotarea.used_self_destruct = TRUE // Silences all further alerts from this point onwards.
|
||||
depotarea.updateicon()
|
||||
depotarea.shields_down()
|
||||
|
||||
/obj/effect/overload/process()
|
||||
var/turf/T = get_turf(src)
|
||||
if(cycles < max_cycles)
|
||||
if(!deliberate)
|
||||
playsound(loc, beepsound, 50, 0)
|
||||
cycles++
|
||||
var/fire_range = min(cycles, max_fire_range)
|
||||
|
||||
for(var/turf/simulated/turf in range(fire_range, T))
|
||||
new /obj/effect/hotspot(turf)
|
||||
return
|
||||
|
||||
if(!istype(depotarea))
|
||||
depotarea = areaMaster
|
||||
if(istype(depotarea))
|
||||
depotarea.destroyed = TRUE
|
||||
depotarea.updateicon()
|
||||
|
||||
for(var/obj/structure/closet/L in range(30, T))
|
||||
L.open()
|
||||
for(var/mob/living/M in range(30, T))
|
||||
M.gib()
|
||||
explosion(get_turf(src), 25, 35, 45, 55, 1, 1, 60, 0, 0)
|
||||
processing_objects.Remove(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
var/list/valid_underwear = list()
|
||||
for(var/underwear in underwear_list)
|
||||
var/datum/sprite_accessory/S = underwear_list[underwear]
|
||||
if(!(H.species.name in S.species_allowed))
|
||||
if(!(H.dna.species.name in S.species_allowed))
|
||||
continue
|
||||
valid_underwear[underwear] = underwear_list[underwear]
|
||||
var/new_underwear = input(user, "Choose your underwear:", "Changing") as null|anything in valid_underwear
|
||||
@@ -34,7 +34,7 @@
|
||||
var/list/valid_undershirts = list()
|
||||
for(var/undershirt in undershirt_list)
|
||||
var/datum/sprite_accessory/S = undershirt_list[undershirt]
|
||||
if(!(H.species.name in S.species_allowed))
|
||||
if(!(H.dna.species.name in S.species_allowed))
|
||||
continue
|
||||
valid_undershirts[undershirt] = undershirt_list[undershirt]
|
||||
var/new_undershirt = input(user, "Choose your undershirt:", "Changing") as null|anything in valid_undershirts
|
||||
@@ -45,7 +45,7 @@
|
||||
var/list/valid_sockstyles = list()
|
||||
for(var/sockstyle in socks_list)
|
||||
var/datum/sprite_accessory/S = socks_list[sockstyle]
|
||||
if(!(H.species.name in S.species_allowed))
|
||||
if(!(H.dna.species.name in S.species_allowed))
|
||||
continue
|
||||
valid_sockstyles[sockstyle] = socks_list[sockstyle]
|
||||
var/new_socks = input(user, "Choose your socks:", "Changing") as null|anything in valid_sockstyles
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
return ..()
|
||||
if(istype(A, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species.is_small)
|
||||
if(H.dna.species.is_small)
|
||||
return ..()
|
||||
return 0
|
||||
|
||||
|
||||
@@ -123,6 +123,9 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
|
||||
new/obj/structure/window/reinforced/clockwork/fulltile(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/window/rpd_act()
|
||||
return
|
||||
|
||||
/obj/structure/window/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FIVE)
|
||||
deconstruct(FALSE)
|
||||
|
||||
Reference in New Issue
Block a user