Moin,
duch eine Bitte melden Sie sich an, um diesen Link zu sehen. habe ich Lust gehabt ein neues System zu coden.
Danke an .edo für die Vorlage.
Wie funktioniert das Ganze?
Jedes mal wenn ein Gegenstand verbessert werden soll und das Verbessern fehlschlägt, werden dem Player "Schmiedesplitter", im Code Failstacks, gutgeschrieben.
Die Anzahl der Schmiedesplitter wird durch das Item-Level definiert.
Wenn ein Gegenstand mit einer Levelbegrenzung von 115 bei dem Verbesserungsvorgang nicht erfolgreich verbessert werden kann, werden dem Player 115 Schmiedesplitter gutgeschrieben.
Wenn der Player genug Schmiedesplitter gesammelt hat, dann wird auf Basis der Schmiedesplitter die Uppchance für das nächste Item verbessert.
100 Schmiedesplitter werden dabei in 1% zusätzliche Uppchance umgewandelt.
Da die Uppchancen alle in Integer (Ganzzahl) Werten berechnet werden, können die Schmiedesplitter erst dann verwendet werden, wenn mindestens 100 davon gesammelt wurden.
Das ganze funktioniert mit Schriftrollen und dem Schmied.
Wenn zum erfolgreichen Verbessern von Gegenständen nur ein Teil der gesammelten Schmiedesplitter benötigt werden, dann wird auch nur die Anzahl an Schmiedesplittern verwendet die benötigt werden.
Bitte melden Sie sich an, um diesen Anhang zu sehen.Bitte melden Sie sich an, um diesen Anhang zu sehen.Bitte melden Sie sich an, um diesen Anhang zu sehen.
Implementation
- typedef struct SPacketGCRefineInformaion
- {
- BYTE header;
- BYTE type;
- BYTE pos;
- DWORD src_vnum;
- DWORD result_vnum;
- BYTE material_count;
- int cost;
- int prob;
- TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
- #ifdef ENABLE_REFINE_FAILSTACK
- int failstacks;
- int failstacksPct;
- #endif
- } TPacketGCRefineInformation;
- //Add:
- #ifdef ENABLE_REFINE_FAILSTACK
- void DBManager::SetFailStacks(LPCHARACTER player, int failstacks)
- {
- char szQuery[1024];
- snprintf(szQuery, sizeof(szQuery), "UPDATE player SET failstacks = %d WHERE id = %u", failstacks, player->GetPlayerID());
- SQLMsg* pMsg = (m_sql_direct.DirectQuery(szQuery));
- if (!pMsg)
- {
- sys_err("Error updating failstacks for player %u.", player->GetPlayerID());
- delete pMsg;
- return;
- }
- }
- int DBManager::GetFailStacks(LPCHARACTER player)
- {
- char szQuery[1024];
- snprintf(szQuery, sizeof(szQuery), "SELECT failstacks FROM player WHERE id=%u", player->GetPlayerID());
- SQLMsg* pMsg = DBManager::instance().DirectQuery(szQuery);
- if (!pMsg)
- {
- sys_log(0, "cannot get failstacks for player %u.", player->GetPlayerID());
- delete pMsg;
- return 0;
- }
- if (pMsg->Get()->uiNumRows > 0)
- {
- MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
- int failstacks = 0;
- str_to_number(failstacks, row[0]);
- delete pMsg;
- return failstacks;
- }
- delete pMsg;
- return 0;
- }
- #endif
- //Search:
- bool RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell = -1);
- //Replace with:
- #ifdef ENABLE_REFINE_FAILSTACK
- bool RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell = -1, int failstacks = 0, int failstacksPct = 0);
- #else
- bool RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell = -1);
- #endif
- //Search in function bool CHARACTER::DoRefine(LPITEM item, bool bMoneyOnly) :
- // END_OF_REFINE_COST
- //Add above:
- #ifdef ENABLE_REFINE_FAILSTACK
- int usedFailStacks = 0;
- int ownedFailStacks = DBManager::Instance().GetFailStacks(this);
- //get a percentage from the fail stacks and increase the refine chance
- if ((prob < (ownedFailStacks / 100)) && (ownedFailStacks >= 100))
- {
- usedFailStacks = prob * 100;
- prob = 0;
- }
- else
- {
- if (ownedFailStacks >= 100)
- {
- usedFailStacks = ownedFailStacks;
- prob -= ownedFailStacks / 100;
- }
- else
- {
- usedFailStacks = 0;
- }
- }
- #endif
- //Modify the rest of the function like this -> Look for #ifdef ENABLE_REFINE_FAILSTACK :
- if (prob <= prt->prob)
- {
- LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_vnum, 1, 0, false);
- if (pkNewItem)
- {
- ITEM_MANAGER::CopyAllAttrTo(item, pkNewItem);
- LogManager::instance().ItemLog(this, pkNewItem, "REFINE SUCCESS", pkNewItem->GetName());
- BYTE bCell = item->GetCell();
- // DETAIL_REFINE_LOG
- NotifyRefineSuccess(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER");
- DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -cost);
- ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
- // END_OF_DETAIL_REFINE_LOG
- pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
- ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
- sys_log(0, "Refine Success %d", cost);
- pkNewItem->AttrLog();
- //PointChange(POINT_GOLD, -cost);
- sys_log(0, "PayPee %d", cost);
- PayRefineFee(cost);
- sys_log(0, "PayPee End %d", cost);
- #ifdef ENABLE_REFINE_FAILSTACK
- //Remove the used fail stacks
- DBManager::Instance().SetFailStacks(this, ownedFailStacks - usedFailStacks);
- #endif
- }
- else
- {
- // DETAIL_REFINE_LOG
- sys_err("cannot create item %u", result_vnum);
- NotifyRefineFail(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER");
- #ifdef ENABLE_REFINE_FAILSTACK
- //add as much Fail Stacks as the item level
- DBManager::Instance().SetFailStacks(this, ownedFailStacks + item->GetLevelLimit());
- #endif
- // END_OF_DETAIL_REFINE_LOG
- }
- }
- else
- {
- DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -cost);
- NotifyRefineFail(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER");
- item->AttrLog();
- ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE FAIL)");
- #ifdef ENABLE_REFINE_FAILSTACK
- //add as much Fail Stacks as the item level
- DBManager::Instance().SetFailStacks(this, ownedFailStacks + item->GetLevelLimit());
- #endif
- //PointChange(POINT_GOLD, -cost);
- PayRefineFee(cost);
- }
- return true;
- //Search in function bool CHARACTER::DoRefineWithScroll(LPITEM item) :
- pkItemScroll->SetCount(pkItemScroll->GetCount() - 1);
- //Add below:
- #ifdef ENABLE_REFINE_FAILSTACK
- int usedFailStacks = 0;
- int ownedFailStacks = DBManager::Instance().GetFailStacks(this);
- //get a percentage from the fail stacks and increase the refine chance
- if ((prob < (ownedFailStacks / 100)) && (ownedFailStacks >= 100))
- {
- usedFailStacks = prob * 100;
- prob = 0;
- }
- else
- {
- if (ownedFailStacks >= 100)
- {
- usedFailStacks = ownedFailStacks;
- prob -= ownedFailStacks / 100;
- }
- else
- {
- usedFailStacks = 0;
- }
- }
- #endif
- //Modify the rest of the function like this -> Look for #ifdef ENABLE_REFINE_FAILSTACK :
- if (prob <= success_prob)
- {
- LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_vnum, 1, 0, false);
- if (pkNewItem)
- {
- ITEM_MANAGER::CopyAllAttrTo(item, pkNewItem);
- LogManager::instance().ItemLog(this, pkNewItem, "REFINE SUCCESS", pkNewItem->GetName());
- BYTE bCell = item->GetCell();
- NotifyRefineSuccess(this, item, szRefineType);
- DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -prt->cost);
- ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
- pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
- ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
- pkNewItem->AttrLog();
- //PointChange(POINT_GOLD, -prt->cost);
- PayRefineFee(prt->cost);
- #ifdef ENABLE_REFINE_FAILSTACK
- //Remove the used fail stacks
- DBManager::Instance().SetFailStacks(this, ownedFailStacks - usedFailStacks);
- #endif
- }
- else
- {
- sys_err("cannot create item %u", result_vnum);
- NotifyRefineFail(this, item, szRefineType);
- #ifdef ENABLE_REFINE_FAILSTACK
- //add as much Fail Stacks as the item level
- DBManager::Instance().SetFailStacks(this, ownedFailStacks + item->GetLevelLimit());
- #endif
- }
- }
- else if (!bDestroyWhenFail && result_fail_vnum)
- {
- LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_fail_vnum, 1, 0, false);
- if (pkNewItem)
- {
- ITEM_MANAGER::CopyAllAttrTo(item, pkNewItem);
- LogManager::instance().ItemLog(this, pkNewItem, "REFINE FAIL", pkNewItem->GetName());
- BYTE bCell = item->GetCell();
- DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -prt->cost);
- NotifyRefineFail(this, item, szRefineType, -1);
- ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE FAIL)");
- pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
- ITEM_MANAGER::instance().FlushDelayedSave(pkNewItem);
- pkNewItem->AttrLog();
- //PointChange(POINT_GOLD, -prt->cost);
- PayRefineFee(prt->cost);
- #ifdef ENABLE_REFINE_FAILSTACK
- //add as much Fail Stacks as the item level
- DBManager::Instance().SetFailStacks(this, ownedFailStacks + item->GetLevelLimit());
- #endif
- }
- else
- {
- sys_err("cannot create item %u", result_fail_vnum);
- NotifyRefineFail(this, item, szRefineType);
- #ifdef ENABLE_REFINE_FAILSTACK
- //add as much Fail Stacks as the item level
- DBManager::Instance().SetFailStacks(this, ownedFailStacks + item->GetLevelLimit());
- #endif
- }
- }
- else
- {
- NotifyRefineFail(this, item, szRefineType);
- PayRefineFee(prt->cost);
- #ifdef ENABLE_REFINE_FAILSTACK
- //add as much Fail Stacks as the item level
- DBManager::Instance().SetFailStacks(this, ownedFailStacks + item->GetLevelLimit());
- #endif
- }
- //Search:
- bool CHARACTER::RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell)
- //Replace with:
- #ifdef ENABLE_REFINE_FAILSTACK
- bool CHARACTER::RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell, int failstacks, int failstacksPct)
- #else
- bool CHARACTER::RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell)
- #endif
- //Search in same function:
- GetDesc()->Packet(&p, sizeof(TPacketGCRefineInformation));
- //Add above:
- #ifdef ENABLE_REFINE_FAILSTACK
- p.failstacks = failstacks;
- p.failstacksPct = failstacksPct;
- #endif
- //Search in function bool CHARACTER::RefineItem(LPITEM pkItem, LPITEM pkTarget) :
- if (pkItem->GetSubType() == USE_TUNING)
- {
- //Add below:
- #ifdef ENABLE_REFINE_FAILSTACK
- int failstacks = DBManager::Instance().GetFailStacks(this);
- #endif
- //Replace each occurance in the same function:
- RefineInformation(pkTarget->GetCell(), REFINE_TYPE_MUSIN, pkItem->GetCell());
- //With:
- #ifdef ENABLE_REFINE_FAILSTACK
- RefineInformation(pkTarget->GetCell(), REFINE_TYPE_MUSIN, pkItem->GetCell(), failstacks, failstacks / 100);
- #else
- RefineInformation(pkTarget->GetCell(), REFINE_TYPE_MUSIN, pkItem->GetCell());
- #endif
- //Search for function bool CPythonNetworkStream::RecvRefineInformationPacket()
- //Replace:
- TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table;
- PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
- "OpenRefineDialog",
- Py_BuildValue("(iiii)",
- kRefineInfoPacket.pos,
- kRefineInfoPacket.refine_table.result_vnum,
- rkRefineTable.cost,
- rkRefineTable.prob));
- //with:
- #ifdef ENABLE_REFINE_FAILSTACK
- TRefineTable& rkRefineTable = kRefineInfoPacket.refine_table;
- PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
- "OpenRefineDialog",
- Py_BuildValue("(iiiiii)",
- kRefineInfoPacket.pos,
- kRefineInfoPacket.refine_table.result_vnum,
- rkRefineTable.cost,
- rkRefineTable.prob,
- rkRefineTable.failstacks,
- rkRefineTable.failstacksPct));
- #else
- TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table;
- PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
- "OpenRefineDialog",
- Py_BuildValue("(iiii)",
- kRefineInfoPacket.pos,
- kRefineInfoPacket.refine_table.result_vnum,
- rkRefineTable.cost,
- rkRefineTable.prob));
- #endif
- //Search for function bool CPythonNetworkStream::RecvRefineInformationPacketNew()
- //Replace:
- TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table;
- PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
- "OpenRefineDialog",
- Py_BuildValue("(iiiii)",
- kRefineInfoPacket.pos,
- kRefineInfoPacket.refine_table.result_vnum,
- rkRefineTable.cost,
- rkRefineTable.prob,
- kRefineInfoPacket.type)
- );
- //With:
- #ifdef ENABLE_REFINE_FAILSTACK
- TRefineTable& rkRefineTable = kRefineInfoPacket.refine_table;
- PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
- "OpenRefineDialog",
- Py_BuildValue("(iiiiiii)",
- kRefineInfoPacket.pos,
- kRefineInfoPacket.refine_table.result_vnum,
- rkRefineTable.cost,
- rkRefineTable.prob,
- rkRefineTable.failstacks,
- rkRefineTable.failstacksPct,
- kRefineInfoPacket.type)
- );
- #else
- TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table;
- PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
- "OpenRefineDialog",
- Py_BuildValue("(iiiii)",
- kRefineInfoPacket.pos,
- kRefineInfoPacket.refine_table.result_vnum,
- rkRefineTable.cost,
- rkRefineTable.prob,
- kRefineInfoPacket.type)
- );
- #endif
- //Search:
- def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type=0):
- self.interface.OpenRefineDialog(targetItemPos, nextGradeItemVnum, cost, prob, type)
- //Replace:
- if app.ENABLE_REFINE_FAILSTACK:
- def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, failstacks, failstacksPct, type=0):
- self.interface.OpenRefineDialog(targetItemPos, nextGradeItemVnum, cost, prob, failstacks, failstacksPct, type)
- else:
- def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type=0):
- self.interface.OpenRefineDialog(targetItemPos, nextGradeItemVnum, cost, prob, type)
- //Search:
- def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type):
- self.dlgRefineNew.Open(targetItemPos, nextGradeItemVnum, cost, prob, type)
- //Replace
- if app.ENABLE_REFINE_FAILSTACK:
- def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, failstacks, failstacksPct, type):
- self.dlgRefineNew.Open(targetItemPos, nextGradeItemVnum, cost, prob, failstacks, failstacksPct, type)
- else:
- def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type):
- self.dlgRefineNew.Open(targetItemPos, nextGradeItemVnum, cost, prob, type)
- //All changes in class RefineDialogNew !!!
- //Search:
- def __Initialize(self):
- //Add to the end:
- if app.ENABLE_REFINE_FAILSTACK:
- self.failstacks = 0
- self.failstacksPct = 0
- //Search:
- self.costText = self.GetChild("Cost")
- //Add after:
- if app.ENABLE_REFINE_FAILSTACK:
- self.failstackText = self.GetChild("Failstack")
- //Search:
- def Destroy(self):
- //Add to the end:
- if app.ENABLE_REFINE_FAILSTACK:
- self.failstackText = 0
- //If you use REFINE_RENEWAL:
- //Search:
- def __InitializeOpen(self):
- //Add to the end:
- if app.ENABLE_REFINE_FAILSTACK:
- self.failstacks = 0
- self.failstacksPct = 0
- //Replace the whole function def Open(self, targetItemPos, nextGradeItemVnum, cost, prob, type): with this:
- // !!! TAKE CARE OF app.ENABLE_REFINE_RENEWAL: IF YOU DONT USE THIS SYSTEM REMOVE ALL REFERENCES !!!
- if app.ENABLE_REFINE_FAILSTACK:
- def Open(self, targetItemPos, nextGradeItemVnum, cost, prob, failstacks, failstacksPct, type):
- if FALSE == self.isLoaded:
- self.__LoadScript()
- if app.ENABLE_REFINE_RENEWAL:
- self.__InitializeOpen()
- else:
- self.__Initialize()
- self.targetItemPos = targetItemPos
- self.vnum = nextGradeItemVnum
- self.cost = cost
- self.percentage = prob
- self.type = type
- self.failstacks = failstacks
- self.failstacksPct = failstacksPct
- self.probText.SetText(localeInfo.REFINE_SUCCESS_PROBALITY_FAILSTACK % (self.percentage, self.failstacksPct))
- self.costText.SetText(localeInfo.REFINE_COST % (self.cost))
- self.failstackText.SetText(localeInfo.REFINE_FAILSTACK % (self.failstacks, self.failstacksPct))
- self.toolTip.ClearToolTip()
- metinSlot = []
- for i in xrange(player.METIN_SOCKET_MAX_NUM):
- metinSlot.append(player.GetItemMetinSocket(targetItemPos, i))
- attrSlot = []
- for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
- attrSlot.append(player.GetItemAttribute(targetItemPos, i))
- self.toolTip.AddRefineItemData(nextGradeItemVnum, metinSlot, attrSlot)
- item.SelectItem(nextGradeItemVnum)
- self.itemImage.LoadImage(item.GetIconImageFileName())
- xSlotCount, ySlotCount = item.GetItemSize()
- for slot in self.slotList:
- slot.Hide()
- for i in xrange(min(3, ySlotCount)):
- self.slotList[i].SetPosition(-35, i*32 - (ySlotCount-1)*16)
- self.slotList[i].Show()
- self.dialogHeight = self.toolTip.GetHeight() + 46
- self.UpdateDialog()
- self.SetTop()
- self.Show()
- else:
- def Open(self, targetItemPos, nextGradeItemVnum, cost, prob, type):
- if FALSE == self.isLoaded:
- self.__LoadScript()
- if app.ENABLE_REFINE_RENEWAL:
- self.__InitializeOpen()
- else:
- self.__Initialize()
- self.targetItemPos = targetItemPos
- self.vnum = nextGradeItemVnum
- self.cost = cost
- self.percentage = prob
- self.type = type
- self.probText.SetText(localeInfo.REFINE_SUCCESS_PROBALITY % (self.percentage))
- self.costText.SetText(localeInfo.REFINE_COST % (self.cost))
- self.toolTip.ClearToolTip()
- metinSlot = []
- for i in xrange(player.METIN_SOCKET_MAX_NUM):
- metinSlot.append(player.GetItemMetinSocket(targetItemPos, i))
- attrSlot = []
- for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
- attrSlot.append(player.GetItemAttribute(targetItemPos, i))
- self.toolTip.AddRefineItemData(nextGradeItemVnum, metinSlot, attrSlot)
- item.SelectItem(nextGradeItemVnum)
- self.itemImage.LoadImage(item.GetIconImageFileName())
- xSlotCount, ySlotCount = item.GetItemSize()
- for slot in self.slotList:
- slot.Hide()
- for i in xrange(min(3, ySlotCount)):
- self.slotList[i].SetPosition(-35, i*32 - (ySlotCount-1)*16)
- self.slotList[i].Show()
- self.dialogHeight = self.toolTip.GetHeight() + 46
- self.UpdateDialog()
- self.SetTop()
- self.Show()
- import uiScriptLocale
- window = {
- "name" : "RefineDialog",
- "style" : ("movable", "float",),
- "x" : SCREEN_WIDTH - 400,
- "y" : 70 * 800 / SCREEN_HEIGHT,
- "width" : 0,
- "height" : 0,
- "children" :
- (
- {
- "name" : "Board",
- "type" : "board",
- "style" : ("attach",),
- "x" : 0,
- "y" : 0,
- "width" : 0,
- "height" : 0,
- "children" :
- (
- {
- "name" : "TitleBar",
- "type" : "titlebar",
- "style" : ("attach",),
- "x" : 8,
- "y" : 8,
- "width" : 0,
- "color" : "red",
- "children" :
- (
- {
- "name" : "TitleName",
- "type" : "text",
- "text" : uiScriptLocale.REFINE_TTILE,
- "horizontal_align" : "center",
- "text_horizontal_align" : "center",
- "x" : 0,
- "y" : 3,
- },
- ),
- },
- {
- "name" : "SuccessPercentage",
- "type" : "text",
- "text" : uiScriptLocale.REFINE_INFO,
- "horizontal_align" : "center",
- "vertical_align" : "bottom",
- "text_horizontal_align" : "center",
- "x" : 0,
- "y" : 86, #70
- },
- {
- "name" : "Cost",
- "type" : "text",
- "text" : uiScriptLocale.REFINE_COST,
- "horizontal_align" : "center",
- "vertical_align" : "bottom",
- "text_horizontal_align" : "center",
- "x" : 0,
- "y" : 70, #54
- },
- {
- "name" : "Failstack",
- "type" : "text",
- "text" : uiScriptLocale.REFINE_FAILSTACK,
- "horizontal_align" : "center",
- "vertical_align" : "bottom",
- "text_horizontal_align" : "center",
- "x" : 0,
- "y" : 54, #38
- },
- {
- "name" : "AcceptButton",
- "type" : "button",
- "x" : -35,
- "y" : 35,
- "text" : uiScriptLocale.OK,
- "horizontal_align" : "center",
- "vertical_align" : "bottom",
- "default_image" : "d:/ymir work/ui/public/Middle_Button_01.sub",
- "over_image" : "d:/ymir work/ui/public/Middle_Button_02.sub",
- "down_image" : "d:/ymir work/ui/public/Middle_Button_03.sub",
- },
- {
- "name" : "CancelButton",
- "type" : "button",
- "x" : 35,
- "y" : 35,
- "text" : uiScriptLocale.CANCEL,
- "horizontal_align" : "center",
- "vertical_align" : "bottom",
- "default_image" : "d:/ymir work/ui/public/Middle_Button_01.sub",
- "over_image" : "d:/ymir work/ui/public/Middle_Button_02.sub",
- "down_image" : "d:/ymir work/ui/public/Middle_Button_03.sub",
- },
- ),
- },
- ),
- }