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
This commit is contained in:
boy2mantwicethefam
2024-02-24 21:50:22 +02:00
committed by GitHub
parent ba813b06bf
commit e1d0253a3e
9 changed files with 69 additions and 62 deletions

View File

@@ -1,10 +1,10 @@
#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

View File

@@ -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
//////////////////////////////////////////////
// //

View File

@@ -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)

View File

@@ -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()

View File

@@ -427,10 +427,11 @@ 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))
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()

View File

@@ -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.

View File

@@ -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))

View File

@@ -611,8 +611,9 @@ emp_act
show_message("<span class='warning'>The blob attacks you!</span>")
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)

View File

@@ -750,13 +750,11 @@ 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)
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 ..()