From d74be5f3913449a027d26d034cdbc988bc55fb03 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 5 Oct 2015 15:12:25 -0700 Subject: [PATCH] Scoreboard refactor, move job objectives to scoreboard This commit does the following: - Refactors scoreboard code to get rid of, at least, some of the snowflakiness. - Removes world << job objectives, puts them in the scoreboard. Addendum: Nukeops and Rev are untested, due to the near-impossibility of testing them alone. They _probably_ work. --- code/_globalvars/misc.dm | 1 + code/game/gamemodes/gameticker.dm | 6 +- code/game/gamemodes/nuclear/nuclear.dm | 103 +++++- code/game/gamemodes/revolution/revolution.dm | 83 +++++ code/game/gamemodes/scoreboard.dm | 369 +++++++------------ code/game/jobs/job_objective.dm | 52 ++- code/game/jobs/job_objectives/science.dm | 44 +-- 7 files changed, 360 insertions(+), 298 deletions(-) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index b319f9259b9..bb9d4f354eb 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -48,6 +48,7 @@ var/score_allarrested = 0 // did the crew catch all the enemies alive? var/score_opkilled = 0 // used during nuke mode, how many operatives died? var/score_disc = 0 // is the disc safe and secure? var/score_nuked = 0 // was the station blown into little bits? +var/score_nuked_penalty = 0 //penalty for getting blown to bits // these ones are mainly for the stat panel var/score_powerbonus = 0 // if all APCs on the station are running optimally, big bonus diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 277cfa59406..eab6a665646 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -222,7 +222,7 @@ var/global/datum/controller/gameticker/ticker */ processScheduler.start() - + if(config.sql_enabled) spawn(3000) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB @@ -486,14 +486,12 @@ var/global/datum/controller/gameticker/ticker world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round." mode.declare_completion()//To declare normal completion. - + //calls auto_declare_completion_* for all modes for(var/handler in typesof(/datum/game_mode/proc)) if (findtext("[handler]","auto_declare_completion_")) call(mode, handler)() - mode.declare_job_completion() - scoreboard() karmareminder() diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 3a81b449c1e..0b3592ded97 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -225,7 +225,7 @@ proc/issyndicate(mob/living/M as mob) var/obj/item/weapon/stamp/syndicate/stamp = new P.stamp(stamp) qdel(stamp) - + if (ticker.mode.config_tag=="nuclear") P.loc = synd_mind.current.loc else @@ -447,3 +447,104 @@ proc/issyndicate(mob/living/M as mob) synd_mind.name = "[pick(first_names_female)] [pick(last_names)]" synd_mind.current.real_name = synd_mind.name return + +/datum/game_mode/nuclear/set_scoreboard_gvars() + var/foecount = 0 + for(var/datum/mind/M in ticker.mode.syndicates) + foecount++ + if(!M || !M.current) + score_opkilled++ + continue + + if(M.current.stat == DEAD) + score_opkilled++ + + else if(M.current.restrained()) + score_arrested++ + + if(foecount == score_arrested) + score_allarrested = 1 + + for(var/obj/machinery/nuclearbomb/nuke in world) + if(nuke.r_code == "Nope") continue + var/turf/T = get_turf(nuke) + var/area/A = T.loc + + var/list/thousand_penalty = list(/area/syndicate_station, /area/wizard_station, /area/solar, /area) + var/list/fiftythousand_penalty = list(/area/security/main, /area/security/brig, /area/security/armoury, /area/security/checkpoint2) + + if(is_type_in_list(A, thousand_penalty)) + score_nuked_penalty = 1000 + + else if(is_type_in_list(A, fiftythousand_penalty)) + score_nuked_penalty = 50000 + + else if(istype(A, /area/engine)) + score_nuked_penalty = 100000 + + else + score_nuked_penalty = 10000 + + break + + var/killpoints = score_opkilled * 250 + var/arrestpoints = score_arrested * 1000 + score_crewscore += killpoints + score_crewscore += arrestpoints + if(score_nuked) + score_crewscore -= score_nuked_penalty + + + +/datum/game_mode/nuclear/get_scoreboard_stats() + var/foecount = 0 + var/crewcount = 0 + + var/diskdat = "" + var/bombdat = null + + for(var/datum/mind/M in ticker.mode.syndicates) + foecount++ + + for(var/mob/living/C in world) + if(ishuman(C) || isAI(C) || isrobot(C)) + if(C.stat == 2) continue + if(!C.client) continue + crewcount++ + + var/obj/item/weapon/disk/nuclear/N = locate() in world + if(istype(N)) + var/atom/disk_loc = N.loc + while(!isturf(disk_loc)) + if(ismob(disk_loc)) + var/mob/M = disk_loc + diskdat += "Carried by [M.real_name] " + if(isobj(disk_loc)) + var/obj/O = disk_loc + diskdat += "in \a [O]" + disk_loc = disk_loc.loc + diskdat += "in [disk_loc.loc]" + + + if(!diskdat) + diskdat = "WARNING: Nuked_penalty could not be found, look at [__FILE__], [__LINE__]." + + var/dat = "" + dat += "Mode Statistics
" + + dat += "Number of Operatives: [foecount]
" + dat += "Number of Surviving Crew: [crewcount]
" + + dat += "Final Location of Nuke: [bombdat]
" + dat += "Final Location of Disk: [diskdat]
" + + dat += "
" + + dat += "Operatives Arrested: [score_arrested] ([score_arrested * 1000] Points)
" + dat += "All Operatives Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
" + + dat += "Operatives Killed: [score_opkilled] ([score_opkilled * 1000] Points)
" + dat += "Station Destroyed: [score_nuked ? "Yes" : "No"] (-[score_nuked_penalty] Points)
" + dat += "
" + + return dat \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 099a8e61bad..931032eac22 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -476,3 +476,86 @@ istype(mind.current, /mob/living/carbon/human) && \ !(mind.assigned_role in command_positions) && \ !(mind.assigned_role in list("Security Officer", "Detective", "Warden", "Nanotrasen Representative")) + + + +/datum/game_mode/revolution/set_scoreboard_gvars() + var/foecount = 0 + for(var/datum/mind/M in ticker.mode.head_revolutionaries) + foecount++ + if(!M || !M.current) + score_opkilled++ + continue + + if(M.current.stat == DEAD) + score_opkilled++ + + else if(M.current.restrained()) + score_arrested++ + + if(foecount == score_arrested) + score_allarrested = 1 + + for(var/mob/living/carbon/human/player in world) + if(player.mind) + 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) + score_deadcommand++ + + + var/arrestpoints = score_arrested * 1000 + var/killpoints = score_opkilled * 500 + var/comdeadpts = score_deadcommand * 500 + if(score_traitorswon) + score_crewscore -= 10000 + + score_crewscore += arrestpoints + score_crewscore += killpoints + score_crewscore -= comdeadpts + + +/datum/game_mode/revolution/get_scoreboard_stats() + var/foecount = 0 + var/comcount = 0 + var/revcount = 0 + var/loycount = 0 + for(var/datum/mind/M in ticker.mode:head_revolutionaries) + if (M.current && M.current.stat != DEAD) + foecount++ + for(var/datum/mind/M in ticker.mode:revolutionaries) + if (M.current && M.current.stat != DEAD) + revcount++ + for(var/mob/living/carbon/human/player in world) + if(player.mind) + 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) + comcount++ + else + if(player.mind in ticker.mode.revolutionaries) continue + loycount++ + + for(var/mob/living/silicon/X in world) + if(X.stat != DEAD) + loycount++ + + + var/dat = "" + + dat += "Mode Statistics
" + dat += "Number of Surviving Revolution Heads: [foecount]
" + dat += "Number of Surviving Command Staff: [comcount]
" + dat += "Number of Surviving Revolutionaries: [revcount]
" + dat += "Number of Surviving Loyal Crew: [loycount]
" + + dat += "
" + dat += "Revolution Heads Arrested: [score_arrested] ([score_arrested * 1000] Points)
" + dat += "All Revolution Heads Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
" + + dat += "Revolution Heads Slain: [score_opkilled] ([score_opkilled * 500] Points)
" + dat += "Command Staff Slain: [score_deadcommand] (-[score_deadcommand * 500] Points)
" + dat += "Revolution Successful: [score_traitorswon ? "Yes" : "No"] (-[score_traitorswon * 10000] Points)
" + dat += "
" + + return dat \ No newline at end of file diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 73fbc4d972d..56f37477b76 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -20,126 +20,92 @@ // Score Calculation and Display // Who is alive/dead, who escaped - for (var/mob/living/silicon/ai/I in mob_list) - if (I.stat == 2 && (I.z in config.station_levels)) - score_deadaipenalty = 1 - score_deadcrew += 1 - for (var/mob/living/carbon/human/I in mob_list) -// for (var/datum/ailment/disease/V in I.ailments) -// if (!V.vaccine && !V.spread != "Remissive") score_disease++ - if (I.stat == 2 && (I.z in config.station_levels)) score_deadcrew += 1 - if (I.job == "Clown") - for(var/thing in I.attack_log) - if(findtext(thing, "")) score_clownabuse++ + for(var/mob/living/silicon/ai/I in mob_list) + if(I.stat == DEAD && (I.z in config.station_levels)) + score_deadaipenalty++ + score_deadcrew++ + + for(var/mob/living/carbon/human/I in mob_list) + if(I.stat == DEAD && (I.z in config.station_levels)) + score_deadcrew++ + + if(I && I.mind) + if(I.mind.assigned_role == "Clown") + for(var/thing in I.attack_log) + if(findtext(thing, "")) //This has to be the hackiest fucking way _ever_ to see attacks. + score_clownabuse++ for(var/mob/living/player in mob_list) - if (player.client) - if (player.stat != 2) + if(player.client) + if (player.stat != DEAD) var/turf/location = get_turf(player.loc) var/area/escape_zone = locate(/area/shuttle/escape/centcom) - if (location in escape_zone) - score_escapees += 1 -// player.unlock_medal("100M Dash", 1) -// player.unlock_medal("Survivor", 1) -// for (var/obj/item/weapon/gnomechompski/G in player.get_contents()) -// player.unlock_medal("Guardin' gnome", 1) + if(location in escape_zone) + score_escapees++ - var/cashscore = 0 - var/dmgscore = 0 + + var/cash_score = 0 + var/dmg_score = 0 for(var/mob/living/carbon/human/E in mob_list) - cashscore = 0 - dmgscore = 0 + cash_score = 0 + dmg_score = 0 var/turf/location = get_turf(E.loc) var/area/escape_zone = locate(/area/shuttle/escape/centcom) - if(E.stat != 2 && location in escape_zone) // Escapee Scores - for (var/obj/item/weapon/card/id/C1 in E.contents) cashscore += C1.money - for (var/obj/item/weapon/spacecash/C2 in E.contents) cashscore += C2.worth - for (var/obj/item/weapon/storage/S in E.contents) - for (var/obj/item/weapon/card/id/C3 in S.contents) cashscore += C3.money - for (var/obj/item/weapon/spacecash/C4 in S.contents) cashscore += C4.worth -// for(var/datum/data/record/Ba in data_core.bank) -// if(Ba.fields["name"] == E.real_name) cashscore += Ba.fields["current_money"] - if (cashscore > score_richestcash) - score_richestcash = cashscore + + if(E.stat != DEAD && location in escape_zone) // Escapee Scores + for(var/obj/item/weapon/card/id/C1 in E.contents) + cash_score += C1.money + for(var/obj/item/weapon/spacecash/C2 in E.contents) + cash_score += C2.worth + for(var/obj/item/weapon/storage/S in E.contents) + for(var/obj/item/weapon/card/id/C3 in S.contents) + cash_score += C3.money + for(var/obj/item/weapon/spacecash/C4 in S.contents) + cash_score += C4.worth + + if(cash_score > score_richestcash) + score_richestcash = cash_score score_richestname = E.real_name score_richestjob = E.job score_richestkey = E.key - dmgscore = E.bruteloss + E.fireloss + E.toxloss + E.oxyloss - if (dmgscore > score_dmgestdamage) - score_dmgestdamage = dmgscore + + dmg_score = E.bruteloss + E.fireloss + E.toxloss + E.oxyloss + if(dmg_score > score_dmgestdamage) + score_dmgestdamage = dmg_score score_dmgestname = E.real_name score_dmgestjob = E.job score_dmgestkey = E.key - var/nukedpenalty = 1000 - if (ticker.mode.config_tag == "nuclear") - var/foecount = 0 - for(var/datum/mind/M in ticker.mode:syndicates) - foecount++ - if (!M || !M.current) - score_opkilled++ - continue - var/turf/T = M.current.loc - if (T && istype(T.loc, /area/security/brig)) score_arrested += 1 - else if (M.current.stat == 2) score_opkilled++ - if(foecount == score_arrested) score_allarrested = 1 + if(ticker && ticker.mode) + ticker.mode.set_scoreboard_gvars() -/* - score_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_station) - var/area/bad_zone3 = locate(/area/wizard_station) - if (location in bad_zone1) score_disc = 0 - if (location in bad_zone2) score_disc = 0 - if (location in bad_zone3) score_disc = 0 - if (!(A.loc.z in config.station_levels)) score_disc = 0 -*/ - if (score_nuked) - for (var/obj/machinery/nuclearbomb/NUKE in machines) - if (NUKE.r_code == "Nope") continue - var/turf/T = NUKE.loc - if (istype(T,/area/syndicate_station) || 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/armoury) || istype(T,/area/security/checkpoint2)) nukedpenalty = 50000 - else if (istype(T,/area/engine)) nukedpenalty = 100000 - else nukedpenalty = 10000 - - if (ticker.mode.config_tag == "revolution") - var/foecount = 0 - for(var/datum/mind/M in ticker.mode:head_revolutionaries) - foecount++ - if (!M || !M.current) - score_opkilled++ - continue - var/turf/T = M.current.loc - if (istype(T.loc, /area/security/brig)) score_arrested += 1 - else if (M.current.stat == 2) score_opkilled++ - if(foecount == score_arrested) score_allarrested = 1 - for(var/mob/living/carbon/human/player in world) - if(player.mind) - var/role = player.mind.assigned_role - if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) - if (player.stat == 2) score_deadcommand++ // Check station's power levels - for (var/obj/machinery/power/apc/A in machines) - if (!(A.z in config.station_levels)) continue - for (var/obj/item/weapon/stock_parts/cell/C in A.contents) - if (C.charge < 2300) score_powerloss += 1 // 200 charge leeway + for(var/obj/machinery/power/apc/A in machines) + if(!(A.z in config.station_levels)) continue + + for(var/obj/item/weapon/stock_parts/cell/C in A.contents) + if(C.charge < 2300) + score_powerloss++ //200 charge leeway + // Check how much uncleaned mess is on the station - for (var/obj/effect/decal/cleanable/M in world) - if (!(M.z in config.station_levels)) continue - if (istype(M, /obj/effect/decal/cleanable/blood/gibs/)) score_mess += 3 - if (istype(M, /obj/effect/decal/cleanable/blood/)) score_mess += 1 -// if (istype(M, /obj/effect/decal/cleanable/greenpuke)) score_mess += 1 - if (istype(M, /obj/effect/decal/cleanable/poop)) score_mess += 1 -// if (istype(M, /obj/decal/cleanable/urine)) score_mess += 1 - if (istype(M, /obj/effect/decal/cleanable/vomit)) score_mess += 1 + for(var/obj/effect/decal/cleanable/M in world) + if(!(M.z in config.station_levels)) continue + if(istype(M, /obj/effect/decal/cleanable/blood/gibs)) + score_mess += 3 + + if(istype(M, /obj/effect/decal/cleanable/blood)) + score_mess += 1 + + if(istype(M, /obj/effect/decal/cleanable/poop)) + score_mess += 1 + + if(istype(M, /obj/effect/decal/cleanable/vomit)) + score_mess += 1 + // Bonus Modifiers //var/traitorwins = score_traitorswon @@ -153,26 +119,10 @@ var/meals = score_meals * 5 //done, but this only counts cooked meals, not drinks served var/power = score_powerloss * 20 var/messpoints - if (score_mess != 0) messpoints = score_mess //done + if(score_mess != 0) + messpoints = score_mess //done var/plaguepoints = score_disease * 30 - // Mode Specific - if (ticker.mode.config_tag == "nuclear") - if (score_disc) score_crewscore += 500 - var/killpoints = score_opkilled * 250 - var/arrestpoints = score_arrested * 1000 - score_crewscore += killpoints - score_crewscore += arrestpoints - if (score_nuked) score_crewscore -= nukedpenalty - - if (ticker.mode.config_tag == "revolution") - var/arrestpoints = score_arrested * 1000 - var/killpoints = score_opkilled * 500 - var/comdeadpts = score_deadcommand * 500 - if (score_traitorswon) score_crewscore -= 10000 - score_crewscore += arrestpoints - score_crewscore += killpoints - score_crewscore -= comdeadpts // Good Things score_crewscore += shipping @@ -182,23 +132,26 @@ score_crewscore += eventpoints score_crewscore += escapoints - if (power == 0) + if(power == 0) score_crewscore += 2500 score_powerbonus = 1 - if (score_mess == 0) + + if(score_mess == 0) score_crewscore += 3000 score_messbonus = 1 - score_crewscore += meals - if (score_allarrested) score_crewscore *= 3 // This needs to be here for the bonus to be applied properly - // Bad Things + + score_crewscore += meals + if(score_allarrested) + score_crewscore *= 3 // This needs to be here for the bonus to be applied properly + + score_crewscore -= deathpoints - if (score_deadaipenalty) score_crewscore -= 250 + if(score_deadaipenalty) + score_crewscore -= 250 score_crewscore -= power - //if (score_crewscore != 0) // Dont divide by zero! - // while (traitorwins > 0) - // score_crewscore /= 2 - // traitorwins -= 1 + + score_crewscore -= messpoints score_crewscore -= plaguepoints @@ -209,124 +162,60 @@ if(E.client) if(E.client.prefs && !(E.client.prefs.toggles & DISABLE_SCOREBOARD)) E.scorestats() - return +/datum/game_mode/proc/get_scoreboard_stats() + return null + +/datum/game_mode/proc/set_scoreboard_gvars() + return null /mob/proc/scorestats() - var/dat = {"Round Statistics and Score

"} - if (ticker.mode.name == "nuclear emergency") - var/foecount = 0 - var/crewcount = 0 - var/diskdat = "" - var/bombdat = null - for(var/datum/mind/M in ticker.mode:syndicates) - foecount++ - for(var/mob/living/C in world) - if (!istype(C,/mob/living/carbon/human) || !istype(C,/mob/living/silicon/robot) || !istype(C,/mob/living/silicon/ai)) continue - if (C.stat == 2) continue - if (!C.client) continue - crewcount++ + var/dat = "Round Statistics and Score

" + if(ticker && ticker.mode) + dat += ticker.mode.get_scoreboard_stats() - 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 - var/nukedpenalty = 0 - for(var/obj/machinery/nuclearbomb/NUKE in world) - if (NUKE.r_code == "Nope") continue - var/turf/T = NUKE.loc - bombdat = T.loc - if (istype(T,/area/syndicate_station) || 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/armoury) || istype(T,/area/security/checkpoint2)) nukedpenalty = 50000 - else if (istype(T,/area/engine)) nukedpenalty = 100000 - else nukedpenalty = 10000 - break - if (!diskdat) diskdat = "Uh oh. Something has fucked up! Report this." - dat += {"MODE STATS
- Number of Operatives: [foecount]
- Number of Surviving Crew: [crewcount]
- Final Location of Nuke: [bombdat]
- Final Location of Disk: [diskdat]

- Operatives Arrested: [score_arrested] ([score_arrested * 1000] Points)
- Operatives Killed: [score_opkilled] ([score_opkilled * 250] Points)
- Station Destroyed: [score_nuked ? "Yes" : "No"] (-[nukedpenalty] Points)
- All Operatives Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
-
"} -// Nuclear Disk Secure: [score_disc ? "Yes" : "No"] ([score_disc * 500] Points)
- if (ticker.mode.name == "revolution") - var/foecount = 0 - var/comcount = 0 - var/revcount = 0 - var/loycount = 0 - for(var/datum/mind/M in ticker.mode:head_revolutionaries) - if (M.current && M.current.stat != 2) foecount++ - for(var/datum/mind/M in ticker.mode:revolutionaries) - if (M.current && M.current.stat != 2) revcount++ - for(var/mob/living/carbon/human/player in world) - if(player.mind) - var/role = player.mind.assigned_role - if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) - if (player.stat != 2) comcount++ - else - if(player.mind in ticker.mode:revolutionaries) continue - loycount++ - for(var/mob/living/silicon/X in world) - if (X.stat != 2) loycount++ - var/revpenalty = 10000 - dat += {"MODE STATS
- Number of Surviving Revolution Heads: [foecount]
- Number of Surviving Command Staff: [comcount]
- Number of Surviving Revolutionaries: [revcount]
- Number of Surviving Loyal Crew: [loycount]

- Revolution Heads Arrested: [score_arrested] ([score_arrested * 1000] Points)
- Revolution Heads Slain: [score_opkilled] ([score_opkilled * 500] Points)
- Command Staff Slain: [score_deadcommand] (-[score_deadcommand * 500] Points)
- Revolution Successful: [score_traitorswon ? "Yes" : "No"] (-[score_traitorswon * revpenalty] Points)
- All Revolution Heads Arrested: [score_allarrested ? "Yes" : "No"] (Score tripled)
-
"} -// var/totalfunds = wagesystem.station_budget + wagesystem.research_budget + wagesystem.shipping_budget - dat += {"GENERAL STATS
- THE GOOD:
- Useful Items Shipped: [score_stuffshipped] ([score_stuffshipped * 5] Points)
- Hydroponics Harvests: [score_stuffharvested] ([score_stuffharvested * 5] Points)
- Ore Mined: [score_oremined] ([score_oremined * 2] Points)
- Refreshments Prepared: [score_meals] ([score_meals * 5] Points)
- Research Completed: [score_researchdone] ([score_researchdone * 30] Points)
"} - if (!emergency_shuttle.location()) dat += "Shuttle Escapees: [score_escapees] ([score_escapees * 25] Points)
" - dat += {"Random Events Endured: [score_eventsendured] ([score_eventsendured * 50] Points)
- Whole Station Powered: [score_powerbonus ? "Yes" : "No"] ([score_powerbonus * 2500] Points)
- Ultra-Clean Station: [score_mess ? "No" : "Yes"] ([score_messbonus * 3000] Points)

- THE BAD:
- Dead Bodies on Station: [score_deadcrew] (-[score_deadcrew * 25] Points)
- Uncleaned Messes: [score_mess] (-[score_mess] Points)
- Station Power Issues: [score_powerloss] (-[score_powerloss * 20] Points)
- Rampant Diseases: [score_disease] (-[score_disease * 30] Points)
- AI Destroyed: [score_deadaipenalty ? "Yes" : "No"] (-[score_deadaipenalty * 250] Points)

- THE WEIRD
"} -/* Final Station Budget: $[num2text(totalfunds,50)]
"} - var/profit = totalfunds - 100000 - if (profit > 0) dat += "Station Profit: +[num2text(profit,50)]
" - else if (profit < 0) dat += "Station Deficit: [num2text(profit,50)]
"}*/ - dat += {"Food Eaten: [score_foodeaten]
- Times a Clown was Abused: [score_clownabuse]

"} + dat += {" + General Statistics
+ The Good:
+ + Useful Items Shipped: [score_stuffshipped] ([score_stuffshipped * 5] Points)
+ Hydroponics Harvests: [score_stuffharvested] ([score_stuffharvested * 5] Points)
+ Ore Mined: [score_oremined] ([score_oremined * 2] Points)
+ Refreshments Prepared: [score_meals] ([score_meals * 5] Points)
+ Research Completed: [score_researchdone] ([score_researchdone * 30] Points)
"} + if (!emergency_shuttle.location()) dat += "Shuttle Escapees: [score_escapees] ([score_escapees * 25] Points)
" + dat += {"Random Events Endured: [score_eventsendured] ([score_eventsendured * 50] Points)
+ Whole Station Powered: [score_powerbonus ? "Yes" : "No"] ([score_powerbonus * 2500] Points)
+ Ultra-Clean Station: [score_mess ? "No" : "Yes"] ([score_messbonus * 3000] Points)

+ The bad:
+ + Dead bodies on Station: [score_deadcrew] (-[score_deadcrew * 25] Points)
+ Uncleaned Messes: [score_mess] (-[score_mess] Points)
+ Station Power Issues: [score_powerloss] (-[score_powerloss * 20] Points)
+ Rampant Diseases: [score_disease] (-[score_disease * 30] Points)
+ AI Destroyed: [score_deadaipenalty ? "Yes" : "No"] (-[score_deadaipenalty * 250] Points)

+ The Weird
+ + Food Eaten: [score_foodeaten]
+ Times a Clown was Abused: [score_clownabuse]

+ "} if (score_escapees) - dat += {"Richest Escapee: [score_richestname], [score_richestjob]: $[num2text(score_richestcash,50)] ([score_richestkey])
- Most Battered Escapee: [score_dmgestname], [score_dmgestjob]: [score_dmgestdamage] damage ([score_dmgestkey])
"} + dat += {"Richest Escapee: [score_richestname], [score_richestjob]: $[num2text(score_richestcash,50)] ([score_richestkey])
+ Most Battered Escapee: [score_dmgestname], [score_dmgestjob]: [score_dmgestdamage] damage ([score_dmgestkey])
"} else - if (emergency_shuttle.location()) dat += "The station wasn't evacuated!
" - else dat += "No-one escaped!
" - dat += {"

- FINAL SCORE: [score_crewscore]
"} + if(emergency_shuttle.location()) + dat += "The station wasn't evacuated!
" + else + dat += "No-one escaped!
" + + dat += ticker.mode.declare_job_completion() + + dat += {" +

+ FINAL SCORE: [score_crewscore]
+ "} + var/score_rating = "The Aristocrats!" switch(score_crewscore) if(-99999 to -50000) score_rating = "Even the Singularity Deserves Better" @@ -345,6 +234,6 @@ if(5000 to 9999) score_rating = "Ambassadors of Discovery" if(10000 to 49999) score_rating = "The Pride of Science Itself" if(50000 to INFINITY) score_rating = "Nanotrasen's Finest" - dat += "RATING: [score_rating]" - src << browse(dat, "window=roundstats;size=500x600") - return \ No newline at end of file + + dat += "RATING: [score_rating]" + src << browse(dat, "window=roundstats;size=500x600") \ No newline at end of file diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm index 1efb8ba0c76..8860cdf4931 100644 --- a/code/game/jobs/job_objective.dm +++ b/code/game/jobs/job_objective.dm @@ -1,12 +1,12 @@ -/datum/mind/var/list/job_objectives=list() +/datum/mind/var/list/job_objectives = list() #define FINDJOBTASK_DEFAULT_NEW 1 // Make a new task of this type if one can't be found. -/datum/mind/proc/findJobTask(var/typepath,var/options=0) - var/datum/job_objective/task = locate(typepath) in src.job_objectives +/datum/mind/proc/findJobTask(var/typepath, var/options = 0) + var/datum/job_objective/task = locate(typepath) in job_objectives if(!istype(task,typepath)) if(options & FINDJOBTASK_DEFAULT_NEW) task = new typepath() - src.job_objectives += task + job_objectives += task return task /datum/job_objective @@ -19,13 +19,13 @@ var/completion_payment = 0 // Credits paid to owner when completed /datum/job_objective/New(var/datum/mind/new_owner) - owner=new_owner + owner = new_owner owner.job_objectives += src -/datum/job_objective/Destroy() /datum/job_objective/proc/get_description() - return "Placeholder objective." + var/desc = "Placeholder Objective" + return desc /datum/job_objective/proc/unit_completed(var/count=1) units_completed += count @@ -36,47 +36,41 @@ return completed /datum/job_objective/proc/check_for_completion() - return per_unit && units_completed > 0 + if(per_unit) + if(units_completed > 0) + return 1 + return 0 /datum/game_mode/proc/declare_job_completion() - var/text = "Job Completion:" - var/numEmployees=0 + var/text = "
Job Completion" + for(var/datum/mind/employee in ticker.minds) + if(!employee.job_objectives.len)//If the employee had no objectives, don't need to process this. continue + if(!employee.assigned_role=="MODE")//If the employee is a gamemode thing, skip. continue - numEmployees++ + var/tasks_completed=0 - //text += "[L.name] ([ckey(D.mind.key)]), the [L.job]:\n" - text += "
[employee.key] was [employee.name], the [employee.assigned_role] (" - if(employee.current) - if(employee.current.stat == DEAD) - text += "died" - else - text += "survived" - if(employee.current.real_name != employee.name) - text += " as [employee.current.real_name]" - else - text += "body destroyed" - text += ")" + text += "
[employee.name] was a [employee.assigned_role]:" var/count = 1 for(var/datum/job_objective/objective in employee.job_objectives) if(objective.is_completed(1)) - text += "
Task #[count]: [objective.get_description()] Completed!" + text += "
 - Task #[count]: [objective.get_description()] Completed!" feedback_add_details("employee_objective","[objective.type]|SUCCESS") tasks_completed++ else + text += "
 - Task #[count]: [objective.get_description()] Failed." feedback_add_details("employee_objective","[objective.type]|FAIL") count++ - if(tasks_completed>=1) - text += "
The [employee.assigned_role] did their fucking job!" + if(tasks_completed >= 1) + text += "
 [employee.name] did their fucking job!" feedback_add_details("employee_success","SUCCESS") else feedback_add_details("employee_success","FAIL") - if(numEmployees>0) - world << text - return 1 \ No newline at end of file + + return text \ No newline at end of file diff --git a/code/game/jobs/job_objectives/science.dm b/code/game/jobs/job_objectives/science.dm index 996193ba66e..64cd041838c 100644 --- a/code/game/jobs/job_objectives/science.dm +++ b/code/game/jobs/job_objectives/science.dm @@ -4,21 +4,21 @@ // MAXIMUM SCIENCE /datum/job_objective/maximize_research - completion_payment=1000 + completion_payment = 1000 /datum/job_objective/maximize_research/get_description() - return "Maximize all legal research tech levels." + var/desc = "Maximize all legal research tech levels." + return desc /datum/job_objective/maximize_research/check_for_completion() var/obj/machinery/r_n_d/server/server = null for(var/obj/machinery/r_n_d/server/serber in machines) if(serber.name == "Core R&D Server") - server=serber + server = serber break if(!server) - // This was just used for testing. - //world << "UNABLE TO FIND A GODDAMN RND SERVER. FUCK." - return + return 0 + for(var/datum/tech/T in server.files.possible_tech) if(T.max_level==0) // Ignore illegal tech, etc continue @@ -33,28 +33,24 @@ // Robotics ///////////////////////////////////////////////////////////////////////////////////////// -// Mek cyburg +//Cyborgs /datum/job_objective/make_cyborg - completion_payment=100 - per_unit=1 + completion_payment = 100 + per_unit = 1 /datum/job_objective/make_cyborg/get_description() - return "Make a cyborg. ([units_completed] created.)" -/* -// Mek MoMMI -/datum/job_objective/make_mommi - completion_payment=150 - per_unit=1 + var/desc = "Make a cyborg." + desc += "([units_completed] created.)" + return desc -/datum/job_objective/make_mommi/get_description() - return "Make a Mobile MMI. ([units_completed] created.)" -*/ -// Mek Ripley + + +//RIPLEY's /datum/job_objective/make_ripley - completion_payment=600 - per_unit=1 + completion_payment = 600 + per_unit = 1 /datum/job_objective/make_ripley/get_description() - return "Make a Ripley. ([units_completed] created.)" - - + var/desc = "Make a Ripley." + desc += "([units_completed] created.)" + return desc \ No newline at end of file