Rindro-Sqr/Project/Achievement/Achievement.nut

504 lines
20 KiB
Plaintext

/*
文件名:Achievement.nut
路径:Project/Achievement/Achievement.nut
创建日期:2025-02-23 08:37
文件用途:成就系统
*/
class Achievement_TypeButton extends LenheartNewUI_BaseButton {
function _typeof() {
return "Achievement_TypeButton";
}
}
class AchievementC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
// NoWindow = true;
//是否可见
Visible = false;
EtcInfo = null;
WindowImg = Rindro_Image("achievement/main.img");
WindowBackGroundImg = Rindro_Image("achievement/mainbackground.img");
ButtonInfo = null;
Info = null;
Data = null;
IsOther = false;
OtherName = null;
Page = 1;
//滚轮值
ScrollValue = 0;
ScrollValueMax = 500;
EventWindow = null;
//左侧滚动条对象
LeftScrollBar = null;
//左侧滚轮值
LeftScrollRate = 0;
LeftScrollValue = 400;
//右侧滚动条对象
RightScrollBar = null;
//右侧滚轮值
RightScrollRate = 0;
RightScrollValue = 400;
//查询成就回包
function OnQueryAchievementBack(Chunk) {
local Jso = Json.Decode(Chunk);
if (Jso.rawin("click")) {
IsOther = true;
} else IsOther = false;
Data = {};
foreach(ValueObject in Jso.Achievement) {
Data.rawset(ValueObject.id, ValueObject);
}
}
function OnQueryAchievementBack2(Chunk) {
local Jso = Json.Decode(Chunk);
EventWindow = EventList_Obj.AddEvent("AchievementEvent1", 682, null);
EventWindow.MainButton.ShowName = Jso.VipInfo;
}
function OnQueryAchievementBack3(Chunk) {
local Jso = Json.Decode(Chunk);
EventWindow = EventList_Obj.AddEvent("人物属性加成", 433, null);
EventWindow.MainButton.OnClick = function(B_obj) {
local T = {
op = 20091601,
}
SendPackEx(T);
}.bindenv(this);
}
//查询成就
function QueryAchievement() {
local T = {
op = 20091001,
cjid = Page,
cid2 = OtherName ? OtherName : "-1"
}
SendPackEx(T);
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
EtcInfo = Rindro_Script.GetFileData("etc/th_plugin/etc.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Str = Data.Get();
if (Str == "[window pos]") {
DataTable.window_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()];
} else if (Str == "[clicp pos]") {
DataTable.clicp_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get()];
} else if (Str == "[clicp2 pos]") {
DataTable.clicp_pos2 <- [Data.Get(), Data.Get(), Data.Get(), Data.Get()];
}else if (Str == "[closebutton pos]") {
DataTable.closebutton_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get()];
} else if (Str == "[left scroll bar]") {
DataTable.left_scroll_bar_info <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()];
} else if (Str == "[right scroll bar]") {
DataTable.right_scroll_bar_info <- [];
while (true) {
local buf = Data.Get();
if (buf == "[/right scroll bar]") break;
local Arr = [buf,Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()];
DataTable.right_scroll_bar_info.append(Arr);
}
}
}
}.bindenv(this));
Childrens = [];
InitButtonConfig();
//注册控件
RegisterWidget(true);
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Pack_Control.rawset(20091002, OnQueryAchievementBack.bindenv(this));
Pack_Control.rawset(20092002, OnQueryAchievementBack2.bindenv(this));
Pack_Control.rawset(20091010, OnQueryAchievementBack3.bindenv(this));
InitConfig();
InitAchievement();
QueryAchievement();
EventWindow = EventList_Obj.AddEvent("人物属性加成", 433, null);
EventWindow.MainButton.OnClick = function(B_obj) {
local T = {
op = 20091601,
}
SendPackEx(T);
}.bindenv(this);
}
function InitAchievement() {
for (local i = 0; i< Childrens.len(); i++) {
if (typeof Childrens[i] == "Achievement_TypeButton") {
Childrens.remove(i);
i--;
}
}
//这里要手动移除右边的滚动条
if (RightScrollBar) RightScrollBar.RemoveSelf();
ScrollValueMax = 0;
RegisterWidget(false);
if (Info.len() > Page) {
//绘制成就
foreach(InfoObj in Info[Page]) {
if (InfoObj.Pos.y - 320 > ScrollValueMax) ScrollValueMax = InfoObj.Pos.y - 320;
DrawAItem(InfoObj);
}
RightScrollValue = EtcInfo.right_scroll_bar_info[Page][4];
RightScrollBar = Yosin_ScrollBar(EtcInfo.right_scroll_bar_info[Page][0], EtcInfo.right_scroll_bar_info[Page][1], EtcInfo.right_scroll_bar_info[Page][2], EtcInfo.right_scroll_bar_info[Page][3]);
RightScrollBar.SetParent(this);
RightScrollBar.SetStep(EtcInfo.right_scroll_bar_info[Page][5].tofloat() / 100.0);
RightScrollBar.SetOnChange(function(Rate) {
ScrollValue = (Rate * RightScrollValue).tointeger();
}.bindenv(this));
}
}
function InitButtonConfig() {
local AchieData = R_Utils.GetScriptFileReader("etc/th_plugin/control.etc");
if (AchieData) {
local DataArr = [];
if (AchieData.Size >= 7) {
//创建Blob对象
local IOBUF = Sq_Point2Blob(L_sq_P2I(AchieData.Buffer.C_Object), AchieData.Size);
local IO = BlobEx(IOBUF.readblob(IOBUF.len()));
//以5为单步从第二位开始遍历字节
local i = 2;
while (true) {
if (i< AchieData.Size && AchieData.Size - i >= 5) {
local str = Rindro_Script.UnpackData(IO, i);
i += 5;
//城镇编号
if (str == "[info]") {
local Data = {};
while (true) {
local Ret = Rindro_Script.UnpackData(IO, i);
i += 5;
if (Ret == "[/info]") {
DataArr.append(Data);
break;
}
if (Ret == "[icon]") {
Data.Icon <- {};
Data.Icon.Path <- Rindro_Script.UnpackData(IO, i).tolower();
i += 5;
Data.Icon.Idx <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
if (Ret == "[pos]") {
Data.Pos <- {};
Data.Pos.x <- Rindro_Script.UnpackData(IO, i);
i += 5;
Data.Pos.y <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
if (Ret == "[size]") {
Data.Size <- {};
Data.Size.x <- Rindro_Script.UnpackData(IO, i);
i += 5;
Data.Size.y <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
}
}
} else break;
}
}
ButtonInfo = DataArr;
}
}
function InitConfig() {
Info = [];
local PageLst = R_Utils.GetLstArr("etc/th_plugin/info.lst", "etc/");
foreach(Index, Path in PageLst) {
local AchieData = R_Utils.GetScriptFileReader(Path);
if (AchieData) {
local DataArr = {};
if (AchieData.Size >= 7) {
//创建Blob对象
local IOBUF = Sq_Point2Blob(L_sq_P2I(AchieData.Buffer.C_Object), AchieData.Size);
local IO = BlobEx(IOBUF.readblob(IOBUF.len()));
//以5为单步从第二位开始遍历字节
local i = 2;
while (true) {
if (i< AchieData.Size && AchieData.Size - i >= 5) {
local str = Rindro_Script.UnpackData(IO, i);
i += 5;
//城镇编号
if (str == "[info]") {
local Data = {};
while (true) {
local Ret = Rindro_Script.UnpackData(IO, i);
i += 5;
if (Ret == "[/info]") {
DataArr.rawset(Data.Id, Data);
break;
}
if (Ret == "[id]") {
Data.Id <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
if (Ret == "[icon]") {
Data.Icon <- {};
Data.Icon.Path <- Rindro_Script.UnpackData(IO, i).tolower();
i += 5;
Data.Icon.Idx <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
if (Ret == "[pos]") {
Data.Pos <- {};
Data.Pos.x <- Rindro_Script.UnpackData(IO, i);
i += 5;
Data.Pos.y <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
if (Ret == "[size]") {
Data.Size <- {};
Data.Size.x <- Rindro_Script.UnpackData(IO, i);
i += 5;
Data.Size.y <- Rindro_Script.UnpackData(IO, i);
i += 5;
}
if (Ret == "[str]") {
Data.Str <- [];
while (true) {
local strbuffer = Rindro_Script.UnpackData(IO, i);
i += 5;
strbuffer = Sq_ConvertWideChar(strbuffer, "big5")
if (strbuffer == "[/str]") break;
Data.Str.append(strbuffer);
}
}
}
}
} else break;
}
}
Info.append(DataArr);
}
}
}
function RegisterWidget(Flag) {
if (!Flag) {
//类型按钮
for (local i = 0; i< ButtonInfo.len(); i++) {
local Config = ButtonInfo[i];
local TypeButton = Achievement_TypeButton(Config.Pos.x, Config.Pos.y, Config.Size.x, Config.Size.y, Config.Icon.Path, Config.Icon.Idx);
TypeButton.Data = {
id = i,
BasePosY = Config.Pos.y,
};
TypeButton.OnClickEx = function(Button) {
if (Button.Localtion_Y <= EtcInfo.clicp_pos[1] || Button.Localtion_Y >= EtcInfo.clicp_pos[3]) return;
Page = Button.Data.id;
InitAchievement();
QueryAchievement();
}.bindenv(this);
TypeButton.SetCallBackFunc(function(Btn) {
Btn.Localtion_Y = (Btn.Data.BasePosY - LeftScrollRate * LeftScrollValue).tointeger();
}.bindenv(this));
Childrens.append(TypeButton);
}
}
//只有第一次的时候注册进度条
if (Flag) {
LeftScrollValue = EtcInfo.left_scroll_bar_info[4];
LeftScrollBar = Yosin_ScrollBar(EtcInfo.left_scroll_bar_info[0], EtcInfo.left_scroll_bar_info[1], EtcInfo.left_scroll_bar_info[2], EtcInfo.left_scroll_bar_info[3]);
LeftScrollBar.SetParent(this);
LeftScrollBar.SetStep(EtcInfo.left_scroll_bar_info[5].tofloat() / 100.0);
LeftScrollBar.SetOnChange(function(Rate) {
LeftScrollRate = Rate;
}.bindenv(this));
}
}
//绘制主界面
function DrawMain(obj) {
WindowBackGroundImg.DrawPng(0 + Page, X, Y);
WindowImg.DrawPng(19, X + EtcInfo.closebutton_pos[0], Y + EtcInfo.closebutton_pos[1]); //关闭按钮图标
}
function DrawInfo() {
if (Info.len() > Page) {
//绘制成就
foreach(InfoObj in Info[Page]) {
if(Y + InfoObj.Pos.y - ScrollValue < EtcInfo.clicp_pos2[1])continue;
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X + InfoObj.Pos.x, Y + InfoObj.Pos.y - ScrollValue, InfoObj.Size.x, InfoObj.Size.y)) {
for (local i = 0; i< InfoObj.Str.len(); i += 2) {
local OffsetRate = InfoObj.Str.len() / 2;
local StrBuffer = format(InfoObj.Str[i], Data[InfoObj.Id].num);
local StrBuffer2 = InfoObj.Str[i + 1];
L_sq_DrawWindow(IMouse.GetXPos() + 32, IMouse.GetYPos() + 60 - (OffsetRate * 44) + (i / 2 * 44), 144, 24, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13);
L_sq_DrawCode(StrBuffer, IMouse.GetXPos() + 42, IMouse.GetYPos() + 70 - (OffsetRate * 44) + (i / 2 * 44), (Data[InfoObj.Id].achievement > (i / 2)) ? 0xFFedd568 : 0xFF969696, 1, 1);
L_sq_DrawCode(StrBuffer2, IMouse.GetXPos() + 42, IMouse.GetYPos() + 88 - (OffsetRate * 44) + (i / 2 * 44), (Data[InfoObj.Id].achievement > (i / 2)) ? 0xFFedd568 : 0xFF969696, 1, 1);
}
}
}
}
}
function Show(obj) {
DrawMain(obj);
// setClip(X + EtcInfo.clicp_pos[0], Y + EtcInfo.clicp_pos[1], X + EtcInfo.clicp_pos[2], Y + EtcInfo.clicp_pos[3]);
//左侧裁切
setClip(X + EtcInfo.clicp_pos[0], Y + EtcInfo.clicp_pos[1], X + EtcInfo.clicp_pos[2], Y + EtcInfo.clicp_pos[3]);
LenheartNewUI_Windows.Show(obj);
releaseClip(); //裁切结束
//右侧裁切
setClip(X + EtcInfo.clicp_pos2[0], Y + EtcInfo.clicp_pos2[1], X + EtcInfo.clicp_pos2[2], Y + EtcInfo.clicp_pos2[3]);
LenheartNewUI_Windows.Show(obj);
releaseClip(); //裁切结束
DrawInfo();
}
function DrawAItem(InfoObj) {
local Button = Achievement_TypeButton(InfoObj.Pos.x, InfoObj.Pos.y, InfoObj.Size.x, InfoObj.Size.y, InfoObj.Icon.Path, InfoObj.Icon.Idx);
Button.Data = InfoObj;
Button.SetCallBackFunc(function(Button) {
local InfoObj = Button.Data;
Button.Localtion_X = InfoObj.Pos.x;
Button.Localtion_Y = InfoObj.Pos.y - ScrollValue;
}.bindenv(this));
Button.OnClickEx = function(Button) {
if (IsOther) return;
local T = {
op = 20091005,
cjid = Page,
id = Button.Data.Id
}
SendPackEx(T);
}.bindenv(this);
Childrens.append(Button);
}
RegisFlag = false;
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
local RootTab = getroottable();
if (RootTab.rawin("L_PlayerEach_Obj") && RegisFlag == false) {
RegisFlag = true;
RootTab["L_PlayerEach_Obj"].AddEachForCommon("查看收集信息", function(SThis) {
//关闭按钮
local ApplyEngagementButton = LenheartNewUI_Each_BaseButton(0, 0, 100, 21, "interface2/popup_menu/popup_back.img", 3);
ApplyEngagementButton.Icon = "interface2/popup_menu/popup_icon_cn.img";
ApplyEngagementButton.IconIdx = 58;
ApplyEngagementButton.Str = "查看收集信息";
ApplyEngagementButton.OnClick = function(Button) {
if (L_Sq_GetPlayerEachName().len() <= 0 || L_Sq_GetPlayerEachName() == L_Sq_GetObjectName(sq_GetMyMasterCharacter())) {
} else {
OtherName = L_Sq_GetPlayerEachName();
Visible = true;
InitAchievement();
QueryAchievement();
}
Button.Parent.CloseAllEach();
}.bindenv(this);
ApplyEngagementButton.SetCallBackFunc(function(Button) {})
SThis.AddChild(ApplyEngagementButton);
}.bindenv(this));
}
}
//override
//鼠标滚轮事件回调
function OnMouseWheel(Flag, MousePos_X, MousePos_Y) {
if (MousePos_X > (X + 205)) {
// if (Flag) {
// if (ScrollValue > 0) ScrollValue -= 35;
// }
// if (!Flag) {
// if (ScrollValue< ScrollValueMax) ScrollValue += 35;
// }
if (Flag) RightScrollBar.DoStep(-1);
if (!Flag) RightScrollBar.DoStep(1);
} else {
if (Flag) LeftScrollBar.DoStep(-1);
if (!Flag) LeftScrollBar.DoStep(1);
}
//调用原生方法
LenheartNewUI_Windows.OnMouseWheel(Flag, MousePos_X, MousePos_Y);
}
//override
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) {
if (sq_IsIntersectRect(IMouse.GetXPos(), IMouse.GetYPos(), 1, 1, X + EtcInfo.closebutton_pos[0], Y + EtcInfo.closebutton_pos[1], EtcInfo.closebutton_pos[2], EtcInfo.closebutton_pos[3])) {
CloseWindow();
}
LenheartNewUI_Windows.OnMouseLbDown(MousePos_X, MousePos_Y);
}
function OpenCallBack() {
Visible = true;
IsOther = false;
OtherName = null;
InitAchievement();
QueryAchievement();
}
}
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("Achievement_Obj");
function Lenheart_Achievement_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("Achievement_Obj")) {
RootTab.rawset("Achievement_Obj", true);
local Info = Rindro_Script.GetFileData("etc/th_plugin/etc.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Str = Data.Get();
if (Str == "[window pos]") {
DataTable.window_pos <- [Data.Get(), Data.Get(), Data.Get(), Data.Get(), Data.Get()];
}
}
}.bindenv(this));
local window_Info = Info.window_pos;
local Win = LenheartNewUI_CreateWindow(AchievementC, "成就系统窗口", window_Info[0], window_Info[1], window_Info[2], window_Info[3], window_Info[4]);
EventList_Obj.AddEvent("成就系统", 118, Win);
}
}
getroottable()["LenheartFuncTab"].rawset("AchievementFuncN", Lenheart_Achievement_Fun);