diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index 4c3a658ff421..71f3c5c29ec6 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -306,6 +306,7 @@ DEFINE_BITFIELD(whitelist_status, list(
#define FACTION_XENOMORPH_DELTA "Delta Xenomorph"
#define FACTION_LIST_XENOMORPH list(FACTION_XENOMORPH, FACTION_XENOMORPH_CORRPUTED, FACTION_XENOMORPH_ALPHA, FACTION_XENOMORPH_BRAVO, FACTION_XENOMORPH_CHARLIE, FACTION_XENOMORPH_DELTA)
+#define FACTION_LIST_ALL FACTION_LIST_HUMANOID + FACTION_LIST_XENOMORPH
// Faction allegiances within a certain faction.
diff --git a/code/__DEFINES/statistic.dm b/code/__DEFINES/statistic.dm
index c03b768fa431..d4a5af540555 100644
--- a/code/__DEFINES/statistic.dm
+++ b/code/__DEFINES/statistic.dm
@@ -5,6 +5,8 @@
#define FACEHUG_TIER_3 100
#define FACEHUG_TIER_4 1000
+// OOD mean Out Of Date (not used, please keep this list up to date, and remember sync in db changes)
+
// Statistics defines
#define STATISTIC_TYPE_MISC "Misc"
#define STATISTIC_TYPE_CASTE "Caste"
@@ -66,8 +68,9 @@
#define STATISTICS_UPGRADE_CADES "Barricades Upgraded"
#define STATISTICS_REPAIR_CADES "Barricades Repaired"
#define STATISTICS_REPAIR_GENERATOR "Generators Repaired"
-#define STATISTICS_UPGRADE_TURRETS "Defenses Upgraded"
+#define STATISTICS_REPAIR_SENSORTOWER "Sensor Towers Repaired"
#define STATISTICS_REPAIR_APC "APCs Repaired"
+#define STATISTICS_UPGRADE_TURRETS "Defenses Upgraded"
#define STATISTICS_DEFENSES_BUILT "Defenses Built" // OOD
#define STATISTICS_CORGI "Corgis Murdered"
diff --git a/code/datums/statistics/entities/death_stats.dm b/code/datums/statistics/entities/death_stats.dm
index aeb7d0a67eab..3de22b57dbcb 100644
--- a/code/datums/statistics/entities/death_stats.dm
+++ b/code/datums/statistics/entities/death_stats.dm
@@ -158,7 +158,7 @@ BSQL_PROTECT_DATUM(/datum/entity/statistic_death)
new_death.role_name = get_role_name()
new_death.mob_name = real_name
- new_death.faction_name = faction?.name
+ new_death.faction_name = faction
new_death.area_name = area.name
diff --git a/code/datums/statistics/entities/medal_stats.dm b/code/datums/statistics/entities/medal_stats.dm
index cdd7f3ed32aa..bb07c897e942 100644
--- a/code/datums/statistics/entities/medal_stats.dm
+++ b/code/datums/statistics/entities/medal_stats.dm
@@ -73,7 +73,7 @@ BSQL_PROTECT_DATUM(/datum/entity/statistic/medal)
if(giver_player)
new_medal.giver_player_id = giver_player.id
- track_statistic_earned(new_recipient.faction.faction_name, STATISTICS_MEDALS, 1, new_recipient.client.player_data)
+ track_statistic_earned(new_recipient.faction, STATISTICS_MEDALS, 1, new_recipient.client.player_data)
medals += new_medal
new_medal.save()
new_medal.detach()
@@ -86,7 +86,7 @@ BSQL_PROTECT_DATUM(/datum/entity/statistic/medal)
return FALSE
var/round_id = SSperf_logging.round?.id
- track_statistic_earned(recipient.faction.faction_name, STATISTICS_MEDALS, -1, recipient.client.player_data)
+ track_statistic_earned(recipient.faction, STATISTICS_MEDALS, -1, recipient.client.player_data)
for(var/datum/entity/statistic/medal/new_medal as anything in medals)
if(new_medal.round_id == round_id && new_medal.recipient_name == recipient.real_name && new_medal.medal_type == medal_type && new_medal.citation == citation)
medals -= new_medal
diff --git a/code/datums/statistics/entities/panel_stats.dm b/code/datums/statistics/entities/panel_stats.dm
index a1b51f31d93a..08b011dfd880 100644
--- a/code/datums/statistics/entities/panel_stats.dm
+++ b/code/datums/statistics/entities/panel_stats.dm
@@ -8,11 +8,11 @@
/datum/player_entity/ui_state(mob/user)
return GLOB.always_state
-/datum/player_entity/ui_data(mob/user, datum/entity/statistic_round/viewing_round = SSticker?.mode?.round_statistics )
+/datum/player_entity/ui_data(mob/user, datum/entity/statistic_round/viewing_round = GLOB.round_statistics)
var/list/data = list()
data["data_tabs"] = list()
if(viewing_round)
- data["round"] = viewing_round.update_panel_data()
+ data["round"] = viewing_round.cached_tgui_data
data["data_tabs"] += "Round"
if(length(medals))
@@ -127,7 +127,7 @@
)
return data
-/datum/entity/statistic_round/proc/update_panel_data()
+/datum/entity/statistic_round/process()
var/map_name
if(current_map)
map_name = current_map.map_name
@@ -183,7 +183,7 @@
"z" = statistic_death.z,
))
- return list(
+ cached_tgui_data = list(
"name" = round_name,
"game_mode" = game_mode,
"map_name" = map_name,
diff --git a/code/datums/statistics/entities/player_entity.dm b/code/datums/statistics/entities/player_entity.dm
index de14c0ee7c30..3cbdc93e21c9 100644
--- a/code/datums/statistics/entities/player_entity.dm
+++ b/code/datums/statistics/entities/player_entity.dm
@@ -26,6 +26,11 @@
if(!player || !faction || !statistic_type || !general_name || !statistic_name)
return
+ // Just in case, because here factions system is litteraly FUCKED UP I need set this check here for **NOW**, **UNITL** faction rework to datum is done
+ if(!(faction in FACTION_LIST_ALL))
+ return
+ // This is done, because if somebody start FUN around with faction names, then his STATISTIC pannel will be fucked up with a lot of faction names... just imagine, open it and see 200+ names, cool? 200%
+
var/datum/entity/statistic/statistic = player.player_entity?.get_statistic(faction, statistic_type, general_name, statistic_name)
if(statistic)
statistic.value += value
diff --git a/code/datums/statistics/entities/player_stats.dm b/code/datums/statistics/entities/player_stats.dm
index 59a86388eec4..f0c5e72d3577 100644
--- a/code/datums/statistics/entities/player_stats.dm
+++ b/code/datums/statistics/entities/player_stats.dm
@@ -106,116 +106,116 @@
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), STATISTICS_ROUNDS_PLAYED, 1, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), STATISTICS_ROUNDS_PLAYED, 1, client.player_data)
/mob/living/carbon/human/count_statistic_stat(statistic_name, amount = 1, weapon)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_steps_walked(amount = 1, statistic_name = STATISTICS_STEPS_WALKED)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_hit(weapon, amount = 1, statistic_name = STATISTICS_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_friendly_hit(weapon, amount = 1, statistic_name = STATISTICS_FF_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_shot(weapon, amount = 1, statistic_name = STATISTICS_SHOT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_shot_hit(weapon, mob/shot_mob, amount = 1, statistic_name = STATISTICS_SHOT_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_damage(weapon, mob/damaged_mob, amount = 1, statistic_name = STATISTICS_DAMAGE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_friendly_damage(weapon, mob/damaged_mob, amount = 1, statistic_name = STATISTICS_FF_DAMAGE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_heal_damage(weapon, mob/healed_mob, amount = 1, statistic_name = STATISTICS_HEALED_DAMAGE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_friendly_fire(weapon, amount = 1, statistic_name = STATISTICS_FF_SHOT_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_revive(amount = 1, statistic_name = STATISTICS_REVIVED)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_life_saved(amount = 1, statistic_name = STATISTICS_REVIVE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
/mob/living/carbon/human/track_scream(amount = 1, statistic_name = STATISTICS_SCREAM)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_JOB, get_role_name(), statistic_name, amount, client.player_data)
/////////////////////////////////////////////////////////////////////////////////////
//Xenomorph
@@ -225,128 +225,128 @@
if(!. || !faction)
return
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), STATISTICS_ROUNDS_PLAYED, 1, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), STATISTICS_ROUNDS_PLAYED, 1, client.player_data)
/mob/living/carbon/xenomorph/count_statistic_stat(statistic_name, amount = 1, weapon)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, caste_type, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, caste_type, statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_steps_walked(amount = 1, statistic_name = STATISTICS_STEPS_WALKED)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, caste_type, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, caste_type, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_hit(weapon, amount = 1, statistic_name = STATISTICS_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_friendly_hit(weapon, amount = 1, statistic_name = STATISTICS_FF_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_shot(weapon, amount = 1, statistic_name = STATISTICS_SHOT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_shot_hit(weapon, mob/shot_mob, amount = 1, statistic_name = STATISTICS_SHOT_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_damage(weapon, mob/damaged_mob, amount = 1, statistic_name = STATISTICS_DAMAGE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_friendly_damage(weapon, mob/damaged_mob, amount = 1, statistic_name = STATISTICS_FF_DAMAGE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_heal_damage(weapon, mob/healed_mob, amount = 1, statistic_name = STATISTICS_HEALED_DAMAGE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_friendly_fire(weapon, amount = 1, statistic_name = STATISTICS_FF_SHOT_HIT)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
if(weapon)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_WEAPON, weapon, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_revive(amount = 1, statistic_name = STATISTICS_REVIVED)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_life_saved(amount = 1, statistic_name = STATISTICS_REVIVE)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_scream(amount = 1, statistic_name = STATISTICS_SCREAM)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, get_role_name(), statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_slashes(caste, amount = 1, statistic_name = STATISTICS_SLASH)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, caste, statistic_name, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, caste, statistic_name, amount, client.player_data)
/mob/living/carbon/xenomorph/track_ability_usage(ability, caste, amount = 1)
. = ..()
if(!.)
return FALSE
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE_ABILITIES, caste, ability, amount, client.player_data)
- track_statistic_earned(faction.faction_name, STATISTIC_TYPE_CASTE, caste, STATISTICS_ABILITES, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE_ABILITIES, caste, ability, amount, client.player_data)
+ track_statistic_earned(faction, STATISTIC_TYPE_CASTE, caste, STATISTICS_ABILITES, amount, client.player_data)
diff --git a/code/datums/statistics/entities/round_stats.dm b/code/datums/statistics/entities/round_stats.dm
index 195a89cfc3c8..9b96e6383755 100644
--- a/code/datums/statistics/entities/round_stats.dm
+++ b/code/datums/statistics/entities/round_stats.dm
@@ -24,6 +24,7 @@
var/total_slashes = 0
// untracked data
+ var/list/cached_tgui_data
var/datum/entity/statistic_map/current_map = null // reference to current map
var/list/datum/entity/statistic_death/death_stats_list = list()
@@ -87,6 +88,7 @@
round_statistics.game_mode = name
round_statistics.real_time_start = world.realtime
round_statistics.save()
+ START_PROCESSING(SSobj, round_statistics)
GLOB.round_statistics = round_statistics
/datum/entity/statistic_round/proc/setup_faction(faction)
@@ -128,7 +130,7 @@
for(var/i in GLOB.alive_mob_list)
var/mob/M = i
if(M.mind && M.faction)
- track_final_participant(M.faction?.name)
+ track_final_participant(M.faction)
if(current_map)
current_map.total_rounds++
@@ -149,7 +151,7 @@
for(var/i in GLOB.alive_mob_list)
var/mob/M = i
if(M.mind)
- track_hijack_participant(M.faction?.name)
+ track_hijack_participant(M.faction)
round_hijack_time = duration2text(world.time)
save()
@@ -250,6 +252,8 @@
return TRUE
/datum/action/show_round_statistics/action_activate()
+ . = ..()
+
if(!can_use_action())
return
diff --git a/code/datums/statistics/random_facts/damage_fact.dm b/code/datums/statistics/random_facts/damage_fact.dm
index 2fa8a5d06491..c1be9f6d713f 100644
--- a/code/datums/statistics/random_facts/damage_fact.dm
+++ b/code/datums/statistics/random_facts/damage_fact.dm
@@ -5,5 +5,5 @@
/datum/random_fact/damage/life_grab_stat(mob/fact_mob)
return fact_mob.life_damage_taken_total
-/datum/random_fact/damage/death_grab_stat(datum/entity/statistic/death/fact_death)
+/datum/random_fact/damage/death_grab_stat(datum/entity/statistic_death/fact_death)
return fact_death.total_damage_taken
diff --git a/code/datums/statistics/random_facts/kills_fact.dm b/code/datums/statistics/random_facts/kills_fact.dm
index 7ef1c2b238de..e6752c48b55a 100644
--- a/code/datums/statistics/random_facts/kills_fact.dm
+++ b/code/datums/statistics/random_facts/kills_fact.dm
@@ -5,5 +5,5 @@
/datum/random_fact/kills/life_grab_stat(mob/fact_mob)
return fact_mob.life_kills_total
-/datum/random_fact/kills/death_grab_stat(datum/entity/statistic/death/fact_death)
+/datum/random_fact/kills/death_grab_stat(datum/entity/statistic_death/fact_death)
return fact_death.total_kills
diff --git a/code/datums/statistics/random_facts/random_fact.dm b/code/datums/statistics/random_facts/random_fact.dm
index d327bd36f4f6..099aed876a23 100644
--- a/code/datums/statistics/random_facts/random_fact.dm
+++ b/code/datums/statistics/random_facts/random_fact.dm
@@ -21,14 +21,12 @@
/datum/random_fact/proc/calculate_announcement_message()
var/death_stat_gotten = 0
var/living_stat_gotten = 0
- var/datum/entity/statistic/death/death_to_report = null
+ var/datum/entity/statistic_death/death_to_report = null
var/mob/mob_to_report = null
if(GLOB.round_statistics && length(GLOB.round_statistics.death_stats_list))
- for(var/datum/entity/statistic/death/death in GLOB.round_statistics.death_stats_list)
- if(!check_human && !death.is_xeno)
- continue
- if(!check_xeno && death.is_xeno)
+ for(var/datum/entity/statistic_death/death in GLOB.round_statistics.death_stats_list)
+ if(check_human && (death.faction_name in FACTION_LIST_XENOMORPH && check_xeno))
continue
if(death_stat_gotten < death_grab_stat(death))
death_to_report = death
@@ -82,5 +80,5 @@
/datum/random_fact/proc/life_grab_stat(mob/fact_mob)
return 0
-/datum/random_fact/proc/death_grab_stat(datum/entity/statistic/death/fact_death)
+/datum/random_fact/proc/death_grab_stat(datum/entity/statistic_death/fact_death)
return 0
diff --git a/code/datums/statistics/random_facts/revives_fact.dm b/code/datums/statistics/random_facts/revives_fact.dm
index 60b6daa896d2..0430ef3598d0 100644
--- a/code/datums/statistics/random_facts/revives_fact.dm
+++ b/code/datums/statistics/random_facts/revives_fact.dm
@@ -5,5 +5,5 @@
/datum/random_fact/revives/life_grab_stat(mob/fact_mob)
return fact_mob.life_revives_total
-/datum/random_fact/revives/death_grab_stat(datum/entity/statistic/death/fact_death)
+/datum/random_fact/revives/death_grab_stat(datum/entity/statistic_death/fact_death)
return fact_death.total_revives_done
diff --git a/code/datums/tutorial/ss13/_ss13.dm b/code/datums/tutorial/ss13/_ss13.dm
index 53cf5c918ee9..91a6b7c612b8 100644
--- a/code/datums/tutorial/ss13/_ss13.dm
+++ b/code/datums/tutorial/ss13/_ss13.dm
@@ -27,7 +27,6 @@
if(tutorial_mob.mind)
tutorial_mob.mind_initialize()
tutorial_mob.mind.transfer_to(new_character, TRUE)
- tutorial_mob.mind.setup_human_stats()
INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, regenerate_icons))
INVOKE_ASYNC(new_character, TYPE_PROC_REF(/mob/living/carbon/human, update_body), 1, 0)
diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm
index 0914b4fa6b1f..b8b303f243a5 100644
--- a/code/game/gamemodes/cm_initialize.dm
+++ b/code/game/gamemodes/cm_initialize.dm
@@ -163,7 +163,6 @@ Additional game mode variables.
if(player.client.prefs.get_job_priority(JOB_PREDATOR) > 0) //Are their prefs turned on?
if(!player.mind) //They have to have a key if they have a client.
player.mind_initialize() //Will work on ghosts too, but won't add them to active minds.
- player.mind.setup_human_stats()
player.faction = FACTION_YAUTJA
players += player.mind
return players
@@ -338,7 +337,6 @@ Additional game mode variables.
// Helper proc to set some constants
/proc/setup_new_xeno(datum/mind/new_xeno)
new_xeno.roundstart_picked = TRUE
- new_xeno.setup_xeno_stats()
/datum/game_mode/proc/check_xeno_late_join(mob/xeno_candidate)
if(jobban_isbanned(xeno_candidate, JOB_XENOMORPH)) // User is jobbanned
@@ -674,7 +672,6 @@ Additional game mode variables.
new_xeno.SetSleeping(0) // ghosting sleeps, but they got a new mind! wake up! (/mob/living/verb/ghost())
new_xeno.mind_initialize()
- new_xeno.mind.player_entity = setup_player_entity(xeno_candidate_mind.ckey)
new_xeno.statistic_tracked = FALSE
// Let the round recorder know that the key has changed
diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm
index 9eac36f7970c..2cf394fa3346 100644
--- a/code/game/gamemodes/colonialmarines/colonialmarines.dm
+++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm
@@ -12,24 +12,6 @@
flags_round_type = MODE_INFESTATION|MODE_FOG_ACTIVATED|MODE_NEW_SPAWN
static_comms_amount = 1
var/round_status_flags
- round_end_states = list(MODE_INFESTATION_X_MAJOR, MODE_INFESTATION_M_MAJOR, MODE_INFESTATION_X_MINOR, MODE_INFESTATION_M_MINOR, MODE_INFESTATION_DRAW_DEATH)
-
- faction_result_end_state = list(
- FACTION_MARINE = list(
- MODE_INFESTATION_M_MAJOR = list("marine_major", list('sound/music/round_end/winning_triumph1.ogg', 'sound/music/round_end/winning_triumph2.ogg'), list('sound/music/round_end/issomebodysinging.ogg')),
- MODE_INFESTATION_M_MINOR = list("marine_major", list('sound/music/round_end/neutral_hopeful1.ogg', 'sound/music/round_end/neutral_hopeful2.ogg'), list()),
- MODE_INFESTATION_X_MINOR = list("marine_minor", list('sound/music/round_end/neutral_melancholy1.ogg', 'sound/music/round_end/neutral_melancholy2.ogg'), list('sound/music/round_end/bluespace.ogg')),
- MODE_INFESTATION_X_MAJOR = list("marine_minor", list('sound/music/round_end/sad_loss1.ogg', 'sound/music/round_end/sad_loss2.ogg'), list('sound/music/round_end/end.ogg')),
- MODE_GENERIC_DRAW_NUKE = list("draw", list('sound/music/round_end/nuclear_detonation1.ogg', 'sound/music/round_end/nuclear_detonation2.ogg'), list()),
- ),
- FACTION_XENOMORPH_NORMAL = list(
- MODE_INFESTATION_X_MAJOR = list("xeno_major", list('sound/music/round_end/winning_triumph1.ogg', 'sound/music/round_end/winning_triumph2.ogg'), list()),
- MODE_INFESTATION_X_MINOR = list("xeno_major", list('sound/music/round_end/neutral_hopeful1.ogg', 'sound/music/round_end/neutral_hopeful2.ogg'), list()),
- MODE_INFESTATION_M_MINOR = list("xeno_minor", list('sound/music/round_end/neutral_melancholy1.ogg', 'sound/music/round_end/neutral_melancholy2.ogg'), list('sound/music/round_end/bluespace.ogg')),
- MODE_INFESTATION_M_MAJOR = list("xeno_minor", list('sound/music/round_end/sad_loss1.ogg', 'sound/music/round_end/sad_loss2.ogg'), list('sound/music/round_end/end.ogg')),
- MODE_GENERIC_DRAW_NUKE = list("draw", list('sound/music/round_end/nuclear_detonation1.ogg', 'sound/music/round_end/nuclear_detonation2.ogg'), list()),
- )
- )
var/research_allocation_interval = 10 MINUTES
var/next_research_allocation = 0
@@ -481,7 +463,7 @@
//Announces the end of the game with all relevant information stated//
//////////////////////////////////////////////////////////////////////
-/* TODO: PUT IT SOMEWHERE LATER
+/* TODO: PUT IT SOMEWHERE LATER (faction rework PR)
#define MAJORITY 0.5 // What percent do we consider a 'majority?'
if(MODE_INFESTATION_X_MINOR)
var/list/living_player_list = count_humans_and_xenos(get_affected_zlevels())
@@ -522,6 +504,50 @@ if(MODE_INFESTATION_X_MINOR)
add_current_round_status_to_end_results("Round End")
handle_round_results_statistics_output()
+/datum/game_mode/colonialmarines/get_winners_states()
+ var/majority = 0.5
+ var/end_icon = "draw"
+ var/musical_track
+ switch(round_finished)
+ if(MODE_INFESTATION_X_MAJOR)
+ musical_track = pick('sound/theme/sad_loss1.ogg','sound/theme/sad_loss2.ogg')
+ end_icon = "xeno_major"
+ if(MODE_INFESTATION_M_MAJOR)
+ musical_track = pick('sound/theme/winning_triumph1.ogg','sound/theme/winning_triumph2.ogg')
+ end_icon = "marine_major"
+ if(MODE_INFESTATION_X_MINOR)
+ var/list/living_player_list = count_humans_and_xenos(get_affected_zlevels())
+ if(living_player_list[1] && !living_player_list[2]) // If Xeno Minor but Xenos are dead and Humans are alive, see which faction is the last standing
+ var/headcount = count_per_faction()
+ var/living = headcount["total_headcount"]
+ if ((headcount["WY_headcount"] / living) > majority)
+ musical_track = pick('sound/theme/lastmanstanding_wy.ogg')
+ log_game("3rd party victory: Weyland-Yutani")
+ message_admins("3rd party victory: Weyland-Yutani")
+ else if ((headcount["UPP_headcount"] / living) > majority)
+ musical_track = pick('sound/theme/lastmanstanding_upp.ogg')
+ log_game("3rd party victory: Union of Progressive Peoples")
+ message_admins("3rd party victory: Union of Progressive Peoples")
+ else if ((headcount["CLF_headcount"] / living) > majority)
+ musical_track = pick('sound/theme/lastmanstanding_clf.ogg')
+ log_game("3rd party victory: Colonial Liberation Front")
+ message_admins("3rd party victory: Colonial Liberation Front")
+ else if ((headcount["marine_headcount"] / living) > majority)
+ musical_track = pick('sound/theme/neutral_melancholy2.ogg') //This is the theme song for Colonial Marines the game, fitting
+ else
+ musical_track = pick('sound/theme/neutral_melancholy1.ogg')
+ end_icon = "xeno_minor"
+ if(MODE_INFESTATION_M_MINOR)
+ musical_track = pick('sound/theme/neutral_hopeful1.ogg','sound/theme/neutral_hopeful2.ogg')
+ end_icon = "marine_minor"
+ if(MODE_INFESTATION_DRAW_DEATH)
+ end_icon = "draw"
+ musical_track = 'sound/theme/neutral_hopeful2.ogg'
+ var/sound/S = sound(musical_track, channel = SOUND_CHANNEL_LOBBY)
+ S.status = SOUND_STREAM
+ sound_to(world, S)
+ return list(end_icon)
+
/datum/game_mode/colonialmarines/proc/add_current_round_status_to_end_results(special_round_status as text)
var/players = GLOB.clients
var/list/counted_humans = list(
diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
index 25866d5ead33..31e6635bfa43 100644
--- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
+++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm
@@ -37,19 +37,6 @@
/datum/job/marine/standard/whiskey = JOB_SQUAD_MARINE,
)
- round_end_states = list(MODE_WISKEY_OUTPOST_X_MAJOR, MODE_WISKEY_OUTPOST_M_MAJOR)
-
- faction_result_end_state = list(
- FACTION_MARINE = list(
- MODE_WISKEY_OUTPOST_M_MAJOR = list("marine_major", list('sound/misc/hell_march.ogg'), list('sound/music/round_end/issomebodysinging.ogg')),
- MODE_WISKEY_OUTPOST_X_MAJOR = list("marine_minor", list('sound/misc/Game_Over_Man.ogg'), list('sound/music/round_end/end.ogg')),
- ),
- FACTION_XENOMORPH_NORMAL = list(
- MODE_WISKEY_OUTPOST_X_MAJOR = list("xeno_major", list('sound/misc/hell_march.ogg'), list('sound/music/round_end/bluespace.ogg')),
- MODE_WISKEY_OUTPOST_M_MAJOR = list("xeno_minor", list('sound/misc/Game_Over_Man.ogg'), list('sound/music/round_end/end.ogg')),
- )
- )
-
latejoin_larva_drop = 0 //You never know
//var/mob/living/carbon/human/Commander //If there is no Commander, marines wont get any supplies
@@ -283,6 +270,26 @@
to_world(SPAN_ROUNDBODY("It will be another five years before the USCM returns to the Neroid Sector, with the arrival of the 2nd 'Falling Falcons' Battalion and the USS Almayer."))
to_world(SPAN_ROUNDBODY("The xenomorph hive on LV-624 remains unthreatened until then..."))
+/datum/game_mode/xenovs/get_winners_states()
+ var/end_icon = "draw"
+ var/musical_track
+ switch(round_finished)
+ if(MODE_WISKEY_OUTPOST_M_MAJOR)
+ musical_track = 'sound/misc/hell_march.ogg'
+ end_icon = "marine_major"
+ if(MODE_WISKEY_OUTPOST_X_MAJOR)
+ musical_track = 'sound/misc/Game_Over_Man.ogg'
+ end_icon = "xeno_major"
+ else
+ musical_track = 'sound/misc/sadtrombone.ogg'
+ if(GLOB.round_statistics)
+ GLOB.round_statistics.round_result = MODE_INFESTATION_DRAW_DEATH
+
+ var/sound/S = sound(musical_track, channel = SOUND_CHANNEL_LOBBY)
+ S.status = SOUND_STREAM
+ sound_to(world, S)
+ return list(end_icon)
+
///////////////////////////////
//Other WO things to simulate//
///////////////////////////////
diff --git a/code/game/gamemodes/colonialmarines/xenovsxeno.dm b/code/game/gamemodes/colonialmarines/xenovsxeno.dm
index e2e4547fc9a8..9d71cf3cae01 100644
--- a/code/game/gamemodes/colonialmarines/xenovsxeno.dm
+++ b/code/game/gamemodes/colonialmarines/xenovsxeno.dm
@@ -257,31 +257,21 @@
. = ..()
declare_completion_announce_xenomorphs()
- calculate_end_statistics()
declare_fun_facts()
+/datum/game_mode/xenovs/get_winners_states()
+ var/end_icon = "xeno_major"
+ var/musical_track
+ musical_track = pick('sound/theme/neutral_melancholy1.ogg', 'sound/theme/neutral_melancholy2.ogg')
+
+ var/sound/S = sound(musical_track, channel = SOUND_CHANNEL_LOBBY)
+ S.status = SOUND_STREAM
+ sound_to(world, S)
+ return list(end_icon)
+
/datum/game_mode/xenovs/announce_ending()
if(GLOB.round_statistics)
GLOB.round_statistics.track_round_end()
log_game("Round end result: [round_finished]")
to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Round Complete|"))
to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDBODY("Thus ends the story of the battling hives on [SSmapping.configs[GROUND_MAP].map_name]. [round_finished]\nThe game-mode was: [GLOB.master_mode]!\n[CONFIG_GET(string/endofroundblurb)]"))
-
-/datum/game_mode/xenovs/get_winners_states()
- var/list/icon_states = list()
- var/list/musical_tracks = list()
- var/sound/sound
- for(var/faction_name in factions_pool)
- var/pick = 2
- if(faction_won.faction_name == faction_name)
- pick = 1
-
- icon_states[faction_name] = faction_result_end_state[pick][1]
- sound = sound(pick(faction_result_end_state[pick][2]), channel = SOUND_CHANNEL_LOBBY)
- sound.status = SOUND_STREAM
- musical_tracks[faction_name] = sound
- sound = sound(pick(faction_result_end_state[pick][3]), channel = SOUND_CHANNEL_LOBBY)
- sound.status = SOUND_STREAM
- musical_tracks[faction_name] += sound
-
- return list(icon_states, musical_tracks)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 5e02a475a42b..ed013a208b26 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -18,9 +18,6 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t
var/votable = TRUE
var/vote_cycle = null
var/probability = 0
- var/list/round_end_states = list()
- var/list/faction_round_end_state = list()
- var/list/faction_result_end_state = list()
var/list/datum/mind/modePlayer = new
var/required_players = 0
var/required_players_secret = 0 //Minimum number of players for that game mode to be chose in Secret
@@ -163,6 +160,7 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t
announce_ending()
var/list/winners_info = get_winners_states()
+
if(GLOB.round_statistics)
GLOB.round_statistics.game_mode = name
GLOB.round_statistics.round_length = world.time
@@ -176,34 +174,10 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t
GLOB.round_statistics.track_round_end()
calculate_end_statistics()
- show_end_statistics(winners_info[1], winners_info[2], winners_info[3])
+ show_end_statistics(winners_info[1])
/datum/game_mode/proc/get_winners_states()
- var/list/icon_states = list()
- var/list/musical_tracks = list()
- var/list/standart_payload = list()
- standart_payload += "draw"
- var/sound/sound = sound(pick('sound/music/round_end/sad_loss1.ogg', 'sound/music/round_end/sad_loss2.ogg', 'sound/music/round_end/neutral_melancholy1.ogg', 'sound/music/round_end/neutral_melancholy2.ogg'), channel = SOUND_CHANNEL_LOBBY)
- sound.status = SOUND_STREAM
- standart_payload += sound
- sound = sound(pick('sound/music/round_end/end.ogg'), channel = SOUND_CHANNEL_LOBBY)
- sound.status = SOUND_STREAM
- standart_payload += sound
- for(var/faction_name in factions_pool)
- if(faction_result_end_state[faction_name])
- icon_states[faction_name] = faction_result_end_state[faction_name][round_finished][1]
- sound = sound(pick(faction_result_end_state[faction_name][round_finished][2]), channel = SOUND_CHANNEL_LOBBY)
- sound.status = SOUND_STREAM
- musical_tracks[faction_name] = list(sound)
- sound = sound(pick(faction_result_end_state[faction_name][round_finished][3]), channel = SOUND_CHANNEL_LOBBY)
- sound.status = SOUND_STREAM
- musical_tracks[faction_name] += sound
- else
- icon_states[faction_name] = standart_payload[1]
- musical_tracks[faction_name] = list(standart_payload[2], standart_payload[3])
-
-
- return list(icon_states, musical_tracks, standart_payload)
+ return list("draw")
/datum/game_mode/proc/calculate_end_statistics()
for(var/i in GLOB.alive_mob_list)
@@ -218,27 +192,11 @@ GLOBAL_VAR_INIT(cas_tracking_id_increment, 0) //this var used to assign unique t
else
record_playtime(M.client.player_data, M.job, type)
-/datum/game_mode/proc/show_end_statistics(icon_states, musical_tracks, standart_payload)
- var/list/mobs = list()
- for(var/faction_name in factions_pool)
- var/faction_to_get = factions_pool[faction_name]
- var/datum/faction/faction = GLOB.faction_datums[faction_to_get]
- for(var/mob/mob in faction.totalMobs)
- if(mob.client)
- mobs += mob
- give_action(mob, /datum/action/show_round_statistics, null, icon_states[faction_to_get])
- sound_to(mob, musical_tracks[faction.name][1])
- if(length(musical_tracks[faction_to_get]) > 1)
- spawn(20 SECONDS)
- sound_to(mob, musical_tracks[faction_to_get][2])
-
- for(var/mob/mob in GLOB.player_list - mobs)
- if(mob.client)
- give_action(mob, /datum/action/show_round_statistics, null, standart_payload[1])
- sound_to(mob, standart_payload[2])
- if(length(standart_payload) > 2)
- spawn(20 SECONDS)
- sound_to(mob, standart_payload[3])
+/datum/game_mode/proc/show_end_statistics(icon_state)
+ GLOB.round_statistics.process()
+ for(var/mob/M in GLOB.player_list)
+ if(M.client)
+ give_action(M, /datum/action/show_round_statistics, null, icon_state)
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
return FALSE
diff --git a/code/game/jobs/job/antag/xeno/xenomorph.dm b/code/game/jobs/job/antag/xeno/xenomorph.dm
index eeca16bc7f90..25bfad7387c5 100644
--- a/code/game/jobs/job/antag/xeno/xenomorph.dm
+++ b/code/game/jobs/job/antag/xeno/xenomorph.dm
@@ -26,8 +26,6 @@
transform_to_xeno(H, XENO_HIVE_NORMAL)
/datum/job/antag/xenos/proc/transform_to_xeno(mob/living/carbon/human/human_to_transform, hive_index)
- var/datum/mind/new_xeno = human_to_transform.mind
- new_xeno.setup_xeno_stats()
var/datum/hive_status/hive = GLOB.hive_datum[hive_index]
human_to_transform.first_xeno = TRUE
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 16e7c19bbbad..9c71df9f4aa8 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -155,7 +155,7 @@
create_shrapnel(location, rand(1,5), explosion_direction, shrapnel_type = /datum/ammo/bullet/shrapnel/light/glass, cause_data = cause_data)
if(M)
- mob.count_statistic_stat(STATISTICS_DESTRUCTION_WINDOWS)
+ M.count_statistic_stat(STATISTICS_DESTRUCTION_WINDOWS)
SEND_SIGNAL(M, COMSIG_MOB_WINDOW_EXPLODED, src)
handle_debris(severity, explosion_direction)
diff --git a/code/game/verbs/records.dm b/code/game/verbs/records.dm
index 750e0dafed79..b14a92192e81 100644
--- a/code/game/verbs/records.dm
+++ b/code/game/verbs/records.dm
@@ -201,7 +201,7 @@ GLOBAL_DATUM_INIT(medals_view_given_tgui, /datum/medals_view_tgui/given_medals,
/datum/medals_view_tgui/given_medals/get_medals(mob/user)
- return DB_VIEW(/datum/view_record/medal_view, DB_COMP("giver_player_id", DB_EQUALS, user.client.player_data.id))
+ return DB_VIEW(/datum/view_record/statistic_medal, DB_COMP("giver_player_id", DB_EQUALS, user.client.player_data.id))
/datum/medals_view_tgui/given_medals/tgui_interact(mob/user, datum/tgui/ui)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 4d0ef56b9fdd..59cbf3b1c90e 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -300,8 +300,6 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
next_external_rsc = WRAP(next_external_rsc+1, 1, length(external_rsc_urls)+1)
preload_rsc = external_rsc_urls[next_external_rsc]
- player_entity = setup_player_entity(ckey)
-
if(check_localhost_status())
var/datum/admins/admin = new("!localhost!", RL_HOST, ckey)
admin.associate(src)
@@ -535,11 +533,10 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
return
if(GLOB.player_entities["[ckey]"])
return GLOB.player_entities["[ckey]"]
- var/datum/entity/player_entity/P = new()
+ var/datum/player_entity/P = new()
P.ckey = ckey
- P.name = ckey
+ P.entity_name = ckey
GLOB.player_entities["[ckey]"] = P
- // P.setup_save(ckey)
return P
/proc/save_player_entities()
@@ -811,12 +808,6 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
total_xeno_playtime += get_job_playtime(src, JOB_XENOMORPH)
- if(player_entity)
- var/past_xeno_playtime = player_entity.get_playtime(STATISTIC_XENO)
- if(past_xeno_playtime)
- total_xeno_playtime += past_xeno_playtime
-
-
cached_xeno_playtime = total_xeno_playtime
return total_xeno_playtime
diff --git a/code/modules/cm_tech/implements/implants.dm b/code/modules/cm_tech/implements/implants.dm
index e008512138b9..131bd925cdfa 100644
--- a/code/modules/cm_tech/implements/implants.dm
+++ b/code/modules/cm_tech/implements/implants.dm
@@ -105,7 +105,7 @@
if(uses <= 0)
return
- user.count_statistic_stat(STATISTICS_IMPLANTS_IMPLANTED)
+ M.count_statistic_stat(STATISTICS_IMPLANTS_IMPLANTED)
if(LAZYISIN(M.implants, implant_type))
QDEL_NULL(M.implants[implant_type])
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
index dd9a111a2874..2b3590d6be47 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
@@ -169,7 +169,7 @@
age = XENO_NORMAL
- var/datum/entity/statistic/statistic = client?.player_data?.player_entity?.get_statistic(faction.faction_name, STATISTIC_TYPE_CASTE_ABILITIES, caste_type, STATISTICS_FACEHUGGE)
+ var/datum/entity/statistic/statistic = client?.player_data?.player_entity?.get_statistic(faction, STATISTIC_TYPE_CASTE_ABILITIES, caste_type, STATISTICS_FACEHUGGE)
total_facehugs = statistic.value
switch(total_facehugs)
if(FACEHUG_TIER_1 to FACEHUG_TIER_2)
diff --git a/code/modules/mob/mob_verbs.dm b/code/modules/mob/mob_verbs.dm
index 180882a00528..ea5a37506e4e 100644
--- a/code/modules/mob/mob_verbs.dm
+++ b/code/modules/mob/mob_verbs.dm
@@ -31,14 +31,14 @@
to_chat(usr, SPAN_DANGER("This mob type cannot throw items."))
return
-/mob/verb/view_stats()
+/mob/verb/view_playtimes()
set category = "OOC.Records"
set name = "View Playtimes"
set desc = "View your playtimes."
if(!SSentity_manager.ready)
to_chat(src, "DB is still starting up, please wait")
return
- if(client && client.player_entity)
+ if(client?.player_data)
client.player_data.tgui_interact(src)
/mob/verb/toggle_high_toss()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index d09343ba5ed4..70b733ceb752 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -281,16 +281,17 @@
hive.stored_larva++
hive.hive_ui.update_burrowed_larva()
- if(character.mind && character.mind.player_entity)
- var/datum/entity/player_entity/player = character.mind.player_entity
- if(player.get_playtime(STATISTIC_HUMAN) == 0 && player.get_playtime(STATISTIC_XENO) == 0)
+ if(character.mind && character.client.player_data)
+ var/list/xeno_playtimes = LAZYACCESS(character.client.player_data.playtime_data, "stored_xeno_playtime")
+ var/list/marine_playtimes = LAZYACCESS(character.client.player_data.playtime_data, "stored_human_playtime")
+ if(!xeno_playtimes && !marine_playtimes)
msg_admin_niche("NEW JOIN: [key_name(character, 1, 1, 0)]. IP: [character.lastKnownIP], CID: [character.computer_id]")
if(character.client)
- var/client/client = character.client
- if(client.player_data && client.player_data.playtime_loaded && length(client.player_data.playtimes) == 0)
+ var/client/C = character.client
+ if(C.player_data && C.player_data.playtime_loaded && length(C.player_data.playtimes) == 0)
msg_admin_niche("NEW PLAYER: [key_name(character, 1, 1, 0)]. IP: [character.lastKnownIP], CID: [character.computer_id]")
- if(client.player_data && client.player_data.playtime_loaded && ((round(client.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1)) <= CONFIG_GET(number/notify_new_player_age)))
- msg_sea("NEW PLAYER: [key_name(character, 0, 1, 0)] only has [(round(client.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1))] hours as a human. Current role: [get_actual_job_name(character)] - Current location: [get_area(character)]")
+ if(C.player_data && C.player_data.playtime_loaded && ((round(C.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1)) <= 5))
+ msg_sea("NEW PLAYER: [key_name(character, 0, 1, 0)] only has [(round(C.get_total_human_playtime() DECISECONDS_TO_HOURS, 0.1))] hours as a human. Current role: [character.job] - Current location: [get_area(character)]")
character.client.init_verbs()
qdel(src)
diff --git a/tgui/packages/tgui/interfaces/KillPanel.jsx b/tgui/packages/tgui/interfaces/KillPanel.jsx
deleted file mode 100644
index 535c7eda4b78..000000000000
--- a/tgui/packages/tgui/interfaces/KillPanel.jsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Fragment } from 'react';
-
-import { useBackend } from '../backend';
-import { Box, Collapsible, NoticeBox, Section } from '../components';
-import { Window } from '../layouts';
-
-export const KillPanel = (props) => {
- const { act, data } = useBackend();
- const { death_data } = data;
-
- const real_data = death_data['death_stats_list'];
-
- return (
-
-
-
- {death_data ? (
-
- ) : (
- No recorded kills!
- )}
-
-
-
- );
-};
-
-const KillView = (props) => {
- const { act, data } = useBackend();
- const { death_data } = data;
-
- const real_data = death_data['death_stats_list'];
-
- return real_data.map((entry, index) => (
-
- Mob: {entry.mob_name}
- {entry.job_name ? (
- <>
-
- Job: {entry.job_name}
- >
- ) : null}
-
- Area: {entry.area_name}
-
- Cause: {entry.cause_name}
-
- Time: {entry.time_of_death}
-
- Lifespan: {entry.total_time_alive}
-
- Damage taken: {entry.total_damage_taken}
-
-
- Coords: {entry.x}, {entry.y}, {entry.z}
-
-
- ));
-};
diff --git a/tgui/packages/tgui/interfaces/Statistic.jsx b/tgui/packages/tgui/interfaces/Statistic.jsx
new file mode 100644
index 000000000000..ddb56b1e8de2
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Statistic.jsx
@@ -0,0 +1,393 @@
+import { Fragment } from 'react';
+
+import { useBackend, useLocalState } from '../backend';
+import {
+ Box,
+ Collapsible,
+ Flex,
+ NoticeBox,
+ Section,
+ Tabs,
+} from '../components';
+import { Window } from '../layouts';
+
+export const Statistic = (props, context) => {
+ const { act, data } = useBackend(context);
+ const [selectedTab, setSelectedTab] = useLocalState(
+ context,
+ 'selectedTab',
+ 0,
+ );
+
+ const { data_tabs, round, medals } = data;
+
+ return (
+
+
+
+
+
+ act('update')}
+ >
+ Update
+
+ {data_tabs.map((tab) => (
+ setSelectedTab(tab)}
+ >
+ {tab}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const GetTab = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { factions } = data;
+ const { selectedTab, round, medals } = props;
+
+ switch (selectedTab) {
+ case 'Round':
+ return (
+
+
+
+ Name: {round.name}
+ Gamemode: {round.game_mode}
+ Map: {round.map_name}
+ Result: {round.round_result}
+ Round Start: {round.real_time_start}
+ Round Time End: {round.real_time_end}
+ Round Length: {round.round_length}
+ {round.round_hijack_time ? (
+ Hijack Time: {round.round_hijack_time}
+ ) : null}
+ Total Shots Fired: {round.total_projectiles_fired}
+ Total Shots Hit: {round.total_projectiles_hit}
+
+ Total Shots Hit (Human): {round.total_projectiles_hit_human}
+
+
+ Total Shots Hit (Xeno): {round.total_projectiles_hit_xeno}
+
+ Total Slashes: {round.total_slashes}
+
+ Total Shots Hit (FF): {round.total_friendly_fire_instances}
+
+ Total FF Kills: {round.total_friendly_kills}
+ Total Huggers Applied: {round.total_huggers_applied}
+ Total Larva Burst: {round.total_larva_burst}
+ {round.end_round_player_population ? (
+ Final Population: {round.end_round_player_population}
+ ) : null}
+ Total Deaths: {round.total_deaths}
+ {round.Participants ? (
+ <>
+
+
+ Participants:
+ {round.Participants.map((entry, index) => (
+
+
+
+ {entry.name}: {entry.value}
+
+
+
+
+ ))}
+
+ >
+ ) : null}
+ {round.hijack_participants ? (
+ <>
+
+
+ Hijack Participants:
+ {round.hijack_participants.map((entry, index) => (
+
+
+
+ {entry.name}: {entry.value}
+
+
+
+
+ ))}
+
+ >
+ ) : null}
+ {round.final_participants ? (
+ <>
+
+
+ Final Participants:
+ {round.final_participants.map((entry, index) => (
+
+
+
+ {entry.name}: {entry.value}
+
+
+
+
+ ))}
+
+ >
+ ) : null}
+
+
+ {round.death_list ? (
+
+ ) : (
+ No recorded kills!
+ )}
+
+ );
+ case 'Medals':
+ return (
+
+ {medals.map((entry, index) => (
+
+
+ Round ID: {entry.round_id}
+ Medal Type: {entry.medal_type}
+ Recipient: {entry.recipient}
+ Recipient Job: {entry.recipient_job}
+ Citation: {entry.citation}
+ Giver: {entry.giver}
+
+
+
+ ))}
+
+ );
+ default:
+ if (!factions[selectedTab]) return;
+ return ;
+ }
+};
+
+const StatTab = (props, context) => {
+ const { faction } = props;
+ return (
+
+ {faction.statistics.length ? (
+ <>
+
+ {faction.statistics.map((entry, index) => (
+
+
+ {entry.name}: {entry.value}
+
+
+
+ ))}
+
+
+ >
+ ) : null}
+ {faction.top_statistics.length ? (
+ <>
+
+ {faction.top_statistics.map((entry, index) => (
+
+
+ {entry.name}
+ {entry.statistics.length ? (
+ <>
+
+ {entry.statistics.map((entry, index) => (
+
+
+ {entry.name}: {entry.value}
+
+
+
+ ))}
+ >
+ ) : null}
+
+
+
+ ))}
+
+
+ >
+ ) : null}
+ {faction.nemesis.length ? (
+ <>
+
+
+ {faction.nemesis.name}: {faction.nemesis.value}
+
+
+
+ >
+ ) : null}
+ {faction.death_list.length ? (
+
+ ) : (
+ No recorded deaths!
+ )}
+
+
+ {faction.statistics_list.length ? (
+
+ {faction.statistics_list.map((entry, index) => (
+
+ {entry.value.length ? (
+ <>
+
+ {entry.value.map((entry, index) => (
+
+
+ {entry.name}
+ {entry.statistics.length ? (
+
+ Statistics
+
+ {entry.statistics.map((entry, index) => (
+
+
+ {entry.name}: {entry.value}
+
+
+ ))}
+
+ ) : null}
+
+ {entry.top_statistics.length ? (
+
+ Top Statistics
+
+ {entry.top_statistics.map((entry, index) => (
+
+
+ {entry.name}: {entry.value}
+
+
+ ))}
+
+ ) : null}
+
+
+
+ ))}
+ >
+ ) : null}
+
+ ))}
+
+ ) : null}
+
+
+ );
+};
+
+const KillView = (props, context) => {
+ const { real_data } = props;
+ return (
+
+
+ {real_data.map((entry, index) => (
+
+ Mob: {entry.mob_name}
+ {entry.job_name ? (
+ <>
+
+ Job: {entry.job_name}
+ >
+ ) : null}
+
+ Area: {entry.area_name}
+
+ Cause: {entry.cause_name}
+
+ Time: {entry.time_of_death}
+
+ Lifespan: {entry.total_time_alive}
+
+ Damage taken: {entry.total_damage_taken}
+
+
+ Coords: {entry.x}, {entry.y}, {entry.z}
+
+
+ ))}
+
+
+ );
+};