still dosnt work

This commit is contained in:
TrilbySpaceClone
2020-04-23 02:52:07 -04:00
parent f1a5ba0754
commit 86abfefa1b
4 changed files with 158 additions and 73 deletions

View File

@@ -172,8 +172,8 @@
var/datum/gas_mixture/GM = T.air var/datum/gas_mixture/GM = T.air
if(!GM.gases[/datum/gas/oxygen]) if(!GM.gases[/datum/gas/oxygen])
return return
GM.gases[/datum/gas/oxygen][MOLES] = max(GM.gases[/datum/gas/oxygen][MOLES] - severity * holder.energy, 0) GM.gases[/datum/gas/oxygen] = max(GM.gases[/datum/gas/oxygen] - severity * holder.energy, 0)
GM.garbage_collect() GAS_GARBAGE_COLLECT(GM.gases)
/datum/spacevine_mutation/nitro_eater /datum/spacevine_mutation/nitro_eater
name = "nitrogen consuming" name = "nitrogen consuming"
@@ -187,8 +187,8 @@
var/datum/gas_mixture/GM = T.air var/datum/gas_mixture/GM = T.air
if(!GM.gases[/datum/gas/nitrogen]) if(!GM.gases[/datum/gas/nitrogen])
return return
GM.gases[/datum/gas/nitrogen][MOLES] = max(GM.gases[/datum/gas/nitrogen][MOLES] - severity * holder.energy, 0) GM.gases[/datum/gas/nitrogen] = max(GM.gases[/datum/gas/nitrogen] - severity * holder.energy, 0)
GM.garbage_collect() GAS_GARBAGE_COLLECT(GM.gases)
/datum/spacevine_mutation/carbondioxide_eater /datum/spacevine_mutation/carbondioxide_eater
name = "CO2 consuming" name = "CO2 consuming"
@@ -202,8 +202,8 @@
var/datum/gas_mixture/GM = T.air var/datum/gas_mixture/GM = T.air
if(!GM.gases[/datum/gas/carbon_dioxide]) if(!GM.gases[/datum/gas/carbon_dioxide])
return return
GM.gases[/datum/gas/carbon_dioxide][MOLES] = max(GM.gases[/datum/gas/carbon_dioxide][MOLES] - severity * holder.energy, 0) GM.gases[/datum/gas/carbon_dioxide] = max(GM.gases[/datum/gas/carbon_dioxide] - severity * holder.energy, 0)
GM.garbage_collect() GAS_GARBAGE_COLLECT(GM.gases)
/datum/spacevine_mutation/plasma_eater /datum/spacevine_mutation/plasma_eater
name = "toxins consuming" name = "toxins consuming"
@@ -217,8 +217,8 @@
var/datum/gas_mixture/GM = T.air var/datum/gas_mixture/GM = T.air
if(!GM.gases[/datum/gas/plasma]) if(!GM.gases[/datum/gas/plasma])
return return
GM.gases[/datum/gas/plasma][MOLES] = max(GM.gases[/datum/gas/plasma][MOLES] - severity * holder.energy, 0) GM.gases[/datum/gas/plasma] = max(GM.gases[/datum/gas/plasma] - severity * holder.energy, 0)
GM.garbage_collect() GAS_GARBAGE_COLLECT(GM.gases)
/datum/spacevine_mutation/thorns /datum/spacevine_mutation/thorns
name = "thorny" name = "thorny"
@@ -544,4 +544,4 @@
var/mob/living/M = A var/mob/living/M = A
if(("vines" in M.faction) || ("plants" in M.faction)) if(("vines" in M.faction) || ("plants" in M.faction))
return TRUE return TRUE
return FALSE return FALSE

View File

@@ -1,5 +1,13 @@
/**
* Kudzu Flower Bud
*
* A flower created by flowering kudzu which spawns a venus human trap after a certain amount of time has passed.
*
* A flower created by kudzu with the flowering mutation. Spawns a venus human trap after 2 minutes under normal circumstances.
* Also spawns 4 vines going out in diagonal directions from the bud. Any living creature not aligned with plants is damaged by these vines.
* Once it grows a venus human trap, the bud itself will destroy itself.
*
*/
/obj/structure/alien/resin/flower_bud_enemy //inheriting basic attack/damage stuff from alien structures /obj/structure/alien/resin/flower_bud_enemy //inheriting basic attack/damage stuff from alien structures
name = "flower bud" name = "flower bud"
desc = "A large pulsating plant..." desc = "A large pulsating plant..."
@@ -9,9 +17,9 @@
opacity = 0 opacity = 0
canSmoothWith = list() canSmoothWith = list()
smooth = SMOOTH_FALSE smooth = SMOOTH_FALSE
/// The amount of time it takes to create a venus human trap, in deciseconds
var/growth_time = 1200 var/growth_time = 1200
/obj/structure/alien/resin/flower_bud_enemy/Initialize() /obj/structure/alien/resin/flower_bud_enemy/Initialize()
. = ..() . = ..()
var/list/anchors = list() var/list/anchors = list()
@@ -25,36 +33,49 @@
B.sleep_time = 10 //these shouldn't move, so let's slow down updates to 1 second (any slower and the deletion of the vines would be too slow) B.sleep_time = 10 //these shouldn't move, so let's slow down updates to 1 second (any slower and the deletion of the vines would be too slow)
addtimer(CALLBACK(src, .proc/bear_fruit), growth_time) addtimer(CALLBACK(src, .proc/bear_fruit), growth_time)
/**
* Spawns a venus human trap, then qdels itself.
*
* Displays a message, spawns a human venus trap, then qdels itself.
*/
/obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit() /obj/structure/alien/resin/flower_bud_enemy/proc/bear_fruit()
visible_message("<span class='danger'>the plant has borne fruit!</span>") visible_message("<span class='danger'>The plant has borne fruit!</span>")
new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src)) new /mob/living/simple_animal/hostile/venus_human_trap(get_turf(src))
qdel(src) qdel(src)
/obj/effect/ebeam/vine /obj/effect/ebeam/vine
name = "thick vine" name = "thick vine"
mouse_opacity = MOUSE_OPACITY_ICON mouse_opacity = MOUSE_OPACITY_ICON
desc = "A thick vine, painful to the touch." desc = "A thick vine, painful to the touch."
/obj/effect/ebeam/vine/Crossed(atom/movable/AM) /obj/effect/ebeam/vine/Crossed(atom/movable/AM)
. = ..()
if(isliving(AM)) if(isliving(AM))
var/mob/living/L = AM var/mob/living/L = AM
if(!("vines" in L.faction)) if(!isvineimmune(L))
L.adjustBruteLoss(5) L.adjustBruteLoss(5)
to_chat(L, "<span class='alert'>You cut yourself on the thorny vines.</span>") to_chat(L, "<span class='alert'>You cut yourself on the thorny vines.</span>")
/**
* Venus Human Trap
*
* The result of a kudzu flower bud, these enemies use vines to drag prey close to them for attack.
*
* A carnivorious plant which uses vines to catch and ensnare prey. Spawns from kudzu flower buds.
* Each one has a maximum of four vines, which can be attached to a variety of things. Carbons are stunned when a vine is attached to them, and movable entities are pulled closer over time.
* Attempting to attach a vine to something with a vine already attached to it will pull all movable targets closer on command.
* Once the prey is in melee range, melee attacks from the venus human trap heals itself for 10% of its max health, assuming the target is alive.
* Akin to certain spiders, venus human traps can also be possessed and controlled by ghosts.
*
*/
/mob/living/simple_animal/hostile/venus_human_trap /mob/living/simple_animal/hostile/venus_human_trap
name = "venus human trap" name = "venus human trap"
desc = "Now you know how the fly feels." desc = "Now you know how the fly feels."
icon_state = "venus_human_trap" icon_state = "venus_human_trap"
threat = 1
layer = SPACEVINE_MOB_LAYER layer = SPACEVINE_MOB_LAYER
health = 50 health = 50
maxHealth = 50 maxHealth = 50
ranged = 1 ranged = TRUE
harm_intent_damage = 5 harm_intent_damage = 5
obj_damage = 60 obj_damage = 60
melee_damage_lower = 25 melee_damage_lower = 25
@@ -63,65 +84,106 @@
attack_sound = 'sound/weapons/bladeslice.ogg' attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0 unsuitable_atmos_damage = 0
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
faction = list("hostile","vines","plants") faction = list("hostile","vines","plants")
var/list/grasping = list() initial_language_holder = /datum/language_holder/venus
var/max_grasps = 4 del_on_death = TRUE
var/grasp_chance = 20 /// A list of all the plant's vines
var/grasp_pull_chance = 85 var/list/vines = list()
var/grasp_range = 4 /// The maximum amount of vines a plant can have at one time
del_on_death = 1 var/max_vines = 4
/// How far away a plant can attach a vine to something
var/vine_grab_distance = 5
/// Whether or not this plant is ghost possessable
var/playable_plant = TRUE
/mob/living/simple_animal/hostile/venus_human_trap/Destroy() /mob/living/simple_animal/hostile/venus_human_trap/Life()
for(var/L in grasping) . = ..()
var/datum/beam/B = grasping[L] pull_vines()
if(B)
qdel(B)
grasping = null
return ..()
/mob/living/simple_animal/hostile/venus_human_trap/handle_automated_action()
if(..())
for(var/mob/living/L in grasping)
if(L.stat == DEAD)
var/datum/beam/B = grasping[L]
if(B)
B.End()
grasping -= L
//Can attack+pull multiple times per cycle
if(L.Adjacent(src))
L.attack_animal(src)
else
if(prob(grasp_pull_chance))
setDir(get_dir(src,L) )//staaaare
step(L,get_dir(L,src)) //reel them in
L.DefaultCombatKnockdown(60) //you can't get away now~
if(grasping.len < max_grasps)
grasping:
for(var/mob/living/L in view(grasp_range, src))
if(L == src || faction_check_mob(L) || (L in grasping) || L == target)
continue
for(var/t in getline(src,L))
for(var/a in t)
var/atom/A = a
if(A.density && A != L)
continue grasping
if(prob(grasp_chance))
to_chat(L, "<span class='userdanger'>\The [src] has you entangled!</span>")
grasping[L] = Beam(L, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine)
break //only take 1 new victim per cycle
/mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget()
. = ..()
if(isliving(target))
var/mob/living/L = target
if(L.stat != DEAD)
adjustHealth(-maxHealth * 0.1)
/mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target) /mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target)
var/dist = get_dist(src,the_target) for(var/datum/beam/B in vines)
Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine) if(B.target == the_target)
the_target.attack_animal(src) pull_vines()
ranged_cooldown = world.time + (ranged_cooldown_time * 0.5)
return
if(get_dist(src,the_target) > vine_grab_distance || vines.len == max_vines)
return
for(var/turf/T in getline(src,target))
if (T.density)
return
for(var/obj/O in T)
if(O.density)
return
var/datum/beam/newVine = Beam(the_target, "vine", time=INFINITY, maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine)
RegisterSignal(newVine, COMSIG_PARENT_QDELETING, .proc/remove_vine, newVine)
vines += newVine
if(isliving(the_target))
var/mob/living/L = the_target
L.Paralyze(20)
ranged_cooldown = world.time + ranged_cooldown_time
/mob/living/simple_animal/hostile/venus_human_trap/CanAttack(atom/the_target) /mob/living/simple_animal/hostile/venus_human_trap/Login()
. = ..()
to_chat(src, "<span class='boldwarning'>You a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!</span>")
/mob/living/simple_animal/hostile/venus_human_trap/attack_ghost(mob/user)
. = ..() . = ..()
if(.) if(.)
if(the_target in grasping) return
return 0 humanize_plant(user)
/**
* Sets a ghost to control the plant if the plant is eligible
*
* Asks the interacting ghost if they would like to control the plant.
* If they answer yes, and another ghost hasn't taken control, sets the ghost to control the plant.
* Arguments:
* * mob/user - The ghost to possibly control the plant
*/
/mob/living/simple_animal/hostile/venus_human_trap/proc/humanize_plant(mob/user)
if(key || !playable_plant || stat)
return
var/plant_ask = alert("Become a venus human trap?", "Are you reverse vegan?", "Yes", "No")
if(plant_ask == "No" || QDELETED(src))
return
if(key)
to_chat(user, "<span class='warning'>Someone else already took this plant!</span>")
return
key = user.key
log_game("[key_name(src)] took control of [name].")
/**
* Manages how the vines should affect the things they're attached to.
*
* Pulls all movable targets of the vines closer to the plant
* If the target is on the same tile as the plant, destroy the vine
* Removes any QDELETED vines from the vines list.
*/
/mob/living/simple_animal/hostile/venus_human_trap/proc/pull_vines()
for(var/datum/beam/B in vines)
if(istype(B.target, /atom/movable))
var/atom/movable/AM = B.target
if(!AM.anchored)
step(AM,get_dir(AM,src))
if(get_dist(src,B.target) == 0)
B.End()
/**
* Removes a vine from the list.
*
* Removes the vine from our list.
* Called specifically when the vine is about to be destroyed, so we don't have any null references.
* Arguments:
* * datum/beam/vine - The vine to be removed from the list.
*/
mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force)
vines -= vine

View File

@@ -0,0 +1,22 @@
// The language of the vinebings. Yes, it's a shameless ripoff of elvish.
/datum/language/sylvan
name = "Sylvan"
desc = "A complicated, ancient language spoken by vine like beings."
speech_verb = "expresses"
ask_verb = "inquires"
exclaim_verb = "declares"
key = "h"
space_chance = 20
syllables = list(
"fii", "sii", "rii", "rel", "maa", "ala", "san", "tol", "tok", "dia", "eres",
"fal", "tis", "bis", "qel", "aras", "losk", "rasa", "eob", "hil", "tanl", "aere",
"fer", "bal", "pii", "dala", "ban", "foe", "doa", "cii", "uis", "mel", "wex",
"incas", "int", "elc", "ent", "aws", "qip", "nas", "vil", "jens", "dila", "fa",
"la", "re", "do", "ji", "ae", "so", "qe", "ce", "na", "mo", "ha", "yu"
)
icon_state = "plant"
default_priority = 90
/datum/language_holder/venus
languages = list(/datum/language/common, /datum/language/sylvan, /datum/language/machine)
only_speaks_language = /datum/language/sylvan

View File

@@ -3303,6 +3303,7 @@
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm" #include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" #include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" #include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
#include "modular_citadel\code\modules\language\sylvan.dm"
#include "modular_citadel\code\modules\mentor\dementor.dm" #include "modular_citadel\code\modules\mentor\dementor.dm"
#include "modular_citadel\code\modules\mentor\follow.dm" #include "modular_citadel\code\modules\mentor\follow.dm"
#include "modular_citadel\code\modules\mentor\mentor.dm" #include "modular_citadel\code\modules\mentor\mentor.dm"