mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-16 13:12:22 +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\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"
|
||||||
|
|||||||
@@ -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!
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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++)
|
||||||
|
|||||||
@@ -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
|
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>")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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.
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 ))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 ))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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]."
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
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)
|
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))
|
||||||
|
|||||||
@@ -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
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -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)
|
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
|
|
||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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."
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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!
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user