Updates blob

Remains of player blob axed.
blob_act() axed. Blob now has an arbitary set of things it can attack.
It will flow over everything else. Blob has an awful tendency to destroy
non-craftables.
Will test more tomorrow.
Blob will now attack mechs.
Fixes #8106.
Fixes #10705.
This commit is contained in:
Kelenius
2015-10-05 18:10:16 +03:00
parent 8ce01aa648
commit 83adba88d4
77 changed files with 210 additions and 1456 deletions

View File

@@ -279,12 +279,6 @@
#include "code\game\gamemodes\gameticker.dm" #include "code\game\gamemodes\gameticker.dm"
#include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\objective.dm"
#include "code\game\gamemodes\setupgame.dm" #include "code\game\gamemodes\setupgame.dm"
#include "code\game\gamemodes\blob\blob.dm"
#include "code\game\gamemodes\blob\theblob.dm"
#include "code\game\gamemodes\blob\blobs\core.dm"
#include "code\game\gamemodes\blob\blobs\factory.dm"
#include "code\game\gamemodes\blob\blobs\node.dm"
#include "code\game\gamemodes\blob\blobs\shield.dm"
#include "code\game\gamemodes\calamity\calamity.dm" #include "code\game\gamemodes\calamity\calamity.dm"
#include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\changeling.dm"
#include "code\game\gamemodes\changeling\changeling_powers.dm" #include "code\game\gamemodes\changeling\changeling_powers.dm"
@@ -307,7 +301,6 @@
#include "code\game\gamemodes\events\black_hole.dm" #include "code\game\gamemodes\events\black_hole.dm"
#include "code\game\gamemodes\events\clang.dm" #include "code\game\gamemodes\events\clang.dm"
#include "code\game\gamemodes\events\dust.dm" #include "code\game\gamemodes\events\dust.dm"
#include "code\game\gamemodes\events\miniblob.dm"
#include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\events\power_failure.dm"
#include "code\game\gamemodes\events\wormholes.dm" #include "code\game\gamemodes\events\wormholes.dm"
#include "code\game\gamemodes\events\holidays\Christmas.dm" #include "code\game\gamemodes\events\holidays\Christmas.dm"
@@ -963,6 +956,7 @@
#include "code\modules\awaymissions\pamphlet.dm" #include "code\modules\awaymissions\pamphlet.dm"
#include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\trigger.dm"
#include "code\modules\awaymissions\zlevel.dm" #include "code\modules\awaymissions\zlevel.dm"
#include "code\modules\blob\blob.dm"
#include "code\modules\client\client defines.dm" #include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm" #include "code\modules\client\client procs.dm"
#include "code\modules\client\preferences.dm" #include "code\modules\client\preferences.dm"
@@ -1231,7 +1225,6 @@
#include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\logout.dm"
#include "code\modules\mob\living\say.dm" #include "code\modules\mob\living\say.dm"
#include "code\modules\mob\living\blob\blob.dm"
#include "code\modules\mob\living\bot\bot.dm" #include "code\modules\mob\living\bot\bot.dm"
#include "code\modules\mob\living\bot\cleanbot.dm" #include "code\modules\mob\living\bot\cleanbot.dm"
#include "code\modules\mob\living\bot\ed209bot.dm" #include "code\modules\mob\living\bot\ed209bot.dm"

View File

@@ -44,7 +44,6 @@
#define PASSTABLE 0x1 #define PASSTABLE 0x1
#define PASSGLASS 0x2 #define PASSGLASS 0x2
#define PASSGRILLE 0x4 #define PASSGRILLE 0x4
#define PASSBLOB 0x8
// Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. // Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses.
// WARNING: The following flags apply only to the external suit! // WARNING: The following flags apply only to the external suit!

View File

@@ -219,9 +219,6 @@ its easier to just keep the beam vertical.
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source) /atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
return -1 return -1
/atom/proc/blob_act()
return
/atom/proc/fire_act() /atom/proc/fire_act()
return return

View File

@@ -207,13 +207,6 @@
else else
return return
/obj/machinery/dna_scannernew/blob_act()
if(prob(75))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
qdel(src)
/obj/machinery/computer/scan_consolenew /obj/machinery/computer/scan_consolenew
name = "DNA Modifier Access Console" name = "DNA Modifier Access Console"
desc = "Scand DNA." desc = "Scand DNA."
@@ -270,10 +263,6 @@
else else
return return
/obj/machinery/computer/scan_consolenew/blob_act()
if(prob(75))
qdel(src)
/obj/machinery/computer/scan_consolenew/New() /obj/machinery/computer/scan_consolenew/New()
..() ..()
for(var/i=0;i<3;i++) for(var/i=0;i<3;i++)

View File

@@ -1,133 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
//Few global vars to track the blob
var/list/blobs = list()
var/list/blob_cores = list()
var/list/blob_nodes = list()
/*/datum/game_mode/blob
name = "blob"
config_tag = "blob"
required_players = 0
var/const/waittime_l = 1800 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 3600 //upper bound on time before intercept arrives (in tenths of seconds)
var/declared = 0
var/stage = 0
var/cores_to_spawn = 1
var/players_per_core = 16
//Controls expansion via game controller
var/autoexpand = 0
var/expanding = 0
var/blob_count = 0
var/blobnukecount = 300//Might be a bit low
var/blobwincount = 700//Still needs testing
announce()
world << "<B>The current game mode is - <font color='green'>Blob</font>!</B>"
world << "<B>A dangerous alien organism is rapidly spreading throughout the station!</B>"
world << "You must kill it all while minimizing the damage to the station."
post_setup()
spawn(10)
start_state = new /datum/station_state()
start_state.count()
spawn(rand(waittime_l, waittime_h))//3-5 minutes currently
message_admins("Blob spawned and expanding, report created")
if(!kill_air)
kill_air = 1
message_admins("Kill air has been set to true by Blob, testing to see how laggy it is without the extra processing from hullbreaches. Note: the blob is fireproof so plasma does not help anyways")
if(ticker && ticker.minds && ticker.minds.len)
var/player_based_cores = round(ticker.minds.len/players_per_core, 1)
if(player_based_cores > cores_to_spawn)
cores_to_spawn = player_based_cores
blobs = list()
for(var/i = 0 to cores_to_spawn)
var/turf/location = pick(blobstart)
if(location && !locate(/obj/effect/blob in location))
blobstart -= location
new/obj/effect/blob/core(location)
spawn(40)
autoexpand = 1
declared = 1
..()
process()
if(!declared) return
stage()
// if(!autoexpand) return
// spawn(0)
// expandBlob()
return
proc/expandBlob()//Currently disabled
if(expanding) return
if(!blobs.len) return
expanding = 1
for(var/i = 1 to 2)
sleep(-1)
if(!blobs.len) break
var/obj/effect/blob/B = pick(blobs)
if(isNotStationLevel(B.z))
continue
B.Life()
expanding = 0
return
proc/stage()
switch(stage)
if (0)
send_intercept(1)
for (var/mob/living/silicon/ai/aiPlayer in living_mob_list)
if (aiPlayer.client)
var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. NanoTrasen will not send an emergency shuttle under any circumstances."
//var/law = "The station is under quarantine. The biohazard must be destroyed at all costs and must not be allowed to spread. Anyone using a space suit for any reason other than to destroy the biohazard is to be terminated. NanoTrasen will not send an emergency shuttle under any circumstances."
aiPlayer.set_zeroth_law(law)
aiPlayer << "Laws Updated: [law]"
stage = -1
// next stage 1 minute later
spawn(600)
stage = 1
return
if (1)
command_alert("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player))
M << sound('sound/AI/outbreak5.ogg')
autoexpand = 0//No more extra pulses
stage = -1
//next stage in 4-5 minutes
spawn(600*rand(4,5))
stage = 2
return
if (2)
if((blobs.len > blobnukecount) && (declared == 1))
command_alert("Uncontrolled spread of the biohazard onboard the station. We have issued directive 7-12 for [station_name()]. Any living Heads of Staff are ordered to enact directive 7-12 at any cost, a print out with detailed instructions has been sent to your communications computers.", "Biohazard Alert")
send_intercept(2)
declared = 2
spawn(20)
set_security_level("delta")
if(blobs.len > blobwincount)
stage = 3
return
*/

View File

@@ -1,78 +0,0 @@
/datum/game_mode/blob/check_finished()
if(!declared)//No blobs have been spawned yet
return 0
if(stage >= 3)//Blob took over
return 1
if(station_was_nuked)//Nuke went off
return 1
for(var/obj/effect/blob/B in blob_cores)
if(B && isNotStationLevel(B.z)) continue
return 0
var/nodes = 0
for(var/obj/effect/blob/B in blob_nodes)
if(B && isNotStationLevel(B.z)) continue
nodes++
if(nodes > 4)//Perhapse make a new core with a low prob
return 0
return 1
/datum/game_mode/blob/declare_completion()
if(stage >= 3)
feedback_set_details("round_end_result","loss - blob took over")
world << "<FONT size = 3><B>The blob has taken over the station!</B></FONT>"
world << "<B>The entire station was eaten by the Blob</B>"
check_quarantine()
else if(station_was_nuked)
feedback_set_details("round_end_result","halfwin - nuke")
world << "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>"
world << "<B>Directive 7-12 has been successfully carried out preventing the Blob from spreading.</B>"
else
feedback_set_details("round_end_result","win - blob eliminated")
world << "<FONT size = 3><B>The staff has won!</B></FONT>"
world << "<B>The alien organism has been eradicated from the station</B>"
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
var/percent = round( 100.0 * start_state.score(end_state), 0.1)
world << "<B>The station is [percent]% intact.</B>"
log_game("Blob mode was won with station [percent]% intact.")
world << "<span class='notice'>Rebooting in 30s</span>"
..()
return 1
/datum/game_mode/blob/proc/check_quarantine()
var/numDead = 0
var/numAlive = 0
var/numSpace = 0
var/numOffStation = 0
for (var/mob/living/silicon/ai/aiPlayer in mob_list)
for(var/mob/living/carbon/human/M in mob_list)
if ((M != aiPlayer && M.client))
if (M.stat == 2)
numDead += 1
else
var/T = M.loc
if (istype(T, /turf/space))
numSpace += 1
else if(istype(T, /turf))
if (isNotStationLevel(M.z))
numOffStation += 1
else
numAlive += 1
if (numSpace==0 && numOffStation==0)
world << "<FONT size = 3><B>The AI has won!</B></FONT>"
world << "<B>The AI successfully maintained the quarantine - no players were in space or were off-station (as far as we can tell).</B>"
log_game("AI won at Blob mode despite overall loss.")
else
world << "<FONT size = 3><B>The AI has lost!</B></FONT>"
world << text("<B>The AI failed to maintain the quarantine - [] were in space and [] were off-station (as far as we can tell).</B>", numSpace, numOffStation)
log_game("AI lost at Blob mode.")
log_game("Blob mode was lost.")
return 1

View File

@@ -1,111 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/datum/game_mode/blob/send_intercept(var/report = 1)
var/intercepttext = ""
var/interceptname = "Error"
switch(report)
if(1)
interceptname = "Biohazard Alert"
intercepttext += "<FONT size = 3><B>NanoTrasen Update</B>: Biohazard Alert.</FONT><HR>"
intercepttext += "Reports indicate the probable transfer of a biohazardous agent onto [station_name()] during the last crew deployment cycle.<BR>"
intercepttext += "Preliminary analysis of the organism classifies it as a level 5 biohazard. Its origin is unknown.<BR>"
intercepttext += "NanoTrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.<BR>"
intercepttext += "Orders for all [station_name()] personnel follows:<BR>"
intercepttext += " 1. Do not leave the quarantine area.<BR>"
intercepttext += " 2. Locate any outbreaks of the organism on the station.<BR>"
intercepttext += " 3. If found, use any neccesary means to contain the organism.<BR>"
intercepttext += " 4. Avoid damage to the capital infrastructure of the station.<BR>"
intercepttext += "<BR>Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.<BR>"
intercepttext += "Message ends."
if(2)
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in machines)
if(bomb && bomb.r_code)
if(bomb.z in station_levels)
nukecode = bomb.r_code
interceptname = "Directive 7-12"
intercepttext += "<FONT size = 3><B>NanoTrasen Update</B>: Biohazard Alert.</FONT><HR>"
intercepttext += "Directive 7-12 has been issued for [station_name()].<BR>"
intercepttext += "The biohazard has grown out of control and will soon reach critical mass.<BR>"
intercepttext += "Your orders are as follows:<BR>"
intercepttext += "1. Secure the Nuclear Authentication Disk.<BR>"
intercepttext += "2. Detonate the Nuke located in the Station's Vault.<BR>"
intercepttext += "Nuclear Authentication Code: [nukecode] <BR>"
intercepttext += "Message ends."
for (var/mob/living/silicon/ai/aiPlayer in player_list)
if (aiPlayer.client)
var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. The nuclear failsafe must be activated at any cost, the code is: [nukecode]."
aiPlayer.set_zeroth_law(law)
aiPlayer << "Laws Updated: [law]"
for(var/obj/machinery/computer/communications/comm in machines)
comm.messagetitle.Add(interceptname)
comm.messagetext.Add(intercepttext)
if(!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
intercept.name = "paper- [interceptname]"
intercept.info = intercepttext
return
/datum/station_state
var/floor = 0
var/wall = 0
var/r_wall = 0
var/window = 0
var/door = 0
var/grille = 0
var/mach = 0
proc/count()
for(var/turf/T in world)
if(isNotStationLevel(T.z)
continue
if(istype(T,/turf/simulated/floor))
if(!(T:burnt))
src.floor += 12
else
src.floor += 1
if(istype(T, /turf/simulated/wall))
if(T:intact)
src.wall += 2
else
src.wall += 1
if(istype(T, /turf/simulated/wall/r_wall))
if(T:intact)
src.r_wall += 2
else
src.r_wall += 1
for(var/obj/O in world)
if(isNotStationLevel(O.z))
continue
if(istype(O, /obj/structure/window))
src.window += 1
else if(istype(O, /obj/structure/grille) && (!O:destroyed))
src.grille += 1
else if(istype(O, /obj/machinery/door))
src.door += 1
else if(istype(O, /obj/machinery))
src.mach += 1
return
proc/score(var/datum/station_state/result)
if(!result) return 0
var/output = 0
output += (result.floor / max(floor,1))
output += (result.r_wall/ max(r_wall,1))
output += (result.wall / max(wall,1))
output += (result.window / max(window,1))
output += (result.door / max(door,1))
output += (result.grille / max(grille,1))
output += (result.mach / max(mach,1))
return (output/7)

View File

@@ -1,73 +0,0 @@
/obj/effect/blob/core
name = "blob core"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_core"
health = 200
brute_resist = 2
fire_resist = 2
New(loc, var/h = 200)
blobs += src
blob_cores += src
processing_objects.Add(src)
..(loc, h)
Destroy()
blob_cores -= src
processing_objects.Remove(src)
..()
return
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
qdel(src)
return
return
run_action()
Pulse(0,1)
Pulse(0,2)
Pulse(0,4)
Pulse(0,8)
//Should have the fragments in here somewhere
return 1
proc/create_fragments(var/wave_size = 1)
var/list/candidates = list()
for(var/mob/dead/observer/G in player_list)
if(G.client.prefs.be_special & BE_ALIEN)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
if(candidates.len)
for(var/i = 0 to wave_size)
var/mob/living/blob/B = new/mob/living/blob(src.loc)
B.key = pick(candidates)
candidates -= B.key
/*
Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
set background = 1
if(pulse > 20) return
//Looking for another blob to pulse
var/list/dirs = list(1,2,4,8)
dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us
for(var/i = 1 to 4)
if(!dirs.len) break
var/dirn = pick(dirs)
dirs.Remove(dirn)
var/turf/T = get_step(src, dirn)
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(!B)
expand(T)//No blob here so try and expand
return
B.Pulse((pulse+1),get_dir(src.loc,T))
return
return
*/

View File

@@ -1,72 +0,0 @@
/obj/effect/blob/factory
name = "porous blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_factory"
health = 100
brute_resist = 1
fire_resist = 2
var/list/spores = list()
var/max_spores = 4
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
qdel(src)
return
return
run_action()
if(spores.len >= max_spores) return 0
new/mob/living/simple_animal/hostile/blobspore(src.loc, src)
return 1
/obj/effect/blob/factory/Destroy()
for(var/mob/living/simple_animal/hostile/blobspore/spore in spores)
if(spore.factory == src)
spore.factory = null
..()
/mob/living/simple_animal/hostile/blobspore
name = "blob"
desc = "Some blob thing."
icon = 'icons/mob/critter.dmi'
icon_state = "blobsquiggle"
icon_living = "blobsquiggle"
pass_flags = PASSBLOB
health = 20
maxHealth = 20
melee_damage_lower = 4
melee_damage_upper = 8
attacktext = "hit"
attack_sound = 'sound/weapons/genhit1.ogg'
var/obj/effect/blob/factory/factory = null
faction = "blob"
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 360
New(loc, var/obj/effect/blob/factory/linked_node)
..()
if(istype(linked_node))
factory = linked_node
factory.spores += src
..(loc)
return
death()
qdel(src)
/mob/living/simple_animal/hostile/blobspore/Destroy()
if(factory)
factory.spores -= src
factory = null
..()

View File

@@ -1,34 +0,0 @@
/obj/effect/blob/node
name = "blob node"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_node"
health = 100
brute_resist = 1
fire_resist = 2
New(loc, var/h = 100)
blobs += src
blob_nodes += src
processing_objects.Add(src)
..(loc, h)
Destroy()
blob_nodes -= src
processing_objects.Remove(src)
..()
return
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
qdel(src)
return
return
run_action()
Pulse(0,0)
return 0

View File

@@ -1,24 +0,0 @@
/obj/effect/blob/shield
name = "strong blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
desc = "Some blob creature thingy"
density = 1
opacity = 0
anchored = 1
health = 60
brute_resist = 1
fire_resist = 2
update_icon()
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
qdel(src)
return
return
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0

View File

@@ -1,222 +0,0 @@
//I will need to recode parts of this but I am way too tired atm
/obj/effect/blob
name = "blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob"
light_range = 3
desc = "Some blob creature thingy"
density = 1
opacity = 0
anchored = 1
var/active = 1
var/health = 30
var/brute_resist = 4
var/fire_resist = 1
var/blob_type = "blob"
/*Types
Blob
Node
Core
Factory
Shield
*/
New(loc, var/h = 30)
blobs += src
src.health = h
src.set_dir(pick(1,2,4,8))
src.update_icon()
..(loc)
return
Destroy()
blobs -= src
..()
return
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0)) return 1
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
return 0
process()
spawn(-1)
Life()
return
proc/Pulse(var/pulse = 0, var/origin_dir = 0)//Todo: Fix spaceblob expand
set background = 1
if(!istype(src,/obj/effect/blob/core) && !istype(src,/obj/effect/blob/node))//Ill put these in the children later
if(run_action())//If we can do something here then we dont need to pulse more
return
if(!istype(src,/obj/effect/blob/shield) && !istype(src,/obj/effect/blob/core) && !istype(src,/obj/effect/blob/node) && (pulse <= 2) && (prob(30)))
change_to("Shield")
return
if(pulse > 20) return//Inf loop check
//Looking for another blob to pulse
var/list/dirs = list(1,2,4,8)
dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us
for(var/i = 1 to 4)
if(!dirs.len) break
var/dirn = pick(dirs)
dirs.Remove(dirn)
var/turf/T = get_step(src, dirn)
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(!B)
expand(T)//No blob here so try and expand
return
B.Pulse((pulse+1),get_dir(src.loc,T))
return
return
proc/run_action()
return 0
proc/Life()
update_icon()
if(run_action())
return 1
return 0
/* fire_act(datum/gas_mixture/air, temperature, volume) Blob is currently fireproof
if(temperature > T0C+200)
health -= 0.01 * temperature
update()
*/
proc/expand(var/turf/T = null)
if(!prob(health)) return
if(!T)
var/list/dirs = list(1,2,4,8)
for(var/i = 1 to 4)
var/dirn = pick(dirs)
dirs.Remove(dirn)
T = get_step(src, dirn)
if(!(locate(/obj/effect/blob) in T)) break
else T = null
if(!T) return 0
var/obj/effect/blob/B = new /obj/effect/blob(src.loc, min(src.health, 30))
if(T.Enter(B,src))//Attempt to move into the tile
B.loc = T
else
T.blob_act()//If we cant move in hit the turf
qdel(B)
for(var/atom/A in T)//Hit everything in the turf
A.blob_act()
return 1
ex_act(severity)
var/damage = 50
switch(severity)
if(1)
src.health -= rand(100,120)
if(2)
src.health -= rand(60,100)
if(3)
src.health -= rand(20,60)
health -= (damage/brute_resist)
update_icon()
return
update_icon()//Needs to be updated with the types
if(health <= 0)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
qdel(src)
return
if(health <= 15)
icon_state = "blob_damaged"
return
// if(health <= 20)
// icon_state = "blob_damaged2"
// return
bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
switch(Proj.damage_type)
if(BRUTE)
health -= (Proj.damage/brute_resist)
if(BURN)
health -= (Proj.damage/fire_resist)
update_icon()
return 0
attackby(var/obj/item/weapon/W, var/mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
src.visible_message("<span class='danger'>The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]</span>")
var/damage = 0
switch(W.damtype)
if("fire")
damage = (W.force / max(src.fire_resist,1))
if(istype(W, /obj/item/weapon/weldingtool))
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
if("brute")
damage = (W.force / max(src.brute_resist,1))
health -= damage
update_icon()
return
proc/change_to(var/type = "Normal")
switch(type)
if("Normal")
new/obj/effect/blob(src.loc,src.health)
if("Node")
new/obj/effect/blob/node(src.loc,src.health*2)
if("Factory")
new/obj/effect/blob/factory(src.loc,src.health)
if("Shield")
new/obj/effect/blob/shield(src.loc,src.health*2)
qdel(src)
return
//////////////////////////////****IDLE BLOB***/////////////////////////////////////
/obj/effect/blob/idle
name = "blob"
desc = "it looks... tasty"
icon_state = "blobidle0"
New(loc, var/h = 10)
src.health = h
src.set_dir(pick(1,2,4,8))
src.update_idle()
proc/update_idle()
if(health<=0)
qdel(src)
return
if(health<4)
icon_state = "blobc0"
return
if(health<10)
icon_state = "blobb0"
return
icon_state = "blobidle0"
Destroy()
var/obj/effect/blob/B = new /obj/effect/blob( src.loc )
spawn(30)
B.Life()
..()

View File

@@ -1,30 +0,0 @@
var/blobevent = 0
/proc/mini_blob_event()
var/turf/T = pick(blobstart)
var/obj/effect/blob/core/bl = new /obj/effect/blob/core(T, 200)
spawn(0)
bl.Life()
bl.Life()
bl.Life()
blobevent = 1
spawn(0)
dotheblobbaby()
spawn(3000)
blobevent = 0
spawn(rand(1000, 2000)) //Delayed announcements to keep the crew on their toes.
command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
/proc/dotheblobbaby()
if (blobevent)
if(blob_cores.len)
for(var/i = 1 to 5)
sleep(-1)
if(!blob_cores.len) break
var/obj/effect/blob/B = pick(blob_cores)
if(isNotStationLevel(B.z))
continue
B.Life()
spawn(30)
dotheblobbaby()

View File

@@ -41,10 +41,6 @@
else else
return return
/obj/machinery/optable/blob_act()
if(prob(75))
qdel(src)
/obj/machinery/optable/attack_hand(mob/user as mob) /obj/machinery/optable/attack_hand(mob/user as mob)
if (HULK in usr.mutations) if (HULK in usr.mutations)
visible_message("<span class='danger'>\The [usr] destroys \the [src]!</span>") visible_message("<span class='danger'>\The [usr] destroys \the [src]!</span>")

View File

@@ -129,12 +129,6 @@
else else
return return
/obj/machinery/bodyscanner/blob_act()
if(prob(50))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
qdel(src)
/obj/machinery/body_scanconsole/ex_act(severity) /obj/machinery/body_scanconsole/ex_act(severity)
switch(severity) switch(severity)
@@ -150,11 +144,6 @@
else else
return return
/obj/machinery/body_scanconsole/blob_act()
if(prob(50))
qdel(src)
/obj/machinery/body_scanconsole/power_change() /obj/machinery/body_scanconsole/power_change()
..() ..()
if(stat & BROKEN) if(stat & BROKEN)

View File

@@ -226,11 +226,6 @@ update_flag
return GM.return_pressure() return GM.return_pressure()
return 0 return 0
/obj/machinery/portable_atmospherics/canister/blob_act()
src.health -= 200
healthcheck()
return
/obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj) /obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj)
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
return return

View File

@@ -87,11 +87,6 @@
..() ..()
healthcheck() healthcheck()
/obj/machinery/bot/blob_act()
src.health -= rand(20,40)*fire_dam_coeff
healthcheck()
return
/obj/machinery/bot/ex_act(severity) /obj/machinery/bot/ex_act(severity)
switch(severity) switch(severity)
if(1.0) if(1.0)

View File

@@ -92,10 +92,6 @@
..() //and give it the regular chance of being deleted outright ..() //and give it the regular chance of being deleted outright
/obj/machinery/camera/blob_act()
return
/obj/machinery/camera/hitby(AM as mob|obj) /obj/machinery/camera/hitby(AM as mob|obj)
..() ..()
if (istype(AM, /obj)) if (istype(AM, /obj))

View File

@@ -60,14 +60,6 @@
set_broken() set_broken()
..() ..()
/obj/machinery/computer/blob_act()
if (prob(75))
for(var/x in verbs)
verbs -= x
set_broken()
density = 0
/obj/machinery/computer/update_icon() /obj/machinery/computer/update_icon()
overlays.Cut() overlays.Cut()
if(stat & NOPOWER) if(stat & NOPOWER)

View File

@@ -225,12 +225,6 @@
else else
return return
blob_act()
if (prob(75))
set_broken()
density = 0
/* /*
Computers have the capability to use a battery backup. Computers have the capability to use a battery backup.
Note that auto_use_power's return value is strictly whether Note that auto_use_power's return value is strictly whether

View File

@@ -28,15 +28,6 @@
return return
/obj/machinery/lapvend/blob_act()
if (prob(50))
spawn(0)
qdel(src)
return
return
/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(vendmode == 1) if(vendmode == 1)
if(istype(W, /obj/item/weapon/card)) if(istype(W, /obj/item/weapon/card))

View File

@@ -508,8 +508,3 @@
name = initial(name) name = initial(name)
if(occupant) if(occupant)
name = "[name] ([occupant])" name = "[name] ([occupant])"
//Attacks/effects.
/obj/machinery/cryopod/blob_act()
return //Sorta gamey, but we don't really want these to be destroyed.

View File

@@ -131,13 +131,6 @@ for reference:
dismantle() dismantle()
return return
/obj/structure/barricade/blob_act()
src.health -= 25
if (src.health <= 0)
visible_message("<span class='danger'>The blob eats through \the [src]!</span>")
qdel(src)
return
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. /obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
if(air_group || (height==0)) if(air_group || (height==0))
return 1 return 1
@@ -232,12 +225,6 @@ for reference:
anchored = !anchored anchored = !anchored
icon_state = "barrier[src.locked]" icon_state = "barrier[src.locked]"
blob_act()
src.health -= 25
if (src.health <= 0)
src.explode()
return
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
if(air_group || (height==0)) if(air_group || (height==0))
return 1 return 1

View File

@@ -333,12 +333,6 @@
return return
/obj/machinery/door/blob_act()
if(prob(40))
qdel(src)
return
/obj/machinery/door/emp_act(severity) /obj/machinery/door/emp_act(severity)
if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) ) if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) )
spawn(0) spawn(0)

View File

@@ -196,10 +196,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
qdel(src) qdel(src)
return return
/obj/machinery/hologram/blob_act()
qdel(src)
return
/obj/machinery/hologram/holopad/Destroy() /obj/machinery/hologram/holopad/Destroy()
for (var/mob/living/silicon/ai/master in masters) for (var/mob/living/silicon/ai/master in masters)
clear_holo(master) clear_holo(master)

View File

@@ -171,10 +171,6 @@ Class Procs:
else else
return return
/obj/machinery/blob_act()
if(prob(50))
qdel(src)
//sets the use_power var and then forces an area power update //sets the use_power var and then forces an area power update
/obj/machinery/proc/update_use_power(var/new_use_power) /obj/machinery/proc/update_use_power(var/new_use_power)
use_power = new_use_power use_power = new_use_power

View File

@@ -362,13 +362,6 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
/obj/machinery/nuclearbomb/ex_act(severity) /obj/machinery/nuclearbomb/ex_act(severity)
return return
/obj/machinery/nuclearbomb/blob_act()
if (src.timing == -1.0)
return
else
return ..()
return
#define NUKERANGE 80 #define NUKERANGE 80
/obj/machinery/nuclearbomb/proc/explode() /obj/machinery/nuclearbomb/proc/explode()

View File

@@ -168,15 +168,6 @@
else else
return return
/obj/machinery/vending/blob_act()
if (prob(50))
spawn(0)
src.malfunction()
qdel(src)
return
return
/obj/machinery/vending/emag_act(var/remaining_charges, var/mob/user) /obj/machinery/vending/emag_act(var/remaining_charges, var/mob/user)
if (!emagged) if (!emagged)
src.emagged = 1 src.emagged = 1

View File

@@ -77,11 +77,6 @@
healthcheck() healthcheck()
return return
/obj/effect/alien/resin/blob_act()
health-=50
healthcheck()
return
/obj/effect/alien/resin/hitby(AM as mob|obj) /obj/effect/alien/resin/hitby(AM as mob|obj)
..() ..()
for(var/mob/O in viewers(src, null)) for(var/mob/O in viewers(src, null))

View File

@@ -150,9 +150,6 @@
/obj/structure/foamedmetal/ex_act(severity) /obj/structure/foamedmetal/ex_act(severity)
qdel(src) qdel(src)
/obj/structure/foamedmetal/blob_act()
qdel(src)
/obj/structure/foamedmetal/bullet_act() /obj/structure/foamedmetal/bullet_act()
if(metal == 1 || prob(50)) if(metal == 1 || prob(50))
qdel(src) qdel(src)

View File

@@ -108,9 +108,6 @@
else else
return return
/obj/item/blob_act()
return
//user: The mob that is suiciding //user: The mob that is suiciding
//damagetype: The type of damage the item will inflict on the user //damagetype: The type of damage the item will inflict on the user
//BRUTELOSS = 1 //BRUTELOSS = 1

View File

@@ -63,17 +63,6 @@
descriptive = "cold" descriptive = "cold"
user << "<span class='notice'>\The [src] feels [descriptive].</span>" user << "<span class='notice'>\The [src] feels [descriptive].</span>"
/obj/item/weapon/tank/blob_act()
if(prob(50))
var/turf/location = src.loc
if (!( istype(location, /turf) ))
qdel(src)
if(src.air_contents)
location.assume_air(air_contents)
qdel(src)
/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob)
..() ..()
if (istype(src.loc, /obj/item/assembly)) if (istype(src.loc, /obj/item/assembly))

View File

@@ -213,10 +213,6 @@
health = 0 health = 0
healthcheck() healthcheck()
/obj/effect/energy_net/blob_act()
health = 0
healthcheck()
/obj/effect/energy_net/attack_hand(var/mob/user) /obj/effect/energy_net/attack_hand(var/mob/user)
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user

View File

@@ -28,10 +28,6 @@
return ..() return ..()
/obj/structure/blob_act()
if(prob(50))
qdel(src)
/obj/structure/attack_tk() /obj/structure/attack_tk()
return return

View File

@@ -196,13 +196,6 @@
return return
// this should probably use dump_contents()
/obj/structure/closet/blob_act()
if(prob(75))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
qdel(src)
/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(src.opened) if(src.opened)
if(istype(W, /obj/item/weapon/grab)) if(istype(W, /obj/item/weapon/grab))

View File

@@ -96,10 +96,6 @@
for(var/mob/M in src) for(var/mob/M in src)
shatter(M) shatter(M)
/obj/structure/closet/statue/blob_act()
for(var/mob/M in src)
shatter(M)
/obj/structure/closet/statue/ex_act(severity) /obj/structure/closet/statue/ex_act(severity)
for(var/mob/M in src) for(var/mob/M in src)
M.ex_act(severity) M.ex_act(severity)

View File

@@ -34,15 +34,6 @@
src.healthcheck() src.healthcheck()
return return
/obj/structure/displaycase/blob_act()
if (prob(75))
new /obj/item/weapon/material/shard( src.loc )
if (occupied)
new /obj/item/weapon/gun/energy/captain( src.loc )
occupied = 0
qdel(src)
/obj/structure/displaycase/proc/healthcheck() /obj/structure/displaycase/proc/healthcheck()
if (src.health <= 0) if (src.health <= 0)
if (!( src.destroyed )) if (!( src.destroyed ))

View File

@@ -202,10 +202,6 @@
return return
return ..() return ..()
/obj/structure/girder/blob_act()
if(prob(40))
qdel(src)
/obj/structure/girder/ex_act(severity) /obj/structure/girder/ex_act(severity)
switch(severity) switch(severity)

View File

@@ -16,9 +16,6 @@
/obj/structure/grille/ex_act(severity) /obj/structure/grille/ex_act(severity)
qdel(src) qdel(src)
/obj/structure/grille/blob_act()
qdel(src)
/obj/structure/grille/update_icon() /obj/structure/grille/update_icon()
if(destroyed) if(destroyed)
icon_state = "[initial(icon_state)]-b" icon_state = "[initial(icon_state)]-b"

View File

@@ -60,9 +60,6 @@
deflate(1) deflate(1)
return return
/obj/structure/inflatable/blob_act()
deflate(1)
/obj/structure/inflatable/attack_hand(mob/user as mob) /obj/structure/inflatable/attack_hand(mob/user as mob)
add_fingerprint(user) add_fingerprint(user)
return return

View File

@@ -32,13 +32,6 @@
src.healthcheck() src.healthcheck()
return return
/obj/structure/lamarr/blob_act()
if (prob(75))
new /obj/item/weapon/material/shard( src.loc )
Break()
qdel(src)
/obj/structure/lamarr/proc/healthcheck() /obj/structure/lamarr/proc/healthcheck()
if (src.health <= 0) if (src.health <= 0)
if (!( src.destroyed )) if (!( src.destroyed ))

View File

@@ -34,10 +34,6 @@
L.updateOverlays(src.loc) L.updateOverlays(src.loc)
..() ..()
/obj/structure/lattice/blob_act()
qdel(src)
return
/obj/structure/lattice/ex_act(severity) /obj/structure/lattice/ex_act(severity)
switch(severity) switch(severity)
if(1.0) if(1.0)

View File

@@ -160,10 +160,6 @@ FLOOR SAFES
return return
obj/structure/safe/blob_act()
return
obj/structure/safe/ex_act(severity) obj/structure/safe/ex_act(severity)
return return

View File

@@ -19,10 +19,6 @@
else else
return return
/obj/structure/sign/blob_act()
qdel(src)
return
/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction /obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double)) if(istype(tool, /obj/item/weapon/screwdriver) && !istype(src, /obj/structure/sign/double))
user << "You unfasten the sign with your [tool]." user << "You unfasten the sign with your [tool]."

View File

@@ -86,11 +86,6 @@
qdel(src) qdel(src)
return return
/obj/structure/bed/blob_act()
if(prob(75))
material.place_sheet(get_turf(src))
qdel(src)
/obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench)) if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)

View File

@@ -95,11 +95,6 @@ var/global/list/stool_cache = list() //haha stool
qdel(src) qdel(src)
return return
/obj/item/weapon/stool/blob_act()
if(prob(75))
material.place_sheet(get_turf(src))
qdel(src)
/obj/item/weapon/stool/proc/dismantle() /obj/item/weapon/stool/proc/dismantle()
if(material) if(material)
material.place_sheet(get_turf(src)) material.place_sheet(get_turf(src))

View File

@@ -122,10 +122,6 @@
shatter(0) shatter(0)
return return
/obj/structure/window/blob_act()
shatter()
//TODO: Make full windows a separate type of window. //TODO: Make full windows a separate type of window.
//Once a full window, it will always be a full window, so there's no point //Once a full window, it will always be a full window, so there's no point
//having the same type for both. //having the same type for both.

View File

@@ -43,6 +43,3 @@
for(var/obj/structure/window/W in src) for(var/obj/structure/window/W in src)
if(W.dir == dir_to || W.is_fulltile()) //Same direction or diagonal (full tile) if(W.dir == dir_to || W.is_fulltile()) //Same direction or diagonal (full tile)
W.fire_act(adj_air, adj_temp, adj_volume) W.fire_act(adj_air, adj_temp, adj_volume)
/turf/simulated/floor/blob_act()
return

View File

@@ -193,10 +193,6 @@
else else
return return
/turf/simulated/wall/blob_act()
take_damage(rand(75, 125))
return
// Wall-rot effect, a nasty fungus that destroys walls. // Wall-rot effect, a nasty fungus that destroys walls.
/turf/simulated/wall/proc/rot() /turf/simulated/wall/proc/rot()
if(locate(/obj/effect/overlay/wallrot) in src) if(locate(/obj/effect/overlay/wallrot) in src)

View File

@@ -83,7 +83,6 @@ var/list/reverse_dir = list( // reverse_dir[dir] = reverse of dir
23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63 23, 28, 30, 29, 31, 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63
) )
var/datum/station_state/start_state = null
var/datum/configuration/config = null var/datum/configuration/config = null
var/datum/sun/sun = null var/datum/sun/sun = null

206
code/modules/blob/blob.dm Normal file
View File

@@ -0,0 +1,206 @@
//I will need to recode parts of this but I am way too tired atm
/obj/effect/blob
name = "blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob"
light_range = 3
desc = "Some blob creature thingy"
density = 1
opacity = 0
anchored = 1
mouse_opacity = 2
var/maxHealth = 30
var/health
var/brute_resist = 4
var/fire_resist = 1
var/expandType = /obj/effect/blob
/obj/effect/blob/New(loc)
health = maxHealth
set_dir(pick(1,2,4,8))
update_icon()
return ..(loc)
/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
return 0
/obj/effect/blob/ex_act(var/severity)
switch(severity)
if(1)
take_damage(rand(100, 120) / brute_resist)
if(2)
take_damage(rand(60, 100) / brute_resist)
if(3)
take_damage(rand(20, 60) / brute_resist)
/obj/effect/blob/update_icon()
if(health > maxHealth / 2)
icon_state = "blob"
else
icon_state = "blob_damaged"
/obj/effect/blob/proc/take_damage(var/damage)
health -= damage
if(health < 0)
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
qdel(src)
else
update_icon()
/obj/effect/blob/proc/regen()
health = min(health + 1, maxHealth)
update_icon()
/obj/effect/blob/proc/expand(var/turf/T)
if(istype(T, /turf/unsimulated/) || istype(T, /turf/space))
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
var/obj/machinery/door/D = locate() in T
if(D && 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
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.take_damage(40)
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))
return
new expandType(T, min(health, 30))
/obj/effect/blob/proc/pulse(var/forceLeft, var/list/dirs)
regen()
sleep(5)
var/pushDir = pick(dirs)
var/turf/T = get_step(src, pushDir)
var/obj/effect/blob/B = (locate() in T)
if(!B)
if(prob(health))
expand(T)
return
B.pulse(forceLeft - 1, dirs)
/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
switch(Proj.damage_type)
if(BRUTE)
take_damage(Proj.damage / brute_resist)
if(BURN)
take_damage(Proj.damage / fire_resist)
return 0
/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
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
switch(W.damtype)
if("fire")
damage = (W.force / fire_resist)
if(istype(W, /obj/item/weapon/weldingtool))
playsound(loc, 'sound/items/Welder.ogg', 100, 1)
if("brute")
damage = (W.force / brute_resist)
take_damage(damage)
return
/obj/effect/blob/core
name = "blob core"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_core"
maxHealth = 200
brute_resist = 2
fire_resist = 2
expandType = /obj/effect/blob/shield
/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 ..()
/obj/effect/blob/core/process()
pulse(20, list(NORTH, EAST))
pulse(20, list(NORTH, WEST))
pulse(20, list(SOUTH, EAST))
pulse(20, list(SOUTH, WEST))
/obj/effect/blob/shield
name = "strong blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
desc = "Some blob creature thingy"
maxHealth = 60
brute_resist = 1
fire_resist = 2
/obj/effect/blob/shield/New()
..()
update_nearby_tiles()
/obj/effect/blob/shield/Destroy()
density = 0
update_nearby_tiles()
..()
/obj/effect/blob/shield/update_icon()
if(health > maxHealth * 2 / 3)
icon_state = "blob_idle"
else if(health > maxHealth / 3)
icon_state = "blob"
else
icon_state = "blob_damaged"
/obj/effect/blob/shield/CanPass(var/atom/movable/mover, var/turf/target, var/height = 0, var/air_group = 0)
return !density

View File

@@ -12,12 +12,13 @@
if(!T) if(!T)
kill() kill()
return return
Blob = new /obj/effect/blob/core(T, 120) Blob = new /obj/effect/blob/core(T)
for(var/i = 1; i < rand(3, 4), i++) for(var/i = 1; i < rand(3, 4), i++)
Blob.process() Blob.process()
/datum/event/blob/tick() /datum/event/blob/tick()
if(!Blob) if(!Blob || !Blob.loc)
Blob = null
kill() kill()
return return
if(IsMultiple(activeFor, 3)) if(IsMultiple(activeFor, 3))

View File

@@ -163,11 +163,6 @@
emergencyShutdown() emergencyShutdown()
..() ..()
/obj/machinery/computer/HolodeckControl/blob_act()
emergencyShutdown()
..()
/obj/machinery/computer/HolodeckControl/power_change() /obj/machinery/computer/HolodeckControl/power_change()
var/oldstat var/oldstat
..() ..()

View File

@@ -1,253 +0,0 @@
/mob/living/blob
name = "blob fragment"
real_name = "blob fragment"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_spore_temp"
pass_flags = PASSBLOB
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
var/ghost_name = "Unknown"
var/creating_blob = 0
faction = "blob"
use_me = 0 //Blobs can't emote
New()
real_name += " [pick(rand(1, 99))]"
name = real_name
..()
say(var/message)
return//No talking for you
emote(var/act,var/m_type=1,var/message = null)
return
Life()
set invisibility = 0
set background = 1
clamp_values()
UpdateDamage()
if(health < 0)
src.dust()
proc/clamp_values()
AdjustStunned(0)
AdjustParalysis(0)
AdjustWeakened(0)
sleeping = 0
if(stat)
stat = CONSCIOUS
return
proc/UpdateDamage()
health = 60 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
return
death(gibbed)
ghostize()
..(gibbed)
blob_act()
src << "The blob attempts to reabsorb you."
adjustToxLoss(20)
return
Process_Spacemove()
if(locate(/obj/effect/blob) in oview(1,src))
return 1
return (..())
/mob/living/blob/verb/create_node()
set category = "Blob"
set name = "Create Node"
set desc = "Create a Node."
if(creating_blob) return
var/turf/T = get_turf(src)
creating_blob = 1
if(!T)
creating_blob = 0
return
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(!B)//We are on a blob
usr << "There is no blob here!"
creating_blob = 0
return
if(istype(B,/obj/effect/blob/node)||istype(B,/obj/effect/blob/core)||istype(B,/obj/effect/blob/factory))
usr << "Unable to use this blob, find a normal one."
creating_blob = 0
return
for(var/obj/effect/blob/node/blob in orange(5))
usr << "There is another node nearby, move more than 5 tiles away from it!"
creating_blob = 0
return
for(var/obj/effect/blob/factory/blob in orange(2))
usr << "There is a porus blob nearby, move more than 2 tiles away from it!"
creating_blob = 0
B.change_to("Node")
src.dust()
return
/mob/living/blob/verb/create_factory()
set category = "Blob"
set name = "Create Defense"
set desc = "Create a Spore producing blob."
if(creating_blob) return
var/turf/T = get_turf(src)
creating_blob = 1
if(!T)
creating_blob = 0
return
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(!B)
usr << "You must be on a blob!"
creating_blob = 0
return
if(istype(B,/obj/effect/blob/node)||istype(B,/obj/effect/blob/core)||istype(B,/obj/effect/blob/factory))
usr << "Unable to use this blob, find a normal one."
creating_blob = 0
return
for(var/obj/effect/blob/blob in orange(2))//Not right next to nodes/cores
if(istype(B,/obj/effect/blob/node))
usr << "There is a node nearby, move away from it!"
creating_blob = 0
return
if(istype(B,/obj/effect/blob/core))
usr << "There is a core nearby, move away from it!"
creating_blob = 0
return
if(istype(B,/obj/effect/blob/factory))
usr << "There is another porous blob nearby, move away from it!"
creating_blob = 0
return
B.change_to("Factory")
src.dust()
return
/mob/living/blob/verb/revert()
set category = "Blob"
set name = "Purge Defense"
set desc = "Removes a porous blob."
if(creating_blob) return
var/turf/T = get_turf(src)
creating_blob = 1
if(!T)
creating_blob = 0
return
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(!B)
usr << "You must be on a blob!"
creating_blob = 0
return
if(!istype(B,/obj/effect/blob/factory))
usr << "Unable to use this blob, find another one."
creating_blob = 0
return
B.change_to("Normal")
src.dust()
return
/mob/living/blob/verb/spawn_blob()
set category = "Blob"
set name = "Create new blob"
set desc = "Attempts to create a new blob in this tile."
if(creating_blob) return
var/turf/T = get_turf(src)
creating_blob = 1
if(!T)
creating_blob = 0
return
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
if(B)
usr << "There is a blob here!"
creating_blob = 0
return
new/obj/effect/blob(src.loc)
src.dust()
return
///mob/proc/Blobize()
/client/proc/Blobcount()
set category = "Debug"
set name = "blobreport"
set desc = "blob report."
set hidden = 1
if(!holder)
src << "Only administrators may use this command."
return
if(ticker && ticker.mode)
src << "blobs: [blobs.len]"
src << "cores: [blob_cores.len]"
src << "nodes: [blob_nodes.len]"
return
/client/proc/Blobize()//Mostly stolen from the respawn command
set category = "Debug"
set name = "Ghostblob"
set desc = "Ghost into blobthing."
set hidden = 1
if(!holder)
src << "Only administrators may use this command."
return
var/input = input(src, "Please specify which key will be turned into a bloby.", "Key", "")
var/mob/dead/observer/G_found
if(!input)
var/list/ghosts = list()
for(var/mob/dead/observer/G in player_list)
ghosts += G
if(ghosts.len)
G_found = pick(ghosts)
else
for(var/mob/dead/observer/G in player_list)
if(G.client&&ckey(G.key)==ckey(input))
G_found = G
break
if(!G_found)//If a ghost was not found.
alert("There is no active key like that in the game or the person is not currently a ghost. Aborting command.")
return
if(G_found.client)
G_found.client.screen.len = null
var/mob/living/blob/B = new/mob/living/blob(locate(0,0,1))//temp area also just in case should do this better but tired
if(blob_cores.len > 0)
var/obj/effect/blob/core/core = pick(blob_cores)
if(core)
B.loc = core.loc
B.ghost_name = G_found.real_name
if (G_found.client)
G_found.client.mob = B
B.verbs += /mob/living/blob/verb/create_node
B.verbs += /mob/living/blob/verb/create_factory
B << "<B>You are now a blob fragment.</B>"
B << "You are a weak bit that has temporarily broken off of the blob."
B << "If you stay on the blob for too long you will likely be reabsorbed."
B << "If you stray from the blob you will likely be killed by other organisms."
B << "You have the power to create a new blob node that will help expand the blob."
B << "To create this node you will have to be on a normal blob tile and far enough away from any other node."
B << "Check your Blob verbs and hit Create Node to build a node."
spawn(10)
qdel(G_found)

View File

@@ -31,26 +31,3 @@
adjustFireLoss(f_loss) adjustFireLoss(f_loss)
updatehealth() updatehealth()
/mob/living/carbon/alien/blob_act()
if (stat == 2)
return
var/shielded = 0
var/damage = null
if (stat != 2)
damage = rand(10,30)
if(shielded)
damage /= 4
//paralysis += 1
show_message("\red The blob attacks you!")
adjustFireLoss(damage)
updatehealth()
return

View File

@@ -168,15 +168,6 @@
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon() if(update) UpdateDamageIcon()
/mob/living/carbon/human/blob_act()
if(stat == 2) return
show_message("\red The blob attacks you!")
var/dam_zone = pick(organs_by_name)
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee"))
return
/mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default. /mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default.
if(!config.use_loyalty_implants && !override) return // Nuh-uh. if(!config.use_loyalty_implants && !override) return // Nuh-uh.

View File

@@ -194,26 +194,6 @@
updatehealth() updatehealth()
/mob/living/carbon/slime/blob_act()
if (stat == 2)
return
var/shielded = 0
var/damage = null
if (stat != 2)
damage = rand(10,30)
if(shielded)
damage /= 4
show_message("<span class='danger'> The blob attacks you!</span>")
adjustFireLoss(damage)
updatehealth()
return
/mob/living/carbon/slime/u_equip(obj/item/W as obj) /mob/living/carbon/slime/u_equip(obj/item/W as obj)
return return

View File

@@ -119,13 +119,6 @@
return -1 return -1
return 0 return 0
/mob/living/silicon/pai/blob_act()
if (src.stat != 2)
src.adjustBruteLoss(60)
src.updatehealth()
return 1
return 0
/mob/living/silicon/pai/restrained() /mob/living/silicon/pai/restrained()
if(istype(src.loc,/obj/item/device/paicard)) if(istype(src.loc,/obj/item/device/paicard))
return 0 return 0

View File

@@ -97,13 +97,6 @@
/mob/living/silicon/IsAdvancedToolUser() /mob/living/silicon/IsAdvancedToolUser()
return 1 return 1
/mob/living/silicon/blob_act()
if (src.stat != 2)
src.adjustBruteLoss(60)
src.updatehealth()
return 1
return 0
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) /mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
if(!Proj.nodamage) if(!Proj.nodamage)

View File

@@ -146,15 +146,6 @@
toner = 0 toner = 0
return return
/obj/machinery/photocopier/blob_act()
if(prob(50))
qdel(src)
else
if(toner > 0)
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
toner = 0
return
/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy) /obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc) var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
if(toner > 10) //lots of toner, make it dark if(toner > 10) //lots of toner, make it dark

View File

@@ -101,19 +101,6 @@
return 0 return 0
/obj/machinery/power/am_control_unit/blob_act()
stability -= 20
if(prob(100-stability))//Might infect the rest of the machine
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
AMS.blob_act()
spawn(0)
//Likely explode
qdel(src)
return
check_stability()
return
/obj/machinery/power/am_control_unit/ex_act(severity) /obj/machinery/power/am_control_unit/ex_act(severity)
switch(severity) switch(severity)
if(1.0) if(1.0)

View File

@@ -90,20 +90,6 @@ proc/cardinalrange(var/center)
return 0 return 0
/obj/machinery/am_shielding/blob_act()
stability -= 20
if(prob(100-stability))
if(prob(10))//Might create a node
new /obj/effect/blob/node(src.loc,150)
else
new /obj/effect/blob(src.loc,60)
spawn(0)
qdel(src)
return
check_stability()
return
/obj/machinery/am_shielding/ex_act(severity) /obj/machinery/am_shielding/ex_act(severity)
switch(severity) switch(severity)
if(1.0) if(1.0)

View File

@@ -1178,12 +1178,6 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
cell.ex_act(3.0) cell.ex_act(3.0)
return return
/obj/machinery/power/apc/blob_act()
if (prob(75))
set_broken()
if (cell && prob(5))
cell.blob_act()
/obj/machinery/power/apc/disconnect_terminal() /obj/machinery/power/apc/disconnect_terminal()
if(terminal) if(terminal)
terminal.master = null terminal.master = null

View File

@@ -161,10 +161,6 @@
corrupt() corrupt()
return return
/obj/item/weapon/cell/blob_act()
if(prob(75))
explode()
/obj/item/weapon/cell/proc/get_electrocute_damage() /obj/item/weapon/cell/proc/get_electrocute_damage()
switch (charge) switch (charge)
/* if (9000 to INFINITY) /* if (9000 to INFINITY)

View File

@@ -548,10 +548,6 @@
//blob effect //blob effect
/obj/machinery/light/blob_act()
if(prob(75))
broken()
// timed process // timed process
// use power // use power

View File

@@ -30,10 +30,6 @@
return 1 return 1
/obj/machinery/containment_field/blob_act()
return 0
/obj/machinery/containment_field/ex_act(severity) /obj/machinery/containment_field/ex_act(severity)
return 0 return 0

View File

@@ -159,13 +159,6 @@ field_generator power level display
/obj/machinery/field_generator/emp_act() /obj/machinery/field_generator/emp_act()
return 0 return 0
/obj/machinery/field_generator/blob_act()
if(active)
return 0
else
..()
/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj) /obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj, /obj/item/projectile/beam)) if(istype(Proj, /obj/item/projectile/beam))
power += Proj.damage * EMITTER_DAMAGE_POWER_TRANSFER power += Proj.damage * EMITTER_DAMAGE_POWER_TRANSFER

View File

@@ -157,12 +157,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
else else
return return
/obj/structure/particle_accelerator/blob_act()
if(prob(50))
qdel(src)
return
/obj/structure/particle_accelerator/update_icon() /obj/structure/particle_accelerator/update_icon()
switch(construction_state) switch(construction_state)
if(0,1) if(0,1)
@@ -339,12 +333,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return return
/obj/machinery/particle_accelerator/blob_act()
if(prob(50))
qdel(src)
return
/obj/machinery/particle_accelerator/proc/update_state() /obj/machinery/particle_accelerator/proc/update_state()
return 0 return 0

View File

@@ -53,9 +53,6 @@
consume(user) consume(user)
return 1 return 1
/obj/singularity/blob_act(severity)
return
/obj/singularity/ex_act(severity) /obj/singularity/ex_act(severity)
if(current_size == STAGE_SUPER)//IT'S UNSTOPPABLE if(current_size == STAGE_SUPER)//IT'S UNSTOPPABLE
return return

View File

@@ -80,12 +80,6 @@ var/list/solars_list = list()
..() ..()
/obj/machinery/power/solar/blob_act()
src.health--
src.healthcheck()
return
/obj/machinery/power/solar/proc/healthcheck() /obj/machinery/power/solar/proc/healthcheck()
if (src.health <= 0) if (src.health <= 0)
if(!(stat & BROKEN)) if(!(stat & BROKEN))
@@ -172,12 +166,6 @@ var/list/solars_list = list()
return return
/obj/machinery/power/solar/blob_act()
if(prob(75))
broken()
src.density = 0
/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S) /obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S)
..(loc, S, 0) ..(loc, S, 0)
@@ -539,12 +527,6 @@ var/list/solars_list = list()
broken() broken()
return return
/obj/machinery/power/solar_control/blob_act()
if (prob(75))
broken()
src.density = 0
// Used for mapping in solar array which automatically starts itself (telecomms, for example) // Used for mapping in solar array which automatically starts itself (telecomms, for example)
/obj/machinery/power/solar_control/autostart /obj/machinery/power/solar_control/autostart
track = 2 // Auto tracking mode track = 2 // Auto tracking mode

View File

@@ -44,10 +44,6 @@
qdel(src) qdel(src)
return return
/obj/machinery/chem_master/blob_act()
if (prob(50))
qdel(src)
/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob) /obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
if(istype(B, /obj/item/weapon/reagent_containers/glass)) if(istype(B, /obj/item/weapon/reagent_containers/glass))

View File

@@ -59,11 +59,6 @@
else else
return return
blob_act()
if(prob(50))
new /obj/effect/effect/water(src.loc)
qdel(src)
@@ -154,9 +149,6 @@
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode() explode()
/obj/structure/reagent_dispensers/fueltank/blob_act()
explode()
/obj/structure/reagent_dispensers/fueltank/ex_act() /obj/structure/reagent_dispensers/fueltank/ex_act()
explode() explode()
@@ -223,10 +215,6 @@
..() ..()
reagents.add_reagent("beer",1000) reagents.add_reagent("beer",1000)
/obj/structure/reagent_dispensers/beerkeg/blob_act()
explosion(src.loc,0,3,5,7,10)
qdel(src)
/obj/structure/reagent_dispensers/virusfood /obj/structure/reagent_dispensers/virusfood
name = "Virus Food Dispenser" name = "Virus Food Dispenser"
desc = "A dispenser of virus food." desc = "A dispenser of virus food."

View File

@@ -79,10 +79,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
else else
icon_state = "circuit_imprinter" icon_state = "circuit_imprinter"
/obj/machinery/r_n_d/circuit_imprinter/blob_act()
if(prob(50))
qdel(src)
/obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials() /obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials()
var/t = 0 var/t = 0
for(var/f in materials) for(var/f in materials)

View File

@@ -79,10 +79,6 @@
griefProtection() griefProtection()
..() ..()
/obj/machinery/r_n_d/server/blob_act()
griefProtection()
..()
//Backup files to centcomm to help admins recover data after greifer attacks //Backup files to centcomm to help admins recover data after greifer attacks
/obj/machinery/r_n_d/server/proc/griefProtection() /obj/machinery/r_n_d/server/proc/griefProtection()
for(var/obj/machinery/r_n_d/server/centcom/C in machines) for(var/obj/machinery/r_n_d/server/centcom/C in machines)

View File

@@ -13,9 +13,6 @@
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode() explode()
/obj/structure/reagent_dispensers/coolanttank/blob_act()
explode()
/obj/structure/reagent_dispensers/coolanttank/ex_act() /obj/structure/reagent_dispensers/coolanttank/ex_act()
explode() explode()

View File

@@ -87,9 +87,6 @@
if(prob(50)) if(prob(50))
qdel(src) qdel(src)
/obj/machinery/shield/blob_act()
qdel(src)
/obj/machinery/shield/hitby(AM as mob|obj) /obj/machinery/shield/hitby(AM as mob|obj)
//Let everyone know we've been hit! //Let everyone know we've been hit!

View File

@@ -116,11 +116,6 @@
..() ..()
healthcheck() healthcheck()
/obj/vehicle/blob_act()
src.health -= rand(20,40)*fire_dam_coeff
healthcheck()
return
/obj/vehicle/ex_act(severity) /obj/vehicle/ex_act(severity)
switch(severity) switch(severity)
if(1.0) if(1.0)