Files
thepool/source/room.cpp
Raimon Zamora ed27bd2680 - Les vores de baix de les portes son configurables
- En les portes de davant, si el piso està a ras tenen el mateix floor, sinó tenen el primer (per a que contraste)
2023-09-12 19:13:44 +02:00

228 lines
9.6 KiB
C++

#include "room.h"
#include "jdraw.h"
#include "actor.h"
namespace room
{
static vec3_t size = {8,8,8};
static vec3_t tmin = {0,0,0};
static vec3_t tmax = {7,7,7};
static vec3_t min = {0,0,0};
static vec3_t max = {56,56,56};
static uint8_t doors = DOOR_XP /*| DOOR_YP*/ ;
static uint8_t door_height[4];
static uint8_t color = 5;
static uint8_t floor_type = 0;
static uint8_t walls_type = 0;
static uint8_t doors_type = 0;
static uint8_t walldoors_type = 0;
static draw::surface *floor_surf = nullptr;
static draw::surface *walls_surf = nullptr;
static draw::surface *doors_surf = nullptr;
static draw::surface *aux_surf = nullptr;
void init()
{
if (floor_surf) draw::freeSurface(floor_surf);
if (walls_surf) draw::freeSurface(walls_surf);
if (doors_surf) draw::freeSurface(doors_surf);
if (aux_surf) draw::freeSurface(aux_surf);
floor_surf = draw::loadSurface("floor.gif");
walls_surf = draw::loadSurface("walls.gif");
doors_surf = draw::loadSurface("doors.gif");
aux_surf = draw::loadSurface("roomaux.gif");
}
void load(int x, int y, int8_t xp, int8_t xn, int8_t yp, int8_t yn, uint8_t col, uint8_t floor, uint8_t walls, uint8_t door, uint8_t walldoor)
{
init();
color = col;
floor_type = floor;
walls_type = walls;
doors_type = door;
walldoors_type = walldoor;
size = {(x+1)*2,(y+1)*2,3};
tmin = {3-x,3-y,0};
tmax = {4+x,4+y,3};
min = {tmin.x*8,tmin.y*8,0};
max = {tmax.x*8,tmax.y*8,24};
doors = (xp>=0?DOOR_XP:0) | (xn>=0?DOOR_XN:0) | (yp>=0?DOOR_YP:0) | (yn>=0?DOOR_YN:0);
door_height[0] = xp; //XP
door_height[1] = xn; //XN
door_height[2] = yp; //YP
door_height[3] = yn; //YN
if (doors & DOOR_YP)
{
uint8_t actual_floor = door_height[2]>0?0:floor_type*32;
actor::actor_t *act = actor::create("DOOR_YP1", {24,(tmax.y+1)*8,0}, {8,8,(door_height[2])*4}, "floor.gif", {actual_floor,1,32,15}, {0,15+door_height[2]*8});
act->flags = FLAG_NONE;
actor::setDirty(act, true);
act = actor::create("DOOR_YP2", {32,(tmax.y+1)*8,0}, {8,8,(door_height[2])*4}, "floor.gif", {actual_floor,1,32,15}, {0,15+door_height[2]*8});
act->flags = FLAG_NONE;
actor::setDirty(act, true);
}
if (doors & DOOR_XP)
{
uint8_t actual_floor = door_height[0]>0?0:floor_type*32;
actor::actor_t *act = actor::create("DOOR_XP1", {(tmax.x+1)*8,24,0}, {8,8,(door_height[0])*4}, "floor.gif", {actual_floor,1,32,15}, {0,15+door_height[0]*8});
act->flags = FLAG_NONE;
actor::setDirty(act, true);
act = actor::create("DOOR_XP2", {(tmax.x+1)*8,32,0}, {8,8,(door_height[0])*4}, "floor.gif", {actual_floor,1,32,15}, {0,15+door_height[0]*8});
act->flags = FLAG_NONE;
actor::setDirty(act, true);
}
}
void draw()
{
draw::pushSource();
draw::swapcol(1, color);
// RUTINES DE PINTAT DE LA PORTA DE DALT A LA DRETA
if (doors & DOOR_YN)
{
// Si la porta està elevada, pintar la part frontal de baix de la porta
if (door_height[3] > 0) {
draw::setSource(walls_surf);
draw::draw( 164+3*16-tmin.y*16, (36+3*8+tmin.y*8) + (5-door_height[3])*8, 16, 48-(5-door_height[3])*8, walldoors_type*16, (5-door_height[3])*8);
draw::draw( 164+4*16-tmin.y*16, (36+4*8+tmin.y*8) + (5-door_height[3])*8, 16, 48-(5-door_height[3])*8, walldoors_type*16, (5-door_height[3])*8);
}
// Pintem els dos tiles baix de la porta
draw::setSource(walls_surf);
draw::draw(164+4*16-(tmin.y-1)*16, -door_height[3]*8+84+4*8+(tmin.y-1)*8, 16, 15, walls_type*16, 33, DRAW_FLIP_HORIZONTAL); // Vora
draw::setSource(floor_surf);
draw::draw(148+3*16-(tmin.y-1)*16, -door_height[3]*8+76+3*8+(tmin.y-1)*8, 32, 15, floor_type*32, 1); // Tile de Piso
draw::draw(148+4*16-(tmin.y-1)*16, -door_height[3]*8+76+4*8+(tmin.y-1)*8, 32, 15, floor_type*32, 1); // Tile de Piso
// Pintem la porta
draw::setSource(doors_surf);
draw::draw(164+3*16-tmin.y*16, -door_height[3]*8+32+3*8+tmin.y*8,40,59,doors_type*40,0);
}
// RUTINES DE PINTAT DE LA PORTA DE DALT A LA ESQUERRA
if (doors & DOOR_XN)
{
// Si la porta està elevada, pintar la part frontal de baix de la porta
if (door_height[1] > 0) {
draw::setSource(walls_surf);
draw::draw(148+tmin.x*16-3*16, (36+tmin.x*8+3*8)+(5-door_height[1])*8, 16, 48-(5-door_height[1])*8, walldoors_type*16, (5-door_height[1])*8, DRAW_FLIP_HORIZONTAL);
draw::draw(148+tmin.x*16-4*16, (36+tmin.x*8+4*8)+(5-door_height[1])*8, 16, 48-(5-door_height[1])*8, walldoors_type*16, (5-door_height[1])*8, DRAW_FLIP_HORIZONTAL);
}
// Pintem els dos tiles baix de la porta
draw::setSource(walls_surf);
draw::draw(164+(tmin.x-1)*16-5*16, -door_height[1]*8+84+(tmin.x-1)*8+4*8, 16, 15, walls_type*16, 33); // Vora
draw::setSource(floor_surf);
draw::draw(148+(tmin.x-1)*16-3*16, -door_height[1]*8+76+(tmin.x-1)*8+3*8,32,15,floor_type*32,1);
draw::draw(148+(tmin.x-1)*16-4*16, -door_height[1]*8+76+(tmin.x-1)*8+4*8,32,15,floor_type*32,1);
// Pintem la porta
draw::setSource(doors_surf);
draw::draw(164+(tmin.x-1)*16-4*16-8, -door_height[1]*8+32+3*8+9+(tmin.x-1)*8, 40,59, doors_type*40,0, DRAW_FLIP_HORIZONTAL);
}
draw::setSource(walls_surf);
for (int x=tmin.x;x<=tmax.x;++x)
{
// Si hi ha porta en YP i està a altura 0, no pintem la vorera en eixos dos tiles
if ( !(doors & DOOR_YP) || (door_height[2] != 0) || (x!=3 && x!=4) ) draw::draw(148+x*16-tmax.y*16,84+x*8+tmax.y*8,16,15,walls_type*16, 33);
// Si hi ha porta en YN, no pintem la pared en eixos dos tiles
if ( !(doors & DOOR_YN) || (x!=3 && x!=4) ) draw::draw(164+x*16-tmin.y*16,36+x*8+tmin.y*8,16,48,walls_type*16, 0);
}
for (int y=tmin.y;y<=tmax.y;++y)
{
draw::setSource(walls_surf);
// Si hi ha porta en XP i està a altura 0, no pintem la vorera en eixos dos tiles
if ( !(doors & DOOR_XP) || (door_height[0] != 0) || (y!=3 && y!=4) ) draw::draw(164+tmax.x*16-y*16,84+tmax.x*8+y*8,16,15,walls_type*16, 33, DRAW_FLIP_HORIZONTAL);
// Si hi ha porta en XN, no pintem la pared en eixos dos tiles
if ( !(doors & DOOR_XN) || (y!=3 && y!=4) ) draw::draw(148+tmin.x*16-y*16,36+tmin.x*8+y*8,16,48,walls_type*16,0, DRAW_FLIP_HORIZONTAL);
// Pintem tots els tiles del piso
draw::setSource(floor_surf);
for (int x=tmin.x;x<=tmax.x;++x)
{
draw::draw(148+x*16-y*16,76+x*8+y*8,32,15,floor_type*32,1);
}
}
draw::popSource();
}
void draw2()
{
draw::pushSource();
draw::swapcol(1, color);
if (doors & DOOR_YP)
{
// Pintem les voreres dels dos tiles extra per a la porta YP
draw::setSource(walls_surf);
draw::draw(164+4*16-(tmax.y+1)*16, -door_height[2]*8+84+4*8+(tmax.y+1)*8, 16, 15+door_height[2]*8, walldoors_type*16, 1, DRAW_FLIP_HORIZONTAL);
draw::draw(148+3*16-(tmax.y+1)*16, -door_height[2]*8+84+3*8+(tmax.y+1)*8, 16, 15+door_height[2]*8, walldoors_type*16, 1);
draw::draw(148+4*16-(tmax.y+1)*16, -door_height[2]*8+84+4*8+(tmax.y+1)*8, 16, 15+door_height[2]*8, walldoors_type*16, 1);
draw::setSource(aux_surf);
draw::draw(164+4*16-(tmax.y+1)*16, 91+4*8+(tmax.y+1)*8, 16, 8, 16, 0);
draw::draw(148+3*16-(tmax.y+1)*16, 91+3*8+(tmax.y+1)*8, 16, 8, 0, 0);
draw::draw(148+4*16-(tmax.y+1)*16, 91+4*8+(tmax.y+1)*8, 16, 8, 0, 0);
// Pintem la porta YP
draw::setSource(doors_surf);
draw::draw(164+3*16-8-(tmax.y+1)*16, -door_height[2]*8+32+3*8+4+(tmax.y+1)*8,40,59,doors_type*40,0);
}
if (doors & DOOR_XP)
{
// Pintem les voreres dels dos tiles extra per a la porta XP
draw::setSource(walls_surf);
draw::draw(148+(tmax.x+1)*16-4*16, -door_height[0]*8+84+(tmax.x+1)*8+4*8,16,15+door_height[0]*8,walldoors_type*16, 1);
draw::draw(164+(tmax.x+1)*16-3*16, -door_height[0]*8+84+(tmax.x+1)*8+3*8,16,15+door_height[0]*8,walldoors_type*16, 1, DRAW_FLIP_HORIZONTAL);
draw::draw(164+(tmax.x+1)*16-4*16, -door_height[0]*8+84+(tmax.x+1)*8+4*8,16,15+door_height[0]*8,walldoors_type*16, 1, DRAW_FLIP_HORIZONTAL);
draw::setSource(aux_surf);
draw::draw(148+(tmax.x+1)*16-4*16, 91+(tmax.x+1)*8+4*8,16,8,0,0);
draw::draw(164+(tmax.x+1)*16-3*16, 91+(tmax.x+1)*8+3*8,16,8,16,0);
draw::draw(164+(tmax.x+1)*16-4*16, 91+(tmax.x+1)*8+4*8,16,8,16,0);
// Pintem la porta XP
draw::setSource(doors_surf);
draw::draw( 164+(tmax.x+1)*16-4*16-16, -door_height[0]*8+32+3*8+4+(tmax.x+1)*8, 40,59, doors_type*40,0, DRAW_FLIP_HORIZONTAL);
}
draw::popSource();
}
vec3_t getSize()
{
return size;
}
vec3_t getMin()
{
return min;
}
vec3_t getMax()
{
return max;
}
uint8_t getDoors()
{
return doors;
}
uint8_t getDoor(const int d)
{
return door_height[d];
}
}