예제 #1
0
    internal override AEffect Compute(AttackInfos a_attackInfos)
    {
        EffectDamage dmg = new EffectDamage();

        dmg.attackInfos = a_attackInfos;

        IntModifier damageFromStats = a_attackInfos.source.attack.GetBonusDamage(type);
        IntModifier arpenFromStats  = a_attackInfos.source.attack.GetPenetration(type);

        if (canCrit && a_attackInfos.critType == ECriticalType.Crititcal)
        {
            damageFromStats.Add(a_attackInfos.source.attack.CriticalDamages);
            arpenFromStats.Add(a_attackInfos.source.attack.CriticalArpen);
        }
        else if (canCrit && a_attackInfos.critType == ECriticalType.Penetration)
        {
            damageFromStats.Add(a_attackInfos.source.attack.PenetrationDamages);
            arpenFromStats.Add(a_attackInfos.source.attack.PenetrationArpen);
        }

        dmg.amount = baseAmount.Value;
        dmg.amount = damageFromStats.Compute(dmg.amount, FFEngine.Game.Constants.DAMAGE_BONUS_IS_FLAT_FIRST);
        dmg.arpen  = arpenFromStats;

        dmg.type = type;

        return(dmg);
    }
예제 #2
0
    internal override AEffectReport Apply(Unit a_target)
    {
        DamageReport report = new DamageReport();

        IntModifier reduction = a_target.defense.GetResistance(type).Compute(arpen);

        report.attackInfos = attackInfos;
        report.effectInfos = effectInfos;

        int baseDmg = ComputeStackModifications();

        report.target    = a_target;
        report.type      = type;
        report.unreduced = baseDmg;
        report.final     = reduction.Compute(report.unreduced,
                                             FFEngine.Game.Constants.DAMAGE_REDUCTION_FROM_ARMOR_IS_FLAT_FIRST);

        //Scratching
        if (attackInfos.critType == ECriticalType.Normal && a_target.defense.ShouldScratch(this))
        {
            report.didScratch = true;
            report.final      = Mathf.FloorToInt(report.final * FFEngine.Game.Constants.SCRATCH_DAMAGE_MULTIPLIER);
        }
        else
        {
            report.didScratch = false;
        }

        report.reducedByArmor = report.final - report.unreduced;

        return(report);
    }
예제 #3
0
    public override void OnGUI(SerializedPropertyX property, GUIContent label)
    {
        IntRange attr = property.GetValue <IntRange>();

        label.text = property.displayName + " (" + attr.Value + ")";

        property.isExpanded = EditorGUILayout.Foldout(property.isExpanded, label);
        if (property.isExpanded)
        {
            property["baseValue"].Value = EditorGUILayout.IntField(new GUIContent("Base Value"), property["baseValue"].GetValue <int>());
            if (Mathf.Approximately(attr.BaseValue, 0))
            {
                attr.BaseValue = 0;
            }
            attr.BaseValue = property["baseValue"].GetValue <int>();
            property["currentValue"].Value = attr.Value;
            EditorGUI.indentLevel++;
            IntModifier[] modifiers = attr.GetReadOnlyModiferList();
            for (int i = 0; i < modifiers.Length; i++)
            {
                IntModifier modifier = modifiers[i];
                string      valueStr = "Flat: " + modifier.flatBonus + " Percent: " + modifier.percentBonus;
                GUI.enabled = false;
                EditorGUILayout.TextField(new GUIContent(modifier.id), valueStr);
                GUI.enabled = true;
            }
            EditorGUILayoutX.PropertyField(property["min"]);
            EditorGUILayoutX.PropertyField(property["max"]);
            EditorGUI.indentLevel--;
        }
    }
예제 #4
0
        private void DoDamage(CallReason continueReason)
        {
            var healthModifier = new IntModifier(ModifyMode.Addition, AttributeCode.Health, -5);
            var sourcePos      = World.Instance.GetEntity(ActionSource).Position;

            log.InfoFormat("Bow Attack LookDir is {0}", LookDirection);

            var LookDirP = new Vector(LookDirection.Z, -LookDirection.X);
            var P1       = sourcePos + LookDirP * 0.5f * ATTACKWIDTH;
            var P2       = sourcePos - LookDirP * 0.5f * ATTACKWIDTH;
            var P3       = P2 + LookDirection * ATTACKDISTANCE;

            var dmgArea = new RectangleAreaTarget(P1, P2, P3)
            {
                AreaTargetOption = AreaTargetOption.IgnoreSource,
                SourceName       = ActionSource
            };

            World.Instance.ApplyModifier(dmgArea, healthModifier);

            // SetIdle
            AddCondition(new TimedContinueCondition(new System.TimeSpan(0, 0, 0, 0, 500)));
            ContinueEvent -= DoDamage;
            ContinueEvent += SetIdle;
            StartConditions();
        }
예제 #5
0
    public static IntModifier operator +(IntModifier x, IntModifier y)
    {
        IntModifier result = new IntModifier();

        result.flat    = x.flat + y.flat;
        result.percent = x.percent + y.percent;
        return(result);
    }
예제 #6
0
    internal IntModifier Compute(IntModifier a_arpen)
    {
        IntModifier reduc = new IntModifier();

        reduc.percent = GameConstants.ArmorPercentReduction(armor, a_arpen);
        reduc.flat    = flat - Mathf.CeilToInt(flat * a_arpen.percent);
        return(reduc);
    }
예제 #7
0
    internal IntModifier Compute()
    {
        IntModifier mod = new IntModifier();

        mod.percent = percent;
        mod.flat    = flat;
        return(mod);
    }
예제 #8
0
        private void DoHealing(CallReason continueReason)
        {
            if (continueReason == CallReason.Interupted)
            {
                return;
            }

            var healthModifier = new IntModifier(ModifyMode.Addition, AttributeCode.Health, 30);

            World.Instance.ApplyModifier(Target, healthModifier);
        }
예제 #9
0
    internal static float ArmorPercentReduction(int a_armor, IntModifier a_arpen)
    {
        int effectiveArmor = a_armor;

        if (a_arpen != null)
        {
            effectiveArmor = a_arpen.Compute(effectiveArmor, FFEngine.Game.Constants.ARMOR_REDUCTION_FROM_ARPEN_IS_FLAT_FIRST);
        }

        float reduction = 1f + (-1f / Mathf.Exp(effectiveArmor / 50f));

        return(reduction);
    }
예제 #10
0
 public void RemoveModifier(string id)
 {
     for (int i = 0; i < modifiers.Count; i++)
     {
         if (modifiers[i].id == id)
         {
             IntModifier prev = modifiers[i];
             flatBonus    -= prev.flatBonus;
             percentBonus -= prev.percentBonus;
             BaseValue     = BaseValue;
             break;
         }
     }
 }
예제 #11
0
	internal IntModifier GetPower(EDamageType a_type)
	{
		IntModifier mod = null;
		
		switch(a_type)
		{
			case EDamageType.Slashing :
			case EDamageType.Crushing :
		case EDamageType.Piercing : mod = PhysicalBonusDamages;
			break;
			
			default : mod = new IntModifier();
			break;
		}
		
		return mod;
	}
예제 #12
0
        private void DoDamage(CallReason continueReason)
        {
            var healthModifier = new IntModifier(ModifyMode.Addition, AttributeCode.Health, -7);
            var sourcePos      = World.Instance.GetEntity(ActionSource).Position;

            var dmgArea = new CircleAreaTarget(sourcePos, RADIUS)
            {
                AreaTargetOption = AreaTargetOption.IgnoreSource,
                SourceName       = ActionSource
            };

            World.Instance.ApplyModifier(dmgArea, healthModifier);

            var interupted = World.Instance.GetEntitesInArea(dmgArea);

            m_InteruptionHandler.OnInterupt(interupted);
        }
예제 #13
0
        public void AssignModifiers()
        {
            StrModifier = RaceStr / 2 - 5;
            DexModifier = RaceDex / 2 - 5;
            ConModifier = RaceCon / 2 - 5;
            IntModifier = RaceInt / 2 - 5;
            WisModifier = RaceWis / 2 - 5;
            ChaModifier = RaceCha / 2 - 5;


            StrMod.Text = StrModifier.ToString();
            DexMod.Text = DexModifier.ToString();
            ConMod.Text = ConModifier.ToString();
            IntMod.Text = IntModifier.ToString();
            WisMod.Text = WisModifier.ToString();
            ChaMod.Text = ChaModifier.ToString();
        }
예제 #14
0
    public void SetModifier(string id, IntModifier modifier) {
        modifier = new IntModifier(id, modifier);

        for (int i = 0; i < modifiers.Count; i++) {
            if (modifiers[i].id == id) {
                IntModifier prev = modifiers[i];
                flatBonus -= prev.flatBonus;
                percentBonus -= prev.percentBonus;
                break;
            }
        }

        modifiers.Add(modifier);

        flatBonus += modifier.flatBonus;
        percentBonus += modifier.percentBonus;

    }
예제 #15
0
    public override void OnGUI(SerializedPropertyX property, GUIContent label)
    {
        IntValue attr      = property.GetValue <IntValue>();
        string   labelText = property.displayName + " (" + attr.Value + ")";

        if (attr.Value == int.MaxValue || attr.Value == int.MinValue)
        {
            labelText = property.displayName + " (--)";
        }
        label.text = labelText;
        shown      = EditorGUILayout.Foldout(shown, label);
        if (shown)
        {
            EditorGUI.indentLevel++;
            attr.BaseValue = EditorGUILayout.IntField(new GUIContent("Base Value"), attr.BaseValue);
            property["baseValue"].Value = attr.BaseValue;
            IntRange.IntRangeBoundry rangeBoundry = attr as IntRange.IntRangeBoundry;
            if (rangeBoundry != null)
            {
                //this code makes sure the parent's value is clamped now that we've updated a range boundry
                rangeBoundry.BaseValue = property["baseValue"].GetValue <int>();
                int parentValue = rangeBoundry.parent.Value;
                property["parent"]["currentValue"].Value = parentValue;
            }
            IntModifier[] modifiers = attr.GetReadOnlyModiferList();
            for (int i = 0; i < modifiers.Length; i++)
            {
                IntModifier modifier = modifiers[i];
                string      valueStr = "";
                if (modifier.flatBonus != 0)
                {
                    valueStr += modifier.flatBonus;
                }
                else if (modifier.percentBonus != 0)
                {
                    valueStr += modifier.percentBonus + " %";
                }
                EditorGUILayout.LabelField(modifier.id);
                EditorGUILayout.LabelField(valueStr);
            }

            EditorGUI.indentLevel--;
        }
    }
예제 #16
0
    public void SetModifier(string id, IntModifier modifier)
    {
        modifier = new IntModifier(id, modifier);

        for (int i = 0; i < modifiers.Count; i++)
        {
            if (modifiers[i].id == id)
            {
                IntModifier prev = modifiers[i];
                flatBonus    -= prev.flatBonus;
                percentBonus -= prev.percentBonus;
                break;
            }
        }

        modifiers.Add(modifier);

        flatBonus    += modifier.flatBonus;
        percentBonus += modifier.percentBonus;
    }
예제 #17
0
        //Rolls stats and modifiers
        private void btnStats_Click(object sender, RoutedEventArgs e)
        {
            stats  = Stats.RollStats();
            stats2 = stats;

            StrScore.Text = stats.Str.ToString();
            DexScore.Text = stats.Dex.ToString();
            ConScore.Text = stats.Con.ToString();
            IntScore.Text = stats.Int.ToString();
            WisScore.Text = stats.Wis.ToString();
            ChaScore.Text = stats.Cha.ToString();

            StrModifier = stats.Str / 2 - 5;
            DexModifier = stats.Dex / 2 - 5;
            ConModifier = stats.Con / 2 - 5;
            IntModifier = stats.Int / 2 - 5;
            WisModifier = stats.Wis / 2 - 5;
            ChaModifier = stats.Cha / 2 - 5;

            StrMod.Text = StrModifier.ToString();
            DexMod.Text = DexModifier.ToString();
            ConMod.Text = ConModifier.ToString();
            IntMod.Text = IntModifier.ToString();
            WisMod.Text = WisModifier.ToString();
            ChaMod.Text = ChaModifier.ToString();

            //update stats to char sheet
            CharacterStrength.Content     = stats.Str;
            CharacterDexterity.Content    = stats.Dex;
            CharacterConstitution.Content = stats.Con;
            CharacterIntelligence.Content = stats.Int;
            CharacterWisdom.Content       = stats.Wis;
            CharacterCharisma.Content     = stats.Cha;
            // update char sheet modifiers
            CharStrMod.Content = StrMod.Text;
            CharDexMod.Content = DexMod.Text;
            CharConMod.Content = ConMod.Text;
            CharIntMod.Content = IntMod.Text;
            CharWisMod.Content = WisMod.Text;
            CharChaMod.Content = ChaMod.Text;
        }
예제 #18
0
        private void DoDamage(CallReason continueReason)
        {
            var healthModifier = new IntModifier(ModifyMode.Addition, AttributeCode.Health, -5);
            var sourcePos      = World.Instance.GetEntity(ActionSource).Position;

            log.InfoFormat("DS LookDir is {0}", LookDirection);

            var LookDirP = new Vector(LookDirection.Z, -LookDirection.X);
            var P1       = sourcePos + LookDirP * 0.5f * ATTACKWIDTH;
            var P2       = sourcePos - LookDirP * 0.5f * ATTACKWIDTH;
            var P3       = P2 + LookDirection * ATTACKDISTANCE;

            var dmgArea = new RectangleAreaTarget(P1, P2, P3)
            {
                AreaTargetOption = AreaTargetOption.IgnoreSource,
                SourceName       = ActionSource
            };

            World.Instance.ApplyModifier(dmgArea, healthModifier);

            var interupted = World.Instance.GetEntitesInArea(dmgArea);

            m_InteruptionHandler.OnInterupt(interupted);
        }
예제 #19
0
    internal IntModifier GetPenetration(EDamageType a_type)
    {
        IntModifier result;

        switch (a_type)
        {
        case EDamageType.Slashing:
        case EDamageType.Crushing:
        case EDamageType.Piercing:
            result = new IntModifier();
            break;

        case EDamageType.Fire:
        case EDamageType.Frost:
        case EDamageType.Ligthing:
            result = new IntModifier();
            break;

        default: result = new IntModifier();
            break;
        }

        return(result);
    }
예제 #20
0
        private void DoDamage(CallReason continueReason)
        {
            if (continueReason == CallReason.Interupted)
            {
                SetIdle(continueReason);
                return;
            }

            var healthModifier = new IntModifier(ModifyMode.Addition, AttributeCode.Health, -5);
            var sourcePos      = World.Instance.GetEntity(ActionSource).Position;

            var dmgArea = new Cone2DAreaTarget(sourcePos, LookDirection, ATTACKANGLE, ATTACKDISTANCE)
            {
                AreaTargetOption = AreaTargetOption.IgnoreSource,
                SourceName       = ActionSource
            };

            World.Instance.ApplyModifier(dmgArea, healthModifier);
            AddCondition(new TimedContinueCondition(new System.TimeSpan(0, 0, 0, 0, 500)));

            ContinueEvent -= DoDamage;
            ContinueEvent += SetIdle;
            StartConditions();
        }
예제 #21
0
    internal IntModifier GetBonusDamage(EDamageType a_type)
    {
        IntModifier mod = null;

        switch (a_type)
        {
        case EDamageType.Slashing:
        case EDamageType.Crushing:
        case EDamageType.Piercing:
            mod = BonusPhysicalDamages;
            break;

        case EDamageType.Fire:
        case EDamageType.Frost:
        case EDamageType.Ligthing:
            mod = BonusMagicDamages;
            break;

        default: mod = new IntModifier();
            break;
        }

        return(mod);
    }
예제 #22
0
 public IntModifier(string id, IntModifier other) {
     this.id = id;
     flatBonus = other.flatBonus;
     percentBonus = other.percentBonus;
 }
예제 #23
0
        public CharCreation2()
        {
            InitializeComponent();

            try
            {
                string        chardata     = File.ReadAllText(@"char.txt");
                List <string> chardatalist = new List <string>();
                char          delimiter    = ',';
                string[]      substrings   = chardata.Split(delimiter);
                foreach (var substring in substrings)
                {
                    chardatalist.Add(substring);
                }
                CharacterName.Content  = chardatalist[0];
                CharacterRace.Content  = chardatalist[1];
                CharacterClass.Content = chardatalist[2];
                StrScore.Text          = chardatalist[3].ToString();
                DexScore.Text          = chardatalist[4].ToString();
                ConScore.Text          = chardatalist[5].ToString();
                IntScore.Text          = chardatalist[6].ToString();
                WisScore.Text          = chardatalist[7].ToString();
                ChaScore.Text          = chardatalist[8].ToString();

                int strength, dexterity, constitution, intelligence, wisdom, charisma;
                int.TryParse(StrScore.Text, out strength);
                int.TryParse(DexScore.Text, out dexterity);
                int.TryParse(ConScore.Text, out constitution);
                int.TryParse(IntScore.Text, out intelligence);
                int.TryParse(WisScore.Text, out wisdom);
                int.TryParse(ChaScore.Text, out charisma);
                stats.Str = strength;
                stats.Dex = dexterity;
                stats.Con = constitution;
                stats.Int = intelligence;
                stats.Wis = wisdom;
                stats.Cha = charisma;

                StrScore.Text = stats.Str.ToString();
                DexScore.Text = stats.Dex.ToString();
                ConScore.Text = stats.Con.ToString();
                IntScore.Text = stats.Int.ToString();
                WisScore.Text = stats.Wis.ToString();
                ChaScore.Text = stats.Cha.ToString();

                StrModifier = stats.Str / 2 - 5;
                DexModifier = stats.Dex / 2 - 5;
                ConModifier = stats.Con / 2 - 5;
                IntModifier = stats.Int / 2 - 5;
                WisModifier = stats.Wis / 2 - 5;
                ChaModifier = stats.Cha / 2 - 5;

                StrMod.Text = StrModifier.ToString();
                DexMod.Text = DexModifier.ToString();
                ConMod.Text = ConModifier.ToString();
                IntMod.Text = IntModifier.ToString();
                WisMod.Text = WisModifier.ToString();
                ChaMod.Text = ChaModifier.ToString();

                //update stats to char sheet
                CharacterStrength.Content     = stats.Str;
                CharacterDexterity.Content    = stats.Dex;
                CharacterConstitution.Content = stats.Con;
                CharacterIntelligence.Content = stats.Int;
                CharacterWisdom.Content       = stats.Wis;
                CharacterCharisma.Content     = stats.Cha;
                // update char sheet modifiers
                CharStrMod.Content = StrMod.Text;
                CharDexMod.Content = DexMod.Text;
                CharConMod.Content = ConMod.Text;
                CharIntMod.Content = IntMod.Text;
                CharWisMod.Content = WisMod.Text;
                CharChaMod.Content = ChaMod.Text;
            }
            catch (FileNotFoundException)
            {
                throw;
            }
        }
예제 #24
0
 public IntModifier(string id, IntModifier other)
 {
     this.id      = id;
     flatBonus    = other.flatBonus;
     percentBonus = other.percentBonus;
 }
예제 #25
0
 public AnimateDeadEffect(IResolvable source, Card target) : base(source)
 {
     this.target = target;
     modifier    = new IntModifier(source, nameof(Card.Power), -1);
 }
예제 #26
0
 internal void Add(IntModifier a_toAdd)
 {
     percent += a_toAdd.percent;
     flat    += a_toAdd.flat;
 }
예제 #27
0
    internal override AEffectReport Apply(Unit a_target)
    {
        if (effectInfos == null)
        {
            Debug.LogError("Null effect for this modifier effect");
            return(null);
        }

        FloatModifier           percent;
        IntModifier             flat;
        IntModifierFromEffect   intMod;
        FloatModifierFromEffect floatMod;

        //PHYSICAL
        if (physical.flat > 0)
        {
            flat      = new IntModifier();
            flat.flat = ComputeStackModification(physical.flat);

            intMod          = new IntModifierFromEffect();
            intMod.modifier = flat;
            intMod.source   = effectInfos.effectOverTime;

            a_target.attack.bonusPhysical.damage.flat.AddModifierFromEffect(intMod);
        }
        if (physical.percent > 0)
        {
            percent      = new FloatModifier();
            percent.flat = ComputeStackModification(physical.percent);            // Only flat % modification.

            floatMod          = new FloatModifierFromEffect();
            floatMod.modifier = percent;
            floatMod.source   = effectInfos.effectOverTime;

            a_target.attack.bonusPhysical.damage.percent.AddModifierFromEffect(floatMod);
        }


        //MAGIC
        if (magic.flat > 0)
        {
            flat      = new IntModifier();
            flat.flat = ComputeStackModification(magic.flat);

            intMod          = new IntModifierFromEffect();
            intMod.modifier = flat;
            intMod.source   = effectInfos.effectOverTime;

            a_target.attack.bonusMagical.damage.flat.AddModifierFromEffect(intMod);
        }
        if (magic.percent > 0)
        {
            percent      = new FloatModifier();
            percent.flat = ComputeStackModification(magic.percent);            // Only flat % modification.

            floatMod          = new FloatModifierFromEffect();
            floatMod.modifier = percent;
            floatMod.source   = effectInfos.effectOverTime;

            a_target.attack.bonusMagical.damage.percent.AddModifierFromEffect(floatMod);
        }

        return(null);
    }
예제 #28
0
 public GloriousAnthemEffect(IResolvable source) : base(source)
 {
     powerModifier     = new IntModifier(this, nameof(Card.Power), 1);
     toughnessModifier = new IntModifier(this, nameof(Card.Toughness), 1);
 }