Advertisement
Kovitikus

skillsets.py

Aug 23rd, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.72 KB | None | 0 0
  1. """skillsets.py"""
  2. def skill_level(rank, difficulty):
  3.     '''
  4.    RANK += RANK BONUS PER RANK
  5.    --------------------------
  6.    1 to 10 += 3
  7.    11 to 30 += 2
  8.    31 to 50 += 1
  9.    51 to 100 += 0.5
  10.    101 to 150 += 0.25
  11.    151 to 200 += 0.125
  12.    201 to 500 += 0.0625
  13.    501 to 1,000 += 0.025
  14.    1,001 to infinity += 0.01
  15.    '''
  16.     rb = 0
  17.  
  18.     #Formula
  19.     if rank:
  20.         r = rank if rank < 10 else 10
  21.         rb += (3 * r)
  22.         if rank >= 11:
  23.             r = rank - 10 if rank < 30 else 10
  24.             rb += (2 * r)
  25.             if rank >= 31:
  26.                 r = rank - 30 if rank < 50 else 20
  27.                 rb += (1 * r)
  28.                 if rank >= 51:
  29.                     r = rank - 50 if rank < 100 else 50
  30.                     rb += (0.5 * r)
  31.                     if rank >= 101:
  32.                         r = rank - 100 if rank < 150 else 50
  33.                         rb += (0.25 * r)
  34.                         if rank >= 151:
  35.                             r = rank - 150 if rank < 200 else 50
  36.                             rb += (0.125 * r)
  37.                             if rank >= 201:
  38.                                 r = rank - 200 if rank < 500 else 300
  39.                                 rb += (0.0625 * r)
  40.                                 if rank >= 501:
  41.                                     r = rank - 500 if rank < 1000 else 500
  42.                                     rb += (0.025 * r)
  43.                                     if rank >= 1001:
  44.                                         r = rank - 1000
  45.                                         rb += (0.01 * r)
  46.         '''
  47.        15% RB loss per difficulty.
  48.        At rank 100:
  49.        Easy(100%) 115 RB
  50.        Average(85%) 97.75 RB
  51.        Difficult(70%) 80.5 RB
  52.        Impossible(55%) 63.25 RB
  53.        '''
  54.         if difficulty == 'easy':
  55.             rb *= 1
  56.         elif difficulty == 'average':
  57.             rb *= 0.85
  58.         elif difficulty == 'difficult':
  59.             rb *= 0.7
  60.         elif difficulty == 'impossible':
  61.             rb *= 0.55
  62.         return rb # Return if any rank.
  63.     return None # Return if no rank.
  64.  
  65. def defense_layer_calc(char, skillset):
  66.         """
  67.        Defensive rank bonus includes up to 3 layers of defense.
  68.        The highest RB defensive manuever of each high, mid, and low will gain 100% of it's RB.
  69.        The second highest RB will supply 50% and the third will only be worth 33%.
  70.        Each layer can only consist of a single defensive manuever from each of the following categories:
  71.            Weapon Blocks, Combat Manuever Dodges, and Shield Blocks.
  72.            Weapons that require 2 hands can only ever gain 2 defensive layers. Shields are the only way to gain all 3 layers.
  73.  
  74.        For Example:
  75.        Staves Mid Block with 100 Rank Bonus * 1 = 100
  76.        CM Mid Dodge with 80 Rank Bonus * 0.5 = 40
  77.        Total Mid Defensive Rank Bonus = 140
  78.  
  79.        Swords Mid Block with 100 Rank Bonus * 0.33 = 33
  80.        CM Mid Dodge with 150 Rank Bonus * 0.5 = 75
  81.        Shield Mid Block with 200 Rank Bonus * 1 = 200
  82.        Total Mid Defensive Rank Bonus = 308
  83.  
  84.        Floats are used to determine the highest RB priority, but only rounded down integers are used to determine the total RB.
  85.  
  86.        TODO: Add a round down for the final RB.
  87.  
  88.        High, Mid, and Low always refer to the area
  89.        of the body that the attack targets and not the numerical value.
  90.        """
  91.  
  92.         """Weapon Rank Bonus"""
  93.         weap_dic = char.db.def_skills.get('weapon')
  94.         weap_high_def = weap_dic.get('high')
  95.         weap_mid_def = weap_dic.get('mid')
  96.         weap_low_def = weap_dic.get('low')
  97.         weap_high_rb = 0.0
  98.         weap_mid_rb = 0.0
  99.         weap_low_rb = 0.0
  100.  
  101.         if weap_high_def.get(skillset):
  102.             weap_high_dic = weap_high_def.get(skillset)
  103.             weap_high_dic_values = weap_high_dic.values()
  104.             for rb in weap_high_dic_values:
  105.                 if rb > weap_high_rb:
  106.                     weap_high_rb = rb
  107.  
  108.         if weap_mid_def.get(skillset):
  109.             weap_mid_dic = weap_mid_def.get(skillset)
  110.             weap_mid_dic_values = weap_mid_dic.values()
  111.             for rb in weap_mid_dic_values:
  112.                 if rb > weap_mid_rb:
  113.                     weap_mid_rb = rb
  114.  
  115.         if weap_low_def.get(skillset):
  116.             weap_low_dic = weap_low_def.get(skillset)
  117.             weap_low_dic_values = weap_low_dic.values()
  118.             for rb in weap_low_dic_values:
  119.                 if rb > weap_low_rb:
  120.                     weap_low_rb = rb
  121.        
  122.  
  123.         """Dodge Rank Bonus"""
  124.         dodge_dic = char.db.def_skills.get('dodge')
  125.         dodge_high_def = dodge_dic.get('high')
  126.         dodge_mid_def = dodge_dic.get('mid')
  127.         dodge_low_def = dodge_dic.get('low')
  128.         dodge_high_rb = 0.0
  129.         dodge_mid_rb = 0.0
  130.         dodge_low_rb = 0.0
  131.  
  132.         if dodge_high_def.get('cm'):
  133.             dodge_high_dic = dodge_high_def.get('cms')
  134.             dodge_high_dic_values = dodge_high_dic.values()
  135.             for rb in dodge_high_dic_values:
  136.                 if rb > dodge_high_rb:
  137.                     dodge_high_rb = rb
  138.  
  139.         if dodge_mid_def.get('cm'):
  140.             dodge_mid_dic = dodge_mid_def.get('cms')
  141.             dodge_mid_dic_values = dodge_mid_dic.values()
  142.             for rb in dodge_mid_dic_values:
  143.                 if rb > dodge_mid_rb:
  144.                     dodge_mid_rb = rb
  145.  
  146.         if dodge_low_def.get('cm'):
  147.             dodge_low_dic = dodge_low_def.get('cms')
  148.             dodge_low_dic_values = dodge_low_dic.values()
  149.             for rb in dodge_low_dic_values:
  150.                 if rb > dodge_low_rb:
  151.                     dodge_low_rb = rb
  152.  
  153.    
  154.         """Shield Rank Bonus"""
  155.         shield_dic = char.db.def_skills.get('shield')
  156.         shield_high_def = shield_dic.get('high')
  157.         shield_mid_def = shield_dic.get('mid')
  158.         shield_low_def = shield_dic.get('low')
  159.         shield_high_rb = 0.0
  160.         shield_mid_rb = 0.0
  161.         shield_low_rb = 0.0
  162.  
  163.         if shield_high_def.get('shield'):
  164.             shield_high_dic = shield_high_def.get('shield')
  165.             shield_high_dic_values = shield_high_dic.values()
  166.             for rb in shield_high_dic_values:
  167.                 if rb > shield_high_rb:
  168.                     shield_high_rb = rb
  169.  
  170.         if shield_mid_def.get('shield'):
  171.             shield_mid_dic = shield_mid_def.get('shield')
  172.             shield_mid_dic_values = shield_mid_dic.values()
  173.             for rb in shield_mid_dic_values:
  174.                 if rb > shield_mid_rb:
  175.                     shield_mid_rb = rb
  176.  
  177.         if shield_low_def.get('shield'):
  178.             shield_low_dic = shield_low_def.get('shield')
  179.             shield_low_dic_values = shield_low_dic.values()
  180.             for rb in shield_low_dic_values:
  181.                 if rb > shield_low_rb:
  182.                     shield_low_rb = rb
  183.  
  184.  
  185.         """
  186.        Calculate Layering
  187.        First Highest RB gets 100%
  188.        Second Highest RB gets 50%
  189.        Third Highest RB gets 33%
  190.        """
  191.  
  192.         """High Layer"""
  193.         # weap_high_rb, dodge_high_rb, shield_high_rb
  194.         h_rb = [weap_high_rb, dodge_high_rb, shield_high_rb]
  195.         h_rb.sort(reverse=True)
  196.         h_layer1 = h_rb[0] * 1
  197.         h_layer2 = h_rb[1] * 0.5
  198.         h_layer3 = h_rb[2] * 0.33
  199.         high_def_rb = (h_layer1 + h_layer2 + h_layer3)
  200.  
  201.         """Mid Layer"""
  202.         # weap_mid_rb, dodge_mid_rb, shield_mid_rb
  203.         m_rb = [weap_mid_rb, dodge_mid_rb, shield_mid_rb]
  204.         m_rb.sort(reverse=True)
  205.         m_layer1 = m_rb[0] * 1
  206.         m_layer2 = m_rb[1] * 0.5
  207.         m_layer3 = m_rb[2] * 0.33
  208.         mid_def_rb = (m_layer1 + m_layer2 + m_layer3)
  209.  
  210.         """Low Layer"""
  211.         # weap_low_rb, dodge_low_rb, shield_low_rb
  212.         l_rb = [weap_low_rb, dodge_low_rb, shield_low_rb]
  213.         l_rb.sort(reverse=True)
  214.         l_layer1 = l_rb[0] * 1
  215.         l_layer2 = l_rb[1] * 0.5
  216.         l_layer3 = l_rb[2] * 0.33
  217.         low_def_rb = (l_layer1 + l_layer2 + l_layer3)
  218.  
  219.         # Assign the values to the character.
  220.         def_rb = char.db.def_rb
  221.         def_rb['high'] = high_def_rb
  222.         def_rb['mid'] = mid_def_rb
  223.         def_rb['low'] = low_def_rb
  224.  
  225. def rb_stance(self, o_rb, d_rb, stance):
  226.     '''
  227.    o_rb = Offensive Rank Bonus
  228.    d_rb = Defensive Rank Bonus
  229.  
  230.    Berserk - Attack 100% | Defense: 0%
  231.    Aggressive - Attack 75% | Defense: 25%
  232.    Normal - Attack 50% | Defense: 50%
  233.    Wary - Attack 25% | Defense: 75%
  234.    Defensive - Attack 0% | Defense: 100%
  235.    '''
  236.     if stance == 'berserk':
  237.         o_rb = o_rb * 1
  238.         d_rb = d_rb * 0
  239.         return o_rb, d_rb
  240.     if stance == 'aggressive':
  241.         o_rb = o_rb * 0.75
  242.         d_rb = d_rb * 0.25
  243.         return o_rb, d_rb
  244.     if stance == 'normal':
  245.         o_rb = o_rb * 0.5
  246.         d_rb = d_rb * 0.5
  247.         return o_rb, d_rb
  248.     if stance == 'wary':
  249.         o_rb = o_rb * 0.25
  250.         d_rb = d_rb * 0.75
  251.         return o_rb, d_rb
  252.     if stance == 'defensive':
  253.         o_rb = o_rb * 0
  254.         d_rb = d_rb * 1
  255.         return o_rb, d_rb
  256.  
  257. easy_rb = []
  258. average_rb = []
  259. difficult_rb = []
  260. impossible_rb = []
  261.  
  262. for i in range(1, 1_001):
  263.     rb = skill_level(i, 'easy')
  264.     easy_rb.append(rb)
  265.  
  266.     rb = skill_level(i, 'average')
  267.     average_rb.append(rb)
  268.  
  269.     rb = skill_level(i, 'difficult')
  270.     difficult_rb.append(rb)
  271.  
  272.     rb = skill_level(i, 'impossible')
  273.     impossible_rb.append(rb)
  274.  
  275. # Skillsets
  276. skillsets = {'staves':
  277.                 {'leg sweep':
  278.                     {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'low'},
  279.                 'feint':
  280.                     {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'low'},
  281.                 'end jab':
  282.                     {'damage_type': 'bruise', 'difficulty': 'easy', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  283.                 'swat':
  284.                     {'damage_type': 'bruise', 'difficulty': 'easy', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  285.                 'simple strike':
  286.                     {'damage_type': 'bruise', 'difficulty': 'easy', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  287.                 'side strike':
  288.                     {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  289.                 'pivot smash':
  290.                     {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  291.                 'longarm strike':
  292.                     {'damage_type': 'bruise', 'difficulty': 'difficult', 'hands': 2, 'attack_range': 'either', 'default_aim': 'high'},
  293.                 'simple block':
  294.                     {'damage_type': 'weapon_block', 'difficulty': 'easy', 'hands': 2, 'attack_range': 'either', 'default_aim': ['mid', 'low']},
  295.                 'cross block':
  296.                     {'damage_type': 'weapon_block', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': ['mid', 'low']},
  297.                 'overhead block':
  298.                     {'damage_type': 'weapon_block', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': ['high']},
  299.                 'parting jab':
  300.                     {'damage_type': 'bruise', 'difficulty': 'easy', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  301.                 'parting swat':
  302.                     {'damage_type': 'bruise', 'difficulty': 'easy', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  303.                 'parting smash':
  304.                      {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'high'},
  305.                 'defensive sweep':
  306.                     {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'low'},
  307.                 'stepping spin':
  308.                     {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'},
  309.                 'snapstrike':
  310.                     {'damage_type': 'bruise', 'difficulty': 'average', 'hands': 2, 'attack_range': 'either', 'default_aim': 'high'},
  311.                 'sweep strike':
  312.                     {'damage_type': 'bruise', 'difficulty': 'difficult', 'hands': 2, 'attack_range': 'either', 'default_aim': ['low', 'high']},
  313.                 'spinstrike':
  314.                     {'damage_type': 'bruise', 'difficulty': 'difficult', 'hands': 2, 'attack_range': 'either', 'default_aim': 'high'},
  315.                 'tbash':
  316.                     {'damage_type': 'bruise', 'difficulty': 'difficult', 'hands': 2, 'attack_range': 'either', 'default_aim': 'high'},
  317.                 'whirling block':
  318.                     {'damage_type': 'weapon_block', 'difficulty': 'difficult', 'hands': 2, 'attack_range': 'either', 'default_aim': ['high']},
  319.                 'pivoting longarm':
  320.                     {'damage_type': 'bruise', 'difficulty': 'difficult', 'hands': 2, 'attack_range': 'either', 'default_aim': 'mid'}
  321.                 }
  322.             }
  323.  
  324. # Create lists of the skillsets and their skills.
  325. VIABLE_SKILLSETS = []
  326. VIABLE_SKILLS = []
  327. temp_skill_list = []
  328. for k, v in skillsets.items():
  329.     VIABLE_SKILLSETS.append(k)
  330.     temp_skill_list.append(v)
  331. for i in temp_skill_list:
  332.     for k, v in i.items():
  333.         VIABLE_SKILLS.append(k)
  334.    
  335.  
  336. def learn_skill(char, skillset, skill):
  337.     '''
  338.    Skill Difficulty = Skill Point Cost per Rank
  339.    ---------------------------------------------
  340.  
  341.    Easy = 5
  342.    Average = 7
  343.    Difficult = 9
  344.    Impossible = 11
  345.  
  346.    Example Skillset Saved Attribute
  347.    ---------------------------------
  348.    staves = {'total_sp': 125, 'total_ranks': 500, 'leg_sweep': {'rank': 100, 'rb': 115}, 'feint': {'rank': 100', 'rb': 115}, 'end_jab': {'rank':100, rb: }}
  349.  
  350.    '''
  351.     # Return the data of the skill.
  352.     gsp = char.attributes.get('gsp')
  353.  
  354.     difficulty = skillsets[skillset][skill]['difficulty']
  355.    
  356.     # Set the per rank SP cost and rank bonus dictionary of the skill.
  357.     sp_cost = 0
  358.     if difficulty == 'easy':
  359.         rb = easy_rb
  360.         sp_cost = 5
  361.     elif difficulty == 'average':
  362.         rb = average_rb
  363.         sp_cost = 7
  364.     elif difficulty == 'difficult':
  365.         rb = difficult_rb
  366.         sp_cost = 9
  367.     elif difficulty == 'impossible':
  368.         rb = impossible_rb
  369.         sp_cost = 11
  370.    
  371.     # Check if the skillset is not already learned and if not, create it.
  372.     if not char.attributes.has(skillset):
  373.         #Check for general skill points required to learn.
  374.         if not gsp >= sp_cost:
  375.             char.msg('You do not have enough general skill points to learn this skillset.')
  376.             return
  377.         char.attributes.add(skillset, {'total_sp': sp_cost, 'total_ranks': 0})
  378.         char.db.gsp -= sp_cost
  379.  
  380.     d_skillset = char.attributes.get(skillset)
  381.     total_sp = d_skillset['total_sp']
  382.     if not total_sp >= sp_cost:
  383.         char.msg('You do not have enough skill points to learn this skill.')
  384.         return
  385.     if not d_skillset.get(skill):
  386.         d_skillset[skill] = {'rank': 0, 'rb': 0}
  387.     rank = d_skillset[skill]['rank']
  388.     rank += 1
  389.     d_skillset[skill]['rank'] = rank
  390.     d_skillset['total_sp'] -= sp_cost
  391.     rb = rb[rank - 1]
  392.     d_skillset[skill]['rb'] = rb
  393.     d_skillset['total_ranks'] += 1
  394.     char.msg(f"You have spent {sp_cost} SP to learn rank {rank} of {skillset} {skill}, earning the rank bonus of {d_skillset[skill]['rb']}.")
  395.  
  396.  
  397.  
  398.     # Setup the defensive skill attributes for High, Mid, Low defensive layering calculations.
  399.     d_skill = skillsets[skillset][skill]
  400.     def_a = d_skill.get('default_aim')
  401.     damage_type = d_skill['damage_type']
  402.     def_skills = char.attributes.get('def_skills')
  403.  
  404.     for d_a in def_a:
  405.         if damage_type == 'weapon_block':
  406.             if not skillset in def_skills:
  407.                 def_skills['weapon'][d_a] = {skillset: None}
  408.                 if not skill in def_skills:
  409.                     def_skills['weapon'][d_a][skillset] = {skill: None}
  410.             def_skills['weapon'][d_a][skillset][skill] = rb
  411.    
  412.         elif damage_type == 'dodge':
  413.             if not skillset in def_skills:
  414.                 def_skills['weapon'][d_a] = {skillset: None}
  415.                 if not skill in def_skills:
  416.                     def_skills['weapon'][d_a][skillset] = {skill: None}
  417.             def_skills['weapon'][d_a][skillset][skill] = rb
  418.  
  419.         elif damage_type == 'shield_block':
  420.             if not skillset in def_skills:
  421.                 def_skills['weapon'][d_a] = {skillset: None}
  422.                 if not skill in def_skills:
  423.                     def_skills['weapon'][d_a][skillset] = {skill: None}
  424.             def_skills['weapon'][d_a][skillset][skill] = rb
  425.  
  426.     defense_layer_calc(char, skillset)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement