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