From 6c5d42b5f51546e4a78fe7bf3d18bb029ada8376 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 00:48:56 -0700 Subject: [PATCH 1/9] oh boy --- code/__DEFINES/skills/skills.dm | 28 +++++++ code/datums/mind.dm | 4 + code/datums/skills/_skill.dm | 79 +++++++++++++++++++ code/datums/skills/_skill_holder.dm | 62 +++++++++++++++ code/datums/skills/medical.dm | 3 + code/modules/jobs/job_types/_job.dm | 19 ++++- code/modules/jobs/job_types/chemist.dm | 3 + .../jobs/job_types/chief_medical_officer.dm | 3 + code/modules/jobs/job_types/geneticist.dm | 2 + code/modules/jobs/job_types/medical_doctor.dm | 3 + code/modules/jobs/job_types/paramedic.dm | 3 + code/modules/jobs/job_types/virologist.dm | 3 + code/modules/surgery/surgery_step.dm | 3 + tgstation.dme | 3 + 14 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 code/__DEFINES/skills/skills.dm create mode 100644 code/datums/skills/_skill.dm create mode 100644 code/datums/skills/_skill_holder.dm create mode 100644 code/datums/skills/medical.dm diff --git a/code/__DEFINES/skills/skills.dm b/code/__DEFINES/skills/skills.dm new file mode 100644 index 0000000000..8d40c32020 --- /dev/null +++ b/code/__DEFINES/skills/skills.dm @@ -0,0 +1,28 @@ +/// true/false +#define SKILL_PROGRESSION_BINARY 1 +/// numerical +#define SKILL_PROGRESSION_NUMERICAL 2 +/// Enum +#define SKILL_PROGRESSION_ENUM 3 + +/// Max value of skill for numerical skills +#define SKILL_NUMERICAL_MAX 100 +/// Min value of skill for numerical skills +#define SKILL_NUMERICAL_MIN 0 + +// Standard values for job starting skills + +#define STARTING_SKILL_SURGERY_MEDICAL 35 //out of SKILL_NUMERICAL_MAX + +// Standard values for job starting skill affinities + +#define STARTING_SKILL_AFFINITY_SURGERY_MEDICAL 1.25 + +// Standard values for skill gain (this is multiplied by affinity) + +#define SKILL_GAIN_SURGERY_PER_STEP 0.25 + +// Misc + +/// 40% speedup at 100 skill +#define SURGERY_SKILL_SPEEDUP_NUMERICAL_SCALE(number) clamp(number / 250, 1, 2) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 31704d5451..728c4fb51b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -63,7 +63,11 @@ var/force_escaped = FALSE // Set by Into The Sunset command of the shuttle manipulator var/list/learned_recipes //List of learned recipe TYPES. + /// Our skill holder. + var/datum/skill_holder/skill_holder + /datum/mind/New(var/key) + skill_holder = new src.key = key soulOwner = src martial_art = default_martial_art diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm new file mode 100644 index 0000000000..6480dbf553 --- /dev/null +++ b/code/datums/skills/_skill.dm @@ -0,0 +1,79 @@ +GLOBAL_LIST_INIT(skill_datums, init_skill_datums()) + +/proc/init_skill_datums() + . = list() + for(var/path in subtypesof(/datum/skill)) + var/datum/skill/S = path + if(S.abstract_type == path) + continue + S = new path + .[S.type] = S + +/proc/get_skill_datum(path) + return GLOB.skill_datums[path] + +/proc/sanitize_skill_value(path, value) + var/datum/skill/S = get_skill_datum(path) + // don't check, if we runtime let it happen. + return S.sanitize_value(value) + +/proc/is_skill_value_greater(path, existing, new_value) + var/datum/skill/S = get_skill_datum(path) + // don't check, if we runtime let it happen. + return S.is_value_greater(existing, new_value) + +/** + * Skill datums + */ +/datum/skill + /// Our name + var/name + /// Our description + var/desc + /// Our progression type + var/progression_type + /// Abstract type + var/abstract_type = /datum/skill + +/** + * Ensures what someone's setting as a value for this skill is valid. + */ +/datum/skill/proc/sanitize_value(new_value) + return new_value + +/** + * Checks if a value is greater + */ +/datum/skill/proc/is_value_greater(existing, new_value) + return new_value > existing + +// Just saying, the choice to use different sub-parent-types is to force coders to resolve issues as I won't be implementing custom procs to grab skill levels in a certain context. +// Aka: So people don't forget to change checks if they change a skill's progression type. + +/datum/skill/binary + abstract_type = /datum/skill/binary + progression_type = SKILL_PROGRESSION_BINARY + +/datum/skill/binary/sanitize_value(new_value) + return new_value? TRUE : FALSE + +/datum/skill/numerical + abstract_type = /datum/skill/numerical + progression_type = SKILL_PROGRESSION_NUMERICAL + /// Max value of this skill + var/max_value = 100 + /// Min value of this skill + var/min_value = 0 + +/datum/skill/numerical/sanitize_value(new_value) + return clamp(new_value, min_value, max_value) + +/datum/skill/enum + abstract_type = /datum/skill/enum + progression_type = SKILL_PROGRESSION_ENUM + /// Valid values for the skill + var/list/valid_values = list() + +/datum/skill/enum/sanitize_value(new_value) + if(new_value in valid_values) + return new_value diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm new file mode 100644 index 0000000000..4e4dc35da4 --- /dev/null +++ b/code/datums/skills/_skill_holder.dm @@ -0,0 +1,62 @@ +/** + * Skill holder datums + */ +/datum/skill_holder + /// Our list of skills and values. Lazylist. Associative. Keys are datum typepaths to the skill. + var/list/skills + /// Same as [skills] but affinities, which are multiplied to increase amount when gaining skills. + var/list/skill_affinities + +/** + * Grabs the value of a skill. + */ +/datum/skill_holder/proc/get_skill_value(skill) + if(!ispath(skill)) + CRASH("Invalid get_skill_value call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. + if(!skills) + return null + return skills[skill] + +/** + * Grabs our affinity for a skill. !!This is a multiplier!! + */ +/datum/skill_holder/proc/get_skill_affinity(skill) + if(!ispath(skill)) + CRASH("Invalid get_skill_affinity call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. + if(!skills) + return 1 + return skill_affinities[skill] + +/** + * Sets the value of a skill. + */ +/datum/skill_holder/proc/set_skill_value(skill, value) + if(!ispath(skill)) + CRASH("Invalid set_skill_value call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. + LAZYINITLIST(skills) + value = sanitize_skill_value(skill, value) + if(!isnull(value)) + skills[skill] = value + return TRUE + return FALSE + +/** + * Boosts a skill to a value if not aobve + */ +/datum/skill_holder/proc/boost_skill_value_to(skill, value) + var/current = get_skill_value(skill) + if(!is_skill_value_greater(skill, current, value)) + return FALSE + set_skill_value(skill, value) + return TRUE + +/** + * Automatic skill increase, multiplied by skill affinity if existing. + * Only works if skill is numerical. + */ +/datum/skill_holder/proc/auto_gain_experience(skill, value) + if(!ispath(skill, /datum/skill/numerical)) + CRASH("You cannot auto increment a non numerical skill!") + var/current = get_skill_value(skill) + var/affinity = get_skill_affinity(skill) + bosst_skill_value_to(skill, current + (value * affinity)) diff --git a/code/datums/skills/medical.dm b/code/datums/skills/medical.dm new file mode 100644 index 0000000000..3b67cacb04 --- /dev/null +++ b/code/datums/skills/medical.dm @@ -0,0 +1,3 @@ +/datum/skill/numerical/surgery + name = "Surgery" + desc = "How proficient you are at doing surgery." diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index ee441c21f7..fac976d62a 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -66,6 +66,11 @@ // How much threat this job is worth in dynamic. Is subtracted if the player's not an antag, added if they are. var/threat = 0 + /// Starting skill levels. + var/list/starting_skills + /// Skill affinities to set + var/list/skill_affinities + //Only override this proc //H is usually a human unless an /equip override transformed it /datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE) @@ -142,7 +147,6 @@ return TRUE //Available in 0 days = available right now = player is old enough to play. return FALSE - /datum/job/proc/available_in_days(client/C) if(!C) return 0 @@ -166,6 +170,17 @@ /datum/job/proc/radio_help_message(mob/M) to_chat(M, "Prefix your message with :h to speak on your department's radio. To see other prefixes, look closely at your headset.") +/datum/job/proc/standard_assign_skills(datum/mind/M) + if(!starting_skills) + return + for(var/skill in starting_skills) + M.skill_holder.boost_skill_value_to(skill, starting_skills[skill]) + // do wipe affinities though + M.skill_holder.skill_affinities = list() + for(var/skill in skill_affinities) + M.skill_holder.skill_affinities[skill] = skill_affinities[skill] + LAZYCLEARLIST(M.skill_holder.skill_affinities) //if we didn't set any. + /datum/outfit/job name = "Standard Gear" @@ -243,6 +258,8 @@ if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences. PDA.update_style(preference_source) + standard_assign_skills(H.mind) + /datum/outfit/job/get_chameleon_disguise_info() var/list/types = ..() types -= /obj/item/storage/backpack //otherwise this will override the actual backpacks diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 44b0e90ec8..571785526b 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -19,6 +19,9 @@ display_order = JOB_DISPLAY_ORDER_CHEMIST threat = 1.5 + starting_skills = list(/datum/skill/numerical/surgery = STARTING_SKILL_SURGERY_MEDICAL) + skill_affinities = list(/datum/skill/numerical/surgery = STARTING_SKILL_AFFINITY_SURGERY_MEDICAL) + /datum/outfit/job/chemist name = "Chemist" jobtype = /datum/job/chemist diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 8dd7fafab3..478c33551d 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -29,6 +29,9 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 2 + starting_skills = list(/datum/skill/numerical/surgery = STARTING_SKILL_SURGERY_MEDICAL) + skill_affinities = list(/datum/skill/numerical/surgery = STARTING_SKILL_AFFINITY_SURGERY_MEDICAL) + /datum/outfit/job/cmo name = "Chief Medical Officer" jobtype = /datum/job/cmo diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 2e8b18d772..4fb989f6e8 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -19,6 +19,8 @@ display_order = JOB_DISPLAY_ORDER_GENETICIST threat = 1.5 + starting_skills = list(/datum/skill/numerical/surgery = STARTING_SKILL_SURGERY_MEDICAL) + /datum/outfit/job/geneticist name = "Geneticist" jobtype = /datum/job/geneticist diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 3eaa2ae10a..0e8b2e645b 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -17,6 +17,9 @@ display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR threat = 0.5 + starting_skills = list(/datum/skill/numerical/surgery = STARTING_SKILL_SURGERY_MEDICAL) + skill_affinities = list(/datum/skill/numerical/surgery = STARTING_SKILL_AFFINITY_SURGERY_MEDICAL) + /datum/outfit/job/doctor name = "Medical Doctor" jobtype = /datum/job/doctor diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index df6e1431ae..e8098daddc 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -19,6 +19,9 @@ threat = 0.5 + starting_skills = list(/datum/skill/numerical/surgery = STARTING_SKILL_SURGERY_MEDICAL) + skill_affinities = list(/datum/skill/numerical/surgery = STARTING_SKILL_AFFINITY_SURGERY_MEDICAL) + /datum/outfit/job/paramedic name = "Paramedic" jobtype = /datum/job/paramedic diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 4ba65dff59..78f0ba4272 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -20,6 +20,9 @@ threat = 1.5 + starting_skills = list(/datum/skill/numerical/surgery = STARTING_SKILL_SURGERY_MEDICAL) + skill_affinities = list(/datum/skill/numerical/surgery = STARTING_SKILL_AFFINITY_SURGERY_MEDICAL) + /datum/outfit/job/virologist name = "Virologist" jobtype = /datum/job/virologist diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 1857f8db48..d02495776f 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -58,6 +58,9 @@ return FALSE if(tool) speed_mod = tool.toolspeed + var/skill_mod = 1 + if(user?.mind?.skill_holder) + skill_mode = SURGERY_SKILL_SPEEDUP_NUMERICAL_SCALE(user.mind.skill_holder.get_skill_value(/datum/skill/medical/surgery)) if(do_after(user, time * speed_mod, target = target)) var/prob_chance = 100 if(implement_type) //this means it isn't a require hand or any item step. diff --git a/tgstation.dme b/tgstation.dme index 5a9fcc618b..005f2d80e2 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -124,6 +124,7 @@ #include "code\__DEFINES\dcs\signals.dm" #include "code\__DEFINES\flags\shields.dm" #include "code\__DEFINES\misc\return_values.dm" +#include "code\__DEFINES\skills\skills.dm" #include "code\__HELPERS\_cit_helpers.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" @@ -567,6 +568,8 @@ #include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" #include "code\datums\ruins\station.dm" +#include "code\datums\skills\_skill.dm" +#include "code\datums\skills\_skill_holder.dm" #include "code\datums\status_effects\buffs.dm" #include "code\datums\status_effects\debuffs.dm" #include "code\datums\status_effects\gas.dm" From cce3bad0d6904e2b84e1506b482d41624657800f Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 00:58:12 -0700 Subject: [PATCH 2/9] okay --- code/datums/skills/_skill.dm | 14 ++++++++++++++ code/datums/skills/_skill_holder.dm | 12 ++++++++++++ tgstation.dme | 1 + 3 files changed, 27 insertions(+) diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm index 6480dbf553..a44a2b901d 100644 --- a/code/datums/skills/_skill.dm +++ b/code/datums/skills/_skill.dm @@ -47,6 +47,12 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums()) /datum/skill/proc/is_value_greater(existing, new_value) return new_value > existing +/** + * Standard value "render" + */ +/datum/skill/proc/standard_render_value(value) + return value + // Just saying, the choice to use different sub-parent-types is to force coders to resolve issues as I won't be implementing custom procs to grab skill levels in a certain context. // Aka: So people don't forget to change checks if they change a skill's progression type. @@ -57,6 +63,9 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums()) /datum/skill/binary/sanitize_value(new_value) return new_value? TRUE : FALSE +/datum/skill/binary/standard_render_value(value) + return value? "Yes" : "No" + /datum/skill/numerical abstract_type = /datum/skill/numerical progression_type = SKILL_PROGRESSION_NUMERICAL @@ -64,10 +73,15 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums()) var/max_value = 100 /// Min value of this skill var/min_value = 0 + /// Display as a percent in standard_render_value? + var/display_as_percent = FALSE /datum/skill/numerical/sanitize_value(new_value) return clamp(new_value, min_value, max_value) +/datum/skill/numerical/standard_render_value(value) + return display_as_percent? "[round(value/max_value/100, 0.01)]%" : "[value] / [max_value]" + /datum/skill/enum abstract_type = /datum/skill/enum progression_type = SKILL_PROGRESSION_ENUM diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index 4e4dc35da4..f37a359650 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -60,3 +60,15 @@ var/current = get_skill_value(skill) var/affinity = get_skill_affinity(skill) bosst_skill_value_to(skill, current + (value * affinity)) + +/** + * Generates a HTML readout of our skills. + * Port to tgui-next when? + */ +/datum/skill_holder/proc/html_readout() + . = list("

Skills


") + . += "" + for(var/path in skills) + var/datum/skill/S = GLOB.skill_datums[path] + . += "" + . += "
SkillValue
[S.name][S.standard_render_value(skills[path])]
" diff --git a/tgstation.dme b/tgstation.dme index 005f2d80e2..220a9ad6f3 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -570,6 +570,7 @@ #include "code\datums\ruins\station.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\_skill_holder.dm" +#include "code\datums\skills\medical.dm" #include "code\datums\status_effects\buffs.dm" #include "code\datums\status_effects\debuffs.dm" #include "code\datums\status_effects\gas.dm" From e6b0fb49293d935965438972fc0497cd1474ed6d Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 01:02:47 -0700 Subject: [PATCH 3/9] this was a mistake --- code/controllers/subsystem/ticker.dm | 3 +++ code/modules/jobs/job_types/_job.dm | 2 -- code/modules/mob/dead/new_player/new_player.dm | 2 ++ code/modules/surgery/surgery_step.dm | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index a7be36abc2..8042631b7b 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -387,6 +387,9 @@ SUBSYSTEM_DEF(ticker) for(var/mob/dead/new_player/N in GLOB.player_list) var/mob/living/carbon/human/player = N.new_character if(istype(player) && player.mind && player.mind.assigned_role) + var/datum/job/J = SSjob.GetJob(player.mind.assigned_role) + if(J) + J.standard_assign_skills(player.mind) if(player.mind.assigned_role == "Captain") captainless=0 if(player.mind.assigned_role != player.mind.special_role) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index fac976d62a..d698c1a0dd 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -258,8 +258,6 @@ if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences. PDA.update_style(preference_source) - standard_assign_skills(H.mind) - /datum/outfit/job/get_chameleon_disguise_info() var/list/types = ..() types -= /obj/item/storage/backpack //otherwise this will override the actual backpacks diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 35b1a69761..f7e1f24b63 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -392,6 +392,8 @@ character.update_parallax_teleport() + job.standard_assign_skills(character.mind) + SSticker.minds += character.mind var/mob/living/carbon/human/humanc diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index d02495776f..1195959356 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -60,7 +60,7 @@ speed_mod = tool.toolspeed var/skill_mod = 1 if(user?.mind?.skill_holder) - skill_mode = SURGERY_SKILL_SPEEDUP_NUMERICAL_SCALE(user.mind.skill_holder.get_skill_value(/datum/skill/medical/surgery)) + skill_mod = SURGERY_SKILL_SPEEDUP_NUMERICAL_SCALE(user.mind.skill_holder.get_skill_value(/datum/skill/numerical/surgery)) if(do_after(user, time * speed_mod, target = target)) var/prob_chance = 100 if(implement_type) //this means it isn't a require hand or any item step. @@ -69,6 +69,7 @@ if((prob(prob_chance) || (iscyborg(user) && !silicons_obey_prob)) && chem_check(target) && !try_to_fail) if(success(user, target, target_zone, tool, surgery)) + user?.mind?.skill_holder?.auto_gain_experience(/datum/skill/numerical/surgery, SKILL_GAIN_SURGERY_PER_STEP) advance = TRUE else if(failure(user, target, target_zone, tool, surgery)) From ec4a40fa375c2d58ec17965fbce313e8ddbe8095 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 01:05:12 -0700 Subject: [PATCH 4/9] ok --- code/__DEFINES/skills/skills.dm | 2 +- code/datums/skills/_skill_holder.dm | 2 +- code/modules/surgery/surgery_step.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/skills/skills.dm b/code/__DEFINES/skills/skills.dm index 8d40c32020..b97b921550 100644 --- a/code/__DEFINES/skills/skills.dm +++ b/code/__DEFINES/skills/skills.dm @@ -16,7 +16,7 @@ // Standard values for job starting skill affinities -#define STARTING_SKILL_AFFINITY_SURGERY_MEDICAL 1.25 +#define STARTING_SKILL_AFFINITY_SURGERY_MEDICAL 1.2 // Standard values for skill gain (this is multiplied by affinity) diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index f37a359650..50d0692ee6 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -59,7 +59,7 @@ CRASH("You cannot auto increment a non numerical skill!") var/current = get_skill_value(skill) var/affinity = get_skill_affinity(skill) - bosst_skill_value_to(skill, current + (value * affinity)) + boost_skill_value_to(skill, current + (value * affinity)) /** * Generates a HTML readout of our skills. diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 1195959356..7127b41ee3 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -61,7 +61,7 @@ var/skill_mod = 1 if(user?.mind?.skill_holder) skill_mod = SURGERY_SKILL_SPEEDUP_NUMERICAL_SCALE(user.mind.skill_holder.get_skill_value(/datum/skill/numerical/surgery)) - if(do_after(user, time * speed_mod, target = target)) + if(do_after(user, time * speed_mod * skill_mod, target = target)) var/prob_chance = 100 if(implement_type) //this means it isn't a require hand or any item step. prob_chance = implements[implement_type] From 388224b5760e02ba928053a1e015d0a6d60696b7 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 01:20:57 -0700 Subject: [PATCH 5/9] ok --- code/datums/skills/_skill_holder.dm | 9 +++++---- tgstation.dme | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index 50d0692ee6..3283a6f660 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -66,9 +66,10 @@ * Port to tgui-next when? */ /datum/skill_holder/proc/html_readout() - . = list("

Skills


") - . += "" + var/list/out = list("

Skills


") + out += "
SkillValue
" for(var/path in skills) var/datum/skill/S = GLOB.skill_datums[path] - . += "" - . += "
SkillValue
[S.name][S.standard_render_value(skills[path])]
" + out += "[S.name][S.standard_render_value(skills[path])]" + out += "" + return out.Join("") diff --git a/tgstation.dme b/tgstation.dme index 220a9ad6f3..1434386e79 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -568,6 +568,7 @@ #include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" #include "code\datums\ruins\station.dm" +#include "code\datums\skills\_check_skills.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\_skill_holder.dm" #include "code\datums\skills\medical.dm" From 5f46f301a6efede31d93f07a01fda32691bc40d7 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 01:21:03 -0700 Subject: [PATCH 6/9] ok --- code/datums/skills/_check_skills.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 code/datums/skills/_check_skills.dm diff --git a/code/datums/skills/_check_skills.dm b/code/datums/skills/_check_skills.dm new file mode 100644 index 0000000000..d9dc6dad3d --- /dev/null +++ b/code/datums/skills/_check_skills.dm @@ -0,0 +1,16 @@ +// yeah yeah verbs suck whatever I suck at this fix this someone please - kevinz000 + +/mob/verb/check_skills() + set name = "Check Skills" + set category = "IC" + set desc = "Check your skills (if you have any..)" + + if(!mind) + to_chat(usr, "How do you check the skills of [(usr == src)? "yourself when you are" : "something"] without a mind?") + return + if(!mind.skill_holder) + to_chat(usr, "How do you check the skills of [(usr == src)? "yourself when you are" : "something"] without the capability for skills? (PROBABLY A BUG, PRESS F1.)") + return + var/datum/browser/B = new(usr, "skilldisplay_[REF(src)]", "Skills of [src]") + B.set_content(mind.skill_holder.html_readout()) + B.open() From a362060d728df6323f8823894638e5022aae6949 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 01:40:42 -0700 Subject: [PATCH 7/9] ok --- code/datums/skills/_skill.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm index a44a2b901d..d0422ed00d 100644 --- a/code/datums/skills/_skill.dm +++ b/code/datums/skills/_skill.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums()) . = list() for(var/path in subtypesof(/datum/skill)) var/datum/skill/S = path - if(S.abstract_type == path) + if(initial(S.abstract_type) == path) continue S = new path .[S.type] = S From 866b3789ab3a00e0575fc81c15531d0b79a1e552 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 01:54:26 -0700 Subject: [PATCH 8/9] ok --- code/datums/skills/_skill_holder.dm | 2 +- code/modules/jobs/job_types/_job.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index 3283a6f660..98031ec39f 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -45,7 +45,7 @@ */ /datum/skill_holder/proc/boost_skill_value_to(skill, value) var/current = get_skill_value(skill) - if(!is_skill_value_greater(skill, current, value)) + if(is_skill_value_greater(skill, current, value)) return FALSE set_skill_value(skill, value) return TRUE diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index d698c1a0dd..e40c278e92 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -179,7 +179,7 @@ M.skill_holder.skill_affinities = list() for(var/skill in skill_affinities) M.skill_holder.skill_affinities[skill] = skill_affinities[skill] - LAZYCLEARLIST(M.skill_holder.skill_affinities) //if we didn't set any. + UNSETEMPTY(M.skill_holder.skill_affinities) //if we didn't set any. /datum/outfit/job name = "Standard Gear" From 3625d88b47f546f0f8f40cd87914160b68c4bcc5 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 25 Apr 2020 03:41:15 -0700 Subject: [PATCH 9/9] fixes --- code/datums/skills/_skill.dm | 2 ++ code/datums/skills/_skill_holder.dm | 7 +++++-- code/modules/admin/callproc/callproc.dm | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm index d0422ed00d..2dd321c4c6 100644 --- a/code/datums/skills/_skill.dm +++ b/code/datums/skills/_skill.dm @@ -45,6 +45,8 @@ GLOBAL_LIST_INIT(skill_datums, init_skill_datums()) * Checks if a value is greater */ /datum/skill/proc/is_value_greater(existing, new_value) + if(!existing) + return TRUE return new_value > existing /** diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index 98031ec39f..352adc46ff 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -25,7 +25,10 @@ CRASH("Invalid get_skill_affinity call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this. if(!skills) return 1 - return skill_affinities[skill] + var/affinity = skill_affinities[skill] + if(isnull(affinity)) + return 1 + return affinity /** * Sets the value of a skill. @@ -45,7 +48,7 @@ */ /datum/skill_holder/proc/boost_skill_value_to(skill, value) var/current = get_skill_value(skill) - if(is_skill_value_greater(skill, current, value)) + if(!is_skill_value_greater(skill, current, value)) return FALSE set_skill_value(skill, value) return TRUE diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 3de5e39ff4..c13353b7cd 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -120,7 +120,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) //adv proc call this, ya nerds /world/proc/WrapAdminProcCall(datum/target, procname, list/arguments) if(target == GLOBAL_PROC) - return call(procname)(arglist(arguments)) + return call(text2path("/proc/[procname]"))(arglist(arguments)) else if(target != world) return call(target, procname)(arglist(arguments)) else