/* * XMapEdit, the XPilot Map Editor. Copyright (C) 1993 by * * Aaron Averill * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Modifications to XMapEdit * 1996: * Robert Templeman * 1997: * William Docter * * $Id: expose.c,v 5.2 2002/02/26 00:41:18 millerjl Exp $ */ #include "main.h" int smlmap_x, smlmap_y, smlmap_width, smlmap_height; float smlmap_xscale, smlmap_yscale; segment_t mapicon_seg[35] = { { 0, 5, {0.00,1.00,1.00,0.00,0.00}, {1.00,1.00,0.00,0.00,1.00} }, /* 0:x MAP_WALL */ { 0, 4, {1.00,1.00,0.00,1.00,0.00}, {0.00,1.00,1.00,0.00,0.00} }, /* 1:q */ { 0, 4, {0.00,0.00,1.00,0.00,0.00}, {0.00,1.00,1.00,0.00,0.00} }, /* 2:w */ { 0, 4, {0.00,1.00,1.00,0.00,0.00}, {0.00,0.00,1.00,0.00,0.00} }, /* 3:a */ { 0, 4, {0.00,1.00,0.00,0.00,0.00}, {0.00,0.00,1.00,0.00,0.00} }, /* 4:s */ { 0, 5, {0.00,1.00,1.00,0.00,0.00}, {1.00,1.00,0.00,0.00,1.00} }, /* 5:# MAP_FUEL */ { 1, 4, {0.70,0.99,0.99,0.70,0.00}, {0.50,0.99,0.01,0.50,0.00} }, /* 6:d MAP_CANNON*/ { 1, 4, {0.01,0.99,0.50,0.01,0.00}, {0.99,0.99,0.70,0.99,0.00} }, /* 7:r MAP_CANNON*/ { 1, 4, {0.50,0.01,0.99,0.50,0.00}, {0.30,0.01,0.01,0.30,0.00} }, /* 8:c MAP_CANNON*/ { 1, 4, {0.30,0.01,0.01,0.30,0.00}, {0.50,0.99,0.01,0.50,0.00} }, /* 9:f MAP_CANNON*/ { 1, 2, {0.01,0.99,0.00,0.00,0.00}, {0.99,0.99,0.00,0.00,0.00} }, /* 10:_ MAP_BASE*/ { 2, 5, {0.50,0.50,0.50,0.30,0.70}, {0.30,0.70,0.50,0.50,0.50} }, /* 11:+ MAP_GRAV_POS*/ { 2, 2, {0.30,0.70,0.00,0.00,0.00}, {0.50,0.50,0.00,0.00,0.00} }, /* 12:- MAP_GRAV_NET*/ { 2, 0, {0.00,0.00,0.00,0.00,0.00}, {0.00,0.00,0.00,0.00,0.00} }, /* 13:@ MAP_WORM_BOTH */ { 2, 5, {0.10,0.70,0.30,0.70,0.70}, {0.10,0.70,0.70,0.70,0.30} }, /* 14:) MAP_WORM_ */ { 2, 5, {0.70,0.10,0.30,0.10,0.10}, {0.70,0.10,0.10,0.10,0.30} }, /* 15:( MAP_WORM_ */ { 2, 4, {0.05,0.05,0.95,0.95,0.00}, {0.50,0.95,0.95,0.50,0.00} }, /* 16:* MAP_TREASURE*/ { 2, 3, {0.60,0.50,0.60,0.00,0.00}, {0.05,0.15,0.30,0.00,0.00} }, /* 17:< */ { 2, 3, {0.40,0.50,0.40,0.00,0.00}, {0.05,0.15,0.30,0.00,0.00} }, /* 18:> */ { 2, 5, {0.05,0.95,0.95,0.05,0.05}, {0.05,0.05,0.95,0.95,0.05} }, /* 19:! MAP_TARGET */ { 1, 0, {0.00,0.00,0.00,0.00,0.00}, {0.00,0.00,0.00,0.00,0.00} }, /* 20: MAP_SPACE */ { 3, 5, {0.00,1.00,1.00,0.00,0.00}, {1.00,1.00,0.00,0.00,1.00} }, /* 21:b MAP_DECORATION */ { 3, 4, {1.00,1.00,0.00,1.00,0.00}, {0.00,1.00,1.00,0.00,0.00} }, /* 22:t */ { 3, 4, {0.00,0.00,1.00,0.00,0.00}, {0.00,1.00,1.00,0.00,0.00} }, /* 23:y */ { 3, 4, {0.00,1.00,1.00,0.00,0.00}, {0.00,0.00,1.00,0.00,0.00} }, /* 24:g */ { 3, 4, {0.00,1.00,0.00,0.00,0.00}, {0.00,0.00,1.00,0.00,0.00} }, /* 25:h */ { 2, 0, {0.00,0.00,0.00,0.00,0.00}, {0.00,0.00,0.00,0.00,0.00} }, /* 26:$ BASE ORIENT*/ { 2, 4, {0.30,0.70,0.50,0.30,0.00}, {0.15,0.15,0.80,0.15,0.00} }, /* 27:% ITEM CONCENTRATOR*/ { 2, 5, {0.50,0.50,0.75,0.50,0.25}, {0.99,0.01,0.50,0.01,0.50} }, /* 28:i CURRENT UP*/ { 2, 5, {0.99,0.01,0.50,0.01,0.50}, {0.50,0.50,0.75,0.50,0.25} }, /* 29:j CURRENT LEFT*/ { 2, 5, {0.01,0.99,0.50,0.99,0.50}, {0.50,0.50,0.75,0.50,0.25} }, /* 30:k CURRENT RIGHT*/ { 2, 5, {0.50,0.50,0.75,0.50,0.25}, {0.01,0.99,0.50,0.99,0.50} }, /* 31:m CURRENT DOWN*/ { 2, 4, {0.05,0.05,0.95,0.95,0.00}, {0.50,0.95,0.95,0.50,0.00} }, /* 32:^ MAP_EMPTY_TREASURE*/ { 0, 5, {0.00,1.00,1.00,0.00,0.00}, {1.00,1.00,0.00,0.00,1.00} }, /* 33:z MAP_FRICTION */ { 0, 5, {0.10,0.85,0.85,0.10,0.10}, {0.85,0.85,0.10,0.10,0.85} }, /* 34:& MAP_FRICTION */ }; segment_t mapicondet_seg[4] = { { 0, 5, {0.25,0.75,0.75,0.25,0.25}, {0.75,0.75,0.25,0.25,0.75} }, /* 0:! TARGET (DETAIL)*/ { 0, 5, {0.25,0.75,0.50,0.25,0.75}, {0.25,0.75,0.50,0.75,0.25} }, /* 1:! TARGET (DETAIL)*/ { 0, 5, {0.20,0.70,0.70,0.20,0.20}, {0.70,0.70,0.20,0.20,0.70} }, /* 2:& ASTEROID_CONC (DETAIL)*/ { 0, 5, {0.35,0.65,0.65,0.35,0.35}, {0.60,0.60,0.30,0.30,0.60} }, /* 3:& ASTEROID_CONC (DETAIL)*/ }; int mapicon_ptr[91] = {20, 19, 0, 5, 26, /* ascii char -32 */ 27, 34, 0, 15, 14, 16, 11, 0, 12, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 17, 0, 18, 0, 13, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 32, 10, 0, 3, 21, 8, 6, 0, 9, 24, 25, 28, 29, 30, 0, 31, 0, 0, 0, 1, 7, 4, 22, 0, 0, 2, 0, 23, 33}; char iconmenu[36] = { ' ', MAP_FILLED , MAP_REC_RD , MAP_REC_LD , MAP_REC_RU , MAP_REC_LU , MAP_DEC_FLD , MAP_DEC_RD , MAP_DEC_LD , MAP_DEC_RU , MAP_DEC_LU , MAP_FUEL , MAP_CAN_LEFT , MAP_CAN_RIGHT , MAP_CAN_UP , MAP_CAN_DOWN , MAP_TARGET , MAP_TREASURE , MAP_EMPTY_TREASURE , MAP_GRAV_ACWISE , MAP_GRAV_CWISE , MAP_WORM_NORMAL , MAP_WORM_IN , MAP_WORM_OUT , MAP_GRAV_POS , MAP_GRAV_NEG , MAP_CRNT_UP , MAP_CRNT_LT , MAP_CRNT_RT , MAP_CRNT_DN , MAP_ASTEROID_CONC , MAP_BASE , MAP_BASE_ORNT , MAP_ITEM_CONC , MAP_FRICTION , MAP_SPACE }; /***************************************************************************/ /* DrawTools */ /* Arguments : */ /* Purpose : */ /***************************************************************************/ void DrawTools(void) { int i,j,w,sel; DrawSmallMap(); /* draw button icons */ w = (TOOLSWIDTH-20)/5; for(i=0;i<7;i++) for(j=0;j<5;j++) { sel = i*5+j+1; if ( sel == drawicon) DrawMapPic(mapwin,14+j*w,9+i*w,mapicon_ptr[iconmenu[sel]-32],w-7); else DrawMapPic(mapwin,13+j*w,8+i*w,mapicon_ptr[iconmenu[sel]-32],w-7); } } /***************************************************************************/ /* DrawMap */ /* Arguments : */ /* x */ /* y */ /* width */ /* height */ /* Purpose : */ /***************************************************************************/ void DrawMap(int x, int y, int width, int height) { int x1,y1; x -= TOOLSWIDTH; if (x<0) { x=0; } else if ((width+x) > (mapwin_width-TOOLSWIDTH)) { width = (mapwin_width-TOOLSWIDTH-x); } if (y<0) { y=0; } else if ((height+y) > mapwin_height) { height = (mapwin_height-y); } x1 = ((int)(x/map.view_zoom))*map.view_zoom+TOOLSWIDTH; y1 = ((int)(y/map.view_zoom))*map.view_zoom; x /= map.view_zoom; y /= map.view_zoom; width /= map.view_zoom; height /= map.view_zoom; DrawMapSection(x+map.view_x,y+map.view_y,width,height,x1,y1); } /***************************************************************************/ /* DrawMapSection */ /* Arguments : */ /* x */ /* y */ /* width */ /* height */ /* xpos */ /* ypos */ /* Purpose : */ /***************************************************************************/ void DrawMapSection(int x, int y, int width, int height, int xpos, int ypos) { int i,j,w,h,data; char strng[2]; if ( x < 0 ) { DrawMapSection(map.width+x,y,(0-x),height,xpos,ypos); DrawMapSection(0,y,width+x,height,xpos-(x*map.view_zoom),ypos); return; } if ( y < 0 ) { DrawMapSection(x,map.height+y,width,(0-y),xpos,ypos); DrawMapSection(x,0,width,height+y,xpos,ypos-(y*map.view_zoom)); return; } if ((x+width) > map.width) { DrawMapSection(x,y,map.width-x,height,xpos,ypos); DrawMapSection(0,y,x+width-map.width,height, xpos+((map.width-x)*map.view_zoom),ypos); return; } if ((y+height) > map.height) { DrawMapSection(x,y,width,map.height-y,xpos,ypos); DrawMapSection(x,0,width,y+height-map.height,xpos, ypos+((map.height-y)*map.view_zoom)); return; } w = width+x; h = height+y; for (i=x;i<=w;i++) for (j=y;j<=h;j++) { if ( (i47) && (data <58)) || ((data > 64) && (data <91)) ) { strng[0] = data; strng[1] = '\0'; T_DrawString(mapwin,(i-x)*map.view_zoom+xpos, (j-y)*map.view_zoom+1+ypos,map.view_zoom,map.view_zoom-1, White_GC,strng,JUSTIFY_CENTER,CROP_RIGHT,-1); } } } } /***************************************************************************/ /* DrawMapPic */ /* Arguments : */ /* win */ /* x */ /* y */ /* picnum */ /* zoom */ /* Purpose : */ /***************************************************************************/ void DrawMapPic(Window win, int x, int y, int picnum, int zoom) { XPoint points[5]; int i,arc,xo=0,yo=0; #ifdef MONO GC gc; #endif if (picnum == 20 ) return; /*-----------------------------------------------------------------*/ if (picnum == 8) { yo=1; } else if (picnum == 9) { xo=1; } /*-----------------------------------------------------------------*/ for (i=0;i 10) && (picnum < 16)) { XDrawArc(display,win,gc,(int)(x+(zoom-arc)/2), (int)(y+(zoom-arc)/2), arc,arc,0,23040); if (picnum > 12) { XDrawArc(display,win,gc,(int)(x+.15*zoom),(int)(y+.15*zoom), (int)(.4*zoom),(int)(.4*zoom),0,23040); } return; } else if (picnum == 16) { XDrawArc(display,win,gc,(int)(x+.25*zoom),(int)(y+.25*zoom), (int)(.5*zoom),(int)(.5*zoom),0,23040); return; } else if (picnum == 17) { XDrawArc(display,win,gc,(int)(x+.15*zoom), (int)(y+.15*zoom), (int)(.7*zoom),(int)(.7*zoom),5760, -18880); return; } else if (picnum == 18) { XDrawArc(display,win,gc, (int)(x+.15*zoom), (int)(y+.15*zoom), (int)(.7*zoom),(int)(.7*zoom),5760, 18880); return; } #else /*------------------------------------------------------------*/ if ((picnum >= 0) && (picnum <= 4)) {/* Walls */ XDrawLines(display, win, Wall_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); return; } else if (picnum == 5) { XDrawLines(display, win, Wall_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); XFillRectangle(display,win, Fuel_GC, x+1,y+1,zoom-1,zoom-1); return; } else if ((picnum >= 6) && (picnum <= 9)) {/* Cannons */ XDrawLines(display, win, Cannon_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); return; } else if (picnum == 10) {/* Bases */ XDrawLines(display, win, Base_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); return; } else if ((picnum >=11) && (picnum<=12)) {/* +/- gravity and wormholes */ XDrawLines(display, win, Gravity_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); } else if ((picnum >=13) && (picnum<=15)) {/* +/- gravity and wormholes */ XDrawLines(display, win, Wormhole_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); } else if ((picnum ==16) || (picnum ==32)) {/* Treasure or Empty treasure*/ XDrawLines(display, win, Treasure_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); } else if ((picnum >=17) && (picnum<=18)) {/* clockwise and anti clockwise gravity */ XDrawLines(display, win, Gravity_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); } else if (picnum ==19) {/* Target */ XDrawLines(display, win, Target_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); picnum=0; for (i=0;i= 21) && (picnum <= 25)) {/* Decorations */ XDrawLines(display, win, Decor_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); return; } else if (picnum ==26) {/* Base Orient */ XDrawLines(display, win, Base_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); } else if (picnum ==27) {/* Item Concentrator */ XDrawLines(display, win, Item_Conc_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); return; } else if ((picnum >=28) && (picnum <= 31)) {/* Currents */ XDrawLines(display, win, Current_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); return; } else if (picnum == 33) {/* Friction */ XDrawLines(display, win, Friction_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); return; } else if (picnum ==34) {/* Asteroid Conc */ XDrawLines(display, win, Item_Conc_GC, points, mapicon_seg[picnum].num_points, CoordModeOrigin); picnum=2; for (i=0;i= 11) && (picnum <= 12)) {/* +/- Gravity */ XDrawArc(display,win,Gravity_GC,(int)(x+(zoom-arc)/2), (int)(y+(zoom-arc)/2), arc,arc,0,23040); } else if ((picnum >= 13) && (picnum <= 15)) { /* Wormhole */ XDrawArc(display,win,Wormhole_GC,(int)(x+(zoom-arc)/2), (int)(y+(zoom-arc)/2), arc,arc,0,23040); XDrawArc(display,win,Wormhole_GC,(int)(x+.15*zoom),(int)(y+.15*zoom), (int)(.4*zoom),(int)(.4*zoom),0,23040); return; } else if ((picnum == 16) || (picnum == 32)) {/* Treasure or empty treasure*/ XDrawArc(display,win,Treasure_GC,(int)(x+.05*zoom),(int)(y+.05*zoom), (int)(.9*zoom),(int)(1*zoom),0,11520); if (picnum == 16) XDrawArc(display,win,White_GC,(int)(x+.15*zoom),(int)(y+.4*zoom), (int)(.5*zoom),(int)(.5*zoom),0,23040); return; } else if (picnum == 17) {/* Gravity */ XDrawArc(display,win,Gravity_GC,(int)(x+.15*zoom), (int)(y+.15*zoom), (int)(.7*zoom),(int)(.7*zoom),5760, -18880); return; } else if (picnum == 18) {/* Gravity */ XDrawArc(display,win,Gravity_GC, (int)(x+.15*zoom), (int)(y+.15*zoom), (int)(.7*zoom),(int)(.7*zoom),5760, 18880); return; } else if (picnum == 26) {/* Born Facing */ XDrawArc(display,win, Base_GC, (int)(x+.15*zoom), (int)(y+.15*zoom), (int)(.7*zoom),(int)(.7*zoom),0, 23040); XDrawArc(display,win, Base_GC, (int)(x+.35*zoom), (int)(y+.35*zoom), (int)(.05*zoom),(int)(.05*zoom),0, 23040); XDrawArc(display,win, Base_GC, (int)(x+.60*zoom), (int)(y+.35*zoom), (int)(.05*zoom),(int)(.05*zoom),0, 23040); XDrawArc(display,win, Base_GC, (int)(x+.25*zoom), (int)(y+.15*zoom), (int)(.5*zoom),(int)(.5*zoom),0, -12000); return; } #endif } /***************************************************************************/ /* DrawSmallMap */ /* Arguments : */ /* Purpose : */ /***************************************************************************/ void DrawSmallMap(void) { int i,j; T_ClearArea(smlmap_pixmap,0,0,TOOLSWIDTH,TOOLSWIDTH); T_DrawButton(smlmap_pixmap,smlmap_x-5,smlmap_y-5,smlmap_width+10, smlmap_height+10,LOWERED,0); XFillRectangle(display,smlmap_pixmap,Black_GC,smlmap_x,smlmap_y, smlmap_width,smlmap_height); for (i=0;i smlmap_width) { DrawViewSeg(x1,y1,smlmap_width-x1,y2); DrawViewSeg(0,y1,x1+x2-smlmap_width,y2); return; } if ((y1+y2) > smlmap_height) { DrawViewSeg(x1,y1,x2,smlmap_height-y1); DrawViewSeg(x1,0,x2,y1+y2-smlmap_height); return; } XDrawRectangle(display,mapwin,xorgc,x1+smlmap_x, y1+smlmap_y+ TOOLSHEIGHT - TOOLSWIDTH,x2,y2); }