#include "m_editor_map.h" #include "jdraw.h" #include "jinput.h" #include "misc.h" #include #include "room.h" namespace modules { namespace editor_map { draw::surface *surf; vec2_t scroll {0,0}; int drawn[64]; int current_room; struct miniroom_t { uint8_t w; uint8_t h; uint8_t color; uint8_t exits[6]; }; miniroom_t minirooms[64]; void drawLines(const int room, const int x, const int y) { if (drawn[room]) return; drawn[room] = true; if ( (x>=-32) && (x<520) && (y>=-16) && (y<240) ) { draw::color(RED); if (minirooms[room].exits[XN] != 255) { draw::isoline(x,y,-1,-1,14); /*draw::isoline(x,y-1,-1,-1,14);*/ draw::isoline(x,y+1,-1,-1,14); } if (minirooms[room].exits[YN] != 255) { draw::isoline(x,y,+1,-1,14); /*draw::isoline(x,y-1,+1,-1,14);*/ draw::isoline(x,y+1,+1,-1,14); } if (minirooms[room].exits[XP] != 255) { draw::isoline(x,y,+1,+1,14); /*draw::isoline(x,y-1,+1,+1,14);*/ draw::isoline(x,y+1,+1,+1,14); } if (minirooms[room].exits[YP] != 255) { draw::isoline(x,y,-1,+1,14); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::isoline(x,y+1,-1,+1,14); } if (minirooms[room].exits[ZN] != 255) { draw::vline(x,y,24); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::vline(x+1,y,24); } if (minirooms[room].exits[ZP] != 255) { draw::vline(x,y-24,24); /*draw::isoline(x,y-1,-1,+1,14);*/ draw::vline(x+1,y-24,24); } } if (minirooms[room].exits[XN] != 255) drawLines(minirooms[room].exits[XN], x-24, y-12); if (minirooms[room].exits[XP] != 255) drawLines(minirooms[room].exits[XP], x+24, y+12); if (minirooms[room].exits[YN] != 255) drawLines(minirooms[room].exits[YN], x+24, y-12); if (minirooms[room].exits[YP] != 255) drawLines(minirooms[room].exits[YP], x-24, y+12); if (minirooms[room].exits[ZN] != 255) drawLines(minirooms[room].exits[ZN], x, y+24); if (minirooms[room].exits[ZP] != 255) drawLines(minirooms[room].exits[ZP], x, y-24); } void drawRoom(const int room, const int x, const int y, const bool shadow=false) { if (drawn[room]) return; drawn[room] = true; if ( (x>=-32) && (x<520) && (y>=-16) && (y<240) ) { draw::stencil::set(room); draw::swapcol(1, !shadow ? minirooms[room].color : 2); draw::draw(x-16, y-8, 32, 16, minirooms[room].w*32, minirooms[room].h*16); if (!shadow) { char num[] = "00"; num[0] = 48+(room/10); num[1] = 48+(room%10); draw::print(num, x-4, y-3, LIGHT+(room==current_room?YELLOW:WHITE), BLACK); } } if (minirooms[room].exits[XN] != 255) drawRoom(minirooms[room].exits[XN], x-24, y-12, shadow); if (minirooms[room].exits[XP] != 255) drawRoom(minirooms[room].exits[XP], x+24, y+12, shadow); if (minirooms[room].exits[YN] != 255) drawRoom(minirooms[room].exits[YN], x+24, y-12, shadow); if (minirooms[room].exits[YP] != 255) drawRoom(minirooms[room].exits[YP], x-24, y+12, shadow); if (minirooms[room].exits[ZN] != 255) drawRoom(minirooms[room].exits[ZN], x, y+24, shadow); if (minirooms[room].exits[ZP] != 255) drawRoom(minirooms[room].exits[ZP], x, y-24, shadow); } void loadMiniRoom() { const int room = room::getCurrent(); if (drawn[room]) return; drawn[room] = true; minirooms[room].color = room::getColor(0); minirooms[room].w = (room::getSize().x >> 1)-1; minirooms[room].h = (room::getSize().y >> 1)-1; for (int i=0; i<=ZN; ++i) minirooms[room].exits[i] = room::getExit(i); for (int i=0; i<=ZN; ++i) { const int next_room = minirooms[room].exits[i]; if ( (next_room >= 0) && (next_room <= 64) && (!drawn[next_room]) ) { room::load(next_room); loadMiniRoom(); } } } void init() { surf = draw::getSurface("mapa.gif"); scroll = {260,120}; draw::resetViewport(); for (int i=0;i<64;++i) drawn[i]=false; current_room = room::getCurrent(); loadMiniRoom(); room::load(current_room); for (int i=0;i<64;++i) drawn[i]=false; draw::cls(2); draw::setSource(surf); drawLines(room::getCurrent(), scroll.x, scroll.y); for (int y=-1; y<=1; ++y) for (int x=-1; x<=1; ++x) { for (int i=0;i<64;++i) drawn[i]=false; drawRoom(room::getCurrent(), scroll.x+x, scroll.y+y, true); } } bool loop() { if (input::keyPressed(SDL_SCANCODE_ESCAPE) || input::keyPressed(SDL_SCANCODE_TAB)) return false; draw::stencil::enable(); draw::stencil::clear(255); for (int i=0;i<64;++i) drawn[i]=false; drawRoom(room::getCurrent(), scroll.x, scroll.y); draw::render(); if (input::mouseClk(1)) { const int clicked = draw::stencil::query(input::mouseX(), input::mouseY()); if (clicked!=255) { room::load(clicked); return false; } } return true; } } }