mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
BoH is no longer an instakill on a singularity, the chance the singularity will die from bombs now 25% from 10%. Finished removing Metabslow from the game because delaying Interface rebuilds is a bad idea. Sadly THE SUN is gone due to lighting lag issues, the current mob max luminosity is set to 7. Damage and stun from doors shocking people has been lowered. process() is now an obj level proc as it was already used by several procs and they can now jump onto the ticker if needed. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2199 316c924e-a436-60f5-8080-3fe189b3f50e
258 lines
5.6 KiB
Plaintext
258 lines
5.6 KiB
Plaintext
|
|
/obj/blob
|
|
name = "blob"
|
|
icon = 'blob.dmi'
|
|
icon_state = "blob"
|
|
desc = "Some blob creature thingy"
|
|
density = 0
|
|
opacity = 0
|
|
anchored = 1
|
|
var
|
|
active = 1
|
|
health = 40
|
|
blobtype = "Blob"
|
|
blobdebug = 0
|
|
/*Types
|
|
Blob
|
|
Node
|
|
Factory
|
|
Shield
|
|
*/
|
|
|
|
|
|
New(loc, var/h = 40)
|
|
blobs += src
|
|
active_blobs += src
|
|
src.health = h
|
|
src.dir = pick(1,2,4,8)
|
|
src.update()
|
|
..(loc)
|
|
|
|
|
|
Del()
|
|
blobs -= src
|
|
if(active)
|
|
active_blobs -= src
|
|
if(blobtype == "Node")
|
|
processing_objects.Remove(src)
|
|
..()
|
|
|
|
|
|
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
if( (air_group && blobtype != "Shield") || (height==0)) return 1
|
|
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
|
|
return 0
|
|
|
|
|
|
proc/check_mutations()
|
|
if(blobtype != "Blob") return
|
|
desc = "This really needs a better sprite"
|
|
//Spaceeeeeeblobbb
|
|
if(istype(src.loc, /turf/space))
|
|
active = 0
|
|
health += 40
|
|
name = "strong blob"
|
|
icon_state = "blob_idle"//needs a new sprite
|
|
blobtype = "Shield"
|
|
active_blobs -= src
|
|
return 1
|
|
//Commandblob
|
|
if((blobdebug == 1))
|
|
active = 0
|
|
health += 80
|
|
name = "solid blob"
|
|
icon_state = "blob_node"//needs a new sprite
|
|
blobtype = "Node"
|
|
active_blobs -= src
|
|
processing_objects.Add(src)
|
|
return 1
|
|
if((blobdebug == 2))
|
|
health += 20
|
|
name = "odd blob"
|
|
icon_state = "blob_factory"//needs a new sprite
|
|
blobtype = "Factory"
|
|
return 1
|
|
return 0
|
|
|
|
|
|
process()
|
|
spawn(-1)
|
|
Life()
|
|
return
|
|
|
|
|
|
proc/Life(var/pulse = 0)
|
|
set background = 1
|
|
|
|
if(blobtype == "Factory")
|
|
for(var/i = 1 to 2)
|
|
new/obj/critter/blob(src.loc)
|
|
return
|
|
|
|
if(check_mutations())
|
|
return
|
|
|
|
if(!prob(health)) return//Does not do much unless its healthy it seems, might want to change this later
|
|
|
|
for(var/dirn in cardinal)
|
|
// sleep(3) Due to the background we might not need this dono though
|
|
var/turf/T = get_step(src, dirn)
|
|
|
|
if((locate(/obj/blob) in T))
|
|
if(((src.blobtype == "Node") || (pulse > 0))&& (pulse < 12))
|
|
var/obj/blob/E = (locate(/obj/blob) in T)
|
|
E.Life((pulse+1))
|
|
return//Pass it along and end
|
|
continue
|
|
|
|
|
|
var/obj/blob/B = new /obj/blob(src.loc, src.health)
|
|
if(T.Enter(B,src) && !(locate(/obj/blob) in T))
|
|
B.loc = T // open cell, so expand
|
|
else
|
|
if(prob(90)) // closed cell, 10% chance to not expand
|
|
if(!locate(/obj/blob) in T)
|
|
for(var/atom/A in T) // otherwise explode contents of turf
|
|
A.blob_act()
|
|
|
|
T.blob_act()
|
|
del(B)
|
|
return
|
|
|
|
|
|
ex_act(severity)
|
|
switch(severity)
|
|
if(1)
|
|
src.health -= rand(90,150)
|
|
if(2)
|
|
src.health -= rand(60,90)
|
|
src.update()
|
|
if(3)
|
|
src.health -= rand(30,40)
|
|
src.update()
|
|
|
|
|
|
proc/update()//Needs to be updated with the types
|
|
if(health <= 0)
|
|
playsound(src.loc, 'splat.ogg', 50, 1)
|
|
del(src)
|
|
return
|
|
if(blobtype != "Blob") return
|
|
if(health<10)
|
|
icon_state = "blob_damaged"
|
|
return
|
|
if(health<20)
|
|
icon_state = "blob_damaged2"
|
|
return
|
|
|
|
|
|
bullet_act(var/obj/item/projectile/Proj)
|
|
health -= Proj.damage
|
|
..()
|
|
update()
|
|
|
|
|
|
attackby(var/obj/item/weapon/W, var/mob/user)
|
|
playsound(src.loc, 'attackblob.ogg', 50, 1)
|
|
src.visible_message("\red <B>The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]")
|
|
var/damage = W.force / 4.0
|
|
if(istype(W, /obj/item/weapon/weldingtool))
|
|
var/obj/item/weapon/weldingtool/WT = W
|
|
if(WT.welding)
|
|
damage = 15
|
|
playsound(src.loc, 'Welder.ogg', 100, 1)
|
|
|
|
src.health -= damage
|
|
src.update()
|
|
|
|
|
|
examine()
|
|
set src in oview(1)
|
|
usr << "Some blob thing."
|
|
|
|
|
|
/datum/station_state/proc/count()
|
|
for(var/turf/T in world)
|
|
if(T.z != 1)
|
|
continue
|
|
|
|
if(istype(T,/turf/simulated/floor))
|
|
if(!(T:burnt))
|
|
src.floor+=2
|
|
else
|
|
src.floor++
|
|
|
|
else if(istype(T, /turf/simulated/floor/engine))
|
|
src.floor+=2
|
|
|
|
else if(istype(T, /turf/simulated/wall))
|
|
if(T:intact)
|
|
src.wall+=2
|
|
else
|
|
src.wall++
|
|
|
|
else if(istype(T, /turf/simulated/wall/r_wall))
|
|
if(T:intact)
|
|
src.r_wall+=2
|
|
else
|
|
src.r_wall++
|
|
|
|
for(var/obj/O in world)
|
|
if(O.z != 1)
|
|
continue
|
|
|
|
if(istype(O, /obj/window))
|
|
src.window++
|
|
else if(istype(O, /obj/grille))
|
|
if(!O:destroyed)
|
|
src.grille++
|
|
else if(istype(O, /obj/machinery/door))
|
|
src.door++
|
|
else if(istype(O, /obj/machinery))
|
|
src.mach++
|
|
|
|
|
|
/datum/station_state/proc/score(var/datum/station_state/result)
|
|
var/r1a = min( result.floor / max(floor,1), 1.0)
|
|
var/r1b = min(result.r_wall/ max(r_wall,1), 1.0)
|
|
var/r1c = min(result.wall / max(wall,1), 1.0)
|
|
var/r2a = min(result.window / max(window,1), 1.0)
|
|
var/r2b = min(result.door / max(door,1), 1.0)
|
|
var/r2c = min(result.grille / max(grille,1), 1.0)
|
|
var/r3 = min(result.mach / max(mach,1), 1.0)
|
|
//diary << "Blob scores:[r1b] [r1c] / [r2a] [r2b] [r2c] / [r3] [r1a]"
|
|
return (4*(r1b+r1c) + 2*(r2a+r2b+r2c) + r3+r1a)/16.0
|
|
|
|
//////////////////////////////****IDLE BLOB***/////////////////////////////////////
|
|
|
|
/obj/blob/idle
|
|
name = "blob"
|
|
desc = "it looks... tasty"
|
|
icon_state = "blobidle0"
|
|
|
|
New(loc, var/h = 10)
|
|
src.health = h
|
|
src.dir = pick(1,2,4,8)
|
|
src.update_idle()
|
|
|
|
|
|
proc/update_idle() //put in stuff here to make it transform? Maybe when its down to around 5 health?
|
|
if(health<=0)
|
|
del(src)
|
|
return
|
|
if(health<4)
|
|
icon_state = "blobc0"
|
|
return
|
|
if(health<10)
|
|
icon_state = "blobb0"
|
|
return
|
|
icon_state = "blobidle0"
|
|
|
|
|
|
Del() //idle blob that spawns a normal blob when killed.
|
|
var/obj/blob/B = new /obj/blob( src.loc )
|
|
spawn(30)
|
|
B.Life()
|
|
..()
|
|
|