mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-06 07:32:15 +00:00
Roundstart blob removal attempt 3 (#20403)
This commit is contained in:
@@ -11,7 +11,6 @@
|
|||||||
#define TARGET_INVALID_CHANGELING 10
|
#define TARGET_INVALID_CHANGELING 10
|
||||||
|
|
||||||
//gamemode istype helpers
|
//gamemode istype helpers
|
||||||
#define GAMEMODE_IS_BLOB (SSticker && istype(SSticker.mode, /datum/game_mode/blob))
|
|
||||||
#define GAMEMODE_IS_CULT (SSticker && istype(SSticker.mode, /datum/game_mode/cult))
|
#define GAMEMODE_IS_CULT (SSticker && istype(SSticker.mode, /datum/game_mode/cult))
|
||||||
#define GAMEMODE_IS_HEIST (SSticker && istype(SSticker.mode, /datum/game_mode/heist))
|
#define GAMEMODE_IS_HEIST (SSticker && istype(SSticker.mode, /datum/game_mode/heist))
|
||||||
#define GAMEMODE_IS_NUCLEAR (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear))
|
#define GAMEMODE_IS_NUCLEAR (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear))
|
||||||
|
|||||||
@@ -52,7 +52,7 @@
|
|||||||
//(in game days played) to play that role
|
//(in game days played) to play that role
|
||||||
GLOBAL_LIST_INIT(special_roles, list(
|
GLOBAL_LIST_INIT(special_roles, list(
|
||||||
ROLE_ABDUCTOR = /datum/game_mode/abduction, // Abductor
|
ROLE_ABDUCTOR = /datum/game_mode/abduction, // Abductor
|
||||||
ROLE_BLOB = /datum/game_mode/blob, // Blob
|
ROLE_BLOB, // Blob
|
||||||
ROLE_CHANGELING = /datum/game_mode/changeling, // Changeling
|
ROLE_CHANGELING = /datum/game_mode/changeling, // Changeling
|
||||||
ROLE_CULTIST = /datum/game_mode/cult, // Cultist
|
ROLE_CULTIST = /datum/game_mode/cult, // Cultist
|
||||||
ROLE_GSPIDER, // Giant spider
|
ROLE_GSPIDER, // Giant spider
|
||||||
|
|||||||
77
code/datums/station_state.dm
Normal file
77
code/datums/station_state.dm
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
// This used to be part of the blob gamemode files. Why.
|
||||||
|
/datum/station_state
|
||||||
|
/// Amount of floors
|
||||||
|
var/floor = 0
|
||||||
|
/// Amount of regular walls
|
||||||
|
var/wall = 0
|
||||||
|
/// Amount of reinforced walles
|
||||||
|
var/r_wall = 0
|
||||||
|
/// Amount of full windows
|
||||||
|
var/window = 0
|
||||||
|
/// Amount of airlocks
|
||||||
|
var/door = 0
|
||||||
|
/// Amount of grilles (without windows)
|
||||||
|
var/grille = 0
|
||||||
|
/// Amount of machines
|
||||||
|
var/mach = 0
|
||||||
|
|
||||||
|
/datum/station_state/proc/count()
|
||||||
|
var/watch = start_watch()
|
||||||
|
log_debug("Counting station atoms")
|
||||||
|
var/station_zlevel = level_name_to_num(MAIN_STATION)
|
||||||
|
for(var/turf/T in block(locate(1, 1, station_zlevel), locate(world.maxx, world.maxy, station_zlevel)))
|
||||||
|
|
||||||
|
if(istype(T, /turf/simulated/floor))
|
||||||
|
var/turf/simulated/floor/T2 = T
|
||||||
|
if(!(T2.burnt))
|
||||||
|
floor += 12
|
||||||
|
else
|
||||||
|
floor += 1
|
||||||
|
|
||||||
|
if(istype(T, /turf/simulated/wall))
|
||||||
|
var/turf/simulated/wall/W = T
|
||||||
|
if(W.intact)
|
||||||
|
wall += 2
|
||||||
|
else
|
||||||
|
wall += 1
|
||||||
|
|
||||||
|
if(istype(T, /turf/simulated/wall/r_wall))
|
||||||
|
var/turf/simulated/wall/r_wall/R = T
|
||||||
|
if(R.intact)
|
||||||
|
r_wall += 2
|
||||||
|
else
|
||||||
|
r_wall += 1
|
||||||
|
|
||||||
|
|
||||||
|
for(var/obj/O in T.contents)
|
||||||
|
if(istype(O, /obj/structure/window))
|
||||||
|
window += 1
|
||||||
|
|
||||||
|
else if(istype(O, /obj/structure/grille))
|
||||||
|
var/obj/structure/grille/GR = O
|
||||||
|
if(!GR.broken)
|
||||||
|
grille += 1
|
||||||
|
|
||||||
|
else if(istype(O, /obj/machinery/door))
|
||||||
|
door += 1
|
||||||
|
|
||||||
|
else if(istype(O, /obj/machinery))
|
||||||
|
mach += 1
|
||||||
|
|
||||||
|
log_debug("Counted station atoms in [stop_watch(watch)]s")
|
||||||
|
|
||||||
|
/datum/station_state/proc/score(datum/station_state/result)
|
||||||
|
if(!result)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/output = 0
|
||||||
|
|
||||||
|
output += (result.floor / max(floor, 1))
|
||||||
|
output += (result.r_wall/ max(r_wall, 1))
|
||||||
|
output += (result.wall / max(wall, 1))
|
||||||
|
output += (result.window / max(window, 1))
|
||||||
|
output += (result.door / max(door, 1))
|
||||||
|
output += (result.grille / max(grille, 1))
|
||||||
|
output += (result.mach / max(mach, 1))
|
||||||
|
|
||||||
|
return (output/7)
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/datum/game_mode/blob/check_finished()
|
|
||||||
if(infected_crew.len > burst)//Some blobs have yet to burst
|
|
||||||
return 0
|
|
||||||
if(blobwincount <= GLOB.blobs.len)//Blob took over
|
|
||||||
return 1
|
|
||||||
if(!GLOB.blob_cores.len) // blob is dead
|
|
||||||
return 1
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode/blob/declare_completion()
|
|
||||||
if(blobwincount <= GLOB.blobs.len)
|
|
||||||
SSticker.mode_result = "blob win - blob took over"
|
|
||||||
to_chat(world, "<FONT size = 3><B>The blob has taken over the station!</B></FONT>")
|
|
||||||
to_chat(world, "<B>The entire station was eaten by the Blob</B>")
|
|
||||||
log_game("Blob mode completed with a blob victory.")
|
|
||||||
|
|
||||||
else if(station_was_nuked)
|
|
||||||
SSticker.mode_result = "blob halfwin - nuke"
|
|
||||||
to_chat(world, "<FONT size = 3><B>Partial Win: The station has been destroyed!</B></FONT>")
|
|
||||||
to_chat(world, "<B>Directive 7-12 has been successfully carried out preventing the Blob from spreading.</B>")
|
|
||||||
log_game("Blob mode completed with a tie (station destroyed).")
|
|
||||||
|
|
||||||
else if(!GLOB.blob_cores.len)
|
|
||||||
SSticker.mode_result = "blob loss - blob eliminated"
|
|
||||||
to_chat(world, "<FONT size = 3><B>The staff has won!</B></FONT>")
|
|
||||||
to_chat(world, "<B>The alien organism has been eradicated from the station</B>")
|
|
||||||
log_game("Blob mode completed with a crew victory.")
|
|
||||||
..()
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/game_mode/proc/auto_declare_completion_blob()
|
|
||||||
if(GAMEMODE_IS_BLOB)
|
|
||||||
var/datum/game_mode/blob/blob_mode = src
|
|
||||||
if(blob_mode.infected_crew.len)
|
|
||||||
var/text = "<FONT size = 2><B>The blob[(blob_mode.infected_crew.len > 1 ? "s were" : " was")]:</B></FONT>"
|
|
||||||
|
|
||||||
for(var/datum/mind/blob in blob_mode.infected_crew)
|
|
||||||
var/blob_ckey = blob.get_display_key()
|
|
||||||
text += "<br><b>[blob_ckey]</b> was <b>[blob.name]</b>"
|
|
||||||
to_chat(world, text)
|
|
||||||
return 1
|
|
||||||
@@ -1,190 +0,0 @@
|
|||||||
//Few global vars to track the blob
|
|
||||||
GLOBAL_LIST_EMPTY(blobs)
|
|
||||||
GLOBAL_LIST_EMPTY(blob_cores)
|
|
||||||
GLOBAL_LIST_EMPTY(blob_nodes)
|
|
||||||
|
|
||||||
/datum/game_mode
|
|
||||||
var/list/blob_overminds = list()
|
|
||||||
|
|
||||||
/datum/game_mode/blob
|
|
||||||
name = "blob"
|
|
||||||
config_tag = "blob"
|
|
||||||
|
|
||||||
required_players = 30
|
|
||||||
required_enemies = 1
|
|
||||||
recommended_enemies = 1
|
|
||||||
restricted_jobs = list("Cyborg", "AI")
|
|
||||||
|
|
||||||
var/burst = 0
|
|
||||||
|
|
||||||
var/cores_to_spawn = 1
|
|
||||||
var/players_per_core = 30
|
|
||||||
var/blob_point_rate = 3
|
|
||||||
|
|
||||||
var/blobwincount = 350
|
|
||||||
|
|
||||||
/// Lower bound on time before messages, bursts and intercepts happen
|
|
||||||
var/const/wait_time_low = 60 SECONDS
|
|
||||||
/// Upper bound on time before messages, bursts and intercepts happen
|
|
||||||
var/const/wait_time_high = 180 SECONDS
|
|
||||||
|
|
||||||
var/list/infected_crew = list()
|
|
||||||
|
|
||||||
/datum/game_mode/blob/pre_setup()
|
|
||||||
|
|
||||||
var/list/possible_blobs = get_players_for_role(ROLE_BLOB)
|
|
||||||
|
|
||||||
// stop setup if no possible traitors
|
|
||||||
if(!possible_blobs.len)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
cores_to_spawn = max(round(num_players()/players_per_core, 1), 1)
|
|
||||||
|
|
||||||
blobwincount = initial(blobwincount) * cores_to_spawn
|
|
||||||
|
|
||||||
|
|
||||||
for(var/j = 0, j < cores_to_spawn, j++)
|
|
||||||
if(!possible_blobs.len)
|
|
||||||
break
|
|
||||||
|
|
||||||
var/datum/mind/blob = pick(possible_blobs)
|
|
||||||
infected_crew += blob
|
|
||||||
blob.special_role = SPECIAL_ROLE_BLOB
|
|
||||||
blob.restricted_roles = restricted_jobs
|
|
||||||
log_game("[key_name(blob)] has been selected as a Blob")
|
|
||||||
possible_blobs -= blob
|
|
||||||
|
|
||||||
if(!infected_crew.len)
|
|
||||||
return 0
|
|
||||||
..()
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/get_blob_candidates()
|
|
||||||
var/list/candidates = list()
|
|
||||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
|
||||||
if(!player.stat && player.mind && !player.client.skip_antag && !player.mind.special_role && !jobban_isbanned(player, ROLE_SYNDICATE) && (ROLE_BLOB in player.client.prefs.be_special))
|
|
||||||
candidates += player
|
|
||||||
return candidates
|
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/blobize(mob/living/carbon/human/blob)
|
|
||||||
var/datum/mind/blobmind = blob.mind
|
|
||||||
if(!istype(blobmind))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
infected_crew += blobmind
|
|
||||||
blobmind.special_role = SPECIAL_ROLE_BLOB
|
|
||||||
update_blob_icons_added(blobmind)
|
|
||||||
|
|
||||||
log_game("[key_name(blob)] has been selected as a Blob")
|
|
||||||
greet_blob(blobmind)
|
|
||||||
to_chat(blob, "<span class='userdanger'>You feel very tired and bloated! You don't have long before you burst!</span>")
|
|
||||||
blob.apply_status_effect(STATUS_EFFECT_BLOB_BURST, 60 SECONDS, CALLBACK(src, PROC_REF(burst_blob)))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/make_blobs(count)
|
|
||||||
var/list/candidates = get_blob_candidates()
|
|
||||||
var/mob/living/carbon/human/blob = null
|
|
||||||
count=min(count, candidates.len)
|
|
||||||
for(var/i = 0, i < count, i++)
|
|
||||||
blob = pick(candidates)
|
|
||||||
candidates -= blob
|
|
||||||
blobize(blob)
|
|
||||||
return count
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode/blob/announce()
|
|
||||||
to_chat(world, "<B>The current game mode is - <font color='green'>Blob</font>!</B>")
|
|
||||||
to_chat(world, "<B>A dangerous alien organism is rapidly spreading throughout the station!</B>")
|
|
||||||
to_chat(world, "You must kill it all while minimizing the damage to the station.")
|
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/greet_blob(datum/mind/blob)
|
|
||||||
to_chat(blob.current, "<span class='userdanger'>You are infected by the Blob!</span>")
|
|
||||||
to_chat(blob.current, "<b>Your body is ready to give spawn to a new blob core which will eat this station.</b>")
|
|
||||||
to_chat(blob.current, "<b>Find a good location to spawn the core and then take control and overwhelm the station!</b>")
|
|
||||||
to_chat(blob.current, "<b>When you have found a location, wait until you spawn; this will happen automatically and you cannot speed up the process.</b>")
|
|
||||||
to_chat(blob.current, "<b>If you go outside of the station level, or in space, then you will die; make sure your location has lots of ground to cover.</b>")
|
|
||||||
to_chat(blob.current, "<span class='motd'>For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Blob)</span>")
|
|
||||||
SEND_SOUND(blob.current, sound('sound/magic/mutate.ogg'))
|
|
||||||
blob.current.create_log(MISC_LOG, "[blob.current] was made into a blob")
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/show_message(message)
|
|
||||||
for(var/datum/mind/blob in infected_crew)
|
|
||||||
to_chat(blob.current, message)
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/burst_blobs()
|
|
||||||
for(var/datum/mind/blob in infected_crew)
|
|
||||||
burst_blob(blob)
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/burst_blob(datum/mind/blob, warned=0)
|
|
||||||
var/client/blob_client = null
|
|
||||||
var/turf/location = null
|
|
||||||
|
|
||||||
if(iscarbon(blob.current))
|
|
||||||
var/mob/living/carbon/C = blob.current
|
|
||||||
if(GLOB.directory[ckey(blob.key)])
|
|
||||||
blob_client = GLOB.directory[ckey(blob.key)]
|
|
||||||
location = get_turf(C)
|
|
||||||
if(!is_station_level(location.z) || isspaceturf(location))
|
|
||||||
if(!warned)
|
|
||||||
to_chat(C, "<span class='userdanger'>You feel ready to burst, but this isn't an appropriate place! You must return to the station!</span>")
|
|
||||||
message_admins("[key_name_admin(C)] was in space when the blobs burst, and will die if [C.p_they()] [C.p_do()] not return to the station.")
|
|
||||||
addtimer(CALLBACK(src, PROC_REF(burst_blob), blob, 1), 30 SECONDS)
|
|
||||||
else
|
|
||||||
burst++
|
|
||||||
log_admin("[key_name(C)] was in space when attempting to burst as a blob.")
|
|
||||||
message_admins("[key_name_admin(C)] was in space when attempting to burst as a blob.")
|
|
||||||
C.gib()
|
|
||||||
make_blobs(1)
|
|
||||||
check_finished() //Still needed in case we can't make any blobs
|
|
||||||
|
|
||||||
else if(blob_client && location)
|
|
||||||
burst++
|
|
||||||
C.gib()
|
|
||||||
var/obj/structure/blob/core/core = new(location, blob_client, blob_point_rate)
|
|
||||||
if(core.overmind && core.overmind.mind)
|
|
||||||
core.overmind.mind.name = blob.name
|
|
||||||
infected_crew -= blob
|
|
||||||
infected_crew += core.overmind.mind
|
|
||||||
core.overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND
|
|
||||||
|
|
||||||
/datum/game_mode/blob/post_setup()
|
|
||||||
|
|
||||||
var/wait_time = rand(wait_time_low, wait_time_high)
|
|
||||||
for(var/datum/mind/blob in infected_crew)
|
|
||||||
greet_blob(blob)
|
|
||||||
update_blob_icons_added(blob)
|
|
||||||
blob.current.apply_status_effect(STATUS_EFFECT_BLOB_BURST, wait_time * 2.5, CALLBACK(src, PROC_REF(burst_blob), blob))
|
|
||||||
|
|
||||||
if(SSshuttle)
|
|
||||||
SSshuttle.emergencyNoEscape = TRUE
|
|
||||||
|
|
||||||
addtimer(CALLBACK(src, PROC_REF(show_message), "<span class='userdanger'>You feel tired and bloated.</span>"), wait_time)
|
|
||||||
addtimer(CALLBACK(src, PROC_REF(show_message), "<span class='userdanger'>You feel like you are about to burst.</span>"), wait_time * 2)
|
|
||||||
|
|
||||||
// Stage 1
|
|
||||||
addtimer(CALLBACK(src, PROC_REF(stage), 1), (wait_time * 4.5))
|
|
||||||
|
|
||||||
// Stage 2
|
|
||||||
addtimer(CALLBACK(src, PROC_REF(stage), 2), 50 MINUTES + wait_time * 2)
|
|
||||||
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
/datum/game_mode/blob/proc/stage(stage)
|
|
||||||
switch(stage)
|
|
||||||
if(1)
|
|
||||||
GLOB.major_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
|
|
||||||
if(2)
|
|
||||||
send_intercept(1)
|
|
||||||
|
|
||||||
/datum/game_mode/proc/update_blob_icons_added(datum/mind/mob_mind)
|
|
||||||
var/datum/atom_hud/antag/antaghud = GLOB.huds[ANTAG_HUD_BLOB]
|
|
||||||
antaghud.join_hud(mob_mind.current)
|
|
||||||
set_antag_hud(mob_mind.current, "hudblob")
|
|
||||||
|
|
||||||
/datum/game_mode/proc/update_blob_icons_removed(datum/mind/mob_mind)
|
|
||||||
var/datum/atom_hud/antag/antaghud = GLOB.huds[ANTAG_HUD_BLOB]
|
|
||||||
antaghud.leave_hud(mob_mind.current)
|
|
||||||
set_antag_hud(mob_mind.current, null)
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
/datum/game_mode/blob/proc/send_intercept(report = 1)
|
|
||||||
var/intercepttext = ""
|
|
||||||
var/interceptname = ""
|
|
||||||
switch(report)
|
|
||||||
if(0)
|
|
||||||
return
|
|
||||||
if(1)
|
|
||||||
var/nukecode = rand(10000, 99999)
|
|
||||||
for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines)
|
|
||||||
if(bomb && bomb.r_code)
|
|
||||||
if(is_station_level(bomb.z))
|
|
||||||
bomb.r_code = nukecode
|
|
||||||
message_admins("50 minutes have passed since the first blob has burst, the station is automatically receiving nuclear codes and an order to detonate the station. Codes are: [nukecode].")
|
|
||||||
log_admin("50 minutes have passed since the first blob has burst, the station is automatically receiving nuclear codes and an order to detonate the station. Codes are: [nukecode].")
|
|
||||||
|
|
||||||
interceptname = "Classified NAS Trurl Update"
|
|
||||||
intercepttext += "<FONT size = 3><B>Nanotrasen Update</B>: Biohazard Alert.</FONT><HR>"
|
|
||||||
intercepttext += "Directive 7-12 has been issued for [station_name()].<BR>"
|
|
||||||
intercepttext += "The biohazard has grown out of control and will soon reach critical mass.<BR>"
|
|
||||||
intercepttext += "Your orders are as follows:<BR>"
|
|
||||||
intercepttext += "1. Secure the Nuclear Authentication Disk.<BR>"
|
|
||||||
intercepttext += "2. Detonate the Nuke located in the Station's Vault.<BR>"
|
|
||||||
intercepttext += "Nuclear Authentication Code: [nukecode] <BR>"
|
|
||||||
intercepttext += "Message ends."
|
|
||||||
|
|
||||||
for(var/mob/living/silicon/ai/aiPlayer in GLOB.player_list)
|
|
||||||
if(aiPlayer.client)
|
|
||||||
var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. The nuclear failsafe must be activated at any cost, the code is: [nukecode]."
|
|
||||||
aiPlayer.set_zeroth_law(law)
|
|
||||||
to_chat(aiPlayer, "Laws Updated: [law]")
|
|
||||||
message_admins("The station AI has received a new law zero due to a blob round continuing for over 50 minutes after initial burst. Zero Law: [law]")
|
|
||||||
log_admin("The station AI has received a new law zero due to a blob round continuing for over 50 minutes after initial burst. Zero Law: [law]")
|
|
||||||
|
|
||||||
print_command_report(intercepttext, interceptname, FALSE)
|
|
||||||
GLOB.minor_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg', new_subtitle = "NAS Trurl Update")
|
|
||||||
|
|
||||||
/datum/station_state
|
|
||||||
var/floor = 0
|
|
||||||
var/wall = 0
|
|
||||||
var/r_wall = 0
|
|
||||||
var/window = 0
|
|
||||||
var/door = 0
|
|
||||||
var/grille = 0
|
|
||||||
var/mach = 0
|
|
||||||
|
|
||||||
|
|
||||||
/datum/station_state/proc/count()
|
|
||||||
var/station_zlevel = level_name_to_num(MAIN_STATION)
|
|
||||||
for(var/turf/T in block(locate(1, 1, station_zlevel), locate(world.maxx, world.maxy, station_zlevel)))
|
|
||||||
|
|
||||||
if(isfloorturf(T))
|
|
||||||
if(!(T:burnt))
|
|
||||||
src.floor += 12
|
|
||||||
else
|
|
||||||
src.floor += 1
|
|
||||||
|
|
||||||
if(iswallturf(T))
|
|
||||||
var/turf/simulated/wall/W = T
|
|
||||||
if(W.intact)
|
|
||||||
src.wall += 2
|
|
||||||
else
|
|
||||||
src.wall += 1
|
|
||||||
|
|
||||||
if(isreinforcedwallturf(T))
|
|
||||||
var/turf/simulated/wall/r_wall/R = T
|
|
||||||
if(R.intact)
|
|
||||||
src.r_wall += 2
|
|
||||||
else
|
|
||||||
src.r_wall += 1
|
|
||||||
|
|
||||||
|
|
||||||
for(var/obj/O in T.contents)
|
|
||||||
if(istype(O, /obj/structure/window))
|
|
||||||
src.window += 1
|
|
||||||
else if(istype(O, /obj/structure/grille))
|
|
||||||
var/obj/structure/grille/GR = O
|
|
||||||
if(!GR.broken)
|
|
||||||
grille += 1
|
|
||||||
else if(istype(O, /obj/machinery/door))
|
|
||||||
src.door += 1
|
|
||||||
else if(ismachinery(O))
|
|
||||||
src.mach += 1
|
|
||||||
|
|
||||||
/datum/station_state/proc/score(datum/station_state/result)
|
|
||||||
if(!result) return 0
|
|
||||||
var/output = 0
|
|
||||||
output += (result.floor / max(floor,1))
|
|
||||||
output += (result.r_wall/ max(r_wall,1))
|
|
||||||
output += (result.wall / max(wall,1))
|
|
||||||
output += (result.window / max(window,1))
|
|
||||||
output += (result.door / max(door,1))
|
|
||||||
output += (result.grille / max(grille,1))
|
|
||||||
output += (result.mach / max(mach,1))
|
|
||||||
return (output/7)
|
|
||||||
@@ -40,6 +40,7 @@
|
|||||||
var/list/player_draft_log = list()
|
var/list/player_draft_log = list()
|
||||||
var/list/datum/mind/xenos = list()
|
var/list/datum/mind/xenos = list()
|
||||||
var/list/datum/mind/eventmiscs = list()
|
var/list/datum/mind/eventmiscs = list()
|
||||||
|
var/list/blob_overminds = list()
|
||||||
|
|
||||||
var/list/datum/station_goal/station_goals = list() // A list of all station goals for this game mode
|
var/list/datum/station_goal/station_goals = list() // A list of all station goals for this game mode
|
||||||
|
|
||||||
|
|||||||
@@ -412,22 +412,10 @@
|
|||||||
dat += "<tr><td><i>Head not found!</i></td></tr>"
|
dat += "<tr><td><i>Head not found!</i></td></tr>"
|
||||||
dat += "</table>"
|
dat += "</table>"
|
||||||
|
|
||||||
if(GAMEMODE_IS_BLOB)
|
|
||||||
var/datum/game_mode/blob/mode = SSticker.mode
|
|
||||||
dat += "<br><table cellspacing=5><tr><td><B>Blob</B></td><td></td><td></td></tr>"
|
|
||||||
dat += "<tr><td><i>Progress: [GLOB.blobs.len]/[mode.blobwincount]</i></td></tr>"
|
|
||||||
|
|
||||||
for(var/datum/mind/blob in mode.infected_crew)
|
|
||||||
var/mob/M = blob.current
|
|
||||||
if(M)
|
|
||||||
dat += "<tr><td>[ADMIN_PP(M,"[M.real_name]")][M.client ? "" : " <i>(ghost)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
|
|
||||||
dat += "<td><A href='?priv_msg=[M.client?.ckey]'>PM</A> [ADMIN_FLW(M, "FLW")]</td>"
|
|
||||||
else
|
|
||||||
dat += "<tr><td><i>Blob not found!</i></td></tr>"
|
|
||||||
dat += "</table>"
|
|
||||||
|
|
||||||
if(SSticker.mode.blob_overminds.len)
|
if(SSticker.mode.blob_overminds.len)
|
||||||
dat += check_role_table("Blob Overminds", SSticker.mode.blob_overminds)
|
dat += check_role_table("Blob Overminds", SSticker.mode.blob_overminds)
|
||||||
|
dat += "<i>Blob Tiles: [length(GLOB.blobs)]</i>"
|
||||||
|
|
||||||
if(SSticker.mode.changelings.len)
|
if(SSticker.mode.changelings.len)
|
||||||
dat += check_role_table("Changelings", SSticker.mode.changelings)
|
dat += check_role_table("Changelings", SSticker.mode.changelings)
|
||||||
|
|||||||
@@ -399,10 +399,6 @@
|
|||||||
new /obj/structure/blob/core(get_turf(N), null, blob_core.point_rate, TRUE)
|
new /obj/structure/blob/core(get_turf(N), null, blob_core.point_rate, TRUE)
|
||||||
qdel(N)
|
qdel(N)
|
||||||
|
|
||||||
if(SSticker && SSticker.mode.name == "blob")
|
|
||||||
var/datum/game_mode/blob/BL = SSticker.mode
|
|
||||||
BL.blobwincount += initial(BL.blobwincount)
|
|
||||||
|
|
||||||
/mob/camera/blob/verb/blob_broadcast()
|
/mob/camera/blob/verb/blob_broadcast()
|
||||||
set category = "Blob"
|
set category = "Blob"
|
||||||
set name = "Blob Broadcast"
|
set name = "Blob Broadcast"
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
//I will need to recode parts of this but I am way too tired atm
|
//I will need to recode parts of this but I am way too tired atm
|
||||||
|
|
||||||
|
GLOBAL_LIST_EMPTY(blobs)
|
||||||
|
GLOBAL_LIST_EMPTY(blob_cores)
|
||||||
|
GLOBAL_LIST_EMPTY(blob_nodes)
|
||||||
|
|
||||||
/obj/structure/blob
|
/obj/structure/blob
|
||||||
name = "blob"
|
name = "blob"
|
||||||
icon = 'icons/mob/blob.dmi'
|
icon = 'icons/mob/blob.dmi'
|
||||||
@@ -26,10 +26,14 @@
|
|||||||
var/mob/M = pick(candidates)
|
var/mob/M = pick(candidates)
|
||||||
B.key = M.key
|
B.key = M.key
|
||||||
B.mind.special_role = SPECIAL_ROLE_BLOB
|
B.mind.special_role = SPECIAL_ROLE_BLOB
|
||||||
SSticker.mode.update_blob_icons_added(B.mind)
|
|
||||||
B.forceMove(vent)
|
B.forceMove(vent)
|
||||||
B.add_ventcrawl(vent)
|
B.add_ventcrawl(vent)
|
||||||
|
|
||||||
|
// Mark it on antag HUD
|
||||||
|
var/datum/atom_hud/antag/antaghud = GLOB.huds[ANTAG_HUD_BLOB]
|
||||||
|
antaghud.join_hud(B.mind.current)
|
||||||
|
set_antag_hud(B.mind.current, "hudblob")
|
||||||
|
|
||||||
to_chat(B, "<span class='userdanger'>You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.</span>")
|
to_chat(B, "<span class='userdanger'>You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.</span>")
|
||||||
to_chat(B, "<span class='motd'>For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Blob)</span>")
|
to_chat(B, "<span class='motd'>For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Blob)</span>")
|
||||||
notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, action = NOTIFY_FOLLOW)
|
notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, action = NOTIFY_FOLLOW)
|
||||||
|
|||||||
@@ -230,7 +230,6 @@ antag_account_age_restrictions = false
|
|||||||
# Gamemode probabilities map for if you are using secret or random
|
# Gamemode probabilities map for if you are using secret or random
|
||||||
gamemode_probabilities = [
|
gamemode_probabilities = [
|
||||||
{gamemode = "abduction", probability = 0},
|
{gamemode = "abduction", probability = 0},
|
||||||
{gamemode = "blob", probability = 1},
|
|
||||||
{gamemode = "changeling", probability = 3},
|
{gamemode = "changeling", probability = 3},
|
||||||
{gamemode = "cult", probability = 3},
|
{gamemode = "cult", probability = 3},
|
||||||
{gamemode = "extend-a-traitormongous", probability = 2}, # Autotraitor
|
{gamemode = "extend-a-traitormongous", probability = 2}, # Autotraitor
|
||||||
|
|||||||
26
paradise.dme
26
paradise.dme
@@ -341,6 +341,7 @@
|
|||||||
#include "code\datums\spawners_menu.dm"
|
#include "code\datums\spawners_menu.dm"
|
||||||
#include "code\datums\spell.dm"
|
#include "code\datums\spell.dm"
|
||||||
#include "code\datums\statclick.dm"
|
#include "code\datums\statclick.dm"
|
||||||
|
#include "code\datums\station_state.dm"
|
||||||
#include "code\datums\tgs_event_handler.dm"
|
#include "code\datums\tgs_event_handler.dm"
|
||||||
#include "code\datums\uplink_item.dm"
|
#include "code\datums\uplink_item.dm"
|
||||||
#include "code\datums\verb_callbacks.dm"
|
#include "code\datums\verb_callbacks.dm"
|
||||||
@@ -595,20 +596,6 @@
|
|||||||
#include "code\game\gamemodes\setupgame.dm"
|
#include "code\game\gamemodes\setupgame.dm"
|
||||||
#include "code\game\gamemodes\steal_items.dm"
|
#include "code\game\gamemodes\steal_items.dm"
|
||||||
#include "code\game\gamemodes\autotraitor\autotraitor.dm"
|
#include "code\game\gamemodes\autotraitor\autotraitor.dm"
|
||||||
#include "code\game\gamemodes\blob\blob_finish.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blob_mode.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blob_powers.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blob_report.dm"
|
|
||||||
#include "code\game\gamemodes\blob\overmind.dm"
|
|
||||||
#include "code\game\gamemodes\blob\theblob.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\blob_core.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\blob_mobs.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\captured_nuke.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\factory.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\node.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\resource.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\shield.dm"
|
|
||||||
#include "code\game\gamemodes\blob\blobs\storage_blob.dm"
|
|
||||||
#include "code\game\gamemodes\changeling\changeling.dm"
|
#include "code\game\gamemodes\changeling\changeling.dm"
|
||||||
#include "code\game\gamemodes\changeling\traitor_chan.dm"
|
#include "code\game\gamemodes\changeling\traitor_chan.dm"
|
||||||
#include "code\game\gamemodes\cult\blood_magic.dm"
|
#include "code\game\gamemodes\cult\blood_magic.dm"
|
||||||
@@ -1654,6 +1641,17 @@
|
|||||||
#include "code\modules\events\vent_clog.dm"
|
#include "code\modules\events\vent_clog.dm"
|
||||||
#include "code\modules\events\wallrot.dm"
|
#include "code\modules\events\wallrot.dm"
|
||||||
#include "code\modules\events\wormholes.dm"
|
#include "code\modules\events\wormholes.dm"
|
||||||
|
#include "code\modules\events\blob\blob_mobs.dm"
|
||||||
|
#include "code\modules\events\blob\blob_powers.dm"
|
||||||
|
#include "code\modules\events\blob\overmind.dm"
|
||||||
|
#include "code\modules\events\blob\theblob.dm"
|
||||||
|
#include "code\modules\events\blob\blob_structures\blob_core.dm"
|
||||||
|
#include "code\modules\events\blob\blob_structures\captured_nuke.dm"
|
||||||
|
#include "code\modules\events\blob\blob_structures\factory.dm"
|
||||||
|
#include "code\modules\events\blob\blob_structures\node.dm"
|
||||||
|
#include "code\modules\events\blob\blob_structures\resource.dm"
|
||||||
|
#include "code\modules\events\blob\blob_structures\shield.dm"
|
||||||
|
#include "code\modules\events\blob\blob_structures\storage_blob.dm"
|
||||||
#include "code\modules\events\wizard\ghost_wizard_spells.dm"
|
#include "code\modules\events\wizard\ghost_wizard_spells.dm"
|
||||||
#include "code\modules\fish\fish_eggs.dm"
|
#include "code\modules\fish\fish_eggs.dm"
|
||||||
#include "code\modules\fish\fish_items.dm"
|
#include "code\modules\fish\fish_items.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user