public bool TheCardEffectThatICantDoInACSharpFile(Player player, EntrogicPlayer ePlayer, ModCard card) { if (ePlayer.IsDestroyNextCard_InnerRage) { ePlayer.IsDestroyNextCard_InnerRage = false; List <int> elementCardNumber = new List <int>(); for (int i = 0; i < ePlayer.CardReadyType.Length; i++) { if (ePlayer.CardReadyType[i] == 0) { continue; } Item item = new Item(); item.SetDefaults(ePlayer.CardReadyType[i]); ModItem modItem = item.modItem; ModCard modCard = (ModCard)modItem; if (modCard.series == CardSeriesID.Element) { elementCardNumber.Add(i); } } if (elementCardNumber.Count > 0) { int chooseCard = Main.rand.Next(0, elementCardNumber.Count); ePlayer.CardSetToGrave(ePlayer.CardHandType[number], number, true, 1, true); ePlayer.CardHandType[number] = ePlayer.CardReadyType[elementCardNumber[chooseCard]]; ePlayer.CardHandCost[number] = ePlayer.CardReadyCost[elementCardNumber[chooseCard]]; ePlayer.CardReadyType[elementCardNumber[chooseCard]] = 0; ePlayer.CardReadyCost[elementCardNumber[chooseCard]] = 0; return(false); } return(true); } return(true); }
public void ActiveAnimation() { StartAnimation = true; AnimationTimer = 0; Player clientPlayer = Main.LocalPlayer; EntrogicPlayer clientModPlayer = EntrogicPlayer.ModPlayer(clientPlayer); NPC npc = Main.npc[clientModPlayer.CardGameNPCIndex]; CardFightableNPC fightNPC = (CardFightableNPC)npc.modNPC; Item item = new Item(); // 命名空间的第一个字符串即为Mod内部名(当然乱命名也没法了) Mod currentCardMod = ModLoader.GetMod(fightNPC.currentCard.GetType().FullName.Split('.')[0]); // 通过类名寻找相应物品 item.SetDefaults(currentCardMod.GetItem(fightNPC.currentCard.GetType().Name).item.type); inventoryItem = item; //foreach (var card in Entrogic.ModItems) //{ // // 通过命名空间寻找相应卡牌 // if (card.GetType().FullName == fightNPC.currentCard.GetType().FullName) // { // Item item = new Item(); // item.SetDefaults(card.item.type); // inventoryItem = item; // } //} }
public override void HoldItem(Player player) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); for (int i = 0; i < ePlayer.CardType.Length; i++) { try { if (ePlayer.CardType[i] != 0) { Item Item = new Item(); Item.SetDefaults(ePlayer.CardType[i]); if (((ModCard)Item.modItem).series != CardSeriesID.Undead) { return; } } } catch { return; } } ePlayer.CardHandMax++; ePlayer.ManaMax++; }
public override void Draw(SpriteBatch spriteBatch) { Player clientPlayer = Main.LocalPlayer; EntrogicPlayer clientModPlayer = EntrogicPlayer.ModPlayer(clientPlayer); bool Animationing = StartAnimation && AnimationTimer >= 1 ? true : false; uiWidth = 38; uiHeight = 50; NPC npc = Main.npc[clientModPlayer.CardGameNPCIndex]; CardFightableNPC fightNPC = (CardFightableNPC)npc.modNPC; if (Animationing) { Texture2D t = Main.itemTexture[inventoryItem.type]; var frame = Main.itemAnimations[inventoryItem.type] != null ? Main.itemAnimations[inventoryItem.type].GetFrame(Main.itemTexture[inventoryItem.type]) : Main.itemTexture[inventoryItem.type].Frame(1, 1, 0, 0); Main.spriteBatch.SafeEnd(); Main.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Main.UIScaleMatrix); // Retrieve reference to shader var whiteBlur = GameShaders.Misc["Entrogic:WhiteBlur"]; // Reset back to default value. whiteBlur.UseOpacity(0f); if (AnimationTimer > 15f) { whiteBlur.UseOpacity(MathHelper.Min((AnimationTimer - 15f) / 14f, 1f)); } whiteBlur.Apply(null); spriteBatch.Draw(t, AnimationPosition + fatherPosition, (Rectangle?)frame, Color.White); // As mentioned above, be sure not to forget this step. Main.spriteBatch.SafeEnd(); Main.spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, Main.DefaultSamplerState, null, null, null, Main.UIScaleMatrix); } }
public void Update() { if (Main.dedServ) { return; } Player clientPlayer = Main.LocalPlayer; EntrogicPlayer clientModPlayer = EntrogicPlayer.ModPlayer(clientPlayer); if (clientModPlayer.CardGameNPCIndex == -1) { return; } NPC npc = Main.npc[clientModPlayer.CardGameNPCIndex]; if (StartAnimation) { Vector2 TargetPosition = new Vector2(274f, 90f); AnimationTimer++; if (AnimationTimer <= 15f) { AnimationPosition = (TargetPosition - uiPosition) / 15f * AnimationTimer + uiPosition; } else if (AnimationTimer >= 30f) { // 出击 // 我不想再改代码了,所以这里直接消失掉吧 StartAnimation = false; } } }
public override void ClickEvent() { if (Main.dedServ || StartAnimation) { return; } Player clientPlayer = Main.LocalPlayer; EntrogicPlayer clientModPlayer = EntrogicPlayer.ModPlayer(clientPlayer); if (clientModPlayer.CardGameNPCIndex == -1) { return; } NPC npc = Main.npc[clientModPlayer.CardGameNPCIndex]; CardFightableNPC fightNPC = (CardFightableNPC)npc.modNPC; if (!PlayerTurn || clientModPlayer.CardGameLeftCard <= 0) { return; } clientModPlayer.CardGameLeftCard--; //Clicked = true; StartAnimation = true; AnimationTimer = 0; }
public override void UpdateAccessory(Player player, bool hideVisual) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); ePlayer.CanSwimTile = true; player.buffImmune[BuffID.Suffocation] = true; }
public override void UpdateUI(GameTime gameTime) { Player player = Main.LocalPlayer; EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); if (BookUIE != null && BookUI.IsActive) { BookUIE.Update(gameTime); } //if (BookPageUIE != null && Main.LocalPlayer.GetModPlayer<EntrogicPlayer>().ActiveBook) // BookPageUIE.Update(gameTime); if (CardUIE != null && CardUI.IsActive) { CardUIE.Update(gameTime); } if (CardInventoryUIE != null && CardInventoryUI.IsActive) { CardInventoryUIE.Update(gameTime); } if (CardGameUIE != null && ePlayer.CardGameActive) { CardGameUIE.Update(gameTime); } //if (Main.netMode != NetmodeID.MultiplayerClient) //{ int texNum = mimicryFrameCounter / 5; Main.itemTexture[ModContent.ItemType <拟态魔能>()] = ModTexturesTable[$"拟态魔能_{texNum.ToString()}"]; //} }
protected override void DrawSelf(SpriteBatch spriteBatch) { //base.DrawSelf(spriteBatch); // HelpGrid是隐形的 Player player = Main.LocalPlayer; EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); int type = ePlayer.CardHandType[number]; Item ContainedItem = new Item(); ContainedItem.SetDefaults(type); if (ContainedItem.type != ItemID.None) { Texture2D tex = Main.itemTexture[type]; int alpha = 80; if (IsMouseHovering) { alpha = 255; } var frame = Main.itemAnimations[ContainedItem.type] != null ? Main.itemAnimations[ContainedItem.type].GetFrame(Main.itemTexture[ContainedItem.type]) : Main.itemTexture[ContainedItem.type].Frame(1, 1, 0, 0); spriteBatch.Draw(tex, position + Size * 0.5f - tex.Size() * 0.5f, new Rectangle?(frame), new Color(alpha, alpha, alpha, alpha), 0f, Vector2.Zero, Vector2.One, SpriteEffects.None, 0f); } if (IsMouseHovering && type != 0 && ContainedItem != null) { Main.hoverItemName = ContainedItem.Name + "\r\n费用:" + ePlayer.CardHandCost[number]; if (!hasTicked) { Main.PlaySound(SoundID.MenuTick); hasTicked = true; } } else { hasTicked = false; } }
public void StartGame() { Player clientPlayer = Main.LocalPlayer; EntrogicPlayer clientModPlayer = EntrogicPlayer.ModPlayer(clientPlayer); NPC npc = Main.npc[clientModPlayer.CardGameNPCIndex]; CardFightableNPC fightNPC = (CardFightableNPC)npc.modNPC; clientModPlayer.CardGamePlayerHealth = clientModPlayer.CardGamePlayerMaxHealth; clientModPlayer.CardGameActive = true; clientModPlayer.CardGaming = true; fightNPC.CardGameHealth = fightNPC.CardGameHealthMax; fightNPC.CardGaming = true; Main.npcChatText = ""; PlayerTurnOver = false; clientModPlayer.CardGamePlayerTurn = true; IsUseBiggerTexture = true; clientModPlayer._bullets.Clear(); clientModPlayer._particles.Clear(); clientModPlayer.CardGameLeftCard = 1; //List<int> buffer = new List<int>(); //foreach (int card in clientModPlayer.CardType) // buffer.Add(card); //for (int i = 0; i < clientModPlayer.CardGameType.Length; i++) //{ // int chosed = Main.rand.Next(0, buffer.Count); // clientModPlayer.CardGameType[i] = buffer[chosed]; // buffer.RemoveAt(chosed); //} Main.PlaySound(Entrogic.Instance.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/CGChangeTurn")); TimerCountdown = 0; AnimationTimer = 0; TurnText = Language.GetTextValue("Mods.Entrogic.Common.PlayerTurn"); }
private void Clicked(UIMouseEvent evt, UIElement listeningElement) { Player player = Main.LocalPlayer; EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); Vector2 bookPos = new Vector2((Main.screenWidth - bookSize.X) / 2, (Main.screenHeight - bookSize.Y) / 2); Rectangle rectLeft = new Rectangle((int)bookPos.X, (int)(bookPos.Y + bookSize.Y - 117), 72, 117); Rectangle rectRight = new Rectangle((int)(bookPos.X + bookSize.X - 72), (int)(bookPos.Y + bookSize.Y - 117), 72, 117); if (mouseRect.Intersects(rectLeft) && ePlayer.PageNum > 1) { Main.PlaySound(SoundID.MenuOpen); ePlayer.PageNum -= 1; MessageHelper.SendBookInfo(Main.LocalPlayer.whoAmI, ePlayer.PageNum, ePlayer.IsBookActive); } int MaxPage = 1; if (ePlayer.GetHoldItem() != null) { if (ePlayer.GetHoldItem().GetGlobalItem <EntrogicItem>().book) { MaxPage = ((ModBook)ePlayer.GetHoldItem().modItem).MaxPage; } } if (mouseRect.Intersects(rectRight) && ePlayer.PageNum < MaxPage) { Main.PlaySound(SoundID.MenuOpen); ePlayer.PageNum += 1; MessageHelper.SendBookInfo(Main.LocalPlayer.whoAmI, ePlayer.PageNum, ePlayer.IsBookActive); } }
public override void Draw(SpriteBatch spriteBatch) { Player player = Main.LocalPlayer; EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); if (!BookUI.IsActive) { return; } if (ePlayer.GetHoldItem() != null) { if (ePlayer.GetHoldItem().GetGlobalItem <EntrogicItem>().book) { if (((ModBook)ePlayer.GetHoldItem().modItem).PageTexture[num] != null) { tex = ((ModBook)ePlayer.GetHoldItem().modItem).PageTexture[num]; } } } float alpha = 1.0f; //base.Draw(spriteBatch); // 不使用原绘制方案 ChatManager.DrawColorCodedString(spriteBatch, Main.fontMouseText, ePlayer.PageNum.ToString(), new Vector2(Left.Pixels, Top.Pixels), Color.White, 0f, Vector2.Zero, Vector2.One); spriteBatch.Draw(tex, new Vector2(Left.Pixels, Top.Pixels), null, new Color(alpha, alpha, alpha, alpha), 0f, Vector2.Zero, Vector2.One, SpriteEffects.None, 0f); }
private void DrawBulletsParticles(SpriteBatch spriteBatch, bool allowPanelEntity = false) { EntrogicPlayer clientModPlayer = EntrogicPlayer.ModPlayer(Main.LocalPlayer); // Draw子弹 foreach (var bullet in clientModPlayer._bullets.ToArray()) { if (bullet.IsRemoved) { continue; } if ((bullet.Position.X < -108f || bullet.Position.Y < -62f || bullet.Position.X + bullet.Size.X > 432f || bullet.Position.Y + bullet.Size.Y > 316f) && (!allowPanelEntity || !bullet.IsPanelBullet)) { continue; } bullet.Draw(spriteBatch); } // Draw粒子 foreach (var particle in clientModPlayer._particles.ToArray()) { if (particle.IsRemoved) { continue; } if ((particle.Position.X < 0f || particle.Position.Y < 0f || particle.Position.X + particle.Size.X > PanelSize.X || particle.Position.Y + particle.Size.Y > PanelSize.Y) && (!allowPanelEntity || !particle.IsPanelParticle)) { continue; } particle.Draw(spriteBatch); } }
public override void MinionEffects(Player player, Vector2 position, int damage, float knockBack, int number) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); for (int i = 0; i < ePlayer.CardReadyType.Length; i++) { bool hasCard = false; if (ePlayer.CardReadyType[i] == 0) { for (int j = 0; j < ePlayer.CardGraveType.Length; j++) { if (ePlayer.CardGraveType[j] != 0) { ePlayer.CardReadyType[i] = ePlayer.CardGraveType[j]; Item item = new Item(); item.SetDefaults(ePlayer.CardGraveType[j]); ModCard card = (ModCard)item.modItem; ePlayer.CardReadyCost[i] = card.costMana; ePlayer.CardGraveType[j] = 0; hasCard = true; break; } } if (!hasCard) { break; } } ePlayer.CardReadyCost[i]++; } }
public override void SpecialEffects(Player player, Vector2 position, int damage, float knockBack, int number, int packType, bool special, bool drawCard) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); // 角度变化 for (int a = 0; a < 4; a++) { // 角度变化 for (float rad = -MathHelper.TwoPi / 16f; rad < MathHelper.TwoPi; rad += MathHelper.TwoPi / 8f) { Vector2 finalVec = (0f + rad).ToRotationVector2() * 20f; // 射出去! int p = Projectile.NewProjectile(player.position, finalVec, item.shoot, damage, knockBack, player.whoAmI); Main.projectile[p].timeLeft += a * 15; } } if (ePlayer.LibNum <= 0) { return; } while (true) { for (int i = 0; i < ePlayer.CardReadyType.Length; i++) { if (Main.rand.NextBool(5) && ePlayer.CardReadyType[i] != 0) { ePlayer.CardReadyCost[i]++; return; } } } }
public override int DrawCardAmount(Player player, int number, ref bool[] series, ref bool[] style) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); int cardsWeOuted = 0; for (int a = 0; a < 3; a++) { List <int> canOutCards = new List <int>(); for (int i = 0; i < ePlayer.CardHandType.Length; i++) { if (ePlayer.CardHandType[i] == 0 || i == number) { continue; } canOutCards.Add(i); } if (canOutCards.Count > 0) { int chooseCard = Main.rand.Next(0, canOutCards.Count); ePlayer.CardSetToGrave(ePlayer.CardHandType[canOutCards[chooseCard]], canOutCards[chooseCard], true); ePlayer.CardHandType[canOutCards[chooseCard]] = 0; ePlayer.CardHandCost[canOutCards[chooseCard]] = 0; cardsWeOuted++; } } for (int i = 0; i < series.Length; i++) { series[i] = true; } for (int i = 0; i < style.Length; i++) { style[i] = true; } return(cardsWeOuted); }
public override void UpdateAccessory(Player player, bool hideVisual) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); ePlayer.CardHandMax += 2; ePlayer.CardPassStatDelay -= 4 * 60; ePlayer.IsDelayCycle_StaticWatch = true; }
public override void HoldItem(Player player) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); CardBuffPlayer cPlayer = player.GetModPlayer <CardBuffPlayer>(); ePlayer.ManaMax--; ePlayer.CardHandMax--; }
private void RightClicked(UIMouseEvent evt, UIElement listeningElement) { EntrogicPlayer plr = Main.LocalPlayer.GetModPlayer <EntrogicPlayer>(); IsActive = false; plr.IsBookActive = IsActive; MessageHelper.SendBookInfo(Main.LocalPlayer.whoAmI, plr.PageNum, plr.IsBookActive); }
// As a modder, you could also opt to make these overrides also sealed. Up to the modder public override void ModifyWeaponDamage(Player player, ref float add, ref float mult, ref float flat) { add += EntrogicPlayer.ModPlayer(player).arcaneDamageAdd; mult *= EntrogicPlayer.ModPlayer(player).arcaneDamageMult; // 收取25%的魔法伤害加成 add += player.magicDamage * 0.25f; mult *= MathHelper.Max(player.magicDamageMult * 0.25f, 1f); }
public override void HoldItem(Item item, Player player) { EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); ePlayer.PickPowerHand = item.pick; if (glove && !Main.dedServ) { CardUI.IsActive = true; } }
public override void MinionEffects(Player player, Vector2 position, int damage, float knockBack, int number) { int healAmount = (int)MathHelper.Min(30f, player.statLifeMax2 - player.statLife); player.statLife += healAmount; player.HealEffect(healAmount); EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); ePlayer.MoreCard_EnergyRecovery++; }
public override void SpecialEffects(Player player, Vector2 position, int damage, float knockBack, int number, int packType, bool special, bool drawCard) { if (!special) { return; } EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); int gotCard = 0; List <int> organismCardNumber = new List <int>(); for (int i = 0; i < ePlayer.CardReadyType.Length; i++) { if (ePlayer.CardReadyType[i] == 0 || (i == number && packType == 2)) { continue; } Item it = new Item(); it.SetDefaults(ePlayer.CardReadyType[i]); ModItem modItem = it.modItem; ModCard modCard = (ModCard)modItem; if (modCard.series == CardSeriesID.Organism) { organismCardNumber.Add(i); } } if (organismCardNumber.Count > 0) { if (packType != 1) { for (int i = 0; i < ePlayer.CardHandType.Length; i++) { if (ePlayer.CardHandType[i] == 0) { int chooseCard = Main.rand.Next(0, organismCardNumber.Count); ePlayer.CardHandType[i] = ePlayer.CardReadyType[organismCardNumber[chooseCard]]; ePlayer.CardHandCost[i] = ePlayer.CardReadyCost[organismCardNumber[chooseCard]]; ePlayer.CardReadyType[organismCardNumber[chooseCard]] = 0; ePlayer.CardReadyCost[organismCardNumber[chooseCard]] = 0; gotCard++; break; } } } else { int chooseCard = Main.rand.Next(0, organismCardNumber.Count); ePlayer.CardHandType[number] = ePlayer.CardReadyType[organismCardNumber[chooseCard]]; ePlayer.CardHandCost[number] = ePlayer.CardReadyCost[organismCardNumber[chooseCard]]; ePlayer.CardReadyType[organismCardNumber[chooseCard]] = 0; ePlayer.CardReadyCost[organismCardNumber[chooseCard]] = 0; gotCard++; } } ePlayer.NewRecentCardMessage(Language.GetTextValue("Mods.Entrogic.CardDrawCard", item.Name, gotCard, Language.GetTextValue("Mods.Entrogic.SeriesOrganism"), ""), true); }
public override void ClickEvent() { Player clientPlayer = Main.LocalPlayer; EntrogicPlayer clientModPlayer = EntrogicPlayer.ModPlayer(clientPlayer); if (clientModPlayer.CardGamePlayerTurn) { Entrogic.Instance.CardGameUI.PlayerTurnOver = true; Main.PlaySound(SoundID.MenuTick); } }
public override void UpdateArmorSet(Player player) { player.setBonus = "\n原版及本Mod的凝胶类召唤物只占0.75个召唤位\n所有生物系列卡牌费用为1\n无摔落伤害"; // 无摔落伤害 player.noFallDmg = true; // 所有生物系列卡牌费用为1 EntrogicPlayer ePlayer = EntrogicPlayer.ModPlayer(player); for (int a = 0; a < ePlayer.CardHandCost.Length; a++) { if (ePlayer.CardHandType[a] != 0) { Item item = new Item(); item.SetDefaults(ePlayer.CardHandType[a]); ModCard card = (ModCard)item.modItem; if (card.series == CardSeriesID.Organism) { ePlayer.CardHandCost[a] = Math.Min(1, ePlayer.CardHandCost[a]); } } } for (int a = 0; a < ePlayer.CardReadyCost.Length; a++) { if (ePlayer.CardReadyType[a] != 0) { Item item = new Item(); item.SetDefaults(ePlayer.CardReadyType[a]); ModCard card = (ModCard)item.modItem; if (card.series == CardSeriesID.Organism) { ePlayer.CardReadyCost[a] = Math.Min(1, ePlayer.CardReadyCost[a]); } } } // 凝胶类召唤物只占0.75个召唤位 float[] i = new float[1001]; foreach (Projectile proj in Main.projectile) { if (proj.minion && proj.active && proj.owner == player.whoAmI && proj.minionSlots > 0.75f && (proj.type == ProjectileID.BabySlime /* || proj.type == ProjectileType<Projectiles.衰落魔像.Stoneslime>()*/)) { i[proj.whoAmI] = proj.minionSlots; } } float MoreMinionSlots = 0; foreach (Projectile proj in Main.projectile) { if (i[proj.whoAmI] != 0) { MoreMinionSlots += i[proj.whoAmI] - 0.75f; } } player.maxMinions += (int)MoreMinionSlots; }
public override void Draw(SpriteBatch spriteBatch) { Player player = Main.LocalPlayer; EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); if (ePlayer.ManaLeft <= number) { return; } base.Draw(spriteBatch); }
public override void Update(GameTime gameTime) { base.Update(gameTime); // don't remove. Player player = Main.LocalPlayer; EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); if (ContainsPoint(Main.MouseScreen) && ePlayer.CardHandType[number] != 0) { Main.LocalPlayer.mouseInterface = true; } }
public void UpdateSlots(int index = -1) { if (index != -1) { Grid[index].inventoryItem.SetDefaults(EntrogicPlayer.ModPlayer(Main.LocalPlayer).CardType[index]); } for (int i = 0; i < Grid.Count; i++) { Grid[i].inventoryItem.SetDefaults(EntrogicPlayer.ModPlayer(Main.LocalPlayer).CardType[i]); } }
public override void Update(GameTime gameTime) { Player player = Main.LocalPlayer; EntrogicPlayer ePlayer = player.GetModPlayer <EntrogicPlayer>(); base.Update(gameTime); // don't remove. if (ContainsPoint(Main.MouseScreen) && BookUI.IsActive) { Main.LocalPlayer.mouseInterface = true; } }
public override void Kill(int timeLeft) { Player player = Main.player[Main.myPlayer]; EntrogicPlayer modPlayer = player.GetModPlayer <EntrogicPlayer>(); for (int i = 0; i < 30; i++) { Dust d = Dust.NewDustDirect(projectile.position, projectile.width, projectile.height, MyDustId.TransparentPurple, 0, 0, 100, Color.Pink, 1f); d.noGravity = true; } }