/* 文件名: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); } }