docs: def calc_move(self, c):
          """
          calculate the amount of damage down using the battle.rules file
          WARNING - shitty eval functions - careful with user input.
          TODO = max_hit = parser.parse(self.rules['hit_max']).to_pyfunc()
          """
          
          # first get local variables the same as battle.rules file so parser can interpret.
          AGI = c.stats['AGI']
          INT = c.stats['INT']
          STR = c.stats['STR']
          #STA = c.stats['STA']
          #print('calc move : self.rules.all_rules[hit_min] = ', self.rules.all_rules['hit_min'])
          #print('calc move : self.rules.all_rules[hit_max] = ', self.rules.all_rules['hit_max'])
          #print('calc move :  = self.rules.all_rules[hit_limit]', self.rules.all_rules['hit_limit'])
          hit_min   = float(self.rules.all_rules['hit_min'])
          
          hit_AGI_mult   = float(self.rules.all_rules['hit_AGI_mult'])
          hit_INT_mult   = float(self.rules.all_rules['hit_INT_mult'])
          hit_AGI_add   = float(self.rules.all_rules['hit_AGI_add'])
          hit_INT_add   = float(self.rules.all_rules['hit_INT_add'])
          hit_overall_add   = float(self.rules.all_rules['hit_overall_add'])
          
          #  hit_max = round(INT/2) + round(AGI/2) + 1
          hit_max = round(INT*(hit_INT_mult + hit_INT_add)) + round(AGI*(hit_AGI_mult + hit_AGI_add)) + hit_overall_add
          
          hit_limit = float(self.rules.all_rules['hit_limit']) 
          if hit_max > hit_limit:
              hit_max = hit_limit
          chance_hit = random.randint(hit_min,hit_max)
          
          dmg_min   = float(self.rules.all_rules['dmg_min'])
          #dmg_max   = eval(self.rules.all_rules['dmg_max'])
          calc_agi = round((AGI + float(self.rules.all_rules['dmg_AGI_add'])) * float(self.rules.all_rules['dmg_AGI_mult']))
          calc_int = round((INT + float(self.rules.all_rules['dmg_INT_add'])) * float(self.rules.all_rules['dmg_INT_mult']))
          calc_str = round((STR + float(self.rules.all_rules['dmg_STR_add'])) * float(self.rules.all_rules['dmg_STR_mult'])) 
          #print('TESTING CALC_MOVE : calc_agi', calc_agi, 'calc_int',calc_int ,'calc_str',calc_str )
          dmg_max = round((calc_agi + calc_int + calc_str) * float(self.rules.all_rules['dmg_overall_mult']) + float(self.rules.all_rules['dmg_overall_add']))
  
          #print('hit_min  =',hit_min  , 'hit_max = ',hit_max  )
          #print('dmg_min  =',dmg_min  , 'dmg_max = ',dmg_max  )
          amount_dmg = random.randint(dmg_min, dmg_max)
          
          if chance_hit > float(self.rules.all_rules['shot_crit_greater_than']):
              return 'Crit', amount_dmg * float(self.rules.all_rules['dmg_mult_crit'])
          elif chance_hit < float(self.rules.all_rules['shot_hit_greater_than']):
              return 'Miss', amount_dmg * float(self.rules.all_rules['dmg_mult_miss'])
          else:
              return 'Hit', amount_dmg * float(self.rules.all_rules['dmg_mult_hit'])