thrive/effect.c
2025-01-30 18:03:08 -05:00

139 lines
3.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "game.h"
#include "flag.h"
#include "effect.h"
#include "room_in.h"
void cause_effect(Game *g, Effect *e) {
if (e == NULL) return;
switch (e->type) {
case EFFECT_NOOP:
break;
case EFFECT_GOTO:
change_current_room(g, find_room(g->rooms, e->argument));
break;
case EFFECT_INCREMENT:
find_flag(g->flags, e->argument)->value++;
break;
case EFFECT_DECREMENT:
find_flag(g->flags, e->argument)->value--;
break;
case EFFECT_ENABLE:
find_flag(g->flags, e->argument)->value = 1;
break;
case EFFECT_DISABLE:
find_flag(g->flags, e->argument)->value = 0;
break;
case EFFECT_QUIT_GAME:
g->should_close = true;
break;
case EFFECT_LOOK_ROOM:
push_line_to_log(g->input->log, find_room_in(g)->description);
log_items_in_room(g, g->current_room);
break;
case EFFECT_TAKE_ITEM:
take_item(g, e->argument);
break;
case EFFECT_DROP_ITEM:
drop_item(g, e->argument);
break;
case EFFECT_DESTROY_ITEM:
destroy_item(g, e->argument);
break;
case EFFECT_CHECK_INVENTORY:
check_inventory(g);
break;
}
}
Effect *create_effect(Game *g, const char *string) {
Effect *e = malloc(sizeof(Effect));
char *buffer = malloc(strlen(string) + 1);
strcpy(buffer, string);
char *strtok_guy;
char *token = strtok_r(buffer, "(", &strtok_guy);
if (token == NULL) {
e->type = EFFECT_NOOP;
} else {
if (strcmp(token, "GOTO") == 0) {
e->type = EFFECT_GOTO;
} else if (strcmp(token, "INCREMENT") == 0) {
e->type = EFFECT_INCREMENT;
} else if (strcmp(token, "DECREMENT") == 0) {
e->type = EFFECT_DECREMENT;
} else if (strcmp(token, "ENABLE") == 0) {
e->type = EFFECT_ENABLE;
} else if (strcmp(token, "DISABLE") == 0) {
e->type = EFFECT_DISABLE;
} else if (strcmp(token, "QUIT_GAME") == 0) {
e->type = EFFECT_QUIT_GAME;
} else if (strcmp(token, "LOOK_ROOM") == 0) {
e->type = EFFECT_LOOK_ROOM;
} else if (strcmp(token, "TAKE") == 0) {
e->type = EFFECT_TAKE_ITEM;
} else if (strcmp(token, "DROP") == 0) {
e->type = EFFECT_DROP_ITEM;
} else if (strcmp(token, "DESTROY") == 0) {
e->type = EFFECT_DESTROY_ITEM;
} else if (strcmp(token, "CHECK_INVENTORY") == 0) {
e->type = EFFECT_CHECK_INVENTORY;
} else {
printf("Unknown effect %s\n", token);
}
token = strtok_r(NULL, ")", &strtok_guy);
if (token) {
e->argument = malloc(strlen(token) + 1);
strcpy(e->argument, token);
}
}
free(buffer);
return e;
}
void print_effect(Effect *e) {
switch (e->type) {
case EFFECT_NOOP:
printf("*");
break;
case EFFECT_GOTO:
printf("GOTO(%s)", e->argument);
break;
case EFFECT_INCREMENT:
printf("INCREMENT(%s)", e->argument);
break;
case EFFECT_DECREMENT:
printf("DECRMENT(%s)", e->argument);
break;
case EFFECT_ENABLE:
printf("ENABLE(%s)", e->argument);
break;
case EFFECT_DISABLE:
printf("DISABLE(%s)", e->argument);
break;
case EFFECT_QUIT_GAME:
printf("QUIT_GAME()");
break;
case EFFECT_LOOK_ROOM:
printf("LOOK_ROOM()");
break;
case EFFECT_TAKE_ITEM:
printf("TAKE(%s)", e->argument);
break;
case EFFECT_DROP_ITEM:
printf("DROP(%s)", e->argument);
break;
case EFFECT_DESTROY_ITEM:
printf("DESTROY(%s)", e->argument);
break;
case EFFECT_CHECK_INVENTORY:
printf("CHECK_INVENTORY()");
break;
}
}