-
Content count
1,022 -
Joined
-
Last visited
-
Days Won
16
Content Type
Profiles
Forums
Calendar
Gallery
Downloads
Store
Everything posted by Eagle114th
-
SF2 - Advanced Moddings (DLL Files editing)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
I have spent the week learning how to use Ghidrea, contemplating on how to find the right information, in order, to make sense out of what is shown as disassembled / decompiled functions and variables. WIth AI help, I am able to come up with an idea: 1) Find the class name that is called by associated functions 2) Find the function with associate strings for possible keywords As first step of building the modder resource library. In the link below, you will see vast number of folder with three types of .txt files: _CLASS_FUNCTION_LIST.txt _STRING_LIST - 1.txt _STRING_LIST - 2.txt And inside each folders, for example: FLIGHT -> AVIONICS 60, you will see the files: AVIONICS60_CLASS_FUNCTION_LIST.txt AVIONICS60_STRING_LIST - 1.txt AVIONICS60_STRING_LIST - 2.txt These files give modders a big head start by helping pinpoint the location of relevant functions, and that's the step one. For next steps, it is up to anyone here. I am here to provide what I can product from the ghidra tools. I will continue to update the resource library as I grow the understanding of Ghidra tools and codes shown in it. SF2 -Resource Library v1.0.zip Hoowever, I am working an interesting next projects: I just recently realized, after seeing how Ghidra symbolized the native C++ into C Pseudocodes and is working on Name Demangling (Converting C++ mangled symbols back to readable C++ codes). Here is an example: ?MyFunc@@YAHH@Z -> int MyFunc(int)) For now, here is notes that AI generated with me while studying various codes: (NOTE: the note below is incomplete. Will be updated eventualy.) CODES NAME DEMANGLING NOTES.txt Cheers!- 1 reply
-
- 2
-
-
SF2 - Advanced Moddings (DLL Files editing)
Eagle114th posted a topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Welcome to the Strike Fighter 2 (SF2) Advanced Modding thread! A quick reminder: We mod ethically, honoring ThirdWire’s life passion in creating SF2. All projects here are strictly freeware, transparent, and require a legit copy of SF2 to use any modified DLL files. This thread also serve as the modder resource library that can assist us finding what we seek for advanced modding. Hello everyone! This thread is dedicated to advanced modding, focusing on DLL file editing using tools like Ghidra and other debugging/reverse engineering tools. We have the rules here: - All projects must remain freeware. Payware is a hard NO! - No links or discussion about pirated SF2, period! - We encourage everyone to share knowledge, collaborate, and keep the community spirit alive! We have the great desires to expand the engine beyond the current limitation, from custom HUDs to radar behaviors, etc... This post will be updated through time with more information. Let's have a happy modding!- 1 reply
-
- 1
-
-
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! I’ve been grinding for hours to make sense of these massive codebases, and I have an idea! I’m building a huge resource library with lists of class references and the functions handling strings. These will help us zero in on specific functions in Ghidra. Check out the examples: Avionics 60 Class List Avionics String List I’m working through each DLL, generating text files for all of them. It will take some time, but once done, I’ll start a new thread called "Advanced Modding" with the resource library. Eagle114th -
Hello everyonem, My wfie and I are contiuning with our excellent health recover. Ther is onething I have been wondering about and that is DLL files. The reason why I am asking about DLL files editing / modding; SF2 is not maintained nor update for many years. It is modders that have been keeping it alive. I am in the wonderful community that have passions as I do for Jane's combat simulation series and weare modding it. Even though I am on break from SF modding, in order, to allow my eye recover, I was wondering if it is possible to edit one of ancient simulation file, such as Jane's Fighter Anthology .exe files, because of awesome active modding community. We honor the ethics by keeping mods free and sharing our hobbies, as we do in here combatace. So I was wondering how can exe be understood? Out of curiousity, I took a look at HEX editing and then used x32dbg diseassebly and realized that the codes coudl be read in an assemlby langauge. However, I am not that experienced nor famliar with it yet. At the same time, by using AI to interpret the codes (Whiel being well aware that AI is currenlty still flawed and alwasy give geneic responses, still now is good time to experiment with it, due to the rapid advancement of AI technologies.) However, there is one thing that came up as an idea; What if we could edit the codes in DLL files that allow us to have unlocked moddability of avionics, enabling Gs limiters, and something like that. But again, I am concdenred about it becauser I do not know what combatace community feels about it. This is precisely why I haven't touched DLL files yet. I want to ensure it is done in ethical ways. If we contiune on the very limited methods of modding (Only iini. editing and adding 3D models), then we are stuck with the same limitatino of moddings. The community is currently small. We want for communty to be alive and become bigger again, therefore is why I want to ask about it. There is no another simulations out there that did excellent jobs as Thirdwsire did with Strike Fighter 2, as well as Jane's combat series did, what they managed to create; - Low Fidelity simulation that is semi-realistic This means we do not worry bout 'study sim', but we are required to learn about the limitations and characters of each aircraft, weaopns, avionics, etc.. IT is not arcade like ace combat nor too hardcore like "Study sim" DCS. It is just golden balance. Even though SF2 is missing air to ground radar veatures in avionics aspect. - Moddiblity, SF2 in heart, is desigend to be most moddable sim out there, it would be wasted potiental if DLL wasn't studied to allow expanded modding in ethical ways. EDIT #1: I talked with oen of modders, he / she gave me an excellent ideas. What I understand is that historically, TK do not mind the modding, however as long his files wasn't shared. So the idea is to create the installer that would modify the DLL files and allow us to add an external files that would enable DLL to read? EDIT #2: I realized we also could use Wrapper DLL, it intercepts calls to the original DLL and modifies them as needed before passing them on. I would like to know what combatace feels about this. Eagle114th
-
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
I recommend you starting small, like making LCOS (HUD) not going beyond ViewportTopLeft and ViewportBottomRight, or anything very simple. That way we can take notes and map the funcitons / variables and what they do. From there, we can build more information from there to do bigger things. Next week, along with you guys, I plan on exploring the Ghidra and another tools to play with the DLL files. Eagle114th -
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! In discord that I am part of where we chill, talk about sims, share our modding projects, etc... In SF2 section, someone asked me good questions and I think it is good to share here too. I am going to post someone's questions and the responses / comments to it: Question #1 Response: Excellent questions! When it comes to the copyright, the serious issues would be if someone tried to sell the modified DLLs or any files related to the game engines. That is big, hard NO, period. We are ethical freeware modders. Everything we create is shared for free, and we respect TK's life work and passions of SF2. That is why we make sure that, to enjoy any of our mods, especially the modified DLLs, is that users must already own a legit, working copy of SF2. Question #2: Response: Yes, looks like it. but in limited ways. Having an access to disassembled and decompiled codes is always limiting compared to having an access to the full source codes. What I understand is that, DLL files is part of the game engine, not whole of it. While digging through the DLLs, what I realized is that, SF2 manages different aspects of the game engine through various DLLs files and they are all inter connected. So it is possible that, it is not just Campaign dll files, it is possible that we also have to look into different DLLs that manages the campaign as well. We can explore and analyze the DLLs files by using the tools like Ghidra, which is what I use. It lets you view assembly and C-style pseudocodes, along with the Python scripting. By using the scripts, you can automate the searches through public and private functions for keywords like: "Campaign" "Mission" "Waypopints" etc ... If anyone knows an alternative and great tools, especially if it have AI assistance included, that would be great too! However, the challenge is that, to modify, remove, or add the C Pseudocode requires careful coding, to ensure the computability with the original languages that DLL are written in, which I believe is C++ languages. Addiitonal comments: I want to add one more things about modifying the DLLs files: What was said, it’s true that with the disassembled and decompiled codes, we can modify, remove, and add codes to SF2 in limited ways. HOWEVER< the real there is one thing I aalso realized: There’s huge potential, and many new possibilities that can be done. The reason it appears limiting right now is because of the slow, manual process of analyzing and understanding the codes. The functions and variables we see in decompiled DLLs have generic names, for example: FUN_1001abc0 With no helpful labels, It is what makes it hard for us to understand what they actually do. BUT, with the rapid rise of AI, that’s changing right now. This is how I found the codes with key words (private functions and variables) using Ghidra. AI can now analyze large blocks of code, detect patterns, especially suggest meaningful names for unknown functions and variables. This gives us a better sense of the intentions (Purposes) of the codes. This is why I am determined to find out what we can do right now with an existing tools and various AI. Finally, from various discussion about TK situations, I would like to comment about this part too: Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! Recently completed the works on Columbia's Mirage 5COA / 5COAM / 5CODM, as well IAI Nesher S and T. I am currently working on IAI Kfir series, especially Yakarov79's excellent Kfir over Israel mod pack. The Kfir C.7, appear to have more advanced HUD compared to earlier series. Here is pictures of, what I believe to be IAI Kfir C.7's HUD. The picture is not exactly clear, it can't be helped. Based on the images, here is crafted optical sight and unique looking range bar: In-game screenshot of IAI Kfir C.7 cockpit and HUD Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th posted a topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone, I am re-creating the posts after hte ideas came up about the name of proejcts and what it is about. This project is to be known as SF2 Avionics Community Pack (SF2:ACP for short), because the purpose of this projects is to create the assets for anyone to usse for our mods, as well for customizing our SF2 installation. You will need to put them into aircraft folder and customize the .ini files, in order, for them to appear in-game. This is what I find so enjoayble and I noticed that not many simulation does this. This s project aims to bring the realistic, immersive expereicnes in cockpits with actual textures for radar scope, RWR, HUD, and any avionics that is currently moddable in SF2 and aircraft mods. I will exlpain the limitation of SF2 engine, so we can get better pictures of what we can and can't do for now. I said "for now, is becauuse I have the hope htat someday, somehow, someone manage to make it possible to make avioincs further moddable in SF2. 1) Texture issues: What can be done is chan ging radar scope texture. But the problem is that, the radar symbols / lines colors can not be changed. We are stuck with default green SF2 radar symbosl /lines / circles. And eve with new textures, the radar lines / symbols/ shapes will be applied on top of it. So it mean, if you have 'black line' on top of radar scope like A-4s as an exampe, the radar still overlap it. Another issues is that, most of SF2 default aircraft does not have texture-able radar scope for 'turned off' radar, so it seem strange how CRT (texture) would suddenly show up when turnig radar on. I wished that the radar scope woudl be texture-able, so that it seem taht only radar lines / symbols / shapes would appear, therefore preserving the immersive experiences. 2) Lighting, after attempting to use the actual colors of radar scope based on the pictures, as an example, they usually show upup too bright comnpared ot another instructments / avionics in cockpit. So they need to be darken, in order to blend naturall in cockpits. And another issue is radar colors of green, it need to be readable, therefore further darken the texture. So they might will appear darker compared to the photo. (I am currenlty wokring on this part on both F-89s and A-4s radar scope and RWR new textures). 3) Avionics DLLs, there are only two DLLs I believe, that we can use either one of Avionics DLL for early and modern aircraft. But I still have the hope. The reason why I have hope is because, I am part of the community that is modding Jane's series simulation. That simulation is almost 30 years old and people still mods it. It amazes me, therefore gives me hopes. Besides the lmitation, it does not stop us from wanting to create the mods that would improve the experiences in avioincs. What inspired me to do this, I was customizing SF2 installation for early cold war era (My favorite era), in Asia, midddle east, and other theatre, along with later cold war era, I noticed that there is always room of growth and improvement for cockpits. That is when I came up the awy to improve F-89 series radar scope, as you can see it in another theatre abou Stary's F-89 cockpits. Then here it is, SF2: Avionics Community Pack! What would be great help if we can share the pictures and information on the avioinics for various planes, so we can get busy with the avioniocs improvement. If anyoneo have the requests for radar scope, or any avioinics improvement, it would be great help if the resources can be provided too. The next posts will cover what I am doing with both F-89s and A-4s gunsights, radar scope, and rwr, along with F-89's radar scope. ------------------------------------------------------------------------------------------------------------------ DOWNLAOD: SF2 ACP v0.2 ------------------------------------------------------------------------------------------------------------------ Cheers! -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! It have been quite lot of work on the Chilean Mirage 5s / Mirage 50s. I am surprised with the numerous of the customization and upgrades they have gone through. I find them most unique out of the Mirage series, besides Swiss Mirage IIIS. At the same time, going through tons of Chilean Mirage 5s / Mirage 50s download in CombatAce Download sections, there are many versions. Took me a while to go through them, clean up the files, and find the latest one. The one I am using is Dennisolveira's Chilean Mirage 5s / Mirage 50s pack. Here is screenshot of the Mirage 5MA / 5MD / 5R "Elkan" Mirage 50FC Mirage 50C and 50 CN are most intersting, they both hvae different equipment. Mirage 50C, from what I have learned, uses Agave radar. IT is quite difficult to find the pictures or diagram of the radar. so with no resources to find information on radar diagram or how they look ilke when appearing in MDF, I amusing placeholder. This is based on war thunder radar diagrams. The HUD is also based on the Dennisoliveira's Super Extendard. The HUD is also modified and upgraded to match what I found from researches. NOTE: Due to the lacks of pictures or videos of Mirage 50C's radar display as well the HUD, I amusing Super Etendard since both uses same radar. Mirage 50C Next, here is Mirage 50CN and 50 DCN Eagle114th -
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! With the disassembled and decompiled codes, being revealed as of an assemble language and C pseudocode at the same time it display the functions and classes that are being functioned as intended, along with public and private variables. Please note that SF2, along with DLL files, are written in C++ languages, according to CFF explorer. However, what makes disassembled / decompiled codes challenging, unlike Source codes is that, there is no named classes, functions, and variables as the coders would do in the source codes. Therefore, we would have to study the codes to understand the targeted or intentions of the codes, based on each DLLs it is written inside. That means, by understanding what the codes does, we can theorize what each functions do. The beauty of the Ghidra is that, it allows us to rename any functions and variables, making it understandable when we look at them. At the same time, if we want to modify, remove, or add, we can only write them in C codes, while maintaining the computability with the original C++ codes of SF2 DLL files. This is another challenges. Finally, one more thing, another challenges is to find the functions that handles what we seek for, such as .lini files handling, as well SF2 engine. Because there are public and private classes / variables. So for public, they can be directly found by using search for the key words. For private functions / variables, they won't be found. So to find them, we would must manually find them. There are various ways to do it. But good news is that, with python scripts, it can automatically search for the key words for you if you can make the scripts! I was lucky enough to land the goldmine (key words of functions and variables). AI have taught me that, when looking in to DLL, start by looking at initDLL, which means initialization DLL. From there, functions can be traced toward where the specific class is likely to be found. I am studying on how to use python script to let Ghidra find for me instead, saving tons of unnecessary time consuming tasks. To conclude this post, I believe that, by finding the disassembled / decompiled is a small, yet big leaps toward modding DLL files. For now, I am taking a break from intense researches and exploring the dll files using ghidra. I still want to focus on SF - CAP (Avionics overhaul) mod projects too! So I decide to do SF - CAP for a week, then do Ghidra and DLL exploring / experimenting for a week, back and fort. What I would like to do before doing anything to the DLL Files is to extract the information from each DLL, such as avionics radar / hud / tv display, cockpit (gunsight), and other aspect of SF2 names list. That way we can have full reference list for .ini modding. Eagle114th -
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! I have put togehter chains of the classes and functions from Avionics70.DLL. It have taken me a while to dig through the DLL file. WHew! ============================================================================ ------------------------------- FUN_10013f90 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013f90(void *this,void *param_1,wchar_t *param_2) { FUN_10013940(this,param_1,param_2); *(undefined ***)this = RadarTargetRangeTextClass::vftable; return (undefined4 *)this; } ============================================================================ ------------------------------- FUN_1001d750 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013940(void *this,void *param_1,wchar_t *param_2) { undefined4 uVar1; wchar_t *pwVar2; uint uVar3; int iVar4; float10 fVar5; wchar_t local_21c [260]; void *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea16; local_10 = ExceptionList; ExceptionList = &local_10; local_14 = this; FUN_100135f0(this,param_1,param_2); local_8 = 0; *(undefined ***)this = RadarTextClass::vftable; FUN_100204d0(param_1,param_2,L"Text",L"",(wchar_t *)((int)this + 0x18),0x40,0); FUN_10023470((uint *)((int)this + 0x98),param_1,param_2); local_8 = 1; *(undefined ***)this = RadarTargetTextClass::vftable; *(undefined4 *)((int)this + 0x1a4) = 0; pwVar2 = FUN_100208c0(param_1,param_2,L"TextFormat",0); *(wchar_t **)((int)this + 0x1a4) = pwVar2; FUN_100204d0(param_1,param_2,L"NoTargetText",L"",(wchar_t *)((int)this + 0xa4),0x40,0); FUN_100204d0(param_1,param_2,L"DisplayUnit",L"",local_21c,0x104,0); fVar5 = FUN_10021aa0(local_21c); *(float *)((int)this + 0x9c) = (float)((float10)1 / fVar5); *(undefined4 *)((int)this + 0xa0) = 0x3f800000; uVar3 = FUN_10020590(param_1,param_2,L"ShowOnlyTens",0); if (uVar3 == 0) { uVar3 = FUN_10020590(param_1,param_2,L"ShowOnlyHundreds",0); if (uVar3 == 0) { uVar3 = FUN_10020590(param_1,param_2,L"ShowOnlyThousands",0); if (uVar3 == 0) goto LAB_10013a9e; *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x400000; uVar1 = 0x3a83126f; } else { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x200000; uVar1 = 0x3c23d70a; } } else { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x100000; uVar1 = 0x3dcccccd; } *(undefined4 *)((int)this + 0xa0) = uVar1; LAB_10013a9e: iVar4 = FUN_1001ed70(param_1,param_2,L"ThousandsSeparator"); if (iVar4 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x800000; FUN_100204d0(param_1,param_2,L"ThousandsSeparator",L"",(wchar_t *)((int)this + 0x124),0x40,0); } ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_100135f0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_100135f0(void *this,void *param_1,wchar_t *param_2) { float *pfVar1; uint uVar2; float local_c [2]; *(undefined ***)this = RadarElementClass::vftable; *(undefined4 *)((int)this + 4) = 0; pfVar1 = FUN_10021520(local_c,param_1,param_2,L"Position"); *(float *)((int)this + 8) = *pfVar1; *(float *)((int)this + 0xc) = pfVar1[1]; *(float *)((int)this + 0x10) = *pfVar1; *(float *)((int)this + 0x14) = pfVar1[1]; uVar2 = FUN_10020590(param_1,param_2,L"XOffsetTarget",0); if (uVar2 == 0) { uVar2 = FUN_10020590(param_1,param_2,L"XOffsetAzimuth",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 2; } } else { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 1; } uVar2 = FUN_10020590(param_1,param_2,L"YOffsetTarget",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x10; return (undefined4 *)this; } uVar2 = FUN_10020590(param_1,param_2,L"YOffsetRange",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x20; return (undefined4 *)this; } uVar2 = FUN_10020590(param_1,param_2,L"YOffsetElevation",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x40; } return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_10021520 ------------------------------- ---------------------------------------------------------------------------- float * __cdecl FUN_10021520(float *param_1,void *param_2,wchar_t *param_3,wchar_t *param_4) { wchar_t *pwVar1; float10 fVar2; wchar_t local_20c [260]; *param_1 = 0.0; param_1[1] = 0.0; FUN_100204d0(param_2,param_3,param_4,L"",local_20c,0x104,0); pwVar1 = _wcschr(local_20c,L','); if (pwVar1 != (wchar_t *)0x0) { *pwVar1 = L'\0'; fVar2 = (float10)FUN_1002bef0(local_20c,(int *)0x0); *param_1 = (float)fVar2; fVar2 = (float10)FUN_1002bef0(pwVar1 + 1,(int *)0x0); param_1[1] = (float)fVar2; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020590 ------------------------------- ---------------------------------------------------------------------------- uint __thiscall FUN_10020590(void *this,wchar_t *param_1,wchar_t *param_2,uint param_3) { bool bVar1; int iVar2; int iVar3; undefined3 extraout_var; undefined3 extraout_var_00; wchar_t *pwVar4; wchar_t local_20c [260]; iVar2 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar2 != 0) { iVar2 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar3 = FUN_10020740((void *)(iVar2 + 4),param_2); if (iVar3 != 0) { iVar2 = *(int *)(*(int *)(iVar2 + 4) + 8); goto LAB_100205d4; } } iVar2 = 0; LAB_100205d4: if (iVar2 != 0) { *(undefined4 *)(iVar2 + 4) = 0; FUN_1001e680(local_20c,*(wchar_t **)(iVar2 + 8),0x104); bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x238),0); if (CONCAT31(extraout_var,bVar1) != 0) { return 1; } bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x23c),0); if (CONCAT31(extraout_var_00,bVar1) != 0) { return 0; } *(undefined4 *)(iVar2 + 4) = 1; param_3 = (uint)(*(int *)(iVar2 + 0xc) != 0); } if (*(int *)((int)this + 0x22c) != 0) { if (param_3 == 0) { pwVar4 = *(wchar_t **)((int)this + 0x23c); } else { pwVar4 = *(wchar_t **)((int)this + 0x238); } FUN_1001ff80(this,param_1,param_2,pwVar4); } return param_3; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020740 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_10020740(void *this,wchar_t *param_1) { int iVar1; bool bVar2; int iVar3; undefined3 extraout_var; undefined3 extraout_var_00; if ((0 < *(int *)((int)this + 0xc)) && (iVar3 = FUN_1001e490(param_1), iVar3 == 0)) { /* WARNING: Load size is inaccurate */ if (*this == 0) { *(undefined4 *)this = *(undefined4 *)((int)this + 4); *(undefined4 *)((int)this + 0x10) = 0; } /* WARNING: Load size is inaccurate */ iVar1 = *this; iVar3 = *(int *)((int)this + 0x10); while (iVar1 != 0) { /* WARNING: Load size is inaccurate */ if ((*(undefined4 **)(*this + 8) != (undefined4 *)0x0) && (bVar2 = FUN_1001e560((wchar_t *)**(undefined4 **)(*this + 8),param_1,0), CONCAT31(extraout_var,bVar2) != 0)) { return 1; } /* WARNING: Load size is inaccurate */ *(int *)((int)this + 0x10) = *(int *)((int)this + 0x10) + 1; iVar1 = **this; *(int *)this = iVar1; } *(undefined4 *)((int)this + 0x10) = 0; *(undefined4 *)this = *(undefined4 *)((int)this + 4); if (0 < iVar3) { do { /* WARNING: Load size is inaccurate */ if ((*(undefined4 **)(*this + 8) != (undefined4 *)0x0) && (bVar2 = FUN_1001e560((wchar_t *)**(undefined4 **)(*this + 8),param_1,0), CONCAT31(extraout_var_00,bVar2) != 0)) { return 1; } /* WARNING: Load size is inaccurate */ *(int *)((int)this + 0x10) = *(int *)((int)this + 0x10) + 1; *(undefined4 *)this = **this; } while (*(int *)((int)this + 0x10) < iVar3); } *(undefined4 *)this = 0; *(undefined4 *)((int)this + 0x10) = 0xffffffff; } return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e490 ------------------------------- ---------------------------------------------------------------------------- undefined4 __cdecl FUN_1001e490(short *param_1) { if ((param_1 != (short *)0x0) && (*param_1 != 0)) { return 0; } return 1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e560 ------------------------------- ---------------------------------------------------------------------------- bool __cdecl FUN_1001e560(wchar_t *param_1,wchar_t *param_2,int param_3) { wchar_t wVar1; bool bVar2; int iVar3; bool bVar4; if ((param_1 == (wchar_t *)0x0) || (*param_1 == L'\0')) { bVar4 = true; } else { bVar4 = false; } if ((param_2 == (wchar_t *)0x0) || (*param_2 == L'\0')) { bVar2 = true; } else { bVar2 = false; } if (bVar4) { if (bVar2) { return true; } } else if (!bVar2) { if (param_3 == 0) { iVar3 = __wcsicmp(param_1,param_2); return (bool)('\x01' - (iVar3 != 0)); } while( true ) { wVar1 = *param_1; bVar4 = (ushort)wVar1 < (ushort)*param_2; if (wVar1 != *param_2) break; if (wVar1 == L'\0') { return true; } wVar1 = param_1[1]; bVar4 = (ushort)wVar1 < (ushort)param_2[1]; if (wVar1 != param_2[1]) break; param_1 = param_1 + 2; param_2 = param_2 + 2; if (wVar1 == L'\0') { return true; } } return 1 - bVar4 == (uint)(bVar4 != 0); } return false; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e680 ------------------------------- ---------------------------------------------------------------------------- wchar_t * __cdecl FUN_1001e680(wchar_t *param_1,wchar_t *param_2,rsize_t param_3) { if (param_1 != (wchar_t *)0x0) { if ((param_2 != (wchar_t *)0x0) && (*param_2 != L'\0')) { _wcsncpy_s(param_1,param_3,param_2,0xffffffff); param_1[param_3 - 1] = L'\0'; return param_1; } *param_1 = L'\0'; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001ff80 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001ff80(void *this,wchar_t *param_1,wchar_t *param_2,wchar_t *param_3) { int iVar1; int iVar2; wint_t *pwVar3; void *this_00; undefined4 *puVar4; undefined4 uVar5; wchar_t *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ee1d; local_10 = ExceptionList; local_14 = *(wchar_t **)((int)this + 0x234); ExceptionList = &local_10; iVar1 = FUN_1001e490(param_3); if (iVar1 == 0) { iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_3); if (iVar1 == 0) goto LAB_100200a9; local_14 = (wchar_t *)FUN_10025790((int)this + 0x21c); } iVar1 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_2); if ((iVar2 != 0) && (iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8), iVar1 != 0)) { *(undefined4 *)(iVar1 + 4) = 0; *(wchar_t **)(iVar1 + 8) = local_14; ExceptionList = local_10; return 1; } } iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_2); if (iVar1 != 0) { pwVar3 = (wint_t *)FUN_10025790((int)this + 0x21c); this_00 = (void *)FUN_1001ddc0(0x14); local_8 = 0; if (this_00 == (void *)0x0) { puVar4 = (undefined4 *)0x0; } else { puVar4 = FUN_1001e9a0(this_00,pwVar3,local_14); } local_8 = 0xffffffff; uVar5 = FUN_1001f5f0(this,param_1,puVar4); ExceptionList = local_10; return uVar5; } LAB_100200a9: FUN_1001df00(); ExceptionList = local_10; return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_10025810 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_10025810(void *this,wchar_t *param_1) { rsize_t _SizeInWords; wchar_t wVar1; wchar_t *pwVar2; pwVar2 = param_1; do { wVar1 = *pwVar2; pwVar2 = pwVar2 + 1; } while (wVar1 != L'\0'); _SizeInWords = ((int)pwVar2 - (int)(param_1 + 1) >> 1) + 1; pwVar2 = *(wchar_t **)((int)this + 4); /* WARNING: Load size is inaccurate */ if ((int)(((int)pwVar2 - *this >> 1) + _SizeInWords) <= *(int *)((int)this + 0xc)) { *(wchar_t **)((int)this + 8) = pwVar2; _wcscpy_s(pwVar2,_SizeInWords,param_1); *(int *)((int)this + 4) = *(int *)((int)this + 4) + _SizeInWords * 2; return 1; } return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_10025790 ------------------------------- ---------------------------------------------------------------------------- undefined4 __fastcall FUN_10025790(int param_1) { return *(undefined4 *)(param_1 + 8); } ---------------------------------------------------------------------------- ------------------------------- FUN_1001ddc0 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1001ddc0(size_t param_1) { if (DAT_1005b548 != (undefined4 *)0x0) { (**(code **)*DAT_1005b548)(param_1,0,0,DAT_1005b524); return; } _malloc(param_1); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e9a0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_1001e9a0(void *this,wint_t *param_1,wchar_t *param_2) { int iVar1; long lVar2; float10 fVar3; *(wint_t **)this = param_1; *(undefined4 *)((int)this + 4) = 0; FUN_1001e8f0(param_1); iVar1 = FUN_1001e490(param_2); if (iVar1 == 0) { *(wchar_t **)((int)this + 8) = param_2; lVar2 = __wtol(param_2); *(long *)((int)this + 0xc) = lVar2; fVar3 = (float10)FUN_1002bef0(param_2,(int *)0x0); *(float *)((int)this + 0x10) = (float)fVar3; FUN_1001e8f0(*(wint_t **)((int)this + 8)); return (undefined4 *)this; } *(undefined4 *)((int)this + 0x10) = 0; *(undefined4 *)((int)this + 8) = 0; *(undefined4 *)((int)this + 0xc) = 0; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e8f0 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e8f0(wint_t *param_1) { if ((param_1 != (wint_t *)0x0) && (*param_1 != 0)) { FUN_1001e820(param_1); FUN_1001e890(param_1); } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e820 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e820(wint_t *param_1) { wint_t wVar1; int iVar2; wint_t *pwVar3; _locale_t unaff_ESI; wint_t *pwVar4; if ((param_1 == (wint_t *)0x0) || (pwVar4 = param_1, *param_1 == 0)) { return param_1; } do { iVar2 = FID_conflict:__iswspace_l(*pwVar4,unaff_ESI); if (iVar2 == 0) break; pwVar4 = pwVar4 + 1; } while (*pwVar4 != 0); if (pwVar4 != param_1) { pwVar3 = param_1; do { wVar1 = *pwVar3; pwVar3 = pwVar3 + 1; } while (wVar1 != 0); iVar2 = (((int)pwVar3 - (int)(param_1 + 1) >> 1) - ((int)pwVar4 - (int)param_1 >> 1)) + 1; pwVar3 = param_1; if (0 < iVar2) { do { *pwVar3 = *(wint_t *)(((int)pwVar4 - (int)param_1) + (int)pwVar3); pwVar3 = pwVar3 + 1; iVar2 = iVar2 + -1; } while (iVar2 != 0); } } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e890 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e890(wint_t *param_1) { int iVar1; wint_t *pwVar2; _locale_t unaff_ESI; wint_t *pwVar3; if ((param_1 != (wint_t *)0x0) && (*param_1 != 0)) { pwVar2 = (wint_t *)0x0; pwVar3 = param_1; if (*param_1 != 0) { do { iVar1 = FID_conflict:__iswspace_l(*pwVar3,unaff_ESI); if (iVar1 == 0) { pwVar2 = pwVar3; } pwVar3 = pwVar3 + 1; } while (*pwVar3 != 0); if (pwVar2 != (wint_t *)0x0) { pwVar2[1] = 0; return param_1; } } *param_1 = 0; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002bef0 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1002bef0(wchar_t *param_1,int *param_2) { FUN_1002bde8(param_1,param_2,(localeinfo_struct *)0x0); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002bde8 ------------------------------- ---------------------------------------------------------------------------- /* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ void __cdecl FUN_1002bde8(wchar_t *param_1,int *param_2,localeinfo_struct *param_3) { wchar_t _C; uint uVar1; int *piVar2; int iVar3; FLT p_Var4; wchar_t *_Str; localeinfo_struct local_38; int local_30; char local_2c; double local_28; _flt local_20; uint local_8; local_8 = DAT_10057e04 ^ (uint)&stack0xfffffffc; _LocaleUpdate::_LocaleUpdate((_LocaleUpdate *)&local_38,param_3); if (param_2 != (int *)0x0) { *param_2 = (int)param_1; } if (param_1 == (wchar_t *)0x0) { piVar2 = __errno(); *piVar2 = 0x16; FUN_1002fef0(); if (local_2c != '\0') { *(uint *)(local_30 + 0x70) = *(uint *)(local_30 + 0x70) & 0xfffffffd; } goto LAB_1002bee1; } _C = *param_1; _Str = param_1; while (iVar3 = _iswctype(_C,8), iVar3 != 0) { _Str = _Str + 1; _C = *_Str; } p_Var4 = __wfltin2(&local_20,_Str,&local_38); if (param_2 != (int *)0x0) { *param_2 = (int)(_Str + p_Var4->nbytes); } uVar1 = p_Var4->flags; if ((uVar1 & 0x240) == 0) { if ((uVar1 & 0x81) == 0) { if (((uVar1 & 0x100) == 0) || (local_28 = 0.0, NAN(p_Var4->dval) == (p_Var4->dval == 0.0))) { local_28 = p_Var4->dval; goto LAB_1002bed1; } } else { local_28 = _DAT_100585d0; if (*_Str == L'-') { local_28 = -_DAT_100585d0; } } piVar2 = __errno(); *piVar2 = 0x22; } else { local_28 = 0.0; if (param_2 != (int *)0x0) { *param_2 = (int)param_1; } } LAB_1002bed1: if (local_2c != '\0') { *(uint *)(local_30 + 0x70) = *(uint *)(local_30 + 0x70) & 0xfffffffd; } LAB_1002bee1: @__security_check_cookie@4(local_8 ^ (uint)&stack0xfffffffc); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002fef0 ------------------------------- ---------------------------------------------------------------------------- void FUN_1002fef0(void) { __invalid_parameter((wchar_t *)0x0,(wchar_t *)0x0,(wchar_t *)0x0,0,0); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001f5f0 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001f5f0(void *this,wchar_t *param_1,undefined4 *param_2) { int *this_00; int iVar1; undefined4 uVar2; void *this_01; undefined4 *puVar3; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ed6a; local_10 = ExceptionList; if (param_2 != (undefined4 *)0x0) { this_00 = (int *)((int)this + 0x208); ExceptionList = &local_10; iVar1 = FUN_10020740(this_00,param_1); if (iVar1 == 0) { iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_1); if (iVar1 == 0) { FUN_1001df00(); ExceptionList = local_10; return 0; } uVar2 = FUN_10025790((int)this + 0x21c); this_01 = (void *)FUN_1001ddc0(0x18); local_8 = 0; if (this_01 == (void *)0x0) { puVar3 = (undefined4 *)0x0; } else { puVar3 = FUN_1001f4f0(this_01,uVar2); } local_8 = 0xffffffff; iVar1 = FUN_10020860(this_00,puVar3); if (iVar1 == 0) { FUN_1001df00(); if (puVar3 == (undefined4 *)0x0) { ExceptionList = local_10; return 0; } FUN_1001f550(puVar3); FUN_1001de20(puVar3); } } else { puVar3 = *(undefined4 **)(*this_00 + 8); } if (puVar3 != (undefined4 *)0x0) { iVar1 = FUN_10020740(puVar3 + 1,(wchar_t *)*param_2); if (iVar1 == 0) { FUN_10020860(puVar3 + 1,param_2); } ExceptionList = local_10; return 1; } } ExceptionList = local_10; return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001f4f0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_1001f4f0(void *this,undefined4 param_1) { void *local_10; undefined *puStack_c; undefined4 local_8; puStack_c = &LAB_1003ed40; local_10 = ExceptionList; ExceptionList = &local_10; *(int *)((int)this + 4) = 0; *(undefined4 *)((int)this + 8) = 0; *(undefined4 *)((int)this + 0xc) = 0; *(undefined4 *)((int)this + 0x10) = 0; *(undefined4 *)((int)this + 0x14) = 0xffffffff; local_8 = 0; *(undefined4 *)this = param_1; FUN_10018c50((int *)((int)this + 4)); ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_10018c50 ------------------------------- ---------------------------------------------------------------------------- void __fastcall FUN_10018c50(int *param_1) { int *piVar1; int *piVar2; int iVar3; *param_1 = param_1[1]; if (param_1[1] == 0) { param_1[4] = -1; return; } do { piVar1 = (int *)*param_1; if (piVar1 == (int *)param_1[1]) { param_1[1] = *piVar1; } else { *(int *)piVar1[1] = *piVar1; } piVar2 = (int *)*param_1; if (piVar2 == (int *)param_1[2]) { iVar3 = piVar2[1]; param_1[4] = param_1[4] + -1; param_1[2] = iVar3; } else { *(int *)(*piVar2 + 4) = piVar2[1]; iVar3 = *(int *)*param_1; } *param_1 = iVar3; if (piVar1 != (int *)0x0) { FUN_1001de20(piVar1); param_1[3] = param_1[3] + -1; } } while (*param_1 != 0); param_1[4] = -1; return; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020860 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_10020860(void *this,undefined4 param_1) { undefined4 *puVar1; puVar1 = (undefined4 *)FUN_1001ddc0(0xc); if (puVar1 != (undefined4 *)0x0) { *puVar1 = 0; puVar1[1] = 0; puVar1[2] = param_1; *(int *)((int)this + 0xc) = *(int *)((int)this + 0xc) + 1; if (*(int *)((int)this + 4) == 0) { *(undefined4 **)((int)this + 4) = puVar1; } else { **(undefined4 **)((int)this + 8) = puVar1; puVar1[1] = *(undefined4 *)((int)this + 8); } *(undefined4 **)((int)this + 8) = puVar1; *(undefined4 **)this = puVar1; *(int *)((int)this + 0x10) = *(int *)((int)this + 0xc) + -1; return 1; } return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001f550 ------------------------------- ---------------------------------------------------------------------------- void __fastcall FUN_1001f550(undefined4 *param_1) { undefined4 uVar1; int iVar2; void *local_10; undefined *puStack_c; undefined4 local_8; local_10 = ExceptionList; puStack_c = &LAB_1003ed55; ExceptionList = &local_10; param_1[1] = param_1[2]; param_1[5] = (param_1[2] != 0) - 1; iVar2 = param_1[1]; local_8 = 0; while (iVar2 != 0) { if (*(int *)(param_1[1] + 8) != 0) { FUN_1001de20(*(int *)(param_1[1] + 8)); } if ((undefined4 *)param_1[1] != (undefined4 *)0x0) { uVar1 = *(undefined4 *)param_1[1]; param_1[5] = param_1[5] + 1; param_1[1] = uVar1; } iVar2 = param_1[1]; } FUN_10018c50(param_1 + 1); *param_1 = 0; local_8 = 0xffffffff; FUN_10018c50(param_1 + 1); ExceptionList = local_10; return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001de20 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1001de20(undefined4 param_1) { if (DAT_1005b548 != (int *)0x0) { (**(code **)(*DAT_1005b548 + 4))(param_1); } return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001df00 ------------------------------- ---------------------------------------------------------------------------- void FUN_1001df00(void) { return; } ---------------------------------------------------------------------------- ------------------------------- FUN_100204d0 ------------------------------- ---------------------------------------------------------------------------- void __thiscall FUN_100204d0(void *this,wchar_t *param_1,wchar_t *param_2,wchar_t *param_3,wchar_t *param_4, rsize_t param_5,int param_6) { int iVar1; int iVar2; iVar1 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_2); if (iVar2 != 0) { iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8); goto LAB_1002050e; } } iVar1 = 0; LAB_1002050e: if (param_4 != (wchar_t *)0x0) { if (iVar1 == 0) { if (*(int *)((int)this + 0x22c) != 0) { FUN_1001ff80(this,param_1,param_2,param_3); } FUN_1001e680(param_4,param_3,param_5); } else { *(undefined4 *)(iVar1 + 4) = 0; FUN_1001e680(param_4,*(wchar_t **)(iVar1 + 8),param_5); if (param_6 == 1) { FUN_1001e750((wint_t *)param_4); return; } if (param_6 == 2) { FUN_1001e7c0((wint_t *)param_4); return; } } } return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e750 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e750(wint_t *param_1) { byte bVar1; wint_t wVar2; int iVar3; _locale_t unaff_ESI; wint_t *pwVar4; if ((param_1 != (wint_t *)0x0) && (pwVar4 = param_1, *param_1 != 0)) { do { iVar3 = FID_conflict:_iswlower(*pwVar4,unaff_ESI); if (iVar3 == 0) { bVar1 = *(byte *)pwVar4; if (((0xdf < bVar1) && (bVar1 < 0xf7)) || ((0xf7 < bVar1 && (bVar1 < 0xfe)))) { *pwVar4 = *pwVar4 - 0x20; } } else { wVar2 = _towupper(*pwVar4); *pwVar4 = wVar2; } pwVar4 = pwVar4 + 1; } while (*pwVar4 != 0); return param_1; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e7c0 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e7c0(wint_t *param_1) { byte bVar1; wint_t wVar2; int iVar3; wint_t *pwVar4; if ((param_1 != (wint_t *)0x0) && (pwVar4 = param_1, *param_1 != 0)) { do { iVar3 = FID_conflict:__iswupper_l(*pwVar4); if (iVar3 == 0) { bVar1 = *(byte *)pwVar4; if (((0xbf < bVar1) && (bVar1 < 0xd7)) || ((0xd7 < bVar1 && (bVar1 < 0xde)))) { *pwVar4 = *pwVar4 + 0x20; } } else { wVar2 = _towlower(*pwVar4); *pwVar4 = wVar2; } pwVar4 = pwVar4 + 1; } while (*pwVar4 != 0); return param_1; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_10023470 ------------------------------- ---------------------------------------------------------------------------- undefined4 __cdecl FUN_10023470(uint *param_1,void *param_2,wchar_t *param_3) { bool bVar1; int iVar2; undefined3 extraout_var; uint uVar3; undefined3 extraout_var_00; undefined3 extraout_var_01; undefined3 extraout_var_02; wchar_t local_20c [260]; *param_1 = 0; FUN_100204d0(param_2,param_3,L"HorizontalAlignment",L"",local_20c,0x104,0); iVar2 = FUN_1001e490(local_20c); if (iVar2 == 0) { bVar1 = FUN_1001e560(local_20c,L"CENTER",0); if (CONCAT31(extraout_var,bVar1) == 0) { bVar1 = FUN_1001e560(local_20c,L"RIGHT",0); uVar3 = 4; if (CONCAT31(extraout_var_00,bVar1) == 0) goto LAB_100234fd; } else { uVar3 = 1; } } else { LAB_100234fd: uVar3 = 2; } *param_1 = *param_1 | uVar3; FUN_100204d0(param_2,param_3,L"VerticalAlignment",L"",local_20c,0x104,0); iVar2 = FUN_1001e490(local_20c); if (iVar2 == 0) { bVar1 = FUN_1001e560(local_20c,L"CENTER",0); if (CONCAT31(extraout_var_01,bVar1) != 0) { *param_1 = *param_1 | 0x10; return 1; } bVar1 = FUN_1001e560(local_20c,L"BOTTOM",0); uVar3 = 0x40; if (CONCAT31(extraout_var_02,bVar1) != 0) goto LAB_10023587; } uVar3 = 0x20; LAB_10023587: *param_1 = *param_1 | uVar3; return 1; } ---------------------------------------------------------------------------- ------------------------------- FUN_100208c0 ------------------------------- ---------------------------------------------------------------------------- wchar_t * __cdecl FUN_100208c0(void *param_1,wchar_t *param_2,wchar_t *param_3,int param_4) { int iVar1; wchar_t *pwVar2; wchar_t local_20c [260]; FUN_100204d0(param_1,param_2,param_3,L"",local_20c,0x104,0); iVar1 = FUN_1001e490(local_20c); if (iVar1 != 0) { return (wchar_t *)0x0; } if (param_4 == 1) { FUN_1001e750((wint_t *)local_20c); pwVar2 = FUN_1001e4d0(local_20c); return pwVar2; } if (param_4 == 2) { FUN_1001e7c0((wint_t *)local_20c); } pwVar2 = FUN_1001e4d0(local_20c); return pwVar2; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e4d0 ------------------------------- ---------------------------------------------------------------------------- wchar_t * __cdecl FUN_1001e4d0(wchar_t *param_1) { rsize_t _SizeInWords; wchar_t wVar1; wchar_t *pwVar2; pwVar2 = (wchar_t *)0x0; if (param_1 != (wchar_t *)0x0) { if (*param_1 == L'\0') { pwVar2 = (wchar_t *)FUN_1001dcd0(2); if (pwVar2 != (wchar_t *)0x0) { *pwVar2 = L'\0'; return pwVar2; } } else { pwVar2 = param_1; do { wVar1 = *pwVar2; pwVar2 = pwVar2 + 1; } while (wVar1 != L'\0'); _SizeInWords = ((int)pwVar2 - (int)(param_1 + 1) >> 1) + 1; if (pwVar2 != (wchar_t *)0x0) { _wcscpy_s(pwVar2,_SizeInWords,param_1); } } } return pwVar2; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001dcd0 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1001dcd0(undefined4 param_1) { (**(code **)*DAT_1005b548)(param_1,0,0,DAT_1005b524); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_10021aa0 ------------------------------- ---------------------------------------------------------------------------- float10 __cdecl FUN_10021aa0(wchar_t *param_1) { bool bVar1; int iVar2; undefined3 extraout_var; wchar_t *pwVar3; float *pfVar4; float10 fVar5; iVar2 = FUN_1001e490(param_1); if (iVar2 == 0) { pfVar4 = (float *)&DAT_100579a0; iVar2 = FUN_1001e490(u_FEET_100579a4); if (iVar2 == 0) { pwVar3 = u_FEET_100579a4; do { bVar1 = FUN_1001e560(pwVar3,param_1,0); if (CONCAT31(extraout_var,bVar1) != 0) { return (float10)*pfVar4; } pwVar3 = pwVar3 + 10; pfVar4 = pfVar4 + 5; iVar2 = FUN_1001e490(pwVar3); } while (iVar2 == 0); } fVar5 = (float10)FUN_1002bef0(param_1,(int *)0x0); fVar5 = (float10)(float)fVar5; if ((NAN((float10)0) || NAN(fVar5)) == ((float10)0 == fVar5)) { return fVar5; } } return (float10)1; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020590 ------------------------------- ---------------------------------------------------------------------------- uint __thiscall FUN_10020590(void *this,wchar_t *param_1,wchar_t *param_2,uint param_3) { bool bVar1; int iVar2; int iVar3; undefined3 extraout_var; undefined3 extraout_var_00; wchar_t *pwVar4; wchar_t local_20c [260]; iVar2 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar2 != 0) { iVar2 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar3 = FUN_10020740((void *)(iVar2 + 4),param_2); if (iVar3 != 0) { iVar2 = *(int *)(*(int *)(iVar2 + 4) + 8); goto LAB_100205d4; } } iVar2 = 0; LAB_100205d4: if (iVar2 != 0) { *(undefined4 *)(iVar2 + 4) = 0; FUN_1001e680(local_20c,*(wchar_t **)(iVar2 + 8),0x104); bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x238),0); if (CONCAT31(extraout_var,bVar1) != 0) { return 1; } bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x23c),0); if (CONCAT31(extraout_var_00,bVar1) != 0) { return 0; } *(undefined4 *)(iVar2 + 4) = 1; param_3 = (uint)(*(int *)(iVar2 + 0xc) != 0); } if (*(int *)((int)this + 0x22c) != 0) { if (param_3 == 0) { pwVar4 = *(wchar_t **)((int)this + 0x23c); } else { pwVar4 = *(wchar_t **)((int)this + 0x238); } FUN_1001ff80(this,param_1,param_2,pwVar4); } return param_3; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001ed70 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001ed70(void *this,wchar_t *param_1,wchar_t *param_2) { int iVar1; undefined4 uVar2; iVar1 = FUN_10020740((int *)((int)this + 0x208),param_1); if (iVar1 != 0) { uVar2 = FUN_10020740((void *)(*(int *)(*(int *)((int)this + 0x208) + 8) + 4),param_2); return uVar2; } return 0; } ============================================================================ ------------------------------- FUN_10013b50 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013b50(void *this,void *param_1,wchar_t *param_2) { float10 fVar1; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea3a; local_10 = ExceptionList; ExceptionList = &local_10; FUN_100136d0(this,param_1,param_2); *(undefined ***)this = RadarHorizonClass::vftable; local_8 = 0; fVar1 = FUN_10020450(param_1,param_2,L"ElevationScale",*(float *)(DAT_10059e28 + 0x50)); *(float *)((int)this + 0x24) = 1.0 / (float)(fVar1 * (float10)0.01745329238474369); ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUNCTION ------------------------------- ---------------------------------------------------------------------------- FUN_100136d0 FUN_10020450 ============================================================================ ------------------------------- FUN_10013bd0 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013bd0(void *this,void *param_1,wchar_t *param_2) { float fVar1; float10 fVar2; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea4c; local_10 = ExceptionList; ExceptionList = &local_10; FUN_100136d0(this,param_1,param_2); *(undefined ***)this = RadarElevationClass::vftable; local_8 = 0; fVar2 = FUN_10020450(param_1,param_2,L"ElevationScale",*(float *)(DAT_10059e28 + 0x50)); fVar1 = 1.0 / (float)(fVar2 * (float10)0.01745329238474369); *(float *)((int)this + 0x24) = fVar1; *(float *)(DAT_10059e28 + 0x50) = fVar1; ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_100136d0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_100136d0(void *this,void *param_1,wchar_t *param_2) { float fVar1; int iVar2; undefined4 uVar3; float10 fVar4; wchar_t local_21c [260]; void *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003e9d8; local_10 = ExceptionList; ExceptionList = &local_10; local_14 = this; FUN_100135f0(this,param_1,param_2); local_8 = 0; *(undefined ***)this = RadarImageClass::vftable; *(undefined4 *)((int)this + 0x18) = 0xffffffff; fVar4 = FUN_10020450(param_1,param_2,L"ImageSize",0.0); fVar1 = (float)fVar4; *(float *)((int)this + 0x1c) = fVar1; *(undefined4 *)((int)this + 0x20) = 0; if (0.0 < fVar1 != NAN(fVar1)) { FUN_100204d0(param_1,param_2,L"TextureName",L"",local_21c,0x104,0); iVar2 = FUN_1001e490(local_21c); if (iVar2 == 0) { uVar3 = (**(code **)(*DAT_10059068 + 0x7c))(local_21c,1,1,0); *(undefined4 *)((int)this + 0x18) = uVar3; } iVar2 = FUN_1001ed70(param_1,param_2,L"RotationAngle"); if (iVar2 != 0) { fVar4 = FUN_10020450(param_1,param_2,L"RotationAngle",0.0); *(float *)((int)this + 0x20) = (float)fVar4; if (1.1920929e-07 < ABS((float)fVar4)) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x10000; ExceptionList = local_10; return (undefined4 *)this; } } } ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020450 ------------------------------- ---------------------------------------------------------------------------- float10 __thiscall FUN_10020450(void *param_1,wchar_t *param_2,wchar_t *param_3,float param_4) { int iVar1; int iVar2; iVar1 = FUN_10020740((void *)((int)param_1 + 0x208),param_2); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)param_1 + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_3); if ((iVar2 != 0) && (iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8), iVar1 != 0)) { *(undefined4 *)(iVar1 + 4) = 2; return (float10)*(float *)(iVar1 + 0x10); } } if (*(int *)((int)param_1 + 0x22c) != 0) { FUN_1001fe50(param_1,param_2,param_3,param_4); } return (float10)param_4; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001fe50 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001fe50(void *this,wchar_t *param_1,wchar_t *param_2,undefined4 param_3) { int iVar1; int iVar2; wint_t *pwVar3; undefined4 *puVar4; undefined4 uVar5; undefined4 extraout_ECX; undefined4 extraout_EDX; float10 extraout_ST0; ulonglong uVar6; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ee08; local_10 = ExceptionList; ExceptionList = &local_10; iVar1 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_2); if ((iVar2 != 0) && (iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8), iVar1 != 0)) { *(undefined4 *)(iVar1 + 4) = 2; *(undefined4 *)(iVar1 + 0x10) = param_3; ExceptionList = local_10; return 1; } } iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_2); if (iVar1 != 0) { pwVar3 = (wint_t *)FUN_10025790((int)this + 0x21c); puVar4 = (undefined4 *)FUN_1001ddc0(0x14); local_8 = 0; if (puVar4 == (undefined4 *)0x0) { puVar4 = (undefined4 *)0x0; } else { *puVar4 = pwVar3; puVar4[1] = 2; FUN_1001e8f0(pwVar3); puVar4[2] = 0; uVar6 = FUN_1002a7b0(extraout_ECX,extraout_EDX); puVar4[4] = (float)extraout_ST0; puVar4[3] = (int)uVar6; } local_8 = 0xffffffff; uVar5 = FUN_1001f5f0(this,param_1,puVar4); ExceptionList = local_10; return uVar5; } FUN_1001df00(); ExceptionList = local_10; return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002a7b0 ------------------------------- ---------------------------------------------------------------------------- ulonglong __fastcall FUN_1002a7b0(undefined4 param_1,undefined4 param_2) { ulonglong uVar1; uint uVar2; float fVar3; float10 in_ST0; uint local_20; float fStack_1c; if (DAT_1005d4f4 == 0) { uVar1 = (ulonglong)ROUND(in_ST0); local_20 = (uint)uVar1; fStack_1c = (float)(uVar1 >> 0x20); fVar3 = (float)in_ST0; if ((local_20 != 0) || (fVar3 = fStack_1c, (uVar1 & 0x7fffffff00000000) != 0)) { if ((int)fVar3 < 0) { uVar1 = uVar1 + (0x80000000 < (uint)-(float)(in_ST0 - (float10)(longlong)uVar1)); } else { uVar2 = (uint)(0x80000000 < (uint)(float)(in_ST0 - (float10)(longlong)uVar1)); uVar1 = CONCAT44((int)fStack_1c - (uint)(local_20 < uVar2),local_20 - uVar2); } } return uVar1; } return CONCAT44(param_2,(int)in_ST0); } ============================================================================ ------------------------------- FUN_10013c60 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013c60(void *this,void *param_1,wchar_t *param_2) { FUN_100136d0(this,param_1,param_2); *(undefined ***)this = RadarAzimuthClass::vftable; *(uint *)((int)this + 4) = *(uint *)((int)this + 4) & 0xfffffffe | 2; return (undefined4 *)this; } ============================================================================ ------------------------------- FUN_10013c90 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013c90(void *this,void *param_1,wchar_t *param_2) { float10 fVar1; wchar_t local_21c [260]; void *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea66; local_10 = ExceptionList; ExceptionList = &local_10; local_14 = this; FUN_100135f0(this,param_1,param_2); local_8 = 0; *(undefined ***)this = RadarTextClass::vftable; FUN_100204d0(param_1,param_2,L"Text",L"",(wchar_t *)((int)this + 0x18),0x40,0); FUN_10023470((uint *)((int)this + 0x98),param_1,param_2); local_8 = 1; *(undefined ***)this = RadarRangeScaleClass::vftable; FUN_100204d0(param_1,param_2,L"DisplayUnit",L"",local_21c,0x104,0); fVar1 = FUN_10021aa0(local_21c); *(float *)((int)this + 0x9c) = (float)((float10)1 / fVar1); ExceptionList = local_10; return (undefined4 *)this; } ===================================================================== ===================================================================== ------------------------------- NOTES ------------------------------- ===================================================================== ===================================================================== | -------------------- | ----------------------------------------------------------------------- | | **Function** | **What It Creates / Does** | | -------------------- | ----------------------------------------------------------------------- | | `FUN_10013bd0` | Creates **RadarElevationClass** → handles elevation bar drawing | | `FUN_10013f90` | Creates **RadarTargetRangeTextClass** → handles range text like “10 nm” | | `FUN_10013940` | Initializes **RadarTextClass**, then upgrades to `RadarTargetTextClass` | | `FUN_100136d0` | Base class initializer for visual radar components | | `FUN_10020450`, etc. | Load values from INI → `[RadarDisplay]`, `[AvionicsData]`, etc. | | `DAT_10059e28` | Likely a **central render config structure** used across radar visuals | -
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! I am currenlty digging through Avionics70.DLL and found some of goldenmine. It turns out that Avionics70.DLL is class based, rather than function when handling the avionics. It makes sense, consdieirng how Avionics70.DLL ini works differenlty from Avionics60.DLL. Here is what I found so far: Eagle114th -
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
HOLY MOLY!!!!!!!!!!!!!!!!!!! I found the goldmine, the pieces of the disassembled codess! I was looking into this function: FUN_10013dc0(0x10057620); Then i notice the address 0x10057620, so I went into that, then I landed in the goldmine! I found a large block of codes that handles the .ini, here is the codes: -
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
UPDATE: From iniDLL funcitons, the ntoes are made here, as i think may lead to the codes that handles the avionics. I am continuing to dig through the dll file. For now I have collected what I find might be useful: Notes on each of the functions: Eagle114th -
Questions about DLL files modding (DLL - Dissassembled codes found!)
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
hello everyone! I am on a short break from avonics project this week. I plan returning ot it by end of this week for more epic works on it. However, today I decided to give ita try with Ghidra, to dig deep int Avionics60.dll, oh boy, I realize that the name of files can not be searched nor found, unless you find it indirectly. I just hit this function by looking into .inidll, then it led me to a function, then I saw this one function, named FUN_100153c0, then I went into that one, then I saw this: Avonics60.str??????? Now I am intersted, it makes me wonder. (Thank you AI for assisting me going through SF2 DLL files). I am NOT saying we are far nor close to finding the ways to edit dll, I am just sahring what I have found so far that might give us hints. Like I said, if you search directly for key words, such as "sweep", "radar", etc, it iwll not be found. However, if you go through functions and by luck, you land in one of fucntion, you will find the key words. Like I found this by slucks. I now rememberfrom the old ddays in programming cvlasses: Public vs Private variables When writing codes, the public variables is can be shared among the classes, but private is preserved varaibles only locally in specific class. So this must be it, why the variables can not be found from outside the class or functions. Therefore, had to follow the brad cumbles to find what find the private varables. Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! It have been a busy week! During the modding time, spent lot of time researching about the various variants / export version of Mirage 5s. It amazes me the different configuration and upgrades the various Mirage 5s have gone through! When I study this optical sight, turns out that Mirage 5F and IAI Nesher have the same optical sight in my understanding. It looks like it is modified CFS Type 97K, which is improved for air tog round attack. What I realized is that, due to an embargo, Israel wasn't able to receive Mirage 5J they ordered from France. France kept them and turned them into Mirage 5F. Israel, in other hand, built their own version of Mirage 5J from their experiences and data of Mirage 5J. And according to excellent pictures shared by DTMDragon (Thank you!), I am able to modify the CSF Type 97K optical sight: Main fixed sight with gyro sight The works on Mirage 5F (TW and WRENCH / TMF in SF2: Belgium Mirage 5BA / 5BD / 5BR are also completed. NOTE: For Mirage 5BR, you will need to use 'window' to view the recon camera. By the way, since the Mirage 5BA is based on Mirage IIIE being modified to become strike fighter with simpdified avionics, while integrating US Avionics, it still use CFS Type 97K from Mirage IIIE. Here is the picture of optical sight from Mirage 5BA flight manual: Mirage 5BA (TW) and late version with AN/ALQ-178 RWR in SF2: NOTE: The view is zoomed out in cockpit, so we can see more in the cockpit. Wrench / TMF's Mirage 5BA There are lot more Mirage 5s to work on and I look forward posting additional screenshots when they are ready eventually. I am working on the following Mirage 5s and Mirage 50s: NOTE: As long they are available in CombatAce, they are being added to SF2 - CAP. Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! I happen to find this very rare document, which is enriched information about Hughes TARAN 18 FCS / RADAR! And this is from that document: By using two AI to translate this pages for me, here is what it states on the page: Then this video was also found! It shows the radar scope in action! (To see the radar scope, it starts from 14:00) By using Avionics70.dll, I am able to customize the radar better, while adding TWS mode. " Here is screenshot of radar (WIP): (SEARCH MODEL) (TRACK MODE) NOTE: IRM have one circle whilhe SAHM have two. And when AAM have a lock on, msall 'X" symbol will appear as Shoot cue. (GROUND MAPPING MODE) Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! The Mirage IIIS is the whole different aircraft compared to the Mirage IIIs series. This aircraft is so interesting and unique with many of customizations, including the technologies of Mirage III and Hughes radar for HM-55 (AIM-26B). It have been journey connecting the dots and matching the puzzles. By analog, it is like discovering the fossil pieces and you try to put it together, some of it match one dinosaur while some belong to other dinosaur. Same thing with Mirage IIIS various pictures I found. What I realized is that Mirage IIIS have gone through upgrade during 1988. So Pre 1988, the cockpit of Mirage IIIS did not show RWR and it have more simple navigation moving map scope below the radar scope. And I noticed how the radar scope look a lot like MA-1 of F-106. Then I learned that Hughes TARAN 18 based on F-106's MA-1 FCS. Interesting! The radar (Mirage IIIS Early) Cockpit of Post 1988 upgrade Mirage IIIS: NOTE: Notice the different scope for navigation moving map and the RWR right side of radar scope. And there is light gray bar on front right part of the scope. Radar (Mirage IIIS Late) NBOTE: I want to comment that, It is quite challenging to find the actual picture of post 1988 upgrade radar scope. This is the best one I can find. This was a 'hit and miss" when I found the Mirage IIIS mod for flight simulation. There are picture of radar scope. ere is screenshot of Mirage IIIS (Early) TW Style version: Mirage IIIS (Late) TW Style version: I am currently learning about modding Avionics70.DLL. I would like to share the notes I found from researches: Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! I have more to share about the progress with Mirage III series avionics overhaul: I am quite surprised how many mirage are out there, there are vast of them like F-4 Phantom II series mods! Here is the following Mirages III series: I noticed that some mods have same duplicated codes by accident, some allowed weapons on certain hardpoint that doesn't make sense, typo, etc.. They are fixed. For example, I see "LGB" for 1960s Mirage IIIRZ?! That is removed, so they only carry what they could historically carry. However, please note, I only do light editing of data.ini, because I am very focused on the avionics overhaul. I fix what needs fixing, such as overlapping hardpoint, allowedeweapon, etc... And if you see any inaccurate of certain aircraft loadout / weapon load or issues, please let me know and I will fix them in each release of SF - CAP beta. Same thing with effects, I used to do a lot of effect work for SFCE (Strike Fighter Community Expansion) years ago, this time, as stated, I am focused on avionics overhaul. Maybe somedady I could go back to effect work, no promises. Anyway, back to work in progress reports: There is certain Pakistan Mirage IIIDP, pre and post ROSE upgrade. This one was quite interesting challenge! This is what allows me to learn how the modder uses 'Fakepilot" method to replace certain 3D part! SO this time, for early (Pre ROSE upgrade), I am able to replace the post ROSE front fuselage / nose with pre ROSE (no fuel probe, advanced equipment), then did some re-texturing, came out great! Here is screenshot of pre ROSE (EARLY) Mirage IIIDP Post ROSE Mirage IIIDP (NOTE: the HUD color annd HUD glass color have been overhauled, along with re-made gunsights (AA / AG mode). The rest of HUD, #D models, and everything is done by great work of Denissolivera and Combatace community.) Next, with permission, the excellent The Mirage Factory's Mirage IIIC and E are being implemented into various IIIC / E / R series. (NOTE: the IIIRs uses IIICs cockpit.) Here is screen shot of Mirage IIIRZ / R2Z with TMF's cockpit: Still have more to do, and I look forward working on Mirage V (Mirage 5) series! Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! I have another reports; Aircraft designation and Israel Shahak series. I began working on excellent Shahak mod pack by Yakarvok79, implementing the new optical sight, radar, and fixed the recon camera for recon version of Shahak. Here is screenshot of Shahak Moshel (Mirage IIICJ) with recon camera system: I want to talk about the designation system, it is one of favorite topic because there have been misunderstood. For example, before and after September 18, 1962, US Navy / US Marine Corps had a whole different designation system. Same thing with US Navy / Marine Corps and US Air Force designation for AAMs before and after June 27, 1963. One fine example is AIM-9B, it wasn't until 1963 when they were known as AIM-9B Sidewinder. Prior to that, US Navy / Marine Corp, the AIM-9B was known as AAM-N-7 (NOTE: AAM means air to air missile, N stands for "Navy"). And the US Air Force's AIM-9B was known as GAR-8. However, this time, while working on export variants of Mirage IIIC and E, I learned that Spain had locally different designation for them, as well Israel for various imported aircraft. So from on, there are new naming format for nations that have local designation as well technical aircraft where they come from, therefore giving more immersive experiences when flying them in SF2: LOCAL DESIGNATION (TECHNICAL AIRCRAFT), YEAR Here is an example: For Mirage IIIEE, Spain designation is C.11, therefore, the name would appear as: I am going through all Israel aircraft to have correct names for each aircraft historically: By the way, the notes is included in the mod pack about the various version of Shahak field modification and the purposes, so we can use them best way in SF2: Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! It have been a while, It have been busy days for me. Got a chance to further work on the Mirage IIIs series. This time, I got to work on the excellent work of Wrench and The Mirage Factory. The following features of SF - CAP are implemented in Wrench / TMF Mirage III series: - Fixed the weapon loading, so certain ordinances no longer overlay with each other. For example, for outer wing, you can only select IRM or rocket pod / drop tank with rocket pod. - Implemented the CSF Type 97 sights for Mirage IIICs and IIIEs. - For Mirage IIIE that have RWR, the texture have been re-done in 512 x 512. Here is screenshot of Mirage IIIC (Wrench / TMF) Mirage IIIE (Wrench / TMF) NOTE: For every texture radar scope is made, there is always TW style too. I try to keep screenshot few as possible when posting here. There are so many of Mirage III add-on out there, I am gong through them and add the options for various author of Mirage III series mods, so you can enjoy SF - CAP in the Mirage IIIs. Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! The optical sight for Cyrano I Bis radar are now completed. Please note that, this Mirage III is unique with many advanced features for optical sights. So this time, for NAV, instead of having 'turned off" optical sights, the horizontal bar, linked to gyro sight is used for navigating. AA and AG mode does not feature that. By the way, here is screenshot of Cyrano I Bis radar optical sight (Mirage Cs and Shahak series): NAV MODE: AA MODE: AG MODE - GUN and ROCKET: NOTE: I didn't realize that the 2 vertical small symbols below the gunsight aligns with the rocket. AG MODE - BOMB (Depressed sight) For Cyrano II optical sight, it have been re-done, so the horizontal bar will only appear in NAV mode while further fixing and polishing the optical sight systems for AA and AG. NOTE: for AA mode, the clourse speed is included. Unfortunately I do not know the way to add scale version of clourse speed, so we have dynamic speed for now. NAV MODE: AA MODE: AG MODE - GUN and ROCKET: AG MODE - BOMB (Depressed sight) The radars are being worked on for Mirage IIIs, Shahak, and Mirage IIIS are work in progress now. Eagle114th -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
I agree! It is quite frustrating that TK does not realize the amazing potiental of SF2 earlier. However, at least, we grow more knowledge with the hobbies we have here. Prehaps someday when new sims that are like SF2 comes out, we can bring all of our hobbies over there too! I hope someday. For now, in meanwhile, we do what we can do with SF2. Cheers! -
SF2 Avionics Community Pack - - Beta release v0.4
Eagle114th replied to Eagle114th's topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! @dtmdragon I finally found information on the early Cyrano I Bis gunisght, it was quite challenging to find, it is from Mirage IIIB manual (Plates) and I finally understanda bout the horonzital line. You are right, there is no horizontal line during dogfight. For examlpe, with Cyrano II's version of CFS Type 97K gunsight, the wing (Horzintal line) appear only if it is beyond 1.1 MN, and less than that, it disappear. I Now with more information on both Cyrano I Bis and Cyrano II gunsight, There will be three modes: NAV, AA, and AG. I usually use NAV to 'turn off sight" for pre-HUD era aircraft. This time, Mirage III have unique and many uses of gunisght, therefore, for NAV, the gyro + fixed sight will be fixed with horizontal line. for AA and AG, tehre is no horizontal lines. However, here is pictures from Mirage IIIB manual (Plates): Eagle114th -
[HUD EDITING[ - Need advice for HUD editing.
Eagle114th posted a topic in Thirdwire: Strike Fighters 2 Series - Mods & Skinning Discussion
Hello everyone! I have a question, I noticd that in Mirage III, thera are codes in cockpit: The isssues with this is that, it will always show up in all mode (NAV , AA, AG). I awnt it only displayed when in either NAV or AG mode. so ia m trying to implement the same type of heading via [HUD] method. Anyone know the methods to this? UPDATE: I have one more question, about this HUD symbol: Is there scale version of radar closurse vc? Thank you Eagle114th