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} + + + ))} + +
+ ); +};