/* 文件名:FatalismStone.nut 路径:Project/FatalismStone/FatalismStone.nut 创建日期:2025-06-18 11:00 文件用途:FatalismStone */ //魂石list FatalismStoneLst <- null; FatalismStoneConfig <- null; //魂石Img主体 FatalismStone_StoneImg <- {}; FatalismStone_StoneImg["icon_Frame"] <- Rindro_Image("interface2/rindro_reward.img"); FatalismStone_StoneImg["fatalism_stone_progressbar"] <- Rindro_Image("hud/fatalism_stone_progressbar.img"); class FatalismStoneC extends LenheartNewUI_Windows { //调试模式 // DeBugMode = true; //不是窗口 // NoWindow = true; //是否可见 // Visible = false; //Img Img = null; //总格子数 GridCount = 77; //总穿戴数 WearCount = 6; //功能标题 FunctionTitle = null; //功能页面 FunctionPage = 0; //Ani任务队列 AniQueue = null; //背包数据 BackPackData = null; //背包页面 BackpackPage = 0; //背包页面Tabbars BackpackPageTabbars = null; //页面魂石集合 PageFatalismStoneLst = null; //穿戴魂石集合 WearFatalismStoneLst = null; //穿戴页面坐标数组 WearPagePos = [131, 140, 32, 180, 234, 180, 32, 272, 234, 272, 131, 413]; //洗练对象 WashStone = null; //查询魂石背包数据 function QueryFatalismStoneBackpack() { SendPackEx({ op = 21000001, }) } constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { Childrens = []; FunctionTitle = []; BackpackPageTabbars = []; //注册控件 RegisterWidget(); LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); InitImg(); //初始化魂石列表 InitFatalismStoneLst(); //背包数据回包 RegisterHexPack(21000002, function(Pack) { local Data = []; local BackPackSize = Pack.GetInt(); local BackPackDataBuffer = Pack.GetStream(BackPackSize); Data.append(BackPackDataBuffer); local WearSize = Pack.GetInt(); local WearDataBuffer = Pack.GetStream(WearSize); Data.append(WearDataBuffer); BackPackData = FatalismStone_BackPack(); BackPackData.Deserialize(Data); InitPageFatalismStone(); }.bindenv(this)); //请求魂石数据 QueryFatalismStoneBackpack(); } function RegisterWidget() { //关闭按钮 local CloseButton = LenheartNewUI_BaseButton(738, 2, 11, 12, "interface/lenheartwindowcommon.img", 276); CloseButton.OnClick = function() { this.Visible = false; }.bindenv(this); Childrens.append(CloseButton); local FuncTabbar1 = LenheartNewUI_TabbarsText(302, 27, "洗练"); FuncTabbar1.State = 1; AddChild(FuncTabbar1); FuncTabbar1.OnClick = function() { }.bindenv(this); FunctionTitle.append(FuncTabbar1); local FuncTabbar2 = LenheartNewUI_TabbarsText(364, 27, "合成"); AddChild(FuncTabbar2); FuncTabbar2.OnClick = function() { }.bindenv(this); FunctionTitle.append(FuncTabbar2); local FuncTabbar3 = LenheartNewUI_TabbarsText(426, 27, "分解"); AddChild(FuncTabbar3); FuncTabbar3.OnClick = function() { }.bindenv(this); FunctionTitle.append(FuncTabbar3); local FuncTabbar4 = LenheartNewUI_TabbarsText(488, 27, "注魂"); AddChild(FuncTabbar4); FuncTabbar4.OnClick = function() { }.bindenv(this); FunctionTitle.append(FuncTabbar4); local Tabbars3 = LenheartNewUI_TabbarsText(302, 235, "天魂石"); Tabbars3.SetTextOffset(13, 4); Tabbars3.State = 1; AddChild(Tabbars3); Tabbars3.OnClickEx = function(Button) { foreach(button in BackpackPageTabbars) { button.State = 0; } Button.State = 1; BackpackPage = 0; InitPageFatalismStone(); }.bindenv(this); BackpackPageTabbars.append(Tabbars3); local Tabbars4 = LenheartNewUI_TabbarsText(364, 235, "人魂石"); Tabbars4.SetTextOffset(13, 4); AddChild(Tabbars4); Tabbars4.OnClickEx = function(Button) { foreach(button in BackpackPageTabbars) { button.State = 0; } Button.State = 1; BackpackPage = 1; InitPageFatalismStone(); }.bindenv(this); BackpackPageTabbars.append(Tabbars4); local Tabbars5 = LenheartNewUI_TabbarsText(426, 235, "地魂石"); Tabbars5.SetTextOffset(13, 4); AddChild(Tabbars5); Tabbars5.OnClickEx = function(Button) { foreach(button in BackpackPageTabbars) { button.State = 0; } Button.State = 1; BackpackPage = 2; InitPageFatalismStone(); }.bindenv(this); BackpackPageTabbars.append(Tabbars5); local WashButton = LenheartNewUI_ButtonText(483, 182, 24, "洗练"); WashButton.OnClickSound = "ICON_QUICK_SET"; WashButton.SetTextOffset(9, 1); WashButton.OnClick = function() { if (FunctionPage == 0 && WashStone) { SendPackEx({ op = 21000005, uuid = WashStone.Uuid, rarity = WashStone.Info["rarity"], }); AniQueue.AddQuest("洗练特效动画", function(Name, Time) { local AniPath = "fatalismstone/animation/eff1.ani"; local Ani = DrawAniEx(X + 440, Y + 32, AniPath, "魂石洗练特效"); if (sq_GetAnimationFrameIndex(Ani) == 15) { sq_Rewind(Ani); AniQueue.RemoveQuest(Name); } }.bindenv(this)); R_Utils.PlaySound("BUTTON_06"); } }.bindenv(this); WashButton.SetCallBackFunc(function(Btn) { if (FunctionPage != 0) Btn.Visible = false; else Btn.Visible = true; }.bindenv(this)) AddChild(WashButton); } //初始化背包 function InitPageFatalismStone() { if (!BackPackData) return; //设置需要渲染的当前背包页面 PageFatalismStoneLst = BackPackData.GetList(BackpackPage); WearFatalismStoneLst = BackPackData.GetList(3); } //绘制主界面 function DrawMain(obj) { Img["main"].DrawPng(0, X, Y); L_sq_DrawCode("宿命魂石", X + 362, Y + 3, sq_RGBA(221, 197, 147, 250), 1, 1); //绘制自身人物 local charAni = sq_GetCNRDObjectToSQRCharacter(obj).sq_GetRestAni(); sq_AnimationProc(charAni); sq_drawCurrentFrame(charAni, X + 153, Y + 370, false); //绘制右侧背景 L_sq_DrawWindow(X + 300, Y + 44, 420, 160, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); //上背景框 L_sq_DrawWindow(X + 300, Y + 253, 420, 220, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); //下背景框 Img["main"].DrawPng(1, X + 309, Y + 259); //洗练页面 if (FunctionPage == 0) { //绘制洗练槽 Img["main"].DrawPng(2, X + 500, Y + 90); if (WashStone) { local NowCultivationDegree = "当前魂石洗练度: " + WashStone.Info.cultivationDegree.tostring(); local NeedStkStr = FatalismStoneConfig["wash_cost"][WashStone.Info["rarity"]] + "个"; L_sq_DrawCode("当前魂石洗练度: ", X + 471, Y + 140, sq_RGBA(174, 174, 174, 250), 1, 1); L_sq_DrawCode("洗练所需魂屑: ", X + 473, Y + 160, sq_RGBA(174, 174, 174, 250), 1, 1); L_sq_DrawCode(WashStone.Info.cultivationDegree.tostring() + "%", X + 560, Y + 140, sq_RGBA(104, 237, 161, 250), 1, 1); L_sq_DrawCode(NeedStkStr, X + 552, Y + 160, sq_RGBA(104, 237, 161, 250), 1, 1); WashStone.Show(obj, X + 505, Y + 95); } } } function Show(obj) { DrawMain(obj); LenheartNewUI_Windows.Show(obj); //绘制魂石 //背包中的魂石 if (PageFatalismStoneLst) { foreach(Pos, Stone in PageFatalismStoneLst) { local XPos = 310 + (Pos % 11 * 39); local YPos = 260 + (Pos / 11 * 35); if (Stone) Stone.Show(obj, X + XPos, Y + YPos); } } //穿戴的魂石 if (WearFatalismStoneLst) { foreach(Pos, Stone in WearFatalismStoneLst) { local XPos = WearPagePos[Pos * 2]; local YPos = WearPagePos[Pos * 2 + 1]; XPos += 5; YPos += 5; if (Stone) Stone.Show(obj, X + XPos, Y + YPos); } } AniQueue.Run(); } function TopShow(obj) { LenheartNewUI_Windows.TopShow(obj); //还没有初始化数据的时候直接返回 if (!PageFatalismStoneLst) return; local MousePos_X = IMouse.GetXPos(); local MousePos_Y = IMouse.GetYPos(); //魂石的悬停绘制 foreach(Pos, Stone in PageFatalismStoneLst) { local XPos = 310 + (Pos % 11 * 39); local YPos = 260 + (Pos / 11 * 35); if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + XPos, Y + YPos, 31, 31)) { //绘制悬停框 L_sq_SetDrawImgModel(2, 0); Rindro_Image_GlobalMap["lenheartui"].DrawPng(353, X + XPos + 1, Y + YPos + 1); L_sq_ReleaseDrawImgModel(); if (Stone && !DragObj) Stone.HoverShow(X + XPos + 31, Y + YPos); } } //魂石穿戴的悬停绘制 if (WearFatalismStoneLst) { foreach(Pos, Stone in WearFatalismStoneLst) { local XPos = WearPagePos[Pos * 2]; local YPos = WearPagePos[Pos * 2 + 1]; XPos += 5; YPos += 5; if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + XPos, Y + YPos, 31, 31)) { //绘制悬停框 L_sq_SetDrawImgModel(2, 0); Rindro_Image_GlobalMap["lenheartui"].DrawPng(353, X + XPos + 1, Y + YPos + 1); L_sq_ReleaseDrawImgModel(); if (Stone && !DragObj) Stone.HoverShow(X + XPos + 31, Y + YPos); } } } //绘制拖拽的魂石 if (DragObj) { DragObj.Show(obj, IMouse.GetXPos() - 15, IMouse.GetYPos() - 15); } } //当前拖拽的物品对象 DragObj = null; DragOldPos = null; DragType = null; //鼠标左键按下回调 function OnMouseLbDown(MousePos_X, MousePos_Y) { LenheartNewUI_BaseWindow.OnMouseLbDown(MousePos_X, MousePos_Y); if (!PageFatalismStoneLst) return; foreach(Pos, Stone in PageFatalismStoneLst) { local XPos = 310 + (Pos % 11 * 39); local YPos = 260 + (Pos / 11 * 35); if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + XPos, Y + YPos, 34, 34)) { if (Stone && Stone.isSuccess) { DragObj = Stone; PageFatalismStoneLst[Pos] = null; DragOldPos = Pos; DragType = 1; //背包中的拖拽 } } } if (WearFatalismStoneLst) { foreach(Pos, Stone in WearFatalismStoneLst) { local XPos = WearPagePos[Pos * 2]; local YPos = WearPagePos[Pos * 2 + 1]; XPos += 5; YPos += 5; if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + XPos, Y + YPos, 34, 34)) { if (Stone) { DragObj = Stone; WearFatalismStoneLst[Pos] = null; DragOldPos = Pos + (GridCount * 3); DragType = 0; //身上的拖拽 } } } } } //鼠标左键抬起回调 function OnMouseLbUp(MousePos_X, MousePos_Y) { LenheartNewUI_BaseWindow.OnMouseLbUp(MousePos_X, MousePos_Y); if (PageFatalismStoneLst) { foreach(Pos, Stone in PageFatalismStoneLst) { local XPos = 310 + (Pos % 11 * 39); local YPos = 260 + (Pos / 11 * 35); if (DragObj) { if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + XPos, Y + YPos, 34, 34)) { StoneMoveLogic(Pos, Stone); } } } } if (WearFatalismStoneLst) { foreach(Pos, Stone in WearFatalismStoneLst) { local XPos = WearPagePos[Pos * 2]; local YPos = WearPagePos[Pos * 2 + 1]; XPos += 5; YPos += 5; if (DragObj) { if (sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + XPos, Y + YPos, 34, 34)) { StoneMoveLogic((GridCount * 3) + Pos, Stone); } } } } //洗练的区域 if (FunctionPage == 0 && sq_IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X + 500, Y + 90, 42, 42)) { if (DragObj) { WashStone = DragObj; } } if (DragObj) { //播放移动声音 R_Utils.PlaySound(DragObj.Info["move wav"]); //放回原位 if (DragType == 1) PageFatalismStoneLst[DragOldPos] = DragObj; else if (DragType == 0) WearFatalismStoneLst[DragOldPos - (GridCount * 3)] = DragObj; DragObj = null; } } function StoneMoveLogic(Pos, Stone) { local OldEType = DragObj.Stone_Type; //老装备类型 local NewEType; //新装备类型 //如果新位置有魂石 获取到新的穿戴类型 if (Stone) NewEType = Stone.Stone_Type; else { //这是往身上拖 if (Pos >= GridCount * 3) { local RealPos = Pos - (GridCount * 3); if (RealPos == 0) NewEType = 0; if (RealPos >= 1 && RealPos <= 4) NewEType = 1; if (RealPos == 5) NewEType = 2; } //这是往背包拖 else { NewEType = BackpackPage; } } //如果两个类型相同则进行交换 相同位置也不发包 if (OldEType == NewEType && DragOldPos != Pos) { //老装备的页面位置 SendPackEx({ op = 21000003, oldtype = DragType == 1 ? BackpackPage : 3, oldpos = DragType == 1 ? DragOldPos : DragOldPos - (GridCount * 3), newtype = Pos >= (GridCount * 3) ? 3 : BackpackPage, newpos = Pos >= (GridCount * 3) ? Pos - (GridCount * 3) : Pos }) QueryFatalismStoneBackpack(); } } //计算全身属性 function StatisticalAttribute() { local AttributeTable = {}; local WearStoneList = BackPackData.GetList(3); for (local i = 0; i< WearStoneList.len(); i++) { local StoneObj = WearStoneList[i]; if (StoneObj) { local Att = StoneObj.GetAttribute(); if (Att) { foreach(key, value in Att) { local RealValue = value; if (typeof RealValue == "array") RealValue = RealValue[0]; if (!AttributeTable.rawin(key)) AttributeTable.rawset(key, value); else AttributeTable.rawset(key, AttributeTable.rawget(key) + value); } } } } //记录最新属性数据 if ("LenheartAttributesTable" in getroottable()) { local T = getroottable()["LenheartAttributesTable"]; T.rawset("LenheartCollectFatalismStoneAb", AttributeTable); } else { local T = {}; T.rawset("LenheartCollectFatalismStoneAb", AttributeTable); getroottable().rawset("LenheartAttributesTable", T); } } //逻辑入口 function Proc(obj) { LenheartNewUI_Windows.SyncPos(X, Y); } //初始化PVF魂石列表 function InitFatalismStoneLst() { FatalismStoneLst = {}; Rindro_Script.GetFileData("fatalismstone/fatalismstone.lst", function(DataTable, Data) { while (!Data.Eof()) { local Id = Data.Get(); local Path = Data.Get(); FatalismStoneLst.rawset(Id, Path); } }); FatalismStoneConfig = Rindro_Script.GetFileData("fatalismstone/fatalismstone.etc", function(DataTable, Data) { while (!Data.Eof()) { local Str = Data.Get(); if (Str == "[wash item]") { DataTable.wash_item <- Data.Get(); } else if (Str == "[wash cost]") { DataTable.wash_cost <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()]; } } }); } function InitImg() { Img = {}; Img["main"] <- Rindro_Image("hud/fatalism_stone.img"); AniQueue = QuestQueue(); } function OpenCallBack() { Visible = true; QueryFatalismStoneBackpack(); WashStone = null; } } L_Windows_List <- []; getroottable().rawdelete("LenheartPluginsInitFlag"); getroottable().rawdelete("EventList_Obj") getroottable().rawdelete("FatalismStone_Obj"); function Lenheart_FatalismStone_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("FatalismStone_Obj")) { RootTab.rawset("FatalismStone_Obj", true); local Win = LenheartNewUI_CreateWindow(FatalismStoneC, "宿命魂石窗口", ((getroottable().Rindro_Scr_Width - 753) / 2).tointeger(), 35, 753, 518, 20); EventList_Obj.AddEvent("宿命魂石", 280, Win, "interface2/hud/information_button/information_button_cn.img"); } } getroottable()["LenheartFuncTab"].rawset("FatalismStoneFuncN", Lenheart_FatalismStone_Fun);