|
68 | 68 | SKILL_FITNESS = 0, |
69 | 69 | ) |
70 | 70 |
|
| 71 | + /// One-time experience gains that have already been acquired |
| 72 | + var/list/unique_exp = list() |
| 73 | + |
71 | 74 | /// Free skill points to allocate |
72 | 75 | var/skill_points = 0 |
73 | 76 |
|
|
804 | 807 | return FALSE |
805 | 808 | return (mind.skills[skill] >= amount) |
806 | 809 |
|
807 | | -/// Adds progress towards increasing skill level. Returns TRUE if it improved the skill. |
808 | | -/mob/proc/add_exp(skill, amount) |
| 810 | +/// Adds progress towards increasing skill level. Returns TRUE if it added progress. Adding a source prevents gaining exp from that source again. |
| 811 | +/mob/proc/add_exp(skill, amount, source) |
809 | 812 | if(!mind) |
810 | 813 | return FALSE |
811 | | - if(mind.skill_points > 0) |
| 814 | + if(!amount) |
| 815 | + return FALSE |
| 816 | + if(source && (source in mind.unique_exp)) |
812 | 817 | return FALSE |
| 818 | + mind.unique_exp.Add(source) |
813 | 819 | var/exp_required = EXPERIENCE_PER_LEVEL * (2**mind.skills[skill]) // exp required scales exponentially |
814 | 820 | if(mind.exp_progress[skill] + amount >= exp_required) |
815 | 821 | var/levels_gained = round(log(2, 1 + (mind.exp_progress[skill] + amount) / exp_required)) // in case you gained so much you go up more than one level |
|
818 | 824 | hud_used.skill_menu.allocated_points -= min(levels_gained, levels_allocated) |
819 | 825 | hud_used.skill_menu.allocated_skills[skill] -= min(levels_gained, levels_allocated) |
820 | 826 | mind.exp_progress[skill] += amount - exp_required * (2**(levels_gained - 1)) |
| 827 | + mind.skill_points = max(mind.skill_points - levels_gained, 0) // remove an equal amount of unallocated skill points to prevent exploits |
821 | 828 | adjust_skill(skill, levels_gained) |
822 | 829 | to_chat(src, span_boldnotice("Your [skill] skill is now level [get_skill(skill)]!")) |
823 | | - return TRUE |
824 | 830 | mind.exp_progress[skill] += amount |
825 | | - return FALSE |
| 831 | + return TRUE |
| 832 | + |
| 833 | +/// Returns whether experience has been gained from a given source |
| 834 | +/mob/proc/has_exp(source) |
| 835 | + if(!mind) |
| 836 | + return FALSE |
| 837 | + return (source in mind.unique_exp) ? TRUE : FALSE |
826 | 838 |
|
827 | 839 | /// Adds skill points to be allocated at will. |
828 | 840 | /mob/proc/add_skill_points(amount) |
|
0 commit comments