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);
 | |
|     }
 | |
| } |