/**** ***/ #include #include "main.h" #include "common.h" #include "game.h" #include "map.h" #include "wall.h" #include "display.h" #include "tile.h" #include "context.h" #include "player.h" #include "npc.h" #include "console.h" #include "controller.h" int gameInit() { consoleLog("gameInit()"); null_tile.tid = 0; player = newTile(PLAYER, 0, 2, 2); player->tid = 1; player->id = 12; current_context = &walkContext; allocateMap(¤t_map, 64, 64); floodMap(¤t_map, TILE_REPLACE, FLOOR, STONE); gameMoveTile(player, 2, 2); drawPath(¤t_map, TILE_APPEND, WALL, STONE, 6, 1, 8, 12); drawPath(¤t_map, TILE_APPEND, WALL, STONE, 12, 4, 7, 13); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 18, 0, 18, 15); replaceTile((current_map->matrix[18][10]).next, DOOR, 0); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 8, 11, 17, 11); replaceTile((current_map->matrix[15][11]).next, DOOR, 0); replaceTile((current_map->matrix[13][11]).next, DOOR, 0); replaceTile((current_map->matrix[10][11]).next, DOOR, 0); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 0, 0, 31, 0); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 0, 15, 15, 15); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 17, 15, 31, 15); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 0, 0, 0, 15); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 31, 0, 31, 15); drawLine(¤t_map, TILE_APPEND, WALL, STONE, 16, 23, 16, 62); appendTile(¤t_map->matrix[2][5], NPC, NUPI_SCRAPPER); appendTile(¤t_map->matrix[25][9], NPC, NUPI_SCRAPPER); return SUCCESS; } void gameLoop() { int step_x = player->x - ((struct PlayerTile*)player->data)->vision+8; int step_y = player->y - ((struct PlayerTile*)player->data)->vision+8; int end_x = player->x + ((struct PlayerTile*)player->data)->vision+8; int end_y = player->y + ((struct PlayerTile*)player->data)->vision+8; while (step_x < end_x) { step_y = player->y - ((struct PlayerTile*)player->data)->vision+8; while (step_y < end_y) { //if (visible_matrix[step_x][step_y] & TILE_VISIBLE) { if (step_x >= 0 && step_y >= 0 && step_x < current_map->width && step_y < current_map->height) { struct Tile *current_tile; current_tile = &(current_map)->matrix[step_x][step_y]; while(current_tile) { switch(current_tile->tid) { case NPC: npcThink(current_tile); break; } current_tile = current_tile->next; } } step_y++; } step_x++; } } void gameClose() { consoleLog("gameClose()"); //freeMap(¤t_map); } int gameCollision(target_x, target_y) { if (target_x < 0 || target_y < 0 || target_y > current_map->height-1 || target_x > current_map->width-1) return 1; // don't go off the map, bb struct Tile *debug_tile; debug_tile = &(current_map->matrix[target_x][target_y]); // TODO: call collision functions for each tile type while(debug_tile) { switch(debug_tile->tid) { case WALL: return 1; break; case FLOOR: // return 0; break; case DOOR: switch(((struct DoorTile*)debug_tile->data)->state) { case STATE_CLOSED: return 1; break; } break; case PLAYER: return PLAYER; break; case NPC: return NPC; break; } debug_tile = debug_tile->next; } return 0; } int isCellVisible(int target_x, int target_y) { if (target_x >= 0 && target_y >= 0 && target_x < current_map->width && target_y < current_map->height) { struct Tile *current_tile; current_tile = &(current_map)->matrix[target_x][target_y]; while(current_tile) { switch (current_tile->tid) { case WALL: return 1; break; } current_tile = current_tile->next; } } return 0; } void gameMoveTile(struct Tile *tile, int target_x, int target_y) { // remove tile from chain and connect tile's neighbors to each other if (tile->prev) { if (tile->next) { tile->prev->next = tile->next; } else { tile->prev->next = NULL; } } if (tile->next != NULL) { if(tile->prev) tile->next->prev = tile->prev; } // now add tile to the end of the target chain struct Tile *target_loc; target_loc = &(current_map->matrix[target_x][target_y]); while (target_loc) { if (!target_loc->next) { // last element target_loc->next = tile; tile->prev = target_loc; tile->next = NULL; break; } target_loc = target_loc->next; } // mark the tiles to be visually updated gameUpdateTile(tile->x, tile->y); gameUpdateTile(target_x, target_y); // finally, update tile's x and y props tile->x = target_x; tile->y = target_y; } void gameUpdateTile(int x, int y) { display_map[x][y] = 2; } int roll(int min, int max) { return ((rand() % (max+1-min))+min); } int sign(int number) { return (number < 0 ? -1 : 1); }