diff --git a/baystation12.dme b/baystation12.dme
index efd2374b2e8..98a48664579 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -203,6 +203,7 @@
#include "code\game\gamemodes\gameticker.dm"
#include "code\game\gamemodes\intercept_report.dm"
#include "code\game\gamemodes\objective.dm"
+#include "code\game\gamemodes\scoreboard.dm"
#include "code\game\gamemodes\setupgame.dm"
#include "code\game\gamemodes\autotraitor\autotraitor.dm"
#include "code\game\gamemodes\blob\blob.dm"
@@ -318,6 +319,7 @@
#include "code\game\machinery\seed_extractor.dm"
#include "code\game\machinery\shieldgen.dm"
#include "code\game\machinery\Sleeper.dm"
+#include "code\game\machinery\slotmachine.dm"
#include "code\game\machinery\spaceheater.dm"
#include "code\game\machinery\status_display.dm"
#include "code\game\machinery\suit_storage_unit.dm"
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index ae7accd056d..9592aa30c9c 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -394,28 +394,8 @@ var/global/datum/controller/gameticker/ticker
mode.declare_job_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)()
-
- //Print a list of antagonists to the server log
- var/list/total_antagonists = list()
- //Look into all mobs in world, dead or alive
- for(var/datum/mind/Mind in minds)
- var/temprole = Mind.special_role
- if(temprole) //if they are an antagonist of some sort.
- if(temprole in total_antagonists) //If the role exists already, add the name to it
- total_antagonists[temprole] += ", [Mind.name]([Mind.key])"
- else
- total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob
- total_antagonists[temprole] += ": [Mind.name]([Mind.key])"
-
- //Now print them all into the log!
- log_game("Antagonists at round end were...")
- for(var/i in total_antagonists)
- log_game("[i]s[total_antagonists[i]].")
-
+ scoreboard()
karmareminder()
return 1
+
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
new file mode 100644
index 00000000000..53da3463c70
--- /dev/null
+++ b/code/game/gamemodes/scoreboard.dm
@@ -0,0 +1,351 @@
+/datum/controller/gameticker/proc/scoreboard()
+
+ //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)()
+
+ //Print a list of antagonists to the server log
+ var/list/total_antagonists = list()
+ //Look into all mobs in world, dead or alive
+ for(var/datum/mind/Mind in minds)
+ var/temprole = Mind.special_role
+ if(temprole) //if they are an antagonist of some sort.
+ if(temprole in total_antagonists) //If the role exists already, add the name to it
+ total_antagonists[temprole] += ", [Mind.name]([Mind.key])"
+ else
+ total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob
+ total_antagonists[temprole] += ": [Mind.name]([Mind.key])"
+
+ //Now print them all into the log!
+ log_game("Antagonists at round end were...")
+ for(var/i in total_antagonists)
+ log_game("[i]s[total_antagonists[i]].")
+
+ // 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 == 1)
+ 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 == 1) score_deadcrew += 1*/
+ for(var/mob/living/player in mob_list)
+ if (player.client)
+ if (player.stat != 2)
+ 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)
+
+
+ var/cashscore = 0
+ var/dmgscore = 0
+ for(var/mob/living/carbon/human/E in mob_list)
+ cashscore = 0
+ dmgscore = 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
+ 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
+ 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
+
+/*
+ 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 != 1) 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 != 1) continue
+ for (var/obj/item/weapon/cell/C in A.contents)
+ if (C.charge < 2300) score_powerloss += 1 // 200 charge leeway
+
+ // Check how much uncleaned mess is on the station
+ for (var/obj/effect/decal/cleanable/M in world)
+ if (M.z != 1) 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
+
+ // Bonus Modifiers
+ //var/traitorwins = score_traitorswon
+ var/deathpoints = score_deadcrew * 25
+ var/researchpoints = score_researchdone * 30
+ var/eventpoints = score_eventsendured * 50
+ var/borgpoints = score_cyborgsmade * 50
+ var/escapoints = score_escapees * 25
+ var/harvests = score_stuffharvested * 5
+ var/shipping = score_stuffshipped * 5
+ var/mining = score_oremined * 2
+ var/meals = score_meals * 5
+ var/power = score_powerloss * 20
+ var/messpoints
+ if (score_mess != 0) messpoints = score_mess
+ 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
+ score_crewscore += harvests
+ score_crewscore += mining
+ score_crewscore += borgpoints
+ score_crewscore += researchpoints
+ score_crewscore += eventpoints
+ score_crewscore += escapoints
+
+ if (power == 0)
+ score_crewscore += 2500
+ score_powerbonus = 1
+ 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 -= deathpoints
+ 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
+
+ // Show the score - might add "ranks" later
+ world << "The crew's final score is:"
+ world << "[score_crewscore]"
+ for(var/mob/E in player_list)
+ if(E.client) E.scorestats()
+ return
+
+
+
+/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++
+
+ 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)
+ Cyborgs Constructed: [score_cyborgsmade] ([score_cyborgsmade * 50] Points)
"}
+ if (emergency_shuttle.location == 2) 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]
"}
+ 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])
"}
+ else
+ if (emergency_shuttle.location != 2) dat += "The station wasn't evacuated!
"
+ else dat += "No-one escaped!
"
+ dat += {"
+ FINAL SCORE: [score_crewscore]
"}
+ var/score_rating = "The Aristocrats!"
+ switch(score_crewscore)
+ if(-99999 to -50000) score_rating = "Even the Singularity Deserves Better"
+ if(-49999 to -5000) score_rating = "Singularity Fodder"
+ if(-4999 to -1000) score_rating = "You're All Fired"
+ if(-999 to -500) score_rating = "A Waste of Perfectly Good Oxygen"
+ if(-499 to -250) score_rating = "A Wretched Heap of Scum and Incompetence"
+ if(-249 to -100) score_rating = "Outclassed by Lab Monkeys"
+ if(-99 to -21) score_rating = "The Undesirables"
+ if(-20 to 20) score_rating = "Ambivalently Average"
+ if(21 to 99) score_rating = "Not Bad, but Not Good"
+ if(100 to 249) score_rating = "Skillful Servants of Science"
+ if(250 to 499) score_rating = "Best of a Good Bunch"
+ if(500 to 999) score_rating = "Lean Mean Machine Thirteen"
+ if(1000 to 4999) score_rating = "Promotions for Everyone"
+ 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
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index a635507a160..57826586435 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -767,6 +767,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(!S.can_be_inserted(G))
return
S.handle_item_insertion(G, 1)
+ score_stuffharvested++
else if ( istype(O, /obj/item/weapon/pestspray) )
var/obj/item/pestkiller/myPKiller = O
@@ -850,6 +851,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
t_prod.potency = potency
t_prod.plant_type = plant_type
t_amount++
+ score_stuffharvested++
parent.update_tray()
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
new file mode 100644
index 00000000000..16c66a8506e
--- /dev/null
+++ b/code/game/machinery/slotmachine.dm
@@ -0,0 +1,104 @@
+/obj/machinery/slot_machine
+ name = "Slot Machine"
+ desc = "Gambling for the antisocial."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "slots-off"
+ anchored = 1
+ density = 1
+// mats = 10
+ var/money = 2500000
+ var/plays = 0
+ var/working = 0
+ var/obj/item/weapon/card/id/scan = null
+
+ attackby(var/obj/item/I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/card/id))
+ if(src.scan)
+ user << "\red There is a card already in the slot machine."
+ else
+ user << "\blue You insert your ID card."
+ usr.drop_item()
+ I.loc = src
+ src.scan = I
+ else src.attack_hand(user)
+ return
+
+ attack_hand(var/mob/user as mob)
+ user.machine = src
+ if (!src.scan)
+ var/dat = {"Slot Machine
+
+ Please insert card!
"}
+ user << browse(dat, "window=slotmachine;size=450x500")
+ onclose(user, "slotmachine")
+ else if (src.working)
+ var/dat = {"Slot Machine
+
+ Please wait!
"}
+ user << browse(dat, "window=slotmachine;size=450x500")
+ onclose(user, "slotmachine")
+ else
+ var/dat = {"Slot Machine
+
+ Five credits to play!
+ Prize Money Available: [src.scan.money]
+ Your Card: [src.scan]
+ Credits Remaining: [src.scan.money]
+ [src.plays] players have tried their luck today!
+
+ Play!
+ Eject card"}
+ user << browse(dat, "window=slotmachine;size=400x500")
+ onclose(user, "slotmachine")
+
+ Topic(href, href_list)
+ if(href_list["ops"])
+ var/operation = text2num(href_list["ops"])
+ if(operation == 1) // Play
+ if (src.scan.money < 5)
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'Insufficient money to play!'", src), 1)
+ return
+ src.scan.money -= 5
+ src.money += 5
+ src.plays += 1
+ src.working = 1
+ src.icon_state = "slots-on"
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'Let's roll!'", src), 1)
+ var/roll = rand(1,10000)
+ spawn(100)
+ if (roll == 1)
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'JACKPOT! You win [src.money]!'", src), 1)
+ command_alert("Congratulations [src.scan.registered_name] on winning the Jackpot!", "Jackpot Winner")
+ src.scan.money += src.money
+ src.money = 0
+ else if (roll > 1 && roll <= 10)
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'Big Winner! You win five thousand credits!'", src), 1)
+ src.scan.money += 5000
+ src.money -= 5000
+ else if (roll > 10 && roll <= 100)
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'Winner! You win five hundred credits!'", src), 1)
+ src.scan.money += 500
+ src.money -= 500
+ else if (roll > 100 && roll <= 1000)
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'You win a free game!'", src), 1)
+ src.scan.money += 5
+ src.money -= 5
+ else
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'No luck!'", src), 1)
+ src.working = 0
+ src.icon_state = "slots-off"
+ if(operation == 2) // Eject Card
+ src.scan.loc = src.loc
+ src.scan = null
+ for(var/mob/O in hearers(src, null))
+ O.show_message(text("[] says, 'Thank you for playing!'", src), 1)
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ return
\ No newline at end of file
diff --git a/code/global.dm b/code/global.dm
index c81f9c4ab75..7e4071f3b73 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -248,3 +248,41 @@ var/custom_event_msg = null
//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.).
var/DBConnection/dbcon = new() //Feedback database (New database)
var/DBConnection/dbcon_old = new() //Tgstation database (Old database) - See the files in the SQL folder for information what goes where.
+
+
+//Goonstyle scoreboard
+var/score_crewscore = 0 // this is the overall var/score for the whole round
+var/score_stuffshipped = 0 // how many useful items have cargo shipped out?
+var/score_stuffharvested = 0 // how many harvests have hydroponics done?
+var/score_oremined = 0 // obvious
+var/score_cyborgsmade = 0
+var/score_researchdone = 0
+var/score_eventsendured = 0 // how many random events did the station survive?
+var/score_powerloss = 0 // how many APCs have poor charge?
+var/score_escapees = 0 // how many people got out alive?
+var/score_deadcrew = 0 // dead bodies on the station, oh no
+var/score_mess = 0 // how much poo, puke, gibs, etc went uncleaned
+var/score_meals = 0
+var/score_disease = 0 // how many rampant, uncured diseases are on board the station
+var/score_deadcommand = 0 // used during rev, how many command staff perished
+var/score_arrested = 0 // how many traitors/revs/whatever are alive in the brig
+var/score_traitorswon = 0 // how many traitors were successful?
+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?
+
+ // these ones are mainly for the stat panel
+var/score_powerbonus = 0 // if all APCs on the station are running optimally, big bonus
+var/score_messbonus = 0 // if there are no messes on the station anywhere, huge bonus
+var/score_deadaipenalty = 0 // is the AI dead? if so, big penalty
+var/score_foodeaten = 0 // nom nom nom
+var/score_clownabuse = 0 // how many times a clown was punched, struck or otherwise maligned
+var/score_richestname = null // this is all stuff to show who was the richest alive on the shuttle
+var/score_richestjob = null // kinda pointless if you dont have a money system i guess
+var/score_richestcash = 0
+var/score_richestkey = null
+var/score_dmgestname = null // who had the most damage on the shuttle (but was still alive)
+var/score_dmgestjob = null
+var/score_dmgestdamage = 0
+var/score_dmgestkey = null
\ No newline at end of file
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index a15b0aa12bd..ea7f04877b3 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ