Ejemplo n.º 1
0
        private static int optimize_actor_weapon_value(InventoryOptimizePasses pass,
                                                       Game_Actor actor, Data_Weapon weapon, List <WeaponType> weapon_types)
        {
            int value = 0;

            switch (pass)
            {
            case InventoryOptimizePasses.VanillaWeapon:
                value = weapon.vanilla_value();
                break;

            case InventoryOptimizePasses.RangedWeapon:
                value = weapon.ranged_value();
                break;

            case InventoryOptimizePasses.EffectWeapon:
                value = weapon.effect_value();
                break;

            case InventoryOptimizePasses.BackupWeapon:
                value = weapon.effect_value();
                if (weapon.main_type() == weapon_types[0])
                {
                    value += 10;
                }
                break;

            case InventoryOptimizePasses.HealingStaff:
                value = weapon.healing_value();
                break;

            case InventoryOptimizePasses.StatusStaff:
                value = weapon.status_value();
                break;

            case InventoryOptimizePasses.UtilityStaff:
                value = weapon.utility_value();
                break;
            }

            // Add a small bonus if it's the actor's best weapon type
            if (weapon.main_type() == weapon_types[0])
            {
                value += 3;
            }
            // Penalize AS loss
            value -= actor.wgt_penalty(weapon);
            // Bonus for Prfs
            if (weapon.is_prf)
            {
                value += 5;
            }
            return(value);
        }
Ejemplo n.º 2
0
        protected void initialize(Item_Data item_data, Game_Actor actor)
        {
            Data_Weapon weapon    = item_data.to_weapon;
            int         stats     = !weapon.is_staff() ? 6 : 3;
            bool        effective = false;

            foreach (int bonus in weapon.Effectiveness)
            {
                if (bonus != 1)
                {
                    effective = true;
                    stats++;
                    break;
                }
            }
            for (int i = 0; i < stats; i++)
            {
                Labels.Add(new TextSprite());
                Labels[Labels.Count - 1].loc = new Vector2((i % 3) * 60, (i / 3) * 16);
                if (i % 3 == 2)
                {
                    Labels[Labels.Count - 1].loc += new Vector2(4, 0);
                }
                Labels[Labels.Count - 1].SetFont(Config.UI_FONT, Global.Content, "Yellow");
            }
            //@Yeti: handle weapon type replacement skills better than hardcoding
            bool knife    = (actor != null && actor.has_skill("KNIFE") && weapon.main_type().Name == "Sword" && !weapon.is_magic());
            bool crossbow = (actor != null && actor.has_skill("CROSSBOW") && weapon.main_type().Name == "Bow" && !weapon.Ballista());

            Labels[0].text = weapon.type;
            if (knife)
            {
                Labels[0].text = "Knife";
            }
            if (crossbow)
            {
                Labels[0].text = "Crossbow";
            }
            Labels[1].text = "Rng";
            Labels[2].text = "Wgt";
            // If not a staff
            if (!weapon.is_staff())
            {
                Labels[3].text = "Mgt";
                Labels[4].text = "Hit";
                Labels[5].text = "Crit";
            }
            if (effective)
            {
                Labels[Labels.Count - 1].text = "Effective";
            }

            // Rank
            Rank     = new TextSprite();
            Rank.loc = new Vector2(32, 0);
            if (crossbow)
            {
                Rank.loc.X += 16;
            }
            Rank.SetFont(
                weapon.Rank == Weapon_Ranks.None ? Config.UI_FONT : Config.UI_FONT + "L",
                Global.Content, "Blue", Config.UI_FONT);
            Rank.text = weapon.rank;
            // Range
            Stats.Add(new TextSprite());
            Stats[Stats.Count - 1].loc = new Vector2(92, 0);
            Stats[Stats.Count - 1].SetFont(Config.UI_FONT, Global.Content, "Blue");
            int min_range = weapon.Min_Range;
            int max_range = weapon.Max_Range;

            if (knife && max_range == 1)
            {
                max_range = 2;
            }
            if (weapon.Mag_Range)
            {
                Stats[0].text   = min_range.ToString() + "-Mg/2";
                Stats[0].offset = new Vector2(15, 0);
            }
            else
            {
                if (min_range == max_range)
                {
                    Stats[0].text = min_range.ToString();
                }
                else
                {
                    Stats[0].text = min_range.ToString() + "-" + max_range.ToString();
                }
                Stats[0].offset = new Vector2(Stats[0].text.Length > 1 ? 12 : 0, 0);
            }
            for (int i = 2; i < stats; i++)
            {
                Stats.Add(new RightAdjustedText());
                Stats[Stats.Count - 1].loc = new Vector2((i % 3) * 60 + 40, (i / 3) * 16);
                if (i % 3 == 2)
                {
                    Stats[Stats.Count - 1].loc += new Vector2(4, 0);
                }
                Stats[Stats.Count - 1].SetFont(Config.UI_FONT, Global.Content, "Blue");
            }
            // Wgt
            Stats[1].text = weapon.Wgt.ToString();
            if (actor != null)
            {
                int actor_wgt = actor.weapon_wgt(weapon);
                if (actor_wgt != weapon.Wgt)
                {
                    int difference = actor_wgt - weapon.Wgt;

                    Stat_Bonuses.Add(new TextSprite());
                    Stat_Bonuses[Stat_Bonuses.Count - 1].loc = Stats[1].loc + new Vector2(0, 0);
                    Stat_Bonuses[Stat_Bonuses.Count - 1].SetFont(
                        Config.UI_FONT + "Bonus", Global.Content,
                        difference <= 0 ? "Green" : "Red", Config.UI_FONT);
                    Stat_Bonuses[Stat_Bonuses.Count - 1].text = difference.ToString();
                }
            }
            // Stats
            if (!weapon.is_staff())
            {
                Stats[2].text = weapon.Mgt.ToString();
                if (knife)
                {
                    Stat_Bonuses.Add(new TextSprite());
                    Stat_Bonuses[Stat_Bonuses.Count - 1].loc = Stats[2].loc + new Vector2(0, 0);
                    Stat_Bonuses[Stat_Bonuses.Count - 1].SetFont(
                        Config.UI_FONT + "Bonus", Global.Content, "Red", Config.UI_FONT);
                    Stat_Bonuses[Stat_Bonuses.Count - 1].text = "-3";
                }
                Stats[3].text = weapon.Hit.ToString();
                if (!knife)
                {
                    Stats[3].offset.X = -((Stats[3].text.Length - 1) / 2) * 8;
                }
                if (knife)
                {
                    Stat_Bonuses.Add(new TextSprite());
                    Stat_Bonuses[Stat_Bonuses.Count - 1].loc = Stats[3].loc - Stats[3].offset + new Vector2(0, 0);
                    Stat_Bonuses[Stat_Bonuses.Count - 1].SetFont(
                        Config.UI_FONT + "Bonus", Global.Content, "Green", Config.UI_FONT);
                    Stat_Bonuses[Stat_Bonuses.Count - 1].text = "+10";
                }
                Stats[4].text = weapon.Crt == -1 ? "--" : weapon.Crt.ToString();
            }
            if (effective)
            {
                for (int i = 0; i < weapon.Effectiveness.Length; i++)
                {
                    if (weapon.Effectiveness[i] != 1)
                    {
                        Effectiveness_Icons.Add(new Icon_Sprite());
                        Effectiveness_Icons[Effectiveness_Icons.Count - 1].texture = Global.Content.Load <Texture2D>(@"Graphics/Icons/Class_Types");
                        Effectiveness_Icons[Effectiveness_Icons.Count - 1].size    = new Vector2(16, 16);
                        Effectiveness_Icons[Effectiveness_Icons.Count - 1].columns = 1;
                        Effectiveness_Icons[Effectiveness_Icons.Count - 1].loc     = new Vector2(
                            48 + ((Effectiveness_Icons.Count - 1) * 16), 32);
                        Effectiveness_Icons[Effectiveness_Icons.Count - 1].index = i;

                        Effectiveness_Multipliers.Add(new Effective_WT_Arrow());
                        Effectiveness_Multipliers[Effectiveness_Icons.Count - 1].loc = new Vector2(
                            48 + ((Effectiveness_Icons.Count - 1) * 16), 32);
                        Effectiveness_Multipliers[Effectiveness_Icons.Count - 1].draw_offset = new Vector2(8, 8);
                        Effectiveness_Multipliers[Effectiveness_Icons.Count - 1].set_effectiveness(weapon.Effectiveness[i]);
                    }
                }
            }
        }