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:
LordFowl
2017-01-04 17:06:44 -05:00
committed by skull132
parent 1b5d81d3ea
commit fdafaf39b5
15 changed files with 439 additions and 158 deletions

View File

@@ -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)
/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()
/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)
/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()
/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
/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)
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()
/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)
..()

View File

@@ -12,3 +12,10 @@
"/obj/item/weapon/cell" = 1,
"/obj/item/weapon/stock_parts/matter_bin" = 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()

View File

@@ -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)

View File

@@ -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)
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>")
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

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -7,6 +7,7 @@
announceWhen = 1
endWhen = revokeAccess
var/postStartTicks = 0
two_part = 1
ic_name = "radiation"
/datum/event/radiation_storm/announce()

View File

@@ -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,15 +335,69 @@
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>"
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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View 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