remove mostly-obsolete plugins
dfbauxtite - simply disable temperature, if the many more magma-safe materials aren't helping. itemdesignator is replaced by enhanced stocks screen, excpet for settings things on fire for which other tools exist.develop
parent
f3826abc0c
commit
7c372d4984
@ -1,161 +0,0 @@
|
|||||||
/*
|
|
||||||
DFBauxite - Converts all your mechanisms to bauxite (for use in magma).
|
|
||||||
Author: Alex Legg
|
|
||||||
|
|
||||||
Based on code from and uses DFHack - www.sourceforge.net/projects/dfhack
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string.h>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
#include <DFIntegers.h>
|
|
||||||
#include <DFExport.h>
|
|
||||||
#include <DFError.h>
|
|
||||||
#include <DFVector.h>
|
|
||||||
#include <DFMemInfo.h>
|
|
||||||
#include <DFProcess.h>
|
|
||||||
#include <DFTypes.h>
|
|
||||||
using namespace DFHack;
|
|
||||||
|
|
||||||
|
|
||||||
int main ()
|
|
||||||
{
|
|
||||||
DFHack::Process *proc;
|
|
||||||
DFHack::memory_info *meminfo;
|
|
||||||
DFHack::DfVector <uint32_t> *items_vector;
|
|
||||||
DFHack::t_item_df40d item_40d;
|
|
||||||
DFHack::t_matglossPair item_40d_material;
|
|
||||||
vector<DFHack::t_matgloss> stoneMat;
|
|
||||||
uint32_t item_material_offset;
|
|
||||||
uint32_t temp;
|
|
||||||
int32_t type;
|
|
||||||
int items;
|
|
||||||
int found = 0, converted = 0;
|
|
||||||
|
|
||||||
DFHack::ContextManager DF("Memory.xml");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
DF.Attach();
|
|
||||||
}
|
|
||||||
catch (exception& e)
|
|
||||||
{
|
|
||||||
cerr << e.what() << endl;
|
|
||||||
#ifndef LINUX_BUILD
|
|
||||||
cin.ignore();
|
|
||||||
#endif
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find out which material is bauxite
|
|
||||||
if(!DF.ReadStoneMatgloss(stoneMat))
|
|
||||||
{
|
|
||||||
cout << "Materials not supported for this version of DF, exiting." << endl;
|
|
||||||
#ifndef LINUX_BUILD
|
|
||||||
cin.ignore();
|
|
||||||
#endif
|
|
||||||
DF.Detach();
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
int bauxiteIndex = -1;
|
|
||||||
for (int i = 0; i < stoneMat.size();i++)
|
|
||||||
{
|
|
||||||
if(strcmp(stoneMat[i].id, "BAUXITE") == 0)
|
|
||||||
{
|
|
||||||
bauxiteIndex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(bauxiteIndex == -1)
|
|
||||||
{
|
|
||||||
cout << "Cannot locate bauxite in the DF raws, exiting" << endl;
|
|
||||||
#ifndef LINUX_BUILD
|
|
||||||
cin.ignore();
|
|
||||||
#endif
|
|
||||||
DF.Detach();
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get some basics needed for full access
|
|
||||||
proc = DF.getProcess();
|
|
||||||
meminfo = proc->getDescriptor();
|
|
||||||
|
|
||||||
// Get the object name/ID mapping
|
|
||||||
//FIXME: work on the 'supported features' system required
|
|
||||||
|
|
||||||
// Check availability of required addresses and offsets (doing custom stuff here)
|
|
||||||
|
|
||||||
items = meminfo->getAddress("items");
|
|
||||||
item_material_offset = meminfo->getOffset("item_materials");
|
|
||||||
if( !items || ! item_material_offset)
|
|
||||||
{
|
|
||||||
cout << "Items not supported for this DF version, exiting" << endl;
|
|
||||||
#ifndef LINUX_BUILD
|
|
||||||
cin.ignore();
|
|
||||||
#endif
|
|
||||||
DF.Detach();
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
items_vector = new DFHack::DfVector <uint32_t> (proc, items);
|
|
||||||
for(uint32_t i = 0; i < items_vector->size(); i++)
|
|
||||||
{
|
|
||||||
// get pointer to object
|
|
||||||
temp = items_vector->at (i);
|
|
||||||
// read object
|
|
||||||
proc->read (temp, sizeof (DFHack::t_item_df40d), (uint8_t *) &item_40d);
|
|
||||||
|
|
||||||
// resolve object type
|
|
||||||
type = -1;
|
|
||||||
|
|
||||||
// skip things we can't identify
|
|
||||||
if(!meminfo->resolveObjectToClassID (temp, type))
|
|
||||||
continue;
|
|
||||||
string classname;
|
|
||||||
if(!meminfo->resolveClassIDToClassname (type, classname))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(classname == "item_trapparts")
|
|
||||||
{
|
|
||||||
proc->read (temp + item_material_offset, sizeof (DFHack::t_matglossPair), (uint8_t *) &item_40d_material);
|
|
||||||
|
|
||||||
cout << dec << "Mechanism at x:" << item_40d.x << " y:" << item_40d.y << " z:" << item_40d.z << " ID:" << item_40d.ID << endl;
|
|
||||||
|
|
||||||
if (item_40d_material.index != bauxiteIndex)
|
|
||||||
{
|
|
||||||
item_40d_material.index = bauxiteIndex;
|
|
||||||
proc->write (temp + item_material_offset, sizeof (DFHack::t_matglossPair), (uint8_t *) &item_40d_material);
|
|
||||||
converted++;
|
|
||||||
}
|
|
||||||
|
|
||||||
found++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (found == 0)
|
|
||||||
{
|
|
||||||
cout << "No mechanisms to convert" << endl;
|
|
||||||
} else {
|
|
||||||
cout << found << " mechanisms found" << endl;
|
|
||||||
cout << converted << " mechanisms converted" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
DF.Resume();
|
|
||||||
DF.Detach();
|
|
||||||
|
|
||||||
delete items_vector;
|
|
||||||
|
|
||||||
#ifndef LINUX_BUILD
|
|
||||||
cout << "Done. Press any key to continue" << endl;
|
|
||||||
cin.ignore();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,148 +0,0 @@
|
|||||||
// Item designator
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <sstream>
|
|
||||||
#include <climits>
|
|
||||||
#include <vector>
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#include <DFHack.h>
|
|
||||||
#include <DFVector.h>
|
|
||||||
using namespace DFHack;
|
|
||||||
|
|
||||||
int main ()
|
|
||||||
{
|
|
||||||
|
|
||||||
DFHack::ContextManager CM ("Memory.xml");
|
|
||||||
DFHack::Context * DF;
|
|
||||||
DFHack::VersionInfo *mem;
|
|
||||||
DFHack::Gui * Gui;
|
|
||||||
DFHack::Materials * Mats;
|
|
||||||
DFHack::Items * Items;
|
|
||||||
cout << "This utility lets you mass-designate items by type and material." << endl
|
|
||||||
<< "Like set on fire all MICROCLINE item_stone..." << endl
|
|
||||||
<< "Some unusual combinations might be untested and cause the program to crash..."<< endl
|
|
||||||
<< "so, watch your step and backup your fort" << endl;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
DF = CM.getSingleContext();
|
|
||||||
DF->Attach();
|
|
||||||
mem = DF->getMemoryInfo();
|
|
||||||
Gui = DF->getGui();
|
|
||||||
Mats = DF->getMaterials();
|
|
||||||
Mats->ReadAllMaterials();
|
|
||||||
Items = DF->getItems();
|
|
||||||
}
|
|
||||||
catch (exception& e)
|
|
||||||
{
|
|
||||||
cerr << e.what() << endl;
|
|
||||||
#ifndef LINUX_BUILD
|
|
||||||
cin.ignore();
|
|
||||||
#endif
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
DFHack::Process * p = DF->getProcess();
|
|
||||||
DFHack::OffsetGroup* itemGroup = mem->getGroup("Items");
|
|
||||||
unsigned vector_addr = itemGroup->getAddress("items_vector");
|
|
||||||
DFHack::DfVector <uint32_t> p_items (p, vector_addr);
|
|
||||||
uint32_t numItems = p_items.size();
|
|
||||||
|
|
||||||
map< string, map<string,vector< dfh_item > > > itemmap;
|
|
||||||
map< string, map< string, vector< dfh_item > > >::iterator it1;
|
|
||||||
int failedItems = 0;
|
|
||||||
map <string, int > bad_mat_items;
|
|
||||||
for(uint32_t i=0; i< numItems; i++)
|
|
||||||
{
|
|
||||||
DFHack::dfh_item temp;
|
|
||||||
Items->readItem(p_items[i],temp);
|
|
||||||
string typestr = Items->getItemClass(temp);
|
|
||||||
string material = Mats->getDescription(temp.matdesc);
|
|
||||||
itemmap[typestr][material].push_back(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
int i =0;
|
|
||||||
for( it1 = itemmap.begin(); it1!=itemmap.end();it1++)
|
|
||||||
{
|
|
||||||
cout << i << ": " << it1->first << "\n";
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if(i == 0)
|
|
||||||
{
|
|
||||||
cout << "No items found" << endl;
|
|
||||||
DF->Detach();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
cout << endl << "Select an item type from the list:";
|
|
||||||
int number;
|
|
||||||
string in;
|
|
||||||
stringstream ss;
|
|
||||||
getline(cin, in);
|
|
||||||
ss.str(in);
|
|
||||||
ss >> number;
|
|
||||||
int j = 0;
|
|
||||||
it1 = itemmap.begin();
|
|
||||||
while(j < number && it1!=itemmap.end())
|
|
||||||
{
|
|
||||||
it1++;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
cout << it1->first << "\n";
|
|
||||||
map<string,vector<dfh_item> >::iterator it2;
|
|
||||||
i=0;
|
|
||||||
for(it2 = it1->second.begin();it2!=it1->second.end();it2++){
|
|
||||||
cout << i << ":\t" << it2->first << " [" << it2->second.size() << "]" << endl;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
cout << endl << "Select a material type: ";
|
|
||||||
int number2;
|
|
||||||
ss.clear();
|
|
||||||
getline(cin, in);
|
|
||||||
ss.str(in);
|
|
||||||
ss >> number2;
|
|
||||||
|
|
||||||
decideAgain:
|
|
||||||
cout << "Select a designation - (d)ump, (f)orbid, (m)melt, set on fi(r)e :" << flush;
|
|
||||||
string designationType;
|
|
||||||
getline(cin,designationType);
|
|
||||||
DFHack::t_itemflags changeFlag = {0};
|
|
||||||
if(designationType == "d" || designationType == "dump")
|
|
||||||
{
|
|
||||||
changeFlag.dump = 1;
|
|
||||||
}
|
|
||||||
else if(designationType == "f" || designationType == "forbid")
|
|
||||||
{
|
|
||||||
changeFlag.forbid = 1;
|
|
||||||
}
|
|
||||||
else if(designationType == "m" || designationType == "melt")
|
|
||||||
{
|
|
||||||
changeFlag.melt = 1;
|
|
||||||
}
|
|
||||||
else if(designationType == "r" || designationType == "fire")
|
|
||||||
{
|
|
||||||
changeFlag.on_fire = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
goto decideAgain;
|
|
||||||
}
|
|
||||||
j=0;
|
|
||||||
it2= it1->second.begin();
|
|
||||||
while(j < number2 && it2!=it1->second.end())
|
|
||||||
{
|
|
||||||
it2++;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
for(uint32_t k = 0;k< it2->second.size();k++)
|
|
||||||
{
|
|
||||||
DFHack::dfh_item & t = it2->second[k];
|
|
||||||
t.base.flags.whole |= changeFlag.whole;
|
|
||||||
Items->writeItem(t);
|
|
||||||
}
|
|
||||||
DF->Detach();
|
|
||||||
#ifndef LINUX_BUILD
|
|
||||||
cout << "Done. Press any key to continue" << endl;
|
|
||||||
cin.ignore();
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue