コード例 #1
0
ファイル: salamanderl.c プロジェクト: notbatman/salamanderl
void drawtiles(Map m, unsigned char *buf, Sensor s, mapVec pos, mapVec size) {
  int index=0;
  unsigned char tileIndex;
  unsigned char flags;
  int drawX, drawY;
  Volume vol = sensor_volume(s);
  mapVec borig, bsz;
  volume_swept_bounds(vol, &borig, &bsz);
  mapVec msz = map_size(m);
  float ystart = CLIP(pos.y, 0, msz.y);
  float xstart = CLIP(pos.x, 0, msz.x);
  float yend = CLIP(pos.y+size.y, 0, msz.y);
  float xend = CLIP(pos.x+size.x, 0, msz.x);
  int z = CLIP(pos.z, 0, msz.z); //note: different from test.c version
  for(int y = ystart; y < yend; y++) {
    for(int x = xstart; x < xend; x++) {
      index = tile_index(x, y, z, msz, borig, bsz);
      flags = buf[index];
      TCOD_console_print_left(NULL, 0, 18, TCOD_BKGND_NONE, "%i, %i, %i", map_item_lit(flags), map_item_in_volume(flags), map_item_los(flags));
      tileIndex = map_tile_at(m, x, y, z);
      drawX = x*2+z*((msz.x*2)+1);
      drawY = y;
      //TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "%i", index);
      if(map_item_visible(flags)) {
         //visible and lit and in volume
         TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "%i", tileIndex);
      }
      // else if(!map_item_lit(flags) && map_item_in_volume(flags) && map_item_los(flags)) {
      //   //not lit and viewable
      //   TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "_");
      // }
      // else if(!map_item_lit(flags) && map_item_in_volume(flags) && !map_item_los(flags)) {
      //   //not lit and not los
      //   TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, ",");
      // }
      // else if(!map_item_lit(flags) && !map_item_in_volume(flags) && map_item_los(flags)) {
      //   //not lit and not in vol
      //   TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "d");
      // }
      // else if(map_item_lit(flags) && !map_item_in_volume(flags) && map_item_los(flags)) {
      //   //lit and in los, but not in vol
      //   TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "a");
      // }
      // else if(map_item_lit(flags) && map_item_in_volume(flags) && !map_item_los(flags)) {
      //   //lit and in vol, but not in los
      //   TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "b");
      // }
      // else if(map_item_lit(flags) && !map_item_in_volume(flags) && !map_item_los(flags)) {
      //   //lit and not in vol or los (or los wasn't checked)
      //   TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, ".");
      // }
      // else if(!map_item_lit(flags) && !map_item_in_volume(flags) && !map_item_los(flags)) { 
      //   //not lit, in vol, or in los
      //   TCOD_console_print_left(NULL, drawX, drawY, TCOD_BKGND_NONE, "x");
      // }
    }
  }
}
コード例 #2
0
ファイル: salamanderl.c プロジェクト: notbatman/salamanderl
void draw_object(Stimulus st) {
  unsigned char visflags = stimulus_obj_sight_change_get_new_flags(st);
  mapVec pos = stimulus_obj_sight_change_get_position(st);
  char *id = stimulus_obj_sight_change_get_id(st);
  if(!map_item_visible(visflags)) {
    TCOD_console_print_left(NULL, pos.x*2, pos.y, TCOD_BKGND_NONE, "X");
  } else {
    TCOD_console_print_left(NULL, pos.x*2, pos.y, TCOD_BKGND_NONE, id);
  }
}
コード例 #3
0
ファイル: salamanderl.c プロジェクト: notbatman/salamanderl
void drawmap(Map m, Object o) {
  Sensor s;
  for(int i = 0; i < object_sensor_count(o); i++) {
    s = object_get_sensor(o, i);
    drawstimuli(m, s);
    TCOD_console_print_left(NULL, 0, 13+i, TCOD_BKGND_NONE, "<%f %f %f>", sensor_facing(s).x, sensor_facing(s).y, sensor_facing(s).z);
  }
}
コード例 #4
0
ファイル: salamanderl.c プロジェクト: notbatman/salamanderl
void drawstimuli(Map m, Sensor s) {
  TCOD_list_t stims = sensor_consume_stimuli(s);
  unsigned char *tiles;
  mapVec pos, size, oldPt, delta;
  unsigned char visflags;
  if(TCOD_list_size(stims) > 0) {
    TCOD_console_print_left(NULL, 0, 10, TCOD_BKGND_NONE, "                            ");
  }
  for(int i = 0; i < TCOD_list_size(stims); i++) {
    //this is a very naive approach that completely ignores the possibility of overdraw and 'forgets' object positions
    Stimulus st = TCOD_list_get(stims, i);
    stimtype type = stimulus_type(st);
    TCOD_console_print_left(NULL, i*2, 10, TCOD_BKGND_NONE, "s%i", type);
    switch(type) {
      case StimTileLitChange:
      case StimTileVisChange:
        //redraw all tiles
        tiles = stimulus_tile_sight_change_get_new_tiles(st);
        pos = stimulus_tile_sight_change_get_position(st);
        size = stimulus_tile_sight_change_get_size(st);
        drawtiles(m, tiles, s, pos, size);
        break;
      case StimObjLitChange:
      case StimObjVisChange:
        //redraw object
        draw_object(st);
        break;
      case StimObjMoved:
        visflags = stimulus_obj_sight_change_get_new_flags(st);
        pos = stimulus_obj_sight_change_get_position(st);
        delta = stimulus_obj_moved_get_dir(st);
        oldPt = mapvec_subtract(pos, delta);
        TCOD_console_print_left(NULL, oldPt.x*2, oldPt.y, TCOD_BKGND_NONE, "x");
        draw_object(st);
        TCOD_console_print_left(NULL, 0, 15, TCOD_BKGND_NONE, "got move");
        break;
      case StimGeneric:
      default:
        TCOD_console_print_left(NULL, i*9, 16, TCOD_BKGND_NONE, "generic %d", i);
        break;
    }
    stimulus_free(st);
  }
  TCOD_list_delete(stims);
}
コード例 #5
0
ファイル: console.cpp プロジェクト: LordKaT/LKRogueCraftRepo
void consoleDraw() {
	TCOD_console_put_char(NULL, 75, 44, 204, TCOD_BKGND_NONE);
	for (int x = 76; x < 99; x++)
		TCOD_console_put_char(NULL, x, 44, 205, TCOD_BKGND_NONE);
	TCOD_console_put_char(NULL, 99, 44, 185, TCOD_BKGND_NONE);
	TCOD_console_print_left(NULL, 78, 44, TCOD_BKGND_NONE, "Console");

	for (int x = 76; x < 99; x++)
		for (int y = 45; y < 73; y++)
			TCOD_console_put_char(NULL, x, y, ' ', TCOD_BKGND_NONE);

	int iCount = 0;
	int iHeight = 0;

	for (int i = 0; i < 32; i++) {
		if (g_cConsole[i] != NULL) {
			iCount += iHeight = TCOD_console_height_left_rect(NULL, 76, 45, 23, 29, g_cConsole[i]);
			if (iCount < 29)
				TCOD_console_print_left_rect(NULL, 76, 73-iCount, 23, iHeight, TCOD_BKGND_NONE, g_cConsole[i]);
		}
	}
	return;
}
コード例 #6
0
int main(int argc, char **argv) {
	int iItemToPlace = ITEM_ORE_STONE;
	int iInventoryOffset = 0;
	int iInventoryPointer = 0;
	int iInventorySelection = -1;
	int iLookX = 0;
	int iLookY = 0;
	int iNewX = 0;
	int iNewY = 0;
	int iSelect = 0;
	TCOD_key_t tKey;
	char cCharCode;

	bool bTurnOver = false;

	globalsInit();

	TCOD_console_set_custom_font("terminal8x8_gs_ro.png", TCOD_FONT_TYPE_GREYSCALE | TCOD_FONT_LAYOUT_ASCII_INROW, 16, 16);
	TCOD_console_init_root(100, 75, "RogueCraft", false);
	TCOD_console_set_background_color(NULL, TCOD_black);
	TCOD_console_set_foreground_color(NULL, TCOD_light_grey);

	g_tcodMap = TCOD_map_new(DEF_WORLD_X, DEF_WORLD_Y);

	mapClear();
	generateBSPtoMap(true);
	itemPopulate(ITEM_ORE_IRON, 0, 45, 100);
	itemPopulate(ITEM_ORE_COPPER, 0, 35, 100);
	itemPopulate(ITEM_ORE_STONE_WEAK, 0, 25, 100);

	/* Populate a torch ... or three. */
	itemPopulate(25, 1, 35, 100);
	mapRemapLight(25);

	playerInit();

	TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW);
	iNewX = g_ego.m_stats.m_iWorldX;
	iNewY = g_ego.m_stats.m_iWorldY;

	/* Debug code for inventory management */
	inventoryAdd(&g_ego.m_inventory, 30, 1);
	inventoryAdd(&g_ego.m_inventory, 31, 1);

	g_iGameMode = MODE_INTRO;

	npcPopulate(1, 1, 55, 100);

	while (!TCOD_console_is_window_closed()) {
		tKey = TCOD_console_check_for_keypress(TCOD_KEY_PRESSED);
		cCharCode = tolower(tKey.c);

		/* Global inputs */
		switch (tKey.vk) {
			case TCODK_ESCAPE:
				if (g_iGameMode != MODE_GAME && g_iGameMode != MODE_INTRO) {
					if (g_iGameMode == MODE_LOOK) {
						iNewX = g_ego.m_stats.m_iWorldX;
						iNewY = g_ego.m_stats.m_iWorldY;
						TCOD_console_put_char(NULL, iLookX, iLookY, 0, TCOD_BKGND_NONE);
					}
					g_iGameMode = MODE_GAME;
					inventoryClear();
				}
				else {
					TCOD_console_delete(NULL);
					SDL_Quit();
					return 1;
				}
				break;
			case TCODK_PRINTSCREEN:
				TCOD_sys_save_screenshot(NULL);
				break;
			case TCODK_KP1:
				iNewX--;
				iNewY++;
				break;
			case TCODK_KP2:
				iNewY++;
				break;
			case TCODK_KP3:
				iNewX++;
				iNewY++;
				break;
			case TCODK_KP4:
				iNewX--;
				break;
			case TCODK_KP6:
				iNewX++;
				break;
			case TCODK_KP7:
				iNewX--;
				iNewY--;
				break;
			case TCODK_KP8:
				iNewY--;
				break;
			case TCODK_KP9:
				iNewX++;
				iNewY--;
				break;
			default:
				break;
		}

		/* Mode inputs */
		switch (g_iGameMode) {
			case MODE_INTRO:
				TCOD_console_clear(NULL);
				scene_intro();
				scene_intro_input(tKey, cCharCode);
				break;
			case MODE_GAME:
				mapDraw();
				inventoryDrawBorder();
				playerStatsList();
				consoleDraw();
				consoleInputDraw();

				TCOD_console_put_char(NULL, 76, 33 + iInventoryPointer, 16, TCOD_BKGND_NONE);
				TCOD_console_put_char(NULL, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, '@', TCOD_BKGND_NONE);
				iInventorySelection = inventoryList(&g_ego.m_inventory, iInventoryPointer, iInventoryOffset);
				TCOD_console_print_left(NULL, 78, 31, TCOD_BKGND_NONE, "Inventory");

				if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) {
					if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) {
						if (g_npcMap[iNewX][iNewY] == NULL) {
							if (g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable) {
								g_ego.m_stats.m_iWorldX = iNewX;
								g_ego.m_stats.m_iWorldY = iNewY;
								TCOD_console_put_char(NULL, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, ' ', TCOD_BKGND_NONE);
								g_itemData[g_iWorld[iNewX][iNewY]].m_vFunc(ACT_WALK_ONTO, iNewX, iNewY, NULL);
							}
							else {
								g_itemData[g_iWorld[iNewX][iNewY]].m_vFunc(ACT_WALK_INTO, iNewX, iNewY, NULL);
								iNewX = g_ego.m_stats.m_iWorldX;
								iNewY = g_ego.m_stats.m_iWorldY;
								mapMakeFOV();
								inventoryClear();
							}
						}
						else {
							/* We've bumped into an NPC. */
							g_npcMap[iNewX][iNewY]->m_vFunc(ACT_WALK_INTO, iNewX, iNewY, g_npcMap[iNewX][iNewY]);
							iNewX = g_ego.m_stats.m_iWorldX;
							iNewY = g_ego.m_stats.m_iWorldY;
						}
						TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW);
						TCOD_map_set_properties(g_tcodMap, iNewX, iNewY, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bTransparent, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable);
						TCOD_map_copy(g_tcodMap, g_tcodLightmap);
						mapRemapLight(25);
						playerCalcVisibility();
						bTurnOver = true;
					}
				}

				switch (cCharCode) {
					case 'q': /* Place block (why q?) */
						g_iGameMode = MODE_BLOCK;
						consoleAdd("Place where?");
						break;
					case 'o': /* Open something */
						g_iGameMode = MODE_OPEN;
						consoleAdd("Open where?");
						break;
					case 'l': /* Look around */
						g_iGameMode = MODE_LOOK;
						iLookX = g_ego.m_stats.m_iWorldX;
						iLookY = g_ego.m_stats.m_iWorldY;
						iNewX = iLookX;
						iNewY = iLookY;
						playerLook(iLookX, iLookY);
						inventoryClear();
						iInventoryOffset = 0;
						iInventoryPointer = 0;
						consoleAdd("Looking around...");
						break;
					case 'e': /* Equip selected item in inventory */
						g_itemData[iInventorySelection].m_vFunc(ACT_EQUIP, 0, 0,(void *)(iInventorySelection));
						break;
					case 'd': /* Dequip an item */
						g_iGameMode = MODE_DEQUIP;
						consoleAdd("Remove what?");
						break;
					case 14: /* Up arrow (move inventory pointer) */
						if (iInventoryPointer > 0) {
							TCOD_console_put_char(NULL, 76, 33 + iInventoryPointer, 32, TCOD_BKGND_NONE);
							iInventoryPointer--;
						}
						else
							iInventoryOffset--;
						break;
					case 17: /* Down arrow (move inventory pointer) */
						if (iInventoryPointer < 9) {
							TCOD_console_put_char(NULL, 76, 33 + iInventoryPointer, 32, TCOD_BKGND_NONE);
							iInventoryPointer++;
						}
						else
							iInventoryOffset++;
						break;
					case 64: /* Space */
						g_iGameMode = MODE_CONSOLE_INPUT;
						break;
					default:
						break;
				}
				break;
			case MODE_BLOCK:
				if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) {
					if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) {
						g_itemData[iItemToPlace].m_vFunc(ACT_PLACE_ONTO, iNewX, iNewY, (void *)iItemToPlace);
						mapMakeFOV();
						g_iGameMode = MODE_GAME;
						TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW);
						TCOD_map_set_properties(g_tcodMap, iNewX, iNewY, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bTransparent, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable);
						TCOD_map_copy(g_tcodMap, g_tcodLightmap);
						mapRemapLight(25);
						playerCalcVisibility();
						bTurnOver = true;
					}
				}
				else {
					if (cCharCode == '1')
						iItemToPlace = ITEM_ORE_STONE;
					if (cCharCode == '2')
						iItemToPlace = ITEM_ORE_IRON;
					if (cCharCode == '3')
						iItemToPlace = ITEM_ORE_COPPER;
					if (cCharCode == '4')
						iItemToPlace = ITEM_ORE_SILVER;
					if (cCharCode == '5')
						iItemToPlace = ITEM_ORE_GOLD;
				}
				break;
			case MODE_OPEN:
				if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) {
					if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) {
						g_itemData[g_iWorld[iNewX][iNewY]].m_vFunc(ACT_OPEN, iNewX, iNewY, NULL);
						mapMakeFOV();
						g_iGameMode = MODE_GAME;
						TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW);
						TCOD_map_set_properties(g_tcodMap, iNewX, iNewY, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bTransparent, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable);
						TCOD_map_copy(g_tcodMap, g_tcodLightmap);
						mapRemapLight(25);
						playerCalcVisibility();
						bTurnOver = true;
					}
				}
				break;
			case MODE_DEQUIP:
				switch (cCharCode) {
					case '1':
						iSelect = g_ego.m_equipment.m_iHand_L;
						g_ego.m_equipment.m_iHand_L = ITEM_NOTHING;
						break;
					case '2':
						iSelect = g_ego.m_equipment.m_iHand_R;
						g_ego.m_equipment.m_iHand_R = ITEM_NOTHING;
						break;
					case '3':
						iSelect = g_ego.m_equipment.m_iHead;
						g_ego.m_equipment.m_iHead = ITEM_NOTHING;
						break;
					case '4':
						iSelect = g_ego.m_equipment.m_iEar_L;
						g_ego.m_equipment.m_iEar_L = ITEM_NOTHING;
						break;
					case '5':
						iSelect = g_ego.m_equipment.m_iEar_R;
						g_ego.m_equipment.m_iEar_R = ITEM_NOTHING;
						break;
					case '6':
						iSelect = g_ego.m_equipment.m_iFace;
						g_ego.m_equipment.m_iFace = ITEM_NOTHING;
						break;
					case '7':
						iSelect = g_ego.m_equipment.m_iNeck;
						g_ego.m_equipment.m_iNeck = ITEM_NOTHING;
						break;
					case '8':
						iSelect = g_ego.m_equipment.m_iBack;
						g_ego.m_equipment.m_iBack = ITEM_NOTHING;
						break;
					case '9':
						iSelect = g_ego.m_equipment.m_iChest;
						g_ego.m_equipment.m_iChest = ITEM_NOTHING;
						break;
					case '0':
						iSelect = g_ego.m_equipment.m_iHands;
						g_ego.m_equipment.m_iHands = ITEM_NOTHING;
						break;
					case 'a':
						iSelect = g_ego.m_equipment.m_iWaist;
						g_ego.m_equipment.m_iWaist = ITEM_NOTHING;
						break;
					case 'b':
						iSelect = g_ego.m_equipment.m_iLegs;
						g_ego.m_equipment.m_iLegs = ITEM_NOTHING;
						break;
					case 'c':
						iSelect = g_ego.m_equipment.m_iFeet;
						g_ego.m_equipment.m_iFeet = ITEM_NOTHING;
						break;
					default:
						break;
				}
				if (iSelect != 0) {
					g_itemData[iSelect].m_vFunc(ACT_DEQUIP, 0, 0,(void *)(iSelect));
					g_iGameMode = MODE_GAME;
				}
				break;
			case MODE_LOOK:
				if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) {
					if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) {
						TCOD_console_put_char(NULL, iLookX, iLookY, 0, TCOD_BKGND_NONE);
						iLookX = iNewX;
						iLookY = iNewY;
						playerLook(iLookX, iLookY);
						inventoryClear();
						iInventoryOffset = 0;
						iInventoryPointer = 0;
					}
				}
				TCOD_console_put_char(NULL, iLookX, iLookY, 4, TCOD_BKGND_NONE);
				iInventorySelection = inventoryList(&g_itemLook, iInventoryPointer, iInventoryOffset);
				playerLook(iLookX, iLookY);
				break;
			case MODE_CONSOLE_INPUT:
				switch (tKey.vk) {
					case TCODK_ENTER:
						consoleAdd(g_cConsoleInput);
						consoleInputClear();
						g_iGameMode = MODE_GAME;
						break;
					case TCODK_BACKSPACE:
						consoleInputDel();
						break;
					default:
						if (cCharCode >= 32 && cCharCode <= 126)
							consoleInputAdd(cCharCode);
						break;
				}
				break;
			default:
				break;
		}

		if (bTurnOver) {
			npcExecute(&g_npcList);
			bTurnOver = false;
		}

		TCOD_console_flush();
	}
	return 1;
}
コード例 #7
0
ファイル: salamanderl.c プロジェクト: notbatman/salamanderl
int main( int argc, char *argv[] ) {
  char *font="tilesense/libtcod/fonts/courier12x12_aa_tc.png";
  int nb_char_horiz=0,nb_char_vertic=0;
  int font_flags=TCOD_FONT_TYPE_GREYSCALE|TCOD_FONT_LAYOUT_TCOD;
	TCOD_console_set_custom_font(font,font_flags,nb_char_horiz,nb_char_vertic);
	TCOD_console_init_root(80,40,"salamandeRL",false);
	
  Map room = initRoom();
  Object player = initPlayer(room);
  object_sense(player);
  
  TCOD_sys_set_fps(30);

  float elapsed = 0;
  char finished = 0;
	TCOD_key_t key = {TCODK_NONE,0};
	TCOD_console_set_foreground_color(NULL,TCOD_white);
	do {
	  key = TCOD_console_check_for_keypress(TCOD_KEY_PRESSED);
    if(key.vk != TCODK_NONE) {
      TCOD_console_clear(NULL);
    }
		
		TCOD_console_print_right(NULL,79,26,TCOD_BKGND_NONE,"last frame : %3d ms (%3d fps)", (int)(TCOD_sys_get_last_frame_length()*1000), TCOD_sys_get_fps());
		TCOD_console_print_right(NULL,79,27,TCOD_BKGND_NONE,"elapsed : %8dms %4.2fs", TCOD_sys_elapsed_milli(),TCOD_sys_elapsed_seconds());
		TCOD_console_print_left(NULL,0,27,TCOD_BKGND_NONE,"other stat stuff can go here");
		//map
    drawmap(room, player);
    TCOD_console_print_left(NULL, 
      object_position(player).x*2, object_position(player).y, 
      TCOD_BKGND_NONE,"@");
		//divider
		TCOD_console_print_left(NULL,0,28,TCOD_BKGND_NONE,
		  "--------------------------------------------------------------------------------"
		);
	  //text display
    TCOD_console_print_left(NULL,2,29,TCOD_BKGND_NONE,"we'll probably put text down here.");
		
		/* update the game screen */
		TCOD_console_flush();

    if(key.vk == TCODK_RIGHT) {
      map_turn_object(room, "@", 1);
    } else if(key.vk == TCODK_LEFT) {
      map_turn_object(room, "@", -1);
    } else if(key.vk == TCODK_CHAR) {
      switch(key.c) {
        case 'w':
          map_move_object(room, "@", (mapVec){0, -1, 0});
          break;
        case 'a':
          map_move_object(room, "@", (mapVec){-1, 0, 0});
          break;
        case 's':
          map_move_object(room, "@", (mapVec){0, 1, 0});
          break;
        case 'd':
          map_move_object(room, "@", (mapVec){1, 0, 0});
          break;
        case 'q':
          finished = 1;
          break;
        //next, handle chomping
        default:
          break;
  		}
    }

	} while (!finished && !TCOD_console_is_window_closed());
	return 0;
}