mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-06 06:52:39 +00:00
Fixes the bug with effects/glowshroom not glowing when placed. They don't spread infinitely: The odds of a shroom spreading decreases with each generation. Because they're sane now and not virally-spreading fungal horrors, they've been changed to spread on normal station floors and not just the asteroid. The spreading glowshrooms acquire the parent's stats, with some mutations. The delay variable is now based off of production, and goes DOWN with better stats instead of GOING UP. -Removes unnecessary (copy-pasted) code bits in walking mushroom/killer tomato code in grown.dm
143 lines
3.5 KiB
Plaintext
143 lines
3.5 KiB
Plaintext
//separate dm since hydro is getting bloated already
|
|
|
|
/obj/effect/glowshroom
|
|
name = "glowshroom"
|
|
anchored = 1
|
|
opacity = 0
|
|
density = 0
|
|
icon = 'icons/obj/lighting.dmi'
|
|
icon_state = "glowshroomf"
|
|
layer = 2.1
|
|
var/endurance = 30
|
|
var/potency = 30
|
|
var/delay = 1200
|
|
var/floor = 0
|
|
var/yield = 3
|
|
var/generation = 1
|
|
var/spreadIntoAdjacentChance = 60
|
|
|
|
/obj/effect/glowshroom/single
|
|
yield = 0
|
|
|
|
/obj/effect/glowshroom/New()
|
|
..()
|
|
SetLuminosity(round(potency/10))
|
|
dir = CalcDir()
|
|
if(!floor)
|
|
switch(dir) //offset to make it be on the wall rather than on the floor
|
|
if(NORTH)
|
|
pixel_y = 32
|
|
if(SOUTH)
|
|
pixel_y = -32
|
|
if(EAST)
|
|
pixel_x = 32
|
|
if(WEST)
|
|
pixel_x = -32
|
|
icon_state = "glowshroom[rand(1,3)]"
|
|
else //if on the floor, glowshroom on-floor sprite
|
|
icon_state = "glowshroomf"
|
|
|
|
spawn(delay)
|
|
Spread()
|
|
|
|
/obj/effect/glowshroom/proc/Spread()
|
|
set background = 1
|
|
|
|
for(var/i=1,i<=yield,i++)
|
|
if(prob(1/(generation * generation) * 100))//This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2...
|
|
var/list/possibleLocs = list()
|
|
var/spreadsIntoAdjacent = 0
|
|
|
|
if(prob(spreadIntoAdjacentChance))
|
|
spreadsIntoAdjacent = 1
|
|
|
|
for(var/turf/simulated/floor/earth in view(3,src))
|
|
if(spreadsIntoAdjacent || !locate(/obj/effect/glowshroom) in view(1,earth))
|
|
possibleLocs += earth
|
|
|
|
if(!possibleLocs.len)
|
|
break
|
|
|
|
var/turf/newLoc = pick(possibleLocs)
|
|
|
|
var/shroomCount = 0 //hacky
|
|
var/placeCount = 1
|
|
for(var/obj/effect/glowshroom/shroom in newLoc)
|
|
shroomCount++
|
|
for(var/wallDir in cardinal)
|
|
var/turf/isWall = get_step(newLoc,wallDir)
|
|
if(isWall.density)
|
|
placeCount++
|
|
if(shroomCount >= placeCount)
|
|
continue
|
|
|
|
var/obj/effect/glowshroom/child = new /obj/effect/glowshroom(newLoc)//The baby mushrooms have different stats :3
|
|
child.potency = max(potency+rand(-3,6), 0)
|
|
child.yield = max(yield+rand(-1,2), 0)
|
|
child.delay = max(delay+rand(-30,60), 0)
|
|
child.endurance = max(endurance+rand(-3,6), 1)
|
|
child.generation = generation+1
|
|
child.desc = "This is a [child.generation]\th generation glowshroom!"//I added this for testing, but I figure I'll leave it in.
|
|
|
|
/obj/effect/glowshroom/proc/CalcDir(turf/location = loc)
|
|
set background = 1
|
|
var/direction = 16
|
|
|
|
for(var/wallDir in cardinal)
|
|
var/turf/newTurf = get_step(location,wallDir)
|
|
if(newTurf.density)
|
|
direction |= wallDir
|
|
|
|
for(var/obj/effect/glowshroom/shroom in location)
|
|
if(shroom == src)
|
|
continue
|
|
if(shroom.floor) //special
|
|
direction &= ~16
|
|
else
|
|
direction &= ~shroom.dir
|
|
|
|
var/list/dirList = list()
|
|
|
|
for(var/i=1,i<=16,i <<= 1)
|
|
if(direction & i)
|
|
dirList += i
|
|
|
|
if(dirList.len)
|
|
var/newDir = pick(dirList)
|
|
if(newDir == 16)
|
|
floor = 1
|
|
newDir = 1
|
|
return newDir
|
|
|
|
floor = 1
|
|
return 1
|
|
|
|
/obj/effect/glowshroom/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
|
..()
|
|
endurance -= W.force
|
|
CheckEndurance()
|
|
|
|
/obj/effect/glowshroom/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
del(src)
|
|
return
|
|
if(2.0)
|
|
if (prob(50))
|
|
del(src)
|
|
return
|
|
if(3.0)
|
|
if (prob(5))
|
|
del(src)
|
|
return
|
|
else
|
|
return
|
|
|
|
/obj/effect/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
|
if(exposed_temperature > 300)
|
|
endurance -= 5
|
|
CheckEndurance()
|
|
|
|
/obj/effect/glowshroom/proc/CheckEndurance()
|
|
if(endurance <= 0)
|
|
del(src) |