diff --git a/Base/CallBack/DrawMain.nut b/Base/CallBack/DrawMain.nut index 33e5d40..7d057c1 100644 --- a/Base/CallBack/DrawMain.nut +++ b/Base/CallBack/DrawMain.nut @@ -89,12 +89,13 @@ function L_drawMainCustomUI_All() { // Rindro_BaseToolClass.DrawNineBox(0, 0, 200, 200, "interface/lenheartwindowcommon.img", 213); + // print(sq_GetObjectId(obj)) + // print(Clock()); // Rindro_Image_GlobalMap["interface/newstyle/windows/popup/popup.img"].DrawExPng(138, 205, 0, 0, sq_RGBA(255, 255, 255, 250), 13.0, 13.0); } - // for (local i = 0; i < 42; i++) { // local Value = MemoryTool.DecodeMemoryData(0x394e8c00+0x1050 + (i * 4)); // if(Value == 151)print("Value :" + i * 4); @@ -139,6 +140,39 @@ function L_drawMainCustomUI_All() { +// function drawAppend_VirtualCharacter(a, b, c, d, e, f) { +// local obj = sq_GetMyMasterCharacter(); +// // print(Clock()); +// // Sout("a: %L",a); +// // Sout("b: %L",b); +// // Sout("c: %L",c); +// // Sout("d: %L",d); +// // Sout("e: %L",e); +// // Sout("f: %L",f); +// // print(a); +// // print(b); +// // print(c); +// // print(d); +// // print(e); +// // print(f); + +// // print(c); +// // print(d); +// // L_sq_DrawImg("newtitle/nangua.img", 0, c - 132, d - 360); +// // Rindro_BaseToolClass.DrawAniEx(c - 140, d, "etc/rindro/newtitle/ani/chn_2021_chivarly_system3/chivalry_s3_bottom_00.ani"); +// Rindro_BaseToolClass.DrawAniEx(c, d, "etc/rindro/newtitle/ani/jolin/180607_title_jolin_tsai_normal.ani"); +// // Rindro_BaseToolClass.DrawAniEx(c, d, "etc/rindro/newtitle/ani/jolin/180607_title_jolin_tsai_dodge.ani"); +// // if (!e) { +// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3/Chivalry_S3_Bottom_00.ani", c, d, "Server_AuctionSystemTimeP22"); +// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3_2/Chivalry_S3_Text.ani", c, d, "Server_AuctionSystemTimeP"); +// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3/Chivalry_S3_Text.ani", c, d - 50, "Server_AuctionSystemTimeP2"); +// // BasicsDrawTool.T_DrawDynamicAni(obj, "Character/Common/Animation/Aura/chn_2021_chivarly_system3_3/Chivalry_S3_Text.ani", c, d - 100, "Server_AuctionSystemTimeP3"); +// // } +// } + + + + // local asos = sq_CreateAICharacter(900); diff --git a/Base/UI/Lenheart_UI_Class.nut b/Base/UI/Lenheart_UI_Class.nut index cf79f59..8fe2f73 100644 --- a/Base/UI/Lenheart_UI_Class.nut +++ b/Base/UI/Lenheart_UI_Class.nut @@ -1094,7 +1094,8 @@ class LenheartNewUI_BaseInput extends LenheartNewUI_CommonUi { } function SetStr(Value) { - L_sq_SetInputBoxStr(InputController, Value); + str = Value; + // L_sq_SetInputBoxStr(InputController, Value); } } diff --git a/Base/_Tool/BaseTool_Class.nut b/Base/_Tool/BaseTool_Class.nut index 4c7a060..6daaf79 100644 --- a/Base/_Tool/BaseTool_Class.nut +++ b/Base/_Tool/BaseTool_Class.nut @@ -188,7 +188,29 @@ class Rindro_BaseToolClass { return ani; } - + //高级绘制文字(带换行) + function L_sq_DrawCode_ExRN(str, x, y, rgba, mb, jc) { + local strarr = []; + if (str.find("\\r\\n") == null) { + L_sq_DrawCode(str, x, y, rgba, mb, jc); + } else { + local Bpos = 0; + while (true) { + local Npos = str.find("\\r\\n", Bpos); + if (!Npos) { + local strbuff = str.slice(Bpos, str.len()); + strarr.append(strbuff); + break; + } + local strbuff = str.slice(Bpos, Npos); + strarr.append(strbuff); + Bpos = Npos + 4; + } + for (local z = 0; z< strarr.len(); z++) { + L_sq_DrawCode(strarr[z], x, y + (z * 14), rgba, mb, jc); + } + } + } //初始化根表成员 function InitClass(Name) { @@ -294,21 +316,28 @@ class Rindro_BaseToolClass { function GetRarityColor(rarity) { switch (rarity) { case 0: - return sq_RGBA(255, 255, 255, 255); + return 0xFFFFFFFF; case 1: - return sq_RGBA(104, 213, 237, 255); + return 0xFFEDD568; case 2: - return sq_RGBA(179, 107, 254, 255); + return 0xFFFF6BB3; case 3: - return sq_RGBA(255, 0, 240, 255); + return 0xFFF000FF; case 4: - return sq_RGBA(255, 177, 0, 255); + return 0xFF00B1FF; case 5: - return sq_RGBA(255, 102, 102, 255); + return 0xFF6666FF; case 6: - return sq_RGBA(255, 50, 50, 255); + return 0xFF0055FF; + case 7: + return 0xFF9314FF; + case 8: + return 0xFF1CBC0C; + case 9: + return 0xFFACFF08; } } + } //获取文字绘制长度 class LenheartTextClass { diff --git a/Base/_Tool/Hacker_RegApi.nut b/Base/_Tool/Hacker_RegApi.nut index 8f6b02a..4f451bd 100644 --- a/Base/_Tool/Hacker_RegApi.nut +++ b/Base/_Tool/Hacker_RegApi.nut @@ -101,6 +101,15 @@ class R_Utils { return null; } + //获取APC编号的文件路径 + function GetApcPath(ApcIndex) { + local ApcPathAddress = L_Sq_CallFunc(0x1219E80, "int", FFI_THISCALL, ["int", "int"], 0x1D90B60, ApcIndex); + if (ApcPathAddress) { + return NativePointer(ApcPathAddress).readUnicodeString(); + } + return null; + } + //获取Lst文件的返回Array function GetLstArr(Path, Header) { local Arr = []; @@ -382,6 +391,31 @@ Rindro_Haker.LoadHook(0x7B64BA, ["int", "int", "bool"], }); +getroottable().WorldDrawVirtualCharacterCallBackFunc <- {}; +Rindro_Haker.LoadHook(0x80CE30, ["int", "int", "int", "int", "int", "int", "int"], + function(args) { + local Layer = args[0]; + local XPos = args[1]; + local YPos = args[2]; + local InfoAddress = NativePointer(Rindro_Haker.CpuContext.ecx).add(0x208).readInt(); + local WorldId = NativePointer(InfoAddress).add(0x4).readUShort(); + local NameAddress = NativePointer(InfoAddress).add(0x10).readInt(); + local Name = NativePointer(NameAddress).readUnicodeString(); + + foreach(Func in WorldDrawVirtualCharacterCallBackFunc) { + Func(Layer, XPos, YPos, WorldId, Name); + } + // if (Layer == 0 && WorldId == 6) + //注意 这里的坐标如果出现负数 说明 在角色在屏幕外 不需要绘制 同理 超过 卷轴最大值也是 (不过性能影响不大直接绘制就行 避免称谓比角色大 突然显示) + // printf("绘制层级: " + Layer + " XPos: " + XPos + " YPos: " + YPos + " 角色名: " + Name + " 世界ID: " + WorldId); + return null; + }, + function(args) { + + return null; + }); + + // Rindro_Haker.LoadHook(0x7FFA80, ["int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "void"], // function(args) { // if(args[0] == 0xA){ @@ -413,5 +447,4 @@ Rindro_Haker.LoadHook(0x7B64BA, ["int", "int", "bool"], // NativePointer(0x8266F5).writeShort(0x9090) // NativePointer(0x78FD37).writeShort(0x9090) -// NativePointer(0x78FD3B).writeShort(0x9090) - +// NativePointer(0x78FD3B).writeShort(0x9090) \ No newline at end of file diff --git a/Project/NewTitle/NewTitle.nut b/Project/NewTitle/NewTitle.nut new file mode 100644 index 0000000..2ea6875 --- /dev/null +++ b/Project/NewTitle/NewTitle.nut @@ -0,0 +1,619 @@ +/* +文件名:NewTitle.nut +路径:Project/NewTitle/NewTitle.nut +创建日期:2026-01-29 02:36 +文件用途: +*/ +NewTitleC_Img_Map <- {}; +class NewTitleC extends LenheartNewUI_Windows { + //调试模式 + // DeBugMode = true; + + //不是窗口 + // NoWindow = true; + + //是否可见 + Visible = false; + + Img = Rindro_Image("interface2/titlebook/titlebook_ver2.img"); + + BackGroundAni = null; + BackGroundAni2 = null; + + ImgT = Rindro_Image("newtitle/nangua.img"); + + //信息 + Info = null; + //数据信息 + DataInfo = null; + + //渲染指导信息 + ShowData = null; + + + //称谓类别 + CategoryTitle = null; + //称谓按钮List + TitleButtonList = null; + //是否显示复选框 + IsDisplayBtn = null; + //层级输入框 + InputObject = null; + + //当前类别 + CurrentCategory = 0; // 当前类别索引 + //当前页数 + CurrentPage = 0; + //当前选中称谓ID + CurrentSelectId = 1; + //当前选中称谓信息 + CurrentSelectInfo = null; + //是否拥有当前选中称谓 + CurrentSelectHaveFlag = false; + //当前选中缩放 + CurrentSelectScale = 1.0; + //当前选中X轴偏移 + CurrentSelectXOffset = 0; + //当前选中Y轴偏移 + CurrentSelectYOffset = 0; + + + function CheckBookInfo() { + SendPackEx({ + op = 21012001 + }) + } + + constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { + DataInfo = {}; + + Childrens = []; + //读取PVF + InitPvf(); + //注册控件 + RegisterWidget(); + + LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); + + //初始化背景动画 + local FrameArr = []; + for (local i = 0; i< 16; i++) { + local T = { + ImgIndex = i, + Delay = 120, + Pos = [0, 0] + } + FrameArr.append(T); + } + BackGroundAni = Rindro_CustomAnimation("interface2/titlebook/titlebook_effects.img", FrameArr); + + local FrameArr2 = []; + for (local i = 16; i< 32; i++) { + local T = { + ImgIndex = i, + Delay = 120, + Pos = [0, 0] + } + FrameArr2.append(T); + } + BackGroundAni2 = Rindro_CustomAnimation("interface2/titlebook/titlebook_effects.img", FrameArr2); + + //因为json在传输中会将数字Key转为字符串 所以需要转int + Pack_Control.rawset(21012002, function(Chunk) { + local Jso = Json.Decode(Chunk); + foreach(index, value in Jso.Info) { + DataInfo.rawset(index.tointeger(), value); + } + }.bindenv(this)); + + //接受需要渲染的称谓数据 + Pack_Control.rawset(21012004, function(Chunk) { + ShowData = {}; + local Jso = Json.Decode(Chunk); + foreach(index, value in Jso.ShowData) { + foreach(DrawObj in value) { + local PvfInfo = GetTitlePvfInfo(DrawObj.Id.tointeger()) + DrawObj.Category <- PvfInfo.Category; + DrawObj.Content <- Json.Decode(Json.Encode(PvfInfo.Content)); + } + ShowData.rawset(index.tointeger(), value); + } + }.bindenv(this)); + + CheckBookInfo(); + + + WorldDrawVirtualCharacterCallBackFunc.rawset("NewTitleC", function(Layer, XPos, YPos, WorldId, Name) { + if (ShowData) { + if (ShowData.rawin(WorldId)) { + foreach(ShowInfo in ShowData[WorldId]) { + //图像 + if (ShowInfo.Content.type == "img") { + //没有添加缓存的先添加缓存 + if (!NewTitleC_Img_Map.rawin(ShowInfo.Content.img)) { + NewTitleC_Img_Map.rawset(ShowInfo.Content.img, Rindro_Image(ShowInfo.Content.img)); + } + //这里从展示框的左上角开始算起 展示框大小为 290 * 115 如果添加新的称谓 可以现在PS里缩放 并记录下针对左上角坐标的偏移 与 缩放值 + NewTitleC_Img_Map[ShowInfo.Content.img].DrawExPng(ShowInfo.Content.index, + XPos + ShowInfo.XOffset, + YPos + ShowInfo.YOffset, 0, 0xffffffff, + ShowInfo.Scale.tofloat(), ShowInfo.Scale.tofloat()) + } + //Ani + else if (ShowInfo.Content.type == "ani") { + local Ani = DrawAniEx(XPos + ShowInfo.XOffset, YPos + ShowInfo.YOffset, ShowInfo.Content.ani); + Ani.setImageRateFromOriginal(ShowInfo.Scale.tofloat(), ShowInfo.Scale.tofloat()); + Ani.setAutoLayerWorkAnimationAddSizeRate(ShowInfo.Scale.tofloat(), ShowInfo.Scale.tofloat()); + } + } + } + } + }.bindenv(this)); + + + + } + + function RegisterWidget() { + //关闭按钮 + local CloseButton = LenheartNewUI_BaseButton(435, 4, 11, 12, "interface/lenheartwindowcommon.img", 276); + CloseButton.OnClick = function() { + this.Visible = false; + }.bindenv(this); + Childrens.append(CloseButton); + + //注册类别 + RegisterCategoryTitle(); + + TitleButtonList = []; + for (local i = 0; i< 9; i++) { + local TitleButtonBuffer = NewTitleC_Button(14, 138 + (37 * i), Img); + TitleButtonBuffer.OnClickEx = function(Btn) { + CurrentSelectId = Btn.Id; + CurrentSelectInfo = Btn.Info; + local DataInfoObj = null; + //如果有数据 + if (DataInfo.rawin(CurrentSelectId)) { + DataInfoObj = DataInfo[CurrentSelectId]; + IsDisplayBtn.IsSelected = DataInfoObj.IsDisplay; + if (IsDisplayBtn.IsSelected) IsDisplayBtn.State = 1; + else IsDisplayBtn.State = 0; + + InputObject.SetStr(DataInfoObj.ZOrder.tostring()); + + CurrentSelectScale = DataInfoObj.Scale; + CurrentSelectXOffset = DataInfoObj.XOffset; + CurrentSelectYOffset = DataInfoObj.YOffset; + CurrentSelectHaveFlag = true; + } else { + CurrentSelectHaveFlag = false; + } + }.bindenv(this); + AddChild(TitleButtonBuffer); + TitleButtonList.append(TitleButtonBuffer); + } + + local CheckCurrentSelectIdFunc = function(Btn) { + //如果没有选中 或者没有信息 或者没有拥有 + if (!CurrentSelectId || !CurrentSelectInfo || !DataInfo.rawin(CurrentSelectId)) { + Btn.Visible = false; + } else { + Btn.Visible = true; + } + }.bindenv(this); + + //是否显示复选框 + IsDisplayBtn = NewTitleC_SwitchButton(252, 424); + IsDisplayBtn.OnClickEx = function(Btn) { + + }.bindenv(this); + IsDisplayBtn.SetCallBackFunc(CheckCurrentSelectIdFunc); + AddChild(IsDisplayBtn); + + //层级输入框 + InputObject = LenheartNewUI_BaseInput(360, 423, 50, 20); + InputObject.SetCallBackFunc(CheckCurrentSelectIdFunc); + AddChild(InputObject); + // InputObject.SetStr("131232"); + + + //保存按钮 + local ConfirmButton = LenheartNewUI_ButtonText(364, 481, 15, " 保 存"); + ConfirmButton.DWidth = 18; + ConfirmButton.Width = 74; + ConfirmButton.SetTextOffset(-4, 1); + ConfirmButton.OnClickEx = function(Btn) { + if (Btn.Visible) { + local Order = 1; + try { + Order = InputObject.str.tointeger(); + } catch (exception) { + + } + SendPackEx({ + op = 21012003, + Id = CurrentSelectId, + SendInfo = { + IsDisplay = IsDisplayBtn.IsSelected, + Scale = CurrentSelectScale, + XOffset = CurrentSelectXOffset, + YOffset = CurrentSelectYOffset, + ZOrder = Order + } + }) + CheckBookInfo(); + } + }.bindenv(this); + ConfirmButton.SetCallBackFunc(CheckCurrentSelectIdFunc); + AddChild(ConfirmButton); + + + + for (local i = 0; i< 3; i++) { + local ControlObject = "CurrentSelectScale"; + if (i == 1) ControlObject = "CurrentSelectXOffset"; + if (i == 2) ControlObject = "CurrentSelectYOffset"; + + local BtnBuffer = LenheartNewUI_BaseButton(205, 440 + (i * 16), 20, 15, "interface/lenheartwindowcommon.img", 528); + BtnBuffer.Data = ControlObject; + BtnBuffer.OnClickEx = function(Btn) { + if (Btn.Data == "CurrentSelectScale") { + this[Btn.Data] -= 0.1; + } else { + this[Btn.Data] -= 10; + } + FixCustomData(); + }.bindenv(this); + BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc); + Childrens.append(BtnBuffer); + + BtnBuffer = LenheartNewUI_BaseButton(232, 440 + (i * 16), 15, 15, "interface/lenheartwindowcommon.img", 34); + BtnBuffer.Data = ControlObject; + BtnBuffer.OnClickEx = function(Btn) { + if (Btn.Data == "CurrentSelectScale") { + this[Btn.Data] -= 0.01; + } else { + this[Btn.Data] -= 1; + } + FixCustomData(); + }.bindenv(this); + BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc); + Childrens.append(BtnBuffer); + + BtnBuffer = LenheartNewUI_BaseButton(284, 440 + (i * 16), 15, 15, "interface/lenheartwindowcommon.img", 38); + BtnBuffer.Data = ControlObject; + BtnBuffer.OnClickEx = function(Btn) { + if (Btn.Data == "CurrentSelectScale") { + this[Btn.Data] += 0.01; + } else { + this[Btn.Data] += 1; + } + FixCustomData(); + }.bindenv(this); + BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc); + Childrens.append(BtnBuffer); + + BtnBuffer = LenheartNewUI_BaseButton(311, 440 + (i * 16), 20, 15, "interface/lenheartwindowcommon.img", 532); + BtnBuffer.Data = ControlObject; + BtnBuffer.OnClickEx = function(Btn) { + if (Btn.Data == "CurrentSelectScale") { + this[Btn.Data] += 0.1; + } else { + this[Btn.Data] += 10; + } + FixCustomData(); + }.bindenv(this); + BtnBuffer.SetCallBackFunc(CheckCurrentSelectIdFunc); + Childrens.append(BtnBuffer); + } + + //初始默认0类别 + ChangeCategoryTitle(0); + + } + + //更改页面 + function ChangeCategoryTitle(ToCategory) { + CurrentCategory = ToCategory; + //得到对应分类的称谓List + local ItemList = Info.ItemIndex[CurrentCategory]; + local SetInfo = []; + for (local i = (9 * CurrentPage); i< 9; i++) { + //得到ID和Info 0 和 null 为没有数据 + local TileId = 0; + local TileInfo = null; + if (i< ItemList.len()) { + //将ID记录到数组 + TileId = ItemList[i]; + TileInfo = Info.Item[CurrentCategory][ItemList[i]]; + } + SetInfo.append({ + TileId = TileId, + TileInfo = TileInfo + }); + } + //遍历数组将ID与Info 设置给按钮 + for (local i = 0; i< 9; i++) { + TitleButtonList[i].SetInfo(SetInfo[i].TileId, SetInfo[i].TileInfo); + } + } + + //修正数据 + function FixCustomData() { + if (this.CurrentSelectScale > 1.0) this.CurrentSelectScale = 1.0; + if (this.CurrentSelectScale< 0.01) this.CurrentSelectScale = 0.01; + if (this.CurrentSelectXOffset > 800) this.CurrentSelectXOffset = 800; + if (this.CurrentSelectXOffset<(-800)) this.CurrentSelectXOffset = -800; + if (this.CurrentSelectYOffset > 600) this.CurrentSelectYOffset = 600; + if (this.CurrentSelectYOffset<(-600)) this.CurrentSelectYOffset = -600; + } + + //注册类别 + function RegisterCategoryTitle() { + CategoryTitle = []; + + local LogicFunc = function(Btn) { + foreach(Pos, obj in CategoryTitle) { + if (obj != Btn) obj.State = 0; + else { + obj.State = 1; + ChangeCategoryTitle(Pos); + } + } + }; + + //遍历有多少个Boss + foreach(Pos, Name in Info.category) { + local Tabbars1 = LenheartNewUI_TabbarsText(10 + (Pos * 61), 110, Name); + if (Pos == 0) Tabbars1.State = 1; + Tabbars1.SetTextOffset(31 - LenheartTextClass.GetStringLength(Name) / 2, 4); + AddChild(Tabbars1); + Tabbars1.OnClickEx = LogicFunc.bindenv(this); + CategoryTitle.append(Tabbars1); + } + } + + //绘制主界面 + function DrawMain(obj) { + //背景框 + DrawNineBox(X, Y, 450, 518, "interface/lenheartwindowcommon.img", 213); + + //标题 + DrawWindowTitle(452); + //绘制标题名 + L_sq_DrawCode("誉名录", X + 204, Y + 5, sq_RGBA(230, 200, 155, 255), 0, 1); + + //头部图像 + Img.DrawPng(0, X + 5, Y + 26); + + L_sq_SetDrawImgModel(2, 0); + BackGroundAni.Show(Duration, X + 150, Y + 35); + BackGroundAni2.Show(Duration, X + 150, Y + 30); + L_sq_ReleaseDrawImgModel(); + + //书本图像 + Img.DrawPng(1, X + 184, Y + 46); + + L_sq_DrawCode("誉名录完成率", X + 188, Y + 98, sq_RGBA(202, 200, 194, 255), 0, 1); + + //左侧背景 + Img.DrawPng(2, X + 9, Y + 132); + //右侧背景 + Img.DrawPng(3, X + 143, Y + 132); + + + //详情页 + if (CurrentSelectId && CurrentSelectInfo) { + //展示文字 + L_sq_DrawCode("效果展示:", X + 150, Y + 140, sq_RGBA(230, 200, 155, 255), 0, 1); + //展示框 + Img.DrawPng(11, X + 147, Y + 156); + //图像 + if (CurrentSelectInfo.Content.type == "img") { + //没有添加缓存的先添加缓存 + if (!NewTitleC_Img_Map.rawin(CurrentSelectInfo.Content.img)) { + NewTitleC_Img_Map.rawset(CurrentSelectInfo.Content.img, Rindro_Image(CurrentSelectInfo.Content.img)); + } + //这里从展示框的左上角开始算起 展示框大小为 290 * 115 如果添加新的称谓 可以现在PS里缩放 并记录下针对左上角坐标的偏移 与 缩放值 + NewTitleC_Img_Map[CurrentSelectInfo.Content.img].DrawExPng(CurrentSelectInfo.Content.index, + X + 147 + CurrentSelectInfo.DisplayData.x, + Y + 156 + CurrentSelectInfo.DisplayData.y, 0, 0xffffffff, + CurrentSelectInfo.DisplayData.scale, CurrentSelectInfo.DisplayData.scale) + } + //Ani + else if (CurrentSelectInfo.Content.type == "ani") { + local Ani = DrawAniEx(X + 147 + CurrentSelectInfo.DisplayData.x, Y + 156 + CurrentSelectInfo.DisplayData.y, CurrentSelectInfo.Content.ani); + Ani.setImageRateFromOriginal(CurrentSelectInfo.DisplayData.scale, CurrentSelectInfo.DisplayData.scale); + Ani.setAutoLayerWorkAnimationAddSizeRate(CurrentSelectInfo.DisplayData.scale, CurrentSelectInfo.DisplayData.scale); + } + + //描述文字 + L_sq_DrawCode("称谓信息:", X + 150, Y + 276, sq_RGBA(230, 200, 155, 255), 0, 1); + L_sq_DrawCode_ExRN(CurrentSelectInfo.Explain, X + 150, Y + 292, sq_RGBA(104, 213, 237, 255), 0, 1); + + //获取途径文字 + L_sq_DrawCode("获取途径:", X + 150, Y + 336, sq_RGBA(230, 200, 155, 255), 0, 1); + L_sq_DrawCode_ExRN(CurrentSelectInfo.Conditions, X + 150, Y + 352, sq_RGBA(124, 110, 82, 255), 0, 1); + + if (CurrentSelectHaveFlag) { + //调整文字 + L_sq_DrawCode("自定义调整:", X + 150, Y + 410, sq_RGBA(230, 200, 155, 255), 0, 1); + //缩放大小 + L_sq_DrawCode("是否启用称谓显示: ", X + 150, Y + 426, sq_RGBA(124, 110, 82, 255), 0, 1); + //层级调整 + L_sq_DrawCode("显示层级: ", X + 300, Y + 426, sq_RGBA(124, 110, 82, 255), 0, 1); + + L_sq_DrawCode("缩放大小:", X + 150, Y + 442, sq_RGBA(124, 110, 82, 255), 0, 1); + local CurrentSelectScaleStr = format("%.2f", CurrentSelectScale); + L_sq_DrawCode(CurrentSelectScaleStr, X + 266 - LenheartTextClass.GetStringLength(CurrentSelectScaleStr) / 2, Y + 442, sq_RGBA(230, 200, 155, 255), 0, 1); + + L_sq_DrawCode("X轴偏移:", X + 150, Y + 458, sq_RGBA(124, 110, 82, 255), 0, 1); + local CurrentSelectXOffsetStr = CurrentSelectXOffset.tostring(); + L_sq_DrawCode(CurrentSelectXOffsetStr, X + 266 - LenheartTextClass.GetStringLength(CurrentSelectXOffsetStr) / 2, Y + 458, sq_RGBA(230, 200, 155, 255), 0, 1); + + L_sq_DrawCode("Y轴偏移:", X + 150, Y + 474, sq_RGBA(124, 110, 82, 255), 0, 1); + local CurrentSelectYOffsetStr = CurrentSelectYOffset.tostring(); + L_sq_DrawCode(CurrentSelectYOffsetStr, X + 266 - LenheartTextClass.GetStringLength(CurrentSelectYOffsetStr) / 2, Y + 474, sq_RGBA(230, 200, 155, 255), 0, 1); + } + } + for (local i = 0; i< 6; i++) { + Img.DrawPng(21 + i, X + 152, Y + 160 + (i * 44)); + } + } + + function Show(obj) { + DrawMain(obj); + LenheartNewUI_Windows.Show(obj); + + } + + //逻辑入口 + function Proc(obj) { + LenheartNewUI_Windows.SyncPos(X, Y); + } + + function OpenCallBack() { + Visible = true; + CurrentSelectId = 0; + CurrentSelectInfo = null; + CheckBookInfo(); + } + + function InitPvf() { + Info = {}; + //读取基础配置 + Rindro_Script.GetFileData("etc/rindro/newtitle/newtitle.etc", function(DataTable, Data) { + while (!Data.Eof()) { + local Fragment = Data.Get(); + if (Fragment == "[category]") { + Info.category <- []; + while (true) { + local Fbuf = Data.Get(); + if (Fbuf == "[/category]") { + break; + } + Info.category.append(Sq_ConvertWideChar(Fbuf, "big5")); + } + } + } + }.bindenv(this)); + + //读取称谓列表 + local TitleInfoMap = Rindro_Script.GetFileData("etc/rindro/newtitle/title.lst", function(InfoMap, Data) { + while (!Data.Eof()) { + local Index = Data.Get(); + local Path = "etc/" + Data.Get(); + + local TitleInfo = Rindro_Script.GetFileData(Path, function(DataTable, Data) { + while (!Data.Eof()) { + local Fragment = Data.Get(); + if (Fragment == "[name]") { + DataTable.Name <- Sq_ConvertWideChar(Data.Get(), "big5"); + } else if (Fragment == "[icon]") { + DataTable.Icon <- { + img = Data.Get().tolower(), + index = Data.Get() + } + } else if (Fragment == "[explain]") { + DataTable.Explain <- Sq_ConvertWideChar(Data.Get(), "big5"); + } else if (Fragment == "[conditions]") { + DataTable.Conditions <- Sq_ConvertWideChar(Data.Get(), "big5"); + } else if (Fragment == "[category]") { + DataTable.Category <- Data.Get(); + } else if (Fragment == "[content]") { + local Type = Data.Get(); + if (Type == "img") { + DataTable.Content <- { + type = Type, + img = Data.Get().tolower(), + index = Data.Get() + } + } else if (Type == "ani") { + DataTable.Content <- { + type = Type, + ani = Data.Get().tolower(), + } + } + } else if (Fragment == "[display data]") { + DataTable.DisplayData <- { + x = Data.Get(), + y = Data.Get(), + scale = Data.Get() + } + } + } + }); + InfoMap.rawset(Index, TitleInfo); + } + InfoMap.rawdelete("filepath"); + }.bindenv(this)); + + //遍历称谓列表分配到对应的种类页 并编制索引 + Info.Item <- []; + Info.ItemIndex <- []; + foreach(value in Info.category) { + Info.Item.append({}); + Info.ItemIndex.append([]); + } + foreach(Index, Value in TitleInfoMap) { + Info.Item[Value.Category].rawset(Index, Value); + Info.ItemIndex[Value.Category].append(Index); + } + } + + function L_sq_DrawCode_Ex(str, x, y, rgba, mb, jc) { + local strarr = []; + if (str.find("\r\n") == null) L_sq_DrawCode(str, x, y, rgba, mb, jc); + else { + local Bpos = 0; + while (true) { + local Npos = str.find("\r\n", Bpos); + if (!Npos) { + local strbuff = str.slice(Bpos, str.len()); + strarr.append(strbuff); + break; + } + local strbuff = str.slice(Bpos, Npos); + strarr.append(strbuff); + Bpos = Npos + 2; + } + for (local z = 0; z< strarr.len(); z++) { + L_sq_DrawCode(strarr[z], x, y + (z * 14), rgba, mb, jc); + } + } + } + + function GetTitlePvfInfo(FindId) { + local FindCategory = -1; + foreach(GroupIndex, Group in Info.ItemIndex) { + foreach(value in Group) { + if (value == FindId) { + FindCategory = GroupIndex; + break; + } + } + } + if (FindCategory != -1) { + return Info.Item[FindCategory][FindId]; + } + return null; + } +} + + +L_Windows_List <- []; +getroottable().rawdelete("LenheartPluginsInitFlag"); +getroottable().rawdelete("EventList_Obj") +getroottable().rawdelete("NewTitle_Obj"); +getroottable().rawdelete("L_Each_Obj"); + +function Lenheart_NewTitle_Fun(obj) { + local RootTab = getroottable(); + if (!RootTab.rawin("NewTitle_Obj")) { + RootTab.rawset("NewTitle_Obj", true); + local Win = LenheartNewUI_CreateWindow(NewTitleC, "称谓系统窗口", ((getroottable().Rindro_Scr_Width - 450) / 2).tointeger(), 30, 450, 518, 22); + EventList_Obj.AddEvent("誉名录", 109, Win); + } +} + +getroottable()["LenheartFuncTab"].rawset("NewTitleFuncN", Lenheart_NewTitle_Fun); \ No newline at end of file diff --git a/Project/NewTitle/TitleButton.nut b/Project/NewTitle/TitleButton.nut new file mode 100644 index 0000000..2128e9d --- /dev/null +++ b/Project/NewTitle/TitleButton.nut @@ -0,0 +1,116 @@ +/* +文件名:TitleButton.nut +路径:Project/NewTitle/TitleButton.nut +创建日期:2026-01-30 04:34 +文件用途: +*/ + +class NewTitleC_Button extends LenheartNewUI_CommonUi { + State = 0; + BaseIdx = 29; + DWidth = null; + + Img = null; + + Id = 0; + Info = null; + + constructor(X, Y, gImg) { + this.DWidth = 121; + this.Img = gImg; + LenheartNewUI_CommonUi.constructor(X, Y, 121, 34); + } + + function SetInfo(gId,gInfo) { + this.Id = gId; + this.Info = gInfo; + } + + function Show(obj) { + local DownOffset = 0; + + //按下 + if (isLBDown) { + DownOffset = 1; + } + Img.DrawPng(4, X, Y + DownOffset); + + //有信息才绘制 + if (Info) { + //是否拥有标识条底 + Img.DrawPng(5, X + 35, Y + 26 + DownOffset); + Img.DrawPng(7, X + 35, Y + 26 + DownOffset); + + //图标边框 + Img.DrawPng(10, X, Y + DownOffset); + + //判断是否有初始化图像 + if (!NewTitleC_Img_Map.rawin(Info.Icon.img)) { + NewTitleC_Img_Map.rawset(Info.Icon.img, Rindro_Image(Info.Icon.img)); + } + NewTitleC_Img_Map[Info.Icon.img].DrawPng(Info.Icon.index, X + 3, Y + 3 + DownOffset); + + //名称 + L_sq_DrawCode(Info.Name, X + 38, Y + 8 + DownOffset, sq_RGBA(255, 255, 183, 255), 0, 1); + } + + if (isInRect) { + Img.DrawPng(8, X, Y + DownOffset); + } + } +} + + +//复选框 +class NewTitleC_SwitchButton extends LenheartNewUI_CommonUi { + State = 0; + ImgIndex = 600; + ImgPath = "interface/lenheartwindowcommon.img"; + IsSelected = false; + + constructor(X, Y) { + LenheartNewUI_CommonUi.constructor(X, Y, 28, 16); + } + + function Show(obj) { + + local DownOffset = 0; + + if (isLBDown) { + DownOffset = 1; + if (State == 0) + Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 1, X, Y + 1); + if (State == 1) + Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 4, X, Y + 1); + } else if (isInRect) { + if (State == 0) + Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 1, X, Y); + if (State == 1) + Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 4, X, Y); + } else { + if (State == 0) + Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex, X, Y); + if (State == 1) + Rindro_Image_GlobalMap["lenheartui"].DrawPng(ImgIndex + 3, X, Y); + } + } + + //鼠标左键弹起回调 + function OnMouseLbUp(MousePos_X, MousePos_Y) { + if (isLBDown) { + if (OnClick) OnClick(); + if (OnClickEx) OnClickEx(this); + IsSelected = !IsSelected; + if (IsSelected) State = 1; + else State = 0; + } + isLBDown = false; + } +} + + +L_Windows_List <- []; +getroottable().rawdelete("LenheartPluginsInitFlag"); +getroottable().rawdelete("EventList_Obj") +getroottable().rawdelete("NewTitle_Obj"); +getroottable().rawdelete("L_Each_Obj"); \ No newline at end of file