ref: 014d1283961f87c0cbfc65b8a58b0399dc52967c
dir: /DoConfig/DoConfig.cpp/
/* This program is free software. It comes without any warranty, to * the extent permitted by applicable law. You can redistribute it * and/or modify it under the terms of the Do What The F*** You Want * To Public License, Version 2, as published by Sam Hocevar. See * http://sam.zoy.org/wtfpl/COPYING for more details. */ #include <cstdlib> #include <iostream> #include <fstream> #include <cstring> #include "FL/Fl.H" #include "FL/Fl_Window.H" #include "FL/Fl_Radio_Round_Button.H" #include "FL/Fl_Choice.H" #include "FL/Fl_Check_Button.H" #define HEADER "DOUKUTSU20041206" #define TEXT "Courier New" struct data{ char header[32]; char text[64]; int move; int attack; int okay; int display; int useJoy; int buttons[8]; }; class RadioRow{ public: RadioRow(char offset); int value(); void value(int input); private: Fl_Group *group; Fl_Radio_Round_Button *buttons[6]; Fl_Group *label; }; RadioRow::RadioRow(char offset){ char *temp = new char[2]; *(temp) = (char)(49+offset); //Muhahahahahahah! *(temp+1) = '\0'; this->group = new Fl_Group(140+offset*30, 150, 30, 180); this->group->label(temp); this->group->align(FL_ALIGN_TOP_LEFT); for(char i=0;i<6;i++){ this->buttons[i] = new Fl_Radio_Round_Button(140+offset*30, 150+30*i, 30, 30); } this->group->end(); } int RadioRow::value(){ char i; for(i=0;i<6;i++){ if(this->buttons[i]->value()){ return (int)i; } } return 0; } void RadioRow::value(int input){ this->buttons[input]->setonly(); } Fl_Round_Button *movear; Fl_Round_Button *movegt; Fl_Round_Button *buttonxz; Fl_Round_Button *buttonzx; Fl_Round_Button *okayjump; Fl_Round_Button *okayattack; Fl_Choice *displaychoice; Fl_Check_Button *joychoice; Fl_Group *joystuffcontainer; RadioRow *joyRows[8]; void quit(Fl_Widget*, void*){ std::exit(0); } void activatejoy(Fl_Widget*, void*){ if(joystuffcontainer->active()){ joystuffcontainer->deactivate(); } else { joystuffcontainer->activate(); } } void read_Config(){ std::fstream fd; data config; fd.open("Config.dat", std::ios::in | std::ios::binary); fd.read((char*)&config, 148); if (config.move == 0){ movear->setonly(); } else { movegt->setonly(); } if (config.attack == 0){ buttonxz->setonly(); } else { buttonzx->setonly(); } if (config.okay == 0){ okayjump->setonly(); }else{ okayattack->setonly(); } displaychoice->value(config.display); joychoice->value(config.useJoy); if( !config.useJoy ){ joystuffcontainer->deactivate(); } for(char i=0;i<8;i++){ if(config.buttons[i]<9 && config.buttons[i]>0){ joyRows[i]->value(config.buttons[i] -1); } } fd.close(); } void write_Config(Fl_Widget*, void*){ std::fstream fd; data config; std::memset(config.header, '\0', 32); std::memset(config.text, '\0', 64); std::strcpy(config.header, HEADER); std::strcpy(config.text, TEXT); fd.open("Config.dat", std::ios::out | std::ios::binary); config.move = movegt->value(); config.attack = buttonzx->value(); config.okay = okayattack->value(); config.display = displaychoice->value(); config.useJoy = joychoice->value(); for(char i =0;i<8;i++){ config.buttons[i] = joyRows[i]->value(); } fd.write((char*)&config, 148); fd.close(); exit(0); } int main(int argc, char* argv[]){ Fl_Window *mainw = new Fl_Window(400, 380, "DoConfigure - Doukutsu Monotagari Settings"); Fl_Group *movegroup = new Fl_Group(10, 10, 185, 50); movegroup->box(FL_THIN_DOWN_BOX); movear = new Fl_Radio_Round_Button(10, 10, 185, 20, "Arrows for Movement"); movear->setonly(); movegt = new Fl_Radio_Round_Button(10, 40, 185, 20, "<>? for Movement"); movegroup->end(); Fl_Group *buttongroup = new Fl_Group(10, 70, 185, 50); buttongroup->box(FL_THIN_DOWN_BOX); buttonxz = new Fl_Radio_Round_Button(10, 70, 185, 20, "Z=Jump; X=Attack"); buttonxz->setonly(); buttonzx = new Fl_Radio_Round_Button(10, 100, 185, 20, "X=Jump; Z=Attack"); buttongroup->end(); Fl_Group *okaygroup = new Fl_Group(205, 10, 185, 50); okaygroup->box(FL_THIN_DOWN_BOX); okayjump = new Fl_Radio_Round_Button(205, 10, 185, 20, "Jump=Okay"); okayjump->setonly(); okayattack = new Fl_Radio_Round_Button(205, 40, 185, 20, "Attack=Okay"); okaygroup->end(); displaychoice = new Fl_Choice(205, 70, 185, 20); Fl_Menu_Item screens[] = { {"Fullscreen 16-bit"}, {"Windowed 320x240"}, {"Windowed 640x480"}, {"Fullscreen 24-bit"}, {"Fullscreen 32-bit"}, {0}}; displaychoice->menu(screens); joychoice = new Fl_Check_Button(205, 100, 185, 20, "Use Joypad"); joychoice->callback(&activatejoy); joystuffcontainer = new Fl_Group(10, 130, 380, 200); joystuffcontainer->box(FL_THIN_DOWN_BOX); for(char i=0;i<8;i++){ joyRows[i] = new RadioRow(i); } //There's no Label class alright? I'll switch it as soon as one is introduced. Fl_Group *labeljump = new Fl_Group(10, 150, 10, 20); labeljump->label("Jump:"); labeljump->align(FL_ALIGN_RIGHT); labeljump->end(); Fl_Group *labelattack = new Fl_Group(10, 180, 10, 20); labelattack->label("Attack:"); labelattack->align(FL_ALIGN_RIGHT); labelattack->end(); Fl_Group *labelweaponup = new Fl_Group(10, 210, 10, 20); labelweaponup->label("Weapon+:"); labelweaponup->align(FL_ALIGN_RIGHT); labelweaponup->end(); Fl_Group *labelweapondown = new Fl_Group(10, 240, 10, 20); labelweapondown->label("Weapon-:"); labelweapondown->align(FL_ALIGN_RIGHT); labelweapondown->end(); Fl_Group *labelitem = new Fl_Group(10, 270, 10, 20); labelitem->label("Items:"); labelitem->align(FL_ALIGN_RIGHT); labelitem->end(); Fl_Group *labelmap = new Fl_Group(10, 300, 10, 20); labelmap->label("Map:"); labelmap->align(FL_ALIGN_RIGHT); labelmap->end(); joystuffcontainer->end(); Fl_Button *okaybutton = new Fl_Button(10, 340, 185, 30, "Okay"); okaybutton->callback(&write_Config); Fl_Button *cancelbutton = new Fl_Button(205, 340, 185, 30, "Cancel"); cancelbutton->callback(&quit); mainw->end(); mainw->show(argc, argv); read_Config(); Fl::option(Fl::OPTION_VISIBLE_FOCUS, false); return Fl::run(); }