From e1d0253a3e15997d42657d86ce23fe93822610dc Mon Sep 17 00:00:00 2001 From: boy2mantwicethefam <41342767+boy2mantwicethefam@users.noreply.github.com> Date: Sat, 24 Feb 2024 21:50:22 +0200 Subject: [PATCH] The Blobbening - Removal of Roundstart Blob and the Revenge of The Outer Space Blob (Updated) (#35947) * blob stuff * changes * Liberator deals 25 damage to blobs. * Brings back splash damage but on-hit * Take into consideration fire resistance * It is once again a Highlander ruleset --- __DEFINES/blob.dm | 6 +- .../dynamic/dynamic_rulesets_roundstart.dm | 83 ++++++++++--------- code/game/gamemodes/blob/blobs/shield.dm | 6 +- code/game/gamemodes/blob/powers.dm | 2 +- code/game/gamemodes/blob/theblob.dm | 7 +- code/game/gamemodes/meteor/meteors.dm | 4 +- code/modules/credits/episode_name.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 5 +- code/modules/projectiles/projectile/beams.dm | 14 ++-- 9 files changed, 69 insertions(+), 62 deletions(-) diff --git a/__DEFINES/blob.dm b/__DEFINES/blob.dm index 2f383ef9747..c4bea37100c 100644 --- a/__DEFINES/blob.dm +++ b/__DEFINES/blob.dm @@ -1,11 +1,11 @@ #define BLOBCORECOSTINC 50 #define BLOBCOREBASECOST 100 #define BLOBSHICOST 5 -#define BLOBRESCOST 30 +#define BLOBRESCOST 10 #define BLOBFACCOST 45 #define BLOBNODCOST 15 -#define BLOBATTCOST 15 +#define BLOBATTCOST 5 #define BLOBRALCOST 5 #define BLOBTAUNTCOST 15 -#define BLOBNDPOINTINC 10 \ No newline at end of file +#define BLOBNDPOINTINC 10 diff --git a/code/datums/gamemode/dynamic/dynamic_rulesets_roundstart.dm b/code/datums/gamemode/dynamic/dynamic_rulesets_roundstart.dm index 5a7c18e77e4..0edbaa0a944 100644 --- a/code/datums/gamemode/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/datums/gamemode/dynamic/dynamic_rulesets_roundstart.dm @@ -577,45 +577,52 @@ Assign your candidates in choose_candidates() instead. // // ////////////////////////////////////////////// -/datum/dynamic_ruleset/roundstart/blob - name = "Blob Conglomerate" - role_category = /datum/role/blob_overmind/ - restricted_from_jobs = list("AI", "Cyborg", "Mobile MMI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") - enemy_jobs = list("AI", "Cyborg", "Warden", "Head of Security", "Captain", "Quartermaster", "Head of Personnel", "Station Engineer", "Chief Engineer", "Atmospheric Technician") - required_pop = list(30,25,25,20,20,20,15,15,15,15) - required_enemies = list(4,4,4,4,4,4,4,3,2,1) - required_candidates = 1 - weight = BASE_RULESET_WEIGHT - weight_category = "Blob" - weekday_rule_boost = list("Tue") - cost = 45 - requirements = list(90,90,90,80,60,40,30,20,10,10) - high_population_requirement = 70 - flags = HIGHLANDER_RULESET +/////////////// +//Currently disabled from rolling roundstart. +//Major source of grievances, as it would either end the round too fast or cause "blobstended" when it got killed. +//Even though it hasn't won a single round in months due to Liberator guns. +//Roundstart blob got axed so that midround blob may be buffed (and more fun). +/////////////// -/datum/dynamic_ruleset/roundstart/blob/execute() - var/datum/faction/blob_conglomerate/blob_fac = find_active_faction_by_type(/datum/faction/blob_conglomerate) - if (!blob_fac) - blob_fac = ticker.mode.CreateFaction(/datum/faction/blob_conglomerate, null, 1) - var/blob_number = 1 + round(mode.roundstart_pop_ready/25) // + 1 Blob per 25 pop. ready. - for (var/i = 1 to min(blob_number, assigned.len)) - var/mob/M = pick(assigned) - blob_fac.HandleNewMind(M.mind) - var/datum/role/blob = M.mind.GetRole(BLOBOVERMIND) - blob.Greet(GREET_ROUNDSTART) - switch(M.mind.assigned_role) - if("Clown") - blob_looks_player["clownscape"] = 32 - if("Station Engineer","Atmospheric Technician","Chief Engineer") - blob_looks_player["AME"] = 32 - blob_looks_player["AME_new"] = 64 - if("Chaplain") - blob_looks_player["skelleton"] = 64 - if("Security Officer","Detective","Head of Security","Warden") - blob_looks_player["secblob"] = 32 - if (calledBy == "antag madness")//one core is plenty on antag madness - break - return 1 +// /datum/dynamic_ruleset/roundstart/blob +// name = "Blob Conglomerate" +// role_category = /datum/role/blob_overmind/ +// restricted_from_jobs = list("AI", "Cyborg", "Mobile MMI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") +// enemy_jobs = list("AI", "Cyborg", "Warden", "Head of Security", "Captain", "Quartermaster", "Head of Personnel", "Station Engineer", "Chief Engineer", "Atmospheric Technician") +// required_pop = list(30,25,25,20,20,20,15,15,15,15) +// required_enemies = list(4,4,4,4,4,4,4,3,2,1) +// required_candidates = 1 +// weight = BASE_RULESET_WEIGHT +// weight_category = "Blob" +// weekday_rule_boost = list("Tue") +// cost = 45 +// requirements = list(90,90,90,80,60,40,30,20,10,10) +// high_population_requirement = 70 +// flags = HIGHLANDER_RULESET + +// /datum/dynamic_ruleset/roundstart/blob/execute() +// var/datum/faction/blob_conglomerate/blob_fac = find_active_faction_by_type(/datum/faction/blob_conglomerate) +// if (!blob_fac) +// blob_fac = ticker.mode.CreateFaction(/datum/faction/blob_conglomerate, null, 1) +// var/blob_number = 1 + round(mode.roundstart_pop_ready/25) // + 1 Blob per 25 pop. ready. +// for (var/i = 1 to min(blob_number, assigned.len)) +// var/mob/M = pick(assigned) +// blob_fac.HandleNewMind(M.mind) +// var/datum/role/blob = M.mind.GetRole(BLOBOVERMIND) +// blob.Greet(GREET_ROUNDSTART) +// switch(M.mind.assigned_role) +// if("Clown") +// blob_looks_player["clownscape"] = 32 +// if("Station Engineer","Atmospheric Technician","Chief Engineer") +// blob_looks_player["AME"] = 32 +// blob_looks_player["AME_new"] = 64 +// if("Chaplain") +// blob_looks_player["skelleton"] = 64 +// if("Security Officer","Detective","Head of Security","Warden") +// blob_looks_player["secblob"] = 32 +// if (calledBy == "antag madness")//one core is plenty on antag madness +// break +// return 1 ////////////////////////////////////////////// // // diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 4db1aed3ad7..b36756e9c58 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -2,8 +2,8 @@ name = "strong blob" icon_state = "strong" desc = "A dense part of a blob." - health = 75 - maxHealth = 75 + health = 50 + maxHealth = 50 fire_resist = 2 layer = BLOB_SHIELD_LAYER spawning = 0 @@ -28,7 +28,7 @@ if(health >= 50) return 0 - health += 10 + health += min(maxHealth - health, 10) return 1 /obj/effect/blob/shield/update_icon(var/spawnend = 0) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 341d3c9f6f4..1b78fe89800 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -315,7 +315,7 @@ return delayNextAttack(5) - OB.expand(T, 0) //Doesn't give source because we don't care about passive restraint + OB.expand(T, 0, manual = TRUE) //Doesn't give source because we don't care about passive restraint /mob/camera/blob/verb/rally_spores_power() diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index a6d048d576f..d385f431f44 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -427,11 +427,12 @@ var/list/blob_looks_player = list(//Options available to players /obj/effect/blob/proc/run_action() return 0 -/obj/effect/blob/proc/expand(var/turf/T = null, var/prob = 1, var/mob/camera/blob/source) +/obj/effect/blob/proc/expand(var/turf/T = null, var/prob = 1, var/mob/camera/blob/source, var/manual = FALSE) if(prob && !prob(health)) return - if(istype(T, /turf/space) && prob(75)) - return + if(!manual) //Manually-expanded blobs don't care about 50% chance to not expand in space. + if(istype(T, /turf/space) && prob(50)) + return if(!T) var/list/dirs = cardinal.Copy() for(var/i in 1 to 4) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 1c06f5c870c..77b828ac207 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -572,9 +572,9 @@ var/list/blob_candidates = list() log_admin("Blob core meteor impacted at [formatJumpTo(T)] controlled by [key_name(blob_candidate)].") message_admins("Blob core meteor impacted at [formatJumpTo(T)] controlled by [key_name(blob_candidate)].") if(blob_candidate && istype(blob_candidate.mob, /mob/dead/observer)) - new/obj/effect/blob/core(T, new_overmind = blob_candidate, no_morph = 1) + new/obj/effect/blob/core(T, new_overmind = blob_candidate, no_morph = 1, new_rate = 4) else - new/obj/effect/blob/core(T, no_morph = 1) + new/obj/effect/blob/core(T, no_morph = 1, new_rate = 4) blob_candidate = null //It's a tool to debug and test stuff, ok? Pls don't hand them out to players unless you just want to set the world on fire. diff --git a/code/modules/credits/episode_name.dm b/code/modules/credits/episode_name.dm index 79fb8053a6b..4d581e52b6f 100644 --- a/code/modules/credits/episode_name.dm +++ b/code/modules/credits/episode_name.dm @@ -92,8 +92,8 @@ episode_names += new /datum/episode_name/rare("[pick("THE CREW STARTS A REVOLUTION", "HELL IS OTHER SPESSMEN", "INSURRECTION", "THE CREW RISES UP", 25;"FUN WITH FRIENDS")]", "Round included roundstart revs.", 350) if(copytext(uppr_name,1,2) == "V") episode_names += new /datum/episode_name/rare("V FOR [uppr_name]", "Round included roundstart revs... and the station's name starts with V.", 1500) - if(locate(/datum/dynamic_ruleset/roundstart/blob) in mode.executed_rules) - episode_names += new /datum/episode_name/rare("[pick("MARRIED TO THE BLOB", "THE CREW GETS QUARANTINED")]", "Round included a roundstart blob.", 350) + if(locate(/datum/dynamic_ruleset/midround/from_ghosts/faction_based/blob_storm) in mode.executed_rules) + episode_names += new /datum/episode_name/rare("[pick("MARRIED TO THE BLOB", "THE CREW GETS QUARANTINED")]", "Round included a midround blob.", 350) if(ticker.explosion_in_progress || ticker.station_was_nuked) episode_names += new /datum/episode_name/rare("[pick("THE CREW GETS NUKED", "THE CREW IS THE BOMB", "THE CREW GOES NUCLEAR", "THE CREW BLASTS OFF AGAIN!", "THE 'BOOM' HEARD 'ROUND THE WORLD", 25;"THE BIG BANG THEORY")]", "The station was nuked!", 450) if((locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) || (locate(/datum/dynamic_ruleset/midround/from_ghosts/faction_based/nuclear) in mode.executed_rules)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1c424c1cb62..18db009bae2 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -611,8 +611,9 @@ emp_act show_message("The blob attacks you!") var/dam_zone = pick(organs_by_name) var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone)) - - apply_damage(run_armor_absorb(affecting, "melee", rand(30,40)), BRUTE, affecting, run_armor_check(affecting, "melee")) + //Blobs do 50% brute damage and 50% burn damage, and reduce armor value by 50% multiplicatively, so 80% damage reduction becomes 40%. + apply_damage(run_armor_absorb(affecting, "melee", rand(15,20)), BRUTE, affecting, run_armor_check(affecting, "melee", modifier = 0.5)) + apply_damage(run_armor_absorb(affecting, "melee", rand(15,20)), BURN, affecting, run_armor_check(affecting, "melee", modifier = 0.5)) /mob/living/carbon/human/dissolvable() if(species && species.anatomy_flags & ACID4WATER) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 50f97b46902..361a8e7d61b 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -750,14 +750,12 @@ var/list/beam_master = list() /obj/item/projectile/beam/humanelaser/to_bump(atom/A as mob|obj|turf|area) if(ishuman(A)) damage = 10 - if(istype(A,/obj/effect/blob)) - damage = 40 + if(istype(A,/obj/effect/blob)) //It will deal half of its damage to a nearby blob tile on hit. var/obj/effect/blob/B = A - var/splash_damage = damage/B.fire_resist - B.health - if(splash_damage > 0) - for(var/obj/effect/B2 in orange(1,B)) - B2.bullet_act(src, null, splash_damage) - break + var/actual_damage = damage/B.fire_resist //More resistant tiles such as strong blobs will cause less damage to be spread + for(var/obj/effect/blob/B2 in orange(1,B)) + B2.bullet_act(src, null, actual_damage) + break return ..() /obj/item/projectile/beam/heavylaser @@ -1251,4 +1249,4 @@ var/list/laser_tag_vests = list(/obj/item/clothing/suit/tag/redtag, /obj/item/cl damage = 10 damage_type = BRUTE pass_flags = PASSTABLE - eyeblur = 0 \ No newline at end of file + eyeblur = 0