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