325 lines
12 KiB
Plaintext
325 lines
12 KiB
Plaintext
|
|
/*
|
||
|
|
文件名:Skill.nut
|
||
|
|
路径:User/Asset/Item/Skill.nut
|
||
|
|
创建日期:2025-02-17 17:05
|
||
|
|
文件用途:技能文件
|
||
|
|
*/
|
||
|
|
//技能图标窗口
|
||
|
|
class GameItem.SkillIcon extends CL_CanvasObject {
|
||
|
|
|
||
|
|
constructor(Skill, Flag) {
|
||
|
|
base.constructor();
|
||
|
|
ResizeAndClear(32, 32);
|
||
|
|
BeginDraw();
|
||
|
|
//构造图标 及图标边框
|
||
|
|
if (Skill.Icon) {
|
||
|
|
//图标
|
||
|
|
local Icon = CL_SpriteFrameObject(Skill.Icon.path, Flag ? Skill.Icon.index : Skill.Icon.index + 1);
|
||
|
|
DrawSpriteFrame(Icon, 0, 0);
|
||
|
|
|
||
|
|
//边框
|
||
|
|
local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62);
|
||
|
|
DrawSpriteFrame(IconFrame, 0, 0);
|
||
|
|
}
|
||
|
|
EndDraw();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//技能信息窗口
|
||
|
|
class GameItem.SkillInfo extends Yosin_Window {
|
||
|
|
//技能
|
||
|
|
Skill = null;
|
||
|
|
//画布
|
||
|
|
Canvas = null;
|
||
|
|
//画布实际高度
|
||
|
|
RealCanvasWidth = 257;
|
||
|
|
RealCanvasHeight = 0;
|
||
|
|
|
||
|
|
constructor(gSkill) {
|
||
|
|
this.Skill = gSkill.weakref();
|
||
|
|
base.constructor(clock() + "SkillInfo" + Skill.Name, 0, 0, 0, 0, 0);
|
||
|
|
|
||
|
|
Init();
|
||
|
|
|
||
|
|
local background = Yosin_NineBoxStretch(RealCanvasWidth, RealCanvasHeight + 10, "sprite/interface/lenheartwindowcommon.img", 213);
|
||
|
|
background.SetZOrder(-1);
|
||
|
|
Addchild(background);
|
||
|
|
}
|
||
|
|
|
||
|
|
function Init() {
|
||
|
|
Canvas = CL_CanvasObject();
|
||
|
|
Canvas.ResizeAndClear(RealCanvasWidth, 600);
|
||
|
|
Canvas.SetFillBrush(sq_RGBA(59, 56, 57, 250));
|
||
|
|
Canvas.SetStrokeBrush(sq_RGBA(59, 56, 57, 250));
|
||
|
|
Canvas.BeginDraw();
|
||
|
|
|
||
|
|
local GradeColor = sq_RGBA(194, 161, 56, 250);
|
||
|
|
if (Skill.Grade == 1) GradeColor = sq_RGBA(254, 181, 0, 250);
|
||
|
|
else if (Skill.Grade == 2) GradeColor = sq_RGBA(255, 119, 1, 250);
|
||
|
|
//绘制技能名字
|
||
|
|
local SkillName = FontAssetManager.GenerateNormal(Skill.Name + " Lv " + (Skill.Level + Skill.AddLevel), true, {
|
||
|
|
color = GradeColor
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(SkillName, 5, 7);
|
||
|
|
RealCanvasHeight += SkillName.GetSize().h;
|
||
|
|
|
||
|
|
//绘制技能名字2
|
||
|
|
local SkillName2 = FontAssetManager.GenerateNormal(Skill.Name2, true, {
|
||
|
|
color = GradeColor
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(SkillName2, 5, 22);
|
||
|
|
RealCanvasHeight += SkillName2.GetSize().h;
|
||
|
|
|
||
|
|
//绘制分割线
|
||
|
|
AddSliceLine();
|
||
|
|
|
||
|
|
//绘制技能等级
|
||
|
|
local SkillLevel = FontAssetManager.GenerateNormal("技能等级 : " + Skill.Level + Skill.AddLevel, true, {
|
||
|
|
color = sq_RGBA(135, 119, 80, 250)
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(SkillLevel, 5, RealCanvasHeight);
|
||
|
|
|
||
|
|
//消耗魔法值
|
||
|
|
local CostText = typeof Skill.DungeonSkillData.consume_mp == "array" ? Skill.DungeonSkillData.consume_mp[0] : Skill.DungeonSkillData.consume_mp;
|
||
|
|
local SkillCost = FontAssetManager.GenerateNormal("魔法值 : " + CostText, true, {
|
||
|
|
color = sq_RGBA(82, 206, 254, 250)
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(SkillCost, RealCanvasWidth - SkillCost.GetSize().w - 7, RealCanvasHeight);
|
||
|
|
RealCanvasHeight += SkillLevel.GetSize().h - 2;
|
||
|
|
|
||
|
|
//释放时间
|
||
|
|
local ReleaseTimeText = Skill.DungeonSkillData.rawin("casting_time") ? Skill.DungeonSkillData.casting_time.tofloat() / 1000.0 + " 秒" : "瞬发";
|
||
|
|
local ReleaseTime = FontAssetManager.GenerateNormal("释放时间 : " + ReleaseTimeText, true, {
|
||
|
|
color = sq_RGBA(133, 121, 78, 250)
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(ReleaseTime, 5, RealCanvasHeight);
|
||
|
|
local ConsumeYpos = RealCanvasHeight;
|
||
|
|
RealCanvasHeight += ReleaseTime.GetSize().h - 2;
|
||
|
|
|
||
|
|
//操作指令
|
||
|
|
local Command = FontAssetManager.GenerateNormal(Skill.CommandExplain, true, {
|
||
|
|
color = sq_RGBA(133, 121, 78, 250)
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(Command, 5, RealCanvasHeight);
|
||
|
|
RealCanvasHeight += Command.GetSize().h - 2;
|
||
|
|
|
||
|
|
//技能消耗道具
|
||
|
|
if (Skill.ConsumeItemId) {
|
||
|
|
local ConsumeItemCountText = typeof Skill.ConsumeItemCount == "array" ? Skill.ConsumeItemCount[0] : Skill.ConsumeItemCount;
|
||
|
|
local ConsumeItemCount = FontAssetManager.GenerateNormal("x" + ConsumeItemCountText, true, {
|
||
|
|
color = sq_RGBA(133, 121, 78, 250)
|
||
|
|
});
|
||
|
|
local XposOffset = RealCanvasWidth - ConsumeItemCount.GetSize().w - 6;
|
||
|
|
Canvas.DrawActor(ConsumeItemCount, XposOffset, ConsumeYpos + 16);
|
||
|
|
|
||
|
|
local ConsumeItemIcon = GameItem.Stackable(Skill.ConsumeItemId).GetIconSprite();
|
||
|
|
Canvas.DrawSprite(ConsumeItemIcon, XposOffset - ConsumeItemIcon.GetSize().w, ConsumeYpos + 6);
|
||
|
|
}
|
||
|
|
|
||
|
|
//冷却时间
|
||
|
|
local CoolDownText = Skill.DungeonSkillData.rawin("cooltime") ? (typeof Skill.DungeonSkillData.cooltime == "array" ? Skill.DungeonSkillData.cooltime[0].tofloat() / 1000.0 : Skill.DungeonSkillData.cooltime) + " 秒" : "无";
|
||
|
|
local CoolDown = FontAssetManager.GenerateNormal("冷却时间 : " + CoolDownText, true, {
|
||
|
|
color = sq_RGBA(103, 214, 236, 250)
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(CoolDown, 5, RealCanvasHeight);
|
||
|
|
RealCanvasHeight += CoolDown.GetSize().h - 2;
|
||
|
|
|
||
|
|
//绘制分割线
|
||
|
|
AddSliceLine();
|
||
|
|
|
||
|
|
//技能属性
|
||
|
|
if (Skill.Property) {
|
||
|
|
local SkillPropertyArrCount = Skill.Property.data.len() / 3;
|
||
|
|
//这里直接组装调用格式化的参数
|
||
|
|
local SkillPropertyTextCallList = [this, Skill.Property.explain];
|
||
|
|
for (local i = 0; i< SkillPropertyArrCount; i++) {
|
||
|
|
local ReadType = Skill.Property.data[i * 3];
|
||
|
|
if (ReadType< 0) {
|
||
|
|
//固定伤害
|
||
|
|
if (ReadType == -2) {
|
||
|
|
SkillPropertyTextCallList.push(Skill.GetLevelData(Skill.Property.data[i * 3 + 1]) * (ClientCharacter ? ClientCharacter.Attr.SeparateAttack : 1) * (Skill.Property.data[i * 3 + 2]));
|
||
|
|
}
|
||
|
|
//百分比伤害
|
||
|
|
else {
|
||
|
|
SkillPropertyTextCallList.push(Skill.GetLevelData(Skill.Property.data[i * 3 + 1]) * (Skill.Property.data[i * 3 + 2]));
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
//静态数据
|
||
|
|
SkillPropertyTextCallList.push(Skill.GetStaticData(Skill.Property.data[i * 3 + 1]) * (Skill.Property.data[i * 3 + 2]));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local SkillProperty = FontAssetManager.GenerateNormal(format.acall(SkillPropertyTextCallList) true, {
|
||
|
|
color = sq_RGBA(133, 121, 78, 250)
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(SkillProperty, 5, RealCanvasHeight);
|
||
|
|
RealCanvasHeight += SkillProperty.GetSize().h - 2;
|
||
|
|
|
||
|
|
//绘制分割线
|
||
|
|
AddSliceLine();
|
||
|
|
|
||
|
|
//描述
|
||
|
|
local SkillDescription = FontAssetManager.GenerateNormal(Skill.Explain, true, {
|
||
|
|
color = sq_RGBA(133, 121, 78, 250),
|
||
|
|
wrap_width = RealCanvasWidth - 8,
|
||
|
|
});
|
||
|
|
Canvas.DrawActor(SkillDescription, 5, RealCanvasHeight);
|
||
|
|
RealCanvasHeight += SkillDescription.GetSize().h - 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
Canvas.EndDraw();
|
||
|
|
Addchild(Canvas);
|
||
|
|
}
|
||
|
|
|
||
|
|
//增加分割行
|
||
|
|
function AddSliceLine() {
|
||
|
|
RealCanvasHeight += 9;
|
||
|
|
Canvas.DrawLine(3, RealCanvasHeight, RealCanvasWidth - 4, RealCanvasHeight);
|
||
|
|
RealCanvasHeight += 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
class GameItem.Skill {
|
||
|
|
//技能ID
|
||
|
|
Idx = -1;
|
||
|
|
//技能名称
|
||
|
|
Name = "无名称";
|
||
|
|
//技能名称2
|
||
|
|
Name2 = "无名称";
|
||
|
|
//最低学习等级
|
||
|
|
RequiredLevel = 1;
|
||
|
|
//学习等级间隔
|
||
|
|
RequiredLevelRange = 1;
|
||
|
|
//技能品阶
|
||
|
|
Grade = 0;
|
||
|
|
//技能类型
|
||
|
|
Type = 0;
|
||
|
|
//最大等级
|
||
|
|
MaxLevel = 1;
|
||
|
|
//图标
|
||
|
|
Icon = null;
|
||
|
|
//技能可学习职业
|
||
|
|
FitnessGrowType = null;
|
||
|
|
//简易技能描述
|
||
|
|
BasicExplain = null;
|
||
|
|
//技能描述
|
||
|
|
Explain = null;
|
||
|
|
//地下城技能数据
|
||
|
|
DungeonSkillData = null;
|
||
|
|
//操作指令描述
|
||
|
|
CommandExplain = null;
|
||
|
|
//操作指令
|
||
|
|
Command = null;
|
||
|
|
//当前等级
|
||
|
|
Level = 1;
|
||
|
|
//加成等级
|
||
|
|
AddLevel = 0;
|
||
|
|
//技能消耗道具
|
||
|
|
ConsumeItemId = null;
|
||
|
|
ConsumeItemCount = null;
|
||
|
|
//技能属性
|
||
|
|
Property = null;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function _typeof() {
|
||
|
|
return "Skill";
|
||
|
|
}
|
||
|
|
|
||
|
|
constructor(...) {
|
||
|
|
DungeonSkillData = {};
|
||
|
|
//直接裸构造
|
||
|
|
if (vargv.len() == 0) {
|
||
|
|
|
||
|
|
}
|
||
|
|
//通过参数构造
|
||
|
|
else if (vargv.len() == 2) {
|
||
|
|
local SkillInfo;
|
||
|
|
//通过ID构造
|
||
|
|
if (typeof vargv[0] == "integer") {
|
||
|
|
SkillInfo = AssetManager.GetSkill(vargv[0], vargv[1]);
|
||
|
|
Idx = vargv[1];
|
||
|
|
ConstructSkillFromScript(SkillInfo);
|
||
|
|
}
|
||
|
|
//通过Table来构造
|
||
|
|
else if (typeof vargv[0] == "table") {
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//通过脚本构造
|
||
|
|
function ConstructSkillFromScript(SkillInfo) {
|
||
|
|
//如果获取到对应的技能脚本信息
|
||
|
|
if (SkillInfo) {
|
||
|
|
//名称
|
||
|
|
if (SkillInfo.rawin("name")) Name = strip(SkillInfo["name"]);
|
||
|
|
//名称2
|
||
|
|
if (SkillInfo.rawin("name2")) Name2 = strip(SkillInfo["name2"]);
|
||
|
|
//最低学习等级
|
||
|
|
if (SkillInfo.rawin("required level")) RequiredLevel = SkillInfo["required level"];
|
||
|
|
//技能学习间隔
|
||
|
|
if (SkillInfo.rawin("required level range")) RequiredLevelRange = SkillInfo["required level range"];
|
||
|
|
//技能品阶
|
||
|
|
if (SkillInfo.rawin("skill fitness second growtype")) Grade = SkillInfo["skill fitness second growtype"];
|
||
|
|
//技能类型
|
||
|
|
if (SkillInfo.rawin("type")) Type = SkillInfo["type"];
|
||
|
|
//最大等级
|
||
|
|
if (SkillInfo.rawin("maximum level")) MaxLevel = SkillInfo["maximum level"];
|
||
|
|
//图标
|
||
|
|
if (SkillInfo.rawin("icon")) Icon = SkillInfo["icon"];
|
||
|
|
//技能可学习职业
|
||
|
|
if (SkillInfo.rawin("skill_fitness_growtype")) FitnessGrowType = SkillInfo["skill_fitness_growtype"];
|
||
|
|
//简易技能描述
|
||
|
|
if (SkillInfo.rawin("basic explain")) BasicExplain = SkillInfo["basic explain"];
|
||
|
|
//技能描述
|
||
|
|
if (SkillInfo.rawin("explain")) Explain = SkillInfo["explain"];
|
||
|
|
//地下城技能数据
|
||
|
|
if (SkillInfo.rawin("dungeon_data")) DungeonSkillData = SkillInfo["dungeon_data"];
|
||
|
|
//操作指令描述
|
||
|
|
if (SkillInfo.rawin("command key explain")) CommandExplain = SkillInfo["command key explain"];
|
||
|
|
//操作指令
|
||
|
|
if (SkillInfo.rawin("command")) Command = SkillInfo["command"];
|
||
|
|
//技能消耗道具
|
||
|
|
if (SkillInfo.rawin("consume_item")) {
|
||
|
|
ConsumeItemId = SkillInfo["consume_item"][0];
|
||
|
|
ConsumeItemCount = [SkillInfo["consume_item"][1], SkillInfo["consume_item"][2]]
|
||
|
|
}
|
||
|
|
//技能属性
|
||
|
|
if (SkillInfo.rawin("level_property")) Property = SkillInfo["level_property"];
|
||
|
|
} else error("没有对应的技能信息");
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//获取对应等级的动态数据
|
||
|
|
function GetLevelData(Index, gLevel = -1) {
|
||
|
|
if (gLevel == -1) gLevel = this.Level - 1;
|
||
|
|
if (DungeonSkillData.rawin("level_info")) {
|
||
|
|
if (DungeonSkillData.level_info.len() > gLevel) {
|
||
|
|
return DungeonSkillData["level_info"][gLevel][Index];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
//获取技能的静态数据
|
||
|
|
function GetStaticData(Index) {
|
||
|
|
if (DungeonSkillData.rawin("static_data")) {
|
||
|
|
if (DungeonSkillData.static_data.len() > Index) {
|
||
|
|
return DungeonSkillData["static_data"][Index];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
//获取技能图标
|
||
|
|
function GetIconSprite(Flag = true) {
|
||
|
|
return GameItem.SkillIcon(this, Flag);
|
||
|
|
}
|
||
|
|
|
||
|
|
//获取信息窗口
|
||
|
|
function GetInfoWindow() {
|
||
|
|
return GameItem.SkillInfo(this);
|
||
|
|
}
|
||
|
|
}
|