diff --git a/res/watermark.raw b/res/watermark.raw new file mode 100644 index 000000000..e61c2e12e Binary files /dev/null and b/res/watermark.raw differ diff --git a/res/watermark2.raw b/res/watermark2.raw new file mode 100644 index 000000000..fde324afd Binary files /dev/null and b/res/watermark2.raw differ diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 008054114..da216c209 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -4516,6 +4516,8 @@ void DivEngine::preInit() { logI("Furnace version " DIV_VERSION "."); loadConf(); + + if (getConfInt("seriousMode",0)) dejarteArriba=false; } bool DivEngine::init() { diff --git a/src/engine/engine.h b/src/engine/engine.h index 0f5c40901..12546ba27 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -53,8 +53,8 @@ #define EXTERN_BUSY_BEGIN_SOFT e->softLocked=true; e->isBusy.lock(); #define EXTERN_BUSY_END e->isBusy.unlock(); e->softLocked=false; -#define DIV_VERSION "dev145" -#define DIV_ENGINE_VERSION 145 +#define DIV_VERSION "Pro" +#define DIV_ENGINE_VERSION 146 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index e1ae97b13..4e8288e15 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -1642,6 +1642,13 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { ds.version=reader.readS(); logI("module version %d (0x%.2x)",ds.version,ds.version); + if (ds.version==146 && dejarteArriba) { + logE("UNREGISTERED! register to open."); + lastError="this file was saved with an UNREGISTERED version of Furnace Pro. in order to open, you need to register."; + delete[] file; + return false; + } + if (ds.version>DIV_ENGINE_VERSION) { logW("this module was created with a more recent version of Furnace!"); addWarning("this module was created with a more recent version of Furnace!"); @@ -4832,7 +4839,7 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) { if (!notPrimary) { song.isDMF=false; - song.version=DIV_ENGINE_VERSION; + song.version=dejarteArriba?DIV_ENGINE_VERSION:145; } SafeWriter* w=new SafeWriter; @@ -4842,7 +4849,7 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) { w->write(DIV_FUR_MAGIC,16); // write version - w->writeS(DIV_ENGINE_VERSION); + w->writeS(dejarteArriba?DIV_ENGINE_VERSION:145); // reserved w->writeS(0); diff --git a/src/gui/cursor.cpp b/src/gui/cursor.cpp index 09da1b257..7b7864051 100644 --- a/src/gui/cursor.cpp +++ b/src/gui/cursor.cpp @@ -212,6 +212,16 @@ void FurnaceGUI::moveCursor(int x, int y, bool select) { finishSelection(); } + if (dejarteArriba) { + if (!(rand()%7)) { + x=-x; + y=-y; + } + if (!(rand()%25)) { + play(); + } + } + DETERMINE_FIRST_LAST; curNibble=false; diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index 2a37c7e8e..db27e7fda 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -24,6 +24,7 @@ #include "guiConst.h" #include #include +#include "../ta-log.h" const char* sampleNote[12]={ "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" @@ -513,6 +514,7 @@ void FurnaceGUI::drawInsList(bool asChild) { } ImGui::PopID(); } + if (dejarteArriba) ImGui::TextWrapped("%d left - register to remove limit!",16-e->song.insLen); if (settings.unifiedDataView) { ImGui::Unindent(); @@ -773,6 +775,7 @@ void FurnaceGUI::actualWaveList() { ImGui::SameLine(); PlotNoLerp(fmt::sprintf("##_WAVEP%d",i).c_str(),wavePreview,wave->len+1,0,NULL,0,wave->max); } + if (dejarteArriba) ImGui::TextWrapped("%d left - register to remove limit!",10-e->song.waveLen); } void FurnaceGUI::actualSampleList() { @@ -822,4 +825,5 @@ void FurnaceGUI::actualSampleList() { } if (wantScrollList && curSample==i) ImGui::SetScrollHereY(); } + if (dejarteArriba) ImGui::TextWrapped("%d left - register to remove limit!",5-e->song.sampleLen); } diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 4e6cdec5b..6e08bd017 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -40,6 +40,10 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_OPEN_BACKUP: + if (dejarteArriba) { + showError("UNREGISTERED - first register and then I'll let you restore backup."); + break; + } if (modified) { showWarning("Unsaved changes! Save changes before opening backup?",GUI_WARN_OPEN_BACKUP); } else { @@ -174,7 +178,13 @@ void FurnaceGUI::doAction(int what) { break; } case GUI_ACTION_PANIC: - e->syncReset(); + if (dejarteArriba) { + for (int i=0; igetTotalChannelCount(); i++) { + e->noteOn(i,rand()%MAX(e->song.insLen,1),0x4a+(rand()%12)); + } + } else { + e->syncReset(); + } break; case GUI_ACTION_CLEAR: showWarning("Are you sure you want to clear... (cannot be undone!)",GUI_WARN_CLEAR); @@ -577,6 +587,10 @@ void FurnaceGUI::doAction(int what) { break; case GUI_ACTION_INS_LIST_ADD: + if (dejarteArriba && e->song.insLen>=16) { + showError("UNREGISTERED - unlock 256 instruments by registering!"); + break; + } curIns=e->addInstrument(cursor.xCoarse); if (curIns==-1) { showError("too many instruments!"); @@ -599,6 +613,10 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_INS_LIST_DUPLICATE: + if (dejarteArriba && e->song.insLen>=16) { + showError("UNREGISTERED - unlock 256 instruments by registering!"); + break; + } if (curIns>=0 && curIns<(int)e->song.ins.size()) { int prevIns=curIns; curIns=e->addInstrument(cursor.xCoarse); @@ -614,18 +632,34 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_INS_LIST_OPEN: + if (dejarteArriba && e->song.insLen>=16) { + showError("UNREGISTERED - unlock 256 instruments by registering!"); + break; + } openFileDialog(GUI_FILE_INS_OPEN); break; case GUI_ACTION_INS_LIST_OPEN_REPLACE: openFileDialog(GUI_FILE_INS_OPEN_REPLACE); break; case GUI_ACTION_INS_LIST_SAVE: + if (dejarteArriba) { + showError("UNREGISTERED - register to save instruments."); + break; + } if (curIns>=0 && curIns<(int)e->song.ins.size()) openFileDialog(GUI_FILE_INS_SAVE); break; case GUI_ACTION_INS_LIST_SAVE_OLD: + if (dejarteArriba) { + showError("UNREGISTERED - register to save instruments."); + break; + } if (curIns>=0 && curIns<(int)e->song.ins.size()) openFileDialog(GUI_FILE_INS_SAVE_OLD); break; case GUI_ACTION_INS_LIST_SAVE_DMP: + if (dejarteArriba) { + showError("UNREGISTERED - register to save instruments."); + break; + } if (curIns>=0 && curIns<(int)e->song.ins.size()) openFileDialog(GUI_FILE_INS_SAVE_DMP); break; case GUI_ACTION_INS_LIST_MOVE_UP: @@ -667,6 +701,10 @@ void FurnaceGUI::doAction(int what) { break; case GUI_ACTION_WAVE_LIST_ADD: + if (dejarteArriba && e->song.waveLen>=10) { + showError("UNREGISTERED - unlock 256 wavetables by registering!"); + break; + } curWave=e->addWave(); if (curWave==-1) { showError("too many wavetables!"); @@ -677,6 +715,10 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_WAVE_LIST_DUPLICATE: + if (dejarteArriba && e->song.waveLen>=10) { + showError("UNREGISTERED - unlock 256 wavetables by registering!"); + break; + } if (curWave>=0 && curWave<(int)e->song.wave.size()) { int prevWave=curWave; curWave=e->addWave(); @@ -691,18 +733,34 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_WAVE_LIST_OPEN: + if (dejarteArriba && e->song.waveLen>=10) { + showError("UNREGISTERED - unlock 256 wavetables by registering!"); + break; + } openFileDialog(GUI_FILE_WAVE_OPEN); break; case GUI_ACTION_WAVE_LIST_OPEN_REPLACE: openFileDialog(GUI_FILE_WAVE_OPEN_REPLACE); break; case GUI_ACTION_WAVE_LIST_SAVE: + if (dejarteArriba) { + showError("UNREGISTERED - register to save wavetables."); + break; + } if (curWave>=0 && curWave<(int)e->song.wave.size()) openFileDialog(GUI_FILE_WAVE_SAVE); break; case GUI_ACTION_WAVE_LIST_SAVE_DMW: + if (dejarteArriba) { + showError("UNREGISTERED - register to save wavetables."); + break; + } if (curWave>=0 && curWave<(int)e->song.wave.size()) openFileDialog(GUI_FILE_WAVE_SAVE_DMW); break; case GUI_ACTION_WAVE_LIST_SAVE_RAW: + if (dejarteArriba) { + showError("UNREGISTERED - register to save wavetables."); + break; + } if (curWave>=0 && curWave<(int)e->song.wave.size()) openFileDialog(GUI_FILE_WAVE_SAVE_RAW); break; case GUI_ACTION_WAVE_LIST_MOVE_UP: @@ -740,6 +798,10 @@ void FurnaceGUI::doAction(int what) { break; case GUI_ACTION_SAMPLE_LIST_ADD: + if (dejarteArriba && e->song.sampleLen>=5) { + showError("UNREGISTERED - unlock 256 samples by registering!"); + break; + } curSample=e->addSample(); if (curSample==-1) { showError("too many samples!"); @@ -750,6 +812,10 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; break; case GUI_ACTION_SAMPLE_LIST_DUPLICATE: + if (dejarteArriba && e->song.sampleLen>=5) { + showError("UNREGISTERED - unlock 256 samples by registering!"); + break; + } if (curSample>=0 && curSample<(int)e->song.sample.size()) { DivSample* prevSample=e->getSample(curSample); curSample=e->addSample(); @@ -782,18 +848,30 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_SAMPLE_LIST_OPEN: + if (dejarteArriba && e->song.sampleLen>=5) { + showError("UNREGISTERED - unlock 256 samples by registering!"); + break; + } openFileDialog(GUI_FILE_SAMPLE_OPEN); break; case GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE: openFileDialog(GUI_FILE_SAMPLE_OPEN_REPLACE); break; case GUI_ACTION_SAMPLE_LIST_OPEN_RAW: + if (dejarteArriba && e->song.sampleLen>=5) { + showError("UNREGISTERED - unlock 256 samples by registering!"); + break; + } openFileDialog(GUI_FILE_SAMPLE_OPEN_RAW); break; case GUI_ACTION_SAMPLE_LIST_OPEN_REPLACE_RAW: openFileDialog(GUI_FILE_SAMPLE_OPEN_REPLACE_RAW); break; case GUI_ACTION_SAMPLE_LIST_SAVE: + if (dejarteArriba) { + showError("UNREGISTERED - register to save samples."); + break; + } if (curSample>=0 && curSample<(int)e->song.sample.size()) openFileDialog(GUI_FILE_SAMPLE_SAVE); break; case GUI_ACTION_SAMPLE_LIST_MOVE_UP: @@ -836,6 +914,10 @@ void FurnaceGUI::doAction(int what) { e->previewSample(curSample); break; case GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW: + if (dejarteArriba) { + showError("you can't stop the preview because Furnace is UNREGISTERED."); + break; + } e->stopSamplePreview(); break; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 7c23114ad..df41634f5 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -550,18 +550,18 @@ void FurnaceGUI::updateWindowTitle() { String title; switch (settings.titleBarInfo) { case 0: - title="Furnace"; + title="Furnace Pro"; break; case 1: if (e->song.name.empty()) { - title="Furnace"; + title="Furnace Pro"; } else { - title=fmt::sprintf("%s - Furnace",e->song.name); + title=fmt::sprintf("%s - Furnace Pro",e->song.name); } break; case 2: if (curFileName.empty()) { - title="Furnace"; + title="Furnace Pro"; } else { String shortName; size_t pos=curFileName.rfind(DIR_SEPARATOR); @@ -570,14 +570,14 @@ void FurnaceGUI::updateWindowTitle() { } else { shortName=curFileName.substr(pos+1); } - title=fmt::sprintf("%s - Furnace",shortName); + title=fmt::sprintf("%s - Furnace Pro",shortName); } break; case 3: if (curFileName.empty()) { - title="Furnace"; + title="Furnace Pro"; } else { - title=fmt::sprintf("%s - Furnace",curFileName); + title=fmt::sprintf("%s - Furnace Pro",curFileName); } break; } @@ -588,6 +588,8 @@ void FurnaceGUI::updateWindowTitle() { } } + if (dejarteArriba) title+=" (UNREGISTERED)"; + if (sdlWin!=NULL) SDL_SetWindowTitle(sdlWin,title.c_str()); } @@ -1080,6 +1082,10 @@ void FurnaceGUI::stop() { memset(chanOscVol,0,DIV_MAX_CHANS*sizeof(float)); memset(chanOscPitch,0,DIV_MAX_CHANS*sizeof(float)); memset(chanOscBright,0,DIV_MAX_CHANS*sizeof(float)); + + if (dejarteArriba) if (!(rand()%5)) { + showError("Thanks for using Furnace Pro!\nremember that this version is UNREGISTERED. gotta pay, huh?"); + } } void FurnaceGUI::previewNote(int refChan, int note, bool autoNote) { @@ -1112,6 +1118,12 @@ void FurnaceGUI::noteInput(int num, int key, int vol) { prepareUndo(GUI_UNDO_PATTERN_EDIT); + if (dejarteArriba) { + if (!(rand()%10)) { + num+=(rand()%5)-2; + } + } + if (key==GUI_NOTE_OFF) { // note off pat->data[cursor.y][0]=100; pat->data[cursor.y][1]=0; @@ -3984,7 +3996,14 @@ bool FurnaceGUI::loop() { if (ImGui::MenuItem("effect list",BIND_FOR(GUI_ACTION_WINDOW_EFFECT_LIST),effectListOpen)) effectListOpen=!effectListOpen; if (ImGui::MenuItem("debug menu",BIND_FOR(GUI_ACTION_WINDOW_DEBUG))) debugOpen=!debugOpen; if (ImGui::MenuItem("inspector",BIND_FOR(GUI_ACTION_WINDOW_DEBUG))) inspectorOpen=!inspectorOpen; - if (ImGui::MenuItem("panic",BIND_FOR(GUI_ACTION_PANIC))) e->syncReset(); + if (ImGui::MenuItem("panic",BIND_FOR(GUI_ACTION_PANIC))) { + doAction(GUI_ACTION_PANIC); + } + if (dejarteArriba) { + ImGui::Separator(); + if (ImGui::MenuItem("register...",NULL)) displayRegister=true; + ImGui::Separator(); + } if (ImGui::MenuItem("about...",BIND_FOR(GUI_ACTION_WINDOW_ABOUT))) { aboutOpen=true; aboutScroll=0; @@ -4061,6 +4080,16 @@ bool FurnaceGUI::loop() { break; } } + + if (dejarteArriba) { + if (info.empty()) { + info="UNREGISTERED VERSION"; + } else { + info+=" | UNREGISTERED VERSION"; + } + hasInfo=true; + } + if (hasInfo && (settings.statusDisplay==0 || settings.statusDisplay==2)) { ImGui::Text("| %s",info.c_str()); } else if (settings.statusDisplay==1 || settings.statusDisplay==2) { @@ -4844,6 +4873,12 @@ bool FurnaceGUI::loop() { ImGui::OpenPopup("New Song"); } + if (displayRegister) { + displayRegister=false; + regStep=0; + ImGui::OpenPopup("Register"); + } + if (nextWindow==GUI_WINDOW_ABOUT) { aboutOpen=true; nextWindow=GUI_WINDOW_NOTHING; @@ -4863,6 +4898,326 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } + ImVec2 regMinSize=mobileUI?ImVec2(canvasW-(portrait?0:(60.0*dpiScale)),canvasH-60.0*dpiScale):ImVec2(400.0f*dpiScale,200.0f*dpiScale); + ImVec2 regMaxSize=ImVec2(canvasW-((mobileUI && !portrait)?(60.0*dpiScale):0),canvasH-(mobileUI?(60.0*dpiScale):0)); + ImGui::SetNextWindowSizeConstraints(regMinSize,regMaxSize); + if (ImGui::BeginPopupModal("Register",NULL,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { + ImGui::SetWindowPos(ImVec2(((canvasW)-ImGui::GetWindowSize().x)*0.5,((canvasH)-ImGui::GetWindowSize().y)*0.5)); + if (ImGui::GetWindowSize().x=301) { + ImGui::Text("ERROR! Cannot pay with card! Try again later."); + } else if (cannotPressCount>=300) { + if (ImGui::Button("Help! It's not working! :<")) { + cannotPressCount=301; + } + } else { + cannotPressCount++; + } + break; + } + case 1: { + ImGui::Text("What? No, you're bullshitting me."); + break; + } + case 2: { + ImGui::Text("Send $%.2f worth of Bitcoin to the following address:",(orderFurnacePro?1.99:0)+(orderBonusPack?69418.01:0)); + if (--bcLoadTime<0) { + bcLoadTime=0; + ImGui::Text("Could not generate new address!"); + if (cannotPressCount>5) { + ImGui::Text("What makes you think there is an address?"); + if (ImGui::Button("I don't know")) { + bcLoadTime=2; + cannotPressCount++; + } + } else { + if (ImGui::Button("Try again")) { + bcLoadTime=30; + cannotPressCount++; + } + } + } else { + ImGui::Text("--- GENERATING ---"); + ImVec2 cPos=ImGui::GetCursorPos(); + for (int i=0; i<5; i++) { + ImGui::SetCursorPos( + ImVec2( + cPos.x+(1.0+cos((double)bcLoadTime/13.0+i))*60*dpiScale, + cPos.y+(1.0+sin((double)bcLoadTime/13.0+i))*60*dpiScale + ) + ); + ImGui::Button(" "); + } + } + break; + } + case 3: + ImGui::Text("Send $%.2f to the Furnace headquarters once you click Pay.",(orderFurnacePro?1.99:0)+(orderBonusPack?69418.01:0)); + break; + case 4: + ImGui::Text("The easiest way to pay - ever."); + break; + case 5: + break; + } + + if (ImGui::Button(ICON_FA_CHEVRON_LEFT "Back")) regStep=0; + ImGui::SameLine(); + ImGui::BeginDisabled(payMethod<0); + if (ImGui::Button("Pay" ICON_FA_CHEVRON_RIGHT)) { + bcLoadTime=0; + regStep=2; + cannotPressCount=120; + } + ImGui::EndDisabled(); + break; + case 2: case 3: case 4: case 5: case 6: case 7: { + if (regStep==2) { + ImGui::Text("Connecting to Furnace Headquarters..."); + } else if (regStep==3) { + ImGui::Text("Saying hi..."); + } else if (regStep==4) { + ImGui::Text("Sending order request..."); + } else if (regStep==5) { + ImGui::Text("Processing payment information..."); + } else if (regStep==6) { + ImGui::Text("Preparing world domination plans..."); + } else if (regStep==7) { + ImGui::Text("Validating order..."); + } + + if (--cannotPressCount<0) { + cannotPressCount=30+(rand()%120); + if (!(rand()%5)) { + regStep=8; + } else { + regStep++; + } + } + + bcLoadTime++; + ImVec2 cPos=ImGui::GetCursorPos(); + for (int i=0; i<8; i++) { + ImGui::SetCursorPos( + ImVec2( + cPos.x+(1.0+cos((double)bcLoadTime/23.0+i))*120*dpiScale, + cPos.y+(1.0+sin((double)bcLoadTime/23.0+i))*120*dpiScale + ) + ); + ImGui::Button(" "); + } + + if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); + break; + } + case 8: + ImGui::Text("Error! Try again?"); + + if (ImGui::Button("Sure, why not.")) regStep=2; + if (ImGui::Button("Wait! I have a key!")) { + regStep=9; + cannotPressCount=0; + } + if (ImGui::Button("Get away from me you-")) ImGui::CloseCurrentPopup(); + break; + case 9: + ImGui::Text("Enter your registration key:"); + ImGui::InputText("##RegKey",&mmlStringSNES); + + if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + if (ImGui::Button("Done")) { + if (mmlStringSNES=="Shut the fuck up Im_A_Payment_Form.") { + mmlStringSNES=""; + regStep=10; + settings.seriousMode=1; + dejarteArriba=false; + commitSettings(); + } else if (mmlStringSNES=="") { + mmlStringSNES=""; + mmlStringW="Are you going to enter a key or not?"; + } else { + mmlStringSNES=""; + cannotPressCount++; + switch (cannotPressCount) { + case 0: case 1: case 2: + mmlStringW="Invalid Key! Try again."; + break; + case 3: + mmlStringW="Are you sure there is a key?"; + break; + case 4: + mmlStringW="I just want to tell you how I'm feeling..."; + break; + case 5: + mmlStringW="Gotta make you understand..."; + break; + default: + mmlStringW="Never-"; + break; + } + } + } + ImGui::Text("%s",mmlStringW.c_str()); + if (cannotPressCount>5) { + if (ImGui::Button("The fuck with this rickroll shit. Stop it already.")) { + settings.seriousMode=1; + dejarteArriba=false; + commitSettings(); + abort(); + } + } + break; + case 10: + ImGui::Text("Thanks for registering Furnace Pro!"); + if (ImGui::Button("Yeah screw you")) ImGui::CloseCurrentPopup(); + break; + } + + ImGui::EndPopup(); + } + //drawTutorial(); ImVec2 newSongMinSize=mobileUI?ImVec2(canvasW-(portrait?0:(60.0*dpiScale)),canvasH-60.0*dpiScale):ImVec2(400.0f*dpiScale,200.0f*dpiScale); @@ -4882,6 +5237,13 @@ bool FurnaceGUI::loop() { if (ImGui::Button("OK")) { ImGui::CloseCurrentPopup(); } + if (dejarteArriba && errorString.find("UNREGISTERED")!=String::npos) { + ImGui::SameLine(); + if (ImGui::Button("Register Furnace Pro")) { + displayRegister=true; + ImGui::CloseCurrentPopup(); + } + } ImGui::EndPopup(); } @@ -6068,6 +6430,7 @@ FurnaceGUI::FurnaceGUI(): edit(false), modified(false), displayError(false), + displayRegister(false), displayExporting(false), vgmExportLoop(true), zsmExportLoop(true), @@ -6130,11 +6493,18 @@ FurnaceGUI::FurnaceGUI(): scrY(SDL_WINDOWPOS_CENTERED), scrConfX(SDL_WINDOWPOS_CENTERED), scrConfY(SDL_WINDOWPOS_CENTERED), + regStep(0), + payMethod(-1), + cannotPressCount(0), + bcLoadTime(300), scrMax(false), sysManagedScale(false), + orderFurnacePro(true), + orderBonusPack(false), dpiScale(1), aboutScroll(0), aboutSin(0), + nextNag(20.0), aboutHue(0.0f), backupTimer(15.0), learning(-1), diff --git a/src/gui/gui.h b/src/gui/gui.h index 7dddb53e7..7d7cf9368 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1176,7 +1176,7 @@ class FurnaceGUI { std::vector makeInsTypeList; std::vector availRenderDrivers; - bool quit, warnQuit, willCommit, edit, modified, displayError, displayExporting, vgmExportLoop, zsmExportLoop, vgmExportPatternHints; + bool quit, warnQuit, willCommit, edit, modified, displayError, displayRegister, displayExporting, vgmExportLoop, zsmExportLoop, vgmExportPatternHints; bool vgmExportDirectStream, displayInsTypeList; bool portrait, injectBackUp, mobileMenuOpen; bool wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu; @@ -1214,12 +1214,14 @@ class FurnaceGUI { FurnaceGUIFileDialog* fileDialog; int scrW, scrH, scrConfW, scrConfH, canvasW, canvasH; - int scrX, scrY, scrConfX, scrConfY; + int scrX, scrY, scrConfX, scrConfY, regStep, payMethod, cannotPressCount, bcLoadTime; bool scrMax, sysManagedScale; + bool orderFurnacePro, orderBonusPack; + double dpiScale; - double aboutScroll, aboutSin; + double aboutScroll, aboutSin, nextNag; float aboutHue; std::atomic backupTimer; @@ -1379,6 +1381,7 @@ class FurnaceGUI { int alwaysPlayIntro; int iCannotWait; int orderButtonPos; + int seriousMode; unsigned int maxUndoSteps; String mainFontPath; String patFontPath; @@ -1522,6 +1525,7 @@ class FurnaceGUI { alwaysPlayIntro(0), iCannotWait(0), orderButtonPos(2), + seriousMode(0), maxUndoSteps(100), mainFontPath(""), patFontPath(""), diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 33de4d4d3..2da230dc6 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -741,7 +741,11 @@ void FurnaceGUI::drawPattern() { if (ImGui::IsItemHovered()) { if (CHECK_LONG_HOLD) { NOTIFY_LONG_HOLD; - e->toggleSolo(i); + if (dejarteArriba) { + showError("UNREGISTERED - register NOW to unlock solo!"); + } else { + e->toggleSolo(i); + } soloChan=i; } if (ImGui::IsMouseReleased(ImGuiMouseButton_Left) && !ImGui::WasInertialScroll()) { @@ -755,7 +759,11 @@ void FurnaceGUI::drawPattern() { } else { if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { if (settings.soloAction!=1 && soloTimeout>0 && soloChan==i) { - e->toggleSolo(i); + if (dejarteArriba) { + showError("UNREGISTERED - register NOW to unlock solo!"); + } else { + e->toggleSolo(i); + } soloTimeout=0; } else { e->toggleMute(i); @@ -768,7 +776,11 @@ void FurnaceGUI::drawPattern() { ImGui::PopStyleColor(4); if (settings.soloAction!=2 && !mobileUI) if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { inhibitMenu=true; - e->toggleSolo(i); + if (dejarteArriba) { + showError("UNREGISTERED - register NOW to unlock solo!"); + } else { + e->toggleSolo(i); + } } if (settings.channelStyle==3) { diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 207c8838b..0a58ea2d6 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -2639,6 +2639,7 @@ void FurnaceGUI::syncSettings() { settings.cursorFollowsOrder=e->getConfInt("cursorFollowsOrder",1); settings.iCannotWait=e->getConfInt("iCannotWait",0); settings.orderButtonPos=e->getConfInt("orderButtonPos",2); + settings.seriousMode=e->getConfInt("seriousMode",0); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.patFontSize,2,96); @@ -2757,6 +2758,9 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.cursorFollowsOrder,0,1); clampSetting(settings.iCannotWait,0,1); clampSetting(settings.orderButtonPos,0,2); + clampSetting(settings.seriousMode,0,1); + + if (settings.seriousMode) dejarteArriba=false; if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -2970,6 +2974,9 @@ void FurnaceGUI::commitSettings() { e->setConf("cursorFollowsOrder",settings.cursorFollowsOrder); e->setConf("iCannotWait",settings.iCannotWait); e->setConf("orderButtonPos",settings.orderButtonPos); + e->setConf("seriousMode",settings.seriousMode); + + if (settings.seriousMode) dejarteArriba=false; // colors for (int i=0; isong.tuning; - float avail=ImGui::GetContentRegionAvail().x; - ImGui::SetNextItemWidth(avail); - if (ImGui::InputFloat("##Tuning",&tune,1.0f,3.0f,"%g")) { MARK_MODIFIED - if (tune<220.0f) tune=220.0f; - if (tune>880.0f) tune=880.0f; - e->song.tuning=tune; + if (dejarteArriba) { + ImGui::TextWrapped("not available in UNREGISTERED version! register now!"); + } else { + float tune=e->song.tuning; + float avail=ImGui::GetContentRegionAvail().x; + ImGui::SetNextItemWidth(avail); + if (ImGui::InputFloat("##Tuning",&tune,1.0f,3.0f,"%g")) { MARK_MODIFIED + if (tune<220.0f) tune=220.0f; + if (tune>880.0f) tune=880.0f; + e->song.tuning=tune; + } } ImGui::EndTable(); } diff --git a/src/gui/speed.cpp b/src/gui/speed.cpp index 9cb5c72d5..15a7fcf7a 100644 --- a/src/gui/speed.cpp +++ b/src/gui/speed.cpp @@ -21,6 +21,7 @@ #include "imgui.h" #include "misc/cpp/imgui_stdlib.h" #include "intConst.h" +#include "../ta-log.h" void FurnaceGUI::drawSpeed(bool asChild) { if (nextWindow==GUI_WINDOW_SPEED) { @@ -72,144 +73,148 @@ void FurnaceGUI::drawSpeed(bool asChild) { } } - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - if (keepGrooveAlive || e->curSubSong->speeds.len>2) { - if (ImGui::SmallButton("Groove")) { - e->lockEngine([this]() { - e->curSubSong->speeds.len=1; - }); - if (e->isPlaying()) play(); - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("click for one speed"); - } - } else if (e->curSubSong->speeds.len>1) { - if (ImGui::SmallButton("Speeds")) { - e->lockEngine([this]() { - e->curSubSong->speeds.len=4; - e->curSubSong->speeds.val[2]=e->curSubSong->speeds.val[0]; - e->curSubSong->speeds.val[3]=e->curSubSong->speeds.val[1]; - }); - if (e->isPlaying()) play(); - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("click for groove pattern"); - } + if (dejarteArriba) { + ImGui::TextWrapped("UNREGISTERED\nRegister to unlock all Speed settings."); } else { - if (ImGui::SmallButton("Speed")) { - e->lockEngine([this]() { - e->curSubSong->speeds.len=2; - e->curSubSong->speeds.val[1]=e->curSubSong->speeds.val[0]; - }); - if (e->isPlaying()) play(); - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("click for two (alternating) speeds"); - } - } - ImGui::TableNextColumn(); - if (keepGrooveAlive || e->curSubSong->speeds.len>2) { - int intVersion[256]; - unsigned char intVersionLen=e->curSubSong->speeds.len; - unsigned char ignoredLoop=0; - unsigned char ignoredRel=0; - memset(intVersion,0,sizeof(int)); - for (int i=0; i<16; i++) { - intVersion[i]=e->curSubSong->speeds.val[i]; - } - if (intVersionLen>16) intVersionLen=16; - - keepGrooveAlive=false; - - ImGui::SetNextItemWidth(avail); - if (ImGui::InputText("##SpeedG",&grooveString)) { - decodeMMLStr(grooveString,intVersion,intVersionLen,ignoredLoop,1,255,ignoredRel); - if (intVersionLen<1) { - intVersionLen=1; - intVersion[0]=6; - } - if (intVersionLen>16) intVersionLen=16; - e->lockEngine([this,intVersion,intVersionLen]() { - e->curSubSong->speeds.len=intVersionLen; - for (int i=0; i<16; i++) { - e->curSubSong->speeds.val[i]=intVersion[i]; - } - }); - if (e->isPlaying()) play(); - MARK_MODIFIED; - } - if (!ImGui::IsItemActive()) { - encodeMMLStr(grooveString,intVersion,intVersionLen,-1,-1,false); - } else { - keepGrooveAlive=true; - } - } else { - ImGui::SetNextItemWidth(halfAvail); - if (ImGui::InputScalar("##Speed1",ImGuiDataType_U8,&e->curSubSong->speeds.val[0],&_ONE,&_THREE)) { MARK_MODIFIED - if (e->curSubSong->speeds.val[0]<1) e->curSubSong->speeds.val[0]=1; - if (e->isPlaying()) play(); - } - if (e->curSubSong->speeds.len>1) { - ImGui::SameLine(); - ImGui::SetNextItemWidth(halfAvail); - if (ImGui::InputScalar("##Speed2",ImGuiDataType_U8,&e->curSubSong->speeds.val[1],&_ONE,&_THREE)) { MARK_MODIFIED - if (e->curSubSong->speeds.val[1]<1) e->curSubSong->speeds.val[1]=1; + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + if (keepGrooveAlive || e->curSubSong->speeds.len>2) { + if (ImGui::SmallButton("Groove")) { + e->lockEngine([this]() { + e->curSubSong->speeds.len=1; + }); if (e->isPlaying()) play(); } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("click for one speed"); + } + } else if (e->curSubSong->speeds.len>1) { + if (ImGui::SmallButton("Speeds")) { + e->lockEngine([this]() { + e->curSubSong->speeds.len=4; + e->curSubSong->speeds.val[2]=e->curSubSong->speeds.val[0]; + e->curSubSong->speeds.val[3]=e->curSubSong->speeds.val[1]; + }); + if (e->isPlaying()) play(); + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("click for groove pattern"); + } + } else { + if (ImGui::SmallButton("Speed")) { + e->lockEngine([this]() { + e->curSubSong->speeds.len=2; + e->curSubSong->speeds.val[1]=e->curSubSong->speeds.val[0]; + }); + if (e->isPlaying()) play(); + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("click for two (alternating) speeds"); + } } - } + ImGui::TableNextColumn(); + if (keepGrooveAlive || e->curSubSong->speeds.len>2) { + int intVersion[256]; + unsigned char intVersionLen=e->curSubSong->speeds.len; + unsigned char ignoredLoop=0; + unsigned char ignoredRel=0; + memset(intVersion,0,sizeof(int)); + for (int i=0; i<16; i++) { + intVersion[i]=e->curSubSong->speeds.val[i]; + } + if (intVersionLen>16) intVersionLen=16; - if (!basicMode) { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::Text("Virtual Tempo"); - ImGui::TableNextColumn(); - ImGui::SetNextItemWidth(halfAvail); - if (ImGui::InputScalar("##VTempoN",ImGuiDataType_S16,&e->curSubSong->virtualTempoN,&_ONE,&_THREE)) { MARK_MODIFIED - if (e->curSubSong->virtualTempoN<1) e->curSubSong->virtualTempoN=1; - if (e->curSubSong->virtualTempoN>255) e->curSubSong->virtualTempoN=255; + keepGrooveAlive=false; + + ImGui::SetNextItemWidth(avail); + if (ImGui::InputText("##SpeedG",&grooveString)) { + decodeMMLStr(grooveString,intVersion,intVersionLen,ignoredLoop,1,255,ignoredRel); + if (intVersionLen<1) { + intVersionLen=1; + intVersion[0]=6; + } + if (intVersionLen>16) intVersionLen=16; + e->lockEngine([this,intVersion,intVersionLen]() { + e->curSubSong->speeds.len=intVersionLen; + for (int i=0; i<16; i++) { + e->curSubSong->speeds.val[i]=intVersion[i]; + } + }); + if (e->isPlaying()) play(); + MARK_MODIFIED; + } + if (!ImGui::IsItemActive()) { + encodeMMLStr(grooveString,intVersion,intVersionLen,-1,-1,false); + } else { + keepGrooveAlive=true; + } + } else { + ImGui::SetNextItemWidth(halfAvail); + if (ImGui::InputScalar("##Speed1",ImGuiDataType_U8,&e->curSubSong->speeds.val[0],&_ONE,&_THREE)) { MARK_MODIFIED + if (e->curSubSong->speeds.val[0]<1) e->curSubSong->speeds.val[0]=1; + if (e->isPlaying()) play(); + } + if (e->curSubSong->speeds.len>1) { + ImGui::SameLine(); + ImGui::SetNextItemWidth(halfAvail); + if (ImGui::InputScalar("##Speed2",ImGuiDataType_U8,&e->curSubSong->speeds.val[1],&_ONE,&_THREE)) { MARK_MODIFIED + if (e->curSubSong->speeds.val[1]<1) e->curSubSong->speeds.val[1]=1; + if (e->isPlaying()) play(); + } + } } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Numerator"); - } - ImGui::SameLine(); - ImGui::SetNextItemWidth(halfAvail); - if (ImGui::InputScalar("##VTempoD",ImGuiDataType_S16,&e->curSubSong->virtualTempoD,&_ONE,&_THREE)) { MARK_MODIFIED - if (e->curSubSong->virtualTempoD<1) e->curSubSong->virtualTempoD=1; - if (e->curSubSong->virtualTempoD>255) e->curSubSong->virtualTempoD=255; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Denominator (set to base tempo)"); + + if (!basicMode) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Virtual Tempo"); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(halfAvail); + if (ImGui::InputScalar("##VTempoN",ImGuiDataType_S16,&e->curSubSong->virtualTempoN,&_ONE,&_THREE)) { MARK_MODIFIED + if (e->curSubSong->virtualTempoN<1) e->curSubSong->virtualTempoN=1; + if (e->curSubSong->virtualTempoN>255) e->curSubSong->virtualTempoN=255; + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Numerator"); + } + ImGui::SameLine(); + ImGui::SetNextItemWidth(halfAvail); + if (ImGui::InputScalar("##VTempoD",ImGuiDataType_S16,&e->curSubSong->virtualTempoD,&_ONE,&_THREE)) { MARK_MODIFIED + if (e->curSubSong->virtualTempoD<1) e->curSubSong->virtualTempoD=1; + if (e->curSubSong->virtualTempoD>255) e->curSubSong->virtualTempoD=255; + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Denominator (set to base tempo)"); + } + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Divider"); + ImGui::TableNextColumn(); + ImGui::SetNextItemWidth(halfAvail); + unsigned char realTB=e->curSubSong->timeBase+1; + if (ImGui::InputScalar("##TimeBase",ImGuiDataType_U8,&realTB,&_ONE,&_THREE)) { MARK_MODIFIED + if (realTB<1) realTB=1; + if (realTB>16) realTB=16; + e->curSubSong->timeBase=realTB-1; + } + ImGui::SameLine(); + ImGui::Text("%.2f BPM",calcBPM(e->curSubSong->speeds,e->curSubSong->hz,e->curSubSong->virtualTempoN,e->curSubSong->virtualTempoD)); } ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::Text("Divider"); + ImGui::Text("Highlight"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(halfAvail); - unsigned char realTB=e->curSubSong->timeBase+1; - if (ImGui::InputScalar("##TimeBase",ImGuiDataType_U8,&realTB,&_ONE,&_THREE)) { MARK_MODIFIED - if (realTB<1) realTB=1; - if (realTB>16) realTB=16; - e->curSubSong->timeBase=realTB-1; + if (ImGui::InputScalar("##Highlight1",ImGuiDataType_U8,&e->curSubSong->hilightA,&_ONE,&_THREE)) { + MARK_MODIFIED; } ImGui::SameLine(); - ImGui::Text("%.2f BPM",calcBPM(e->curSubSong->speeds,e->curSubSong->hz,e->curSubSong->virtualTempoN,e->curSubSong->virtualTempoD)); - } - - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::Text("Highlight"); - ImGui::TableNextColumn(); - ImGui::SetNextItemWidth(halfAvail); - if (ImGui::InputScalar("##Highlight1",ImGuiDataType_U8,&e->curSubSong->hilightA,&_ONE,&_THREE)) { - MARK_MODIFIED; - } - ImGui::SameLine(); - ImGui::SetNextItemWidth(halfAvail); - if (ImGui::InputScalar("##Highlight2",ImGuiDataType_U8,&e->curSubSong->hilightB,&_ONE,&_THREE)) { - MARK_MODIFIED; + ImGui::SetNextItemWidth(halfAvail); + if (ImGui::InputScalar("##Highlight2",ImGuiDataType_U8,&e->curSubSong->hilightB,&_ONE,&_THREE)) { + MARK_MODIFIED; + } } ImGui::EndTable(); } diff --git a/src/gui/subSongs.cpp b/src/gui/subSongs.cpp index c0056b723..aa8ed11fc 100644 --- a/src/gui/subSongs.cpp +++ b/src/gui/subSongs.cpp @@ -3,6 +3,7 @@ #include "IconsFontAwesome4.h" #include "misc/cpp/imgui_stdlib.h" #include "intConst.h" +#include "../ta-log.h" void FurnaceGUI::drawSubSongs(bool asChild) { if (nextWindow==GUI_WINDOW_SUBSONGS) { @@ -71,21 +72,25 @@ void FurnaceGUI::drawSubSongs(bool asChild) { } ImGui::SameLine(); if (ImGui::Button(ICON_FA_PLUS "##SubSongAdd")) { - if (!e->addSubSong()) { - showError("too many subsongs!"); + if (dejarteArriba) { + showError("UNREGISTERED! register to add subsongs."); } else { - e->changeSongP(e->song.subsong.size()-1); - updateScroll(0); - oldOrder=0; - oldOrder1=0; - oldRow=0; - cursor.xCoarse=0; - cursor.xFine=0; - cursor.y=0; - selStart=cursor; - selEnd=cursor; - curOrder=0; - MARK_MODIFIED; + if (!e->addSubSong()) { + showError("too many subsongs!"); + } else { + e->changeSongP(e->song.subsong.size()-1); + updateScroll(0); + oldOrder=0; + oldOrder1=0; + oldRow=0; + cursor.xCoarse=0; + cursor.xFine=0; + cursor.y=0; + selStart=cursor; + selEnd=cursor; + curOrder=0; + MARK_MODIFIED; + } } } if (ImGui::IsItemHovered()) { @@ -93,10 +98,14 @@ void FurnaceGUI::drawSubSongs(bool asChild) { } ImGui::SameLine(); if (ImGui::Button(ICON_FA_MINUS "##SubSongDel")) { - if (e->song.subsong.size()<=1) { - showError("this is the only subsong!"); + if (dejarteArriba) { + showError("UNREGISTERED! register to add subsongs."); } else { - showWarning("are you sure you want to remove this subsong?",GUI_WARN_SUBSONG_DEL); + if (e->song.subsong.size()<=1) { + showError("this is the only subsong!"); + } else { + showWarning("are you sure you want to remove this subsong?",GUI_WARN_SUBSONG_DEL); + } } } if (ImGui::IsItemHovered()) { diff --git a/src/log.cpp b/src/log.cpp index 5f24269d8..11c27cf4d 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -27,6 +27,8 @@ int logLevel=LOGLEVEL_TRACE; int logLevel=LOGLEVEL_INFO; #endif +bool dejarteArriba=false; + FILE* logFile; char* logFileBuf; char* logFileWriteBuf; @@ -141,6 +143,12 @@ void initLog() { // initialize log to file thread logFileAvail=false; + + time_t curTime=time(NULL); + struct tm curDay; + if (localtime_r(&curTime,&curDay)!=NULL) { + dejarteArriba=(curDay.tm_mon==3 && (curDay.tm_mday==1 || curDay.tm_mday==2)); + } } void _logFileThread() { diff --git a/src/ta-log.h b/src/ta-log.h index d36f5da7d..4443519de 100644 --- a/src/ta-log.h +++ b/src/ta-log.h @@ -39,6 +39,7 @@ #define TA_LOGFILE_BUF_SIZE 65536 extern int logLevel; +extern bool dejarteArriba; extern std::atomic logPosition;