mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-20 23:21:10 +00:00
BayMerge DLC Pack (#1355)
Ports totally; https://github.com/Baystation12/Baystation12/pull/12389/files Baystation12#14599 Ports partially; Baystation12#14216 (only blob-related functions) All the failure messages have been replaced with failure events in industrial drills, that range from probably lethal to certainly lethal and in one case just moderately annoying.
This commit is contained in:
@@ -1,27 +1,61 @@
|
|||||||
/obj/effect/gibspawner
|
/obj/effect/gibspawner/generic
|
||||||
generic
|
gibtypes = list(
|
||||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
/obj/effect/decal/cleanable/blood/gibs,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/core
|
||||||
|
)
|
||||||
gibamounts = list(2,2,1)
|
gibamounts = list(2,2,1)
|
||||||
|
|
||||||
New()
|
/obj/effect/gibspawner/generic/New()
|
||||||
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
||||||
..()
|
..()
|
||||||
|
|
||||||
human
|
/obj/effect/gibspawner/human
|
||||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
gibtypes = list(
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/down,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/core)
|
||||||
gibamounts = list(1,1,1,1,1,1,1)
|
gibamounts = list(1,1,1,1,1,1,1)
|
||||||
|
|
||||||
New()
|
/obj/effect/gibspawner/human/New()
|
||||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||||
gibamounts[6] = pick(0,1,2)
|
gibamounts[6] = pick(0,1,2)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
robot
|
/obj/effect/gibspawner/robot
|
||||||
sparks = 1
|
sparks = 1
|
||||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
|
gibtypes = list(
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/robot/up,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/robot/down,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/robot,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/robot,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/robot,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/robot/limb
|
||||||
|
)
|
||||||
gibamounts = list(1,1,1,1,1,1)
|
gibamounts = list(1,1,1,1,1,1)
|
||||||
|
|
||||||
New()
|
/obj/effect/gibspawner/robot/New()
|
||||||
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
|
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)
|
||||||
gibamounts[6] = pick(0,1,2)
|
gibamounts[6] = pick(0,1,2)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
/obj/effect/gibspawner/xeno
|
||||||
|
gibtypes = list(
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/xeno/up,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/xeno,
|
||||||
|
/obj/effect/decal/cleanable/blood/gibs/xeno/core
|
||||||
|
)
|
||||||
|
gibamounts = list(1,1,1,1,1,1,1)
|
||||||
|
|
||||||
|
/obj/effect/gibspawner/xeno/New()
|
||||||
|
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
|
||||||
|
gibamounts[6] = pick(0,1,2)
|
||||||
|
..()
|
||||||
@@ -12,3 +12,10 @@
|
|||||||
"/obj/item/weapon/cell" = 1,
|
"/obj/item/weapon/cell" = 1,
|
||||||
"/obj/item/weapon/stock_parts/matter_bin" = 1,
|
"/obj/item/weapon/stock_parts/matter_bin" = 1,
|
||||||
"/obj/item/weapon/stock_parts/micro_laser" = 1)
|
"/obj/item/weapon/stock_parts/micro_laser" = 1)
|
||||||
|
|
||||||
|
/obj/item/weapon/circuitboard/miningdrillbrace
|
||||||
|
name = T_BOARD("mining drill brace")
|
||||||
|
build_path = "/obj/machinery/mining/brace"
|
||||||
|
board_type = "machine"
|
||||||
|
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
|
||||||
|
req_components = list()
|
||||||
@@ -1,3 +1,31 @@
|
|||||||
|
proc/fragem(var/source,var/fragx,var/fragy,var/light_dam,var/flash_dam,var/p_dam,var/p_range,var/can_cover=1)
|
||||||
|
var/turf/O = get_turf(source)
|
||||||
|
var/fragger = rand(fragx,fragy)
|
||||||
|
explosion(O, -1, -1, light_dam, flash_dam)
|
||||||
|
var/list/target_turfs = getcircle(O, 7)
|
||||||
|
var/fragments_per_projectile = round(fragger/target_turfs.len)
|
||||||
|
|
||||||
|
for(var/turf/T in target_turfs)
|
||||||
|
sleep(0)
|
||||||
|
var/obj/item/projectile/bullet/pellet/fragment/P = new (O)
|
||||||
|
|
||||||
|
P.damage = p_dam
|
||||||
|
P.pellets = fragments_per_projectile
|
||||||
|
P.range_step = p_range
|
||||||
|
P.shot_from = source
|
||||||
|
P.name = "[source]'s shrapnel"
|
||||||
|
|
||||||
|
P.launch(T)
|
||||||
|
|
||||||
|
if(can_cover)
|
||||||
|
for(var/mob/living/M in O)
|
||||||
|
//lying on a frag grenade while the grenade is on the ground causes you to absorb most of the shrapnel.
|
||||||
|
//you will most likely be dead, but others nearby will be spared the fragments that hit you instead.
|
||||||
|
if(M.lying && isturf(get_turf(source)))
|
||||||
|
P.attack_mob(M, 0, 0)
|
||||||
|
else
|
||||||
|
P.attack_mob(M, 0, 100) //otherwise, allow a decent amount of fragments to pass
|
||||||
|
|
||||||
//Fragmentation grenade projectile
|
//Fragmentation grenade projectile
|
||||||
/obj/item/projectile/bullet/pellet/fragment
|
/obj/item/projectile/bullet/pellet/fragment
|
||||||
damage = 15
|
damage = 15
|
||||||
@@ -27,36 +55,6 @@
|
|||||||
set waitfor = 0
|
set waitfor = 0
|
||||||
..()
|
..()
|
||||||
|
|
||||||
var/turf/O = get_turf(src)
|
fragem(src,num_fragments,num_fragments,explosion_size,explosion_size+1,fragment_damage,damage_step,1)
|
||||||
if(!O) return
|
|
||||||
|
|
||||||
if(explosion_size)
|
|
||||||
explosion(O, -1, -1, explosion_size, explosion_size+1)
|
|
||||||
|
|
||||||
var/list/target_turfs = getcircle(O, spread_range)
|
|
||||||
var/fragments_per_projectile = round(num_fragments/target_turfs.len)
|
|
||||||
|
|
||||||
for(var/turf/T in target_turfs)
|
|
||||||
sleep(0)
|
|
||||||
var/obj/item/projectile/bullet/pellet/fragment/P = new (O)
|
|
||||||
|
|
||||||
P.damage = fragment_damage
|
|
||||||
P.pellets = fragments_per_projectile
|
|
||||||
P.range_step = damage_step
|
|
||||||
P.shot_from = src.name
|
|
||||||
|
|
||||||
P.launch(T)
|
|
||||||
|
|
||||||
//var/cone = new /obj/item/weapon/caution/cone (T)
|
|
||||||
//spawn(100) qdel(cone)
|
|
||||||
|
|
||||||
//Make sure to hit any mobs in the source turf
|
|
||||||
for(var/mob/living/M in O)
|
|
||||||
//lying on a frag grenade while the grenade is on the ground causes you to absorb most of the shrapnel.
|
|
||||||
//you will most likely be dead, but others nearby will be spared the fragments that hit you instead.
|
|
||||||
if(M.lying && isturf(src.loc))
|
|
||||||
P.attack_mob(M, 0, 0)
|
|
||||||
else
|
|
||||||
P.attack_mob(M, 0, 100) //otherwise, allow a decent amount of fragments to pass
|
|
||||||
|
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|||||||
@@ -4,23 +4,87 @@
|
|||||||
icon = 'icons/mob/blob.dmi'
|
icon = 'icons/mob/blob.dmi'
|
||||||
icon_state = "blob"
|
icon_state = "blob"
|
||||||
light_range = 3
|
light_range = 3
|
||||||
|
light_color = "#b5ff5b"
|
||||||
desc = "Some blob creature thingy"
|
desc = "Some blob creature thingy"
|
||||||
density = 1
|
density = 1
|
||||||
opacity = 0
|
opacity = 0
|
||||||
anchored = 1
|
anchored = 1
|
||||||
mouse_opacity = 2
|
mouse_opacity = 2
|
||||||
|
layer = 4
|
||||||
|
|
||||||
var/maxHealth = 30
|
var/maxHealth = 30
|
||||||
var/health
|
var/health
|
||||||
|
var/regen_rate = 5
|
||||||
var/brute_resist = 4
|
var/brute_resist = 4
|
||||||
|
var/laser_resist = 4 // Special resist for laser based weapons - Emitters or handheld energy weaponry. Damage is divided by this and THEN by fire_resist.
|
||||||
var/fire_resist = 1
|
var/fire_resist = 1
|
||||||
|
var/secondary_core_growth_chance = 10.0 //% chance to grow a secondary blob core instead of whatever was suposed to grown. Secondary cores are considerably weaker, but still nasty.
|
||||||
var/expandType = /obj/effect/blob
|
var/expandType = /obj/effect/blob
|
||||||
|
var/obj/effect/blob/core/parent_core = null
|
||||||
|
var/growth_range = 0
|
||||||
|
var/blob_may_process = 1
|
||||||
|
var/hangry = 0 //if the blob will attack or not.
|
||||||
|
|
||||||
/obj/effect/blob/New(loc)
|
/obj/effect/blob/New(loc)
|
||||||
|
processing_objects.Add(src)
|
||||||
health = maxHealth
|
health = maxHealth
|
||||||
update_icon()
|
update_icon()
|
||||||
return ..(loc)
|
return ..(loc)
|
||||||
|
|
||||||
|
/obj/effect/blob/Destroy()
|
||||||
|
processing_objects.Remove(src)
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/effect/blob/process()
|
||||||
|
if(!parent_core)
|
||||||
|
src.take_damage(5)
|
||||||
|
src.regen_rate = -5
|
||||||
|
src.growth_range = 0
|
||||||
|
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(prob(70))
|
||||||
|
for(var/mob/living/L in src.loc)
|
||||||
|
if(L.stat == DEAD)
|
||||||
|
if(prob(10))
|
||||||
|
L.gib()
|
||||||
|
if(health < maxHealth)
|
||||||
|
health += rand(10,30)
|
||||||
|
if(health > maxHealth)
|
||||||
|
health = maxHealth
|
||||||
|
continue
|
||||||
|
L.visible_message("<span class='danger'>The blob absorbs \the [L]!</span>", "<span class='danger'>The blob absorbs you!</span>")
|
||||||
|
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||||
|
L.take_organ_damage(rand(5, 10))
|
||||||
|
if(health < maxHealth)
|
||||||
|
health += rand(1,10)
|
||||||
|
if(health > maxHealth)
|
||||||
|
health = maxHealth
|
||||||
|
hangry += 16
|
||||||
|
|
||||||
|
for(var/mob/living/L in range(src,"3x3"))
|
||||||
|
if(!hangry)
|
||||||
|
if(L.stat == DEAD)
|
||||||
|
continue
|
||||||
|
if(prob(40))
|
||||||
|
L.visible_message("<span class='danger'>The blob sucks \the [L] into itself!</span>", "<span class='danger'>The blob sucks you in!</span>")
|
||||||
|
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||||
|
L.take_organ_damage(rand(5, 10))
|
||||||
|
L.forceMove(src.loc)
|
||||||
|
else
|
||||||
|
L.visible_message("<span class='danger'>The blob glomps \the [L]!</span>", "<span class='danger'>The blob glomps you!</span>")
|
||||||
|
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||||
|
L.take_organ_damage(rand(5, 20))
|
||||||
|
if(health < maxHealth)
|
||||||
|
health += rand(1,10)
|
||||||
|
if(health > maxHealth)
|
||||||
|
health = maxHealth
|
||||||
|
hangry += 4
|
||||||
|
|
||||||
|
hangry -= 1
|
||||||
|
if(hangry < 0)
|
||||||
|
hangry = 0
|
||||||
|
|
||||||
/obj/effect/blob/CanPass(var/atom/movable/mover, vra/turf/target, var/height = 0, var/air_group = 0)
|
/obj/effect/blob/CanPass(var/atom/movable/mover, vra/turf/target, var/height = 0, var/air_group = 0)
|
||||||
if(air_group || height == 0)
|
if(air_group || height == 0)
|
||||||
return 1
|
return 1
|
||||||
@@ -50,7 +114,7 @@
|
|||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
/obj/effect/blob/proc/regen()
|
/obj/effect/blob/proc/regen()
|
||||||
health = min(health + 1, maxHealth)
|
health = min(health + regen_rate, maxHealth)
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
/obj/effect/blob/proc/expand(var/turf/T)
|
/obj/effect/blob/proc/expand(var/turf/T)
|
||||||
@@ -58,66 +122,51 @@
|
|||||||
return
|
return
|
||||||
if(istype(T, /turf/simulated/wall))
|
if(istype(T, /turf/simulated/wall))
|
||||||
var/turf/simulated/wall/SW = T
|
var/turf/simulated/wall/SW = T
|
||||||
SW.take_damage(80)
|
SW.ex_act(2)
|
||||||
return
|
|
||||||
var/obj/structure/girder/G = locate() in T
|
|
||||||
if(G)
|
|
||||||
if(prob(40))
|
|
||||||
G.dismantle()
|
|
||||||
return
|
|
||||||
var/obj/structure/window/W = locate() in T
|
|
||||||
if(W)
|
|
||||||
W.shatter()
|
|
||||||
return
|
|
||||||
var/obj/structure/grille/GR = locate() in T
|
|
||||||
if(GR)
|
|
||||||
qdel(GR)
|
|
||||||
return
|
|
||||||
for(var/obj/machinery/door/D in T) // There can be several - and some of them can be open, locate() is not suitable
|
|
||||||
if(D.density)
|
|
||||||
D.ex_act(2)
|
|
||||||
return
|
|
||||||
var/obj/structure/foamedmetal/F = locate() in T
|
|
||||||
if(F)
|
|
||||||
qdel(F)
|
|
||||||
return
|
|
||||||
var/obj/structure/inflatable/I = locate() in T
|
|
||||||
if(I)
|
|
||||||
I.deflate(1)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
var/obj/vehicle/V = locate() in T
|
for(var/obj/O in T)
|
||||||
if(V)
|
if(O.density)
|
||||||
V.ex_act(2)
|
O.ex_act(2)
|
||||||
return
|
|
||||||
var/obj/machinery/bot/B = locate() in T
|
|
||||||
if(B)
|
|
||||||
B.ex_act(2)
|
|
||||||
return
|
|
||||||
var/obj/mecha/M = locate() in T
|
|
||||||
if(M)
|
|
||||||
M.visible_message("<span class='danger'>The blob attacks \the [M]!</span>")
|
|
||||||
M.take_damage(40)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
// Above things, we destroy completely and thus can use locate. Mobs are different.
|
// Above things, we destroy completely and thus can use locate. Mobs are different.
|
||||||
for(var/mob/living/L in T)
|
for(var/mob/living/L in T)
|
||||||
if(L.stat == DEAD)
|
if(L.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
L.visible_message("<span class='danger'>The blob attacks \the [L]!</span>", "<span class='danger'>The blob attacks you!</span>")
|
if(prob(30))
|
||||||
|
L.visible_message("<span class='danger'>The blob sucks \the [L] into itself!</span>", "<span class='danger'>The blob sucks you in!</span>")
|
||||||
|
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||||
|
L.take_organ_damage(rand(5, 10))
|
||||||
|
L.forceMove(src.loc)
|
||||||
|
else
|
||||||
|
L.visible_message("<span class='danger'>The blob pulverizes \the [L]!</span>", "<span class='danger'>The blob pulverizes you!</span>")
|
||||||
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||||
L.take_organ_damage(rand(30, 40))
|
L.take_organ_damage(rand(30, 40))
|
||||||
|
if(health < maxHealth)
|
||||||
|
health += rand(1,10)
|
||||||
|
if(health > maxHealth)
|
||||||
|
health = maxHealth
|
||||||
return
|
return
|
||||||
new expandType(T, min(health, 30))
|
|
||||||
|
if(parent_core)
|
||||||
|
if(get_dist(T,src) <= parent_core.growth_range)
|
||||||
|
if(!(locate(/obj/effect/blob/core/) in range(T, 2)) && prob(secondary_core_growth_chance) && (parent_core.core_count < parent_core.core_limit))
|
||||||
|
var/obj/effect/blob/core/secondary/S = new /obj/effect/blob/core/secondary(T)
|
||||||
|
S.parent_core = src.parent_core
|
||||||
|
src.parent_core.core_count += 1
|
||||||
|
else
|
||||||
|
var/obj/effect/blob/C = new expandType(T)
|
||||||
|
C.parent_core = src.parent_core
|
||||||
|
|
||||||
/obj/effect/blob/proc/pulse(var/forceLeft, var/list/dirs)
|
/obj/effect/blob/proc/pulse(var/forceLeft, var/list/dirs)
|
||||||
regen()
|
regen()
|
||||||
sleep(5)
|
sleep(4)
|
||||||
var/pushDir = pick(dirs)
|
var/pushDir = pick(dirs)
|
||||||
var/turf/T = get_step(src, pushDir)
|
var/turf/T = get_step(src, pushDir)
|
||||||
var/obj/effect/blob/B = (locate() in T)
|
var/obj/effect/blob/B = (locate() in T)
|
||||||
if(!B)
|
if(!B)
|
||||||
if(prob(health))
|
if(prob(health+60))
|
||||||
expand(T)
|
expand(T)
|
||||||
return
|
return
|
||||||
if(forceLeft)
|
if(forceLeft)
|
||||||
@@ -131,11 +180,12 @@
|
|||||||
if(BRUTE)
|
if(BRUTE)
|
||||||
take_damage(Proj.damage / brute_resist)
|
take_damage(Proj.damage / brute_resist)
|
||||||
if(BURN)
|
if(BURN)
|
||||||
take_damage(Proj.damage / fire_resist)
|
take_damage((Proj.damage / laser_resist) / fire_resist)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user)
|
/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||||
|
user.do_attack_animation(src)
|
||||||
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||||
visible_message("<span class='danger'>\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
visible_message("<span class='danger'>\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
|
||||||
var/damage = 0
|
var/damage = 0
|
||||||
@@ -145,6 +195,11 @@
|
|||||||
if(istype(W, /obj/item/weapon/weldingtool))
|
if(istype(W, /obj/item/weapon/weldingtool))
|
||||||
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
|
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
|
||||||
if("brute")
|
if("brute")
|
||||||
|
if(prob(30))
|
||||||
|
visible_message("<span class='danger'>\The [W] gets caught in the gelatinous folds of \the [src]</span>")
|
||||||
|
user.drop_from_inventory(W)
|
||||||
|
W.forceMove(src.loc)
|
||||||
|
return
|
||||||
damage = (W.force / brute_resist)
|
damage = (W.force / brute_resist)
|
||||||
|
|
||||||
take_damage(damage)
|
take_damage(damage)
|
||||||
@@ -154,26 +209,38 @@
|
|||||||
name = "blob core"
|
name = "blob core"
|
||||||
icon = 'icons/mob/blob.dmi'
|
icon = 'icons/mob/blob.dmi'
|
||||||
icon_state = "blob_core"
|
icon_state = "blob_core"
|
||||||
|
light_range = 1
|
||||||
|
light_power = 2
|
||||||
|
light_color = "#F3D203"
|
||||||
maxHealth = 200
|
maxHealth = 200
|
||||||
brute_resist = 2
|
brute_resist = 2
|
||||||
|
laser_resist = 7
|
||||||
|
regen_rate = 2
|
||||||
fire_resist = 2
|
fire_resist = 2
|
||||||
|
var/core_count //amount of secondary cores
|
||||||
|
var/core_limit = 4 //for if a badmin ever wants the station to die, they can set this higher
|
||||||
|
|
||||||
expandType = /obj/effect/blob/shield
|
expandType = /obj/effect/blob/shield
|
||||||
var/blob_may_process = 1
|
growth_range = 10 // Maximal distance for new blob pieces from this core.
|
||||||
|
|
||||||
|
/obj/effect/blob/core/New()
|
||||||
|
if(!parent_core)
|
||||||
|
parent_core = src
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/effect/blob/core/update_icon()
|
/obj/effect/blob/core/update_icon()
|
||||||
return
|
var/health_percent = (health / maxHealth) * 100
|
||||||
|
switch(health_percent)
|
||||||
/obj/effect/blob/core/New(loc)
|
if(66 to INFINITY)
|
||||||
processing_objects.Add(src)
|
icon_state = "blob_core"
|
||||||
return ..(loc)
|
if(33 to 66)
|
||||||
|
icon_state = "blob_node"
|
||||||
/obj/effect/blob/core/Destroy()
|
if(-INFINITY to 33)
|
||||||
processing_objects.Remove(src)
|
icon_state = "blob_factory"
|
||||||
return ..()
|
|
||||||
|
|
||||||
/obj/effect/blob/core/process()
|
/obj/effect/blob/core/process()
|
||||||
set waitfor = 0
|
set waitfor = 0
|
||||||
|
..()
|
||||||
if(!blob_may_process)
|
if(!blob_may_process)
|
||||||
return
|
return
|
||||||
blob_may_process = 0
|
blob_may_process = 0
|
||||||
@@ -184,18 +251,42 @@
|
|||||||
pulse(20, list(SOUTH, WEST))
|
pulse(20, list(SOUTH, WEST))
|
||||||
blob_may_process = 1
|
blob_may_process = 1
|
||||||
|
|
||||||
|
// Half the stats of a normal core. Blob has a very small probability of growing these when spreading. These will spread the blob further.
|
||||||
|
/obj/effect/blob/core/secondary
|
||||||
|
name = "small blob core"
|
||||||
|
icon = 'icons/mob/blob.dmi'
|
||||||
|
icon_state = "blob_core"
|
||||||
|
maxHealth = 100
|
||||||
|
brute_resist = 1
|
||||||
|
fire_resist = 1
|
||||||
|
laser_resist = 4
|
||||||
|
regen_rate = 1
|
||||||
|
growth_range = 3
|
||||||
|
|
||||||
|
/obj/effect/blob/core/secondary/New()
|
||||||
|
processing_objects.Add(src)
|
||||||
|
health = maxHealth
|
||||||
|
update_icon()
|
||||||
|
return ..(loc)
|
||||||
|
|
||||||
|
/obj/effect/blob/core/secondary/Destroy()
|
||||||
|
if(parent_core)
|
||||||
|
parent_core.core_count -= 1
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/effect/blob/shield
|
/obj/effect/blob/shield
|
||||||
name = "strong blob"
|
name = "strong blob"
|
||||||
icon = 'icons/mob/blob.dmi'
|
icon = 'icons/mob/blob.dmi'
|
||||||
icon_state = "blob_idle"
|
icon_state = "blob_idle"
|
||||||
desc = "Some blob creature thingy"
|
opacity = 1
|
||||||
maxHealth = 60
|
maxHealth = 60
|
||||||
brute_resist = 1
|
brute_resist = 1
|
||||||
fire_resist = 2
|
fire_resist = 2
|
||||||
|
laser_resist = 5
|
||||||
|
|
||||||
/obj/effect/blob/shield/New()
|
/obj/effect/blob/shield/New()
|
||||||
..()
|
|
||||||
update_nearby_tiles()
|
update_nearby_tiles()
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/effect/blob/shield/Destroy()
|
/obj/effect/blob/shield/Destroy()
|
||||||
density = 0
|
density = 0
|
||||||
|
|||||||
@@ -624,8 +624,9 @@ BLIND // can't see anything
|
|||||||
|
|
||||||
/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
|
/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
|
||||||
var/mob/M = usr
|
var/mob/M = usr
|
||||||
if (istype(M, /mob/dead/)) return
|
if(M.stat || M.paralysis || M.stunned || M.weakened || M.restrained())
|
||||||
if (usr.stat || usr.restrained()) return
|
usr << "You cannot reach your suit sensors like this..."
|
||||||
|
return
|
||||||
if(has_sensor >= 2)
|
if(has_sensor >= 2)
|
||||||
usr << "The controls are locked."
|
usr << "The controls are locked."
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -69,6 +69,9 @@
|
|||||||
var/dummy = 0
|
var/dummy = 0
|
||||||
//If 1, this event is a dummy instance used for retrieving values, it should not run or add/remove itself from any lists
|
//If 1, this event is a dummy instance used for retrieving values, it should not run or add/remove itself from any lists
|
||||||
|
|
||||||
|
var/two_part = 0
|
||||||
|
//used for events that run secondary announcements, like releasing maint access.
|
||||||
|
|
||||||
/datum/event/nothing
|
/datum/event/nothing
|
||||||
no_fake = 1
|
no_fake = 1
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,13 @@
|
|||||||
endWhen = 90
|
endWhen = 90
|
||||||
var/datum/event_meta/EM
|
var/datum/event_meta/EM
|
||||||
var/eventname
|
var/eventname
|
||||||
|
var/datum/event/E = null
|
||||||
|
|
||||||
|
|
||||||
/datum/event/false_alarm/end()
|
/datum/event/false_alarm/end()
|
||||||
command_announcement.Announce("Error, It appears our previous announcement about [eventname] was a sensor glitch. There is no cause for alarm, please return to your stations.", "False Alarm")
|
command_announcement.Announce("Error, It appears our previous announcement about [eventname] was a sensor glitch. There is no cause for alarm, please return to your stations.", "False Alarm")
|
||||||
|
if(two_part)
|
||||||
|
E.end()
|
||||||
if (EM)
|
if (EM)
|
||||||
qdel(EM)
|
qdel(EM)
|
||||||
EM = null
|
EM = null
|
||||||
@@ -25,7 +28,6 @@
|
|||||||
|
|
||||||
//Don't pick events that are excluded from faking.
|
//Don't pick events that are excluded from faking.
|
||||||
EM = pick(EC.available_events)
|
EM = pick(EC.available_events)
|
||||||
var/datum/event/E = null
|
|
||||||
var/fake_allowed = 0
|
var/fake_allowed = 0
|
||||||
while (!fake_allowed)
|
while (!fake_allowed)
|
||||||
if (E)
|
if (E)
|
||||||
@@ -40,6 +42,9 @@
|
|||||||
eventname = E.ic_name
|
eventname = E.ic_name
|
||||||
else
|
else
|
||||||
eventname = EM.name
|
eventname = EM.name
|
||||||
|
if(E.two_part)
|
||||||
|
two_part = 1
|
||||||
|
E.start()
|
||||||
|
|
||||||
E.kill()
|
E.kill()
|
||||||
E.announce()
|
E.announce()
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
announceWhen = 1
|
announceWhen = 1
|
||||||
endWhen = revokeAccess
|
endWhen = revokeAccess
|
||||||
var/postStartTicks = 0
|
var/postStartTicks = 0
|
||||||
|
two_part = 1
|
||||||
ic_name = "radiation"
|
ic_name = "radiation"
|
||||||
|
|
||||||
/datum/event/radiation_storm/announce()
|
/datum/event/radiation_storm/announce()
|
||||||
|
|||||||
@@ -141,14 +141,22 @@
|
|||||||
return src.attack_hand(user)
|
return src.attack_hand(user)
|
||||||
|
|
||||||
/obj/machinery/mining/drill/attackby(obj/item/O as obj, mob/user as mob)
|
/obj/machinery/mining/drill/attackby(obj/item/O as obj, mob/user as mob)
|
||||||
if(!active)
|
if(!active && !panel_open)
|
||||||
if(default_deconstruction_screwdriver(user, O))
|
if(default_deconstruction_screwdriver(user, O))
|
||||||
return
|
return
|
||||||
if(default_deconstruction_crowbar(user, O))
|
if(default_deconstruction_crowbar(user, O))
|
||||||
return
|
return
|
||||||
if(default_part_replacement(user, O))
|
if(default_part_replacement(user, O))
|
||||||
return
|
return
|
||||||
if(!panel_open || active) return ..()
|
if(active) return ..()
|
||||||
|
|
||||||
|
if(istype(O, /obj/item/weapon/crowbar))
|
||||||
|
if (panel_open && cell)
|
||||||
|
user << "You wrench out \the [cell]."
|
||||||
|
cell.forceMove(get_turf(user))
|
||||||
|
component_parts -= cell
|
||||||
|
cell = null
|
||||||
|
return
|
||||||
|
|
||||||
if(istype(O, /obj/item/weapon/cell))
|
if(istype(O, /obj/item/weapon/cell))
|
||||||
if(cell)
|
if(cell)
|
||||||
@@ -165,13 +173,7 @@
|
|||||||
/obj/machinery/mining/drill/attack_hand(mob/user as mob)
|
/obj/machinery/mining/drill/attack_hand(mob/user as mob)
|
||||||
check_supports()
|
check_supports()
|
||||||
|
|
||||||
if (panel_open && cell)
|
if(need_player_check)
|
||||||
user << "You take out \the [cell]."
|
|
||||||
cell.loc = get_turf(user)
|
|
||||||
component_parts -= cell
|
|
||||||
cell = null
|
|
||||||
return
|
|
||||||
else if(need_player_check)
|
|
||||||
user << "You hit the manual override and reset the drill's error checking."
|
user << "You hit the manual override and reset the drill's error checking."
|
||||||
need_player_check = 0
|
need_player_check = 0
|
||||||
if(anchored)
|
if(anchored)
|
||||||
@@ -189,8 +191,46 @@
|
|||||||
else
|
else
|
||||||
user << "<span class='notice'>The drill is unpowered.</span>"
|
user << "<span class='notice'>The drill is unpowered.</span>"
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>Turning on a piece of industrial machinery without sufficient bracing or wires exposed is a bad idea.</span>"
|
if(use_cell_power())
|
||||||
|
if(!supported && !panel_open)
|
||||||
|
system_error("unbraced drill error")
|
||||||
|
sleep(30)
|
||||||
|
if(!supported) //if you can resolve it manually in three seconds then power to you good-sir.
|
||||||
|
if(prob(50))
|
||||||
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\"</span>")
|
||||||
|
else
|
||||||
|
visible_message("<span class='danger'>\The [src] explodes!</span>")
|
||||||
|
fragem(src,10,35,2,1,5,1,0)
|
||||||
|
qdel(src)
|
||||||
|
else
|
||||||
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unbraced drill error manually resolved. Operations may resume normally.\"</span>")
|
||||||
|
if(supported && panel_open)
|
||||||
|
if(cell)
|
||||||
|
system_error("unsealed cell fitting error")
|
||||||
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||||
|
s.set_up(3, 1, src.loc)
|
||||||
|
s.start()
|
||||||
|
sleep(20)
|
||||||
|
s.set_up(3, 1, src.loc)
|
||||||
|
s.start()
|
||||||
|
sleep(10)
|
||||||
|
s.set_up(3, 1, src.loc)
|
||||||
|
s.start()
|
||||||
|
sleep(10)
|
||||||
|
if(panel_open)
|
||||||
|
if(prob(70))
|
||||||
|
visible_message("<span class='danger'>\The [src]'s cell shorts out!</span>")
|
||||||
|
cell.use(cell.charge)
|
||||||
|
else
|
||||||
|
visible_message("<span class='danger'>\The [src]'s cell detonates!</span>")
|
||||||
|
explosion(src.loc, -1, -1, 2, 1)
|
||||||
|
qdel(cell)
|
||||||
|
component_parts -= cell
|
||||||
|
cell = null
|
||||||
|
else
|
||||||
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unsealed cell fitting error manually resolved. Operations may resume normally.\"</span>")
|
||||||
|
else
|
||||||
|
user << "<span class='notice'>The drill is unpowered.</span>"
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
/obj/machinery/mining/drill/update_icon()
|
/obj/machinery/mining/drill/update_icon()
|
||||||
@@ -238,7 +278,8 @@
|
|||||||
/obj/machinery/mining/drill/proc/system_error(var/error)
|
/obj/machinery/mining/drill/proc/system_error(var/error)
|
||||||
|
|
||||||
if(error)
|
if(error)
|
||||||
src.visible_message("<span class='notice'>\The [src] flashes a '[error]' warning.</span>")
|
visible_message("<span class='warning'>\icon[src] [src.name] flashes a system warning: [error].</span>")
|
||||||
|
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 100, 1)
|
||||||
need_player_check = 1
|
need_player_check = 1
|
||||||
active = 0
|
active = 0
|
||||||
update_icon()
|
update_icon()
|
||||||
@@ -283,7 +324,9 @@
|
|||||||
O.loc = B
|
O.loc = B
|
||||||
usr << "<span class='notice'>You unload the drill's storage cache into the ore box.</span>"
|
usr << "<span class='notice'>You unload the drill's storage cache into the ore box.</span>"
|
||||||
else
|
else
|
||||||
usr << "<span class='notice'>You must move an ore box up to the drill before you can unload it.</span>"
|
for(var/obj/item/weapon/ore/O in contents)
|
||||||
|
O.forceMove(src.loc)
|
||||||
|
usr << "<span class='notice'>You spill the content's of the drill's storage box all over the ground. Idiot.</span>"
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/mining/brace
|
/obj/machinery/mining/brace
|
||||||
@@ -292,15 +335,69 @@
|
|||||||
icon_state = "mining_brace"
|
icon_state = "mining_brace"
|
||||||
var/obj/machinery/mining/drill/connected
|
var/obj/machinery/mining/drill/connected
|
||||||
|
|
||||||
|
/obj/machinery/mining/brace/New()
|
||||||
|
..()
|
||||||
|
|
||||||
|
component_parts = list()
|
||||||
|
component_parts += new /obj/item/weapon/circuitboard/miningdrillbrace(src)
|
||||||
|
|
||||||
/obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
|
if(connected && connected.active)
|
||||||
|
user << "<span class='notice'>You know you ought not work with the brace of a <i>running</i> drill, but you do anyways.</span>"
|
||||||
|
sleep(5)
|
||||||
|
if(istype(user, /mob/living/carbon/human))
|
||||||
|
//Save the users active hand
|
||||||
|
var/mob/living/carbon/human/H = user
|
||||||
|
var/obj/item/organ/external/LA = H.get_organ("l_hand")
|
||||||
|
var/obj/item/organ/external/RA = H.get_organ("r_hand")
|
||||||
|
var/active_hand = H.hand
|
||||||
|
if(prob(20))
|
||||||
|
if(active_hand)
|
||||||
|
LA.droplimb(0,DROPLIMB_BLUNT)
|
||||||
|
else
|
||||||
|
RA.droplimb(0,DROPLIMB_BLUNT)
|
||||||
|
connected.system_error("unexpected user interface error")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
H.apply_damage(25,BRUTE, sharp=1, edge=1)
|
||||||
|
connected.system_error("unexpected user interface error")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
var/mob/living/M = user
|
||||||
|
M.apply_damage(25,BRUTE, sharp=1, edge=1)
|
||||||
|
|
||||||
|
if(default_deconstruction_screwdriver(user, W))
|
||||||
|
return
|
||||||
|
if(default_deconstruction_crowbar(user, W))
|
||||||
|
return
|
||||||
|
|
||||||
if(istype(W,/obj/item/weapon/wrench))
|
if(istype(W,/obj/item/weapon/wrench))
|
||||||
|
|
||||||
if(istype(get_turf(src), /turf/space))
|
if(istype(get_turf(src), /turf/space))
|
||||||
user << "<span class='notice'>You can't anchor something to empty space. Idiot.</span>"
|
user << "<span class='notice'>You send the [src] careening into space. Idiot.</span>"
|
||||||
|
var/inertia = rand(10,30)
|
||||||
|
for(var/i in 1 to inertia)
|
||||||
|
step_away(src,user,15,8)
|
||||||
|
if(!(istype(get_turf(src), /turf/space)))
|
||||||
|
break
|
||||||
|
sleep(1)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(connected && connected.active)
|
if(connected && connected.active)
|
||||||
user << "<span class='notice'>You can't unanchor the brace of a running drill!</span>"
|
if(prob(50))
|
||||||
|
sleep(10)
|
||||||
|
connected.system_error("unbraced drill error")
|
||||||
|
sleep(30)
|
||||||
|
if(connected && connected.active) //if you can resolve it manually in three seconds then power to you good-sir.
|
||||||
|
if(prob(50))
|
||||||
|
visible_message("<span class='notice'>\icon[src] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\"</span>")
|
||||||
|
else
|
||||||
|
visible_message("<span class='danger'>\The [src] explodes!</span>")
|
||||||
|
fragem(src,10,35,2,1,5,1,0)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
else
|
||||||
|
connected.system_error("unexpected user interface error")
|
||||||
return
|
return
|
||||||
|
|
||||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
|
||||||
|
|||||||
@@ -217,7 +217,15 @@
|
|||||||
if(say_understands(speaker, language))
|
if(say_understands(speaker, language))
|
||||||
message = "<B>[speaker]</B> [verb], \"[message]\""
|
message = "<B>[speaker]</B> [verb], \"[message]\""
|
||||||
else
|
else
|
||||||
message = "<B>[speaker]</B> [verb]."
|
var/adverb
|
||||||
|
var/length = length(message) * pick(0.8, 0.9, 1.0, 1.1, 1.2) //Inserts a little fuzziness.
|
||||||
|
switch(length)
|
||||||
|
if(0 to 12) adverb = " briefly"
|
||||||
|
if(12 to 30) adverb = " a short message"
|
||||||
|
if(30 to 48) adverb = " a message"
|
||||||
|
if(48 to 90) adverb = " a lengthy message"
|
||||||
|
else adverb = " a very lengthy message"
|
||||||
|
message = "<B>[speaker]</B> [verb][adverb]."
|
||||||
|
|
||||||
if(src.status_flags & PASSEMOTES)
|
if(src.status_flags & PASSEMOTES)
|
||||||
for(var/obj/item/weapon/holder/H in src.contents)
|
for(var/obj/item/weapon/holder/H in src.contents)
|
||||||
|
|||||||
@@ -908,24 +908,8 @@
|
|||||||
sleep(20)
|
sleep(20)
|
||||||
playsound(loc, 'sound/effects/alert.ogg', 125, 1)
|
playsound(loc, 'sound/effects/alert.ogg', 125, 1)
|
||||||
sleep(10)
|
sleep(10)
|
||||||
var/turf/O = get_turf(src)
|
|
||||||
var/fragger = rand(50,100)
|
|
||||||
density = 0
|
density = 0
|
||||||
explosion(O, -1, -1, 2)
|
fragem(src,50,100,2,1,5,1,0)
|
||||||
var/list/target_turfs = getcircle(O, 7)
|
|
||||||
var/fragments_per_projectile = round(fragger/target_turfs.len)
|
|
||||||
|
|
||||||
for(var/turf/T in target_turfs)
|
|
||||||
sleep(0)
|
|
||||||
var/obj/item/projectile/bullet/pellet/fragment/P = new (O)
|
|
||||||
|
|
||||||
P.damage = 5
|
|
||||||
P.pellets = fragments_per_projectile
|
|
||||||
P.range_step = 1
|
|
||||||
P.shot_from = src.name
|
|
||||||
P.name = "[src]'s shrapnel"
|
|
||||||
|
|
||||||
P.launch(T)
|
|
||||||
gib()
|
gib()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -500,15 +500,15 @@ obj/item/weapon/gun/energy/staff/special_check(var/mob/user)
|
|||||||
LL.droplimb(0,DROPLIMB_BLUNT)
|
LL.droplimb(0,DROPLIMB_BLUNT)
|
||||||
RL.droplimb(0,DROPLIMB_BLUNT)
|
RL.droplimb(0,DROPLIMB_BLUNT)
|
||||||
playsound(user, 'sound/effects/splat.ogg', 50, 1)
|
playsound(user, 'sound/effects/splat.ogg', 50, 1)
|
||||||
user.show_message("\red With a sickening series of crunches, [user]'s body shrinks, and they begin to sprout feathers!")
|
user.visible_message("<span class = 'danger'> With a sickening series of crunches, [user]'s body shrinks, and they begin to sprout feathers!</span>")
|
||||||
user.show_message("<b>[user]</b> screams!",2)
|
user.visible_message("<b>[user]</b> screams!",2)
|
||||||
new_mob = new /mob/living/simple_animal/parrot(H.loc)
|
new_mob = new /mob/living/simple_animal/parrot(H.loc)
|
||||||
new_mob.universal_speak = 1
|
new_mob.universal_speak = 1
|
||||||
new_mob.key = H.key
|
new_mob.key = H.key
|
||||||
new_mob.a_intent = "harm"
|
new_mob.a_intent = "harm"
|
||||||
qdel(H)
|
qdel(H)
|
||||||
sleep(20)
|
sleep(20)
|
||||||
new_mob.show_message("<b>[new_mob]</b> squawks, 'Poly wanna cracker!'",2)
|
new_mob.say("Poly wanna cracker!")
|
||||||
return 0
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -537,8 +537,8 @@ obj/item/weapon/gun/energy/staff/animate/special_check(var/mob/user)
|
|||||||
var/obj/item/organ/external/RA = H.get_organ("r_hand")
|
var/obj/item/organ/external/RA = H.get_organ("r_hand")
|
||||||
var/active_hand = H.hand
|
var/active_hand = H.hand
|
||||||
playsound(user, 'sound/effects/blobattack.ogg', 40, 1)
|
playsound(user, 'sound/effects/blobattack.ogg', 40, 1)
|
||||||
user.visible_message("\red With a sickening crunch, [user]'s hand rips itself off, and begins crawling away!")
|
user.visible_message("<span class = 'danger'> With a sickening crunch, [user]'s hand rips itself off, and begins crawling away!</span>")
|
||||||
user.show_message("<b>[user]</b> screams!",2)
|
user.visible_message("<b>[user]</b> screams!",2)
|
||||||
user.drop_item()
|
user.drop_item()
|
||||||
if(active_hand)
|
if(active_hand)
|
||||||
LA.droplimb(0,DROPLIMB_EDGE)
|
LA.droplimb(0,DROPLIMB_EDGE)
|
||||||
|
|||||||
@@ -1341,6 +1341,20 @@ CIRCUITS BELOW
|
|||||||
build_path = /obj/item/weapon/circuitboard/biogenerator
|
build_path = /obj/item/weapon/circuitboard/biogenerator
|
||||||
sort_string = "KBAAA"
|
sort_string = "KBAAA"
|
||||||
|
|
||||||
|
/datum/design/circuit/miningdrill
|
||||||
|
name = "mining drill head"
|
||||||
|
id = "mining drill head"
|
||||||
|
req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
|
||||||
|
build_path = /obj/item/weapon/circuitboard/miningdrill
|
||||||
|
sort_string = "KCAAA"
|
||||||
|
|
||||||
|
/datum/design/circuit/miningdrillbrace
|
||||||
|
name = "mining drill brace"
|
||||||
|
id = "mining drill brace"
|
||||||
|
req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
|
||||||
|
build_path = /obj/item/weapon/circuitboard/miningdrillbrace
|
||||||
|
sort_string = "KCAAB"
|
||||||
|
|
||||||
/datum/design/circuit/comconsole
|
/datum/design/circuit/comconsole
|
||||||
name = "communications console"
|
name = "communications console"
|
||||||
id = "comconsole"
|
id = "comconsole"
|
||||||
|
|||||||
38
html/changelogs/LordFowl - PR 3113912125.yml
Normal file
38
html/changelogs/LordFowl - PR 3113912125.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
################################
|
||||||
|
# Example Changelog File
|
||||||
|
#
|
||||||
|
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||||
|
#
|
||||||
|
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||||
|
# When it is, any changes listed below will disappear.
|
||||||
|
#
|
||||||
|
# Valid Prefixes:
|
||||||
|
# bugfix
|
||||||
|
# wip (For works in progress)
|
||||||
|
# tweak
|
||||||
|
# soundadd
|
||||||
|
# sounddel
|
||||||
|
# rscadd (general adding of nice things)
|
||||||
|
# rscdel (general deleting of nice things)
|
||||||
|
# imageadd
|
||||||
|
# imagedel
|
||||||
|
# maptweak
|
||||||
|
# spellcheck (typo fixes)
|
||||||
|
# experiment
|
||||||
|
#################################
|
||||||
|
|
||||||
|
# Your name.
|
||||||
|
author: LordFowl
|
||||||
|
|
||||||
|
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||||
|
delete-after: True
|
||||||
|
|
||||||
|
# Any changes you've made. See valid prefix list above.
|
||||||
|
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||||
|
# SCREW THIS UP AND IT WON'T WORK.
|
||||||
|
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||||
|
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||||
|
changes:
|
||||||
|
- tweak: "Removing cells from industrial mining drills now requires a crowbar."
|
||||||
|
- rscadd: "Industrial mining drills have been made more dangerous."
|
||||||
|
- rscadd: "Blobs have been made more dangerous."
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 6.1 KiB |
Reference in New Issue
Block a user