achievement.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #ifndef ACHIEVEMENT_HPP
  4. #define ACHIEVEMENT_HPP
  5. #include <algorithm>
  6. #include <map>
  7. #include <memory>
  8. #include <string>
  9. #include <unordered_map>
  10. #include <vector>
  11. #include "../common/mmo.hpp"
  12. #include "../common/database.hpp"
  13. #include "../common/db.hpp"
  14. class map_session_data;
  15. struct block_list;
  16. enum e_achievement_group {
  17. AG_NONE = 0,
  18. AG_ADD_FRIEND,
  19. AG_ADVENTURE,
  20. AG_BABY,
  21. AG_BATTLE,
  22. AG_CHATTING,
  23. AG_CHATTING_COUNT,
  24. AG_CHATTING_CREATE,
  25. AG_CHATTING_DYING,
  26. AG_EAT,
  27. AG_GET_ITEM,
  28. AG_GET_ZENY,
  29. AG_GOAL_ACHIEVE,
  30. AG_GOAL_LEVEL,
  31. AG_GOAL_STATUS,
  32. AG_JOB_CHANGE,
  33. AG_MARRY,
  34. AG_PARTY,
  35. AG_ENCHANT_FAIL,
  36. AG_ENCHANT_SUCCESS,
  37. AG_SPEND_ZENY,
  38. AG_TAMING,
  39. AG_MAX
  40. };
  41. enum e_achievement_info {
  42. ACHIEVEINFO_COUNT1 = 1,
  43. ACHIEVEINFO_COUNT2,
  44. ACHIEVEINFO_COUNT3,
  45. ACHIEVEINFO_COUNT4,
  46. ACHIEVEINFO_COUNT5,
  47. ACHIEVEINFO_COUNT6,
  48. ACHIEVEINFO_COUNT7,
  49. ACHIEVEINFO_COUNT8,
  50. ACHIEVEINFO_COUNT9,
  51. ACHIEVEINFO_COUNT10,
  52. ACHIEVEINFO_COMPLETE,
  53. ACHIEVEINFO_COMPLETEDATE,
  54. ACHIEVEINFO_GOTREWARD,
  55. ACHIEVEINFO_LEVEL,
  56. ACHIEVEINFO_SCORE,
  57. ACHIEVEINFO_MAX,
  58. };
  59. enum e_title_table : uint16 {
  60. TITLE_NONE = 0,
  61. TITLE_BASE = 1000,
  62. TITLE_MAX = 1046,
  63. };
  64. struct achievement_target {
  65. int mob;
  66. int count;
  67. };
  68. struct s_achievement_db {
  69. uint32 achievement_id;
  70. std::string name;
  71. enum e_achievement_group group;
  72. std::map<uint16, std::shared_ptr<achievement_target>> targets;
  73. std::vector<uint32> dependent_ids;
  74. struct script_code* condition;
  75. int16 mapindex;
  76. struct ach_reward {
  77. t_itemid nameid;
  78. unsigned short amount;
  79. struct script_code *script;
  80. uint32 title_id;
  81. ach_reward();
  82. ~ach_reward();
  83. } rewards;
  84. int score;
  85. int has_dependent; // Used for quick updating of achievements that depend on others - this is their ID
  86. s_achievement_db();
  87. ~s_achievement_db();
  88. };
  89. class AchievementDatabase : public TypesafeYamlDatabase<uint32, s_achievement_db>{
  90. private:
  91. std::vector<uint32> achievement_mobs; // Avoids checking achievements on every mob killed
  92. public:
  93. AchievementDatabase() : TypesafeYamlDatabase( "ACHIEVEMENT_DB", 2 ){
  94. }
  95. void clear() override;
  96. const std::string getDefaultLocation() override;
  97. uint64 parseBodyNode( const ryml::NodeRef& node ) override;
  98. void loadingFinished() override;
  99. // Additional
  100. bool mobexists(uint32 mob_id);
  101. };
  102. extern AchievementDatabase achievement_db;
  103. struct s_achievement_level{
  104. uint16 level;
  105. uint16 points;
  106. };
  107. class AchievementLevelDatabase : public TypesafeYamlDatabase<uint16, s_achievement_level>{
  108. public:
  109. AchievementLevelDatabase() : TypesafeYamlDatabase( "ACHIEVEMENT_LEVEL_DB", 1 ){
  110. }
  111. const std::string getDefaultLocation() override;
  112. uint64 parseBodyNode( const ryml::NodeRef& node ) override;
  113. };
  114. extern AchievementLevelDatabase achievement_level_db;
  115. void achievement_get_reward(map_session_data *sd, int achievement_id, time_t rewarded);
  116. struct achievement *achievement_add(map_session_data *sd, int achievement_id);
  117. bool achievement_remove(map_session_data *sd, int achievement_id);
  118. bool achievement_update_achievement(map_session_data *sd, int achievement_id, bool complete);
  119. void achievement_check_reward(map_session_data *sd, int achievement_id);
  120. void achievement_free(map_session_data *sd);
  121. int achievement_check_progress(map_session_data *sd, int achievement_id, int type);
  122. int *achievement_level(map_session_data *sd, bool flag);
  123. bool achievement_check_condition(struct script_code* condition, map_session_data* sd);
  124. void achievement_get_titles(uint32 char_id);
  125. void achievement_update_objective(map_session_data *sd, enum e_achievement_group group, uint8 arg_count, ...);
  126. int achievement_update_objective_sub(block_list *bl, va_list ap);
  127. void achievement_read_db(void);
  128. void achievement_db_reload(void);
  129. void do_init_achievement(void);
  130. void do_final_achievement(void);
  131. #endif /* ACHIEVEMENT_HPP */