Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into easter-is-reaaaal…
Browse files Browse the repository at this point in the history
…llllll
  • Loading branch information
wraith-54321 committed Apr 30, 2024
2 parents 0eac9ba + a1379e3 commit f5a4d62
Show file tree
Hide file tree
Showing 65 changed files with 3,752 additions and 63 deletions.
220 changes: 159 additions & 61 deletions _maps/map_files/Mining/Lavaland.dmm

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -577,8 +577,11 @@
///Whether or not the squashing requires the squashed mob to be lying down
#define SQUASHED_SHOULD_BE_DOWN (1<<0)
///Whether or not to gib when the squashed mob is moved over
#define SQUASHED_SHOULD_BE_GIBBED (1<<0)
#define SQUASHED_SHOULD_BE_GIBBED (1<<1)


/// Don't squash our mob if its not located in a turf
#define SQUASHED_DONT_SQUASH_IN_CONTENTS (1<<3)
/*
* Defines for "AI emotions", allowing the AI to expression emotions
* with status displays via emotes.
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/research/anomalies.dm
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ GLOBAL_LIST_INIT(bioscrambler_organs_blacklist, typecacheof(list (
/obj/item/organ/internal/monster_core,
/obj/item/organ/internal/vocal_cords/colossus,
/obj/item/organ/internal/zombie_infection,
/obj/item/organ/internal/empowered_borer_egg, // MONKESTATION ADDITION -- CORTICAL_BORERS
)))

/// List of body parts we can apply to people
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/role_preferences.dm
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#define ROLE_SPIDER "Spider"
#define ROLE_WIZARD_MIDROUND "Wizard (Midround)"
// monke midrounds
#define ROLE_CORTICAL_BORER "Cortical Borer"
#define ROLE_DRIFTING_CONTRACTOR "Drifting Contractor"
#define ROLE_FLORIDA_MAN "Florida Man"
#define ROLE_SLASHER "Slasher"
Expand Down Expand Up @@ -156,6 +157,7 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_SPIDER = 0,
ROLE_WIZARD_MIDROUND = 14,
//monkestation edit start
ROLE_CORTICAL_BORER = 0, // Module ID: CORTICAL_BORERS
ROLE_DRIFTING_CONTRACTOR = 0,
ROLE_VAMPIRICACCIDENT = 0,
ROLE_MONSTERHUNTER = 0,
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/span.dm
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#define span_greenteamradio(str) ("<span class='greenteamradio'>" + str + "</span>")
#define span_greentext(str) ("<span class='greentext'>" + str + "</span>")
#define span_grey(str) ("<span class='grey'>" + str + "</span>")
#define span_header(str) ("<span class='header'>" + str + "</span>")
#define span_hear(str) ("<span class='hear'>" + str + "</span>")
#define span_hidden(str) ("<span class='hidden'>" + str + "</span>")
#define span_hierophant(str) ("<span class='hierophant'>" + str + "</span>")
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/~monkestation/actionspeed_modification.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define ACTIONSPEED_ID_BORER "borer"
25 changes: 25 additions & 0 deletions code/__DEFINES/~monkestation/antagonists.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,31 @@
/// is something an eminence
#define iseminence(checked) (istype(checked, /mob/living/eminence))

/// is something a worm
#define iscorticalborer(A) (istype(A, /mob/living/basic/cortical_borer))

// Borer evolution defines
// The three primary paths that eventually diverge
#define BORER_EVOLUTION_SYMBIOTE "Symbiote"
#define BORER_EVOLUTION_HIVELORD "Hivelord"
#define BORER_EVOLUTION_DIVEWORM "Diveworm"
// Just general upgrades that don't take you in a specific direction
#define BORER_EVOLUTION_GENERAL "General"
#define BORER_EVOLUTION_START "Start"

// Borer effect flags

/// If the borer is in stealth mode, giving less feedback to hosts at the cost of no health/resource/point gain
#define BORER_STEALTH_MODE (1<<0)
/// If the borer is sugar-immune, taking no ill effects from sugar
#define BORER_SUGAR_IMMUNE (1<<1)
/// If the borer is able to enter hosts in half the time, if not hiding
#define BORER_FAST_BORING (1<<2)
/// If the borer is currently hiding under tables/couches/stairs or appearing on top of them
#define BORER_HIDING (1<<3)
/// If the borer can produce eggs without a host
#define BORER_ALONE_PRODUCTION (1<<4)

// Gang member
#define IS_GANGMEMBER(mob) mob?.mind?.has_antag_datum(/datum/antagonist/gang_member)
///Checks if a gangmember antag datum's rank is >= the input gang rank level
Expand Down
2 changes: 2 additions & 0 deletions code/_globalvars/lists/poll_ignore.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#define POLL_IGNORE_CARGORILLA "cargorilla"
#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support"
#define POLL_IGNORE_CONSTRUCT "construct"
#define POLL_IGNORE_CORTICAL_BORER "cortical_borer" // MONKESTATION ADDITION -- CORTICAL_BORERS
#define POLL_IGNORE_DRONE "drone"
#define POLL_IGNORE_FIRE_SHARK "fire_shark"
#define POLL_IGNORE_FUGITIVE "fugitive"
Expand Down Expand Up @@ -47,6 +48,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_CARGORILLA = "Cargorilla",
POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit",
POLL_IGNORE_CONSTRUCT = "Construct",
POLL_IGNORE_CORTICAL_BORER = "Cortical Borer", // MONKESTATION ADDITION -- CORTICAL_BORERS
POLL_IGNORE_DRONE = "Drone shells",
POLL_IGNORE_FIRE_SHARK = "Fire Shark",
POLL_IGNORE_FUGITIVE = "Fugitive Hunter",
Expand Down
2 changes: 2 additions & 0 deletions code/datums/components/squashable.dm
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
return

var/mob/living/parent_as_living = parent
if((squash_flags & SQUASHED_DONT_SQUASH_IN_CONTENTS) && !isturf(parent_as_living.loc))
return

if(squash_flags & SQUASHED_SHOULD_BE_DOWN && parent_as_living.body_position != LYING_DOWN)
return
Expand Down
5 changes: 5 additions & 0 deletions code/datums/mutations/_mutations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@
/datum/mutation/human/proc/on_acquiring(mob/living/carbon/human/acquirer)
if(!acquirer || !istype(acquirer) || acquirer.stat == DEAD || (src in acquirer.dna.mutations))
return TRUE
// MONKESTATION ADDITION START -- CORTICAL_BORERS
if(acquirer.has_borer())
to_chat(acquirer, span_warning("Something inside holds dearly to your humanity!"))
return TRUE
// MONKESTATION ADDITION END
if(species_allowed && !species_allowed.Find(acquirer.dna.species.id))
return TRUE
if(health_req && acquirer.health < health_req)
Expand Down
1 change: 1 addition & 0 deletions code/modules/admin/sql_ban_system.dm
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@
ROLE_BROTHER,
ROLE_BLOODSUCKER, //monkestation edit
ROLE_BLOODSUCKERBREAKOUT, //monkestation edit
ROLE_CORTICAL_BORER, // MONKESTATION ADDITION -- CORTICAL_BORERS
ROLE_CHANGELING,
ROLE_CLOCK_CULTIST, //monkestation edit
ROLE_CULTIST,
Expand Down
6 changes: 6 additions & 0 deletions code/modules/antagonists/changeling/powers/panacea.dm
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
user.get_organ_by_type(/obj/item/organ/internal/body_egg),
user.get_organ_by_type(/obj/item/organ/internal/legion_tumour),
user.get_organ_by_type(/obj/item/organ/internal/zombie_infection),
user.get_organ_by_type(/obj/item/organ/internal/empowered_borer_egg), // MONKESTATION ADDITION -- CORTICAL_BORERS
)

for(var/o in bad_organs)
Expand All @@ -28,6 +29,11 @@
C.vomit(0)
O.forceMove(get_turf(user))

// MONKESTATION ADDITION START -- CORTICAL_BORERS
var/mob/living/basic/cortical_borer/brain_pest = user.has_borer()
if(brain_pest)
brain_pest.leave_host()
// MONKESTATION ADDITION END
user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10)
user.reagents.add_reagent(/datum/reagent/medicine/pen_acid, 20)
user.reagents.add_reagent(/datum/reagent/medicine/antihol, 10)
Expand Down
7 changes: 7 additions & 0 deletions code/modules/assembly/mousetrap.dm
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,13 @@
else if(isregalrat(target))
visible_message(span_boldannounce("Skreeeee!")) //He's simply too large to be affected by a tiny mouse trap.

// MONKESTATION ADDITION START -- ID:CORTICAL_BORERS
else if(iscorticalborer(target))
var/mob/living/basic/cortical_borer/pest = target
visible_message(span_boldannounce("SPLAT!"))
pest.adjust_health(50)
// MONKESTATION ADDITION END

playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
pulse()

Expand Down
1 change: 1 addition & 0 deletions code/modules/client/preferences/middleware/antags.dm
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@
ROLE_LONE_OPERATIVE = /datum/antagonist/nukeop/lone,
ROLE_SENTIENCE = /datum/antagonist/sentient_creature,
//monkestation antags
ROLE_CORTICAL_BORER = /datum/antagonist/cortical_borer,
ROLE_DRIFTING_CONTRACTOR = /datum/antagonist/traitor/contractor,
ROLE_SLASHER = /datum/antagonist/slasher,
ROLE_FLORIDA_MAN = /datum/antagonist/florida_man
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions html/changelogs/AutoChangeLog-pr-1781.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
author: "MomoBerri"
delete-after: True
changes:
- qol: "several updates to the labor camp"
4 changes: 4 additions & 0 deletions html/changelogs/AutoChangeLog-pr-976.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
author: "Jake Park, Zonespace, Gboster"
delete-after: True
changes:
- rscadd: "Added a new antagonist: The cortical borer, capable of manipulating humans with the sole goal of making more of itself"
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Parent of all borer actions
/datum/action/cooldown/borer
button_icon = 'monkestation/code/modules/antagonists/borers/icons/actions.dmi'
cooldown_time = 0
/// Text used to explain the ability more closelly in the antagonist TGUI panel
var/ability_explanation = ""

/// How many chemicals this costs
var/chemical_cost = 0
/// How many chem evo points are needed to use this ability
var/chemical_evo_points = 0
/// How many stat evo points are needed to use this ability
var/stat_evo_points = 0

/// Does this ability need a human host to be triggered?
var/requires_host = FALSE
/// Can this ability function within a living host?
var/needs_living_host = FALSE
/// Can this ability function within a dead host?
var/needs_dead_host = FALSE
/// Does this ability stop working when the host has sugar?
var/sugar_restricted = FALSE

/datum/action/cooldown/borer/New(Target, original)
. = ..()
var/compiled_string = ""
if(chemical_cost)
compiled_string += "([chemical_cost] chemical[chemical_cost == 1 ? "" : "s"])"
if(stat_evo_points)
compiled_string += " ([stat_evo_points] stat point[stat_evo_points == 1 ? "" : "s"])"
if(chemical_evo_points)
compiled_string += " ([chemical_evo_points] chemical point[chemical_evo_points == 1 ? "" : "s"])"
name = "[initial(name)][compiled_string]"

/datum/action/cooldown/borer/Trigger(trigger_flags, atom/target)
. = ..()

// Safety checks
if(!iscorticalborer(owner))
to_chat(owner, span_warning("You must be a cortical borer to use this action!"))
return FALSE
var/mob/living/basic/cortical_borer/cortical_owner = owner

// Status Requirements
if(requires_host == TRUE && !cortical_owner.inside_human())
owner.balloon_alert(owner, "host required")
return FALSE
if(needs_living_host == TRUE && cortical_owner.human_host.stat == DEAD)
owner.balloon_alert(owner, "Alive host required")
return FALSE
if(needs_dead_host == TRUE && cortical_owner.human_host.stat != DEAD)
owner.balloon_alert(owner, "Dead host required")
return FALSE
if(sugar_restricted == TRUE && cortical_owner.host_sugar())
owner.balloon_alert(owner, "cannot function with sugar in host")
return FALSE

// Resource costs
if(cortical_owner.chemical_storage < chemical_cost)
cortical_owner.balloon_alert(cortical_owner, "need [chemical_cost] chemicals")
return FALSE
if(cortical_owner.chemical_evolution < chemical_evo_points)
cortical_owner.balloon_alert(cortical_owner, "need [chemical_evo_points] chemical points")
return FALSE
if(cortical_owner.stat_evolution < stat_evo_points)
cortical_owner.balloon_alert(cortical_owner, "need [stat_evo_points] stat points")
return FALSE

return . == FALSE ? FALSE : TRUE //. can be null, true, or false. There's a difference between null and false here

/datum/asset/simple/borer_icons

/datum/asset/simple/borer_icons/register()
for(var/datum/action/cooldown/borer/ability as anything in subtypesof(/datum/action/cooldown/borer))
add_borer_icon(initial(ability.button_icon), initial(ability.button_icon_state))
return ..()

/datum/asset/simple/borer_icons/proc/add_borer_icon(borer_icon, borer_icon_state)
assets[SANITIZE_FILENAME("borer.[borer_icon_state].png")] = icon(borer_icon, borer_icon_state)
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/// How many of OUR chemicals do we need to spend to inject 1 unit worth of chemicals being injected
#define CHEMICALS_PER_UNIT 2
/// How long will the cooldown on injection be, per chemical injected? example: 10 chemicals injected, 5 second divisor = 2 seconds
#define CHEMICAL_SECOND_DIVISOR (5 SECONDS)

/**
* Lets the borer inject chemicals from the "known_chemicals" list into the host
*/
/datum/action/cooldown/borer/inject_chemical
name = "Open Chemical Injector"
button_icon_state = "chemical"
requires_host = TRUE
sugar_restricted = TRUE
ability_explanation = "chemical"
ability_explanation = "\
This ability allows us to inject chemicals into our host.\n\
Our internal chemicals can be converted to human-compatible chemicals at a ratio of 2:1\n\
"

/datum/action/cooldown/borer/inject_chemical/Trigger(trigger_flags, atom/target)
. = ..()
if(!.)
return FALSE
ui_interact(owner)

/datum/action/cooldown/borer/inject_chemical/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "BorerChem", name)
ui.open()

/datum/action/cooldown/borer/inject_chemical/ui_data(mob/user)
var/list/data = list()
var/mob/living/basic/cortical_borer/cortical_owner = owner
data["amount"] = cortical_owner.injection_rate_current
data["energy"] = cortical_owner.chemical_storage / CHEMICALS_PER_UNIT
data["maxEnergy"] = cortical_owner.max_chemical_storage / CHEMICALS_PER_UNIT
data["borerTransferAmounts"] = cortical_owner.injection_rates_unlocked
data["onCooldown"] = !COOLDOWN_FINISHED(cortical_owner, injection_cooldown)
data["notEnoughChemicals"] = ((cortical_owner.injection_rate_current * CHEMICALS_PER_UNIT) > cortical_owner.chemical_storage) ? TRUE : FALSE

var/chemicals[0]
for(var/reagent in cortical_owner.known_chemicals)
var/datum/reagent/temp = GLOB.chemical_reagents_list[reagent]
if(temp)
var/chemname = temp.name
chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name))))
data["chemicals"] = chemicals

return data

/datum/action/cooldown/borer/inject_chemical/ui_act(action, params)
. = ..()
if(.)
return
var/mob/living/basic/cortical_borer/cortical_owner = owner
switch(action)
if("amount")
var/target = text2num(params["target"])
if(target in cortical_owner.injection_rates)
cortical_owner.injection_rate_current = target
. = TRUE
if("inject")
if(!iscorticalborer(usr) || !COOLDOWN_FINISHED(cortical_owner, injection_cooldown))
return
if(cortical_owner.host_sugar())
owner.balloon_alert(owner, "cannot function with sugar in host")
return
var/reagent_name = params["reagent"]
var/reagent = GLOB.name2reagent[reagent_name]
if(!(reagent in cortical_owner.known_chemicals))
return

cortical_owner.reagent_holder.reagents.add_reagent(reagent, cortical_owner.injection_rate_current, added_purity = 1)
cortical_owner.reagent_holder.reagents.trans_to(cortical_owner.human_host, cortical_owner.injection_rate_current, methods = INGEST)

to_chat(cortical_owner.human_host, span_warning("You feel something cool inside of you and a dull ache in your head!"))
cortical_owner.chemical_storage -= cortical_owner.injection_rate_current * CHEMICALS_PER_UNIT
COOLDOWN_START(cortical_owner, injection_cooldown, (cortical_owner.injection_rate_current / CHEMICAL_SECOND_DIVISOR))

var/turf/human_turf = get_turf(cortical_owner.human_host)
var/logging_text = "[key_name(cortical_owner)] injected [key_name(cortical_owner.human_host)] with [reagent_name] at [loc_name(human_turf)]"
cortical_owner.log_message(logging_text, LOG_GAME)
cortical_owner.human_host.log_message(logging_text, LOG_GAME)
. = TRUE

/datum/action/cooldown/borer/inject_chemical/ui_state(mob/user)
return GLOB.always_state

/datum/action/cooldown/borer/inject_chemical/ui_status(mob/user, datum/ui_state/state)
if(!iscorticalborer(user))
return UI_CLOSE

var/mob/living/basic/cortical_borer/borer = user

if(!borer.human_host)
return UI_CLOSE
return ..()

#undef CHEMICALS_PER_UNIT
#undef CHEMICAL_SECOND_DIVISOR
Loading

0 comments on commit f5a4d62

Please sign in to comment.