Blame


1 dcf33c24 2021-09-10 xhr /*
2 dcf33c24 2021-09-10 xhr * Copyright (c) 2021 Matthias Schmidt <xhr@giessen.ccc.de>
3 dcf33c24 2021-09-10 xhr *
4 dcf33c24 2021-09-10 xhr * Permission to use, copy, modify, and distribute this software for any
5 dcf33c24 2021-09-10 xhr * purpose with or without fee is hereby granted, provided that the above
6 dcf33c24 2021-09-10 xhr * copyright notice and this permission notice appear in all copies.
7 dcf33c24 2021-09-10 xhr *
8 dcf33c24 2021-09-10 xhr * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 dcf33c24 2021-09-10 xhr * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 dcf33c24 2021-09-10 xhr * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 dcf33c24 2021-09-10 xhr * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 dcf33c24 2021-09-10 xhr * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 dcf33c24 2021-09-10 xhr * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 dcf33c24 2021-09-10 xhr * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 dcf33c24 2021-09-10 xhr */
16 67f6b276 2021-09-10 xhr
17 dcf33c24 2021-09-10 xhr #include <json-c/json.h>
18 dcf33c24 2021-09-10 xhr
19 bd88fb1a 2021-09-11 xhr #include <errno.h>
20 dcf33c24 2021-09-10 xhr #include <limits.h>
21 bd88fb1a 2021-09-11 xhr #include <string.h>
22 dcf33c24 2021-09-10 xhr
23 8a2e76b6 2021-09-10 xhr #include "isscrolls.h"
24 bd88fb1a 2021-09-11 xhr
25 bd88fb1a 2021-09-11 xhr void
26 bd88fb1a 2021-09-11 xhr cmd_undertake_a_journey(char *cmd)
27 bd88fb1a 2021-09-11 xhr {
28 bd88fb1a 2021-09-11 xhr struct character *curchar = get_current_character();
29 bd88fb1a 2021-09-11 xhr char *ep;
30 bd88fb1a 2021-09-11 xhr long lval;
31 bd88fb1a 2021-09-11 xhr int ival[2] = { -1, -1 };
32 bd88fb1a 2021-09-11 xhr int ret;
33 bd88fb1a 2021-09-11 xhr
34 bd88fb1a 2021-09-11 xhr if (curchar == NULL) {
35 bd88fb1a 2021-09-11 xhr printf("No character loaded. Use 'cd' to load a character\n");
36 bd88fb1a 2021-09-11 xhr return;
37 bd88fb1a 2021-09-11 xhr }
38 bd88fb1a 2021-09-11 xhr
39 bd88fb1a 2021-09-11 xhr ival[0] = curchar->wits;
40 bd88fb1a 2021-09-11 xhr if (strlen(cmd) > 0) {
41 bd88fb1a 2021-09-11 xhr errno = 0;
42 bd88fb1a 2021-09-11 xhr lval = strtol(cmd, &ep, 10);
43 bd88fb1a 2021-09-11 xhr if (cmd[0] == '\0' || *ep != '\0') {
44 bd88fb1a 2021-09-11 xhr printf("Please provide a number as argument\n");
45 bd88fb1a 2021-09-11 xhr return;
46 bd88fb1a 2021-09-11 xhr }
47 bd88fb1a 2021-09-11 xhr if ((errno == ERANGE || lval <= 0 || lval > 10)) {
48 bd88fb1a 2021-09-11 xhr printf("Please provide a number between 1 and 10\n");
49 bd88fb1a 2021-09-11 xhr return;
50 bd88fb1a 2021-09-11 xhr }
51 bd88fb1a 2021-09-11 xhr
52 bd88fb1a 2021-09-11 xhr ival[1] = lval;
53 bd88fb1a 2021-09-11 xhr log_debug("Arg provided %d\n", ival[1]);
54 bd88fb1a 2021-09-11 xhr }
55 bd88fb1a 2021-09-11 xhr
56 bd88fb1a 2021-09-11 xhr if (curchar->journey_active == 0) {
57 bd88fb1a 2021-09-11 xhr ask_for_journey_difficulty();
58 bd88fb1a 2021-09-11 xhr curchar->journey_active = 1;
59 bd88fb1a 2021-09-11 xhr }
60 bd88fb1a 2021-09-11 xhr
61 bd88fb1a 2021-09-11 xhr ret = action_roll(ival);
62 bd88fb1a 2021-09-11 xhr if (ret == 8) {
63 bd88fb1a 2021-09-11 xhr printf("You reach a waypoint and can choose one option -> Rulebook\n");
64 bd88fb1a 2021-09-11 xhr mark_journey_progress();
65 bd88fb1a 2021-09-11 xhr } else if (ret == 4) {
66 bd88fb1a 2021-09-11 xhr printf("You reach a waypoint, but suffer -1 supply\n");
67 bd88fb1a 2021-09-11 xhr change_char_value("supply", DECREASE, 1);
68 bd88fb1a 2021-09-11 xhr mark_journey_progress();
69 bd88fb1a 2021-09-11 xhr } else
70 bd88fb1a 2021-09-11 xhr printf("Pay the price -> Rulebook\n");
71 8a2e76b6 2021-09-10 xhr
72 bd88fb1a 2021-09-11 xhr update_prompt();
73 bd88fb1a 2021-09-11 xhr }
74 bd88fb1a 2021-09-11 xhr
75 b653ad5b 2021-09-11 xhr void
76 319d4050 2021-09-16 xhr cmd_reach_your_destination(char *cmd)
77 bd88fb1a 2021-09-11 xhr {
78 bd88fb1a 2021-09-11 xhr struct character *curchar = get_current_character();
79 319d4050 2021-09-16 xhr double dval[2] = { -1.0, -1.0 };
80 bd88fb1a 2021-09-11 xhr int ret;
81 bd88fb1a 2021-09-11 xhr
82 bd88fb1a 2021-09-11 xhr if (curchar == NULL) {
83 bd88fb1a 2021-09-11 xhr printf("No character loaded. Use 'cd' to load a character\n");
84 bd88fb1a 2021-09-11 xhr return;
85 bd88fb1a 2021-09-11 xhr }
86 bd88fb1a 2021-09-11 xhr
87 bd88fb1a 2021-09-11 xhr if (curchar->journey_active == 0) {
88 bd88fb1a 2021-09-11 xhr printf("You must start a journey with 'undertakeajourney' first\n");
89 bd88fb1a 2021-09-11 xhr return;
90 bd88fb1a 2021-09-11 xhr }
91 bd88fb1a 2021-09-11 xhr
92 319d4050 2021-09-16 xhr dval[0] = curchar->j->progress;
93 319d4050 2021-09-16 xhr dval[1] = get_int_from_cmd(cmd);
94 bd88fb1a 2021-09-11 xhr
95 319d4050 2021-09-16 xhr ret = progress_roll(dval);
96 bd88fb1a 2021-09-11 xhr if (ret == 8) {
97 3f1228d5 2021-09-16 xhr printf("You reach your destination and the situation favors you -> "\
98 3f1228d5 2021-09-16 xhr "Rulebook\n");
99 bd88fb1a 2021-09-11 xhr curchar->journey_active = 0;
100 bd88fb1a 2021-09-11 xhr curchar->j->progress = 0;
101 bd88fb1a 2021-09-11 xhr delete_journey(curchar->id);
102 bd88fb1a 2021-09-11 xhr } else if (ret == 4) {
103 3f1228d5 2021-09-16 xhr printf("You reach your destination but face an unforseen complication "\
104 3f1228d5 2021-09-16 xhr "-> Rulebook\n");
105 bd88fb1a 2021-09-11 xhr curchar->journey_active = 0;
106 bd88fb1a 2021-09-11 xhr curchar->j->progress = 0;
107 bd88fb1a 2021-09-11 xhr delete_journey(curchar->id);
108 bd88fb1a 2021-09-11 xhr } else {
109 bd88fb1a 2021-09-11 xhr reach_your_destination_failed();
110 bd88fb1a 2021-09-11 xhr }
111 bd88fb1a 2021-09-11 xhr
112 bd88fb1a 2021-09-11 xhr update_prompt();
113 bd88fb1a 2021-09-11 xhr }
114 bd88fb1a 2021-09-11 xhr
115 bd88fb1a 2021-09-11 xhr void
116 b653ad5b 2021-09-11 xhr mark_journey_progress()
117 8a2e76b6 2021-09-10 xhr {
118 b653ad5b 2021-09-11 xhr struct character *curchar = get_current_character();
119 b653ad5b 2021-09-11 xhr
120 b653ad5b 2021-09-11 xhr if (curchar == NULL) {
121 8a2e76b6 2021-09-10 xhr log_debug("No character loaded. Cannot calculate progress\n");
122 b653ad5b 2021-09-11 xhr return;
123 8a2e76b6 2021-09-10 xhr }
124 8a2e76b6 2021-09-10 xhr
125 b653ad5b 2021-09-11 xhr if (curchar->journey_active == 0) {
126 b653ad5b 2021-09-11 xhr printf("You need start a journey before you can mark progress\n");
127 b653ad5b 2021-09-11 xhr return;
128 b653ad5b 2021-09-11 xhr }
129 8a2e76b6 2021-09-10 xhr
130 b653ad5b 2021-09-11 xhr switch (curchar->j->difficulty) {
131 b653ad5b 2021-09-11 xhr case 1:
132 b653ad5b 2021-09-11 xhr curchar->j->progress += 3;
133 b653ad5b 2021-09-11 xhr break;
134 b653ad5b 2021-09-11 xhr case 2:
135 b653ad5b 2021-09-11 xhr curchar->j->progress += 2;
136 b653ad5b 2021-09-11 xhr break;
137 b653ad5b 2021-09-11 xhr case 3:
138 b653ad5b 2021-09-11 xhr curchar->j->progress += 1;
139 b653ad5b 2021-09-11 xhr break;
140 b653ad5b 2021-09-11 xhr case 4:
141 b653ad5b 2021-09-11 xhr curchar->j->progress += 0.5;
142 b653ad5b 2021-09-11 xhr break;
143 b653ad5b 2021-09-11 xhr case 5:
144 b653ad5b 2021-09-11 xhr curchar->j->progress += 0.25;
145 b653ad5b 2021-09-11 xhr break;
146 b653ad5b 2021-09-11 xhr default:
147 4554fab2 2021-09-16 xhr curchar->j->difficulty = 1;
148 4554fab2 2021-09-16 xhr log_errx(1, "Unknown difficulty. This should not happen. Set it to 1\n");
149 b653ad5b 2021-09-11 xhr }
150 b653ad5b 2021-09-11 xhr
151 b653ad5b 2021-09-11 xhr if (curchar->j->progress > 10) {
152 b653ad5b 2021-09-11 xhr printf("Your reached all milestones of your journey. Consider ending it\n");
153 b653ad5b 2021-09-11 xhr curchar->j->progress = 10;
154 b653ad5b 2021-09-11 xhr }
155 b653ad5b 2021-09-11 xhr
156 b653ad5b 2021-09-11 xhr update_prompt();
157 8a2e76b6 2021-09-10 xhr }
158 8a2e76b6 2021-09-10 xhr
159 dcf33c24 2021-09-10 xhr void
160 fcc4d354 2021-09-11 xhr reach_your_destination_failed()
161 fcc4d354 2021-09-11 xhr {
162 fcc4d354 2021-09-11 xhr struct character *curchar = get_current_character();
163 fcc4d354 2021-09-11 xhr int a;
164 fcc4d354 2021-09-11 xhr
165 fcc4d354 2021-09-11 xhr if (curchar == NULL) {
166 fcc4d354 2021-09-11 xhr log_debug("No character loaded.\n");
167 fcc4d354 2021-09-11 xhr return;
168 fcc4d354 2021-09-11 xhr }
169 fcc4d354 2021-09-11 xhr
170 fcc4d354 2021-09-11 xhr if (curchar->journey_active == 0) {
171 fcc4d354 2021-09-11 xhr log_debug("No active journey.\n");
172 fcc4d354 2021-09-11 xhr return;
173 fcc4d354 2021-09-11 xhr }
174 fcc4d354 2021-09-11 xhr
175 fcc4d354 2021-09-11 xhr printf("Please decide what to do\n\n");
176 fcc4d354 2021-09-11 xhr printf("1\t - End your journey and pay the price -> Rulebook\n");
177 fcc4d354 2021-09-11 xhr printf("2\t - Continue your journey -> progress is lost, difficulty +1\n");
178 fcc4d354 2021-09-11 xhr
179 fcc4d354 2021-09-11 xhr a = ask_for_value("Enter a value between 1 and 2: ", 2);
180 fcc4d354 2021-09-11 xhr if (a == 1) {
181 fcc4d354 2021-09-11 xhr curchar->journey_active = 0;
182 fcc4d354 2021-09-11 xhr curchar->j->progress = 0;
183 fcc4d354 2021-09-11 xhr delete_journey(curchar->id);
184 fcc4d354 2021-09-11 xhr } else {
185 fcc4d354 2021-09-11 xhr curchar->j->progress = 0;
186 fcc4d354 2021-09-11 xhr if (curchar->j->difficulty <= 5)
187 fcc4d354 2021-09-11 xhr curchar->j->difficulty += 1;
188 fcc4d354 2021-09-11 xhr }
189 fcc4d354 2021-09-11 xhr }
190 fcc4d354 2021-09-11 xhr
191 fcc4d354 2021-09-11 xhr void
192 dcf33c24 2021-09-10 xhr save_journey()
193 dcf33c24 2021-09-10 xhr {
194 dcf33c24 2021-09-10 xhr struct character *curchar = get_current_character();
195 dcf33c24 2021-09-10 xhr char path[_POSIX_PATH_MAX];
196 d5faed8f 2021-09-16 xhr json_object *root, *items, *id;
197 dcf33c24 2021-09-10 xhr int temp_n, i;
198 dcf33c24 2021-09-10 xhr
199 dcf33c24 2021-09-10 xhr if (curchar == NULL) {
200 dcf33c24 2021-09-10 xhr log_debug("No character loaded. No journey to save.\n");
201 dcf33c24 2021-09-10 xhr return;
202 dcf33c24 2021-09-10 xhr }
203 dcf33c24 2021-09-10 xhr
204 635b768e 2021-09-11 xhr if (curchar->journey_active == 0) {
205 635b768e 2021-09-11 xhr log_debug("No active journey to save.\n");
206 635b768e 2021-09-11 xhr return;
207 635b768e 2021-09-11 xhr }
208 635b768e 2021-09-11 xhr
209 dcf33c24 2021-09-10 xhr json_object *cobj = json_object_new_object();
210 dcf33c24 2021-09-10 xhr json_object_object_add(cobj, "id", json_object_new_int(curchar->id));
211 3f1228d5 2021-09-16 xhr json_object_object_add(cobj, "difficulty",
212 3f1228d5 2021-09-16 xhr json_object_new_int(curchar->j->difficulty));
213 3f1228d5 2021-09-16 xhr json_object_object_add(cobj, "progress",
214 3f1228d5 2021-09-16 xhr json_object_new_double(curchar->j->progress));
215 dcf33c24 2021-09-10 xhr
216 dcf33c24 2021-09-10 xhr snprintf(path, sizeof(path), "%s/journey.json", get_isscrolls_dir());
217 dcf33c24 2021-09-10 xhr if ((root = json_object_from_file(path)) == NULL) {
218 dcf33c24 2021-09-10 xhr log_debug("No journey JSON file found\n");
219 dcf33c24 2021-09-10 xhr root = json_object_new_object();
220 dcf33c24 2021-09-10 xhr if (!root)
221 dcf33c24 2021-09-10 xhr log_errx(1, "Cannot create journey JSON object\n");
222 dcf33c24 2021-09-10 xhr
223 dcf33c24 2021-09-10 xhr items = json_object_new_array();
224 dcf33c24 2021-09-10 xhr json_object_array_add(items, cobj);
225 dcf33c24 2021-09-10 xhr json_object_object_add(root, "journey", items);
226 dcf33c24 2021-09-10 xhr } else {
227 dcf33c24 2021-09-10 xhr /* Get existing character array from JSON */
228 fc6936c9 2021-09-16 xhr if (!json_object_object_get_ex(root, "journey", &items)) {
229 fc6936c9 2021-09-16 xhr log_debug("Cannot find a [journey] array in %s\n", path);
230 fc6936c9 2021-09-16 xhr items = json_object_new_array();
231 fc6936c9 2021-09-16 xhr json_object_object_add(root, "journey", items);
232 fc6936c9 2021-09-16 xhr }
233 fc6936c9 2021-09-16 xhr
234 dcf33c24 2021-09-10 xhr temp_n = json_object_array_length(items);
235 dcf33c24 2021-09-10 xhr for (i = 0; i < temp_n; i++) {
236 dcf33c24 2021-09-10 xhr json_object *temp = json_object_array_get_idx(items, i);
237 d5faed8f 2021-09-16 xhr json_object_object_get_ex(temp, "id", &id);
238 dcf33c24 2021-09-10 xhr if (curchar->id == json_object_get_int(id)) {
239 dcf33c24 2021-09-10 xhr log_debug("Update journey entry for %s\n", curchar->name);
240 dcf33c24 2021-09-10 xhr json_object_array_del_idx(items, i, 1);
241 dcf33c24 2021-09-10 xhr json_object_array_add(items, cobj);
242 dcf33c24 2021-09-10 xhr goto out;
243 dcf33c24 2021-09-10 xhr }
244 dcf33c24 2021-09-10 xhr }
245 dcf33c24 2021-09-10 xhr log_debug("No journey entry for %s found, adding new one\n", curchar->name);
246 dcf33c24 2021-09-10 xhr json_object_array_add(items, cobj);
247 dcf33c24 2021-09-10 xhr }
248 dcf33c24 2021-09-10 xhr
249 dcf33c24 2021-09-10 xhr out:
250 dcf33c24 2021-09-10 xhr if (json_object_to_file(path, root))
251 dcf33c24 2021-09-10 xhr printf("Error saving %s\n", path);
252 dcf33c24 2021-09-10 xhr else
253 dcf33c24 2021-09-10 xhr log_debug("Successfully saved %s\n", path);
254 dcf33c24 2021-09-10 xhr
255 dcf33c24 2021-09-10 xhr json_object_put(root);
256 dcf33c24 2021-09-10 xhr }
257 dcf33c24 2021-09-10 xhr
258 dcf33c24 2021-09-10 xhr void
259 60bf4095 2021-09-11 xhr delete_journey(int id)
260 60bf4095 2021-09-11 xhr {
261 60bf4095 2021-09-11 xhr char path[_POSIX_PATH_MAX];
262 d5faed8f 2021-09-16 xhr json_object *root, *lid;
263 60bf4095 2021-09-11 xhr int temp_n, i;
264 60bf4095 2021-09-11 xhr
265 60bf4095 2021-09-11 xhr snprintf(path, sizeof(path), "%s/journey.json", get_isscrolls_dir());
266 60bf4095 2021-09-11 xhr if ((root = json_object_from_file(path)) == NULL) {
267 60bf4095 2021-09-11 xhr log_debug("No journey JSON file found\n");
268 60bf4095 2021-09-11 xhr return;
269 60bf4095 2021-09-11 xhr }
270 60bf4095 2021-09-11 xhr
271 fc6936c9 2021-09-16 xhr json_object *journey;
272 fc6936c9 2021-09-16 xhr if (!json_object_object_get_ex(root, "journey", &journey)) {
273 fc6936c9 2021-09-16 xhr log_debug("Cannot find a [journey] array in %s\n", path);
274 fc6936c9 2021-09-16 xhr return;
275 fc6936c9 2021-09-16 xhr }
276 fc6936c9 2021-09-16 xhr
277 60bf4095 2021-09-11 xhr temp_n = json_object_array_length(journey);
278 60bf4095 2021-09-11 xhr for (i = 0; i < temp_n; i++) {
279 60bf4095 2021-09-11 xhr json_object *temp = json_object_array_get_idx(journey, i);
280 d5faed8f 2021-09-16 xhr json_object_object_get_ex(temp, "id", &lid);
281 60bf4095 2021-09-11 xhr if (id == json_object_get_int(lid)) {
282 60bf4095 2021-09-11 xhr json_object_array_del_idx(journey, i, 1);
283 60bf4095 2021-09-11 xhr log_debug("Deleted journey entry for %d\n", id);
284 60bf4095 2021-09-11 xhr }
285 60bf4095 2021-09-11 xhr }
286 60bf4095 2021-09-11 xhr
287 60bf4095 2021-09-11 xhr if (json_object_to_file(path, root))
288 60bf4095 2021-09-11 xhr printf("Error saving %s\n", path);
289 60bf4095 2021-09-11 xhr else
290 60bf4095 2021-09-11 xhr log_debug("Successfully saved %s\n", path);
291 60bf4095 2021-09-11 xhr
292 60bf4095 2021-09-11 xhr json_object_put(root);
293 60bf4095 2021-09-11 xhr }
294 60bf4095 2021-09-11 xhr
295 60bf4095 2021-09-11 xhr void
296 dcf33c24 2021-09-10 xhr load_journey(int id)
297 dcf33c24 2021-09-10 xhr {
298 dcf33c24 2021-09-10 xhr struct character *curchar = get_current_character();
299 dcf33c24 2021-09-10 xhr char path[_POSIX_PATH_MAX];
300 d5faed8f 2021-09-16 xhr json_object *root, *lid;
301 15d8381d 2021-09-11 xhr int temp_n, i;
302 dcf33c24 2021-09-10 xhr
303 dcf33c24 2021-09-10 xhr if (curchar == NULL) {
304 dcf33c24 2021-09-10 xhr log_debug("No character loaded\n");
305 dcf33c24 2021-09-10 xhr return;
306 dcf33c24 2021-09-10 xhr }
307 dcf33c24 2021-09-10 xhr
308 dcf33c24 2021-09-10 xhr snprintf(path, sizeof(path), "%s/journey.json", get_isscrolls_dir());
309 dcf33c24 2021-09-10 xhr if ((root = json_object_from_file(path)) == NULL) {
310 dcf33c24 2021-09-10 xhr log_debug("No journey JSON file found\n");
311 dcf33c24 2021-09-10 xhr return;
312 dcf33c24 2021-09-10 xhr }
313 dcf33c24 2021-09-10 xhr
314 fc6936c9 2021-09-16 xhr json_object *journey;
315 fc6936c9 2021-09-16 xhr if (!json_object_object_get_ex(root, "journey", &journey)) {
316 fc6936c9 2021-09-16 xhr log_debug("Cannot find a [journey] array in %s\n", path);
317 fc6936c9 2021-09-16 xhr return;
318 fc6936c9 2021-09-16 xhr }
319 fc6936c9 2021-09-16 xhr
320 dcf33c24 2021-09-10 xhr temp_n = json_object_array_length(journey);
321 dcf33c24 2021-09-10 xhr for (i=0; i < temp_n; i++) {
322 dcf33c24 2021-09-10 xhr json_object *temp = json_object_array_get_idx(journey, i);
323 d5faed8f 2021-09-16 xhr json_object_object_get_ex(temp, "id", &lid);
324 dcf33c24 2021-09-10 xhr if (id == json_object_get_int(lid)) {
325 dcf33c24 2021-09-10 xhr log_debug("Loading journey for id: %d\n", json_object_get_int(lid));
326 dcf33c24 2021-09-10 xhr
327 5609edc8 2021-09-16 xhr json_object *cval;
328 5609edc8 2021-09-16 xhr json_object_object_get_ex(temp, "difficulty", &cval);
329 5609edc8 2021-09-16 xhr curchar->j->difficulty = json_object_get_int(cval);
330 5609edc8 2021-09-16 xhr json_object_object_get_ex(temp, "progress", &cval);
331 5609edc8 2021-09-16 xhr curchar->j->progress = json_object_get_double(cval);
332 dcf33c24 2021-09-10 xhr }
333 dcf33c24 2021-09-10 xhr }
334 dcf33c24 2021-09-10 xhr
335 dcf33c24 2021-09-10 xhr json_object_put(root);
336 dcf33c24 2021-09-10 xhr }
337 dcf33c24 2021-09-10 xhr