From 17673104cf705ff728f545d1d7667bece21a93d4 Mon Sep 17 00:00:00 2001 From: Preben Eriksen Date: Tue, 7 Jan 2025 13:54:32 +0100 Subject: [PATCH] PE: Storyboard max screens increased from 50 to 150, max widgets from 50 to 100. Can't be unlimited without tons of additional work. ( https://github.com/TheGameCreators/GameGuruRepo/issues/5865 ) --- GameGuru Core/GameGuru/Imgui/imgui_gg_dx11.h | 115 +++- GameGuru Core/GameGuru/Source/M-Entity.cpp | 10 + GameGuru Core/GameGuru/Source/M-GridEdit.cpp | 1 + GameGuru Core/GameGuru/Source/M-GridEditB.cpp | 581 ++++++++++++++---- .../GameGuru/Source/M-TerrainNew.cpp | 4 +- 5 files changed, 600 insertions(+), 111 deletions(-) diff --git a/GameGuru Core/GameGuru/Imgui/imgui_gg_dx11.h b/GameGuru Core/GameGuru/Imgui/imgui_gg_dx11.h index 0473b48f..c79bdf7b 100644 --- a/GameGuru Core/GameGuru/Imgui/imgui_gg_dx11.h +++ b/GameGuru Core/GameGuru/Imgui/imgui_gg_dx11.h @@ -392,7 +392,7 @@ IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects(); #define FILTER_THUMBS UIV3IMAGES + 5900 #define TERRAINGENERATOR_OBJECT 17998 -#define TERRAINGENERATOR_IMAGE 63340 +//#define TERRAINGENERATOR_IMAGE 63340 //PE: Not used and goes into storyboard uniqueids. //PE: STORYBOARD_THUMBS must be the last in the list here. if you need room here, increase STORYBOARD_THUMBS so its last. #define STORYBOARD_THUMBS UIV3IMAGES + 6000 @@ -690,14 +690,16 @@ enum eKeyboardShortcutType void UniversalKeyboardShortcut(eKeyboardShortcutType KST); #ifdef STORYBOARD -#define STORYBOARD_MAXOUTPUTS 20 -#define STORYBOARD_MAXNODES 50 +#define STORYBOARD_MAXOUTPUTS 30 +#define STORYBOARD_MAXWIDGETS 100 +//PE: 150 = stack overflow. +#define STORYBOARD_MAXNODES 150 + #define SMALL_STORYBOARD_MAXNODES 15 -#define STORYBOARDVERSION 202 +#define STORYBOARDVERSION 203 #define NODE_WIDTH_PADDING -15.0 #define NODE_HEIGHT_PADDING 23.0 -#define STORYBOARD_MAXWIDGETS 50 void storyboard_menubar(float area_width, float node_width, float node_height); @@ -880,6 +882,7 @@ struct StoryboardNodesStruct int iFillerMaxOutputs20[20][STORYBOARD_MAXOUTPUTS]; char FillerCharMaxOutput20[20][STORYBOARD_MAXOUTPUTS][256]; }; + struct StoryboardStruct { char sig[12] = "Storyboard\0"; @@ -910,6 +913,108 @@ struct StoryboardStruct //PE: To add new variables add them here, always add to botton of list. }; + +#define STORYBOARD_MAXNODES202 50 +#define STORYBOARD_MAXOUTPUTS202 20 +#define STORYBOARD_MAXWIDGETS202 50 + +struct StoryboardNodesStruct202 +{ + int type; + int id; + ImVec2 restore_position; + int iEditEnable; + int used; + int thumb_id; + char title[256]; + char levelnumber[256]; + char thumb[256]; + char level_name[256]; //PE: For custom lua scripts. + char lua_name[256]; //PE: For custom lua scripts. + char scene_name[256]; //PE: Scene temp files can have anykind of info, so just make each scene it own file. + int input_id[STORYBOARD_MAXOUTPUTS202]; + int output_id[STORYBOARD_MAXOUTPUTS202]; + char output_action[STORYBOARD_MAXOUTPUTS202][256]; + char output_title[STORYBOARD_MAXOUTPUTS202][256]; + int output_linkto[STORYBOARD_MAXOUTPUTS202]; + int output_can_link_to_type[STORYBOARD_MAXOUTPUTS202]; + char input_title[STORYBOARD_MAXOUTPUTS202][256]; + char input_action[STORYBOARD_MAXOUTPUTS202][256]; + + //Screen + char screen_title[256]; + char screen_music[256]; + char screen_backdrop[256]; + int screen_backdrop_id; + ImVec4 screen_back_color; + int screen_backdrop_placement; // center,stretch,zoom. + char screen_thumb[256]; + int screen_backdrop_ratio_placement[10]; // 0=1920x1080 center,stretch,zoom. 1=1366x768 center,stretch,zoom ... + int screen_grid_size = 0; + + //Editor. + int widget_used[STORYBOARD_MAXWIDGETS202]; + char widget_label[STORYBOARD_MAXWIDGETS202][256]; + ImVec2 widget_size[STORYBOARD_MAXWIDGETS202]; + ImVec2 widget_pos[STORYBOARD_MAXWIDGETS202]; + char widget_normal_thumb[STORYBOARD_MAXWIDGETS202][256]; + int widget_normal_thumb_id[STORYBOARD_MAXWIDGETS202]; + char widget_highlight_thumb[STORYBOARD_MAXWIDGETS202][256]; + int widget_highlight_thumb_id[STORYBOARD_MAXWIDGETS202]; + char widget_selected_thumb[STORYBOARD_MAXWIDGETS202][256]; //only for state change button, checkbox ... + int widget_selected_thumb_id[STORYBOARD_MAXWIDGETS202]; + char widget_click_sound[STORYBOARD_MAXWIDGETS202][256]; + int widget_action[STORYBOARD_MAXWIDGETS202]; + char widget_font[STORYBOARD_MAXWIDGETS202][256]; + ImVec4 widget_font_color[STORYBOARD_MAXWIDGETS202]; + float widget_font_size[STORYBOARD_MAXWIDGETS202]; + int widget_type[STORYBOARD_MAXWIDGETS202]; // but,text,image,video... + int widget_read_only[STORYBOARD_MAXWIDGETS202]; + int widget_layer[STORYBOARD_MAXWIDGETS202]; + //int widget_output_pin[STORYBOARD_MAXWIDGETS202]; //off,level,screen. 2023 - does not seem to be used + int widget_initial_value[STORYBOARD_MAXWIDGETS202]; //off,level,screen. + char widget_name[STORYBOARD_MAXWIDGETS202][256]; //for generating final images in titlebank/default/... + //PE: Lets do some fillers, so when starting to save project we can just expend it later. + //PE: You just add a new one, a line before the filler and cound the filler down. + int screen_backdrop_transparent; + int readouts_available = 0; + int widgets_available = ALLOW_TEXT | ALLOW_IMAGE | ALLOW_VIDEO; + int toggleKey = 0; + int showAtStart = 0; + int iFiller20[15]; + float fFiller20[20]; + int iFillerMaxOutputs20[20][STORYBOARD_MAXOUTPUTS202]; + char FillerCharMaxOutput20[20][STORYBOARD_MAXOUTPUTS202][256]; +}; + +struct StoryboardStruct202 +{ + char sig[12] = "Storyboard\0"; + char gamename[256]; + int iStoryboardVersion = STORYBOARDVERSION; //PE: Just in case in the future if we need to convert this structure into a new struct. + int iChanged; + ImVec2 vEditorPanning = ImVec2(0.0f, 0.0f); + StoryboardNodesStruct202 Nodes[STORYBOARD_MAXNODES202]; + int NodeRadioButtonSelected[STORYBOARD_MAXNODES202]; + float NodeSliderValues[STORYBOARD_MAXNODES202][STORYBOARD_MAXWIDGETS202]; + char game_icon[256]; + char game_thumb[256]; + char game_description[4096]; + char game_world_edge_text[1024]; //PE: ? should be a node ? so display screen directly ? + int project_readonly; + int game_thumb_id; + int game_icon_id; + char game_developer_desc[1024]; + // Have to add here instead of inside StoryboardNodesStruct, otherwise loaded storyboards would become corrupted + ImVec4 widget_colors[STORYBOARD_MAXNODES202][STORYBOARD_MAXWIDGETS202]; + char widget_readout[STORYBOARD_MAXNODES202][STORYBOARD_MAXWIDGETS202][128]; + ImVec2 widget_textoffset[STORYBOARD_MAXNODES202][STORYBOARD_MAXWIDGETS202]; + int widget_ingamehidden[STORYBOARD_MAXNODES202][STORYBOARD_MAXWIDGETS202]; + int widget_drawordergroup[STORYBOARD_MAXNODES202][STORYBOARD_MAXWIDGETS202]; + + char customprojectfolder[256]; +}; + //PE: SmallStoryboardStruct Not to be used, only for fast locating of thumbs. struct SmallStoryboardStruct { diff --git a/GameGuru Core/GameGuru/Source/M-Entity.cpp b/GameGuru Core/GameGuru/Source/M-Entity.cpp index d01ae134..bc86db25 100644 --- a/GameGuru Core/GameGuru/Source/M-Entity.cpp +++ b/GameGuru Core/GameGuru/Source/M-Entity.cpp @@ -1162,6 +1162,14 @@ bool entity_load (bool bCalledFromLibrary) t.entityprofile[t.entid].fDecalSpeed = 1.0; // ? later bNewDecal = true; } + if (sEffectLower == "effectbank\\reloaded\\decal_animate20.fx") + { + t.entityprofile[t.entid].bIsDecal = true; + t.entityprofile[t.entid].iDecalRows = 20; + t.entityprofile[t.entid].iDecalColumns = 20; + t.entityprofile[t.entid].fDecalSpeed = 1.0; // ? later + bNewDecal = true; + } if (sEffectLower == "effectbank\\reloaded\\decal_animate10.fx" || sEffectLower == "effectbank\\reloaded\\decal_animate10x10.fx") { t.entityprofile[t.entid].bIsDecal = true; @@ -9249,6 +9257,8 @@ void entity_redo ( void ) entity_undo ( ); } #endif + +//#pragma optimize("", off) std::vector delete_decal_particles; void delete_notused_decal_particles( void ) { diff --git a/GameGuru Core/GameGuru/Source/M-GridEdit.cpp b/GameGuru Core/GameGuru/Source/M-GridEdit.cpp index b90948f2..165e8682 100644 --- a/GameGuru Core/GameGuru/Source/M-GridEdit.cpp +++ b/GameGuru Core/GameGuru/Source/M-GridEdit.cpp @@ -35,6 +35,7 @@ std::vector projectbank_imageid; StoryboardStruct Storyboard; StoryboardStruct StoryboardBackup; StoryboardStruct checkproject; +StoryboardStruct202 updateproject202; std::vector< std::pair> StoryboardFonts; bool bScreen_Editor_Window = false; int iScreen_Editor_Node = -1; diff --git a/GameGuru Core/GameGuru/Source/M-GridEditB.cpp b/GameGuru Core/GameGuru/Source/M-GridEditB.cpp index 3641a18e..edf6644c 100644 --- a/GameGuru Core/GameGuru/Source/M-GridEditB.cpp +++ b/GameGuru Core/GameGuru/Source/M-GridEditB.cpp @@ -75,7 +75,10 @@ extern std::vector projectbank_image; extern std::vector projectbank_imageid; extern StoryboardStruct Storyboard; extern StoryboardStruct checkproject; +extern StoryboardStruct202 updateproject202; StoryboardStruct tempProjectData; +//PE: StoryboardStruct is now so huge that you get a stackoverflow if added to a function, so moved here. +StoryboardStruct templateStoryboard; extern std::vector< std::pair> StoryboardFonts; extern bool bScreen_Editor_Window; extern int iScreen_Editor_Node; @@ -540,6 +543,7 @@ bool bSortProjects = true; bool bResetProjectThumbnails = true; int g_iCheckExistingFilesModifiedDelayed = 0; ImRect g_rStealMonitorArea; +bool bUpgradeAndBackupOldProject = false; std::vector lutImages_s; @@ -32390,11 +32394,16 @@ void GetFilesListForLibrary(char *path, bool bCreateThumbs, int win, int iThumbW vTmp.cProject = project; // quick check to see if the folder exists - char pProjFolderFile[MAX_PATH]; - strcpy(pProjFolderFile, "projectbank\\"); - strcat(pProjFolderFile, vTmp.cProject.Get()); - strcat(pProjFolderFile, "\\project.dat"); + char pProjFolderFile[MAX_PATH]; + sprintf(pProjFolderFile, "projectbank\\%s\\project%d.dat", vTmp.cProject.Get(), STORYBOARDVERSION); GG_GetRealPath(pProjFolderFile, false); + if (FileExist(pProjFolderFile) == 0) + { + strcpy(pProjFolderFile, "projectbank\\"); + strcat(pProjFolderFile, vTmp.cProject.Get()); + strcat(pProjFolderFile, "\\project.dat"); + GG_GetRealPath(pProjFolderFile, false); + } if(FileExist(pProjFolderFile)==1) vTmp.bProjectExists = true; else @@ -33321,16 +33330,26 @@ void GetProjectSortData (std::vector& output) if (folder != "." && folder != "..") { char project[MAX_PATH]; - strcpy(project, destination); - strcat(project, folder.Get()); - strcat(project, "\\project.dat"); - + sprintf(project, "%s%s\\project%d.dat", destination,folder.Get(), STORYBOARDVERSION); ProjectSortData data; data.folderName = std::string(folder.Get()); wchar_t filePath[MAX_PATH]; MultiByteToWideChar(CP_UTF8, 0, &project[0], -1, filePath, MAX_PATH); HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + strcpy(project, destination); + strcat(project, folder.Get()); + strcat(project, "\\project.dat"); + + ProjectSortData data; + data.folderName = std::string(folder.Get()); + wchar_t filePath[MAX_PATH]; + MultiByteToWideChar(CP_UTF8, 0, &project[0], -1, filePath, MAX_PATH); + hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + } + if (hFile == INVALID_HANDLE_VALUE) { strcpy(project, destination); @@ -33343,13 +33362,20 @@ void GetProjectSortData (std::vector& output) strcpy(pAbsTrueProjectPath, ReadString(1)); CloseFile(1); GG_GetRealPath(pAbsTrueProjectPath, 0); - strcpy(project, pAbsTrueProjectPath); - strcat(project, folder.Get()); - strcat(project, "\\Files\\projectbank\\"); - strcat(project, folder.Get()); - strcat(project, "\\project.dat"); + + sprintf(project, "%s%s\\Files\\projectbank\\%s\\project%d.dat", pAbsTrueProjectPath,folder.Get(), folder.Get(), STORYBOARDVERSION); MultiByteToWideChar(CP_UTF8, 0, &project[0], -1, filePath, MAX_PATH); hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + strcpy(project, pAbsTrueProjectPath); + strcat(project, folder.Get()); + strcat(project, "\\Files\\projectbank\\"); + strcat(project, folder.Get()); + strcat(project, "\\project.dat"); + MultiByteToWideChar(CP_UTF8, 0, &project[0], -1, filePath, MAX_PATH); + hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + } } } if (hFile != INVALID_HANDLE_VALUE) @@ -33465,12 +33491,29 @@ void GetProjectThumbnails() strcpy(project, "projectbank\\"); } strcat(project, projectbank_list[i].c_str()); - strcat(project, "\\project.dat"); + + char project2[MAX_PATH]; + strcpy(project2, project); + + sprintf(project, "%s\\project%d.dat", project2, STORYBOARDVERSION); projectfile = GG_fopen(project, "rb"); + if (!projectfile) + { + strcpy(project, project2); + strcat(project, "\\project.dat"); + projectfile = GG_fopen(project, "rb"); + } + if (projectfile) { + fclose(projectfile); + + //PE: Use this so we can upgrade from 202 to 203+ + bool load__storyboard_into_struct(const char*, StoryboardStruct&); + load__storyboard_into_struct(project, checkproject); + //PE: Need full load now, as we can have Game Settings. - size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); + //size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); char sig[12] = "Storyboard\0"; if (checkproject.sig[0] == 'S' && checkproject.sig[8] == 'r') @@ -33540,7 +33583,6 @@ void GetProjectThumbnails() { projectbank_image.push_back(""); //Just use CLICK HERE. } - fclose(projectfile); } else { @@ -36030,17 +36072,29 @@ void Welcome_Screen(void) strcpy(projectname, sCurrentGame.Get()); projectname[strlen(projectname) - 4] = 0; char project[MAX_PATH]; - strcpy(project, "projectbank\\"); - strcat(project, projectname); - strcat(project, "\\project.dat"); - + + sprintf(project, "projectbank\\%s\\project%d.dat", projectname, STORYBOARDVERSION); FILE* projectfile = GG_fopen(project, "rb"); + if (!projectfile) + { + strcpy(project, "projectbank\\"); + strcat(project, projectname); + strcat(project, "\\project.dat"); + projectfile = GG_fopen(project, "rb"); + } if (projectfile) { - tempProjectData.game_developer_desc[0] = 0; - size_t size = fread(&tempProjectData, 1, sizeof(tempProjectData), projectfile); - //Valid pref: fclose(projectfile); + + //PE: Use this so we can upgrade from 202 to 203+ + bool load__storyboard_into_struct(const char*, StoryboardStruct&); + load__storyboard_into_struct(project, tempProjectData); + + + //tempProjectData.game_developer_desc[0] = 0; + //size_t size = fread(&tempProjectData, 1, sizeof(tempProjectData), projectfile); + //Valid pref: + if(strlen(tempProjectData.game_developer_desc) > 0) sDevDescription = tempProjectData.game_developer_desc; @@ -37505,22 +37559,26 @@ void reset_single_node(int node) void storeboard_fix_uniqueids( void ) { int iUniqueId = STORYBOARD_THUMBS; + int iUniqueIdsAdd = 1000; for (int i = 0; i < STORYBOARD_MAXNODES; i++) { + if (i == 100 || i == 200) + iUniqueIdsAdd += 100000; + int node = i; for (int l = 0; l < STORYBOARD_MAXOUTPUTS; l++) { //PE: input_id,output_id ID's broken in checkproject. - if (Storyboard.Nodes[node].input_id[l] != iUniqueId + 1000 + (1000 * l) || - Storyboard.Nodes[node].output_id[l] != iUniqueId + 1000 + (1000 * l) + 500) + if (Storyboard.Nodes[node].input_id[l] != iUniqueId + iUniqueIdsAdd + (1000 * l) || + Storyboard.Nodes[node].output_id[l] != iUniqueId + iUniqueIdsAdd + (1000 * l) + 500) { //PE: Something wrong reset. bool bInputChanged = false; - if (Storyboard.Nodes[node].input_id[l] != iUniqueId + 1000 + (1000 * l)) bInputChanged = true; + if (Storyboard.Nodes[node].input_id[l] != iUniqueId + iUniqueIdsAdd + (1000 * l)) bInputChanged = true; int oldinput = Storyboard.Nodes[node].input_id[l]; - Storyboard.Nodes[node].input_id[l] = iUniqueId + 1000 + (1000 * l); - Storyboard.Nodes[node].output_id[l] = iUniqueId + 1000 + (1000 * l) + 500; + Storyboard.Nodes[node].input_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l); + Storyboard.Nodes[node].output_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 500; if (bInputChanged) { @@ -37575,8 +37633,21 @@ void storeboard_init_nodes(float area_width, float node_width, float node_height strcpy(Storyboard.game_developer_desc, ""); Storyboard.project_readonly = 0; + //PE: STORYBOARD_MAXNODES = 150. Largest unique id = 199749 , lowest = 49000. + //PE: checkunique = { size=28500 } + //PE: STORYBOARD_MAXNODES = 150. STORYBOARD_MAXOUTPUTS = 30. STORYBOARD_MAXWIDGETS = 100. Largest unique id = 249949 , lowest = 49000. + //PE: checkunique = { size=54000 } + //#define TESTUNIQUEIDS + + #ifdef TESTUNIQUEIDS + std::vector checkunique; + #endif + + int iUniqueIdsAdd = 1000; for (int i = 0; i < STORYBOARD_MAXNODES; i++) { + if (i == 100 || i == 200) + iUniqueIdsAdd += 100000; reset_single_node(i); StoryboardiActiveLinksId[i] = 0; @@ -37588,15 +37659,35 @@ void storeboard_init_nodes(float area_width, float node_width, float node_height for (int l = 0; l < STORYBOARD_MAXOUTPUTS; l++) { - Storyboard.Nodes[i].input_id[l] = iUniqueIds + 1000 + (1000 * l); - Storyboard.Nodes[i].output_id[l] = iUniqueIds + 1000 + (1000 * l) + 500; + Storyboard.Nodes[i].input_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l); + Storyboard.Nodes[i].output_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 500; + #ifdef TESTUNIQUEIDS + if (std::find(checkunique.begin(), checkunique.end(), Storyboard.Nodes[i].input_id[l]) != checkunique.end()) + printf("tmp"); + checkunique.push_back(Storyboard.Nodes[i].input_id[l]); + if (std::find(checkunique.begin(), checkunique.end(), Storyboard.Nodes[i].output_id[l]) != checkunique.end()) + printf("tmp"); + checkunique.push_back(Storyboard.Nodes[i].output_id[l]); + #endif } for (int l = 0; l < STORYBOARD_MAXWIDGETS; l++) { - Storyboard.Nodes[i].widget_normal_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 600; - Storyboard.Nodes[i].widget_highlight_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 700; - Storyboard.Nodes[i].widget_selected_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 800; + Storyboard.Nodes[i].widget_normal_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 600; + Storyboard.Nodes[i].widget_highlight_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 700; + Storyboard.Nodes[i].widget_selected_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 800; + + #ifdef TESTUNIQUEIDS + if (std::find(checkunique.begin(), checkunique.end(), Storyboard.Nodes[i].widget_normal_thumb_id[l]) != checkunique.end()) + printf("tmp"); + checkunique.push_back(Storyboard.Nodes[i].widget_normal_thumb_id[l]); + if (std::find(checkunique.begin(), checkunique.end(), Storyboard.Nodes[i].widget_highlight_thumb_id[l]) != checkunique.end()) + printf("tmp"); + checkunique.push_back(Storyboard.Nodes[i].widget_highlight_thumb_id[l]); + if (std::find(checkunique.begin(), checkunique.end(), Storyboard.Nodes[i].widget_selected_thumb_id[l]) != checkunique.end()) + printf("tmp"); + checkunique.push_back(Storyboard.Nodes[i].widget_selected_thumb_id[l]); + #endif } Storyboard.Nodes[i].screen_backdrop_id = iUniqueIds + 500; @@ -39074,9 +39165,8 @@ int storyboard_add_missing_nodex(int node,float area_width, float node_width, fl // Storyboard does not yet have a HUD screen, so add one (copy from default template HUD in below filepath) // In future, any screen default states should be saved into this file - StoryboardStruct templateStoryboard; const char* filepath = "editors\\templates\\ScreenEditor\\project.dat"; - extern bool load__storyboard_into_struct(const char*, StoryboardStruct&); + bool load__storyboard_into_struct(const char*, StoryboardStruct&); if (load__storyboard_into_struct(filepath, templateStoryboard)) { StoryboardNodesStruct& thisNode = Storyboard.Nodes[node]; @@ -41386,7 +41476,7 @@ void process_storeboard(bool bInitOnly) ImVec2 vNodeAreaStart = ImGui::GetCursorScreenPos(); - int iUniqueIds = STORYBOARD_THUMBS; + //int iUniqueIds = STORYBOARD_THUMBS; //PE: Make sure if we focus another window and go back , mouse dragging is reset. extern bool g_bAppActiveStat; @@ -42453,8 +42543,13 @@ void process_storeboard(bool bInitOnly) sprintf_s(cScreenCount, "%d", iScreenCount); // Find first free storyboard node that we can use for the new screen. int node = -1; + + int iUniqueIdsAdd = 1000; for (int i = 0; i < STORYBOARD_MAXNODES; i++) { + if (i == 100 || i == 200) + iUniqueIdsAdd += 100000; + if (Storyboard.Nodes[i].used == 0) { // Reset node to default state, in case any old data remains. @@ -42468,14 +42563,14 @@ void process_storeboard(bool bInitOnly) for (int l = 0; l < STORYBOARD_MAXWIDGETS; l++) { //PE: input_id,output_id ID's broken in checkproject. - Storyboard.Nodes[node].widget_normal_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 600; - Storyboard.Nodes[node].widget_highlight_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 700; - Storyboard.Nodes[node].widget_selected_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 800; + Storyboard.Nodes[node].widget_normal_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 600; + Storyboard.Nodes[node].widget_highlight_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 700; + Storyboard.Nodes[node].widget_selected_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 800; } for (int l = 0; l < STORYBOARD_MAXOUTPUTS; l++) { - Storyboard.Nodes[node].input_id[l] = iUniqueId + 1000 + (1000 * l); - Storyboard.Nodes[node].output_id[l] = iUniqueId + 1000 + (1000 * l) + 500; + Storyboard.Nodes[node].input_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l); + Storyboard.Nodes[node].output_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 500; } Storyboard.Nodes[node].screen_backdrop_id = iUniqueId + 500; @@ -42552,8 +42647,12 @@ void process_storeboard(bool bInitOnly) sprintf_s(cLoadingScreenCount, "%d", iLoadingScreenCount); // Find first free storyboard node that we can use for the new screen. int node = -1; + + int iUniqueIdsAdd = 1000; for (int i = 0; i < STORYBOARD_MAXNODES; i++) { + if (i == 100 || i == 200) + iUniqueIdsAdd += 100000; if (Storyboard.Nodes[i].used == 0) { // Reset node to default state, in case any old data remains. @@ -42567,14 +42666,14 @@ void process_storeboard(bool bInitOnly) for (int l = 0; l < STORYBOARD_MAXWIDGETS; l++) { //PE: input_id,output_id ID's broken in checkproject. - Storyboard.Nodes[node].widget_normal_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 600; - Storyboard.Nodes[node].widget_highlight_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 700; - Storyboard.Nodes[node].widget_selected_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 800; + Storyboard.Nodes[node].widget_normal_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 600; + Storyboard.Nodes[node].widget_highlight_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 700; + Storyboard.Nodes[node].widget_selected_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 800; } for (int l = 0; l < STORYBOARD_MAXOUTPUTS; l++) { - Storyboard.Nodes[node].input_id[l] = iUniqueId + 1000 + (1000 * l); - Storyboard.Nodes[node].output_id[l] = iUniqueId + 1000 + (1000 * l) + 500; + Storyboard.Nodes[node].input_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l); + Storyboard.Nodes[node].output_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 500; } Storyboard.Nodes[node].screen_backdrop_id = iUniqueId + 500; @@ -42698,8 +42797,12 @@ void process_storeboard(bool bInitOnly) sprintf_s(cHudCount, "%d", hudScreenCount); // Find first free storyboard node that we can use for the new screen. int node = -1; + int iUniqueIdsAdd = 1000; for (int i = 0; i < STORYBOARD_MAXNODES; i++) { + if (i == 100 || i == 200) + iUniqueIdsAdd += 100000; + if (Storyboard.Nodes[i].used == 0) { // Reset node to default state, in case any old data remains. @@ -42713,14 +42816,14 @@ void process_storeboard(bool bInitOnly) for (int l = 0; l < STORYBOARD_MAXWIDGETS; l++) { //PE: input_id,output_id ID's broken in checkproject. - Storyboard.Nodes[node].widget_normal_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 600; - Storyboard.Nodes[node].widget_highlight_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 700; - Storyboard.Nodes[node].widget_selected_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 800; + Storyboard.Nodes[node].widget_normal_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 600; + Storyboard.Nodes[node].widget_highlight_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 700; + Storyboard.Nodes[node].widget_selected_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 800; } for (int l = 0; l < STORYBOARD_MAXOUTPUTS; l++) { - Storyboard.Nodes[node].input_id[l] = iUniqueId + 1000 + (1000 * l); - Storyboard.Nodes[node].output_id[l] = iUniqueId + 1000 + (1000 * l) + 500; + Storyboard.Nodes[node].input_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l); + Storyboard.Nodes[node].output_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 500; } Storyboard.Nodes[node].screen_backdrop_id = iUniqueId + 500; @@ -43547,13 +43650,27 @@ void process_storeboard(bool bInitOnly) { // load in template screens from "RPG Template" project char project[MAX_PATH]; - strcpy(project, "projectbank\\RPG Template\\project.dat"); + + sprintf(project, "projectbank\\RPG Template\\project%d.dat", STORYBOARDVERSION); FILE* projectfile = GG_fopen(project, "rb"); + if (!projectfile) + { + strcpy(project, "projectbank\\RPG Template\\project.dat"); + projectfile = GG_fopen(project, "rb"); + } if (projectfile) { - StoryboardStruct* checkproject = new StoryboardStruct; - memset(checkproject, 0, sizeof(StoryboardStruct)); - size_t size = fread(checkproject, 1, sizeof(StoryboardStruct), projectfile); + StoryboardStruct* checkproject = nullptr; + memset(&tempProjectData, 0, sizeof(StoryboardStruct)); + fclose(projectfile); + + //PE: Use this so we can upgrade from 202 to 203+ + bool load__storyboard_into_struct(const char*, StoryboardStruct&); + load__storyboard_into_struct(project, tempProjectData); + checkproject = &tempProjectData; + + + //size_t size = fread(checkproject, 1, sizeof(StoryboardStruct), projectfile); char sig[12] = "Storyboard\0"; if (checkproject->sig[0] == 'S' && checkproject->sig[8] == 'r') { @@ -43632,19 +43749,25 @@ void process_storeboard(bool bInitOnly) //PE: unique ids are wrong in checkproject so assign new here. int iUniqueId = STORYBOARD_THUMBS + newnodeid; + int iUniqueIdsAdd = 1000; + if (newnodeid >= 200) + iUniqueIdsAdd = 200000; + else if (newnodeid >= 100) + iUniqueIdsAdd = 100000; + Storyboard.Nodes[newnodeid].id = iUniqueId; Storyboard.Nodes[newnodeid].thumb_id = iUniqueId; for (int l = 0; l < STORYBOARD_MAXWIDGETS; l++) { //PE: input_id,output_id ID's broken in checkproject. - Storyboard.Nodes[newnodeid].widget_normal_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 600; - Storyboard.Nodes[newnodeid].widget_highlight_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 700; - Storyboard.Nodes[newnodeid].widget_selected_thumb_id[l] = iUniqueId + 1000 + (1000 * l) + 800; + Storyboard.Nodes[newnodeid].widget_normal_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 600; + Storyboard.Nodes[newnodeid].widget_highlight_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 700; + Storyboard.Nodes[newnodeid].widget_selected_thumb_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 800; } for (int l = 0; l < STORYBOARD_MAXOUTPUTS; l++) { - Storyboard.Nodes[newnodeid].input_id[l] = iUniqueId + 1000 + (1000 * l); - Storyboard.Nodes[newnodeid].output_id[l] = iUniqueId + 1000 + (1000 * l) + 500; + Storyboard.Nodes[newnodeid].input_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l); + Storyboard.Nodes[newnodeid].output_id[l] = iUniqueId + iUniqueIdsAdd + (1000 * l) + 500; } Storyboard.Nodes[newnodeid].screen_backdrop_id = iUniqueId + 500; @@ -43666,13 +43789,12 @@ void process_storeboard(bool bInitOnly) } } } - fclose(projectfile); - } - if (checkproject) - { - delete checkproject; - checkproject = NULL; } + //if (checkproject) + //{ + // delete checkproject; + // checkproject = NULL; + //} } } } @@ -45933,9 +46055,16 @@ void save_storyboard(char *name,bool bSaveAs) cLastProjectList = ""; //PE: Update project files. char project[MAX_PATH]; - strcpy(project, "projectbank\\"); - strcat(project, savename.Get()); - strcat(project, "\\project.dat"); + if (STORYBOARDVERSION > 202) + { + sprintf(project, "projectbank\\%s\\project%d.dat", savename.Get(), STORYBOARDVERSION); + } + else + { + strcpy(project, "projectbank\\"); + strcat(project, savename.Get()); + strcat(project, "\\project.dat"); + } FILE* projectfile = GG_fopen(project, "wb+"); if (projectfile) { @@ -46009,10 +46138,16 @@ void load_storyboard(char *name) bool bProjectLoaded = false; char project[MAX_PATH]; - strcpy(project, "projectbank\\"); - strcat(project, name); - strcat(project, "\\project.dat"); + + sprintf(project, "projectbank\\%s\\project%d.dat", name, STORYBOARDVERSION); FILE* projectfile = GG_fopen(project, "rb"); + if (projectfile == NULL) + { + strcpy(project, "projectbank\\"); + strcat(project, name); + strcat(project, "\\project.dat"); + projectfile = GG_fopen(project, "rb"); + } if (projectfile==NULL) { // switch to remote project @@ -46030,12 +46165,17 @@ void load_storyboard(char *name) strcpy(Storyboard.customprojectfolder, pRemoteProject); switch_to_remote_project(name); - // proceed as normal, loading now from the remote folder - strcpy(project, "projectbank\\"); - strcat(project, name); - strcat(project, "\\project.dat"); + sprintf(project, "projectbank\\%s\\project%d.dat", name, STORYBOARDVERSION); projectfile = GG_fopen(project, "rb"); + if (projectfile == NULL) + { + // proceed as normal, loading now from the remote folder + strcpy(project, "projectbank\\"); + strcat(project, name); + strcat(project, "\\project.dat"); + projectfile = GG_fopen(project, "rb"); + } // remote project has own media, so update the library to include them! extern int g_iRefreshLibraryFoldersAfterDelay; g_iRefreshLibraryFoldersAfterDelay = 10; @@ -46043,10 +46183,21 @@ void load_storyboard(char *name) } if (projectfile) { + fclose(projectfile); + + //PE: Use this so we can upgrade from 202 to 203+ + //PE: Must make a backup and save out project203.dat directly. when converting from here. + bUpgradeAndBackupOldProject = true; + + bool load__storyboard_into_struct(const char*, StoryboardStruct&); + load__storyboard_into_struct(project, checkproject); + + bUpgradeAndBackupOldProject = false; + //this sets ALL fields data to zero, and only filled with known structure (members added at end not part of the copy to remain zeros) - memset(&checkproject, 0, sizeof(StoryboardStruct)); + //memset(&checkproject, 0, sizeof(StoryboardStruct)); + //size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); - size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); char sig[12] = "Storyboard\0"; if (checkproject.sig[0] == 'S' && checkproject.sig[8] == 'r') { @@ -46068,7 +46219,6 @@ void load_storyboard(char *name) bStoryboardFirstRunSetInitPos = false; //Load new thumbs, and reposition new nodes. Storyboard.iChanged = false; strcpy(pref.cLastUsedStoryboardProject, name); - fclose(projectfile); //PE: Check if this is a readonly project. char fullPath[MAX_PATH]; @@ -46113,15 +46263,19 @@ void load_storyboard(char *name) // Reset all node and image IDs to default - they don't need their state retained by saving, and under some circumstances when loading them, they can be duplicated, causing problems with selecting nodes and images. int iUniqueIds = STORYBOARD_THUMBS; + int iUniqueIdsAdd = 1000; for (int i = 0; i < STORYBOARD_MAXNODES; i++) { + if (i == 100 || i == 200) + iUniqueIdsAdd += 100000; + Storyboard.Nodes[i].id = iUniqueIds; Storyboard.Nodes[i].thumb_id = iUniqueIds; for (int l = 0; l < STORYBOARD_MAXWIDGETS; l++) { - Storyboard.Nodes[i].widget_normal_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 600; - Storyboard.Nodes[i].widget_highlight_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 700; - Storyboard.Nodes[i].widget_selected_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 800; + Storyboard.Nodes[i].widget_normal_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 600; + Storyboard.Nodes[i].widget_highlight_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 700; + Storyboard.Nodes[i].widget_selected_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 800; } Storyboard.Nodes[i].screen_backdrop_id = iUniqueIds + 500; @@ -46171,12 +46325,17 @@ bool load_checkproject_storyboard(char *name) if (strlen(name) <= 0) return false; char project[MAX_PATH]; - strcpy(project, "projectbank\\"); - strcat(project, name); - strcat(project, "\\project.dat"); + sprintf(project, "projectbank\\%s\\project%d.dat", name, STORYBOARDVERSION); + FILE* projectfile = GG_fopen(project, "rb"); + if (!projectfile) + { + strcpy(project, "projectbank\\"); + strcat(project, name); + strcat(project, "\\project.dat"); + projectfile = GG_fopen(project, "rb"); + } bool bReadProjectDetails = false; - FILE* projectfile = GG_fopen(project, "rb"); if (projectfile) { bReadProjectDetails = true; @@ -46197,7 +46356,18 @@ bool load_checkproject_storyboard(char *name) strcat(project, "\\project.dat"); CloseFile(1); } - projectfile = GG_fopen(project, "rb"); + + char newversion[MAX_PATH]; + sprintf(newversion, "project%d.dat", STORYBOARDVERSION); + + std::string newname = project; + replaceAll(newname, "project.dat", newversion); + projectfile = GG_fopen(newname.c_str(), "rb"); + if (!projectfile) + projectfile = GG_fopen(project, "rb"); + else + strcpy(project, newname.c_str()); + if (projectfile) { bReadProjectDetails = true; @@ -46205,10 +46375,17 @@ bool load_checkproject_storyboard(char *name) } if (bReadProjectDetails==true) { - memset(&checkproject, 0, sizeof(StoryboardStruct)); - size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); - //Valid pref: fclose(projectfile); + + //PE: Use this so we can upgrade from 202 to 203+ + bool load__storyboard_into_struct(const char*, StoryboardStruct&); + load__storyboard_into_struct(project, checkproject); + + //memset(&checkproject, 0, sizeof(StoryboardStruct)); + //size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); + //Valid pref: + //fclose(projectfile); + char sig[12] = "Storyboard\0"; if (checkproject.sig[0] == 'S' && checkproject.sig[8] == 'r') { @@ -46223,8 +46400,16 @@ bool load__storyboard_into_struct(const char *filepath, StoryboardStruct& storyb { if (!filepath) return false; if (strlen(filepath) <= 0) return false; - - FILE* projectfile = GG_fopen(filepath, "rb"); + + char project[MAX_PATH]; + sprintf(project, "project%d.dat", STORYBOARDVERSION); + std::string newname = filepath; + replaceAll(newname, "project.dat", project); + FILE* projectfile = GG_fopen(newname.c_str(), "rb"); + if (!projectfile) + { + projectfile = GG_fopen(filepath, "rb"); + } if (projectfile) { memset(&storyboard, 0, sizeof(StoryboardStruct)); @@ -46232,8 +46417,169 @@ bool load__storyboard_into_struct(const char *filepath, StoryboardStruct& storyb //Valid pref: fclose(projectfile); char sig[12] = "Storyboard\0"; - if (checkproject.sig[0] == 'S' && checkproject.sig[8] == 'r') + if (storyboard.sig[0] == 'S' && storyboard.sig[8] == 'r') { + //PE: Need convert 202 -> 202+ + if (storyboard.iStoryboardVersion != STORYBOARDVERSION) + { + if (storyboard.iStoryboardVersion <= 202) + { + memset(&updateproject202, 0, sizeof(StoryboardStruct202)); + + FILE* projectfile = GG_fopen(filepath, "rb"); + if (projectfile) + { + memset(&storyboard, 0, sizeof(StoryboardStruct)); + size_t size = fread(&updateproject202, 1, sizeof(updateproject202), projectfile); + fclose(projectfile); + + //PE: Copy data. + strcpy(storyboard.sig, updateproject202.sig); + strcpy(storyboard.gamename, updateproject202.gamename); + storyboard.iStoryboardVersion = STORYBOARDVERSION; //PE: New version. + storyboard.iChanged = updateproject202.iChanged; + storyboard.vEditorPanning = updateproject202.vEditorPanning; + for (int i = 0; i < STORYBOARD_MAXNODES202; i++) + { + //PE: Copy old nodes. + + { + storyboard.Nodes[i].type = updateproject202.Nodes[i].type; + storyboard.Nodes[i].id = updateproject202.Nodes[i].id; + storyboard.Nodes[i].restore_position = updateproject202.Nodes[i].restore_position; + storyboard.Nodes[i].iEditEnable = updateproject202.Nodes[i].iEditEnable; + storyboard.Nodes[i].used = updateproject202.Nodes[i].used; + storyboard.Nodes[i].thumb_id = updateproject202.Nodes[i].thumb_id; + + strcpy(storyboard.Nodes[i].title, updateproject202.Nodes[i].title); + strcpy(storyboard.Nodes[i].levelnumber, updateproject202.Nodes[i].levelnumber); + strcpy(storyboard.Nodes[i].thumb, updateproject202.Nodes[i].thumb); + strcpy(storyboard.Nodes[i].level_name, updateproject202.Nodes[i].level_name); + strcpy(storyboard.Nodes[i].lua_name, updateproject202.Nodes[i].lua_name); + strcpy(storyboard.Nodes[i].scene_name, updateproject202.Nodes[i].scene_name); + + for (int b = 0; b < STORYBOARD_MAXOUTPUTS202; b++) + { + storyboard.Nodes[i].input_id[b] = updateproject202.Nodes[i].input_id[b]; + storyboard.Nodes[i].output_id[b] = updateproject202.Nodes[i].output_id[b]; + storyboard.Nodes[i].output_linkto[b] = updateproject202.Nodes[i].output_linkto[b]; + storyboard.Nodes[i].output_can_link_to_type[b] = updateproject202.Nodes[i].output_can_link_to_type[b]; + strcpy(storyboard.Nodes[i].output_action[b], updateproject202.Nodes[i].output_action[b]); + strcpy(storyboard.Nodes[i].output_title[b], updateproject202.Nodes[i].output_title[b]); + strcpy(storyboard.Nodes[i].input_title[b], updateproject202.Nodes[i].input_title[b]); + strcpy(storyboard.Nodes[i].input_action[b], updateproject202.Nodes[i].input_action[b]); + } + + strcpy(storyboard.Nodes[i].screen_title, updateproject202.Nodes[i].screen_title); + strcpy(storyboard.Nodes[i].screen_music, updateproject202.Nodes[i].screen_music); + strcpy(storyboard.Nodes[i].screen_backdrop, updateproject202.Nodes[i].screen_backdrop); + + storyboard.Nodes[i].screen_backdrop_id = updateproject202.Nodes[i].screen_backdrop_id; + + storyboard.Nodes[i].screen_back_color = updateproject202.Nodes[i].screen_back_color; + storyboard.Nodes[i].screen_backdrop_placement = updateproject202.Nodes[i].screen_backdrop_placement; + storyboard.Nodes[i].screen_grid_size = updateproject202.Nodes[i].screen_grid_size; + for(int c = 0; c < 10; c++) + storyboard.Nodes[i].screen_backdrop_ratio_placement[c] = updateproject202.Nodes[i].screen_backdrop_ratio_placement[c]; + + strcpy(storyboard.Nodes[i].screen_thumb, updateproject202.Nodes[i].screen_thumb); + + + for (int b = 0; b < STORYBOARD_MAXWIDGETS202; b++) + { + strcpy(storyboard.Nodes[i].widget_label[b], updateproject202.Nodes[i].widget_label[b]); + strcpy(storyboard.Nodes[i].widget_normal_thumb[b], updateproject202.Nodes[i].widget_normal_thumb[b]); + + strcpy(storyboard.Nodes[i].widget_highlight_thumb[b], updateproject202.Nodes[i].widget_highlight_thumb[b]); + strcpy(storyboard.Nodes[i].widget_selected_thumb[b], updateproject202.Nodes[i].widget_selected_thumb[b]); + strcpy(storyboard.Nodes[i].widget_font[b], updateproject202.Nodes[i].widget_font[b]); + strcpy(storyboard.Nodes[i].widget_name[b], updateproject202.Nodes[i].widget_name[b]); + strcpy(storyboard.Nodes[i].widget_click_sound[b], updateproject202.Nodes[i].widget_click_sound[b]); + + storyboard.Nodes[i].widget_used[b] = updateproject202.Nodes[i].widget_used[b]; + storyboard.Nodes[i].widget_size[b] = updateproject202.Nodes[i].widget_size[b]; + + storyboard.Nodes[i].widget_pos[b] = updateproject202.Nodes[i].widget_pos[b]; + storyboard.Nodes[i].widget_normal_thumb_id[b] = updateproject202.Nodes[i].widget_normal_thumb_id[b]; + storyboard.Nodes[i].widget_highlight_thumb_id[b] = updateproject202.Nodes[i].widget_highlight_thumb_id[b]; + storyboard.Nodes[i].widget_selected_thumb_id[b] = updateproject202.Nodes[i].widget_selected_thumb_id[b]; + storyboard.Nodes[i].widget_action[b] = updateproject202.Nodes[i].widget_action[b]; + storyboard.Nodes[i].widget_font_color[b] = updateproject202.Nodes[i].widget_font_color[b]; + + storyboard.Nodes[i].widget_font_size[b] = updateproject202.Nodes[i].widget_font_size[b]; + storyboard.Nodes[i].widget_type[b] = updateproject202.Nodes[i].widget_type[b]; + storyboard.Nodes[i].widget_read_only[b] = updateproject202.Nodes[i].widget_read_only[b]; + storyboard.Nodes[i].widget_layer[b] = updateproject202.Nodes[i].widget_layer[b]; + storyboard.Nodes[i].widget_initial_value[b] = updateproject202.Nodes[i].widget_initial_value[b]; + + } + + storyboard.Nodes[i].screen_backdrop_transparent = updateproject202.Nodes[i].screen_backdrop_transparent; + + storyboard.Nodes[i].readouts_available = updateproject202.Nodes[i].readouts_available; + storyboard.Nodes[i].widgets_available = updateproject202.Nodes[i].widgets_available; + storyboard.Nodes[i].toggleKey = updateproject202.Nodes[i].toggleKey; + storyboard.Nodes[i].showAtStart = updateproject202.Nodes[i].showAtStart; + } + + storyboard.NodeRadioButtonSelected[i] = updateproject202.NodeRadioButtonSelected[i]; + for (int b = 0; b < STORYBOARD_MAXWIDGETS202; b++) + { + storyboard.NodeSliderValues[i][b] = updateproject202.NodeSliderValues[i][b]; + storyboard.widget_colors[i][b] = updateproject202.widget_colors[i][b]; + strcpy(storyboard.widget_readout[i][b], updateproject202.widget_readout[i][b]); + storyboard.widget_textoffset[i][b] = updateproject202.widget_textoffset[i][b]; + storyboard.widget_ingamehidden[i][b] = updateproject202.widget_ingamehidden[i][b]; + storyboard.widget_drawordergroup[i][b] = updateproject202.widget_drawordergroup[i][b]; + } + } + strcpy(storyboard.game_icon, updateproject202.game_icon); + strcpy(storyboard.game_thumb, updateproject202.game_thumb); + strcpy(storyboard.game_description, updateproject202.game_description); + strcpy(storyboard.game_world_edge_text, updateproject202.game_world_edge_text); + strcpy(storyboard.game_developer_desc, updateproject202.game_developer_desc); + strcpy(storyboard.customprojectfolder, updateproject202.customprojectfolder); + storyboard.project_readonly = updateproject202.project_readonly; + storyboard.game_thumb_id = updateproject202.game_thumb_id; + storyboard.game_icon_id = updateproject202.game_icon_id; + + if (bUpgradeAndBackupOldProject) + { + char CopyFrom[MAX_PATH]; + strcpy(CopyFrom, filepath); + GG_GetRealPath(CopyFrom, 0); //Resolve name. need full path. + extern char szRootDir[MAX_PATH]; + int rootLen = strlen(szRootDir); + if (strnicmp(CopyFrom, szRootDir, rootLen) == 0) + { + //PE: Read only folder. + storyboard.project_readonly = 1; + } + + if (storyboard.project_readonly != 1) + { + //PE: Make backup and save project203.dat. + char CopyTo[MAX_PATH]; + strcpy(CopyTo, filepath); + strcat(CopyTo, ".bck"); + GG_GetRealPath(CopyTo, 1); //Resolve name. need full path. + bool bRet = CopyFileA(CopyFrom, CopyTo, FALSE); + + cstr savename = storyboard.gamename; + sprintf(project, "projectbank\\%s\\project%d.dat", savename.Get(), STORYBOARDVERSION); + FILE* projectfile = GG_fopen(project, "wb+"); + if (projectfile) + { + fwrite(&storyboard, 1, sizeof(Storyboard), projectfile); + fclose(projectfile); + } + } + } + + } + + } + } return true; } } @@ -46275,9 +46621,13 @@ void GetProjectList(char *path, bool bGetThumbs) bool bHaveAProject = false; char project[MAX_PATH]; - strcpy(project, destination); - strcat(project, folder.Get()); - strcat(project, "\\project.dat"); + sprintf(project, "projectbank\\%s\\project%d.dat", folder.Get(), STORYBOARDVERSION); + if (!GG_FileExists(project)) + { + strcpy(project, destination); + strcat(project, folder.Get()); + strcat(project, "\\project.dat"); + } if (GG_FileExists(project)) { bHaveAProject = true; @@ -46342,11 +46692,28 @@ void GetProjectList(char *path, bool bGetThumbs) } strcat(project, projectbank_list[i].c_str()); strcat(project, "\\project.dat"); - projectfile = GG_fopen(project, "rb"); + + std::string newname = project; + char newversion[MAX_PATH]; + sprintf(newversion, "project%d.dat", STORYBOARDVERSION); + replaceAll(newname, "project.dat", newversion); + projectfile = GG_fopen(newname.c_str(), "rb"); + + if (!projectfile) + projectfile = GG_fopen(project, "rb"); + else + strcpy(project, newname.c_str()); + if (projectfile) { + fclose(projectfile); + + //PE: Use this so we can upgrade from 202 to 203+ + bool load__storyboard_into_struct(const char*, StoryboardStruct&); + load__storyboard_into_struct(project, checkproject); + //PE: Need full load now, as we can have Game Settings. - size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); + //size_t size = fread(&checkproject, 1, sizeof(checkproject), projectfile); char sig[12] = "Storyboard\0"; if (checkproject.sig[0] == 'S' && checkproject.sig[8] == 'r') @@ -46416,7 +46783,6 @@ void GetProjectList(char *path, bool bGetThumbs) { projectbank_image.push_back(""); //Just use CLICK HERE. } - fclose(projectfile); } else { @@ -47483,20 +47849,26 @@ int screen_editor(int nodeid, bool standalone, char *screen) { // Some users report runtime error 501, when the above code is called, regenerate unique IDs for the images just in-case int iUniqueIds = STORYBOARD_THUMBS; + int iUniqueIdsAdd = 1000; + if (nodeid >= 200) + iUniqueIdsAdd = 200000; + else if (nodeid >= 100) + iUniqueIdsAdd = 100000; + Storyboard.Nodes[nodeid].id = iUniqueIds; Storyboard.Nodes[nodeid].thumb_id = iUniqueIds; for (int l = 0; l < STORYBOARD_MAXOUTPUTS; l++) { - Storyboard.Nodes[nodeid].input_id[l] = iUniqueIds + 1000 + (1000 * l); - Storyboard.Nodes[nodeid].output_id[l] = iUniqueIds + 1000 + (1000 * l) + 500; + Storyboard.Nodes[nodeid].input_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l); + Storyboard.Nodes[nodeid].output_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 500; } for (int l = 0; l < STORYBOARD_MAXWIDGETS; l++) { - Storyboard.Nodes[nodeid].widget_normal_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 600; - Storyboard.Nodes[nodeid].widget_highlight_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 700; - Storyboard.Nodes[nodeid].widget_selected_thumb_id[l] = iUniqueIds + 1000 + (1000 * l) + 800; + Storyboard.Nodes[nodeid].widget_normal_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 600; + Storyboard.Nodes[nodeid].widget_highlight_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 700; + Storyboard.Nodes[nodeid].widget_selected_thumb_id[l] = iUniqueIds + iUniqueIdsAdd + (1000 * l) + 800; } Storyboard.Nodes[nodeid].screen_backdrop_id = iUniqueIds + 500; @@ -52184,3 +52556,4 @@ void tmpdebugfunc(void) } } + diff --git a/GameGuru Core/GameGuru/Source/M-TerrainNew.cpp b/GameGuru Core/GameGuru/Source/M-TerrainNew.cpp index 0578961b..8862f221 100644 --- a/GameGuru Core/GameGuru/Source/M-TerrainNew.cpp +++ b/GameGuru Core/GameGuru/Source/M-TerrainNew.cpp @@ -10387,7 +10387,7 @@ void procedural_new_level(void) ggterrain_global_render_params2.flags2 &= ~GGTERRAIN_SHADER_FLAG2_SHOW_MINI_MAP; } - if (ImageExist(TERRAINGENERATOR_IMAGE)) DeleteImage(TERRAINGENERATOR_IMAGE); + //if (ImageExist(TERRAINGENERATOR_IMAGE)) DeleteImage(TERRAINGENERATOR_IMAGE); if (ObjectExist(TERRAINGENERATOR_OBJECT)) DeleteObject(TERRAINGENERATOR_OBJECT); if (!bPopModalOpenProceduralCameraMode) { @@ -13530,7 +13530,7 @@ void procedural_new_level(void) DeleteBitmapEx(99); } - if (ImageExist(TERRAINGENERATOR_IMAGE)) DeleteImage(TERRAINGENERATOR_IMAGE); + //if (ImageExist(TERRAINGENERATOR_IMAGE)) DeleteImage(TERRAINGENERATOR_IMAGE); if (ObjectExist(TERRAINGENERATOR_OBJECT)) DeleteObject(TERRAINGENERATOR_OBJECT); //Restore fog.