[MIRROR] Adds blob as a midround antag like midround traitors, where it does not require a ghost role (#6661)

* Adds blob as a midround antag like midround traitors, where it does not require a ghost role

* Update dynamic.json

Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
Co-authored-by: Gandalf <jzo123@hotmail.com>
This commit is contained in:
SkyratBot
2021-07-03 01:17:50 +01:00
committed by GitHub
co-authored by Watermelon914 Gandalf
parent bac6697cf0
commit bea8d72e71
8 changed files with 241 additions and 266 deletions
+7
View File
@@ -71,6 +71,13 @@ GLOBAL_LIST_INIT(heretic_start_knowledge,list(/datum/eldritch_knowledge/spell/ba
#define PATH_FLESH "Flesh"
#define PATH_VOID "Void"
/// Forces the blob to place the core where they currently are, ignoring any checks.
#define BLOB_FORCE_PLACEMENT -1
/// Normal blob placement, does the regular checks to make sure the blob isn't placing itself in an invalid location
#define BLOB_NORMAL_PLACEMENT 0
/// Selects a random location for the blob to be placed.
#define BLOB_RANDOM_PLACEMENT 1
#define CONSTRUCT_JUGGERNAUT "Juggernaut"
#define CONSTRUCT_WRAITH "Wraith"
#define CONSTRUCT_ARTIFICER "Artificer"
+1 -1
View File
@@ -49,7 +49,7 @@
if(isovermind(usr))
var/mob/camera/blob/B = usr
if(!B.placed)
B.place_blob_core(0)
B.place_blob_core(BLOB_NORMAL_PLACEMENT)
B.transport_core()
/atom/movable/screen/blob/blobbernaut
@@ -444,7 +444,7 @@
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 4
weight = 2
cost = 10
requirements = list(101,101,101,80,60,50,30,20,10,10)
repeatable = TRUE
@@ -453,6 +453,41 @@
var/body = applicant.become_overmind()
return body
/// Infects a random player, making them explode into a blob.
/datum/dynamic_ruleset/midround/blob_infection
name = "Blob Infection"
antag_datum = /datum/antagonist/blob
antag_flag = ROLE_BLOB
protected_roles = list("Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 2
cost = 10
requirements = list(101,101,101,80,60,50,30,20,10,10)
repeatable = TRUE
/datum/dynamic_ruleset/midround/blob_infection/trim_candidates()
..()
candidates = living_players
for(var/mob/living/player as anything in candidates)
var/turf/player_turf = get_turf(player)
if(!player_turf || !is_station_level(player_turf.z))
candidates -= player
continue
if(player.mind && (player.mind.special_role || length(player.mind.antag_datums) > 0))
candidates -= player
/datum/dynamic_ruleset/midround/blob_infection/execute()
if(!candidates || !candidates.len)
return FALSE
var/mob/living/carbon/human/blob_antag = pick_n_take(candidates)
assigned += blob_antag.mind
blob_antag.mind.special_role = antag_flag
return ..()
//////////////////////////////////////////////
// //
// XENOMORPH (GHOST) //
+52 -9
View File
@@ -19,13 +19,25 @@
return basic_report
/datum/antagonist/blob/greet()
to_chat(owner.current, span_notice("<font color=\"#EE4000\">You are the Blob!</font>"))
owner.announce_objectives()
if(!isovermind(owner.current))
to_chat(owner,span_userdanger("You feel bloated."))
to_chat(owner.current, span_notice("Use the pop ability to place your blob core! It is recommended you do this away from anyone else, as you'll be taking on the entire crew!"))
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/blobalert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)
/datum/antagonist/blob/on_gain()
create_objectives()
. = ..()
/datum/antagonist/blob/remove_innate_effects()
QDEL_NULL(pop_action)
return ..()
/datum/antagonist/blob/farewell()
to_chat(owner.current, "<span class='alertsyndie'><font color=\"#EE4000\">You are no longer the Blob!</font></span>")
return ..()
/datum/antagonist/blob/proc/create_objectives()
var/datum/objective/blob_takeover/main = new
main.owner = owner
@@ -47,20 +59,51 @@
icon_icon = 'icons/mob/blob.dmi'
button_icon_state = "blob"
/datum/action/innate/blobpop/Activate()
/// The time taken before this ability is automatically activated.
var/autoplace_time = OVERMIND_STARTING_AUTO_PLACE_TIME
/datum/action/innate/blobpop/Grant(Target)
. = ..()
if(owner)
addtimer(CALLBACK(src, .proc/Activate, TRUE), autoplace_time, TIMER_UNIQUE|TIMER_OVERRIDE)
to_chat(owner, "<span class='big'><font color=\"#EE4000\">You will automatically pop and place your blob core in [DisplayTimeText(autoplace_time)].</font></span>")
/datum/action/innate/blobpop/Activate(timer_activated = FALSE)
var/mob/living/old_body = owner
if(!owner)
return
var/datum/antagonist/blob/blobtag = owner.mind.has_antag_datum(/datum/antagonist/blob)
if(!blobtag)
Remove()
Remove(owner)
return
var/mob/camera/blob/B = new /mob/camera/blob(get_turf(old_body), blobtag.starting_points_human_blob)
owner.mind.transfer_to(B)
. = TRUE
var/turf/target_turf = get_turf(owner)
if(target_turf.density)
to_chat(owner, "<span class='warning'>This spot is too dense to place a blob core on!</span>")
. = FALSE
var/area/target_area = get_area(target_turf)
if(isspaceturf(target_turf) || !(target_area?.area_flags & BLOBS_ALLOWED) || !is_station_level(target_turf.z))
to_chat(owner, "<span class='warning'>You cannot place your core here!</span>")
. = FALSE
var/placement_override = BLOB_FORCE_PLACEMENT
if(!.)
if(!timer_activated)
return
placement_override = BLOB_RANDOM_PLACEMENT
to_chat(owner, "<span class='boldwarning'>Because your current location is an invalid starting spot and you need to pop, you've been moved to a random location!</span>")
var/mob/camera/blob/blob_cam = new /mob/camera/blob(get_turf(old_body), blobtag.starting_points_human_blob)
owner.mind.transfer_to(blob_cam)
old_body.gib()
B.place_blob_core(placement_override = TRUE, pop_override = TRUE)
blob_cam.place_blob_core(placement_override, pop_override = TRUE)
playsound(get_turf(blob_cam), 'sound/ambience/antag/blobalert.ogg', 50, FALSE)
/datum/antagonist/blob/antag_listing_status()
. = ..()
if(owner?.current)
var/mob/camera/blob/B = owner.current
if(istype(B))
. += "(Progress: [B.blobs_legit.len]/[B.blobwincount])"
var/mob/camera/blob/blob_cam = owner.current
if(istype(blob_cam))
. += "(Progress: [length(blob_cam.blobs_legit)]/[blob_cam.blobwincount])"
+1 -1
View File
@@ -114,7 +114,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
to_chat(src, span_big("<font color=\"#EE4000\">You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].</font>"))
manualplace_min_time = 0
if(autoplace_max_time && world.time >= autoplace_max_time)
place_blob_core(1)
place_blob_core(BLOB_RANDOM_PLACEMENT)
else
qdel(src)
else if(!victory_in_progress && (blobs_legit.len >= blobwincount))
+4 -4
View File
@@ -7,10 +7,10 @@
add_points(-cost)
return TRUE
/mob/camera/blob/proc/place_blob_core(placement_override, pop_override = FALSE)
if(placed && placement_override != -1)
/mob/camera/blob/proc/place_blob_core(placement_override = BLOB_NORMAL_PLACEMENT, pop_override = FALSE)
if(placed && placement_override != BLOB_FORCE_PLACEMENT)
return TRUE
if(!placement_override)
if(placement_override == BLOB_NORMAL_PLACEMENT)
if(!pop_override)
for(var/mob/living/M in range(7, src))
if(ROLE_BLOB in M.faction)
@@ -45,7 +45,7 @@
if(!pop_override && world.time <= manualplace_min_time && world.time <= autoplace_max_time)
to_chat(src, span_warning("It is too early to place your blob core!"))
return FALSE
else if(placement_override == 1)
else if(placement_override == BLOB_RANDOM_PLACEMENT)
var/turf/T = pick(GLOB.blobstart)
forceMove(T) //got overrided? you're somewhere random, motherfucker
if(placed && blob_core)
+140 -250
View File
@@ -1,252 +1,142 @@
{
"Dynamic": {
"threat_curve_centre": -3,
"threat_curve_width": 1.4,
"roundstart_split_curve_centre": 3,
"roundstart_split_curve_width": 1.2,
"midround_delay_min": 18000,
"midround_delay_max": 30000,
"latejoin_delay_min": 6000,
"latejoin_delay_max": 15000
},
"Roundstart": {
"Traitors": {
"antag_cap": {
"denominator": 40
},
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Blood Brothers": {
"weight": 0
},
"Changelings": {
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Heretics": {
"weight": 2,
"scaling_cost": 12,
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Wizard": {
"weight": 1,
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Blood Cult": {
"weight": 0
},
"Clockwork Cult": {
"weight": 0
},
"Nuclear Emergency": {
"weight": 0
},
"Revolution": {
"weight": 0
},
"Families": {
"weight": 0
}
},
"Midround": {
"Syndicate Sleeper Agent": {
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Family Head Aspirants": {
"weight": 0
},
"Nuclear Assault": {
"weight": 0
},
"Space Dragon": {
"weight": 1
},
"Blob": {
"weight": 1
},
"Spiders": {
"weight": 1
},
"Alien Infestation": {
"weight": 1
}
},
"Latejoin": {
"Syndicate Infiltrator": {
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Provocateur": {
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Heretic Smuggler": {
"protected_roles": [
"Prisoner",
"Vanguard Operative",
"Civil Disputes Officer",
"Security Medic",
"Security Sergeant",
"Security Officer",
"Corrections Officer",
"Warden",
"Detective",
"Head of Security",
"Blueshield",
"Head of Personnel",
"Quartermaster",
"Chief Engineer",
"Chief Medical Officer",
"Research Director",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
}
}
"Dynamic": {},
"Roundstart": {
"Traitors": {
"cost": 8,
"scaling_cost": 9,
"weight": 0,
"required_candidates": 1,
"minimum_required_age": 0,
"requirements": [
10,
10,
10,
10,
10,
10,
10,
10,
10,
10
],
"antag_cap": {
"denominator": 24
},
"protected_roles": [
"Prisoner",
"Security Officer",
"Warden",
"Detective",
"Head of Security",
"Captain"
],
"restricted_roles": [
"Cyborg"
]
},
"Blood Brothers": {
"weight": 0
},
"Changelings": {
"weight": 0
},
"Heretics": {
"weight": 0
},
"Wizard": {
"weight": 0
},
"Blood Cult": {
"weight": 0
},
"Nuclear Emergency": {
"weight": 0
},
"Revolution": {
"weight": 0
},
"Families": {
"weight": 0
}
},
"Midround": {
"Syndicate Sleeper Agent": {
"weight": 0
},
"Family Head Aspirants": {
"weight": 0
},
"Malfunctioning AI": {
"weight": 0
},
"Wizard": {
"weight": 0
},
"Nuclear Assault": {
"weight": 0
},
"Blob": {
"weight": 0
},
"Blob Infection": {
"weight": 0
},
"Alien Infestation": {
"weight": 0
},
"Nightmare": {
"weight": 0
},
"Space Dragon": {
"weight": 0
},
"Abductors": {
"weight": 0
},
"Swarmers": {
"weight": 0
},
"Space Ninja": {
"weight": 0
},
"Spiders": {
"weight": 0
}
},
"Latejoin": {
"Syndicate Infiltrator": {
"weight": 0
},
"Provocateur": {
"weight": 0
},
"Heretic Smuggler": {
"weight": 0
}
}
}
Binary file not shown.