diff --git a/README.md b/README.md index 48faf9d07..374acdccc 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,10 @@ Congratulations, you are now sailing with the Ship of Harkinian! Have fun! The Ship of Harkinian uses a proprietary versioning system consisting of a sci-fi film character followed by a phonetic alphabet code word. The film character represents a major release version which increments with the addition of many new features and bug fixes. The code word represents a minor release version which increments with small updates mainly comprised of bug fixes. For example, `DECKARD ALFA`. -### The Extraction Tool +### Windows Rom Extraction -* Open a rom to initiate generating the `oot.otr` archive file. -* If a second button exists then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error. +* Open OTRGui.exe, and select one of the supported roms listed above, to generate the `oot.otr` archive file. +* If a second button already exits then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error. * When the process completes, place `oot.otr` beside `soh.exe` if it is not already. This packaging process can take up to **5 minutes**. @@ -42,6 +42,37 @@ This packaging process can take up to **5 minutes**. Close the OTRGui when the `Done!` message appears. If you get another message, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum. +### Linux Rom Extraction + +* Place one of the supported roms in the same folder as the appimage. +* When you run the soh appimage, it should begin generating the `oot.otr` archive file. +* When the process completes, place `oot.otr` in the same folder as the appimage, if it is not already, then run the appimage. + +The packaging process can take up to **5 minutes**. + +If you get any errors, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum. + +### MacOS Rom Extraction + +* Run `soh.app`, and when prompted, select one of the supported roms listed above. +* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start. + +The packing process can take up to **5 minutes**. + +If you get an error saying `Incompatible ROM hash`, you have selected the wrong rom, make sure the checksum matches one of the ones listed above. + +### Nintendo Switch Rom Extraction + +* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform. +* Place the `.nro` and the `oot.otr` archive into a folder called `soh` in your Switch folder on your Switch + +### Nintendo Wii U Rom Extraction + +* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform. +* Copy the `.rpx` and the `oot.otr` archive to `wiiu/apps/soh` + +--- + If you still cannot get the tool to work, join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the `#support` text channel. Keep-in-mind that we do not condone piracy in any way. ### Running The Ship of Harkinian diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index 42be25619..9ebaac6f5 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -251,9 +251,9 @@ extern "C" void CVar_Save() auto keyStr = key.c_str(); Color_RGBA8 clr = cvar.second->value.valueRGBA; pConf->setUInt(StringHelper::Sprintf("%s.R", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.r); + pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.g); + pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.b); + pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.a); pConf->setString(StringHelper::Sprintf("%s.Type", keyStr), mercuryRGBAObjectType); } } diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index b8bae4d17..b04f30e35 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -26,7 +26,7 @@ const char* RainbowColorCvarList[] = { "gCCMapsPrim", "gCCQuestsPrim", "gCCSavePrim", "gCCGameoverPrim" }; const char* MarginCvarList[] { - "gHearts", "gMagicBar", "gVSOA", "gBBtn", "gABtn", "gStartBtn", + "gHearts", "gHeartsCount", "gMagicBar", "gVSOA", "gBBtn", "gABtn", "gStartBtn", "gCBtnU", "gCBtnD", "gCBtnL", "gCBtnR", "gDPad", "gMinimap", "gSKC", "gRC", "gCarrots", "gTimers", "gAS", "gTCM", "gTCB" }; @@ -44,7 +44,6 @@ ImVec4 GetRandomValue(int MaximumPossible){ return NewColor; } void GetRandomColorRGB(CosmeticsColorSection* ColorSection, int SectionSize){ - //std::random_shuffle(ColorSection, ColorSection + SectionSize); for (int i = 0; i < SectionSize; i++){ CosmeticsColorIndividual* Element = ColorSection[i].Element; ImVec4 colors = Element->ModifiedColor; @@ -477,7 +476,7 @@ void Draw_Placements(){ Table_InitHeader(false); DrawUseMarginsSlider("Hearts counts", "gHearts"); DrawPositionsRadioBoxes("gHeartsCount"); - DrawPositionSlider("gHeartsCount",-22,ImGui::GetWindowViewport()->Size.y,-25,ImGui::GetWindowViewport()->Size.x); + DrawPositionSlider("gHeartsCount",-22,ImGui::GetWindowViewport()->Size.y,-125,ImGui::GetWindowViewport()->Size.x); DrawScaleSlider("gHeartsCount",0.7f); ImGui::NewLine(); ImGui::EndTable(); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index e59b6f771..2a8328970 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1144,7 +1144,7 @@ s16 Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) { case RG_GIANTS_KNIFE: return GI_SWORD_KNIFE; case RG_BIGGORON_SWORD: - return !CHECK_OWNED_EQUIP(EQUIP_SWORD, 2) ? GI_SWORD_BGS : GI_RUPEE_BLUE; + return !gSaveContext.bgsFlag ? GI_SWORD_BGS : GI_RUPEE_BLUE; case RG_DEKU_SHIELD: return GI_SHIELD_DEKU; diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index fc8a55a3a..8cede9a66 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -85,7 +85,7 @@ std::vector itemTrackerDungeonsWithMapsHorizontal = { { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADANCH, { ITEM_KEY_SMALL, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, @@ -97,7 +97,7 @@ std::vector itemTrackerDungeonsHorizontal = { { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, }; @@ -114,7 +114,7 @@ std::vector itemTrackerDungeonsWithMapsCompact = { { SCENE_DDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_BDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, }; @@ -124,7 +124,7 @@ std::vector itemTrackerDungeonsCompact = { { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, - { SCENE_GANON, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, { SCENE_MEN, { ITEM_KEY_SMALL } }, { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, @@ -141,7 +141,7 @@ std::map itemTrackerDungeonShortNames = { { SCENE_DDAN, "DCVN" }, { SCENE_BDAN, "JABU" }, { SCENE_ICE_DOUKUTO, "ICE" }, - { SCENE_GANON, "GANON" }, + { SCENE_GANONTIKA, "GANON" }, { SCENE_MEN, "GTG" }, { SCENE_GERUDOWAY, "HIDE" }, }; @@ -288,7 +288,7 @@ ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { case SCENE_HAKADANCH: result.y = 3; break; - case SCENE_GANON: + case SCENE_GANONTIKA: result.y = 2; break; case SCENE_MEN: @@ -608,7 +608,12 @@ std::vector GetDungeonItemsVector(std::vector