From 2bde06a2afea844250e348d06421f19ec703993d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 17 Feb 2010 17:49:19 +0100 Subject: [PATCH 1/2] Added veinlook, linux SHM produces less spam messages. Veinlook is a tool that allows looking at the map and the different vein types it contains. This adds ncurses as a dependency on Linux. --- examples/CMakeLists.txt | 9 +- examples/veinlook.cpp | 599 +++++++++++++++++++++++++++++++++++++++ library/DFHackAPI.cpp | 3 +- library/DFTypes.h | 8 + shmserver/shms-linux.cpp | 2 +- 5 files changed, 618 insertions(+), 3 deletions(-) create mode 100644 examples/veinlook.cpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index e7c21d9fb..e5e133580 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -42,6 +42,12 @@ TARGET_LINK_LIBRARIES(dfitemdump dfhack) ADD_EXECUTABLE(dfdigger digger.cpp) TARGET_LINK_LIBRARIES(dfdigger dfhack) +IF(UNIX) + # veinlook - look at the map... sort of + ADD_EXECUTABLE(dfveinlook veinlook.cpp) + TARGET_LINK_LIBRARIES(dfveinlook dfhack ncurses) +ENDIF(UNIX) + # renamer - change the custom names and professions of creatures, sends keys to df directly ADD_EXECUTABLE(dfrenamer renamer.cpp) TARGET_LINK_LIBRARIES(dfrenamer dfhack) @@ -58,6 +64,7 @@ dfmaterialtest dfposition dfrenamer dfsuspend +dfveinlook RUNTIME DESTINATION bin ) -ENDIF(UNIX) \ No newline at end of file +ENDIF(UNIX) diff --git a/examples/veinlook.cpp b/examples/veinlook.cpp new file mode 100644 index 000000000..8e3ec3527 --- /dev/null +++ b/examples/veinlook.cpp @@ -0,0 +1,599 @@ +// produces a list of vein materials available on the map. can be run with '-a' modifier to show even unrevealed minerals deep underground +// with -b modifier, it will show base layer materials too + +// TODO: use material colors to make the output prettier +// TODO: needs the tiletype filter! +// TODO: tile override materials +// TODO: material types, trees, ice, constructions +// TODO: GUI +/* + +int main (int argc, const char* argv[]) +{ + + bool showhidden = false; + bool showbaselayers = false; + for(int i = 0; i < argc; i++) + { + string test = argv[i]; + if(test == "-a") + { + showhidden = true; + } + else if(test == "-b") + { + showbaselayers = true; + } + else if(test == "-ab" || test == "-ba") + { + showhidden = true; + showbaselayers = true; + } + } + // let's be more useful when double-clicked on windows + #ifndef LINUX_BUILD + showhidden = true; + #endif + uint32_t x_max,y_max,z_max; + uint16_t tiletypes[16][16]; + DFHack::t_designation designations[16][16]; + uint8_t regionoffsets[16]; + map materials; + materials.clear(); + vector stonetypes; + vector< vector > layerassign; + + // init the API + DFHack::API DF("Memory.xml"); + + // attach + if(!DF.Attach()) + { + cerr << "DF not found" << endl; + return 1; + } + + // init the map + DF.InitMap(); + DF.getSize(x_max,y_max,z_max); + + // get stone matgloss mapping + if(!DF.ReadStoneMatgloss(stonetypes)) + { + //DF.DestroyMap(); + cerr << "Can't get the materials." << endl; + return 1; + } + + // get region geology + if(!DF.ReadGeology( layerassign )) + { + cerr << "Can't get region geology." << endl; + return 1; + } + + int16_t tempvein [16][16]; + vector veins; + // walk the map! + for(uint32_t x = 0; x< x_max;x++) + { + for(uint32_t y = 0; y< y_max;y++) + { + for(uint32_t z = 0; z< z_max;z++) + { + if(!DF.isValidBlock(x,y,z)) + continue; + + // read data + DF.ReadTileTypes(x,y,z, (uint16_t *) tiletypes); + DF.ReadDesignations(x,y,z, (uint32_t *) designations); + + memset(tempvein, -1, sizeof(tempvein)); + veins.clear(); + DF.ReadVeins(x,y,z,veins); + + if(showbaselayers) + { + DF.ReadRegionOffsets(x,y,z, regionoffsets); + // get the layer materials + for(uint32_t xx = 0;xx<16;xx++) + { + for (uint32_t yy = 0; yy< 16;yy++) + { + tempvein[xx][yy] = + layerassign + [regionoffsets[designations[xx][yy].bits.biome]] + [designations[xx][yy].bits.geolayer_index]; + } + } + } + + // for each vein + for(int i = 0; i < (int)veins.size();i++) + { + //iterate through vein rows + for(uint32_t j = 0;j<16;j++) + { + //iterate through the bits + for (uint32_t k = 0; k< 16;k++) + { + // and the bit array with a one-bit mask, check if the bit is set + bool set = !!(((1 << k) & veins[i].assignment[j]) >> k); + if(set) + { + // store matgloss + tempvein[k][j] = veins[i].type; + } + } + } + } + // count the material types + for(uint32_t xi = 0 ; xi< 16 ; xi++) + { + for(uint32_t yi = 0 ; yi< 16 ; yi++) + { + // hidden tiles are ignored unless '-a' is provided on the command line + // non-wall tiles are ignored + if( (designations[xi][yi].bits.hidden && !showhidden) || !DFHack::isWallTerrain(tiletypes[xi][yi])) + continue; + if(tempvein[xi][yi] < 0) + continue; + + if(materials.count(tempvein[xi][yi])) + { + materials[tempvein[xi][yi]] += 1; + } + else + { + materials[tempvein[xi][yi]] = 1; + } + } + } + } + } + } + // print report + map::iterator p; + for(p = materials.begin(); p != materials.end(); p++) + { + cout << stonetypes[p->first].id << " : " << p->second << endl; + } + DF.Detach(); + #ifndef LINUX_BUILD + cout << "Done. Press any key to continue" << endl; + cin.ignore(); + #endif + return 0; +} +*/ +#include +#include // for memset +#include +#include +#include +#include +using namespace std; + +#include +#include +#include +#include +using namespace DFHack; +#include +#include +#include + +string error; + +static void finish(int sig); + +int gotoxy(int x, int y) +{ + wmove(stdscr, y , x ); + return 0; +} + +int putch(int x, int y, int znak, int color) +{ + attron(COLOR_PAIR(color)); + mvwaddch(stdscr, y, x, znak); + attroff(COLOR_PAIR(color)); +} +/* + enum TileClass + { + EMPTY, + + WALL, + PILLAR, + FORTIFICATION, + + STAIR_UP, + STAIR_DOWN, + STAIR_UPDOWN, + + RAMP, + + FLOOR, + TREE_DEAD, + TREE_OK, + SAPLING_DEAD, + SAPLING_OK, + SHRUB_DEAD, + SHRUB_OK, + BOULDER, + PEBBLES + };*/ + +int puttile(int x, int y, int tiletype, int color) +{ + unsigned int znak; + switch(tileTypeTable[tiletype].c) + { + case EMPTY: + znak = ' '; + break; + case WALL: + case FORTIFICATION: + znak = '#'; + break; + case PILLAR: + znak = 'O'; + break; + case STAIR_DOWN: + znak = '>'; + break; + case STAIR_UP: + znak = '<'; + break; + case STAIR_UPDOWN: + znak = '='; + break; + case RAMP: + znak = '^'; + break; + case FLOOR: + znak = '.'; + break; + case TREE_DEAD: + case TREE_OK: + znak= 'Y'; + break; + case SAPLING_DEAD: + case SAPLING_OK: + znak= 'i'; + break; + case SHRUB_DEAD: + case SHRUB_OK: + znak= 'o'; + break; + case BOULDER: + case PEBBLES: + znak= '*'; + break; + } +// wechochar(stdscr,znak); + attron(COLOR_PAIR(color)); + mvwaddch(stdscr, y, x, znak); + attroff(COLOR_PAIR(color)); +} + +int cprintf(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int i = vwprintw(stdscr,fmt, ap); + va_end(ap); + return i; +} + +void clrscr() +{ + wbkgd(stdscr, COLOR_PAIR(COLOR_BLACK)); + wclear(stdscr); +} + + +/* + enum TileMaterial + { + AIR, + SOIL, + STONE, + FEATSTONE, // whatever it is + OBSIDIAN, + + VEIN, + ICE, + GRASS, + GRASS2, + GRASS_DEAD, + GRASS_DRY, +#include +#include + DRIFTWOOD, + HFS, + MAGMA, + CAMPFIRE, + FIRE, + ASHES, + CONSTRUCTED + }; +*/ +int pickColor(int tiletype) +{ + switch(tileTypeTable[tiletype].m) + { + case AIR: + return COLOR_BLACK; + case STONE: + case FEATSTONE: + case OBSIDIAN: + case CONSTRUCTED: + case ASHES: + default: + return COLOR_WHITE; + case SOIL: + case GRASS_DEAD: + case GRASS_DRY: + case DRIFTWOOD: + return COLOR_YELLOW; + case ICE: + return COLOR_CYAN; + case VEIN: + return COLOR_MAGENTA; + case GRASS: + case GRASS2: + return COLOR_GREEN; + case HFS: + case MAGMA: + case CAMPFIRE: + case FIRE: + return COLOR_RED; + } +} + +string getGCCClassName (Process * p, uint32_t vptr) +{ + int typeinfo = p->readDWord(vptr - 4); + int typestring = p->readDWord(typeinfo + 4); + return p->readCString(typestring); +} + +main(int argc, char *argv[]) +{ + /* initialize your non-curses data structures here */ + + signal(SIGINT, finish); /* arrange interrupts to terminate */ + + initscr(); /* initialize the curses library */ + keypad(stdscr, TRUE); /* enable keyboard mapping */ + nonl(); /* tell curses not to do NL->CR/NL on output */ + cbreak(); /* take input chars one at a time, no wait for \n */ + noecho(); /* don't echo input */ + //nodelay(stdscr, true); + int wxMax = getmaxx(stdscr); + int wyMax = getmaxy(stdscr); + + keypad(stdscr, TRUE); + scrollok(stdscr, TRUE); + + if (has_colors()) + { + start_color(); + + /* + * Simple color assignment, often all we need. + */ + init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); + init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); + init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK); + init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); + init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); + + init_color(COLOR_CYAN, 700, 700, 700); // lt grey + init_color(COLOR_MAGENTA, 500, 500, 500); // dk grey + init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK); + init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); + init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); + } + + int x_max,y_max,z_max; + uint32_t x_max_a,y_max_a,z_max_a; + uint16_t tiletypes[16][16]; + DFHack::t_designation designations[16][16]; + uint8_t regionoffsets[16]; + map materials; + materials.clear(); + vector stonetypes; + vector< vector > layerassign; + vector veinVector; + + // init the API + DFHack::API DF("Memory.xml"); + + // attach + if(!DF.Attach()) + { + error = "Can't find DF."; + finish(0); + } + + Process* p = DF.getProcess(); + // init the map + DF.InitMap(); + + DF.getSize(x_max_a,y_max_a,z_max_a); + x_max = x_max_a; + y_max = y_max_a; + z_max = z_max_a; + + // get stone matgloss mapping + if(!DF.ReadStoneMatgloss(stonetypes)) + { + error = "Can't read stone types."; + finish(0); + } + + // get region geology + if(!DF.ReadGeology( layerassign )) + { + error = "Can't read local geology."; + finish(0); + } + + + + //int16_t base [16][16]; + //int16_t vein [16][16]; + int cursorX = x_max/2 - 1; + int cursorY = y_max/2 - 1; + int cursorZ = z_max/2 - 1; + int vein = 0; + //int16_t tempvein [16][16]; + // walk the map! + + + for (;;) + { + int c = getch(); /* refresh, accept single keystroke of input */ + clrscr(); + /* process the command keystroke */ + switch(c) + { + case KEY_DOWN: + cursorY ++; + break; + case KEY_UP: + cursorY --; + break; + case KEY_LEFT: + cursorX --; + break; + case KEY_RIGHT: + cursorX ++; + break; + case KEY_NPAGE: + cursorZ --; + break; + case KEY_PPAGE: + cursorZ ++; + break; + case '+': + vein ++; + break; + case '-': + vein --; + break; + default: + break; + } + cursorX = max(cursorX, 0); + cursorY = max(cursorY, 0); + cursorZ = max(cursorZ, 0); + + cursorX = min(cursorX, x_max - 3); + cursorY = min(cursorY, y_max - 3); + cursorZ = min(cursorZ, z_max - 3); + + DF.Suspend(); + for(int i = 0; i < 3; i++) + for(int j = 0; j < 3; j++) + if(DF.isValidBlock(cursorX+i,cursorY+j,cursorZ)) + { + // read data + DF.ReadTileTypes(cursorX+i,cursorY+j,cursorZ, (uint16_t *) tiletypes); + DF.ReadDesignations(cursorX+i,cursorY+j,cursorZ, (uint32_t *) designations); + for(int x = 0; x < 16; x++) + { + for(int y = 0; y < 16; y++) + { + int color = COLOR_BLACK; + color = pickColor(tiletypes[x][y]); + if(designations[x][y].bits.hidden) + { + puttile(x+i*16,y+j*16,tiletypes[x][y], color); + } + else + { + attron(A_STANDOUT); + puttile(x+i*16,y+j*16,tiletypes[x][y], color); + attroff(A_STANDOUT); + } + } + } + if(i == 1 && j == 1) + { + veinVector.clear(); + DF.ReadVeins(cursorX+i,cursorY+j,cursorZ,veinVector); + } + } + gotoxy(0,48); + cprintf("arrow keys, PGUP, PGDN = navigate"); + gotoxy(0,49); + cprintf("+,- = switch vein"); + gotoxy(0,50); + if(vein == veinVector.size()) vein = veinVector.size() - 1; + if(vein < -1) vein = -1; + cprintf("X %d/%d, Y %d/%d, Z %d/%d. Vein %d of %d",cursorX + 1,x_max,cursorY + 1,y_max,cursorZ + 1,z_max,vein+1,veinVector.size()); + if(!veinVector.empty()) + { + if(vein != -1) + { + string str = getGCCClassName(p, veinVector[vein].vtable); + if(str == "34block_square_event_frozen_liquidst") + { + t_frozenliquidvein frozen; + uint32_t size = sizeof(t_frozenliquidvein); + p->read(veinVector[vein].address_of,size,(uint8_t *)&frozen); + for(uint32_t i = 0;i<16;i++) + { + for (uint32_t j = 0; j< 16;j++) + { + int color = COLOR_BLACK; + int tile = frozen.tiles[i][j]; + color = pickColor(tile); + + attron(A_STANDOUT); + puttile(i+16,j+16,tile, color); + attroff(A_STANDOUT); + + } + } + } + else if (str == "28block_square_event_mineralst") + { + //iterate through vein rows + for(uint32_t j = 0;j<16;j++) + { + //iterate through the bits + for (uint32_t k = 0; k< 16;k++) + { + // and the bit array with a one-bit mask, check if the bit is set + bool set = !!(((1 << k) & veinVector[vein].assignment[j]) >> k); + if(set) + { + putch(k+16,j+16,'$',COLOR_RED); + } + } + } + } + gotoxy(0,51); + cprintf("%s, address 0x%x",str.c_str(),veinVector[vein].address_of); + } + } + DF.Resume(); + wrefresh(stdscr); + } + finish(0); /* we're done */ +} + +static void finish(int sig) +{ + endwin(); + if(!error.empty()) + { + cerr << error << endl; + } + exit(0); +} \ No newline at end of file diff --git a/library/DFHackAPI.cpp b/library/DFHackAPI.cpp index 4047fc35b..ecab52de3 100644 --- a/library/DFHackAPI.cpp +++ b/library/DFHackAPI.cpp @@ -321,7 +321,7 @@ bool API::ReadRegionOffsets (uint32_t x, uint32_t y, uint32_t z, uint8_t *buffer bool API::ReadVeins (uint32_t x, uint32_t y, uint32_t z, vector & veins) { uint32_t addr = d->block[x*d->y_block_count*d->z_block_count + y*d->z_block_count + z]; - assert (sizeof (t_vein) == d->veinsize); + //assert (sizeof (t_vein) == d->veinsize); veins.clear(); if (addr && d->veinvector && d->veinsize) { @@ -340,6 +340,7 @@ bool API::ReadVeins (uint32_t x, uint32_t y, uint32_t z, vector & veins uint32_t temp = * (uint32_t *) p_veins[i]; // read the vein data (dereference pointer) g_pProcess->read (temp, d->veinsize, (uint8_t *) &v); + v.address_of = temp; // store it in the vector veins.push_back (v); } diff --git a/library/DFTypes.h b/library/DFTypes.h index c48d0481a..08d49d624 100644 --- a/library/DFTypes.h +++ b/library/DFTypes.h @@ -58,6 +58,14 @@ struct t_vein int16_t assignment[16]; int16_t unknown; uint32_t flags; + uint32_t address_of; // this is NOT part of the DF vein, but an address of the vein as seen by DFhack. +}; + +// stores what tiles should appear when the ice melts +struct t_frozenliquidvein +{ + uint32_t vtable; + int16_t tiles[16][16]; }; struct t_matglossPair diff --git a/shmserver/shms-linux.cpp b/shmserver/shms-linux.cpp index c44b2bf90..0cc18edc8 100644 --- a/shmserver/shms-linux.cpp +++ b/shmserver/shms-linux.cpp @@ -215,7 +215,7 @@ bool isValidSHM() { shmid_ds descriptor; shmctl(shmid, IPC_STAT, &descriptor); - fprintf(stderr,"ID %d, attached: %d\n",shmid, descriptor.shm_nattch); + //fprintf(stderr,"ID %d, attached: %d\n",shmid, descriptor.shm_nattch); return (descriptor.shm_nattch == 2); } uint32_t getPID() From 3193e3c83580dfee05939584ba9e00842958431b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 17 Feb 2010 20:00:55 +0100 Subject: [PATCH 2/2] Fixed segfault in veinlook and cleaned it up. Updated precompiled SHM for Linux. --- examples/veinlook.cpp | 185 +----------------------------------- precompiled/libdfconnect.so | Bin 12403 -> 12403 bytes 2 files changed, 5 insertions(+), 180 deletions(-) diff --git a/examples/veinlook.cpp b/examples/veinlook.cpp index 8e3ec3527..a77f284c1 100644 --- a/examples/veinlook.cpp +++ b/examples/veinlook.cpp @@ -1,171 +1,3 @@ -// produces a list of vein materials available on the map. can be run with '-a' modifier to show even unrevealed minerals deep underground -// with -b modifier, it will show base layer materials too - -// TODO: use material colors to make the output prettier -// TODO: needs the tiletype filter! -// TODO: tile override materials -// TODO: material types, trees, ice, constructions -// TODO: GUI -/* - -int main (int argc, const char* argv[]) -{ - - bool showhidden = false; - bool showbaselayers = false; - for(int i = 0; i < argc; i++) - { - string test = argv[i]; - if(test == "-a") - { - showhidden = true; - } - else if(test == "-b") - { - showbaselayers = true; - } - else if(test == "-ab" || test == "-ba") - { - showhidden = true; - showbaselayers = true; - } - } - // let's be more useful when double-clicked on windows - #ifndef LINUX_BUILD - showhidden = true; - #endif - uint32_t x_max,y_max,z_max; - uint16_t tiletypes[16][16]; - DFHack::t_designation designations[16][16]; - uint8_t regionoffsets[16]; - map materials; - materials.clear(); - vector stonetypes; - vector< vector > layerassign; - - // init the API - DFHack::API DF("Memory.xml"); - - // attach - if(!DF.Attach()) - { - cerr << "DF not found" << endl; - return 1; - } - - // init the map - DF.InitMap(); - DF.getSize(x_max,y_max,z_max); - - // get stone matgloss mapping - if(!DF.ReadStoneMatgloss(stonetypes)) - { - //DF.DestroyMap(); - cerr << "Can't get the materials." << endl; - return 1; - } - - // get region geology - if(!DF.ReadGeology( layerassign )) - { - cerr << "Can't get region geology." << endl; - return 1; - } - - int16_t tempvein [16][16]; - vector veins; - // walk the map! - for(uint32_t x = 0; x< x_max;x++) - { - for(uint32_t y = 0; y< y_max;y++) - { - for(uint32_t z = 0; z< z_max;z++) - { - if(!DF.isValidBlock(x,y,z)) - continue; - - // read data - DF.ReadTileTypes(x,y,z, (uint16_t *) tiletypes); - DF.ReadDesignations(x,y,z, (uint32_t *) designations); - - memset(tempvein, -1, sizeof(tempvein)); - veins.clear(); - DF.ReadVeins(x,y,z,veins); - - if(showbaselayers) - { - DF.ReadRegionOffsets(x,y,z, regionoffsets); - // get the layer materials - for(uint32_t xx = 0;xx<16;xx++) - { - for (uint32_t yy = 0; yy< 16;yy++) - { - tempvein[xx][yy] = - layerassign - [regionoffsets[designations[xx][yy].bits.biome]] - [designations[xx][yy].bits.geolayer_index]; - } - } - } - - // for each vein - for(int i = 0; i < (int)veins.size();i++) - { - //iterate through vein rows - for(uint32_t j = 0;j<16;j++) - { - //iterate through the bits - for (uint32_t k = 0; k< 16;k++) - { - // and the bit array with a one-bit mask, check if the bit is set - bool set = !!(((1 << k) & veins[i].assignment[j]) >> k); - if(set) - { - // store matgloss - tempvein[k][j] = veins[i].type; - } - } - } - } - // count the material types - for(uint32_t xi = 0 ; xi< 16 ; xi++) - { - for(uint32_t yi = 0 ; yi< 16 ; yi++) - { - // hidden tiles are ignored unless '-a' is provided on the command line - // non-wall tiles are ignored - if( (designations[xi][yi].bits.hidden && !showhidden) || !DFHack::isWallTerrain(tiletypes[xi][yi])) - continue; - if(tempvein[xi][yi] < 0) - continue; - - if(materials.count(tempvein[xi][yi])) - { - materials[tempvein[xi][yi]] += 1; - } - else - { - materials[tempvein[xi][yi]] = 1; - } - } - } - } - } - } - // print report - map::iterator p; - for(p = materials.begin(); p != materials.end(); p++) - { - cout << stonetypes[p->first].id << " : " << p->second << endl; - } - DF.Detach(); - #ifndef LINUX_BUILD - cout << "Done. Press any key to continue" << endl; - cin.ignore(); - #endif - return 0; -} -*/ #include #include // for memset #include @@ -272,7 +104,6 @@ int puttile(int x, int y, int tiletype, int color) znak= '*'; break; } -// wechochar(stdscr,znak); attron(COLOR_PAIR(color)); mvwaddch(stdscr, y, x, znak); attroff(COLOR_PAIR(color)); @@ -293,7 +124,6 @@ void clrscr() wclear(stdscr); } - /* enum TileMaterial { @@ -442,18 +272,14 @@ main(int argc, char *argv[]) finish(0); } - - - //int16_t base [16][16]; - //int16_t vein [16][16]; int cursorX = x_max/2 - 1; int cursorY = y_max/2 - 1; int cursorZ = z_max/2 - 1; + + // FIXME: could fail on small forts + int vein = 0; - //int16_t tempvein [16][16]; // walk the map! - - for (;;) { int c = getch(); /* refresh, accept single keystroke of input */ @@ -538,7 +364,7 @@ main(int argc, char *argv[]) cprintf("X %d/%d, Y %d/%d, Z %d/%d. Vein %d of %d",cursorX + 1,x_max,cursorY + 1,y_max,cursorZ + 1,z_max,vein+1,veinVector.size()); if(!veinVector.empty()) { - if(vein != -1) + if(vein != -1 && vein < veinVector.size()) { string str = getGCCClassName(p, veinVector[vein].vtable); if(str == "34block_square_event_frozen_liquidst") @@ -557,7 +383,6 @@ main(int argc, char *argv[]) attron(A_STANDOUT); puttile(i+16,j+16,tile, color); attroff(A_STANDOUT); - } } } @@ -585,7 +410,7 @@ main(int argc, char *argv[]) DF.Resume(); wrefresh(stdscr); } - finish(0); /* we're done */ + finish(0); } static void finish(int sig) diff --git a/precompiled/libdfconnect.so b/precompiled/libdfconnect.so index d2ddba257939d59b6dff7cca3daa750645fadc63..fa88bc0a78bee4f85b434d3922f9b74c85364960 100755 GIT binary patch delta 1228 zcmZ8hYiJx*6ux(M_GR`pJKLSOYqA@5ZPRW_HZ@4vh7={G4K}*AKESkbxkBVuc6iT^H-8)OU)(n054V}IOQ#2o zHeTyc@=0l9V z1GII3Ls%D9{CmXO=yTS{JZU`Vy-$+nFVojG+j+aOP}3ptO>|eF+;zbG<{!%%u4Eb* z(`N@tyFVE1Onas})3OAeqP}2RR*{X$X)|@xvh>$xrQnGPeR81ZQ03|J!=qOYn6KOU ze^7fc!@H6GevqA%vGuen?2*m9jRbF9hglS2Bj>4At>qtz zPF?+=%>q5IYP?erfo2e>jZcM{>J9o-)!cKC9j-h^7t|fD{2bBOoCe)`L@j)+|BunhFzFZu+y7gz;;1e_5(&Yq!26_^CJ;d^KoYkVmOfwhPc zgCEQ7XZ%%<>&)FT#^OF%KF-ksOTzM~<#kX%i&8l%Z_lA5PL#2G0-k$EB)@Z??hrBu zVGqG4uF?N}M?oE>AEKJ`1ZLwj7u8&!iMS=YO^bQI$LuURF3`28dgm-w3s{N!wI(>YVN#iN)88?-+y)<2)<5iVOl?!K@_mt t#HKD#B?EqKb9?`$z-$^kwnZO!9>Z- zwmb)0N<-(FfvEe2eB#6KEiq~^n_V(7%kYDd4`8BUOP)zJ8%*eQ=Q}ss;;OkB{4AbJ-WvG9ex)=U`ciA< zL5p1UGSL89ujOD8QZdz+ut4ri*?LFsSL5R)4x2_lY32n)>L*TDNi>J8zP=|hf#W4CyjT;zK zr}_$Qmxodb$8;(o3MiDC@TV@wbm|!__)Cvi=Pi@y+z|uw{E1HJoT8D0vd` zGVZ#FIE8o>aVs9)4DpCM;u0cVv~fI^1Y!bj$jh|G+mt~JVhjy_Cf&|>kHhx)y%1wz zwadp6!r%peh`ZsSU)e;=n`jbNr7w-`@;F`@5NfRZRq?Flv1$*xGst(r zDZjGo60WFM`d(L~_o)_A8b{NSySA1)pjyw0=PcCUFKC1Chd*Flz}X#mb4p+Al91zA!HC8mWf zlt9D6YD}aQ8W!d;krHWG7(N|1(whA2PR>7ogAGwWp`B`o3cLctjhpfHnZ(~BEH>`s gW3Z(u$GhRvrcQb7o0G+VXbgDrh!B&tx015>KY={ZsQ>@~