誉名录

This commit is contained in:
Lenheart 2026-02-02 13:30:28 +08:00
parent e8f9aa171b
commit 21d18deac6
6 changed files with 844 additions and 12 deletions

View File

@ -89,12 +89,13 @@ function L_drawMainCustomUI_All() {
// Rindro_BaseToolClass.DrawNineBox(0, 0, 200, 200, "interface/lenheartwindowcommon.img", 213); // 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); // 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++) { // for (local i = 0; i < 42; i++) {
// local Value = MemoryTool.DecodeMemoryData(0x394e8c00+0x1050 + (i * 4)); // local Value = MemoryTool.DecodeMemoryData(0x394e8c00+0x1050 + (i * 4));
// if(Value == 151)print("Value :" + 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); // local asos = sq_CreateAICharacter(900);

View File

@ -1094,7 +1094,8 @@ class LenheartNewUI_BaseInput extends LenheartNewUI_CommonUi {
} }
function SetStr(Value) { function SetStr(Value) {
L_sq_SetInputBoxStr(InputController, Value); str = Value;
// L_sq_SetInputBoxStr(InputController, Value);
} }
} }

View File

@ -188,7 +188,29 @@ class Rindro_BaseToolClass {
return ani; 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) { function InitClass(Name) {
@ -294,21 +316,28 @@ class Rindro_BaseToolClass {
function GetRarityColor(rarity) { function GetRarityColor(rarity) {
switch (rarity) { switch (rarity) {
case 0: case 0:
return sq_RGBA(255, 255, 255, 255); return 0xFFFFFFFF;
case 1: case 1:
return sq_RGBA(104, 213, 237, 255); return 0xFFEDD568;
case 2: case 2:
return sq_RGBA(179, 107, 254, 255); return 0xFFFF6BB3;
case 3: case 3:
return sq_RGBA(255, 0, 240, 255); return 0xFFF000FF;
case 4: case 4:
return sq_RGBA(255, 177, 0, 255); return 0xFF00B1FF;
case 5: case 5:
return sq_RGBA(255, 102, 102, 255); return 0xFF6666FF;
case 6: 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 { class LenheartTextClass {

View File

@ -101,6 +101,15 @@ class R_Utils {
return null; 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 //获取Lst文件的返回Array
function GetLstArr(Path, Header) { function GetLstArr(Path, Header) {
local Arr = []; 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"], // Rindro_Haker.LoadHook(0x7FFA80, ["int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "int", "void"],
// function(args) { // function(args) {
// if(args[0] == 0xA){ // if(args[0] == 0xA){
@ -414,4 +448,3 @@ Rindro_Haker.LoadHook(0x7B64BA, ["int", "int", "bool"],
// NativePointer(0x8266F5).writeShort(0x9090) // NativePointer(0x8266F5).writeShort(0x9090)
// NativePointer(0x78FD37).writeShort(0x9090) // NativePointer(0x78FD37).writeShort(0x9090)
// NativePointer(0x78FD3B).writeShort(0x9090) // NativePointer(0x78FD3B).writeShort(0x9090)

View File

@ -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);

View File

@ -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");