Blame


1 cc9bbf61 2020-04-01 op #include <stdio.h>
2 cc9bbf61 2020-04-01 op #include <string.h>
3 cc9bbf61 2020-04-01 op
4 cc9bbf61 2020-04-01 op #include "adventure.h"
5 cc9bbf61 2020-04-01 op
6 cc9bbf61 2020-04-01 op size_t
7 cc9bbf61 2020-04-01 op list_objs_at_loc(struct object *location)
8 cc9bbf61 2020-04-01 op {
9 cc9bbf61 2020-04-01 op size_t count = 0;
10 cc9bbf61 2020-04-01 op struct object *obj;
11 cc9bbf61 2020-04-01 op
12 cc9bbf61 2020-04-01 op foreach_obj (obj) {
13 cc9bbf61 2020-04-01 op if (obj != player && obj->location == location) {
14 cc9bbf61 2020-04-01 op if (count++ == 0)
15 cc9bbf61 2020-04-01 op printf("%s:\n", location->contents);
16 cc9bbf61 2020-04-01 op printf("%s\n", obj->description);
17 cc9bbf61 2020-04-01 op }
18 cc9bbf61 2020-04-01 op }
19 cc9bbf61 2020-04-01 op
20 cc9bbf61 2020-04-01 op return count;
21 cc9bbf61 2020-04-01 op }
22 cc9bbf61 2020-04-01 op
23 cc9bbf61 2020-04-01 op struct object *
24 cc9bbf61 2020-04-01 op person_here(void)
25 cc9bbf61 2020-04-01 op {
26 cc9bbf61 2020-04-01 op struct object *obj;
27 cc9bbf61 2020-04-01 op
28 cc9bbf61 2020-04-01 op foreach_obj (obj) {
29 cc9bbf61 2020-04-01 op if (distance_to(obj) == dist_here && obj->health > 0)
30 cc9bbf61 2020-04-01 op return obj;
31 cc9bbf61 2020-04-01 op }
32 cc9bbf61 2020-04-01 op
33 cc9bbf61 2020-04-01 op return NULL;
34 cc9bbf61 2020-04-01 op }
35 cc9bbf61 2020-04-01 op
36 cc9bbf61 2020-04-01 op struct object *
37 cc9bbf61 2020-04-01 op get_passage_to(struct object *target)
38 cc9bbf61 2020-04-01 op {
39 cc9bbf61 2020-04-01 op struct object *obj;
40 cc9bbf61 2020-04-01 op
41 cc9bbf61 2020-04-01 op foreach_obj (obj) {
42 cc9bbf61 2020-04-01 op if (obj->location == player->location &&
43 cc9bbf61 2020-04-01 op obj->prospect == target)
44 cc9bbf61 2020-04-01 op return obj;
45 cc9bbf61 2020-04-01 op }
46 cc9bbf61 2020-04-01 op
47 cc9bbf61 2020-04-01 op return NULL;
48 cc9bbf61 2020-04-01 op }
49 cc9bbf61 2020-04-01 op
50 cc9bbf61 2020-04-01 op enum distance
51 cc9bbf61 2020-04-01 op distance_to(struct object *obj)
52 cc9bbf61 2020-04-01 op {
53 cc9bbf61 2020-04-01 op return
54 cc9bbf61 2020-04-01 op !valid_obj(obj) ? dist_unknown_obj :
55 cc9bbf61 2020-04-01 op obj == player ? dist_player :
56 cc9bbf61 2020-04-01 op obj == player->location ? dist_location :
57 cc9bbf61 2020-04-01 op obj->location == player ? dist_held :
58 cc9bbf61 2020-04-01 op obj->location == player->location ? dist_here :
59 cc9bbf61 2020-04-01 op get_passage_to(obj) != NULL ? dist_overthere :
60 cc9bbf61 2020-04-01 op !valid_obj(obj->location) ? dist_not_here :
61 cc9bbf61 2020-04-01 op obj->location->location == player ? dist_held_contained :
62 cc9bbf61 2020-04-01 op obj->location->location == player->location ? dist_here_contained :
63 cc9bbf61 2020-04-01 op dist_not_here;
64 cc9bbf61 2020-04-01 op }
65 cc9bbf61 2020-04-01 op
66 cc9bbf61 2020-04-01 op void
67 cc9bbf61 2020-04-01 op move_player(struct object *passage)
68 cc9bbf61 2020-04-01 op {
69 cc9bbf61 2020-04-01 op printf("%s\n", passage->text_go);
70 cc9bbf61 2020-04-01 op if (passage->destination != NULL) {
71 cc9bbf61 2020-04-01 op player->location = passage->destination;
72 cc9bbf61 2020-04-01 op printf("\n");
73 cc9bbf61 2020-04-01 op exec_look_around();
74 cc9bbf61 2020-04-01 op }
75 cc9bbf61 2020-04-01 op }
76 cc9bbf61 2020-04-01 op
77 cc9bbf61 2020-04-01 op int
78 cc9bbf61 2020-04-01 op weight_of_contents(struct object *container)
79 cc9bbf61 2020-04-01 op {
80 cc9bbf61 2020-04-01 op int sum = 0;
81 cc9bbf61 2020-04-01 op struct object *obj;
82 cc9bbf61 2020-04-01 op
83 cc9bbf61 2020-04-01 op foreach_obj (obj) {
84 cc9bbf61 2020-04-01 op if (obj->location == container)
85 cc9bbf61 2020-04-01 op sum += obj->weight;
86 cc9bbf61 2020-04-01 op }
87 cc9bbf61 2020-04-01 op return sum;
88 cc9bbf61 2020-04-01 op }
89 cc9bbf61 2020-04-01 op
90 cc9bbf61 2020-04-01 op int
91 cc9bbf61 2020-04-01 op object_within_reach(const char *verb, struct param *par)
92 cc9bbf61 2020-04-01 op {
93 cc9bbf61 2020-04-01 op int ok = 0;
94 cc9bbf61 2020-04-01 op
95 cc9bbf61 2020-04-01 op enum distance dist = par->distance;
96 cc9bbf61 2020-04-01 op
97 cc9bbf61 2020-04-01 op if (dist > dist_not_here)
98 cc9bbf61 2020-04-01 op printf("I don't understand what you want to %s.\n", verb);
99 cc9bbf61 2020-04-01 op else if (dist == dist_not_here)
100 cc9bbf61 2020-04-01 op printf("You don't see any %s here.\n", par->tag);
101 cc9bbf61 2020-04-01 op else if (dist >= dist_here_contained)
102 cc9bbf61 2020-04-01 op printf("That is out of reach.\n");
103 cc9bbf61 2020-04-01 op else if (par->count > 1)
104 cc9bbf61 2020-04-01 op printf("Multiple choices to %s; be more specific.\n", verb);
105 cc9bbf61 2020-04-01 op else
106 cc9bbf61 2020-04-01 op ok = 1;
107 cc9bbf61 2020-04-01 op
108 cc9bbf61 2020-04-01 op return ok;
109 cc9bbf61 2020-04-01 op }