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
zcmV;}1}FK<422IRiBL{Q4GJ0x0000DNk~Le0001>0001h2m=5B0K2`CDF6TfY>_2B
zNY}QL$2cU+j$b|n8Pc_L{}lkHFff`gFODlKzPY)wu&~O-#lV)9%AcRgf`ZCyY|n>>
z2h_$Z00001bW%=J06^y0W&i*HpplG;e~6%kDXC@or8tzCVzH1*S;5uM1sqlYL^e~S
z^r=LS000IXNkl%YW1=
zKO`TMNr2f+l1=|p?Un|JXt!TCA@Myd4KX0(L%e^M#t4hX_ra5g2hVlCZu15uF@*NbO(&5gLJlcFXIi6^kyNw6JF$wQH
z*6H!z_Ioow_T~;0K?hJ10)(1X&RCxT(-v`0*_S-@*Xcu(fi9pBp)Sywz-K@y8$wFG
zN6&Rc;Q{EEF~p}+*N`pXzQ_6`e~GX3sMfvy{ICdpfLSmC)PsPre)9tfRo?aHhskG2
zYQVth>mD#ZBYpbIvsfMn?hjnP7I07i*%Uq};7-!z<7U8{_^691{FE|~;`i8JUphib
zP;!w~kR}O^FW=ye|bE{_vQh=
zDu~EFnMgRUPkMgbN_giSe4_cG#+R=t>l0spWlF(QpQ{tkU%BEC
zQXb;!aioux5^mbGY15`no7OCVt^fd@S^$8t$Dp4N`?=qb^PNs~C@VjSJ|j?>0(apb
zRI%{;Tqnpy@ObP4b#jgefA@bhUxs_$jgj@yO`62gUi&81J&WupKCwu}0s)jMBgj-td0{nX3QD9VR~J_ziq+dWIqVX#nUs
z>8C!242qZH^>uvkL@)xn|Cgxm?tmNMr6`KmJO%kH1`rFtP>8tysP7?!f|S3e@|?WI
z00t1b1`{SwZrt|}iXx}FkqiT>`W%}syQ%_#n;W5uty4*yjR7
zyDxpU;8lH2*S|1AMK0)&0_^(TY1o&NW77ISQ8JI0z2gl+r!?6Mt`J=bMc^2S#H!B`
zy@b{;r~}8Bf4YPuDASb>3fZpzQTxh=P*vr3e}l=_E%Z&@3DRc)D;v;GXHzN&
zJ>N)Y7#s4-plsas`P!kcJDWVac^90IIf}?N9mVD6{{B`*(jm~2co;5`%Ud-0%O5waT
ze6a}6og(#hcylbm^QXv{7qG>SMR@TPiADG>euHB8bks?(^$eoAZtL_A*(6_V2jM!IISzBs+SCx?>7uum##+6?<IHmxam-
zu6{0H9|HinB197
zm*2zxeg8ZA2T%rP0-OSXSh0fSa2C)E63*26)!TF)s{0-=7ob#(0+9tc3(&e(Ku!N1
zmVeex*Km&EmF&OZo920*t2=MHevH2p0Wu!x^1mf#Kb0IL7{bo@OPXd>0S
z%mUO2G5>r4{D`gtYOQrmZxq{K5-|Tf1t!)ZJpI=adTRm1OBcVBzFhK0bAxOufF~cC
z{>~@uPs=F<8)pDp-}QgLr3yCg10U4?B>y}o{(SKKubbbjU`Yx#5AOf^z!XqFz|nP~
zw}TXvC{dzBi4v~`z|#OhzzYF*N5l>53;bWVrvH_xE^k7id(5
zF*TgqX&F>W`Au*&t^zlR`z7b!m5Sg%Ngz~(955pw=eP4R5K*qD?yDfP%q5Gqs{;0baRT;;
z5d}~GZh~vw0XHceExIv5@14ilL-Ku0qoV$v3oz~6-;+^vxK-8$&!@Ua@TY&bSU)rN
z?-LvY+JOHT2WX8oS0IYm`7>Pndv7rf|M?0W4i2Yqw$6XYK`bEF&>BU!h4J}q3}^oi
z!+mVG%Ocj5)6^+7lrI9R-Zww--U2FY12w}z!+={7;Nz7T*nofMgMc?My!-5KBZw72
zzkl#NzaQq#m=X?J4>;D#ibBM-R8htJyW@2m4FO!N_XJly&XD$TB^eT&lmVw`T6o_M
zko4bz>jZyJ-~{((3BjxA`EG2zhU+YzHrSB%_qqK6#B~l&pmM~q_`)Y3cEn4RC{dzB
ziT^Y9y}~6f;OU2GmzJMdAw=CRt~;-glDCjQV_rizR~hWh-tR9bU$wWS0K(@7kkhzX
zYwxB3{rM_?Dg}ZE6o92L_eMXeuUGinxPSNXfC7I-uG1L(eF1FW-Tpzw-?wwT!__+?
z4-M5fn}9t6awC7t-_zr??Emp|hIjCIz=NF9x9HJ8gZBNs9vdn$*l~P(1C;(fdD_!o$t51u^WK2=Ndr1wg{T!|eXQ*WUyT2w0~8
zR{DQ6!2<$%c%gu_e@{Q~6HxEfe~Wd&dVlZde-j0(@L_6jJ8&BaSQ(NLxZbXCjDYG3
z#|79c#s83D6?o=M{i!0^Qtcb#g!kNC6H&TpZ!@
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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
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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