Moves nukeop and rev score info to their respective factions on board (#36231)

* Moves nukeop and rev score info to their respective factions on board

* cleanup of commented code

* tracks where the boom happened just in case

* makes the all arrested vars more accurate

* makes this total show up right now

* more accurate arrest check

* cells are here!

* excessive

---------

Co-authored-by: SECBATON-GRIFFON <>
This commit is contained in:
SECBATON GRIFFON
2024-03-27 08:43:01 +00:00
committed by GitHub
parent 502c8a081f
commit 7dca62d28e
7 changed files with 138 additions and 186 deletions

View File

@@ -33,6 +33,8 @@ var/list/factions_with_hud_icons = list()
var/required_pref = ""
var/list/restricted_species = list()
var/list/members = list()
var/peak_member_amount = 0
var/role_peak_member_typefilter
var/max_roles = 0
var/accept_latejoiners = FALSE
var/datum/objective_holder/objective_holder
@@ -287,8 +289,13 @@ var/list/factions_with_hud_icons = list()
return dat
/datum/faction/proc/process()
var/total
for (var/datum/role/R in members)
R.process()
if(!role_peak_member_typefilter || istype(R,role_peak_member_typefilter))
total++
if(total > peak_member_amount)
peak_member_amount = total
/datum/faction/proc/stage(var/value)
stage = value

View File

@@ -26,6 +26,87 @@
. += "<BR>The operatives bought:<BR>"
for(var/entry in faction_scoreboard_data)
. += "[entry]<BR>"
var/diskdat = null
var/bombdat = null
var/opkilled = 0
var/oparrested = 0
var/alloparrested = 0
//var/nukedpenalty = 1000
for(var/datum/role/R in members)
var/datum/mind/M = R.antag
if(!M || !M.current)
opkilled++
continue
var/turf/T = M.current.loc
if(T && (istype(T.loc, /area/security/brig) || istype(T.loc, /area/security/perma) || istype(T, /turf/simulated/floor/shuttle/brig)))
oparrested++
else if(M.current.stat == DEAD)
opkilled++
if(peak_member_amount == oparrested)
alloparrested = 1
score.crewscore += oparrested * 2000
score.crewscore += opkilled * 250
score.crewscore += oparrested * 1000
//if(score.scores["nuked"])
//score.crewscore -= nukedpenalty
if(nukedisk)
var/atom/disk_loc = nukedisk.loc
while(!istype(disk_loc, /turf))
if(istype(disk_loc, /mob))
var/mob/M = disk_loc
diskdat += "Carried by [M.real_name] "
if(istype(disk_loc, /obj))
var/obj/O = disk_loc
diskdat += "in \a [O.name] "
disk_loc = disk_loc.loc
diskdat += "in [disk_loc.loc]"
/*score.scores["disc"] = 1
if(istype(disk_loc,/mob/living/carbon))
var/area/bad_zone1 = locate(/area) in areas
if(location in bad_zone1)
score.scores["disc"] = 0
if(istype(get_area(nukedisc),/area/syndicate_mothership))
score.scores["disc"] = 0
if(istype(get_area(nukedisc),/area/wizard_station))
score.scores["disc"] = 0
if(nukedisk.loc.z != map.zMainStation)
score.scores["disc"] = 0*/
bombdat = nuked_area
if(!nuked_area)
for(var/obj/machinery/nuclearbomb/nuke in nuclear_bombs)
if(nuke.r_code == "LOLNO")
continue
bombdat = get_area(nuke)
/*nukedpenalty = 50000 //Congratulations, your score was nuked
var/turf/T = get_turf(nuke)
if(istype(T,/area/syndicate_mothership) || istype(T,/area/wizard_station) || istype(T,/area/solar/) || istype(T,/area))
nukedpenalty = 1000
else if (istype(T,/area/security/main) || istype(T,/area/security/brig) || istype(T,/area/security/armory) || istype(T,/area/security/checkpoint2))
nukedpenalty = 50000
else if (istype(T,/area/engine))
nukedpenalty = 100000
else
nukedpenalty = 5000*/
//break
if(!diskdat)
diskdat = "Unknown"
log_admin("The disk could not be found for the nuke ops scoreboard! Report this")
message_admins("The disk could not be found for the nuke ops scoreboard! Report this")
if(!bombdat)
bombdat = "Unknown"
log_admin("The nuke could not be found for the nuke ops scoreboard! Report this")
message_admins("The nuke could not be found for the nuke ops scoreboard! Report this")
. += {"<BR>
<B>Final Location of Nuke:</B> [bombdat]<BR>
<B>Final Location of Disk:</B> [diskdat]<BR>
<B>Operatives Arrested:</B> [oparrested] ([oparrested * 1000] Points)<BR>
<B>Operatives Killed:</B> [opkilled] ([opkilled * 250] Points)<BR>
<B>All Operatives Arrested:</B> [alloparrested ? "Yes" : "No"] ([oparrested * 2000] Points)<BR>"}
// <B>Station Destroyed:</B> [score.scores["nuked"] ? "Yes" : "No"] (-[nukedpenalty] Points)<BR>
// <B>Nuclear Disk Secure:</B> [score.scores["disc"] ? "Yes" : "No"] ([score.scores["disc"] * 500] Points)<BR>
/datum/faction/syndicate/nuke_op/AdminPanelEntry()
var/list/dat = ..()
@@ -142,3 +223,5 @@
livingmembers++
if(!livingmembers && ticker.IsThematic(playlist))
ticker.StopThematic()
if(livingmembers > peak_member_amount)
peak_member_amount = livingmembers

View File

@@ -12,6 +12,7 @@
playlist = "nukesquad"
default_admin_voice = "Union Boss"
admin_voice_style = "secradio"
role_peak_member_typefilter = /datum/role/revolutionary/leader
var/discovered = 0
/datum/faction/revolution/HandleRecruitedMind(var/datum/mind/M)
@@ -181,3 +182,46 @@
ticker.revolutionary_victory = 1
if (ALL_REVS_DEAD)
to_chat(world, "<font size = 3><b>The crew has won!</b></h1><br/><font size = 2>All revolutionaries are either dead or have fled the station!</font>")
/datum/faction/revolution/GetScoreboard()
. = ..()
var/loycount = 0
var/revarrested = 0
var/revkilled = 0
var/allrevarrested = 1
var/deadcommand = 0
for(var/datum/role/R in members)
var/datum/mind/M = R.antag
if(!M || !M.current)
revkilled++
continue
var/turf/T = M.current.loc
if(T && (istype(T.loc, /area/security/brig) || istype(T.loc, /area/security/perma) || istype(T, /turf/simulated/floor/shuttle/brig)))
revarrested++
else if (M.current.stat == DEAD)
revkilled++
for(var/mob/living/player in player_list)
if (istype(player, /mob/living/carbon/human))
var/role = player.mind.assigned_role
if((role in command_positions) && player.stat == DEAD)
deadcommand++
else if(!(locate(/datum/role/revolutionary) in player.mind.antag_roles))
loycount++
else if(istype(player, /mob/living/silicon) && player.stat != DEAD)
loycount++
//if(score.scores["traitorswon"])
//score.scores["crewscore"] -= 10000
if(peak_member_amount == revarrested) // That way only head revs count
allrevarrested = 1
score.crewscore += revarrested * 2000
score.crewscore += revarrested * 1000
score.crewscore += revkilled * 500
score.crewscore -= deadcommand * 500
. += {"<BR>
<B>Number of Surviving Loyal Crew:</B> [loycount]<BR>
<B>Revolution Heads Arrested:</B> [revarrested] ([revarrested * 1000] Points)<BR>
<B>Revolution Heads Slain:</B> [revkilled] ([revkilled * 500] Points)<BR>
<B>Command Staff Slain:</B> [deadcommand] (-[deadcommand * 500] Points)<BR>
<B>All Revolution Heads Arrested:</B> [allrevarrested ? "Yes" : "No"] ([revarrested * 2000] Points)<BR>"}
// <B>Revolution Successful:</B> [score.scores["traitorswon"] ? "Yes" : "No"] (-[score.scores["traitorswon"] * revpenalty] Points)<BR>

View File

@@ -33,7 +33,6 @@
else
return FALSE
//Prisoner Escapes. Same as above, except you don't have to be on the shuttle and you can't be in the brig roundend.
/datum/objective/escape_prisoner
@@ -64,11 +63,11 @@
if(istype(owner.current, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner.current
if(H.restrained())
if(H.restrained())
return FALSE
else if (istype(owner.current, /mob/living/carbon))
var/mob/living/carbon/C = owner.current
if (C.handcuffed)
return FALSE
return TRUE
return TRUE

View File

@@ -18,179 +18,3 @@
for(var/entry in score.implant_phrases)
completions += "[entry]<BR>"
return completions
/datum/controller/gameticker/scoreboard/proc/nuke_op_score(var/datum/faction/syndicate/nuke_op/NO)
var/foecount = 0
var/crewcount = 0
var/diskdat = ""
var/bombdat = null
var/opkilled
var/oparrested
var/alloparrested
var/dat
//var/nukedpenalty = 1000
for(var/datum/role/R in NO.members)
foecount++
var/datum/mind/M = R.antag
if(!M || !M.current)
opkilled++
continue
var/turf/T = M.current.loc
if(T && istype(T.loc, /area/security/brig))
oparrested++
else if(M.current.stat == DEAD)
opkilled++
for(var/mob/living/C in player_list)
if(!istype(C,/mob/living/carbon/human) || !istype(C,/mob/living/silicon/robot) || !istype(C,/mob/living/silicon/ai))
continue
if(C.stat == DEAD)
continue
if(!C.client)
continue
crewcount++
if(foecount == oparrested)
alloparrested = 1
score.crewscore += oparrested * 2000
score.crewscore += opkilled * 250
score.crewscore += oparrested * 1000
//if(score.scores["nuked"])
//score.scores["crewscore"] -= nukedpenalty
/*score.scores["disc"] = 1
for(var/obj/item/weapon/disk/nuclear/A in world)
if(A.loc != /mob/living/carbon)
continue
var/turf/location = get_turf(A.loc)
var/area/bad_zone1 = locate(/area)
var/area/bad_zone2 = locate(/area/syndicate_mothership)
var/area/bad_zone3 = locate(/area/wizard_station)
if(location in bad_zone1)
score.scores["disc"] = 0
if(location in bad_zone2)
score.scores["disc"] = 0
if(location in bad_zone3)
score.scores["disc"] = 0
if(A.loc.z != map.zMainStation)
score.scores["disc"] = 0*/
/*if(score.scores["nuked"])
nukedpenalty = 50000 //Congratulations, your score was nuked
for(var/obj/machinery/nuclearbomb/nuke in machines)
if(nuke.r_code == "Nope")
continue
var/turf/T = get_turf(nuke)
if(istype(T, /area/syndicate_mothership) || istype(T, /area/wizard_station) || istype(T, /area/solar))
nukedpenalty = 1000
else if(istype(T, /area/security/main) || istype(T, /area/security/brig) || istype(T, /area/security/armory) || istype(T, /area/security/checkpoint2))
nukedpenalty = 50000
else if(istype(T, /area/engine))
nukedpenalty = 100000
else
nukedpenalty = 10000*/
for(var/obj/item/weapon/disk/nuclear/N in world)
if(!N)
continue
var/atom/disk_loc = N.loc
while(!istype(disk_loc, /turf))
if(istype(disk_loc, /mob))
var/mob/M = disk_loc
diskdat += "Carried by [M.real_name] "
if(istype(disk_loc, /obj))
var/obj/O = disk_loc
diskdat += "in \a [O.name] "
disk_loc = disk_loc.loc
diskdat += "in [disk_loc.loc]"
break // Should only need one go-round, probably
/*for(var/obj/machinery/nuclearbomb/nuke in machines)
if(nuke.r_code == "Nope")
continue
var/turf/T = nuke.loc
bombdat = T.loc
if(istype(T,/area/syndicate_mothership) || istype(T,/area/wizard_station) || istype(T,/area/solar/) || istype(T,/area))
nukedpenalty = 1000
else if (istype(T,/area/security/main) || istype(T,/area/security/brig) || istype(T,/area/security/armory) || istype(T,/area/security/checkpoint2))
nukedpenalty = 50000
else if (istype(T,/area/engine))
nukedpenalty = 100000
else
nukedpenalty = 5000
break*/
if(!diskdat)
diskdat = "Uh oh. Something has fucked up! Report this."
return dat += {"<B><U>NUCLEAR ASSAULT STATS</U></B><BR>
<B>Number of Operatives:</B> [foecount]<BR>
<B>Number of Surviving Crew:</B> [crewcount]<BR>
<B>Final Location of Nuke:</B> [bombdat]<BR>
<B>Final Location of Disk:</B> [diskdat]<BR>
<B>Operatives Arrested:</B> [oparrested] ([oparrested * 1000] Points)<BR>
<B>Operatives Killed:</B> [opkilled] ([opkilled * 250] Points)<BR>
<B>All Operatives Arrested:</B> [alloparrested ? "Yes" : "No"] ([oparrested * 2000])<BR>
<HR>"}
// <B>Station Destroyed:</B> [score.scores["nuked"] ? "Yes" : "No"] (-[nukedpenalty] Points)<BR>
// <B>Nuclear Disk Secure:</B> [score.scores["disc"] ? "Yes" : "No"] ([score.scores["disc"] * 500] Points)<BR>
/datum/controller/gameticker/scoreboard/proc/revolution_score(var/datum/faction/revolution/RV)
var/foecount = 0
var/comcount = 0
var/revcount = 0
var/loycount = 0
var/revarrested = 0
var/revkilled = 0
var/allrevarrested = 1
var/deadcommand = 0
var/dat
for(var/datum/role/R in RV.members)
if(R.antag.current && R.antag.current.stat != 2)
if(istype(R,/datum/role/revolutionary/leader))
foecount++
else
revcount++
var/datum/mind/M = R.antag
if(!M || !M.current)
revkilled++
continue
var/turf/T = M.current.loc
if(istype(T.loc, /area/security/brig))
revarrested++
else if (M.current.stat == DEAD)
revkilled++
for(var/mob/living/player in player_list)
if (istype(player, /mob/living/carbon/human))
var/role = player.mind.assigned_role
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director"))
if(player.stat == DEAD)
deadcommand++
else
comcount++
else
if(locate(/datum/role/revolutionary) in player.mind.antag_roles)
continue
loycount++
else if(istype(player, /mob/living/silicon))
if (player.stat != DEAD)
loycount++
//if(score.scores["traitorswon"])
//score.scores["crewscore"] -= 10000
if(foecount == revarrested)
allrevarrested = 1
score.crewscore += revarrested * 2000
score.crewscore += revarrested * 1000
score.crewscore += revkilled * 500
score.crewscore -= deadcommand * 500
return dat += {"<B><U>REVOLUTION STATS</U></B><BR>
<B>Number of Surviving Revolution Heads:</B> [foecount]<BR>
<B>Number of Surviving Command Staff:</B> [comcount]<BR>
<B>Number of Surviving Revolutionaries:</B> [revcount]<BR>
<B>Number of Surviving Loyal Crew:</B> [loycount]<BR>
<B>Revolution Heads Arrested:</B> [revarrested] ([revarrested * 1000] Points)<BR>
<B>Revolution Heads Slain:</B> [revkilled] ([revkilled * 500] Points)<BR>
<B>Command Staff Slain:</B> [deadcommand] (-[deadcommand * 500] Points)<BR>
<B>All Revolution Heads Arrested:</B> [allrevarrested ? "Yes" : "No"] ([revarrested * 2000] Points)<BR>
<HR>"}
// <B>Revolution Successful:</B> [score.scores["traitorswon"] ? "Yes" : "No"] (-[score.scores["traitorswon"] * revpenalty] Points)<BR>

View File

@@ -89,9 +89,6 @@ var/global/datum/controller/gameticker/scoreboard/score = new()
var/list/global_paintings = list()
/datum/controller/gameticker/scoreboard/proc/main(var/dat)
var/datum/faction/syndicate/nuke_op/NO = find_active_faction_by_type(/datum/faction/syndicate/nuke_op)
var/datum/faction/revolution/RV = find_active_faction_by_type(/datum/faction/revolution)
ticker.mode.declare_completion()
dat += "[ticker.mode.dat]<HR>"
@@ -101,10 +98,6 @@ var/global/datum/controller/gameticker/scoreboard/score = new()
dat += service_score()
dat += supply_score()
dat += science_score()
if(NO)
dat += nuke_op_score(NO)
if(RV)
dat += revolution_score(RV)
dat += syndicate_score()
dat += silicon_score()
dat += misc_score()

View File

@@ -285,6 +285,7 @@ var/list/nuclear_bombs = list()
return
#define NUKERANGE 120
var/area/nuked_area
/obj/machinery/nuclearbomb/proc/explode(var/sound = TRUE)
if (src.safety)
src.timing = 0
@@ -302,6 +303,7 @@ var/list/nuclear_bombs = list()
var/off_station = 0
var/turf/bomb_location = get_turf(src)
nuked_area = bomb_location.loc
explosion(bomb_location, 30, 60, 120, 120, 10)
if( bomb_location && (bomb_location.z == map.zMainStation) )
var/map_center_x = world.maxx * 0.5