Rune.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. """
  2. This file is part of RuneOptimizer.
  3. RuneOptimizer is free software: you can redistribute it and/or modify it
  4. under the terms of the GNU General Public License as published by the Free
  5. Software Foundation, either version 3 of the License, or (at your option)
  6. any later version.
  7. RuneOptimizer is distributed in the hope that it will be useful, but WITHOUT
  8. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  9. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  10. more details.
  11. You should have received a copy of the GNU General Public License along with
  12. RuneOptimizer. If not, see <https://www.gnu.org/licenses/>.
  13. """
  14. class Rune():
  15. """
  16. A rune.
  17. Parameters
  18. ----------
  19. id : str
  20. Unit identifier.
  21. unit : str
  22. ID of the unit the rune is assigned to. None if not assigned.
  23. type : int
  24. ID of the rune set.
  25. type_name : str
  26. Name of the rune set.
  27. slot : int
  28. Rune slot, from 1 to 6.
  29. stars : int
  30. Rune grade, from 1 to 6.
  31. level : int
  32. Power up level, from 0 to 15.
  33. quality : int
  34. Rune original quality ID, from 1 to 5.
  35. quality_name : str
  36. Rune original quality name.
  37. efficiency : float
  38. Rune efficiency, from 0 to 100.
  39. max_efficiency : float
  40. Rune maximum efficiency, from 0 to 100.
  41. main_stat : RuneStat
  42. Main stat of the rune.
  43. innate_stat : RuneStat
  44. Innate stat of the rune.
  45. sub_stats : RuneStat[]
  46. Substats of the rune.
  47. stats : RuneStat[]
  48. Every rune stat, including main, innates, and subs, not guaranteed to
  49. be in order.
  50. Methods
  51. -------
  52. get_stat(stat, level=None)
  53. Gets a stat given by the rune.
  54. """
  55. _id = None
  56. _unit = ""
  57. _type = 0
  58. _type_name = ""
  59. _slot = 1
  60. _stars = 1
  61. _level = 0
  62. _quality = 0
  63. _quality_name = ""
  64. _efficiency = 0.0
  65. _max_efficiency = 0.0
  66. _main_stat = None
  67. _innate_stat = None
  68. _sub_stats = [None, None, None, None]
  69. _stats_current = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  70. _stats_lv12 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  71. _stats_lv15 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  72. def __init__(self, id=None):
  73. if id != None:
  74. self._load(id)
  75. def _load(self, id):
  76. global conn
  77. cursor = conn.execute("""
  78. SELECT
  79. id, -- 0
  80. unit,
  81. type,
  82. slot,
  83. stars,
  84. level, -- 5
  85. quality,
  86. efficiency,
  87. max_efficiency,
  88. current_hp_percent,
  89. current_atk_percent, -- 10
  90. current_def_percent,
  91. current_hp_flat,
  92. current_atk_flat,
  93. current_def_flat,
  94. current_spd, -- 15
  95. current_crr,
  96. current_crd,
  97. current_res,
  98. current_acc,
  99. lv12_hp_percent, -- 20
  100. lv12_atk_percent,
  101. lv12_def_percent,
  102. lv12_hp_flat,
  103. lv12_atk_flat,
  104. lv12_def_flat, -- 25
  105. lv12_spd,
  106. lv12_crr,
  107. lv12_crd,
  108. lv12_res,
  109. lv12_acc, -- 30
  110. lv15_hp_percent,
  111. lv15_atk_percent,
  112. lv15_def_percent,
  113. lv15_hp_flat,
  114. lv15_atk_flat, -- 35
  115. lv15_def_flat,
  116. lv15_spd,
  117. lv15_crr,
  118. lv15_crd,
  119. lv15_res, -- 40
  120. lv15_acc
  121. FROM runes
  122. WHERE
  123. id = ?;
  124. """, (id,))
  125. row = cursor.fetchone()
  126. if row != None:
  127. self._main_stat = None
  128. self._innate_stat = None
  129. self._sub_stats = [None, None, None, None]
  130. self._id = str(row[0])
  131. if len(str(row[1])) > 0:
  132. self._unit = str(row[1])
  133. else:
  134. self._unit = None
  135. self._type = int(row[2])
  136. self._type_name = SET_NAMES[self._type]
  137. self._slot = int(row[3])
  138. self._stars = int(row[4])
  139. self._level = int(row[5])
  140. self._quality = int(row[6])
  141. self._quality_name = QUALITY_NAMES[self._quality]
  142. self._efficiency = float(row[7])
  143. self._max_efficiency = float(row[8])
  144. self._stats_current[RUNE_STATS["HP_P"]] = int(row[9])
  145. self._stats_current[RUNE_STATS["ATK_P"]] = int(row[10])
  146. self._stats_current[RUNE_STATS["DEF_P"]] = int(row[11])
  147. self._stats_current[RUNE_STATS["HP"]] = int(row[12])
  148. self._stats_current[RUNE_STATS["ATK"]] = int(row[13])
  149. self._stats_current[RUNE_STATS["DEF"]] = int(row[14])
  150. self._stats_current[RUNE_STATS["SPD"]] = int(row[15])
  151. self._stats_current[RUNE_STATS["CRR"]] = int(row[16])
  152. self._stats_current[RUNE_STATS["CRD"]] = int(row[17])
  153. self._stats_current[RUNE_STATS["RES"]] = int(row[18])
  154. self._stats_current[RUNE_STATS["ACC"]] = int(row[19])
  155. self._stats_lv12[RUNE_STATS["HP_P"]] = int(row[21])
  156. self._stats_lv12[RUNE_STATS["ATK_P"]] = int(row[21])
  157. self._stats_lv12[RUNE_STATS["DEF_P"]] = int(row[22])
  158. self._stats_lv12[RUNE_STATS["HP"]] = int(row[23])
  159. self._stats_lv12[RUNE_STATS["ATK"]] = int(row[22])
  160. self._stats_lv12[RUNE_STATS["DEF"]] = int(row[25])
  161. self._stats_lv12[RUNE_STATS["SPD"]] = int(row[26])
  162. self._stats_lv12[RUNE_STATS["CRR"]] = int(row[27])
  163. self._stats_lv12[RUNE_STATS["CRD"]] = int(row[28])
  164. self._stats_lv12[RUNE_STATS["RES"]] = int(row[29])
  165. self._stats_lv12[RUNE_STATS["ACC"]] = int(row[30])
  166. self._stats_lv15[RUNE_STATS["HP_P"]] = int(row[31])
  167. self._stats_lv15[RUNE_STATS["ATK_P"]] = int(row[32])
  168. self._stats_lv15[RUNE_STATS["DEF_P"]] = int(row[33])
  169. self._stats_lv15[RUNE_STATS["HP"]] = int(row[34])
  170. self._stats_lv15[RUNE_STATS["ATK"]] = int(row[35])
  171. self._stats_lv15[RUNE_STATS["DEF"]] = int(row[36])
  172. self._stats_lv15[RUNE_STATS["SPD"]] = int(row[37])
  173. self._stats_lv15[RUNE_STATS["CRR"]] = int(row[38])
  174. self._stats_lv15[RUNE_STATS["CRD"]] = int(row[39])
  175. self._stats_lv15[RUNE_STATS["RES"]] = int(row[40])
  176. self._stats_lv15[RUNE_STATS["ACC"]] = int(row[41])
  177. # Get rune stats
  178. cursor = conn.execute(
  179. """
  180. SELECT slot, stat, value, grind, enchant
  181. FROM rune_stats WHERE rune = ?
  182. """,
  183. (self._id,)
  184. )
  185. rows = cursor.fetchall()
  186. for row in rows:
  187. stat = RuneStat()
  188. stat.slot = int(row[0])
  189. stat.stat = int(row[1])
  190. stat.value = int(row[2])
  191. stat.grind = int(row[3])
  192. stat.enchant = int(row[4])
  193. if -1 == stat.slot:
  194. self._main_stat = stat
  195. elif 0 == stat.slot:
  196. self._innate_stat = stat
  197. elif 1 <= stat.slot and 4 >= stat.slot:
  198. self.sub_stats[stat.slot - 1] = stat
  199. @property
  200. def id(self):
  201. return self._id
  202. @property
  203. def unit(self):
  204. return self._unit
  205. @property
  206. def type(self):
  207. return self._type
  208. @property
  209. def type_name(self):
  210. return self._type_name
  211. @property
  212. def slot(self):
  213. return self._slot
  214. @property
  215. def stars(self):
  216. return self._stars
  217. @property
  218. def level(self):
  219. return self._level
  220. @property
  221. def quality(self):
  222. return self._quality
  223. @property
  224. def quality_name(self):
  225. return self._quality_name
  226. @property
  227. def efficiency(self):
  228. return self._efficiency
  229. @property
  230. def max_efficiency(self):
  231. return self._max_efficiency
  232. @property
  233. def main_stat(self):
  234. return self._main_stat
  235. @property
  236. def innate_stat(self):
  237. return self._innate_stat
  238. @property
  239. def sub_stats(self):
  240. return self._sub_stats
  241. @property
  242. def stats(self):
  243. if self._innate_stat != None:
  244. return [self._main_stat] + [self.innate_stat] + self._sub_stats
  245. else:
  246. return [self._main_stat] + self._sub_stats
  247. def get_stat(self, stat, level = None):
  248. """
  249. Gets a stat given by the rune.
  250. Level can be specified as 12 or 15 to get the values the rune will have
  251. at that level. If 12 is specified and the rune current level is higher,
  252. it's current value is returned.
  253. """
  254. if stat in RUNE_STATS.values() == False:
  255. return 0
  256. if int(level) == 12:
  257. return self._stats_lv12[stat]
  258. elif int(level) == 15:
  259. return self._stats_lv15[stat]
  260. else:
  261. return self._stats_current[stat]