mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
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:
@@ -279,12 +279,6 @@
|
||||
#include "code\game\gamemodes\gameticker.dm"
|
||||
#include "code\game\gamemodes\objective.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\changeling\changeling.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\clang.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\wormholes.dm"
|
||||
#include "code\game\gamemodes\events\holidays\Christmas.dm"
|
||||
@@ -963,6 +956,7 @@
|
||||
#include "code\modules\awaymissions\pamphlet.dm"
|
||||
#include "code\modules\awaymissions\trigger.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 procs.dm"
|
||||
#include "code\modules\client\preferences.dm"
|
||||
@@ -1231,7 +1225,6 @@
|
||||
#include "code\modules\mob\living\login.dm"
|
||||
#include "code\modules\mob\living\logout.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\cleanbot.dm"
|
||||
#include "code\modules\mob\living\bot\ed209bot.dm"
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
#define PASSTABLE 0x1
|
||||
#define PASSGLASS 0x2
|
||||
#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.
|
||||
// WARNING: The following flags apply only to the external suit!
|
||||
|
||||
@@ -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)
|
||||
return -1
|
||||
|
||||
/atom/proc/blob_act()
|
||||
return
|
||||
|
||||
/atom/proc/fire_act()
|
||||
return
|
||||
|
||||
|
||||
@@ -207,13 +207,6 @@
|
||||
else
|
||||
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
|
||||
name = "DNA Modifier Access Console"
|
||||
desc = "Scand DNA."
|
||||
@@ -270,10 +263,6 @@
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/computer/scan_consolenew/blob_act()
|
||||
if(prob(75))
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/computer/scan_consolenew/New()
|
||||
..()
|
||||
for(var/i=0;i<3;i++)
|
||||
|
||||
@@ -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
|
||||
|
||||
*/
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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
|
||||
..()
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -41,10 +41,6 @@
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/optable/blob_act()
|
||||
if(prob(75))
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/optable/attack_hand(mob/user as mob)
|
||||
if (HULK in usr.mutations)
|
||||
visible_message("<span class='danger'>\The [usr] destroys \the [src]!</span>")
|
||||
|
||||
@@ -129,12 +129,6 @@
|
||||
else
|
||||
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)
|
||||
|
||||
switch(severity)
|
||||
@@ -150,11 +144,6 @@
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/body_scanconsole/blob_act()
|
||||
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/body_scanconsole/power_change()
|
||||
..()
|
||||
if(stat & BROKEN)
|
||||
|
||||
@@ -226,11 +226,6 @@ update_flag
|
||||
return GM.return_pressure()
|
||||
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)
|
||||
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
return
|
||||
|
||||
@@ -87,11 +87,6 @@
|
||||
..()
|
||||
healthcheck()
|
||||
|
||||
/obj/machinery/bot/blob_act()
|
||||
src.health -= rand(20,40)*fire_dam_coeff
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/machinery/bot/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
|
||||
@@ -92,10 +92,6 @@
|
||||
|
||||
..() //and give it the regular chance of being deleted outright
|
||||
|
||||
|
||||
/obj/machinery/camera/blob_act()
|
||||
return
|
||||
|
||||
/obj/machinery/camera/hitby(AM as mob|obj)
|
||||
..()
|
||||
if (istype(AM, /obj))
|
||||
|
||||
@@ -60,14 +60,6 @@
|
||||
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()
|
||||
overlays.Cut()
|
||||
if(stat & NOPOWER)
|
||||
|
||||
@@ -225,12 +225,6 @@
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
blob_act()
|
||||
if (prob(75))
|
||||
set_broken()
|
||||
density = 0
|
||||
|
||||
/*
|
||||
Computers have the capability to use a battery backup.
|
||||
Note that auto_use_power's return value is strictly whether
|
||||
|
||||
@@ -28,15 +28,6 @@
|
||||
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)
|
||||
if(vendmode == 1)
|
||||
if(istype(W, /obj/item/weapon/card))
|
||||
|
||||
@@ -508,8 +508,3 @@
|
||||
name = initial(name)
|
||||
if(occupant)
|
||||
name = "[name] ([occupant])"
|
||||
|
||||
|
||||
//Attacks/effects.
|
||||
/obj/machinery/cryopod/blob_act()
|
||||
return //Sorta gamey, but we don't really want these to be destroyed.
|
||||
|
||||
@@ -131,13 +131,6 @@ for reference:
|
||||
dismantle()
|
||||
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.
|
||||
if(air_group || (height==0))
|
||||
return 1
|
||||
@@ -232,12 +225,6 @@ for reference:
|
||||
anchored = !anchored
|
||||
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.
|
||||
if(air_group || (height==0))
|
||||
return 1
|
||||
|
||||
@@ -333,12 +333,6 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/door/blob_act()
|
||||
if(prob(40))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/door/emp_act(severity)
|
||||
if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) )
|
||||
spawn(0)
|
||||
|
||||
@@ -196,10 +196,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/machinery/hologram/blob_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/machinery/hologram/holopad/Destroy()
|
||||
for (var/mob/living/silicon/ai/master in masters)
|
||||
clear_holo(master)
|
||||
|
||||
@@ -171,10 +171,6 @@ Class Procs:
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/blob_act()
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
|
||||
//sets the use_power var and then forces an area power update
|
||||
/obj/machinery/proc/update_use_power(var/new_use_power)
|
||||
use_power = new_use_power
|
||||
|
||||
@@ -362,13 +362,6 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
|
||||
/obj/machinery/nuclearbomb/ex_act(severity)
|
||||
return
|
||||
|
||||
/obj/machinery/nuclearbomb/blob_act()
|
||||
if (src.timing == -1.0)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
return
|
||||
|
||||
|
||||
#define NUKERANGE 80
|
||||
/obj/machinery/nuclearbomb/proc/explode()
|
||||
|
||||
@@ -168,15 +168,6 @@
|
||||
else
|
||||
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)
|
||||
if (!emagged)
|
||||
src.emagged = 1
|
||||
|
||||
@@ -77,11 +77,6 @@
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/blob_act()
|
||||
health-=50
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/hitby(AM as mob|obj)
|
||||
..()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
|
||||
@@ -150,9 +150,6 @@
|
||||
/obj/structure/foamedmetal/ex_act(severity)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/foamedmetal/blob_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/foamedmetal/bullet_act()
|
||||
if(metal == 1 || prob(50))
|
||||
qdel(src)
|
||||
|
||||
@@ -108,9 +108,6 @@
|
||||
else
|
||||
return
|
||||
|
||||
/obj/item/blob_act()
|
||||
return
|
||||
|
||||
//user: The mob that is suiciding
|
||||
//damagetype: The type of damage the item will inflict on the user
|
||||
//BRUTELOSS = 1
|
||||
|
||||
@@ -63,17 +63,6 @@
|
||||
descriptive = "cold"
|
||||
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)
|
||||
..()
|
||||
if (istype(src.loc, /obj/item/assembly))
|
||||
|
||||
@@ -213,10 +213,6 @@
|
||||
health = 0
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/energy_net/blob_act()
|
||||
health = 0
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/energy_net/attack_hand(var/mob/user)
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
@@ -28,10 +28,6 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/blob_act()
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/attack_tk()
|
||||
return
|
||||
|
||||
|
||||
@@ -196,13 +196,6 @@
|
||||
|
||||
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)
|
||||
if(src.opened)
|
||||
if(istype(W, /obj/item/weapon/grab))
|
||||
|
||||
@@ -96,10 +96,6 @@
|
||||
for(var/mob/M in src)
|
||||
shatter(M)
|
||||
|
||||
/obj/structure/closet/statue/blob_act()
|
||||
for(var/mob/M in src)
|
||||
shatter(M)
|
||||
|
||||
/obj/structure/closet/statue/ex_act(severity)
|
||||
for(var/mob/M in src)
|
||||
M.ex_act(severity)
|
||||
|
||||
@@ -34,15 +34,6 @@
|
||||
src.healthcheck()
|
||||
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()
|
||||
if (src.health <= 0)
|
||||
if (!( src.destroyed ))
|
||||
|
||||
@@ -202,10 +202,6 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/structure/girder/blob_act()
|
||||
if(prob(40))
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/girder/ex_act(severity)
|
||||
switch(severity)
|
||||
|
||||
@@ -16,9 +16,6 @@
|
||||
/obj/structure/grille/ex_act(severity)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/grille/blob_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/grille/update_icon()
|
||||
if(destroyed)
|
||||
icon_state = "[initial(icon_state)]-b"
|
||||
|
||||
@@ -60,9 +60,6 @@
|
||||
deflate(1)
|
||||
return
|
||||
|
||||
/obj/structure/inflatable/blob_act()
|
||||
deflate(1)
|
||||
|
||||
/obj/structure/inflatable/attack_hand(mob/user as mob)
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
@@ -32,13 +32,6 @@
|
||||
src.healthcheck()
|
||||
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()
|
||||
if (src.health <= 0)
|
||||
if (!( src.destroyed ))
|
||||
|
||||
@@ -34,10 +34,6 @@
|
||||
L.updateOverlays(src.loc)
|
||||
..()
|
||||
|
||||
/obj/structure/lattice/blob_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/structure/lattice/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
|
||||
@@ -160,10 +160,6 @@ FLOOR SAFES
|
||||
return
|
||||
|
||||
|
||||
obj/structure/safe/blob_act()
|
||||
return
|
||||
|
||||
|
||||
obj/structure/safe/ex_act(severity)
|
||||
return
|
||||
|
||||
|
||||
@@ -19,10 +19,6 @@
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/sign/blob_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/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))
|
||||
user << "You unfasten the sign with your [tool]."
|
||||
|
||||
@@ -86,11 +86,6 @@
|
||||
qdel(src)
|
||||
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)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
|
||||
@@ -95,11 +95,6 @@ var/global/list/stool_cache = list() //haha stool
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/stool/blob_act()
|
||||
if(prob(75))
|
||||
material.place_sheet(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/stool/proc/dismantle()
|
||||
if(material)
|
||||
material.place_sheet(get_turf(src))
|
||||
|
||||
@@ -122,10 +122,6 @@
|
||||
shatter(0)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/window/blob_act()
|
||||
shatter()
|
||||
|
||||
//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
|
||||
//having the same type for both.
|
||||
|
||||
@@ -43,6 +43,3 @@
|
||||
for(var/obj/structure/window/W in src)
|
||||
if(W.dir == dir_to || W.is_fulltile()) //Same direction or diagonal (full tile)
|
||||
W.fire_act(adj_air, adj_temp, adj_volume)
|
||||
|
||||
/turf/simulated/floor/blob_act()
|
||||
return
|
||||
|
||||
@@ -193,10 +193,6 @@
|
||||
else
|
||||
return
|
||||
|
||||
/turf/simulated/wall/blob_act()
|
||||
take_damage(rand(75, 125))
|
||||
return
|
||||
|
||||
// Wall-rot effect, a nasty fungus that destroys walls.
|
||||
/turf/simulated/wall/proc/rot()
|
||||
if(locate(/obj/effect/overlay/wallrot) in src)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
var/datum/station_state/start_state = null
|
||||
var/datum/configuration/config = null
|
||||
var/datum/sun/sun = null
|
||||
|
||||
|
||||
206
code/modules/blob/blob.dm
Normal file
206
code/modules/blob/blob.dm
Normal 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
|
||||
@@ -12,12 +12,13 @@
|
||||
if(!T)
|
||||
kill()
|
||||
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++)
|
||||
Blob.process()
|
||||
|
||||
/datum/event/blob/tick()
|
||||
if(!Blob)
|
||||
if(!Blob || !Blob.loc)
|
||||
Blob = null
|
||||
kill()
|
||||
return
|
||||
if(IsMultiple(activeFor, 3))
|
||||
|
||||
@@ -163,11 +163,6 @@
|
||||
emergencyShutdown()
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/blob_act()
|
||||
emergencyShutdown()
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/power_change()
|
||||
var/oldstat
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -31,26 +31,3 @@
|
||||
adjustFireLoss(f_loss)
|
||||
|
||||
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
|
||||
@@ -168,15 +168,6 @@
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
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.
|
||||
if(!config.use_loyalty_implants && !override) return // Nuh-uh.
|
||||
|
||||
|
||||
@@ -194,26 +194,6 @@
|
||||
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)
|
||||
return
|
||||
|
||||
|
||||
@@ -119,13 +119,6 @@
|
||||
return -1
|
||||
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()
|
||||
if(istype(src.loc,/obj/item/device/paicard))
|
||||
return 0
|
||||
|
||||
@@ -97,13 +97,6 @@
|
||||
/mob/living/silicon/IsAdvancedToolUser()
|
||||
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)
|
||||
|
||||
if(!Proj.nodamage)
|
||||
|
||||
@@ -146,15 +146,6 @@
|
||||
toner = 0
|
||||
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)
|
||||
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
|
||||
if(toner > 10) //lots of toner, make it dark
|
||||
|
||||
@@ -101,19 +101,6 @@
|
||||
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)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
|
||||
@@ -90,20 +90,6 @@ proc/cardinalrange(var/center)
|
||||
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)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
|
||||
@@ -1178,12 +1178,6 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
|
||||
cell.ex_act(3.0)
|
||||
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()
|
||||
if(terminal)
|
||||
terminal.master = null
|
||||
|
||||
@@ -161,10 +161,6 @@
|
||||
corrupt()
|
||||
return
|
||||
|
||||
/obj/item/weapon/cell/blob_act()
|
||||
if(prob(75))
|
||||
explode()
|
||||
|
||||
/obj/item/weapon/cell/proc/get_electrocute_damage()
|
||||
switch (charge)
|
||||
/* if (9000 to INFINITY)
|
||||
|
||||
@@ -548,10 +548,6 @@
|
||||
|
||||
//blob effect
|
||||
|
||||
/obj/machinery/light/blob_act()
|
||||
if(prob(75))
|
||||
broken()
|
||||
|
||||
|
||||
// timed process
|
||||
// use power
|
||||
|
||||
@@ -30,10 +30,6 @@
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/containment_field/blob_act()
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/containment_field/ex_act(severity)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -159,13 +159,6 @@ field_generator power level display
|
||||
/obj/machinery/field_generator/emp_act()
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/field_generator/blob_act()
|
||||
if(active)
|
||||
return 0
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(istype(Proj, /obj/item/projectile/beam))
|
||||
power += Proj.damage * EMITTER_DAMAGE_POWER_TRANSFER
|
||||
|
||||
@@ -157,12 +157,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/particle_accelerator/blob_act()
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/structure/particle_accelerator/update_icon()
|
||||
switch(construction_state)
|
||||
if(0,1)
|
||||
@@ -339,12 +333,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/particle_accelerator/blob_act()
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/particle_accelerator/proc/update_state()
|
||||
return 0
|
||||
|
||||
|
||||
@@ -53,9 +53,6 @@
|
||||
consume(user)
|
||||
return 1
|
||||
|
||||
/obj/singularity/blob_act(severity)
|
||||
return
|
||||
|
||||
/obj/singularity/ex_act(severity)
|
||||
if(current_size == STAGE_SUPER)//IT'S UNSTOPPABLE
|
||||
return
|
||||
|
||||
@@ -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()
|
||||
if (src.health <= 0)
|
||||
if(!(stat & BROKEN))
|
||||
@@ -172,12 +166,6 @@ var/list/solars_list = list()
|
||||
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)
|
||||
..(loc, S, 0)
|
||||
|
||||
@@ -539,12 +527,6 @@ var/list/solars_list = list()
|
||||
broken()
|
||||
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)
|
||||
/obj/machinery/power/solar_control/autostart
|
||||
track = 2 // Auto tracking mode
|
||||
|
||||
@@ -44,10 +44,6 @@
|
||||
qdel(src)
|
||||
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)
|
||||
|
||||
if(istype(B, /obj/item/weapon/reagent_containers/glass))
|
||||
|
||||
@@ -59,11 +59,6 @@
|
||||
else
|
||||
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) )
|
||||
explode()
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/blob_act()
|
||||
explode()
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/ex_act()
|
||||
explode()
|
||||
|
||||
@@ -223,10 +215,6 @@
|
||||
..()
|
||||
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
|
||||
name = "Virus Food Dispenser"
|
||||
desc = "A dispenser of virus food."
|
||||
|
||||
@@ -79,10 +79,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
|
||||
else
|
||||
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()
|
||||
var/t = 0
|
||||
for(var/f in materials)
|
||||
|
||||
@@ -79,10 +79,6 @@
|
||||
griefProtection()
|
||||
..()
|
||||
|
||||
/obj/machinery/r_n_d/server/blob_act()
|
||||
griefProtection()
|
||||
..()
|
||||
|
||||
//Backup files to centcomm to help admins recover data after greifer attacks
|
||||
/obj/machinery/r_n_d/server/proc/griefProtection()
|
||||
for(var/obj/machinery/r_n_d/server/centcom/C in machines)
|
||||
|
||||
@@ -13,9 +13,6 @@
|
||||
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
|
||||
explode()
|
||||
|
||||
/obj/structure/reagent_dispensers/coolanttank/blob_act()
|
||||
explode()
|
||||
|
||||
/obj/structure/reagent_dispensers/coolanttank/ex_act()
|
||||
explode()
|
||||
|
||||
|
||||
@@ -87,9 +87,6 @@
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/shield/blob_act()
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/machinery/shield/hitby(AM as mob|obj)
|
||||
//Let everyone know we've been hit!
|
||||
|
||||
@@ -116,11 +116,6 @@
|
||||
..()
|
||||
healthcheck()
|
||||
|
||||
/obj/vehicle/blob_act()
|
||||
src.health -= rand(20,40)*fire_dam_coeff
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/vehicle/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
|
||||
Reference in New Issue
Block a user