mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-18 14:12:20 +00:00
Department and Round Goals (#7369)
* Baseline work for Department Goals. Implements round-end stats, based in 3 categories of roughly-more-interesting to less interesting. * Active Goal Separation. * Map. * Actually does the second half of this in this PR instead of a different one.
This commit is contained in:
7
code/datums/roundstats/_defines_local.dm
Normal file
7
code/datums/roundstats/_defines_local.dm
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
#define GOAL_GENERAL "Common Goal"
|
||||||
|
#define GOAL_MEDICAL "Medical Goal"
|
||||||
|
#define GOAL_SECURITY "Security Goal"
|
||||||
|
#define GOAL_ENGINEERING "Engineering Goal"
|
||||||
|
#define GOAL_CARGO "Cargo Goal"
|
||||||
|
#define GOAL_RESEARCH "Research Goal"
|
||||||
99
code/datums/roundstats/departmentgoal.dm
Normal file
99
code/datums/roundstats/departmentgoal.dm
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
|
||||||
|
GLOBAL_LIST(department_goals)
|
||||||
|
GLOBAL_LIST(active_department_goals)
|
||||||
|
|
||||||
|
/hook/startup/proc/initializeDepartmentGoals()
|
||||||
|
GLOB.department_goals = list(GOAL_GENERAL, GOAL_MEDICAL, GOAL_SECURITY, GOAL_ENGINEERING, GOAL_CARGO, GOAL_RESEARCH)
|
||||||
|
GLOB.active_department_goals = list(GOAL_GENERAL, GOAL_MEDICAL, GOAL_SECURITY, GOAL_ENGINEERING, GOAL_CARGO, GOAL_RESEARCH)
|
||||||
|
|
||||||
|
for(var/category in GLOB.department_goals)
|
||||||
|
GLOB.department_goals[category] = list()
|
||||||
|
|
||||||
|
for(var/subtype in subtypesof(/datum/goal))
|
||||||
|
var/datum/goal/SG = new subtype()
|
||||||
|
|
||||||
|
if(SG.name == "goal")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if(SG.category == category)
|
||||||
|
GLOB.department_goals[category] |= SG
|
||||||
|
|
||||||
|
for(var/category in GLOB.active_department_goals)
|
||||||
|
GLOB.active_department_goals[category] = list()
|
||||||
|
var/list/cat_goals = GLOB.department_goals[category]
|
||||||
|
|
||||||
|
var/goal_count = rand(2,4)
|
||||||
|
|
||||||
|
for(var/count = 1 to goal_count)
|
||||||
|
var/datum/goal/G
|
||||||
|
|
||||||
|
if(LAZYLEN(cat_goals))
|
||||||
|
G = pick(cat_goals)
|
||||||
|
|
||||||
|
if(G)
|
||||||
|
G.active_goal = TRUE
|
||||||
|
cat_goals -= G
|
||||||
|
|
||||||
|
GLOB.active_department_goals[category] |= G
|
||||||
|
|
||||||
|
/hook/roundend/proc/checkDepartmentGoals()
|
||||||
|
for(var/category in GLOB.active_department_goals)
|
||||||
|
var/list/cat_goals = GLOB.active_department_goals[category]
|
||||||
|
|
||||||
|
to_world("<span class='filter_system'><b>[category]</b></span>")
|
||||||
|
|
||||||
|
if(!LAZYLEN(cat_goals))
|
||||||
|
to_world("<span class='filter_system'>There were no assigned goals!</span>")
|
||||||
|
|
||||||
|
else
|
||||||
|
for(var/datum/goal/G in cat_goals)
|
||||||
|
var/success = G.check_completion()
|
||||||
|
to_world("<span class='filter_system'>[success ? "<span class='notice'>[G.name]</span>" : "<span class='warning'>[G.name]</span>"]</span>")
|
||||||
|
to_world("<span class='filter_system'>[G.goal_text]</span>")
|
||||||
|
|
||||||
|
/datum/goal
|
||||||
|
var/name = "goal"
|
||||||
|
|
||||||
|
var/goal_text = "Do nothing! Congratulations."
|
||||||
|
|
||||||
|
var/active_goal = FALSE
|
||||||
|
|
||||||
|
var/category = GOAL_GENERAL
|
||||||
|
|
||||||
|
/datum/goal/proc/check_completion()
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/datum/goal/common
|
||||||
|
name = "goal"
|
||||||
|
|
||||||
|
goal_text = "Congratulations, you still do nothing."
|
||||||
|
|
||||||
|
/datum/goal/medical
|
||||||
|
name = "goal"
|
||||||
|
|
||||||
|
goal_text = "Congratulations, you still do nothing."
|
||||||
|
category = GOAL_MEDICAL
|
||||||
|
|
||||||
|
/datum/goal/security
|
||||||
|
name = "goal"
|
||||||
|
|
||||||
|
goal_text = "Congratulations, you still do nothing."
|
||||||
|
category = GOAL_SECURITY
|
||||||
|
|
||||||
|
/datum/goal/engineering
|
||||||
|
name = "goal"
|
||||||
|
|
||||||
|
goal_text = "Congratulations, you still do nothing."
|
||||||
|
category = GOAL_ENGINEERING
|
||||||
|
|
||||||
|
/datum/goal/cargo
|
||||||
|
name = "goal"
|
||||||
|
|
||||||
|
goal_text = "Congratulations, you still do nothing."
|
||||||
|
category = GOAL_CARGO
|
||||||
|
|
||||||
|
/datum/goal/research
|
||||||
|
name = "goal"
|
||||||
|
|
||||||
|
goal_text = "Congratulations, you still do nothing."
|
||||||
|
category = GOAL_RESEARCH
|
||||||
57
code/datums/roundstats/roundstats.dm
Normal file
57
code/datums/roundstats/roundstats.dm
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* lbnesquik - Github
|
||||||
|
* Provided massive components of this. Polaris PR #5720.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//This is for the round end stats system.
|
||||||
|
|
||||||
|
//roundstat is used for easy finding of the variables, if you ever want to delete all of this,
|
||||||
|
//just search roundstat and you'll find everywhere this thing reaches into.
|
||||||
|
//It used to be bazinga but it only fly with microwaves.
|
||||||
|
|
||||||
|
GLOBAL_VAR_INIT(cans_opened_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(lights_switched_on_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(turbo_lift_floors_moved_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(lost_limbs_shift_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(seed_planted_shift_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(step_taken_shift_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(destroyed_research_items_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(items_sold_shift_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(disposals_flush_shift_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(rocks_drilled_roundstat, 0)
|
||||||
|
GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
|
||||||
|
|
||||||
|
/hook/roundend/proc/RoundTrivia()//bazinga
|
||||||
|
var/list/valid_stats_list = list() //This is to be populated with the good shit
|
||||||
|
|
||||||
|
if(GLOB.lost_limbs_shift_roundstat > 1)
|
||||||
|
valid_stats_list.Add("[GLOB.lost_limbs_shift_roundstat] limbs left their owners bodies this shift, oh no!")
|
||||||
|
else if(GLOB.destroyed_research_items_roundstat > 13)
|
||||||
|
valid_stats_list.Add("[GLOB.destroyed_research_items_roundstat] objects were destroyed in the name of Science! Keep it up!")
|
||||||
|
else if(GLOB.mech_destroyed_roundstat > 1)
|
||||||
|
valid_stats_list.Add("[GLOB.mech_destroyed_roundstat] mechs were destroyed this shift. What did you do?")
|
||||||
|
else if(GLOB.seed_planted_shift_roundstat > 20)
|
||||||
|
valid_stats_list.Add("[GLOB.seed_planted_shift_roundstat] were planted according to our sensors this shift.")
|
||||||
|
|
||||||
|
if(GLOB.rocks_drilled_roundstat > 80)
|
||||||
|
valid_stats_list.Add("Our strong miners pulverized a whole [GLOB.rocks_drilled_roundstat] piles of pathetic rubble.")
|
||||||
|
else if(GLOB.items_sold_shift_roundstat > 15)
|
||||||
|
valid_stats_list.Add("The vending machines sold [GLOB.items_sold_shift_roundstat] items today.")
|
||||||
|
else if(GLOB.step_taken_shift_roundstat > 900)
|
||||||
|
valid_stats_list.Add("The employees walked a total of [GLOB.step_taken_shift_roundstat] steps for this shift! It should put them on the road to fitness!")
|
||||||
|
|
||||||
|
if(GLOB.cans_opened_roundstat > 0)
|
||||||
|
valid_stats_list.Add("[GLOB.cans_opened_roundstat] cans were drank today!")
|
||||||
|
else if(GLOB.lights_switched_on_roundstat > 0)
|
||||||
|
valid_stats_list.Add("[GLOB.lights_switched_on_roundstat] light switches were flipped today!")
|
||||||
|
else if(GLOB.turbo_lift_floors_moved_roundstat > 20)
|
||||||
|
valid_stats_list.Add("The elevator moved up [GLOB.turbo_lift_floors_moved_roundstat] floors today!")
|
||||||
|
else if(GLOB.disposals_flush_shift_roundstat > 40)
|
||||||
|
valid_stats_list.Add("The disposal system flushed a whole [GLOB.disposals_flush_shift_roundstat] times for this shift. We should really invest in waste treatement.")
|
||||||
|
|
||||||
|
if(LAZYLEN(valid_stats_list))
|
||||||
|
to_world("<B>Shift trivia!</B>")
|
||||||
|
|
||||||
|
for(var/body in valid_stats_list)
|
||||||
|
to_world("[body]")
|
||||||
@@ -67,6 +67,7 @@
|
|||||||
L.updateicon()
|
L.updateicon()
|
||||||
|
|
||||||
area.power_change()
|
area.power_change()
|
||||||
|
GLOB.lights_switched_on_roundstat++
|
||||||
|
|
||||||
/obj/machinery/light_switch/power_change()
|
/obj/machinery/light_switch/power_change()
|
||||||
|
|
||||||
|
|||||||
@@ -513,6 +513,8 @@
|
|||||||
visible_message("<span class='notice'>\The [src] clunks as it vends an additional item.</span>")
|
visible_message("<span class='notice'>\The [src] clunks as it vends an additional item.</span>")
|
||||||
playsound(src, "sound/[vending_sound]", 100, 1, 1)
|
playsound(src, "sound/[vending_sound]", 100, 1, 1)
|
||||||
|
|
||||||
|
GLOB.items_sold_shift_roundstat++
|
||||||
|
|
||||||
status_message = ""
|
status_message = ""
|
||||||
status_error = 0
|
status_error = 0
|
||||||
vend_ready = 1
|
vend_ready = 1
|
||||||
|
|||||||
@@ -324,6 +324,8 @@
|
|||||||
if(smoke_possible) //Just making sure nothing is running.
|
if(smoke_possible) //Just making sure nothing is running.
|
||||||
qdel(smoke_system)
|
qdel(smoke_system)
|
||||||
|
|
||||||
|
GLOB.mech_destroyed_roundstat++
|
||||||
|
|
||||||
QDEL_NULL(pr_int_temp_processor)
|
QDEL_NULL(pr_int_temp_processor)
|
||||||
QDEL_NULL(pr_inertial_movement)
|
QDEL_NULL(pr_inertial_movement)
|
||||||
QDEL_NULL(pr_give_air)
|
QDEL_NULL(pr_give_air)
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/drinks/proc/open(mob/user)
|
/obj/item/weapon/reagent_containers/food/drinks/proc/open(mob/user)
|
||||||
playsound(src,"canopen", rand(10,50), 1)
|
playsound(src,"canopen", rand(10,50), 1)
|
||||||
|
GLOB.cans_opened_roundstat++
|
||||||
to_chat(user, "<span class='notice'>You open [src] with an audible pop!</span>")
|
to_chat(user, "<span class='notice'>You open [src] with an audible pop!</span>")
|
||||||
flags |= OPENCONTAINER
|
flags |= OPENCONTAINER
|
||||||
|
|
||||||
|
|||||||
@@ -293,6 +293,7 @@
|
|||||||
if(seed.get_trait(TRAIT_SPREAD) > 0)
|
if(seed.get_trait(TRAIT_SPREAD) > 0)
|
||||||
to_chat(user, "<span class='notice'>You plant the [src.name].</span>")
|
to_chat(user, "<span class='notice'>You plant the [src.name].</span>")
|
||||||
new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed)
|
new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed)
|
||||||
|
GLOB.seed_planted_shift_roundstat++
|
||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -196,6 +196,8 @@
|
|||||||
|
|
||||||
qdel(S)
|
qdel(S)
|
||||||
|
|
||||||
|
GLOB.seed_planted_shift_roundstat++
|
||||||
|
|
||||||
check_health()
|
check_health()
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
|
|||||||
@@ -554,6 +554,8 @@ turf/simulated/mineral/floor/light_corner
|
|||||||
for (var/i = 1 to mineral.result_amount - mined_ore)
|
for (var/i = 1 to mineral.result_amount - mined_ore)
|
||||||
DropMineral()
|
DropMineral()
|
||||||
|
|
||||||
|
GLOB.rocks_drilled_roundstat++
|
||||||
|
|
||||||
//destroyed artifacts have weird, unpleasant effects
|
//destroyed artifacts have weird, unpleasant effects
|
||||||
//make sure to destroy them before changing the turf though
|
//make sure to destroy them before changing the turf though
|
||||||
if(artifact_find && artifact_fail)
|
if(artifact_find && artifact_fail)
|
||||||
|
|||||||
@@ -227,6 +227,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
var/S = pick(footstep_sounds)
|
var/S = pick(footstep_sounds)
|
||||||
|
GLOB.step_taken_shift_roundstat++
|
||||||
if(!S) return
|
if(!S) return
|
||||||
|
|
||||||
// Play every 20 steps while walking, for the sneak
|
// Play every 20 steps while walking, for the sneak
|
||||||
|
|||||||
@@ -840,6 +840,8 @@ Note that amputating the affected organ does in fact remove the infection from t
|
|||||||
if(disintegrate == DROPLIMB_EDGE && nonsolid)
|
if(disintegrate == DROPLIMB_EDGE && nonsolid)
|
||||||
disintegrate = DROPLIMB_BLUNT //splut
|
disintegrate = DROPLIMB_BLUNT //splut
|
||||||
|
|
||||||
|
GLOB.lost_limbs_shift_roundstat++
|
||||||
|
|
||||||
switch(disintegrate)
|
switch(disintegrate)
|
||||||
if(DROPLIMB_EDGE)
|
if(DROPLIMB_EDGE)
|
||||||
if(!clean)
|
if(!clean)
|
||||||
|
|||||||
@@ -481,6 +481,7 @@
|
|||||||
playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
|
playsound(src, 'sound/machines/disposalflush.ogg', 50, 0, 0)
|
||||||
last_sound = world.time
|
last_sound = world.time
|
||||||
sleep(5) // wait for animation to finish
|
sleep(5) // wait for animation to finish
|
||||||
|
GLOB.disposals_flush_shift_roundstat++
|
||||||
|
|
||||||
|
|
||||||
H.init(src, air_contents) // copy the contents of disposer to holder
|
H.init(src, air_contents) // copy the contents of disposer to holder
|
||||||
|
|||||||
@@ -103,6 +103,8 @@
|
|||||||
|
|
||||||
doors_closing = 0 // The doors weren't open, so they are done closing
|
doors_closing = 0 // The doors weren't open, so they are done closing
|
||||||
|
|
||||||
|
GLOB.turbo_lift_floors_moved_roundstat++
|
||||||
|
|
||||||
var/area/turbolift/origin = locate(current_floor.area_ref)
|
var/area/turbolift/origin = locate(current_floor.area_ref)
|
||||||
|
|
||||||
if(target_floor == current_floor)
|
if(target_floor == current_floor)
|
||||||
|
|||||||
@@ -359,6 +359,9 @@
|
|||||||
#include "code\datums\repositories\decls.dm"
|
#include "code\datums\repositories\decls.dm"
|
||||||
#include "code\datums\repositories\repository.dm"
|
#include "code\datums\repositories\repository.dm"
|
||||||
#include "code\datums\repositories\unique.dm"
|
#include "code\datums\repositories\unique.dm"
|
||||||
|
#include "code\datums\roundstats\_defines_local.dm"
|
||||||
|
#include "code\datums\roundstats\departmentgoal.dm"
|
||||||
|
#include "code\datums\roundstats\roundstats.dm"
|
||||||
#include "code\datums\supplypacks\atmospherics.dm"
|
#include "code\datums\supplypacks\atmospherics.dm"
|
||||||
#include "code\datums\supplypacks\contraband.dm"
|
#include "code\datums\supplypacks\contraband.dm"
|
||||||
#include "code\datums\supplypacks\costumes.dm"
|
#include "code\datums\supplypacks\costumes.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user