diff --git a/SQL/migrate/V077__decrepit_skills_removal.sql b/SQL/migrate/V077__decrepit_skills_removal.sql
new file mode 100644
index 00000000000..7efaf2ddc3c
--- /dev/null
+++ b/SQL/migrate/V077__decrepit_skills_removal.sql
@@ -0,0 +1,7 @@
+--
+-- Implemented in PR #14591.
+-- Removes the decrepit, unused skills in the loadout.
+--
+
+ALTER TABLE `ss13_characters` DROP COLUMN `skills`;
+ALTER TABLE `ss13_characters` DROP COLUMN `skill_specialization`;
\ No newline at end of file
diff --git a/aurorastation.dme b/aurorastation.dme
index 5a0747ebe85..cc9b1977f55 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -1570,7 +1570,6 @@
#include "code\modules\client\preference_setup\occupation\occupation.dm"
#include "code\modules\client\preference_setup\origin\origin.dm"
#include "code\modules\client\preference_setup\other\01_incidents.dm"
-#include "code\modules\client\preference_setup\skills\skills.dm"
#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\clothing_accessories.dm"
@@ -2177,7 +2176,6 @@
#include "code\modules\mob\abstract\new_player\new_player.dm"
#include "code\modules\mob\abstract\new_player\poll.dm"
#include "code\modules\mob\abstract\new_player\preferences_setup.dm"
-#include "code\modules\mob\abstract\new_player\skill.dm"
#include "code\modules\mob\abstract\new_player\sprite_accessories.dm"
#include "code\modules\mob\abstract\observer\login.dm"
#include "code\modules\mob\abstract\observer\logout.dm"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 06ea1c12d3c..233a6df78c8 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1193,23 +1193,6 @@ proc/admin_notice(var/message, var/rights)
if(!ai_number)
to_chat(usr, "No AIs located") //Just so you know the thing is actually working and not just ignoring you.)
-/datum/admins/proc/show_skills()
- set category = "Admin"
- set name = "Show Skills"
-
- if (!istype(src,/datum/admins))
- src = usr.client.holder
- if (!istype(src,/datum/admins))
- to_chat(usr, "Error: you are not an admin!")
- return
-
- var/mob/living/carbon/human/M = input("Select mob.", "Select mob.") as null|anything in human_mob_list
- if(!M) return
-
- show_skill_window(usr, M)
-
- return
-
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
set category = "Admin"
set name = "Update Mob Sprite"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 121ee88cd18..9cc6deb191a 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -71,7 +71,6 @@ var/list/admin_verbs_admin = list(
/client/proc/toggledebuglogs,
/client/proc/toggleghostwriters,
/client/proc/toggledrones,
- /datum/admins/proc/show_skills,
/client/proc/damage_menu,
/client/proc/man_up,
/client/proc/global_man_up,
@@ -262,7 +261,6 @@ var/list/admin_verbs_hideable = list(
/client/proc/wipe_ai,
/client/proc/toggleghostwriters,
/client/proc/toggledrones,
- /datum/admins/proc/show_skills,
/client/proc/restart_sql,
/client/proc/damage_menu,
/client/proc/man_up,
@@ -412,7 +410,6 @@ var/list/admin_verbs_mod = list(
/client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
/client/proc/dsay,
- /datum/admins/proc/show_skills,
/datum/admins/proc/show_player_panel,
/client/proc/check_antagonists,
/client/proc/jobbans,
diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index 1ceadba9bf2..505e8002167 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -28,35 +28,30 @@
sort_order = 2
category_item_type = /datum/category_item/player_setup_item/origin
-/datum/category_group/player_setup_category/skill_preferences
- name = "Skills"
- sort_order = 3
- category_item_type = /datum/category_item/player_setup_item/skills
-
/datum/category_group/player_setup_category/occupation_preferences
name = "Occupation"
- sort_order = 4
+ sort_order = 3
category_item_type = /datum/category_item/player_setup_item/occupation
/datum/category_group/player_setup_category/appearance_preferences
name = "Roles"
- sort_order = 5
+ sort_order = 4
category_item_type = /datum/category_item/player_setup_item/antagonism
/datum/category_group/player_setup_category/loadout_preferences
name = "Loadout"
- sort_order = 6
+ sort_order = 5
category_item_type = /datum/category_item/player_setup_item/loadout
/datum/category_group/player_setup_category/global_preferences
name = "Global"
- sort_order = 7
+ sort_order = 6
category_item_type = /datum/category_item/player_setup_item/player_global
sql_role = SQL_PREFERENCES
/datum/category_group/player_setup_category/other_preferences
name = "Other"
- sort_order = 8
+ sort_order = 7
category_item_type = /datum/category_item/player_setup_item/other
/****************************
diff --git a/code/modules/client/preference_setup/skills/skills.dm b/code/modules/client/preference_setup/skills/skills.dm
deleted file mode 100644
index 77f13a876de..00000000000
--- a/code/modules/client/preference_setup/skills/skills.dm
+++ /dev/null
@@ -1,126 +0,0 @@
-/datum/category_item/player_setup_item/skills
- name = "Skills"
- sort_order = 1
-
-/datum/category_item/player_setup_item/skills/load_character(var/savefile/S)
- S["skills"] >> pref.skills
- S["used_skillpoints"] >> pref.used_skillpoints
- S["skill_specialization"] >> pref.skill_specialization
-
-/datum/category_item/player_setup_item/skills/save_character(var/savefile/S)
- S["skills"] << pref.skills
- S["used_skillpoints"] << pref.used_skillpoints
- S["skill_specialization"] << pref.skill_specialization
-
-/datum/category_item/player_setup_item/skills/gather_load_query()
- return list(
- "ss13_characters" = list(
- "vars" = list(
- "skills",
- "skill_specialization"
- ),
- "args" = list("id")
- )
- )
-
-/datum/category_item/player_setup_item/skills/gather_load_parameters()
- return list("id" = pref.current_character)
-
-/datum/category_item/player_setup_item/skills/gather_save_query()
- return list(
- "ss13_characters" = list(
- "skills",
- "skill_specialization",
- "id" = 1,
- "ckey" = 1
- )
- )
-
-/datum/category_item/player_setup_item/skills/gather_save_parameters()
- return list(
- "skills" = list2params(pref.skills),
- "skill_specialization" = pref.skill_specialization,
- "id" = pref.current_character,
- "ckey" = PREF_CLIENT_CKEY
- )
-
-/datum/category_item/player_setup_item/skills/sanitize_character(var/sql_load = 0)
- if (SKILLS == null)
- setup_skills()
- if (!pref.skills)
- pref.skills = list()
- if (sql_load)
- pref.skills = params2list(pref.skills)
-
- if (!pref.skills || !islist(pref.skills) || !pref.skills.len)
- pref.ZeroSkills()
- else
- for (var/skill in pref.skills)
- pref.skills[skill] = text2num(pref.skills[skill])
-
- pref.CalculateSkillPoints()
- if (!pref.skills.len)
- pref.ZeroSkills()
- if (pref.used_skillpoints < 0)
- pref.used_skillpoints = 0
-
-/datum/category_item/player_setup_item/skills/content(var/mob/user)
- var/list/dat = list(
- "Select your Skills
",
- "Current skill level: [pref.GetSkillClass(pref.used_skillpoints)] ([pref.used_skillpoints])
",
- "Use preconfigured skillset
",
- "
"
- )
- for(var/V in SKILLS)
- dat += "| [V]"
- dat += " |
"
- for(var/datum/skill/S in SKILLS[V])
- var/level = pref.skills[S.ID]
- dat += ""
- dat += "| [S.name] | "
- dat += "\[Untrained\] | "
- // secondary skills don't have an amateur level
- if(S.secondary)
- dat += " | "
- else
- dat += "\[Amateur\] | "
- dat += "\[Trained\] | "
- dat += "\[Professional\] | "
- dat += "
"
- dat += "
"
- . = dat.Join()
-
-/datum/category_item/player_setup_item/skills/OnTopic(href, href_list, user)
- if(href_list["skillinfo"])
- var/datum/skill/S = locate(href_list["skillinfo"])
- var/HTML = "[S.name]
[S.desc]"
- user << browse(HTML, "window=\ref[user]skillinfo")
- return TOPIC_HANDLED
-
- else if(href_list["setskill"])
- var/datum/skill/S = locate(href_list["setskill"])
- var/value = text2num(href_list["newvalue"])
- pref.skills[S.ID] = value
- pref.CalculateSkillPoints()
- return TOPIC_REFRESH
-
- else if(href_list["preconfigured"])
- var/selected = input(user, "Select a skillset", "Skillset") as null|anything in SKILL_PRE
- if(!selected && !CanUseTopic(user)) return
-
- pref.ZeroSkills(1)
- for(var/V in SKILL_PRE[selected])
- if(V == "field")
- pref.skill_specialization = SKILL_PRE[selected]["field"]
- continue
- pref.skills[V] = SKILL_PRE[selected][V]
- pref.CalculateSkillPoints()
-
- return TOPIC_REFRESH
-
- else if(href_list["setspecialization"])
- pref.skill_specialization = href_list["setspecialization"]
- pref.CalculateSkillPoints()
- return TOPIC_REFRESH
-
- return ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index aef0c2284d0..91c8276f591 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -125,10 +125,6 @@ datum/preferences
//Keeps track of preferrence for not getting any wanted jobs
var/alternate_option = RETURN_TO_LOBBY
- var/used_skillpoints = 0
- var/skill_specialization = null
- var/list/skills = list() // skills can range from 0 to 3
-
// maps each organ to either null(intact), "cyborg" or "amputated"
// will probably not be able to do this for head and torso ;)
var/list/organ_data = list()
@@ -215,58 +211,6 @@ datum/preferences
var/datum/species/mob_species = all_species[species]
return mob_species.age_max
-/datum/preferences/proc/ZeroSkills(var/forced = 0)
- for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
- if(!skills.Find(S.ID) || forced)
- skills[S.ID] = SKILL_NONE
-
-/datum/preferences/proc/CalculateSkillPoints()
- used_skillpoints = 0
- for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V])
- var/multiplier = 1
- switch(skills[S.ID])
- if(SKILL_NONE)
- used_skillpoints += 0 * multiplier
- if(SKILL_BASIC)
- used_skillpoints += 1 * multiplier
- if(SKILL_ADEPT)
- // secondary skills cost less
- if(S.secondary)
- used_skillpoints += 1 * multiplier
- else
- used_skillpoints += 3 * multiplier
- if(SKILL_EXPERT)
- // secondary skills cost less
- if(S.secondary)
- used_skillpoints += 3 * multiplier
- else
- used_skillpoints += 6 * multiplier
-
-/datum/preferences/proc/GetSkillClass(points)
- return CalculateSkillClass(points, age)
-
-/proc/CalculateSkillClass(points, age)
- if(points <= 0) return "Unconfigured"
- // skill classes describe how your character compares in total points
- points -= min(round((age - 20) / 2.5), 4) // every 2.5 years after 20, one extra skillpoint
- if(age > 30)
- points -= round((age - 30) / 5) // every 5 years after 30, one extra skillpoint
- switch(points)
- if(-1000 to 3)
- return "Terrifying"
- if(4 to 6)
- return "Below Average"
- if(7 to 10)
- return "Average"
- if(11 to 14)
- return "Above Average"
- if(15 to 18)
- return "Exceptional"
- if(19 to 24)
- return "Genius"
- if(24 to 1000)
- return "God"
-
/datum/preferences/proc/ShowChoices(mob/user)
if(!user || !user.client) return
var/dat = ""
@@ -473,9 +417,6 @@ datum/preferences
character.origin.on_apply(character)
character.culture.on_apply(character)
- character.skills = skills
- character.used_skillpoints = used_skillpoints
-
// Destroy/cyborgize organs & setup body markings
character.sync_organ_prefs_to_mob(src)
@@ -620,8 +561,6 @@ datum/preferences
gear_list = list() //Dont copy the loadout
- ZeroSkills(1)
-
// Do we need to reinitialize a whole bunch more vars?
if (re_initialize)
be_special_role = list()
diff --git a/code/modules/mob/abstract/new_player/skill.dm b/code/modules/mob/abstract/new_player/skill.dm
deleted file mode 100644
index bdb014c9ba5..00000000000
--- a/code/modules/mob/abstract/new_player/skill.dm
+++ /dev/null
@@ -1,207 +0,0 @@
-var/global/const
- SKILL_NONE = 0
- SKILL_BASIC = 1
- SKILL_ADEPT = 2
- SKILL_EXPERT = 3
-
-datum/skill/var
- ID = "none" // ID of the skill, used in code
- name = "None" // name of the skill
- desc = "Placeholder skill" // detailed description of the skill
- field = "Misc" // the field under which the skill will be listed
- secondary = 0 // secondary skills only have two levels and cost significantly less
-
-var/global/list/SKILLS = null
-var/list/SKILL_ENGINEER = list("field" = "Engineering", "EVA" = SKILL_BASIC, "construction" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "engines" = SKILL_ADEPT)
-var/list/SKILL_ORGAN_ROBOTICIST = list("field" = "Science", "devices" = SKILL_ADEPT, "electrical" = SKILL_BASIC, "computer" = SKILL_ADEPT, "anatomy" = SKILL_BASIC)
-var/list/SKILL_SECURITY_OFFICER = list("field" = "Security", "combat" = SKILL_BASIC, "weapons" = SKILL_ADEPT, "law" = SKILL_ADEPT, "forensics" = SKILL_BASIC)
-var/list/SKILL_CHEMIST = list("field" = "Science", "chemistry" = SKILL_ADEPT, "science" = SKILL_ADEPT, "medical" = SKILL_BASIC, "devices" = SKILL_BASIC)
-var/global/list/SKILL_PRE = list("Engineer" = SKILL_ENGINEER, "Roboticist" = SKILL_ORGAN_ROBOTICIST, "Security Officer" = SKILL_SECURITY_OFFICER, "Chemist" = SKILL_CHEMIST)
-
-datum/skill/management
- ID = "management"
- name = "Command"
- desc = "Your ability to manage and commandeer other crew members."
-
-datum/skill/combat
- ID = "combat"
- name = "Close Combat"
- desc = "This skill describes your training in hand-to-hand combat or melee weapon usage. While expertise in this area is rare in the era of firearms, experts still exist among athletes."
- field = "Security"
-
-datum/skill/weapons
- ID = "weapons"
- name = "Weapons Expertise"
- desc = "This skill describes your expertise with and knowledge of weapons. A low level in this skill implies knowledge of simple weapons, for example tazers and flashes. A high level in this skill implies knowledge of complex weapons, such as grenades, riot shields, pulse rifles or bombs. A low level in this skill is typical for security officers, a high level of this skill is typical for special agents and soldiers."
- field = "Security"
-
-datum/skill/EVA
- ID = "EVA"
- name = "Extra-vehicular activity"
- desc = "This skill describes your skill and knowledge of space-suits and working in vacuum."
- field = "Engineering"
- secondary = 1
-
-datum/skill/forensics
- ID = "forensics"
- name = "Forensics"
- desc = "Describes your skill at performing forensic examinations and identifying vital evidence. Does not cover analytical abilities, and as such isn't the only indicator for your investigation skill. Note that in order to perform autopsy, the surgery skill is also required."
- field = "Security"
-
-datum/skill/construction
- ID = "construction"
- name = "Construction"
- desc = "Your ability to construct various buildings, such as walls, floors, tables and so on. Note that constructing devices such as APCs additionally requires the Electronics skill. A low level of this skill is typical for janitors, a high level of this skill is typical for engineers."
- field = "Engineering"
-
-datum/skill/knowledge/law
- ID = "law"
- name = "Corporate Law"
- desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for captains."
- field = "Security"
- secondary = 1
-
-datum/skill/devices
- ID = "devices"
- name = "Complex Devices"
- desc = "Describes the ability to assemble complex devices, such as computers, circuits, printers, robots or gas tank assemblies(bombs). Note that if a device requires electronics or programming, those skills are also required in addition to this skill."
- field = "Science"
-
-datum/skill/electrical
- ID = "electrical"
- name = "Electrical Engineering"
- desc = "This skill describes your knowledge of electronics and the underlying physics. A low level of this skill implies you know how to lay out wiring and configure powernets, a high level of this skill is required for working complex electronic devices such as circuits or bots."
- field = "Engineering"
-
-datum/skill/atmos
- ID = "atmos"
- name = "Atmospherics"
- desc = "Describes your knowledge of piping, air distribution and gas dynamics."
- field = "Engineering"
-
-datum/skill/engines
- ID = "engines"
- name = "Engines"
- desc = "Describes your knowledge of the various engine types common on space stations, such as the singularity or anti-matter engine."
- field = "Engineering"
- secondary = 1
-
-datum/skill/computer
- ID = "computer"
- name = "Information Technology"
- desc = "Describes your understanding of computers, software and communication. Not a requirement for using computers, but definitely helps. Used in telecommunications and programming of computers and AIs."
- field = "Science"
-
-datum/skill/pilot
- ID = "pilot"
- name = "Heavy Machinery Operation"
- desc = "Describes your experience and understanding of operating heavy machinery, which includes mechs and other large exosuits. Used in piloting mechs."
- field = "Engineering"
-
-datum/skill/medical
- ID = "medical"
- name = "Medicine"
- desc = "Covers an understanding of the human body and medicine. At a low level, this skill gives a basic understanding of applying common types of medicine, and a rough understanding of medical devices like the health analyzer. At a high level, this skill grants exact knowledge of all the medicine available on the station, as well as the ability to use complex medical devices like the body scanner or mass spectrometer."
- field = "Medical"
-
-datum/skill/anatomy
- ID = "anatomy"
- name = "Anatomy"
- desc = "Gives you a detailed insight of the human body. A high skill in this is required to perform surgery.This skill may also help in examining alien biology."
- field = "Medical"
-
-datum/skill/virology
- ID = "virology"
- name = "Virology"
- desc = "This skill implies an understanding of microorganisms and their effects on humans."
- field = "Medical"
-
-datum/skill/genetics
- ID = "genetics"
- name = "Genetics"
- desc = "Implies an understanding of how DNA works and the structure of the human DNA."
- field = "Science"
-
-datum/skill/chemistry
- ID = "chemistry"
- name = "Chemistry"
- desc = "Experience with mixing chemicals, and an understanding of what the effect will be. This doesn't cover an understanding of the effect of chemicals on the human body, as such the medical skill is also required for medical chemists."
- field = "Science"
-
-datum/skill/botany
- ID = "botany"
- name = "Botany"
- desc = "Describes how good a character is at growing and maintaining plants."
-
-datum/skill/cooking
- ID = "cooking"
- name = "Cooking"
- desc = "Describes a character's skill at preparing meals and other consumable goods. This includes mixing alcoholic beverages."
-
-datum/skill/science
- ID = "science"
- name = "Science"
- desc = "Your experience and knowledge with scientific methods and processes."
- field = "Science"
-
-datum/attribute/var
- ID = "none"
- name = "None"
- desc = "This is a placeholder"
-
-
-proc/setup_skills()
- if(SKILLS == null)
- SKILLS = list()
- for(var/T in (typesof(/datum/skill)-/datum/skill))
- var/datum/skill/S = new T
- if(S.ID != "none")
- if(!SKILLS.Find(S.field))
- SKILLS[S.field] = list()
- var/list/L = SKILLS[S.field]
- L += S
-
-
-mob/living/carbon/human/proc/GetSkillClass(points)
- return CalculateSkillClass(points, age)
-
-proc/show_skill_window(var/mob/user, var/mob/living/carbon/human/M)
- if(!istype(M)) return
- if(SKILLS == null)
- setup_skills()
-
- if(!M.skills || M.skills.len == 0)
- to_chat(user, "There are no skills to display.")
- return
-
- var/HTML = ""
- HTML += "Select your Skills
"
- HTML += "Current skill level: [M.GetSkillClass(M.used_skillpoints)] ([M.used_skillpoints])
"
- HTML += ""
- for(var/V in SKILLS)
- HTML += "| [V]"
- HTML += " |
"
- for(var/datum/skill/S in SKILLS[V])
- var/level = M.skills[S.ID]
- HTML += ""
- HTML += "| [S.name] | "
- HTML += "\[Untrained\] | "
- // secondary skills don't have an amateur level
- if(S.secondary)
- HTML += " | "
- else
- HTML += "\[Amateur\] | "
- HTML += "\[Trained\] | "
- HTML += "\[Professional\] | "
- HTML += "
"
- HTML += "
"
-
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=show_skills;size=600x800")
- return
-
-mob/living/carbon/human/verb/show_skills()
- set category = "IC"
- set name = "Show Own Skills"
-
- show_skill_window(src, src)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index c865bc59ab3..33bd802d214 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -74,10 +74,6 @@
var/obj/item/s_store = null
var/obj/item/wrists = null
- var/used_skillpoints = 0
- var/skill_specialization = null
- var/list/skills = list()
-
var/icon/stand_icon = null
var/icon/lying_icon = null
diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm
index 1bad3d544bb..21b8efec3b6 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack.dm
@@ -30,10 +30,8 @@
attack_name = "claws"
/datum/unarmed_attack/claws/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
- var/skill = user.skills["combat"]
var/obj/item/organ/external/affecting = target.get_organ(zone)
- if(!skill) skill = 1
attack_damage = Clamp(attack_damage, 1, 5)
if(target == user)
diff --git a/html/changelogs/remove_fake_skills.yml b/html/changelogs/remove_fake_skills.yml
new file mode 100644
index 00000000000..15981ffa2e5
--- /dev/null
+++ b/html/changelogs/remove_fake_skills.yml
@@ -0,0 +1,6 @@
+author: SleepyGemmy
+
+delete-after: True
+
+changes:
+ - rscdel: "Removes the decrepit, unused skills in the loadout."
\ No newline at end of file