FelixGriffin

FGEMOD Source Code

May 12th, 2013
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.57 KB | None | 0 0
  1. #include "aperturelogo.h"
  2. #include <fstream>
  3. // Files not included:
  4. // The "nstream" library is a buggy mass of code to make Curses windows act like std::ostreams. It doesn't work on any system except the one I wrote it on because it's so fiddly. I'm going to redesign it one of these days...
  5. // The "dstrings" library is a C-style wrapper for a stringstream, I still don't know why I wrote it.
  6. #include <string>
  7. #include <cstdlib>
  8. #include <dirent.h>
  9. #include <vector>
  10. using namespace std;
  11.  
  12. unsigned char x=1,y=0;
  13.  
  14. #define MAX_X 3
  15. #define MAX_Y 7
  16.  
  17. #define HELP_TEXT "If this is an actual plea for help in response to a choking gas of unknown origin, please remain at your desk. An emergency help robot has been sent to assist you."
  18.  
  19. string apertureLogoSmall(){ // Draw an ASCII-art Aperture logo, using the text from the Still Alive captions.
  20.     return "              .,-:;//;:=,\n          . :H@@@MM@M#H/.,+%;,\n       ,/X+ +M@@M@MM%=,-%HMMM@X/,\n     -+@MM; $M@@MH+-,;XMMMM@MMMM@+-\n    ;@M@@M- XM@X;. -+XXXXXHHH@M@M#@/.\n  ,%MM@@MH ,@%=             .__ _  _-,.\n  =@#@@@MX.,                -%HX$$%%%:;\n =-./@M@M$                   .;@MMMM@MM:\n X@/ -$MM/                    . +MM@@@M$\n,@M@H: :@:                    . =X#@@@@-\n,@@@MMX, .                    /H- ;@M@M=\n.H@@@@M@+,                    %MM+..%#$.\n /MMMM@MMH/.                  XM@MH; =;\n  /%+%$XHH@$=              , .H@@@@MX,\n   .=_  _ __-.           -%H.,@@@@@MX,\n   .%MM@@@HHHXX$$$%+- .:$MMX =M@@MM%.\n     =XMMM@MM@MM#H;,-+HMM@M+ /MMMX=\n       =%@M@M#@$-.=$@MM@@@M; %M%=\n         ,:+$+-,/H#MMMMMMM@= =,\n               =++%%%%+/:-.";
  21. }
  22.  
  23. nstream instr_win(1,1,ncols-2,5); // These are NCurses windows wrapped as "nstreams".
  24. nstream menu_win(1,6,ncols/2-2,nrows-7);
  25. nstream display_win(ncols/2+1,6,ncols/2-2,nrows/2-7);
  26. nstream logo_win(ncols/2+1,nrows/2+6,ncols/2-2,nrows/2-7);
  27.  
  28. string currentstyle;
  29.  
  30. void drawMenu(nstream &stream, vector<string> &elements, vector<bool> &selected, int a){
  31.     stream.clear();
  32.     for(int i = 0; i < elements.size(); i++)
  33.         stream << (i == a ? " ==> " : "     ") << (selected[i] == true ? "* " : "  ") << elements[i] << endl;
  34. }
  35.  
  36. string getItemData(string &filename){
  37.     string buffer;
  38.    
  39.     ifstream filereader;
  40.     filereader.open(string("science/"+filename).c_str(),ios::in);
  41.    
  42.     if(!filereader.is_open()){
  43.         cerr << "ERROR: File " << filename.c_str() << " would not open!" << endl;
  44.         abort();
  45.     }
  46.    
  47.     string result;
  48.    
  49.     getline(filereader,buffer);
  50.     result += buffer;
  51.     result += "\n\n";
  52.    
  53.     getline(filereader,buffer);
  54.     result += buffer;
  55.    
  56.     filereader.close();
  57.    
  58.     return result;
  59. }
  60.  
  61. string getStyleData(string &filename){
  62.     string buffer;
  63.    
  64.     ifstream filereader;
  65.     filereader.open(string("styles/"+filename).c_str(),ios::in);
  66.    
  67.     if(!filereader.is_open()){
  68.         cerr << "ERROR: File " << filename.c_str() << " would not open!" << endl;
  69.         abort();
  70.     }
  71.    
  72.     string result;
  73.    
  74.     getline(filereader,buffer);
  75.     result += buffer;
  76.     result += "\n\n";
  77.    
  78.     getline(filereader,buffer);
  79.     result += buffer;
  80.    
  81.     getline(filereader,currentstyle);
  82.    
  83.     filereader.close();
  84.    
  85.     return result;
  86. }
  87.  
  88. string genPaletteStr(bool selected){
  89.     if(!selected) return "0 0 0";
  90.     string str;
  91.     str += itos(x);
  92.     str += " ";
  93.     str += itos(y);
  94.     str += " 0";
  95.     x++;
  96.     if(x > MAX_X){
  97.         x = 0;
  98.         y++;
  99.     }
  100.     if(y > MAX_Y){
  101.     //  nout << "Warning: Using last item slot!" << endl;
  102.     }
  103.    
  104.     instr_win << "\tSlot: " << str << endl;
  105.    
  106.     return str;
  107. }
  108.  
  109. ofstream filewriter("editoritems.txt",ios::out|ios::trunc);
  110.  
  111. void addItem(string &name, bool selected, bool special = false){
  112.    
  113.     string buffer;
  114.    
  115.     ifstream filereader;
  116.     filereader.open(string("science/"+name).c_str(),ios::in);
  117.    
  118.     if(!filereader.is_open()){
  119.         cerr << "ERROR: File " << name.c_str() << " would not open!" << endl;
  120.         abort();
  121.     }
  122.    
  123.     if(!filewriter.is_open()){
  124.         cerr << "ERROR: Outfile would not open!" << endl;
  125.         abort();
  126.     }
  127.    
  128.     getline(filereader,buffer); //Metadata lines: skip them.
  129.     getline(filereader,buffer);
  130.    
  131.     instr_win << "Adding item: " << name << endl;
  132.    
  133.     while(filereader.good()){
  134.         getline(filereader,buffer);
  135.         size_t pos = 0;
  136.        
  137.         if((pos = buffer.find("$P")) != string::npos){
  138.             buffer.replace(pos, 2, (special ? string("0 0 0") : genPaletteStr(selected)));
  139.         }
  140.        
  141.         if((pos = buffer.find("$S")) != string::npos){
  142.             buffer.replace(pos, 2, currentstyle);
  143.         }
  144.        
  145.         filewriter << buffer << "\r\n";
  146.     }
  147.    
  148.     filereader.close();
  149. }
  150.  
  151. void loadConfig(vector<string> &elements, vector<bool> &selected){
  152.     ifstream config_file("fgemod_config.dat");
  153.     string stringy;
  154.     if(!config_file.is_open()) return;
  155.     while(config_file.good()){
  156.         getline(config_file,stringy);
  157.         for(int i = 0; i < elements.size(); i++){
  158.             if(elements[i] == stringy){
  159.                 selected[i] = true;
  160.                 break;
  161.             }
  162.         }
  163.     }
  164.     config_file.close();
  165. }
  166.  
  167. int main(int argc, char** argv){
  168.    
  169. //  system("del editoritems.txt");
  170. //  system("rm editoritems.txt");
  171.    
  172.     if(argc > 1) goto skip_intro;
  173.    
  174.     srand(42);
  175. //  #ifdef WIN32
  176. //  system("color 0A");
  177. //  #else
  178. //  dout << speed(0) << "\033[22;32m\033[22;40m";
  179. //  #endif
  180. //  clear();
  181.     for(int i = 0; i < ncols; i++)
  182.         nout << ' ';
  183.     nout << speed(30) << "Contacting Aperture Server" << speed(3) << "..." << endl << speed(30) << "Sending Credentials" << speed(3) << "..." << endl << speed(30) << "Requesting UserID" << speed(3) << "..." << endl << speed(30) << "Your UserID: " << rand() << speed(120) << endl << endl << endl << apertureLogoSmall() << endl << endl << speed(30) << "(c) 2012 Aperture Science Inc." << endl << endl;
  184.     npause();
  185.     clear();
  186.     nout << "Welcome to the Aperture Science Test Element Selection Processor!" << endl << endl;
  187.     nout << "Please wait a moment while we build the list of available test elements..." << endl;
  188.    
  189.     skip_intro:
  190.    
  191.     dirent *entry;
  192.     DIR *dp;
  193.    
  194.     dp = opendir("science");
  195.     if(dp == NULL){
  196.         nout << "ERROR! You're missing your Science directory!" << endl;
  197.         npause();
  198.         return 2;
  199.     }
  200.    
  201.     vector<string> testelements;
  202.     vector<bool> selected;
  203.    
  204.     while(entry = readdir(dp)){
  205.         string name = entry->d_name;
  206.         if(name.find(".test") != string::npos)
  207.             testelements.push_back(name);
  208.             selected.push_back(false);
  209.     }
  210.    
  211.     dp = opendir("styles");
  212.     if(dp == NULL){
  213.         nout << "ERROR! You're missing your Styles directory!" << endl;
  214.         npause();
  215.         return 2;
  216.     }
  217.    
  218.     vector<string> styles;
  219.     vector<bool> null_vector;
  220.    
  221.     while(entry = readdir(dp)){
  222.         string name = entry->d_name;
  223.         if(name.find(".style") != string::npos)
  224.             styles.push_back(name);
  225.             null_vector.push_back(false);
  226.     }
  227.    
  228.     clear();
  229.    
  230. //  instr_win << speed(30);
  231. //  menu_win << speed(30);
  232. //  display_win << speed(30);
  233. //  logo_win << speed(120);
  234.    
  235.     int c;
  236.     int a = 0;
  237.    
  238.     loadConfig(testelements,selected);
  239.    
  240.     instr_win << speed(60) << "Select your test elements here. Use W/S or UP/DOWN to move the cursor, and D/SPACE/ENTER to select one. Press F1 when you're finished. Press F2 for help.";
  241.     logo_win << apertureLogoSmall();
  242.    
  243.     drawMenu(menu_win,testelements,selected,0);
  244.    
  245.     do{
  246.         switch(c){
  247.             case KEY_UP:
  248.             case 'w':
  249.                 a--;
  250.                 break;
  251.             case KEY_DOWN:
  252.             case 's':
  253.                 a++;
  254.                 break;
  255.             case KEY_ENTER:
  256.             case ' ':
  257.             case 'd':
  258.                 selected[a].flip();
  259.                 break;
  260.             case KEY_F(2):
  261.                 display_win << HELP_TEXT;
  262.                 npause();
  263.                 break;
  264.             default:
  265.                 break;
  266.         }
  267.         if(a >= testelements.size()) a = testelements.size() - 1;
  268.         if(a < 0) a = 0;
  269.        
  270.         drawMenu(menu_win,testelements,selected,a);
  271.         display_win.clear();
  272.     //  display_win << "TESTING..." << endl;
  273.         display_win << getItemData(testelements[a]);
  274.     }while((c = menu_win.getchar()) != KEY_F(1))
  275.    
  276.     bool breaker = false;
  277.    
  278.     instr_win << "Now choose a style for your test chamber. (This is like the StyleChanger mod.)";
  279.    
  280.     do{
  281.         c = menu_win.getchar();
  282.         switch(c){
  283.             case KEY_UP:
  284.             case 'w':
  285.                 a--;
  286.                 break;
  287.             case KEY_DOWN:
  288.             case 's':
  289.                 a++;
  290.                 break;
  291.             case KEY_ENTER:
  292.             case ' ':
  293.             case 'd':
  294.                 breaker = true;
  295.                 break;
  296.             case KEY_F(2):
  297.                 display_win << HELP_TEXT;
  298.                 npause();
  299.                 break;
  300.             default:
  301.                 break;
  302.         }
  303.         if(a >= styles.size()) a = styles.size() - 1;
  304.         if(a < 0) a = 0;
  305.        
  306.         drawMenu(menu_win,styles,null_vector,a);
  307.         display_win.clear();
  308.     //  display_win << "TESTING..." << endl;
  309.         display_win << getStyleData(styles[a]);
  310.     }while(!breaker)
  311.    
  312.     instr_win.clear();
  313.    
  314.     ofstream config_file("fgemod_config.dat");
  315.    
  316.     string saved_for_later;
  317.    
  318.     filewriter << "ItemData\r\n{" << "\r\n"; //The start of the original file.
  319.     bool flag = false;
  320.     for(int i = 0; i < testelements.size(); i++){
  321.         if(selected[i] == true && flag == false){
  322.             saved_for_later = testelements[i];
  323.             flag = true;
  324.             instr_win << "\tSaved for end..." << endl;
  325.         }else{
  326.             addItem(testelements[i],selected[i]);
  327.         }
  328.        
  329.         if(selected[i]) config_file << testelements[i] << endl;
  330.     }
  331.     addItem(saved_for_later,true,true);
  332.     filewriter <<
  333.         "\"Renderables\"\r\n    {\r\n       \"Item\"\r\n        {\r\n           \"Type\"        \"ErrorState\"\r\n          \"Model\"       \"error_state.3ds\"\r\n\r\n         \"Animations\"\r\n          {\r\n               \"ANIM_ICON_SHOW\"      \"1\"\r\n               \"ANIM_ICON_IDLE\"      \"2\"\r\n               \"ANIM_ICON_HIDE\"      \"3\"\r\n           }\r\n       }\r\n       \"Item\"\r\n        {\r\n           \"Type\"        \"ConnectionHeartSolid\"\r\n            \"Model\"       \"heart.3ds\"\r\n\r\n           \"Animations\"\r\n          {\r\n               \"ANIM_ICON_SHOW\"              \"2\"\r\n               \"ANIM_ICON_IDLE\"              \"0\"\r\n               \"ANIM_ICON_HEART_BREAK\"           \"1\"\r\n               \"ANIM_ICON_HIDE\"              \"3\"\r\n               \"ANIM_ICON_HEART_SUCCESS\"     \"4\"\r\n               \"ANIM_ICON_HEART_HAPPY_IDLE\"  \"5\"\r\n           }\r\n       }\r\n   }\r\n}\r\n"; //The end of the original file.
  334.     filewriter.close();
  335.    
  336.     config_file.close();
  337.    
  338.     instr_win << speed(0) << "[Press Any Key]";
  339.    
  340.     npause();
  341.    
  342.     clear();
  343. }
Advertisement
Add Comment
Please, Sign In to add comment