mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
The force secret mode will now build the list of possible modes and make sure it can set the forced mode up before it actually picks the mode. If the setup fails it will just use another mode from the secret list. The R-table in medbay lobby was replaced with a normal table and medbay mostly follows the old "Can you get to the hall with next to nothing on you" map design. Blob mode work. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2185 316c924e-a436-60f5-8080-3fe189b3f50e
227 lines
4.7 KiB
Plaintext
227 lines
4.7 KiB
Plaintext
|
|
/obj/blob
|
|
name = "blob"
|
|
icon = 'blob.dmi'
|
|
icon_state = "blob"
|
|
density = 1
|
|
opacity = 0
|
|
anchored = 1
|
|
var/active = 1
|
|
var/health = 40
|
|
|
|
|
|
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
|
|
..()
|
|
|
|
/*
|
|
proc/poisoned(iteration)
|
|
src.health -= 20
|
|
src.update()
|
|
for(var/obj/blob/B in orange(1,src))
|
|
if(prob(100/(iteration/2)))
|
|
spawn(rand(10,100))
|
|
if(B)
|
|
B.poisoned(iteration+1)
|
|
*/
|
|
|
|
|
|
proc/Life()
|
|
set background = 1
|
|
if(!active) return
|
|
|
|
var/turf/U = src.loc
|
|
|
|
/* if (locate(/obj/movable, U))
|
|
U = locate(/obj/movable, U)
|
|
if(U.density == 1)
|
|
del(src)
|
|
if(U.poison> 200000)
|
|
src.health -= round(U.poison/200000)
|
|
src.update()
|
|
return
|
|
*/
|
|
//Spaceblobs will harden and become inactive
|
|
if(istype(U, /turf/space))
|
|
src.active = 0
|
|
src.health += 40
|
|
src.name = "strong blob"
|
|
src.icon_state = "blob_idle"//needs a new sprite
|
|
active_blobs -= src
|
|
return
|
|
|
|
var/p = health //TODO: DEFERRED * (U.n2/11376000 + U.oxygen/1008000 + U.co2/200)
|
|
|
|
if(!prob(p)) return
|
|
|
|
for(var/dirn in cardinal)
|
|
sleep(3)
|
|
var/turf/T = get_step(src, dirn)
|
|
|
|
if(istype(T.loc, /area/arrival))
|
|
continue
|
|
|
|
if((locate(/obj/blob) in T))
|
|
continue
|
|
|
|
var/obj/blob/B = new /obj/blob(U, 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)
|
|
del(src)
|
|
if(2)
|
|
src.health -= rand(60,90)
|
|
src.update()
|
|
if(3)
|
|
src.health -= rand(30,40)
|
|
src.update()
|
|
|
|
|
|
proc/update()
|
|
if(health <= 0)
|
|
playsound(src.loc, 'splat.ogg', 50, 1)
|
|
del(src)
|
|
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] 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()
|
|
..()
|
|
|