Rindro-Sqr/Project/SoulSalvation/SoulSalvation.nut

263 lines
9.7 KiB
Plaintext
Raw Normal View History

2026-02-02 13:29:33 +08:00
/*
文件名:SoulSalvation.nut
路径:Project/SoulSalvation/SoulSalvation.nut
创建日期:2026-01-20 03:00
文件用途:灵魂救赎武器
*/
class SoulSalvationC extends Rindro_BaseToolClass {
//灵魂救赎武器标识 (阶段1)
Equipment1List = null;
//1阶段所需灵魂数量
Stage1SoulCount = 1000;
//灵魂救赎武器标识 (阶段2)
Equipment2List = null;
//灵魂救赎武器标识 (阶段3)
Equipment3List = null;
//三阶段灵魂石对应APC
Equipment3SoulStone = null;
Img = Rindro_Image("soulweapon/main.img");
//灵魂数据
EquipData = null;
//APC数据
ApcInfo = null;
constructor() {
Equipment1List = {};
Equipment2List = {};
Equipment3List = {};
Equipment3SoulStone = {};
EquipData = {};
ApcInfo = {};
InifPvf();
local ItemDrawControl = getroottable()["NewItemInfoWindow_Obj"];
ItemDrawControl.AddDelegate("灵魂救赎武器代理一阶段", 28, Delegate1.bindenv(this),
function(Item) {
return Equipment1List.rawin(Item.GetIndex());
}.bindenv(this));
ItemDrawControl.AddDelegate("灵魂救赎武器代理二阶段", 42, Delegate2.bindenv(this),
function(Item) {
return Equipment2List.rawin(Item.GetIndex());
}.bindenv(this));
ItemDrawControl.AddDelegate("灵魂救赎武器代理三阶段", 42, Delegate3.bindenv(this),
function(Item) {
return Equipment3List.rawin(Item.GetIndex());
}.bindenv(this));
foreach(Id, _f in Equipment3SoulStone) {
ItemDrawControl.AddHookItemId(Id);
}
ItemDrawControl.AddDelegate("灵魂救赎灵魂石代理", 160, Delegate4.bindenv(this),
function(Item) {
return Equipment3SoulStone.rawin(Item.GetIndex());
}.bindenv(this));
//上线获取全身灵魂武器灵魂数
Pack_Control.rawset(21011002, function(Chunk) {
local Jso = Json.Decode(Chunk);
EquipData = Jso.Info;
}.bindenv(this));
//多个灵魂武器的补充信息包
Pack_Control.rawset(21011006, function(Chunk) {
local Jso = Json.Decode(Chunk);
foreach(index, value in Jso.Info) {
EquipData[index.tostring()] <- value;
}
}.bindenv(this));
//单个灵魂武器的刷新信息
Pack_Control.rawset(21011004, function(Chunk) {
local Jso = Json.Decode(Chunk);
EquipData[Jso.uuid.tostring()] <- Jso.info;
}.bindenv(this));
SendPackEx({
op = 21011001
})
//创建灵魂武器升级窗口
LenheartNewUI_CreateWindow(SoulSalvation_UpgradeC, "灵魂武器升级窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28);
LenheartNewUI_CreateWindow(SoulSalvation_EnchantC, "灵魂武器附灵窗口", ((getroottable().Rindro_Scr_Width - 700) / 2).tointeger(), 160, 292, 290, 28);
}
//1阶段的代理
function Delegate1(X, Y, Item) {
L_sq_DrawCode("灵魂救赎阶段: 1 / 3", X + 6, Y + 15, sq_RGBA(255, 0, 240, 255), 0, 1);
L_sq_DrawCode("封印灵魂数: ", X + 6, Y + 30, sq_RGBA(104, 213, 237, 255), 0, 1);
local Uuid = Item.GetUuid().tostring();
//获取封印灵魂数
local Count = 0;
if (EquipData.rawin(Uuid)) {
Count = EquipData[Uuid].soul_count;
}
local Rate = Count.tofloat() / Stage1SoulCount.tofloat();
L_sq_DrawCode(format("%.1f%%", Rate * 100.0), X + 180, Y + 30, sq_RGBA(255, 119, 0, 255), 0, 1);
Img.DrawPng(0, X + 70, Y + 34);
setClip(X + 72, Y + 36, X + 72 + (Rate * 97.0).tointeger(), Y + 40); //开始裁切
Img.DrawPng(1, X + 72, Y + 36);
releaseClip(); //裁切结束
}
//2阶段的代理
function Delegate2(X, Y, Item) {
L_sq_DrawCode("灵魂救赎阶段: 2 / 3", X + 6, Y + 15, 0xFF0055FF, 0, 1);
L_sq_DrawCode("佩戴释魂通关镇魂曲地区副本", X + 6, Y + 30, 0xFF0055FF, 0, 1);
L_sq_DrawCode("即可救赎沉沦无尽永恒的灵魂!", X + 6, Y + 45, 0xFF0055FF, 0, 1);
}
//3阶段的代理
function Delegate3(X, Y, Item) {
L_sq_DrawCode("灵魂救赎阶段: 3 / 3", X + 6, Y + 15, 0xFF0055FF, 0, 1);
L_sq_DrawCode("已附灵的不朽灵魂:", X + 6, Y + 30, 0xFF0055FF, 0, 1);
local Uuid = Item.GetUuid().tostring();
local APCId = 0;
if (EquipData.rawin(Uuid)) {
APCId = EquipData[Uuid].soul_id;
}
if (APCId == 0) {
L_sq_DrawCode("未定名", X + 6, Y + 45, 0xFF0055FF, 0, 1);
} else {
local ApcName = GetApcInfo(APCId).Name;
L_sq_DrawCode("Lv.85 " + ApcName, X + 6, Y + 45, 0xFF0055FF, 0, 1);
}
}
//灵魂石的代理
function Delegate4(X, Y, Item) {
local ApcId = 0;
if (Equipment3SoulStone.rawin(Item.GetIndex())) {
ApcId = Equipment3SoulStone[Item.GetIndex()];
}
if (ApcId > 0) {
local Info = GetApcInfo(ApcId);
if (!Info.rawin("Ani")) {
Info.Ani <- Rindro_Draw_Character(Info.Job, Info.Equ, "rest.ani", null);
}
L_sq_DrawCode("不朽的灵魂: " + Info.Name, X + 6, Y + 15, 0xFF0055FF, 0, 1);
Info.Ani.Draw(X + 102, Y + 160);
}
}
//读取配置
function InifPvf() {
Rindro_Script.GetFileData("etc/rindro/expandequipment/soulsalvation.etc", function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[EQUIPMENT1]") {
Equipment1List = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/EQUIPMENT1]") {
break;
}
Equipment1List.rawset(Fbuf, true);
}
} else if (Fragment == "[EQUIPMENT2]") {
Equipment2List = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/EQUIPMENT2]") {
break;
}
Equipment2List.rawset(Fbuf, true);
}
} else if (Fragment == "[EQUIPMENT3]") {
Equipment3List = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/EQUIPMENT3]") {
break;
}
Equipment3List.rawset(Fbuf, true);
}
} else if (Fragment == "[STAGE1 VALUE]") {
Stage1SoulCount = Data.Get();
} else if (Fragment == "[STAGE2 SOULSTONE]") {
Equipment3SoulStone = {};
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/STAGE2 SOULSTONE]") {
break;
}
Equipment3SoulStone.rawset(Fbuf, Data.Get());
}
}
}
});
}
//读取APC名字
function GetApcInfo(ApcIndex) {
if (ApcInfo.rawin(ApcIndex)) return ApcInfo[ApcIndex];
local Path = "aicharacter/" + R_Utils.GetApcPath(ApcIndex);
local Info = Rindro_Script.GetFileData(Path, function(DataTable, Data) {
while (!Data.Eof()) {
local Fragment = Data.Get();
if (Fragment == "[minimum info]") {
DataTable.Name <- Sq_ConvertWideChar(Data.Get(), "big5");
DataTable.Job <- Data.Get();
} else if (Fragment == "[equipment]") {
DataTable.Equ <- [];
while (true) {
local Fbuf = Data.Get();
if (Fbuf == "[/equipment]") {
break;
}
Data.Get();
Data.Get();
DataTable.Equ.append(Fbuf);
}
}
}
});
ApcInfo.rawset(ApcIndex, Info);
return Info;
}
}
function Lenheart_SoulSalvation_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("SoulSalvation_Obj")) {
RootTab.rawset("SoulSalvation_Obj", SoulSalvationC());
}
if (KeyPressNB.isKeyPress(OPTION_HOTKEY_PAUSE_IN_TOWER, "asdasd")) {
local os = sq_CreateAICharacter(21435);
// foreach(member, val in os.getclass()) {
// ::print(member + "\n");
// local attr;
// if ((attr = os.getclass().getattributes(member)) != null) {
// foreach(i, v in attr) {
// // ::print("\t" + i + " = " + (typeof v) + "\n");
// }
// } else {
// // ::print("\t<no attributes>\n")
// }
// }
// local os = sq_CreateAICharacter(21435);
os.setCurrentPos(obj.getXPos() + 100, obj.getYPos(), 600);
os.setMaster(obj);
os.setMapFollowParent(obj);
os.setMapFollowType(1);
// sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
sq_AddObject(obj, os, OBJECTTYPE_CHARACTER, false);
}
}
getroottable()["LenheartFuncTab"].rawset("SoulSalvationFuncN", Lenheart_SoulSalvation_Fun);
L_Windows_List <- [];
getroottable().rawdelete("LenheartPluginsInitFlag");
getroottable().rawdelete("EventList_Obj")
getroottable().rawdelete("SoulSalvation_Obj");
getroottable().rawdelete("L_Each_Obj");