예제 #1
0
    /// [NEW FOR ASSESSMENT 4]
    /// <summary>
    /// Sets the attacker.
    ///	also handles actions that need to happen when the attacker changes
    /// </summary>
    void setAttacker(CombatCharacter character)
    {
        if (attacker == character)
        {
            return;
        }
        attacker = character;
        float val = Random.value;

        Debug.Log(val);
        if (val < attacker.attackFriendlyChance)
        {
            //select a random alive friendly character
            List <int> options = new List <int> ();
            for (int i = 0; i < frendlyChars.Count; i++)
            {
                if (frendlyChars [i].health > 0)
                {
                    options.Add(i);
                }
            }
            int toAttack = options [Random.Range(0, options.Count - 1)];
            //attack them
            attackTargets = new List <CombatCharacter> ();
            attackTargets.Add(frendlyChars [toAttack]);
            attack = attacker.basicAttack;
            attacker.updateEntityAnimation("move");
            currentStage = turnStages.moving;
        }
    }
예제 #2
0
    public static CombatCharacter MakeCharacter(CombatCharacterPresets characterType)
    {
        CombatCharacter newCharacter       = null;
        int             characterMaxHealth = GetCharacterMaxhealth(characterType);
        int             characterMaxEnergy = GetCharacterMaxEnergy(characterType);
        CombatAbility   basicAttack        = getCharacterBasicAttack(characterType);

        switch (characterType)
        {
        case CombatCharacterPresets.BobbyBard:
            newCharacter = new CombatCharacter(characterMaxHealth, characterMaxHealth / 2, characterMaxEnergy, characterMaxEnergy, basicAttack);
            break;

        default:
            newCharacter = new CombatCharacter(characterMaxHealth, characterMaxHealth, characterMaxEnergy, characterMaxEnergy, basicAttack);
            break;
        }

        List <CombatAbility> abilities = GetCharacterAbilities(characterType);

        foreach (CombatAbility ability in abilities)
        {
            newCharacter.AddAbility(ability);
        }
        newCharacter.combatSprites = getCharacterSprites(characterType);

        newCharacter.Name = GetCharacterName(characterType);
        return(newCharacter);
    }
예제 #3
0
파일: CombatManager.cs 프로젝트: cfdj/SEPR4
 //called in update() if the current stage is the selection stage
 void selectionStage()
 {
     if (!frendlyAttacking)
     {
         //TODO write better enemy combat logic
         int toAttack = CombatCharacter.getFirstAlive(defendChars);
         if (toAttack == -1)
         {
             lose();
         }
         else
         {
             attackTargets = new List <CombatCharacter> ();
             attackTargets.Add(defendChars [toAttack]);
             attack = attacker.basicAttack;
             attacker.updateEntityAnimation("move");
             currentStage = turnStages.moving;
         }
     }
     else
     {
         selectorRen.enabled            = true;
         selectorObj.transform.position = attacker.entity.transform.position;
     }
 }
 public static void SetCombatAblility(this Ped ped, CombatAbility ability)
 {
     Function.Call((Hash) - 4079649877180351064L, new InputArgument[2]
     {
         InputArgument.op_Implicit(((Entity)ped).get_Handle()),
         InputArgument.op_Implicit((int)ability)
     });
 }
예제 #5
0
 public static void SetCombatAblility(this Ped ped, CombatAbility ability)
 {
     Function.Call(GTA.Native.Hash.SET_PED_COMBAT_ABILITY, (InputArgument[])new InputArgument[2]
     {
         ped.Handle,
         (int)ability
     });
 }
예제 #6
0
파일: CombatManager.cs 프로젝트: cfdj/SEPR4
 // function called when an abililty button on abilities panel is pressed
 /// <summary>
 /// [changes] - check that character has sufficient mana before launching attack
 ///              - this fixes error from crashing due to no mana
 /// </summary>
 void selectAbility(CombatAbility ability)
 {
     if (attacker.energy >= ability.energyCost)
     {
         attack           = ability;
         currentStage     = turnStages.targetSelection;
         targetsRemaining = attack.maxTargets;
     }
 }
예제 #7
0
파일: CombatManager.cs 프로젝트: cfdj/SEPR4
 // function to be called when the "attack" button is hit
 public void doAttack()
 {
     if (currentStage == turnStages.selecting && frendlyAttacking)
     {
         attack           = attacker.basicAttack;
         currentStage     = turnStages.targetSelection;
         targetsRemaining = attack.maxTargets;
     }
 }
예제 #8
0
 public void UpdateAbilities()
 {
     currentEvasionAbility     = persistance.ReadData("currentEvasionAbility", EvasionAbility.None);
     currentCombatAbility      = persistance.ReadData("currentCombatAbility", CombatAbility.None);
     purchasedEvasionAbilities = persistance.ReadData("purchasedEvasionAbilities", new List <EvasionAbility>());
     purchasedCombatAbilities  = persistance.ReadData("purchasedCombatAbilities", new List <CombatAbility>());
     if (OnAbilitiesUpdated != null)
     {
         OnAbilitiesUpdated();
     }
 }
예제 #9
0
파일: CombatEffect.cs 프로젝트: cfdj/SEPR4
 public CombatEffect(effectType type, int turnsRemaining, CombatAbility ability = null, string damageType = "", float modifier = 0f)
 {
     this.turnsRemaining = turnsRemaining;
     this.type           = type;
     if (type == effectType.abilityPerTurn)
     {
         this.ability = ability;
     }
     if (type == effectType.damageDealtModifier || type == effectType.damageTakenModifier)
     {
         this.damageType = damageType;
         this.modifier   = modifier;
     }
 }
예제 #10
0
        public CombatAttack AttackByAbility(Combatant attacker, CombatAbility abilityAttack)
        {
            var attack = new CombatAttack(0, abilityAttack.damageType);
            var cl     = new StringBuilder();

            float sourceDamage = abilityAttack.damageMag * abilityAttack.damageMod;

            cl.AppendLine("Source Damage: " + sourceDamage.ToString());

            float stattedDamage = attacker.CombatantStats.CalculateStatMod(sourceDamage, abilityAttack);

            cl.AppendLine("Statted Damage: " + stattedDamage.ToString());

            attack.SetAttackDamage(stattedDamage);
            return(attack);
        }
예제 #11
0
        public float CalculateStatMod(float sourceDamage, CombatAbility attack)
        {
            float stattedDamage = sourceDamage;

            switch (attack.damageType)
            {
            case DamageType.Physical:
                stattedDamage += AttackPower;
                break;

            case DamageType.Magic:
                stattedDamage += MagicPower;
                break;
            }
            return(stattedDamage);
        }
예제 #12
0
 public void OnConnect(PlayerAbilityController ownAbilities)
 {
     _uiIcons = FindObjectsOfType <AbilitySlot>();
     HotKeys  = _uiIcons.Select(icon => icon.Key).ToArray();
     for (int i = 0; i < _uiIcons.Length; i++)
     {
         AbilitySlot slot = _uiIcons[i];
         if (ownAbilities.AvailableAbilities.Length > i)
         {
             CombatAbility ability = ownAbilities.AvailableAbilities[i];
             _equippedAbilities.Add(slot.Key, ability);
             ability.AbilityCast += _uiIcons[i].ResetLoadingProgress;
             slot.SetIcon(ability.Icon);
             slot.SetCooldown(ability.Cooldown);
         }
     }
 }
예제 #13
0
    /// <summary>
    /// [CHANGE] - Remove feature setting Bobby Bard to half health and beta testers found it confusing and wasn't necessary to
    /// distinguish his character type
    /// </summary>
    public static CombatCharacter MakeCharacter(CombatCharacterPresets characterType)
    {
        CombatCharacter newCharacter       = null;
        int             characterMaxHealth = GetCharacterMaxhealth(characterType);
        int             characterMaxEnergy = GetCharacterMaxEnergy(characterType);
        CombatAbility   basicAttack        = getCharacterBasicAttack(characterType);

        newCharacter = new CombatCharacter(characterMaxHealth, characterMaxHealth, characterMaxEnergy, characterMaxEnergy, basicAttack);
        List <CombatAbility> abilities = GetCharacterAbilities(characterType);

        foreach (CombatAbility ability in abilities)
        {
            newCharacter.AddAbility(ability);
        }
        newCharacter.combatSprites = getCharacterSprites(characterType);
        return(newCharacter);
    }
예제 #14
0
    // function called when the abilities button is pressed
    public void doAbilities()
    {
        if (currentStage != turnStages.selecting)
        {
            return;             // do nothing
        }

        //clear old buttons
        if (abilityButtonObjs != null)
        {
            foreach (GameObject button in abilityButtonObjs)
            {
                GameObject.Destroy(button);
            }
        }

        abilityButtonObjs = new List <GameObject> ();
        abilitiesPanel.SetActive(true);
        GameObject referenceButton  = abilitiesPanel.transform.Find("ReferenceButton").gameObject;
        Vector2    newButtonPosMin  = ((RectTransform)referenceButton.transform).offsetMin;
        Vector2    newButtonPosMax  = ((RectTransform)referenceButton.transform).offsetMax;
        float      buttonSeparation = 45;    // distance apart the tops of the buttons should be in pixels

        foreach (CombatAbility a in attacker.abilities)
        {
            GameObject            newButtonObj = Instantiate(referenceButton, abilitiesPanel.transform);
            UnityEngine.UI.Button newButton    = newButtonObj.GetComponent <UnityEngine.UI.Button> ();
            abilityButtonObjs.Add(newButtonObj);
            ((RectTransform)newButtonObj.transform).offsetMin = newButtonPosMin;
            ((RectTransform)newButtonObj.transform).offsetMax = newButtonPosMax;
            newButtonPosMin.y -= buttonSeparation;
            newButtonPosMax.y -= buttonSeparation;
            newButtonObj.SetActive(true);
            newButtonObj.transform.Find("NameText").gameObject.GetComponent <UnityEngine.UI.Text> ().text = a.abilityName;
            newButtonObj.transform.Find("CostText").gameObject.GetComponent <UnityEngine.UI.Text> ().text = a.energyCost.ToString();
            CombatAbility tempValue = a;             // necessary to deal with weird scoping
            newButton.onClick.AddListener(delegate { selectAbility(tempValue); });

            if (attacker.energy < tempValue.energyCost)
            {
                newButton.interactable = false;
            }
        }
    }
예제 #15
0
    public CombatCharacter(int maxHealth, int health, int maxEnergy, int energy, CombatAbility basicAttack = null)
    {
        this.maxHealth = maxHealth;
        this.health    = health;
        this.maxEnergy = maxEnergy;
        this.energy    = energy;

        if (basicAttack == null)
        {
            this.basicAttack = new SimpleAttack(8, 10, "melee");
        }
        else
        {
            this.basicAttack = basicAttack;
        }

        abilities  = new List <CombatAbility> ();
        effectList = new List <CombatEffect> ();
    }
 private void ClearEquipment()
 {
     WeaponAbility.GetComponent <WeaponAbility>().GetItem(null, null);
     HealingAbility.GetComponent <HealingAbility>().GetItem(null, null);
     CombatAbility.GetComponent <CombatAbility>().GetItem(null, null);
 }
 private void UpdateEquipment()
 {
     WeaponAbility.GetComponent <WeaponAbility>().GetItem(activeCharacter, pivotCharacter);
     HealingAbility.GetComponent <HealingAbility>().GetItem(activeCharacter, pivotCharacter);
     CombatAbility.GetComponent <CombatAbility>().GetItem(activeCharacter, pivotCharacter);
 }
예제 #18
0
        protected override void OnRawDataUpdated()
        {
            ShipInfo rInfo;

            if (!KanColleGame.Current.MasterInfo.Ships.TryGetValue(RawData.ShipID, out rInfo))
            {
                Info = ShipInfo.Dummy;
            }
            else
            {
                if (Info?.ID != RawData.ShipID)
                {
                    r_EquipmentIDs = null;
                    r_Slots        = null;
                }

                Info = rInfo;
                OnPropertyChanged(nameof(Info));
            }

            HP.Set(RawData.HPMaximum, RawData.HPCurrent);
            Fuel.Set(Info.MaxFuelConsumption, RawData.Fuel);
            Bullet.Set(Info.MaxBulletConsumption, RawData.Bullet);

            Speed = RawData.Speed;
            Range = RawData.Range;

            Condition = RawData.Condition;

            if (KanColleGame.Current.Sortie != null && r_Port.EvacuatedShipIDs.Contains(ID))
            {
                State |= ShipState.Evacuated;
            }
            else
            {
                State &= ~ShipState.Evacuated;
            }

            if (r_Port.RepairDocks.Values.Any(r => r.Ship == this))
            {
                State |= ShipState.Repairing;
            }
            else
            {
                State &= ~ShipState.Repairing;

                UpdateAnchorageRepairStatus(OwnerFleet?.AnchorageRepair?.IsBeingAnchorageRepair(this));
            }

            if (RawData.ModernizedStatus?.Length >= 5)
            {
                Status.Update(Info, RawData);
            }

            if (RawData.Equipment != null)
            {
                UpdateSlots();
            }

            CombatAbility.Update();

            IsLocked = RawData.IsLocked;

            OnPropertyChanged(nameof(Level));
            OnPropertyChanged(nameof(ExperienceToNextLevel));
            OnPropertyChanged(nameof(Status));
        }
예제 #19
0
 public void AddAbility(CombatAbility ability)
 {
     abilities.Add(ability);
 }
예제 #20
0
 public void AddPurchasedCombatAbility(CombatAbility c)
 {
     purchasedCombatAbilities.Add(c);
     persistance.WriteData("purchasedCombatAbilities", purchasedCombatAbilities);
 }
예제 #21
0
 // function called when an abililty button on abilities panel is pressed
 void selectAbility(CombatAbility ability)
 {
     attack           = ability;
     currentStage     = turnStages.targetSelection;
     targetsRemaining = attack.maxTargets;
 }