--[[ CraftJudge Operates the Crafting system. Functions: loadTextData() Desc: Loads all gamesheets needed and instantiates a CraftJudge. Params: None start(facility, requestsMode, material1, material2, material3, material4, material5, material6, material7, material8) Desc: Opens the Craft Start widget, with any preloaded materials. Widget has two modes; one for normal synthesis and another for local leve "requested items" mode. Params: * facility - The current facility id buff the player may have. * requestMode - If true, switches the UI to Requested Items mode otherwise it opens Normal Synthesis mode. * material1-8 - ItemID for each of the 8 material slots. If empty, they must be set to 0 or the client will crash. closeCraftStartWidget() Desc: Closes the Craft Start widget. Params: None selectRcp(itemId) Desc: Selects the recipe to be crafted. May be a legacy function but still required to properly initialize the UI. Requires start() to have been called. Params: * itemId - The itemID of the item to be crafted. confirmRcp(craftedItem, quantity, crystalItem1, crystalQuantity1, crystalQuantity1, crystalItem2, crystalQuantity2, recommendedSkill, recommendedFacility) Desc: Opens the confirmation window, detailing what is needed and the item that will be created. Requires a selectRcp() call first. Params: * craftedItem - The itemID of the item to be crafted. * quantity - Quantity of crafted items. * crystalItem1 - The first required crystal itemID for crafting. * crystalQuantity1 - Quantity of the first crystal. * crystalItem2 - The second required crystal itemID for crafting. * crystalQuantity2 - Quantity of the second crystal. * recommendedSkill - Which itemID to display under the "Recommended Skill" panel. * recommendedFacility - Which facility to display under the "Recommended Facility" panel. selectCraftQuest() Desc: Opens the journal to select the local leve that the player would like to do. Params: None askContinueLocalLeve(localLeveID, craftedItem, itemsCompleted, craftTotal, attempts) Desc: Opens the dialog to continue crafting for a local leve after an item was completed. Params: * localLeveID - The id of the current leve in progress. * craftedItem - The current crafted item id. * itemsCompleted - Number of items crafted so far. * craftTotal - Number of items to be crafted in total. * attempts - The number of attempts left. askRetryLocalleve(localLeveID, allowanceCount) Desc: Opens the dialog to retry the local leve (at the expense of an allowance) if the player had failed it. Params: * localLeveID - The failed level id. * allowanceCount - How many allowances the player has. openCraftProgressWidget(durability, quality, hqChance) Desc: Opens the crafting minigame, sets starting values. Params: * durability - Durability of the current item. * quality - Starting quality of the current item. * hqChance - Starting chance to get a HQ item. craftCommandUI(classID, hasWait, command1, command2, command3, command4, command5) Desc: Sets the available command list and waits for the player to select a command. Params: * classID - The current crafting class. Must be set properly to show the three synthesis commands. * hasWait - If true, adds the wait command. * command1-5 - Five possible crafting commands (crafting skills). craftTuningUI(command1, command2, command3, command4, command5, command6, command7, command8) Desc: Displays a full list of commands for the legacy "Tuning" phase that happens after crafting. Deprecated in 1.23b. Params: * command1-8 - The list of commands available. updateInfo(progress, durability, quality, tuningItem, tuningItemQuality, tuningItemQuantity, hqChance) Desc: Updates the progress UI components and text boxes. Params: * progress - The current crafting progress percentage. Value is from 0 to 100. * durability - The current durability of the crafted item. * quality - The current quality of the crafted item. * tuningItem - The crafted item to show in the Tuning UI. Nil if crafting. Deprecated in 1.23b. * tuningItemQuality - The quality of the item to show in the Tuning UI. Nil if crafting. Deprecated in 1.23b. * tuningItemQuantity - The amount of the item to show in the Tuning UI. Nil if crafting. Deprecated in 1.23b. * hqChance - The current chance of an HQ craft. closeCraftProgressWidget() Desc: Closes the crafting minigame widget. Params: None cfmQst() Desc: Quest confirmation window for when starting a crafting quest from the journal. Params: confirmLeve() Desc: Opens the summery page for the local leve. Params: * localLeveID - The quest id of the leve you are confirming. * difficulty - Changes the objective. * craftedItem? - * ? - * numSuccess - The number of successful crafts you did. * remainingMaterials - The number of materials you have left. * hasMaterials - Shows the in-progress panel of successes and attempts left. * ? - startRepair(craftMode, item, quality, durability, hasMateria, spiritbind) Desc: Opens the repair item widget. Params: * craftMode - Either 0 or 1. Anything else crashes. * item - ItemID of the item to be repaired. * quality - Quality of the item to be repaired. * durability - Durability of the item to be repaired. * hasMateria - Shows an icon if the item to be repaired has materia attached. * spiritbind - Spiritbind of the item to be repaired. askJoinMateria() displayRate() askJoinResult(isSuccess, item, itemQuality, materia, materiaNumber, isSpiritBound) Desc: Opens the result widget after materia melding is done. Params: * isSuccess - True if the meld was successful. * item - Item ID of the melded item. * quality - Quality of the melded item. * materia - Item ID of the materia being melded. * materiaNumber - Total count of materia on the item. * isSpiritBound - True if the item is spiritbound. Causes icon to appear. Notes: Class ID + Starting skill 29 CRP = 22550 30 BSM = 22556 31 ARM = 22562 32 GSM = 22568 33 LTW = 22574 34 WVR = 22580 35 ALC = 22586 36 CUL = 22592 Leve objectives/rewards are in passiveGL_craft. * Index 1: * Index 2: Recommended Class * Index 3: Issuing Authority * Index 7: Levequest Location * Index 8: Deliver Display Name * Starts at index 14. Four sections for the four difficulties. * Required Item, Amount, ?, Recommended Level, , Reward Item, Reward Amount, | --]] require ("global") local skillAnim = { [22553] = 0x10002000; [22554] = 0x10001000; [22555] = 0x10003000; [29531] = 0x10009002; } function onEventStarted(player, commandactor, triggerName, arg1, arg2, arg3, arg4, checkedActorId) local MENU_CANCEL, MENU_MAINHAND, MENU_OFFHAND, MENU_REQUEST = 0, 1, 2, 3; local MENU_RECENT, MENU_AWARDED, MENU_RECENT_DETAILED, MENU_AWARDED_DETAILED = 7, 8, 9, 10; local debugMessage = false; local craftStartWidgetOpen = false; local isRecipeRecentSent = false; local isRecipeAwardSent = false; local craftJudge = GetStaticActor("CraftJudge"); local recipeResolver = GetRecipeResolver(); local chosenOperation; local recipeMode; local chosenMaterials; local facilityId = 0; local isRequestedItemsMode = false; -- False = The default state. True = User picked a quest recipe/local leve local recentRecipes; local awardedRecipes; local currentCraftQuest = nil; -- Use this to store any chosen craft quest local currentCraftQuestGuildleve = nil; -- Use this to store any chosen local leve callClientFunction(player, "delegateCommand", craftJudge, "loadTextData", commandactor); player:ChangeState(30); while chosenOperation ~= 0 do if debugMessage then player:SendMessage(0x20, "", "[DEBUG] Menu ID: "..tostring(chosenOperation).." Recipe : "..tostring(recipeMode).." Quest : "..chosenQuest); end -- Operate the start crafting window... confusing shit if (craftStartWidgetOpen == false) then -- Shows the initial window local startMats = {0, 0, 0, 0, 0, 0, 0, 0}; if (isRequestedItemsMode == true) then -- If requested items, preload the quest recipe materials startMats = recipeResolver.RecipeToMatIdTable(currentCraftQuestGuildleve.getRecipe()); end chosenOperation, recipeMode = callClientFunction(player, "delegateCommand", craftJudge, "start", commandactor, facilityId, isRequestedItemsMode, unpack(startMats)); craftStartWidgetOpen = true; elseif ((chosenOperation == MENU_RECENT or chosenOperation == MENU_AWARDED) and recipeMode != 0) then local prepedMaterials; -- Recent Recipes/Awarded Recipes if (chosenOperation == MENU_RECENT) then prepedMaterials = recipeResolver.RecipeToMatIdTable(recentRecipes[recipeMode]); else prepedMaterials = recipeResolver.RecipeToMatIdTable(awardedRecipes[recipeMode]); end -- Causes the item info window to appear for recent/awarded recipes. Only happens if a recipe was chosen. chosenOperation, recipeMode = callClientFunction(player, "delegateCommand", craftJudge, "start", commandactor, -2, isRequestedItemsMode, unpack(prepedMaterials)); else -- Keep window going if the user "returned" to the starting point chosenOperation, recipeMode = callClientFunction(player, "delegateCommand", craftJudge, "start", commandactor, -1, isRequestedItemsMode); end -- Operation if chosenOperation == MENU_CANCEL then callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); elseif (chosenOperation == MENU_MAINHAND or chosenOperation == MENU_OFFHAND) then -- Recipe choosing loop while (true) do -- Choosing a recipe from the given materials local recipes = recipeResolver.GetRecipeFromMats(); local itemIds = recipeResolver.RecipesToItemIdTable(recipes); local chosenRecipeIndex = callClientFunction(player, "delegateCommand", craftJudge, "selectRcp", commandactor, unpack(itemIds)); -- Hit back on recipe list if (chosenRecipeIndex <= 0) then break end; chosenRecipe = recipes[chosenRecipeIndex-1]; if (chosenRecipe ~= nil) then -- Player confirms recipe local recipeConfirmed = callClientFunction(player, "delegateCommand", craftJudge, "confirmRcp", commandactor, chosenRecipe.resultItemID, chosenRecipe.resultQuantity, chosenRecipe.crystalId1, chosenRecipe.crystalQuantity1, chosenRecipe.crystalId2, chosenRecipe.crystalQuantity2, 0, 0); if recipeConfirmed then callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); isRecipeRecentSent = false; isRecipeAwardSent = false; currentlyCrafting = startCrafting(player, chosenOperation, chosenRecipe, isRequestedItemsMode, 80, 100, 50); break; end end end -- End of Recipe choosing loops elseif chosenOperation == MENU_REQUEST then -- Conditional button label based on isRequestedItemsMode callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); craftStartWidgetOpen = false; if isRequestedItemsMode == false then -- "Request Items" hit, close Start and open up the Quest select isRecipeRecentSent = false; isRecipeAwardSent = false; local quest = getCraftQuest(player, craftJudge, commandactor); if (quest ~= nil) then isRequestedItemsMode = true; if (quest.isCraftPassiveGuildleve()) then currentCraftQuestGuildleve = quest; else currentCraftQuest = quest; end end elseif isRequestedItemsMode == true then -- "Normal Synthesis" button hit isRequestedItemsMode = false; currentCraftQuestGuildleve = nil; currentCraftQuest = nil; end elseif chosenOperation == MENU_RECENT then -- "Recipes" button hit if isRecipeRecentSent == false then recentRecipes = player.GetRecentRecipes(); local itemIds = recipeResolver.RecipesToItemIdTable(recentRecipes); callClientFunction(player, "delegateCommand", craftJudge, "selectRcp", commandactor, unpack(itemIds)); -- Load up recipe list isRecipeRecentSent = true; end elseif chosenOperation == MENU_AWARDED then -- "Awarded Recipes" tab hit if isRecipeAwardSent == false then awardedRecipes = player.GetAwardedRecipes(); local itemIds = recipeResolver.RecipesToItemIdTable(awardedRecipes); callClientFunction(player, "delegateCommand", craftJudge, "selectRcp", commandactor, unpack(itemIds)); -- Load up Award list isRecipeAwardSent = true; end elseif ((chosenOperation == MENU_RECENT_DETAILED or chosenOperation == MENU_AWARDED_DETAILED) and recipeMode > 0) then -- Pop-up for an item's stats/craft mats on a recent recipe local chosenRecipe = chosenOperation == MENU_RECENT_DETAILED and recentRecipes[recipeMode-1] or recentRecipes[awardedMode-1]; local recipeConfirmed = callClientFunction(player, "delegateCommand", craftJudge, "confirmRcp", commandactor, chosenRecipe.resultItemID, chosenRecipe.resultQuantity, chosenRecipe.crystalId1, chosenRecipe.crystalQuantity1, chosenRecipe.crystalId2, chosenRecipe.crystalQuantity2, 0, 0); if (recipeConfirmed) then callClientFunction(player, "delegateCommand", craftJudge, "closeCraftStartWidget", commandactor); isRecipeRecentSent = false; isRecipeAwardSent = false; currentlyCrafting = startCrafting(player, chosenOperation, chosenRecipe, isRequestedItemsMode, 80, 100, 50); end else break; end end player:ResetMusic(); player:ChangeState(0); player:EndEvent(); end -- Handles the menus to pick a crafter quest or local leve quest that run separate widgets from the Start command. -- Returns whether a quest was selected, and what id the quest is. function getCraftQuest(player, craftJudge, commandactor); local questId = nil; while (true) do local questCommandId = callClientFunction(player, "delegateCommand", craftJudge, "selectCraftQuest", commandactor); if questCommandId then questId = questCommandId - 0xA0F00000; if isCraftQuest(questId) then local quest = player.GetQuest(questId); local confirm = callClientFunction(player, "delegateCommand", craftJudge, "cfmQst", commandactor, quest.getQuestId(), 20, 1, 1, 1, 0, 0, ""); if confirm == true then player:SendGameMessage(craftJudge, 21, 0x20); return quest; end elseif isLocalLeve(questId) then local difficulty = 0; local hasMaterials = 1; local quest = player.getQuestGuildleve(questId); if (quest ~= nil) then local confirm = callClientFunction(player, "delegateCommand", craftJudge, "confirmLeve", commandactor, quest.getQuestId(), quest.getCurrentDifficulty(), 0, quest.getNumberOfSuccesses(), quest.getRemainingMaterials(), quest.hasMaterials() and 1 or 0, -- Fucked up way of doing terneries on Lua 0 ); if (confirm == true) then return quest; end else return nil; -- Shouldn't happen unless db corrupted end else -- TEMP for now. Cannot find source for what happens if you confirm a non-craft quest. player:SendGameMessage(GetWorldMaster(), 40209, 0x20); end else return nil; end end end function isScenarioQuest(id) if (id >= 110001 and id <= 120026) then return true; else return false; end end function isCraftQuest(id) if (id >= 110300 and id <= 110505) then return true; else return false; end end function isLocalLeve(id) if (id >= 120001 and id <= 120452) then return true; else return false; end end -- No real logic in this function. Just smoke and mirrors to 'see' the minigame in action at the minimum level. function startCrafting(player, hand, recipe, quest, startDur, startQly, startHQ) local worldMaster = GetWorldMaster(); local itemId = recipe.resultItemID; local progress = 0; local attempts = 5; local craftedCount = 0; local craftTotal = 2; player:ChangeState(30+hand); -- Craft kneeling w/ appropriate tool out player:ChangeMusic(73); callClientFunction(player, "delegateCommand", craftJudge, "openCraftProgressWidget", commandactor, startDur, startQly, startHQ); while true do local progDiff = math.random(30,50); local duraDiff = math.random(1,3); local qltyDiff = math.random(0,2); if progress >= 100 then player:SendGameMessage(GetWorldMaster(), 40111, 0x20, player, itemId, 3, 8); -- "You create <#3 quantity> <#1 item> <#2 quality>." callClientFunction(player, "delegateCommand", craftJudge, "closeCraftProgressWidget", commandactor); if quest then continueLeve = callClientFunction(player, "delegateCommand", craftJudge, "askContinueLocalLeve", 120001, itemId, craftedCount, craftTotal, attempts); if continueLeve == true then progress = 0; callClientFunction(player, "delegateCommand", craftJudge, "openCraftProgressWidget", commandactor, startDur, startQly, startHQ); else break; end else break; end end choice = callClientFunction(player, "delegateCommand", craftJudge, "craftCommandUI", commandactor, 29, 2, 29530,29531,29532,29533,29534); --player:SendMessage(0x20, "", "[DEBUG] Command id selected: "..choice); if choice then if skillAnim[choice] then player:PlayAnimation(skillAnim[choice]); end wait(3); player:SendGameMessage(worldMaster, 40108, 0x20, choice,2); if choice ~= 29531 then progress = progress + progDiff; if progress >= 100 then progress = 100; end startDur = startDur - duraDiff; startQly = startQly + qltyDiff; player:SendGameMessage(worldMaster, 40102, 0x20, progDiff); player:SendGameMessage(worldMaster, 40103, 0x20, duraDiff); player:SendGameMessage(worldMaster, 40104, 0x20, qltyDiff); end --prg dur qly, ???, ???, ???, HQ callClientFunction(player, "delegateCommand", craftJudge, "updateInfo", commandactor, progress, startDur, startQly, nil, nil, nil, nil, nil); --testChoice = callClientFunction(player, "delegateCommand", craftJudge, "craftTuningUI", commandactor, 29501, 24233, 29501,29501, 24223, 29501,12008,12004); end end return -1; end