mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-09 16:14:13 +00:00
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:
committed by
GitHub
parent
ba813b06bf
commit
e1d0253a3e
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// //
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user