Skip to content

Commit

Permalink
HSTracker 3.0.9
Browse files Browse the repository at this point in the history
Updated for version 31.0.0
  • Loading branch information
fmoraes74 committed Oct 30, 2024
1 parent a1f36cb commit 8e0a2a2
Show file tree
Hide file tree
Showing 36 changed files with 713 additions and 17 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# 3.0.9
## New
- Updated for Hearthstone 31.0.0
- Added new-style counters! They will automatically pop up when they're relevant in a game and feature rich tooltips appropriate to the current game state.\
*We're still working on making them individually configurable but wanted to share our current progress with you. The old counters are still but are disabled by default.*
## Fixes
- Added code to prevent a crash during start up

# 3.0.8
## New
- Updated for Hearthstone 30.6.2
Expand Down
64 changes: 64 additions & 0 deletions HSTracker.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions HSTracker/Database/Models/Card.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ final class Card {
return races[0] == race || (races.count > 1 && races[1] == race)
}

func isDraenei() -> Bool {
return hasRace(.draenei)
}

func isDragon() -> Bool {
return hasRace(.dragon)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//
// AsteroidExtraDamageCounter.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class AsteroidExtraDamageCounter: NumericCounter {
override var localizedName: String {
return String.localizedString("Counter_AsteroidDamage", comment: "")
}

override var cardIdToShowInUI: String? {
return CardIds.NonCollectible.Neutral.Asteroid
}

override var relatedCards: [String] {
return []
}

required init(controlledByPlayer: Bool, game: Game) {
super.init(controlledByPlayer: controlledByPlayer, game: game)
}

override func shouldShow() -> Bool {
return !game.isBattlegroundsMatch() && counter > 0
}

override func getCardsToDisplay() -> [String] {
return [CardIds.NonCollectible.Neutral.Asteroid]
}

override var isDisplayValueLong: Bool {
return true
}

override func valueToShow() -> String {
return String(format: String.localizedString("Counter_AsteroidDamage_Damage", comment: ""), 2 + counter)
}

override func handleTagChange(tag: GameTag, entity: Entity, value: Int, prevValue: Int) {
if entity.isControlled(by: game.player.id) == isPlayerCounter {
if tag == .gametag_3559 {
counter = value
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// KiljaedenCounter.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class KiljaedenCounter: StatsCounter {
override var cardIdToShowInUI: String? {
return CardIds.Collectible.Neutral.Kiljaeden
}

override var relatedCards: [String] {
return []
}

required init(controlledByPlayer: Bool, game: Game) {
super.init(controlledByPlayer: controlledByPlayer, game: game)
}

override func shouldShow() -> Bool {
return game.isTraditionalHearthstoneMatch && (attackCounter > 0 || healthCounter > 0)
}

override func getCardsToDisplay() -> [String] {
return [CardIds.Collectible.Neutral.Kiljaeden]
}

override func valueToShow() -> String {
return "+\(max(0, attackCounter)) / +\(max(0, healthCounter))"
}

override func handleTagChange(tag: GameTag, entity: Entity, value: Int, prevValue: Int) {
guard game.isTraditionalHearthstoneMatch else { return }
guard entity.card.id == CardIds.NonCollectible.Neutral.Kiljaeden_KiljaedensPortalEnchantment else { return }
guard entity.isControlled(by: game.player.id) == isPlayerCounter else { return }

attackCounter = entity[.tag_script_data_num_2]
healthCounter = entity[.tag_script_data_num_2]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,20 @@ class LibramCostReductionCounter: NumericCounter {

override var relatedCards: [String] {
return [
CardIds.Collectible.Paladin.AldorAttendant,
CardIds.Collectible.Paladin.AldorTruthseeker
CardIds.Collectible.Paladin.LibramOfWisdom,
CardIds.Collectible.Paladin.LibramOfClarity,
CardIds.Collectible.Paladin.LibramOfDivinity,
CardIds.Collectible.Paladin.LibramOfJustice,
CardIds.Collectible.Paladin.LibramOfFaith,
CardIds.Collectible.Paladin.LibramOfJudgment,
CardIds.Collectible.Paladin.LibramOfHope
]
}

private static let enchantLibramDict: [String: Int] = [
CardIds.NonCollectible.Neutral.AldorAttendant_AldorAttendantEnchantment: 1,
CardIds.NonCollectible.Neutral.AldorTruthseeker_AldorTruthseekerEnchantment: 2
CardIds.NonCollectible.Neutral.AldorTruthseeker_AldorTruthseekerEnchantment: 2,
CardIds.NonCollectible.Paladin.InterstellarStarslicer_InterstellarLibramEnchantmentEnchantment: 1
]

required init(controlledByPlayer: Bool, game: Game) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// IngeniousArtificerEnchantment.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class IngeniousArtificerEnchantment: EntityBasedEffect {
override var cardId: String {
return CardIds.NonCollectible.Mage.IngeniousArtificer_IngeniousArtficerFutureBuffEnchantment
}

override var cardIdToShowInUI: String {
return CardIds.Collectible.Mage.IngeniousArtificer
}

required init(entityId: Int, isControlledByPlayer: Bool) {
super.init(entityId: entityId, isControlledByPlayer: isControlledByPlayer)
}

override var effectDuration: EffectDuration {
return .conditional
}

override var effectTag: EffectTag {
return .manaCrystalModification
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// AceWayfinderEnchantment.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class AceWayfinderEnchantment: EntityBasedEffect {
override var cardId: String {
return CardIds.NonCollectible.Neutral.AceWayfinder_AceWayfinderFutureBuffEnchantment
}

override var cardIdToShowInUI: String {
return CardIds.Collectible.Neutral.AceWayfinder
}

required init(entityId: Int, isControlledByPlayer: Bool) {
super.init(entityId: entityId, isControlledByPlayer: isControlledByPlayer)
}

override var effectDuration: EffectDuration {
return .conditional
}

override var effectTag: EffectTag {
return .minionModification
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// AstrobiologistEnchantment.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class AstrobiologistEnchantment: EntityBasedEffect {
override var cardId: String {
return CardIds.NonCollectible.Neutral.Astrobiologist_AstrobiologistEnchantment
}

override var cardIdToShowInUI: String {
return CardIds.Collectible.Neutral.Astrobiologist
}

required init(entityId: Int, isControlledByPlayer: Bool) {
super.init(entityId: entityId, isControlledByPlayer: isControlledByPlayer)
}

override var effectDuration: EffectDuration {
return .conditional
}

override var effectTag: EffectTag {
return .minionModification
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//
// SpacePirateEnchantment.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class SpacePirateEnchantment: EntityBasedEffect {
override var cardId: String {
return CardIds.NonCollectible.Neutral.SpacePirate_SpacePiracyEnchantment
}

override var cardIdToShowInUI: String {
return CardIds.Collectible.Neutral.SpacePirate
}

required init(entityId: Int, isControlledByPlayer: Bool) {
super.init(entityId: entityId, isControlledByPlayer: isControlledByPlayer)
}

override var effectTarget: EffectTarget {
return .myself
}

override var effectDuration: EffectDuration {
return .conditional
}

override var effectTag: EffectTag {
return .costModification
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// StarlightWandererEnchantment.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class StarlightWandererEnchantment: EntityBasedEffect {
override var cardId: String {
return CardIds.NonCollectible.Neutral.StarlightWanderer_StarlightWandererFutureBuffEnchantment
}

override var cardIdToShowInUI: String {
return CardIds.Collectible.Neutral.StarlightWanderer
}

required init(entityId: Int, isControlledByPlayer: Bool) {
super.init(entityId: entityId, isControlledByPlayer: isControlledByPlayer)
}

override var effectDuration: EffectDuration {
return .conditional
}

override var effectTag: EffectTag {
return .minionModification
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// StrandedSpacemanEnchantment.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class StrandedSpacemanEnchantment: EntityBasedEffect {
override var cardId: String {
return CardIds.NonCollectible.Neutral.StrandedSpaceman_StrandedSpacemanFutureBuffEnchantment
}

override var cardIdToShowInUI: String {
return CardIds.Collectible.Neutral.StrandedSpaceman
}

required init(entityId: Int, isControlledByPlayer: Bool) {
super.init(entityId: entityId, isControlledByPlayer: isControlledByPlayer)
}

override var effectDuration: EffectDuration {
return .conditional
}

override var effectTag: EffectTag {
return .minionModification
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// AskaraEnchantment.swift
// HSTracker
//
// Created by Francisco Moraes on 10/30/24.
// Copyright © 2024 Benjamin Michotte. All rights reserved.
//

import Foundation

class AskaraEnchantment: EntityBasedEffect {
override var cardId: String {
return CardIds.NonCollectible.Priest.Askara_AskaraFutureBuffEnchantment
}

override var cardIdToShowInUI: String {
return CardIds.Collectible.Priest.Askara
}

required init(entityId: Int, isControlledByPlayer: Bool) {
super.init(entityId: entityId, isControlledByPlayer: isControlledByPlayer)
}

override var effectDuration: EffectDuration {
return .conditional
}

override var effectTag: EffectTag {
return .costModification
}
}
Loading

0 comments on commit 8e0a2a2

Please sign in to comment.