Refactors skill modifiers to use dictionaries (#48572)

* adds dictionaries woo

* fixes bad code

* duh
This commit is contained in:
Qustinnus
2020-01-06 01:46:25 +01:00
committed by moo
parent 8cbe1a7232
commit 2a1c921acb
8 changed files with 20 additions and 46 deletions

View File

@@ -1,5 +1,5 @@
// Skills
// Skill levels
#define SKILL_LEVEL_NONE 0
#define SKILL_LEVEL_NOVICE 1
#define SKILL_LEVEL_APPRENTICE 2
@@ -8,6 +8,7 @@
#define SKILL_LEVEL_MASTER 5
#define SKILL_LEVEL_LEGENDARY 6
//Skill experience thresholds
#define SKILL_EXP_NOVICE 100
#define SKILL_EXP_APPRENTICE 250
#define SKILL_EXP_JOURNEYMAN 500
@@ -15,5 +16,9 @@
#define SKILL_EXP_MASTER 1500
#define SKILL_EXP_LEGENDARY 2500
//Skill modifier types
#define SKILL_SPEED_MODIFIER "skill_speed_modifier"
// Gets the reference for the skill type that was given
#define GetSkillRef(A) (SSskills.all_skills[A])

View File

@@ -153,10 +153,10 @@
else
to_chat(current, "<span class='warning'>I feel like I've become worse at [S.name]!</span>")
///Gets the skill's singleton and returns the result of its get_skill_speed_modifier
/datum/mind/proc/get_skill_speed_modifier(skill)
///Gets the skill's singleton and returns the result of its get_skill_modifier
/datum/mind/proc/get_skill_modifier(skill, modifier)
var/datum/skill/S = GetSkillRef(skill)
return S.get_skill_speed_modifier(known_skills[S] || SKILL_LEVEL_NONE)
return S.get_skill_modifier(modifier, known_skills[S] || SKILL_LEVEL_NONE)
/datum/mind/proc/get_skill_level(skill)
var/datum/skill/S = GetSkillRef(skill)

View File

@@ -1,6 +1,7 @@
/datum/skill
var/name = "Skill"
var/desc = "the art of doing things"
var/modifiers = list(SKILL_SPEED_MODIFIER = list(1, 1, 1, 1, 1, 1, 1)) //Dictionary of modifier type - list of modifiers (indexed by level). 7 entries in each list for all 7 skill levels.
/datum/skill/proc/get_skill_speed_modifier(level)
return
/datum/skill/proc/get_skill_modifier(modifier, level)
return modifiers[modifier][level+1] //+1 because lists start at 1

View File

@@ -1,20 +1,4 @@
/datum/skill/medical
name = "Medical"
desc = "From Bandaids to biopsies, this improves your ability to get people back up both in the field and on the operating table."
/datum/skill/medical/get_skill_speed_modifier(level)
switch(level)
if(SKILL_LEVEL_NONE)
return 1
if(SKILL_LEVEL_NOVICE)
return 0.95
if(SKILL_LEVEL_APPRENTICE)
return 0.9
if(SKILL_LEVEL_JOURNEYMAN)
return 0.85
if(SKILL_LEVEL_EXPERT)
return 0.75
if(SKILL_LEVEL_MASTER)
return 0.6
if(SKILL_LEVEL_LEGENDARY)
return 0.5
modifiers = list(SKILL_SPEED_MODIFIER = list(1, 0.95, 0.9, 0.85, 0.75, 0.6, 0.5))

View File

@@ -1,20 +1,4 @@
/datum/skill/mining
name = "Mining"
desc = "A dwarf's biggest skill, after drinking."
/datum/skill/mining/get_skill_speed_modifier(level)
switch(level)
if(SKILL_LEVEL_NONE)
return 1
if(SKILL_LEVEL_NOVICE)
return 0.95
if(SKILL_LEVEL_APPRENTICE)
return 0.9
if(SKILL_LEVEL_JOURNEYMAN)
return 0.85
if(SKILL_LEVEL_EXPERT)
return 0.75
if(SKILL_LEVEL_MASTER)
return 0.65
if(SKILL_LEVEL_LEGENDARY)
return 0.5
modifiers = list(SKILL_SPEED_MODIFIER = list(1, 0.95, 0.9, 0.85, 0.75, 0.6, 0.5))

View File

@@ -765,7 +765,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(tool_behaviour == TOOL_MINING && ishuman(user))
var/mob/living/carbon/human/H = user
skill_modifier = H.mind.get_skill_speed_modifier(/datum/skill/mining)
skill_modifier = H.mind.get_skill_modifier(/datum/skill/mining, SKILL_SPEED_MODIFIER)
delay *= toolspeed * skill_modifier

View File

@@ -58,10 +58,10 @@
user.visible_message("<span class='green'>[user] applies \the [src] on [C]'s [affecting.name].</span>", "<span class='green'>You apply \the [src] on [C]'s [affecting.name].</span>")
var/brute2heal = brute
var/burn2heal = burn
if(user?.mind?.get_skill_speed_modifier(/datum/skill/medical))
var/skillmods = user.mind.get_skill_speed_modifier(/datum/skill/medical)
brute2heal *= (2-skillmods)
burn2heal *= (2-skillmods)
var/skill_mod = user?.mind?.get_skill_modifier(/datum/skill/medical, SKILL_SPEED_MODIFIER)
if(skill_mod)
brute2heal *= (2-skill_mod)
burn2heal *= (2-skill_mod)
if(affecting.heal_damage(brute2heal, burn2heal))
C.update_damage_overlays()
return TRUE

View File

@@ -78,7 +78,7 @@
implement_speed_mod = implements[implement_type] / 100.0
speed_mod /= (get_location_modifier(target) * (1 + surgery.speed_modifier) * implement_speed_mod)
var/modded_time = time * speed_mod * user.mind.get_skill_speed_modifier(/datum/skill/medical)
var/modded_time = time * speed_mod * user.mind.get_skill_modifier(/datum/skill/medical, SKILL_SPEED_MODIFIER)
fail_prob = min(max(0, modded_time - (time * SURGERY_SLOWDOWN_CAP_MULTIPLIER)),99)//if modded_time > time * modifier, then fail_prob = modded_time - time*modifier. starts at 0, caps at 99