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 8852ffaf 2020-04-03 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 8852ffaf 2020-04-03 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 8852ffaf 2020-04-03 op foreach_obj (obj) {
42 7f40f3f5 2020-04-03 op if (obj->location == player->location
43 7f40f3f5 2020-04-03 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 7f40f3f5 2020-04-03 op return !valid_obj(obj) ? dist_unknown_obj
54 7f40f3f5 2020-04-03 op : obj == player
55 7f40f3f5 2020-04-03 op ? dist_player
56 7f40f3f5 2020-04-03 op : obj == player->location ? dist_location
57 7f40f3f5 2020-04-03 op : obj->location == player
58 7f40f3f5 2020-04-03 op ? dist_held
59 7f40f3f5 2020-04-03 op : obj->location == player->location
60 7f40f3f5 2020-04-03 op ? dist_here
61 7f40f3f5 2020-04-03 op : get_passage_to(obj) != NULL
62 7f40f3f5 2020-04-03 op ? dist_overthere
63 7f40f3f5 2020-04-03 op : !valid_obj(
64 7f40f3f5 2020-04-03 op obj->location)
65 7f40f3f5 2020-04-03 op ? dist_not_here
66 7f40f3f5 2020-04-03 op : obj->location->location
67 7f40f3f5 2020-04-03 op == player
68 7f40f3f5 2020-04-03 op ? dist_held_contained
69 7f40f3f5 2020-04-03 op : obj->location->location
70 7f40f3f5 2020-04-03 op == player->location
71 7f40f3f5 2020-04-03 op ? dist_here_contained
72 7f40f3f5 2020-04-03 op : dist_not_here;
73 cc9bbf61 2020-04-01 op }
74 cc9bbf61 2020-04-01 op
75 cc9bbf61 2020-04-01 op void
76 cc9bbf61 2020-04-01 op move_player(struct object *passage)
77 cc9bbf61 2020-04-01 op {
78 cc9bbf61 2020-04-01 op printf("%s\n", passage->text_go);
79 cc9bbf61 2020-04-01 op if (passage->destination != NULL) {
80 cc9bbf61 2020-04-01 op player->location = passage->destination;
81 cc9bbf61 2020-04-01 op printf("\n");
82 cc9bbf61 2020-04-01 op exec_look_around();
83 cc9bbf61 2020-04-01 op }
84 cc9bbf61 2020-04-01 op }
85 cc9bbf61 2020-04-01 op
86 cc9bbf61 2020-04-01 op int
87 cc9bbf61 2020-04-01 op weight_of_contents(struct object *container)
88 cc9bbf61 2020-04-01 op {
89 cc9bbf61 2020-04-01 op int sum = 0;
90 cc9bbf61 2020-04-01 op struct object *obj;
91 cc9bbf61 2020-04-01 op
92 8852ffaf 2020-04-03 op foreach_obj (obj) {
93 cc9bbf61 2020-04-01 op if (obj->location == container)
94 cc9bbf61 2020-04-01 op sum += obj->weight;
95 cc9bbf61 2020-04-01 op }
96 cc9bbf61 2020-04-01 op return sum;
97 cc9bbf61 2020-04-01 op }
98 cc9bbf61 2020-04-01 op
99 cc9bbf61 2020-04-01 op int
100 cc9bbf61 2020-04-01 op object_within_reach(const char *verb, struct param *par)
101 cc9bbf61 2020-04-01 op {
102 cc9bbf61 2020-04-01 op int ok = 0;
103 cc9bbf61 2020-04-01 op
104 cc9bbf61 2020-04-01 op enum distance dist = par->distance;
105 cc9bbf61 2020-04-01 op
106 cc9bbf61 2020-04-01 op if (dist > dist_not_here)
107 cc9bbf61 2020-04-01 op printf("I don't understand what you want to %s.\n", verb);
108 cc9bbf61 2020-04-01 op else if (dist == dist_not_here)
109 cc9bbf61 2020-04-01 op printf("You don't see any %s here.\n", par->tag);
110 cc9bbf61 2020-04-01 op else if (dist >= dist_here_contained)
111 cc9bbf61 2020-04-01 op printf("That is out of reach.\n");
112 cc9bbf61 2020-04-01 op else if (par->count > 1)
113 cc9bbf61 2020-04-01 op printf("Multiple choices to %s; be more specific.\n", verb);
114 cc9bbf61 2020-04-01 op else
115 cc9bbf61 2020-04-01 op ok = 1;
116 cc9bbf61 2020-04-01 op
117 cc9bbf61 2020-04-01 op return ok;
118 cc9bbf61 2020-04-01 op }