summaryrefslogtreecommitdiff
path: root/plugins/versionosd.cpp
diff options
context:
space:
mode:
authorPetr Mrázek2011-12-07 20:50:37 +0100
committerPetr Mrázek2011-12-07 20:50:37 +0100
commitb36e5ac248d8fb972335d351d7acc30691c313ab (patch)
tree5927369acaab32e02a2979678b453754b5b3f462 /plugins/versionosd.cpp
parent647916e109fd0d2a95311f78dfb15f33a3a9b8c1 (diff)
downloaddfhack-b36e5ac248d8fb972335d351d7acc30691c313ab.tar.gz
dfhack-b36e5ac248d8fb972335d351d7acc30691c313ab.tar.bz2
dfhack-b36e5ac248d8fb972335d351d7acc30691c313ab.tar.xz
Add missing files.
Diffstat (limited to 'plugins/versionosd.cpp')
-rw-r--r--plugins/versionosd.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/plugins/versionosd.cpp b/plugins/versionosd.cpp
new file mode 100644
index 00000000..b4d354ce
--- /dev/null
+++ b/plugins/versionosd.cpp
@@ -0,0 +1,148 @@
+// This tool display dfhack version on df screen
+
+#include <Windows.h>
+#include <iostream>
+#include <vector>
+#include <map>
+#include <stddef.h>
+#include <string.h>
+using namespace std;
+#include <dfhack/Core.h>
+#include <dfhack/Console.h>
+#include <dfhack/Export.h>
+#include <dfhack/PluginManager.h>
+#include <dfhack/modules/Graphic.h>
+#include <dfhack/modules/Gui.h>
+using namespace DFHack;
+
+DFhackCExport command_result df_versionosd (Core * c, vector <string> & parameters);
+static DFSDL_Surface* (*_IMG_LoadPNG_RW)(void* src) = 0;
+static vPtr (*_SDL_RWFromFile)(const char* file, const char *mode) = 0;
+static int (*_SDL_SetAlpha)(vPtr surface, uint32_t flag, uint8_t alpha) = 0;
+static int (*_SDL_SetColorKey)(vPtr surface, uint32_t flag, uint32_t key) = 0;
+static uint32_t (*_SDL_MapRGB)(vPtr pixelformat, uint8_t r, uint8_t g, uint8_t b) = 0;
+DFTileSurface* gettile(int x, int y);
+
+bool On = true;
+DFSDL_Surface* surface;
+DFTileSurface* tiles[10];
+char* file = "Cooz_curses_square_16x16.png";
+Gui* gui;
+
+DFhackCExport const char * plugin_name ( void )
+{
+ return "versionosd";
+}
+
+DFTileSurface* createTile(int x, int y)
+{
+ DFTileSurface* tile = new DFTileSurface;
+ tile->paintOver = true;
+ tile->rect = new DFSDL_Rect;
+ tile->rect->x = x*16;
+ tile->rect->y = y*16;
+ tile->rect->w = 16;
+ tile->rect->h = 16;
+ tile->surface = surface;
+ tile->dstResize = NULL;
+ return tile;
+}
+
+DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands)
+{
+ commands.clear();
+ commands.push_back(PluginCommand("versionosd",
+ "Toggles displaying version in DF window",
+ df_versionosd));
+
+ HMODULE SDLImageLib = LoadLibrary("SDL_image.dll");
+ _IMG_LoadPNG_RW = (DFHack::DFSDL_Surface* (*)(void*))GetProcAddress(SDLImageLib, "IMG_LoadPNG_RW");
+
+ HMODULE realSDLlib = LoadLibrary("SDLreal.dll");
+ _SDL_RWFromFile = (void*(*)(const char*, const char*))GetProcAddress(realSDLlib,"SDL_RWFromFile");
+ _SDL_SetAlpha = (int (*)(void*, uint32_t, uint8_t))GetProcAddress(realSDLlib,"SDL_SetAlpha");
+ _SDL_SetColorKey = (int (*)(void*, uint32_t, uint32_t))GetProcAddress(realSDLlib,"SDL_SetColorKey");
+ _SDL_MapRGB = (uint32_t (*)(void*, uint8_t, uint8_t, uint8_t))GetProcAddress(realSDLlib,"SDL_MapRGB");
+
+ void* RWop = _SDL_RWFromFile(file, "rb");
+ surface = _IMG_LoadPNG_RW(RWop);
+
+ if ( !surface )
+ {
+ c->con.print("Couldnt load image from file %s", file);
+ return CR_FAILURE;
+ }
+
+ UINT32 pink = _SDL_MapRGB(vPtr(surface->format), 0xff, 0x00, 0xff);
+
+ _SDL_SetColorKey((vPtr)surface, 4096, pink);
+ _SDL_SetAlpha((vPtr)surface, 65536, 255);
+
+
+ // setup tiles
+ tiles[0] = createTile(4, 4); // D
+ tiles[1] = createTile(6, 4); // F
+ tiles[2] = createTile(8, 4); // H
+ tiles[3] = createTile(1, 6); // a
+ tiles[4] = createTile(3, 6); // c
+ tiles[5] = createTile(11, 6); // k
+ tiles[6] = createTile(0, 0); // " "
+ // FIXME: it should get REAL version not hardcoded one
+ tiles[7] = createTile(2, 7); // r
+ tiles[8] = createTile(8, 3); // 8
+
+ tiles[9] = createTile(9, 0); // o
+
+ gui = c->getGui();
+
+
+ Graphic* g = c->getGraphic();
+ g->Register(gettile);
+
+ return CR_OK;
+}
+
+DFhackCExport command_result plugin_shutdown ( Core * c )
+{
+ Graphic* g = c->getGraphic();
+ g->Unregister(gettile);
+ delete surface;
+
+ for (int i=0; i<10; i++)
+ {
+ delete tiles[i];
+ }
+ delete [] tiles;
+
+ return CR_OK;
+}
+
+DFhackCExport command_result df_versionosd (Core * c, vector <string> & parameters)
+{
+ On = !On;
+ c->Suspend();
+ c->con.print("Version OSD is %s\n", On ? "On" : "Off");
+ c->Resume();
+ return CR_OK;
+}
+
+DFTileSurface* gettile (int x, int y)
+{
+ if ( !On ) return NULL;
+
+ if ( x == 0 && y-4 >= 0 && y-4 < 9 )
+ {
+ return tiles[y-4];
+ }
+
+ int32_t cx, cy, cz;
+ int32_t vx, vy, vz;
+ if ( !gui->getViewCoords(vx, vy, vz) ) return NULL;
+ if ( !gui->getCursorCoords(cx, cy, cz) ) return NULL;
+ if ( cx-vx+1 == x && cy-vy+1 == y )
+ {
+ return tiles[9];
+ }
+
+ return NULL;
+} \ No newline at end of file