Crossfire Server  1.75.0
Quests.cpp
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 2021 the Crossfire Development Team
5  *
6  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
7  * welcome to redistribute it under certain conditions. For details, please
8  * see COPYING and LICENSE.
9  *
10  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
11  */
12 
13 #include "Quests.h"
14 
15 template<>
16 quest_definition *asset_create(const std::string& name) {
17  return quest_create(name.data());
18 }
19 
20 template<>
22  quest_destroy(quest);
23 }
24 
25 Quests::Quests() : visibleQuests(0) {
26 }
27 
29 }
30 
32  if (!existing->quest_is_system) {
33  visibleQuests--;
34  }
35  quest_clear(existing);
36  (*existing) = (*update);
37  free(update);
38  if (!existing->quest_is_system) {
39  visibleQuests++;
40  }
41 }
42 
44  quest->client_code = m_assets.size();
45  if (!quest->quest_is_system)
46  visibleQuests++;
47 }
48 
50  quest_step_definition *step = static_cast<quest_step_definition *>(calloc(1, sizeof(quest_step_definition)));
51  if (!step)
53  return step;
54 }
55 
57  quest_condition *cond = static_cast<quest_condition *>(calloc(1, sizeof(quest_condition)));
58  if (!cond)
60  return cond;
61 }
62 
63 quest_definition *quest_create(const char *name) {
64  quest_definition *quest = static_cast<quest_definition *>(calloc(1, sizeof(quest_definition)));
65  quest->quest_code = add_string(name);
66  return quest;
67 }
68 
70  free_string(condition->quest_code);
71  free(condition);
72 }
73 
76  while (!step->conditions.empty()) {
77  quest_destroy_condition(step->conditions.back());
78  step->conditions.pop_back();
79  }
80  free(step);
81 }
82 
84  free_string(quest->quest_code);
88  while (!quest->steps.empty()) {
89  quest_destroy_step(quest->steps.back());
90  quest->steps.pop_back();
91  }
92  quest->steps.clear();
93 }
94 
96  quest_clear(quest);
97  free(quest);
98 }
99 
100 int quest_condition_from_string(quest_condition *condition, const char *buffer) {
101  int condition_parsed = 0;
102  condition->minstep = 0;
103  condition->maxstep = 0;
104  condition->quest_code = nullptr;
105 
106  char namedquest[500];
107  namedquest[0] = '\0';
108  if (sscanf(buffer, "%s %d-%d", namedquest, &condition->minstep, &condition->maxstep) != 3) {
109  if (sscanf(buffer, "%s <=%d", namedquest, &condition->maxstep) == 2) {
110  condition->minstep = 0;
111  condition_parsed = 1;
112  } else if (sscanf(buffer, "%s %d", namedquest, &condition->minstep) == 2) {
113  condition->maxstep = condition->minstep;
114  condition_parsed = 1;
115  } else if (strstr(buffer, "finished")) {
116  if (sscanf(buffer, "%s finished", namedquest) == 1) {
117  condition->minstep = condition->maxstep = -1;
118  condition_parsed = 1;
119  }
120  }
121  } else
122  condition_parsed = 1;
123 
124  if (condition_parsed)
125  condition->quest_code = add_string(namedquest);
126 
127  return condition_parsed;
128 }
129 
130 void quest_write_condition(char *buf, size_t len, const quest_condition *cond) {
131  if (cond->maxstep == -1 && cond->minstep == -1) {
132  snprintf(buf, len, "%s finished", cond->quest_code);
133  } else {
134  if (cond->minstep == 0) {
135  snprintf(buf, len, "%s <=%d", cond->quest_code, cond->maxstep);
136  } else if (cond->minstep == cond->maxstep) {
137  snprintf(buf, len, "%s %d", cond->quest_code, cond->maxstep);
138  } else {
139  snprintf(buf, len, "%s %d-%d", cond->quest_code, cond->minstep, cond->maxstep);
140  }
141  }
142 }
int maxstep
The latest step that triggers the condition, to match, the stages must be between minstep and maxstep...
Definition: quest.h:24
sstring step_description
Step description to show player.
Definition: quest.h:31
Definition of an in-game quest.
Definition: quest.h:37
sstring quest_code
The quest that triggers the condition.
Definition: quest.h:21
std::vector< quest_step_definition * > steps
Quest steps.
Definition: quest.h:46
sstring quest_comment
Quest comment, not visible to players.
Definition: quest.h:41
sstring add_string(const char *str)
Share a string.
Definition: shstr.cpp:137
One step of a quest.
Definition: quest.h:29
#define FREE_AND_CLEAR_STR_IF(xyz)
Definition: global.h:202
uint32_t client_code
The code used to communicate with the client, merely a unique index.
Definition: quest.h:44
std::unordered_map< std::string, quest_definition *> m_assets
Known assets.
void quest_destroy_step(quest_step_definition *step)
Definition: Quests.cpp:74
void free_string(sstring str)
This will reduce the refcount, and if it has reached 0, str will be freed.
Definition: shstr.cpp:294
quest_definition * quest_create(const char *name)
Definition: Quests.cpp:63
int quest_condition_from_string(quest_condition *condition, const char *buffer)
Parse a single step condition.
Definition: Quests.cpp:100
One condition to automatically move to a quest step.
Definition: quest.h:20
void quest_destroy_condition(quest_condition *condition)
Definition: Quests.cpp:69
quest_condition * quest_create_condition(void)
Allocate a quest_condition, will call fatal() if out of memory.
Definition: Quests.cpp:56
virtual ~Quests()
Definition: Quests.cpp:28
bool quest_is_system
If set then the quest isn&#39;t counted or listed.
Definition: quest.h:45
quest_step_definition * quest_create_step(void)
Allocate a quest_step_definition, will call fatal() if out of memory.
Definition: Quests.cpp:49
size_t visibleQuests
Definition: Quests.h:31
sstring quest_code
Quest internal code.
Definition: quest.h:38
void asset_destroy(quest_definition *quest)
Definition: Quests.cpp:21
void quest_destroy(quest_definition *quest)
Definition: Quests.cpp:95
std::vector< quest_condition * > conditions
The conditions that must be satisfied to trigger the step.
Definition: quest.h:33
void quest_write_condition(char *buf, size_t len, const quest_condition *cond)
Write a step condition to a buffer.
Definition: Quests.cpp:130
sstring quest_title
Quest title for player.
Definition: quest.h:39
void fatal(enum fatal_error err)
fatal() is meant to be called whenever a fatal signal is intercepted.
Definition: utils.cpp:590
virtual void replace(quest_definition *existing, quest_definition *update) override
Replace an asset by an updated version.
Definition: Quests.cpp:31
void quest_clear(quest_definition *quest)
Definition: Quests.cpp:83
int minstep
The earliest step in the quest that triggers the condition, -1 means finished, 0 means not started...
Definition: quest.h:22
StringBuffer * buf
Definition: readable.cpp:1563
sstring quest_description
Quest longer description.
Definition: quest.h:40
virtual void added(quest_definition *quest) override
An asset was either referenced (but undefined) or defined.
Definition: Quests.cpp:43
quest_definition * asset_create(const std::string &name)
Definition: Quests.cpp:16
Quests()
Definition: Quests.cpp:25