/* Alien shit! * Contains: * structure/alien * Resin * Weeds * Egg * effect/acid */ /obj/structure/alien icon = 'icons/mob/alien.dmi' /* * Resin */ /obj/structure/alien/resin name = "resin" desc = "Looks like some kind of thick resin." icon_state = "resin" density = 1 opacity = 1 anchored = 1 var/health = 200 var/resintype = null /obj/structure/alien/resin/New(location) relativewall_neighbours() ..() return /obj/structure/alien/resin/Destroy() var/turf/T = loc loc = null T.relativewall_neighbours() ..() /obj/structure/alien/resin/Move() ..() /obj/structure/alien/resin/wall name = "resin wall" desc = "Thick resin solidified into a wall." icon_state = "wall0" //same as resin, but consistency ho! resintype = "wall" /obj/structure/alien/resin/wall/New() relativewall_neighbours() ..() /obj/structure/alien/resin/membrane name = "resin membrane" desc = "Resin just thin enough to let light pass through." icon_state = "membrane0" opacity = 0 health = 120 resintype = "membrane" /obj/structure/alien/resin/membrane/New() relativewall_neighbours() ..() /obj/structure/alien/resin/proc/healthcheck() if(health <=0) del(src) /obj/structure/alien/resin/bullet_act(obj/item/projectile/Proj) health -= Proj.damage ..() healthcheck() /obj/structure/alien/resin/ex_act(severity, target) switch(severity) if(1.0) health -= 150 if(2.0) health -= 100 if(3.0) health -= 50 healthcheck() /obj/structure/alien/resin/blob_act() health -= 50 healthcheck() /obj/structure/alien/resin/hitby(atom/movable/AM) ..() visible_message("[src] was hit by [AM].") var/tforce = 0 if(!isobj(AM)) tforce = 10 else var/obj/O = AM tforce = O.throwforce playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) health -= tforce healthcheck() /obj/structure/alien/resin/attack_hand(mob/living/user) if(M_HULK in user.mutations) user.visible_message("[user] destroys [src]!") health = 0 healthcheck() /obj/structure/alien/resin/attack_paw(mob/user) return attack_hand(user) /obj/structure/alien/resin/attack_alien(mob/living/user) if(islarva(user)) return user.visible_message("[user] claws at the resin!") playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) health -= 50 if(health <= 0) user.visible_message("[user] slices the [name] apart!") healthcheck() /obj/structure/alien/resin/attackby(obj/item/I, mob/living/user) health -= I.force playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) healthcheck() ..() /obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target, height=0) if(istype(mover) && mover.checkpass(PASSGLASS)) return !opacity return !density /* * Weeds */ #define NODERANGE 3 /obj/structure/alien/weeds gender = PLURAL name = "resin floor" desc = "A thick resin surface covers the floor." icon_state = "weeds" anchored = 1 density = 0 layer = 2 var/health = 15 var/obj/structure/alien/weeds/node/linked_node = null /obj/structure/alien/weeds/New(pos, node) ..() linked_node = node if(istype(loc, /turf/space)) del(src) return if(icon_state == "weeds") icon_state = pick("weeds", "weeds1", "weeds2") fullUpdateWeedOverlays() spawn(rand(150, 200)) if(src) Life() /obj/structure/alien/weeds/Destroy() var/turf/T = loc loc = null for (var/obj/structure/alien/weeds/W in range(1,T)) W.updateWeedOverlays() ..() /obj/structure/alien/weeds/proc/Life() set background = BACKGROUND_ENABLED var/turf/U = get_turf(src) if(istype(U, /turf/space)) del(src) return direction_loop: for(var/dirn in cardinal) var/turf/T = get_step(src, dirn) if (!istype(T) || T.density || locate(/obj/structure/alien/weeds) in T || istype(T, /turf/space)) continue if(!linked_node || get_dist(linked_node, src) > linked_node.node_range) return for(var/obj/O in T) if(O.density) continue direction_loop new /obj/structure/alien/weeds(T, linked_node) /obj/structure/alien/weeds/ex_act(severity, target) del(src) /obj/structure/alien/weeds/attackby(obj/item/I, mob/user) if(I.attack_verb.len) visible_message("[user] has [pick(I.attack_verb)] [src] with [I]!") else visible_message("[user] has attacked [src] with [I]!") var/damage = I.force / 4.0 if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = I if(WT.remove_fuel(0, user)) damage = 15 playsound(loc, 'sound/items/Welder.ogg', 100, 1) health -= damage healthcheck() /obj/structure/alien/weeds/proc/healthcheck() if(health <= 0) del(src) /obj/structure/alien/weeds/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) health -= 5 healthcheck() /obj/structure/alien/weeds/proc/updateWeedOverlays() overlays.Cut() var/turf/N = get_step(src, NORTH) var/turf/S = get_step(src, SOUTH) var/turf/E = get_step(src, EAST) var/turf/W = get_step(src, WEST) if(!locate(/obj/structure/alien) in N.contents) if(istype(N, /turf/simulated/floor)) src.overlays += image('icons/mob/alien.dmi', "weeds_side_s", layer=2, pixel_y = 32) if(!locate(/obj/structure/alien) in S.contents) if(istype(S, /turf/simulated/floor)) src.overlays += image('icons/mob/alien.dmi', "weeds_side_n", layer=2, pixel_y = -32) if(!locate(/obj/structure/alien) in E.contents) if(istype(E, /turf/simulated/floor)) src.overlays += image('icons/mob/alien.dmi', "weeds_side_w", layer=2, pixel_x = 32) if(!locate(/obj/structure/alien) in W.contents) if(istype(W, /turf/simulated/floor)) src.overlays += image('icons/mob/alien.dmi', "weeds_side_e", layer=2, pixel_x = -32) /obj/structure/alien/weeds/proc/fullUpdateWeedOverlays() for (var/obj/structure/alien/weeds/W in range(1,src)) W.updateWeedOverlays() //Weed nodes /obj/structure/alien/weeds/node name = "glowing resin" desc = "Blue bioluminescence shines from beneath the surface." icon_state = "weednode" luminosity = 1 var/node_range = NODERANGE /obj/structure/alien/weeds/node/New() ..(loc, src) #undef NODERANGE /* * Egg */ //for the status var #define BURST 0 #define BURSTING 1 #define GROWING 2 #define GROWN 3 #define MIN_GROWTH_TIME 1800 //time it takes to grow a hugger #define MAX_GROWTH_TIME 3000 /obj/structure/alien/egg name = "egg" desc = "A large mottled egg." icon_state = "egg_growing" density = 0 anchored = 1 var/health = 100 var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive /obj/structure/alien/egg/New() new /obj/item/clothing/mask/facehugger(src) ..() spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME)) Grow() /obj/structure/alien/egg/attack_paw(mob/user) if(isalien(user)) switch(status) if(BURST) user << "You clear the hatched egg." playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) del(src) return if(GROWING) user << "The child is not developed yet." return if(GROWN) user << "You retrieve the child." Burst(0) return else return attack_hand(user) /obj/structure/alien/egg/attack_hand(mob/user) user << "It feels slimy." /obj/structure/alien/egg/proc/GetFacehugger() return locate(/obj/item/clothing/mask/facehugger) in contents /obj/structure/alien/egg/proc/Grow() icon_state = "egg" status = GROWN /obj/structure/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining if(status == GROWN || status == GROWING) icon_state = "egg_hatched" flick("egg_opening", src) status = BURSTING spawn(15) status = BURST var/obj/item/clothing/mask/facehugger/child = GetFacehugger() if(child) child.loc = get_turf(src) if(kill && istype(child)) child.Die() else for(var/mob/M in range(1,src)) if(CanHug(M)) child.Attach(M) break /obj/structure/alien/egg/bullet_act(obj/item/projectile/Proj) health -= Proj.damage ..() healthcheck() /obj/structure/alien/egg/attackby(obj/item/I, mob/user) if(I.attack_verb.len) visible_message("[user] has [pick(I.attack_verb)] [src] with [I]!") else visible_message("[user] has attacked [src] with [I]!") var/damage = I.force / 4 if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = I if(WT.remove_fuel(0, user)) damage = 15 playsound(loc, 'sound/items/Welder.ogg', 100, 1) health -= damage healthcheck() /obj/structure/alien/egg/proc/healthcheck() if(health <= 0) if(status != BURST && status != BURSTING) Burst() else if(status == BURST && prob(50)) del(src) //Remove the egg after it has been hit after bursting. /obj/structure/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 500) health -= 5 healthcheck() /obj/structure/alien/egg/HasProximity(atom/movable/AM) if(status == GROWN) if(!CanHug(AM)) return var/mob/living/carbon/C = AM if(C.stat == CONSCIOUS && C.status_flags & XENO_HOST) return Burst(0) #undef BURST #undef BURSTING #undef GROWING #undef GROWN #undef MIN_GROWTH_TIME #undef MAX_GROWTH_TIME /* * Acid */ /obj/effect/acid gender = PLURAL name = "acid" desc = "Burbling corrossive stuff." icon = 'icons/effects/effects.dmi' icon_state = "acid" density = 0 opacity = 0 anchored = 1 unacidable = 1 var/atom/target var/ticks = 0 var/target_strength = 0 /obj/effect/acid/New(loc, targ) ..(loc) target = targ //handle APCs and newscasters and stuff nicely pixel_x = target.pixel_x pixel_y = target.pixel_y if(isturf(target)) //Turfs take twice as long to take down. target_strength = 640 else target_strength = 320 tick() /obj/effect/acid/proc/tick() if(!target) del(src) ticks++ if(ticks >= target_strength) target.visible_message("[target] collapses under its own weight into a puddle of goop and undigested debris!") if(istype(target, /turf/simulated/wall)) var/turf/simulated/wall/W = target W.dismantle_wall(1) else del(target) del(src) return x = target.x y = target.y z = target.z switch(target_strength - ticks) if(480) visible_message("[target] is holding up against the acid!") if(320) visible_message("[target] is being melted by the acid!") if(160) visible_message("[target] is struggling to withstand the acid!") if(80) visible_message("[target] begins to crumble under the acid!") spawn(1) if(src) tick()