commit f87b7718b8506a257c3518319e89ebd06367ee5c
parent 4141930b82a49864b402eb19371b206eb77f0236
Author: William Casarin <jb55@jb55.com>
Date: Fri, 3 Jul 2020 09:59:56 -0700
object state
Diffstat:
4 files changed, 41 insertions(+), 20 deletions(-)
diff --git a/describe.c b/describe.c
@@ -94,10 +94,14 @@ static int push_adjectives(struct describe *desc)
continue;
if (adjs > 0) {
- if (adjs == adj_count-1)
- push_word(desc->strs, "and");
- else if (adjs != adj_count-1)
- push_str(desc->strs, ",");
+ if (adjs == adj_count-1) {
+ ok = push_word(desc->strs, "and");
+ if (!ok) return 0;
+ }
+ else if (adjs != adj_count-1) {
+ ok = push_str(desc->strs, ",");
+ if (!ok) return 0;
+ }
}
@@ -191,7 +195,7 @@ static int describe_room(struct describe *desc)
int ok;
/* TODO: temp buffers for determining a(n) things */
- ok = push_str(desc->strs, "a(n)");
+ ok = push_str(desc->strs, "There is a(n)");
if (!ok) return 0;
ok = push_adjectives(desc);
@@ -239,8 +243,18 @@ static int describe_amount(struct describe *desc, int nobjs)
return 1;
}
-static int describe_object_name(struct cursor *strs, struct cell *cell)
+static int describe_object_name(struct cursor *strs, struct cursor *attrs, struct cell *cell)
{
+ int ok;
+ const char *name;
+ int name_len;
+
+ cell_name(attrs, cell, &name, &name_len);
+ if (name_len > 0) {
+ ok = push_sized_word(strs, name, name_len);
+ if (!ok) return 0;
+ }
+
return push_word(strs, cell->type == C_OBJECT
? object_type_str(cell->obj_type)
: cell_type_str(cell->type));
@@ -253,18 +267,6 @@ static int describe_group(struct describe *desc)
nobjs = desc->cell->n_children;
- ok = push_word(desc->strs, "There");
- if (!ok) return 0;
-
- if (nobjs == 1) {
- ok = push_word(desc->strs, "is");
- if (!ok) return 0;
- }
- else {
- ok = push_word(desc->strs, "are");
- if (!ok) return 0;
- }
-
ok = describe_amount(desc, nobjs);
ok = push_word(desc->strs, "object");
@@ -299,7 +301,7 @@ static int describe_group(struct describe *desc)
}
- ok = describe_object_name(desc->strs, cell);
+ ok = describe_object_name(desc->strs, desc->parsed->attributes, cell);
if (!ok) return 0;
}
@@ -351,11 +353,17 @@ int describe_cells(struct cell *cell, struct parser *parsed, struct cursor *strs
ok = describe_cell(cell, parsed, strs);
if (!ok) return 0;
- push_str(strs, ".\n");
+ ok = push_str(strs, ".\n");
+ if (!ok) return 0;
if (cell->n_children == 0)
return 1;
+ if (cell->type == C_ROOM || cell->type == C_SPACE) {
+ ok = push_word(strs, "It contains");
+ if (!ok) return 0;
+ }
+
/* TODO: for each cell ? for now we just care about the group */
cell = get_cell(parsed->cells, cell->children[0]);
assert(cell);
diff --git a/parse.c b/parse.c
@@ -52,6 +52,7 @@ static const char *attr_type_str(enum attribute_type type)
case A_SHAPE: return "shape";
case A_TYPE: return "type";
case A_WIDTH: return "width";
+ case A_STATE: return "state";
}
return "unknown";
@@ -941,6 +942,9 @@ static int parse_attribute(struct token_cursor *tokens, struct attribute *attr)
ok = parse_str_attr(&temp, attr, "location", A_LOCATION, T_SYMBOL);
if (ok) goto close;
+ ok = parse_str_attr(&temp, attr, "state", A_STATE, T_SYMBOL);
+ if (ok) goto close;
+
ok = parse_size(&temp, attr);
if (ok) goto close;
diff --git a/parse.h b/parse.h
@@ -46,6 +46,13 @@ enum attribute_type {
A_HEIGHT,
A_LOCATION,
A_SHAPE,
+ A_STATE,
+};
+
+enum cell_state {
+ STATE_ON,
+ STATE_OFF,
+ STATE_SLEEPING,
};
enum shape {
diff --git a/satoshis-citadel.space b/satoshis-citadel.space
@@ -17,4 +17,6 @@
(chair (id welcome-desk-chair)
(name "fancy"))
(light (location ceiling)
+ (name "ceiling")
+ (state off)
(shape circle))))