summaryrefslogtreecommitdiff
path: root/needs_porting/dfbauxite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'needs_porting/dfbauxite.cpp')
-rw-r--r--needs_porting/dfbauxite.cpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/needs_porting/dfbauxite.cpp b/needs_porting/dfbauxite.cpp
new file mode 100644
index 00000000..3a2fdb97
--- /dev/null
+++ b/needs_porting/dfbauxite.cpp
@@ -0,0 +1,161 @@
+/*
+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;
+}