Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "aperturelogo.h"
- #include <fstream>
- // Files not included:
- // 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...
- // The "dstrings" library is a C-style wrapper for a stringstream, I still don't know why I wrote it.
- #include <string>
- #include <cstdlib>
- #include <dirent.h>
- #include <vector>
- using namespace std;
- unsigned char x=1,y=0;
- #define MAX_X 3
- #define MAX_Y 7
- #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."
- string apertureLogoSmall(){ // Draw an ASCII-art Aperture logo, using the text from the Still Alive captions.
- 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 =++%%%%+/:-.";
- }
- nstream instr_win(1,1,ncols-2,5); // These are NCurses windows wrapped as "nstreams".
- nstream menu_win(1,6,ncols/2-2,nrows-7);
- nstream display_win(ncols/2+1,6,ncols/2-2,nrows/2-7);
- nstream logo_win(ncols/2+1,nrows/2+6,ncols/2-2,nrows/2-7);
- string currentstyle;
- void drawMenu(nstream &stream, vector<string> &elements, vector<bool> &selected, int a){
- stream.clear();
- for(int i = 0; i < elements.size(); i++)
- stream << (i == a ? " ==> " : " ") << (selected[i] == true ? "* " : " ") << elements[i] << endl;
- }
- string getItemData(string &filename){
- string buffer;
- ifstream filereader;
- filereader.open(string("science/"+filename).c_str(),ios::in);
- if(!filereader.is_open()){
- cerr << "ERROR: File " << filename.c_str() << " would not open!" << endl;
- abort();
- }
- string result;
- getline(filereader,buffer);
- result += buffer;
- result += "\n\n";
- getline(filereader,buffer);
- result += buffer;
- filereader.close();
- return result;
- }
- string getStyleData(string &filename){
- string buffer;
- ifstream filereader;
- filereader.open(string("styles/"+filename).c_str(),ios::in);
- if(!filereader.is_open()){
- cerr << "ERROR: File " << filename.c_str() << " would not open!" << endl;
- abort();
- }
- string result;
- getline(filereader,buffer);
- result += buffer;
- result += "\n\n";
- getline(filereader,buffer);
- result += buffer;
- getline(filereader,currentstyle);
- filereader.close();
- return result;
- }
- string genPaletteStr(bool selected){
- if(!selected) return "0 0 0";
- string str;
- str += itos(x);
- str += " ";
- str += itos(y);
- str += " 0";
- x++;
- if(x > MAX_X){
- x = 0;
- y++;
- }
- if(y > MAX_Y){
- // nout << "Warning: Using last item slot!" << endl;
- }
- instr_win << "\tSlot: " << str << endl;
- return str;
- }
- ofstream filewriter("editoritems.txt",ios::out|ios::trunc);
- void addItem(string &name, bool selected, bool special = false){
- string buffer;
- ifstream filereader;
- filereader.open(string("science/"+name).c_str(),ios::in);
- if(!filereader.is_open()){
- cerr << "ERROR: File " << name.c_str() << " would not open!" << endl;
- abort();
- }
- if(!filewriter.is_open()){
- cerr << "ERROR: Outfile would not open!" << endl;
- abort();
- }
- getline(filereader,buffer); //Metadata lines: skip them.
- getline(filereader,buffer);
- instr_win << "Adding item: " << name << endl;
- while(filereader.good()){
- getline(filereader,buffer);
- size_t pos = 0;
- if((pos = buffer.find("$P")) != string::npos){
- buffer.replace(pos, 2, (special ? string("0 0 0") : genPaletteStr(selected)));
- }
- if((pos = buffer.find("$S")) != string::npos){
- buffer.replace(pos, 2, currentstyle);
- }
- filewriter << buffer << "\r\n";
- }
- filereader.close();
- }
- void loadConfig(vector<string> &elements, vector<bool> &selected){
- ifstream config_file("fgemod_config.dat");
- string stringy;
- if(!config_file.is_open()) return;
- while(config_file.good()){
- getline(config_file,stringy);
- for(int i = 0; i < elements.size(); i++){
- if(elements[i] == stringy){
- selected[i] = true;
- break;
- }
- }
- }
- config_file.close();
- }
- int main(int argc, char** argv){
- // system("del editoritems.txt");
- // system("rm editoritems.txt");
- if(argc > 1) goto skip_intro;
- srand(42);
- // #ifdef WIN32
- // system("color 0A");
- // #else
- // dout << speed(0) << "\033[22;32m\033[22;40m";
- // #endif
- // clear();
- for(int i = 0; i < ncols; i++)
- nout << ' ';
- 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;
- npause();
- clear();
- nout << "Welcome to the Aperture Science Test Element Selection Processor!" << endl << endl;
- nout << "Please wait a moment while we build the list of available test elements..." << endl;
- skip_intro:
- dirent *entry;
- DIR *dp;
- dp = opendir("science");
- if(dp == NULL){
- nout << "ERROR! You're missing your Science directory!" << endl;
- npause();
- return 2;
- }
- vector<string> testelements;
- vector<bool> selected;
- while(entry = readdir(dp)){
- string name = entry->d_name;
- if(name.find(".test") != string::npos)
- testelements.push_back(name);
- selected.push_back(false);
- }
- dp = opendir("styles");
- if(dp == NULL){
- nout << "ERROR! You're missing your Styles directory!" << endl;
- npause();
- return 2;
- }
- vector<string> styles;
- vector<bool> null_vector;
- while(entry = readdir(dp)){
- string name = entry->d_name;
- if(name.find(".style") != string::npos)
- styles.push_back(name);
- null_vector.push_back(false);
- }
- clear();
- // instr_win << speed(30);
- // menu_win << speed(30);
- // display_win << speed(30);
- // logo_win << speed(120);
- int c;
- int a = 0;
- loadConfig(testelements,selected);
- 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.";
- logo_win << apertureLogoSmall();
- drawMenu(menu_win,testelements,selected,0);
- do{
- switch(c){
- case KEY_UP:
- case 'w':
- a--;
- break;
- case KEY_DOWN:
- case 's':
- a++;
- break;
- case KEY_ENTER:
- case ' ':
- case 'd':
- selected[a].flip();
- break;
- case KEY_F(2):
- display_win << HELP_TEXT;
- npause();
- break;
- default:
- break;
- }
- if(a >= testelements.size()) a = testelements.size() - 1;
- if(a < 0) a = 0;
- drawMenu(menu_win,testelements,selected,a);
- display_win.clear();
- // display_win << "TESTING..." << endl;
- display_win << getItemData(testelements[a]);
- }while((c = menu_win.getchar()) != KEY_F(1))
- bool breaker = false;
- instr_win << "Now choose a style for your test chamber. (This is like the StyleChanger mod.)";
- do{
- c = menu_win.getchar();
- switch(c){
- case KEY_UP:
- case 'w':
- a--;
- break;
- case KEY_DOWN:
- case 's':
- a++;
- break;
- case KEY_ENTER:
- case ' ':
- case 'd':
- breaker = true;
- break;
- case KEY_F(2):
- display_win << HELP_TEXT;
- npause();
- break;
- default:
- break;
- }
- if(a >= styles.size()) a = styles.size() - 1;
- if(a < 0) a = 0;
- drawMenu(menu_win,styles,null_vector,a);
- display_win.clear();
- // display_win << "TESTING..." << endl;
- display_win << getStyleData(styles[a]);
- }while(!breaker)
- instr_win.clear();
- ofstream config_file("fgemod_config.dat");
- string saved_for_later;
- filewriter << "ItemData\r\n{" << "\r\n"; //The start of the original file.
- bool flag = false;
- for(int i = 0; i < testelements.size(); i++){
- if(selected[i] == true && flag == false){
- saved_for_later = testelements[i];
- flag = true;
- instr_win << "\tSaved for end..." << endl;
- }else{
- addItem(testelements[i],selected[i]);
- }
- if(selected[i]) config_file << testelements[i] << endl;
- }
- addItem(saved_for_later,true,true);
- filewriter <<
- "\"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.
- filewriter.close();
- config_file.close();
- instr_win << speed(0) << "[Press Any Key]";
- npause();
- clear();
- }
Advertisement
Add Comment
Please, Sign In to add comment