added dfbauxite by Alex Legg to tools, started working on d17 support
							parent
							
								
									193a6f4d62
								
							
						
					
					
						commit
						70bf6954a6
					
				@ -0,0 +1,145 @@
 | 
			
		||||
/* 
 | 
			
		||||
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 "DFCommonInternal.h"
 | 
			
		||||
#include <sstream>
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
int main ()
 | 
			
		||||
{
 | 
			
		||||
    DFHack::Process *proc;
 | 
			
		||||
    DFHack::memory_info *meminfo;
 | 
			
		||||
    DFHack::DfVector *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::API DF ("Memory.xml");
 | 
			
		||||
    if(!DF.Attach())
 | 
			
		||||
    {
 | 
			
		||||
        cerr << "DF not found" << endl;
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    DF.Suspend();
 | 
			
		||||
    
 | 
			
		||||
    /*
 | 
			
		||||
     * 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;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    //FIXME: very counter-intuitive, fix the API. This returns a mapping from the internal ID to the object name
 | 
			
		||||
    //       internal IDs can be obtained by using resolveClassId
 | 
			
		||||
    //FIXME: Proper error reporting/exceptions support is sorely needed
 | 
			
		||||
    /*
 | 
			
		||||
     * Get the object name/ID mapping
 | 
			
		||||
     */
 | 
			
		||||
    vector <string> buildingtypes;
 | 
			
		||||
    uint32_t numBuildings = DF.InitReadBuildings(buildingtypes);
 | 
			
		||||
    
 | 
			
		||||
    proc = DF.getProcess();
 | 
			
		||||
    meminfo = proc->getDescriptor();
 | 
			
		||||
    
 | 
			
		||||
    //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 (proc->getDataModel()->readVector (items, 4));
 | 
			
		||||
    for(uint32_t i = 0; i < items_vector->getSize(); i++)
 | 
			
		||||
    {
 | 
			
		||||
        // get pointer to object
 | 
			
		||||
        temp = * (uint32_t *) 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->resolveClassId (temp, type))
 | 
			
		||||
            continue;
 | 
			
		||||
       
 | 
			
		||||
        if(buildingtypes[type] == "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;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue