Merge remote-tracking branch 'quietust/master'

develop
Mike Stewart 2012-01-28 13:33:26 -08:00
commit bd26c54259
17 changed files with 117 additions and 86 deletions

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -24,6 +24,8 @@ distribution.
#pragma once #pragma once
#include "Export.h" #include "Export.h"
#include "DataDefs.h"
#include "df/building.h"
namespace DFHack namespace DFHack
{ {
@ -45,7 +47,7 @@ struct t_building
t_matglossPair material; t_matglossPair material;
uint32_t type; uint32_t type;
int32_t custom_type; int32_t custom_type;
void * origin; df::building * origin;
}; };
/** /**

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -39,7 +39,7 @@ distribution.
#include "modules/Materials.h" #include "modules/Materials.h"
#include "df/world.h" #include "df/world.h"
#include "df/feature_type.h" #include "df/feature_init.h"
#include "df/map_block.h" #include "df/map_block.h"
#include "df/block_square_event.h" #include "df/block_square_event.h"
#include "df/block_square_event_mineralst.h" #include "df/block_square_event_mineralst.h"
@ -84,7 +84,7 @@ struct t_feature
/// placeholder /// placeholder
bool discovered; bool discovered;
/// this is NOT part of the DF feature, but an address of the feature as seen by DFhack. /// this is NOT part of the DF feature, but an address of the feature as seen by DFhack.
void * origin; df::feature_init * origin;
}; };
/** /**
@ -144,14 +144,14 @@ typedef int16_t t_blockmaterials [16][16];
* 16x16 array of designation flags * 16x16 array of designation flags
* \ingroup grp_maps * \ingroup grp_maps
*/ */
typedef df::tile_designation designations40d [16][16];
typedef df::tile_designation t_designation; typedef df::tile_designation t_designation;
typedef t_designation designations40d [16][16];
/** /**
* 16x16 array of occupancy flags * 16x16 array of occupancy flags
* \ingroup grp_maps * \ingroup grp_maps
*/ */
typedef df::tile_occupancy occupancies40d [16][16];
typedef df::tile_occupancy t_occupancy; typedef df::tile_occupancy t_occupancy;
typedef t_occupancy occupancies40d [16][16];
/** /**
* array of 16 biome indexes valid for the block * array of 16 biome indexes valid for the block
* \ingroup grp_maps * \ingroup grp_maps
@ -178,7 +178,7 @@ typedef struct
/// values used for geology/biome assignment /// values used for geology/biome assignment
biome_indices40d biome_indices; biome_indices40d biome_indices;
/// the address where the block came from /// the address where the block came from
void * origin; df::map_block * origin;
t_blockflags blockflags; t_blockflags blockflags;
/// index into the global feature vector /// index into the global feature vector
int32_t global_feature; int32_t global_feature;
@ -251,7 +251,7 @@ extern DFHACK_EXPORT bool ReadFeatures(uint32_t x, uint32_t y, uint32_t z, t_fea
/** /**
* Get pointers to features of an already read block * Get pointers to features of an already read block
*/ */
extern DFHACK_EXPORT bool ReadFeatures(mapblock40d * block, t_feature * local, t_feature * global); extern DFHACK_EXPORT bool ReadFeatures(mapblock40d * block,t_feature * local, t_feature * global);
/** /**
* Read a specific global or local feature directly * Read a specific global or local feature directly
@ -306,8 +306,7 @@ extern DFHACK_EXPORT bool SetBlockLocalFeature(uint32_t blockx, uint32_t blocky,
extern DFHACK_EXPORT bool SetBlockGlobalFeature(uint32_t blockx, uint32_t blocky, uint32_t blockz, int32_t global = -1); extern DFHACK_EXPORT bool SetBlockGlobalFeature(uint32_t blockx, uint32_t blocky, uint32_t blockz, int32_t global = -1);
/// copy region offsets of a block - used for determining layer stone matgloss /// copy region offsets of a block - used for determining layer stone matgloss
extern DFHACK_EXPORT bool ReadRegionOffsets(uint32_t blockx, uint32_t blocky, uint32_t blockz, extern DFHACK_EXPORT bool ReadRegionOffsets(uint32_t blockx, uint32_t blocky, uint32_t blockz, biome_indices40d *buffer);
biome_indices40d *buffer);
/// sorts the block event vector into multiple vectors by type /// sorts the block event vector into multiple vectors by type
/// mineral veins, what's under ice, blood smears and mud /// mineral veins, what's under ice, blood smears and mud

@ -3,6 +3,9 @@
* \defgroup grp_vermin Wild vermin (ants, bees, etc) * \defgroup grp_vermin Wild vermin (ants, bees, etc)
*/ */
#include "Export.h" #include "Export.h"
#include "DataDefs.h"
#include "df/vermin.h"
namespace DFHack { namespace Simple { namespace Vermin namespace DFHack { namespace Simple { namespace Vermin
{ {
/** /**
@ -11,7 +14,7 @@ namespace DFHack { namespace Simple { namespace Vermin
*/ */
struct t_vermin struct t_vermin
{ {
void * origin; df::vermin * origin;
int16_t race; int16_t race;
int16_t caste; int16_t caste;
uint16_t x; uint16_t x;

@ -43,7 +43,6 @@ using namespace DFHack::Simple;
#include "DataDefs.h" #include "DataDefs.h"
#include "df/world.h" #include "df/world.h"
#include "df/building_def.h" #include "df/building_def.h"
#include "df/building.h"
#include "df/building_workshopst.h" #include "df/building_workshopst.h"
using namespace df::enums; using namespace df::enums;
@ -72,7 +71,7 @@ bool Buildings::Read (const uint32_t index, t_building & building)
building.material.type = bld_40d->mat_type; building.material.type = bld_40d->mat_type;
building.type = type; building.type = type;
building.custom_type = bld_40d->getCustomType(); building.custom_type = bld_40d->getCustomType();
building.origin = (void *) &bld_40d; building.origin = bld_40d;
return true; return true;
} }

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)

@ -769,10 +769,10 @@ bool Materials::ReadCreatureTypesEx (void)
// body parts // body parts
caste.bodypart.empty(); caste.bodypart.empty();
uint32_t sizebp = ca->unknown1.body_parts.size(); uint32_t sizebp = ca->body_info.body_parts.size();
for (uint32_t k = 0; k < sizebp; k++) for (uint32_t k = 0; k < sizebp; k++)
{ {
df::body_part_raw *bp = ca->unknown1.body_parts[k]; df::body_part_raw *bp = ca->body_info.body_parts[k];
t_bodypart part; t_bodypart part;
part.id = bp->part_code; part.id = bp->part_code;
part.category = bp->part_name; part.category = bp->part_name;

@ -38,15 +38,18 @@ using namespace std;
using namespace DFHack; using namespace DFHack;
using namespace DFHack::Simple; using namespace DFHack::Simple;
using namespace df::enums;
#include "DataDefs.h" #include "DataDefs.h"
#include "df/world.h" #include "df/world.h"
#include "df/d_init.h"
using df::global::world; using df::global::world;
using df::global::d_init;
bool Translation::IsValid () bool Translation::IsValid ()
{ {
return (world->raws.language.words.size() > 0) && (world->raws.language.translations.size() > 0); return (world && (world->raws.language.words.size() > 0) && (world->raws.language.translations.size() > 0));
} }
bool Translation::readName(t_name & name, df::language_name * source) bool Translation::readName(t_name & name, df::language_name * source)
@ -78,50 +81,78 @@ bool Translation::copyName(df::language_name * source, df::language_name * targe
return true; return true;
} }
void addNameWord (string &out, const string &word)
{
if (word.empty())
return;
string upper = word;
upper[0] = toupper(upper[0]);
if (out.length() > 0)
out.append(" ");
out.append(upper);
}
string Translation::TranslateName(const df::language_name * name, bool inEnglish) string Translation::TranslateName(const df::language_name * name, bool inEnglish)
{ {
string out; string out;
string word;
if(!inEnglish) if (!name->first_name.empty())
addNameWord(out, name->first_name);
if (!name->nickname.empty())
{
word = "`" + name->nickname + "'";
switch (d_init ? d_init->nickname_dwarf : d_init_nickname::CENTRALIZE)
{
case d_init_nickname::REPLACE_ALL:
out = word;
return out;
case d_init_nickname::REPLACE_FIRST:
out = "";
break;
case d_init_nickname::CENTRALIZE:
break;
}
addNameWord(out, word);
}
if (!inEnglish)
{ {
if (name->words[0] >= 0 || name->words[1] >= 0) if (name->words[0] >= 0 || name->words[1] >= 0)
{ {
word.clear();
if (name->words[0] >= 0) if (name->words[0] >= 0)
out.append(*world->raws.language.translations[name->language]->words[name->words[0]]); word.append(*world->raws.language.translations[name->language]->words[name->words[0]]);
if (name->words[1] >= 0) if (name->words[1] >= 0)
out.append(*world->raws.language.translations[name->language]->words[name->words[1]]); word.append(*world->raws.language.translations[name->language]->words[name->words[1]]);
out[0] = toupper(out[0]); addNameWord(out, word);
} }
if (name->words[5] >= 0) if (name->words[5] >= 0)
{ {
string word; word.clear();
for (int i = 2; i <= 5; i++) for (int i = 2; i <= 5; i++)
if (name->words[i] >= 0) if (name->words[i] >= 0)
word.append(*world->raws.language.translations[name->language]->words[name->words[i]]); word.append(*world->raws.language.translations[name->language]->words[name->words[i]]);
word[0] = toupper(word[0]); addNameWord(out, word);
if (out.length() > 0)
out.append(" ");
out.append(word);
} }
if (name->words[6] >= 0) if (name->words[6] >= 0)
{ {
string word = *world->raws.language.translations[name->language]->words[name->words[6]]; word.clear();
word.append(*world->raws.language.translations[name->language]->words[name->words[6]]);
word[0] = toupper(word[0]); addNameWord(out, word);
if (out.length() > 0)
out.append(" ");
out.append(word);
} }
} }
else else
{ {
if (name->words[0] >= 0 || name->words[1] >= 0) if (name->words[0] >= 0 || name->words[1] >= 0)
{ {
word.clear();
if (name->words[0] >= 0) if (name->words[0] >= 0)
out.append(world->raws.language.words[name->words[0]]->forms[name->parts_of_speech[0].value]); word.append(world->raws.language.words[name->words[0]]->forms[name->parts_of_speech[0].value]);
if (name->words[1] >= 0) if (name->words[1] >= 0)
out.append(world->raws.language.words[name->words[1]]->forms[name->parts_of_speech[1].value]); word.append(world->raws.language.words[name->words[1]]->forms[name->parts_of_speech[1].value]);
out[0] = toupper(out[0]); addNameWord(out, word);
} }
if (name->words[5] >= 0) if (name->words[5] >= 0)
{ {
@ -129,14 +160,11 @@ string Translation::TranslateName(const df::language_name * name, bool inEnglish
out.append(" the"); out.append(" the");
else else
out.append("The"); out.append("The");
for (int i = 2; i <= 5; i++) for (int i = 2; i <= 5; i++)
{ {
if (name->words[i] >= 0) if (name->words[i] >= 0)
{ addNameWord(out, world->raws.language.words[name->words[i]]->forms[name->parts_of_speech[i].value]);
string word = world->raws.language.words[name->words[i]]->forms[name->parts_of_speech[i].value];
word[0] = toupper(word[0]);
out.append(" " + word);
}
} }
} }
if (name->words[6] >= 0) if (name->words[6] >= 0)
@ -146,10 +174,9 @@ string Translation::TranslateName(const df::language_name * name, bool inEnglish
else else
out.append("Of"); out.append("Of");
string word = world->raws.language.words[name->words[6]]->forms[name->parts_of_speech[6].value]; addNameWord(out, world->raws.language.words[name->words[6]]->forms[name->parts_of_speech[6].value]);
word[0] = toupper(word[0]);
out.append(" " + word);
} }
} }
return out; return out;
} }

@ -16,7 +16,6 @@ using namespace std;
#include <string> #include <string>
#include "modules/Items.h" #include "modules/Items.h"
#include "modules/Units.h" #include "modules/Units.h"
#include "modules/Materials.h"
#include "modules/Translation.h" #include "modules/Translation.h"
#include "DataDefs.h" #include "DataDefs.h"
#include "df/world.h" #include "df/world.h"
@ -96,9 +95,11 @@ DFhackCExport command_result df_cleanowned (Core * c, vector <string> & paramete
CoreSuspender suspend(c); CoreSuspender suspend(c);
DFHack::Materials *Materials = c->getMaterials(); if (!Translation::IsValid())
{
bool ok = Materials->ReadAllMaterials(); c->con.printerr("Translation data unavailable!\n");
return CR_FAILURE;
}
c->con.print("Found total %d items.\n", world->items.all.size()); c->con.print("Found total %d items.\n", world->items.all.size());
@ -181,17 +182,9 @@ DFhackCExport command_result df_cleanowned (Core * c, vector <string> & paramete
); );
df::unit *owner = Items::getItemOwner(item); df::unit *owner = Items::getItemOwner(item);
std::string info;
if (owner) if (owner)
{ c->con.print(", owner %s", Translation::TranslateName(&owner->name,false).c_str());
info = owner->name.first_name;
if (!owner->name.nickname.empty())
info += std::string(" '") + owner->name.nickname + "'";
info += " ";
info += Translation::TranslateName(&owner->name,false);
c->con.print(", owner %s", info.c_str());
}
if (!dry_run) if (!dry_run)
{ {

@ -22,6 +22,19 @@ using namespace df::enums;
using df::global::world; using df::global::world;
bool setTileMaterial(int16_t &tile, const TileMaterial mat)
{
int16_t newTile = findTileType(tileShape(tile), mat, tileVariant(tile), tileSpecial(tile), tileDirection(tile));
if (newTile == -1)
return false;
if (newTile != tile)
{
tile = newTile;
return true;
}
return false;
}
DFhackCExport command_result df_fixveins (Core * c, vector <string> & parameters) DFhackCExport command_result df_fixveins (Core * c, vector <string> & parameters)
{ {
if (parameters.size()) if (parameters.size())
@ -35,8 +48,8 @@ DFhackCExport command_result df_fixveins (Core * c, vector <string> & parameters
return CR_FAILURE; return CR_FAILURE;
} }
int removed = 0; int mineral_removed = 0, feature_removed = 0;
int added = 0; int mineral_added = 0, feature_added = 0;
int num_blocks = 0, blocks_total = world->map.map_blocks.size(); int num_blocks = 0, blocks_total = world->map.map_blocks.size();
for (int i = 0; i < blocks_total; i++) for (int i = 0; i < blocks_total; i++)
@ -57,33 +70,22 @@ DFhackCExport command_result df_fixveins (Core * c, vector <string> & parameters
for (int y = 0; y < 16; y++) for (int y = 0; y < 16; y++)
{ {
int16_t oldT = block->tiletype[x][y]; int16_t oldT = block->tiletype[x][y];
int16_t newT = oldT;
TileMaterial mat = tileMaterial(oldT); TileMaterial mat = tileMaterial(oldT);
if ((mat == VEIN) && !(has_mineral[y] & (1 << x))) if ((mat == VEIN) && !(has_mineral[y] & (1 << x)))
{ mineral_removed += setTileMaterial(block->tiletype[x][y], STONE);
newT = findTileType(tileShape(oldT), STONE, tileVariant(oldT), tileSpecial(oldT), tileDirection(oldT));
if ((newT != -1) && (newT != oldT))
{
block->tiletype[x][y] = newT;
removed++;
}
}
if ((mat == STONE) && (has_mineral[y] & (1 << x))) if ((mat == STONE) && (has_mineral[y] & (1 << x)))
{ mineral_added += setTileMaterial(block->tiletype[x][y], VEIN);
newT = findTileType(tileShape(oldT), VEIN, tileVariant(oldT), tileSpecial(oldT), tileDirection(oldT)); if ((mat == FEATSTONE) && !(block->designation[x][y].bits.feature_local || block->designation[x][y].bits.feature_global))
if ((newT != -1) && (newT != oldT)) feature_removed += setTileMaterial(block->tiletype[x][y], STONE);
{ if ((mat == STONE) && (block->designation[x][y].bits.feature_local || block->designation[x][y].bits.feature_global))
block->tiletype[x][y] = newT; feature_added += setTileMaterial(block->tiletype[x][y], FEATSTONE);
added++;
}
}
} }
} }
} }
if (removed) if (mineral_removed || feature_removed)
c->con.print("Removed %i invalid references to mineral inclusions.\n", removed); c->con.print("Removed invalid references from %i mineral inclusion and %i map feature tiles.\n", mineral_removed, feature_removed);
if (added) if (mineral_added || feature_added)
c->con.print("Restored %i missing references to mineral inclusions.\n", added); c->con.print("Restored missing references to %i mineral inclusion and %i map feature tiles.\n", mineral_added, feature_added);
return CR_OK; return CR_OK;
} }

@ -32,6 +32,12 @@ DFhackCExport command_result df_showmood (Core * c, vector <string> & parameters
if (!parameters.empty()) if (!parameters.empty())
return CR_WRONG_USAGE; return CR_WRONG_USAGE;
if (!Translation::IsValid())
{
c->con.printerr("Translation data unavailable!\n");
return CR_FAILURE;
}
CoreSuspender suspend(c); CoreSuspender suspend(c);
bool found = false; bool found = false;
@ -61,7 +67,7 @@ DFhackCExport command_result df_showmood (Core * c, vector <string> & parameters
c->con.printerr("Dwarf with strange mood does not have a mood type!\n"); c->con.printerr("Dwarf with strange mood does not have a mood type!\n");
continue; continue;
} }
c->con.print("%s %s is currently ", unit->name.first_name.c_str(), Translation::TranslateName(&unit->name, false).c_str()); c->con.print("%s is currently ", Translation::TranslateName(&unit->name, false).c_str());
switch (unit->mood) switch (unit->mood)
{ {
case mood_type::Macabre: case mood_type::Macabre: