Different descriptions for the same room

This commit is contained in:
Bill Rossi 2025-01-19 13:56:18 -05:00
parent 465ac02048
commit 42e90b8531
11 changed files with 117 additions and 14 deletions

View File

@ -3,7 +3,7 @@ CFLAGS=-Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11
.PHONY: clean run
game: data/actions.c data/rooms.c data/words.c data/flags.c *.c
game: data/actions.c data/rooms.c data/room_ins.c data/words.c data/flags.c *.c
$(CC) *.c $(CFLAGS) -o game
data/%.c: data/%.txt

View File

@ -6,9 +6,10 @@ EAST | * | 1 | You can't go east from here. |
WEST | * | 1 | You can't go west from here. |
NORTH | IN(FIRST_ROOM) | 10 | You head through the door. | GOTO(SECOND_ROOM)
SOUTH | IN(SECOND_ROOM) | 10 | You head back through the door. | GOTO(FIRST_ROOM)
EAST | IN(FIRST_ROOM) | 10 | You crouch under the beam and enter the room. | GOTO(LAST_ROOM)
WEST | IN(LAST_ROOM) | 10 | You crouch under the beam and return to the room. | GOTO(FIRST_ROOM)
EAST | IN(FIRST_ROOM) & ENABLED(LEVER_PULLED) | 20 | You crouch under the portcullis and enter the room. | GOTO(LAST_ROOM)
EAST | IN(FIRST_ROOM) | 10 | There is a portcullis in the way. |
WEST | IN(LAST_ROOM) | 10 | You crouch under the portcullis and return to the room. | GOTO(FIRST_ROOM)
PULL | * | 1 | You don't see anything to pull |
PULL | IN(FIRST_ROOM) | 10 | What do you want to pull? |
PULL LEVER | IN(FIRST_ROOM) | 100 | You pull the lever. Nice. | ENABLE(LEVER_PULLED)
PULL LEVER | IN(FIRST_ROOM) | 100 | You pull the lever and the portcullis raises up most of the way. | ENABLE(LEVER_PULLED)
PULL LEVER | IN(FIRST_ROOM) & ENABLED(LEVER_PULLED) | 1000 | You already pulled it. |

View File

@ -0,0 +1,4 @@
FIRST_ROOM | * | 1 | This is a plain room. A doorway is on the north wall, and a portcullis obstructing a doorway to the east.
FIRST_ROOM | ENABLED(LEVER_PULLED) | 10 | This is a plain room. A doorway is on the north wall, and the doorway once obstructed by the portcullis is to the east.
SECOND_ROOM | * | 1 | This is a small room. It's painted blue. There's a doorway on the south wall.
LAST_ROOM | * | 1 | This room is in disrepair. A doorway is open to the west.

View File

@ -1,3 +1,3 @@
FIRST_ROOM|This is a plain room. A wooden door is on the north wall, and a beam semi-obstructs an open doorway to the east.
SECOND_ROOM|This is a small room. It's painted blue. There's a door on the south wall.
LAST_ROOM|This room is in disrepair. A beam partially blocks the doorway to the west.
FIRST_ROOM
SECOND_ROOM
LAST_ROOM

View File

@ -4,6 +4,7 @@
#include "game.h"
#include "flag.h"
#include "effect.h"
#include "room_in.h"
void cause_effect(Game *g, Effect *e) {
if (e == NULL) return;
@ -30,7 +31,8 @@ void cause_effect(Game *g, Effect *e) {
g->should_close = true;
break;
case EFFECT_LOOK_ROOM:
push_line_to_log(g->input->log, g->current_room->description);
// TODO
push_line_to_log(g->input->log, find_room_in(g)->description);
break;
}
}

View File

@ -20,6 +20,7 @@ Game *game_create(void) {
game_load_flags(g);
game_load_actions(g);
game_load_rooms(g);
game_load_room_ins(g);
Log *log = create_log();
g->log = log;

View File

@ -17,6 +17,7 @@ typedef enum CommandType {
#include "input.h"
#include "room.h"
#include "room_in.h"
#include "log.h"
#include "word.h"
#include "flag.h"
@ -27,6 +28,7 @@ struct Game {
Input *input;
Log *log;
Rooms *rooms;
RoomIns *room_ins;
Room *current_room;
Words *words;
Flags *flags;

View File

@ -11,10 +11,6 @@ void load_room(Game *g, char *line) {
g->rooms->rooms[g->rooms->count].name = malloc(strlen(token) + 1);
strcpy(g->rooms->rooms[g->rooms->count].name, token);
token = strtok(NULL, "|");
g->rooms->rooms[g->rooms->count].description = malloc(strlen(token) + 1);
strcpy(g->rooms->rooms[g->rooms->count].description, token);
g->rooms->count++;
}
@ -29,7 +25,6 @@ void game_load_rooms(Game *g) {
void free_room(Room r) {
free(r.name);
free(r.description);
}
void free_rooms(Rooms r) {

View File

@ -6,7 +6,6 @@ typedef struct Rooms Rooms;
struct Room {
char *name;
char *description;
};
struct Rooms {

View File

@ -0,0 +1,71 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "game.h"
#include "room_in.h"
#include "util.h"
void load_room_in(Game *g, char *line) {
RoomIn *ri = &g->room_ins->room_ins[g->room_ins->count];
ri->predicates_count = 0;
char *line_token_guy;
char *line_token = strtok_r(line, "|", &line_token_guy);
Room *r = find_room(g->rooms, line_token);
g->room_ins->room_ins[g->room_ins->count].room = r;
line_token = strtok_r(NULL, "|", &line_token_guy);
char *room_in_token_guy;
char room_in_buffer[200];
strcpy(room_in_buffer, line_token);
char *room_in_word = strtok_r(room_in_buffer, " &", &room_in_token_guy);
while (room_in_word != NULL) {
Predicate *p = create_predicate(g, room_in_word);
ri->predicates[ri->predicates_count++] = p;
room_in_word = strtok_r(NULL, " &", &room_in_token_guy);
}
line_token = strtok_r(NULL, "|", &line_token_guy);
ri->priority = atoi(line_token);
line_token = strtok_r(NULL, "|", &line_token_guy);
g->room_ins->room_ins[g->room_ins->count].description = malloc(strlen(line_token) + 1);
strcpy(g->room_ins->room_ins[g->room_ins->count].description, line_token);
g->room_ins->count++;
}
#include "data/room_ins.c"
void game_load_room_ins(Game *g) {
g->room_ins = malloc(sizeof(RoomIns));
g->room_ins->count = 0;
parse_multiline_string(g, data_room_ins_txt, &load_room_in);
printf("loaded room ins\n");
}
RoomIn *find_room_in(Game *g) {
RoomIn *ri;
int priority = -1;
bool failed_predicate;
for (int i = 0; i < g->room_ins->count; i++) {
RoomIn *cri = &g->room_ins->room_ins[i];
if (cri->priority < priority) continue;
if (cri->room != g->current_room) continue;
failed_predicate = false;
for (int j = 0; j < cri->predicates_count; j++) {
if (!predicate_fulfilled(g, cri->predicates[j])) failed_predicate = true;
}
if (failed_predicate) break;
priority = cri->priority;
ri = cri;
}
if (ri) return ri;
printf("Couldn't find a valid room_in\n");
return &g->room_ins->room_ins[0];
}

View File

@ -0,0 +1,28 @@
#ifndef _FD_ROOM_IN_
#define _FD_ROOM_IN_
typedef struct RoomIn RoomIn;
typedef struct RoomIns RoomIns;
#include "game.h"
#include "room.h"
#include "predicate.h"
struct RoomIn {
Room *room;
Predicate *predicates[10];
int predicates_count;
int priority;
char *description;
};
struct RoomIns {
RoomIn room_ins[200];
int count;
};
void game_load_room_ins(Game *g);
RoomIns *find_room_ins(Room *r);
RoomIn *find_room_in(Game *g);
#endif