summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJapa Illo2012-03-08 09:37:54 +0530
committerJapa Illo2012-03-08 09:37:54 +0530
commit96bbfa604d1835df993602cbf46ca6bb0a28e6bd (patch)
tree38d46683531ef118bae33b244475e6203683c891
parent50bbecc544aa227fb7bfc4a5c90c6b27369d8bcd (diff)
downloadstonesense-96bbfa604d1835df993602cbf46ca6bb0a28e6bd.tar.gz
stonesense-96bbfa604d1835df993602cbf46ca6bb0a28e6bd.tar.bz2
stonesense-96bbfa604d1835df993602cbf46ca6bb0a28e6bd.tar.xz
Got rid of some warnings, cleaned up the sprite drawing routine, and added ability to select sprites according to individual items.
Todo: add ability to have a sprite according to just the item class. Signed-off-by: Japa Illo <japa.mala.illo@gmail.com>
-rw-r--r--ContentLoader.cpp81
-rw-r--r--ContentLoader.h15
-rw-r--r--GUI.cpp56
-rw-r--r--MapLoading.cpp2
-rw-r--r--SpriteObjects.cpp588
-rw-r--r--SpriteObjects.h3
-rw-r--r--commonTypes.h7
-rw-r--r--main.cpp1
-rw-r--r--resources/creatures/clothed_Dwarves.xml7
-rw-r--r--resources/creatures/color_dwarves.pngbin15573 -> 15635 bytes
10 files changed, 456 insertions, 304 deletions
diff --git a/ContentLoader.cpp b/ContentLoader.cpp
index b3f47db..739ed6a 100644
--- a/ContentLoader.cpp
+++ b/ContentLoader.cpp
@@ -520,21 +520,21 @@ const char *lookupMaterialTypeName(int matType)
{
switch (matType)
{
- case MAT_BASICS::INORGANIC:
+ case INORGANIC:
return "Inorganic";
- case MAT_BASICS::GREEN_GLASS:
+ case GREEN_GLASS:
return "GreenGlass";
- case MAT_BASICS::WOOD:
+ case WOOD:
return "Wood";
- case MAT_BASICS::ICE:
+ case ICE:
return "Ice";
- case MAT_BASICS::CLEAR_GLASS:
+ case CLEAR_GLASS:
return "ClearGlass";
- case MAT_BASICS::CRYSTAL_GLASS:
+ case CRYSTAL_GLASS:
return "CrystalGlass";
- case MAT_BASICS::PLANTCLOTH:
+ case PLANTCLOTH:
return "PlantCloth";
- case MAT_BASICS::LEATHER:
+ case LEATHER:
return "Leather";
default:
return NULL;
@@ -544,29 +544,29 @@ const char *lookupMaterialTypeName(int matType)
MAT_BASICS lookupMaterialType(const char* strValue)
{
if (strValue == NULL || strValue[0] == 0)
- return MAT_BASICS::INVALID;
+ return INVALID;
else if( strcmp(strValue, "Stone") == 0)
- return MAT_BASICS::INORGANIC;
+ return INORGANIC;
else if( strcmp(strValue, "Metal") == 0)
- return MAT_BASICS::INORGANIC;
+ return INORGANIC;
else if( strcmp(strValue, "Inorganic") == 0)
- return MAT_BASICS::INORGANIC;
+ return INORGANIC;
else if( strcmp(strValue, "GreenGlass") == 0)
- return MAT_BASICS::GREEN_GLASS;
+ return GREEN_GLASS;
else if( strcmp(strValue, "Wood") == 0)
- return MAT_BASICS::WOOD;
+ return WOOD;
else if( strcmp(strValue, "Ice") == 0)
- return MAT_BASICS::ICE;
+ return ICE;
else if( strcmp(strValue, "ClearGlass") == 0)
- return MAT_BASICS::CLEAR_GLASS;
+ return CLEAR_GLASS;
else if( strcmp(strValue, "CrystalGlass") == 0)
- return MAT_BASICS::CRYSTAL_GLASS;
+ return CRYSTAL_GLASS;
else if( strcmp(strValue, "PlantCloth") == 0)
- return MAT_BASICS::PLANTCLOTH;
+ return PLANTCLOTH;
else if( strcmp(strValue, "Leather") == 0)
- return MAT_BASICS::LEATHER;
+ return LEATHER;
//TODO this needs fixing on dfhack side
- return MAT_BASICS::INVALID;
+ return INVALID;
}
const char *lookupMaterialName(int matType,int matIndex)
@@ -620,18 +620,17 @@ const char *lookupTreeName(int matIndex)
return (*typeVector)[matIndex].id.c_str();
}
-typedef df::enums::item_type::item_type itt;
const char * lookupFormName(int formType)
{
switch (formType)
{
- case itt::BAR:
+ case item_type::BAR:
return "bar";
- case itt::BLOCKS:
+ case item_type::BLOCKS:
return "block";
- case itt::BOULDER:
+ case item_type::BOULDER:
return "boulder";
- case itt::WOOD:
+ case item_type::WOOD:
return "log";
default:
return NULL;
@@ -747,16 +746,20 @@ void ContentLoader::flushCreatureConfig()
}
ALLEGRO_COLOR lookupMaterialColor(int matType,int matIndex)
{
+ if (matType < 0)
+ {
+ //This should not normally happen, but if it does, we don't want crashes, so we'll return magic pink so show something's wrong.
+ return al_map_rgb(255, 0, 255);
+ }
if (matType >= contentLoader->colorConfigs.size())
{
//if it's more than the size of our colorconfigs, then just make a guess based off what DF tells us.
MaterialInfo mat;
mat.decode(matType, matIndex);
- ALLEGRO_COLOR out = al_map_rgb_f(
+ return al_map_rgb_f(
contentLoader->Mats->color[mat.material->state_color[0]].red,
contentLoader->Mats->color[mat.material->state_color[0]].green,
contentLoader->Mats->color[mat.material->state_color[0]].blue);
- return out;
}
if (matIndex < 0)
{
@@ -764,7 +767,12 @@ ALLEGRO_COLOR lookupMaterialColor(int matType,int matIndex)
}
if (matIndex >= contentLoader->colorConfigs.at(matType).colorMaterials.size())
{
- return al_map_rgb(255, 255, 255);
+ MaterialInfo mat;
+ mat.decode(matType, matIndex);
+ return al_map_rgb_f(
+ contentLoader->Mats->color[mat.material->state_color[0]].red,
+ contentLoader->Mats->color[mat.material->state_color[0]].green,
+ contentLoader->Mats->color[mat.material->state_color[0]].blue);
}
if (contentLoader->colorConfigs.at(matType).colorMaterials.at(matIndex).colorSet)
{
@@ -772,11 +780,10 @@ ALLEGRO_COLOR lookupMaterialColor(int matType,int matIndex)
}
MaterialInfo mat;
mat.decode(matType, matIndex);
- ALLEGRO_COLOR out = al_map_rgb_f(
+ return al_map_rgb_f(
contentLoader->Mats->color[mat.material->state_color[0]].red,
contentLoader->Mats->color[mat.material->state_color[0]].green,
contentLoader->Mats->color[mat.material->state_color[0]].blue);
- return out;
}
ShadeBy getShadeType(const char* Input)
@@ -813,17 +820,7 @@ ShadeBy getShadeType(const char* Input)
return ShadeBuilding;
if( strcmp(Input, "grass") == 0)
return ShadeGrass;
- if( strcmp(Input, "weapon") == 0)
- return ShadeWeapon;
- if( strcmp(Input, "armor") == 0)
- return ShadeArmor;
- if( strcmp(Input, "shoes") == 0)
- return ShadeShoes;
- if( strcmp(Input, "shield") == 0)
- return ShadeShield;
- if( strcmp(Input, "helm") == 0)
- return ShadeHelm;
- if( strcmp(Input, "gloves") == 0)
- return ShadeGloves;
+ if( strcmp(Input, "equipment") == 0)
+ return ShadeItem;
return ShadeNone;
} \ No newline at end of file
diff --git a/ContentLoader.h b/ContentLoader.h
index 11f16e8..91c839d 100644
--- a/ContentLoader.h
+++ b/ContentLoader.h
@@ -84,6 +84,21 @@ int lookupIndexedType(const char* indexName, std::vector<T>& typeVector)
}
return INVALID_INDEX;
}
+template <typename T>
+int lookupIndexedPonterType(const char* indexName, std::vector<T*>& typeVector)
+{
+ if (indexName == NULL || indexName[0] == 0)
+ {
+ return INVALID_INDEX;
+ }
+ uint32_t vsize = (uint32_t)typeVector.size();
+ for(uint32_t i=0; i < vsize; i++)
+ {
+ if (typeVector[i]->id == indexName)
+ return i;
+ }
+ return INVALID_INDEX;
+}
const char *lookupMaterialTypeName(int matType);
const char *lookupMaterialName(int matType,int matIndex);
const char *lookupBuildingSubtype(int main_type, int i);
diff --git a/GUI.cpp b/GUI.cpp
index d5f4014..cc54e45 100644
--- a/GUI.cpp
+++ b/GUI.cpp
@@ -507,11 +507,11 @@ void drawDebugCursorAndInfo(WorldSegment * segment, DFHack::Core * c)
{
if(b->inv->Weapons[ind].matt.type < 0)
continue;
- const char* matName = lookupMaterialTypeName(b->inv->Weapons[ind].matt.type);
- const char* subMatName = lookupMaterialName(b->inv->Weapons[ind].matt.type,b->inv->Weapons[ind].matt.index);
+ MaterialInfo mat;
+ mat.decode(b->inv->Weapons[ind].matt.type,b->inv->Weapons[ind].matt.index);
draw_textf_border(font, al_map_rgb(255,255,255), 2, (i++*al_get_font_line_height(font)), 0,
- " %s%s%s - %s/%s",
- matName?matName:"Unknown",subMatName?"/":"",subMatName?subMatName:"",
+ " %s - %s/%s",
+ mat.getToken().c_str(),
ENUM_KEY_STR(item_type, item_type::WEAPON),
get_item_subtype(item_type::WEAPON,ind));
}
@@ -524,11 +524,11 @@ void drawDebugCursorAndInfo(WorldSegment * segment, DFHack::Core * c)
{
if(b->inv->Armor[ind].matt.type < 0)
continue;
- const char* matName = lookupMaterialTypeName(b->inv->Armor[ind].matt.type);
- const char* subMatName = lookupMaterialName(b->inv->Armor[ind].matt.type,b->inv->Armor[ind].matt.index);
+ MaterialInfo mat;
+ mat.decode(b->inv->Armor[ind].matt.type,b->inv->Armor[ind].matt.index);
draw_textf_border(font, al_map_rgb(255,255,255), 2, (i++*al_get_font_line_height(font)), 0,
- " %s%s%s - %s/%s",
- matName?matName:"Unknown",subMatName?"/":"",subMatName?subMatName:"",
+ " %s - %s/%s",
+ mat.getToken().c_str(),
ENUM_KEY_STR(item_type, item_type::ARMOR),
get_item_subtype(item_type::ARMOR,ind));
}
@@ -541,11 +541,11 @@ void drawDebugCursorAndInfo(WorldSegment * segment, DFHack::Core * c)
{
if(b->inv->Shoes[ind].matt.type < 0)
continue;
- const char* matName = lookupMaterialTypeName(b->inv->Shoes[ind].matt.type);
- const char* subMatName = lookupMaterialName(b->inv->Shoes[ind].matt.type,b->inv->Shoes[ind].matt.index);
+ MaterialInfo mat;
+ mat.decode(b->inv->Shoes[ind].matt.type,b->inv->Shoes[ind].matt.index);
draw_textf_border(font, al_map_rgb(255,255,255), 2, (i++*al_get_font_line_height(font)), 0,
- " %s%s%s - %s/%s",
- matName?matName:"Unknown",subMatName?"/":"",subMatName?subMatName:"",
+ " %s - %s/%s",
+ mat.getToken().c_str(),
ENUM_KEY_STR(item_type, item_type::SHOES),
get_item_subtype(item_type::SHOES,ind));
}
@@ -558,11 +558,11 @@ void drawDebugCursorAndInfo(WorldSegment * segment, DFHack::Core * c)
{
if(b->inv->Shield[ind].matt.type < 0)
continue;
- const char* matName = lookupMaterialTypeName(b->inv->Shield[ind].matt.type);
- const char* subMatName = lookupMaterialName(b->inv->Shield[ind].matt.type,b->inv->Shield[ind].matt.index);
+ MaterialInfo mat;
+ mat.decode(b->inv->Shield[ind].matt.type,b->inv->Shield[ind].matt.index);
draw_textf_border(font, al_map_rgb(255,255,255), 2, (i++*al_get_font_line_height(font)), 0,
- " %s%s%s - %s/%s",
- matName?matName:"Unknown",subMatName?"/":"",subMatName?subMatName:"",
+ " %s - %s/%s",
+ mat.getToken().c_str(),
ENUM_KEY_STR(item_type, item_type::SHIELD),
get_item_subtype(item_type::SHIELD,ind));
}
@@ -575,11 +575,11 @@ void drawDebugCursorAndInfo(WorldSegment * segment, DFHack::Core * c)
{
if(b->inv->Helm[ind].matt.type < 0)
continue;
- const char* matName = lookupMaterialTypeName(b->inv->Helm[ind].matt.type);
- const char* subMatName = lookupMaterialName(b->inv->Helm[ind].matt.type,b->inv->Helm[ind].matt.index);
+ MaterialInfo mat;
+ mat.decode(b->inv->Helm[ind].matt.type,b->inv->Helm[ind].matt.index);
draw_textf_border(font, al_map_rgb(255,255,255), 2, (i++*al_get_font_line_height(font)), 0,
- " %s%s%s - %s/%s",
- matName?matName:"Unknown",subMatName?"/":"",subMatName?subMatName:"",
+ " %s - %s/%s",
+ mat.getToken().c_str(),
ENUM_KEY_STR(item_type, item_type::HELM),
get_item_subtype(item_type::HELM,ind));
}
@@ -592,11 +592,11 @@ void drawDebugCursorAndInfo(WorldSegment * segment, DFHack::Core * c)
{
if(b->inv->Gloves[ind].matt.type < 0)
continue;
- const char* matName = lookupMaterialTypeName(b->inv->Gloves[ind].matt.type);
- const char* subMatName = lookupMaterialName(b->inv->Gloves[ind].matt.type,b->inv->Gloves[ind].matt.index);
+ MaterialInfo mat;
+ mat.decode(b->inv->Gloves[ind].matt.type,b->inv->Gloves[ind].matt.index);
draw_textf_border(font, al_map_rgb(255,255,255), 2, (i++*al_get_font_line_height(font)), 0,
- " %s%s%s - %s/%s",
- matName?matName:"Unknown",subMatName?"/":"",subMatName?subMatName:"",
+ " %s - %s/%s",
+ mat.getToken().c_str(),
ENUM_KEY_STR(item_type, item_type::GLOVES),
get_item_subtype(item_type::GLOVES,ind));
}
@@ -609,11 +609,11 @@ void drawDebugCursorAndInfo(WorldSegment * segment, DFHack::Core * c)
{
if(b->inv->Pants[ind].matt.type < 0)
continue;
- const char* matName = lookupMaterialTypeName(b->inv->Pants[ind].matt.type);
- const char* subMatName = lookupMaterialName(b->inv->Pants[ind].matt.type,b->inv->Pants[ind].matt.index);
+ MaterialInfo mat;
+ mat.decode(b->inv->Pants[ind].matt.type,b->inv->Pants[ind].matt.index);
draw_textf_border(font, al_map_rgb(255,255,255), 2, (i++*al_get_font_line_height(font)), 0,
- " %s%s%s - %s/%s",
- matName?matName:"Unknown",subMatName?"/":"",subMatName?subMatName:"",
+ " %s - %s/%s",
+ mat.getToken().c_str(),
ENUM_KEY_STR(item_type, item_type::PANTS),
get_item_subtype(item_type::PANTS,ind));
}
diff --git a/MapLoading.cpp b/MapLoading.cpp
index 89a9bac..1fd62f1 100644
--- a/MapLoading.cpp
+++ b/MapLoading.cpp
@@ -302,7 +302,7 @@ void ReadCellToSegment(DFHack::Core& DF, WorldSegment& segment, int CellX, int C
{
b->mudlevel = level;
}
- else if(splatter[i]->mat_type == MAT_BASICS::ICE)
+ else if(splatter[i]->mat_type == ICE)
{
b->snowlevel = level;
}
diff --git a/SpriteObjects.cpp b/SpriteObjects.cpp
index 2e3c749..9743666 100644
--- a/SpriteObjects.cpp
+++ b/SpriteObjects.cpp
@@ -7,6 +7,15 @@
#include "SpriteMaps.h"
#include <cmath>
+#include "df/world_raws.h"
+#include "df/itemdef_weaponst.h"
+#include "df/itemdef_armorst.h"
+#include "df/itemdef_shoesst.h"
+#include "df/itemdef_shieldst.h"
+#include "df/itemdef_helmst.h"
+#include "df/itemdef_glovesst.h"
+#include "df/itemdef_pantsst.h"
+
#define ALL_BORDERS 255
unsigned char get_water_direction( Block *b )
@@ -191,6 +200,8 @@ void c_sprite::reset(void)
animate = 1;
bloodsprite = 0;
spritescale=1.0f;
+ itemtype= -1;
+ itemsubtype=-1;
{
for(int i = 0; i < subsprites.size(); i++)
{
@@ -477,6 +488,56 @@ void c_sprite::set_by_xml(TiXmlElement *elemSprite)
}
else grasstype = lookupIndexedType(idstr,contentLoader->organic);
+ //find the item type
+ const char* equiptypestr = elemSprite->Attribute("equipment_class");
+ if (equiptypestr == NULL || equiptypestr[0] == 0)
+ {
+ itemtype = INVALID_INDEX;
+ }
+ else for(int index=ENUM_FIRST_ITEM(item_type); index <= ENUM_LAST_ITEM(item_type); index++)
+ {
+ if(strcmp(equiptypestr, ENUM_KEY_STR(item_type, (item_type::item_type)index)) == 0)
+ itemtype = index;
+ }
+
+ const char* equipsindexstr = elemSprite->Attribute("equipment_name");
+ if (equipsindexstr == NULL || equipsindexstr[0] == 0)
+ {
+ itemsubtype = INVALID_INDEX;
+ }
+ else
+ {
+ df::world_raws::T_itemdefs &defs = df::global::world->raws.itemdefs;
+ switch(itemtype)
+ {
+ case item_type::WEAPON:
+ itemsubtype = lookupIndexedPonterType(equipsindexstr, defs.weapons);
+ break;
+ case item_type::ARMOR:
+ itemsubtype = lookupIndexedPonterType(equipsindexstr, defs.armor);
+ break;
+ case item_type::SHOES:
+ itemsubtype = lookupIndexedPonterType(equipsindexstr, defs.shoes);
+ break;
+ case item_type::SHIELD:
+ itemsubtype = lookupIndexedPonterType(equipsindexstr, defs.shields);
+ break;
+ case item_type::HELM:
+ itemsubtype = lookupIndexedPonterType(equipsindexstr, defs.helms);
+ break;
+ case item_type::GLOVES:
+ itemsubtype = lookupIndexedPonterType(equipsindexstr, defs.gloves);
+ break;
+ case item_type::PANTS:
+ itemsubtype = lookupIndexedPonterType(equipsindexstr, defs.pants);
+ break;
+ default:
+ itemsubtype = INVALID_INDEX;
+ }
+ }
+
+
+
//Should the sprite be shown only when there is blood?
const char* spritebloodMinStr = elemSprite->Attribute("blood_min");
if (spritebloodMinStr == NULL || spritebloodMinStr[0] == 0)
@@ -607,231 +668,271 @@ void c_sprite::draw_world_offset(int x, int y, int z, Block * b, int tileoffset,
//if the xml says that this is a blood sprite, and offset is set here for proper pooling. this over-rides the random offset.
if(bloodsprite)
randoffset = getBloodOffset(b);
- if((water_direction < 0) || (water_direction == get_relative_water_direction(b)))
+ if(!((water_direction < 0) || (water_direction == get_relative_water_direction(b))))
+ goto draw_subsprite;
+ if(!( //these are all border conditions. this first section is a list of positive conditions. if at least one of the border conditions is met, the tile can be shown.
+ (openborders & b->openborders) ||
+ (upstairborders & b->upstairborders) ||
+ (downstairborders & b->downstairborders) ||
+ (rampborders & b->rampborders) ||
+ (wallborders & b->wallborders) ||
+ (floorborders & b->floorborders) ||
+ (lightborders & b->lightborders)
+ ))
+ goto draw_subsprite;
+ if( //This second block consists of negative conditions. if /any/ of these border conditions are met, the tile will not be drawn
+ (notopenborders & b->openborders) ||
+ (notupstairborders & b->upstairborders) ||
+ (notdownstairborders & b->downstairborders) ||
+ (notrampborders & b->rampborders) ||
+ (notwallborders & b->wallborders) ||
+ (notfloorborders & b->floorborders) ||
+ (darkborders & b->lightborders)
+ )
+ goto draw_subsprite;
+ int foo = 0;
+ if(!(snowmin <= b->snowlevel && (snowmax == -1 || snowmax >= b->snowlevel)))
+ goto draw_subsprite;
+ if (!(bloodmin <= b->bloodlevel && (bloodmax == -1 || bloodmax >= b->bloodlevel)))
+ goto draw_subsprite;
+ if(!(mudmin <= b->mudlevel && (mudmax == -1 || mudmax >= b->mudlevel)))
+ goto draw_subsprite;
+ if(!(grassmin <= b->grasslevel && (grassmax == -1 || grassmax >= b->grasslevel)))
+ goto draw_subsprite;
+ //only bother with this tile if it's in the light, or not.
+ if(!((light==LIGHTANY) || ((light==LIGHTYES) && b->designation.bits.outside) || ((light==LIGHTNO) && !(b->designation.bits.outside))))
+ goto draw_subsprite;
+ if(!((grasstype == -1) || (grasstype == b->grassmat)))
+ goto draw_subsprite;
+ if(!((grass_growth == GRASS_GROWTH_ANY) ||
+ ((grass_growth == GRASS_GROWTH_NORMAL) &&
+ ((b->tileMaterial == tiletype_material::GRASS_DARK) ||
+ (b->tileMaterial == tiletype_material::GRASS_LIGHT))) ||
+ ((grass_growth == GRASS_GROWTH_DRY) &&
+ (b->tileMaterial == tiletype_material::GRASS_DRY)) ||
+ ((grass_growth == GRASS_GROWTH_DEAD) &&
+ (b->tileMaterial == tiletype_material::GRASS_DEAD))))
+ goto draw_subsprite;
+
+ if(itemtype != INVALID_INDEX) //fixme: we need to store basic types separately and use them.
{
- if(( //these are all border conditions. this first section is a list of positive conditions. if at least one of the border conditions is met, the tile can be shown.
- (openborders & b->openborders) ||
- (upstairborders & b->upstairborders) ||
- (downstairborders & b->downstairborders) ||
- (rampborders & b->rampborders) ||
- (wallborders & b->wallborders) ||
- (floorborders & b->floorborders) ||
- (lightborders & b->lightborders)
- ) && !( //This second block consists of negative conditions. if /any/ of these border conditions are met, the tile will not be drawn
- (notopenborders & b->openborders) ||
- (notupstairborders & b->upstairborders) ||
- (notdownstairborders & b->downstairborders) ||
- (notrampborders & b->rampborders) ||
- (notwallborders & b->wallborders) ||
- (notfloorborders & b->floorborders) ||
- (darkborders & b->lightborders)
- ))
+ if(!b->inv)
+ goto draw_subsprite;
+ switch (itemtype)
{
- int foo = 0;
- if(
- (
- snowmin <= b->snowlevel &&
- (snowmax == -1 || snowmax >= b->snowlevel)
- ) &&
- (
- bloodmin <= b->bloodlevel &&
- (bloodmax == -1 || bloodmax >= b->bloodlevel)
- ) &&
- (
- mudmin <= b->mudlevel &&
- (mudmax == -1 || mudmax >= b->mudlevel)
- ) &&
- (
- grassmin <= b->grasslevel &&
- (grassmax == -1 || grassmax >= b->grasslevel)
- ) &&
- //only bother with this tile if it's in the light, or not.
- (
- (light==LIGHTANY) ||
- (
- (light==LIGHTYES) && b->designation.bits.outside
- )
- ||
- (
- (light==LIGHTNO) && !(b->designation.bits.outside)
- )
- ) &&
- (
- (grasstype == -1) || (grasstype == b->grassmat)
- ) &&
- (
- (grass_growth == GRASS_GROWTH_ANY) ||
- (
- (grass_growth == GRASS_GROWTH_NORMAL) &&
- (
- (b->tileMaterial == tiletype_material::GRASS_DARK) ||
- (b->tileMaterial == tiletype_material::GRASS_LIGHT)
- )
- ) ||
- (
- (grass_growth == GRASS_GROWTH_DRY) &&
- (b->tileMaterial == tiletype_material::GRASS_DRY)
- ) ||
- (
- (grass_growth == GRASS_GROWTH_DEAD) &&
- (b->tileMaterial == tiletype_material::GRASS_DEAD)
- )
- )
- )
- {
- int32_t drawx = x;
- int32_t drawy = y;
- int32_t drawz = z; //- ownerSegment->sizez + 1;
-
- correctBlockForSegmetOffset( drawx, drawy, drawz);
- correctBlockForRotation( drawx, drawy, drawz, b->ownerSegment->rotation);
- int32_t viewx = drawx;
- int32_t viewy = drawy;
- int32_t viewz = drawz;
- pointToScreen((int*)&drawx, (int*)&drawy, drawz);
- drawx -= (TILEWIDTH>>1)*config.scale;
-
- if(((drawx + spritewidth*config.scale) < 0) || (drawx > al_get_bitmap_width(al_get_target_bitmap())) || ((drawy + spriteheight*config.scale) < 0) || (drawy > al_get_bitmap_height(al_get_target_bitmap())))
- return;
-
- int sheetx, sheety;
- if(tilelayout == BLOCKTILE)
- {
- sheetx = ((sheetindex+tileoffset+randoffset) % SHEET_OBJECTSWIDE) * spritewidth;
- sheety = ((sheetindex+tileoffset+randoffset) / SHEET_OBJECTSWIDE) * spriteheight;
- }
- else if(tilelayout == RAMPBOTTOMTILE)
- {
- sheetx = SPRITEWIDTH * b->ramp.index;
- sheety = ((TILEHEIGHT + FLOORHEIGHT + SPRITEHEIGHT) * (sheetindex+tileoffset+randoffset))+(TILEHEIGHT + FLOORHEIGHT);
- }
- else if(tilelayout == RAMPTOPTILE)
- {
- sheetx = SPRITEWIDTH * b->ramp.index;
- sheety = (TILEHEIGHT + FLOORHEIGHT + SPRITEHEIGHT) * (sheetindex+tileoffset+randoffset);
- }
- else
- {
- sheetx = ((sheetindex+tileoffset+randoffset) % SHEET_OBJECTSWIDE) * spritewidth;
- sheety = ((sheetindex+tileoffset+randoffset) / SHEET_OBJECTSWIDE) * spriteheight;
- }
- ALLEGRO_COLOR shade_color = get_color(b);
- if(!b->designation.bits.pile && config.fog_of_war && (contentLoader->gameMode.g_mode == GAMEMODE_ADVENTURE))
- {
- shade_color.r *= 0.25f;
- shade_color.g *= 0.25f;
- shade_color.b *= 0.25f;
- }
- if(chop && ( halftile == HALFTILECHOP))
- {
- if(fileindex < 0)
- {
- if(config.block_count)
- config.drawcount ++;
- if(shade_color.a > 0.001f)
- al_draw_tinted_scaled_bitmap(
- defaultsheet, premultiply(shade_color),
- sheetx * spritescale,
- (sheety+WALL_CUTOFF_HEIGHT) * spritescale,
- spritewidth * spritescale,
- (spriteheight-WALL_CUTOFF_HEIGHT) * spritescale,
- drawx + (offset_x + offset_user_x)*config.scale,
- drawy + (offset_user_y + (offset_y - WALLHEIGHT)+WALL_CUTOFF_HEIGHT)*config.scale,
- spritewidth*config.scale,
- (spriteheight-WALL_CUTOFF_HEIGHT)*config.scale,
- 0);
- }
- else
- {
- if(config.block_count)
- config.drawcount ++;
-
- if(shade_color.a > 0.001f)
- al_draw_tinted_scaled_bitmap(
- getImgFile(fileindex),
- premultiply(shade_color),
- sheetx * spritescale,
- (sheety+WALL_CUTOFF_HEIGHT) * spritescale,
- spritewidth * spritescale,
- (spriteheight-WALL_CUTOFF_HEIGHT) * spritescale,
- drawx + (offset_x + offset_user_x)*config.scale,
- drawy + (offset_user_y + (offset_y - WALLHEIGHT)+WALL_CUTOFF_HEIGHT)*config.scale,
- spritewidth*config.scale,
- (spriteheight-WALL_CUTOFF_HEIGHT)*config.scale,
- 0);
- }
- //draw cut-off floor thing
- if(config.block_count)
- config.drawcount ++;
-
- if(shade_color.a > 0.001f)
- al_draw_scaled_bitmap(IMGObjectSheet,
- TILEWIDTH * SPRITEFLOOR_CUTOFF, 0,
- SPRITEWIDTH, SPRITEWIDTH,
- drawx+offset_x, drawy+offset_y-((SPRITEHEIGHT-WALL_CUTOFF_HEIGHT)/2),
- SPRITEWIDTH*config.scale, SPRITEWIDTH*config.scale, 0);
- }
- else if ((chop && (halftile == HALFTILEYES)) || (!chop && (halftile == HALFTILENO)) || (!chop && (halftile == HALFTILECHOP)) || (halftile == HALFTILEBOTH))
- {
- if((isoutline == OUTLINENONE) || ((isoutline == OUTLINERIGHT) && (b->depthBorderNorth)) || ((isoutline == OUTLINELEFT) && (b->depthBorderWest)) || ((isoutline == OUTLINEBOTTOM) && (b->depthBorderDown)))
- {
- if(fileindex < 0)
- {
- if(config.block_count)
- config.drawcount ++;
-
- if(shade_color.a > 0.001f)
- al_draw_tinted_scaled_bitmap(
- defaultsheet, premultiply(shade_color),
- sheetx * spritescale,
- sheety * spritescale,
- spritewidth * spritescale,
- spriteheight * spritescale,
- drawx + (offset_x + offset_user_x)*config.scale,
- drawy + (offset_user_y + (offset_y - WALLHEIGHT))*config.scale,
- spritewidth*config.scale,
- spriteheight*config.scale,
- 0);
- }
- else
- {
- if(config.block_count)
- config.drawcount ++;
-
- if(shade_color.a > 0.001f)
- al_draw_tinted_scaled_bitmap(
- getImgFile(fileindex),
- premultiply(shade_color),
- sheetx * spritescale,
- sheety * spritescale,
- spritewidth * spritescale,
- spriteheight * spritescale,
- drawx + (offset_x + offset_user_x)*config.scale,
- drawy + (offset_user_y + (offset_y - WALLHEIGHT))*config.scale,
- spritewidth*config.scale,
- spriteheight*config.scale,
- 0);
- }
- }
- if(needoutline)
- {
- //drawy -= (WALLHEIGHT);
- //Northern border
- if(b->depthBorderNorth)
- DrawSpriteFromSheet(281, IMGObjectSheet, al_map_rgb(255,255,255), drawx + (offset_x)*config.scale, drawy + (offset_y)*config.scale, b );
+ case item_type::WEAPON:
+ if(b->inv->Weapons.empty())
+ goto draw_subsprite;
+ if(itemsubtype >= b->inv->Weapons.size())
+ goto draw_subsprite;
+ if(b->inv->Weapons[itemsubtype].matt.type == INVALID_INDEX)
+ goto draw_subsprite;
+ break;
+ case item_type::ARMOR:
+ if(b->inv->Armor.empty())
+ goto draw_subsprite;
+ if(itemsubtype >= b->inv->Armor.size())
+ goto draw_subsprite;
+ if(b->inv->Armor[itemsubtype].matt.type == INVALID_INDEX)
+ goto draw_subsprite;
+ break;
+ case item_type::SHOES:
+ if(b->inv->Shoes.empty())
+ goto draw_subsprite;
+ if(itemsubtype >= b->inv->Shoes.size())
+ goto draw_subsprite;
+ if(b->inv->Shoes[itemsubtype].matt.type == INVALID_INDEX)
+ goto draw_subsprite;
+ break;
+ case item_type::SHIELD:
+ if(b->inv->Shield.empty())
+ goto draw_subsprite;
+ if(itemsubtype >= b->inv->Shield.size())
+ goto draw_subsprite;
+ if(b->inv->Shield[itemsubtype].matt.type == INVALID_INDEX)
+ goto draw_subsprite;
+ break;
+ case item_type::HELM:
+ if(b->inv->Helm.empty())
+ goto draw_subsprite;
+ if(itemsubtype >= b->inv->Helm.size())
+ goto draw_subsprite;
+ if(b->inv->Helm[itemsubtype].matt.type == INVALID_INDEX)
+ goto draw_subsprite;
+ break;
+ case item_type::GLOVES:
+ if(b->inv->Gloves.empty())
+ goto draw_subsprite;
+ if(itemsubtype >= b->inv->Gloves.size())
+ goto draw_subsprite;
+ if(b->inv->Gloves[itemsubtype].matt.type == INVALID_INDEX)
+ goto draw_subsprite;
+ break;
+ case item_type::PANTS:
+ if(b->inv->Pants.empty())
+ goto draw_subsprite;
+ if(itemsubtype >= b->inv->Pants.size())
+ goto draw_subsprite;
+ if(b->inv->Pants[itemsubtype].matt.type == INVALID_INDEX)
+ goto draw_subsprite;
+ break;
+ default:
+ goto draw_subsprite;
+ }
+ }
- //Western border
- if(b->depthBorderWest)
- DrawSpriteFromSheet(280, IMGObjectSheet, al_map_rgb(255,255,255), drawx + (offset_x)*config.scale, drawy + (offset_y)*config.scale, b );
- //drawy += (WALLHEIGHT);
- }
- }
- //draw_textf_border(font, al_map_rgb(255,255,255), drawx, drawy, 0, "%d,%d", fileindex, sheetindex);
+ int32_t drawx = x;
+ int32_t drawy = y;
+ int32_t drawz = z; //- ownerSegment->sizez + 1;
+
+ correctBlockForSegmetOffset( drawx, drawy, drawz);
+ correctBlockForRotation( drawx, drawy, drawz, b->ownerSegment->rotation);
+ int32_t viewx = drawx;
+ int32_t viewy = drawy;
+ int32_t viewz = drawz;
+ pointToScreen((int*)&drawx, (int*)&drawy, drawz);
+ drawx -= (TILEWIDTH>>1)*config.scale;
+
+ if(((drawx + spritewidth*config.scale) < 0) || (drawx > al_get_bitmap_width(al_get_target_bitmap())) || ((drawy + spriteheight*config.scale) < 0) || (drawy > al_get_bitmap_height(al_get_target_bitmap())))
+ return;
+
+ int sheetx, sheety;
+ if(tilelayout == BLOCKTILE)
+ {
+ sheetx = ((sheetindex+tileoffset+randoffset) % SHEET_OBJECTSWIDE) * spritewidth;
+ sheety = ((sheetindex+tileoffset+randoffset) / SHEET_OBJECTSWIDE) * spriteheight;
+ }
+ else if(tilelayout == RAMPBOTTOMTILE)
+ {
+ sheetx = SPRITEWIDTH * b->ramp.index;
+ sheety = ((TILEHEIGHT + FLOORHEIGHT + SPRITEHEIGHT) * (sheetindex+tileoffset+randoffset))+(TILEHEIGHT + FLOORHEIGHT);
+ }
+ else if(tilelayout == RAMPTOPTILE)
+ {
+ sheetx = SPRITEWIDTH * b->ramp.index;
+ sheety = (TILEHEIGHT + FLOORHEIGHT + SPRITEHEIGHT) * (sheetindex+tileoffset+randoffset);
+ }
+ else
+ {
+ sheetx = ((sheetindex+tileoffset+randoffset) % SHEET_OBJECTSWIDE) * spritewidth;
+ sheety = ((sheetindex+tileoffset+randoffset) / SHEET_OBJECTSWIDE) * spriteheight;
+ }
+ ALLEGRO_COLOR shade_color = get_color(b);
+ if(!b->designation.bits.pile && config.fog_of_war && (contentLoader->gameMode.g_mode == GAMEMODE_ADVENTURE))
+ {
+ shade_color.r *= 0.25f;
+ shade_color.g *= 0.25f;
+ shade_color.b *= 0.25f;
+ }
+ if(chop && ( halftile == HALFTILECHOP))
+ {
+ if(fileindex < 0)
+ {
+ if(config.block_count)
+ config.drawcount ++;
+ if(shade_color.a > 0.001f)
+ al_draw_tinted_scaled_bitmap(
+ defaultsheet, premultiply(shade_color),
+ sheetx * spritescale,
+ (sheety+WALL_CUTOFF_HEIGHT) * spritescale,
+ spritewidth * spritescale,
+ (spriteheight-WALL_CUTOFF_HEIGHT) * spritescale,
+ drawx + (offset_x + offset_user_x)*config.scale,
+ drawy + (offset_user_y + (offset_y - WALLHEIGHT)+WALL_CUTOFF_HEIGHT)*config.scale,
+ spritewidth*config.scale,
+ (spriteheight-WALL_CUTOFF_HEIGHT)*config.scale,
+ 0);
+ }
+ else
+ {
+ if(config.block_count)
+ config.drawcount ++;
+
+ if(shade_color.a > 0.001f)
+ al_draw_tinted_scaled_bitmap(
+ getImgFile(fileindex),
+ premultiply(shade_color),
+ sheetx * spritescale,
+ (sheety+WALL_CUTOFF_HEIGHT) * spritescale,
+ spritewidth * spritescale,
+ (spriteheight-WALL_CUTOFF_HEIGHT) * spritescale,
+ drawx + (offset_x + offset_user_x)*config.scale,
+ drawy + (offset_user_y + (offset_y - WALLHEIGHT)+WALL_CUTOFF_HEIGHT)*config.scale,
+ spritewidth*config.scale,
+ (spriteheight-WALL_CUTOFF_HEIGHT)*config.scale,
+ 0);
+ }
+ //draw cut-off floor thing
+ if(config.block_count)
+ config.drawcount ++;
+
+ if(shade_color.a > 0.001f)
+ al_draw_scaled_bitmap(IMGObjectSheet,
+ TILEWIDTH * SPRITEFLOOR_CUTOFF, 0,
+ SPRITEWIDTH, SPRITEWIDTH,
+ drawx+offset_x, drawy+offset_y-((SPRITEHEIGHT-WALL_CUTOFF_HEIGHT)/2),
+ SPRITEWIDTH*config.scale, SPRITEWIDTH*config.scale, 0);
+ }
+ else if ((chop && (halftile == HALFTILEYES)) || (!chop && (halftile == HALFTILENO)) || (!chop && (halftile == HALFTILECHOP)) || (halftile == HALFTILEBOTH))
+ {
+ if((isoutline == OUTLINENONE) || ((isoutline == OUTLINERIGHT) && (b->depthBorderNorth)) || ((isoutline == OUTLINELEFT) && (b->depthBorderWest)) || ((isoutline == OUTLINEBOTTOM) && (b->depthBorderDown)))
+ {
+ if(fileindex < 0)
+ {
+ if(config.block_count)
+ config.drawcount ++;
+
+ if(shade_color.a > 0.001f)
+ al_draw_tinted_scaled_bitmap(
+ defaultsheet, premultiply(shade_color),
+ sheetx * spritescale,
+ sheety * spritescale,
+ spritewidth * spritescale,
+ spriteheight * spritescale,
+ drawx + (offset_x + offset_user_x)*config.scale,
+ drawy + (offset_user_y + (offset_y - WALLHEIGHT))*config.scale,
+ spritewidth*config.scale,
+ spriteheight*config.scale,
+ 0);
+ }
+ else
+ {
+ if(config.block_count)
+ config.drawcount ++;
+
+ if(shade_color.a > 0.001f)
+ al_draw_tinted_scaled_bitmap(
+ getImgFile(fileindex),
+ premultiply(shade_color),
+ sheetx * spritescale,
+ sheety * spritescale,
+ spritewidth * spritescale,
+ spriteheight * spritescale,
+ drawx + (offset_x + offset_user_x)*config.scale,
+ drawy + (offset_user_y + (offset_y - WALLHEIGHT))*config.scale,
+ spritewidth*config.scale,
+ spriteheight*config.scale,
+ 0);
}
}
+ if(needoutline)
+ {
+ //drawy -= (WALLHEIGHT);
+ //Northern border
+ if(b->depthBorderNorth)
+ DrawSpriteFromSheet(281, IMGObjectSheet, al_map_rgb(255,255,255), drawx + (offset_x)*config.scale, drawy + (offset_y)*config.scale, b );
+
+ //Western border
+ if(b->depthBorderWest)
+ DrawSpriteFromSheet(280, IMGObjectSheet, al_map_rgb(255,255,255), drawx + (offset_x)*config.scale, drawy + (offset_y)*config.scale, b );
+
+ //drawy += (WALLHEIGHT);
+ }
}
+ //draw_textf_border(font, al_map_rgb(255,255,255), drawx, drawy, 0, "%d,%d", fileindex, sheetindex);
}
+draw_subsprite:
if(!subsprites.empty())
{
for(int i = 0; i < subsprites.size(); i++)
@@ -899,17 +1000,17 @@ ALLEGRO_COLOR c_sprite::get_color(void* block)
case ShadeVein:
return lookupMaterialColor(b->veinMaterial.type, b->veinMaterial.index);
case ShadeMatFore:
- return config.colors.getDfColor(lookupMaterialFore(b->material.type, b->material.index), lookupMaterialBright(b->material.type, b->material.index));
+ return config.colors.getDfColor(lookupMaterialFore(b->material.type, b->material.index), lookupMaterialBright(b->material.type, b->material.index));
case ShadeMatBack:
- return config.colors.getDfColor(lookupMaterialBack(b->material.type, b->material.index));
+ return config.colors.getDfColor(lookupMaterialBack(b->material.type, b->material.index));
case ShadeLayerFore:
- return config.colors.getDfColor(lookupMaterialFore(b->layerMaterial.type, b->layerMaterial.index), lookupMaterialBright(b->layerMaterial.type, b->layerMaterial.index));
+ return config.colors.getDfColor(lookupMaterialFore(b->layerMaterial.type, b->layerMaterial.index), lookupMaterialBright(b->layerMaterial.type, b->layerMaterial.index));
case ShadeLayerBack:
- return config.colors.getDfColor(lookupMaterialBack(b->layerMaterial.type, b->layerMaterial.index));
+ return config.colors.getDfColor(lookupMaterialBack(b->layerMaterial.type, b->layerMaterial.index));
case ShadeVeinFore:
- return config.colors.getDfColor(lookupMaterialFore(b->veinMaterial.type, b->veinMaterial.index), lookupMaterialBright(b->veinMaterial.type, b->veinMaterial.index));
+ return config.colors.getDfColor(lookupMaterialFore(b->veinMaterial.type, b->veinMaterial.index), lookupMaterialBright(b->veinMaterial.type, b->veinMaterial.index));
case ShadeVeinBack:
- return config.colors.getDfColor(lookupMaterialBack(b->veinMaterial.type, b->veinMaterial.index));
+ return config.colors.getDfColor(lookupMaterialBack(b->veinMaterial.type, b->veinMaterial.index));
case ShadeBodyPart:
if(b->creaturePresent)
{
@@ -961,6 +1062,47 @@ ALLEGRO_COLOR c_sprite::get_color(void* block)
else return al_map_rgb(255,255,255);
case ShadeBlood:
return b->bloodcolor;
+ case ShadeItem:
+ if(itemsubtype >=0)
+ {
+ //FIXME: need a way to get a material for generic types.
+ switch(itemtype)
+ {
+ case -1:
+ return al_map_rgb(255, 255, 255);
+ case item_type::WEAPON:
+ if(itemsubtype < b->inv->Weapons.size())
+ return lookupMaterialColor(b->inv->Weapons[itemsubtype].matt.type, b->inv->Weapons[itemsubtype].matt.index);
+ break;
+ case item_type::ARMOR:
+ if(itemsubtype < b->inv->Armor.size())
+ return lookupMaterialColor(b->inv->Armor[itemsubtype].matt.type, b->inv->Armor[itemsubtype].matt.index);
+ break;
+ case item_type::SHOES:
+ if(itemsubtype < b->inv->Shoes.size())
+ return lookupMaterialColor(b->inv->Shoes[itemsubtype].matt.type, b->inv->Shoes[itemsubtype].matt.index);
+ break;
+ case item_type::SHIELD:
+ if(itemsubtype < b->inv->Shield.size())
+ return lookupMaterialColor(b->inv->Shield[itemsubtype].matt.type, b->inv->Shield[itemsubtype].matt.index);
+ break;
+ case item_type::GLOVES:
+ if(itemsubtype < b->inv->Weapons.size())
+ return lookupMaterialColor(b->inv->Gloves[itemsubtype].matt.type, b->inv->Gloves[itemsubtype].matt.index);
+ break;
+ case item_type::PANTS:
+ if(itemsubtype < b->inv->Pants.size())
+ return lookupMaterialColor(b->inv->Pants[itemsubtype].matt.type, b->inv->Pants[itemsubtype].matt.index);
+ break;
+ case item_type::HELM:
+ if(itemsubtype < b->inv->Helm.size())
+ return lookupMaterialColor(b->inv->Helm[itemsubtype].matt.type, b->inv->Helm[itemsubtype].matt.index);
+ break;
+ default:
+ return al_map_rgb(255, 255, 255);
+ }
+ }
+ else return al_map_rgb(255,255,255);
default:
return al_map_rgb(255, 255, 255);
} ;
diff --git a/SpriteObjects.h b/SpriteObjects.h
index 4cfa51a..1075d5c 100644
--- a/SpriteObjects.h
+++ b/SpriteObjects.h
@@ -104,6 +104,9 @@ private:
uint8_t notrampborders;
uint8_t notupstairborders;
uint8_t notdownstairborders;
+
+ int itemtype;
+ int itemsubtype;
public:
c_sprite(void);
~c_sprite(void);
diff --git a/commonTypes.h b/commonTypes.h
index 398a3cc..dde0695 100644
--- a/commonTypes.h
+++ b/commonTypes.h
@@ -21,12 +21,7 @@ enum ShadeBy
ShadeBlood,
ShadeBuilding,
ShadeGrass,
- ShadeWeapon,
- ShadeArmor,
- ShadeShoes,
- ShadeShield,
- ShadeHelm,
- ShadeGloves
+ ShadeItem
} ;
struct t_subSprite
{
diff --git a/main.cpp b/main.cpp
index a49739a..d1f9b54 100644
--- a/main.cpp
+++ b/main.cpp
@@ -233,7 +233,6 @@ void drawcredits()
static void main_loop(ALLEGRO_DISPLAY * display, ALLEGRO_EVENT_QUEUE *queue, ALLEGRO_THREAD * main_thread, DFHack::Console & con, DFHack::Core * core)
{
ALLEGRO_EVENT event;
- DFHack::t_gamemodes game_mode;
while (!al_get_thread_should_stop(main_thread))
{
if (redraw && al_event_queue_is_empty(queue))
diff --git a/resources/creatures/clothed_Dwarves.xml b/resources/creatures/clothed_Dwarves.xml
index 8ff375d..c89aef4 100644
--- a/resources/creatures/clothed_Dwarves.xml
+++ b/resources/creatures/clothed_Dwarves.xml
@@ -17,9 +17,10 @@
<variant caste="FEMALE" sheetIndex="0" color="bodypart" bodypart="skin" >
<subsprite sheetIndex="3" color="bodypart" bodypart="hair" />
<subsprite sheetIndex="4" />
- <subsprite sheetIndex="86" color="helm"/>
- <subsprite sheetIndex="88" color="shoes"/>
- <subsprite sheetIndex="89" color="armor"/>
+ <subsprite sheetIndex="86" equipment_class="HELM" equipment_name="ITEM_HELM_CAP" color="equipment"/>
+ <subsprite sheetIndex="87" equipment_class="SHOES" equipment_name="ITEM_SHOES_SHOES" color="equipment"/>
+ <subsprite sheetIndex="89" equipment_class="PANTS" equipment_name="ITEM_PANTS_SKIRT" color="equipment"/>
+ <subsprite sheetIndex="88" equipment_class="ARMOR" equipment_name="ITEM_ARMOR_MAIL_SHIRT" color="equipment"/>
</variant>
</creature>
</creatures>
diff --git a/resources/creatures/color_dwarves.png b/resources/creatures/color_dwarves.png
index 2ef8f64..f1843ca 100644
--- a/resources/creatures/color_dwarves.png
+++ b/resources/creatures/color_dwarves.png
Binary files differ