Skip to content

Commit

Permalink
Fix seedwatch some more.
Browse files Browse the repository at this point in the history
  • Loading branch information
peterix committed Oct 30, 2011
1 parent 13ca2e6 commit a3a1629
Show file tree
Hide file tree
Showing 5 changed files with 381 additions and 282 deletions.
7 changes: 4 additions & 3 deletions Memory.xml
Original file line number Diff line number Diff line change
Expand Up @@ -758,8 +758,8 @@
<class name="building_hivest" />
</VTable>
<Offsets>
<Address name="WORLD" description="A huge object that many things in DF are part of. Contains the whole game and can be used as a base
for many of the addresses." />
<Address name="WORLD" description="A huge object that many things in DF are part of. Contains the whole game and can be used as a base for many of the addresses." />
<Address name="kitchen_limits" description="five vectors describing plants/items that can't be cooked/brewed" />
<Group name="vector" description="An STL vector.">
<HexValue name="sizeof" description="The total size in bytes." />
<Offset name="start" description="The offset where the actual start/end/alloc_end triplet is." />
Expand Down Expand Up @@ -2258,6 +2258,7 @@
<PETimeStamp value="0x4D90764F" />
<MD5 value="6ada05fc94785b53efe6aa5728b3756b" />
<Offsets>
<Address name="kitchen_limits" value="0x014F0BB4"/>
<Group name="GUI">
<Address name="hotkeys" value="0x14f5cc8" />
<Address name="interface" value="0x14f6070" />
Expand Down Expand Up @@ -3071,7 +3072,7 @@
<MD5 value="fc15065c4d1977ca019c6dad220413d1" />
<Offsets>
WORLD: 0x93f77a0

<Address name="kitchen_limits" value="0x93f2b00"/>
<Group name="GUI">
<Address name="hotkeys" value="0x93f740c" />
<Address name="interface" value="0x8C3E900" />
Expand Down
16 changes: 8 additions & 8 deletions library/include/dfhack/modules/Items.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,10 @@ class df_item
int16_t temperature_fraction;
public:
// 0x0
virtual int32_t getType();
virtual int16_t getSubtype();
virtual int16_t getMaterial();
virtual int32_t getMaterialIndex();
virtual t_itemType getType();
virtual t_itemSubtype getSubtype();
virtual t_materialType getMaterial();
virtual t_materialIndex getMaterialIndex();
// 0x10
/*
hm, [4] looks complicated *
Expand All @@ -170,13 +170,13 @@ class df_item
(0.31.25 Windows SDL)
*/
virtual void fn4(void);
virtual void setMaterial(int16_t mat);
virtual void setMaterialIndex (int32_t submat);
virtual void setMaterial(t_materialType mat);
virtual void setMaterialIndex (t_materialIndex submat);
// another one? really?
virtual int16_t getMaterial2();
virtual t_materialType getMaterial2();
// 0x20
// more of the same?
virtual int32_t getMaterialIndex2();
virtual t_materialIndex getMaterialIndex2();
virtual void fn9(void);
virtual void fn10(void);
virtual void fn11(void);
Expand Down
31 changes: 17 additions & 14 deletions library/include/dfhack/modules/Materials.h
Original file line number Diff line number Diff line change
Expand Up @@ -501,16 +501,16 @@ namespace DFHack
std::vector<std::string *> prefstring;
std::vector<df_material *> materials;
// materials and material indexes - only valid when appropriate flags in the BitArray are set
int16_t material_basic_mat;
int16_t material_tree;
int16_t material_drink;
int16_t material_seed;
int16_t material_thread;
int16_t material_mill;
int16_t material_extract_vial;
int16_t material_extract_barrel;
int16_t material_extract_still_vial;
int16_t material_leaves;
int16_t material_type_basic_mat;
int16_t material_type_tree;
int16_t material_type_drink;
int16_t material_type_seed;
int16_t material_type_thread;
int16_t material_type_mill;
int16_t material_type_extract_vial;
int16_t material_type_extract_barrel;
int16_t material_type_extract_still_vial;
int16_t material_type_leaves;
int32_t material_idx_basic_mat;
int32_t material_idx_tree;
int32_t material_idx_drink;
Expand Down Expand Up @@ -641,16 +641,19 @@ namespace DFHack
} tilecolor;
};

typedef int32_t t_materialIndex;
typedef int16_t t_materialType, t_itemType, t_itemSubtype;

/**
* this structure describes what are things made of in the DF world
* \ingroup grp_materials
*/
struct t_material
{
int16_t itemType;
int16_t subType;
int16_t material;
int32_t index;
t_itemType itemType;
t_itemSubtype subType;
t_materialType material;
t_materialIndex index;
uint32_t flags;
};
/**
Expand Down
261 changes: 261 additions & 0 deletions library/include/dfhack/modules/kitchen.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
/*
https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek ([email protected])
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.
*/

#pragma once
/*
* kitchen settings
*/
#include "dfhack/Export.h"
#include "dfhack/Module.h"
#include "dfhack/Types.h"
#include "dfhack/VersionInfo.h"
#include "dfhack/modules/Materials.h"
#include "dfhack/modules/Items.h"
#include <dfhack/Core.h>
/**
* \defgroup grp_kitchen Kitchen settings
* @ingroup grp_modules
*/

namespace DFHack
{
namespace Kitchen
{
typedef uint8_t t_exclusionType;

const unsigned int seedLimit = 400; // a limit on the limits which can be placed on seeds
const t_itemSubtype organicSubtype = -1; // seems to fixed
const t_exclusionType cookingExclusion = 1; // seems to be fixed
const t_itemType limitType = 0; // used to store limit as an entry in the exclusion list. 0 = BAR
const t_itemSubtype limitSubtype = 0; // used to store limit as an entry in the exclusion list
const t_exclusionType limitExclusion = 4; // used to store limit as an entry in the exclusion list

/**
* Kitchen exclusions manipulator class. Currently geared towards plants and seeds.
* @ingroup grp_kitchen
*/
class Exclusions
{
public:
/// ctor
Exclusions(DFHack::Core& core_)
: core(core_)
, itemTypes (*((std::vector<t_itemType >*)(addr(core_,0))))
, itemSubtypes (*((std::vector<t_itemSubtype >*)(addr(core_,1))))
, materialTypes (*((std::vector<t_materialType >*)(addr(core_,2))))
, materialIndices (*((std::vector<t_materialIndex>*)(addr(core_,3))))
, exclusionTypes (*((std::vector<t_exclusionType>*)(addr(core_,4))))
{
};

/// print the exclusion list, with the material index also translated into its token (for organics) - for debug really
void debug_print()
{
core.con.print("Kitchen Exclusions\n");
DFHack::Materials& materialsModule= *core.getMaterials();
for(std::size_t i = 0; i < size(); ++i)
{
core.con.print("%2u: IT:%2i IS:%i MT:%3i MI:%2i ET:%i %s\n",
i,
itemTypes[i],
itemSubtypes[i],
materialTypes[i],
materialIndices[i],
exclusionTypes[i],
materialsModule.df_organic->at(materialIndices[i])->ID.c_str()
);
}
core.con.print("\n");
};

/// remove this material from the exclusion list if it is in it
void allowPlantSeedCookery(t_materialIndex materialIndex)
{
bool match = false;
do
{
match = false;
std::size_t matchIndex = 0;
for(std::size_t i = 0; i < size(); ++i)
{
if(materialIndices[i] == materialIndex
&& (itemTypes[i] == DFHack::Items::SEEDS || itemTypes[i] == DFHack::Items::PLANT)
&& exclusionTypes[i] == cookingExclusion
)
{
match = true;
matchIndex = i;
}
}
if(match)
{
itemTypes.erase(itemTypes.begin() + matchIndex);
itemSubtypes.erase(itemSubtypes.begin() + matchIndex);
materialIndices.erase(materialIndices.begin() + matchIndex);
materialTypes.erase( materialTypes.begin() + matchIndex);
exclusionTypes.erase(exclusionTypes.begin() + matchIndex);
}
} while(match);
};

/// add this material to the exclusion list, if it is not already in it
void denyPlantSeedCookery(t_materialIndex materialIndex)
{
Materials *mats = core.getMaterials();
df_plant_type *type = mats->df_organic->at(materialIndex);
bool SeedAlreadyIn = false;
bool PlantAlreadyIn = false;
for(std::size_t i = 0; i < size(); ++i)
{
if(materialIndices[i] == materialIndex
&& exclusionTypes[i] == cookingExclusion)
{
if(itemTypes[i] == DFHack::Items::SEEDS)
SeedAlreadyIn = true;
else if (itemTypes[i] == DFHack::Items::PLANT)
PlantAlreadyIn = true;
}
}
if(!SeedAlreadyIn)
{
itemTypes.push_back(DFHack::Items::SEEDS);
itemSubtypes.push_back(organicSubtype);
materialTypes.push_back(type->material_type_seed);
materialIndices.push_back(materialIndex);
exclusionTypes.push_back(cookingExclusion);
}
if(!PlantAlreadyIn)
{
itemTypes.push_back(DFHack::Items::PLANT);
itemSubtypes.push_back(organicSubtype);
materialTypes.push_back(type->material_type_basic_mat);
materialIndices.push_back(materialIndex);
exclusionTypes.push_back(cookingExclusion);
}
};

/// fills a map with info from the limit info storage entries in the exclusion list
void fillWatchMap(std::map<t_materialIndex, unsigned int>& watchMap)
{
watchMap.clear();
for(std::size_t i = 0; i < size(); ++i)
{
if(itemTypes[i] == limitType && itemSubtypes[i] == limitSubtype && exclusionTypes[i] == limitExclusion)
{
watchMap[materialIndices[i]] = (unsigned int) materialTypes[i];
}
}
};

/// removes a limit info storage entry from the exclusion list if it's present
void removeLimit(t_materialIndex materialIndex)
{
bool match = false;
do
{
match = false;
std::size_t matchIndex = 0;
for(std::size_t i = 0; i < size(); ++i)
{
if(itemTypes[i] == limitType
&& itemSubtypes[i] == limitSubtype
&& materialIndices[i] == materialIndex
&& exclusionTypes[i] == limitExclusion)
{
match = true;
matchIndex = i;
}
}
if(match)
{
itemTypes.erase(itemTypes.begin() + matchIndex);
itemSubtypes.erase(itemSubtypes.begin() + matchIndex);
materialTypes.erase( materialTypes.begin() + matchIndex);
materialIndices.erase(materialIndices.begin() + matchIndex);
exclusionTypes.erase(exclusionTypes.begin() + matchIndex);
}
} while(match);
};

/// add a limit info storage item to the exclusion list, or alters an existing one
void setLimit(t_materialIndex materialIndex, unsigned int limit)
{
removeLimit(materialIndex);
if(limit > seedLimit) limit = seedLimit;

itemTypes.push_back(limitType);
itemSubtypes.push_back(limitSubtype);
materialIndices.push_back(materialIndex);
materialTypes.push_back((t_materialType) (limit < seedLimit) ? limit : seedLimit);
exclusionTypes.push_back(limitExclusion);
};

/// clears all limit info storage items from the exclusion list
void clearLimits()
{
bool match = false;
do
{
match = false;
std::size_t matchIndex;
for(std::size_t i = 0; i < size(); ++i)
{
if(itemTypes[i] == limitType
&& itemSubtypes[i] == limitSubtype
&& exclusionTypes[i] == limitExclusion)
{
match = true;
matchIndex = i;
}
}
if(match)
{
itemTypes.erase(itemTypes.begin() + matchIndex);
itemSubtypes.erase(itemSubtypes.begin() + matchIndex);
materialIndices.erase(materialIndices.begin() + matchIndex);
materialTypes.erase( materialTypes.begin() + matchIndex);
exclusionTypes.erase(exclusionTypes.begin() + matchIndex);
}
} while(match);
};
private:
DFHack::Core& core;
std::vector<t_itemType>& itemTypes; // the item types vector of the kitchen exclusion list
std::vector<t_itemSubtype>& itemSubtypes; // the item subtype vector of the kitchen exclusion list
std::vector<t_materialType>& materialTypes; // the material subindex vector of the kitchen exclusion list
std::vector<t_materialIndex>& materialIndices; // the material index vector of the kitchen exclusion list
std::vector<t_exclusionType>& exclusionTypes; // the exclusion type vector of the kitchen excluions list
std::size_t size() // the size of the exclusions vectors (they are all the same size - if not, there is a problem!)
{
return itemTypes.size();
};
static uint32_t addr(const DFHack::Core& core, int index)
{
static uint32_t start = core.vinfo->getAddress("kitchen_limits");
return start + sizeof(std::vector<int>) * index;
};
};

}
}
Loading

0 comments on commit a3a1629

Please sign in to comment.