Missing file + some new
parent
6e69dcdeed
commit
d06fd70789
@ -0,0 +1,114 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <integers.h>
|
||||
|
||||
#include "shms.h"
|
||||
#include "shms-core.h"
|
||||
#include "mod-maps.h"
|
||||
#include <DFTypes.h>
|
||||
using namespace DFHack;
|
||||
using namespace DFHack::Maps;
|
||||
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <malloc.h>
|
||||
|
||||
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;
|
||||
}
|
@ -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 <DFTypes.h>
|
||||
|
||||
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
|
@ -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
|
Loading…
Reference in New Issue