timesynk/old/context.c

256 lines
6.4 KiB
C

/****** context.c
All contexts are defined here. Contexts can be considered similar to a State in a state system, but differ in that they only handle key press input, and not drawing or otherwise.
******/
#include "context.h"
#include "player.h"
#include "game.h"
#include "stubs.h" // for interface calls
#include "main.h" // for is_running
#include "console.h" // for console stuff
#include "message.h" // for MESSAGE*
void globalContext(int key_press) {
switch(key_press) {
case '`':
if (current_context != &consoleContext) {
current_context = &consoleContext;
} else {
current_context = &walkContext;
}
break;
default:
current_context(key_press);
break;
}
}
void consoleContext(int key_press) {
switch(key_press) {
case KEY_ESC:
current_context = &walkContext;
break;
case 13: // enter
// TODO: run command via string here
consoleProcessCommand(console_cmd);
console_cmd_offset = 0;
console_cmd_size = 0;
console_cmd[console_cmd_offset] = '\0';
break;
case 8:
case 127: // delete
console_cmd[console_cmd_offset-1] = '\0';
if (console_cmd_offset > 0)
console_cmd_offset--;
console_cmd_size--;
break;
default:
if (console_cmd_offset < 31) {
console_cmd[console_cmd_offset] = key_press;
console_cmd[console_cmd_offset+1] = '\0';
console_cmd_offset++;
console_cmd_size++;
}
break;
}
}
void walkContext(int key_press) {
switch(key_press) {
case 'y':
(*player_commands[PLAYER_MOVE])(NORTHWEST, 1);
break;
case 'u':
(*player_commands[PLAYER_MOVE])(NORTHEAST, 1);
break;
case KEY_UP:
case 'k':
(*player_commands[PLAYER_MOVE])(NORTH, 1);
break;
case KEY_DOWN:
case 'j':
(*player_commands[PLAYER_MOVE])(SOUTH, 1);
break;
case 'b':
(*player_commands[PLAYER_MOVE])(SOUTHWEST, 1);
break;
case 'n':
(*player_commands[PLAYER_MOVE])(SOUTHEAST, 1);
break;
case KEY_RIGHT:
case 'l':
(*player_commands[PLAYER_MOVE])(EAST, 1);
break;
case KEY_LEFT:
case 'h':
(*player_commands[PLAYER_MOVE])(WEST, 1);
break;
case 'a':
current_context = &activateContext;
interfacePrint(MESSAGE_ACTIVATE_QUERY);
break;
case 'L':
current_context = &lookContext;
interfacePrint(MESSAGE_LOOK_QUERY);
break;
case 'i':
current_context = &inventoryContext;
interfacePrint("You check out your sack.");
break;
case 'e':
current_context = &equipmentContext;
interfacePrint("You gaze upon thine visage.");
break;
case ',':
playerPickup();
break;
}
}
void lookContext(int key_press) {
switch(key_press) {
case KEY_ESC:
interfacePrint("back in action, bb!");
break;
case KEY_UP:
case 'k':
(*player_commands[PLAYER_LOOK])(player->x, player->y-1);
break;
case KEY_DOWN:
case 'j':
(*player_commands[PLAYER_LOOK])(player->x, player->y+1);
break;
case KEY_RIGHT:
case 'l':
(*player_commands[PLAYER_LOOK])(player->x+1, player->y);
break;
case KEY_LEFT:
case 'h':
(*player_commands[PLAYER_LOOK])(player->x-1, player->y);
break;
case '.':
(*player_commands[PLAYER_LOOK])(player->x, player->y);
break;
default:
interfacePrint("invalid direction");
break;
}
current_context = &walkContext;
}
void activateContext(int key_press) {
switch(key_press) {
case KEY_ESC:
interfacePrint("back in action, bb!");
break;
case KEY_UP:
case 'k':
(*player_commands[PLAYER_ACTIVATE])(player->x, player->y-1);
break;
case KEY_DOWN:
case 'j':
(*player_commands[PLAYER_ACTIVATE])(player->x, player->y+1);
break;
case KEY_RIGHT:
case 'l':
(*player_commands[PLAYER_ACTIVATE])(player->x+1, player->y);
break;
case KEY_LEFT:
case 'h':
(*player_commands[PLAYER_ACTIVATE])(player->x-1, player->y);
break;
default:
interfacePrint("invalid direction");
break;
}
current_context = &walkContext;
}
void inventoryContext(int key_press) {
struct Inventory *inventory = &((struct PlayerTile*)player->data)->inventory;
switch (key_press) {
case KEY_ESC:
case 'q':
case 'i':
interfacePrint("That's enough of that...");
current_context = &walkContext;
break;
case 'e':
current_context = &equipmentContext;
break;
case KEY_LEFT:
case 'h':
inventoryMove(inventory, -1, 0);
break;
case KEY_RIGHT:
case 'l':
inventoryMove(inventory, 1, 0);
break;
case KEY_UP:
case 'k':
inventoryMove(inventory, 0, -1);
break;
case KEY_DOWN:
case 'j':
inventoryMove(inventory, 0, 1);
break;
case 'd':
case ',':
inventoryDrop(inventory, inventory->selected);
break;
case 'a':
// Hi, ugly code.
// TODO: make equipment just an Inventory.
switch (inventoryGetSelected(inventory)->tid) {
case EQUIP:
inventoryEquip(inventory, inventory->selected);
break;
case ITEM:
// todo: applying item to another item or something?
break;
}
//inventoryEquip(inventory, inventory->selected);
//checkSlots( &(((struct PlayerTile*)player->data)->slots), &(((struct PlayerTile*)player->data)->used_slots),
// &(((struct ItemTile*)(inventoryGetSelected(inventory)->data))->slots) );
break;
}
}
void equipmentContext(int key_press) {
struct Inventory *equipment = &((struct PlayerTile*)player->data)->equipment;
switch (key_press) {
case KEY_ESC:
case 'q':
case 'e':
interfacePrint("That's enough of that...");
current_context = &walkContext;
break;
case 'i':
current_context = &inventoryContext;
break;
case KEY_LEFT:
case 'h':
inventoryMove(equipment, -1, 0);
break;
case KEY_RIGHT:
case 'l':
inventoryMove(equipment, 1, 0);
break;
case KEY_UP:
case 'k':
inventoryMove(equipment, 0, -1);
break;
case KEY_DOWN:
case 'j':
inventoryMove(equipment, 0, 1);
break;
case 'd':
case ',':
inventoryUnequip(equipment, equipment->selected);
//inventoryDrop(equipment, equipment->selected);
break;
case 'a':
inventoryUnequip(equipment, equipment->selected);
break;
}
}