quest.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // Copyright (c) Athena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #include "../common/cbasetypes.h"
  4. #include "../common/socket.h"
  5. #include "../common/timer.h"
  6. #include "../common/malloc.h"
  7. #include "../common/version.h"
  8. #include "../common/nullpo.h"
  9. #include "../common/showmsg.h"
  10. #include "../common/strlib.h"
  11. #include "../common/utils.h"
  12. #include "map.h"
  13. #include "chrif.h"
  14. #include "pc.h"
  15. #include "npc.h"
  16. #include "itemdb.h"
  17. #include "script.h"
  18. #include "intif.h"
  19. #include "battle.h"
  20. #include "mob.h"
  21. #include "party.h"
  22. #include "unit.h"
  23. #include "log.h"
  24. #include "clif.h"
  25. #include "quest.h"
  26. #include "intif.h"
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <stdarg.h>
  31. #include <time.h>
  32. //Send quest info on login
  33. int quest_pc_login(TBL_PC * sd)
  34. {
  35. if(sd->num_quests == 0)
  36. return 1;
  37. clif_send_questlog(sd);
  38. clif_send_questlog_info(sd);
  39. return 0;
  40. }
  41. int quest_add(TBL_PC * sd, struct quest * qd)
  42. {
  43. int i;
  44. //Search to see if this quest exists
  45. ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == qd->quest_id);
  46. //Already have this quest
  47. if(i!=MAX_QUEST)
  48. return 1;
  49. //Find empty quest log spot
  50. ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == 0);
  51. //Quest log is full
  52. if(i == MAX_QUEST)
  53. return -1;
  54. //Copy over quest data
  55. memcpy(&sd->quest_log[i], qd, sizeof(struct quest));
  56. sd->num_quests++;
  57. //Notify inter server
  58. intif_quest_add(sd->status.char_id, qd);
  59. return 0;
  60. }
  61. int quest_add_ack(int char_id, int quest_id, int success)
  62. {
  63. int i;
  64. TBL_PC * sd = map_charid2sd(char_id);
  65. ///Player no longer on map
  66. if(!sd)
  67. return -1;
  68. //Search for quest
  69. ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id);
  70. //Quest not found, shouldn't happen?
  71. if(i == MAX_QUEST)
  72. return -1;
  73. if(success)
  74. {
  75. //Notify client
  76. clif_send_quest_info(sd, &sd->quest_log[i]);
  77. }
  78. else
  79. {
  80. ShowError("Quest %d for character %d could not be added!\n", quest_id, char_id);
  81. //Zero quest
  82. memset(&sd->quest_log[i], 0, sizeof(struct quest));
  83. sd->num_quests--;
  84. }
  85. return 0;
  86. }
  87. int quest_delete(TBL_PC * sd, int quest_id)
  88. {
  89. int i;
  90. //Search for quest
  91. ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id);
  92. //Quest not found
  93. if(i == MAX_QUEST)
  94. return -1;
  95. intif_quest_delete(sd->status.char_id, quest_id);
  96. return 0;
  97. }
  98. int quest_delete_ack(int char_id, int quest_id, int success)
  99. {
  100. int i;
  101. TBL_PC * sd = map_charid2sd(char_id);
  102. ///Player no longer on map
  103. if(!sd)
  104. return -1;
  105. //Search for quest
  106. ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id);
  107. //Quest not found
  108. if(i == MAX_QUEST)
  109. return -1;
  110. if(success)
  111. {
  112. //Zero quest
  113. memset(&sd->quest_log[i], 0, sizeof(struct quest));
  114. sd->num_quests--;
  115. //Notify client
  116. clif_send_quest_delete(sd, quest_id);
  117. return 1;
  118. }
  119. else
  120. ShowError("Quest %d for character %d could not be deleted!\n", quest_id, char_id);
  121. return 0;
  122. }
  123. int quest_update_objective(TBL_PC * sd, int quest_id, int objective_num, const char * name, int count)
  124. {
  125. int i;
  126. //Search for quest
  127. ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id);
  128. //Quest not found
  129. if(i == MAX_QUEST)
  130. return -1;
  131. memcpy(&sd->quest_log[i].objectives[objective_num].name, name, NAME_LENGTH);
  132. sd->quest_log[i].objectives[objective_num].count = count;
  133. //Notify client
  134. clif_send_quest_info(sd, &sd->quest_log[i]);
  135. return 0;
  136. }
  137. bool quest_has_quest(TBL_PC * sd, int quest_id)
  138. {
  139. int i;
  140. ARR_FIND(0, MAX_QUEST, i, sd->quest_log[i].quest_id == quest_id);
  141. return (i != MAX_QUEST);
  142. }
  143. int quest_update_status(TBL_PC * sd, int quest_id, bool status)
  144. {
  145. return 0;
  146. }