From bd0a0334f84f98955c873f3aadda648b0bf3cad4 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 10:21:55 +0100 Subject: [PATCH 001/113] start of coding bloodling --- code/__DEFINES/role_preferences.dm | 1 + .../antagonists/bloodling/bloodling.dm | 41 +++++++++++++++++++ .../antagonists/bloodling/objectives.dm | 10 +++++ tgstation.dme | 2 + 4 files changed, 54 insertions(+) create mode 100644 monkestation/code/modules/antagonists/bloodling/bloodling.dm create mode 100644 monkestation/code/modules/antagonists/bloodling/objectives.dm diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 64a4ccdc0772..36d5b0a12266 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -17,6 +17,7 @@ #define ROLE_TRAITOR "Traitor" #define ROLE_WIZARD "Wizard" #define ROLE_CLOCK_CULTIST "Clock Cultist" //monkestation edit +#define ROLE_BLOODLING "Bloodling" // monkestation edit // Midround roles #define ROLE_ABDUCTOR "Abductor" diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm new file mode 100644 index 000000000000..b5aee8da46e5 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -0,0 +1,41 @@ +/datum/antagonist/bloodling + name = "\improper Bloodling" + roundend_category = "changelings" + antagpanel_category = "Bloodling" + job_rank = ROLE_BLOODLING + antag_moodlet = /datum/mood_event/focused + antag_hud_name = "changeling" + hijack_speed = 0.5 + suicide_cry = "CONSUME!! CLAIM!! THERE WILL BE ANOTHER!!" + + // The amount of biomass our bloodling has + var/biomass = 0 + // The maximum amount of biomass a bloodling can gain + var/biomass_max = 500 + // If this bloodling is ascended or not + var/is_ascended = FALSE + // Possible names for our bloodling + var/static/list/bloodling_names = list( + "biohazard", + "fleshy mass", + "spiny mess", + "blob of flesh", + "malign blood", + "carrion", + ) + +/datum/antagonist/bloodling/on_gain() + generate_name() + create_innate_actions() + forge_objectives() + +/datum/antagonist/bloodling/proc/generate_name() + var/name = "bloodling" + if(!lenght(bloodling_names)) + return + name = [pick_n_take(bloodling_names)] [rand(1,999)] + +/datum/antagonist/bloodling/forge_objectives() + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = owner + objectives += maroon_objective diff --git a/monkestation/code/modules/antagonists/bloodling/objectives.dm b/monkestation/code/modules/antagonists/bloodling/objectives.dm new file mode 100644 index 000000000000..1de87d3719eb --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/objectives.dm @@ -0,0 +1,10 @@ +/datum/objective/bloodling_ascend + name = "ascend" + martyr_compatible = TRUE + admin_grantable = FALSE + explanation_text = "Ascend as the ultimate being" + +/datum/objective/maroon/check_completion() + if (!owner.antag_datums.bloodling.) + return FALSE + return TRUE diff --git a/tgstation.dme b/tgstation.dme index ba47fbbb9182..208d8ad62de7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5706,6 +5706,8 @@ #include "monkestation\code\modules\aesthetics\objects\windows.dm" #include "monkestation\code\modules\aesthetics\subsystem\coloring.dm" #include "monkestation\code\modules\aesthetics\walls\iron.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" +#include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" #include "monkestation\code\modules\antagonists\clock_cult\dynamic_ruleset.dm" #include "monkestation\code\modules\antagonists\clock_cult\globals.dm" From 24c9033bac251544bf9e4a3067e99f824dfe1e21 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:10:13 +0100 Subject: [PATCH 002/113] objectives, working on action grants --- .../modules/antagonists/bloodling/bloodling.dm | 18 ++++++++++++++---- .../antagonists/bloodling/objectives.dm | 3 ++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index b5aee8da46e5..44febec627b7 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -23,19 +23,29 @@ "malign blood", "carrion", ) + var/static/list/bloodling_starting_abilities = list( + /datum/action/cooldown/alien/hide, + ) /datum/antagonist/bloodling/on_gain() generate_name() create_innate_actions() forge_objectives() + owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are a horrific blob of flesh who can manifest a million tongues. + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_alert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + return ..() /datum/antagonist/bloodling/proc/generate_name() var/name = "bloodling" if(!lenght(bloodling_names)) return - name = [pick_n_take(bloodling_names)] [rand(1,999)] + name = "[pick_n_take(bloodling_names)] [rand(1,999)]" /datum/antagonist/bloodling/forge_objectives() - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - objectives += maroon_objective + var/datum/objective/bloodling_ascend/ascend_objective = new + ascend_objective.owner = owner + objectives += ascend_objective + +/datum/antagonist/bloodling/proc/create_innate_actions() + for var/datum/action/cooldown/spell/created_action in bloodling_starting_abilities: + created_action.Grant(user) diff --git a/monkestation/code/modules/antagonists/bloodling/objectives.dm b/monkestation/code/modules/antagonists/bloodling/objectives.dm index 1de87d3719eb..7662b2e28aaf 100644 --- a/monkestation/code/modules/antagonists/bloodling/objectives.dm +++ b/monkestation/code/modules/antagonists/bloodling/objectives.dm @@ -5,6 +5,7 @@ explanation_text = "Ascend as the ultimate being" /datum/objective/maroon/check_completion() - if (!owner.antag_datums.bloodling.) + var/datum/antagonist/bloodling/bloodling = owner.mind.has_antag_datum(/datum/antagonist/bloodling,TRUE) + if (!bloodling.is_ascended) return FALSE return TRUE From 9425a205a06d71917a256168edc92656469da0c7 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:14:51 +0100 Subject: [PATCH 003/113] Esl moment --- .../code/modules/antagonists/bloodling/bloodling.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index 44febec627b7..acc758d88606 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -37,7 +37,7 @@ /datum/antagonist/bloodling/proc/generate_name() var/name = "bloodling" - if(!lenght(bloodling_names)) + if(!length(bloodling_names)) return name = "[pick_n_take(bloodling_names)] [rand(1,999)]" @@ -47,5 +47,7 @@ objectives += ascend_objective /datum/antagonist/bloodling/proc/create_innate_actions() + var/mob/living/our_mob = owner.current for var/datum/action/cooldown/spell/created_action in bloodling_starting_abilities: - created_action.Grant(user) + created_action new + created_action.Grant(our_mob) From 31641df304091bc243175c53eff100e4e4f4ccaa Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:47:07 +0100 Subject: [PATCH 004/113] work on the abilities framework --- monkestation/code/__DEFINES/antagonists.dm | 5 +++ .../bloodling/abilities/enhanced_vision.dm | 0 .../antagonists/bloodling/abilities/hide.dm | 23 +++++++++++++ .../antagonists/bloodling/bloodling.dm | 12 ++++--- .../bloodling/bloodling_abilities.dm | 34 +++++++++++++++++++ .../antagonists/bloodling/objectives.dm | 2 +- tgstation.dme | 3 ++ 7 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 monkestation/code/__DEFINES/antagonists.dm create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/hide.dm create mode 100644 monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm diff --git a/monkestation/code/__DEFINES/antagonists.dm b/monkestation/code/__DEFINES/antagonists.dm new file mode 100644 index 000000000000..b33b5e4af344 --- /dev/null +++ b/monkestation/code/__DEFINES/antagonists.dm @@ -0,0 +1,5 @@ +/// If the given mob is a bloodling +#define IS_BLOODLING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/bloodling)) + +/// Antagonist panel groups +#define ANTAG_GROUP_BLOODLING "Bloodling" diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm b/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm new file mode 100644 index 000000000000..e7f3ea535020 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm @@ -0,0 +1,23 @@ +/datum/action/cooldown/bloodling/hide + name = "Hide" + desc = "Allows you to hide beneath tables and certain objects." + button_icon_state = "alien_hide" + /// The layer we are on while hiding + var/hide_layer = ABOVE_NORMAL_TURF_LAYER + +/datum/action/cooldown/bloodling/hide/Activate(atom/target) + if(owner.layer == hide_layer) + owner.layer = initial(owner.layer) + owner.visible_message( + span_notice("[owner] slowly peeks up from the ground..."), + span_changeling("You stop hiding."), + ) + + else + owner.layer = hide_layer + owner.visible_message( + span_name("[owner] scurries to the ground!"), + span_changeling("You are now hiding."), + ) + + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index acc758d88606..98304a493072 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -1,7 +1,7 @@ /datum/antagonist/bloodling name = "\improper Bloodling" - roundend_category = "changelings" - antagpanel_category = "Bloodling" + roundend_category = "Bloodlings" + antagpanel_category = ANTAG_GROUP_BLOODLING job_rank = ROLE_BLOODLING antag_moodlet = /datum/mood_event/focused antag_hud_name = "changeling" @@ -24,7 +24,7 @@ "carrion", ) var/static/list/bloodling_starting_abilities = list( - /datum/action/cooldown/alien/hide, + /datum/action/cooldown/bloodling/hide, ) /datum/antagonist/bloodling/on_gain() @@ -48,6 +48,8 @@ /datum/antagonist/bloodling/proc/create_innate_actions() var/mob/living/our_mob = owner.current - for var/datum/action/cooldown/spell/created_action in bloodling_starting_abilities: - created_action new + // loops through our actions and adds them + for var/datum/action/cooldown/created_action in bloodling_starting_abilities: + if (!created_action) + new created_action () created_action.Grant(our_mob) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm new file mode 100644 index 000000000000..8f214268cd80 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -0,0 +1,34 @@ +/datum/action/cooldown/bloodling + name = "debug" + desc = "Yell at coders if you see this" + // The biomass cost of the ability + var/biomass_cost = 0 + +/datum/action/cooldown/bloodling/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + var/datum/antagonist/bloodling/bloodling = IS_BLOODLING(owner) + if(!bloodling) + return FALSE + if(bloodling.biomass < biomass_cost) + return FALSE + return TRUE + +/datum/action/cooldown/bloodling/PreActivate(atom/target) + // Parent calls Activate(), so if parent returns TRUE, + // it means the activation happened successfuly by this point + . = ..() + if(!.) + return FALSE + // Since bloodlings evolve it may result in them or their abilities going away + // so we can just return true here + if(QDELETED(src) || QDELETED(owner)) + return TRUE + + var/datum/antagonist/bloodling/bloodling = IS_BLOODLING(owner) + bloodling.biomass -= biomass_cost + if(click_to_activate && bloodling.biomass < biomass_cost) + unset_click_ability(owner, refund_cooldown = FALSE) + + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/objectives.dm b/monkestation/code/modules/antagonists/bloodling/objectives.dm index 7662b2e28aaf..6ed76acb5185 100644 --- a/monkestation/code/modules/antagonists/bloodling/objectives.dm +++ b/monkestation/code/modules/antagonists/bloodling/objectives.dm @@ -5,7 +5,7 @@ explanation_text = "Ascend as the ultimate being" /datum/objective/maroon/check_completion() - var/datum/antagonist/bloodling/bloodling = owner.mind.has_antag_datum(/datum/antagonist/bloodling,TRUE) + var/datum/antagonist/bloodling/bloodling = IS_BLOODLING(owner.current) if (!bloodling.is_ascended) return FALSE return TRUE diff --git a/tgstation.dme b/tgstation.dme index 208d8ad62de7..96fd84e5c416 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5597,6 +5597,7 @@ #include "interface\menu.dm" #include "interface\stylesheet.dm" #include "interface\skin.dmf" +#include "monkestation\code\__DEFINES\antagonists.dm" #include "monkestation\code\__DEFINES\projectile.dm" #include "monkestation\code\__HELPERS\_lists.dm" #include "monkestation\code\__HELPERS\anime.dm" @@ -5707,7 +5708,9 @@ #include "monkestation\code\modules\aesthetics\subsystem\coloring.dm" #include "monkestation\code\modules\aesthetics\walls\iron.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" #include "monkestation\code\modules\antagonists\clock_cult\dynamic_ruleset.dm" #include "monkestation\code\modules\antagonists\clock_cult\globals.dm" From 309d042b69bc67f421715d5f8e0ad0c2ec5b5f9e Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 15:04:52 +0100 Subject: [PATCH 005/113] enhanced vision wooooo --- .../bloodling/abilities/enhanced_vision.dm | 12 ++++++++++++ .../modules/antagonists/bloodling/bloodling_mob.dm | 0 tgstation.dme | 1 + 3 files changed, 13 insertions(+) create mode 100644 monkestation/code/modules/antagonists/bloodling/bloodling_mob.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm b/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm index e69de29bb2d1..602664b2a75f 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm @@ -0,0 +1,12 @@ +/datum/action/cooldown/bloodling/enhanced_vision + name = "Enhanced Vision" + desc = "Creates thermal sensing rods in our eyes, allowing our vision to see thermal signatures through most blocking objects" + button_icon_state = "augmented_eyesight" + +/datum/action/cooldown/bloodling/enhanced_vision/Activate(atom/target) + if(owner.sight = SEE_MOBS) + owner.sight -= SEE_MOBS + to_chat(owner, span_notice("We adjust our sight back to normal.")) + return TRUE + owner.sight += SEE_MOBS + to_chat(owner, span_notice("We adjust our sight to sense thermal imprints.")) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_mob.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tgstation.dme b/tgstation.dme index 96fd84e5c416..160a677a5ec7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5709,6 +5709,7 @@ #include "monkestation\code\modules\aesthetics\walls\iron.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" From cd889414c272cc345dbe017e7f8fdab97b25da98 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:12:51 +0100 Subject: [PATCH 006/113] it fucking compiles, we are so back --- code/__DEFINES/say.dm | 2 + code/datums/saymode.dm | 29 +++++++++++++ monkestation/code/__DEFINES/mobfactions.dm | 4 ++ .../bloodling/abilities/enhanced_vision.dm | 2 +- .../antagonists/bloodling/bloodling.dm | 15 +------ .../antagonists/bloodling/bloodling_mob.dm | 0 .../bloodling/mobs/bloodling_mob.dm | 42 +++++++++++++++++++ tgstation.dme | 4 +- 8 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 monkestation/code/__DEFINES/mobfactions.dm delete mode 100644 monkestation/code/modules/antagonists/bloodling/bloodling_mob.dm create mode 100644 monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index e71561defcdb..dceaddf047ec 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -60,6 +60,8 @@ #define MODE_CUSTOM_SAY_ERASE_INPUT "erase_input" +#define MODE_BLOODLING "bloodling" // monkestation edit + //Spans. Robot speech, italics, etc. Applied in compose_message(). #define SPAN_ROBOT "robot" #define SPAN_YELL "yell" diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 60d3bd594e2d..31337e4a78f0 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -110,3 +110,32 @@ return TRUE MF.send_message(span_changeling("[R.body.real_name]: [message]"), "mafia") return FALSE + +// Start of Monkestation edit +/datum/saymode/bloodling + key = "l" + mode = MODE_BLOODLING + +/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) + //we can send the message + if(!user.mind) + return FALSE + var/datum/antagonist/bloodling/bloodling_sender = user.mind.has_antag_datum(/datum/antagonist/bloodling) + if(!bloodling_sender) + return FALSE + + user.log_talk(message, LOG_SAY, tag="bloodling [user]") + var/msg = span_changeling("[user]: [message]") + + //the recipients can recieve the message + for(var/datum/antagonist/bloodling/reciever in GLOB.antagonists) + if(!reciever.owner) + continue + var/mob/living/ling_mob = reciever.owner.current + //removes types that override the presence of being changeling (for example, borged lings still can't hivemind chat) + to_chat(ling_mob, msg) + + for(var/mob/dead/ghost as anything in GLOB.dead_mob_list) + to_chat(ghost, "[FOLLOW_LINK(ghost, user)] [msg]") + return FALSE +// End of monkestation edits diff --git a/monkestation/code/__DEFINES/mobfactions.dm b/monkestation/code/__DEFINES/mobfactions.dm new file mode 100644 index 000000000000..01b00a157d28 --- /dev/null +++ b/monkestation/code/__DEFINES/mobfactions.dm @@ -0,0 +1,4 @@ +// Antagonist factions + +/// Bloodlings and their minions +#define FACTION_BLOODLING "bloodling" diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm b/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm index 602664b2a75f..1202d24d0efe 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm @@ -4,7 +4,7 @@ button_icon_state = "augmented_eyesight" /datum/action/cooldown/bloodling/enhanced_vision/Activate(atom/target) - if(owner.sight = SEE_MOBS) + if(owner.sight == SEE_MOBS) owner.sight -= SEE_MOBS to_chat(owner, span_notice("We adjust our sight back to normal.")) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index 98304a493072..62917b142db0 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -23,13 +23,9 @@ "malign blood", "carrion", ) - var/static/list/bloodling_starting_abilities = list( - /datum/action/cooldown/bloodling/hide, - ) /datum/antagonist/bloodling/on_gain() generate_name() - create_innate_actions() forge_objectives() owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are a horrific blob of flesh who can manifest a million tongues. owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_alert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) @@ -39,17 +35,10 @@ var/name = "bloodling" if(!length(bloodling_names)) return - name = "[pick_n_take(bloodling_names)] [rand(1,999)]" + name = "[pick(bloodling_names)] [rand(1,999)]" + owner.current.name = name /datum/antagonist/bloodling/forge_objectives() var/datum/objective/bloodling_ascend/ascend_objective = new ascend_objective.owner = owner objectives += ascend_objective - -/datum/antagonist/bloodling/proc/create_innate_actions() - var/mob/living/our_mob = owner.current - // loops through our actions and adds them - for var/datum/action/cooldown/created_action in bloodling_starting_abilities: - if (!created_action) - new created_action () - created_action.Grant(our_mob) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_mob.dm deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm new file mode 100644 index 000000000000..d9688f8d2a88 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -0,0 +1,42 @@ +/mob/living/basic/bloodling + name = "bloodling" + desc = "A disgusting mass of bone and flesh. It reaches out around it with fleshy tendrils." + icon = 'icons/mob/simple/arachnoid.dmi' + mob_biotypes = MOB_ORGANIC + speak_emote = list("spews") + butcher_results = list(/obj/item/food/meat/slab = 2) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "pushes aside" + response_disarm_simple = "push aside" + melee_attack_cooldown = CLICK_CD_MELEE + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, STAMINA = 1, OXY = 1) + basic_mob_flags = FLAMMABLE_MOB + status_flags = NONE + unsuitable_cold_damage = 1 + unsuitable_heat_damage = 1 + faction = list(FACTION_BLOODLING) + pass_flags = PASSTABLE + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 + health = 100 + maxHealth = 100 + speed = 5 + + /// The abilities the bloodling start with + var/static/list/abilities = list( + /datum/action/cooldown/bloodling/hide, + /datum/action/cooldown/bloodling/enhanced_vision, + ) + +/mob/living/basic/bloodling/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + for (var/datum/action/cooldown/created_action in abilities) + new created_action () + created_action.Grant(src) diff --git a/tgstation.dme b/tgstation.dme index 160a677a5ec7..83b3700b5ed9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5598,6 +5598,7 @@ #include "interface\stylesheet.dm" #include "interface\skin.dmf" #include "monkestation\code\__DEFINES\antagonists.dm" +#include "monkestation\code\__DEFINES\mobfactions.dm" #include "monkestation\code\__DEFINES\projectile.dm" #include "monkestation\code\__HELPERS\_lists.dm" #include "monkestation\code\__HELPERS\anime.dm" @@ -5709,9 +5710,10 @@ #include "monkestation\code\modules\aesthetics\walls\iron.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" -#include "monkestation\code\modules\antagonists\bloodling\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\enhanced_vision.dm" +#include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" #include "monkestation\code\modules\antagonists\clock_cult\dynamic_ruleset.dm" #include "monkestation\code\modules\antagonists\clock_cult\globals.dm" From b65ac2a7893a9490cfa3978927d237cb8f16e66e Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:24:50 +0100 Subject: [PATCH 007/113] bloodling have free thermals --- .../bloodling/abilities/enhanced_vision.dm | 12 ------------ .../antagonists/bloodling/mobs/bloodling_mob.dm | 2 +- tgstation.dme | 1 - 3 files changed, 1 insertion(+), 14 deletions(-) delete mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm b/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm deleted file mode 100644 index 1202d24d0efe..000000000000 --- a/monkestation/code/modules/antagonists/bloodling/abilities/enhanced_vision.dm +++ /dev/null @@ -1,12 +0,0 @@ -/datum/action/cooldown/bloodling/enhanced_vision - name = "Enhanced Vision" - desc = "Creates thermal sensing rods in our eyes, allowing our vision to see thermal signatures through most blocking objects" - button_icon_state = "augmented_eyesight" - -/datum/action/cooldown/bloodling/enhanced_vision/Activate(atom/target) - if(owner.sight == SEE_MOBS) - owner.sight -= SEE_MOBS - to_chat(owner, span_notice("We adjust our sight back to normal.")) - return TRUE - owner.sight += SEE_MOBS - to_chat(owner, span_notice("We adjust our sight to sense thermal imprints.")) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index d9688f8d2a88..9747c3ce2018 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -13,6 +13,7 @@ damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, STAMINA = 1, OXY = 1) basic_mob_flags = FLAMMABLE_MOB status_flags = NONE + sight = SEE_SELF|SEE_MOBS unsuitable_cold_damage = 1 unsuitable_heat_damage = 1 faction = list(FACTION_BLOODLING) @@ -31,7 +32,6 @@ /// The abilities the bloodling start with var/static/list/abilities = list( /datum/action/cooldown/bloodling/hide, - /datum/action/cooldown/bloodling/enhanced_vision, ) /mob/living/basic/bloodling/Initialize(mapload) diff --git a/tgstation.dme b/tgstation.dme index 83b3700b5ed9..46f542d780c5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5712,7 +5712,6 @@ #include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" -#include "monkestation\code\modules\antagonists\bloodling\abilities\enhanced_vision.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" #include "monkestation\code\modules\antagonists\clock_cult\dynamic_ruleset.dm" From 0c6dfe6704fb085709a4d33346eb73f25f7073e2 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 19:48:40 +0100 Subject: [PATCH 008/113] start of biomass absorption --- .../bloodling/abilities/absorb_biomass.dm | 13 +++++++++++++ .../code/modules/antagonists/bloodling/bloodling.dm | 4 ---- .../antagonists/bloodling/bloodling_abilities.dm | 7 +++---- .../antagonists/bloodling/mobs/bloodling_mob.dm | 6 +++++- tgstation.dme | 1 + 5 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm new file mode 100644 index 000000000000..c86190c5e719 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -0,0 +1,13 @@ +/datum/action/cooldown/bloodling/absorb + name = "Hide" + desc = "Allows you to hide beneath tables and certain objects." + button_icon_state = "alien_hide" + /// If we are currently absorbing + var/absorbing = FALSE + +/datum/action/cooldown/bloodling/absorb/Activate(atom/target) + for(var/mob/dead_mob in view(owner, 1)) + if(!dead_mob.stat == DEAD) + continue + dead_mob.gib() + if(dead_mob) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index 62917b142db0..2509023d0e9c 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -8,10 +8,6 @@ hijack_speed = 0.5 suicide_cry = "CONSUME!! CLAIM!! THERE WILL BE ANOTHER!!" - // The amount of biomass our bloodling has - var/biomass = 0 - // The maximum amount of biomass a bloodling can gain - var/biomass_max = 500 // If this bloodling is ascended or not var/is_ascended = FALSE // Possible names for our bloodling diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index 8f214268cd80..07b03d43c14c 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -11,7 +11,7 @@ var/datum/antagonist/bloodling/bloodling = IS_BLOODLING(owner) if(!bloodling) return FALSE - if(bloodling.biomass < biomass_cost) + if(owner.biomass < biomass_cost) return FALSE return TRUE @@ -26,9 +26,8 @@ if(QDELETED(src) || QDELETED(owner)) return TRUE - var/datum/antagonist/bloodling/bloodling = IS_BLOODLING(owner) - bloodling.biomass -= biomass_cost - if(click_to_activate && bloodling.biomass < biomass_cost) + owner.biomass -= biomass_cost + if(click_to_activate && owner.biomass < biomass_cost) unset_click_ability(owner, refund_cooldown = FALSE) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 9747c3ce2018..be910f76c7d9 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -20,7 +20,7 @@ pass_flags = PASSTABLE attack_verb_continuous = "bites" attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' + attack_sound = 'sound/effects/attackblob.ogg' attack_vis_effect = ATTACK_EFFECT_BITE lighting_cutoff_red = 22 lighting_cutoff_green = 5 @@ -33,6 +33,10 @@ var/static/list/abilities = list( /datum/action/cooldown/bloodling/hide, ) + // The amount of biomass our bloodling has + var/biomass = 0 + // The maximum amount of biomass a bloodling can gain + var/biomass_max = 500 /mob/living/basic/bloodling/Initialize(mapload) . = ..() diff --git a/tgstation.dme b/tgstation.dme index 46f542d780c5..4525fd1fb6fe 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5711,6 +5711,7 @@ #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" From cf2ca9f174d623f56808ed889ee2ed96aa742e78 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 21:57:21 +0100 Subject: [PATCH 009/113] NEEDS WORK [absorb ability] --- .../bloodling/abilities/absorb_biomass.dm | 58 +++++++++++++++++-- .../bloodling/bloodling_abilities.dm | 12 ++-- .../bloodling/mobs/bloodling_mob.dm | 22 +++++-- 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index c86190c5e719..9164ee6150ed 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -1,13 +1,61 @@ /datum/action/cooldown/bloodling/absorb - name = "Hide" + name = "Absorb Biomass" desc = "Allows you to hide beneath tables and certain objects." button_icon_state = "alien_hide" - /// If we are currently absorbing - var/absorbing = FALSE /datum/action/cooldown/bloodling/absorb/Activate(atom/target) - for(var/mob/dead_mob in view(owner, 1)) + var/mob/living/basic/bloodling/our_mob = owner + for(var/atom/atom in view(owner, 1)) + if(istype(atom, /obj/item/food/deadmouse)) + if(!do_after(owner, 5 SECONDS)) + break + our_mob.add_biomass(10) + qdel(atom) + break + var/mob/living/dead_mob = atom if(!dead_mob.stat == DEAD) continue + if(!do_after(owner, 10 SECONDS)) + break dead_mob.gib() - if(dead_mob) + our_mob.add_biomass(dead_mob.getMaxHealth() * 0.5) + break + +/datum/action/cooldown/bloodling/absorb + name = "Absorb Biomass" + desc = "Allows you to hide beneath tables and certain objects." + button_icon_state = "alien_hide" + +/datum/action/cooldown/bloodling/absorb/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_changeling("You prepare to claim a creatures biomass. Click a target to begin absorbing it!")) + +/datum/action/cooldown/bloodling/absorb/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + to_chat(on_who, span_changeling("You steady yourself. Now is not the time to claim biomass...")) + +/datum/action/cooldown/bloodling/absorb/PreActivate(atom/target) + if(get_dist(owner, target) > 1) + return FALSE + if(!ismob(target) || istype(target, /obj/item/food/deadmouse)) // We love deadmouse being food + owner.balloon_alert(owner, "doesn't work on non-mobs!") + return FALSE + + return ..() + +/datum/action/cooldown/bloodling/absorb/Activate(atom/target) + if(!target.acid_act(200, 1000)) + to_chat(owner, span_noticealien("You cannot dissolve this object.")) + return FALSE + + owner.visible_message( + span_alertalien("[owner] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!"), + span_noticealien("You vomit globs of acid over [target]. It begins to sizzle and melt."), + ) + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index 07b03d43c14c..4c4b945cfc4c 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -8,14 +8,16 @@ . = ..() if(!.) return FALSE - var/datum/antagonist/bloodling/bloodling = IS_BLOODLING(owner) - if(!bloodling) + // Basically we only want bloodlings to have this + if(!istype(owner, /mob/living/basic/bloodling)) return FALSE - if(owner.biomass < biomass_cost) + var/mob/living/basic/bloodling/our_mob = owner + if(our_mob.biomass < biomass_cost) return FALSE return TRUE /datum/action/cooldown/bloodling/PreActivate(atom/target) + var/mob/living/basic/bloodling/our_mob = owner // Parent calls Activate(), so if parent returns TRUE, // it means the activation happened successfuly by this point . = ..() @@ -26,8 +28,8 @@ if(QDELETED(src) || QDELETED(owner)) return TRUE - owner.biomass -= biomass_cost - if(click_to_activate && owner.biomass < biomass_cost) + our_mob.add_biomass(biomass_cost) + if(click_to_activate && our_mob.biomass < biomass_cost) unset_click_ability(owner, refund_cooldown = FALSE) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index be910f76c7d9..c78b6f108137 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -1,7 +1,9 @@ /mob/living/basic/bloodling name = "bloodling" desc = "A disgusting mass of bone and flesh. It reaches out around it with fleshy tendrils." - icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "headslug" + icon_living = "headslug" + icon_dead = "headslug_dead" mob_biotypes = MOB_ORGANIC speak_emote = list("spews") butcher_results = list(/obj/item/food/meat/slab = 2) @@ -22,12 +24,9 @@ attack_verb_simple = "bite" attack_sound = 'sound/effects/attackblob.ogg' attack_vis_effect = ATTACK_EFFECT_BITE - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 health = 100 maxHealth = 100 - speed = 5 + /// The abilities the bloodling start with var/static/list/abilities = list( @@ -42,5 +41,16 @@ . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) for (var/datum/action/cooldown/created_action in abilities) - new created_action () + new created_action() created_action.Grant(src) + +/mob/living/basic/bloodling/proc/add_biomass(amount) + if(biomass > biomass_max) + src.biomass = biomass_max + balloon_alert(src, "already maximum biomass") + return + src.biomass += amount + src.maxHealth = biomass + src.health = biomass + + From e39ade27ffd4198e5aba123293bf9572c5f0fcb6 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 22:21:28 +0100 Subject: [PATCH 010/113] more biomass 2023 --- .../bloodling/abilities/absorb_biomass.dm | 47 +++++++------------ .../bloodling/mobs/bloodling_mob.dm | 32 ++++++++++--- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 9164ee6150ed..7ee4d8f4ea1c 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -3,29 +3,6 @@ desc = "Allows you to hide beneath tables and certain objects." button_icon_state = "alien_hide" -/datum/action/cooldown/bloodling/absorb/Activate(atom/target) - var/mob/living/basic/bloodling/our_mob = owner - for(var/atom/atom in view(owner, 1)) - if(istype(atom, /obj/item/food/deadmouse)) - if(!do_after(owner, 5 SECONDS)) - break - our_mob.add_biomass(10) - qdel(atom) - break - var/mob/living/dead_mob = atom - if(!dead_mob.stat == DEAD) - continue - if(!do_after(owner, 10 SECONDS)) - break - dead_mob.gib() - our_mob.add_biomass(dead_mob.getMaxHealth() * 0.5) - break - -/datum/action/cooldown/bloodling/absorb - name = "Absorb Biomass" - desc = "Allows you to hide beneath tables and certain objects." - button_icon_state = "alien_hide" - /datum/action/cooldown/bloodling/absorb/set_click_ability(mob/on_who) . = ..() if(!.) @@ -46,16 +23,28 @@ if(!ismob(target) || istype(target, /obj/item/food/deadmouse)) // We love deadmouse being food owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE - + var/mob/living/mob_to_absorb = target + if(!mob_to_absorb.stat == DEAD) + owner.balloon_alert(owner, "only works on dead mobs!") + return FALSE return ..() /datum/action/cooldown/bloodling/absorb/Activate(atom/target) - if(!target.acid_act(200, 1000)) - to_chat(owner, span_noticealien("You cannot dissolve this object.")) - return FALSE + var/mob/living/basic/bloodling/our_mob = owner + if(istype(atom, /obj/item/food/deadmouse)) + if(!do_after(owner, 5 SECONDS)) + return FALSE + our_mob.add_biomass(10) + qdel(atom) + return TRUE + var/mob/living/mob_to_absorb = target + if(!do_after(owner, 10 SECONDS)) + break + dead_mob.gib() + our_mob.add_biomass(dead_mob.getMaxHealth() * 0.5) owner.visible_message( - span_alertalien("[owner] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!"), - span_noticealien("You vomit globs of acid over [target]. It begins to sizzle and melt."), + span_alertalien("[owner] wraps its tendrils around [target]. It absorbs it!"), + span_noticealien("You wrap your tendrils around [target] and absorb it!"), ) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index c78b6f108137..543b9173fb36 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -27,8 +27,7 @@ health = 100 maxHealth = 100 - - /// The abilities the bloodling start with + /// The abilities the bloodling has to start with var/static/list/abilities = list( /datum/action/cooldown/bloodling/hide, ) @@ -39,18 +38,37 @@ /mob/living/basic/bloodling/Initialize(mapload) . = ..() + create_abilities() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - for (var/datum/action/cooldown/created_action in abilities) - new created_action() - created_action.Grant(src) + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) -/mob/living/basic/bloodling/proc/add_biomass(amount) +/// Checks for damage to update the bloodlings biomass accordingly +/mob/living/basic/bloodling/proc/on_damaged(datum/source, damage, damagetype) + SIGNAL_HANDLER + + // Stamina damage is fucky, so we ignore it + if(damagetype == STAMINA) + return + + src.add_biomass(-damage, TRUE) + +/// Used for adding biomass to the bloodling since health needs updating accordingly +/// ARGUEMENTS: +/// amount-The amount of biomass to be added or subtracted +/// damage-If the biomass addition is caused by damage, used so stuff doesnt get fucky +/mob/living/basic/bloodling/proc/add_biomass(amount, damage = FALSE) if(biomass > biomass_max) src.biomass = biomass_max balloon_alert(src, "already maximum biomass") return src.biomass += amount src.maxHealth = biomass - src.health = biomass + if(damage) + src.health = biomass +/// Creates the bloodlings abilities +/mob/living/basic/bloodling/proc/create_abilities() + for (var/datum/action/cooldown/bloodling/created_action in abilities) + created_action = created_action new(src) + created_action.Grant(src) From 6fba3b8f5703394dce452c9d87182eb57715292d Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 22:59:08 +0100 Subject: [PATCH 011/113] trying to get this biomass bullshit to work --- .../bloodling/abilities/absorb_biomass.dm | 10 ++-- .../bloodling/mobs/bloodling_mob.dm | 55 +++++++++---------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 7ee4d8f4ea1c..554588e54c57 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -31,17 +31,17 @@ /datum/action/cooldown/bloodling/absorb/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner - if(istype(atom, /obj/item/food/deadmouse)) + if(istype(target, /obj/item/food/deadmouse)) if(!do_after(owner, 5 SECONDS)) return FALSE our_mob.add_biomass(10) - qdel(atom) + qdel(target) return TRUE var/mob/living/mob_to_absorb = target if(!do_after(owner, 10 SECONDS)) - break - dead_mob.gib() - our_mob.add_biomass(dead_mob.getMaxHealth() * 0.5) + return FALSE + mob_to_absorb.gib() + our_mob.add_biomass(mob_to_absorb.getMaxHealth() * 0.5) owner.visible_message( span_alertalien("[owner] wraps its tendrils around [target]. It absorbs it!"), diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 543b9173fb36..0b85b60297c2 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -1,38 +1,33 @@ /mob/living/basic/bloodling name = "bloodling" desc = "A disgusting mass of bone and flesh. It reaches out around it with fleshy tendrils." - icon_state = "headslug" - icon_living = "headslug" - icon_dead = "headslug_dead" + icon = 'icons/mob/simple/arachnoid.dmi' + icon_state = "maint_spider" + icon_living = "maint_spider" + icon_dead = "maint_spider_dead" + gender = NEUTER + health = 1 + maxHealth = 1 + melee_damage_lower = 5 + melee_damage_upper = 5 + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + faction = list(FACTION_CREATURE) + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE mob_biotypes = MOB_ORGANIC speak_emote = list("spews") - butcher_results = list(/obj/item/food/meat/slab = 2) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "pushes aside" - response_disarm_simple = "push aside" - melee_attack_cooldown = CLICK_CD_MELEE damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, STAMINA = 1, OXY = 1) basic_mob_flags = FLAMMABLE_MOB - status_flags = NONE sight = SEE_SELF|SEE_MOBS - unsuitable_cold_damage = 1 - unsuitable_heat_damage = 1 faction = list(FACTION_BLOODLING) pass_flags = PASSTABLE - attack_verb_continuous = "bites" - attack_verb_simple = "bite" attack_sound = 'sound/effects/attackblob.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - health = 100 - maxHealth = 100 - /// The abilities the bloodling has to start with - var/static/list/abilities = list( - /datum/action/cooldown/bloodling/hide, - ) // The amount of biomass our bloodling has - var/biomass = 0 + var/biomass = 1 // The maximum amount of biomass a bloodling can gain var/biomass_max = 500 @@ -40,7 +35,7 @@ . = ..() create_abilities() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) /// Checks for damage to update the bloodlings biomass accordingly /mob/living/basic/bloodling/proc/on_damaged(datum/source, damage, damagetype) @@ -55,20 +50,20 @@ /// Used for adding biomass to the bloodling since health needs updating accordingly /// ARGUEMENTS: /// amount-The amount of biomass to be added or subtracted -/// damage-If the biomass addition is caused by damage, used so stuff doesnt get fucky -/mob/living/basic/bloodling/proc/add_biomass(amount, damage = FALSE) +/mob/living/basic/bloodling/proc/add_biomass(amount) if(biomass > biomass_max) src.biomass = biomass_max balloon_alert(src, "already maximum biomass") return src.biomass += amount src.maxHealth = biomass - if(damage) - src.health = biomass + src.health = biomass + update_health_hud() /// Creates the bloodlings abilities /mob/living/basic/bloodling/proc/create_abilities() - for (var/datum/action/cooldown/bloodling/created_action in abilities) - created_action = created_action new(src) - created_action.Grant(src) + var/datum/action/cooldown/bloodling/hide/hide = new(src) + hide.Grant(src) + var/datum/action/cooldown/bloodling/absorb/absorb = new(src) + absorb.Grant(src) From f98767ab5535a4352db08089157147d5c45f3b84 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Jan 2024 23:28:38 +0100 Subject: [PATCH 012/113] Update bloodling_mob.dm --- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 0b85b60297c2..49d084fbe70e 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -16,6 +16,7 @@ attack_vis_effect = ATTACK_EFFECT_BITE faction = list(FACTION_CREATURE) obj_damage = 0 + speed = 7 environment_smash = ENVIRONMENT_SMASH_NONE mob_biotypes = MOB_ORGANIC speak_emote = list("spews") From 717703a868cc659d9788daacd1b104986adcfc79 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 5 Jan 2024 22:39:07 +0100 Subject: [PATCH 013/113] biomass 2024 --- code/datums/saymode.dm | 3 +-- .../bloodling/abilities/absorb_biomass.dm | 17 ++++++++++------- .../bloodling/bloodling_abilities.dm | 2 +- .../antagonists/bloodling/mobs/bloodling_mob.dm | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 31337e4a78f0..b4d2c818a027 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -113,7 +113,7 @@ // Start of Monkestation edit /datum/saymode/bloodling - key = "l" + key = "f" mode = MODE_BLOODLING /datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) @@ -132,7 +132,6 @@ if(!reciever.owner) continue var/mob/living/ling_mob = reciever.owner.current - //removes types that override the presence of being changeling (for example, borged lings still can't hivemind chat) to_chat(ling_mob, msg) for(var/mob/dead/ghost as anything in GLOB.dead_mob_list) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 554588e54c57..8bca8fab9d38 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/bloodling/absorb name = "Absorb Biomass" - desc = "Allows you to hide beneath tables and certain objects." + desc = "Allows you to absorb a dead creature close to you." button_icon_state = "alien_hide" /datum/action/cooldown/bloodling/absorb/set_click_ability(mob/on_who) @@ -8,18 +8,20 @@ if(!.) return - to_chat(on_who, span_changeling("You prepare to claim a creatures biomass. Click a target to begin absorbing it!")) + to_chat(on_who, span_noticealien("You prepare to claim a creatures biomass. Click a target to begin absorbing it!")) /datum/action/cooldown/bloodling/absorb/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() if(!.) return - to_chat(on_who, span_changeling("You steady yourself. Now is not the time to claim biomass...")) + to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to claim biomass...")) /datum/action/cooldown/bloodling/absorb/PreActivate(atom/target) if(get_dist(owner, target) > 1) return FALSE + if(target == owner) + return FALSE if(!ismob(target) || istype(target, /obj/item/food/deadmouse)) // We love deadmouse being food owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE @@ -31,20 +33,21 @@ /datum/action/cooldown/bloodling/absorb/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner + if(istype(target, /obj/item/food/deadmouse)) - if(!do_after(owner, 5 SECONDS)) + if(!do_after(our_mob, 5 SECONDS)) return FALSE our_mob.add_biomass(10) qdel(target) return TRUE var/mob/living/mob_to_absorb = target - if(!do_after(owner, 10 SECONDS)) + if(!do_after(our_mob, 10 SECONDS)) return FALSE mob_to_absorb.gib() our_mob.add_biomass(mob_to_absorb.getMaxHealth() * 0.5) - owner.visible_message( - span_alertalien("[owner] wraps its tendrils around [target]. It absorbs it!"), + our_mob.visible_message( + span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), span_noticealien("You wrap your tendrils around [target] and absorb it!"), ) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index 4c4b945cfc4c..a38ec25173e2 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -30,6 +30,6 @@ our_mob.add_biomass(biomass_cost) if(click_to_activate && our_mob.biomass < biomass_cost) - unset_click_ability(owner, refund_cooldown = FALSE) + unset_click_ability(owner) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 49d084fbe70e..5e57b4fee5a2 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -16,7 +16,7 @@ attack_vis_effect = ATTACK_EFFECT_BITE faction = list(FACTION_CREATURE) obj_damage = 0 - speed = 7 + speed = 2.8 environment_smash = ENVIRONMENT_SMASH_NONE mob_biotypes = MOB_ORGANIC speak_emote = list("spews") @@ -46,7 +46,7 @@ if(damagetype == STAMINA) return - src.add_biomass(-damage, TRUE) + src.add_biomass(-damage) /// Used for adding biomass to the bloodling since health needs updating accordingly /// ARGUEMENTS: From fc2745f875bc2fa50e725f86547b6b58959d7613 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 7 Jan 2024 00:16:05 +0100 Subject: [PATCH 014/113] work on evolutions --- .../bloodling/abilities/absorb_biomass.dm | 16 ++-- .../antagonists/bloodling/bloodling.dm | 17 ---- .../bloodling/mobs/bloodling_mob.dm | 90 +++++++++++++++++-- 3 files changed, 89 insertions(+), 34 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 8bca8fab9d38..11703659a482 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -5,24 +5,20 @@ /datum/action/cooldown/bloodling/absorb/set_click_ability(mob/on_who) . = ..() - if(!.) - return to_chat(on_who, span_noticealien("You prepare to claim a creatures biomass. Click a target to begin absorbing it!")) /datum/action/cooldown/bloodling/absorb/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() - if(!.) - return to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to claim biomass...")) /datum/action/cooldown/bloodling/absorb/PreActivate(atom/target) if(get_dist(owner, target) > 1) return FALSE - if(target == owner) - return FALSE - if(!ismob(target) || istype(target, /obj/item/food/deadmouse)) // We love deadmouse being food + if(istype(target, /obj/item/food/deadmouse)) + return ..() + if(!ismob(target)) owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE var/mob/living/mob_to_absorb = target @@ -39,12 +35,16 @@ return FALSE our_mob.add_biomass(10) qdel(target) + our_mob.visible_message( + span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), + span_noticealien("You wrap your tendrils around [target] and absorb it!"), + ) return TRUE var/mob/living/mob_to_absorb = target if(!do_after(our_mob, 10 SECONDS)) return FALSE - mob_to_absorb.gib() our_mob.add_biomass(mob_to_absorb.getMaxHealth() * 0.5) + mob_to_absorb.gib() our_mob.visible_message( span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index 2509023d0e9c..954fe8f3d561 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -10,30 +10,13 @@ // If this bloodling is ascended or not var/is_ascended = FALSE - // Possible names for our bloodling - var/static/list/bloodling_names = list( - "biohazard", - "fleshy mass", - "spiny mess", - "blob of flesh", - "malign blood", - "carrion", - ) /datum/antagonist/bloodling/on_gain() - generate_name() forge_objectives() owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are a horrific blob of flesh who can manifest a million tongues. owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_alert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) return ..() -/datum/antagonist/bloodling/proc/generate_name() - var/name = "bloodling" - if(!length(bloodling_names)) - return - name = "[pick(bloodling_names)] [rand(1,999)]" - owner.current.name = name - /datum/antagonist/bloodling/forge_objectives() var/datum/objective/bloodling_ascend/ascend_objective = new ascend_objective.owner = owner diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 5e57b4fee5a2..35fe8cc43a58 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -20,17 +20,18 @@ environment_smash = ENVIRONMENT_SMASH_NONE mob_biotypes = MOB_ORGANIC speak_emote = list("spews") - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, STAMINA = 1, OXY = 1) basic_mob_flags = FLAMMABLE_MOB sight = SEE_SELF|SEE_MOBS faction = list(FACTION_BLOODLING) pass_flags = PASSTABLE attack_sound = 'sound/effects/attackblob.ogg' - // The amount of biomass our bloodling has + /// The amount of biomass our bloodling has var/biomass = 1 - // The maximum amount of biomass a bloodling can gain + /// The maximum amount of biomass a bloodling can gain var/biomass_max = 500 + /// The evolution level our bloodling is on + var/evolution_level = 1 /mob/living/basic/bloodling/Initialize(mapload) . = ..() @@ -46,20 +47,31 @@ if(damagetype == STAMINA) return - src.add_biomass(-damage) + add_biomass(-damage) + // Heals up their damage + heal_and_revive(0) /// Used for adding biomass to the bloodling since health needs updating accordingly /// ARGUEMENTS: /// amount-The amount of biomass to be added or subtracted /mob/living/basic/bloodling/proc/add_biomass(amount) - if(biomass > biomass_max) - src.biomass = biomass_max + if(biomass + amount <= 0) + gib() + if(biomass + amount >= biomass_max) + biomass = biomass_max balloon_alert(src, "already maximum biomass") return - src.biomass += amount - src.maxHealth = biomass - src.health = biomass + biomass += amount + maxHealth = biomass + obj_damage = biomass * 0.2 + // less than 5 damage would be very bad + if(biomass > 50) + melee_damage_lower = biomass * 0.1 + melee_damage_upper = biomass * 0.1 update_health_hud() + check_evolution() + // Health needs to be updated to our biomass levels, this does NOT heal up damage + health = biomass /// Creates the bloodlings abilities /mob/living/basic/bloodling/proc/create_abilities() @@ -67,4 +79,64 @@ hide.Grant(src) var/datum/action/cooldown/bloodling/absorb/absorb = new(src) absorb.Grant(src) + return +/// Checks if we should evolve +/mob/living/basic/bloodling/proc/check_evolution() + if(75 > biomass && evolution_level != 1) + evolution(1) + return + if(125 > biomass >= 75 && evolution_level != 2) + evolution(2) + return + if(175 > biomass >= 125 && evolution_level != 3) + evolution(3) + return + if(225 > biomass >= 175 && evolution_level != 4) + evolution(4) + return + if(biomass >= 225 && evolution_level != 5) + evolution(5) + return + +/// Creates the mob for us to then mindswap into +/mob/living/basic/bloodling/proc/evolution(tier) + var/new_bloodling = null + switch(tier) + if(1) + new_bloodling = new /mob/living/basic/bloodling(src.loc) + if(2) + new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + if(3) + new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + if(4) + new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + if(5) + new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + evolution_mind_change(new_bloodling) + + +/mob/living/basic/bloodling/proc/evolution_mind_change(var/mob/living/basic/bloodling/new_bloodling) + visible_message( + span_alertalien("[src] begins to grow!"), + span_noticealien("You evolve!"), + ) + new_bloodling.setDir(dir) + if(numba) + new_bloodling.numba = numba + new_bloodling.set_name() + new_bloodling.name = name + new_bloodling.real_name = real_name + if(mind) + mind.name = new_bloodling.real_name + mind.transfer_to(new_bloodling) + new_bloodling.add_biomass(biomass) + qdel(src) + +/mob/living/basic/bloodling/tier2 + icon_state = "guard" + icon_living = "guard" + evolution_level = 2 + +/mob/living/basic/bloodling/tier2/create_abilities() + ..() From 670503c04e25ef1da997ecee23d9b8c2daee6b8e Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 7 Jan 2024 13:03:04 +0100 Subject: [PATCH 015/113] Infested thralls work --- code/__DEFINES/role_preferences.dm | 3 +- .../antagonists/bloodling/infested_thrall.dm | 27 ++++++++++ .../bloodling/mobs/bloodling_mob.dm | 51 ++++++++++++++----- tgstation.dme | 1 + 4 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/infested_thrall.dm diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 36d5b0a12266..e2bf29ecb1b0 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -69,7 +69,8 @@ #define ROLE_LAVALAND "Lavaland" #define ROLE_LAZARUS_BAD "Slaved Revived Mob" #define ROLE_LAZARUS_GOOD "Friendly Revived Mob" -#define ROLE_SLASHER "Slasher" +#define ROLE_SLASHER "Slasher" // monkestation edit +#define ROLE_BLOODLING_THRALL "Bloodling Thrall" // monkestation edit #define ROLE_CLOWN_OPERATIVE "Clown Operative" #define ROLE_FREE_GOLEM "Free Golem" diff --git a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm new file mode 100644 index 000000000000..bf619625d5b9 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm @@ -0,0 +1,27 @@ +/datum/antagonist/changeling/bloodling_thrall + name = "\improper Changeling" + roundend_category = "bloodling thralls" + antagpanel_category = ANTAG_GROUP_BLOODLING + job_rank = ROLE_BLOODLING_THRALL + antag_moodlet = /datum/mood_event/focused + antag_hud_name = "changeling" + hijack_speed = 0 + suicide_cry = "FOR THE MASTER!!" + genetic_points = 5 + total_genetic_points = 5 + +/datum/antagonist/changeling/bloodling_thrall/purchase_power(datum/action/changeling/sting_path) + if(istype(sting_path, /datum/action/changeling/fakedeath)) + to_chat(owner.current, span_warning("We are unable to evolve that ability")) + return FALSE + ..() + +/datum/antagonist/changeling/bloodling_thrall/create_innate_actions() + for(var/datum/action/changeling/path as anything in all_powers) + if(initial(path.dna_cost) != 0) + continue + var/datum/action/changeling/innate_ability = new path() + if(istype(innate_ability, /datum/action/changeling/fakedeath)) + continue + innate_powers += innate_ability + innate_ability.on_purchase(owner.current, TRUE) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 35fe8cc43a58..987055d69475 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -32,6 +32,11 @@ var/biomass_max = 500 /// The evolution level our bloodling is on var/evolution_level = 1 + /// The abilities this bloodling starts with + var/list/initial_powers = list( + /datum/action/cooldown/bloodling/absorb, + /datum/action/cooldown/bloodling/hide, + ) /mob/living/basic/bloodling/Initialize(mapload) . = ..() @@ -47,9 +52,8 @@ if(damagetype == STAMINA) return + // Bloodlings take damage through their biomass, not regular damage add_biomass(-damage) - // Heals up their damage - heal_and_revive(0) /// Used for adding biomass to the bloodling since health needs updating accordingly /// ARGUEMENTS: @@ -62,7 +66,11 @@ balloon_alert(src, "already maximum biomass") return biomass += amount + // Heals up their damage + heal_and_revive(0) maxHealth = biomass + // Health needs to be updated to our biomass levels, this does NOT heal up damage + health = biomass obj_damage = biomass * 0.2 // less than 5 damage would be very bad if(biomass > 50) @@ -70,16 +78,15 @@ melee_damage_upper = biomass * 0.1 update_health_hud() check_evolution() - // Health needs to be updated to our biomass levels, this does NOT heal up damage - health = biomass /// Creates the bloodlings abilities /mob/living/basic/bloodling/proc/create_abilities() - var/datum/action/cooldown/bloodling/hide/hide = new(src) - hide.Grant(src) - var/datum/action/cooldown/bloodling/absorb/absorb = new(src) - absorb.Grant(src) - return + for(var/datum/action/cooldown/bloodling/path as anything in initial_powers) + if(path in src.actions) + continue + var/datum/action/cooldown/bloodling/bloodling_action = new path() + bloodling_action.Grant(src) + /// Checks if we should evolve /mob/living/basic/bloodling/proc/check_evolution() @@ -108,11 +115,11 @@ if(2) new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) if(3) - new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + new_bloodling = new /mob/living/basic/bloodling/tier3(src.loc) if(4) - new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + new_bloodling = new /mob/living/basic/bloodling/tier4(src.loc) if(5) - new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + new_bloodling = new /mob/living/basic/bloodling/tier5(src.loc) evolution_mind_change(new_bloodling) @@ -137,6 +144,22 @@ icon_state = "guard" icon_living = "guard" evolution_level = 2 + initial_powers = list() + +/mob/living/basic/bloodling/tier3 + icon_state = "scout" + icon_living = "scout" + evolution_level = 3 + initial_powers = list() + +/mob/living/basic/bloodling/tier4 + icon_state = "ambush" + icon_living = "ambush" + evolution_level = 4 + initial_powers = list() -/mob/living/basic/bloodling/tier2/create_abilities() - ..() +/mob/living/basic/bloodling/tier5 + icon_state = "hunter" + icon_living = "hunter" + evolution_level = 5 + initial_powers = list() diff --git a/tgstation.dme b/tgstation.dme index 4525fd1fb6fe..21f7edf7b1a8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5710,6 +5710,7 @@ #include "monkestation\code\modules\aesthetics\walls\iron.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" +#include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" From 77e242eac312daf8c2d0d1e2eaa686a87e4f888e Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:29:02 +0100 Subject: [PATCH 016/113] Infested thralls --- .../antagonists/bloodling/infested_thrall.dm | 44 ++++++++++++++++++- .../bloodling/mobs/bloodling_mob.dm | 2 - .../antagonists/bloodling/objectives.dm | 16 ++++++- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm index bf619625d5b9..5ef97cf92558 100644 --- a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm +++ b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm @@ -1,5 +1,5 @@ /datum/antagonist/changeling/bloodling_thrall - name = "\improper Changeling" + name = "\improper Changeling Thrall" roundend_category = "bloodling thralls" antagpanel_category = ANTAG_GROUP_BLOODLING job_rank = ROLE_BLOODLING_THRALL @@ -10,6 +10,9 @@ genetic_points = 5 total_genetic_points = 5 + // This thralls master + var/master = null + /datum/antagonist/changeling/bloodling_thrall/purchase_power(datum/action/changeling/sting_path) if(istype(sting_path, /datum/action/changeling/fakedeath)) to_chat(owner.current, span_warning("We are unable to evolve that ability")) @@ -25,3 +28,42 @@ continue innate_powers += innate_ability innate_ability.on_purchase(owner.current, TRUE) + +/datum/antagonist/changeling/bloodling_thrall/proc/set_master(mob/living/basic/bloodling/master) + to_chat(owner, spawn_notice("Your master is [master], they have granted you this gift. Obey their commands. Praise be the living flesh.")) + src.master = master + +/datum/antagonist/changeling/bloodling_thrall/forge_objectives() + var/datum/objective/bloodling_thrall/serve_objective = new + serve_objective.owner = owner + objectives += serve_objective + +/datum/antagonist/infested_thrall + name = "\improper Infested Thrall" + roundend_category = "bloodling thralls" + antagpanel_category = ANTAG_GROUP_BLOODLING + job_rank = ROLE_BLOODLING_THRALL + antag_moodlet = /datum/mood_event/focused + antag_hud_name = "changeling" + hijack_speed = 0 + suicide_cry = "FOR THE MASTER!!" + + // This thralls master + var/master = null + +/datum/antagonist/infested_thrall/on_gain() + forge_objectives() + owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are a horrific blob of flesh who can manifest a million tongues. + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_alert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + return ..() + +/datum/antagonist/infested_thrall/forge_objectives() + var/datum/objective/bloodling_thrall/serve_objective = new + serve_objective.owner = owner + objectives += serve_objective + if(master) + serve_objective.update_explanation_text() + +/datum/antagonist/infested_thrall/proc/set_master(mob/living/basic/bloodling/master) + to_chat(owner, spawn_notice("Your master is [master], they have granted you this gift. Obey their commands. Praise be the living flesh.")) + src.master = master diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 987055d69475..af5e298c3d80 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -82,8 +82,6 @@ /// Creates the bloodlings abilities /mob/living/basic/bloodling/proc/create_abilities() for(var/datum/action/cooldown/bloodling/path as anything in initial_powers) - if(path in src.actions) - continue var/datum/action/cooldown/bloodling/bloodling_action = new path() bloodling_action.Grant(src) diff --git a/monkestation/code/modules/antagonists/bloodling/objectives.dm b/monkestation/code/modules/antagonists/bloodling/objectives.dm index 6ed76acb5185..c73d98db3d9a 100644 --- a/monkestation/code/modules/antagonists/bloodling/objectives.dm +++ b/monkestation/code/modules/antagonists/bloodling/objectives.dm @@ -4,8 +4,22 @@ admin_grantable = FALSE explanation_text = "Ascend as the ultimate being" -/datum/objective/maroon/check_completion() +/datum/objective/bloodling_ascend/check_completion() var/datum/antagonist/bloodling/bloodling = IS_BLOODLING(owner.current) if (!bloodling.is_ascended) return FALSE return TRUE + +/datum/objective/bloodling_thrall + name = "serve" + martyr_compatible = TRUE + admin_grantable = FALSE + explanation_text = "Serve your master!" + +/datum/objective/bloodling_thrall/update_explanation_text() + ..() + var/datum/antagonist/infested_thrall/our_owner = owner + if(owner.master) + explanation_text = "Serve your master [owner.master]!" + else + explanation_text = "Serve your master!" From 2b501b8769358a73c6e8d44a6cea62c9f9b6d812 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 8 Jan 2024 11:22:28 +0100 Subject: [PATCH 017/113] begining of infest --- .../antagonists/bloodling/abilities/absorb_biomass.dm | 5 ++++- .../code/modules/antagonists/bloodling/abilities/infest.dm | 0 .../modules/antagonists/bloodling/bloodling_abilities.dm | 4 +--- .../code/modules/antagonists/bloodling/infested_thrall.dm | 4 ++-- .../code/modules/antagonists/bloodling/objectives.dm | 4 ++-- tgstation.dme | 1 + 6 files changed, 10 insertions(+), 8 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/infest.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 11703659a482..02f24c5ec842 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -5,11 +5,14 @@ /datum/action/cooldown/bloodling/absorb/set_click_ability(mob/on_who) . = ..() - + if(!.) + return to_chat(on_who, span_noticealien("You prepare to claim a creatures biomass. Click a target to begin absorbing it!")) /datum/action/cooldown/bloodling/absorb/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() + if(!.) + return to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to claim biomass...")) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index a38ec25173e2..b4c22a586c57 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -28,8 +28,6 @@ if(QDELETED(src) || QDELETED(owner)) return TRUE - our_mob.add_biomass(biomass_cost) - if(click_to_activate && our_mob.biomass < biomass_cost) - unset_click_ability(owner) + our_mob.add_biomass(-biomass_cost) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm index 5ef97cf92558..5a4996e5e22a 100644 --- a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm +++ b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm @@ -30,7 +30,7 @@ innate_ability.on_purchase(owner.current, TRUE) /datum/antagonist/changeling/bloodling_thrall/proc/set_master(mob/living/basic/bloodling/master) - to_chat(owner, spawn_notice("Your master is [master], they have granted you this gift. Obey their commands. Praise be the living flesh.")) + to_chat(owner, span_info("Your master is [master], they have granted you this gift. Obey their commands. Praise be the living flesh.")) src.master = master /datum/antagonist/changeling/bloodling_thrall/forge_objectives() @@ -65,5 +65,5 @@ serve_objective.update_explanation_text() /datum/antagonist/infested_thrall/proc/set_master(mob/living/basic/bloodling/master) - to_chat(owner, spawn_notice("Your master is [master], they have granted you this gift. Obey their commands. Praise be the living flesh.")) + to_chat(owner, span_info("Your master is [master], they have granted you this gift. Obey their commands. Praise be the living flesh.")) src.master = master diff --git a/monkestation/code/modules/antagonists/bloodling/objectives.dm b/monkestation/code/modules/antagonists/bloodling/objectives.dm index c73d98db3d9a..805568b796e0 100644 --- a/monkestation/code/modules/antagonists/bloodling/objectives.dm +++ b/monkestation/code/modules/antagonists/bloodling/objectives.dm @@ -19,7 +19,7 @@ /datum/objective/bloodling_thrall/update_explanation_text() ..() var/datum/antagonist/infested_thrall/our_owner = owner - if(owner.master) - explanation_text = "Serve your master [owner.master]!" + if(our_owner.master) + explanation_text = "Serve your master [our_owner.master]!" else explanation_text = "Serve your master!" diff --git a/tgstation.dme b/tgstation.dme index 21f7edf7b1a8..31987ee0de27 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5714,6 +5714,7 @@ #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" #include "monkestation\code\modules\antagonists\clock_cult\dynamic_ruleset.dm" From 4211dd39f92930640bb8d03395287ba9c278785c Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 8 Jan 2024 11:45:58 +0100 Subject: [PATCH 018/113] infest ability (click actions still dont work) --- .../antagonists/bloodling/abilities/infest.dm | 51 +++++++++++++++++++ .../bloodling/bloodling_abilities.dm | 2 +- .../bloodling/mobs/bloodling_mob.dm | 6 ++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index e69de29bb2d1..e22149dbb8ae 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -0,0 +1,51 @@ +/datum/action/cooldown/bloodling/infest + name = "Infest" + desc = "Allows you to infest a living creature, turning them into a thrall. Can be used on mindshielded people but it takes longer. Costs 75 biomass." + button_icon_state = "alien_hide" + biomass_cost = 75 + +/datum/action/cooldown/bloodling/infest/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_noticealien("You ready yourself to infest a creature! Click a target to begin infesting it!")) + +/datum/action/cooldown/bloodling/infest/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to infest...")) + +/datum/action/cooldown/bloodling/infest/PreActivate(atom/target) + if(!ismob(target)) + owner.balloon_alert(owner, "doesn't work on non-mobs!") + return FALSE + var/mob/living/alive_mob = target + if(isnull(alive_mob.mind)) + owner.balloon_alert(owner, "doesn't work on mindless mobs!") + return FALSE + if(alive_mob.stat == DEAD) + owner.balloon_alert(owner, "doesn't work on dead mobs!") + return FALSE + return ..() + +/datum/action/cooldown/bloodling/infest/Activate(atom/target) + var/mob/living/mob = target + if(istype(mob, /mob/living/carbon/human)) + var/mob/living/carbon/human/carbon_mob = target + if(HAS_TRAIT(carbon_mob, TRAIT_MINDSHIELD)) + if(!do_after(owner, 15 SECONDS)) + return FALSE + else + if(!do_after(owner, 10 SECONDS)) + return FALSE + var/datum/antagonist/changeling/bloodling_thrall/thrall = carbon_mob.mind.add_antag_datum(/datum/antagonist/changeling/bloodling_thrall) + thrall.set_master(owner) + else + if(!do_after(owner, 5 SECONDS)) + return FALSE + var/datum/antagonist/infested_thrall/thrall = mob.mind.add_antag_datum(/datum/antagonist/infested_thrall) + thrall.set_master(owner) + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index b4c22a586c57..cae600d0ceca 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -12,7 +12,7 @@ if(!istype(owner, /mob/living/basic/bloodling)) return FALSE var/mob/living/basic/bloodling/our_mob = owner - if(our_mob.biomass < biomass_cost) + if(our_mob.biomass =< biomass_cost) return FALSE return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index af5e298c3d80..06d8320c5570 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -142,7 +142,11 @@ icon_state = "guard" icon_living = "guard" evolution_level = 2 - initial_powers = list() + initial_powers = list( + /datum/action/cooldown/bloodling/absorb, + /datum/action/cooldown/bloodling/hide, + /datum/action/cooldown/bloodling/infest, + ) /mob/living/basic/bloodling/tier3 icon_state = "scout" From 8daa97c0085657c70ef6cbd44006aeb807bdeeb8 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 8 Jan 2024 15:32:29 +0100 Subject: [PATCH 019/113] booob the builder --- .../antagonists/bloodling/abilities/build.dm | 38 +++++++++++++++++++ .../bloodling/bloodling_abilities.dm | 2 +- .../bloodling/mobs/bloodling_mob.dm | 7 +++- tgstation.dme | 1 + 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/build.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm new file mode 100644 index 000000000000..8fd878750714 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm @@ -0,0 +1,38 @@ +/datum/action/cooldown/bloodling/build + name = "Mold Flesh" + desc = "Use your biomass to forge creatures or structures." + button_icon_state = "alien_resin" + biomass_cost = 30 + /// A list of all structures we can make. + var/static/list/structures = list( + "resin wall" = /obj/structure/alien/resin/wall, + "resin membrane" = /obj/structure/alien/resin/membrane, + "resin nest" = /obj/structure/bed/nest, + ) + +// Snowflake to check for what we build +/datum/action/cooldown/bloodling/build/proc/check_for_duplicate() + for(var/blocker_name in structures) + var/obj/structure/blocker_type = structures[blocker_name] + if(locate(blocker_type) in owner.loc) + to_chat(owner, span_warning("There is already a resin structure there!")) + return FALSE + + return TRUE + +/datum/action/cooldown/bloodling/build/Activate(atom/target) + var/choice = tgui_input_list(owner, "Select a shape to mold", "Flesh Construction", structures) + if(isnull(choice) || QDELETED(src) || QDELETED(owner) || !check_for_duplicate() || !IsAvailable(feedback = TRUE)) + return FALSE + + var/obj/structure/choice_path = structures[choice] + if(!ispath(choice_path)) + return FALSE + + owner.visible_message( + span_notice("[owner] vomits up a thick purple substance and begins to shape it."), + span_notice("You shape a [choice] out of resin."), + ) + + new choice_path(owner.loc) + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index cae600d0ceca..865662fd8d64 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -12,7 +12,7 @@ if(!istype(owner, /mob/living/basic/bloodling)) return FALSE var/mob/living/basic/bloodling/our_mob = owner - if(our_mob.biomass =< biomass_cost) + if(our_mob.biomass <= biomass_cost) return FALSE return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 06d8320c5570..d45e30560ac7 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -146,13 +146,18 @@ /datum/action/cooldown/bloodling/absorb, /datum/action/cooldown/bloodling/hide, /datum/action/cooldown/bloodling/infest, + /datum/action/cooldown/bloodling/build, ) /mob/living/basic/bloodling/tier3 icon_state = "scout" icon_living = "scout" evolution_level = 3 - initial_powers = list() + initial_powers = list( + /datum/action/cooldown/bloodling/absorb, + /datum/action/cooldown/bloodling/infest, + /datum/action/cooldown/bloodling/build, + ) /mob/living/basic/bloodling/tier4 icon_state = "ambush" diff --git a/tgstation.dme b/tgstation.dme index 31987ee0de27..ff018813728f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5713,6 +5713,7 @@ #include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" From fded4f5e4f950794c3f228c93ad39075243e4aee Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 10 Jan 2024 20:06:31 +0100 Subject: [PATCH 020/113] status tab, pending rework for biomass --- .../bloodling/mobs/bloodling_mob.dm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index d45e30560ac7..c6d430b9a705 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -44,6 +44,24 @@ ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) +/mob/living/basic/bloodling/get_status_tab_items() + . = ..() + . += "Current Biomass: [biomass >= biomass_max ? biomass : "[biomass] / [biomass_max]"] E" + +/mob/living/basic/bloodling/adjust_health(amount, updating_health = TRUE, forced = FALSE) + if(!forced) + return 0 + + . = amount + + biomass = max(0, biomass - amount) + if(updating_health) + update_health_hud() + if(biomass == 0) + gib() + + return . + /// Checks for damage to update the bloodlings biomass accordingly /mob/living/basic/bloodling/proc/on_damaged(datum/source, damage, damagetype) SIGNAL_HANDLER From 4146c74c9f4cdb649e555f0d4cc705905a044cd8 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 11 Jan 2024 19:19:06 +0100 Subject: [PATCH 021/113] infinite health lings, switching to biomass --- .../bloodling/mobs/bloodling_mob.dm | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index c6d430b9a705..8a39c4df3432 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -6,8 +6,8 @@ icon_living = "maint_spider" icon_dead = "maint_spider_dead" gender = NEUTER - health = 1 - maxHealth = 1 + health = INFINITY //Bloodlings don't use health, they use biomass instead + maxHealth = INFINITY melee_damage_lower = 5 melee_damage_upper = 5 attack_verb_continuous = "chomps" @@ -27,7 +27,7 @@ attack_sound = 'sound/effects/attackblob.ogg' /// The amount of biomass our bloodling has - var/biomass = 1 + var/biomass = 50 /// The maximum amount of biomass a bloodling can gain var/biomass_max = 500 /// The evolution level our bloodling is on @@ -42,6 +42,8 @@ . = ..() create_abilities() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + RegisterSignal(src, COMSIG_LIVING_LIFE, PROC_REF(on_life)) RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) /mob/living/basic/bloodling/get_status_tab_items() @@ -54,14 +56,26 @@ . = amount - biomass = max(0, biomass - amount) + add_biomass(amount) if(updating_health) update_health_hud() - if(biomass == 0) - gib() return . +/// On_life proc that checks their amount of biomass +/mob/living/basic/bloodling/proc/on_life(seconds_per_tick = SSMOBS_DT, times_fired) + SIGNAL_HANDLER + + if(biomass <= 0) + gib() + +/// Our health hud is based on biomass, since our health is infinite +/mob/living/basic/bloodling/update_health_hud() + if(isnull(hud_used)) + return + + hud_used.healths.maptext = MAPTEXT("
[biomass]E
") + /// Checks for damage to update the bloodlings biomass accordingly /mob/living/basic/bloodling/proc/on_damaged(datum/source, damage, damagetype) SIGNAL_HANDLER @@ -77,18 +91,14 @@ /// ARGUEMENTS: /// amount-The amount of biomass to be added or subtracted /mob/living/basic/bloodling/proc/add_biomass(amount) - if(biomass + amount <= 0) - gib() if(biomass + amount >= biomass_max) biomass = biomass_max balloon_alert(src, "already maximum biomass") return + biomass += amount - // Heals up their damage - heal_and_revive(0) - maxHealth = biomass - // Health needs to be updated to our biomass levels, this does NOT heal up damage - health = biomass + + // Damage is based on biomass, and handled here obj_damage = biomass * 0.2 // less than 5 damage would be very bad if(biomass > 50) From deb46ecacab53b14d1b715afb403ccbae36248c7 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 14 Jan 2024 16:16:52 +0100 Subject: [PATCH 022/113] Begining devour, some recoding of absorb --- .../bloodling/abilities/absorb_biomass.dm | 38 +++++++++++++------ .../antagonists/bloodling/abilities/devour.dm | 0 .../antagonists/bloodling/abilities/hide.dm | 2 +- .../antagonists/bloodling/abilities/infest.dm | 10 ++--- .../bloodling/bloodling_abilities.dm | 35 +++++++++++++++++ .../bloodling/mobs/bloodling_mob.dm | 33 ++++++++++------ 6 files changed, 89 insertions(+), 29 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/devour.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 02f24c5ec842..82331b423cc5 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -1,22 +1,22 @@ -/datum/action/cooldown/bloodling/absorb +/datum/action/cooldown/mob_cooldown/bloodling/absorb name = "Absorb Biomass" - desc = "Allows you to absorb a dead creature close to you." + desc = "Allows you to absorb a dead carbon or living mob close to you." button_icon_state = "alien_hide" -/datum/action/cooldown/bloodling/absorb/set_click_ability(mob/on_who) +/datum/action/cooldown/mob_cooldown/bloodling/absorb/set_click_ability(mob/on_who) . = ..() if(!.) return to_chat(on_who, span_noticealien("You prepare to claim a creatures biomass. Click a target to begin absorbing it!")) -/datum/action/cooldown/bloodling/absorb/unset_click_ability(mob/on_who, refund_cooldown = TRUE) +/datum/action/cooldown/mob_cooldown/bloodling/absorb/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() if(!.) return to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to claim biomass...")) -/datum/action/cooldown/bloodling/absorb/PreActivate(atom/target) +/datum/action/cooldown/mob_cooldown/bloodling/absorb/PreActivate(atom/target) if(get_dist(owner, target) > 1) return FALSE if(istype(target, /obj/item/food/deadmouse)) @@ -25,12 +25,15 @@ owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE var/mob/living/mob_to_absorb = target - if(!mob_to_absorb.stat == DEAD) + if(!iscarbon(mob_to_absorb)) + return ..() + var/mob/living/carbon/carbon_to_absorb = target + if(!carbon_to_absorb.stat == DEAD) owner.balloon_alert(owner, "only works on dead mobs!") return FALSE return ..() -/datum/action/cooldown/bloodling/absorb/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/bloodling/absorb/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner if(istype(target, /obj/item/food/deadmouse)) @@ -44,10 +47,23 @@ ) return TRUE var/mob/living/mob_to_absorb = target - if(!do_after(our_mob, 10 SECONDS)) - return FALSE - our_mob.add_biomass(mob_to_absorb.getMaxHealth() * 0.5) - mob_to_absorb.gib() + if(!iscarbon(mob_to_absorb)) + if(!do_after(our_mob, 10 SECONDS)) + return FALSE + our_mob.add_biomass(mob_to_absorb.getMaxHealth() * 0.5) + mob_to_absorb.gib() + else + var/mob/living/carbon/carbon_to_absorb = target + if(istype(carbon_to_absorb, /mob/living/carbon/human/species/monkey)) + if(!do_after(carbon_to_absorb, 5 SECONDS)) + return FALSE + // Monkeys give less biomass + our_mob.add_biomass(50) + else + if(!do_after(carbon_to_absorb, 10 SECONDS)) + return FALSE + our_mob.add_biomass(100) + carbon_to_absorb.gib() our_mob.visible_message( span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm index e7f3ea535020..ef81131c565c 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm @@ -3,7 +3,7 @@ desc = "Allows you to hide beneath tables and certain objects." button_icon_state = "alien_hide" /// The layer we are on while hiding - var/hide_layer = ABOVE_NORMAL_TURF_LAYER + var/hide_layer = BULLET_HOLE_LAYER /datum/action/cooldown/bloodling/hide/Activate(atom/target) if(owner.layer == hide_layer) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index e22149dbb8ae..b934124d3fa5 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -1,24 +1,24 @@ -/datum/action/cooldown/bloodling/infest +/datum/action/cooldown/mob_cooldown/bloodling/infest name = "Infest" desc = "Allows you to infest a living creature, turning them into a thrall. Can be used on mindshielded people but it takes longer. Costs 75 biomass." button_icon_state = "alien_hide" biomass_cost = 75 -/datum/action/cooldown/bloodling/infest/set_click_ability(mob/on_who) +/datum/action/cooldown/mob_cooldown/bloodling/infest/set_click_ability(mob/on_who) . = ..() if(!.) return to_chat(on_who, span_noticealien("You ready yourself to infest a creature! Click a target to begin infesting it!")) -/datum/action/cooldown/bloodling/infest/unset_click_ability(mob/on_who, refund_cooldown = TRUE) +/datum/action/cooldown/mob_cooldown/bloodling/infest/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() if(!.) return to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to infest...")) -/datum/action/cooldown/bloodling/infest/PreActivate(atom/target) +/datum/action/cooldown/mob_cooldown/bloodling/infest/PreActivate(atom/target) if(!ismob(target)) owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE @@ -31,7 +31,7 @@ return FALSE return ..() -/datum/action/cooldown/bloodling/infest/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/bloodling/infest/Activate(atom/target) var/mob/living/mob = target if(istype(mob, /mob/living/carbon/human)) var/mob/living/carbon/human/carbon_mob = target diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index 865662fd8d64..9a1253af0bf0 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -1,3 +1,38 @@ +/datum/action/cooldown/mob_cooldown/bloodling + name = "debug" + desc = "Yell at coders if you see this" + // The biomass cost of the ability + var/biomass_cost = 0 + +/datum/action/cooldown/mob_cooldown/bloodling/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + // Basically we only want bloodlings to have this + if(!istype(owner, /mob/living/basic/bloodling)) + return FALSE + var/mob/living/basic/bloodling/our_mob = owner + if(our_mob.biomass <= biomass_cost) + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/bloodling/PreActivate(atom/target) + var/mob/living/basic/bloodling/our_mob = owner + // Parent calls Activate(), so if parent returns TRUE, + // it means the activation happened successfuly by this point + . = ..() + if(!.) + return FALSE + // Since bloodlings evolve it may result in them or their abilities going away + // so we can just return true here + if(QDELETED(src) || QDELETED(owner)) + return TRUE + + our_mob.add_biomass(-biomass_cost) + + return TRUE + +// A non mob version for certain abilities (mainly hide, build, slam, shriek, whiplash) /datum/action/cooldown/bloodling name = "debug" desc = "Yell at coders if you see this" diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 8a39c4df3432..37fef7574c90 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -34,7 +34,7 @@ var/evolution_level = 1 /// The abilities this bloodling starts with var/list/initial_powers = list( - /datum/action/cooldown/bloodling/absorb, + /datum/action/cooldown/mob_cooldown/bloodling/absorb, /datum/action/cooldown/bloodling/hide, ) @@ -68,6 +68,7 @@ if(biomass <= 0) gib() + return /// Our health hud is based on biomass, since our health is infinite /mob/living/basic/bloodling/update_health_hud() @@ -109,8 +110,8 @@ /// Creates the bloodlings abilities /mob/living/basic/bloodling/proc/create_abilities() - for(var/datum/action/cooldown/bloodling/path as anything in initial_powers) - var/datum/action/cooldown/bloodling/bloodling_action = new path() + for(var/datum/action/cooldown/mob_cooldown/bloodling/path as anything in initial_powers) + var/datum/action/cooldown/mob_cooldown/bloodling/bloodling_action = new path() bloodling_action.Grant(src) @@ -119,13 +120,13 @@ if(75 > biomass && evolution_level != 1) evolution(1) return - if(125 > biomass >= 75 && evolution_level != 2) + if(125 > biomass && biomass >= 75 && evolution_level != 2) evolution(2) return - if(175 > biomass >= 125 && evolution_level != 3) + if(175 > biomass && biomass >= 125 && evolution_level != 3) evolution(3) return - if(225 > biomass >= 175 && evolution_level != 4) + if(225 > biomass && biomass >= 175 && evolution_level != 4) evolution(4) return if(biomass >= 225 && evolution_level != 5) @@ -171,9 +172,9 @@ icon_living = "guard" evolution_level = 2 initial_powers = list( - /datum/action/cooldown/bloodling/absorb, + /datum/action/cooldown/mob_cooldown/bloodling/absorb, /datum/action/cooldown/bloodling/hide, - /datum/action/cooldown/bloodling/infest, + /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, ) @@ -182,8 +183,8 @@ icon_living = "scout" evolution_level = 3 initial_powers = list( - /datum/action/cooldown/bloodling/absorb, - /datum/action/cooldown/bloodling/infest, + /datum/action/cooldown/mob_cooldown/bloodling/absorb, + /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, ) @@ -191,10 +192,18 @@ icon_state = "ambush" icon_living = "ambush" evolution_level = 4 - initial_powers = list() + initial_powers = list( + /datum/action/cooldown/mob_cooldown/bloodling/absorb, + /datum/action/cooldown/mob_cooldown/bloodling/infest, + /datum/action/cooldown/bloodling/build, + ) /mob/living/basic/bloodling/tier5 icon_state = "hunter" icon_living = "hunter" evolution_level = 5 - initial_powers = list() + initial_powers = list( + /datum/action/cooldown/mob_cooldown/bloodling/absorb, + /datum/action/cooldown/mob_cooldown/bloodling/infest, + /datum/action/cooldown/bloodling/build, + ) From e3d13beb2e4cd928a32ab920fa0c878f45816439 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 20 Jan 2024 16:18:04 +0100 Subject: [PATCH 023/113] Devour limb --- .../bloodling/abilities/absorb_biomass.dm | 2 +- .../antagonists/bloodling/abilities/devour.dm | 55 +++++++++++++++++++ .../bloodling/mobs/bloodling_mob.dm | 3 + tgstation.dme | 1 + 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 82331b423cc5..20afe91b746b 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -29,7 +29,7 @@ return ..() var/mob/living/carbon/carbon_to_absorb = target if(!carbon_to_absorb.stat == DEAD) - owner.balloon_alert(owner, "only works on dead mobs!") + owner.balloon_alert(owner, "only works on dead carbons!") return FALSE return ..() diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index e69de29bb2d1..1b1664e69dd6 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -0,0 +1,55 @@ +/datum/action/cooldown/mob_cooldown/bloodling/devour + name = "Devour Limb" + desc = "Allows you to consume a creatures limb." + button_icon_state = "alien_hide" + cooldown_time = 20 SECONDS + +/datum/action/cooldown/mob_cooldown/bloodling/devour/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + to_chat(on_who, span_noticealien("You prepare to swallow a limb whole. Click a target to rip off a limb!")) + +/datum/action/cooldown/mob_cooldown/bloodling/devour/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to rip off their limb...")) + +/datum/action/cooldown/mob_cooldown/bloodling/devour/PreActivate(atom/target) + var/mob/living/mob = target + if(!iscarbon(mob)) + owner.balloon_alert(owner, "only works on carbons!") + return FALSE + return ..() + +/datum/action/cooldown/mob_cooldown/bloodling/devour/Activate(atom/target) + var/mob/living/basic/bloodling/our_mob = owner + var/list/candidate_for_removal = list() + var/mob/living/carbon/carbon_target = target + + for(var/obj/item/bodypart/bodypart in carbon_target.bodyparts) + if(bodypart.body_zone == BODY_ZONE_CHEST) + continue + if(bodypart.bodypart_flags & BODYPART_UNREMOVABLE) + continue + candidate_for_removal += bodypart.body_zone + + if(!length(candidate_for_removal)) + return + + var/limb_to_remove = pick(candidate_for_removal) + var/obj/item/bodypart/target_part = carbon_target.get_bodypart(limb_to_remove) + + if(isnull(target_part)) + return + + target_part.dismember() + qdel(target_part) + our_mob.add_biomass(20) + + our_mob.visible_message( + span_alertalien("[our_mob] snaps its maw over [target]s [target_part] and swiftly devours it!"), + span_noticealien("You devour [target]s [target_part]!"), + ) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 37fef7574c90..85305dd2d7c7 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -186,6 +186,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb, /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, + /datum/action/cooldown/mob_cooldown/bloodling/devour, ) /mob/living/basic/bloodling/tier4 @@ -196,6 +197,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb, /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, + /datum/action/cooldown/mob_cooldown/bloodling/devour, ) /mob/living/basic/bloodling/tier5 @@ -206,4 +208,5 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb, /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, + /datum/action/cooldown/mob_cooldown/bloodling/devour, ) diff --git a/tgstation.dme b/tgstation.dme index ff018813728f..48f4f71c012f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5714,6 +5714,7 @@ #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\devour.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" From d73271debef1516cbe353d5a601076469668422e Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 24 Jan 2024 07:51:41 +0100 Subject: [PATCH 024/113] Evolution fix, dissonant shriek and transfer biomass --- .../bloodling/abilities/dissonant_shriek.dm | 19 ++++++++++++++ .../bloodling/abilities/transfer_biomass.dm | 25 +++++++++++++++++++ .../bloodling/bloodling_abilities.dm | 2 +- .../bloodling/mobs/bloodling_mob.dm | 9 ++++--- tgstation.dme | 2 ++ 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm b/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm new file mode 100644 index 000000000000..3afbccbdf8aa --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm @@ -0,0 +1,19 @@ +/datum/action/cooldown/bloodling/dissonant_shriek + name = "Dissonant Shriek" + desc = "We release a sound that disrupts nearby electronics. Costs 20 biomass." + button_icon_state = "dissonant_shriek" + biomass_cost = 20 + cooldowns = 20 SECONDS + +/datum/action/cooldown/bloodling/dissonant_shriek/Activate(atom/target) + ..() + if(owner.movement_type & VENTCRAWLING) + owner.balloon_alert(owner, "can't shriek in pipes!") + return FALSE + empulse(get_turf(owner), 2, 5, 1) + for(var/obj/machinery/light/L in range(5, usr)) + L.on = TRUE + L.break_light_tube() + stoplag() + + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm new file mode 100644 index 000000000000..2612ab5cb85b --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm @@ -0,0 +1,25 @@ +/datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass + name = "Transfer Biomass" + desc = "Transfer biomass to another organism." + button_icon_state = "dissonant_shriek" + +/datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass/PreActivate(atom/target) + if(get_dist(owner, target) > 1) + to_chat(owner, span_noticealien("You need to be closer!")) + return FALSE + return ..() + +/datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass/Activate(atom/target) + var/mob/living/basic/bloodling/our_mob = owner + var/mob/living/basic/bloodling/donation_target = target + + var/amount = tgui_input_number(our_mob, "Amount", "Transfer Biomass to [donation_target]", max_value = our_mob.biomass) + if(QDELETED(donation_target) || QDELETED(src) || QDELETED(our_mob) || !IsAvailable(feedback = TRUE) || isnull(amount) || amount <= 0) + return FALSE + + donation_target.add_biomass(amount) + our_mob.add_biomass(-amount) + + to_chat(donation_target, span_noticealien("[our_mob] has transferred [amount] biomass to you.")) + to_chat(our_mob, span_noticealien("You transfer [amount] biomass to [donation_target].")) + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm index 9a1253af0bf0..d3c97886ac8c 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling name = "debug" desc = "Yell at coders if you see this" - // The biomass cost of the ability + /// The biomass cost of the ability var/biomass_cost = 0 /datum/action/cooldown/mob_cooldown/bloodling/IsAvailable(feedback = FALSE) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 85305dd2d7c7..3f4233ba0c44 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -120,13 +120,13 @@ if(75 > biomass && evolution_level != 1) evolution(1) return - if(125 > biomass && biomass >= 75 && evolution_level != 2) + if(125 > biomass >= 75 && evolution_level != 2) evolution(2) return - if(175 > biomass && biomass >= 125 && evolution_level != 3) + if(175 > biomass >= 125 && evolution_level != 3) evolution(3) return - if(225 > biomass && biomass >= 175 && evolution_level != 4) + if(225 > biomass >= 175 && evolution_level != 4) evolution(4) return if(biomass >= 225 && evolution_level != 5) @@ -187,6 +187,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, + /datum/action/cooldown/bloodling/dissonant_shriek, ) /mob/living/basic/bloodling/tier4 @@ -198,6 +199,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, + /datum/action/cooldown/bloodling/dissonant_shriek, ) /mob/living/basic/bloodling/tier5 @@ -209,4 +211,5 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, + /datum/action/cooldown/bloodling/dissonant_shriek, ) diff --git a/tgstation.dme b/tgstation.dme index 48f4f71c012f..af80b3dcba59 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5715,8 +5715,10 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\devour.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\dissonant_shriek.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\transfer_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\clock_cult\area.dm" #include "monkestation\code\modules\antagonists\clock_cult\dynamic_ruleset.dm" From a6921b9d06699f7f7dd3ee5fdcd618d530114555 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 24 Jan 2024 07:52:56 +0100 Subject: [PATCH 025/113] Update bloodling_mob.dm --- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 3f4233ba0c44..77afe1c8b820 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -187,7 +187,6 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, - /datum/action/cooldown/bloodling/dissonant_shriek, ) /mob/living/basic/bloodling/tier4 From f68620b6d0ddbc105b0b9f51ad48e882b47d877d Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:08:01 +0100 Subject: [PATCH 026/113] whiplash ability --- .../bloodling/abilities/absorb_biomass.dm | 3 ++ .../bloodling/abilities/dissonant_shriek.dm | 3 +- .../bloodling/abilities/whiplash.dm | 50 +++++++++++++++++++ .../bloodling/mobs/bloodling_mob.dm | 6 ++- tgstation.dme | 1 + 5 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 20afe91b746b..73645b53ef5d 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -17,6 +17,8 @@ to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to claim biomass...")) /datum/action/cooldown/mob_cooldown/bloodling/absorb/PreActivate(atom/target) + if(owner == target) + return FALSE if(get_dist(owner, target) > 1) return FALSE if(istype(target, /obj/item/food/deadmouse)) @@ -46,6 +48,7 @@ span_noticealien("You wrap your tendrils around [target] and absorb it!"), ) return TRUE + var/mob/living/mob_to_absorb = target if(!iscarbon(mob_to_absorb)) if(!do_after(our_mob, 10 SECONDS)) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm b/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm index 3afbccbdf8aa..d7fa69eb715f 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm @@ -2,8 +2,7 @@ name = "Dissonant Shriek" desc = "We release a sound that disrupts nearby electronics. Costs 20 biomass." button_icon_state = "dissonant_shriek" - biomass_cost = 20 - cooldowns = 20 SECONDS + biomass_cost = 30 /datum/action/cooldown/bloodling/dissonant_shriek/Activate(atom/target) ..() diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm new file mode 100644 index 000000000000..00349ad9e7ac --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm @@ -0,0 +1,50 @@ +/datum/action/cooldown/spell/aoe/repulse/bloodling + name = "Whiplash" + desc = "Grow whiplike appendages and throw back nearby attackers." + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + button_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "tailsweep" + panel = "Alien" + sound = 'sound/magic/tail_swing.ogg' + + spell_requirements = NONE + + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + invocation_type = INVOCATION_NONE + antimagic_flags = NONE + aoe_radius = 2 + + sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep + + + /// Since this isn't a bloodling subtype ability we need to recode the cost here + var/biomass_cost = 25 + +/datum/action/cooldown/spell/aoe/repulse/bloodling/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + // Basically we only want bloodlings to have this + if(!istype(owner, /mob/living/basic/bloodling)) + return FALSE + var/mob/living/basic/bloodling/our_mob = owner + if(our_mob.biomass <= biomass_cost) + return FALSE + return TRUE + +/datum/action/cooldown/spell/aoe/repulse/bloodling/PreActivate(atom/target) + var/mob/living/basic/bloodling/our_mob = owner + // Parent calls Activate(), so if parent returns TRUE, + // it means the activation happened successfuly by this point + . = ..() + if(!.) + return FALSE + // Since bloodlings evolve it may result in them or their abilities going away + // so we can just return true here + if(QDELETED(src) || QDELETED(owner)) + return TRUE + + our_mob.add_biomass(-biomass_cost) + + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 77afe1c8b820..5204c9e87048 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -110,8 +110,8 @@ /// Creates the bloodlings abilities /mob/living/basic/bloodling/proc/create_abilities() - for(var/datum/action/cooldown/mob_cooldown/bloodling/path as anything in initial_powers) - var/datum/action/cooldown/mob_cooldown/bloodling/bloodling_action = new path() + for(var/datum/action/path as anything in initial_powers) + var/datum/action/bloodling_action = new path() bloodling_action.Grant(src) @@ -199,6 +199,7 @@ /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, /datum/action/cooldown/bloodling/dissonant_shriek, + /datum/action/cooldown/spell/aoe/repulse/bloodling, ) /mob/living/basic/bloodling/tier5 @@ -211,4 +212,5 @@ /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, /datum/action/cooldown/bloodling/dissonant_shriek, + /datum/action/cooldown/spell/aoe/repulse/bloodling, ) diff --git a/tgstation.dme b/tgstation.dme index 6865b44d8495..70d2e98185fd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5742,6 +5742,7 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\transfer_biomass.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\whiplash.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\_common\antag_datum.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing.dm" From 2163ca92f06d9e99a414af7e6ecf4eaf824b0f1c Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 28 Jan 2024 12:33:39 +0100 Subject: [PATCH 027/113] Adds in minions, refactors the mob itself, adds the saymode to a modular file --- code/datums/saymode.dm | 28 --- monkestation/code/__DEFINES/saymode.dm | 25 +++ .../bloodling/mobs/bloodling_mob.dm | 160 ++++++++++-------- .../antagonists/bloodling/mobs/minions.dm | 18 ++ tgstation.dme | 2 + 5 files changed, 139 insertions(+), 94 deletions(-) create mode 100644 monkestation/code/__DEFINES/saymode.dm create mode 100644 monkestation/code/modules/antagonists/bloodling/mobs/minions.dm diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index b4d2c818a027..60d3bd594e2d 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -110,31 +110,3 @@ return TRUE MF.send_message(span_changeling("[R.body.real_name]: [message]"), "mafia") return FALSE - -// Start of Monkestation edit -/datum/saymode/bloodling - key = "f" - mode = MODE_BLOODLING - -/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) - //we can send the message - if(!user.mind) - return FALSE - var/datum/antagonist/bloodling/bloodling_sender = user.mind.has_antag_datum(/datum/antagonist/bloodling) - if(!bloodling_sender) - return FALSE - - user.log_talk(message, LOG_SAY, tag="bloodling [user]") - var/msg = span_changeling("[user]: [message]") - - //the recipients can recieve the message - for(var/datum/antagonist/bloodling/reciever in GLOB.antagonists) - if(!reciever.owner) - continue - var/mob/living/ling_mob = reciever.owner.current - to_chat(ling_mob, msg) - - for(var/mob/dead/ghost as anything in GLOB.dead_mob_list) - to_chat(ghost, "[FOLLOW_LINK(ghost, user)] [msg]") - return FALSE -// End of monkestation edits diff --git a/monkestation/code/__DEFINES/saymode.dm b/monkestation/code/__DEFINES/saymode.dm new file mode 100644 index 000000000000..9b99cef26652 --- /dev/null +++ b/monkestation/code/__DEFINES/saymode.dm @@ -0,0 +1,25 @@ +/datum/saymode/bloodling + key = "f" + mode = MODE_BLOODLING + +/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) + //we can send the message + if(!user.mind) + return FALSE + var/datum/antagonist/bloodling/bloodling_sender = user.mind.has_antag_datum(/datum/antagonist/bloodling) + if(!bloodling_sender) + return FALSE + + user.log_talk(message, LOG_SAY, tag="bloodling [user]") + var/msg = span_changeling("[user]: [message]") + + //the recipients can recieve the message + for(var/datum/antagonist/bloodling/reciever in GLOB.antagonists) + if(!reciever.owner) + continue + var/mob/living/ling_mob = reciever.owner.current + to_chat(ling_mob, msg) + + for(var/mob/dead/ghost as anything in GLOB.dead_mob_list) + to_chat(ghost, "[FOLLOW_LINK(ghost, user)] [msg]") + return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 5204c9e87048..d88bf671d801 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -1,56 +1,83 @@ /mob/living/basic/bloodling - name = "bloodling" - desc = "A disgusting mass of bone and flesh. It reaches out around it with fleshy tendrils." + name = "abstract bloodling" + desc = "A disgusting mass of code and flesh. Report this as an issue if you see it." icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "maint_spider" icon_living = "maint_spider" icon_dead = "maint_spider_dead" gender = NEUTER - health = INFINITY //Bloodlings don't use health, they use biomass instead - maxHealth = INFINITY + health = 50 + maxHealth = 50 melee_damage_lower = 5 melee_damage_upper = 5 attack_verb_continuous = "chomps" attack_verb_simple = "chomp" attack_sound = 'sound/weapons/bite.ogg' attack_vis_effect = ATTACK_EFFECT_BITE - faction = list(FACTION_CREATURE) obj_damage = 0 speed = 2.8 environment_smash = ENVIRONMENT_SMASH_NONE mob_biotypes = MOB_ORGANIC speak_emote = list("spews") basic_mob_flags = FLAMMABLE_MOB - sight = SEE_SELF|SEE_MOBS + sight = SEE_SELF faction = list(FACTION_BLOODLING) pass_flags = PASSTABLE attack_sound = 'sound/effects/attackblob.ogg' /// The amount of biomass our bloodling has - var/biomass = 50 + var/biomass = 1 /// The maximum amount of biomass a bloodling can gain - var/biomass_max = 500 - /// The evolution level our bloodling is on - var/evolution_level = 1 + var/biomass_max = 1 /// The abilities this bloodling starts with var/list/initial_powers = list( /datum/action/cooldown/mob_cooldown/bloodling/absorb, - /datum/action/cooldown/bloodling/hide, ) /mob/living/basic/bloodling/Initialize(mapload) . = ..() create_abilities() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - - RegisterSignal(src, COMSIG_LIVING_LIFE, PROC_REF(on_life)) - RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) /mob/living/basic/bloodling/get_status_tab_items() . = ..() . += "Current Biomass: [biomass >= biomass_max ? biomass : "[biomass] / [biomass_max]"] E" -/mob/living/basic/bloodling/adjust_health(amount, updating_health = TRUE, forced = FALSE) +/// Used for adding biomass to every bloodling type +/// ARGUEMENTS: +/// amount-The amount of biomass to be added or subtracted +/mob/living/basic/bloodling/proc/add_biomass(amount) + if(biomass + amount >= biomass_max) + biomass = biomass_max + balloon_alert(src, "already maximum biomass") + return + + biomass += amount + +/// Creates the bloodlings abilities +/mob/living/basic/bloodling/proc/create_abilities() + for(var/datum/action/path as anything in initial_powers) + var/datum/action/bloodling_action = new path() + bloodling_action.Grant(src) + + +// The actual bloodling mob +/mob/living/basic/bloodling/proper + maxHealth = INFINITE // Bloodlings have unlimited health, instead biomass acts as their health + health = INFINITE + sight = SEE_SELF|SEE_MOBS + + biomass = 50 + biomass_max = 500 + /// The evolution level our bloodling is on + var/evolution_level = 0 + +/mob/living/basic/bloodling/proper/Initialize(mapload) + . = ..() + + RegisterSignal(src, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + +/mob/living/basic/bloodling/proper/adjust_health(amount, updating_health = TRUE, forced = FALSE) if(!forced) return 0 @@ -63,42 +90,16 @@ return . /// On_life proc that checks their amount of biomass -/mob/living/basic/bloodling/proc/on_life(seconds_per_tick = SSMOBS_DT, times_fired) +/mob/living/basic/bloodling/proper/proc/on_life(seconds_per_tick = SSMOBS_DT, times_fired) SIGNAL_HANDLER if(biomass <= 0) gib() return -/// Our health hud is based on biomass, since our health is infinite -/mob/living/basic/bloodling/update_health_hud() - if(isnull(hud_used)) - return - - hud_used.healths.maptext = MAPTEXT("
[biomass]E
") - -/// Checks for damage to update the bloodlings biomass accordingly -/mob/living/basic/bloodling/proc/on_damaged(datum/source, damage, damagetype) - SIGNAL_HANDLER - - // Stamina damage is fucky, so we ignore it - if(damagetype == STAMINA) - return - - // Bloodlings take damage through their biomass, not regular damage - add_biomass(-damage) - -/// Used for adding biomass to the bloodling since health needs updating accordingly -/// ARGUEMENTS: -/// amount-The amount of biomass to be added or subtracted -/mob/living/basic/bloodling/proc/add_biomass(amount) - if(biomass + amount >= biomass_max) - biomass = biomass_max - balloon_alert(src, "already maximum biomass") - return - - biomass += amount - +// Bloodlings health and damage needs updating when biomass is added +/mob/living/basic/bloodling/proper/add_biomass(amount) + . = ..() // Damage is based on biomass, and handled here obj_damage = biomass * 0.2 // less than 5 damage would be very bad @@ -108,15 +109,8 @@ update_health_hud() check_evolution() -/// Creates the bloodlings abilities -/mob/living/basic/bloodling/proc/create_abilities() - for(var/datum/action/path as anything in initial_powers) - var/datum/action/bloodling_action = new path() - bloodling_action.Grant(src) - - -/// Checks if we should evolve -/mob/living/basic/bloodling/proc/check_evolution() +/// Checks if we should evolve, and also calls the evolution proc +/mob/living/basic/bloodling/proper/proc/check_evolution() if(75 > biomass && evolution_level != 1) evolution(1) return @@ -134,23 +128,23 @@ return /// Creates the mob for us to then mindswap into -/mob/living/basic/bloodling/proc/evolution(tier) +/mob/living/basic/bloodling/proper/proc/evolution(tier) var/new_bloodling = null switch(tier) if(1) - new_bloodling = new /mob/living/basic/bloodling(src.loc) + new_bloodling = new /mob/living/basic/bloodling/proper/tier1/(src.loc) if(2) - new_bloodling = new /mob/living/basic/bloodling/tier2(src.loc) + new_bloodling = new /mob/living/basic/bloodling/proper/tier2(src.loc) if(3) - new_bloodling = new /mob/living/basic/bloodling/tier3(src.loc) + new_bloodling = new /mob/living/basic/bloodling/proper/tier3(src.loc) if(4) - new_bloodling = new /mob/living/basic/bloodling/tier4(src.loc) + new_bloodling = new /mob/living/basic/bloodling/proper/tier4(src.loc) if(5) - new_bloodling = new /mob/living/basic/bloodling/tier5(src.loc) + new_bloodling = new /mob/living/basic/bloodling/proper/tier5(src.loc) evolution_mind_change(new_bloodling) -/mob/living/basic/bloodling/proc/evolution_mind_change(var/mob/living/basic/bloodling/new_bloodling) +/mob/living/basic/bloodling/proper/proc/evolution_mind_change(var/mob/living/basic/bloodling/proper/new_bloodling) visible_message( span_alertalien("[src] begins to grow!"), span_noticealien("You evolve!"), @@ -167,7 +161,37 @@ new_bloodling.add_biomass(biomass) qdel(src) -/mob/living/basic/bloodling/tier2 +/// Our health hud is based on biomass, since our health is infinite +/mob/living/basic/bloodling/proper/update_health_hud() + if(isnull(hud_used)) + return + + hud_used.healths.maptext = MAPTEXT("
[biomass]E
") + +/// Checks for damage to update the bloodlings biomass accordingly +/mob/living/basic/bloodling/proper/proc/on_damaged(datum/source, damage, damagetype) + SIGNAL_HANDLER + + // Stamina damage is fucky, so we ignore it + if(damagetype == STAMINA) + return + + // Bloodlings take damage through their biomass, not regular damage + add_biomass(-damage) + +/mob/living/basic/bloodling/proper/tier1 + evolution_level = 1 + initial_powers = list( + /datum/action/cooldown/mob_cooldown/bloodling/absorb, + /datum/action/cooldown/bloodling/hide, + ) + speed = 0.5 + +/mob/living/basic/bloodling/proper/tier1/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/mob/living/basic/bloodling/proper/tier2 icon_state = "guard" icon_living = "guard" evolution_level = 2 @@ -177,8 +201,9 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, ) + speed = 1 -/mob/living/basic/bloodling/tier3 +/mob/living/basic/bloodling/proper/tier3 icon_state = "scout" icon_living = "scout" evolution_level = 3 @@ -188,8 +213,9 @@ /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, ) + speed = 1.5 -/mob/living/basic/bloodling/tier4 +/mob/living/basic/bloodling/proper/tier4 icon_state = "ambush" icon_living = "ambush" evolution_level = 4 @@ -201,8 +227,9 @@ /datum/action/cooldown/bloodling/dissonant_shriek, /datum/action/cooldown/spell/aoe/repulse/bloodling, ) + speed = 2 -/mob/living/basic/bloodling/tier5 +/mob/living/basic/bloodling/proper/tier5 icon_state = "hunter" icon_living = "hunter" evolution_level = 5 @@ -214,3 +241,4 @@ /datum/action/cooldown/bloodling/dissonant_shriek, /datum/action/cooldown/spell/aoe/repulse/bloodling, ) + speed = 2.5 diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm new file mode 100644 index 000000000000..c708807e47a1 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -0,0 +1,18 @@ +/mob/living/basic/bloodling/harvester + name = "harvester" + desc = "A mass of flesh in a vague shape, it has two large talons for harvesting." + health = 100 + maxHealth = 100 + melee_damage_lower = 15 + melee_damage_upper = 15 + speed = 0.5 + + biomass = 0 + biomass_max = 200 + initial_powers = list( + /datum/action/cooldown/mob_cooldown/bloodling/absorb, + ) + +/mob/living/basic/bloodling/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/tgstation.dme b/tgstation.dme index 70d2e98185fd..64a0ab5501ff 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5620,6 +5620,7 @@ #include "monkestation\code\__DEFINES\antagonists.dm" #include "monkestation\code\__DEFINES\mobfactions.dm" #include "monkestation\code\__DEFINES\projectile.dm" +#include "monkestation\code\__DEFINES\saymode.dm" #include "monkestation\code\__HELPERS\_lists.dm" #include "monkestation\code\__HELPERS\anime.dm" #include "monkestation\code\__HELPERS\reagents.dm" @@ -5745,6 +5746,7 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\whiplash.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\_common\antag_datum.dm" +#include "monkestation\code\modules\antagonists\bloodling\mobs\minions.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_alert.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_helpers.dm" From 825ac6e2384af43cc68e9054d57e110cdeaed95a Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 29 Jan 2024 15:27:10 +0100 Subject: [PATCH 028/113] mind checks, transfer biomass fixes, devour fixes, --- monkestation/code/__DEFINES/antagonists.dm | 6 +++ monkestation/code/__DEFINES/saymode.dm | 8 ++-- .../antagonists/bloodling/abilities/devour.dm | 4 ++ .../bloodling/abilities/transfer_biomass.dm | 11 +++++- .../bloodling/abilities/whiplash.dm | 1 - .../bloodling/mobs/bloodling_mob.dm | 9 +++-- .../antagonists/bloodling/mobs/minions.dm | 39 ++++++++++++++----- 7 files changed, 59 insertions(+), 19 deletions(-) diff --git a/monkestation/code/__DEFINES/antagonists.dm b/monkestation/code/__DEFINES/antagonists.dm index b33b5e4af344..06cde8d750e6 100644 --- a/monkestation/code/__DEFINES/antagonists.dm +++ b/monkestation/code/__DEFINES/antagonists.dm @@ -1,5 +1,11 @@ /// If the given mob is a bloodling #define IS_BLOODLING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/bloodling)) +/// If the given mob is a bloodling thrall +#define IS_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling/bloodling_thrall) || mob?.mind?.has_antag_datum(/datum/antagonist/infested_thrall)) + +/// If the given mob is a bloodling thrall or bloodling +#define IS_BLOODLING_OR_THRALL(mob) (IS_BLOODLING(mob) || IS_BLOODLING_THRALL(mob)) + /// Antagonist panel groups #define ANTAG_GROUP_BLOODLING "Bloodling" diff --git a/monkestation/code/__DEFINES/saymode.dm b/monkestation/code/__DEFINES/saymode.dm index 9b99cef26652..0f17d0c7fbf6 100644 --- a/monkestation/code/__DEFINES/saymode.dm +++ b/monkestation/code/__DEFINES/saymode.dm @@ -1,12 +1,12 @@ /datum/saymode/bloodling - key = "f" + key = "q" mode = MODE_BLOODLING /datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) //we can send the message if(!user.mind) return FALSE - var/datum/antagonist/bloodling/bloodling_sender = user.mind.has_antag_datum(/datum/antagonist/bloodling) + var/datum/antagonist/bloodling_sender = IS_BLOODLING_OR_THRALL(user) if(!bloodling_sender) return FALSE @@ -14,9 +14,11 @@ var/msg = span_changeling("[user]: [message]") //the recipients can recieve the message - for(var/datum/antagonist/bloodling/reciever in GLOB.antagonists) + for(var/datum/antagonist/reciever in GLOB.antagonists) if(!reciever.owner) continue + if(!IS_BLOODLING_OR_THRALL(reciever.owner)) + continue var/mob/living/ling_mob = reciever.owner.current to_chat(ling_mob, msg) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index 1b1664e69dd6..3a8ed549486f 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -2,6 +2,7 @@ name = "Devour Limb" desc = "Allows you to consume a creatures limb." button_icon_state = "alien_hide" + cooldown_time = 20 SECONDS /datum/action/cooldown/mob_cooldown/bloodling/devour/set_click_ability(mob/on_who) @@ -30,6 +31,8 @@ var/mob/living/carbon/carbon_target = target for(var/obj/item/bodypart/bodypart in carbon_target.bodyparts) + if(bodypart.body_zone == BODY_ZONE_HEAD) + continue if(bodypart.body_zone == BODY_ZONE_CHEST) continue if(bodypart.bodypart_flags & BODYPART_UNREMOVABLE) @@ -53,3 +56,4 @@ span_alertalien("[our_mob] snaps its maw over [target]s [target_part] and swiftly devours it!"), span_noticealien("You devour [target]s [target_part]!"), ) + StartCooldown() diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm index 2612ab5cb85b..c705bd843d82 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm @@ -3,9 +3,16 @@ desc = "Transfer biomass to another organism." button_icon_state = "dissonant_shriek" +/datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + to_chat(on_who, span_noticealien("You prepare to send biomass. Click a target to transfer!")) + /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass/PreActivate(atom/target) - if(get_dist(owner, target) > 1) - to_chat(owner, span_noticealien("You need to be closer!")) + var/mob/living/mob = target + if(!istype(mob, /mob/living/basic/bloodling)) + owner.balloon_alert(owner, "only works on bloodlings!") return FALSE return ..() diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm index 00349ad9e7ac..3ddd7e3ed2e1 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm @@ -17,7 +17,6 @@ sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep - /// Since this isn't a bloodling subtype ability we need to recode the cost here var/biomass_cost = 25 diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index d88bf671d801..fe4a304d724a 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -20,7 +20,7 @@ mob_biotypes = MOB_ORGANIC speak_emote = list("spews") basic_mob_flags = FLAMMABLE_MOB - sight = SEE_SELF + sight = SEE_SELF|SEE_MOBS faction = list(FACTION_BLOODLING) pass_flags = PASSTABLE attack_sound = 'sound/effects/attackblob.ogg' @@ -40,7 +40,7 @@ /mob/living/basic/bloodling/get_status_tab_items() . = ..() - . += "Current Biomass: [biomass >= biomass_max ? biomass : "[biomass] / [biomass_max]"] E" + . += "Current Biomass: [biomass >= biomass_max ? biomass : "[biomass] / [biomass_max]"] B" /// Used for adding biomass to every bloodling type /// ARGUEMENTS: @@ -60,11 +60,10 @@ bloodling_action.Grant(src) -// The actual bloodling mob +//////////////////// The actual bloodling mob //////////////////// /mob/living/basic/bloodling/proper maxHealth = INFINITE // Bloodlings have unlimited health, instead biomass acts as their health health = INFINITE - sight = SEE_SELF|SEE_MOBS biomass = 50 biomass_max = 500 @@ -226,6 +225,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/devour, /datum/action/cooldown/bloodling/dissonant_shriek, /datum/action/cooldown/spell/aoe/repulse/bloodling, + /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, ) speed = 2 @@ -240,5 +240,6 @@ /datum/action/cooldown/mob_cooldown/bloodling/devour, /datum/action/cooldown/bloodling/dissonant_shriek, /datum/action/cooldown/spell/aoe/repulse/bloodling, + /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, ) speed = 2.5 diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm index c708807e47a1..9f2e4a5fb6c0 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -1,18 +1,39 @@ -/mob/living/basic/bloodling/harvester - name = "harvester" - desc = "A mass of flesh in a vague shape, it has two large talons for harvesting." - health = 100 - maxHealth = 100 - melee_damage_lower = 15 - melee_damage_upper = 15 - speed = 0.5 +/mob/living/basic/bloodling/minion + name = "minion" + desc = "A mass of code in a vague sprite. Report if you see this." biomass = 0 biomass_max = 200 initial_powers = list( /datum/action/cooldown/mob_cooldown/bloodling/absorb, + /datum/action/cooldown/mob_cooldown/bloodling/devour, + /datum/action/cooldown/spell/aoe/repulse/bloodling, + /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, ) -/mob/living/basic/bloodling/Initialize(mapload) +/mob/living/basic/bloodling/minion/harvester + name = "harvester" + desc = "A vague mass of flesh with two large scything talons." + + health = 100 + maxHealth = 100 + melee_damage_lower = 15 + melee_damage_upper = 15 + speed = 0.5 + wound_bonus = -40 + bare_wound_bonus = 5 + sharpness = SHARP_EDGED + +/mob/living/basic/bloodling/minion/harvester/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/mob/living/basic/bloodling/minion/wall + name = "wall of flesh" + desc = "A blobby mass of flesh of large size." + + health = 200 + maxHealth = 200 + melee_damage_lower = 10 + melee_damage_upper = 10 + speed = 2.5 From 39883be30b0d5470b3e16ed5956a5fde8bfdee61 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:32:45 +0100 Subject: [PATCH 029/113] magic word to fix compile issues --- monkestation/code/__DEFINES/saymode.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/__DEFINES/saymode.dm b/monkestation/code/__DEFINES/saymode.dm index 0f17d0c7fbf6..643613bae2b7 100644 --- a/monkestation/code/__DEFINES/saymode.dm +++ b/monkestation/code/__DEFINES/saymode.dm @@ -17,7 +17,7 @@ for(var/datum/antagonist/reciever in GLOB.antagonists) if(!reciever.owner) continue - if(!IS_BLOODLING_OR_THRALL(reciever.owner)) + if(!IS_BLOODLING_OR_THRALL(reciever.owner.current)) continue var/mob/living/ling_mob = reciever.owner.current to_chat(ling_mob, msg) From d9af68f136fdba7e3a6b264072a62d8abd0ae6d5 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:39:40 +0100 Subject: [PATCH 030/113] maybe fixes lint idk imma go to the gym --- tgstation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 64a0ab5501ff..6b332d8714d2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5732,6 +5732,7 @@ #include "monkestation\code\modules\aesthetics\objects\windows.dm" #include "monkestation\code\modules\aesthetics\subsystem\coloring.dm" #include "monkestation\code\modules\aesthetics\walls\iron.dm" +#include "monkestation\code\modules\antagonists\_common\antag_datum.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" #include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" @@ -5745,7 +5746,6 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\transfer_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\whiplash.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" -#include "monkestation\code\modules\antagonists\_common\antag_datum.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\minions.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_alert.dm" From 99408154dbb3782b87b9e981f618276998537198 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:45:46 +0100 Subject: [PATCH 031/113] Update bloodling_mob.dm --- .../modules/antagonists/bloodling/mobs/bloodling_mob.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index fe4a304d724a..ea1fc519d397 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -178,6 +178,12 @@ // Bloodlings take damage through their biomass, not regular damage add_biomass(-damage) +/mob/living/basic/bloodling/proper/Destroy() + UnregisterSignal(src, COMSIG_LIVING_LIFE) + UnregisterSignal(src, COMSIG_MOB_APPLY_DAMAGE) + + . = ..() + /mob/living/basic/bloodling/proper/tier1 evolution_level = 1 initial_powers = list( From bb613782bf2ecf2f34ebbbfd3112d3c820bf0f4e Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Tue, 30 Jan 2024 07:33:14 +0100 Subject: [PATCH 032/113] Update bloodling_mob.dm --- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index ea1fc519d397..46e4d215626a 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -182,7 +182,7 @@ UnregisterSignal(src, COMSIG_LIVING_LIFE) UnregisterSignal(src, COMSIG_MOB_APPLY_DAMAGE) - . = ..() + return ..() /mob/living/basic/bloodling/proper/tier1 evolution_level = 1 From b923bad3814734f3015f3a334b9f383d9fec4345 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Tue, 30 Jan 2024 07:48:56 +0100 Subject: [PATCH 033/113] Gibs bloodlings on death --- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 46e4d215626a..682ea1767ca5 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -59,6 +59,9 @@ var/datum/action/bloodling_action = new path() bloodling_action.Grant(src) +/mob/living/basic/bloodling/death() + gib() + return ..() //////////////////// The actual bloodling mob //////////////////// /mob/living/basic/bloodling/proper From ba62642ea5f4d572b7e1188f2b7421f6732dc9b0 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 3 Feb 2024 11:06:58 +0100 Subject: [PATCH 034/113] Heal and absorb biomass rework --- monkestation/code/__DEFINES/antagonists.dm | 7 ++- .../bloodling/abilities/absorb_biomass.dm | 28 +++++------ .../antagonists/bloodling/abilities/devour.dm | 6 +-- .../antagonists/bloodling/abilities/heal.dm | 48 +++++++++++++++++++ .../antagonists/bloodling/abilities/infest.dm | 2 + .../bloodling/mobs/bloodling_mob.dm | 4 ++ tgstation.dme | 1 + 7 files changed, 75 insertions(+), 21 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/heal.dm diff --git a/monkestation/code/__DEFINES/antagonists.dm b/monkestation/code/__DEFINES/antagonists.dm index 06cde8d750e6..beb7969e0dfb 100644 --- a/monkestation/code/__DEFINES/antagonists.dm +++ b/monkestation/code/__DEFINES/antagonists.dm @@ -2,10 +2,13 @@ #define IS_BLOODLING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/bloodling)) /// If the given mob is a bloodling thrall -#define IS_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling/bloodling_thrall) || mob?.mind?.has_antag_datum(/datum/antagonist/infested_thrall)) +#define IS_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling/bloodling_thrall)) + +/// If the given mob is a simplemob bloodling thrall +#define IS_SIMPLEMOB_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/infested_thrall)) /// If the given mob is a bloodling thrall or bloodling -#define IS_BLOODLING_OR_THRALL(mob) (IS_BLOODLING(mob) || IS_BLOODLING_THRALL(mob)) +#define IS_BLOODLING_OR_THRALL(mob) (IS_BLOODLING(mob) || IS_BLOODLING_THRALL(mob) || IS_SIMPLEMOB_BLOODLING_THRALL(mob)) /// Antagonist panel groups #define ANTAG_GROUP_BLOODLING "Bloodling" diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 73645b53ef5d..f5002d321882 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -37,11 +37,11 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner + var/absorb_time = 5 SECONDS + var/biomass_gain = 10 if(istype(target, /obj/item/food/deadmouse)) - if(!do_after(our_mob, 5 SECONDS)) - return FALSE - our_mob.add_biomass(10) + our_mob.add_biomass(biomass_gain) qdel(target) our_mob.visible_message( span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), @@ -51,23 +51,19 @@ var/mob/living/mob_to_absorb = target if(!iscarbon(mob_to_absorb)) - if(!do_after(our_mob, 10 SECONDS)) - return FALSE - our_mob.add_biomass(mob_to_absorb.getMaxHealth() * 0.5) - mob_to_absorb.gib() + biomass_gain = mob_to_absorb.getMaxHealth() * 0.5 else var/mob/living/carbon/carbon_to_absorb = target - if(istype(carbon_to_absorb, /mob/living/carbon/human/species/monkey)) - if(!do_after(carbon_to_absorb, 5 SECONDS)) - return FALSE - // Monkeys give less biomass - our_mob.add_biomass(50) + if(issimian(carbon_to_absorb)) + biomass_gain = 50 else - if(!do_after(carbon_to_absorb, 10 SECONDS)) - return FALSE - our_mob.add_biomass(100) - carbon_to_absorb.gib() + biomass_gain = 100 + absorb_time = 10 SECONDS + mob_to_absorb.AddComponent(/datum/component/leash, our_mob, 1) + if(!do_after(mob_to_absorb, absorb_time)) + return FALSE + mob_to_absorb.gib() our_mob.visible_message( span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), span_noticealien("You wrap your tendrils around [target] and absorb it!"), diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index 3a8ed549486f..7ede645b1aba 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -2,7 +2,6 @@ name = "Devour Limb" desc = "Allows you to consume a creatures limb." button_icon_state = "alien_hide" - cooldown_time = 20 SECONDS /datum/action/cooldown/mob_cooldown/bloodling/devour/set_click_ability(mob/on_who) @@ -40,13 +39,13 @@ candidate_for_removal += bodypart.body_zone if(!length(candidate_for_removal)) - return + return FALSE var/limb_to_remove = pick(candidate_for_removal) var/obj/item/bodypart/target_part = carbon_target.get_bodypart(limb_to_remove) if(isnull(target_part)) - return + return FALSE target_part.dismember() qdel(target_part) @@ -57,3 +56,4 @@ span_noticealien("You devour [target]s [target_part]!"), ) StartCooldown() + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm new file mode 100644 index 000000000000..67cf5ff26195 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm @@ -0,0 +1,48 @@ +/datum/action/cooldown/mob_cooldown/bloodling/heal + name = "Heal" + desc = "Allows you to heal or revive a humanoid thrall. Costs 50 biomass." + button_icon_state = "alien_hide" + biomass_cost = 50 + +/datum/action/cooldown/mob_cooldown/bloodling/heal/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_noticealien("You ready yourself to heal a thrall! Click a thrall to begin healing it!")) + +/datum/action/cooldown/mob_cooldown/bloodling/heal/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to heal this one...")) + +/datum/action/cooldown/mob_cooldown/bloodling/heal/PreActivate(atom/target) + if(!ismob(target)) + return FALSE + var/mob/living/targetted_mob = target + if(!iscarbon(targetted_mob)) + return FALSE + if(!IS_BLOODLING_THRALL(targetted_mob)) + return FALSE + return ..() + +/datum/action/cooldown/mob_cooldown/bloodling/heal/Activate(atom/target) + var/mob/living/carbon/carbon_mob = target + if(!do_after(owner, 2 SECONDS)) + return FALSE + + if(carbon_mob.stat != DEAD) + // A bit of everything healing not much but helpful + carbon_mob.adjustBruteLoss(-40) + carbon_mob.adjustToxLoss(-40) + carbon_mob.adjustFireLoss(-40) + carbon_mob.adjustOxyLoss(-40) + return TRUE + + carbon_mob.revive() + // Any oxygen damage they suffered whilst in crit + carbon_mob.adjustOxyLoss(-100) + return TRUE + diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index b934124d3fa5..e6371af689bd 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -26,6 +26,8 @@ if(isnull(alive_mob.mind)) owner.balloon_alert(owner, "doesn't work on mindless mobs!") return FALSE + if(IS_BLOODLING_OR_THRALL(alive_mob)) + return FALSE if(alive_mob.stat == DEAD) owner.balloon_alert(owner, "doesn't work on dead mobs!") return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 682ea1767ca5..2c0b98fb22ad 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -65,6 +65,8 @@ //////////////////// The actual bloodling mob //////////////////// /mob/living/basic/bloodling/proper + name = "mass of flesh" + desc = "An abomination of some spawn. A mess of tendrils, mouths and chitin, whatever created it was not merciful." maxHealth = INFINITE // Bloodlings have unlimited health, instead biomass acts as their health health = INFINITE @@ -235,6 +237,7 @@ /datum/action/cooldown/bloodling/dissonant_shriek, /datum/action/cooldown/spell/aoe/repulse/bloodling, /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, + /datum/action/cooldown/mob_cooldown/bloodling/heal, ) speed = 2 @@ -250,5 +253,6 @@ /datum/action/cooldown/bloodling/dissonant_shriek, /datum/action/cooldown/spell/aoe/repulse/bloodling, /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, + /datum/action/cooldown/mob_cooldown/bloodling/heal, ) speed = 2.5 diff --git a/tgstation.dme b/tgstation.dme index 6b332d8714d2..006bab3d157c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5741,6 +5741,7 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\devour.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\dissonant_shriek.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\heal.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\transfer_biomass.dm" From 7fd46a9aa744ed2363d4552a98c94981c6681a16 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Tue, 6 Feb 2024 07:47:13 +0100 Subject: [PATCH 035/113] rat warrens, still missing spawning acid --- .../antagonists/bloodling/abilities/build.dm | 16 +++--- .../bloodling/bloodling_structures.dm | 55 +++++++++++++++++++ tgstation.dme | 1 + 3 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm index 8fd878750714..bce14ee954cd 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm @@ -5,17 +5,17 @@ biomass_cost = 30 /// A list of all structures we can make. var/static/list/structures = list( - "resin wall" = /obj/structure/alien/resin/wall, - "resin membrane" = /obj/structure/alien/resin/membrane, - "resin nest" = /obj/structure/bed/nest, + "rat warren" = /obj/structure/bloodling/rat_warren, + "harvester" = /mob/living/basic/bloodling/minion/harvester, + "wall of flesh" = /mob/living/basic/bloodling/minion/wall, ) // Snowflake to check for what we build /datum/action/cooldown/bloodling/build/proc/check_for_duplicate() for(var/blocker_name in structures) - var/obj/structure/blocker_type = structures[blocker_name] + var/atom/blocker_type = structures[blocker_name] if(locate(blocker_type) in owner.loc) - to_chat(owner, span_warning("There is already a resin structure there!")) + to_chat(owner, span_warning("There is already shaped flesh here!")) return FALSE return TRUE @@ -25,13 +25,13 @@ if(isnull(choice) || QDELETED(src) || QDELETED(owner) || !check_for_duplicate() || !IsAvailable(feedback = TRUE)) return FALSE - var/obj/structure/choice_path = structures[choice] + var/atom/choice_path = structures[choice] if(!ispath(choice_path)) return FALSE owner.visible_message( - span_notice("[owner] vomits up a thick purple substance and begins to shape it."), - span_notice("You shape a [choice] out of resin."), + span_notice("[owner] vomits up a torrent of flesh and begins to shape it."), + span_notice("You mold a [choice] out of your flesh."), ) new choice_path(owner.loc) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm new file mode 100644 index 000000000000..9eab31601e2e --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm @@ -0,0 +1,55 @@ +/obj/structure/bloodling + name = "Abstract bloodling structure" + max_integrity = 100 + +/obj/structure/bloodling/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) + if(damage_flag == MELEE) + switch(damage_type) + if(BRUTE) + damage_amount *= 0.5 + if(BURN) + damage_amount *= 3 + . = ..() + +/obj/structure/bloodling/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + switch(damage_type) + if(BRUTE) + if(damage_amount) + playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE) + else + playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + if(BURN) + if(damage_amount) + playsound(loc, 'sound/items/welder.ogg', 100, TRUE) + +/obj/structure/bloodling/rat_warren + name = "Rat warren" + desc = "A pool of biomass and primordial soup, you hear a faint chittering from it." + max_integrity = 100 + ///the minimum time it takes for a rat to spawn + var/minimum_rattime = 1 MINUTES + ///the maximum time it takes for a rat to spawn + var/maximum_rattime = 3 MINUTES + //the cooldown between each rat + COOLDOWN_DECLARE(rattime) + +/obj/structure/bloodling/rat_warren/Initialize(mapload) + . = ..() + + //start the cooldown + COOLDOWN_START(src, rattime, rand(minimum_rattime, maximum_rattime)) + + //start processing + START_PROCESSING(SSobj, src) + +/obj/structure/bloodling/rat_warren/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/structure/bloodling/rat_warren/process() + //we need to have a cooldown, so check and then add + if(!COOLDOWN_FINISHED(src, rattime)) + return + COOLDOWN_START(src, rattime, rand(minimum_rattime, maximum_rattime)) + + new /mob/living/basic/mouse(src.loc) diff --git a/tgstation.dme b/tgstation.dme index 006bab3d157c..43b6afa086ac 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5735,6 +5735,7 @@ #include "monkestation\code\modules\antagonists\_common\antag_datum.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling_structures.dm" #include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" From 42a04da51e2257bd38fa27ef538377310eb9a924 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 8 Feb 2024 23:01:34 +0100 Subject: [PATCH 036/113] Finishes off rat warren, bloodlings take more burn, the hide ability didnt work and was replaced --- .../{ => abilities}/bloodling_abilities.dm | 11 +++++--- .../antagonists/bloodling/abilities/hide.dm | 28 ++++--------------- .../bloodling/bloodling_structures.dm | 4 ++- .../bloodling/mobs/bloodling_mob.dm | 11 ++++++-- tgstation.dme | 2 +- 5 files changed, 25 insertions(+), 31 deletions(-) rename monkestation/code/modules/antagonists/bloodling/{ => abilities}/bloodling_abilities.dm (82%) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm similarity index 82% rename from monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm rename to monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm index d3c97886ac8c..0c21aed5800d 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm @@ -14,7 +14,8 @@ var/mob/living/basic/bloodling/our_mob = owner if(our_mob.biomass <= biomass_cost) return FALSE - return TRUE + // Hardcoded for the bloodling biomass system. So it will not function on non-bloodlings + return istype(owner, /mob/living/basic/bloodling) /datum/action/cooldown/mob_cooldown/bloodling/PreActivate(atom/target) var/mob/living/basic/bloodling/our_mob = owner @@ -28,6 +29,9 @@ if(QDELETED(src) || QDELETED(owner)) return TRUE + if(click_to_activate && our_mob.biomass < biomass_cost) + unset_click_ability(owner, refund_cooldown = FALSE) + our_mob.add_biomass(-biomass_cost) return TRUE @@ -49,12 +53,11 @@ var/mob/living/basic/bloodling/our_mob = owner if(our_mob.biomass <= biomass_cost) return FALSE - return TRUE + // Hardcoded for the bloodling biomass system. So it will not function on non-bloodlings + return istype(owner, /mob/living/basic/bloodling) /datum/action/cooldown/bloodling/PreActivate(atom/target) var/mob/living/basic/bloodling/our_mob = owner - // Parent calls Activate(), so if parent returns TRUE, - // it means the activation happened successfuly by this point . = ..() if(!.) return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm index ef81131c565c..7e91609c80f7 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm @@ -1,23 +1,7 @@ -/datum/action/cooldown/bloodling/hide +/datum/action/cooldown/sneak/bloodling name = "Hide" - desc = "Allows you to hide beneath tables and certain objects." - button_icon_state = "alien_hide" - /// The layer we are on while hiding - var/hide_layer = BULLET_HOLE_LAYER - -/datum/action/cooldown/bloodling/hide/Activate(atom/target) - if(owner.layer == hide_layer) - owner.layer = initial(owner.layer) - owner.visible_message( - span_notice("[owner] slowly peeks up from the ground..."), - span_changeling("You stop hiding."), - ) - - else - owner.layer = hide_layer - owner.visible_message( - span_name("[owner] scurries to the ground!"), - span_changeling("You are now hiding."), - ) - - return TRUE + panel = "alien" + desc = "Blend into the shadows to stalk your prey." + button_icon_state = "alien_sneak" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm index 9eab31601e2e..2549042fb797 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm @@ -52,4 +52,6 @@ return COOLDOWN_START(src, rattime, rand(minimum_rattime, maximum_rattime)) - new /mob/living/basic/mouse(src.loc) + var/turf/our_turf = src.loc + new /mob/living/basic/mouse(our_turf) + our_turf.add_liquid_list(list(/datum/reagent/toxin/mutagen = 10), TRUE) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 2c0b98fb22ad..1ac1255ee708 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -176,12 +176,17 @@ /mob/living/basic/bloodling/proper/proc/on_damaged(datum/source, damage, damagetype) SIGNAL_HANDLER + var/damage_amount = damage // Stamina damage is fucky, so we ignore it if(damagetype == STAMINA) return + if(damagetype == BURN) + // Bloodlings take additional burning damage + damage_amount *= 1.5 + // Bloodlings take damage through their biomass, not regular damage - add_biomass(-damage) + add_biomass(-damage_amount) /mob/living/basic/bloodling/proper/Destroy() UnregisterSignal(src, COMSIG_LIVING_LIFE) @@ -193,7 +198,7 @@ evolution_level = 1 initial_powers = list( /datum/action/cooldown/mob_cooldown/bloodling/absorb, - /datum/action/cooldown/bloodling/hide, + /datum/action/cooldown/sneak/bloodling, ) speed = 0.5 @@ -207,7 +212,7 @@ evolution_level = 2 initial_powers = list( /datum/action/cooldown/mob_cooldown/bloodling/absorb, - /datum/action/cooldown/bloodling/hide, + /datum/action/cooldown/sneak/bloodling, /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, ) diff --git a/tgstation.dme b/tgstation.dme index 43b6afa086ac..03075de4c0cd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5734,11 +5734,11 @@ #include "monkestation\code\modules\aesthetics\walls\iron.dm" #include "monkestation\code\modules\antagonists\_common\antag_datum.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" -#include "monkestation\code\modules\antagonists\bloodling\bloodling_abilities.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_structures.dm" #include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\bloodling_abilities.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\devour.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\dissonant_shriek.dm" From caa62c33d059dccdf39f01baa738c60a9f74ff97 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:08:20 +0100 Subject: [PATCH 037/113] Update bloodling_structures.dm Co-authored-by: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> --- .../code/modules/antagonists/bloodling/bloodling_structures.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm index 2549042fb797..ae2a54c36d98 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm @@ -9,7 +9,7 @@ damage_amount *= 0.5 if(BURN) damage_amount *= 3 - . = ..() + return ..() /obj/structure/bloodling/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) From edb769f6ec84eca3888346ddc9cf16824c149252 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 25 Feb 2024 18:27:26 +0100 Subject: [PATCH 038/113] Give_life --- .../bloodling/abilities/give_life.dm | 41 +++++++++++++++++++ .../bloodling/mobs/bloodling_mob.dm | 2 + .../antagonists/bloodling/mobs/minions.dm | 2 +- tgstation.dme | 1 + 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm new file mode 100644 index 000000000000..8410b16c9afc --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -0,0 +1,41 @@ +/datum/action/cooldown/mob_cooldown/bloodling/give_life + name = "Give Life" + desc = "Bestow the gift of life onto the ignorant." + button_icon_state = "alien_hide" + +/datum/action/cooldown/mob_cooldown/bloodling/give_life/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + to_chat(on_who, span_noticealien("You prepare to bestow a life. Click a target to grant them the gift!")) + +/datum/action/cooldown/mob_cooldown/bloodling/give_life/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + to_chat(on_who, span_noticealien("They do not deserve it... Yet...")) + +/datum/action/cooldown/mob_cooldown/bloodling/give_life/PreActivate(atom/target) + if(!ismob(target)) + owner.balloon_alert(owner, "only works on mobs!") + return FALSE + var/mob/living/mob_target = target + if(mob_target.ckey && !mob_target.stat == CONSCIOUS) + owner.balloon_alert(owner, "only works on non-sentient conscious mobs!") + return FALSE + return ..() + +/datum/action/cooldown/mob_cooldown/bloodling/give_life/Activate(atom/target) + var/mob/living/target_mob = target + + var/question = "Would you like to be a [target_mob] servant of [owner]?" + var/list/candidates = poll_candidates_for_mobs(question, ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, target_mob, POLL_IGNORE_SHUTTLE_DENIZENS) + if(!LAZYLEN(candidates) && !LAZYLEN(target_mob)) + return FALSE + var/mob/dead/observer/C = pick_n_take(candidates) + message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(target_mob)])") + target_mob.ghostize(FALSE) + target_mob.key = C.key + return TRUE + diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 1ac1255ee708..9742fe7cc5a3 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -243,6 +243,7 @@ /datum/action/cooldown/spell/aoe/repulse/bloodling, /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, /datum/action/cooldown/mob_cooldown/bloodling/heal, + /datum/action/cooldown/mob_cooldown/bloodling/give_life, ) speed = 2 @@ -259,5 +260,6 @@ /datum/action/cooldown/spell/aoe/repulse/bloodling, /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, /datum/action/cooldown/mob_cooldown/bloodling/heal, + /datum/action/cooldown/mob_cooldown/bloodling/give_life, ) speed = 2.5 diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm index 9f2e4a5fb6c0..a66a0655a63d 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -13,7 +13,7 @@ /mob/living/basic/bloodling/minion/harvester name = "harvester" - desc = "A vague mass of flesh with two large scything talons." + desc = "A mass of flesh with two large scything talons." health = 100 maxHealth = 100 diff --git a/tgstation.dme b/tgstation.dme index 03075de4c0cd..80bb0c94e714 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5742,6 +5742,7 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\devour.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\dissonant_shriek.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\give_life.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\heal.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" From e635c652c4a76cb86f13c2b07045655b7cdd9204 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Tue, 5 Mar 2024 21:49:28 +0100 Subject: [PATCH 039/113] hopefully fixes a bug with give life --- .../bloodling/abilities/give_life.dm | 17 +++++++++++------ .../antagonists/bloodling/abilities/infest.dm | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index 8410b16c9afc..19175ae2733c 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -21,8 +21,11 @@ owner.balloon_alert(owner, "only works on mobs!") return FALSE var/mob/living/mob_target = target - if(mob_target.ckey && !mob_target.stat == CONSCIOUS) - owner.balloon_alert(owner, "only works on non-sentient conscious mobs!") + if(mob_target.ckey && !mob_target.stat == DEAD) + owner.balloon_alert(owner, "only works on non-sentient alive mobs!") + return FALSE + if(iscarbon(mob_target)) + owner.balloon_alert(owner, "doesn't work on carbons!") return FALSE return ..() @@ -30,12 +33,14 @@ var/mob/living/target_mob = target var/question = "Would you like to be a [target_mob] servant of [owner]?" - var/list/candidates = poll_candidates_for_mobs(question, ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, target_mob, POLL_IGNORE_SHUTTLE_DENIZENS) + var/list/candidates = poll_candidates_for_mob(question, ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, target_mob, POLL_IGNORE_SHUTTLE_DENIZENS) if(!LAZYLEN(candidates) && !LAZYLEN(target_mob)) + owner.balloon_alert(owner, "[target_mob] rejects your generous gift...for now...") return FALSE - var/mob/dead/observer/C = pick_n_take(candidates) - message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(target_mob)])") + var/mob/dead/observer/candie = pick_n_take(candidates) + message_admins("[key_name_admin(candie)] has taken control of ([key_name_admin(target_mob)])") target_mob.ghostize(FALSE) - target_mob.key = C.key + target_mob.key = candie.key + target_mob.mind.add_antag_datum(/datum/antagonist/changeling/bloodling_thrall) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index e6371af689bd..a3b09b7294e7 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -35,7 +35,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest/Activate(atom/target) var/mob/living/mob = target - if(istype(mob, /mob/living/carbon/human)) + if(iscarbon(mob)) var/mob/living/carbon/human/carbon_mob = target if(HAS_TRAIT(carbon_mob, TRAIT_MINDSHIELD)) if(!do_after(owner, 15 SECONDS)) From c3c2020a3f02949e1aa06b6afd17220811c03b17 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 10 Mar 2024 19:20:42 +0100 Subject: [PATCH 040/113] Big ol update DEVOUR IS NOT DONE --- .../bloodling/abilities/absorb_biomass.dm | 24 +++++++-- .../antagonists/bloodling/abilities/devour.dm | 22 +++----- .../antagonists/bloodling/abilities/heal.dm | 13 ++--- .../bloodling/bloodling_structures.dm | 2 +- .../bloodling/mobs/bloodling_mob.dm | 54 ++++++++++--------- .../antagonists/bloodling/mobs/minions.dm | 1 + 6 files changed, 64 insertions(+), 52 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index f5002d321882..2218757bbbd2 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -19,16 +19,21 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb/PreActivate(atom/target) if(owner == target) return FALSE + if(get_dist(owner, target) > 1) return FALSE + if(istype(target, /obj/item/food/deadmouse)) return ..() + if(!ismob(target)) owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE + var/mob/living/mob_to_absorb = target if(!iscarbon(mob_to_absorb)) return ..() + var/mob/living/carbon/carbon_to_absorb = target if(!carbon_to_absorb.stat == DEAD) owner.balloon_alert(owner, "only works on dead carbons!") @@ -37,21 +42,30 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner + /// How long it takes to absorb something var/absorb_time = 5 SECONDS + /// How much biomass is gained from absorbing something var/biomass_gain = 10 + to_chat(owner, span_noticealien("You wrap your tendrils around [target] and begin absorbing it!")) + + // This prevents the mob from being dragged away from the bloodling during the process + target.AddComponentFrom(REF(src), /datum/component/leash, our_mob, 1) + if(istype(target, /obj/item/food/deadmouse)) our_mob.add_biomass(biomass_gain) qdel(target) our_mob.visible_message( - span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), - span_noticealien("You wrap your tendrils around [target] and absorb it!"), + span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), + span_noticealien("You wrap your tendrils around [target] and absorb it!"), ) return TRUE var/mob/living/mob_to_absorb = target if(!iscarbon(mob_to_absorb)) biomass_gain = mob_to_absorb.getMaxHealth() * 0.5 + if(biomass_gain < 10) + biomass_gain = 10 else var/mob/living/carbon/carbon_to_absorb = target if(issimian(carbon_to_absorb)) @@ -60,9 +74,11 @@ biomass_gain = 100 absorb_time = 10 SECONDS - mob_to_absorb.AddComponent(/datum/component/leash, our_mob, 1) - if(!do_after(mob_to_absorb, absorb_time)) + if(!do_after(owner, absorb_time, mob_to_absorb)) + mob_to_absorb.RemoveComponentSource(REF(src), /datum/component/leash) return FALSE + + our_mob.add_biomass(biomass_gain) mob_to_absorb.gib() our_mob.visible_message( span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index 7ede645b1aba..5a28dd5c2c00 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -4,19 +4,6 @@ button_icon_state = "alien_hide" cooldown_time = 20 SECONDS -/datum/action/cooldown/mob_cooldown/bloodling/devour/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - to_chat(on_who, span_noticealien("You prepare to swallow a limb whole. Click a target to rip off a limb!")) - -/datum/action/cooldown/mob_cooldown/bloodling/devour/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to rip off their limb...")) - /datum/action/cooldown/mob_cooldown/bloodling/devour/PreActivate(atom/target) var/mob/living/mob = target if(!iscarbon(mob)) @@ -25,10 +12,17 @@ return ..() /datum/action/cooldown/mob_cooldown/bloodling/devour/Activate(atom/target) + . = ..() + eat_limb(target) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/bloodling/devour/proc/eat_limb(atom/target) var/mob/living/basic/bloodling/our_mob = owner var/list/candidate_for_removal = list() var/mob/living/carbon/carbon_target = target + // Loops over the limbs of our target carbon, this is so stuff like the head, chest or unremovable body parts arent destroyed for(var/obj/item/bodypart/bodypart in carbon_target.bodyparts) if(bodypart.body_zone == BODY_ZONE_HEAD) continue @@ -55,5 +49,3 @@ span_alertalien("[our_mob] snaps its maw over [target]s [target_part] and swiftly devours it!"), span_noticealien("You devour [target]s [target_part]!"), ) - StartCooldown() - return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm index 67cf5ff26195..64552a270794 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm @@ -33,16 +33,17 @@ if(!do_after(owner, 2 SECONDS)) return FALSE + // A bit of everything healing not much but helpful + carbon_mob.adjustBruteLoss(-40) + carbon_mob.adjustToxLoss(-40) + carbon_mob.adjustFireLoss(-40) + carbon_mob.adjustOxyLoss(-40) + if(carbon_mob.stat != DEAD) - // A bit of everything healing not much but helpful - carbon_mob.adjustBruteLoss(-40) - carbon_mob.adjustToxLoss(-40) - carbon_mob.adjustFireLoss(-40) - carbon_mob.adjustOxyLoss(-40) return TRUE carbon_mob.revive() // Any oxygen damage they suffered whilst in crit - carbon_mob.adjustOxyLoss(-100) + carbon_mob.adjustOxyLoss(-200) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm index ae2a54c36d98..d8f21f70938b 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm @@ -54,4 +54,4 @@ var/turf/our_turf = src.loc new /mob/living/basic/mouse(our_turf) - our_turf.add_liquid_list(list(/datum/reagent/toxin/mutagen = 10), TRUE) + our_turf.add_liquid_list(list(/datum/reagent/toxin/mutagen = 15), TRUE) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 9742fe7cc5a3..f16d8ad2b401 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -20,7 +20,6 @@ mob_biotypes = MOB_ORGANIC speak_emote = list("spews") basic_mob_flags = FLAMMABLE_MOB - sight = SEE_SELF|SEE_MOBS faction = list(FACTION_BLOODLING) pass_flags = PASSTABLE attack_sound = 'sound/effects/attackblob.ogg' @@ -69,6 +68,7 @@ desc = "An abomination of some spawn. A mess of tendrils, mouths and chitin, whatever created it was not merciful." maxHealth = INFINITE // Bloodlings have unlimited health, instead biomass acts as their health health = INFINITE + sight = SEE_SELF|SEE_MOBS biomass = 50 biomass_max = 500 @@ -78,7 +78,6 @@ /mob/living/basic/bloodling/proper/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_LIVING_LIFE, PROC_REF(on_life)) RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) /mob/living/basic/bloodling/proper/adjust_health(amount, updating_health = TRUE, forced = FALSE) @@ -93,17 +92,11 @@ return . -/// On_life proc that checks their amount of biomass -/mob/living/basic/bloodling/proper/proc/on_life(seconds_per_tick = SSMOBS_DT, times_fired) - SIGNAL_HANDLER - - if(biomass <= 0) - gib() - return - // Bloodlings health and damage needs updating when biomass is added /mob/living/basic/bloodling/proper/add_biomass(amount) . = ..() + if(biomass <= 0) + gib() // Damage is based on biomass, and handled here obj_damage = biomass * 0.2 // less than 5 damage would be very bad @@ -115,25 +108,39 @@ /// Checks if we should evolve, and also calls the evolution proc /mob/living/basic/bloodling/proper/proc/check_evolution() - if(75 > biomass && evolution_level != 1) + if((75 > biomass) && evolution_level != 1) evolution(1) - return - if(125 > biomass >= 75 && evolution_level != 2) + return TRUE + if((125 > biomass >= 75) && evolution_level != 2) evolution(2) - return - if(175 > biomass >= 125 && evolution_level != 3) + return TRUE + if((175 > biomass) >= 125 && evolution_level != 3) evolution(3) - return - if(225 > biomass >= 175 && evolution_level != 4) + return TRUE + if((225 > biomass >= 175) && evolution_level != 4) evolution(4) - return - if(biomass >= 225 && evolution_level != 5) + return TRUE + if((biomass >= 225) && evolution_level != 5) evolution(5) - return + return TRUE + return FALSE /// Creates the mob for us to then mindswap into /mob/living/basic/bloodling/proper/proc/evolution(tier) + /// What bloodling we are going to spawn var/new_bloodling = null + if(evolution_level > tier) + visible_message( + span_alertalien("[src] begins to shrink!"), + span_noticealien("You devolve!"), + ) + + else + visible_message( + span_alertalien("[src] begins to grow!"), + span_noticealien("You evolve!"), + ) + switch(tier) if(1) new_bloodling = new /mob/living/basic/bloodling/proper/tier1/(src.loc) @@ -149,10 +156,6 @@ /mob/living/basic/bloodling/proper/proc/evolution_mind_change(var/mob/living/basic/bloodling/proper/new_bloodling) - visible_message( - span_alertalien("[src] begins to grow!"), - span_noticealien("You evolve!"), - ) new_bloodling.setDir(dir) if(numba) new_bloodling.numba = numba @@ -177,7 +180,7 @@ SIGNAL_HANDLER var/damage_amount = damage - // Stamina damage is fucky, so we ignore it + // Stamina damage is fucky, so we'll ignore it if(damagetype == STAMINA) return @@ -189,7 +192,6 @@ add_biomass(-damage_amount) /mob/living/basic/bloodling/proper/Destroy() - UnregisterSignal(src, COMSIG_LIVING_LIFE) UnregisterSignal(src, COMSIG_MOB_APPLY_DAMAGE) return ..() diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm index a66a0655a63d..4bc35daa0419 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -4,6 +4,7 @@ biomass = 0 biomass_max = 200 + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) initial_powers = list( /datum/action/cooldown/mob_cooldown/bloodling/absorb, /datum/action/cooldown/mob_cooldown/bloodling/devour, From 6955e86908cfdafbbbcbdf2abb54717be5231ecf Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 10 Mar 2024 20:01:02 +0100 Subject: [PATCH 041/113] Refactors abilities to NOT be click abilities --- .../bloodling/abilities/absorb_biomass.dm | 20 +++++-------------- .../antagonists/bloodling/abilities/devour.dm | 5 ++--- .../bloodling/abilities/give_life.dm | 13 ------------ .../antagonists/bloodling/abilities/heal.dm | 14 ------------- .../antagonists/bloodling/abilities/infest.dm | 14 ------------- .../bloodling/abilities/transfer_biomass.dm | 6 ------ 6 files changed, 7 insertions(+), 65 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 2218757bbbd2..2b6915759255 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -3,19 +3,6 @@ desc = "Allows you to absorb a dead carbon or living mob close to you." button_icon_state = "alien_hide" -/datum/action/cooldown/mob_cooldown/bloodling/absorb/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - to_chat(on_who, span_noticealien("You prepare to claim a creatures biomass. Click a target to begin absorbing it!")) - -/datum/action/cooldown/mob_cooldown/bloodling/absorb/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to claim biomass...")) - /datum/action/cooldown/mob_cooldown/bloodling/absorb/PreActivate(atom/target) if(owner == target) return FALSE @@ -30,8 +17,7 @@ owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE - var/mob/living/mob_to_absorb = target - if(!iscarbon(mob_to_absorb)) + if(!iscarbon(target)) return ..() var/mob/living/carbon/carbon_to_absorb = target @@ -41,6 +27,10 @@ return ..() /datum/action/cooldown/mob_cooldown/bloodling/absorb/Activate(atom/target) + . = ..() + return consume(target) + +/datum/action/cooldown/mob_cooldown/bloodling/absorb/proc/consume(atom/target) var/mob/living/basic/bloodling/our_mob = owner /// How long it takes to absorb something var/absorb_time = 5 SECONDS diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index 5a28dd5c2c00..2f9c1d76a5f3 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -12,10 +12,8 @@ return ..() /datum/action/cooldown/mob_cooldown/bloodling/devour/Activate(atom/target) - . = ..() - eat_limb(target) StartCooldown() - return TRUE + return eat_limb(target) /datum/action/cooldown/mob_cooldown/bloodling/devour/proc/eat_limb(atom/target) var/mob/living/basic/bloodling/our_mob = owner @@ -49,3 +47,4 @@ span_alertalien("[our_mob] snaps its maw over [target]s [target_part] and swiftly devours it!"), span_noticealien("You devour [target]s [target_part]!"), ) + return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index 19175ae2733c..3a9d30e1ae24 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -3,19 +3,6 @@ desc = "Bestow the gift of life onto the ignorant." button_icon_state = "alien_hide" -/datum/action/cooldown/mob_cooldown/bloodling/give_life/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - to_chat(on_who, span_noticealien("You prepare to bestow a life. Click a target to grant them the gift!")) - -/datum/action/cooldown/mob_cooldown/bloodling/give_life/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - to_chat(on_who, span_noticealien("They do not deserve it... Yet...")) - /datum/action/cooldown/mob_cooldown/bloodling/give_life/PreActivate(atom/target) if(!ismob(target)) owner.balloon_alert(owner, "only works on mobs!") diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm index 64552a270794..bf202a27cd9a 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm @@ -4,20 +4,6 @@ button_icon_state = "alien_hide" biomass_cost = 50 -/datum/action/cooldown/mob_cooldown/bloodling/heal/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - - to_chat(on_who, span_noticealien("You ready yourself to heal a thrall! Click a thrall to begin healing it!")) - -/datum/action/cooldown/mob_cooldown/bloodling/heal/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to heal this one...")) - /datum/action/cooldown/mob_cooldown/bloodling/heal/PreActivate(atom/target) if(!ismob(target)) return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index a3b09b7294e7..f15510f245b0 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -4,20 +4,6 @@ button_icon_state = "alien_hide" biomass_cost = 75 -/datum/action/cooldown/mob_cooldown/bloodling/infest/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - - to_chat(on_who, span_noticealien("You ready yourself to infest a creature! Click a target to begin infesting it!")) - -/datum/action/cooldown/mob_cooldown/bloodling/infest/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - to_chat(on_who, span_noticealien("You steady yourself. Now is not the time to infest...")) - /datum/action/cooldown/mob_cooldown/bloodling/infest/PreActivate(atom/target) if(!ismob(target)) owner.balloon_alert(owner, "doesn't work on non-mobs!") diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm index c705bd843d82..32190d5e1efd 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm @@ -3,12 +3,6 @@ desc = "Transfer biomass to another organism." button_icon_state = "dissonant_shriek" -/datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - to_chat(on_who, span_noticealien("You prepare to send biomass. Click a target to transfer!")) - /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass/PreActivate(atom/target) var/mob/living/mob = target if(!istype(mob, /mob/living/basic/bloodling)) From 331d1459b29e7c61bf75d7ffed3d73b409393960 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 17 Mar 2024 21:45:34 +0100 Subject: [PATCH 042/113] Fixes some dumb click action stuff --- .../antagonists/bloodling/abilities/absorb_biomass.dm | 6 ++---- .../antagonists/bloodling/abilities/bloodling_abilities.dm | 6 ++++-- .../modules/antagonists/bloodling/abilities/give_life.dm | 2 ++ .../code/modules/antagonists/bloodling/abilities/heal.dm | 2 ++ .../code/modules/antagonists/bloodling/abilities/infest.dm | 3 +++ 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 2b6915759255..167247f374c0 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -7,9 +7,6 @@ if(owner == target) return FALSE - if(get_dist(owner, target) > 1) - return FALSE - if(istype(target, /obj/item/food/deadmouse)) return ..() @@ -17,7 +14,8 @@ owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE - if(!iscarbon(target)) + var/mob/living/mob_to_absorb = target + if(!iscarbon(mob_to_absorb)) return ..() var/mob/living/carbon/carbon_to_absorb = target diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm index 0c21aed5800d..0d91de2fcd33 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm @@ -18,12 +18,14 @@ return istype(owner, /mob/living/basic/bloodling) /datum/action/cooldown/mob_cooldown/bloodling/PreActivate(atom/target) + if(get_dist(owner, target) > 1) + return FALSE + var/mob/living/basic/bloodling/our_mob = owner - // Parent calls Activate(), so if parent returns TRUE, - // it means the activation happened successfuly by this point . = ..() if(!.) return FALSE + // Since bloodlings evolve it may result in them or their abilities going away // so we can just return true here if(QDELETED(src) || QDELETED(owner)) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index 3a9d30e1ae24..da2966f2ff73 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -7,10 +7,12 @@ if(!ismob(target)) owner.balloon_alert(owner, "only works on mobs!") return FALSE + var/mob/living/mob_target = target if(mob_target.ckey && !mob_target.stat == DEAD) owner.balloon_alert(owner, "only works on non-sentient alive mobs!") return FALSE + if(iscarbon(mob_target)) owner.balloon_alert(owner, "doesn't work on carbons!") return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm index bf202a27cd9a..a18b3d6b3990 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm @@ -7,9 +7,11 @@ /datum/action/cooldown/mob_cooldown/bloodling/heal/PreActivate(atom/target) if(!ismob(target)) return FALSE + var/mob/living/targetted_mob = target if(!iscarbon(targetted_mob)) return FALSE + if(!IS_BLOODLING_THRALL(targetted_mob)) return FALSE return ..() diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index f15510f245b0..59c199d23b47 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -8,12 +8,15 @@ if(!ismob(target)) owner.balloon_alert(owner, "doesn't work on non-mobs!") return FALSE + var/mob/living/alive_mob = target if(isnull(alive_mob.mind)) owner.balloon_alert(owner, "doesn't work on mindless mobs!") return FALSE + if(IS_BLOODLING_OR_THRALL(alive_mob)) return FALSE + if(alive_mob.stat == DEAD) owner.balloon_alert(owner, "doesn't work on dead mobs!") return FALSE From f81df67f7c59c6c874737dc59c44c08ae1d96c0a Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:02:41 +0100 Subject: [PATCH 043/113] Hopefully fixes unit test issues --- monkestation/code/__DEFINES/saymode.dm | 2 +- .../modules/antagonists/bloodling/mobs/bloodling_mob.dm | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/monkestation/code/__DEFINES/saymode.dm b/monkestation/code/__DEFINES/saymode.dm index 643613bae2b7..edcce0f08df3 100644 --- a/monkestation/code/__DEFINES/saymode.dm +++ b/monkestation/code/__DEFINES/saymode.dm @@ -1,5 +1,5 @@ /datum/saymode/bloodling - key = "q" + key = "9" mode = MODE_BLOODLING /datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index f16d8ad2b401..a471dca02eef 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -19,7 +19,7 @@ environment_smash = ENVIRONMENT_SMASH_NONE mob_biotypes = MOB_ORGANIC speak_emote = list("spews") - basic_mob_flags = FLAMMABLE_MOB + basic_mob_flags = FLAMMABLE_MOB | DEL_ON_DEATH faction = list(FACTION_BLOODLING) pass_flags = PASSTABLE attack_sound = 'sound/effects/attackblob.ogg' @@ -58,10 +58,6 @@ var/datum/action/bloodling_action = new path() bloodling_action.Grant(src) -/mob/living/basic/bloodling/death() - gib() - return ..() - //////////////////// The actual bloodling mob //////////////////// /mob/living/basic/bloodling/proper name = "mass of flesh" From 6d583861c4115e6b8ebde43c1cd92afe51ffa4c0 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:24:45 +0100 Subject: [PATCH 044/113] Polling was changed Yipeeeee --- code/__DEFINES/role_preferences.dm | 1 - .../antagonists/bloodling/abilities/give_life.dm | 10 +++++++++- .../antagonists/bloodling/mobs/bloodling_mob.dm | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index a1ce73e68a05..42998b443375 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -72,7 +72,6 @@ #define ROLE_LAVALAND "Lavaland" #define ROLE_LAZARUS_BAD "Slaved Revived Mob" #define ROLE_LAZARUS_GOOD "Friendly Revived Mob" -#define ROLE_SLASHER "Slasher" // monkestation edit #define ROLE_BLOODLING_THRALL "Bloodling Thrall" // monkestation edit #define ROLE_CLOWN_OPERATIVE "Clown Operative" diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index da2966f2ff73..faa986accd55 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -22,7 +22,15 @@ var/mob/living/target_mob = target var/question = "Would you like to be a [target_mob] servant of [owner]?" - var/list/candidates = poll_candidates_for_mob(question, ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, target_mob, POLL_IGNORE_SHUTTLE_DENIZENS) + var/list/candidates = SSpolling.poll_ghost_candidates_for_mob( + question, + ROLE_SENTIENCE, + ROLE_SENTIENCE, + 10 SECONDS, + target_mob, + POLL_IGNORE_SHUTTLE_DENIZENS, + pic_source = target_mob + ) if(!LAZYLEN(candidates) && !LAZYLEN(target_mob)) owner.balloon_alert(owner, "[target_mob] rejects your generous gift...for now...") return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index a471dca02eef..8e0ebd9a0ab4 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -23,7 +23,8 @@ faction = list(FACTION_BLOODLING) pass_flags = PASSTABLE attack_sound = 'sound/effects/attackblob.ogg' - + /// Loot this mob drops on death. + var/list/loot = list(/obj/effect/gibspawner/generic) /// The amount of biomass our bloodling has var/biomass = 1 /// The maximum amount of biomass a bloodling can gain @@ -36,6 +37,7 @@ /mob/living/basic/bloodling/Initialize(mapload) . = ..() create_abilities() + AddElement(/datum/element/death_drops, loot) /mob/living/basic/bloodling/get_status_tab_items() . = ..() From 58555a3c12b10830be693a941a5eee301a4ce079 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:39:49 +0100 Subject: [PATCH 045/113] Update tgstation.dme --- tgstation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 1e58a5fba7f2..7121c9871446 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5645,8 +5645,8 @@ #include "code\ze_genesis_call\genesis_call.dm" #include "interface\interface.dm" #include "interface\menu.dm" -#include "interface\skin.dmf" #include "interface\stylesheet.dm" +#include "interface\skin.dmf" #include "interface\fonts\fonts_datum.dm" #include "interface\fonts\grand_9k.dm" #include "interface\fonts\pixellari.dm" From 678e124eae12983302997b86a24071a47460cffc Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Tue, 26 Mar 2024 22:35:20 +0100 Subject: [PATCH 046/113] Create ascension.dm --- .../modules/antagonists/bloodling/abilities/ascension.dm | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm new file mode 100644 index 000000000000..7107330d2afd --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -0,0 +1,5 @@ +/datum/action/cooldown/bloodling/ascension + name = "Ascend" + desc = "We reach our last form...Mass consumption is required. Costs 250 Biomass and takes 5 minutes for you to ascend." + button_icon_state = "dissonant_shriek" + biomass_cost = 250 From baf9f2aa1fe6118221f6c050ead99a1278af8f7e Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 4 Apr 2024 19:25:34 +0200 Subject: [PATCH 047/113] Ascension, NOT DONE JUST TO SYNC WITH PC --- .../bloodling/abilities/ascension.dm | 39 +++++++++++++++++++ .../bloodling/mobs/bloodling_mob.dm | 1 + tgstation.dme | 1 + 3 files changed, 41 insertions(+) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 7107330d2afd..6bd37132a3a9 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -3,3 +3,42 @@ desc = "We reach our last form...Mass consumption is required. Costs 250 Biomass and takes 5 minutes for you to ascend." button_icon_state = "dissonant_shriek" biomass_cost = 250 + +/datum/action/cooldown/bloodling/ascension/Activate(atom/target) + force_event(/datum/round_event_control/bloodling_ascension, "A bloodling is ascending") + + return TRUE + + +/datum/round_event_control/bloodling_ascension + name = "Bloodling Ascension" + typepath = /datum/round_event/bloodling_ascension + max_occurrences = 0 + weight = 0 + alert_observers = FALSE + category = EVENT_CATEGORY_SPACE + +/datum/round_event/bloodling_ascension/announce(fake) + + priority_announce("What the heELl is going on?! WEeE have detected massive up-spikes in ##@^^?? coming fr*m yoOourr st!*i@n! GeEeEEET out of THERE NOW!!","?????????", 'monkestation/sound/bloodsuckers/monsterhunterintro.ogg') + +/datum/round_event/bloodling_ascension/start() + for(var/i = 1, i < 16, i++) + new /obj/effect/anomaly/dimensional/flesh(get_safe_random_station_turf(), null, FALSE) + +/obj/effect/anomaly/dimensional/flesh + range = 5 + immortal = TRUE + drops_core = FALSE + relocations_left = -1 + +/obj/effect/anomaly/dimensional/flesh/Initialize(mapload, new_lifespan, drops_core) + INVOKE_ASYNC(src, PROC_REF(prepare_area), /datum/dimension_theme/meat) + return ..() + +/obj/effect/anomaly/dimensional/flesh/relocate() + var/datum/anomaly_placer/placer = new() + var/area/new_area = placer.findValidArea() + var/turf/new_turf = placer.findValidTurf(new_area) + src.forceMove(new_turf) + prepare_area(new_theme_path = /datum/dimension_theme/meat) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 8e0ebd9a0ab4..e187674fbb7d 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -253,6 +253,7 @@ evolution_level = 5 initial_powers = list( /datum/action/cooldown/mob_cooldown/bloodling/absorb, + /datum/action/cooldown/bloodling/ascension, /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, diff --git a/tgstation.dme b/tgstation.dme index 7121c9871446..7b0aa7474253 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5786,6 +5786,7 @@ #include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\ascension.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\bloodling_abilities.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\devour.dm" From ca9eb83ef827eb604134a7e5b52b04e433caa467 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:41:45 +0200 Subject: [PATCH 048/113] Large ascension changes, it now causes something similar to midas --- .../bloodling/abilities/ascension.dm | 80 ++++++++++++++----- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 6bd37132a3a9..7633eb115fae 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -5,40 +5,78 @@ biomass_cost = 250 /datum/action/cooldown/bloodling/ascension/Activate(atom/target) + var/mob/living/basic/bloodling/our_mob = owner + our_mob.Immobilize(5 MINUTES) + + /* PLANS + * Make this root you in place for 5 minutes + * turn the bloodling into a buffed up meteor heart on completion + */ + force_event(/datum/round_event_control/bloodling_ascension, "A bloodling is ascending") return TRUE +/* PLANS + * Make tiles that turn people into thralls +*/ +/datum/dimension_theme/meat/bloodling + icon = 'icons/obj/food/meat.dmi' + icon_state = "meat" + material = /datum/material/meat + sound = 'sound/items/eatfood.ogg' + replace_objs = list(\ + /obj/machinery/atmospherics/components/unary/vent_scrubber = list(/obj/structure/meateor_fluff/eyeball = 1), \ + /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1),) + +/* PLANS + * Make this call the shuttle +*/ /datum/round_event_control/bloodling_ascension - name = "Bloodling Ascension" + name = "Bloodling ascension" typepath = /datum/round_event/bloodling_ascension max_occurrences = 0 weight = 0 alert_observers = FALSE category = EVENT_CATEGORY_SPACE +/datum/round_event/bloodling_ascension + // Holds our theme + var/datum/dimension_theme/chosen_theme + /datum/round_event/bloodling_ascension/announce(fake) - priority_announce("What the heELl is going on?! WEeE have detected massive up-spikes in ##@^^?? coming fr*m yoOourr st!*i@n! GeEeEEET out of THERE NOW!!","?????????", 'monkestation/sound/bloodsuckers/monsterhunterintro.ogg') + priority_announce("You have failed to contain the organism. Its takeover of the station will be absolute. Emergency shuttle dispatched.","Central Command Biohazard Agency", 'monkestation/sound/bloodsuckers/monsterhunterintro.ogg') +// The start of the event, it grabs a bunch of turfs to parse and apply our theme to /datum/round_event/bloodling_ascension/start() - for(var/i = 1, i < 16, i++) - new /obj/effect/anomaly/dimensional/flesh(get_safe_random_station_turf(), null, FALSE) - -/obj/effect/anomaly/dimensional/flesh - range = 5 - immortal = TRUE - drops_core = FALSE - relocations_left = -1 - -/obj/effect/anomaly/dimensional/flesh/Initialize(mapload, new_lifespan, drops_core) - INVOKE_ASYNC(src, PROC_REF(prepare_area), /datum/dimension_theme/meat) - return ..() - -/obj/effect/anomaly/dimensional/flesh/relocate() - var/datum/anomaly_placer/placer = new() - var/area/new_area = placer.findValidArea() - var/turf/new_turf = placer.findValidTurf(new_area) - src.forceMove(new_turf) - prepare_area(new_theme_path = /datum/dimension_theme/meat) + chosen_theme = new /datum/dimension_theme/meat/bloodling() + // Placeholder code, just for testing + var/turf/start_turf = get_turf(pick(GLOB.station_turfs)) + var/greatest_dist = 0 + var/list/turfs_to_transform = list() + for (var/turf/transform_turf as anything in GLOB.station_turfs) + if (!chosen_theme.can_convert(transform_turf)) + continue + var/dist = get_dist(start_turf, transform_turf) + if (dist > greatest_dist) + greatest_dist = dist + if (!turfs_to_transform["[dist]"]) + turfs_to_transform["[dist]"] = list() + turfs_to_transform["[dist]"] += transform_turf + + if (chosen_theme.can_convert(start_turf)) + chosen_theme.apply_theme(start_turf) + + for (var/iterator in 1 to greatest_dist) + if(!turfs_to_transform["[iterator]"]) + continue + addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (5 SECONDS) * iterator) + +/datum/round_event/bloodling_ascension/proc/transform_area(list/turfs) + for (var/turf/transform_turf as anything in turfs) + if (!chosen_theme.can_convert(transform_turf)) + continue + chosen_theme.apply_theme(transform_turf) + CHECK_TICK From 5b2b4e54971314de997b29796eb0525952df32ad Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 14 Apr 2024 00:23:45 +0200 Subject: [PATCH 049/113] Update ascension.dm --- .../antagonists/bloodling/abilities/ascension.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 7633eb115fae..f6c715325b62 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -6,10 +6,13 @@ /datum/action/cooldown/bloodling/ascension/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner - our_mob.Immobilize(5 MINUTES) + our_mob.move_resist = INFINITY + ADD_TRAIT(our_mob, TRAIT_IMMOBILIZED, REF(src)) + // Waits 5 minutes before calling the ascension + addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) + /* PLANS - * Make this root you in place for 5 minutes * turn the bloodling into a buffed up meteor heart on completion */ @@ -17,6 +20,10 @@ return TRUE +/datum/action/cooldown/bloodling/ascension/ascend(mob/living/basic/bloodling) + // Woah they can move + REMOVE_TRAIT(bloodling, TRAIT_IMMOBILIZED, REF(src)) + /* PLANS * Make tiles that turn people into thralls */ From c0f58a88772167f186886126f55a285de9a7f81d Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 14 Apr 2024 00:29:37 +0200 Subject: [PATCH 050/113] bill nye here --- .../code/modules/antagonists/bloodling/abilities/ascension.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index f6c715325b62..96032638e339 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -20,7 +20,7 @@ return TRUE -/datum/action/cooldown/bloodling/ascension/ascend(mob/living/basic/bloodling) +/datum/action/cooldown/bloodling/ascension/proc/ascend(mob/living/basic/bloodling) // Woah they can move REMOVE_TRAIT(bloodling, TRAIT_IMMOBILIZED, REF(src)) From 2288adb67136d13038356a8df7e8ba1bb446e592 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 19 Apr 2024 18:20:16 +0200 Subject: [PATCH 051/113] Update ascension.dm --- .../modules/antagonists/bloodling/abilities/ascension.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 96032638e339..872023b5496c 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -27,15 +27,20 @@ /* PLANS * Make tiles that turn people into thralls */ +/turf/open/floor/bloodling + name = "nerve threads" + icon_state = "materialfloor" + baseturfs = /turf/open/plating -/datum/dimension_theme/meat/bloodling +/datum/dimension_theme/bloodling icon = 'icons/obj/food/meat.dmi' icon_state = "meat" material = /datum/material/meat sound = 'sound/items/eatfood.ogg' replace_objs = list(\ /obj/machinery/atmospherics/components/unary/vent_scrubber = list(/obj/structure/meateor_fluff/eyeball = 1), \ - /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1),) + /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1), \ + /turf/open/floor = list(/turf/open/floor/bloodling),) /* PLANS * Make this call the shuttle From 078deb6ad6fba0aae9e49a00f788f929cffbb633 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 22 Apr 2024 15:37:39 +0200 Subject: [PATCH 052/113] starting t --- .../antagonists/bloodling/abilities/ascension.dm | 2 +- .../antagonists/bloodling/bloodling_sprites.dmi | Bin 0 -> 221 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 872023b5496c..613feefb39b3 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -63,7 +63,7 @@ // The start of the event, it grabs a bunch of turfs to parse and apply our theme to /datum/round_event/bloodling_ascension/start() - chosen_theme = new /datum/dimension_theme/meat/bloodling() + chosen_theme = new /datum/dimension_theme/bloodling() // Placeholder code, just for testing var/turf/start_turf = get_turf(pick(GLOB.station_turfs)) var/greatest_dist = 0 diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi new file mode 100644 index 0000000000000000000000000000000000000000..01887b31521e479c945d63f430b8f31564537b74 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ%&L%x5|`BC)e_1!5cyiE*d|0q;uX!^CUx2Pwx&3;~?Y9#$F0@9!)wj zDMTSyQ-5m=BcFpb#;0Piy60iN>2;9)4d;PslKO+ zV@SoEx91EQ85lSY8ywib!joCtW@Y2D$yd@pSFr Date: Mon, 22 Apr 2024 15:39:08 +0200 Subject: [PATCH 053/113] flesh tile sprite --- .../antagonists/bloodling/bloodling_sprites.dmi | Bin 221 -> 611 bytes tgstation.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi index 01887b31521e479c945d63f430b8f31564537b74..f2ed815f89a7f8cd430fdb55669083cdbb25a9e5 100644 GIT binary patch delta 528 zcmV+r0`L9Z0pkRa7%>C`0001iRA#9NdJ3{`Opg%tT`!3c*tLzrc6aod{wDWJ%%S=c{5f`hNRApGc>i8=v}MNE^_fx| zg&{UqlKqeOHFb@PLVPbKlP|k|MWY$I09$OPebF1YqJYzA5ytbBZE9doO&@A&H-DL} zDy5tpBKVdT2@rpdfhmJJQenK+xh<7n9nIAjSZ6z=K-y=Inrw{BAv;ryXM;lQXW0b4 zok2SXEuN9QmuY<<l2LpyX0$uwHcD)0+VqaoJ7Vg}0!G1RXUWpC$T+0J*wQvL(!16?j$ SG$o+`0000S(cbNfs3@6IFe-%<0A{ zu61>K35yxGdP+|VxzoKLs9xXG#WAE}&f9Z_j0_AMhYb$wU*X9tZnLs++2kwfpR3q` bN|3+~vB+CY4JyT5!5~3TS3j3^P6 Date: Mon, 22 Apr 2024 15:56:54 +0200 Subject: [PATCH 054/113] this is so cool --- .../antagonists/bloodling/abilities/ascension.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 613feefb39b3..c4e9293560c3 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -27,20 +27,21 @@ /* PLANS * Make tiles that turn people into thralls */ -/turf/open/floor/bloodling +/turf/open/floor/misc/bloodling name = "nerve threads" - icon_state = "materialfloor" - baseturfs = /turf/open/plating + icon = 'monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi' + icon_state = "flesh_tile" + baseturfs = /turf/open/floor/plating /datum/dimension_theme/bloodling icon = 'icons/obj/food/meat.dmi' icon_state = "meat" - material = /datum/material/meat sound = 'sound/items/eatfood.ogg' + replace_floors = list(/turf/open/floor/misc/bloodling = 1) + replace_walls = /turf/closed/wall/material/meat replace_objs = list(\ /obj/machinery/atmospherics/components/unary/vent_scrubber = list(/obj/structure/meateor_fluff/eyeball = 1), \ - /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1), \ - /turf/open/floor = list(/turf/open/floor/bloodling),) + /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1),) /* PLANS * Make this call the shuttle From c941abb678473ab70dab50745f89dfba9e7e2ac9 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 4 May 2024 15:13:01 +0200 Subject: [PATCH 055/113] Batch suggestions Co-authored-by: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> --- .../antagonists/bloodling/abilities/absorb_biomass.dm | 4 ++-- .../code/modules/antagonists/bloodling/abilities/build.dm | 6 +++--- .../modules/antagonists/bloodling/abilities/give_life.dm | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 167247f374c0..d1c31e8f74a1 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -35,7 +35,7 @@ /// How much biomass is gained from absorbing something var/biomass_gain = 10 - to_chat(owner, span_noticealien("You wrap your tendrils around [target] and begin absorbing it!")) + balloon_alert(owner, "You wrap your tendrils around [target] and begin absorbing it!") // This prevents the mob from being dragged away from the bloodling during the process target.AddComponentFrom(REF(src), /datum/component/leash, our_mob, 1) @@ -51,7 +51,7 @@ var/mob/living/mob_to_absorb = target if(!iscarbon(mob_to_absorb)) - biomass_gain = mob_to_absorb.getMaxHealth() * 0.5 + biomass_gain = max(mob_to_absorb.getMaxHealth() * 0.5, biomass_gain) if(biomass_gain < 10) biomass_gain = 10 else diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm index bce14ee954cd..d0de3230f818 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm @@ -13,8 +13,8 @@ // Snowflake to check for what we build /datum/action/cooldown/bloodling/build/proc/check_for_duplicate() for(var/blocker_name in structures) - var/atom/blocker_type = structures[blocker_name] - if(locate(blocker_type) in owner.loc) + blocker_name = structures[blocker_name] + if(locate(blocker_type) in get_turf(src)) to_chat(owner, span_warning("There is already shaped flesh here!")) return FALSE @@ -34,5 +34,5 @@ span_notice("You mold a [choice] out of your flesh."), ) - new choice_path(owner.loc) + new choice_path(get_turf(owner)) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index faa986accd55..a955e5cd6c72 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -9,7 +9,7 @@ return FALSE var/mob/living/mob_target = target - if(mob_target.ckey && !mob_target.stat == DEAD) + if(mob_target.mind && !mob_target.stat == DEAD) owner.balloon_alert(owner, "only works on non-sentient alive mobs!") return FALSE @@ -31,7 +31,7 @@ POLL_IGNORE_SHUTTLE_DENIZENS, pic_source = target_mob ) - if(!LAZYLEN(candidates) && !LAZYLEN(target_mob)) + if(!LAZYLEN(candidates)) owner.balloon_alert(owner, "[target_mob] rejects your generous gift...for now...") return FALSE var/mob/dead/observer/candie = pick_n_take(candidates) From 3249fe6627e497cd3a4a1612a2ee8e54a7769347 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 8 May 2024 16:17:08 +0200 Subject: [PATCH 056/113] RRRRREVIEWS!!! --- code/__DEFINES/~monkestation/antagonists.dm | 15 +++++++++++ monkestation/code/__DEFINES/antagonists.dm | 14 ---------- monkestation/code/__DEFINES/saymode.dm | 27 ------------------- .../bloodling/abilities/absorb_biomass.dm | 9 ++++--- .../bloodling/abilities/ascension.dm | 8 +++--- .../abilities/bloodling_abilities.dm | 6 +++-- .../antagonists/bloodling/abilities/build.dm | 2 +- .../antagonists/bloodling/abilities/devour.dm | 5 +--- .../bloodling/abilities/dissonant_shriek.dm | 6 ++--- .../bloodling/abilities/give_life.dm | 9 +++---- .../antagonists/bloodling/abilities/infest.dm | 6 ++--- tgstation.dme | 2 -- 12 files changed, 40 insertions(+), 69 deletions(-) delete mode 100644 monkestation/code/__DEFINES/antagonists.dm delete mode 100644 monkestation/code/__DEFINES/saymode.dm diff --git a/code/__DEFINES/~monkestation/antagonists.dm b/code/__DEFINES/~monkestation/antagonists.dm index 8ec0def3b22b..64048369d6b4 100644 --- a/code/__DEFINES/~monkestation/antagonists.dm +++ b/code/__DEFINES/~monkestation/antagonists.dm @@ -17,3 +17,18 @@ #define iscogscarab(checked) (istype(checked, /mob/living/basic/drone/cogscarab)) /// is something an eminence #define iseminence(checked) (istype(checked, /mob/living/eminence)) + +/// If the given mob is a bloodling +#define IS_BLOODLING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/bloodling)) + +/// If the given mob is a bloodling thrall +#define IS_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling/bloodling_thrall)) + +/// If the given mob is a simplemob bloodling thrall +#define IS_SIMPLEMOB_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/infested_thrall)) + +/// If the given mob is a bloodling thrall or bloodling +#define IS_BLOODLING_OR_THRALL(mob) (IS_BLOODLING(mob) || IS_BLOODLING_THRALL(mob) || IS_SIMPLEMOB_BLOODLING_THRALL(mob)) + +/// Antagonist panel groups +#define ANTAG_GROUP_BLOODLING "Bloodling" diff --git a/monkestation/code/__DEFINES/antagonists.dm b/monkestation/code/__DEFINES/antagonists.dm deleted file mode 100644 index beb7969e0dfb..000000000000 --- a/monkestation/code/__DEFINES/antagonists.dm +++ /dev/null @@ -1,14 +0,0 @@ -/// If the given mob is a bloodling -#define IS_BLOODLING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/bloodling)) - -/// If the given mob is a bloodling thrall -#define IS_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling/bloodling_thrall)) - -/// If the given mob is a simplemob bloodling thrall -#define IS_SIMPLEMOB_BLOODLING_THRALL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/infested_thrall)) - -/// If the given mob is a bloodling thrall or bloodling -#define IS_BLOODLING_OR_THRALL(mob) (IS_BLOODLING(mob) || IS_BLOODLING_THRALL(mob) || IS_SIMPLEMOB_BLOODLING_THRALL(mob)) - -/// Antagonist panel groups -#define ANTAG_GROUP_BLOODLING "Bloodling" diff --git a/monkestation/code/__DEFINES/saymode.dm b/monkestation/code/__DEFINES/saymode.dm deleted file mode 100644 index edcce0f08df3..000000000000 --- a/monkestation/code/__DEFINES/saymode.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/saymode/bloodling - key = "9" - mode = MODE_BLOODLING - -/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language) - //we can send the message - if(!user.mind) - return FALSE - var/datum/antagonist/bloodling_sender = IS_BLOODLING_OR_THRALL(user) - if(!bloodling_sender) - return FALSE - - user.log_talk(message, LOG_SAY, tag="bloodling [user]") - var/msg = span_changeling("[user]: [message]") - - //the recipients can recieve the message - for(var/datum/antagonist/reciever in GLOB.antagonists) - if(!reciever.owner) - continue - if(!IS_BLOODLING_OR_THRALL(reciever.owner.current)) - continue - var/mob/living/ling_mob = reciever.owner.current - to_chat(ling_mob, msg) - - for(var/mob/dead/ghost as anything in GLOB.dead_mob_list) - to_chat(ghost, "[FOLLOW_LINK(ghost, user)] [msg]") - return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index d1c31e8f74a1..071a9d9b9ebe 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -26,16 +26,13 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb/Activate(atom/target) . = ..() - return consume(target) - -/datum/action/cooldown/mob_cooldown/bloodling/absorb/proc/consume(atom/target) var/mob/living/basic/bloodling/our_mob = owner /// How long it takes to absorb something var/absorb_time = 5 SECONDS /// How much biomass is gained from absorbing something var/biomass_gain = 10 - balloon_alert(owner, "You wrap your tendrils around [target] and begin absorbing it!") + our_mob.balloon_alert(our_mob, "You begin absorbing [target]!") // This prevents the mob from being dragged away from the bloodling during the process target.AddComponentFrom(REF(src), /datum/component/leash, our_mob, 1) @@ -52,6 +49,10 @@ var/mob/living/mob_to_absorb = target if(!iscarbon(mob_to_absorb)) biomass_gain = max(mob_to_absorb.getMaxHealth() * 0.5, biomass_gain) + if(biomass_gain > 150) + our_mob.balloon_alert(our_mob, "[target] is too large!") + return FALSE + if(biomass_gain < 10) biomass_gain = 10 else diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index c4e9293560c3..3c14b9d6af99 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -1,8 +1,8 @@ /datum/action/cooldown/bloodling/ascension name = "Ascend" - desc = "We reach our last form...Mass consumption is required. Costs 250 Biomass and takes 5 minutes for you to ascend." + desc = "We reach our last form...Mass consumption is required. Costs 500 Biomass and takes 5 minutes for you to ascend." button_icon_state = "dissonant_shriek" - biomass_cost = 250 + biomass_cost = 500 /datum/action/cooldown/bloodling/ascension/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner @@ -25,7 +25,7 @@ REMOVE_TRAIT(bloodling, TRAIT_IMMOBILIZED, REF(src)) /* PLANS - * Make tiles that turn people into thralls + * Make tiles that the bloodling can easier infest on */ /turf/open/floor/misc/bloodling name = "nerve threads" @@ -56,7 +56,7 @@ /datum/round_event/bloodling_ascension // Holds our theme - var/datum/dimension_theme/chosen_theme + var/static/datum/dimension_theme/chosen_theme /datum/round_event/bloodling_ascension/announce(fake) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm index 0d91de2fcd33..998eae01c275 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm @@ -10,12 +10,14 @@ return FALSE // Basically we only want bloodlings to have this if(!istype(owner, /mob/living/basic/bloodling)) + stack_trace("A non-bloodling mob has obtained a bloodling action!") return FALSE + var/mob/living/basic/bloodling/our_mob = owner if(our_mob.biomass <= biomass_cost) return FALSE - // Hardcoded for the bloodling biomass system. So it will not function on non-bloodlings - return istype(owner, /mob/living/basic/bloodling) + + return TRUE /datum/action/cooldown/mob_cooldown/bloodling/PreActivate(atom/target) if(get_dist(owner, target) > 1) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm index d0de3230f818..7c522109a507 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm @@ -14,7 +14,7 @@ /datum/action/cooldown/bloodling/build/proc/check_for_duplicate() for(var/blocker_name in structures) blocker_name = structures[blocker_name] - if(locate(blocker_type) in get_turf(src)) + if(locate(blocker_name) in get_turf(src)) to_chat(owner, span_warning("There is already shaped flesh here!")) return FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index 2f9c1d76a5f3..ae0db3283bf5 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -13,9 +13,6 @@ /datum/action/cooldown/mob_cooldown/bloodling/devour/Activate(atom/target) StartCooldown() - return eat_limb(target) - -/datum/action/cooldown/mob_cooldown/bloodling/devour/proc/eat_limb(atom/target) var/mob/living/basic/bloodling/our_mob = owner var/list/candidate_for_removal = list() var/mob/living/carbon/carbon_target = target @@ -41,7 +38,7 @@ target_part.dismember() qdel(target_part) - our_mob.add_biomass(20) + our_mob.add_biomass(5) our_mob.visible_message( span_alertalien("[our_mob] snaps its maw over [target]s [target_part] and swiftly devours it!"), diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm b/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm index d7fa69eb715f..e8d4494726b8 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/dissonant_shriek.dm @@ -10,9 +10,9 @@ owner.balloon_alert(owner, "can't shriek in pipes!") return FALSE empulse(get_turf(owner), 2, 5, 1) - for(var/obj/machinery/light/L in range(5, usr)) - L.on = TRUE - L.break_light_tube() + for(var/obj/machinery/light/light_break in range(5, usr)) + light_break.on = TRUE + light_break.break_light_tube() stoplag() return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index a955e5cd6c72..26342573eda6 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -21,11 +21,10 @@ /datum/action/cooldown/mob_cooldown/bloodling/give_life/Activate(atom/target) var/mob/living/target_mob = target - var/question = "Would you like to be a [target_mob] servant of [owner]?" var/list/candidates = SSpolling.poll_ghost_candidates_for_mob( - question, - ROLE_SENTIENCE, - ROLE_SENTIENCE, + "Would you like to be a [target_mob] servant of [owner]?", + ROLE_BLOODLING_THRALL, + ROLE_BLOODLING_THRALL, 10 SECONDS, target_mob, POLL_IGNORE_SHUTTLE_DENIZENS, @@ -34,9 +33,9 @@ if(!LAZYLEN(candidates)) owner.balloon_alert(owner, "[target_mob] rejects your generous gift...for now...") return FALSE + target_mob.ghostize(FALSE) var/mob/dead/observer/candie = pick_n_take(candidates) message_admins("[key_name_admin(candie)] has taken control of ([key_name_admin(target_mob)])") - target_mob.ghostize(FALSE) target_mob.key = candie.key target_mob.mind.add_antag_datum(/datum/antagonist/changeling/bloodling_thrall) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index 59c199d23b47..4309a5bb2826 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -27,15 +27,15 @@ if(iscarbon(mob)) var/mob/living/carbon/human/carbon_mob = target if(HAS_TRAIT(carbon_mob, TRAIT_MINDSHIELD)) - if(!do_after(owner, 15 SECONDS)) + if(!do_after(owner, 2 MINUTES)) return FALSE else - if(!do_after(owner, 10 SECONDS)) + if(!do_after(owner, 1 MINUTES)) return FALSE var/datum/antagonist/changeling/bloodling_thrall/thrall = carbon_mob.mind.add_antag_datum(/datum/antagonist/changeling/bloodling_thrall) thrall.set_master(owner) else - if(!do_after(owner, 5 SECONDS)) + if(!do_after(owner, 30 SECONDS)) return FALSE var/datum/antagonist/infested_thrall/thrall = mob.mind.add_antag_datum(/datum/antagonist/infested_thrall) thrall.set_master(owner) diff --git a/tgstation.dme b/tgstation.dme index af34b65c5e91..a03c673641ec 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5660,10 +5660,8 @@ #include "interface\fonts\spess_font.dm" #include "interface\fonts\tiny_unicode.dm" #include "interface\fonts\vcr_osd_mono.dm" -#include "monkestation\code\__DEFINES\antagonists.dm" #include "monkestation\code\__DEFINES\mobfactions.dm" #include "monkestation\code\__DEFINES\projectile.dm" -#include "monkestation\code\__DEFINES\saymode.dm" #include "monkestation\code\__HELPERS\_lists.dm" #include "monkestation\code\__HELPERS\anime.dm" #include "monkestation\code\__HELPERS\reagents.dm" From 72d70171186112003edb292a1cf147a8106d11c0 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 8 May 2024 16:19:56 +0200 Subject: [PATCH 057/113] more reviews --- .../code/modules/antagonists/bloodling/abilities/ascension.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 3c14b9d6af99..eb5a85703c13 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -64,7 +64,8 @@ // The start of the event, it grabs a bunch of turfs to parse and apply our theme to /datum/round_event/bloodling_ascension/start() - chosen_theme = new /datum/dimension_theme/bloodling() + if(isnull(chosen_theme)) + chosen_theme = new /datum/dimension_theme/bloodling() // Placeholder code, just for testing var/turf/start_turf = get_turf(pick(GLOB.station_turfs)) var/greatest_dist = 0 From b70996b3cdaf91538a74e967f335f04ad8ec7182 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 16 May 2024 21:11:20 +0200 Subject: [PATCH 058/113] Infested rework --- .../bloodling/abilities/ascension.dm | 3 --- .../antagonists/bloodling/abilities/infest.dm | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index eb5a85703c13..e85b83a3964c 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -24,9 +24,6 @@ // Woah they can move REMOVE_TRAIT(bloodling, TRAIT_IMMOBILIZED, REF(src)) -/* PLANS - * Make tiles that the bloodling can easier infest on -*/ /turf/open/floor/misc/bloodling name = "nerve threads" icon = 'monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi' diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index 4309a5bb2826..29a47a94dbf2 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -24,18 +24,25 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest/Activate(atom/target) var/mob/living/mob = target + var/infest_time = 30 SECONDS + + // If they are standing on the ascended bloodling tiles it takes 1/3rd of the time to infest them + if(isturf(get_turf(mob), /turf/open/floor/misc/bloodling)) + infest_time = 10 SECONDS + if(iscarbon(mob)) var/mob/living/carbon/human/carbon_mob = target + infest_time *= 2 + if(HAS_TRAIT(carbon_mob, TRAIT_MINDSHIELD)) - if(!do_after(owner, 2 MINUTES)) - return FALSE - else - if(!do_after(owner, 1 MINUTES)) - return FALSE + infest_time *= 4 + + if(!do_after(owner, infest_time)) + return FALSE var/datum/antagonist/changeling/bloodling_thrall/thrall = carbon_mob.mind.add_antag_datum(/datum/antagonist/changeling/bloodling_thrall) thrall.set_master(owner) else - if(!do_after(owner, 30 SECONDS)) + if(!do_after(owner, infest_time)) return FALSE var/datum/antagonist/infested_thrall/thrall = mob.mind.add_antag_datum(/datum/antagonist/infested_thrall) thrall.set_master(owner) From d33c91bad8bf0937a055104c0cb1f20585ed906f Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 18 May 2024 23:32:01 +0200 Subject: [PATCH 059/113] Update ascension.dm --- .../code/modules/antagonists/bloodling/abilities/ascension.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index e85b83a3964c..14b2abbb2d8a 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -36,6 +36,7 @@ sound = 'sound/items/eatfood.ogg' replace_floors = list(/turf/open/floor/misc/bloodling = 1) replace_walls = /turf/closed/wall/material/meat + window_colour = "#5c0c0c" replace_objs = list(\ /obj/machinery/atmospherics/components/unary/vent_scrubber = list(/obj/structure/meateor_fluff/eyeball = 1), \ /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1),) From e26a8aebb0651b31574c3128d63237e91610435c Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 22 May 2024 16:23:04 +0200 Subject: [PATCH 060/113] bloodling hive speaaaakkkk --- .../bloodling/abilities/ascension.dm | 5 +- .../abilities/bloodling_hivespeak.dm | 47 +++++++++++++++++++ .../bloodling/mobs/bloodling_mob.dm | 5 ++ .../antagonists/bloodling/mobs/minions.dm | 1 + tgstation.dme | 1 + 5 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 14b2abbb2d8a..701210e6ef21 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -41,9 +41,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber = list(/obj/structure/meateor_fluff/eyeball = 1), \ /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1),) -/* PLANS - * Make this call the shuttle -*/ /datum/round_event_control/bloodling_ascension name = "Bloodling ascension" typepath = /datum/round_event/bloodling_ascension @@ -62,6 +59,8 @@ // The start of the event, it grabs a bunch of turfs to parse and apply our theme to /datum/round_event/bloodling_ascension/start() + SSshuttle.requestEvac(src, "ALERT: LEVEL 4 BIOHAZARD DETECTED. ORGANISM CONTAINMENT HAS FAILED. EVACUATE REMAINING PERSONEL.") + if(isnull(chosen_theme)) chosen_theme = new /datum/dimension_theme/bloodling() // Placeholder code, just for testing diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm new file mode 100644 index 000000000000..c5c25101fd4d --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm @@ -0,0 +1,47 @@ +/datum/action/cooldown/bloodling_hivespeak + name = "Hivespeak" + desc = "Whispered words that all in your hive can hear." + button_icon_state = "cult_comms" + +/datum/action/cooldown/bloodling_hivespeak/IsAvailable(feedback = FALSE) + if(IS_BLOODLING_OR_THRALL(owner)) + return TRUE + return ..() + +/datum/action/cooldown/bloodling_hivespeak/Activate() + var/input = tgui_input_text(usr, "Message to tell your hive", "Commune of Hive") + if(!input || !IsAvailable(feedback = TRUE)) + return + + var/list/filter_result = CAN_BYPASS_FILTER(usr) ? null : is_ic_filtered(input) + if(filter_result) + REPORT_CHAT_FILTER_TO_USER(usr, filter_result) + return + + var/list/soft_filter_result = CAN_BYPASS_FILTER(usr) ? null : is_soft_ic_filtered(input) + if(soft_filter_result) + if(tgui_alert(usr,"Your message contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to say it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + return + message_admins("[ADMIN_LOOKUPFLW(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term. Message: \"[html_encode(input)]\"") + log_admin_private("[key_name(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term. Message: \"[input]\"") + commune(usr, input) + +/datum/action/cooldown/bloodling_hivespeak/proc/commune(mob/living/user, message) + var/title = "Thrall" + var/span = "noticealien" + if(!message) + return + if(user.mind && IS_BLOODLING(user)) + span = "alertalien" + title = "Bloodling the" + + var/my_message = "Hivespeak:
[title] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]:
[message]
" + for(var/player in GLOB.player_list) + var/mob/reciever = player + if(IS_BLOODLING_OR_THRALL(reciever)) + to_chat(reciever, my_message) + else if(reciever in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(reciever, user) + to_chat(reciever, "[link] [my_message]") + + user.log_talk(message, LOG_SAY, tag="bloodling_speak") diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index e187674fbb7d..53c008300ef1 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -199,6 +199,7 @@ initial_powers = list( /datum/action/cooldown/mob_cooldown/bloodling/absorb, /datum/action/cooldown/sneak/bloodling, + /datum/action/cooldown/bloodling_hivespeak, ) speed = 0.5 @@ -215,6 +216,7 @@ /datum/action/cooldown/sneak/bloodling, /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, + /datum/action/cooldown/bloodling_hivespeak, ) speed = 1 @@ -227,6 +229,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest, /datum/action/cooldown/bloodling/build, /datum/action/cooldown/mob_cooldown/bloodling/devour, + /datum/action/cooldown/bloodling_hivespeak, ) speed = 1.5 @@ -244,6 +247,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, /datum/action/cooldown/mob_cooldown/bloodling/heal, /datum/action/cooldown/mob_cooldown/bloodling/give_life, + /datum/action/cooldown/bloodling_hivespeak, ) speed = 2 @@ -262,5 +266,6 @@ /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, /datum/action/cooldown/mob_cooldown/bloodling/heal, /datum/action/cooldown/mob_cooldown/bloodling/give_life, + /datum/action/cooldown/bloodling_hivespeak, ) speed = 2.5 diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm index 4bc35daa0419..eec6810a3667 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -10,6 +10,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/devour, /datum/action/cooldown/spell/aoe/repulse/bloodling, /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, + /datum/action/cooldown/bloodling_hivespeak, ) /mob/living/basic/bloodling/minion/harvester diff --git a/tgstation.dme b/tgstation.dme index a03c673641ec..15da06e9ffa6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5799,6 +5799,7 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\ascension.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\bloodling_abilities.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\bloodling_hivespeak.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\build.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\devour.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\dissonant_shriek.dm" From 13a4a978b53aff892011bed9e1ac4a89532d292a Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 23 May 2024 07:05:28 +0200 Subject: [PATCH 061/113] Update infested_thrall.dm --- .../code/modules/antagonists/bloodling/infested_thrall.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm index 5a4996e5e22a..b0a81156f807 100644 --- a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm +++ b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm @@ -17,7 +17,7 @@ if(istype(sting_path, /datum/action/changeling/fakedeath)) to_chat(owner.current, span_warning("We are unable to evolve that ability")) return FALSE - ..() + return ..() /datum/antagonist/changeling/bloodling_thrall/create_innate_actions() for(var/datum/action/changeling/path as anything in all_powers) @@ -28,6 +28,8 @@ continue innate_powers += innate_ability innate_ability.on_purchase(owner.current, TRUE) + var/datum/action/cooldown/bloodling_hivespeak/hivetalk = new path() + hivetalk.Grant(owner.current) /datum/antagonist/changeling/bloodling_thrall/proc/set_master(mob/living/basic/bloodling/master) to_chat(owner, span_info("Your master is [master], they have granted you this gift. Obey their commands. Praise be the living flesh.")) @@ -57,6 +59,10 @@ owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_alert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) return ..() +/datum/antagonist/changeling/bloodling_thrall/create_innate_actions() + var/datum/action/cooldown/bloodling_hivespeak/hivetalk = new path() + hivetalk.Grant(owner.current) + /datum/antagonist/infested_thrall/forge_objectives() var/datum/objective/bloodling_thrall/serve_objective = new serve_objective.owner = owner From cf6a5e752f566af414489afef2436711ededa16d Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 23 May 2024 07:17:24 +0200 Subject: [PATCH 062/113] changes --- .../bloodling/abilities/ascension.dm | 64 ++++++------------- .../antagonists/bloodling/infested_thrall.dm | 4 +- 2 files changed, 23 insertions(+), 45 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 701210e6ef21..ff61047e8ddb 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -3,6 +3,7 @@ desc = "We reach our last form...Mass consumption is required. Costs 500 Biomass and takes 5 minutes for you to ascend." button_icon_state = "dissonant_shriek" biomass_cost = 500 + var/static/datum/dimension_theme/chosen_theme /datum/action/cooldown/bloodling/ascension/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner @@ -10,61 +11,20 @@ ADD_TRAIT(our_mob, TRAIT_IMMOBILIZED, REF(src)) // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) - - /* PLANS * turn the bloodling into a buffed up meteor heart on completion */ - - force_event(/datum/round_event_control/bloodling_ascension, "A bloodling is ascending") - return TRUE /datum/action/cooldown/bloodling/ascension/proc/ascend(mob/living/basic/bloodling) // Woah they can move REMOVE_TRAIT(bloodling, TRAIT_IMMOBILIZED, REF(src)) - -/turf/open/floor/misc/bloodling - name = "nerve threads" - icon = 'monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi' - icon_state = "flesh_tile" - baseturfs = /turf/open/floor/plating - -/datum/dimension_theme/bloodling - icon = 'icons/obj/food/meat.dmi' - icon_state = "meat" - sound = 'sound/items/eatfood.ogg' - replace_floors = list(/turf/open/floor/misc/bloodling = 1) - replace_walls = /turf/closed/wall/material/meat - window_colour = "#5c0c0c" - replace_objs = list(\ - /obj/machinery/atmospherics/components/unary/vent_scrubber = list(/obj/structure/meateor_fluff/eyeball = 1), \ - /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1),) - -/datum/round_event_control/bloodling_ascension - name = "Bloodling ascension" - typepath = /datum/round_event/bloodling_ascension - max_occurrences = 0 - weight = 0 - alert_observers = FALSE - category = EVENT_CATEGORY_SPACE - -/datum/round_event/bloodling_ascension - // Holds our theme - var/static/datum/dimension_theme/chosen_theme - -/datum/round_event/bloodling_ascension/announce(fake) - - priority_announce("You have failed to contain the organism. Its takeover of the station will be absolute. Emergency shuttle dispatched.","Central Command Biohazard Agency", 'monkestation/sound/bloodsuckers/monsterhunterintro.ogg') - -// The start of the event, it grabs a bunch of turfs to parse and apply our theme to -/datum/round_event/bloodling_ascension/start() SSshuttle.requestEvac(src, "ALERT: LEVEL 4 BIOHAZARD DETECTED. ORGANISM CONTAINMENT HAS FAILED. EVACUATE REMAINING PERSONEL.") if(isnull(chosen_theme)) chosen_theme = new /datum/dimension_theme/bloodling() // Placeholder code, just for testing - var/turf/start_turf = get_turf(pick(GLOB.station_turfs)) + var/turf/start_turf = get_turf(bloodling) var/greatest_dist = 0 var/list/turfs_to_transform = list() for (var/turf/transform_turf as anything in GLOB.station_turfs) @@ -85,9 +45,27 @@ continue addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (5 SECONDS) * iterator) -/datum/round_event/bloodling_ascension/proc/transform_area(list/turfs) +/datum/action/cooldown/bloodling/ascension/proc/transform_area(list/turfs) for (var/turf/transform_turf as anything in turfs) if (!chosen_theme.can_convert(transform_turf)) continue chosen_theme.apply_theme(transform_turf) CHECK_TICK + +/turf/open/floor/misc/bloodling + name = "nerve threads" + icon = 'monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi' + icon_state = "flesh_tile" + baseturfs = /turf/open/floor/plating + +/datum/dimension_theme/bloodling + icon = 'icons/obj/food/meat.dmi' + icon_state = "meat" + sound = 'sound/items/eatfood.ogg' + replace_floors = list(/turf/open/floor/misc/bloodling = 1) + replace_walls = /turf/closed/wall/material/meat + window_colour = "#5c0c0c" + replace_objs = list(\ + /obj/machinery/atmospherics/components/unary/vent_scrubber = list(/obj/structure/meateor_fluff/eyeball = 1), \ + /obj/machinery/atmospherics/components/unary/vent_pump = list(/obj/structure/meateor_fluff/eyeball = 1),) + diff --git a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm index b0a81156f807..8fcadee5cdea 100644 --- a/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm +++ b/monkestation/code/modules/antagonists/bloodling/infested_thrall.dm @@ -28,7 +28,7 @@ continue innate_powers += innate_ability innate_ability.on_purchase(owner.current, TRUE) - var/datum/action/cooldown/bloodling_hivespeak/hivetalk = new path() + var/datum/action/cooldown/bloodling_hivespeak/hivetalk = new() hivetalk.Grant(owner.current) /datum/antagonist/changeling/bloodling_thrall/proc/set_master(mob/living/basic/bloodling/master) @@ -60,7 +60,7 @@ return ..() /datum/antagonist/changeling/bloodling_thrall/create_innate_actions() - var/datum/action/cooldown/bloodling_hivespeak/hivetalk = new path() + var/datum/action/cooldown/bloodling_hivespeak/hivetalk = new() hivetalk.Grant(owner.current) /datum/antagonist/infested_thrall/forge_objectives() From 1a536a819c4b6cc17d8929492959f11056013fec Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 24 May 2024 23:21:14 +0200 Subject: [PATCH 063/113] ds --- .../antagonists/bloodling/abilities/ascension.dm | 1 + .../{ => sprites}/bloodling_sprites.dmi | Bin .../antagonists/bloodling/sprites/flesh_tile.dmi | Bin 0 -> 4734 bytes 3 files changed, 1 insertion(+) rename monkestation/code/modules/antagonists/bloodling/{ => sprites}/bloodling_sprites.dmi (100%) create mode 100644 monkestation/code/modules/antagonists/bloodling/sprites/flesh_tile.dmi diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index ff61047e8ddb..cf67819e2eef 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -57,6 +57,7 @@ icon = 'monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi' icon_state = "flesh_tile" baseturfs = /turf/open/floor/plating + smoothing_flags = SMOOTH_BITMASK /datum/dimension_theme/bloodling icon = 'icons/obj/food/meat.dmi' diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi similarity index 100% rename from monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi rename to monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/flesh_tile.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/flesh_tile.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7263e5a0009451ca0378e6905c01a1913e7357c0 GIT binary patch literal 4734 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 literal 0 HcmV?d00001 From 182ec4c3c22bd229093064038052efcf867d7bc8 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 25 May 2024 00:27:44 +0200 Subject: [PATCH 064/113] trying to get smoothiung to fucking work --- code/__DEFINES/icon_smoothing.dm | 6 +++- .../bloodling/abilities/ascension.dm | 33 ++++++++++++++++--- .../antagonists/bloodling/abilities/infest.dm | 2 +- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 22a4a91cab40..56419265c944 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -108,7 +108,11 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_LOWERED_PLASTEEL S_TURF(61) #define SMOOTH_GROUP_FISSURE S_TURF(62) -#define MAX_S_TURF 62 //Always match this value with the one above it. +// Monkestation edit start +#define SMOOTH_GROUP_FLOOR_BLOODLING S_TURF(63) ////turf/open/floor/bloodling + +#define MAX_S_TURF 63 //Always match this value with the one above it. +// Monkestation edit end #define S_OBJ(num) ("-" + #num + ",") /* /obj included */ diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index cf67819e2eef..a92b4faf52c5 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -52,18 +52,43 @@ chosen_theme.apply_theme(transform_turf) CHECK_TICK -/turf/open/floor/misc/bloodling + +/turf/open/misc/bloodling name = "nerve threads" - icon = 'monkestation/code/modules/antagonists/bloodling/bloodling_sprites.dmi' - icon_state = "flesh_tile" + icon = 'monkestation/code/modules/antagonists/bloodling/sprites/flesh_tile.dmi' + icon_state = "flesh_tile-0" + base_icon_state = "flesh_tile-255" baseturfs = /turf/open/floor/plating smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_BLOODLING + canSmoothWith = SMOOTH_GROUP_FLOOR_BLOODLING + flags_1 = NONE + +/turf/open/misc/bloodling/Initialize(mapload) + . = ..() + update_appearance() + + if(is_station_level(z)) + GLOB.station_turfs += src + +/turf/open/misc/bloodling/smooth_icon() + . = ..() + update_appearance(~UPDATE_SMOOTHING) + +/turf/open/misc/bloodling/update_icon(updates=ALL) + . = ..() + if(!. || !(updates & UPDATE_SMOOTHING)) + return + QUEUE_SMOOTH(src) + +/turf/open/misc/bloodling/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + return FALSE /datum/dimension_theme/bloodling icon = 'icons/obj/food/meat.dmi' icon_state = "meat" sound = 'sound/items/eatfood.ogg' - replace_floors = list(/turf/open/floor/misc/bloodling = 1) + replace_floors = list(/turf/open/misc/bloodling = 1) replace_walls = /turf/closed/wall/material/meat window_colour = "#5c0c0c" replace_objs = list(\ diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index 29a47a94dbf2..f50bcb335ff0 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -27,7 +27,7 @@ var/infest_time = 30 SECONDS // If they are standing on the ascended bloodling tiles it takes 1/3rd of the time to infest them - if(isturf(get_turf(mob), /turf/open/floor/misc/bloodling)) + if(isturf(get_turf(mob), /turf/open/misc/bloodling)) infest_time = 10 SECONDS if(iscarbon(mob)) From 4beba3a881c80958dee156bafe6374b703319c05 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 25 May 2024 10:59:49 +0200 Subject: [PATCH 065/113] Praise be --- .../bloodling/abilities/ascension.dm | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index a92b4faf52c5..c42f5ca0f1d8 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -57,32 +57,37 @@ name = "nerve threads" icon = 'monkestation/code/modules/antagonists/bloodling/sprites/flesh_tile.dmi' icon_state = "flesh_tile-0" - base_icon_state = "flesh_tile-255" + base_icon_state = "flesh_tile" baseturfs = /turf/open/floor/plating smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_BLOODLING canSmoothWith = SMOOTH_GROUP_FLOOR_BLOODLING - flags_1 = NONE + layer = HIGH_TURF_LAYER /turf/open/misc/bloodling/Initialize(mapload) . = ..() - update_appearance() - if(is_station_level(z)) GLOB.station_turfs += src -/turf/open/misc/bloodling/smooth_icon() - . = ..() - update_appearance(~UPDATE_SMOOTHING) + var/matrix/translation = new + translation.Translate(-9, -9) + transform = translation + QUEUE_SMOOTH(src) -/turf/open/misc/bloodling/update_icon(updates=ALL) + +/turf/open/misc/bloodling/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) . = ..() - if(!. || !(updates & UPDATE_SMOOTHING)) + if (!.) return - QUEUE_SMOOTH(src) -/turf/open/misc/bloodling/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - return FALSE + if(!smoothing_flags) + return + + var/matrix/translation = new + translation.Translate(-9, -9) + transform = translation + + underlay_appearance.transform = transform /datum/dimension_theme/bloodling icon = 'icons/obj/food/meat.dmi' From ae8f66c734c799ba6164840c6f9994254c8ba596 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 25 May 2024 23:13:49 +0200 Subject: [PATCH 066/113] wow s m o o t h --- code/__DEFINES/role_preferences.dm | 1 + .../code/modules/antagonists/bloodling/abilities/ascension.dm | 3 ++- monkestation/code/modules/antagonists/bloodling/bloodling.dm | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 42998b443375..7e7c65a51907 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -131,6 +131,7 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_WIZARD = 14, ROLE_CLOCK_CULTIST = 14, ROLE_BLOODSUCKER = 0, + ROLE_BLOODLING = 14, // Midround ROLE_ABDUCTOR = 0, diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index c42f5ca0f1d8..d4c340627188 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -12,7 +12,7 @@ // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) /* PLANS - * turn the bloodling into a buffed up meteor heart on completion + * Make this spawn a cool meator heart/other chrysalis whilst the bloodling is pulsing */ return TRUE @@ -63,6 +63,7 @@ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_BLOODLING canSmoothWith = SMOOTH_GROUP_FLOOR_BLOODLING layer = HIGH_TURF_LAYER + underfloor_accessibility = UNDERFLOOR_HIDDEN /turf/open/misc/bloodling/Initialize(mapload) . = ..() diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index 954fe8f3d561..4f4e6cc27c2e 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -7,6 +7,7 @@ antag_hud_name = "changeling" hijack_speed = 0.5 suicide_cry = "CONSUME!! CLAIM!! THERE WILL BE ANOTHER!!" + show_name_in_check_antagonists = TRUE // If this bloodling is ascended or not var/is_ascended = FALSE From ff41db1407849cd82bdd6a053c56fc18b437d01f Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 27 May 2024 21:35:38 +0200 Subject: [PATCH 067/113] S --- .../code/modules/antagonists/bloodling/abilities/ascension.dm | 2 +- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index d4c340627188..96cd9df368d7 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -12,7 +12,7 @@ // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) /* PLANS - * Make this spawn a cool meator heart/other chrysalis whilst the bloodling is pulsing + * Make this spawn a cool meator heart/other chrysalis whilst the bloodling is gestating */ return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 53c008300ef1..3d5f645f6339 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -69,7 +69,7 @@ sight = SEE_SELF|SEE_MOBS biomass = 50 - biomass_max = 500 + biomass_max = 750 /// The evolution level our bloodling is on var/evolution_level = 0 From daea3af7f9b87631f45de133f5ac5c3de82349ed Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sat, 8 Jun 2024 19:40:59 +0200 Subject: [PATCH 068/113] Update tgstation.dme --- tgstation.dme | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index 414b1a12a37f..c12ed88c311e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5853,10 +5853,13 @@ #include "monkestation\code\modules\aesthetics\walls\iron.dm" #include "monkestation\code\modules\antagonists\_common\antag_datum.dm" #include "monkestation\code\modules\antagonists\_common\antag_hud.dm" -#include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" -#include "monkestation\code\modules\antagonists\bloodling\bloodling_structures.dm" -#include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" -#include "monkestation\code\modules\antagonists\bloodling\objectives.dm" +#include "monkestation\code\modules\antagonists\abductor\abductor.dm" +#include "monkestation\code\modules\antagonists\abductor\equipment\glands\blood.dm" +#include "monkestation\code\modules\antagonists\abductor\equipment\glands\plasma.dm" +#include "monkestation\code\modules\antagonists\abductor\equipment\glands\slime.dm" +#include "monkestation\code\modules\antagonists\abductor\equipment\glands\trauma.dm" +#include "monkestation\code\modules\antagonists\abductor\machinery\dispenser.dm" +#include "monkestation\code\modules\antagonists\battlecruiser\battlecruiser.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\ascension.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\bloodling_abilities.dm" @@ -5870,18 +5873,12 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\transfer_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\whiplash.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling_structures.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" +#include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\minions.dm" -#include "monkestation\code\modules\antagonists\abductor\abductor.dm" -#include "monkestation\code\modules\antagonists\abductor\equipment\glands\blood.dm" -#include "monkestation\code\modules\antagonists\abductor\equipment\glands\plasma.dm" -#include "monkestation\code\modules\antagonists\abductor\equipment\glands\slime.dm" -#include "monkestation\code\modules\antagonists\abductor\equipment\glands\trauma.dm" -#include "monkestation\code\modules\antagonists\abductor\machinery\dispenser.dm" -#include "monkestation\code\modules\antagonists\battlecruiser\battlecruiser.dm" -#include "monkestation\code\modules\antagonists\borers\code\cortical_borer_chems.dm" -#include "monkestation\code\modules\antagonists\borers\code\focus_datum.dm" -#include "monkestation\code\modules\antagonists\borers\code\status_effects.dm" +#include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\borers\code\abilities\_ability.dm" #include "monkestation\code\modules\antagonists\borers\code\abilities\chemical_injector.dm" #include "monkestation\code\modules\antagonists\borers\code\abilities\enter_host.dm" @@ -5900,12 +5897,14 @@ #include "monkestation\code\modules\antagonists\borers\code\antagonist_stuff\antagonist_datum.dm" #include "monkestation\code\modules\antagonists\borers\code\antagonist_stuff\midround_event.dm" #include "monkestation\code\modules\antagonists\borers\code\antagonist_stuff\round_end_text.dm" +#include "monkestation\code\modules\antagonists\borers\code\cortical_borer_chems.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\borer_evolution.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_datum.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_diveworm.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_general.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_hivelord.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_symbiote.dm" +#include "monkestation\code\modules\antagonists\borers\code\focus_datum.dm" #include "monkestation\code\modules\antagonists\borers\code\items\borer_spawner.dm" #include "monkestation\code\modules\antagonists\borers\code\items\egg.dm" #include "monkestation\code\modules\antagonists\borers\code\items\empowered_egg.dm" @@ -5914,6 +5913,7 @@ #include "monkestation\code\modules\antagonists\borers\code\mobs\empowered_borer.dm" #include "monkestation\code\modules\antagonists\borers\code\mobs\name_lists.dm" #include "monkestation\code\modules\antagonists\borers\code\mobs\neutered_borer.dm" +#include "monkestation\code\modules\antagonists\borers\code\status_effects.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_alert.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_helpers.dm" From 65d49f31539f5ac2113b2309638af01b5e554f3d Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 9 Jun 2024 21:06:32 +0200 Subject: [PATCH 069/113] Here we gooooo --- .../antagonists/bloodling/abilities/infect.dm | 47 +++++++++++++++++++ .../antagonists/bloodling/bloodling.dm | 5 ++ .../bloodling/mobs/bloodling_mob.dm | 7 --- tgstation.dme | 15 +++--- 4 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/abilities/infect.dm diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm new file mode 100644 index 000000000000..00e3cd2cc693 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm @@ -0,0 +1,47 @@ +/datum/action/cooldown/bloodling_infect + name = "Infect" + desc = "Allows us to make someone our thrall, this consumes our host body and reveals our true form." + button_icon_state = "absorb_dna" + ///if we're currently infecting + var/is_infecting = FALSE + +/datum/action/cooldown/bloodling_infect/Activate(atom/target) + if(is_infecting) + owner.balloon_alert(owner, "already infecting!") + return + + if(!owner.pulling) + owner.balloon_alert(owner, "needs grab!") + return + + if(!iscarbon(owner.pulling)) + owner.balloon_alert(owner, "not a humanoid!") + return + + + if(owner.grab_state <= GRAB_NECK) + owner.balloon_alert(owner, "needs tighter grip!") + return + + is_infecting = TRUE + var/mob/living/old_body = owner + + var/mob/living/carbon/human/carbon_mob = owner.pulling + + + var/infest_time = 20 SECONDS + + if(HAS_TRAIT(carbon_mob, TRAIT_MINDSHIELD)) + infest_time *= 4 + + if(!do_after(owner, infest_time)) + return FALSE + + var/datum/antagonist/changeling/bloodling_thrall/thrall = carbon_mob.mind.add_antag_datum(/datum/antagonist/changeling/bloodling_thrall) + thrall.set_master(owner) + + var/mob/living/basic/bloodling/proper/tier1/bloodling = new /mob/living/basic/bloodling/proper/tier1/(old_body.loc) + owner.mind.transfer_to(bloodling) + old_body.gib() + playsound(get_turf(bloodling), 'sound/ambience/antag/blobalert.ogg', 50, FALSE) + qdel(src) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling.dm b/monkestation/code/modules/antagonists/bloodling/bloodling.dm index 4f4e6cc27c2e..dda329dc2e4a 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling.dm @@ -16,6 +16,11 @@ forge_objectives() owner.current.grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue. We are a horrific blob of flesh who can manifest a million tongues. owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_alert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + // The midround version of this antag begins as a bloodling, not as a human + if(!ishuman(owner.current)) + return ..() + var/datum/action/cooldown/bloodling_infect/infect = new /datum/action/cooldown/bloodling_infect() + infect.Grant(owner.current) return ..() /datum/antagonist/bloodling/forge_objectives() diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 3d5f645f6339..585c98e17239 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -166,13 +166,6 @@ new_bloodling.add_biomass(biomass) qdel(src) -/// Our health hud is based on biomass, since our health is infinite -/mob/living/basic/bloodling/proper/update_health_hud() - if(isnull(hud_used)) - return - - hud_used.healths.maptext = MAPTEXT("
[biomass]E
") - /// Checks for damage to update the bloodlings biomass accordingly /mob/living/basic/bloodling/proper/proc/on_damaged(datum/source, damage, damagetype) SIGNAL_HANDLER diff --git a/tgstation.dme b/tgstation.dme index c12ed88c311e..77243d169fbe 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5860,6 +5860,10 @@ #include "monkestation\code\modules\antagonists\abductor\equipment\glands\trauma.dm" #include "monkestation\code\modules\antagonists\abductor\machinery\dispenser.dm" #include "monkestation\code\modules\antagonists\battlecruiser\battlecruiser.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling_structures.dm" +#include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" +#include "monkestation\code\modules\antagonists\bloodling\objectives.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\absorb_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\ascension.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\bloodling_abilities.dm" @@ -5870,15 +5874,15 @@ #include "monkestation\code\modules\antagonists\bloodling\abilities\give_life.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\heal.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\hide.dm" +#include "monkestation\code\modules\antagonists\bloodling\abilities\infect.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\infest.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\transfer_biomass.dm" #include "monkestation\code\modules\antagonists\bloodling\abilities\whiplash.dm" -#include "monkestation\code\modules\antagonists\bloodling\bloodling_structures.dm" -#include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" -#include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\bloodling_mob.dm" #include "monkestation\code\modules\antagonists\bloodling\mobs\minions.dm" -#include "monkestation\code\modules\antagonists\bloodling\objectives.dm" +#include "monkestation\code\modules\antagonists\borers\code\cortical_borer_chems.dm" +#include "monkestation\code\modules\antagonists\borers\code\focus_datum.dm" +#include "monkestation\code\modules\antagonists\borers\code\status_effects.dm" #include "monkestation\code\modules\antagonists\borers\code\abilities\_ability.dm" #include "monkestation\code\modules\antagonists\borers\code\abilities\chemical_injector.dm" #include "monkestation\code\modules\antagonists\borers\code\abilities\enter_host.dm" @@ -5897,14 +5901,12 @@ #include "monkestation\code\modules\antagonists\borers\code\antagonist_stuff\antagonist_datum.dm" #include "monkestation\code\modules\antagonists\borers\code\antagonist_stuff\midround_event.dm" #include "monkestation\code\modules\antagonists\borers\code\antagonist_stuff\round_end_text.dm" -#include "monkestation\code\modules\antagonists\borers\code\cortical_borer_chems.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\borer_evolution.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_datum.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_diveworm.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_general.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_hivelord.dm" #include "monkestation\code\modules\antagonists\borers\code\evolution\evolution_symbiote.dm" -#include "monkestation\code\modules\antagonists\borers\code\focus_datum.dm" #include "monkestation\code\modules\antagonists\borers\code\items\borer_spawner.dm" #include "monkestation\code\modules\antagonists\borers\code\items\egg.dm" #include "monkestation\code\modules\antagonists\borers\code\items\empowered_egg.dm" @@ -5913,7 +5915,6 @@ #include "monkestation\code\modules\antagonists\borers\code\mobs\empowered_borer.dm" #include "monkestation\code\modules\antagonists\borers\code\mobs\name_lists.dm" #include "monkestation\code\modules\antagonists\borers\code\mobs\neutered_borer.dm" -#include "monkestation\code\modules\antagonists\borers\code\status_effects.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_alert.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_helpers.dm" From 00651f895cf45629a4c888e7b8f5d77c0347ec47 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 9 Jun 2024 21:08:50 +0200 Subject: [PATCH 070/113] slightly lowers infection time --- .../code/modules/antagonists/bloodling/abilities/infect.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm index 00e3cd2cc693..48116710d304 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm @@ -29,10 +29,10 @@ var/mob/living/carbon/human/carbon_mob = owner.pulling - var/infest_time = 20 SECONDS + var/infest_time = 10 SECONDS if(HAS_TRAIT(carbon_mob, TRAIT_MINDSHIELD)) - infest_time *= 4 + infest_time *= 2 if(!do_after(owner, infest_time)) return FALSE From bca311f1806e8ea8478392971c85b51f185c8e01 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 9 Jun 2024 21:13:05 +0200 Subject: [PATCH 071/113] Create bloodling.dm --- .../converted_events/solo/bloodling.dm | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm diff --git a/monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm b/monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm new file mode 100644 index 000000000000..772407f7f9d2 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm @@ -0,0 +1,39 @@ +/datum/round_event_control/antagonist/solo/bloodling + antag_flag = ROLE_BLOODLING + antag_datum = /datum/antagonist/bloodling + tags = list(TAG_COMBAT, TAG_TEAM_ANTAG) + protected_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_PERSONNEL, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_RESEARCH_DIRECTOR, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_SECURITY_ASSISTANT, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG + ) + enemy_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_SECURITY, + JOB_DETECTIVE, + JOB_WARDEN, + JOB_SECURITY_OFFICER, + JOB_SECURITY_ASSISTANT, + ) + required_enemies = 3 + weight = 4 + max_occurrences = 1 + maximum_antags = 2 + denominator = 30 + +/datum/round_event_control/antagonist/solo/brother/roundstart + name = "Bloodling" + roundstart = TRUE + earliest_start = 0 SECONDS From e0b1b70380c7dd42b834a19d4f982058f1ed8177 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 9 Jun 2024 21:15:34 +0200 Subject: [PATCH 072/113] whooops --- .../modules/storytellers/converted_events/solo/bloodling.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm b/monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm index 772407f7f9d2..539d0f4c32a9 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/bloodling.dm @@ -33,7 +33,7 @@ maximum_antags = 2 denominator = 30 -/datum/round_event_control/antagonist/solo/brother/roundstart +/datum/round_event_control/antagonist/solo/bloodling/roundstart name = "Bloodling" roundstart = TRUE earliest_start = 0 SECONDS From 93551d3ffadd21dc77e6a73a778deadaf48abac7 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 10 Jun 2024 21:16:10 +0200 Subject: [PATCH 073/113] spesswalksssss --- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 585c98e17239..44358a2d0374 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -77,6 +77,9 @@ . = ..() RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + // All evolutions over 2 (3,4,5) are spess proof + if(evolution_level > 2) + ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) /mob/living/basic/bloodling/proper/adjust_health(amount, updating_health = TRUE, forced = FALSE) if(!forced) From 7ea55e8f7b300bc31960990c4f37ced6309c51f0 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 14 Jun 2024 23:45:28 +0200 Subject: [PATCH 074/113] Works on corpses and mindless humans --- .../antagonists/bloodling/abilities/infect.dm | 24 +++++++++++++++++++ .../antagonists/bloodling/objectives.dm | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm index 48116710d304..a3446cfde499 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm @@ -37,11 +37,35 @@ if(!do_after(owner, infest_time)) return FALSE + if(carbon_mob.stat == DEAD) + // This cures limbs and anything, the target is made a changeling through this process anyhow + carbon_mob.revive(ADMIN_HEAL_ALL) + + if(!carbon_mob.mind) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( + "Would you like to be a [carbon_mob] servant of [owner]?", + ROLE_BLOODLING_THRALL, + ROLE_BLOODLING_THRALL, + 10 SECONDS, + carbon_mob, + POLL_IGNORE_SHUTTLE_DENIZENS, + pic_source = carbon_mob + ) + + if(!LAZYLEN(candidates)) + return FALSE + + var/mob/dead/observer/chosen = pick(candidates) + carbon_mob.key = chosen.key + var/datum/antagonist/changeling/bloodling_thrall/thrall = carbon_mob.mind.add_antag_datum(/datum/antagonist/changeling/bloodling_thrall) thrall.set_master(owner) var/mob/living/basic/bloodling/proper/tier1/bloodling = new /mob/living/basic/bloodling/proper/tier1/(old_body.loc) owner.mind.transfer_to(bloodling) old_body.gib() + var/datum/antagonist/bloodling_datum = IS_BLOODLING(bloodling) + for(var/datum/objective/objective in bloodling_datum.objectives) + objective.update_explanation_text() playsound(get_turf(bloodling), 'sound/ambience/antag/blobalert.ogg', 50, FALSE) qdel(src) diff --git a/monkestation/code/modules/antagonists/bloodling/objectives.dm b/monkestation/code/modules/antagonists/bloodling/objectives.dm index 805568b796e0..1124cee4da75 100644 --- a/monkestation/code/modules/antagonists/bloodling/objectives.dm +++ b/monkestation/code/modules/antagonists/bloodling/objectives.dm @@ -2,6 +2,10 @@ name = "ascend" martyr_compatible = TRUE admin_grantable = FALSE + explanation_text = "Use the infect ability on a human you are strangling to burst as a bloodling and begin your ascension!" + +/datum/objective/bloodling_ascend/update_explanation_text() + ..() explanation_text = "Ascend as the ultimate being" /datum/objective/bloodling_ascend/check_completion() From 08556fc642113b726bdb556c83ba67d094093a35 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:05:06 +0200 Subject: [PATCH 075/113] uses code from https://github.com/Bubberstation/Bubberstation/pull/282/files to make a hud --- .../antagonists/bloodling/bloodling_hud.dm | 26 +++++++++++++++++++ .../bloodling/mobs/bloodling_mob.dm | 11 ++++++++ tgstation.dme | 1 + 3 files changed, 38 insertions(+) create mode 100644 monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm new file mode 100644 index 000000000000..193c1876e550 --- /dev/null +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm @@ -0,0 +1,26 @@ + +///Hud type with targetting dol and a nutrition bar +/datum/hud/bloodling/New(mob/living/owner) + . = ..() + var/atom/movable/screen/using + + action_intent = new /atom/movable/screen/combattoggle/flashy() + action_intent.hud = src + action_intent.icon = ui_style + action_intent.screen_loc = ui_combat_toggle + static_inventory += action_intent + + using = new /atom/movable/screen/language_menu() + using.icon = ui_style + using.hud = src + using.update_appearance() + static_inventory += using + + using = new /atom/movable/screen/navigate + using.screen_loc = ui_alien_navigate_menu + using.hud = src + static_inventory += using + + healthdoll = new /atom/movable/screen/healthdoll/living() + healthdoll.hud = src + infodisplay += healthdoll diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 44358a2d0374..e73fc4aaf6ec 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -67,6 +67,7 @@ maxHealth = INFINITE // Bloodlings have unlimited health, instead biomass acts as their health health = INFINITE sight = SEE_SELF|SEE_MOBS + hud_type = /datum/hud/bloodling biomass = 50 biomass_max = 750 @@ -93,6 +94,16 @@ return . +/mob/living/basic/bloodling/update_health_hud() + . = ..() + + if(hud_used?.action_intent) + hud_used.action_intent.maptext = MAPTEXT("Your biomass: [biomass] / [biomass_max] \n") + hud_used.action_intent.maptext_height = 400 + hud_used.action_intent.maptext_width = 400 + hud_used.action_intent.maptext_y = 64 + hud_used.action_intent.maptext_x = -64 + // Bloodlings health and damage needs updating when biomass is added /mob/living/basic/bloodling/proper/add_biomass(amount) . = ..() diff --git a/tgstation.dme b/tgstation.dme index 77243d169fbe..330c8db7df85 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5861,6 +5861,7 @@ #include "monkestation\code\modules\antagonists\abductor\machinery\dispenser.dm" #include "monkestation\code\modules\antagonists\battlecruiser\battlecruiser.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling.dm" +#include "monkestation\code\modules\antagonists\bloodling\bloodling_hud.dm" #include "monkestation\code\modules\antagonists\bloodling\bloodling_structures.dm" #include "monkestation\code\modules\antagonists\bloodling\infested_thrall.dm" #include "monkestation\code\modules\antagonists\bloodling\objectives.dm" From 0ac7bd87df5b4f5cb2d2e90a3c3d0d0646cd1bdc Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:05:26 +0200 Subject: [PATCH 076/113] Update bloodling_hud.dm --- monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm index 193c1876e550..396129bdf7bb 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_hud.dm @@ -1,5 +1,4 @@ -///Hud type with targetting dol and a nutrition bar /datum/hud/bloodling/New(mob/living/owner) . = ..() var/atom/movable/screen/using From 7596f80f3ada4660c87e6e41d20be2a20f032509 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 17 Jun 2024 17:09:10 +0200 Subject: [PATCH 077/113] Update bloodling_mob.dm --- .../antagonists/bloodling/mobs/bloodling_mob.dm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index e73fc4aaf6ec..65f21e4ae9d6 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -94,11 +94,24 @@ return . -/mob/living/basic/bloodling/update_health_hud() +/mob/living/basic/bloodling/proper/update_health_hud() . = ..() + var/biomass_next_evo + + switch(evolution_level) + if(1) + biomass_next_evo = 75 + if(2) + biomass_next_evo = 125 + if(3) + biomass_next_evo = 175 + if(4) + biomass_next_evo = 225 + if(5) + biomass_next_evo = biomass_max if(hud_used?.action_intent) - hud_used.action_intent.maptext = MAPTEXT("Your biomass: [biomass] / [biomass_max] \n") + hud_used.action_intent.maptext = MAPTEXT("Your biomass: [biomass] / [biomass_next_evo] \n") hud_used.action_intent.maptext_height = 400 hud_used.action_intent.maptext_width = 400 hud_used.action_intent.maptext_y = 64 From 1bfc289f6ff35dcfe650e3601546f71a724b76c0 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Tue, 18 Jun 2024 15:04:42 +0200 Subject: [PATCH 078/113] Update bloodling_mob.dm --- .../antagonists/bloodling/mobs/bloodling_mob.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 65f21e4ae9d6..b4e0cf2fea34 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -133,19 +133,19 @@ /// Checks if we should evolve, and also calls the evolution proc /mob/living/basic/bloodling/proper/proc/check_evolution() - if((75 > biomass) && evolution_level != 1) + if((75 > biomass) && (evolution_level != 1)) evolution(1) return TRUE - if((125 > biomass >= 75) && evolution_level != 2) + if((125 > biomass >= 75) && (evolution_level != 2)) evolution(2) return TRUE - if((175 > biomass) >= 125 && evolution_level != 3) + if((175 > biomass) >= 125 && (evolution_level != 3)) evolution(3) return TRUE - if((225 > biomass >= 175) && evolution_level != 4) + if((225 > biomass >= 175) && (evolution_level != 4)) evolution(4) return TRUE - if((biomass >= 225) && evolution_level != 5) + if((biomass >= 225) && (evolution_level != 5)) evolution(5) return TRUE return FALSE @@ -180,7 +180,7 @@ evolution_mind_change(new_bloodling) -/mob/living/basic/bloodling/proper/proc/evolution_mind_change(var/mob/living/basic/bloodling/proper/new_bloodling) +/mob/living/basic/bloodling/proper/proc/evolution_mind_change(mob/living/basic/bloodling/proper/new_bloodling) new_bloodling.setDir(dir) if(numba) new_bloodling.numba = numba From eea8372ebf659b595cdca62e553e3f5ae2a48128 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 20 Jun 2024 00:16:24 +0200 Subject: [PATCH 079/113] d --- .../bloodling/sprites/bloodling_abilities.dmi | Bin 0 -> 566 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1aaf93a72247d323166ad8144c3b4213dc3cd34a GIT binary patch literal 566 zcmV-60?GY}P)raH8sls0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DKV)yzbHwGi!&v&s2C_<$igNJ>0077pCU#fTN^AfC0Xs=VK~y-6y^=9b!!Q(vp9v;GSzLoq zr7XOjpxmI`Ad8iuOE^SiwPooIA~rg41%}9qasZYdikCWe32B=N-Vix@U;h7p&jI+? zVq<_5BLWzV2;9NqB7iXWDU>=Pfcdpep%m9T9VU=dhV6;Enbt)0Rit=9E07h`*DYmL zZaaZRBo6|RrCi%84)5WveO`$Gq}9p_2Uv+vx5R7;Pga03WPPAneE>`__lu%qyNA$}2swK^5=*@?$2CA4 zzu`Rk`7iLMS~gANGqO*4&w43T%9T>a0a83;@(zPqb^yaXkZ5)TfLGl?M05*ryUt(b zt~-KlUD7&-Ca!XstRY^X2WW(vJkA3kVqF@2!Q*f18wl!N1yQ Date: Thu, 20 Jun 2024 00:20:39 +0200 Subject: [PATCH 080/113] icons! --- .../modules/antagonists/bloodling/abilities/absorb_biomass.dm | 2 +- .../antagonists/bloodling/abilities/bloodling_abilities.dm | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 071a9d9b9ebe..552db11962b1 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/absorb name = "Absorb Biomass" desc = "Allows you to absorb a dead carbon or living mob close to you." - button_icon_state = "alien_hide" + button_icon_state = "absorb" /datum/action/cooldown/mob_cooldown/bloodling/absorb/PreActivate(atom/target) if(owner == target) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm index 998eae01c275..31358ac34fd0 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm @@ -1,6 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling name = "debug" desc = "Yell at coders if you see this" + button_icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' /// The biomass cost of the ability var/biomass_cost = 0 @@ -44,6 +45,7 @@ /datum/action/cooldown/bloodling name = "debug" desc = "Yell at coders if you see this" + button_icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' // The biomass cost of the ability var/biomass_cost = 0 From e0a775fc0989328b2518ecac1cafcc14dd7fbbe4 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 24 Jun 2024 23:13:55 +0200 Subject: [PATCH 081/113] ill fix it later --- .../modules/antagonists/bloodling/mobs/bloodling_mob.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index b4e0cf2fea34..a996bdf05fca 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -136,13 +136,13 @@ if((75 > biomass) && (evolution_level != 1)) evolution(1) return TRUE - if((125 > biomass >= 75) && (evolution_level != 2)) + if((125 > biomass) && (biomass >= 75) && (evolution_level != 2)) evolution(2) return TRUE - if((175 > biomass) >= 125 && (evolution_level != 3)) + if((175 > biomass) && (biomass >= 125) && (evolution_level != 3)) evolution(3) return TRUE - if((225 > biomass >= 175) && (evolution_level != 4)) + if((225 > biomass) && (biomass >= 175) && (evolution_level != 4)) evolution(4) return TRUE if((biomass >= 225) && (evolution_level != 5)) From 2092c2ca6d61628b4410c6f9eb4f1d1d94e2a263 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:41:08 +0200 Subject: [PATCH 082/113] Update bloodling_abilities.dmi --- .../bloodling/sprites/bloodling_abilities.dmi | Bin 566 -> 1399 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi index 1aaf93a72247d323166ad8144c3b4213dc3cd34a..bdf0819fc0e7fa711cb1f7336ac9ba0063f5c542 100644 GIT binary patch delta 1277 zcmVQq!R*r6)Vd(B7Oq{x-=r(K`Zu8H^9Ka*S3><0_1l90004WQchCgNLX3IO+^ID&&4t|0&b1W`#uK~#90 z?OJPhqaYMa(lw7>P~5Zs|F`aafC38F9JT2O=A>zpQD(RxaY!$hhF^;7r}b~2bwK)G zpVdeCKc6!|_5WI#2OZ)EZ+0XXJ2-eO98em32_$0sJExg1(;{%6iD!8c(qJc)aAg&*xu% z;$Y3dQ0yTo7|{6e0v*V>XY()CPhh=)LifA^_Fv)YH(v$zRr&l`>Q4r$02sFLJOQqj zmcPvgHtCbZ7XCpqfck&WufN%WB~g3IDnOGE>(3v6&*FVRXRYn%iE#W!0@k0Gz{-6H zFaMpu9&Lbh>BH}8UoZV=9*{!~@Zv*%%iry4<7K(#;NS}2===G%)xp7Y;7RjO>d$N9 z&x6;0`}k%DTS{;^c>dcDmVo8~UR^JG`jCT$hK7cQhJ65-0}!laA%N(Ja$wz|-}lb> z7Y^f4rU4Yg@DP4MiR?WOuuM2f1H)kYC2z^Sxdmo zfSlhi+d#(nnWE+Qa)o3l*Y&*v+8-Fm=&}tkekN%7y)s>cgJJ=V??H*D>X+5|pnATC zioU<}RK9LN%lDN5^7NqbngIoW%6bBdfW~ieP^Sk)K;!pA6FA*KLqkJDLqo%_gMJfu zwtj!E1LZcCBHF1AI0KdiI3pGu%=z7|-s?`htMM4oom8#{y{_MASm7ml zXS|7drfkd`sgUsG47fypdE;Rmpqjshw-uhqjE`0c;V;GW{k64^w<=!`*ig^++Wr9Y zR^uzI9PwFx<9|S$$Tu`JG&D3cEOB1p8lPd^FRK6_xpbh7@)y_#`)f+frA7-@AV75;{G7) n&-c3>?Bp978X6iHen0*L>-knt%3t>700000NkvXXu0mjf9%+Aq delta 437 zcmV;m0ZRV&3bq6#iBL{Q4GJ0x0000DNk~Le0000$0000W1Oos708q1Iw*UYDCy^y3 z8+#Qieh>raH8sls0004WQchCI+#rjUp-VVKWVL1K4I(x=aRr9R zigEy!9*UPbb_r>l3EmJndSCwkf6oE<*J5LU6e9u{j0oJp;v#@B_bHS*A%OX{O`#Om zIvpl|kW+^3iMpBAMDdMQ-Ol~Tq5 zQaoew4ue{D0K+_xXm$gDSKUEGbPI92&R^xOJA!Rp(mIDGu5y{IAzq&cXoQ+P&I2G~ fT^fDC<8SL52 Date: Thu, 18 Jul 2024 11:42:11 +0200 Subject: [PATCH 083/113] adds the build sprite from Brunoute25 --- .../code/modules/antagonists/bloodling/abilities/build.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm index 7c522109a507..13af0b5b7f1c 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/build.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/build.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/bloodling/build name = "Mold Flesh" desc = "Use your biomass to forge creatures or structures." - button_icon_state = "alien_resin" + button_icon_state = "build" biomass_cost = 30 /// A list of all structures we can make. var/static/list/structures = list( From d69769d2d72afc2c7a2bc785cc2b1198e735b584 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 26 Jul 2024 21:31:49 +0200 Subject: [PATCH 084/113] test --- .../bloodling/mobs/bloodling_mob.dm | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index b4e0cf2fea34..433fd5fa7ecf 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -77,15 +77,11 @@ /mob/living/basic/bloodling/proper/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) // All evolutions over 2 (3,4,5) are spess proof if(evolution_level > 2) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) /mob/living/basic/bloodling/proper/adjust_health(amount, updating_health = TRUE, forced = FALSE) - if(!forced) - return 0 - . = amount add_biomass(amount) @@ -193,22 +189,6 @@ new_bloodling.add_biomass(biomass) qdel(src) -/// Checks for damage to update the bloodlings biomass accordingly -/mob/living/basic/bloodling/proper/proc/on_damaged(datum/source, damage, damagetype) - SIGNAL_HANDLER - - var/damage_amount = damage - // Stamina damage is fucky, so we'll ignore it - if(damagetype == STAMINA) - return - - if(damagetype == BURN) - // Bloodlings take additional burning damage - damage_amount *= 1.5 - - // Bloodlings take damage through their biomass, not regular damage - add_biomass(-damage_amount) - /mob/living/basic/bloodling/proper/Destroy() UnregisterSignal(src, COMSIG_MOB_APPLY_DAMAGE) From ab53ec5d58baac1220311a976573aa0cd89ec179 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Sun, 28 Jul 2024 01:22:54 +0200 Subject: [PATCH 085/113] possibly??? --- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 433fd5fa7ecf..aa9a14a1334f 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -84,9 +84,7 @@ /mob/living/basic/bloodling/proper/adjust_health(amount, updating_health = TRUE, forced = FALSE) . = amount - add_biomass(amount) - if(updating_health) - update_health_hud() + add_biomass(-amount) return . From e1cfca182b3d41e1ef01826ea8a1398af1d89c81 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 1 Aug 2024 00:24:39 +0200 Subject: [PATCH 086/113] ts file --- .../antagonists/antagonists/bloodling.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodling.ts diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodling.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodling.ts new file mode 100644 index 000000000000..82bbe1ca3a4e --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodling.ts @@ -0,0 +1,17 @@ +import { Antagonist, Category } from '../base'; +import { multiline } from 'common/string'; + +const Bloodling: Antagonist = { + key: 'bloodling', + name: 'Bloodling', + description: [ + multiline` + You are a horrific abomination of flesh. + Scrape the station free of biomass and evolve to your ultimate form. + Having infested Space Station 13, you will twist it to your whims. + `, + ], + category: Category.Roundstart, +}; + +export default Bloodling; From 77f52d5dcead68430e5902e38480f5550e25deea Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:42:51 +0200 Subject: [PATCH 087/113] fixes --- .../antagonists/bloodling/abilities/absorb_biomass.dm | 10 ++++++++++ .../antagonists/bloodling/mobs/bloodling_mob.dm | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index 552db11962b1..f63527500df4 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -2,11 +2,17 @@ name = "Absorb Biomass" desc = "Allows you to absorb a dead carbon or living mob close to you." button_icon_state = "absorb" + /// If the bloodling is currently absorbing + var/is_absorbing = FALSE /datum/action/cooldown/mob_cooldown/bloodling/absorb/PreActivate(atom/target) if(owner == target) return FALSE + if(is_absorbing) + our_mob.balloon_alert(our_mob, "Already absorbing!") + return FALSE + if(istype(target, /obj/item/food/deadmouse)) return ..() @@ -63,10 +69,14 @@ biomass_gain = 100 absorb_time = 10 SECONDS + // Setting this to true means they cant target the same person multiple times, or other people since it allows for speedrunning + is_absorbing = TRUE + if(!do_after(owner, absorb_time, mob_to_absorb)) mob_to_absorb.RemoveComponentSource(REF(src), /datum/component/leash) return FALSE + is_absorbing = FALSE our_mob.add_biomass(biomass_gain) mob_to_absorb.gib() our_mob.visible_message( diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index aa6fbbba4e51..9853f53b1cc9 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -69,7 +69,6 @@ sight = SEE_SELF|SEE_MOBS hud_type = /datum/hud/bloodling - biomass = 50 biomass_max = 750 /// The evolution level our bloodling is on var/evolution_level = 0 @@ -184,7 +183,8 @@ if(mind) mind.name = new_bloodling.real_name mind.transfer_to(new_bloodling) - new_bloodling.add_biomass(biomass) + // Runs = instead of add_biomass because the tier 1 bloodling has 50 biomass to start with + new_bloodling.biomass = biomass qdel(src) /mob/living/basic/bloodling/proper/Destroy() @@ -204,6 +204,7 @@ /mob/living/basic/bloodling/proper/tier1/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + add_biomass(50) /mob/living/basic/bloodling/proper/tier2 icon_state = "guard" From 78b218b5bd93fb1c2a067e319816bdc359f0b918 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:43:57 +0200 Subject: [PATCH 088/113] transfer icon --- .../bloodling/sprites/bloodling_abilities.dmi | Bin 1399 -> 1612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi index bdf0819fc0e7fa711cb1f7336ac9ba0063f5c542..4ed3fac8276c8c518109d121489c3860a517322f 100644 GIT binary patch delta 1408 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 IM6N<$f~uNj-~a#s From 8890cfb9aad758bd1f88f42cb8c88054ca9dbe19 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:44:58 +0200 Subject: [PATCH 089/113] implementation --- .../modules/antagonists/bloodling/abilities/transfer_biomass.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm index 32190d5e1efd..7b4e7f88c5ad 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/transfer_biomass.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass name = "Transfer Biomass" desc = "Transfer biomass to another organism." - button_icon_state = "dissonant_shriek" + button_icon_state = "transfer" /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass/PreActivate(atom/target) var/mob/living/mob = target From a1eaa26e7e9244790b8459f16593e6e4d505443b Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:19:34 +0200 Subject: [PATCH 090/113] Update backgrounds.dmi --- monkestation/icons/mob/actions/backgrounds.dmi | Bin 247 -> 452 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/icons/mob/actions/backgrounds.dmi b/monkestation/icons/mob/actions/backgrounds.dmi index b990ae03b8777e19914e7aefedc8eeeb28cefe40..e31885ab075334e0e87fc1d73b09ec676cc89d0f 100644 GIT binary patch delta 362 zcmey)c!W8lGr-TCmrII^fq{Y7)59eQNIL+r0t+*c4A`8!9Y|>f_=LC~IB-CnjU!b` zs#H}KC>ARvRW2gtD=r=@EuAVWJ4;F1Ra7)kTs%}tDq;HJ{Xi9rB|(0{3=Yq3qyafq z6KzxKl~?brZC0E z)Bxc!X2v|>1#Aty2NDmxyKA7lVU~d~U%|`(UcutHDX-;DJ=as&F|q%phgByS3j3^P6 Date: Fri, 2 Aug 2024 16:37:23 +0200 Subject: [PATCH 091/113] Fixes and icons! --- .../antagonists/bloodling/abilities/absorb_biomass.dm | 2 +- .../antagonists/bloodling/abilities/bloodling_abilities.dm | 4 ++++ .../antagonists/bloodling/abilities/bloodling_hivespeak.dm | 4 +++- .../code/modules/antagonists/bloodling/abilities/hide.dm | 4 ++-- .../code/modules/antagonists/bloodling/abilities/whiplash.dm | 5 ++--- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index f63527500df4..eae33e600874 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -10,7 +10,7 @@ return FALSE if(is_absorbing) - our_mob.balloon_alert(our_mob, "Already absorbing!") + owner.balloon_alert(owner, "Already absorbing!") return FALSE if(istype(target, /obj/item/food/deadmouse)) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm index 31358ac34fd0..fb8697ff7b01 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_abilities.dm @@ -2,6 +2,8 @@ name = "debug" desc = "Yell at coders if you see this" button_icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' + background_icon = 'monkestation/icons/mob/actions/backgrounds.dmi' + background_icon_state = "bg_bloodling" /// The biomass cost of the ability var/biomass_cost = 0 @@ -46,6 +48,8 @@ name = "debug" desc = "Yell at coders if you see this" button_icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' + background_icon = 'monkestation/icons/mob/actions/backgrounds.dmi' + background_icon_state = "bg_bloodling" // The biomass cost of the ability var/biomass_cost = 0 diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm index c5c25101fd4d..9fd138a74da6 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/bloodling_hivespeak.dm @@ -1,7 +1,9 @@ /datum/action/cooldown/bloodling_hivespeak name = "Hivespeak" desc = "Whispered words that all in your hive can hear." - button_icon_state = "cult_comms" + button_icon_state = "hivemind" + background_icon = 'monkestation/icons/mob/actions/backgrounds.dmi' + background_icon_state = "bg_bloodling" /datum/action/cooldown/bloodling_hivespeak/IsAvailable(feedback = FALSE) if(IS_BLOODLING_OR_THRALL(owner)) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm index 7e91609c80f7..a4b5ed4f8d5f 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/hide.dm @@ -3,5 +3,5 @@ panel = "alien" desc = "Blend into the shadows to stalk your prey." button_icon_state = "alien_sneak" - background_icon_state = "bg_alien" - overlay_icon_state = "bg_alien_border" + background_icon = 'monkestation/icons/mob/actions/backgrounds.dmi' + background_icon_state = "bg_bloodling" diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm index 3ddd7e3ed2e1..3ab7587a6c47 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm @@ -1,11 +1,10 @@ /datum/action/cooldown/spell/aoe/repulse/bloodling name = "Whiplash" desc = "Grow whiplike appendages and throw back nearby attackers." - background_icon_state = "bg_alien" - overlay_icon_state = "bg_alien_border" + background_icon = 'monkestation/icons/mob/actions/backgrounds.dmi' + background_icon_state = "bg_bloodling" button_icon = 'icons/mob/actions/actions_xeno.dmi' button_icon_state = "tailsweep" - panel = "Alien" sound = 'sound/magic/tail_swing.ogg' spell_requirements = NONE From 3bd23730e81985c2c1b91e41516cc67dc31ec490 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 5 Aug 2024 14:40:39 +0200 Subject: [PATCH 092/113] another bieyes banger --- .../bloodling/sprites/bloodling_abilities.dmi | Bin 1612 -> 1925 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi index 4ed3fac8276c8c518109d121489c3860a517322f..a088345a1a5fac34ebf646b584a5fcbb187e6f41 100644 GIT binary patch delta 1752 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 r Date: Mon, 5 Aug 2024 14:41:24 +0200 Subject: [PATCH 093/113] Update devour.dm --- .../code/modules/antagonists/bloodling/abilities/devour.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index ae0db3283bf5..87168ff891c8 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/devour name = "Devour Limb" desc = "Allows you to consume a creatures limb." - button_icon_state = "alien_hide" + button_icon_state = "devour" cooldown_time = 20 SECONDS /datum/action/cooldown/mob_cooldown/bloodling/devour/PreActivate(atom/target) From bb0ed9fa0abe86068944ea19ec97fd4318d2442b Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 5 Aug 2024 20:13:37 +0200 Subject: [PATCH 094/113] Give Life from Bieyes! --- .../bloodling/abilities/give_life.dm | 2 +- .../bloodling/sprites/bloodling_abilities.dmi | Bin 1925 -> 6023 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index 26342573eda6..48c8d7002664 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/give_life name = "Give Life" desc = "Bestow the gift of life onto the ignorant." - button_icon_state = "alien_hide" + button_icon_state = "give_life" /datum/action/cooldown/mob_cooldown/bloodling/give_life/PreActivate(atom/target) if(!ismob(target)) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi index a088345a1a5fac34ebf646b584a5fcbb187e6f41..34fbe8c07dc013ee1bea10479bb7464f4360e4f2 100644 GIT binary patch literal 6023 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 VgQ*F=jXzlj)RncBDith4{|AM?dQAWT delta 1923 zcmV-}2YmR4FNF_~7k_{V0{{R3ySqEq!R*r6)Vd(B7Oq{x-=r(K`Zu8H`lh4$2cU+j$b|n8Pc_L z{}lkHFff`gFODlKzPY)wu&~O-#lV)9%AcRgf`ZCyY|n>>2Y=MYD*ylh0d!JMQvg8b z*k%9#0HAtQSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1rRHYlrGF4qm{gjXgG&|A4JoNPiIpI>4pxXTr=%z`uQ)BWh@gcjsb%@4IFy-U zv5-qy!PUf7B{JBp;JWfZ0uwP5)EvmIjDuw|`$ZA@Myd4KX0(L%e^M#t4hX z_ra5g2h);v*YDStBRf{`SyM+Ir}9Tc9@;m(mf z+I%=Uo@ki6jR(Rp3GY1C>G9w8dow@w<_;7=2T&6Ngql^(Sf2sY7I9D6mpt^>=|hu& zE}#&hE`QLOz-K@y8$wFGN6&Rc;Q{EEF~p}+*N`pXzQ_6`iLdmi*1i7xun2vCSug_B zgMhJq^8*Q0-u32($!AGwz`*J29xy&5efrC@SRM!N4_v+$a8Ll*6h0^5PSWM$X26^H zsEaB5lroUw_t;-wIzmZMa*=yc|6AV<^jJeATQ2z`PlEIdD#o=aO)hINI0%fdVbtWc;_5^qWPi5m#-=7 z6JLL2O2Jc~s}s*(x#AE~9^&e8q>q&nZrZeI)22x!;fT zoqtYrC@VjSJ|j?>0(apbRI%{;Tqnpy@ObP4b#jge_X*$HAWup*V1`xRh6MrU9Zrt|}iXx}FkqiT>`W%JRNu4wB6obFeks}r1QCDt348UqHW^w(Y5GF7pXjt#)i=`@jt@OQ zZ$r@5RTWq(8_-T?Qz{5O-+xGFP`hni*qkK=^%l6l*^nq+ic`5mglpjk2Sz@-& zB)L?Vqi@KTe9;&Db@?of z&SMdtHAN_1%+~2j;eWg|e6a}6og(#hcylbm^QXv{7qG>SMR@TPiADG>DKe-?geORm z?^ueAQ#?h!od{p86sesPsErhvTlKZB-Ho-8B2`7mormA6?gXaLx3k5J*jH6qTWWk) zm60MB+M!m)m0vjIfz0_E0G(msEnWcQ1Sm@>V%IwPs*^w0ihMHkCwwsgZ-flr3t;%~ zWr-)jvxFuJ?pc=h6p2JA1`vr*9Do-ZUS|01E;6+PXl;oB#3B?2phnt-+MT}h4^af5 zISF;CbK&P7q6k1tvk%c&%|1lq31=RnNi^pWO`^pkv}w~S^&f?^w{fF0OsoI^002ov JPDHLkV1knzrQ!ep From 4ebfb83ddd1be6fe9956ec7400ca0b160a88567b Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 5 Aug 2024 20:57:56 +0200 Subject: [PATCH 095/113] bieyes adds more shit, this man cant be stopped!!! --- icons/mob/huds/antag_hud.dmi | Bin 7725 -> 9598 bytes .../antagonists/bloodling/bloodling.dm | 2 +- .../antagonists/bloodling/infested_thrall.dm | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/icons/mob/huds/antag_hud.dmi b/icons/mob/huds/antag_hud.dmi index 0d5d95f3bb9dcfa5fc5cf39c2f6805d6760e6552..d764ffa161160075f3e01436d51408b26fee095d 100644 GIT binary patch literal 9598 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

i_jq{{Qe2|G6)i_HmkHpXk!->D=fJI8vBfJ~{le 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 literal 7725 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 h@W0Xj-}4=#G6#g;?;_0r^BWkTrlh4 Date: Wed, 7 Aug 2024 20:20:26 +0200 Subject: [PATCH 096/113] Ascend and mend sprites from LeafBladeX --- .../bloodling/sprites/bloodling_abilities.dmi | Bin 6023 -> 9828 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi index 34fbe8c07dc013ee1bea10479bb7464f4360e4f2..eb51ea5985946b33be43105663df1b15cde29c08 100644 GIT binary patch literal 9828 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 literal 6023 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 VgQ*F=jXzlj)RncBDith4{|AM?dQAWT From 7f312c44fd3a1872fdf79f242f7003dc82d5bfd5 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 7 Aug 2024 20:21:37 +0200 Subject: [PATCH 097/113] ascend and mend --- .../code/modules/antagonists/bloodling/abilities/ascension.dm | 2 +- .../code/modules/antagonists/bloodling/abilities/heal.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 96cd9df368d7..fe32b464a29c 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/bloodling/ascension name = "Ascend" desc = "We reach our last form...Mass consumption is required. Costs 500 Biomass and takes 5 minutes for you to ascend." - button_icon_state = "dissonant_shriek" + button_icon_state = "ascend" biomass_cost = 500 var/static/datum/dimension_theme/chosen_theme diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm index a18b3d6b3990..407bd3b34fba 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/heal.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/heal name = "Heal" desc = "Allows you to heal or revive a humanoid thrall. Costs 50 biomass." - button_icon_state = "alien_hide" + button_icon_state = "mend" biomass_cost = 50 /datum/action/cooldown/mob_cooldown/bloodling/heal/PreActivate(atom/target) From 84aad6a0affdfafe03e123e6b341a6792f1cbce1 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 7 Aug 2024 20:27:22 +0200 Subject: [PATCH 098/113] Update absorb_biomass.dm --- .../antagonists/bloodling/abilities/absorb_biomass.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index eae33e600874..ea0baa483445 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -21,6 +21,11 @@ return FALSE var/mob/living/mob_to_absorb = target + + if(!HAS_TRAIT(mob_to_absorb, MOB_ORGANIC)) + owner.balloon_alert(owner, "doesn't work on non-organics!") + return FALSE + if(!iscarbon(mob_to_absorb)) return ..() @@ -53,6 +58,7 @@ return TRUE var/mob/living/mob_to_absorb = target + if(!iscarbon(mob_to_absorb)) biomass_gain = max(mob_to_absorb.getMaxHealth() * 0.5, biomass_gain) if(biomass_gain > 150) @@ -63,7 +69,7 @@ biomass_gain = 10 else var/mob/living/carbon/carbon_to_absorb = target - if(issimian(carbon_to_absorb)) + if(ismonkey(carbon_to_absorb)) biomass_gain = 50 else biomass_gain = 100 From d8e06b227c439c10081839f9c0671e4f672904c7 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 8 Aug 2024 15:28:40 +0200 Subject: [PATCH 099/113] t --- .../bloodling/abilities/whiplash.dm | 7 ++++++- .../bloodling/sprites/bloodling_sprites.dmi | Bin 611 -> 1535 bytes 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm index 3ab7587a6c47..d08084255b13 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm @@ -14,11 +14,16 @@ antimagic_flags = NONE aoe_radius = 2 - sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep + sparkle_path = /obj/effect/temp_visual/bloodling_tentacle /// Since this isn't a bloodling subtype ability we need to recode the cost here var/biomass_cost = 25 +/obj/effect/temp_visual/bloodling_tentacle + icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi' + icon_state = "tentacle_effect" + duration = 4 + /datum/action/cooldown/spell/aoe/repulse/bloodling/IsAvailable(feedback = FALSE) . = ..() if(!.) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi index f2ed815f89a7f8cd430fdb55669083cdbb25a9e5..78f63a2a3572e396b7665d8059c4baad3aa885d2 100644 GIT binary patch delta 1473 zcmV;y1wQ)Y1pfqD6)W~nH>olq^hPa32LQ)AC!8QCeggxf69RJp09*k9tTHmdz`!SheK7z4 z00DGTPE!Ct=GbNc00549R9JLGWpiV4X>fFDZ*Bkpc$`y_T~U9-m6oLDl_VzTq{gSF zrKKj9;7|{=C?z!~u@c1A!3w#Q6Z(H?pJZUD*S%jb|zCW^wz@vMH;BWmnq zz|SeAKMH$FUHxc`vP_&ecQRlluc;MK5(|~$&6-CB`^-LoD3IKO$EsBmkYHRhT(+|!0 zab_(5!16h*?fGQ?%#`9F(6hIPSsvVReYr|&o^QOsGP!%>#X9t|EXW54f{g*^^_ZFq zGYxtf0PA1!0B(8>qU%w-pzh+@^RkGvUU7ZNvM_)7^7Z9c*S8+g4_XD?tTYOMgS6J` z#zbZsQrBKjyPZF`unh?Sa2}9H^EsIyUd&ZHpkT8GQR6-%4?@~-NH=}0rnaMf1ZeRc z0)V+N(&~Z+p=I*<;i%r<1;Ax4^vs(<(7d&bZr=3$c#s9~$W+H=7HBnW58IQ_{u>X* z!~TC}ZJ%#I0EYw2Cd&4r&}=Rz6VEPHka-Be7L093QJs{rmniH}7Qlf63#*i(qRvQ7 zLuJ(Tf})QNrLyABvlb`-{+CZ9HROe$-j)rC0I2XpS3c*rk%>znngDRI7FM7mv2X?7 z(1Hz#@VNDm3xID-S{MXazzqoKwx0PyWgCA0=q@5wumiz{3g&GI3j}}()V~10AYh&m zzy%BK0;CO_CTwt9$Q%fQ1b75pv?T77=uk^Ylb{~FLfjWj!qX8FS-JZu_XR>nNO9i< zn*?)&58?&LMPve>HDwe9QzQVhNmw9*kk5pQ>=0Wj8f^x$59}46i9BErs3iG5d_aI?dr1qobLIC!PfMwa(~Q0Ud4;#(D~6nM zocC!+=?-$gDhoQjP?NW}hU`6CcoOxFq(aK&}>2~Bzu7NP~+Bv;z<`n-$fL5L zl=Z+Vn}cdu7Cn~@!9z&^_mer(u&f8pL)k`O8lY?p%kxnDLQ+t0z$+|C`C2Xsa4&wW bDj>3*!VyiBL{Q4GJ0x0000DNk~Le0000W0000W1Oos70D)9z#{d8T7*I@9 zMaMfQeh>qD6)W~nH>olq^hPa32LPNPD7QW+tN;K2Zjozce=94v`niD31_0h794e{< zKt=!n0gOpRK~yM_6;Q#h+At8@MZkH-1m{}&h2&h7_DrG#t}jvOyT&Q_U7IJ0f4_@Y zn$=3{*_k26+X+9VWM_`N1C!u-ftON>{kVWE1#Ufneo_#!clymkS{*l!Ktvp;4|)o+ zZcL95^<6KCe-PNUjl*_#^qKx9_e;#7`V#y(c78~X8XtK7UURf%#@F?kQX7RKHdm7U zkM}iojf+BjFD8>OyM9HZ8M**lY^HtD8@Hl>(`XUK^OS9BU{6gSYHK%tnXM|NoE#$f zmKF&Rj)5tII#OZ0)wwN|UmeZW7g%RIq(ItdkD6?Zf6O5}Q;cVWLhNVR1iqa?I|nVE zk-V2_eIVo5cvW6KOp;(g-oF-ZSwg<>>}z_|dtlqA1=X@OCa3Y+$Ljm`X@GxXeHEy# z62NmnrFf}Ig7Og9r-f|c;nnR+ljKh9tOvhZ&(`Npb&x+Ams%3r z6 Date: Wed, 28 Aug 2024 22:17:54 +0200 Subject: [PATCH 100/113] safe --- .../bloodling/sprites/bloodling_abilities.dmi | Bin 9828 -> 12105 bytes tgstation.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi index eb51ea5985946b33be43105663df1b15cde29c08..edb0d0d85725d4e3ab5a19e9468c331e45a699e5 100644 GIT binary patch literal 12105 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 diff --git a/tgstation.dme b/tgstation.dme index 170bbf67ab39..e3e1d3299aba 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5767,9 +5767,9 @@ #include "interface\fonts\spess_font.dm" #include "interface\fonts\tiny_unicode.dm" #include "interface\fonts\vcr_osd_mono.dm" +#include "monkestation\code\__DEFINES\_module_defines.dm" #include "monkestation\code\__DEFINES\antag_defines.dm" #include "monkestation\code\__DEFINES\mobfactions.dm" -#include "monkestation\code\__DEFINES\_module_defines.dm" #include "monkestation\code\__DEFINES\projectile.dm" #include "monkestation\code\__DEFINES\signals.dm" #include "monkestation\code\__HELPERS\_lists.dm" From 4b7309ecff93131fb144e7a883a3527e1f4c151c Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 28 Aug 2024 22:19:53 +0200 Subject: [PATCH 101/113] Adds infest and whiplash icons from bieyes --- .../code/modules/antagonists/bloodling/abilities/infect.dm | 2 +- .../code/modules/antagonists/bloodling/abilities/infest.dm | 2 +- .../code/modules/antagonists/bloodling/abilities/whiplash.dm | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm index a3446cfde499..4d223ca8361e 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/bloodling_infect name = "Infect" desc = "Allows us to make someone our thrall, this consumes our host body and reveals our true form." - button_icon_state = "absorb_dna" + button_icon_state = "infest" ///if we're currently infecting var/is_infecting = FALSE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm index f50bcb335ff0..d559b8eb6731 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infest.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/infest name = "Infest" desc = "Allows you to infest a living creature, turning them into a thrall. Can be used on mindshielded people but it takes longer. Costs 75 biomass." - button_icon_state = "alien_hide" + button_icon_state = "infest" biomass_cost = 75 /datum/action/cooldown/mob_cooldown/bloodling/infest/PreActivate(atom/target) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm index d08084255b13..0663aa50d0ce 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/whiplash.dm @@ -3,8 +3,8 @@ desc = "Grow whiplike appendages and throw back nearby attackers." background_icon = 'monkestation/icons/mob/actions/backgrounds.dmi' background_icon_state = "bg_bloodling" - button_icon = 'icons/mob/actions/actions_xeno.dmi' - button_icon_state = "tailsweep" + button_icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' + button_icon_state = "whiplash" sound = 'sound/magic/tail_swing.ogg' spell_requirements = NONE From 459aef03e7d39404ddfc2392425259979f501c40 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:15:40 +0200 Subject: [PATCH 102/113] Makes bloodling work, compile + finished ascension --- .../bloodling/abilities/ascension.dm | 12 +++------ .../bloodling/abilities/give_life.dm | 2 +- .../antagonists/bloodling/abilities/infect.dm | 2 +- .../bloodling/mobs/bloodling_mob.dm | 27 +++++++++++++++++++ .../converted_events/solo/bloodsuckers.dm | 2 +- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index fe32b464a29c..ee2d552a5d26 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -7,23 +7,19 @@ /datum/action/cooldown/bloodling/ascension/Activate(atom/target) var/mob/living/basic/bloodling/our_mob = owner - our_mob.move_resist = INFINITY - ADD_TRAIT(our_mob, TRAIT_IMMOBILIZED, REF(src)) + // Adds 500 biomass back + our_mob.add_biomass(500) + our_mob.evolution(6) // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) - /* PLANS - * Make this spawn a cool meator heart/other chrysalis whilst the bloodling is gestating - */ return TRUE /datum/action/cooldown/bloodling/ascension/proc/ascend(mob/living/basic/bloodling) - // Woah they can move - REMOVE_TRAIT(bloodling, TRAIT_IMMOBILIZED, REF(src)) + // Calls the shuttle SSshuttle.requestEvac(src, "ALERT: LEVEL 4 BIOHAZARD DETECTED. ORGANISM CONTAINMENT HAS FAILED. EVACUATE REMAINING PERSONEL.") if(isnull(chosen_theme)) chosen_theme = new /datum/dimension_theme/bloodling() - // Placeholder code, just for testing var/turf/start_turf = get_turf(bloodling) var/greatest_dist = 0 var/list/turfs_to_transform = list() diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index 48c8d7002664..6291384a2be5 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -21,7 +21,7 @@ /datum/action/cooldown/mob_cooldown/bloodling/give_life/Activate(atom/target) var/mob/living/target_mob = target - var/list/candidates = SSpolling.poll_ghost_candidates_for_mob( + var/list/candidates = SSpolling.poll_ghost_candidates( "Would you like to be a [target_mob] servant of [owner]?", ROLE_BLOODLING_THRALL, ROLE_BLOODLING_THRALL, diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm index 4d223ca8361e..3cb268a27861 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm @@ -42,7 +42,7 @@ carbon_mob.revive(ADMIN_HEAL_ALL) if(!carbon_mob.mind) - var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates( "Would you like to be a [carbon_mob] servant of [owner]?", ROLE_BLOODLING_THRALL, ROLE_BLOODLING_THRALL, diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 9853f53b1cc9..4dafa2929ab9 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -170,6 +170,8 @@ new_bloodling = new /mob/living/basic/bloodling/proper/tier4(src.loc) if(5) new_bloodling = new /mob/living/basic/bloodling/proper/tier5(src.loc) + if(6) + new_bloodling = new /mob/living/basic/bloodling/proper/ascending(src.loc) evolution_mind_change(new_bloodling) @@ -268,3 +270,28 @@ /datum/action/cooldown/bloodling_hivespeak, ) speed = 2.5 + +/mob/living/basic/bloodling/proper/ascending + icon = 'icons/mob/simple/meteor_heart.dmi' + icon_state = "heart" + icon_living = "heart" + evolution_level = 6 + initial_powers = list( + /datum/action/cooldown/mob_cooldown/bloodling/absorb, + /datum/action/cooldown/bloodling/ascension, + /datum/action/cooldown/mob_cooldown/bloodling/infest, + /datum/action/cooldown/bloodling/build, + /datum/action/cooldown/mob_cooldown/bloodling/devour, + /datum/action/cooldown/bloodling/dissonant_shriek, + /datum/action/cooldown/spell/aoe/repulse/bloodling, + /datum/action/cooldown/mob_cooldown/bloodling/transfer_biomass, + /datum/action/cooldown/mob_cooldown/bloodling/heal, + /datum/action/cooldown/mob_cooldown/bloodling/give_life, + /datum/action/cooldown/bloodling_hivespeak, + ) + speed = 0 + move_resist = INFINITY + +/mob/living/basic/bloodling/proper/ascending/Initialize(mapload) + . = ..() + ADD_TRAIT(our_mob, TRAIT_IMMOBILIZED, REF(src)) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/bloodsuckers.dm b/monkestation/code/modules/storytellers/converted_events/solo/bloodsuckers.dm index 1bdf4c177a0a..a3947ad610e0 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/bloodsuckers.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/bloodsuckers.dm @@ -1,6 +1,6 @@ /datum/round_event_control/antagonist/solo/bloodsucker antag_flag = ROLE_BLOODSUCKER - tags = list(TAG_COMBAT, TAG_MAGICAL) + tags = list(TAG_COMBAT, TAG_ALIEN) antag_datum = /datum/antagonist/bloodsucker protected_roles = list( JOB_CAPTAIN, From 070d8924c8c4598e48098c7a67d5ea9b6a649c31 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:49:14 +0200 Subject: [PATCH 103/113] Wall of flesh by ThePooba --- .../bloodling/sprites/bloodling_sprites.dmi | Bin 1535 -> 3218 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi index 78f63a2a3572e396b7665d8059c4baad3aa885d2..79f180cecb11de477a9ab3aff4de7aa6371fdf56 100644 GIT binary patch literal 3218 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 aB7Xou`OJx4;Re0{0000Bas4 From bb052ee13005be47dc099b0318648fd6abef4524 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:52:17 +0200 Subject: [PATCH 104/113] implementations --- .../code/modules/antagonists/bloodling/mobs/bloodling_mob.dm | 2 +- .../code/modules/antagonists/bloodling/mobs/minions.dm | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm index 4dafa2929ab9..cb96f5f8ecb3 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/bloodling_mob.dm @@ -294,4 +294,4 @@ /mob/living/basic/bloodling/proper/ascending/Initialize(mapload) . = ..() - ADD_TRAIT(our_mob, TRAIT_IMMOBILIZED, REF(src)) + ADD_TRAIT(src, TRAIT_IMMOBILIZED, REF(src)) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm index eec6810a3667..9eae323da7d6 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -2,6 +2,7 @@ name = "minion" desc = "A mass of code in a vague sprite. Report if you see this." + icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' biomass = 0 biomass_max = 200 damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) @@ -34,6 +35,9 @@ name = "wall of flesh" desc = "A blobby mass of flesh of large size." + icon_state = "tank" + icon_living = "tank" + icon_dead = "tank_dead" health = 200 maxHealth = 200 melee_damage_lower = 10 From 55e5c971adc7e1b93acdb553354c974bf7610c4a Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:26:27 +0200 Subject: [PATCH 105/113] Adds in 2 sprites by cannibalhunter --- .../bloodling/sprites/bloodling_sprites.dmi | Bin 3218 -> 4047 bytes .../bloodling/sprites/flesh_tile.dmi | Bin 4734 -> 4583 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi index 79f180cecb11de477a9ab3aff4de7aa6371fdf56..e67554f9312b8a10d099a840161623fe990d03ad 100644 GIT binary patch delta 3863 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 Z{{Vv3R69$tbvFP2002ovPDHLkV1ip@b94Xz delta 3028 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 literal 4734 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 From 541e079495390f84c3e47d3df2c9a8f22ddfe5e6 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:54:09 +0200 Subject: [PATCH 106/113] Compiler errors fixed --- .../antagonists/bloodling/abilities/ascension.dm | 2 +- .../antagonists/bloodling/abilities/give_life.dm | 2 +- .../antagonists/bloodling/abilities/infect.dm | 14 +++++++------- .../antagonists/bloodling/bloodling_structures.dm | 2 ++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index ee2d552a5d26..2919ff3e2253 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -6,7 +6,7 @@ var/static/datum/dimension_theme/chosen_theme /datum/action/cooldown/bloodling/ascension/Activate(atom/target) - var/mob/living/basic/bloodling/our_mob = owner + var/mob/living/basic/bloodling/proper/our_mob = owner // Adds 500 biomass back our_mob.add_biomass(500) our_mob.evolution(6) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm index 6291384a2be5..70992b154491 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/give_life.dm @@ -28,7 +28,7 @@ 10 SECONDS, target_mob, POLL_IGNORE_SHUTTLE_DENIZENS, - pic_source = target_mob + alert_pic = target_mob ) if(!LAZYLEN(candidates)) owner.balloon_alert(owner, "[target_mob] rejects your generous gift...for now...") diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm index 3cb268a27861..7c7010c8c2da 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/infect.dm @@ -43,13 +43,13 @@ if(!carbon_mob.mind) var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates( - "Would you like to be a [carbon_mob] servant of [owner]?", - ROLE_BLOODLING_THRALL, - ROLE_BLOODLING_THRALL, - 10 SECONDS, - carbon_mob, - POLL_IGNORE_SHUTTLE_DENIZENS, - pic_source = carbon_mob + "Would you like to be a [carbon_mob] servant of [owner]?", + ROLE_BLOODLING_THRALL, + ROLE_BLOODLING_THRALL, + 10 SECONDS, + carbon_mob, + POLL_IGNORE_SHUTTLE_DENIZENS, + alert_pic = carbon_mob ) if(!LAZYLEN(candidates)) diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm index d8f21f70938b..7759a505b0f9 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm @@ -1,6 +1,7 @@ /obj/structure/bloodling name = "Abstract bloodling structure" max_integrity = 100 + icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' /obj/structure/bloodling/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE) @@ -26,6 +27,7 @@ name = "Rat warren" desc = "A pool of biomass and primordial soup, you hear a faint chittering from it." max_integrity = 100 + icon_state = "ratwarren" ///the minimum time it takes for a rat to spawn var/minimum_rattime = 1 MINUTES ///the maximum time it takes for a rat to spawn From dcca7e30e2b7fbe3c8eb55878836e81e4a2bafb9 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:24:01 +0200 Subject: [PATCH 107/113] b --- .../bloodling/sprites/bloodling_sprites.dmi | Bin 4047 -> 4864 bytes tgstation.dme | 1 - 2 files changed, 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi index e67554f9312b8a10d099a840161623fe990d03ad..170a71634fbdd02b229886c1696b391669f0f2ce 100644 GIT binary patch delta 4626 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 IM6N<$f`u^cbN~PV delta 3802 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 QHvj+t07*qoM6N<$f~|mH?EnA( diff --git a/tgstation.dme b/tgstation.dme index e92d0e8b4556..738e38f96999 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5796,7 +5796,6 @@ #include "interface\fonts\tiny_unicode.dm" #include "interface\fonts\vcr_osd_mono.dm" #include "monkestation\code\__DEFINES\_module_defines.dm" -#include "monkestation\code\__DEFINES\antag_defines.dm" #include "monkestation\code\__DEFINES\mobfactions.dm" #include "monkestation\code\__DEFINES\projectile.dm" #include "monkestation\code\__DEFINES\signals.dm" From 55b108c5caed165d433128b0852408137f7ab55a Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:06:59 +0100 Subject: [PATCH 108/113] fix --- .../antagonists/bloodling/abilities/absorb_biomass.dm | 1 + .../modules/antagonists/bloodling/abilities/ascension.dm | 5 +++++ .../code/modules/antagonists/bloodling/abilities/devour.dm | 1 + .../modules/antagonists/bloodling/bloodling_structures.dm | 2 +- .../code/modules/antagonists/bloodling/mobs/minions.dm | 2 +- 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index ea0baa483445..e9f3679af792 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -89,4 +89,5 @@ span_alertalien("[our_mob] wraps its tendrils around [target]. It absorbs it!"), span_noticealien("You wrap your tendrils around [target] and absorb it!"), ) + playsound(our_mob, 'sound/items/eatfood.ogg', 20) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 2919ff3e2253..276b76e34003 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -4,11 +4,16 @@ button_icon_state = "ascend" biomass_cost = 500 var/static/datum/dimension_theme/chosen_theme + var/list/responses = list("Yes", "No") /datum/action/cooldown/bloodling/ascension/Activate(atom/target) var/mob/living/basic/bloodling/proper/our_mob = owner // Adds 500 biomass back our_mob.add_biomass(500) + var/tgui_response = tgui_alert(our_mob, "Are you prepared to ascend?", "Ascension", responses, 0) + if(tgui_response == "No") + return + our_mob.evolution(6) // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm index 87168ff891c8..04d1b85940ed 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/devour.dm @@ -44,4 +44,5 @@ span_alertalien("[our_mob] snaps its maw over [target]s [target_part] and swiftly devours it!"), span_noticealien("You devour [target]s [target_part]!"), ) + playsound(our_mob, 'sound/items/eatfood.ogg', 20) return TRUE diff --git a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm index 7759a505b0f9..a46270094027 100644 --- a/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm +++ b/monkestation/code/modules/antagonists/bloodling/bloodling_structures.dm @@ -1,7 +1,7 @@ /obj/structure/bloodling name = "Abstract bloodling structure" max_integrity = 100 - icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' + icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi' /obj/structure/bloodling/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm index 9eae323da7d6..d904b016f8a8 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -2,7 +2,7 @@ name = "minion" desc = "A mass of code in a vague sprite. Report if you see this." - icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_abilities.dmi' + icon = 'monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi' biomass = 0 biomass_max = 200 damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) From f4121bc92063ecbaecf0381c61233f9b8e091be7 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:29:08 +0100 Subject: [PATCH 109/113] silly stuff --- .../code/modules/antagonists/bloodling/abilities/ascension.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 276b76e34003..1928d678a021 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -13,7 +13,8 @@ var/tgui_response = tgui_alert(our_mob, "Are you prepared to ascend?", "Ascension", responses, 0) if(tgui_response == "No") return - + var/turf/our_turf = our_mob.get_turf + priority_announce("ALERT: LEVEL 4 BIOHAZARD MORPHING IN [our_turf.loc]. STOP IT AT ALL COSTS.", "Biohazard") our_mob.evolution(6) // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) From 90bc6db91022edf25d6c14b79427d1139265373a Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:53:55 +0100 Subject: [PATCH 110/113] eatin gibbs --- .../bloodling/abilities/absorb_biomass.dm | 15 ++++++++++----- .../antagonists/bloodling/abilities/ascension.dm | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm index e9f3679af792..c5d4d77d5933 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/absorb_biomass.dm @@ -4,6 +4,11 @@ button_icon_state = "absorb" /// If the bloodling is currently absorbing var/is_absorbing = FALSE + /// Items we can absorb + var/list/absorbable_types = list( + /obj/effect/decal/cleanable/blood, + /obj/item/food. + ) /datum/action/cooldown/mob_cooldown/bloodling/absorb/PreActivate(atom/target) if(owner == target) @@ -13,7 +18,7 @@ owner.balloon_alert(owner, "Already absorbing!") return FALSE - if(istype(target, /obj/item/food/deadmouse)) + if(is_type_in_list(target, absorbable_types)) return ..() if(!ismob(target)) @@ -45,10 +50,7 @@ our_mob.balloon_alert(our_mob, "You begin absorbing [target]!") - // This prevents the mob from being dragged away from the bloodling during the process - target.AddComponentFrom(REF(src), /datum/component/leash, our_mob, 1) - - if(istype(target, /obj/item/food/deadmouse)) + if(is_type_in_list(target, absorbable_types)) our_mob.add_biomass(biomass_gain) qdel(target) our_mob.visible_message( @@ -59,6 +61,9 @@ var/mob/living/mob_to_absorb = target + // This prevents the mob from being dragged away from the bloodling during the process + mob_to_absorb.AddComponentFrom(REF(src), /datum/component/leash, our_mob, 1) + if(!iscarbon(mob_to_absorb)) biomass_gain = max(mob_to_absorb.getMaxHealth() * 0.5, biomass_gain) if(biomass_gain > 150) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 1928d678a021..01082ecb37f3 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -14,7 +14,7 @@ if(tgui_response == "No") return var/turf/our_turf = our_mob.get_turf - priority_announce("ALERT: LEVEL 4 BIOHAZARD MORPHING IN [our_turf.loc]. STOP IT AT ALL COSTS.", "Biohazard") + priority_announce("ALERT: LEVEL 4 BIOHAZARD MORPHING IN [our_turf.get_area]. STOP IT AT ALL COSTS.", "Biohazard") our_mob.evolution(6) // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) From 95e9ce582c3e9a8b24ca38264f5c154589b9b158 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:23:47 +0100 Subject: [PATCH 111/113] some sprites by thepooba --- .../bloodling/abilities/ascension.dm | 4 ++-- .../bloodling/sprites/bloodling_sprites.dmi | Bin 4864 -> 4830 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm index 01082ecb37f3..f96feed6bdc1 100644 --- a/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm +++ b/monkestation/code/modules/antagonists/bloodling/abilities/ascension.dm @@ -13,8 +13,8 @@ var/tgui_response = tgui_alert(our_mob, "Are you prepared to ascend?", "Ascension", responses, 0) if(tgui_response == "No") return - var/turf/our_turf = our_mob.get_turf - priority_announce("ALERT: LEVEL 4 BIOHAZARD MORPHING IN [our_turf.get_area]. STOP IT AT ALL COSTS.", "Biohazard") + var/turf/our_turf = get_turf(our_mob) + priority_announce("ALERT: LEVEL 4 BIOHAZARD MORPHING IN [get_area(our_turf)]. STOP IT AT ALL COSTS.", "Biohazard") our_mob.evolution(6) // Waits 5 minutes before calling the ascension addtimer(CALLBACK(src, PROC_REF(ascend), our_mob), 5 MINUTES) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi index 170a71634fbdd02b229886c1696b391669f0f2ce..a0568cfd7529a01e4eb8c29ebf51bbe80c3d67ad 100644 GIT binary patch delta 4551 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 delta 4585 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 T9>{Lb00000NkvXXu0mjf#bM&r From 9f5a881e5cc1668436f83e9db811648c3be61fe0 Mon Sep 17 00:00:00 2001 From: Rex9001 <120136161+Rex9001@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:24:40 +0100 Subject: [PATCH 112/113] finishes up harvester sprites --- .../bloodling/sprites/bloodling_sprites.dmi | Bin 4830 -> 4878 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi b/monkestation/code/modules/antagonists/bloodling/sprites/bloodling_sprites.dmi index a0568cfd7529a01e4eb8c29ebf51bbe80c3d67ad..9f5239f62926a143d1a4fd5595f4c4b746ca2bb2 100644 GIT binary patch delta 4825 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 Date: Sat, 9 Nov 2024 00:32:03 +0100 Subject: [PATCH 113/113] Update minions.dm --- .../code/modules/antagonists/bloodling/mobs/minions.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm index d904b016f8a8..ab019e51aadf 100644 --- a/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm +++ b/monkestation/code/modules/antagonists/bloodling/mobs/minions.dm @@ -18,6 +18,9 @@ name = "harvester" desc = "A mass of flesh with two large scything talons." + icon_state = "harvester" + icon_living = "harvester" + icon_dead = "harvester_dead" health = 100 maxHealth = 100 melee_damage_lower = 15