From d06fd70789809235519f72ec6613586f68830239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 4 Mar 2010 18:35:26 +0100 Subject: [PATCH] Missing file + some new --- shmserver/mod-maps.cpp | 114 +++++++++++++++++++++++++++++++++++++++++ shmserver/mod-maps.h | 99 +++++++++++++++++++++++++++++++++++ shmserver/shms-core.h | 96 ++++++++++++++++++++++++++++++++++ 3 files changed, 309 insertions(+) create mode 100644 shmserver/mod-maps.cpp create mode 100644 shmserver/mod-maps.h create mode 100644 shmserver/shms-core.h diff --git a/shmserver/mod-maps.cpp b/shmserver/mod-maps.cpp new file mode 100644 index 000000000..a6cfc0fe1 --- /dev/null +++ b/shmserver/mod-maps.cpp @@ -0,0 +1,114 @@ +#include +#include +#include + +#include "shms.h" +#include "shms-core.h" +#include "mod-maps.h" +#include +using namespace DFHack; +using namespace DFHack::Maps; + +#include +#include +#include + +extern char *shm; + +//TODO: circular buffer streaming primitives required +//TODO: commands can fail without the proper offsets. Hot to handle that? + +#define SHMHDR ((shm_maps_hdr *)shm) +#define SHMCMD ((shm_cmd *)shm)->pingpong +#define SHMDATA ((char *)(shm + SHM_HEADER)) + +void NullCommand (void* data) +{ +}; + +void InitOffsets (void* data) +{ + maps_modulestate * state = (maps_modulestate *) data; + memcpy((void *) &(state->offsets), SHMDATA, sizeof(maps_offsets)); + ((maps_modulestate *) data)->inited = true; +} + +void GetMapSize (void *data) +{ + maps_modulestate * state = (maps_modulestate *) data; + if(state->inited) + { + SHMHDR->x = *((uint32_t *)state->offsets.x_count_offset); + SHMHDR->y = *((uint32_t *)state->offsets.y_count_offset); + SHMHDR->z = *((uint32_t *)state->offsets.z_count_offset); + SHMHDR->error = false; + } + else + { + SHMHDR->error = true; + } +} + +struct mblock +{ + uint32_t * ptr_to_dirty; +}; + +#define SHMBLOCK ((mapblock40d *)(shm + SHM_HEADER)) + +void ReadBlockByCoords (void * data) +{ + maps_modulestate * state = (maps_modulestate *) data; + maps_offsets & offsets = state->offsets; + /* map_offset is a pointer to + a pointer to + an X block of pointers to + an Y blocks of pointers to + a Z blocks of pointers to + map blocks + only Z blocks can have NULL pointers? TODO: verify + */ + mblock * *** mapArray = *(mblock * ****)offsets.map_offset; + mblock * block = mapArray[SHMHDR->x][SHMHDR->y][SHMHDR->z]; + fprintf(stderr, "Readblock: %d %d %d 0x%x\n", SHMHDR->x,SHMHDR->y,SHMHDR->z, block); + if(block) + { + memcpy(&(SHMBLOCK->tiletypes), block + offsets.tile_type_offset, sizeof(SHMBLOCK->tiletypes)); + memcpy(&(SHMBLOCK->designaton), block + offsets.designation_offset, sizeof(SHMBLOCK->designaton)); + memcpy(&(SHMBLOCK->occupancy), block + offsets.occupancy_offset, sizeof(SHMBLOCK->occupancy)); + memcpy(&(SHMBLOCK->biome_indices), block + offsets.biome_stuffs, sizeof(SHMBLOCK->biome_indices)); + SHMBLOCK->dirty_dword = *block->ptr_to_dirty; + SHMHDR->error = false; + } + else + { + SHMHDR->error = true; + } +} + +DFPP_module InitMaps(void) +{ + DFPP_module maps; + maps.name = "Maps"; + maps.version = MAPS_VERSION; + // freed by the core + maps.modulestate = malloc(sizeof(maps_modulestate)); // we store a flag + memset(maps.modulestate,0,sizeof(maps_modulestate)); + + maps.reserve(NUM_MAPS_CMDS); + + // client sends a maps_offsets struct -> inited = true; + maps.set_command(MAP_INIT, FUNCTION, "Supply the module with offsets",InitOffsets,CORE_SUSPENDED); + maps.set_command(MAP_GET_SIZE, FUNCTION, "Get map size in 16x16x1 tile blocks", GetMapSize, CORE_SUSPENDED); + maps.set_command(MAP_READ_BLOCK_BY_COORDS, FUNCTION, "Read the whole block with specified coords", ReadBlockByCoords, CORE_SUSPENDED); + + // will it fit into 1MB? We shouldn't assume this is the case + maps.set_command(MAP_READ_BLOCKTREE, FUNCTION,"Get the tree of block pointers as a single structure", NullCommand, CORE_SUSPENDED); + + + + // really doesn't fit into 1MB, there should be a streaming variant to better utilize context switches + maps.set_command(MAP_READ_BLOCKS_3D, FUNCTION, "Read a range of blocks between two sets of coords", NullCommand, CORE_SUSPENDED); + + return maps; +} \ No newline at end of file diff --git a/shmserver/mod-maps.h b/shmserver/mod-maps.h new file mode 100644 index 000000000..34e6889a1 --- /dev/null +++ b/shmserver/mod-maps.h @@ -0,0 +1,99 @@ +/* +www.sourceforge.net/projects/dfhack +Copyright (c) 2009 Petr Mrázek (peterix) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#ifndef MOD_MAPS_H +#define MOD_MAPS_H + +// increment on every change +#include + +namespace DFHack +{ + namespace Maps + { + +#define MAPS_VERSION 1 +typedef struct +{ + uint32_t map_offset;// = d->offset_descriptor->getAddress ("map_data"); + uint32_t x_count_offset;// = d->offset_descriptor->getAddress ("x_count"); + uint32_t y_count_offset;// = d->offset_descriptor->getAddress ("y_count"); + uint32_t z_count_offset;// = d->offset_descriptor->getAddress ("z_count"); + uint32_t tile_type_offset;// = d->offset_descriptor->getOffset ("type"); + uint32_t designation_offset;// = d->offset_descriptor->getOffset ("designation"); + uint32_t occupancy_offset;// = d->offset_descriptor->getOffset ("occupancy"); + uint32_t biome_stuffs;// = d->offset_descriptor->getOffset ("biome_stuffs"); + uint32_t veinvector;// = d->offset_descriptor->getOffset ("v_vein"); + uint32_t vein_mineral_vptr; + uint32_t vein_ice_vptr; + /* + GEOLOGY + uint32_t region_x_offset;// = minfo->getAddress ("region_x"); + uint32_t region_y_offset;// = minfo->getAddress ("region_y"); + uint32_t region_z_offset;// = minfo->getAddress ("region_z"); + uint32_t world_offset;// = minfo->getAddress ("world"); + uint32_t world_regions_offset;// = minfo->getOffset ("w_regions_arr"); + uint32_t region_size;// = minfo->getHexValue ("region_size"); + uint32_t region_geo_index_offset;// = minfo->getOffset ("region_geo_index_off"); + uint32_t world_geoblocks_offset;// = minfo->getOffset ("w_geoblocks"); + uint32_t world_size_x;// = minfo->getOffset ("world_size_x"); + uint32_t world_size_y;// = minfo->getOffset ("world_size_y"); + uint32_t geolayer_geoblock_offset;// = minfo->getOffset ("geolayer_geoblock_offset"); + */ +} maps_offsets; + +typedef struct +{ + bool inited; + maps_offsets offsets; +} maps_modulestate; + +typedef struct +{ + shm_cmd cmd; + uint32_t x; + uint32_t y; + uint32_t z; + uint32_t x2; + uint32_t y2; + uint32_t z2; + uint32_t address; + uint32_t error; +} shm_maps_hdr; + +enum MAPS_COMMAND +{ + MAP_INIT = 0, // initialization + MAP_PROBE, // check if the map is still there + MAP_GET_SIZE, // get the map size in 16x16x1 blocks + MAP_READ_BLOCKTREE, // read the structure of pointers to blocks + MAP_READ_BLOCK_BY_COORDS, // read block by cords + MAP_READ_BLOCKS_3D, // read blocks between two coords (volumetric) + MAP_READ_ALL_BLOCKS, // read the entire map + NUM_MAPS_CMDS, +}; + } +} + +#endif \ No newline at end of file diff --git a/shmserver/shms-core.h b/shmserver/shms-core.h new file mode 100644 index 000000000..be407691c --- /dev/null +++ b/shmserver/shms-core.h @@ -0,0 +1,96 @@ +/* +www.sourceforge.net/projects/dfhack +Copyright (c) 2009 Petr Mrázek (peterix) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#ifndef SHMS_CORE_H +#define SHMS_CORE_H + +// increment on every core change +#define CORE_VERSION 6 + +typedef struct +{ + shm_cmd cmd; + uint32_t address; + uint32_t value; + uint32_t length; + uint32_t error; +} shm_core_hdr; + +typedef struct +{ + uint32_t version; + char name[256]; +} modulelookup; + +enum CORE_COMMAND +{ + CORE_RUNNING = 0, // no command, normal server execution + + CORE_GET_VERSION, // protocol version query + CORE_RET_VERSION, // return the protocol version + + CORE_GET_PID, // query for the process ID + CORE_RET_PID, // return process ID + + // version 1 stuff below + CORE_DFPP_READ, // cl -> sv, read some data + CORE_RET_DATA, // sv -> cl, returned data + + CORE_READ_DWORD, // cl -> sv, read a dword + CORE_RET_DWORD, // sv -> cl, returned dword + + CORE_READ_WORD, // cl -> sv, read a word + CORE_RET_WORD, // sv -> cl, returned word + + CORE_READ_BYTE, // cl -> sv, read a byte + CORE_RET_BYTE, // sv -> cl, returned byte + + CORE_SV_ERROR, // there was a server error + CORE_CL_ERROR, // there was a client error + + CORE_WRITE,// client writes to server + CORE_WRITE_DWORD,// client writes a DWORD to server + CORE_WRITE_WORD,// client writes a WORD to server + CORE_WRITE_BYTE,// client writes a BYTE to server + + CORE_SUSPEND, // client notifies server to wait for commands (server is stalled in busy wait) + CORE_SUSPENDED, // response to WAIT, server is stalled in busy wait + + // all strings capped at 1MB + CORE_READ_STL_STRING,// client requests contents of STL string at address + CORE_READ_C_STRING,// client requests contents of a C string at address, max length (0 means zero terminated) + CORE_RET_STRING, // sv -> cl length + string contents + CORE_WRITE_STL_STRING,// client wants to set STL string at address to something + + // compare affinity and determine if using yield is required + CORE_SYNC_YIELD,// cl sends affinity to sv, sv sets yield + CORE_SYNC_YIELD_RET,// sv returns yield bool + + // get index of a loaded module by name and version + CORE_ACQUIRE_MODULE, + // returning module index + CORE_RET_MODULE, + NUM_CORE_CMDS +}; +#endif \ No newline at end of file