public static List<Ability> createTestCharacterAbiities() { List<Ability> abilitiesToReturn = new List<Ability>(); //for basic attack List<AbilityStatsToAffect> basicAttackStats = new List<AbilityStatsToAffect> { AbilityStatsToAffect.health }; //for heal ability List<AbilityStatsToAffect> basicHealStats = new List<AbilityStatsToAffect> { AbilityStatsToAffect.health }; CharAbility basicAttack = new CharAbility(true, basicAttackStats, AbilityType.physicalAttack, AbilityPosibleTargets.singleEnemy, "Basic Attack", 1, 30); CharAbility basicHeal = new CharAbility(true, basicHealStats, AbilityType.spellBuff, AbilityPosibleTargets.singleChar,"Basic Heal", 2, 30); abilitiesToReturn.Add(basicAttack); abilitiesToReturn.Add(basicHeal); return abilitiesToReturn; }
public static void InitializeTargetingCharAbility(Character originatingChar, CharAbility castedAbility, PlayState playstate) { List<Character> potentialTargets = new List<Character>(); switch (castedAbility.abilityPossibleTargets) { case (AbilityPosibleTargets.singleAlly): if (castedAbility.limitedByRange) { potentialTargets = GetCharatersInAbilityRange(originatingChar, castedAbility, playstate); if (potentialTargets.Count > 0) { playstate.charactersTargeted = new List<Character> { potentialTargets[0] }; playstate.potentialTargets = potentialTargets; } }else { playstate.charactersTargeted = new List<Character> { playstate.allies[0] }; playstate.potentialTargets = playstate.allies; } break; case (AbilityPosibleTargets.singleEnemy): if (castedAbility.limitedByRange) { potentialTargets = GetCharatersInAbilityRange(originatingChar, castedAbility, playstate); if (potentialTargets.Count > 0) { playstate.charactersTargeted = new List<Character> { potentialTargets[0] }; playstate.potentialTargets = potentialTargets; } } else { playstate.charactersTargeted = new List<Character> { playstate.enemies[0] }; playstate.potentialTargets = playstate.enemies; } break; case (AbilityPosibleTargets.allAllies): playstate.charactersTargeted = playstate.allies; playstate.potentialTargets = playstate.allies; break; case (AbilityPosibleTargets.allEnemies): playstate.charactersTargeted = playstate.enemies; playstate.potentialTargets = playstate.enemies; break; case (AbilityPosibleTargets.allInRange): potentialTargets = GetCharatersInAbilityRange(originatingChar, castedAbility, playstate); if (potentialTargets.Count > 0) { playstate.charactersTargeted = new List<Character> { potentialTargets[0] }; playstate.potentialTargets = potentialTargets; } break; case (AbilityPosibleTargets.global): playstate.charactersTargeted = playstate.allCharacters; playstate.potentialTargets = playstate.allCharacters; break; case (AbilityPosibleTargets.singleChar): if (castedAbility.limitedByRange) { potentialTargets = GetCharatersInAbilityRange(originatingChar, castedAbility, playstate); if (potentialTargets.Count > 0) { playstate.charactersTargeted = new List<Character> { potentialTargets[0] }; playstate.potentialTargets = potentialTargets; } } else { playstate.charactersTargeted = new List<Character> { playstate.allCharacters[0] }; playstate.potentialTargets = playstate.allCharacters; } break; } }
public static void TargetGroup(Character originatingChar, CharAbility castedAbility) { //this ability needs to automatically target a group of characters, like allies, enemies, or all characters }
public static void TargetAllInRange(Character originatingChar, CharAbility castedAbility) { //this ability needs to automatically target all characters in range }
public static void SelectTargetSingleChar(Character originatingChar, CharAbility castedAbility) { //this ability needs to target a single character /* * 0. Set casting character to targeting state * 0. When targeting, Esc cancels targeting and resets char/playstate * 1. Isolate all potential targets in range * 2. Automatically place selection indicator over nearest target * 3. tab now switches between potential targets rather than chars to move */ originatingChar.state = charState.selectingTargets; }
public static List<Character> GetCharatersInAbilityRange(Character originatingChar, CharAbility castedAbility, PlayState playstate) { //get subset of tiles in range of ability via the distance formula //boundaries of square to search defined by ability range int rangeToSearch = castedAbility.range; List<Tile> tilesInAbilityRange = new List<Tile>(); List<Character> charactersInAbilityRange = new List<Character>(); int castingCharacterPosX = (int)originatingChar.position.X; int castingCharacterPosY = (int)originatingChar.position.Y; int minimumXtoSearch = (int)originatingChar.position.X - rangeToSearch; int maximumXtoSearch = (int)originatingChar.position.X + rangeToSearch; int minimumYtoSearch = (int)originatingChar.position.Y - rangeToSearch; int maximumYtoSearch = (int)originatingChar.position.Y + rangeToSearch; if (minimumXtoSearch < 1) minimumXtoSearch = 1; if (minimumYtoSearch < 0) minimumYtoSearch = 1; if (maximumXtoSearch > playstate.currentMap.mapWidthInTiles()-1) maximumXtoSearch = playstate.currentMap.mapWidthInTiles()-1; if (maximumYtoSearch > playstate.currentMap.mapHeightInTiles()-1) maximumYtoSearch = playstate.currentMap.mapHeightInTiles()-1; for (int x = 0; x <= rangeToSearch; x++) { for (int y = 0; y <= rangeToSearch; y++) { if (x >= minimumXtoSearch && x <= maximumXtoSearch && y >= minimumYtoSearch && y <= maximumYtoSearch) { int distanceFromSource = Math.Abs(castingCharacterPosX - x) + Math.Abs(castingCharacterPosY - y); if (distanceFromSource <= rangeToSearch) { //this tile is in range - add it to the list. Also check to see if it has a character, and if so, add it as a viable target Tile currentTile = playstate.currentMap.tiles[x, y]; tilesInAbilityRange.Add(currentTile); Character currentChar = null; if (castedAbility.abilityPossibleTargets == AbilityPosibleTargets.singleChar || castedAbility.abilityPossibleTargets == AbilityPosibleTargets.allInRange) { currentChar = playstate.allCharacters.Find(character => (int)character.position.X == x && (int)character.position.Y == y); } else if (castedAbility.abilityPossibleTargets == AbilityPosibleTargets.singleAlly) { currentChar = playstate.allies.Find(character => (int)character.position.X == x && (int)character.position.Y == y); } else if (castedAbility.abilityPossibleTargets == AbilityPosibleTargets.singleEnemy) { currentChar = playstate.enemies.Find(character => (int)character.position.X == x && (int)character.position.Y == y); } if (currentChar != null) { charactersInAbilityRange.Add(currentChar); } } } } } if (charactersInAbilityRange.Count > 0) { //if characters can be targeted, we wil want to draw the targeting range playstate.tilesInAbilityRange = tilesInAbilityRange; } return charactersInAbilityRange; }