summaryrefslogtreecommitdiff
path: root/Creatures.cpp
diff options
context:
space:
mode:
authorCaldfir2012-03-16 02:38:22 -0700
committerCaldfir2012-03-16 02:38:22 -0700
commit0539996f01e34b9238d6d14ddb164c12037bd775 (patch)
treed050db94dcfdf2d13ec937d7df77490ffc3f296e /Creatures.cpp
parent89b6ecb6d01f92f0df2ea23ef6a9fff796167f07 (diff)
downloadstonesense-0539996f01e34b9238d6d14ddb164c12037bd775.tar.gz
stonesense-0539996f01e34b9238d6d14ddb164c12037bd775.tar.bz2
stonesense-0539996f01e34b9238d6d14ddb164c12037bd775.tar.xz
Fixed a careless versioning issue and cleaned up how status icons/profession icons/creature names interact.
Diffstat (limited to 'Creatures.cpp')
-rw-r--r--Creatures.cpp114
1 files changed, 45 insertions, 69 deletions
diff --git a/Creatures.cpp b/Creatures.cpp
index 533d079..414e615 100644
--- a/Creatures.cpp
+++ b/Creatures.cpp
@@ -1,4 +1,4 @@
-#include "common.h"
+#include "common.h"
#include "Creatures.h"
#include "WorldSegment.h"
#include "CreatureConfiguration.h"
@@ -9,6 +9,9 @@
#include "DataDefs.h"
#include "df/world.h"
#include "df/unit_inventory_item.h"
+#include "df/item_constructed.h"
+#include "df/itemimprovement.h"
+#include "df/itemimprovement_threadst.h"
//vector<t_matgloss> v_creatureNames;
//vector<CreatureConfiguration> creatureTypes;
@@ -266,11 +269,11 @@ void DrawCreature(int drawx, int drawy, t_unit* creature, Block * b){
else if(creature->current_job.active && creature->current_job.jobType == 52)
statusIcons.push_back(17);
}
-
c_sprite * sprite = GetCreatureSpriteMap( creature );
- //if(creature->x == 151 && creature->y == 145)
- // int j = 10;
+
+ unsigned int offsety = config.show_creature_names ? al_get_font_line_height(font) : 0;
+
sprite->draw_world(creature->x,creature->y, creature->z, b);
if(statusIcons.size())
{
@@ -278,15 +281,17 @@ void DrawCreature(int drawx, int drawy, t_unit* creature, Block * b){
{
unsigned int sheetx = 16 * (statusIcons[i] % 7);
unsigned int sheety = 16 * (statusIcons[i] / 7);
- al_draw_bitmap_region(IMGStatusSheet, sheetx, sheety, 16, 16, drawx - (statusIcons.size()*8) + (16*i) + (SPRITEWIDTH/2), drawy - (16 + WALLHEIGHT + al_get_font_line_height(font)), 0);
+ al_draw_bitmap_region(IMGStatusSheet, sheetx, sheety, 16, 16, drawx - (statusIcons.size()*8) + (16*i) + (SPRITEWIDTH*config.scale/2), drawy - (16 + WALLHEIGHT*config.scale + offsety), 0);
}
}
+
+ offsety += config.show_creature_moods ? 16 : 0;
+
if(config.show_creature_jobs)
{
unsigned int sheetx = 16 * (creature->profession % 7);
unsigned int sheety = 16 * (creature->profession / 7);
- unsigned int offsety = statusIcons.size() ? 16 : 0;
- al_draw_bitmap_region(IMGStatusSheet, sheetx, sheety, 16, 16, drawx + (SPRITEWIDTH/2), drawy - (16 + WALLHEIGHT + al_get_font_line_height(font)) - offsety, 0);
+ al_draw_bitmap_region(IMGStatusSheet, sheetx, sheety, 16, 16, drawx -8 + (SPRITEWIDTH*config.scale/2), drawy - (16 + WALLHEIGHT*config.scale + offsety), 0);
}
}
@@ -411,69 +416,40 @@ void ReadCreaturesToSegment( DFHack::Core& DF, WorldSegment* segment)
item_type::item_type type = item->getType();
int8_t armor = item->getEffectiveArmorLevel();
- //FIXME: this could be made nicer. Somehow
- switch (item->getType())
- {
- case item_type::WEAPON:
- if(!b->inv)
- b->inv = new(Unit_Inventory);
- if(b->inv->Weapons.size() <= item->getSubtype())
- b->inv->Weapons.resize(item->getSubtype()+1);
- b->inv->Weapons[item->getSubtype()].matt.type = item->getActualMaterial();
- b->inv->Weapons[item->getSubtype()].matt.index = item->getActualMaterialIndex();
- break;
- case item_type::ARMOR:
- if(!b->inv)
- b->inv = new(Unit_Inventory);
- if(b->inv->Armor.size() <= item->getSubtype())
- b->inv->Armor.resize(item->getSubtype()+1);
- b->inv->Armor[item->getSubtype()].matt.type = item->getActualMaterial();
- b->inv->Armor[item->getSubtype()].matt.index = item->getActualMaterialIndex();
- break;
- case item_type::SHOES:
- if(!b->inv)
- b->inv = new(Unit_Inventory);
- if(b->inv->Shoes.size() <= item->getSubtype())
- b->inv->Shoes.resize(item->getSubtype()+1);
- b->inv->Shoes[item->getSubtype()].matt.type = item->getActualMaterial();
- b->inv->Shoes[item->getSubtype()].matt.index = item->getActualMaterialIndex();
- break;
- case item_type::SHIELD:
- if(!b->inv)
- b->inv = new(Unit_Inventory);
- if(b->inv->Shield.size() <= item->getSubtype())
- b->inv->Shield.resize(item->getSubtype()+1);
- b->inv->Shield[item->getSubtype()].matt.type = item->getActualMaterial();
- b->inv->Shield[item->getSubtype()].matt.index = item->getActualMaterialIndex();
- break;
- case item_type::HELM:
- if(!b->inv)
- b->inv = new(Unit_Inventory);
- if(b->inv->Helm.size() <= item->getSubtype())
- b->inv->Helm.resize(item->getSubtype()+1);
- b->inv->Helm[item->getSubtype()].matt.type = item->getActualMaterial();
- b->inv->Helm[item->getSubtype()].matt.index = item->getActualMaterialIndex();
- break;
- case item_type::GLOVES:
- if(!b->inv)
- b->inv = new(Unit_Inventory);
- if(b->inv->Gloves.size() <= item->getSubtype())
- b->inv->Gloves.resize(item->getSubtype()+1);
- b->inv->Gloves[item->getSubtype()].matt.type = item->getActualMaterial();
- b->inv->Gloves[item->getSubtype()].matt.index = item->getActualMaterialIndex();
- break;
- case item_type::PANTS:
- if(!b->inv)
- b->inv = new(Unit_Inventory);
- if(b->inv->Pants.size() <= item->getSubtype())
- b->inv->Pants.resize(item->getSubtype()+1);
- b->inv->Pants[item->getSubtype()].matt.type = item->getActualMaterial();
- b->inv->Pants[item->getSubtype()].matt.index = item->getActualMaterialIndex();
- break;
- default:
- // something unexpected. Should we react at all?
- break;
+
+ Worn_Item equipment;
+
+ equipment.matt.type = item->getActualMaterial();
+ equipment.matt.index = item->getActualMaterialIndex();
+
+ if(item->isDyed())
+ {
+ auto Constructed_Item = virtual_cast<df::item_constructed>(item);
+ if(Constructed_Item)
+ {
+ for(int idex = 0; idex < Constructed_Item->improvements.size(); idex++)
+ {
+ if(!Constructed_Item->improvements[idex])
+ continue;
+ if(Constructed_Item->improvements[idex]->getType() != improvement_type::THREAD)
+ continue;
+ auto Improvement_Thread = virtual_cast<df::itemimprovement_threadst>(Constructed_Item->improvements[idex]);
+ if(!Improvement_Thread)
+ continue;
+ equipment.matt.type = Improvement_Thread->dye.mat_type;
+ equipment.matt.index = Improvement_Thread->dye.mat_index;
+ }
+ }
}
+
+ //FIXME: this could be made nicer. Somehow
+ if(!b->inv)
+ b->inv = new(Unit_Inventory);
+ if(b->inv->item.size() <= type)
+ b->inv->item.resize(type+1);
+ if(b->inv->item[type].size() <= item->getSubtype())
+ b->inv->item[type].resize(item->getSubtype()+1);
+ b->inv->item[type][item->getSubtype()].push_back(equipment);
}
// need a new tempcreature now
// old tempcreature should be deleted when b is