/* 文件名:Equipment.nut 路径:User/Asset/Item/Equipment.nut 创建日期:2024-12-12 19:03 文件用途: */ //装备图标窗口 class GameItem.EquipmentIcon extends CL_CanvasObject { constructor(Equipment) { base.constructor(); ResizeAndClear(32, 32); BeginDraw(); //构造图标 及图标边框 if (Equipment.Icon) { //图标 local Icon = CL_SpriteFrameObject(Equipment.Icon.path, Equipment.Icon.index); DrawSpriteFrame(Icon, 0, 0); //是否封装 local IsPackage = Equipment.IsWrap; if (IsPackage && (Equipment.Rarity == 2 || Equipment.Rarity == 3)) { local IconFrame = CL_SpriteObject("sprite/interface/lenheartwindowcommon.img", 634); IconFrame.SetMode(0); DrawSprite(IconFrame); } //边框 local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62 + AssetManager.EtcConfig.ItemInfoTag.rarityframe_color_idx[Equipment.Rarity]); DrawSpriteFrame(IconFrame, 0, 0); } EndDraw(); } } //装备信息窗口 class GameItem.EquipmentInfo extends Yosin_Window { //装备 Equipment = null; //画布 Canvas = null; //画布实际高度 RealCanvasHeight = 0; constructor(Equipment) { this.Equipment = Equipment.weakref(); base.constructor(clock() + "EquipmentInfo" + Equipment.Idx, 0, 0, 0, 0, 0); Init(); local background = Yosin_NineBoxStretch(211, RealCanvasHeight + 10, "sprite/interface/lenheartwindowcommon.img", 213); background.SetZOrder(-1); Addchild(background); } function Init() { Canvas = CL_CanvasObject(); Canvas.ResizeAndClear(210, 600); Canvas.SetFillBrush(sq_RGBA(59, 56, 57, 250)); Canvas.SetStrokeBrush(sq_RGBA(59, 56, 57, 250)); Canvas.BeginDraw(); //构造图标 及图标边框 if (Equipment.Icon) { local Icon = GameItem.EquipmentIcon(Equipment); Canvas.DrawActor(Icon, 7, 7); } //绘制装备名称 if (Equipment.Name.len() > 0) { local UpgradeName = ""; local SeparateLevelName = ""; local DrawName = Equipment.Name; if (Equipment.Upgrade > 0) UpgradeName = "+" + Equipment.Upgrade; if (Equipment.SeparateLevel > 0) SeparateLevelName = "(" + Equipment.SeparateLevel + ")"; if ((Equipment.Upgrade + Equipment.SeparateLevel) > 0) DrawName = UpgradeName + SeparateLevelName + " " + DrawName; local EquName = FontAssetManager.GenerateNormal(DrawName, false, { color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Equipment.Rarity] }); Canvas.DrawActor(EquName, 41, 7); } //绘制分割线 Canvas.DrawLine(3, 37, 207, 38); //绘制品级 local Percentage = Equipment.Percentage; //品级文字 local PercentageGradeText = FontAssetManager.GenerateNormal(GetPercentageText(Percentage), false, { color = sq_RGBA(255, 240, 0, 255) }); //百分比UI local PercentageUI = CL_SpriteFrameObject("sprite/interface/lenheartwindowcommon.img", 633); Canvas.DrawSpriteFrame(PercentageUI, 48, 49, PercentageUI.GetSize().w * (Percentage.tofloat() / 100.0)); local PercentageUIBG = CL_SpriteFrameObject("sprite/interface/lenheartwindowcommon.img", 632); Canvas.DrawSpriteFrame(PercentageUIBG, 47, 48); //百分比文字 local PercentageText = FontAssetManager.GenerateNormal(format("(%d%%)", Percentage), false, { color = sq_RGBA(161, 131, 74, 255) }); Canvas.DrawActor(PercentageGradeText, 6, 41); Canvas.DrawActor(PercentageText, 130, 41); //绘制稀有度名称 local RarityTagName = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.rarity_name_tag[Equipment.Rarity], false, { color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Equipment.Rarity] }); Canvas.DrawActor(RarityTagName, 210 - RarityTagName.GetSize().w - 6, 41); //绘制重量 local WeightText = FontAssetManager.GenerateNormal((Equipment.Weight.tofloat() / 1000.0) + "kg", false, { color = sq_RGBA(161, 131, 74, 255) }); Canvas.DrawActor(WeightText, 6, 57); //绘制最低多少级可以使用 local MinUseLevelText = FontAssetManager.GenerateNormal(Equipment.Minimum_level + "级以上可以使用", false, { color = sq_RGBA(161, 131, 74, 255) }); Canvas.DrawActor(MinUseLevelText, 210 - MinUseLevelText.GetSize().w - 6, 57); //绘制交易类型 如果有主体属性读取 否则一律为封装 local TradeType = Equipment.TradeType; local TradeTypeText = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.trade_type_text[TradeType], false, { color = AssetManager.EtcConfig.ItemInfoTag.trade_type_color[TradeType] }); Canvas.DrawActor(TradeTypeText, 210 - TradeTypeText.GetSize().w - 6, 73); //绘制装备类型 local GroupNameText = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.item_group_name_table[Equipment.GroupName], false, { color = sq_RGBA(194, 161, 56, 255) }); Canvas.DrawActor(GroupNameText, 210 - GroupNameText.GetSize().w - 6, 89); //绘制售价 local RealSellPrice = (Equipment.SellPrice == -1 ? (Equipment.Price == -1 ? 0 : Equipment.Price) : Equipment.SellPrice) / 5; local SellPriceText = FontAssetManager.GenerateNormal(RealSellPrice + "金币", false, { color = sq_RGBA(133, 121, 78, 255) }); Canvas.DrawActor(SellPriceText, 210 - SellPriceText.GetSize().w - 6, 105); //绘制耐久度 local DurabilityText = FontAssetManager.GenerateNormal("耐久度 " + (Equipment.CurrentDurability == -1 ? Equipment.Durability : Equipment.CurrentDurability) + "/" + Equipment.Durability, false, { color = sq_RGBA(133, 121, 80, 255) }); Canvas.DrawActor(DurabilityText, 6, 121); //绘制分割线 Canvas.DrawLine(3, 139, 207, 139); //下面的绘制逻辑开始使用行put来做 RealCanvasHeight = 141; //绘制冒险家名望 local AdventurerFameFrame = CL_SpriteFrameObject("sprite/interface2/profile/profile_cn/profile_cn.img", 0); Canvas.DrawSpriteFrame(AdventurerFameFrame, 6, RealCanvasHeight + 3); local AdventurerFame = FontAssetManager.GenerateNormal("冒险家名望 " + Equipment.AdventurerFame, false, { color = sq_RGBA(133, 121, 80, 255) }); Canvas.DrawActor(AdventurerFame, 22, RealCanvasHeight); //绘制分割 AddSliceLine(); //绘制强化和增幅逻辑 if ((Equipment.Upgrade + Equipment.SeparateLevel) > 0) { local UpgradeInfo; if (Equipment.Upgrade > 0) { UpgradeInfo = FontAssetManager.GenerateNormal("+" + Equipment.Upgrade + " 强化 ,", false, { color = sq_RGBA(103, 214, 236, 255) }); Canvas.DrawActor(UpgradeInfo, 6, RealCanvasHeight); } if (Equipment.SeparateLevel > 0) { local SeparateLevelInfo = FontAssetManager.GenerateNormal("+" + Equipment.SeparateLevel + " 锻造", false, { color = sq_RGBA(180, 106, 254, 255) }); Canvas.DrawActor(SeparateLevelInfo, UpgradeInfo ? UpgradeInfo.GetSize().w : 6, RealCanvasHeight); } AddHeight(); } //绘制物理攻击力 DrawAttack("EquipmentPhysicalAttack", "物理攻击力"); //绘制魔法攻击力 DrawAttack("EquipmentMagicalAttack", "魔法攻击力"); //绘制独立攻击力 DrawAttack("SeparateAttack", "独立攻击力"); //绘制物理防御力 DrawAttack("EquipmentPhysicalDefense", "物理防御力"); //绘制魔法防御力 DrawAttack("EquipmentMagicalDefense", "魔法防御力"); //绘制四维 DrawAttribute("PhysicalAttack", "力量"); DrawAttribute("MagicalAttack", "智力"); DrawAttribute("PhysicalDefense", "体力"); DrawAttribute("MagicalDefense", "精神"); //绘制分割 Canvas.DrawLine(3, RealCanvasHeight + 3, 207, RealCanvasHeight + 3); RealCanvasHeight += 6; //绘制三速 DrawSpeed("AttackSpeed", "攻击速度"); DrawSpeed("CastSpeed", "释放速度"); DrawSpeed("MoveSpeed", "移动速度"); //绘制双爆 DrawCritical("PhysicalCriticalHit", "物理暴击率"); DrawCritical("MagicalCriticalHit", "魔法暴击率"); //绘制命中率 DrawStuck("Stuck", "命中率"); //绘制四属抗 DrawElement("DarkResistance", "暗属性抗性"); DrawElement("LightResistance", "光属性抗性"); DrawElement("FireResistance", "火属性抗性"); DrawElement("WaterResistance", "水属性抗性"); //绘制四属强 DrawElement("DarkAttack", "暗属性强化"); DrawElement("LightAttack", "光属性强化"); DrawElement("FireAttack", "火属性强化"); DrawElement("WaterAttack", "水属性强化"); //绘制属性攻击 if (Equipment.Attr.ElementalProperty.len() > 0) { local Text = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.elemental_property_tag[Equipment.Attr.ElementalProperty[0].tostring()], false, { color = sq_RGBA(215, 196, 147, 255) }); Canvas.DrawActor(Text, 6, RealCanvasHeight); AddHeight(); } //绘制描述 if (Equipment.FlavorText) { //绘制分割 Canvas.DrawLine(3, RealCanvasHeight + 3, 207, RealCanvasHeight + 3); RealCanvasHeight += 6; local Text = FontAssetManager.GenerateNormal(Equipment.FlavorText, false, { color = sq_RGBA(133, 121, 80, 255), wrap_width = 204 }); Canvas.DrawActor(Text, 6, RealCanvasHeight); RealCanvasHeight += Text.GetSize().h; } Canvas.EndDraw(); Addchild(Canvas); } //绘制属强属抗 function DrawElement(Type, TypeName) { if (Equipment.Attr[Type] != 0) { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Equipment.Attr[Type] >= 0 ? "+" : "-") + Equipment.Attr[Type], false, { color = sq_RGBA(215, 196, 147, 255) }); Canvas.DrawActor(AttackText, 6, RealCanvasHeight); AddHeight(); } } //绘制命中 function DrawStuck(Type, TypeName) { if (Equipment.Attr[Type] != 0) { local Value = Equipment.Attr[Type]; local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Value >= 0 ? "+" : "") + Value + "%", false, { color = sq_RGBA(215, 196, 147, 255) }); Canvas.DrawActor(AttackText, 6, RealCanvasHeight); AddHeight(); } } //绘制双爆 function DrawCritical(Type, TypeName) { if (Equipment.Attr[Type] != 0) { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Equipment.Attr[Type] >= 0 ? "+" : "-") + Equipment.Attr[Type] + "%", false, { color = sq_RGBA(215, 196, 147, 255) }); Canvas.DrawActor(AttackText, 6, RealCanvasHeight); AddHeight(); } } //绘制三速 function DrawSpeed(Type, TypeName) { if (Equipment.Attr[Type] != 0) { local Value = (Equipment.Attr[Type].tofloat() * 0.1).tointeger(); local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Value >= 0 ? "+" : "-") + Value + "%", false, { color = sq_RGBA(215, 196, 147, 255) }); Canvas.DrawActor(AttackText, 6, RealCanvasHeight); AddHeight(); } } //绘制四维 function DrawAttribute(Type, TypeName) { if (Equipment.Attr[Type] != 0) { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + Equipment.Attr[Type], false, { color = sq_RGBA(134, 120, 79, 255) }); Canvas.DrawActor(AttackText, 6, RealCanvasHeight); AddHeight(); } } //绘制三攻 function DrawAttack(Type, TypeName) { if (Equipment.Attr[Type]) { local RealValue; //数组为没有百分比计算过的原始数据 if (typeof Equipment.Attr[Type] == "array") { local MaxValue = Equipment.Attr[Type][0]; local MinValue = Equipment.Attr[Type][1]; local Rate = 1.0; RealValue = (MinValue + ((MaxValue - MinValue).tofloat() * Rate).tointeger()); } //百分比计算过的数据 else if (typeof Equipment.Attr[Type] == "integer" || typeof Equipment.Attr[Type] == "float") { RealValue = Equipment.Attr[Type]; } local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + RealValue, false, { color = sq_RGBA(134, 120, 79, 255) }); Canvas.DrawActor(AttackText, 6, RealCanvasHeight); AddHeight(); } } //增加行高 function AddHeight() { RealCanvasHeight += 16; } //增加分割行 function AddSliceLine() { RealCanvasHeight += 18; Canvas.DrawLine(3, RealCanvasHeight, 207, RealCanvasHeight); RealCanvasHeight += 2; } // 根据数值获取对应的品级文字 function GetPercentageText(num) { if (num< AssetManager.EtcConfig.ItemInfoTag.percentage_range_boundaries[0]) { return AssetManager.EtcConfig.ItemInfoTag.percentage_text[0]; } for (local i = 0; i< AssetManager.EtcConfig.ItemInfoTag.percentage_range_boundaries.len(); i++) { if (num <= AssetManager.EtcConfig.ItemInfoTag.percentage_range_boundaries[i]) { return AssetManager.EtcConfig.ItemInfoTag.percentage_text[i + 1]; } } return AssetManager.EtcConfig.ItemInfoTag.percentage_text.top(); } } class GameItem.Equipment extends GameItem.Item { //装备ID Idx = -1; //装备名称 Name = ""; //强化或增幅等级 Upgrade = 0; //锻造等级 SeparateLevel = 0; //增幅属性 0 无 1 力量 2 智力 3 体力 4 精神 EquipIncrease = 0; //是否封装 IsWrap = 0; //在封装次数 WrapCount = 0; //交易类型 TradeType = 0; //装备类型 Type = -1; //装备槽位 SlotType = -1; //装备可穿戴等级 Minimum_level = -1; //装备等级组 Grade = null; //装备稀有度 Rarity = 0; //重量 Weight = 0; //装备组名 GroupName = "null"; //购买价格 Price = -1; //维修价格 RepairPrice = -1; //出售价格 SellPrice = -1; //耐久度 Durability = -1; //当前耐久度 CurrentDurability = -1; //装备品质 Percentage = 100; //冒险家名望 AdventurerFame = 0; //装备可穿戴职业 Job = 0; //装备图标 Icon = null; //动画 Animation_Job = null; //装备描述 Description = ""; //文件路径 DirPath = null; //光环特效 Aurora_effects = null; //装备属性 Attr = null; //描述 FlavorText = null; //隐藏图层 HideLayer = null; //拓展Ani路径 ExpandPath = null; function _typeof() { return "Equipment"; } constructor(...) { //直接裸构造 if (vargv.len() == 0) { } //通过参数构造 else if (vargv.len() == 1) { local EquInfo; //通过ID构造 if (typeof vargv[0] == "integer") { EquInfo = AssetManager.GetEquipment(vargv[0]); Idx = vargv[0]; ConstructEquipmentFromScript(EquInfo); } //通过Table来构造 else if (typeof vargv[0] == "table") { local Info = vargv[0]; EquInfo = AssetManager.GetEquipment(Info.EquipId); Idx = Info.EquipId; ConstructEquipmentFromScript(EquInfo); IterateEquipmentBasedOnActualEquipmentInformation(Info); } } } //根据装备实际信息迭代装备 function IterateEquipmentBasedOnActualEquipmentInformation(Info) { //装备附魔 //TODO //装备强化等级或增幅等级 this.Upgrade = Info.EquipUpgrade; //装备锻造等级 this.SeparateLevel = Info.EquipSeparate; //装备增幅属性 this.EquipIncrease = Info.EquipIncrease; //装备力量百分比 this.Attr.PhysicalAttack *= (Info.EquipPowerPercentage.tofloat() / 100.0); //装备智力百分比 this.Attr.MagicalAttack *= (Info.EquipIntellectPercentage.tofloat() / 100.0); //装备体力百分比 this.Attr.PhysicalDefense *= (Info.EquipStaminaPercentage.tofloat() / 100.0); //装备精神百分比 this.Attr.MagicalDefense *= (Info.EquipSpiritPercentage.tofloat() / 100.0); //装备物理攻击百分比 if (this.Attr.EquipmentPhysicalAttack) this.Attr.EquipmentPhysicalAttack = this.Attr.EquipmentPhysicalAttack[0] + ((this.Attr.EquipmentPhysicalAttack[1] - this.Attr.EquipmentPhysicalAttack[0]) * (Info.EquipPhysicalAttackPercentage.tofloat() / 100.0)); //装备魔法攻击百分比 if (this.Attr.EquipmentMagicalAttack) this.Attr.EquipmentMagicalAttack = this.Attr.EquipmentMagicalAttack[0] + ((this.Attr.EquipmentMagicalAttack[1] - this.Attr.EquipmentMagicalAttack[0]) * (Info.EquipMagicAttackPercentage.tofloat() / 100.0)); //装备独立攻击百分比 if (this.Attr.SeparateAttack) this.Attr.SeparateAttack = this.Attr.SeparateAttack[0] + ((this.Attr.SeparateAttack[1] - this.Attr.SeparateAttack[0]) * (Info.EquipIndependentAttackPercentage.tofloat() / 100.0)); //装备物理防御百分比 if (this.Attr.EquipmentPhysicalDefense) this.Attr.EquipmentPhysicalDefense = this.Attr.EquipmentPhysicalDefense[0] + ((this.Attr.EquipmentPhysicalDefense[1] - this.Attr.EquipmentPhysicalDefense[0]) * (Info.EquipPhysicalDefensePercentage.tofloat() / 100.0)); //装备魔法防御百分比 if (this.Attr.EquipmentMagicalDefense) this.Attr.EquipmentMagicalDefense = this.Attr.EquipmentMagicalDefense[0] + ((this.Attr.EquipmentMagicalDefense[1] - this.Attr.EquipmentMagicalDefense[0]) * (Info.EquipMagicDefensePercentage.tofloat() / 100.0)); //装备全属强 if (this.Attr.AllElementalAttack > 0) this.Attr.AllElementalAttack = (this.Attr.AllElementalAttack, 0.15, (Info.EquipAllElementalAttack.tofloat() / 100.0)); //装备水属强 if (this.Attr.WaterAttack > 0) this.Attr.WaterAttack = Math.getFinalValueByFloatRate(this.Attr.WaterAttack, 0.15, (Info.EquipWaterAttack.tofloat() / 100.0)); //装备火属强 if (this.Attr.FireAttack > 0) this.Attr.FireAttack = Math.getFinalValueByFloatRate(this.Attr.FireAttack, 0.15, (Info.EquipFireAttack.tofloat() / 100.0)); //装备光属强 if (this.Attr.LightAttack > 0) this.Attr.LightAttack = Math.getFinalValueByFloatRate(this.Attr.LightAttack, 0.15, (Info.EquipLightAttack.tofloat() / 100.0)); //装备暗属强 if (this.Attr.DarkAttack > 0) this.Attr.DarkAttack = Math.getFinalValueByFloatRate(this.Attr.DarkAttack, 0.15, (Info.EquipDarkAttack.tofloat() / 100.0)); //装备品质 this.Percentage = Info.EquipPercentage; //装备再封装次数 this.WrapCount = Info.EquipWrapCount; //装备是否封装 this.IsWrap = Info.EquipIsWrap; //耐久度 this.CurrentDurability = Info.EquipDurability; //交易类型 this.TradeType = Info.EquipTradeType; } //根据装备脚本信息构造装备 function ConstructEquipmentFromScript(EquInfo) { //如果获取到对应的装备脚本信息 if (EquInfo) { //名称 if (EquInfo.rawin("name")) Name = strip(EquInfo["name"]); //类型 if (EquInfo.rawin("type")) GetRealEquipmentType(EquInfo["type"].path); //最低使用等级 if (EquInfo.rawin("minimum level")) Minimum_level = EquInfo["minimum level"]; //等级组 if (EquInfo.rawin("grade")) Grade = EquInfo["grade"]; //稀有度 if (EquInfo.rawin("rarity")) Rarity = EquInfo["rarity"]; //重量 if (EquInfo.rawin("weight")) Weight = EquInfo["weight"]; //组名 if (EquInfo.rawin("item group name")) GroupName = EquInfo["item group name"]; //购买价格 if (EquInfo.rawin("price")) Price = EquInfo["price"]; //维修价格 if (EquInfo.rawin("repair price")) RepairPrice = EquInfo["repair price"]; //出售价格 if (EquInfo.rawin("value")) SellPrice = EquInfo["value"]; //耐久度 if (EquInfo.rawin("durability")) Durability = EquInfo["durability"]; //冒险家名望 if (EquInfo.rawin("adventurerfame")) AdventurerFame = EquInfo["adventurerfame"]; //职业 if (EquInfo.rawin("usable_job")) Job = EquInfo["usable_job"]; //图标 if (EquInfo.rawin("icon")) Icon = EquInfo["icon"]; if (EquInfo.rawin("Ani")) Animation_Job = EquInfo["Ani"]; if (EquInfo.rawin("DirPath")) DirPath = EquInfo["DirPath"]; if (EquInfo.rawin("aurora_effects")) Aurora_effects = EquInfo["aurora_effects"]; //描述 if (EquInfo.rawin("flavor text")) FlavorText = EquInfo["flavor text"]; //隐藏图层 if (EquInfo.rawin("hide_layer")) HideLayer = EquInfo["hide_layer"]; //拓展Ani路径 if (EquInfo.rawin("expand_path")) ExpandPath = EquInfo["expand_path"]; //属性 Attr = Attribute(EquInfo); } else error("没有对应的装备信息"); } //设置真实装备类型 function SetRealEquipmentType(AType, BType) { SlotType = AType; Type = BType; } //获取真实装备类型 function GetRealEquipmentType(EType) { //时装 if (EType == "weapon avatar") SetRealEquipmentType("weapon_avatar", "avatar"); else if (EType == "aurora avatar") SetRealEquipmentType("aurora_avatar", "avatar"); else if (EType == "hair avatar") SetRealEquipmentType("hair_avatar", "avatar"); else if (EType == "hat avatar") SetRealEquipmentType("hat_avatar", "avatar"); else if (EType == "face avatar") SetRealEquipmentType("face_avatar", "avatar") else if (EType == "breast avatar") SetRealEquipmentType("breast_avatar", "avatar") else if (EType == "coat avatar") SetRealEquipmentType("coat_avatar", "avatar") else if (EType == "skin avatar") SetRealEquipmentType("skin_avatar", "avatar") else if (EType == "waist avatar") SetRealEquipmentType("waist_avatar", "avatar") else if (EType == "pants avatar") SetRealEquipmentType("pants_avatar", "avatar") else if (EType == "shoes avatar") SetRealEquipmentType("shoes_avatar", "avatar"); //称号和魔法石 else if (EType == "title name") SetRealEquipmentType("title_name", "equipment"); else if (EType == "magic stone") SetRealEquipmentType("magic_stone", "equipment"); //普通装备 else SetRealEquipmentType(EType, "equipment"); } //穿戴装备回调 function OnWearStart() { } //穿戴时 function OnWearProc(Dt) { } //卸载时 function OnWearEnd() { } }