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,11 +1,11 @@
#define BLOBCORECOSTINC 50 #define BLOBCORECOSTINC 50
#define BLOBCOREBASECOST 100 #define BLOBCOREBASECOST 100
#define BLOBSHICOST 5 #define BLOBSHICOST 5
#define BLOBRESCOST 30 #define BLOBRESCOST 10
#define BLOBFACCOST 45 #define BLOBFACCOST 45
#define BLOBNODCOST 15 #define BLOBNODCOST 15
#define BLOBATTCOST 15 #define BLOBATTCOST 5
#define BLOBRALCOST 5 #define BLOBRALCOST 5
#define BLOBTAUNTCOST 15 #define BLOBTAUNTCOST 15
#define BLOBNDPOINTINC 10 #define BLOBNDPOINTINC 10

View File

@@ -577,45 +577,52 @@ Assign your candidates in choose_candidates() instead.
// // // //
////////////////////////////////////////////// //////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/blob ///////////////
name = "Blob Conglomerate" //Currently disabled from rolling roundstart.
role_category = /datum/role/blob_overmind/ //Major source of grievances, as it would either end the round too fast or cause "blobstended" when it got killed.
restricted_from_jobs = list("AI", "Cyborg", "Mobile MMI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") //Even though it hasn't won a single round in months due to Liberator guns.
enemy_jobs = list("AI", "Cyborg", "Warden", "Head of Security", "Captain", "Quartermaster", "Head of Personnel", "Station Engineer", "Chief Engineer", "Atmospheric Technician") //Roundstart blob got axed so that midround blob may be buffed (and more fun).
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() // /datum/dynamic_ruleset/roundstart/blob
var/datum/faction/blob_conglomerate/blob_fac = find_active_faction_by_type(/datum/faction/blob_conglomerate) // name = "Blob Conglomerate"
if (!blob_fac) // role_category = /datum/role/blob_overmind/
blob_fac = ticker.mode.CreateFaction(/datum/faction/blob_conglomerate, null, 1) // restricted_from_jobs = list("AI", "Cyborg", "Mobile MMI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
var/blob_number = 1 + round(mode.roundstart_pop_ready/25) // + 1 Blob per 25 pop. ready. // enemy_jobs = list("AI", "Cyborg", "Warden", "Head of Security", "Captain", "Quartermaster", "Head of Personnel", "Station Engineer", "Chief Engineer", "Atmospheric Technician")
for (var/i = 1 to min(blob_number, assigned.len)) // required_pop = list(30,25,25,20,20,20,15,15,15,15)
var/mob/M = pick(assigned) // required_enemies = list(4,4,4,4,4,4,4,3,2,1)
blob_fac.HandleNewMind(M.mind) // required_candidates = 1
var/datum/role/blob = M.mind.GetRole(BLOBOVERMIND) // weight = BASE_RULESET_WEIGHT
blob.Greet(GREET_ROUNDSTART) // weight_category = "Blob"
switch(M.mind.assigned_role) // weekday_rule_boost = list("Tue")
if("Clown") // cost = 45
blob_looks_player["clownscape"] = 32 // requirements = list(90,90,90,80,60,40,30,20,10,10)
if("Station Engineer","Atmospheric Technician","Chief Engineer") // high_population_requirement = 70
blob_looks_player["AME"] = 32 // flags = HIGHLANDER_RULESET
blob_looks_player["AME_new"] = 64
if("Chaplain") // /datum/dynamic_ruleset/roundstart/blob/execute()
blob_looks_player["skelleton"] = 64 // var/datum/faction/blob_conglomerate/blob_fac = find_active_faction_by_type(/datum/faction/blob_conglomerate)
if("Security Officer","Detective","Head of Security","Warden") // if (!blob_fac)
blob_looks_player["secblob"] = 32 // blob_fac = ticker.mode.CreateFaction(/datum/faction/blob_conglomerate, null, 1)
if (calledBy == "antag madness")//one core is plenty on antag madness // var/blob_number = 1 + round(mode.roundstart_pop_ready/25) // + 1 Blob per 25 pop. ready.
break // for (var/i = 1 to min(blob_number, assigned.len))
return 1 // 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" name = "strong blob"
icon_state = "strong" icon_state = "strong"
desc = "A dense part of a blob." desc = "A dense part of a blob."
health = 75 health = 50
maxHealth = 75 maxHealth = 50
fire_resist = 2 fire_resist = 2
layer = BLOB_SHIELD_LAYER layer = BLOB_SHIELD_LAYER
spawning = 0 spawning = 0
@@ -28,7 +28,7 @@
if(health >= 50) if(health >= 50)
return 0 return 0
health += 10 health += min(maxHealth - health, 10)
return 1 return 1
/obj/effect/blob/shield/update_icon(var/spawnend = 0) /obj/effect/blob/shield/update_icon(var/spawnend = 0)

View File

@@ -315,7 +315,7 @@
return return
delayNextAttack(5) 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() /mob/camera/blob/verb/rally_spores_power()

View File

@@ -427,11 +427,12 @@ var/list/blob_looks_player = list(//Options available to players
/obj/effect/blob/proc/run_action() /obj/effect/blob/proc/run_action()
return 0 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)) if(prob && !prob(health))
return return
if(istype(T, /turf/space) && prob(75)) if(!manual) //Manually-expanded blobs don't care about 50% chance to not expand in space.
return if(istype(T, /turf/space) && prob(50))
return
if(!T) if(!T)
var/list/dirs = cardinal.Copy() var/list/dirs = cardinal.Copy()
for(var/i in 1 to 4) for(var/i in 1 to 4)

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)].") 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)].") 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)) 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 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 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. //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) 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") 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) 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) 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 roundstart blob.", 350) 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) 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) 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)) 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>") show_message("<span class='warning'>The blob attacks you!</span>")
var/dam_zone = pick(organs_by_name) var/dam_zone = pick(organs_by_name)
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone)) var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
//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(30,40)), BRUTE, affecting, run_armor_check(affecting, "melee")) 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() /mob/living/carbon/human/dissolvable()
if(species && species.anatomy_flags & ACID4WATER) if(species && species.anatomy_flags & ACID4WATER)

View File

@@ -750,14 +750,12 @@ var/list/beam_master = list()
/obj/item/projectile/beam/humanelaser/to_bump(atom/A as mob|obj|turf|area) /obj/item/projectile/beam/humanelaser/to_bump(atom/A as mob|obj|turf|area)
if(ishuman(A)) if(ishuman(A))
damage = 10 damage = 10
if(istype(A,/obj/effect/blob)) if(istype(A,/obj/effect/blob)) //It will deal half of its damage to a nearby blob tile on hit.
damage = 40
var/obj/effect/blob/B = A var/obj/effect/blob/B = A
var/splash_damage = damage/B.fire_resist - B.health var/actual_damage = damage/B.fire_resist //More resistant tiles such as strong blobs will cause less damage to be spread
if(splash_damage > 0) for(var/obj/effect/blob/B2 in orange(1,B))
for(var/obj/effect/B2 in orange(1,B)) B2.bullet_act(src, null, actual_damage)
B2.bullet_act(src, null, splash_damage) break
break
return ..() return ..()
/obj/item/projectile/beam/heavylaser /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 = 10
damage_type = BRUTE damage_type = BRUTE
pass_flags = PASSTABLE pass_flags = PASSTABLE
eyeblur = 0 eyeblur = 0