195 lines
5.8 KiB
C
195 lines
5.8 KiB
C
/****
|
|
|
|
***/
|
|
#include <stdlib.h>
|
|
#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"
|
|
#include "inventory.h"
|
|
|
|
int gameInit() {
|
|
null_tile.tid = 0;
|
|
player = newTile(PLAYER, 0, 2, 2);
|
|
player->tid = 1;
|
|
player->id = 12;
|
|
|
|
((struct PlayerTile*)player->data)->inventory.max_slots = 8;
|
|
((struct PlayerTile*)player->data)->inventory.slots_per_row = 4;
|
|
((struct PlayerTile*)player->data)->inventory.owner = player;
|
|
|
|
((struct PlayerTile*)player->data)->equipment.max_slots = 99;
|
|
((struct PlayerTile*)player->data)->equipment.slots_per_row = 4;
|
|
((struct PlayerTile*)player->data)->equipment.owner = player;
|
|
|
|
addToInventory( &((struct PlayerTile*)player->data)->inventory, newTile(EQUIP, 1, 0, 0));
|
|
addToInventory( &((struct PlayerTile*)player->data)->inventory, newTile(EQUIP, 0, 0, 0));
|
|
|
|
//gameMoveTile(newTile(ITEM, 0, 4, 4), 4, 4);
|
|
|
|
current_context = &walkContext;
|
|
allocateMap(¤t_map, 64, 64);
|
|
floodMap(¤t_map, TILE_REPLACE, FLOOR, STONE);
|
|
gameMoveTile(player, 2, 2);
|
|
appendTile(&(current_map->matrix[4][4]), EQUIP, 0);
|
|
appendTile(&(current_map->matrix[3][4]), EQUIP, 1);
|
|
appendTile(&(current_map->matrix[2][4]), EQUIP, 0);
|
|
appendTile(&(current_map->matrix[6][4]), EQUIP, 1);
|
|
|
|
appendTile(&(current_map->matrix[5][11]), ITEM, 0);
|
|
|
|
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, WOOD, 18, 0, 18, 15);
|
|
replaceTile((current_map->matrix[18][10]).next, DOOR, 0);
|
|
drawLine(¤t_map, TILE_APPEND, WALL, WOOD, 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);
|
|
}
|