Different descriptions for the same room
This commit is contained in:
		
							parent
							
								
									465ac02048
								
							
						
					
					
						commit
						42e90b8531
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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.    |
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								01_text_adventure/data/room_ins.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								01_text_adventure/data/room_ins.txt
									
									
									
									
									
										Normal 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.
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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) {
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,6 @@ typedef struct Rooms Rooms;
 | 
			
		||||
 | 
			
		||||
struct Room {
 | 
			
		||||
  char *name;
 | 
			
		||||
  char *description;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct Rooms {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										71
									
								
								01_text_adventure/room_in.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								01_text_adventure/room_in.c
									
									
									
									
									
										Normal 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];
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								01_text_adventure/room_in.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								01_text_adventure/room_in.h
									
									
									
									
									
										Normal 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
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user