Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 1 | pmbaty | 1 | /* |
| 2 | * This file is part of the DXX-Rebirth project <https://www.dxx-rebirth.com/>. |
||
| 3 | * It is copyright by its individual contributors, as recorded in the |
||
| 4 | * project's Git history. See COPYING.txt at the top level for license |
||
| 5 | * terms and a link to the Git history. |
||
| 6 | */ |
||
| 7 | /* |
||
| 8 | * extractD1Data.cpp |
||
| 9 | * |
||
| 10 | * |
||
| 11 | * Created by Peter "halprin" Kendall on 8/26/09. |
||
| 12 | * Copyright 2009 @PAK Software. All rights reserved. |
||
| 13 | * |
||
| 14 | */ |
||
| 15 | |||
| 16 | #define DEFAULT_INSTALL_LOCATION "/Volumes/Descent/Install Descent" |
||
| 17 | #define CHAOS_HOG_SIZE 0x2AA9F |
||
| 18 | #define CHAOS_HOG_OFFSET 0xAF310 |
||
| 19 | #define CHAOS_MSN_REZ_SIZE 0x14C |
||
| 20 | #define CHAOS_MSN_REZ_OFFSET 0xD9E1F |
||
| 21 | #define CHAOS_MSN_SIZE 0x12B |
||
| 22 | #define CHAOS_MSN_OFFSET 0xD9F6B |
||
| 23 | #define DESCENT_HOG_SIZE 0x71C5B3 |
||
| 24 | #define DESCENT_HOG_OFFSET 0xDA106 |
||
| 25 | #define DESCENT_PIG_SIZE 0x3CA96D |
||
| 26 | #define DESCENT_PIG_OFFSET 0x7F6729 |
||
| 27 | |||
| 28 | #include <iostream> |
||
| 29 | #include <fstream> |
||
| 30 | #include <string> |
||
| 31 | using namespace std; |
||
| 32 | |||
| 33 | void printUsage(); |
||
| 34 | |||
| 35 | int main(int argc, char **argv) |
||
| 36 | { |
||
| 37 | string install_location=DEFAULT_INSTALL_LOCATION; |
||
| 38 | |||
| 39 | if(argc>2 || (argc==2 && strcmp(argv[1], "-help")==0)) |
||
| 40 | { |
||
| 41 | printUsage(); |
||
| 42 | return -1; |
||
| 43 | } |
||
| 44 | else if(argc==2) |
||
| 45 | { |
||
| 46 | //use a custom location for the installer |
||
| 47 | install_location=argv[1]; |
||
| 48 | } |
||
| 49 | |||
| 50 | //report what we are doing |
||
| 51 | cout << endl; |
||
| 52 | cout << "DETAILS" << endl; |
||
| 53 | cout << "Installer: " << install_location << endl; |
||
| 54 | |||
| 55 | ifstream installer(install_location.c_str()); |
||
| 56 | if(!installer) |
||
| 57 | { |
||
| 58 | cout << "Error: Cannot open the installer file." << endl; |
||
| 59 | cout << "Does it exist at the location specified?" << endl << endl; |
||
| 60 | printUsage(); |
||
| 61 | return -2; |
||
| 62 | } |
||
| 63 | |||
| 64 | //report more on what we are doing |
||
| 65 | cout << "CHAOS.HOG:" << endl; |
||
| 66 | cout << " starts 0x" << hex << uppercase << CHAOS_HOG_OFFSET << endl; |
||
| 67 | cout << " size 0x" << hex << uppercase << CHAOS_HOG_SIZE << endl; |
||
| 68 | cout << "CHAOS.MSN:" << endl; |
||
| 69 | cout << " starts 0x" << hex << uppercase << CHAOS_MSN_OFFSET << endl; |
||
| 70 | cout << " size 0x" << hex << uppercase << CHAOS_MSN_SIZE << endl; |
||
| 71 | cout << "CHAOS.MSN resource fork:" << endl; |
||
| 72 | cout << " starts 0x" << hex << uppercase << CHAOS_MSN_REZ_OFFSET << endl; |
||
| 73 | cout << " size 0x" << hex << uppercase << CHAOS_MSN_REZ_SIZE << endl; |
||
| 74 | cout << "descent.hog:" << endl; |
||
| 75 | cout << " starts 0x" << hex << uppercase << DESCENT_HOG_OFFSET << endl; |
||
| 76 | cout << " size 0x" << hex << uppercase << DESCENT_HOG_SIZE << endl; |
||
| 77 | cout << "descent.pig:" << endl; |
||
| 78 | cout << " starts 0x" << hex << uppercase << DESCENT_PIG_OFFSET << endl; |
||
| 79 | cout << " size 0x" << hex << uppercase << DESCENT_PIG_SIZE << endl; |
||
| 80 | cout << endl; |
||
| 81 | |||
| 82 | char* chaos_hog_buffer=(char*)malloc(CHAOS_HOG_SIZE); |
||
| 83 | char* chaos_msn_rez_buffer=(char*)malloc(CHAOS_MSN_REZ_SIZE); |
||
| 84 | char* chaos_msn_buffer=(char*)malloc(CHAOS_MSN_SIZE); |
||
| 85 | char* descent_hog_buffer=(char*)malloc(DESCENT_HOG_SIZE); |
||
| 86 | char* descent_pig_buffer=(char*)malloc(DESCENT_PIG_SIZE); |
||
| 87 | |||
| 88 | ofstream chaos_hog_file("CHAOS.HOG"); |
||
| 89 | if(!chaos_hog_file) |
||
| 90 | { |
||
| 91 | cout << "Error: Unable to create new CHAOS.HOG file. Skipping!" << endl; |
||
| 92 | } |
||
| 93 | ofstream chaos_msn_file("CHAOS.MSN"); |
||
| 94 | if(!chaos_msn_file) |
||
| 95 | { |
||
| 96 | cout << "Error: Unable to create new CHAOS.MSN file. Skipping!" << endl; |
||
| 97 | } |
||
| 98 | ofstream chaos_msn_rez_file("CHAOS.MSN/..namedfork/rsrc"); |
||
| 99 | if(!chaos_msn_rez_file) |
||
| 100 | { |
||
| 101 | cout << "Error: Unable to create the resource fork of the CHAOS.MSN file. Skipping!" << endl; |
||
| 102 | } |
||
| 103 | ofstream descent_hog_file("descent.hog"); |
||
| 104 | if(!descent_hog_file) |
||
| 105 | { |
||
| 106 | cout << "Error: Unable to create new descent.hog file. Skipping!" << endl; |
||
| 107 | } |
||
| 108 | ofstream descent_pig_file("descent.pig"); |
||
| 109 | if(!descent_pig_file) |
||
| 110 | { |
||
| 111 | cout << "Error: Unable to create new descent.pig file. Skipping!" << endl; |
||
| 112 | } |
||
| 113 | |||
| 114 | //read the CHAOS.HOG file |
||
| 115 | installer.ignore(CHAOS_HOG_OFFSET); |
||
| 116 | installer.read(chaos_hog_buffer, CHAOS_HOG_SIZE); |
||
| 117 | //write the CHAOS.HOG file |
||
| 118 | chaos_hog_file.write(chaos_hog_buffer, CHAOS_HOG_SIZE); |
||
| 119 | |||
| 120 | //read the CHAOS.MSN file's resource fork |
||
| 121 | installer.ignore(CHAOS_MSN_REZ_OFFSET-(CHAOS_HOG_OFFSET+CHAOS_HOG_SIZE)); |
||
| 122 | installer.read(chaos_msn_rez_buffer, CHAOS_MSN_REZ_SIZE); |
||
| 123 | //write the CHAOS.MSN file's resource fork |
||
| 124 | chaos_msn_rez_file.write(chaos_msn_rez_buffer, CHAOS_MSN_REZ_SIZE); |
||
| 125 | |||
| 126 | //read the CHAOS.MSN file |
||
| 127 | installer.ignore(CHAOS_MSN_OFFSET-(CHAOS_MSN_REZ_OFFSET+CHAOS_MSN_REZ_SIZE)); |
||
| 128 | installer.read(chaos_msn_buffer, CHAOS_MSN_SIZE); |
||
| 129 | //write the CHAOS.MSN file |
||
| 130 | chaos_msn_file.write(chaos_msn_buffer, CHAOS_MSN_SIZE); |
||
| 131 | |||
| 132 | //read the descent.hog file |
||
| 133 | installer.ignore(DESCENT_HOG_OFFSET-(CHAOS_MSN_OFFSET+CHAOS_MSN_SIZE)); |
||
| 134 | installer.read(descent_hog_buffer, DESCENT_HOG_SIZE); |
||
| 135 | //write the descent.hog file |
||
| 136 | descent_hog_file.write(descent_hog_buffer, DESCENT_HOG_SIZE); |
||
| 137 | |||
| 138 | //read the descent.pig file |
||
| 139 | installer.ignore(DESCENT_PIG_OFFSET-(DESCENT_HOG_OFFSET+DESCENT_HOG_SIZE)); |
||
| 140 | installer.read(descent_pig_buffer, DESCENT_PIG_SIZE); |
||
| 141 | //write the descent.pig file |
||
| 142 | descent_pig_file.write(descent_pig_buffer, DESCENT_PIG_SIZE); |
||
| 143 | |||
| 144 | |||
| 145 | //Done! |
||
| 146 | cout << "Extraction complete!" << endl << endl; |
||
| 147 | |||
| 148 | free(chaos_hog_buffer); |
||
| 149 | free(chaos_msn_rez_buffer); |
||
| 150 | free(chaos_msn_buffer); |
||
| 151 | free(descent_hog_buffer); |
||
| 152 | free(descent_pig_buffer); |
||
| 153 | |||
| 154 | chaos_hog_file.close(); |
||
| 155 | chaos_msn_file.close(); |
||
| 156 | chaos_msn_rez_file.close(); |
||
| 157 | descent_hog_file.close(); |
||
| 158 | descent_pig_file.close(); |
||
| 159 | |||
| 160 | return 0; |
||
| 161 | } |
||
| 162 | |||
| 163 | void printUsage() |
||
| 164 | { |
||
| 165 | cout << "Usage: ./d1Extract <Path to Descent installer>" << endl; |
||
| 166 | cout << "If <Path to Descent installer> is not specified, the default \"" << DEFAULT_INSTALL_LOCATION << "\" will be used." << endl << endl; |
||
| 167 | } |