DOF/sqr/User/Asset/Item/Skill.nut

325 lines
12 KiB
Plaintext
Raw Normal View History

2025-02-20 13:53:36 +08:00
/*
文件名: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);
}
}