mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-19 11:58:39 +01: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
|
||||
generic
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core)
|
||||
gibamounts = list(2,2,1)
|
||||
/obj/effect/gibspawner/generic
|
||||
gibtypes = list(
|
||||
/obj/effect/decal/cleanable/blood/gibs,
|
||||
/obj/effect/decal/cleanable/blood/gibs,
|
||||
/obj/effect/decal/cleanable/blood/gibs/core
|
||||
)
|
||||
gibamounts = list(2,2,1)
|
||||
|
||||
New()
|
||||
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
||||
..()
|
||||
/obj/effect/gibspawner/generic/New()
|
||||
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
|
||||
..()
|
||||
|
||||
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)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
/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)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
|
||||
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)
|
||||
..()
|
||||
/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())
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
robot
|
||||
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)
|
||||
gibamounts = list(1,1,1,1,1,1)
|
||||
/obj/effect/gibspawner/robot
|
||||
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
|
||||
)
|
||||
gibamounts = list(1,1,1,1,1,1)
|
||||
|
||||
New()
|
||||
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)
|
||||
..()
|
||||
/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)
|
||||
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)
|
||||
..()
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef T_BOARD
|
||||
#error T_BOARD macro is not defined but we need it!
|
||||
#error T_BOARD macro is not defined but we need it!
|
||||
#endif
|
||||
|
||||
/obj/item/weapon/circuitboard/miningdrill
|
||||
@@ -11,4 +11,11 @@
|
||||
"/obj/item/weapon/stock_parts/capacitor" = 1,
|
||||
"/obj/item/weapon/cell" = 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
|
||||
/obj/item/projectile/bullet/pellet/fragment
|
||||
damage = 15
|
||||
@@ -27,36 +55,6 @@
|
||||
set waitfor = 0
|
||||
..()
|
||||
|
||||
var/turf/O = get_turf(src)
|
||||
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
|
||||
fragem(src,num_fragments,num_fragments,explosion_size,explosion_size+1,fragment_damage,damage_step,1)
|
||||
|
||||
qdel(src)
|
||||
|
||||
+150
-59
@@ -4,23 +4,87 @@
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "blob"
|
||||
light_range = 3
|
||||
light_color = "#b5ff5b"
|
||||
desc = "Some blob creature thingy"
|
||||
density = 1
|
||||
opacity = 0
|
||||
anchored = 1
|
||||
mouse_opacity = 2
|
||||
layer = 4
|
||||
|
||||
var/maxHealth = 30
|
||||
var/health
|
||||
var/regen_rate = 5
|
||||
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/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/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)
|
||||
processing_objects.Add(src)
|
||||
health = maxHealth
|
||||
update_icon()
|
||||
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)
|
||||
if(air_group || height == 0)
|
||||
return 1
|
||||
@@ -50,7 +114,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/effect/blob/proc/regen()
|
||||
health = min(health + 1, maxHealth)
|
||||
health = min(health + regen_rate, maxHealth)
|
||||
update_icon()
|
||||
|
||||
/obj/effect/blob/proc/expand(var/turf/T)
|
||||
@@ -58,66 +122,51 @@
|
||||
return
|
||||
if(istype(T, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/SW = T
|
||||
SW.take_damage(80)
|
||||
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)
|
||||
SW.ex_act(2)
|
||||
return
|
||||
|
||||
var/obj/vehicle/V = locate() in T
|
||||
if(V)
|
||||
V.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
|
||||
for(var/obj/O in T)
|
||||
if(O.density)
|
||||
O.ex_act(2)
|
||||
return
|
||||
|
||||
// Above things, we destroy completely and thus can use locate. Mobs are different.
|
||||
for(var/mob/living/L in T)
|
||||
if(L.stat == DEAD)
|
||||
continue
|
||||
L.visible_message("<span class='danger'>The blob attacks \the [L]!</span>", "<span class='danger'>The blob attacks you!</span>")
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
L.take_organ_damage(rand(30, 40))
|
||||
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)
|
||||
L.take_organ_damage(rand(30, 40))
|
||||
if(health < maxHealth)
|
||||
health += rand(1,10)
|
||||
if(health > maxHealth)
|
||||
health = maxHealth
|
||||
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)
|
||||
regen()
|
||||
sleep(5)
|
||||
sleep(4)
|
||||
var/pushDir = pick(dirs)
|
||||
var/turf/T = get_step(src, pushDir)
|
||||
var/obj/effect/blob/B = (locate() in T)
|
||||
if(!B)
|
||||
if(prob(health))
|
||||
if(prob(health+60))
|
||||
expand(T)
|
||||
return
|
||||
if(forceLeft)
|
||||
@@ -131,11 +180,12 @@
|
||||
if(BRUTE)
|
||||
take_damage(Proj.damage / brute_resist)
|
||||
if(BURN)
|
||||
take_damage(Proj.damage / fire_resist)
|
||||
take_damage((Proj.damage / laser_resist) / fire_resist)
|
||||
return 0
|
||||
|
||||
/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
user.do_attack_animation(src)
|
||||
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>")
|
||||
var/damage = 0
|
||||
@@ -145,6 +195,11 @@
|
||||
if(istype(W, /obj/item/weapon/weldingtool))
|
||||
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
|
||||
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)
|
||||
|
||||
take_damage(damage)
|
||||
@@ -154,26 +209,38 @@
|
||||
name = "blob core"
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "blob_core"
|
||||
light_range = 1
|
||||
light_power = 2
|
||||
light_color = "#F3D203"
|
||||
maxHealth = 200
|
||||
brute_resist = 2
|
||||
laser_resist = 7
|
||||
regen_rate = 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
|
||||
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()
|
||||
return
|
||||
|
||||
/obj/effect/blob/core/New(loc)
|
||||
processing_objects.Add(src)
|
||||
return ..(loc)
|
||||
|
||||
/obj/effect/blob/core/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
return ..()
|
||||
var/health_percent = (health / maxHealth) * 100
|
||||
switch(health_percent)
|
||||
if(66 to INFINITY)
|
||||
icon_state = "blob_core"
|
||||
if(33 to 66)
|
||||
icon_state = "blob_node"
|
||||
if(-INFINITY to 33)
|
||||
icon_state = "blob_factory"
|
||||
|
||||
/obj/effect/blob/core/process()
|
||||
set waitfor = 0
|
||||
..()
|
||||
if(!blob_may_process)
|
||||
return
|
||||
blob_may_process = 0
|
||||
@@ -184,18 +251,42 @@
|
||||
pulse(20, list(SOUTH, WEST))
|
||||
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
|
||||
name = "strong blob"
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "blob_idle"
|
||||
desc = "Some blob creature thingy"
|
||||
opacity = 1
|
||||
maxHealth = 60
|
||||
brute_resist = 1
|
||||
fire_resist = 2
|
||||
laser_resist = 5
|
||||
|
||||
/obj/effect/blob/shield/New()
|
||||
..()
|
||||
update_nearby_tiles()
|
||||
..()
|
||||
|
||||
/obj/effect/blob/shield/Destroy()
|
||||
density = 0
|
||||
|
||||
@@ -580,7 +580,7 @@ BLIND // can't see anything
|
||||
else
|
||||
rolled_down = -1
|
||||
if(H) update_clothing_icon()
|
||||
|
||||
|
||||
/obj/item/clothing/under/proc/update_rollsleeves_status()
|
||||
var/mob/living/carbon/human/H
|
||||
if(istype(src.loc, /mob/living/carbon/human))
|
||||
@@ -624,8 +624,9 @@ BLIND // can't see anything
|
||||
|
||||
/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
|
||||
var/mob/M = usr
|
||||
if (istype(M, /mob/dead/)) return
|
||||
if (usr.stat || usr.restrained()) return
|
||||
if(M.stat || M.paralysis || M.stunned || M.weakened || M.restrained())
|
||||
usr << "You cannot reach your suit sensors like this..."
|
||||
return
|
||||
if(has_sensor >= 2)
|
||||
usr << "The controls are locked."
|
||||
return 0
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
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
|
||||
|
||||
var/two_part = 0
|
||||
//used for events that run secondary announcements, like releasing maint access.
|
||||
|
||||
/datum/event/nothing
|
||||
no_fake = 1
|
||||
|
||||
|
||||
@@ -8,10 +8,13 @@
|
||||
endWhen = 90
|
||||
var/datum/event_meta/EM
|
||||
var/eventname
|
||||
var/datum/event/E = null
|
||||
|
||||
|
||||
/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")
|
||||
if(two_part)
|
||||
E.end()
|
||||
if (EM)
|
||||
qdel(EM)
|
||||
EM = null
|
||||
@@ -25,7 +28,6 @@
|
||||
|
||||
//Don't pick events that are excluded from faking.
|
||||
EM = pick(EC.available_events)
|
||||
var/datum/event/E = null
|
||||
var/fake_allowed = 0
|
||||
while (!fake_allowed)
|
||||
if (E)
|
||||
@@ -40,6 +42,9 @@
|
||||
eventname = E.ic_name
|
||||
else
|
||||
eventname = EM.name
|
||||
if(E.two_part)
|
||||
two_part = 1
|
||||
E.start()
|
||||
|
||||
E.kill()
|
||||
E.announce()
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
announceWhen = 1
|
||||
endWhen = revokeAccess
|
||||
var/postStartTicks = 0
|
||||
two_part = 1
|
||||
ic_name = "radiation"
|
||||
|
||||
/datum/event/radiation_storm/announce()
|
||||
|
||||
@@ -141,14 +141,22 @@
|
||||
return src.attack_hand(user)
|
||||
|
||||
/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))
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, O))
|
||||
return
|
||||
if(default_part_replacement(user, O))
|
||||
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(cell)
|
||||
@@ -165,13 +173,7 @@
|
||||
/obj/machinery/mining/drill/attack_hand(mob/user as mob)
|
||||
check_supports()
|
||||
|
||||
if (panel_open && cell)
|
||||
user << "You take out \the [cell]."
|
||||
cell.loc = get_turf(user)
|
||||
component_parts -= cell
|
||||
cell = null
|
||||
return
|
||||
else if(need_player_check)
|
||||
if(need_player_check)
|
||||
user << "You hit the manual override and reset the drill's error checking."
|
||||
need_player_check = 0
|
||||
if(anchored)
|
||||
@@ -189,8 +191,46 @@
|
||||
else
|
||||
user << "<span class='notice'>The drill is unpowered.</span>"
|
||||
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()
|
||||
|
||||
/obj/machinery/mining/drill/update_icon()
|
||||
@@ -238,7 +278,8 @@
|
||||
/obj/machinery/mining/drill/proc/system_error(var/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
|
||||
active = 0
|
||||
update_icon()
|
||||
@@ -283,7 +324,9 @@
|
||||
O.loc = B
|
||||
usr << "<span class='notice'>You unload the drill's storage cache into the ore box.</span>"
|
||||
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
|
||||
@@ -292,16 +335,70 @@
|
||||
icon_state = "mining_brace"
|
||||
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)
|
||||
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(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
|
||||
|
||||
if(connected && connected.active)
|
||||
user << "<span class='notice'>You can't unanchor the brace of a running drill!</span>"
|
||||
return
|
||||
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
|
||||
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
|
||||
user << "<span class='notice'>You [anchored ? "un" : ""]anchor the brace.</span>"
|
||||
@@ -356,4 +453,4 @@
|
||||
return 0
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -217,7 +217,15 @@
|
||||
if(say_understands(speaker, language))
|
||||
message = "<B>[speaker]</B> [verb], \"[message]\""
|
||||
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)
|
||||
for(var/obj/item/weapon/holder/H in src.contents)
|
||||
|
||||
@@ -908,24 +908,8 @@
|
||||
sleep(20)
|
||||
playsound(loc, 'sound/effects/alert.ogg', 125, 1)
|
||||
sleep(10)
|
||||
var/turf/O = get_turf(src)
|
||||
var/fragger = rand(50,100)
|
||||
density = 0
|
||||
explosion(O, -1, -1, 2)
|
||||
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)
|
||||
fragem(src,50,100,2,1,5,1,0)
|
||||
gib()
|
||||
return
|
||||
|
||||
|
||||
@@ -500,15 +500,15 @@ obj/item/weapon/gun/energy/staff/special_check(var/mob/user)
|
||||
LL.droplimb(0,DROPLIMB_BLUNT)
|
||||
RL.droplimb(0,DROPLIMB_BLUNT)
|
||||
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.show_message("<b>[user]</b> screams!",2)
|
||||
user.visible_message("<span class = 'danger'> With a sickening series of crunches, [user]'s body shrinks, and they begin to sprout feathers!</span>")
|
||||
user.visible_message("<b>[user]</b> screams!",2)
|
||||
new_mob = new /mob/living/simple_animal/parrot(H.loc)
|
||||
new_mob.universal_speak = 1
|
||||
new_mob.key = H.key
|
||||
new_mob.a_intent = "harm"
|
||||
qdel(H)
|
||||
sleep(20)
|
||||
new_mob.show_message("<b>[new_mob]</b> squawks, 'Poly wanna cracker!'",2)
|
||||
new_mob.say("Poly wanna cracker!")
|
||||
return 0
|
||||
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/active_hand = H.hand
|
||||
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.show_message("<b>[user]</b> screams!",2)
|
||||
user.visible_message("<span class = 'danger'> With a sickening crunch, [user]'s hand rips itself off, and begins crawling away!</span>")
|
||||
user.visible_message("<b>[user]</b> screams!",2)
|
||||
user.drop_item()
|
||||
if(active_hand)
|
||||
LA.droplimb(0,DROPLIMB_EDGE)
|
||||
|
||||
@@ -1341,6 +1341,20 @@ CIRCUITS BELOW
|
||||
build_path = /obj/item/weapon/circuitboard/biogenerator
|
||||
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
|
||||
name = "communications console"
|
||||
id = "comconsole"
|
||||
|
||||
Reference in New Issue
Block a user