256 lines
6.4 KiB
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;
|
|
}
|
|
}
|