From 77cf4285f4dde6e0ce99b4ae4b1eeb3613d0e57b Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 20 Jan 2022 04:41:23 +0100 Subject: [PATCH] Spacevine text + colors (#10568) Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com> --- code/modules/events/spacevine.dm | 356 ++++++++++++++++--------------- 1 file changed, 183 insertions(+), 173 deletions(-) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 65b7a4cbb44..4160bf681e4 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -1,6 +1,6 @@ /* SKYRAT EDIT REMOVAL - MOVED TO MODULAR /datum/round_event_control/spacevine - name = "Spacevine" + name = "Space Vines" typepath = /datum/round_event/spacevine weight = 15 max_occurrences = 3 @@ -12,18 +12,18 @@ /datum/round_event/spacevine/start() var/list/turfs = list() //list of all the empty floor turfs in the hallway areas - var/obj/structure/spacevine/SV = new() + var/obj/structure/spacevine/vine = new() - for(var/area/hallway/A in world) - for(var/turf/F in A) - if(F.Enter(SV)) - turfs += F + for(var/area/hallway/area in world) + for(var/turf/floor in area) + if(floor.Enter(vine)) + turfs += floor - qdel(SV) + qdel(vine) - if(turfs.len) //Pick a turf to spawn at if we can - var/turf/T = pick(turfs) - new /datum/spacevine_controller(T, list(pick(subtypesof(/datum/spacevine_mutation))), rand(10,100), rand(1,6), src) //spawn a controller at turf with randomized stats and a single random mutation + if(length(turfs)) //Pick a turf to spawn at if we can + var/turf/floor = pick(turfs) + new /datum/spacevine_controller(floor, list(pick(subtypesof(/datum/spacevine_mutation))), rand(10,100), rand(1,6), src) //spawn a controller at turf with randomized stats and a single random mutation /datum/spacevine_mutation @@ -51,13 +51,13 @@ /datum/spacevine_mutation/proc/on_death(obj/structure/spacevine/holder) return -/datum/spacevine_mutation/proc/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage) +/datum/spacevine_mutation/proc/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/item, expected_damage) . = expected_damage /datum/spacevine_mutation/proc/on_cross(obj/structure/spacevine/holder, mob/crosser) return -/datum/spacevine_mutation/proc/on_chem(obj/structure/spacevine/holder, datum/reagent/R) +/datum/spacevine_mutation/proc/on_chem(obj/structure/spacevine/holder, datum/reagent/chem) return /datum/spacevine_mutation/proc/on_eat(obj/structure/spacevine/holder, mob/living/eater) @@ -72,12 +72,12 @@ /datum/spacevine_mutation/proc/on_explosion(severity, target, obj/structure/spacevine/holder) return -/datum/spacevine_mutation/aggressive_spread/proc/aggrospread_act(obj/structure/spacevine/S, mob/living/M) +/datum/spacevine_mutation/aggressive_spread/proc/aggrospread_act(obj/structure/spacevine/vine, mob/living/M) return /datum/spacevine_mutation/light - name = "light" - hue = "#ffff00" + name = "Light" + hue = "#B2EA70" quality = POSITIVE severity = 4 @@ -86,8 +86,8 @@ holder.set_light(severity, 0.3) /datum/spacevine_mutation/toxicity - name = "toxic" - hue = "#ff00ff" + name = "Toxic" + hue = "#9B3675" severity = 10 quality = NEGATIVE @@ -102,9 +102,9 @@ if(!isvineimmune(eater)) eater.adjustToxLoss(5) -/datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!! - name = "explosive" - hue = "#ff0000" +/datum/spacevine_mutation/explosive // JC IT'S A BOMB + name = "Explosive" + hue = "#D83A56" quality = NEGATIVE severity = 2 @@ -115,26 +115,26 @@ . = 1 QDEL_IN(holder, 5) -/datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/I) +/datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/item) explosion(holder, light_impact_range = severity, adminlog = FALSE) /datum/spacevine_mutation/fire_proof - name = "fire proof" - hue = "#ff8888" + name = "Fire proof" + hue = "#FF616D" quality = MINOR_NEGATIVE /datum/spacevine_mutation/fire_proof/process_temperature(obj/structure/spacevine/holder, temp, volume) return 1 -/datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage) - if(I && I.damtype == BURN) +/datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/item, expected_damage) + if(item && item.damtype == BURN) . = 0 else . = expected_damage /datum/spacevine_mutation/vine_eating - name = "vine eating" - hue = "#ff7700" + name = "Vine eating" + hue = "#F4A442" quality = MINOR_NEGATIVE /// Destroys any vine on spread-target's tile. The checks for if this should be done are in the spread() proc. @@ -143,58 +143,58 @@ qdel(prey) /datum/spacevine_mutation/aggressive_spread //very OP, but im out of other ideas currently - name = "aggressive spreading" - hue = "#333333" + name = "Aggressive spreading" + hue = "#316b2f" severity = 3 quality = NEGATIVE /// Checks mobs on spread-target's turf to see if they should be hit by a damaging proc or not. -/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/target, mob/living) - for(var/mob/living/M in target) - if(!isvineimmune(M) && M.stat != DEAD) // Don't kill immune creatures. Dead check to prevent log spam when a corpse is trapped between vine eaters. - aggrospread_act(holder, M) +/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/turf, mob/living) + for(var/mob/living/victim in turf) + if(!isvineimmune(victim) && victim.stat != DEAD) // Don't kill immune creatures. Dead check to prevent log spam when a corpse is trapped between vine eaters. + aggrospread_act(holder, victim) /// What happens if an aggr spreading vine buckles a mob. /datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled) aggrospread_act(holder, buckled) /// Hurts mobs. To be used when a vine with aggressive spread mutation spreads into the mob's tile or buckles them. -/datum/spacevine_mutation/aggressive_spread/aggrospread_act(obj/structure/spacevine/S, mob/living/M) - var/mob/living/carbon/C = M //If the mob is carbon then it now also exists as a "C", and not just an M. - if(istype(C)) //If the mob (M) is a carbon subtype (C) we move on to pick a more complex damage proc, with damage zones, wounds and armor mitigation. +/datum/spacevine_mutation/aggressive_spread/aggrospread_act(obj/structure/spacevine/vine, mob/living/living_mob) + var/mob/living/carbon/victim = living_mob //If the mob is carbon then it now also exists as a victim, and not just an living mob. + if(istype(victim)) //If the mob (M) is a carbon subtype (C) we move on to pick a more complex damage proc, with damage zones, wounds and armor mitigation. var/obj/item/bodypart/limb = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_CHEST) //Picks a random bodypart. Does not runtime even if it's missing. - var/armor = C.run_armor_check(limb, MELEE, null, null) //armor = the armor value of that randomly chosen bodypart. Nulls to not print a message, because it would still print on pierce. - var/datum/spacevine_mutation/thorns/T = locate() in S.mutations //Searches for the thorns mutation in the "mutations"-list inside obj/structure/spacevine, and defines T if it finds it. - if(T && (prob(40))) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. - C.apply_damage(50, BRUTE, def_zone = limb, wound_bonus = rand(-20,10), sharpness = SHARP_POINTY) //This one gets a bit lower damage because it ignores armor. - C.Stun(1 SECONDS) //Stopped in place for a moment. - playsound(M, 'sound/weapons/pierce.ogg', 50, TRUE, -1) - M.visible_message(span_danger("[M] is nailed by a sharp thorn!"), \ + var/armor = victim.run_armor_check(limb, MELEE, null, null) //armor = the armor value of that randomly chosen bodypart. Nulls to not print a message, because it would still print on pierce. + var/datum/spacevine_mutation/thorns/thorn = locate() in vine.mutations //Searches for the thorns mutation in the "mutations"-list inside obj/structure/spacevine, and defines T if it finds it. + if(thorn && (prob(40))) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. + victim.apply_damage(50, BRUTE, def_zone = limb, wound_bonus = rand(-20,10), sharpness = SHARP_POINTY) //This one gets a bit lower damage because it ignores armor. + victim.Stun(1 SECONDS) //Stopped in place for a moment. + playsound(living_mob, 'sound/weapons/pierce.ogg', 50, TRUE, -1) + living_mob.visible_message(span_danger("[living_mob] is nailed by a sharp thorn!"), \ span_userdanger("You are nailed by a sharp thorn!")) - log_combat(S, M, "aggressively pierced") //"Aggressively" for easy ctrl+F'ing in the attack logs. + log_combat(vine, living_mob, "aggressively pierced") //"Aggressively" for easy ctrl+F'ing in the attack logs. else if(prob(80)) - C.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_EDGED) - C.Knockdown(2 SECONDS) - playsound(M, 'sound/weapons/whip.ogg', 50, TRUE, -1) - M.visible_message(span_danger("[M] is lacerated by an outburst of vines!"), \ + victim.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_EDGED) + victim.Knockdown(2 SECONDS) + playsound(victim, 'sound/weapons/whip.ogg', 50, TRUE, -1) + living_mob.visible_message(span_danger("[living_mob] is lacerated by an outburst of vines!"), \ span_userdanger("You are lacerated by an outburst of vines!")) - log_combat(S, M, "aggressively lacerated") + log_combat(vine, living_mob, "aggressively lacerated") else - C.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = NONE) - C.Knockdown(3 SECONDS) - var/atom/throw_target = get_edge_target_turf(C, get_dir(S, get_step_away(C, S))) - C.throw_at(throw_target, 3, 6) - playsound(M, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - M.visible_message(span_danger("[M] is smashed by a large vine!"), \ + victim.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = NONE) + victim.Knockdown(3 SECONDS) + var/atom/throw_target = get_edge_target_turf(living_mob, get_dir(vine, get_step_away(living_mob, vine))) + victim.throw_at(throw_target, 3, 6) + playsound(victim, 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + living_mob.visible_message(span_danger("[living_mob] is smashed by a large vine!"), \ span_userdanger("You are smashed by a large vine!")) - log_combat(S, M, "aggressively smashed") + log_combat(vine, living_mob, "aggressively smashed") else //Living but not a carbon? Maybe a silicon? Can't be wounded so have a big chunk of simple bruteloss with no special effects. They can be entangled. - M.adjustBruteLoss(75) - playsound(M, 'sound/weapons/whip.ogg', 50, TRUE, -1) - M.visible_message(span_danger("[M] is brutally threshed by [S]!"), \ - span_userdanger("You are brutally threshed by [S]!")) - log_combat(S, M, "aggressively spread into") //You aren't being attacked by the vines. You just happen to stand in their way. + living_mob.adjustBruteLoss(75) + playsound(living_mob, 'sound/weapons/whip.ogg', 50, TRUE, -1) + living_mob.visible_message(span_danger("[living_mob] is brutally threshed by [vine]!"), \ + span_userdanger("You are brutally threshed by [vine]!")) + log_combat(vine, living_mob, "aggressively spread into") //You aren't being attacked by the vines. You just happen to stand in their way. /datum/spacevine_mutation/transparency name = "transparent" @@ -206,86 +206,86 @@ holder.alpha = 125 /datum/spacevine_mutation/oxy_eater - name = "oxygen consuming" - hue = "#ffff88" + name = "Oxygen consuming" + hue = "#28B5B5" severity = 3 quality = NEGATIVE /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 - if(!GM.gases[/datum/gas/oxygen]) + var/turf/open/floor/turf = holder.loc + if(istype(turf)) + var/datum/gas_mixture/gas_mix = turf.air + if(!gas_mix.gases[/datum/gas/oxygen]) return - GM.gases[/datum/gas/oxygen][MOLES] = max(GM.gases[/datum/gas/oxygen][MOLES] - severity * holder.energy, 0) - GM.garbage_collect() + gas_mix.gases[/datum/gas/oxygen][MOLES] = max(gas_mix.gases[/datum/gas/oxygen][MOLES] - severity * holder.energy, 0) + gas_mix.garbage_collect() /datum/spacevine_mutation/nitro_eater - name = "nitrogen consuming" - hue = "#8888ff" + name = "Nitrogen consuming" + hue = "#FF7B54" severity = 3 quality = NEGATIVE /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 - if(!GM.gases[/datum/gas/nitrogen]) + var/turf/open/floor/turf = holder.loc + if(istype(turf)) + var/datum/gas_mixture/gas_mix = turf.air + if(!gas_mix.gases[/datum/gas/nitrogen]) return - GM.gases[/datum/gas/nitrogen][MOLES] = max(GM.gases[/datum/gas/nitrogen][MOLES] - severity * holder.energy, 0) - GM.garbage_collect() + gas_mix.gases[/datum/gas/nitrogen][MOLES] = max(gas_mix.gases[/datum/gas/nitrogen][MOLES] - severity * holder.energy, 0) + gas_mix.garbage_collect() /datum/spacevine_mutation/carbondioxide_eater name = "CO2 consuming" - hue = "#00ffff" + hue = "#798777" severity = 3 quality = POSITIVE /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 - if(!GM.gases[/datum/gas/carbon_dioxide]) + var/turf/open/floor/turf = holder.loc + if(istype(turf)) + var/datum/gas_mixture/gas_mix = turf.air + if(!gas_mix.gases[/datum/gas/carbon_dioxide]) return - GM.gases[/datum/gas/carbon_dioxide][MOLES] = max(GM.gases[/datum/gas/carbon_dioxide][MOLES] - severity * holder.energy, 0) - GM.garbage_collect() + gas_mix.gases[/datum/gas/carbon_dioxide][MOLES] = max(gas_mix.gases[/datum/gas/carbon_dioxide][MOLES] - severity * holder.energy, 0) + gas_mix.garbage_collect() /datum/spacevine_mutation/plasma_eater - name = "plasma consuming" - hue = "#ffbbff" + name = "Plasma consuming" + hue = "#9074b6" severity = 3 quality = POSITIVE /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 - if(!GM.gases[/datum/gas/plasma]) + var/turf/open/floor/turf = holder.loc + if(istype(turf)) + var/datum/gas_mixture/gas_mix = turf.air + if(!gas_mix.gases[/datum/gas/plasma]) return - GM.gases[/datum/gas/plasma][MOLES] = max(GM.gases[/datum/gas/plasma][MOLES] - severity * holder.energy, 0) - GM.garbage_collect() + gas_mix.gases[/datum/gas/plasma][MOLES] = max(gas_mix.gases[/datum/gas/plasma][MOLES] - severity * holder.energy, 0) + gas_mix.garbage_collect() /datum/spacevine_mutation/thorns - name = "thorny" - hue = "#666666" + name = "Thorny" + hue = "#9ECCA4" severity = 10 quality = NEGATIVE /datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser) if(prob(severity) && istype(crosser) && !isvineimmune(crosser)) - var/mob/living/M = crosser - M.adjustBruteLoss(5) - to_chat(M, span_alert("You cut yourself on the thorny vines.")) + var/mob/living/victim = crosser + victim.adjustBruteLoss(5) + to_chat(victim, span_danger("You cut yourself on the thorny vines.")) -/datum/spacevine_mutation/thorns/on_hit(obj/structure/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/item, expected_damage) if(prob(severity) && istype(hitter) && !isvineimmune(hitter)) - var/mob/living/M = hitter - M.adjustBruteLoss(5) - to_chat(M, span_alert("You cut yourself on the thorny vines.")) + var/mob/living/victim = hitter + victim.adjustBruteLoss(5) + to_chat(victim, span_danger("You cut yourself on the thorny vines.")) . = expected_damage /datum/spacevine_mutation/woodening - name = "hardened" + name = "Hardened" hue = "#997700" quality = NEGATIVE @@ -294,15 +294,15 @@ holder.set_density(TRUE) holder.modify_max_integrity(100) -/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage) - if(I?.get_sharpness()) +/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/item, expected_damage) + if(item?.get_sharpness()) . = expected_damage * 0.5 else . = expected_damage /datum/spacevine_mutation/flowering - name = "flowering" - hue = "#0A480D" + name = "Flowering" + hue = "#66DE93" quality = NEGATIVE severity = 10 @@ -314,10 +314,9 @@ if(prob(25)) holder.entangle(crosser) - // SPACE VINES (Note that this code is very similar to Biomass code) /obj/structure/spacevine - name = "space vines" + name = "space vine" desc = "An extremely expansionistic species of vine." icon = 'icons/effects/spacevines.dmi' icon_state = "Light1" @@ -329,6 +328,7 @@ max_integrity = 50 var/energy = 0 var/datum/spacevine_controller/master = null + /// List of mutations for a specific vine var/list/mutations = list() /obj/structure/spacevine/Initialize(mapload) @@ -342,19 +342,20 @@ /obj/structure/spacevine/examine(mob/user) . = ..() - var/text = "This one is a" - if(mutations.len) - for(var/A in mutations) - var/datum/spacevine_mutation/SM = A - text += " [SM.name]" - else - text += " normal" - text += " vine." + if(!length(mutations)) + . += "This vine has no mutations." + return + var/text = "This vine has the following mutations:\n" + for(var/datum/spacevine_mutation/mutation as anything in mutations) + if(mutation.name == "transparent") /// Transparent has no hue + text += "Transparent " + else + text += "[mutation.name] " . += text /obj/structure/spacevine/Destroy() - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_death(src) + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_death(src) if(master) master.VineDestroyed(src) mutations = list() @@ -363,31 +364,31 @@ unbuckle_all_mobs(force=1) return ..() -/obj/structure/spacevine/proc/on_chem_effect(datum/reagent/R) +/obj/structure/spacevine/proc/on_chem_effect(datum/reagent/chem) var/override = 0 - for(var/datum/spacevine_mutation/SM in mutations) - override += SM.on_chem(src, R) - if(!override && istype(R, /datum/reagent/toxin/plantbgone)) + for(var/datum/spacevine_mutation/mutation in mutations) + override += mutation.on_chem(src, chem) + if(!override && istype(chem, /datum/reagent/toxin/plantbgone)) if(prob(50)) qdel(src) /obj/structure/spacevine/proc/eat(mob/eater) var/override = 0 - for(var/datum/spacevine_mutation/SM in mutations) - override += SM.on_eat(src, eater) + for(var/datum/spacevine_mutation/mutation in mutations) + override += mutation.on_eat(src, eater) if(!override) qdel(src) -/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user) - var/damage_dealt = I.force - if(I.get_sharpness()) +/obj/structure/spacevine/attacked_by(obj/item/item, mob/living/user) + var/damage_dealt = item.force + if(item.get_sharpness()) damage_dealt *= 4 - if(I.damtype == BURN) + if(item.damtype == BURN) damage_dealt *= 4 - for(var/datum/spacevine_mutation/SM in mutations) - damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further - take_damage(damage_dealt, I.damtype, MELEE, 1) + for(var/datum/spacevine_mutation/mutation in mutations) + damage_dealt = mutation.on_hit(src, user, item, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further + take_damage(damage_dealt, item.damtype, MELEE, 1) /obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -399,23 +400,23 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) -/obj/structure/spacevine/proc/on_entered(datum/source, atom/movable/AM) +/obj/structure/spacevine/proc/on_entered(datum/source, atom/movable/movable) SIGNAL_HANDLER - if(!isliving(AM)) + if(!isliving(movable)) return - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_cross(src, AM) + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_cross(src, movable) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/spacevine/attack_hand(mob/user, list/modifiers) - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_hit(src, user) + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_hit(src, user) user_unbuckle_mob(user, user) . = ..() /obj/structure/spacevine/attack_paw(mob/living/user, list/modifiers) - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_hit(src, user) + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_hit(src, user) user_unbuckle_mob(user,user) /obj/structure/spacevine/attack_alien(mob/living/user, list/modifiers) @@ -477,17 +478,17 @@ for(var/datum/spacevine_mutation/mutation in muts) mutation.add_mutation_to_vinepiece(vine) if(parent) - SV.mutations |= parent.mutations + vine.mutations |= parent.mutations var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY] - SV.add_atom_colour(parentcolor, FIXED_COLOUR_PRIORITY) + vine.add_atom_colour(parentcolor, FIXED_COLOUR_PRIORITY) if(prob(mutativeness)) - var/datum/spacevine_mutation/random_mutate = pick(vine_mutations_list - SV.mutations) - random_mutate.add_mutation_to_vinepiece(SV) + var/datum/spacevine_mutation/random_mutate = pick(vine_mutations_list - vine.mutations) + random_mutate.add_mutation_to_vinepiece(vine) - for(var/datum/spacevine_mutation/SM in SV.mutations) - SM.on_birth(SV) - location.Entered(SV, null) - return SV + for(var/datum/spacevine_mutation/mutation in vine.mutations) + mutation.on_birth(vine) + location.Entered(vine, null) + return vine /datum/spacevine_controller/proc/VineDestroyed(obj/structure/spacevine/vine) vine.master = null @@ -502,6 +503,7 @@ seed.set_production(11 - (spread_cap / initial(spread_cap)) * 5) //Reverts spread_cap formula so resulting seed gets original production stat or equivalent back. qdel(src) +/// Life cycle of a space vine /datum/spacevine_controller/process(delta_time) var/vine_count = length(vines) if(!vine_count) @@ -531,6 +533,7 @@ //So we shift the queue a bit growth_queue += queue_end +/// Updates the icon as the space vine grows /obj/structure/spacevine/proc/grow() if(!energy) src.icon_state = pick("Med1", "Med2", "Med3") @@ -540,44 +543,46 @@ src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") energy = 2 - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_grow(src) + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_grow(src) +/// Buckles mobs trying to pass through it /obj/structure/spacevine/proc/entangle_mob() if(!has_buckled_mobs() && prob(25)) - for(var/mob/living/V in src.loc) - entangle(V) + for(var/mob/living/victim in src.loc) + entangle(victim) if(has_buckled_mobs()) break //only capture one mob at a time -/obj/structure/spacevine/proc/entangle(mob/living/V) - if(!V || isvineimmune(V)) +/obj/structure/spacevine/proc/entangle(mob/living/victim) + if(!victim || isvineimmune(victim)) return - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_buckle(src, V) - if((V.stat != DEAD) && (V.buckled != src)) //not dead or captured - to_chat(V, span_danger("The vines [pick("wind", "tangle", "tighten")] around you!")) - buckle_mob(V, 1) + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_buckle(src, victim) + if((victim.stat != DEAD) && (victim.buckled != src)) //not dead or captured + to_chat(victim, span_userdanger("The vines [pick("wind", "tangle", "tighten")] around you!")) + buckle_mob(victim, 1) /// Finds a target tile to spread to. If checks pass it will spread to it and also proc on_spread on target. /obj/structure/spacevine/proc/spread() var/direction = pick(GLOB.cardinals) - var/turf/stepturf = get_step(src,direction) + var/turf/stepturf = get_step(src, direction) if(!isspaceturf(stepturf) && stepturf.Enter(src)) var/obj/structure/spacevine/spot_taken = locate() in stepturf //Locates any vine on target turf. Calls that vine "spot_taken". - var/datum/spacevine_mutation/vine_eating/E = locate() in mutations //Locates the vine eating trait in our own seed and calls it E. - if(!spot_taken || (E && (spot_taken && !spot_taken.mutations.Find(E)))) //Proceed if there isn't a vine on the target turf, OR we have vine eater AND target vine is from our seed and doesn't. Vines from other seeds are eaten regardless. + var/datum/spacevine_mutation/vine_eating/eating = locate() in mutations //Locates the vine eating trait in our own seed and calls it E. + if(!spot_taken || (eating && (spot_taken && !spot_taken.mutations?.Find(eating)))) //Proceed if there isn't a vine on the target turf, OR we have vine eater AND target vine is from our seed and doesn't. Vines from other seeds are eaten regardless. if(master) - for(var/datum/spacevine_mutation/SM in mutations) - SM.on_spread(src, stepturf) //Only do the on_spread proc if it actually spreads. + for(var/datum/spacevine_mutation/mutation in mutations) + mutation.on_spread(src, stepturf) //Only do the on_spread proc if it actually spreads. stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen master.spawn_spacevine_piece(stepturf, src) +/// Destroying an explosive vine sets off a chain reaction /obj/structure/spacevine/ex_act(severity, target) - var/i - for(var/datum/spacevine_mutation/SM in mutations) - i += SM.on_explosion(severity, target, src) - if(!i && prob(34 * severity)) + var/index + for(var/datum/spacevine_mutation/mutation in mutations) + index += mutation.on_explosion(severity, target, src) + if(!index && prob(34 * severity)) qdel(src) /obj/structure/spacevine/should_atmos_process(datum/gas_mixture/air, exposed_temperature) @@ -585,8 +590,8 @@ /obj/structure/spacevine/atmos_expose(datum/gas_mixture/air, exposed_temperature) var/volume = air.return_volume() - for(var/datum/spacevine_mutation/SM in mutations) - if(SM.process_temperature(src, exposed_temperature, volume)) //If it's ever true we're safe + for(var/datum/spacevine_mutation/mutation in mutations) + if(mutation.process_temperature(src, exposed_temperature, volume)) //If it's ever true we're safe return qdel(src) @@ -595,10 +600,15 @@ if(isvineimmune(mover)) return TRUE -/proc/isvineimmune(atom/A) - if(isliving(A)) - var/mob/living/M = A - if(("vines" in M.faction) || ("plants" in M.faction)) +/** + * Used to determine whether the mob is immune to actions by the vine. + * Use cases: Stops vine from attacking itself, other plants. + */ +/proc/isvineimmune(atom/target) + if(isliving(target)) + var/mob/living/victim = target + if(("vines" in victim.faction) || ("plants" in victim.faction)) return TRUE return FALSE + */