/****** 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; } }