- Redrew router and firewall objects to be more Cisco-like.

- Corrected random crash when running under Windows
- Added more keyboard shortcuts
- Corrected bug in savemap() function, and added convert.c program to convert
old diagram files
- Increased maximum object dimensions
- Increased maximum number of maps
- Increased maximum number of vectors per object
- Object toolbox nows scrolls to show all objects (use q/w or ,/. keys)
- Can now use CTRL+LMB to create links/add points (for 2-button mice)
- Added export to BMP function when save filename ends with ".bmp"
- No longer need to avoid text when double clicking to drill down.
This commit is contained in:
Rob Pearce 2005-10-25 06:45:19 +00:00
parent 05fabbfaf3
commit bdc798c0fa
8 changed files with 781 additions and 135 deletions

View File

@ -1,5 +1,5 @@
netmapr: netmapr.c constants.h netmapr.h Makefile netmapr: netmapr.c constants.h netmapr.h Makefile
gcc -Wall -g netmapr.c -onetmapr `sdl-config --libs --cflags` -L/usr/X11R6/lib -lX11 -lpthread -lXext gcc -Wall -g netmapr.c -I/usr/local/include -onetmapr -lmingw32 -L/usr/local/lib -lSDLmain -lSDL -mwindows
install: netmapr convert: convert.c convert.h Makefile
cp -f netmapr /usr/local/bin ; [ ! -d ~/.netmapr ] && mkdir ~/.netmapr ; cp -f *.dat ~/.netmapr/ gcc -Wall -g convert.c -I/usr/local/include -oconvert -lmingw32 -L/usr/local/lib -lSDLmain -lSDL

View File

@ -1,2 +1,5 @@
netmapr: netmapr.c constants.h netmapr.h Makefile netmapr: netmapr.c constants.h netmapr.h Makefile
gcc -Wall -g netmapr.c -I/usr/local/include -onetmapr -lmingw32 -L/usr/local/lib -lSDLmain -lSDL gcc -Wall -g netmapr.c -I/usr/local/include -onetmapr -lmingw32 -L/usr/local/lib -lSDLmain -lSDL -mwindows
convert: convert.c convert.h Makefile
gcc -Wall -g convert.c -I/usr/local/include -oconvert -lmingw32 -L/usr/local/lib -lSDLmain -lSDL

View File

@ -1,4 +1,4 @@
#define VERSION "0.97" #define VERSION "0.99"
#define BUFLEN 512 #define BUFLEN 512
@ -10,7 +10,7 @@
#define MAXPOINTS 20 #define MAXPOINTS 20
#define MAXBUTTONS 40 #define MAXBUTTONS 40
#define MAXMAPS 20 #define MAXMAPS 100
#define MAXHISTORY 50 #define MAXHISTORY 50
#define MAXCHILDREN 10 #define MAXCHILDREN 10
@ -29,14 +29,15 @@
#define MAXLETTERWIDTH 100 #define MAXLETTERWIDTH 100
#define MAXLETTERHEIGHT 100 #define MAXLETTERHEIGHT 100
#define MAXOBJWIDTH 300 #define MAXOBJWIDTH 750
#define MAXOBJHEIGHT 300 #define MAXOBJHEIGHT 550
#define MINOBJWIDTH 20 #define MINOBJWIDTH 20
#define MINOBJHEIGHT 20 #define MINOBJHEIGHT 20
#define MAXFILLSTACK 500000 #define MAXFILLSTACK 500000
#define MAXVECTORSPERIMAGE (60) #define OLDMAXVECTORSPERIMAGE (60)
#define MAXVECTORSPERIMAGE (120)
#define LINESELTHRESHOLD (4) #define LINESELTHRESHOLD (4)
#define LINESELHANDLESIZE (5) #define LINESELHANDLESIZE (5)

163
convert.c Normal file
View File

@ -0,0 +1,163 @@
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <SDL/SDL.h>
#include <SDL/SDL_keysym.h>
#include "convert.h"
#include "constants.h"
char text[BUFLEN];
int nummaps;
int curmap;
int modified;
int main (int argc, char **argv) {
if (argc != 3) {
printf("convert - converts old netmapr 0.98 maps to new format.\n",argv[0]);
printf("usage: %s source dest\n",argv[0]);
exit(1);
}
strcpy(text, argv[1]);
loadmap();
strcpy(text, argv[2]);
savemap();
return 0;
}
int loadmap(void) {
char filename[BUFLEN];
FILE *f;
int namelen;
int i;
/* TODO: validate */
strcpy(filename, text);
f = fopen(filename, "rb");
if (!f) {
printf("ERROR: Cannot open '%s'.\n",filename);
return TRUE;
}
/* TODO: free() variables! */
/* read in number maps */
fread(&nummaps, sizeof(int), 1, f);
for (i = 0; i < nummaps; i++) {
fread(&map[i].width, sizeof(int), 1, f);
fread(&map[i].height, sizeof(int), 1, f);
fread(&map[i].bpp, sizeof(int), 1, f);
fread(&map[i].bgcol, sizeof(SDL_Color), 1, f);
fread(&map[i].boxcol, sizeof(SDL_Color), 1, f);
fread(&map[i].numthings, sizeof(int), 1, f);
fread(&map[i].numobjects, sizeof(int), 1, f);
fread(&map[i].numlinks, sizeof(int), 1, f);
fread(&map[i].numtext, sizeof(int), 1, f);
map[i].selecteditem = -1;
map[i].selecteditemtype = -1;
map[i].selectedlinkpoint = -1;
map[i].selectedtype = 0;
map[i].curobj = -1;
map[i].curlink = -1;
map[i].curlinkpoint = -1;
map[i].curtext = -1;
map[i].startx = -1;
map[i].starty = -1;
map[i].textanchor = -1;
strcpy(map[i].text, "");
fread(&namelen, sizeof(int), 1, f);
fread(&map[i].name, (namelen+1) * sizeof(char), 1, f);
/* read objects */
fread(&map[i].thing, sizeof(thing_t), map[i].numthings, f);
fread(&map[i].olink, sizeof(link_t), map[i].numlinks, f);
fread(&map[i].obj, sizeof(object_t), map[i].numobjects, f);
fread(&map[i].textob, sizeof(text_t), map[i].numtext, f);
}
fclose(f);
curmap = 0;
modified = FALSE;
printf("Successfully loaded map from '%s' (%d maps).\n",filename,nummaps); fflush(stdout);
return FALSE;
}
int savemap(void) {
char filename[BUFLEN];
FILE *f;
int namelen;
int i;
/* TODO: validate */
strcpy(filename, text);
printf("Saving map...\n");
if ((f = fopen(filename, "wb")) == NULL) {
printf("ERROR: Could not open '%s'.\n",filename);
return TRUE;
}
/* dump out numbers of map[curmap].objects */
fwrite(&nummaps, sizeof(int), 1, f);
for (i = 0; i < nummaps; i++) {
fwrite(&map[i].width, sizeof(int), 1, f);
fwrite(&map[i].height, sizeof(int), 1, f);
fwrite(&map[i].bpp, sizeof(int), 1, f);
fwrite(&map[i].bgcol, sizeof(SDL_Color), 1, f);
fwrite(&map[i].boxcol, sizeof(SDL_Color), 1, f);
fwrite(&map[i].numthings, sizeof(int), 1, f);
fwrite(&map[i].numobjects, sizeof(int), 1, f);
fwrite(&map[i].numlinks, sizeof(int), 1, f);
fwrite(&map[i].numtext, sizeof(int), 1, f);
/* selecteditem*/
/* selecteditemtype*/
/* selectedlinkpoint*/
/* selectedtype*/
/* curobj*/
/* curlink*/
/* curlinkpoint*/
/* curtext*/
/* startx,starty */
/* textanchor */
/* text*/
namelen = strlen(map[i].name);
fwrite(&namelen, sizeof(int), 1, f);
fwrite(&map[i].name, (namelen+1) * sizeof(char), 1, f);
/* write objects */
fwrite(&map[i].thing, sizeof(thing_t), map[i].numthings, f);
fwrite(&map[i].olink, sizeof(link_t), map[i].numlinks, f);
fwrite(&map[i].obj, sizeof(mapobject_t), map[i].numobjects, f);
fwrite(&map[i].textob, sizeof(text_t), map[i].numtext, f);
}
fclose(f);
modified = FALSE;
printf("Successfully saved map to '%s'.\n",filename);
return 0;
}

243
convert.h Normal file
View File

@ -0,0 +1,243 @@
#include "constants.h"
typedef struct {
int x;
int y;
} xy_t;
struct {
int x;
int y;
int width;
int height;
int pos;
int gridsize;
int gridrowlen;
SDL_Color gridcol;
SDL_Color gridbgcol;
SDL_Color bgcol;
} obox;
struct {
int x;
int y;
int width;
int height;
int gridsize;
int gridrowlen;
SDL_Color gridcol;
SDL_Color bgcol;
} toolbox;
struct {
int x;
int y;
int width;
int height;
} mapbox;
typedef struct {
char text[BUFLEN];
int x;
int y;
int w;
int h;
SDL_Color c;
int anchor;
} text_t;
typedef struct {
int srcobj;
int srcxoff;
int srcyoff;
int dstobj;
int dstxoff;
int dstyoff;
int npoints;
xy_t point[MAXPOINTS];
SDL_Color col;
int style;
} link_t;
typedef struct {
int type; /* line, square */
int x1,y1;
int x2,y2;
SDL_Color c;
} vector_t;
typedef struct {
int w;
int h;
vector_t vector[OLDMAXVECTORSPERIMAGE];
int vnum;
} vectorimg_t;
typedef struct {
char name[BUFLEN];
int canscale;
int defw;
int defh;
vectorimg_t vimg;
} object_t;
struct {
vectorimg_t vect;
char name;
} letter[MAXLETTERVECTS];
typedef struct {
int id;
int type;
} thing_t;
object_t objtype[MAXOBJTYPES];
typedef struct {
int type; /* index into objtype[] */
int x;
int y;
int w;
int h;
int child;
} mapobject_t;
typedef struct {
char name[BUFLEN];
SDL_Surface *img;
} button_t;
button_t button[MAXBUTTONS];
typedef struct {
int width;
int height;
int bpp;
SDL_Color bgcol;
SDL_Color boxcol;
int numthings;
int numobjects;
int numlinks;
int numtext;
int selecteditem;
int selecteditemtype;
int selectedlinkpoint;
int selectedtype;
int curobj; /* object being moved/dragged/etc */
int curlink; /* link being moved/dragged/etc */
int curlinkpoint; /* link point being moved/dragged/etc */
int curtext; /* text being moved/dragged/etc */
int startx,starty;
int textanchor;
char text[BUFLEN];
char name[BUFLEN];
/* actual data */
text_t textob[MAXTEXT];
mapobject_t obj[MAXOBJECTS];
thing_t thing[MAXOBJECTS + MAXLINKS];
link_t olink[MAXLINKS];
} map_t;
map_t map[MAXMAPS];
void addlinkpoint(int linkid, int x, int y);
int addvector(vectorimg_t *vimg, int type, int x1, int y1, int x2, int y2, SDL_Color *c);
void changestate(int newstate);
void cleanup(void);
int createobject(int type, int x, int y);
void copyline(SDL_Surface *screen,int x1, int y1, int x2, int y2, int *lbuf);
void deletething(int id, int type);
void deletelink(int linkid);
void deleteobject(int oid );
void deletetext(int textid);
void drawbox(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c);
void drawcolorchart(SDL_Surface *dest);
void drawmaplist(SDL_Surface *dest);
int drawletter(SDL_Surface *dest,int x, int y, int w, int h, char let, SDL_Color col);
void drawline(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c);
void drawlinebehind(SDL_Surface *screen, int x1, int y1, int x2, int y2, SDL_Color c);
void drawlink(SDL_Surface *dest, link_t *l);
void drawpixel(SDL_Surface *screen, int x, int y, SDL_Color c);
void drawmap(void);
void drawmapbox(void);
void drawobox(void);
void drawscreen(void);
void drawstatusbar(void);
void drawtext(SDL_Surface *dest, text_t *t);
void drawtoolbox(void);
void drawtoolboxselector(int buttonid);
void drawvector(SDL_Surface *dest, vectorimg_t *vimg, int x, int y, int w, int h,SDL_Color *overridefg );
void drillto(int mapnum);
int endobjmove(int x, int y);
int endresize(int x, int y);
int endtextresize(int x, int y);
int endlink(int x, int y);
int endlinkmove(int x, int y);
int endlinkdstmove(int x, int y);
int endlinkpointmove(int x, int y);
int endlinksrcmove(int x, int y);
int endtext(void);
int endtextmove(int x, int y);
int findpointpos(link_t *l, int px, int py);
void floodfill(SDL_Surface *dest, int x, int y, SDL_Color fillcol);
void floodfill2(SDL_Surface *dest, int x, int y, SDL_Color fillcol, SDL_Color bgcol);
void floodfill3(SDL_Surface *dest, int x1, int x2, int y, SDL_Color fillcol, SDL_Color bgcol);
void floodfill4(SDL_Surface *dest, int x, int y, SDL_Color fillcol, SDL_Color bgcol);
int getcolor(SDL_Surface *dest, int x, int y, SDL_Color *col);
void drawyn(char *prompt);
int getyn(int x, int y);
void goback(void);
int linelen(int x1,int y1,int x2,int y2);
int linkat(int x, int y);
int loadmap(void);
void lowerselected(void);
int objat(int x, int y);
void pasteline(SDL_Surface *screen, int *lbuf);
void pop(int *x, int *y);
void push(int x, int y);
int initgraphics(void);
void initmap(int mapnum);
int initobject(int onum);
int isonline (int fx, int fy, int x1, int y1, int x2, int y2);
int isonlink(int linkid, int mx, int my);
int isonlinkdst(int lineid, int mx, int my);
int isonlinkpoint(int lineid, int mx, int my);
int isonlinksrc(int lineid, int mx, int my);
int isonmap (int x, int y);
int isonobox (int x, int y);
int isontoolbox (int x, int y);
int isonmapbox (int x, int y);
int isonmapboxchildren (int x, int y);
int isonmapname (int x, int y);
int isongoback (int x, int y);
void initvars(void);
void raiseselected(void);
int savemap(void);
int showfiledialog(void);
int startlink (int x, int y);
int startlinkdstmove(int x, int y);
int startlinkpointmove(int x, int y);
int startlinksrcmove(int x, int y);
int startlinkmove(int x, int y);
int startobjmove(int x, int y);
int startresize (int x, int y);
int startresizetext (int x, int y);
int starttextmove(int x, int y);
int textat(int x, int y);
int thingat(int x, int y);
int updatefilename(void);
int updatelinkshadow(int x, int y);
int updatelinkpointshadow(int x, int y);
int updatemoveshadow(int x, int y);
int updateresizeshadow(int x, int y);
int updateresizetextshadow(int x, int y);
int updatetextcursor(void);
int updatetextshadow(int x, int y);

232
netmapr.c
View File

@ -72,6 +72,8 @@ int textanchor;
char text[BUFLEN]; char text[BUFLEN];
int startobj,endobj; int startobj,endobj;
char progdir[BUFLEN];
int shift; int shift;
int main (int argc, char **argv) { int main (int argc, char **argv) {
@ -89,6 +91,12 @@ int main (int argc, char **argv) {
autoload = TRUE; autoload = TRUE;
} }
if (getenv("NETMAPRDIR") != NULL) {
strncpy(progdir, getenv("NETMAPRDIR"), BUFLEN);
} else {
strcpy(progdir, "/usr/local/share/netmapr");
}
if (initgraphics()) { if (initgraphics()) {
printf("Error initialising graphics.\n"); printf("Error initialising graphics.\n");
exit(1); exit(1);
@ -201,13 +209,17 @@ int main (int argc, char **argv) {
oldticks = ticks; oldticks = ticks;
if (isonmap(event.button.x, event.button.y)) { if (isonmap(event.button.x, event.button.y)) {
if (state != S_REALLYQUIT) { if (state != S_REALLYQUIT) {
if ((doubleclick) && (objat(event.button.x, event.button.y) == map[curmap].selecteditem)) { //if ((doubleclick) && (objat(event.button.x, event.button.y) == map[curmap].selecteditem)) {
if (doubleclick) {
o = objat(event.button.x, event.button.y);
/* only works on an object */ /* only works on an object */
if (map[curmap].selecteditem != -1) { //if (map[curmap].selecteditem != -1) {
if (o != -1) {
/* can't create a new child via double click */ /* can't create a new child via double click */
if (map[curmap].obj[map[curmap].selecteditem].child != -1) { if (map[curmap].obj[o].child != -1) {
changestate(S_NONE); changestate(S_NONE);
drillto(map[curmap].obj[map[curmap].selecteditem].child); drillto(map[curmap].obj[o].child);
} else { } else {
sprintf(statustext, "Cannot drill down - object has no children (use drill tool to create one)."); sprintf(statustext, "Cannot drill down - object has no children (use drill tool to create one).");
map[curmap].selecteditem = -1; map[curmap].selecteditem = -1;
@ -239,9 +251,21 @@ int main (int argc, char **argv) {
sprintf(statustext, "Size match mode aborted."); sprintf(statustext, "Size match mode aborted.");
drawstatusbar(); drawstatusbar();
} else { } else {
int n;
/* resize selected item to match one which was clicked */ /* resize selected item to match one which was clicked */
map[curmap].obj[map[curmap].selecteditem].w = map[curmap].obj[o].w; map[curmap].obj[map[curmap].selecteditem].w = map[curmap].obj[o].w;
map[curmap].obj[map[curmap].selecteditem].h = map[curmap].obj[o].h; map[curmap].obj[map[curmap].selecteditem].h = map[curmap].obj[o].h;
/* adjust offsets on all links to/from object */
for (n = 0; n < map[curmap].numlinks; n++) {
if (map[curmap].olink[n].srcobj == map[curmap].selecteditem) {
map[curmap].olink[n].srcxoff = (map[curmap].obj[o].w / 2);
map[curmap].olink[n].srcyoff = (map[curmap].obj[o].h / 2);
}
if (map[curmap].olink[n].dstobj == map[curmap].selecteditem) {
map[curmap].olink[n].dstxoff = (map[curmap].obj[o].w / 2);
map[curmap].olink[n].dstyoff = (map[curmap].obj[o].h / 2);
}
}
changestate(S_NONE); changestate(S_NONE);
sprintf(statustext, "Object #%d resized to match object #%d.",map[curmap].selecteditem,o); sprintf(statustext, "Object #%d resized to match object #%d.",map[curmap].selecteditem,o);
drawmap(); drawmap();
@ -436,7 +460,7 @@ int main (int argc, char **argv) {
tempx = (event.button.x - obox.x) / obox.gridsize; tempx = (event.button.x - obox.x) / obox.gridsize;
tempy = (event.button.y - obox.y) / obox.gridsize; tempy = (event.button.y - obox.y) / obox.gridsize;
map[curmap].selectedtype = tempy*obox.gridrowlen + tempx; map[curmap].selectedtype = tempy*obox.gridrowlen + tempx + (obox.pos*3);
if (map[curmap].selectedtype >= numobjtypes) map[curmap].selectedtype = numobjtypes-1; if (map[curmap].selectedtype >= numobjtypes) map[curmap].selectedtype = numobjtypes-1;
sprintf(statustext,"Object type '%s' selected.\n",objtype[map[curmap].selectedtype].name); sprintf(statustext,"Object type '%s' selected.\n",objtype[map[curmap].selectedtype].name);
drawstatusbar(); drawstatusbar();
@ -755,6 +779,26 @@ int main (int argc, char **argv) {
changestate(S_LOADING); changestate(S_LOADING);
drawmap(); drawmap();
} }
if ((c == ',') || (c == 'q')) { /* scroll object box up */
if (obox.pos > 0) {
obox.pos--;
drawobox();
}
}
if ((c == '.') || (c == 'w')) { /* scroll object box down */
int fitx,fity,fit;
/* figure out how many objects we can fit in the box */
fitx = (obox.width / obox.gridsize);
fity = ((obox.height+3) / obox.gridsize);
fit = fitx * fity;
/* check if incrementing position is okay or not */
if (((obox.pos+1)*3 + fit) <= (numobjtypes+2)) {
obox.pos++;
drawobox();
}
}
if (c == 'x') { if (c == 'x') {
if (map[curmap].selecteditem != -1) { if (map[curmap].selecteditem != -1) {
if (map[curmap].selecteditemtype == T_OBJECT) { if (map[curmap].selecteditemtype == T_OBJECT) {
@ -771,6 +815,14 @@ int main (int argc, char **argv) {
} }
} }
} }
if (c == 'b') {
if (map[curmap].selecteditem != -1) {
if (map[curmap].selecteditemtype == T_OBJECT) {
changestate(S_MATCHSIZE);
drawmap();
}
}
}
if (c == 'd') { /* drill down */ if (c == 'd') { /* drill down */
if (state == S_NONE) { if (state == S_NONE) {
if ((map[curmap].selecteditemtype == T_OBJECT) && (map[curmap].selecteditem != -1)) { if ((map[curmap].selecteditemtype == T_OBJECT) && (map[curmap].selecteditem != -1)) {
@ -857,7 +909,9 @@ void addlinkpoint(int linkid, int x, int y) {
sprintf(statustext, "Point added to link #%d",linkid); sprintf(statustext, "Point added to link #%d",linkid);
} }
void addvector(vectorimg_t *vimg, int type, int x1, int y1, int x2, int y2, SDL_Color *c) { int addvector(vectorimg_t *vimg, int type, int x1, int y1, int x2, int y2, SDL_Color *c) {
if ((vimg->vnum + 1) >= MAXVECTORSPERIMAGE) return TRUE;
vimg->vector[vimg->vnum].type = type; vimg->vector[vimg->vnum].type = type;
vimg->vector[vimg->vnum].x1 = x1; vimg->vector[vimg->vnum].x1 = x1;
vimg->vector[vimg->vnum].y1 = y1; vimg->vector[vimg->vnum].y1 = y1;
@ -867,6 +921,8 @@ void addvector(vectorimg_t *vimg, int type, int x1, int y1, int x2, int y2, SDL_
vimg->vector[vimg->vnum].c.g = c->g; vimg->vector[vimg->vnum].c.g = c->g;
vimg->vector[vimg->vnum].c.b = c->b; vimg->vector[vimg->vnum].c.b = c->b;
vimg->vnum = vimg->vnum + 1; vimg->vnum = vimg->vnum + 1;
return FALSE;
} }
void changestate(int newstate) { void changestate(int newstate) {
@ -1400,11 +1456,17 @@ void drawobject(SDL_Surface *dest, mapobject_t *o) {
Uint32 bgcol; Uint32 bgcol;
/* create temp surface */ /* create temp surface */
temps = SDL_CreateRGBSurface(SDL_SWSURFACE,o->w, o->h, temps = SDL_CreateRGBSurface(SDL_SWSURFACE,(o->w + 3), (o->h + 3),
screen->format->BitsPerPixel, screen->format->Rmask, screen->format->BitsPerPixel, screen->format->Rmask,
screen->format->Gmask,screen->format->Bmask, screen->format->Gmask,screen->format->Bmask,
screen->format->Amask); screen->format->Amask);
if (temps == NULL) {
printf("temp surface is NULL!\n");
fflush(stdout);
exit(1);
}
bgcol = SDL_MapRGB(temps->format, map[curmap].bgcol.r,map[curmap].bgcol.g,map[curmap].bgcol.b); bgcol = SDL_MapRGB(temps->format, map[curmap].bgcol.r,map[curmap].bgcol.g,map[curmap].bgcol.b);
SDL_FillRect(temps, NULL, bgcol); SDL_FillRect(temps, NULL, bgcol);
@ -1415,6 +1477,9 @@ void drawobject(SDL_Surface *dest, mapobject_t *o) {
SDL_SetColorKey(temps, SDL_SRCCOLORKEY|SDL_RLEACCEL, bgcol); SDL_SetColorKey(temps, SDL_SRCCOLORKEY|SDL_RLEACCEL, bgcol);
/* blit to screen */ /* blit to screen */
/*printf("set area params: x=%d,y=%d w=%d,h=%d x2=%d,y2=%d\n",
o->x, o->y,o->w,o->h,o->x+o->w,o->y+o->h); fflush(stdout);
*/
area.x = o->x; area.x = o->x;
area.y = o->y; area.y = o->y;
area.w = o->w; area.w = o->w;
@ -1513,23 +1578,33 @@ void drawmap(void) {
fillcol = SDL_MapRGB(buffer->format, map[curmap].bgcol.r,map[curmap].bgcol.g,map[curmap].bgcol.b); fillcol = SDL_MapRGB(buffer->format, map[curmap].bgcol.r,map[curmap].bgcol.g,map[curmap].bgcol.b);
SDL_FillRect(buffer, NULL, fillcol); SDL_FillRect(buffer, NULL, fillcol);
/* draw all map[curmap].objects links etc*/ /* draw all objects links etc*/
for (i = 0; i < map[curmap].numthings; i++) { for (i = 0; i < map[curmap].numthings; i++) {
if (map[curmap].thing[i].type == T_OBJECT) { if (map[curmap].thing[i].type == T_OBJECT) {
if (testing) printf("Drawing thing #%d (%d, %s)\n",i,map[curmap].thing[i].id,objtype[map[curmap].obj[map[curmap].thing[i].id].type].name); if (testing) {
printf("Drawing thing #%d (%d, %s)\n",i,map[curmap].thing[i].id,objtype[map[curmap].obj[map[curmap].thing[i].id].type].name);
fflush(stdout);
}
drawobject(buffer, &map[curmap].obj[map[curmap].thing[i].id]); drawobject(buffer, &map[curmap].obj[map[curmap].thing[i].id]);
} else if (map[curmap].thing[i].type == T_LINK) { } else if (map[curmap].thing[i].type == T_LINK) {
if (testing) printf ("Drawing thing #%d (%d, link)\n",i,map[curmap].thing[i].id); if (testing) {
printf ("Drawing thing #%d (%d, link)\n",i,map[curmap].thing[i].id);
fflush(stdout);
}
drawlink(buffer, &map[curmap].olink[map[curmap].thing[i].id]); drawlink(buffer, &map[curmap].olink[map[curmap].thing[i].id]);
} else if (map[curmap].thing[i].type == T_TEXT) { } else if (map[curmap].thing[i].type == T_TEXT) {
if (testing) printf ("Drawing thing #%d (%d, text)\n",i,map[curmap].thing[i].id); if (testing) {
printf ("Drawing thing #%d (%d, text)\n",i,map[curmap].thing[i].id);
fflush(stdout);
}
drawtext(buffer, &map[curmap].textob[map[curmap].thing[i].id]); drawtext(buffer, &map[curmap].textob[map[curmap].thing[i].id]);
} else { } else {
printf("WARNING: Thing #%d has unknown type %d!\n",i,map[curmap].thing[i].type); printf("WARNING: Thing #%d has unknown type %d!\n",i,map[curmap].thing[i].type);
fflush(stdout);
} }
} }
/* highlight the selected map[curmap].object */ /* highlight the selected object */
/* by drawing boxes in its corners */ /* by drawing boxes in its corners */
if (map[curmap].selecteditem != -1) { if (map[curmap].selecteditem != -1) {
if (map[curmap].selecteditemtype == T_OBJECT) { if (map[curmap].selecteditemtype == T_OBJECT) {
@ -1668,8 +1743,10 @@ void drawmap(void) {
/* draw status bar */ /* draw status bar */
drawstatusbar(); drawstatusbar();
/* flip */ /* flip */
SDL_UpdateRect(screen, 0, 0, map[curmap].width, map[curmap].height); SDL_UpdateRect(screen, 0, 0, map[curmap].width, map[curmap].height);
} }
void drawstatusbar(void) { void drawstatusbar(void) {
@ -1877,6 +1954,8 @@ void drawobox(void) {
mapobject_t temp; mapobject_t temp;
Uint32 fillcol; Uint32 fillcol;
SDL_Color outlinecol; SDL_Color outlinecol;
int outlinepos;
int fitx,fity,fit;
fillcol = SDL_MapRGB(screen->format, obox.bgcol.r,obox.bgcol.g,obox.bgcol.b); fillcol = SDL_MapRGB(screen->format, obox.bgcol.r,obox.bgcol.g,obox.bgcol.b);
area.x = obox.x; area.x = obox.x;
@ -1888,7 +1967,14 @@ void drawobox(void) {
x = obox.x; x = obox.x;
y = obox.y; y = obox.y;
for (i = 0; i < numobjtypes; i++) {
/* calculate how many items we can fit in the obox */
/* figure out how many objects we can fit in the box */
fitx = (obox.width / obox.gridsize);
fity = ((obox.height+3) / obox.gridsize);
fit = fitx * fity;
for (i = (obox.pos*3); i < numobjtypes; i++) {
if ((x + obox.gridsize) >= (map[curmap].width + SIDEBARW)) { if ((x + obox.gridsize) >= (map[curmap].width + SIDEBARW)) {
x = obox.x; x = obox.x;
if ((y + obox.gridsize) >= (map[curmap].height)) { if ((y + obox.gridsize) >= (map[curmap].height)) {
@ -1924,15 +2010,20 @@ void drawobox(void) {
} }
/* oooo */
/* draw selector */ /* draw selector */
outlinecol = red; outlinecol = red;
y = (map[curmap].selectedtype / obox.gridrowlen) * obox.gridsize + obox.y; outlinepos = map[curmap].selectedtype - (obox.pos*3);
x = (map[curmap].selectedtype % obox.gridrowlen) * obox.gridsize + obox.x;
drawline(screen, x, y,x+obox.gridsize,y,outlinecol); /* top */ if ((outlinepos >= 0) && (outlinepos < fit)) {
drawline(screen, x, y+obox.gridsize,x+obox.gridsize,y+obox.gridsize,outlinecol); /* bottom */ y = ((map[curmap].selectedtype - (obox.pos*3)) / obox.gridrowlen) * obox.gridsize + obox.y;
drawline(screen, x, y,x,y+obox.gridsize,outlinecol); /* left */ x = ((map[curmap].selectedtype - (obox.pos*3)) % obox.gridrowlen) * obox.gridsize + obox.x;
drawline(screen, x+obox.gridsize, y,x+obox.gridsize,y+obox.gridsize,outlinecol); /* right */
drawline(screen, x, y,x+obox.gridsize,y,outlinecol); /* top */
drawline(screen, x, y+obox.gridsize,x+obox.gridsize,y+obox.gridsize,outlinecol); /* bottom */
drawline(screen, x, y,x,y+obox.gridsize,outlinecol); /* left */
drawline(screen, x+obox.gridsize, y,x+obox.gridsize,y+obox.gridsize,outlinecol); /* right */
}
//SDL_UpdateRect(screen, x, y, obox.gridsize+1,obox.gridsize+1); //SDL_UpdateRect(screen, x, y, obox.gridsize+1,obox.gridsize+1);
@ -2438,6 +2529,7 @@ int linkat(int x, int y) {
return -1; return -1;
} }
int loadmap(void) { int loadmap(void) {
char filename[BUFLEN]; char filename[BUFLEN];
FILE *f; FILE *f;
@ -2491,7 +2583,7 @@ int loadmap(void) {
/* read objects */ /* read objects */
fread(&map[i].thing, sizeof(thing_t), map[i].numthings, f); fread(&map[i].thing, sizeof(thing_t), map[i].numthings, f);
fread(&map[i].olink, sizeof(link_t), map[i].numlinks, f); fread(&map[i].olink, sizeof(link_t), map[i].numlinks, f);
fread(&map[i].obj, sizeof(object_t), map[i].numobjects, f); fread(&map[i].obj, sizeof(mapobject_t), map[i].numobjects, f);
fread(&map[i].textob, sizeof(text_t), map[i].numtext, f); fread(&map[i].textob, sizeof(text_t), map[i].numtext, f);
} }
@ -2677,7 +2769,7 @@ int initgraphics(void) {
int x1,x2,y1,y2; int x1,x2,y1,y2;
SDL_Color c; SDL_Color c;
if(SDL_Init(SDL_INIT_VIDEO)==-1) { if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE)==-1) {
printf("SDL_Init: %s\n", SDL_GetError()); printf("SDL_Init: %s\n", SDL_GetError());
exit(1); exit(1);
} }
@ -2786,16 +2878,20 @@ int initgraphics(void) {
printf("Reading shapes...\n"); printf("Reading shapes...\n");
/* read map[curmap].objects from file */
f = fopen("objects.dat","rt"); f = fopen("objects.dat","rt");
if (!f) { if (!f) {
sprintf(file, "%s/.netmapr/objects.dat",getenv("HOME")); sprintf(file, "/usr/local/share/netmapr/objects.dat");
f = fopen(file,"rt"); f = fopen(file,"rt");
if (!f) {
printf("Cannot open objects file!\n");
exit(1);
}
} }
if (!f) {
sprintf(file, "%s/objects.dat",progdir);
f = fopen(file,"rt");
}
if (!f) {
printf("Cannot open objects file!\n");
exit(1);
}
state = 0; state = 0;
line = 0; line = 0;
numobjtypes = 0; numobjtypes = 0;
@ -2861,7 +2957,11 @@ int initgraphics(void) {
if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); }
c.b = atoi(p); c.b = atoi(p);
addvector(&objtype[numobjtypes].vimg,VT_LINE,x1,y1,x2,y2,&c); if (addvector(&objtype[numobjtypes].vimg,VT_LINE,x1,y1,x2,y2,&c)) {
printf("Too many vectors on line %d of objects file.\n",line);
exit(1);
}
} else if (!strcmp(p, "fill")) { } else if (!strcmp(p, "fill")) {
p = strtok(NULL, " "); p = strtok(NULL, " ");
if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); }
@ -2879,7 +2979,10 @@ int initgraphics(void) {
if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); }
c.b = atoi(p); c.b = atoi(p);
addvector(&objtype[numobjtypes].vimg,VT_FILL,x1,y1,0,0,&c); if (addvector(&objtype[numobjtypes].vimg,VT_FILL,x1,y1,0,0,&c)) {
printf("Too many vectors on line %d of objects file.\n",line);
exit(1);
}
} else if (!strcmp(p, "box")) { } else if (!strcmp(p, "box")) {
p = strtok(NULL, " "); p = strtok(NULL, " ");
if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); }
@ -2903,7 +3006,10 @@ int initgraphics(void) {
if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of objects file.\n",line); exit(1); }
c.b = atoi(p); c.b = atoi(p);
addvector(&objtype[numobjtypes].vimg,VT_BOX,x1,y1,x2,y2,&c); if (addvector(&objtype[numobjtypes].vimg,VT_BOX,x1,y1,x2,y2,&c)) {
printf("Too many vectors on line %d of objects file.\n",line);
exit(1);
}
} else if (!strcmp(p, "end")) { } else if (!strcmp(p, "end")) {
state = 0; state = 0;
numobjtypes++; numobjtypes++;
@ -2926,18 +3032,21 @@ int initgraphics(void) {
fclose(f); fclose(f);
printf("Shape load complete - %d objects found.\n",numobjtypes); printf("Shape load complete - %d objects found.\n",numobjtypes);
/* read in button images */
printf("Reading buttons...\n"); printf("Reading buttons...\n");
/* read buttons from file */
f = fopen("buttons.dat","rt"); f = fopen("buttons.dat","rt");
if (!f) { if (!f) {
sprintf(file, "%s/.netmapr/buttons.dat",getenv("HOME")); sprintf(file, "/usr/local/share/netmapr/buttons.dat");
f = fopen(file,"rt"); f = fopen(file,"rt");
if (!f) {
printf("Cannot open buttons file!\n");
exit(1);
}
} }
if (!f) {
sprintf(file, "%s/buttons.dat",progdir);
f = fopen(file,"rt");
}
if (!f) {
printf("Cannot open buttons file!\n");
exit(1);
}
state = 0; state = 0;
line = 0; line = 0;
numbuttons = 0; numbuttons = 0;
@ -3005,7 +3114,10 @@ int initgraphics(void) {
if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); }
c.b = atoi(p); c.b = atoi(p);
addvector(&tempv,VT_LINE,x1,y1,x2,y2,&c); if (addvector(&tempv,VT_LINE,x1,y1,x2,y2,&c)) {
printf("Too many vectors on line %d of objects file.\n",line);
exit(1);
}
} else if (!strcmp(p, "fill")) { } else if (!strcmp(p, "fill")) {
p = strtok(NULL, " "); p = strtok(NULL, " ");
if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); }
@ -3023,7 +3135,10 @@ int initgraphics(void) {
if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); }
c.b = atoi(p); c.b = atoi(p);
addvector(&tempv,VT_FILL,x1,y1,0,0,&c); if (addvector(&tempv,VT_FILL,x1,y1,0,0,&c)) {
printf("Too many vectors on line %d of objects file.\n",line);
exit(1);
}
} else if (!strcmp(p, "box")) { } else if (!strcmp(p, "box")) {
p = strtok(NULL, " "); p = strtok(NULL, " ");
if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); }
@ -3047,7 +3162,10 @@ int initgraphics(void) {
if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of buttons file.\n",line); exit(1); }
c.b = atoi(p); c.b = atoi(p);
addvector(&tempv,VT_BOX,x1,y1,x2,y2,&c); if (addvector(&tempv,VT_BOX,x1,y1,x2,y2,&c)) {
printf("Too many vectors on line %d of buttons file.\n",line);
exit(1);
}
} else if (!strcmp(p, "end")) { } else if (!strcmp(p, "end")) {
/* draw vector image into button's bitmap field */ /* draw vector image into button's bitmap field */
drawvector(button[numbuttons].img, &tempv, 1, 1, toolbox.gridsize-2,toolbox.gridsize-2, NULL); drawvector(button[numbuttons].img, &tempv, 1, 1, toolbox.gridsize-2,toolbox.gridsize-2, NULL);
@ -3071,18 +3189,21 @@ int initgraphics(void) {
fclose(f); fclose(f);
printf("Button load complete - %d buttons found.\n",numbuttons); printf("Button load complete - %d buttons found.\n",numbuttons);
/* read in letter images */
printf("Reading letters...\n"); printf("Reading letters...\n");
/* read letters from file */
f = fopen("letters.dat","rt"); f = fopen("letters.dat","rt");
if (!f) { if (!f) {
sprintf(file, "%s/.netmapr/letters.dat",getenv("HOME")); sprintf(file, "/usr/local/share/netmapr/letters.dat");
f = fopen(file,"rt"); f = fopen(file,"rt");
if (!f) {
printf("Cannot open letters file!\n");
exit(1);
}
} }
if (!f) {
sprintf(file, "%s/letters.dat",progdir);
f = fopen(file,"rt");
}
if (!f) {
printf("Cannot open letters file!\n");
exit(1);
}
state = 0; state = 0;
line = 0; line = 0;
numletters = 0; numletters = 0;
@ -3137,7 +3258,10 @@ int initgraphics(void) {
c = fgcol; c = fgcol;
addvector(&letter[numletters].vect,VT_LINE,x1,y1,x2,y2,&c); if (addvector(&letter[numletters].vect,VT_LINE,x1,y1,x2,y2,&c)) {
printf("Too many vectors on line %d of letters file.\n",line);
exit(1);
}
} else if (!strcmp(p, "fill")) { } else if (!strcmp(p, "fill")) {
p = strtok(NULL, " "); p = strtok(NULL, " ");
if (p == NULL) { printf("Missing token on line #%d of letters file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of letters file.\n",line); exit(1); }
@ -3148,7 +3272,10 @@ int initgraphics(void) {
c = fgcol; c = fgcol;
addvector(&letter[numletters].vect,VT_FILL,x1,y1,0,0,&c); if (addvector(&letter[numletters].vect,VT_FILL,x1,y1,0,0,&c)) {
printf("Too many vectors on line %d of letters file.\n",line);
exit(1);
}
} else if (!strcmp(p, "box")) { } else if (!strcmp(p, "box")) {
p = strtok(NULL, " "); p = strtok(NULL, " ");
if (p == NULL) { printf("Missing token on line #%d of letters file.\n",line); exit(1); } if (p == NULL) { printf("Missing token on line #%d of letters file.\n",line); exit(1); }
@ -3165,7 +3292,10 @@ int initgraphics(void) {
c = fgcol; c = fgcol;
addvector(&letter[numletters].vect,VT_BOX,x1,y1,x2,y2,&c); if (addvector(&letter[numletters].vect,VT_BOX,x1,y1,x2,y2,&c)) {
printf("Too many vectors on line %d of letters file.\n",line);
exit(1);
}
} else if (!strcmp(p, "end")) { } else if (!strcmp(p, "end")) {
//printf("Adding letter %d: '%c' (vnum = %d).\n",numletters,letter[numletters].name,letter[numletters].vect.vnum); //printf("Adding letter %d: '%c' (vnum = %d).\n",numletters,letter[numletters].name,letter[numletters].vect.vnum);
@ -3608,7 +3738,7 @@ int savemap(void) {
/* write objects */ /* write objects */
fwrite(&map[i].thing, sizeof(thing_t), map[i].numthings, f); fwrite(&map[i].thing, sizeof(thing_t), map[i].numthings, f);
fwrite(&map[i].olink, sizeof(link_t), map[i].numlinks, f); fwrite(&map[i].olink, sizeof(link_t), map[i].numlinks, f);
fwrite(&map[i].obj, sizeof(object_t), map[i].numobjects, f); fwrite(&map[i].obj, sizeof(mapobject_t), map[i].numobjects, f);
fwrite(&map[i].textob, sizeof(text_t), map[i].numtext, f); fwrite(&map[i].textob, sizeof(text_t), map[i].numtext, f);
} }

View File

@ -150,7 +150,7 @@ map_t map[MAXMAPS];
void addlinkpoint(int linkid, int x, int y); void addlinkpoint(int linkid, int x, int y);
void addvector(vectorimg_t *vimg, int type, int x1, int y1, int x2, int y2, SDL_Color *c); int addvector(vectorimg_t *vimg, int type, int x1, int y1, int x2, int y2, SDL_Color *c);
void changestate(int newstate); void changestate(int newstate);
void cleanup(void); void cleanup(void);
int createobject(int type, int x, int y); int createobject(int type, int x, int y);

View File

@ -1,55 +1,152 @@
object router 120 120 object router3d 200 200
# outline # top left
line 0 40 40 0 0 0 0 line 0 50 0 38 170 230 255
line 40 0 80 0 0 0 0 line 0 38 10 26 170 230 255
line 80 0 119 40 0 0 0 line 10 26 30 14 170 230 255
line 119 40 119 80 0 0 0 line 30 14 60 0 170 230 255
line 119 80 80 119 0 0 0 line 60 0 100 0 170 230 255
line 80 119 40 119 0 0 0 # bottom left
line 40 119 0 80 0 0 0 line 0 50 0 62 170 230 255
line 0 80 0 40 0 0 0 line 0 62 10 74 170 230 255
line 10 74 30 86 170 230 255
line 30 86 60 99 170 230 255
line 60 99 100 99 170 230 255
# top right
line 199 50 199 38 170 230 255
line 199 38 190 26 170 230 255
line 190 26 170 14 170 230 255
line 170 14 140 0 170 230 255
line 140 0 100 0 170 230 255
# bottom right
line 199 50 199 62 170 230 255
line 199 62 190 74 170 230 255
line 190 74 170 86 170 230 255
line 170 86 140 99 170 230 255
line 140 99 100 99 170 230 255
# fill top
fill 100 50 0 180 255
# bottom half - sides
line 0 50 0 162 170 230 255
line 199 50 199 150 170 230 255
# bottom half - bottom left
# next line not being drawn on windows??
line 0 150 0 112 170 230 255
line 0 162 10 174 170 230 255
line 10 174 30 186 170 230 255
line 30 186 60 199 170 230 255
line 60 199 100 199 170 230 255
# bottom half - bottom right
line 199 150 199 162 170 230 255
line 199 162 190 174 170 230 255
line 190 174 170 186 170 230 255
line 170 186 140 199 170 230 255
line 140 199 100 199 170 230 255
# fill bottom half
fill 100 162 0 120 170
# arrows # arrows
line 30 30 50 50 0 0 0 # top left arrow
line 89 30 69 50 0 0 0 line 35 25 65 40 0 0 0
line 89 89 69 69 0 0 0 line 55 15 85 30 0 0 0
line 30 89 50 69 0 0 0 line 35 25 55 15 0 0 0
# arrowheads # arrowhead /____
line 50 50 40 50 0 0 0 line 55 47 65 40 0 0 0
line 50 50 50 40 0 0 0 line 55 47 90 47 0 0 0
# arrowhead /|
line 95 20 90 47 0 0 0
line 95 20 85 30 0 0 0
# fill it
fill 60 30 250 250 250
#
#
# bottom left arrow
line 95 65 65 80 0 0 0
line 75 55 45 70 0 0 0
line 95 65 75 55 0 0 0
# arrowhead /____
line 75 87 65 80 0 0 0
line 75 87 40 87 0 0 0
# arrowhead /|
line 45 60 40 87 0 0 0
line 45 60 45 70 0 0 0
# fill it
fill 70 70 250 250 250
# top right arrow
line 110 40 140 25 0 0 0
line 130 50 160 35 0 0 0
line 110 40 130 50 0 0 0
# arrowhead /____
line 130 18 140 25 0 0 0
line 130 18 165 18 0 0 0
# arrowhead /|
line 160 45 165 18 0 0 0
line 160 45 160 35 0 0 0
# fill it
fill 135 35 250 250 250
# bottom right arrow
line 165 80 135 65 0 0 0
line 145 90 115 75 0 0 0
# joining
line 165 80 145 90 0 0 0
# arrowhead /____
line 145 58 135 65 0 0 0
line 145 58 110 58 0 0 0
# arrowhead /|
line 115 85 110 58 0 0 0
line 115 85 115 75 0 0 0
# fill it
fill 140 75 250 250 250
# #
line 89 30 79 30 0 0 0
line 89 30 89 40 0 0 0
# #
line 69 69 79 69 0 0 0
line 69 69 69 79 0 0 0
# #
line 30 89 40 89 0 0 0
line 30 89 30 79 0 0 0
# fill in with blue
fill 20 40 0 175 254
end end
object firewall 120 120 object fw3d 60 140
# outline # front of wall
line 0 0 119 0 0 0 0 box 0 20 30 139 199 199 199
line 119 0 119 119 0 0 0 # right side
line 0 0 0 119 0 0 0 line 30 20 59 0 199 199 199
line 0 119 119 119 0 0 0 line 59 0 59 120 199 199 199
# fill line 30 139 59 120 199 199 199
fill 20 20 255 0 0 # top of wall
# horizontal mortar lines line 0 20 30 0 199 199 199
line 0 30 119 30 0 0 0 line 30 0 59 0 199 199 199
line 0 60 119 60 0 0 0 # fill with red
line 0 90 119 90 0 0 0 # front
# vertical mortar lines - top fill 10 50 170 0 0
line 60 0 60 30 0 0 0 # right
# vertical mortar lines - second top fill 50 50 119 0 0
line 30 30 30 60 0 0 0 # top
line 90 30 90 60 0 0 0 fill 30 10 255 85 93
# vertical mortar lines - second bottom # horiz. mortar lines - front
line 60 60 60 90 0 0 0 line 0 40 30 40 199 199 199
# vertical mortar lines - bottom line 0 60 30 60 199 199 199
line 30 90 30 119 0 0 0 line 0 80 30 80 199 199 199
line 90 90 90 119 0 0 0 line 0 100 30 100 199 199 199
line 0 120 30 120 199 199 199
# horiz. mortar lines - side
line 30 40 59 20 170 170 170
line 30 60 59 40 170 170 170
line 30 80 59 60 170 170 170
line 30 100 59 80 170 170 170
line 30 120 59 100 170 170 170
# vert. mortar lines - front
line 10 20 10 40 199 199 199
line 20 40 20 60 199 199 199
line 10 60 10 80 199 199 199
line 20 80 20 100 199 199 199
line 10 100 10 120 199 199 199
line 20 120 20 140 199 199 199
# vert. mortar lines - top
line 10 20 40 0 227 227 227
# horiz. mortar lines - top
line 20 13 40 13 227 227 227
line 20 7 30 7 227 227 227
# vert. mortar lines - side
line 40 13 40 33 170 170 170
line 50 27 50 46 170 170 170
line 40 53 40 73 170 170 170
line 50 67 50 86 170 170 170
line 40 93 40 113 170 170 170
line 50 107 50 126 170 170 170
end end
object switch 120 120 object switch 120 120
# outline # outline
@ -216,32 +313,6 @@ fill 57 55 255 0 0
fill 82 55 255 0 0 fill 82 55 255 0 0
fill 106 55 255 0 0 fill 106 55 255 0 0
end end
object floppy 120 120
# border
box 10 10 109 109 0 0 0
# hole
line 15 15 20 15 0 0 0
line 15 15 15 20 0 0 0
line 15 20 20 20 0 0 0
line 20 15 20 20 0 0 0
# border fill
fill 50 50 0 0 255
# label
line 30 10 30 50 0 0 0
line 30 50 89 50 0 0 0
line 89 10 89 50 0 0 0
fill 50 30 210 190 130
# metal bit
line 35 109 35 80 0 0 0
line 35 80 84 80 0 0 0
line 84 80 84 109 0 0 0
#
line 50 109 50 90 0 0 0
line 50 90 60 90 0 0 0
line 60 90 60 109 0 0 0
# fill metal bit
fill 80 100 200 200 200
end
object printer 120 120 object printer 120 120
# outline # outline
box 40 30 119 119 0 0 0 box 40 30 119 119 0 0 0
@ -283,7 +354,7 @@ line 65 55 100 15 0 0 0
line 100 15 98 25 0 0 0 line 100 15 98 25 0 0 0
line 100 15 96 13 0 0 0 line 100 15 96 13 0 0 0
end end
object switchrouter 120 120 object layer3switch 135 135
# outside border # outside border
box 0 0 119 119 0 0 0 box 0 0 119 119 0 0 0
# router # router
@ -322,3 +393,38 @@ line 66 73 109 50 250 250 250
line 66 88 109 109 250 250 250 line 66 88 109 109 250 250 250
line 54 73 10 50 250 250 250 line 54 73 10 50 250 250 250
end end
object firewall 120 120
# outline
line 0 0 119 0 0 0 0
line 119 0 119 119 0 0 0
line 0 0 0 119 0 0 0
line 0 119 119 119 0 0 0
# fill
fill 20 20 255 0 0
# horizontal mortar lines
line 0 30 119 30 0 0 0
line 0 60 119 60 0 0 0
line 0 90 119 90 0 0 0
# vertical mortar lines - top
line 60 0 60 30 0 0 0
# vertical mortar lines - second top
line 30 30 30 60 0 0 0
line 90 30 90 60 0 0 0
# vertical mortar lines - second bottom
line 60 60 60 90 0 0 0
# vertical mortar lines - bottom
line 30 90 30 119 0 0 0
line 90 90 90 119 0 0 0
end
object redbox 120 120
box 0 0 119 119 0 0 0
fill 50 50 255 0 0
end
object greenbox 120 120
box 0 0 119 119 0 0 0
fill 50 50 0 255 0
end
object bluebox 120 120
box 0 0 119 119 0 0 0
fill 50 50 0 0 255
end