diff --git a/code/__DEFINES/skills/helpers.dm b/code/__DEFINES/skills/helpers.dm index 9f1fbbf0e2..dde412fd7d 100644 --- a/code/__DEFINES/skills/helpers.dm +++ b/code/__DEFINES/skills/helpers.dm @@ -23,7 +23,7 @@ * from/to new/old minds. */ #define ADD_SKILL_MODIFIER_BODY(path, id, body, prototype) \ - prototype = GLOB.skill_modifiers[GET_SKILL_MOD_ID(path, id)] || new path(id);\ + prototype = GLOB.skill_modifiers[GET_SKILL_MOD_ID(path, id)] || new path(id, TRUE);\ if(body.mind){\ body.mind.add_skill_modifier(prototype.identifier)\ } else {\ @@ -43,6 +43,6 @@ ///Macro used when adding generic singleton skill modifiers. #define ADD_SINGLETON_SKILL_MODIFIER(mind, path, id) \ if(!GLOB.skill_modifiers[GET_SKILL_MOD_ID(path, id)]){\ - new path(id)\ + new path(id, TRUE)\ };\ - mind.add_skill_modifier(GET_SKILL_MOD_ID(path, id)) \ No newline at end of file + mind.add_skill_modifier(GET_SKILL_MOD_ID(path, id)) diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm index ecc7bb0878..500b49a1ff 100644 --- a/code/datums/skills/_skill_holder.dm +++ b/code/datums/skills/_skill_holder.dm @@ -52,7 +52,7 @@ for(var/k in L) var/datum/skill_modifier/M = GLOB.skill_modifiers[k] . = M.apply_modifier(., skill, skill_holder, MODIFIER_TARGET_LEVEL) - . = SANITIZE_SKILL_LEVEL(skill, round ? round(.) : .) + . = SANITIZE_SKILL_LEVEL(skill, round ? round(., 1) : .) /** * Grabs our affinity for a skill. !!This is a multiplier!! diff --git a/code/datums/skills/_skill_modifier.dm b/code/datums/skills/_skill_modifier.dm index e704e13dea..a2c9552871 100644 --- a/code/datums/skills/_skill_modifier.dm +++ b/code/datums/skills/_skill_modifier.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) /// flags for this skill modifier. var/modifier_flags = NONE /// target skills, can be a specific skill typepath or a set of skill flags. - var/target_skills = ALL + var/target_skills = NONE /// The identifier key this skill modifier is associated with. var/identifier /// skill affinity modifier, can be a multiplier or addendum, depending on the modifier_flags flags. @@ -22,15 +22,21 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) /// Priority of this skill modifier compared to other ones. var/priority = MODIFIER_SKILL_PRIORITY_DEF -/datum/skill_modifier/New(id) +/datum/skill_modifier/New(id, register = FALSE) identifier = GET_SKILL_MOD_ID(type, id) if(id) var/former_id = identifier var/dupe = 0 while(GLOB.skill_modifiers[identifier]) identifier = "[former_id][++dupe]" - GLOB.skill_modifiers[identifier] = src + if(register) + register() + +/datum/skill_modifier/proc/register() + if(GLOB.skill_modifiers[identifier]) + CRASH("Skill modifier identifier \"[identifier]\" already taken.") + GLOB.skill_modifiers[identifier] = src if(ispath(target_skills)) var/list/mod_L = GLOB.potential_mods_per_skill[target_skills] if(!mod_L) @@ -147,11 +153,13 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) if(MODIFIER_TARGET_AFFINITY) mod = affinity_mod + var/diff = 0 if(modifier_flags & (MODIFIER_SKILL_VIRTUE|MODIFIER_SKILL_HANDICAP)) if(modifier_flags & MODIFIER_SKILL_VIRTUE) . = max(., mod) if(modifier_flags & MODIFIER_SKILL_HANDICAP) . = min(., mod) + diff = . - mod else if(modifier_flags & MODIFIER_SKILL_MULT) . *= mod else @@ -164,7 +172,7 @@ GLOBAL_LIST_EMPTY(potential_mods_per_skill) to_access = H.original_levels if(MODIFIER_TARGET_AFFINITY) to_access = H.original_affinities - . += value - LAZYACCESS(to_access[identifier], "[skillpath]") + . += value - diff - LAZYACCESS(to_access[identifier], "[skillpath]") ///Body bound modifier signal procs. /datum/skill_modifier/proc/on_mind_transfer(datum/mind/source, mob/new_character, mob/old_character) diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index e020afa47a..9df144b184 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -138,7 +138,7 @@ if(current_users[user]) return FALSE if(req_skill && user?.mind) - var/level_diff = req_skill - user.mind.get_skill_level(/datum/skill/level/job/wiring) + var/level_diff = req_skill - user.mind.get_skill_level(/datum/skill/level/job/wiring, round = TRUE) if(level_diff > 0) LAZYSET(current_users, user, TRUE) to_chat(user, "You begin cutting [holder]'s [color] wire...") @@ -167,7 +167,7 @@ if(current_users[user]) return FALSE if(req_skill && user?.mind) - var/level_diff = req_skill - user.mind.get_skill_level(/datum/skill/level/job/wiring) + var/level_diff = req_skill - user.mind.get_skill_level(/datum/skill/level/job/wiring, round = TRUE) if(level_diff > 0) LAZYSET(current_users, user, TRUE) to_chat(user, "You begin pulsing [holder]'s [color] wire...")