summaryrefslogtreecommitdiff
path: root/Creatures.cpp
diff options
context:
space:
mode:
authorJapa Illo2012-03-15 12:53:19 +0100
committerJapa Illo2012-03-15 12:53:19 +0100
commit1bd9b2a540e52795cd3a9fbc402a1ee9736e1b70 (patch)
tree5a07fe3d331f690950327d0923e61bb78e3b7cc1 /Creatures.cpp
parent42de27ed582314bfb08fbf4ae61f6bdd8fb5fb8f (diff)
downloadstonesense-1bd9b2a540e52795cd3a9fbc402a1ee9736e1b70.tar.gz
stonesense-1bd9b2a540e52795cd3a9fbc402a1ee9736e1b70.tar.bz2
stonesense-1bd9b2a540e52795cd3a9fbc402a1ee9736e1b70.tar.xz
Got dyes to be detected properly. Also made the equipment drawing far neater.
Removed zoom in smoothing. it just looks bad. Signed-off-by: Japa Illo <japa.mala.illo@gmail.com>
Diffstat (limited to 'Creatures.cpp')
-rw-r--r--Creatures.cpp98
1 files changed, 36 insertions, 62 deletions
diff --git a/Creatures.cpp b/Creatures.cpp
index 0c5a906..5e1781c 100644
--- a/Creatures.cpp
+++ b/Creatures.cpp
@@ -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;
@@ -403,69 +406,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