Changes obj/effect/blob,spider,swarmer,energy_net,spacevines to be ob/structures instead, since you can hit and destroy them.

Adds a large ash and large molten item decal (for future use)
simplifies decal/cleanable/replace_decal() code a bit.
Changes construction() proc to on_construction() for consistency, same for deconstruction().
Made a deconstruct() proc for machinery and computer (also for future use).
This commit is contained in:
phil235
2016-09-27 19:58:27 +02:00
committed by phil235
parent dc9abafa6f
commit 6809603669
124 changed files with 571 additions and 524 deletions

View File

@@ -20926,7 +20926,7 @@
/turf/open/floor/plasteel/shuttle,
/area/shuttle/arrival)
"aZw" = (
/obj/effect/spider/stickyweb,
/obj/structure/spider/stickyweb,
/turf/open/floor/plating{
icon_plating = "asteroidplating";
icon_state = "asteroidplating"

View File

@@ -128,7 +128,7 @@ var/global/max_secret_rooms = 6
treasureitems = list(/obj/item/weapon/gun/energy/floragun=1,/obj/item/seeds/sunflower/novaflower=2,/obj/item/seeds/tomato/blue/bluespace=2,/obj/item/seeds/tomato/blue=2,
/obj/item/seeds/coffee/robusta=2, /obj/item/seeds/firelemon=2)
fluffitems = list(/obj/item/weapon/twohanded/required/kirbyplants=1,/obj/structure/table/reinforced=2,/obj/machinery/hydroponics/constructable=1,
/obj/effect/glowshroom/single=2,/obj/item/weapon/reagent_containers/syringe/charcoal=2,
/obj/structure/glowshroom/single=2,/obj/item/weapon/reagent_containers/syringe/charcoal=2,
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine=3,/obj/item/weapon/reagent_containers/glass/bottle/ammonia=3)
/*if("poly")
@@ -180,7 +180,7 @@ var/global/max_secret_rooms = 6
var/list/emptyturfs = room["floors"]
T = pick(emptyturfs)
if(T)
new /obj/effect/glowshroom/single(T) //Just to make it a little more visible
new /obj/structure/glowshroom/single(T) //Just to make it a little more visible
var/surprise = null
surprise = pickweight(treasureitems)
new surprise(T)//here's the prize

View File

@@ -208,7 +208,7 @@
/atom/proc/ex_act(severity, target)
contents_explosion(severity, target)
/atom/proc/blob_act(obj/effect/blob/B)
/atom/proc/blob_act(obj/structure/blob/B)
return
/atom/proc/fire_act()

View File

@@ -16,7 +16,7 @@
unique_name = 1
a_intent = "harm"
var/mob/camera/blob/overmind = null
var/obj/effect/blob/factory/factory = null
var/obj/structure/blob/factory/factory = null
/mob/living/simple_animal/hostile/blob/update_icons()
if(overmind)
@@ -29,7 +29,7 @@
overmind.blob_mobs -= src
return ..()
/mob/living/simple_animal/hostile/blob/blob_act(obj/effect/blob/B)
/mob/living/simple_animal/hostile/blob/blob_act(obj/structure/blob/B)
if(stat != DEAD && health < maxHealth)
for(var/i in 1 to 2)
var/obj/effect/overlay/temp/heal/H = PoolOrNew(/obj/effect/overlay/temp/heal, get_turf(src)) //hello yes you are being healed
@@ -44,12 +44,12 @@
adjustFireLoss(Clamp(0.01 * exposed_temperature, 1, 5))
/mob/living/simple_animal/hostile/blob/CanPass(atom/movable/mover, turf/target, height = 0)
if(istype(mover, /obj/effect/blob))
if(istype(mover, /obj/structure/blob))
return 1
return ..()
/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0)
for(var/obj/effect/blob/B in range(1, src))
for(var/obj/structure/blob/B in range(1, src))
return 1
return ..()
@@ -97,7 +97,7 @@
var/is_zombie = 0
gold_core_spawnable = 1
/mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/effect/blob/factory/linked_node)
/mob/living/simple_animal/hostile/blob/blobspore/New(loc, var/obj/structure/blob/factory/linked_node)
if(istype(linked_node))
factory = linked_node
factory.spores += src
@@ -228,7 +228,7 @@
if(independent)
return // strong independent blobbernaut that don't need no blob
var/damagesources = 0
if(!(locate(/obj/effect/blob) in range(2, src)))
if(!(locate(/obj/structure/blob) in range(2, src)))
damagesources++
if(!factory)
damagesources++

View File

@@ -1,4 +1,4 @@
/obj/effect/blob/core
/obj/structure/blob/core
name = "blob core"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
@@ -14,7 +14,7 @@
var/point_rate = 2
/obj/effect/blob/core/New(loc, client/new_overmind = null, new_rate = 2, placed = 0)
/obj/structure/blob/core/New(loc, client/new_overmind = null, new_rate = 2, placed = 0)
blob_cores += src
START_PROCESSING(SSobj, src)
poi_list |= src
@@ -26,10 +26,10 @@
point_rate = new_rate
..()
/obj/effect/blob/core/scannerreport()
/obj/structure/blob/core/scannerreport()
return "Directs the blob's expansion, gradually expands, and sustains nearby blob spores and blobbernauts."
/obj/effect/blob/core/update_icon()
/obj/structure/blob/core/update_icon()
cut_overlays()
color = null
var/image/I = new('icons/mob/blob.dmi', "blob")
@@ -39,7 +39,7 @@
var/image/C = new('icons/mob/blob.dmi', "blob_core_overlay")
add_overlay(C)
/obj/effect/blob/core/Destroy()
/obj/structure/blob/core/Destroy()
blob_cores -= src
if(overmind)
overmind.blob_core = null
@@ -48,20 +48,20 @@
poi_list -= src
return ..()
/obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
exposed_temperature *= 0.5
..()
/obj/effect/blob/core/ex_act(severity, target)
/obj/structure/blob/core/ex_act(severity, target)
var/damage = 50 - 10 * severity //remember, the core takes half brute damage, so this is 20/15/10 damage based on severity
take_damage(damage, BRUTE)
/obj/effect/blob/core/check_health()
/obj/structure/blob/core/check_health()
..()
if(overmind) //we should have an overmind, but...
overmind.update_health_hud()
/obj/effect/blob/core/Life()
/obj/structure/blob/core/Life()
if(qdeleted(src))
return
if(!overmind)
@@ -74,13 +74,13 @@
if(overmind)
overmind.update_health_hud()
Pulse_Area(overmind, 12, 4, 3)
for(var/obj/effect/blob/normal/B in range(1, src))
for(var/obj/structure/blob/normal/B in range(1, src))
if(prob(5))
B.change_to(/obj/effect/blob/shield/core, overmind)
B.change_to(/obj/structure/blob/shield/core, overmind)
..()
/obj/effect/blob/core/proc/create_overmind(client/new_overmind, override_delay)
/obj/structure/blob/core/proc/create_overmind(client/new_overmind, override_delay)
if(overmind_get_delay > world.time && !override_delay)
return

View File

@@ -1,4 +1,4 @@
/obj/effect/blob/factory
/obj/structure/blob/factory
name = "factory blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_factory"
@@ -14,12 +14,12 @@
var/spore_cooldown = 80 //8 seconds between spores and after spore death
/obj/effect/blob/factory/scannerreport()
/obj/structure/blob/factory/scannerreport()
if(naut)
return "It is currently sustaining a blobbernaut, making it fragile and unable to produce blob spores."
return "Will produce a blob spore every few seconds."
/obj/effect/blob/factory/Destroy()
/obj/structure/blob/factory/Destroy()
for(var/mob/living/simple_animal/hostile/blob/blobspore/spore in spores)
if(spore.factory == src)
spore.factory = null
@@ -30,7 +30,7 @@
spores = null
return ..()
/obj/effect/blob/factory/Be_Pulsed()
/obj/structure/blob/factory/Be_Pulsed()
. = ..()
if(naut)
return

View File

@@ -1,4 +1,4 @@
/obj/effect/blob/node
/obj/structure/blob/node
name = "blob node"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
@@ -9,15 +9,15 @@
point_return = 25
/obj/effect/blob/node/New(loc)
/obj/structure/blob/node/New(loc)
blob_nodes += src
START_PROCESSING(SSobj, src)
..(loc)
/obj/effect/blob/node/scannerreport()
/obj/structure/blob/node/scannerreport()
return "Gradually expands and sustains nearby blob spores and blobbernauts."
/obj/effect/blob/node/update_icon()
/obj/structure/blob/node/update_icon()
cut_overlays()
color = null
var/image/I = new('icons/mob/blob.dmi', "blob")
@@ -27,15 +27,15 @@
var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay")
src.add_overlay(C)
/obj/effect/blob/node/Destroy()
/obj/structure/blob/node/Destroy()
blob_nodes -= src
STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
exposed_temperature *= 0.75
..()
/obj/effect/blob/node/Life()
/obj/structure/blob/node/Life()
Pulse_Area(overmind, 10, 3, 2)
color = null

View File

@@ -1,4 +1,4 @@
/obj/effect/blob/resource
/obj/structure/blob/resource
name = "resource blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
@@ -8,19 +8,19 @@
point_return = 15
var/resource_delay = 0
/obj/effect/blob/resource/scannerreport()
/obj/structure/blob/resource/scannerreport()
return "Gradually supplies the blob with resources, increasing the rate of expansion."
/obj/effect/blob/resource/creation_action()
/obj/structure/blob/resource/creation_action()
if(overmind)
overmind.resource_blobs += src
/obj/effect/blob/resource/Destroy()
/obj/structure/blob/resource/Destroy()
if(overmind)
overmind.resource_blobs -= src
return ..()
/obj/effect/blob/resource/Be_Pulsed()
/obj/structure/blob/resource/Be_Pulsed()
. = ..()
if(resource_delay > world.time)
return

View File

@@ -1,4 +1,4 @@
/obj/effect/blob/shield
/obj/structure/blob/shield
name = "strong blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_shield"
@@ -11,18 +11,18 @@
atmosblock = 1
/obj/effect/blob/shield/scannerreport()
/obj/structure/blob/shield/scannerreport()
if(atmosblock)
return "Will prevent the spread of atmospheric changes."
return "N/A"
/obj/effect/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
/obj/effect/blob/shield/core
/obj/structure/blob/shield/core
point_return = 0
/obj/effect/blob/shield/update_icon()
/obj/structure/blob/shield/update_icon()
..()
if(health <= 75)
icon_state = "blob_shield_damaged"

View File

@@ -14,7 +14,7 @@
pass_flags = PASSBLOB
faction = list("blob")
var/obj/effect/blob/core/blob_core = null // The blob overmind's core
var/obj/structure/blob/core/blob_core = null // The blob overmind's core
var/blob_points = 0
var/max_blob_points = 100
var/last_attack = 0
@@ -72,7 +72,7 @@
/mob/camera/blob/Destroy()
for(var/BL in blobs)
var/obj/effect/blob/B = BL
var/obj/structure/blob/B = BL
if(B && B.overmind == src)
B.overmind = null
B.update_icon() //reset anything that was ours
@@ -150,7 +150,7 @@
/mob/camera/blob/emote(act,m_type=1,message = null)
return
/mob/camera/blob/blob_act(obj/effect/blob/B)
/mob/camera/blob/blob_act(obj/structure/blob/B)
return
/mob/camera/blob/Stat()
@@ -173,7 +173,7 @@
/mob/camera/blob/Move(NewLoc, Dir = 0)
if(placed)
var/obj/effect/blob/B = locate() in range("3x3", NewLoc)
var/obj/structure/blob/B = locate() in range("3x3", NewLoc)
if(B)
loc = NewLoc
else

View File

@@ -28,8 +28,8 @@
src << "<span class='warning'>This spot is too dense to place a blob core on!</span>"
return 0
for(var/obj/O in T)
if(istype(O, /obj/effect/blob))
if(istype(O, /obj/effect/blob/normal))
if(istype(O, /obj/structure/blob))
if(istype(O, /obj/structure/blob/normal))
qdel(O)
else
src << "<span class='warning'>There is already a blob here!</span>"
@@ -46,7 +46,7 @@
if(placed && blob_core)
blob_core.forceMove(loc)
else
var/obj/effect/blob/core/core = new(get_turf(src), null, point_rate, 1)
var/obj/structure/blob/core/core = new(get_turf(src), null, point_rate, 1)
core.overmind = src
blob_core = core
core.update_icon()
@@ -68,35 +68,35 @@
if(blob_nodes.len)
var/list/nodes = list()
for(var/i in 1 to blob_nodes.len)
var/obj/effect/blob/node/B = blob_nodes[i]
var/obj/structure/blob/node/B = blob_nodes[i]
nodes["Blob Node #[i] ([B.overmind ? "B.overmind.blob_reagent_datum.name":"No Chemical"]"] = B
var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes
var/obj/effect/blob/node/chosen_node = nodes[node_name]
var/obj/structure/blob/node/chosen_node = nodes[node_name]
if(chosen_node)
loc = chosen_node.loc
/mob/camera/blob/proc/createSpecial(price, blobType, nearEquals, needsNode, turf/T)
if(!T)
T = get_turf(src)
var/obj/effect/blob/B = (locate(/obj/effect/blob) in T)
var/obj/structure/blob/B = (locate(/obj/structure/blob) in T)
if(!B)
src << "<span class='warning'>There is no blob here!</span>"
return
if(!istype(B, /obj/effect/blob/normal))
if(!istype(B, /obj/structure/blob/normal))
src << "<span class='warning'>Unable to use this blob, find a normal one.</span>"
return
if(needsNode && nodes_required)
if(!(locate(/obj/effect/blob/node) in orange(3, T)) && !(locate(/obj/effect/blob/core) in orange(4, T)))
if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T)))
src << "<span class='warning'>You need to place this blob closer to a node or core!</span>"
return //handholdotron 2000
if(nearEquals)
for(var/obj/effect/blob/L in orange(nearEquals, T))
for(var/obj/structure/blob/L in orange(nearEquals, T))
if(L.type == blobType)
src << "<span class='warning'>There is a similar blob nearby, move more than [nearEquals] tiles away from it!</span>"
return
if(!can_buy(price))
return
var/obj/effect/blob/N = B.change_to(blobType, src)
var/obj/structure/blob/N = B.change_to(blobType, src)
return N
/mob/camera/blob/verb/toggle_node_req()
@@ -116,32 +116,32 @@
create_shield()
/mob/camera/blob/proc/create_shield(turf/T)
createSpecial(15, /obj/effect/blob/shield, 0, 0, T)
createSpecial(15, /obj/structure/blob/shield, 0, 0, T)
/mob/camera/blob/verb/create_resource()
set category = "Blob"
set name = "Create Resource Blob (40)"
set desc = "Create a resource tower which will generate resources for you."
createSpecial(40, /obj/effect/blob/resource, 4, 1)
createSpecial(40, /obj/structure/blob/resource, 4, 1)
/mob/camera/blob/verb/create_node()
set category = "Blob"
set name = "Create Node Blob (50)"
set desc = "Create a node, which will power nearby factory and resource blobs."
createSpecial(50, /obj/effect/blob/node, 5, 0)
createSpecial(50, /obj/structure/blob/node, 5, 0)
/mob/camera/blob/verb/create_factory()
set category = "Blob"
set name = "Create Factory Blob (60)"
set desc = "Create a spore tower that will spawn spores to harass your enemies."
createSpecial(60, /obj/effect/blob/factory, 7, 1)
createSpecial(60, /obj/structure/blob/factory, 7, 1)
/mob/camera/blob/verb/create_blobbernaut()
set category = "Blob"
set name = "Create Blobbernaut (40)"
set desc = "Create a powerful blobbernaut which is mildly smart and will attack enemies."
var/turf/T = get_turf(src)
var/obj/effect/blob/factory/B = locate(/obj/effect/blob/factory) in T
var/obj/structure/blob/factory/B = locate(/obj/structure/blob/factory) in T
if(!B)
src << "<span class='warning'>You must be on a factory blob!</span>"
return
@@ -186,7 +186,7 @@
set name = "Relocate Core (80)"
set desc = "Swaps the locations of your core and the selected node."
var/turf/T = get_turf(src)
var/obj/effect/blob/node/B = locate(/obj/effect/blob/node) in T
var/obj/structure/blob/node/B = locate(/obj/structure/blob/node) in T
if(!B)
src << "<span class='warning'>You must be on a blob node!</span>"
return
@@ -214,7 +214,7 @@
remove_blob(T)
/mob/camera/blob/proc/remove_blob(turf/T)
var/obj/effect/blob/B = locate() in T
var/obj/structure/blob/B = locate() in T
if(!B)
src << "<span class='warning'>There is no blob there!</span>"
return
@@ -240,7 +240,7 @@
if(world.time < last_attack)
return
var/list/possibleblobs = list()
for(var/obj/effect/blob/AB in range(T, 1))
for(var/obj/structure/blob/AB in range(T, 1))
possibleblobs += AB
if(!possibleblobs.len)
src << "<span class='warning'>There is no blob adjacent to the target tile!</span>"
@@ -255,7 +255,7 @@
var/mob_protection = L.get_permeability_protection()
blob_reagent_datum.reaction_mob(L, VAPOR, 25, 1, mob_protection, src)
blob_reagent_datum.send_message(L)
var/obj/effect/blob/B = locate() in T
var/obj/structure/blob/B = locate() in T
if(B)
if(attacksuccess) //if we successfully attacked a turf with a blob on it, don't refund shit
B.blob_attack_animation(T, src)
@@ -266,12 +266,12 @@
var/list/cardinalblobs = list()
var/list/diagonalblobs = list()
for(var/I in possibleblobs)
var/obj/effect/blob/IB = I
var/obj/structure/blob/IB = I
if(get_dir(IB, T) in cardinal)
cardinalblobs += IB
else
diagonalblobs += IB
var/obj/effect/blob/OB
var/obj/structure/blob/OB
if(cardinalblobs.len)
OB = pick(cardinalblobs)
OB.expand(T, src)
@@ -332,7 +332,7 @@
blob_reagent_datum = new BC
color = blob_reagent_datum.complementary_color
for(var/BL in blobs)
var/obj/effect/blob/B = BL
var/obj/structure/blob/B = BL
B.update_icon()
for(var/BLO in blob_mobs)
var/mob/living/simple_animal/hostile/blob/BM = BLO

View File

@@ -1,5 +1,5 @@
//I will need to recode parts of this but I am way too tired atm //I don't know who left this comment but they never did come back
/obj/effect/blob
/obj/structure/blob
name = "blob"
icon = 'icons/mob/blob.dmi'
luminosity = 1
@@ -20,7 +20,7 @@
var/mob/camera/blob/overmind
/obj/effect/blob/New(loc)
/obj/structure/blob/New(loc)
var/area/Ablob = get_area(loc)
if(Ablob.blob_allowed) //Is this area allowed for winning as blob?
blobs_legit += src
@@ -33,10 +33,10 @@
air_update_turf(1)
return
/obj/effect/blob/proc/creation_action() //When it's created by the overmind, do this.
/obj/structure/blob/proc/creation_action() //When it's created by the overmind, do this.
return
/obj/effect/blob/Destroy()
/obj/structure/blob/Destroy()
if(atmosblock)
atmosblock = 0
air_update_turf(1)
@@ -46,7 +46,7 @@
return ..()
/obj/effect/blob/Adjacent(var/atom/neighbour)
/obj/structure/blob/Adjacent(var/atom/neighbour)
. = ..()
if(.)
var/result = 0
@@ -55,61 +55,61 @@
for(var/A in dirs)
if(direction == text2num(A))
for(var/B in dirs[A])
var/C = locate(/obj/effect/blob) in get_step(src, B)
var/C = locate(/obj/structure/blob) in get_step(src, B)
if(C)
result++
. -= result - 1
/obj/effect/blob/CanAtmosPass(turf/T)
/obj/structure/blob/CanAtmosPass(turf/T)
return !atmosblock
/obj/effect/blob/BlockSuperconductivity()
/obj/structure/blob/BlockSuperconductivity()
return atmosblock
/obj/effect/blob/CanPass(atom/movable/mover, turf/target, height=0)
/obj/structure/blob/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0)
return 1
if(istype(mover) && mover.checkpass(PASSBLOB))
return 1
return 0
/obj/effect/blob/CanAStarPass(ID, dir, caller)
/obj/structure/blob/CanAStarPass(ID, dir, caller)
. = 0
if(ismovableatom(caller))
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSBLOB)
/obj/effect/blob/proc/check_health(cause)
/obj/structure/blob/proc/check_health(cause)
health = Clamp(health, 0, maxhealth)
if(health <= 0)
if(overmind)
overmind.blob_reagent_datum.death_reaction(src, cause)
qdel(src) //we dead now
/obj/effect/blob/update_icon() //Updates color based on overmind color if we have an overmind.
/obj/structure/blob/update_icon() //Updates color based on overmind color if we have an overmind.
if(overmind)
color = overmind.blob_reagent_datum.color
else
color = null
/obj/effect/blob/process()
/obj/structure/blob/process()
Life()
/obj/effect/blob/proc/Life()
/obj/structure/blob/proc/Life()
return
/obj/effect/blob/proc/Pulse_Area(pulsing_overmind = overmind, claim_range = 10, pulse_range = 3, expand_range = 2)
/obj/structure/blob/proc/Pulse_Area(pulsing_overmind = overmind, claim_range = 10, pulse_range = 3, expand_range = 2)
src.Be_Pulsed()
var/expanded = FALSE
if(prob(70) && expand())
expanded = TRUE
var/list/blobs_to_affect = list()
for(var/obj/effect/blob/B in urange(claim_range, src, 1))
for(var/obj/structure/blob/B in urange(claim_range, src, 1))
blobs_to_affect += B
shuffle(blobs_to_affect)
for(var/L in blobs_to_affect)
var/obj/effect/blob/B = L
if(!B.overmind && !istype(B, /obj/effect/blob/core) && prob(30))
var/obj/structure/blob/B = L
if(!B.overmind && !istype(B, /obj/structure/blob/core) && prob(30))
B.overmind = pulsing_overmind //reclaim unclaimed, non-core blobs.
B.update_icon()
var/distance = get_dist(get_turf(src), get_turf(B))
@@ -121,7 +121,7 @@
if(blobs_to_affect.len >= 120 && B.heal_timestamp > world.time)
can_expand = FALSE
if(can_expand && B.pulse_timestamp <= world.time && prob(expand_probablity))
var/obj/effect/blob/newB = B.expand(null, null, !expanded) //expansion falls off with range but is faster near the blob causing the expansion
var/obj/structure/blob/newB = B.expand(null, null, !expanded) //expansion falls off with range but is faster near the blob causing the expansion
if(newB)
if(expanded)
qdel(newB)
@@ -129,7 +129,7 @@
if(distance <= pulse_range)
B.Be_Pulsed()
/obj/effect/blob/proc/Be_Pulsed()
/obj/structure/blob/proc/Be_Pulsed()
if(pulse_timestamp <= world.time)
ConsumeTile()
if(heal_timestamp <= world.time)
@@ -140,13 +140,13 @@
return 1 //we did it, we were pulsed!
return 0 //oh no we failed
/obj/effect/blob/proc/ConsumeTile()
/obj/structure/blob/proc/ConsumeTile()
for(var/atom/A in loc)
A.blob_act(src)
if(istype(loc, /turf/closed/wall))
loc.blob_act(src) //don't ask how a wall got on top of the core, just eat it
/obj/effect/blob/proc/blob_attack_animation(atom/A = null, controller) //visually attacks an atom
/obj/structure/blob/proc/blob_attack_animation(atom/A = null, controller) //visually attacks an atom
var/obj/effect/overlay/temp/blob/O = PoolOrNew(/obj/effect/overlay/temp/blob, src.loc)
O.setDir(dir)
if(controller)
@@ -159,14 +159,14 @@
O.do_attack_animation(A) //visually attack the whatever
return O //just in case you want to do something to the animation.
/obj/effect/blob/proc/expand(turf/T = null, controller = null, expand_reaction = 1)
/obj/structure/blob/proc/expand(turf/T = null, controller = null, expand_reaction = 1)
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))
if(!(locate(/obj/structure/blob) in T))
break
else
T = null
@@ -188,7 +188,7 @@
A.blob_act(src) //also hit everything in the turf
if(make_blob) //well, can we?
var/obj/effect/blob/B = new /obj/effect/blob/normal(src.loc)
var/obj/structure/blob/B = new /obj/structure/blob/normal(src.loc)
if(controller)
B.overmind = controller
else
@@ -211,24 +211,24 @@
return null
/obj/effect/blob/ex_act(severity, target)
/obj/structure/blob/ex_act(severity, target)
..()
var/damage = 150 - 20 * severity
take_damage(damage, BRUTE)
/obj/effect/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
var/damage = Clamp(0.01 * exposed_temperature, 0, 4)
take_damage(damage, BURN)
/obj/effect/blob/emp_act(severity)
/obj/structure/blob/emp_act(severity)
if(severity > 0)
if(overmind)
overmind.blob_reagent_datum.emp_reaction(src, severity)
if(prob(100 - severity * 30))
PoolOrNew(/obj/effect/overlay/temp/emp, get_turf(src))
/obj/effect/blob/tesla_act(power)
/obj/structure/blob/tesla_act(power)
..()
if(overmind)
if(overmind.blob_reagent_datum.tesla_reaction(src, power))
@@ -236,17 +236,17 @@
else
take_damage(power/400, BURN)
/obj/effect/blob/extinguish()
/obj/structure/blob/extinguish()
..()
if(overmind)
overmind.blob_reagent_datum.extinguish_reaction(src)
/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
/obj/structure/blob/bullet_act(var/obj/item/projectile/Proj)
..()
take_damage(Proj.damage, Proj.damage_type, Proj)
return 0
/obj/effect/blob/attackby(obj/item/I, mob/user, params)
/obj/structure/blob/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/analyzer))
user.changeNext_move(CLICK_CD_MELEE)
user << "<b>The analyzer beeps once, then reports:</b><br>"
@@ -256,7 +256,7 @@
else
return ..()
/obj/effect/blob/proc/chemeffectreport(mob/user)
/obj/structure/blob/proc/chemeffectreport(mob/user)
if(overmind)
user << "<b>Material: <font color=\"[overmind.blob_reagent_datum.color]\">[overmind.blob_reagent_datum.name]</font><span class='notice'>.</span></b>"
user << "<b>Material Effects:</b> <span class='notice'>[overmind.blob_reagent_datum.analyzerdescdamage]</span>"
@@ -264,12 +264,12 @@
else
user << "<b>No Material Detected!</b><br>"
/obj/effect/blob/proc/typereport(mob/user)
/obj/structure/blob/proc/typereport(mob/user)
user << "<b>Blob Type:</b> <span class='notice'>[uppertext(initial(name))]</span>"
user << "<b>Health:</b> <span class='notice'>[health]/[maxhealth]</span>"
user << "<b>Effects:</b> <span class='notice'>[scannerreport()]</span>"
/obj/effect/blob/attacked_by(obj/item/I, mob/living/user)
/obj/structure/blob/attacked_by(obj/item/I, mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
@@ -278,7 +278,7 @@
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
take_damage(I.force, I.damtype, user)
/obj/effect/blob/attack_animal(mob/living/simple_animal/M)
/obj/structure/blob/attack_animal(mob/living/simple_animal/M)
if("blob" in M.faction) //sorry, but you can't kill the blob as a blobbernaut
return
M.changeNext_move(CLICK_CD_MELEE)
@@ -289,7 +289,7 @@
take_damage(damage, M.melee_damage_type, M)
return
/obj/effect/blob/attack_alien(mob/living/carbon/alien/humanoid/M)
/obj/structure/blob/attack_alien(mob/living/carbon/alien/humanoid/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
@@ -298,7 +298,7 @@
take_damage(damage, BRUTE, M)
return
/obj/effect/blob/proc/take_damage(damage, damage_type, cause = null, overmind_reagent_trigger = 1)
/obj/structure/blob/proc/take_damage(damage, damage_type, cause = null, overmind_reagent_trigger = 1)
switch(damage_type) //blobs only take brute and burn damage
if(BRUTE)
damage = max(damage * brute_resist, 0)
@@ -314,11 +314,11 @@
update_icon()
check_health(cause)
/obj/effect/blob/proc/change_to(type, controller)
/obj/structure/blob/proc/change_to(type, controller)
if(!ispath(type))
throw EXCEPTION("change_to(): invalid type for blob")
return
var/obj/effect/blob/B = new type(src.loc)
var/obj/structure/blob/B = new type(src.loc)
if(controller)
B.overmind = controller
B.creation_action()
@@ -327,7 +327,7 @@
qdel(src)
return B
/obj/effect/blob/examine(mob/user)
/obj/structure/blob/examine(mob/user)
..()
var/datum/atom_hud/hud_to_check = huds[DATA_HUD_MEDICAL_ADVANCED]
if(user.research_scanner || (user in hud_to_check.hudusers))
@@ -337,15 +337,15 @@
else
user << "It seems to be made of [get_chem_name()]."
/obj/effect/blob/proc/scannerreport()
/obj/structure/blob/proc/scannerreport()
return "A generic blob. Looks like someone forgot to override this proc, adminhelp this."
/obj/effect/blob/proc/get_chem_name()
/obj/structure/blob/proc/get_chem_name()
if(overmind)
return overmind.blob_reagent_datum.name
return "an unknown variant"
/obj/effect/blob/normal
/obj/structure/blob/normal
name = "normal blob"
icon_state = "blob"
luminosity = 0
@@ -354,12 +354,12 @@
health_regen = 1
brute_resist = 0.25
/obj/effect/blob/normal/scannerreport()
/obj/structure/blob/normal/scannerreport()
if(health <= 15)
return "Currently weak to brute damage."
return "N/A"
/obj/effect/blob/normal/update_icon()
/obj/structure/blob/normal/update_icon()
..()
if(health <= 15)
icon_state = "blob_damaged"

View File

@@ -9,7 +9,7 @@
//Makes some spiderlings. Good for setting traps and causing general trouble.
/obj/effect/proc_holder/changeling/spiders/sting_action(mob/user)
for(var/i=0, i<2, i++)
var/obj/effect/spider/spiderling/S = new(user.loc)
var/obj/structure/spider/spiderling/S = new(user.loc)
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter
feedback_add_details("changeling_powers","SI")

View File

@@ -155,7 +155,7 @@
take_damage(damage_amount, P.damage_type, 0)
/obj/machinery/dominator/blob_act(obj/effect/blob/B)
/obj/machinery/dominator/blob_act(obj/structure/blob/B)
take_damage(110, BRUTE, 0)
/obj/machinery/dominator/attack_hand(mob/user)

View File

@@ -159,7 +159,7 @@
/obj/item/organ/gland/spiderman/activate()
owner << "<span class='warning'>You feel something crawling in your skin.</span>"
owner.faction |= "spiders"
new /obj/effect/spider/spiderling(owner.loc)
new /obj/structure/spider/spiderling(owner.loc)
/obj/item/organ/gland/egg
cooldown_low = 300

View File

@@ -392,16 +392,6 @@
qdel(target)
/obj/effect/swarmer //Default swarmer effect object visual feedback
name = "swarmer ui"
desc = null
gender = NEUTER
icon = 'icons/mob/swarmer.dmi'
icon_state = "ui_light"
mouse_opacity = 0
layer = MOB_LAYER
unacidable = 1
/obj/effect/overlay/temp/swarmer //temporary swarmer visual feedback objects
icon = 'icons/mob/swarmer.dmi'
layer = BELOW_MOB_LAYER
@@ -422,12 +412,20 @@
icon_state = "integrate"
duration = 5
/obj/effect/swarmer/destructible //Default destroyable object for swarmer constructions
/obj/structure/swarmer //Default swarmer effect object visual feedback
name = "swarmer ui"
desc = null
gender = NEUTER
icon = 'icons/mob/swarmer.dmi'
icon_state = "ui_light"
layer = MOB_LAYER
unacidable = 1
luminosity = 1
mouse_opacity = 1
anchored = 1
var/health = 30
/obj/effect/swarmer/destructible/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
/obj/structure/swarmer/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
@@ -441,29 +439,29 @@
if(health <= 0)
qdel(src)
/obj/effect/swarmer/destructible/bullet_act(obj/item/projectile/P)
/obj/structure/swarmer/bullet_act(obj/item/projectile/P)
. = ..()
take_damage(P.damage, P.damage_type)
/obj/effect/swarmer/destructible/attacked_by(obj/item/I, mob/living/user)
/obj/structure/swarmer/attacked_by(obj/item/I, mob/living/user)
..()
take_damage(I.force, I.damtype)
/obj/effect/swarmer/destructible/ex_act()
/obj/structure/swarmer/ex_act()
qdel(src)
/obj/effect/swarmer/destructible/blob_act(obj/effect/blob/B)
/obj/structure/swarmer/blob_act(obj/structure/blob/B)
qdel(src)
/obj/effect/swarmer/destructible/emp_act()
/obj/structure/swarmer/emp_act()
qdel(src)
/obj/effect/swarmer/destructible/attack_alien(mob/living/user)
/obj/structure/swarmer/attack_alien(mob/living/user)
user.do_attack_animation(src)
user.changeNext_move(CLICK_CD_MELEE)
take_damage(rand(20,30))
/obj/effect/swarmer/destructible/attack_animal(mob/living/simple_animal/S)
/obj/structure/swarmer/attack_animal(mob/living/simple_animal/S)
S.do_attack_animation(src)
S.changeNext_move(CLICK_CD_MELEE)
if(S.obj_damage)
@@ -471,23 +469,14 @@
else if(S.melee_damage_upper)
take_damage(rand(S.melee_damage_lower, S.melee_damage_upper), S.melee_damage_type)
/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
set name = "Create trap"
set category = "Swarmer"
set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources"
if(/obj/effect/swarmer/destructible/trap in loc)
src << "<span class='warning'>There is already a trap here. Aborting.</span>"
return
Fabricate(/obj/effect/swarmer/destructible/trap, 5)
/obj/effect/swarmer/destructible/trap
/obj/structure/swarmer/trap
name = "swarmer trap"
desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough."
icon_state = "trap"
luminosity = 1
health = 10
/obj/effect/swarmer/destructible/trap/Crossed(var/atom/movable/AM)
/obj/structure/swarmer/trap/Crossed(var/atom/movable/AM)
if(isliving(AM))
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
@@ -498,21 +487,31 @@
qdel(src)
..()
/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
set name = "Create trap"
set category = "Swarmer"
set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources"
if(locate(/obj/structure/swarmer/trap) in loc)
src << "<span class='warning'>There is already a trap here. Aborting.</span>"
return
Fabricate(/obj/structure/swarmer/trap, 5)
/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade()
set name = "Create barricade"
set category = "Swarmer"
set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through."
if(/obj/effect/swarmer/destructible/blockade in loc)
if(locate(/obj/structure/swarmer/blockade) in loc)
src << "<span class='warning'>There is already a blockade here. Aborting.</span>"
return
if(resources < 5)
src << "<span class='warning'>We do not have the resources for this!</span>"
return
if(do_mob(src, src, 10))
Fabricate(/obj/effect/swarmer/destructible/blockade, 5)
Fabricate(/obj/structure/swarmer/blockade, 5)
return
/obj/effect/swarmer/destructible/blockade
/obj/structure/swarmer/blockade
name = "swarmer blockade"
desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
icon_state = "barricade"
@@ -521,7 +520,7 @@
density = 1
anchored = 1
/obj/effect/swarmer/destructible/blockade/CanPass(atom/movable/O)
/obj/structure/swarmer/blockade/CanPass(atom/movable/O)
if(isswarmer(O))
return 1
if(istype(O, /obj/item/projectile/beam/disabler))

View File

@@ -165,7 +165,7 @@
/mob/living/simple_animal/revenant/ex_act(severity, target)
return 1 //Immune to the effects of explosions.
/mob/living/simple_animal/revenant/blob_act(obj/effect/blob/B)
/mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B)
return //blah blah blobs aren't in tune with the spirit world, or something.
/mob/living/simple_animal/revenant/singularity_act()

View File

@@ -366,11 +366,11 @@
mob.reagents.add_reagent("plasma", 5)
else
mob.adjustToxLoss(5)
for(var/obj/effect/spacevine/vine in T) //Fucking with botanists, the ability.
for(var/obj/structure/spacevine/vine in T) //Fucking with botanists, the ability.
vine.color = "#823abb"
PoolOrNew(/obj/effect/overlay/temp/revenant, vine.loc)
QDEL_IN(vine, 10)
for(var/obj/effect/glowshroom/shroom in T)
for(var/obj/structure/glowshroom/shroom in T)
shroom.color = "#823abb"
PoolOrNew(/obj/effect/overlay/temp/revenant, shroom.loc)
QDEL_IN(shroom, 10)

View File

@@ -396,7 +396,7 @@ var/bomb_set
/obj/machinery/nuclearbomb/ex_act(severity, target)
return
/obj/machinery/nuclearbomb/blob_act(obj/effect/blob/B)
/obj/machinery/nuclearbomb/blob_act(obj/structure/blob/B)
if(exploding)
return
. = ..()

View File

@@ -92,7 +92,7 @@
popup.set_content(dat)
popup.open()
/obj/machinery/autolathe/deconstruction()
/obj/machinery/autolathe/on_deconstruction()
materials.retrieve_all()
/obj/machinery/autolathe/attackby(obj/item/O, mob/user, params)

View File

@@ -111,7 +111,7 @@
..()
qdel(src)//to prevent bomb testing camera from exploding over and over forever
/obj/machinery/camera/blob_act(obj/effect/blob/B)
/obj/machinery/camera/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
take_damage(health, BRUTE, 0)

View File

@@ -27,6 +27,12 @@
power_change()
update_icon()
/obj/machinery/computer/Destroy()
if(circuit)
qdel(circuit)
circuit = null
return ..()
/obj/machinery/computer/initialize()
power_change()
@@ -102,7 +108,7 @@
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "<span class='notice'> You start to disconnect the monitor...</span>"
if(do_after(user, 20/I.toolspeed, target = src))
deconstruction()
deconstruct()
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
A.circuit = circuit
A.anchored = 1
@@ -142,3 +148,27 @@
playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
stat |= BROKEN
update_icon()
/obj/machinery/computer/deconstruct(mob/user)
on_deconstruction()
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
A.circuit = circuit
A.anchored = 1
circuit = null
for(var/obj/C in src)
C.forceMove(loc)
if(stat & BROKEN)
if(user)
user << "<span class='notice'>The broken glass falls out.</span>"
new /obj/item/weapon/shard(src.loc)
new /obj/item/weapon/shard(src.loc)
A.state = 3
A.icon_state = "3"
else
if(user)
user << "<span class='notice'>You disconnect the monitor.</span>"
A.state = 4
A.icon_state = "4"
qdel(src)

View File

@@ -165,7 +165,7 @@
if(component_check)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1)
new_machine.construction()
new_machine.on_construction()
for(var/obj/O in new_machine.component_parts)
qdel(O)
new_machine.component_parts = list()

View File

@@ -90,7 +90,7 @@
if(2)
take_damage(25, BRUTE, 0)
/obj/structure/barricade/blob_act(obj/effect/blob/B)
/obj/structure/barricade/blob_act(obj/structure/blob/B)
take_damage(25, BRUTE, 0)
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.

View File

@@ -185,7 +185,7 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
/obj/machinery/door/blob_act(obj/effect/blob/B)
/obj/machinery/door/blob_act(obj/structure/blob/B)
if(prob(60))
qdel(src)

View File

@@ -68,7 +68,7 @@
popup.set_content(dat)
popup.open()
/obj/machinery/limbgrower/deconstruction()
/obj/machinery/limbgrower/on_deconstruction()
for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
reagents.trans_to(G, G.reagents.maximum_volume)

View File

@@ -189,7 +189,7 @@ Class Procs:
updateUsrDialog()
update_icon()
/obj/machinery/blob_act(obj/effect/blob/B)
/obj/machinery/blob_act(obj/structure/blob/B)
if(density && prob(75))
qdel(src)
@@ -343,15 +343,18 @@ Class Procs:
/obj/machinery/proc/default_deconstruction_crowbar(obj/item/weapon/crowbar/C, ignore_panel = 0)
. = istype(C) && (panel_open || ignore_panel) && !(flags & NODECONSTRUCT)
if(.)
deconstruction()
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
var/obj/structure/frame/machine/M = new /obj/structure/frame/machine(loc)
transfer_fingerprints_to(M)
M.state = 2
M.icon_state = "box_1"
for(var/obj/item/I in component_parts)
I.loc = loc
qdel(src)
deconstruct()
/obj/machinery/proc/deconstruct()
on_deconstruction()
var/obj/structure/frame/machine/M = new /obj/structure/frame/machine(loc)
transfer_fingerprints_to(M)
M.state = 2
M.icon_state = "box_1"
for(var/obj/item/I in component_parts)
I.forceMove(loc)
qdel(src)
/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/weapon/screwdriver/S)
if(istype(S) && !(flags & NODECONSTRUCT))
@@ -433,11 +436,11 @@ Class Procs:
display_parts(user)
//called on machinery construction (i.e from frame to machinery) but not on initialization
/obj/machinery/proc/construction()
/obj/machinery/proc/on_construction()
return
//called on deconstruction before the final deletion
/obj/machinery/proc/deconstruction()
/obj/machinery/proc/on_deconstruction()
return
/obj/machinery/allow_drop()

View File

@@ -246,7 +246,7 @@
else
colour = rgb(255,128,128)
//if(istype(AM, /obj/effect/blob))
//if(istype(AM, /obj/structure/blob))
// colour = rgb(255,0,255)
var/area/A = T.loc

View File

@@ -230,7 +230,7 @@ var/global/list/pipeID2State = list(
var/obj/machinery/atmospherics/components/trinary/T = A
if(istype(T))
T.flipped = flipped
A.construction(pipe_type, color)
A.on_construction(pipe_type, color)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \

View File

@@ -53,7 +53,7 @@
if(2)
take_damage(50, BRUTE, 0)
/obj/machinery/shield/blob_act(obj/effect/blob/B)
/obj/machinery/shield/blob_act(obj/structure/blob/B)
qdel(src)

View File

@@ -37,14 +37,14 @@
/obj/item/weapon/stock_parts/capacitor = 1,
/obj/item/stack/cable_coil = 3)
/obj/machinery/space_heater/construction()
/obj/machinery/space_heater/on_construction()
qdel(cell)
cell = null
panel_open = TRUE
update_icon()
return ..()
/obj/machinery/space_heater/deconstruction()
/obj/machinery/space_heater/on_deconstruction()
if(cell)
component_parts += cell
cell = null

View File

@@ -144,7 +144,7 @@
if(prob(25))
malfunction()
/obj/machinery/vending/blob_act(obj/effect/blob/B)
/obj/machinery/vending/blob_act(obj/structure/blob/B)
malfunction()
..()
@@ -319,7 +319,7 @@
return ..()
/obj/machinery/vending/deconstruction()
/obj/machinery/vending/on_deconstruction()
var/product_list = list(product_records, hidden_records, coin_records)
for(var/i=1, i<=3, i++)
for(var/datum/data/vending_product/machine_content in product_list[i])

View File

@@ -415,7 +415,7 @@
updateUsrDialog()
return
/obj/machinery/mecha_part_fabricator/deconstruction()
/obj/machinery/mecha_part_fabricator/on_deconstruction()
materials.retrieve_all()
..()

View File

@@ -158,7 +158,7 @@
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
return
/obj/mecha/blob_act(obj/effect/blob/B)
/obj/mecha/blob_act(obj/structure/blob/B)
take_directional_damage(30, "brute", get_dir(src, B))
/obj/mecha/emp_act(severity)

View File

@@ -17,6 +17,18 @@
viruses = null
return ..()
/obj/effect/decal/cleanable/xenoblood/xsplatter
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
/obj/effect/decal/cleanable/xenoblood/xgibs
name = "xeno gibs"
desc = "Gnarly..."
icon = 'icons/effects/blood.dmi'
icon_state = "xgib1"
layer = LOW_OBJ_LAYER
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
mergeable_decal = 0
/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
@@ -31,20 +43,6 @@
if (!step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/xenoblood/xgibs/replace_decal(obj/effect/decal/cleanable/C)
return //gibs can stack, so gibspawner can work properly
/obj/effect/decal/cleanable/xenoblood/xsplatter
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
/obj/effect/decal/cleanable/xenoblood/xgibs
name = "xeno gibs"
desc = "Gnarly..."
icon = 'icons/effects/blood.dmi'
icon_state = "xgib1"
layer = LOW_OBJ_LAYER
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act()
return

View File

@@ -48,17 +48,29 @@
icon_state = "gibbl5"
layer = LOW_OBJ_LAYER
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
mergeable_decal = 0
/obj/effect/decal/cleanable/blood/gibs/New()
..()
reagents.add_reagent("liquidgibs", 5)
/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C)
return
/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
return
/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
sleep(2)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
for(var/datum/disease/D in src.viruses)
var/datum/disease/ND = D.Copy(1)
b.viruses += ND
ND.holder = b
if (!step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/blood/gibs/up
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
@@ -79,23 +91,6 @@
random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
sleep(2)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
for(var/datum/disease/D in src.viruses)
var/datum/disease/ND = D.Copy(1)
b.viruses += ND
ND.holder = b
if (!step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C)
return //gibs can stack, so gibspawner can work properly
/obj/effect/decal/cleanable/blood/drip
name = "drips of blood"
desc = "It's red."

View File

@@ -9,6 +9,7 @@
desc = "Ashes to ashes, dust to dust, and into space."
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
mergeable_decal = 0
/obj/effect/decal/cleanable/ash/New()
..()
@@ -16,6 +17,15 @@
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/effect/decal/cleanable/ash/large
name = "large pile of ashes"
icon_state = "big_ash"
/obj/effect/decal/cleanable/ash/large/New()
..()
reagents.add_reagent("ash", 30) //double the amount of ash.
/obj/effect/decal/cleanable/dirt
name = "dirt"
desc = "Someone should clean that up."
@@ -62,6 +72,11 @@
gender = NEUTER
icon = 'icons/obj/chemical.dmi'
icon_state = "molten"
mergeable_decal = 0
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
//Vomit (sorry)
/obj/effect/decal/cleanable/vomit
@@ -133,6 +148,7 @@
desc = "The shredded remains of what appears to be clothing."
icon_state = "shreds"
gender = PLURAL
mergeable_decal = 0
/obj/effect/decal/cleanable/shreds/New()
pixel_x = rand(-5, 5)

View File

@@ -9,6 +9,7 @@
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
blood_state = BLOOD_STATE_OIL
bloodiness = MAX_SHOE_BLOODINESS
mergeable_decal = 0
/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions)
set waitfor = 0
@@ -25,9 +26,6 @@
if (!step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/robot_debris/replace_decal(obj/effect/decal/cleanable/C)
return //robot debris can stack, so gibspawner can work properly
/obj/effect/decal/cleanable/robot_debris/ex_act()
return

View File

@@ -4,6 +4,7 @@
var/list/random_icon_states = list()
var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
var/mergeable_decal = 1 //when two of these are on a same tile or do we need to merge them into just one?
/obj/effect/decal/cleanable/New()
if (random_icon_states && length(src.random_icon_states) > 0)
@@ -18,7 +19,8 @@
/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C)
qdel(C)
if(mergeable_decal)
qdel(C)
/obj/effect/decal/cleanable/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers/glass) || istype(W, /obj/item/weapon/reagent_containers/food/drinks))

View File

@@ -39,10 +39,11 @@
/obj/effect/particle_effect/foam/proc/kill_foam()
STOP_PROCESSING(SSfastprocess, src)
if(metal)
var/obj/structure/foamedmetal/M = new(src.loc)
M.metal = metal
M.updateicon()
switch(metal)
if(1)
new /obj/structure/foamedmetal(src.loc)
if(2)
new /obj/structure/foamedmetal/iron(src.loc)
flick("[icon_state]-disolve", src)
QDEL_IN(src, 5)
@@ -206,7 +207,7 @@
qdel(src)
/obj/structure/foamedmetal/blob_act(obj/effect/blob/B)
/obj/structure/foamedmetal/blob_act(obj/structure/blob/B)
qdel(src)
@@ -281,3 +282,8 @@
/obj/structure/foamedmetal/CanAtmosPass()
return !density
/obj/structure/foamedmetal/iron
icon_state = "ironfoam"
metal = 2

View File

@@ -0,0 +1,7 @@
//objects in /obj/effect should never be things that are attackable, use obj/structure instead.
//Effects are mostly temporary visual effects like sparks, smoke, as well as decals, etc...
/obj/effect
icon = 'icons/effects/effects.dmi'

View File

@@ -4,7 +4,7 @@ var/list/blacklisted_glowshroom_turfs = typecacheof(list(
/turf/open/floor/plating/lava,
/turf/open/floor/plating/beach/water))
/obj/effect/glowshroom
/obj/structure/glowshroom
name = "glowshroom"
desc = "Mycena Bregprox, a species of mushroom that glows in the dark."
anchored = 1
@@ -21,18 +21,18 @@ var/list/blacklisted_glowshroom_turfs = typecacheof(list(
var/generation = 1
var/spreadIntoAdjacentChance = 60
obj/effect/glowshroom/glowcap
obj/structure/glowshroom/glowcap
name = "glowcap"
icon_state = "glowcap"
/obj/effect/glowshroom/single
/obj/structure/glowshroom/single
yield = 0
/obj/effect/glowshroom/examine(mob/user)
/obj/structure/glowshroom/examine(mob/user)
. = ..()
user << "This is a [generation]\th generation [name]!"
/obj/effect/glowshroom/New()
/obj/structure/glowshroom/New()
..()
SetLuminosity(round(potency/10))
setDir(CalcDir())
@@ -53,7 +53,7 @@ obj/effect/glowshroom/glowcap
addtimer(src, "Spread", delay)
/obj/effect/glowshroom/proc/Spread()
/obj/structure/glowshroom/proc/Spread()
for(var/i = 1 to yield)
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()
@@ -65,7 +65,7 @@ obj/effect/glowshroom/glowcap
for(var/turf/open/floor/earth in view(3,src))
if(is_type_in_typecache(earth, blacklisted_glowshroom_turfs))
continue
if(spreadsIntoAdjacent || !locate(/obj/effect/glowshroom) in view(1,earth))
if(spreadsIntoAdjacent || !locate(/obj/structure/glowshroom) in view(1,earth))
possibleLocs += earth
CHECK_TICK
@@ -76,7 +76,7 @@ obj/effect/glowshroom/glowcap
var/shroomCount = 0 //hacky
var/placeCount = 1
for(var/obj/effect/glowshroom/shroom in newLoc)
for(var/obj/structure/glowshroom/shroom in newLoc)
shroomCount++
for(var/wallDir in cardinal)
var/turf/isWall = get_step(newLoc,wallDir)
@@ -85,7 +85,7 @@ obj/effect/glowshroom/glowcap
if(shroomCount >= placeCount)
continue
var/obj/effect/glowshroom/child = new type(newLoc)//The baby mushrooms have different stats :3
var/obj/structure/glowshroom/child = new type(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)
@@ -94,7 +94,7 @@ obj/effect/glowshroom/glowcap
CHECK_TICK
/obj/effect/glowshroom/proc/CalcDir(turf/location = loc)
/obj/structure/glowshroom/proc/CalcDir(turf/location = loc)
var/direction = 16
for(var/wallDir in cardinal)
@@ -102,7 +102,7 @@ obj/effect/glowshroom/glowcap
if(newTurf.density)
direction |= wallDir
for(var/obj/effect/glowshroom/shroom in location)
for(var/obj/structure/glowshroom/shroom in location)
if(shroom == src)
continue
if(shroom.floor) //special
@@ -126,13 +126,13 @@ obj/effect/glowshroom/glowcap
floor = 1
return 1
/obj/effect/glowshroom/attacked_by(obj/item/I, mob/user)
/obj/structure/glowshroom/attacked_by(obj/item/I, mob/user)
..()
if(I.damtype != STAMINA)
endurance -= I.force
CheckEndurance()
/obj/effect/glowshroom/ex_act(severity, target)
/obj/structure/glowshroom/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
@@ -143,16 +143,16 @@ obj/effect/glowshroom/glowcap
if(prob(5))
qdel(src)
/obj/effect/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
endurance -= 5
CheckEndurance()
/obj/effect/glowshroom/proc/CheckEndurance()
/obj/structure/glowshroom/proc/CheckEndurance()
if(endurance <= 0)
qdel(src)
/obj/effect/glowshroom/acid_act(acidpwr, toxpwr, acid_volume)
/obj/structure/glowshroom/acid_act(acidpwr, toxpwr, acid_volume)
visible_message("<span class='danger'>[src] melts away!</span>")
var/obj/effect/decal/cleanable/molten_item/I = new (get_turf(src))
I.desc = "Looks like this was \an [src] some time ago."

View File

@@ -1,7 +1,4 @@
/obj/effect
icon = 'icons/effects/effects.dmi'
/obj/effect/portal
name = "portal"
desc = "Looks unstable. Best to test it with the clown."

View File

@@ -1,5 +1,5 @@
//generic procs copied from obj/effect/alien
/obj/effect/spider
/obj/structure/spider
name = "web"
desc = "it's stringy and sticky"
anchored = 1
@@ -7,7 +7,7 @@
var/health = 15
//similar to weeds, but only barfed out by nurses manually
/obj/effect/spider/ex_act(severity, target)
/obj/structure/spider/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
@@ -18,16 +18,16 @@
if (prob(5))
qdel(src)
/obj/effect/spider/attacked_by(obj/item/I, mob/user)
/obj/structure/spider/attacked_by(obj/item/I, mob/user)
..()
var/damage = I.force
take_damage(damage, I.damtype, 1)
/obj/effect/spider/bullet_act(obj/item/projectile/P)
/obj/structure/spider/bullet_act(obj/item/projectile/P)
. = ..()
take_damage(P.damage, P.damage_type, 0)
/obj/effect/spider/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
/obj/structure/spider/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BURN)
damage *= 2
@@ -41,18 +41,18 @@
if(health <= 0)
qdel(src)
/obj/effect/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
/obj/structure/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
take_damage(5, BURN, 0)
/obj/effect/spider/stickyweb
/obj/structure/spider/stickyweb
icon_state = "stickyweb1"
/obj/effect/spider/stickyweb/New()
/obj/structure/spider/stickyweb/New()
if(prob(50))
icon_state = "stickyweb2"
/obj/effect/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0)
/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider))
return 1
@@ -64,7 +64,7 @@
return prob(30)
return 1
/obj/effect/spider/eggcluster
/obj/structure/spider/eggcluster
name = "egg cluster"
desc = "They seem to pulse slightly with an inner life"
icon_state = "eggs"
@@ -74,17 +74,17 @@
var/poison_per_bite = 5
var/list/faction = list("spiders")
/obj/effect/spider/eggcluster/New()
/obj/structure/spider/eggcluster/New()
pixel_x = rand(3,-3)
pixel_y = rand(3,-3)
START_PROCESSING(SSobj, src)
/obj/effect/spider/eggcluster/process()
/obj/structure/spider/eggcluster/process()
amount_grown += rand(0,2)
if(amount_grown >= 100)
var/num = rand(3,12)
for(var/i=0, i<num, i++)
var/obj/effect/spider/spiderling/S = new /obj/effect/spider/spiderling(src.loc)
var/obj/structure/spider/spiderling/S = new /obj/structure/spider/spiderling(src.loc)
S.poison_type = poison_type
S.poison_per_bite = poison_per_bite
S.faction = faction.Copy()
@@ -92,7 +92,7 @@
S.player_spiders = 1
qdel(src)
/obj/effect/spider/spiderling
/obj/structure/spider/spiderling
name = "spiderling"
desc = "It never stays still for long."
icon_state = "spiderling"
@@ -108,18 +108,18 @@
var/poison_per_bite = 5
var/list/faction = list("spiders")
/obj/effect/spider/spiderling/New()
/obj/structure/spider/spiderling/New()
pixel_x = rand(6,-6)
pixel_y = rand(6,-6)
START_PROCESSING(SSobj, src)
/obj/effect/spider/spiderling/Bump(atom/user)
/obj/structure/spider/spiderling/Bump(atom/user)
if(istype(user, /obj/structure/table))
src.loc = user.loc
else
..()
/obj/effect/spider/spiderling/process()
/obj/structure/spider/spiderling/process()
if(travelling_in_vent)
if(istype(src.loc, /turf))
travelling_in_vent = 0
@@ -193,16 +193,16 @@
/obj/effect/spider/cocoon
/obj/structure/spider/cocoon
name = "cocoon"
desc = "Something wrapped in silky spider web"
icon_state = "cocoon1"
health = 60
/obj/effect/spider/cocoon/New()
icon_state = pick("cocoon1","cocoon2","cocoon3")
/obj/structure/spider/cocoon/New()
icon_state = pick("cocoon1","cocoon2","cocoon3")
/obj/effect/spider/cocoon/container_resist()
/obj/structure/spider/cocoon/container_resist()
var/mob/living/user = usr
var/breakout_time = 2
user.changeNext_move(CLICK_CD_BREAKOUT)
@@ -216,7 +216,7 @@
/obj/effect/spider/cocoon/Destroy()
/obj/structure/spider/cocoon/Destroy()
src.visible_message("<span class='warning'>\The [src] splits open.</span>")
for(var/atom/movable/A in contents)
A.loc = src.loc

View File

@@ -99,7 +99,7 @@
if(W.reinf && W.fulltile)
cached_exp_block[T] += W.explosion_block
for(var/obj/effect/blob/B in T)
for(var/obj/structure/blob/B in T)
cached_exp_block[T] += B.explosion_block
CHECK_TICK
@@ -226,7 +226,7 @@
if(W.explosion_block && W.fulltile)
dist += W.explosion_block
for(var/obj/effect/blob/B in T)
for(var/obj/structure/blob/B in T)
dist += B.explosion_block
if(dist < dev)

View File

@@ -117,7 +117,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
qdel(X)
return ..()
/obj/item/blob_act(obj/effect/blob/B)
/obj/item/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
qdel(src)

View File

@@ -255,7 +255,7 @@
/obj/effect/chrono_field/ex_act()
return
/obj/effect/chrono_field/blob_act(obj/effect/blob/B)
/obj/effect/chrono_field/blob_act(obj/structure/blob/B)
return

View File

@@ -12,7 +12,7 @@
for(var/mob/living/M in get_hearers_in_view(7, flashbang_turf))
bang(get_turf(M), M)
for(var/obj/effect/blob/B in get_hear(8,flashbang_turf)) //Blob damage here
for(var/obj/structure/blob/B in get_hear(8,flashbang_turf)) //Blob damage here
var/distance = get_dist(B, get_turf(src))
var/damage = round(100/(distance*distance)+1)
B.take_damage(damage, BURN)

View File

@@ -24,7 +24,7 @@
smoke.start()
for(var/obj/effect/blob/B in view(8,src))
for(var/obj/structure/blob/B in view(8,src))
var/damage = round(30/(get_dist(B,src)+1))
B.health -= damage
B.update_icon()

View File

@@ -136,7 +136,7 @@
..()
take_damage(I.force * 0.5, I.damtype)
/obj/effect/overlay/holograph/blob_act(obj/effect/blob/B)
/obj/effect/overlay/holograph/blob_act(obj/structure/blob/B)
qdel(src)
/obj/effect/overlay/holograph/attack_animal(mob/living/simple_animal/M)

View File

@@ -91,7 +91,7 @@
user << "<span class='notice'>It feels [descriptive].</span>"
/obj/item/weapon/tank/blob_act(obj/effect/blob/B)
/obj/item/weapon/tank/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
var/turf/location = get_turf(src)
if(!location)

View File

@@ -15,7 +15,7 @@
if(ticker)
cameranet.updateVisibility(src)
/obj/structure/blob_act(obj/effect/blob/B)
/obj/structure/blob_act(obj/structure/blob/B)
if(density && prob(50))
qdel(src)

View File

@@ -119,7 +119,7 @@
if(3)
take_damage(50, BRUTE, 0)
/obj/structure/alien/blob_act(obj/effect/blob/B)
/obj/structure/alien/blob_act(obj/structure/blob/B)
take_damage(50, BRUTE, 0)
/obj/structure/alien/resin/hitby(atom/movable/AM)

View File

@@ -120,7 +120,7 @@
if(user.environment_smash)
shatter()
/obj/structure/closet/statue/blob_act(obj/effect/blob/B)
/obj/structure/closet/statue/blob_act(obj/structure/blob/B)
shatter()
/obj/structure/closet/statue/attacked_by(obj/item/I, mob/living/user)

View File

@@ -48,7 +48,7 @@
showpiece.loc = src.loc
showpiece = null
/obj/structure/displaycase/blob_act(obj/effect/blob/B)
/obj/structure/displaycase/blob_act(obj/structure/blob/B)
take_damage(30)
/obj/structure/displaycase/hitby(atom/movable/AM)

View File

@@ -82,7 +82,7 @@
take_damage(P.damage, P.damage_type, 0)
/obj/structure/fireaxecabinet/blob_act(obj/effect/blob/B)
/obj/structure/fireaxecabinet/blob_act(obj/structure/blob/B)
if(fireaxe)
fireaxe.forceMove(loc)
qdel(src)

View File

@@ -272,7 +272,7 @@
qdel(src)
/obj/structure/girder/blob_act(obj/effect/blob/B)
/obj/structure/girder/blob_act(obj/structure/blob/B)
if(prob(40))
qdel(src)

View File

@@ -31,7 +31,7 @@
new /obj/structure/grille/ratvar(src.loc)
qdel(src)
/obj/structure/grille/blob_act(obj/effect/blob/B)
/obj/structure/grille/blob_act(obj/structure/blob/B)
if(!destroyed)
Break()

View File

@@ -26,7 +26,7 @@
stored = null
return ..()
/obj/structure/lattice/blob_act(obj/effect/blob/B)
/obj/structure/lattice/blob_act(obj/structure/blob/B)
return
/obj/structure/lattice/ex_act(severity, target)

View File

@@ -164,7 +164,7 @@ FLOOR SAFES
return ..()
obj/structure/safe/blob_act(obj/effect/blob/B)
obj/structure/safe/blob_act(obj/structure/blob/B)
return
obj/structure/safe/ex_act(severity, target)

View File

@@ -13,7 +13,7 @@
/obj/structure/sign/ex_act(severity, target)
qdel(src)
/obj/structure/sign/blob_act(obj/effect/blob/B)
/obj/structure/sign/blob_act(obj/structure/blob/B)
qdel(src)
/obj/structure/sign/attackby(obj/item/O, mob/user, params)

View File

@@ -53,7 +53,7 @@
if(3)
take_damage(rand(40,80), BRUTE, 0)
/obj/structure/table/blob_act(obj/effect/blob/B)
/obj/structure/table/blob_act(obj/structure/blob/B)
take_damage(rand(75,150), BRUTE, 0)
/obj/structure/table/narsie_act()
@@ -476,7 +476,7 @@
if(3)
take_damage(rand(5,25), BRUTE, 0)
/obj/structure/rack/blob_act(obj/effect/blob/B)
/obj/structure/rack/blob_act(obj/structure/blob/B)
rack_destroy()

View File

@@ -65,7 +65,7 @@
if(3)
take_damage(rand(25,75), BRUTE, 0)
/obj/structure/window/blob_act(obj/effect/blob/B)
/obj/structure/window/blob_act(obj/structure/blob/B)
take_damage(rand(75,150), BRUTE, 0)
/obj/structure/window/narsie_act()

View File

@@ -77,7 +77,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(A.level == 3)
return 1
/turf/open/floor/blob_act(obj/effect/blob/B)
/turf/open/floor/blob_act(obj/structure/blob/B)
return
/turf/open/floor/proc/update_icon()

View File

@@ -80,7 +80,7 @@
..()
return
/turf/closed/wall/blob_act(obj/effect/blob/B)
/turf/closed/wall/blob_act(obj/structure/blob/B)
if(prob(50))
dismantle_wall()

View File

@@ -208,7 +208,7 @@ Pipelines + Other Objects -> Pipe network
return img
/obj/machinery/atmospherics/construction(pipe_type, obj_color)
/obj/machinery/atmospherics/on_construction(pipe_type, obj_color)
if(can_unwrench)
color = obj_color
pipe_color = obj_color

View File

@@ -72,7 +72,7 @@ Pipenet stuff; housekeeping
qdel(AIR_I)
AIR_I = null
/obj/machinery/atmospherics/components/construction()
/obj/machinery/atmospherics/components/on_construction()
..()
update_parents()

View File

@@ -35,7 +35,7 @@
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/stack/sheet/glass = 2)
/obj/machinery/atmospherics/components/unary/cryo_cell/construction()
/obj/machinery/atmospherics/components/unary/cryo_cell/on_construction()
..(dir, dir)
/obj/machinery/atmospherics/components/unary/cryo_cell/RefreshParts()

View File

@@ -49,7 +49,7 @@
else
return ..()
/obj/machinery/atmospherics/components/unary/thermomachine/construction()
/obj/machinery/atmospherics/components/unary/thermomachine/on_construction()
..(dir,dir)
/obj/machinery/atmospherics/components/unary/thermomachine/RefreshParts()

View File

@@ -235,7 +235,7 @@
air_update_turf() // Update the environment if needed.
update_icon()
/obj/machinery/portable_atmospherics/canister/blob_act(obj/effect/blob/B)
/obj/machinery/portable_atmospherics/canister/blob_act(obj/structure/blob/B)
take_damage(100, BRUTE, 0)
/obj/machinery/portable_atmospherics/canister/burn()

View File

@@ -30,7 +30,7 @@
if(!candidates.len)
return NOT_ENOUGH_PLAYERS
var/mob/dead/observer/new_blob = pick(candidates)
var/obj/effect/blob/core/BC = new/obj/effect/blob/core(pick(blobstart), new_blob.client, new_rate)
var/obj/structure/blob/core/BC = new/obj/structure/blob/core(pick(blobstart), new_blob.client, new_rate)
BC.overmind.blob_points = min(20 + player_list.len, BC.overmind.max_blob_points)
spawned_mobs += BC.overmind
message_admins("[BC.overmind.key] has been made into a blob overmind by an event.")

View File

@@ -129,7 +129,7 @@
for(var/i in 1 to 5)
T = pick_n_take(empty_shuttle_turfs)
new /obj/effect/spider/stickyweb(T)
new /obj/structure/spider/stickyweb(T)
if(ANTIDOTE_NEEDED)
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish)

View File

@@ -8,7 +8,7 @@
/datum/round_event/spacevine/start()
var/list/turfs = list() //list of all the empty floor turfs in the hallway areas
var/obj/effect/spacevine/SV = new()
var/obj/structure/spacevine/SV = new()
for(var/area/hallway/A in world)
for(var/turf/F in A)
@@ -19,7 +19,7 @@
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/T = pick(turfs)
new/obj/effect/spacevine_controller(T) //spawn a controller at turf
new/obj/structure/spacevine_controller(T) //spawn a controller at turf
/datum/spacevine_mutation
@@ -28,40 +28,40 @@
var/hue
var/quality
/datum/spacevine_mutation/proc/process_mutation(obj/effect/spacevine/holder)
/datum/spacevine_mutation/proc/process_mutation(obj/structure/spacevine/holder)
return
/datum/spacevine_mutation/proc/process_temperature(obj/effect/spacevine/holder, temp, volume)
/datum/spacevine_mutation/proc/process_temperature(obj/structure/spacevine/holder, temp, volume)
return
/datum/spacevine_mutation/proc/on_birth(obj/effect/spacevine/holder)
/datum/spacevine_mutation/proc/on_birth(obj/structure/spacevine/holder)
return
/datum/spacevine_mutation/proc/on_grow(obj/effect/spacevine/holder)
/datum/spacevine_mutation/proc/on_grow(obj/structure/spacevine/holder)
return
/datum/spacevine_mutation/proc/on_death(obj/effect/spacevine/holder)
/datum/spacevine_mutation/proc/on_death(obj/structure/spacevine/holder)
return
/datum/spacevine_mutation/proc/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
/datum/spacevine_mutation/proc/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
. = expected_damage
/datum/spacevine_mutation/proc/on_cross(obj/effect/spacevine/holder, mob/crosser)
/datum/spacevine_mutation/proc/on_cross(obj/structure/spacevine/holder, mob/crosser)
return
/datum/spacevine_mutation/proc/on_chem(obj/effect/spacevine/holder, datum/reagent/R)
/datum/spacevine_mutation/proc/on_chem(obj/structure/spacevine/holder, datum/reagent/R)
return
/datum/spacevine_mutation/proc/on_eat(obj/effect/spacevine/holder, mob/living/eater)
/datum/spacevine_mutation/proc/on_eat(obj/structure/spacevine/holder, mob/living/eater)
return
/datum/spacevine_mutation/proc/on_spread(obj/effect/spacevine/holder, turf/target)
/datum/spacevine_mutation/proc/on_spread(obj/structure/spacevine/holder, turf/target)
return
/datum/spacevine_mutation/proc/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
/datum/spacevine_mutation/proc/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
return
/datum/spacevine_mutation/proc/on_explosion(severity, target, obj/effect/spacevine/holder)
/datum/spacevine_mutation/proc/on_explosion(severity, target, obj/structure/spacevine/holder)
return
@@ -107,7 +107,7 @@
ChangeTurf(src.baseturf)
/turf/open/floor/vines/ChangeTurf(turf/open/floor/T)
for(var/obj/effect/spacevine/SV in src)
for(var/obj/structure/spacevine/SV in src)
qdel(SV)
. = ..()
UpdateAffectingLights()
@@ -125,17 +125,17 @@
/turf/open/space/transit
))
/datum/spacevine_mutation/space_covering/on_grow(obj/effect/spacevine/holder)
/datum/spacevine_mutation/space_covering/on_grow(obj/structure/spacevine/holder)
process_mutation(holder)
/datum/spacevine_mutation/space_covering/process_mutation(obj/effect/spacevine/holder)
/datum/spacevine_mutation/space_covering/process_mutation(obj/structure/spacevine/holder)
var/turf/T = get_turf(holder)
if(is_type_in_typecache(T, coverable_turfs))
var/currtype = T.type
T.ChangeTurf(/turf/open/floor/vines)
T.baseturf = currtype
/datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder)
/datum/spacevine_mutation/space_covering/on_death(obj/structure/spacevine/holder)
var/turf/T = get_turf(holder)
if(istype(T, /turf/open/floor/vines))
T.ChangeTurf(T.baseturf)
@@ -145,8 +145,8 @@
hue = "#3333ff"
quality = MINOR_NEGATIVE
/datum/spacevine_mutation/bluespace/on_spread(obj/effect/spacevine/holder, turf/target)
if(holder.energy > 1 && !locate(/obj/effect/spacevine) in target)
/datum/spacevine_mutation/bluespace/on_spread(obj/structure/spacevine/holder, turf/target)
if(holder.energy > 1 && !locate(/obj/structure/spacevine) in target)
holder.master.spawn_spacevine_piece(target, holder)
/datum/spacevine_mutation/light
@@ -155,7 +155,7 @@
quality = POSITIVE
severity = 4
/datum/spacevine_mutation/light/on_grow(obj/effect/spacevine/holder)
/datum/spacevine_mutation/light/on_grow(obj/structure/spacevine/holder)
if(holder.energy)
holder.SetLuminosity(severity, 3)
@@ -165,14 +165,14 @@
severity = 10
quality = NEGATIVE
/datum/spacevine_mutation/toxicity/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
/datum/spacevine_mutation/toxicity/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
if(issilicon(crosser))
return
if(prob(severity) && istype(crosser) && !isvineimmune(crosser))
crosser << "<span class='alert'>You accidently touch the vine and feel a strange sensation.</span>"
crosser.adjustToxLoss(5)
/datum/spacevine_mutation/toxicity/on_eat(obj/effect/spacevine/holder, mob/living/eater)
/datum/spacevine_mutation/toxicity/on_eat(obj/structure/spacevine/holder, mob/living/eater)
if(!isvineimmune(eater))
eater.adjustToxLoss(5)
@@ -182,14 +182,14 @@
quality = NEGATIVE
severity = 2
/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, target, obj/effect/spacevine/holder)
/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, target, obj/structure/spacevine/holder)
if(explosion_severity < 3)
qdel(src)
else
. = 1
QDEL_IN(src, 5)
/datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
/datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/I)
explosion(holder.loc, 0, 0, severity, 0, 0)
/datum/spacevine_mutation/fire_proof
@@ -197,10 +197,10 @@
hue = "#ff8888"
quality = MINOR_NEGATIVE
/datum/spacevine_mutation/fire_proof/process_temperature(obj/effect/spacevine/holder, temp, volume)
/datum/spacevine_mutation/fire_proof/process_temperature(obj/structure/spacevine/holder, temp, volume)
return 1
/datum/spacevine_mutation/fire_proof/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
/datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
if(I && I.damtype == "fire")
. = 0
else
@@ -211,8 +211,8 @@
hue = "#ff7700"
quality = MINOR_NEGATIVE
/datum/spacevine_mutation/vine_eating/on_spread(obj/effect/spacevine/holder, turf/target)
var/obj/effect/spacevine/prey = locate() in target
/datum/spacevine_mutation/vine_eating/on_spread(obj/structure/spacevine/holder, turf/target)
var/obj/structure/spacevine/prey = locate() in target
if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin
qdel(prey)
@@ -222,10 +222,10 @@
severity = 3
quality = NEGATIVE
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target)
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/target)
target.ex_act(severity, src) // vine immunity handled at /mob/ex_act
/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
buckled.ex_act(severity, src)
/datum/spacevine_mutation/transparency
@@ -233,7 +233,7 @@
hue = ""
quality = POSITIVE
/datum/spacevine_mutation/transparency/on_grow(obj/effect/spacevine/holder)
/datum/spacevine_mutation/transparency/on_grow(obj/structure/spacevine/holder)
holder.SetOpacity(0)
holder.alpha = 125
@@ -243,7 +243,7 @@
severity = 3
quality = NEGATIVE
/datum/spacevine_mutation/oxy_eater/process_mutation(obj/effect/spacevine/holder)
/datum/spacevine_mutation/oxy_eater/process_mutation(obj/structure/spacevine/holder)
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
@@ -258,7 +258,7 @@
severity = 3
quality = NEGATIVE
/datum/spacevine_mutation/nitro_eater/process_mutation(obj/effect/spacevine/holder)
/datum/spacevine_mutation/nitro_eater/process_mutation(obj/structure/spacevine/holder)
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
@@ -273,7 +273,7 @@
severity = 3
quality = POSITIVE
/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/effect/spacevine/holder)
/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/structure/spacevine/holder)
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
@@ -288,7 +288,7 @@
severity = 3
quality = POSITIVE
/datum/spacevine_mutation/plasma_eater/process_mutation(obj/effect/spacevine/holder)
/datum/spacevine_mutation/plasma_eater/process_mutation(obj/structure/spacevine/holder)
var/turf/open/floor/T = holder.loc
if(istype(T))
var/datum/gas_mixture/GM = T.air
@@ -303,13 +303,13 @@
severity = 10
quality = NEGATIVE
/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
/datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
if(prob(severity) && istype(crosser) && !isvineimmune(holder))
var/mob/living/M = crosser
M.adjustBruteLoss(5)
M << "<span class='alert'>You cut yourself on the thorny vines.</span>"
/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
/datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
if(prob(severity) && istype(hitter) && !isvineimmune(holder))
var/mob/living/M = hitter
M.adjustBruteLoss(5)
@@ -321,13 +321,13 @@
hue = "#997700"
quality = NEGATIVE
/datum/spacevine_mutation/woodening/on_grow(obj/effect/spacevine/holder)
/datum/spacevine_mutation/woodening/on_grow(obj/structure/spacevine/holder)
if(holder.energy)
holder.density = 1
holder.maxhealth = 100
holder.health = holder.maxhealth
/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
if(I.is_sharp())
. = expected_damage * 0.5
else
@@ -339,16 +339,16 @@
quality = NEGATIVE
severity = 10
/datum/spacevine_mutation/flowering/on_grow(obj/effect/spacevine/holder)
/datum/spacevine_mutation/flowering/on_grow(obj/structure/spacevine/holder)
if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder))
new/obj/structure/alien/resin/flower_bud_enemy(get_turf(holder))
/datum/spacevine_mutation/flowering/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
/datum/spacevine_mutation/flowering/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
holder.entangle(crosser)
// SPACE VINES (Note that this code is very similar to Biomass code)
/obj/effect/spacevine
/obj/structure/spacevine
name = "space vines"
desc = "An extremely expansionistic species of vine."
icon = 'icons/effects/spacevines.dmi'
@@ -361,10 +361,10 @@
var/health = 50
var/maxhealth = 50
var/energy = 0
var/obj/effect/spacevine_controller/master = null
var/obj/structure/spacevine_controller/master = null
var/list/mutations = list()
/obj/effect/spacevine/Destroy()
/obj/structure/spacevine/Destroy()
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_death(src)
if(master)
@@ -381,7 +381,7 @@
unbuckle_all_mobs(force=1)
return ..()
/obj/effect/spacevine/proc/on_chem_effect(datum/reagent/R)
/obj/structure/spacevine/proc/on_chem_effect(datum/reagent/R)
var/override = 0
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.on_chem(src, R)
@@ -389,7 +389,7 @@
if(prob(50))
qdel(src)
/obj/effect/spacevine/proc/eat(mob/eater)
/obj/structure/spacevine/proc/eat(mob/eater)
var/override = 0
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.on_eat(src, eater)
@@ -398,7 +398,7 @@
eater.say("Nom")
qdel(src)
/obj/effect/spacevine/attackby(obj/item/weapon/W, mob/user, params)
/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
if (!W || !user || !W.type)
return
user.changeNext_move(CLICK_CD_MELEE)
@@ -406,7 +406,7 @@
if(istype(W, /obj/item/weapon/scythe))
force = force * 4
for(var/obj/effect/spacevine/B in orange(1,src))
for(var/obj/structure/spacevine/B in orange(1,src))
B.health = health - force
if(B.health < 1)
qdel(B)
@@ -433,36 +433,36 @@
..()
/obj/effect/spacevine/Crossed(mob/crosser)
/obj/structure/spacevine/Crossed(mob/crosser)
if(isliving(crosser))
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_cross(src, crosser)
/obj/effect/spacevine/attack_hand(mob/user)
/obj/structure/spacevine/attack_hand(mob/user)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
user_unbuckle_mob(user, user)
/obj/effect/spacevine/attack_paw(mob/living/user)
/obj/structure/spacevine/attack_paw(mob/living/user)
user.do_attack_animation(src)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_hit(src, user)
user_unbuckle_mob(user,user)
/obj/effect/spacevine/attack_alien(mob/living/user)
/obj/structure/spacevine/attack_alien(mob/living/user)
eat(user)
/obj/effect/spacevine_controller
/obj/structure/spacevine_controller
invisibility = INVISIBILITY_ABSTRACT
var/list/obj/effect/spacevine/vines = list()
var/list/obj/structure/spacevine/vines = list()
var/list/growth_queue = list()
var/spread_multiplier = 5
var/spread_cap = 30
var/list/mutations_list = list()
var/mutativness = 1
/obj/effect/spacevine_controller/New(loc, list/muts, mttv, spreading)
/obj/structure/spacevine_controller/New(loc, list/muts, mttv, spreading)
spawn_spacevine_piece(loc, , muts)
START_PROCESSING(SSobj, src)
init_subtypes(/datum/spacevine_mutation/, mutations_list)
@@ -472,21 +472,21 @@
spread_cap *= spreading / 50
spread_multiplier /= spreading / 50
/obj/effect/spacevine_controller/ex_act() //only killing all vines will end this suffering
/obj/structure/spacevine_controller/ex_act() //only killing all vines will end this suffering
return
/obj/effect/spacevine_controller/singularity_act()
/obj/structure/spacevine_controller/singularity_act()
return
/obj/effect/spacevine_controller/singularity_pull()
/obj/structure/spacevine_controller/singularity_pull()
return
/obj/effect/spacevine_controller/Destroy()
/obj/structure/spacevine_controller/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/effect/spacevine/parent, list/muts)
var/obj/effect/spacevine/SV = new(location)
/obj/structure/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
var/obj/structure/spacevine/SV = new(location)
growth_queue += SV
vines += SV
SV.master = src
@@ -508,7 +508,7 @@
for(var/datum/spacevine_mutation/SM in SV.mutations)
SM.on_birth(SV)
/obj/effect/spacevine_controller/process()
/obj/structure/spacevine_controller/process()
if(!vines)
qdel(src) //space vines exterminated. Remove the controller
return
@@ -520,9 +520,9 @@
length = min( spread_cap , max( 1 , vines.len / spread_multiplier ) )
var/i = 0
var/list/obj/effect/spacevine/queue_end = list()
var/list/obj/structure/spacevine/queue_end = list()
for(var/obj/effect/spacevine/SV in growth_queue)
for(var/obj/structure/spacevine/SV in growth_queue)
if(qdeleted(SV))
continue
i++
@@ -543,7 +543,7 @@
growth_queue = growth_queue + queue_end
/obj/effect/spacevine/proc/grow()
/obj/structure/spacevine/proc/grow()
if(!energy)
src.icon_state = pick("Med1", "Med2", "Med3")
energy = 1
@@ -555,7 +555,7 @@
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_grow(src)
/obj/effect/spacevine/proc/entangle_mob()
/obj/structure/spacevine/proc/entangle_mob()
if(!has_buckled_mobs() && prob(25))
for(var/mob/living/V in src.loc)
entangle(V)
@@ -563,7 +563,7 @@
break //only capture one mob at a time
/obj/effect/spacevine/proc/entangle(mob/living/V)
/obj/structure/spacevine/proc/entangle(mob/living/V)
if(!V || isvineimmune(V))
return
for(var/datum/spacevine_mutation/SM in mutations)
@@ -572,18 +572,18 @@
V << "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>"
buckle_mob(V)
/obj/effect/spacevine/proc/spread()
/obj/structure/spacevine/proc/spread()
var/direction = pick(cardinal)
var/turf/stepturf = get_step(src,direction)
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_spread(src, stepturf)
stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen
if(!locate(/obj/effect/spacevine, stepturf))
if(!locate(/obj/structure/spacevine, stepturf))
if(stepturf.Enter(src))
if(master)
master.spawn_spacevine_piece(stepturf, src)
/obj/effect/spacevine/ex_act(severity, target)
/obj/structure/spacevine/ex_act(severity, target)
if(istype(target, type)) //if its agressive spread vine dont do anything
return
var/i
@@ -592,14 +592,14 @@
if(!i && prob(100/severity))
qdel(src)
/obj/effect/spacevine/temperature_expose(null, temp, volume)
/obj/structure/spacevine/temperature_expose(null, temp, volume)
var/override = 0
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.process_temperature(src, temp, volume)
if(!override)
qdel(src)
/obj/effect/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
/obj/structure/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
if(isvineimmune(mover))
. = TRUE
else

View File

@@ -29,7 +29,7 @@
while((spawncount >= 1) && vents.len)
var/obj/vent = pick(vents)
var/obj/effect/spider/spiderling/S = new(vent.loc)
var/obj/structure/spider/spiderling/S = new(vent.loc)
if(prob(66))
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse
vents -= vent

View File

@@ -49,11 +49,11 @@
else
return ..()
/obj/machinery/smartfridge/construction()
/obj/machinery/smartfridge/on_construction()
for(var/datum/A in contents)
qdel(A)
/obj/machinery/smartfridge/deconstruction()
/obj/machinery/smartfridge/on_deconstruction()
for(var/atom/movable/A in contents)
A.loc = loc

View File

@@ -204,6 +204,6 @@
emergency_shutdown()
..()
/obj/machinery/computer/holodeck/blob_act(obj/effect/blob/B)
/obj/machinery/computer/holodeck/blob_act(obj/structure/blob/B)
emergency_shutdown()
..()

View File

@@ -32,7 +32,7 @@
var/turf/T = get_turf(src)
message_admins("Kudzu planted by [key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) at ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>(JMP)</a>)",0,1)
investigate_log("was planted by [key_name(user)] at ([T.x],[T.y],[T.z])","kudzu")
new /obj/effect/spacevine_controller(user.loc, mutations, potency, production)
new /obj/structure/spacevine_controller(user.loc, mutations, potency, production)
qdel(src)
/obj/item/seeds/kudzu/attack_self(mob/user)

View File

@@ -237,13 +237,13 @@
desc = "<I>Mycena Bregprox</I>: This species of mushroom glows in the dark."
icon_state = "glowshroom"
filling_color = "#00FA9A"
var/effect_path = /obj/effect/glowshroom
var/effect_path = /obj/structure/glowshroom
origin_tech = "biotech=4;plasmatech=6"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user)
if(istype(user.loc,/turf/open/space))
return
var/obj/effect/glowshroom/planted = new effect_path(user.loc)
var/obj/structure/glowshroom/planted = new effect_path(user.loc)
planted.delay = planted.delay - seed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
planted.endurance = seed.endurance
planted.yield = seed.yield
@@ -274,5 +274,5 @@
desc = "<I>Mycena Ruthenia</I>: This species of mushroom glows in the dark, but aren't bioluminescent. They're warm to the touch..."
icon_state = "glowcap"
filling_color = "#00FA9A"
effect_path = /obj/effect/glowshroom/glowcap
effect_path = /obj/structure/glowshroom/glowcap
origin_tech = "biotech=4;powerstorage=6;plasmatech=4"

View File

@@ -444,7 +444,7 @@
if(pestlevel > 5)
visible_message("<span class='warning'>The pests seem to behave oddly...</span>")
for(var/i=0, i<3, i++)
var/obj/effect/spider/spiderling/S = new(src.loc)
var/obj/structure/spider/spiderling/S = new(src.loc)
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter
else
usr << "<span class='warning'>The pests seem to behave oddly, but quickly settle down...</span>"

View File

@@ -126,7 +126,7 @@
return ..()
/obj/machinery/mineral/ore_redemption/deconstruction()
/obj/machinery/mineral/ore_redemption/on_deconstruction()
empty_content()
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O)

View File

@@ -281,42 +281,37 @@
//Outdated but still in use apparently. This should at least be a human proc.
//Daily reminder to murder this - Remie.
/mob/proc/get_equipped_items()
var/list/items = list()
/mob/living/proc/get_equipped_items()
return
if(hasvar(src,"back"))
if(src:back)
items += src:back
if(hasvar(src,"belt"))
if(src:belt)
items += src:belt
if(hasvar(src,"ears"))
if(src:ears)
items += src:ears
if(hasvar(src,"glasses"))
if(src:glasses)
items += src:glasses
if(hasvar(src,"gloves"))
if(src:gloves)
items += src:gloves
if(hasvar(src,"head"))
if(src:head)
items += src:head
if(hasvar(src,"shoes"))
if(src:shoes)
items += src:shoes
if(hasvar(src,"wear_id"))
if(src:wear_id)
items += src:wear_id
if(hasvar(src,"wear_mask"))
if(src:wear_mask)
items += src:wear_mask
if(hasvar(src,"wear_suit"))
if(src:wear_suit)
items += src:wear_suit
if(hasvar(src,"w_uniform"))
if(src:w_uniform)
items += src:w_uniform
/mob/living/carbon/get_equipped_items()
var/list/items = list()
if(back)
items += back
if(head)
items += head
if(wear_mask)
items += wear_mask
return items
/mob/living/carbon/human/get_equipped_items()
var/list/items = ..()
if(belt)
items += belt
if(ears)
items += ears
if(glasses)
items += glasses
if(gloves)
items += gloves
if(shoes)
items += shoes
if(wear_id)
items += wear_id
if(wear_suit)
items += wear_suit
if(w_uniform)
items += w_uniform
return items

View File

@@ -44,7 +44,7 @@
/mob/living/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
return
/mob/living/brain/blob_act(obj/effect/blob/B)
/mob/living/brain/blob_act(obj/structure/blob/B)
return
/mob/living/brain/get_eye_protection()//no eyes

View File

@@ -155,7 +155,7 @@ mob/living/carbon/bullet_act(obj/item/projectile/P, def_zone)
return dam_zone
/mob/living/carbon/blob_act(obj/effect/blob/B)
/mob/living/carbon/blob_act(obj/structure/blob/B)
if (stat == DEAD)
return
else

View File

@@ -379,7 +379,7 @@
break
..()
/mob/living/carbon/human/blob_act(obj/effect/blob/B)
/mob/living/carbon/human/blob_act(obj/structure/blob/B)
if(stat == DEAD)
return
show_message("<span class='userdanger'>The blob attacks you!</span>")

View File

@@ -14,7 +14,7 @@
/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user)
return //immune to slimes
/mob/living/silicon/ai/blob_act(obj/effect/blob/B)
/mob/living/silicon/ai/blob_act(obj/structure/blob/B)
if (stat != DEAD)
adjustBruteLoss(60)
updatehealth()

View File

@@ -1,5 +1,5 @@
/mob/living/silicon/pai/blob_act(obj/effect/blob/B)
/mob/living/silicon/pai/blob_act(obj/structure/blob/B)
return 0
/mob/living/silicon/pai/emp_act(severity)

View File

@@ -150,7 +150,7 @@
update_icons()
/mob/living/silicon/robot/blob_act(obj/effect/blob/B)
/mob/living/silicon/robot/blob_act(obj/structure/blob/B)
if (stat != 2)
adjustBruteLoss(60)
updatehealth()

View File

@@ -112,6 +112,6 @@
bloss = bloss / 1.5
adjustBruteLoss(bloss)
/mob/living/simple_animal/blob_act(obj/effect/blob/B)
/mob/living/simple_animal/blob_act(obj/structure/blob/B)
adjustBruteLoss(20)
return

View File

@@ -50,14 +50,14 @@
src.visible_message("<span class='notice'>[src] calms down.</span>")
if(stat == CONSCIOUS)
udder.generateMilk()
if(locate(/obj/effect/spacevine) in loc)
var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc
if(locate(/obj/structure/spacevine) in loc)
var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
SV.eat(src)
if(!pulledby)
for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
var/step = get_step(src, direction)
if(step)
if(locate(/obj/effect/spacevine) in step)
if(locate(/obj/structure/spacevine) in step)
Move(step, get_dir(src, step))
/mob/living/simple_animal/hostile/retaliate/goat/Retaliate()
@@ -67,8 +67,8 @@
/mob/living/simple_animal/hostile/retaliate/goat/Move()
..()
if(!stat)
if(locate(/obj/effect/spacevine) in loc)
var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc
if(locate(/obj/structure/spacevine) in loc)
var/obj/structure/spacevine/SV = locate(/obj/structure/spacevine) in loc
SV.eat(src)
/mob/living/simple_animal/hostile/retaliate/goat/attackby(obj/item/O, mob/user, params)

View File

@@ -138,7 +138,7 @@
return
//second, spin a sticky spiderweb on this tile
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
var/obj/structure/spider/stickyweb/W = locate() in get_turf(src)
if(!W)
Web()
else
@@ -183,7 +183,7 @@
stop_automated_movement = 1
if(do_after(src, 40, target = T))
if(busy == SPINNING_WEB && src.loc == T)
new /obj/effect/spider/stickyweb(T)
new /obj/structure/spider/stickyweb(T)
busy = 0
stop_automated_movement = 0
@@ -215,7 +215,7 @@
if(do_after(src, 50, target = src))
if(busy == SPINNING_COCOON)
if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1)
var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
var/obj/structure/spider/cocoon/C = new(cocoon_target.loc)
var/large_cocoon = 0
C.pixel_x = cocoon_target.pixel_x
C.pixel_y = cocoon_target.pixel_y
@@ -251,7 +251,7 @@
set category = "Spider"
set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first."
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
var/obj/structure/spider/eggcluster/E = locate() in get_turf(src)
if(stat == DEAD)
return
if(E)
@@ -266,7 +266,7 @@
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
var/obj/effect/spider/eggcluster/C = new /obj/effect/spider/eggcluster(src.loc)
var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(src.loc)
if(ckey)
C.player_spiders = 1
C.poison_type = poison_type

View File

@@ -3,7 +3,7 @@ It will teleport people to a holding facility after 30 seconds. (Check the proce
It is possible to destroy the net by the occupant or someone else.
*/
/obj/effect/energy_net
/obj/structure/energy_net
name = "energy net"
desc = "It's a net made of green energy."
icon = 'icons/effects/effects.dmi'
@@ -20,7 +20,7 @@ It is possible to destroy the net by the occupant or someone else.
/obj/effect/energy_net/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
/obj/structure/energy_net/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
switch(damage_type)
if(BRUTE)
if(sound_effect)
@@ -34,7 +34,7 @@ It is possible to destroy the net by the occupant or someone else.
if(health <=0)
qdel(src)
/obj/effect/energy_net/Destroy()
/obj/structure/energy_net/Destroy()
if(affecting)
var/mob/living/carbon/M = affecting
M.anchored = 0
@@ -44,7 +44,7 @@ It is possible to destroy the net by the occupant or someone else.
master << "<span class='userdanger'>ERROR</span>: unable to initiate transport protocol. Procedure terminated."
return ..()
/obj/effect/energy_net/process(mob/living/carbon/M)
/obj/structure/energy_net/process(mob/living/carbon/M)
var/check = 30//30 seconds before teleportation. Could be extended I guess.
var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
//The person can still try and attack the net when inside.
@@ -101,13 +101,13 @@ It is possible to destroy the net by the occupant or someone else.
/obj/effect/energy_net/bullet_act(obj/item/projectile/Proj)
/obj/structure/energy_net/bullet_act(obj/item/projectile/Proj)
. = ..()
take_damage(Proj.damage, Proj.damage_type)
/obj/effect/energy_net/ex_act(severity, target)
/obj/structure/energy_net/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
@@ -116,10 +116,10 @@ It is possible to destroy the net by the occupant or someone else.
if(3)
take_damage(rand(10,25), BRUTE, 0)
/obj/effect/energy_net/blob_act(obj/effect/blob/B)
/obj/structure/energy_net/blob_act(obj/structure/blob/B)
qdel(src)
/obj/effect/energy_net/hitby(atom/movable/AM)
/obj/structure/energy_net/hitby(atom/movable/AM)
..()
var/tforce = 0
if(ismob(AM))
@@ -130,7 +130,7 @@ It is possible to destroy the net by the occupant or someone else.
take_damage(tforce)
/obj/effect/energy_net/attack_hulk(mob/living/carbon/human/user)
/obj/structure/energy_net/attack_hulk(mob/living/carbon/human/user)
..(user, 1)
user.visible_message("<span class='danger'>[user] rips the energy net apart!</span>", \
"<span class='notice'>You easily destroy the energy net.</span>")
@@ -138,12 +138,12 @@ It is possible to destroy the net by the occupant or someone else.
/obj/effect/energy_net/attack_paw(mob/user)
/obj/structure/energy_net/attack_paw(mob/user)
return attack_hand()
/obj/effect/energy_net/attack_alien(mob/living/user)
/obj/structure/energy_net/attack_alien(mob/living/user)
user.do_attack_animation(src)
user.changeNext_move(CLICK_CD_MELEE)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
@@ -153,7 +153,7 @@ It is possible to destroy the net by the occupant or someone else.
/obj/effect/energy_net/attacked_by(obj/item/weapon/W, mob/user)
/obj/structure/energy_net/attacked_by(obj/item/weapon/W, mob/user)
..()
take_damage(W.force, W.damtype)

View File

@@ -9,7 +9,7 @@
if(!ninjacost(200,N_STEALTH_CANCEL) && iscarbon(C))
var/mob/living/carbon/human/H = affecting
if(C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
if(!locate(/obj/effect/energy_net) in C.loc)//Check if they are already being affected by an energy net.
if(!locate(/obj/structure/energy_net) in C.loc)//Check if they are already being affected by an energy net.
for(var/turf/T in getline(H.loc, C.loc))
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
H << "<span class='warning'>You may not use an energy net through solid obstacles!</span>"
@@ -17,7 +17,7 @@
spawn(0)
H.Beam(C,"n_beam",time=15)
H.say("Get over here!")
var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc)
var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.loc)
H.visible_message("<span class='danger'>[H] caught [C] with an energy net!</span>","<span class='notice'>You caught [C] with an energy net!</span>")
E.affecting = C
E.master = H

View File

@@ -321,7 +321,7 @@
toner = 0
/obj/machinery/photocopier/blob_act(obj/effect/blob/B)
/obj/machinery/photocopier/blob_act(obj/structure/blob/B)
if(prob(50))
qdel(src)
else

View File

@@ -1095,7 +1095,7 @@
if(prob(25))
set_broken()
/obj/machinery/power/apc/blob_act(obj/effect/blob/B)
/obj/machinery/power/apc/blob_act(obj/structure/blob/B)
set_broken()
/obj/machinery/power/apc/disconnect_terminal()

View File

@@ -93,7 +93,7 @@ By design, d1 is the smallest direction and d2 is the highest
cable_list -= src //remove it from global cable list
return ..() // then go ahead and delete the cable
/obj/structure/cable/blob_act(obj/effect/blob/B)
/obj/structure/cable/blob_act(obj/structure/blob/B)
if(invisibility != INVISIBILITY_MAXIMUM)
qdel(src)

View File

@@ -146,7 +146,7 @@
corrupt()
/obj/item/weapon/stock_parts/cell/blob_act(obj/effect/blob/B)
/obj/item/weapon/stock_parts/cell/blob_act(obj/structure/blob/B)
ex_act(1)
/obj/item/weapon/stock_parts/cell/proc/get_electrocute_damage()

View File

@@ -32,7 +32,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(severity == 1) // Very sturdy.
set_broken()
/obj/machinery/gravity_generator/blob_act(obj/effect/blob/B)
/obj/machinery/gravity_generator/blob_act(obj/structure/blob/B)
if(prob(20))
set_broken()

View File

@@ -116,7 +116,7 @@
return
return ..()
/obj/machinery/light_construct/blob_act(obj/effect/blob/B)
/obj/machinery/light_construct/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
qdel(src)
@@ -529,7 +529,7 @@
if(prob(25))
broken()
/obj/machinery/light/blob_act(obj/effect/blob/B)
/obj/machinery/light/blob_act(obj/structure/blob/B)
if(B && B.loc == loc)
broken()
qdel(src)

View File

@@ -133,7 +133,7 @@
log_game("[key_name(Proj.firer)] triggered an Abductor Core explosion via projectile.")
overload()
/obj/machinery/power/rtg/abductor/blob_act(obj/effect/blob/B)
/obj/machinery/power/rtg/abductor/blob_act(obj/structure/blob/B)
overload()
/obj/machinery/power/rtg/abductor/ex_act()

View File

@@ -27,7 +27,7 @@
return 1
/obj/machinery/field/containment/blob_act(obj/effect/blob/B)
/obj/machinery/field/containment/blob_act(obj/structure/blob/B)
return 0

Some files were not shown because too many files have changed in this diff Show More