Skip to content

Commit

Permalink
Merge pull request #310 from Teicsoft/battle-scene
Browse files Browse the repository at this point in the history
Battle scene
  • Loading branch information
emmettirl authored Feb 24, 2024
2 parents dbd7f5d + ab392f8 commit 239acfe
Show file tree
Hide file tree
Showing 10 changed files with 110 additions and 147 deletions.
4 changes: 2 additions & 2 deletions scenes/glossary/CardGlossary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ public override void _Ready()

Node VBoxContainer = GetNode("ScrollContainer/VBoxContainer");

foreach (string cardId in CardPrototypes.cardPrototypeDict.Keys)
foreach (string cardId in CardFactory.CardPrototypeDict.Keys)
{
Card card = CardPrototypes.cardPrototypeDict[cardId];
Card card = CardFactory.CardPrototypeDict[cardId];

Node packedScene = ResourceLoader.Load<PackedScene>("res://scenes/glossary/card_glossary_item.tscn").Instantiate();
packedScene.GetNode<Label>("VBoxContainer/ContentMargin/VBoxContainer/CardNameMargin/CardName").Text = card.CardName;
Expand Down
4 changes: 2 additions & 2 deletions scenes/glossary/ComboGlossary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public void Initialize(Deck<CardSleeve> deck, List<Combo> allCombos)
//cardList
VBoxContainer cardList = packedScene.GetNode<VBoxContainer>("VBoxContainer/ContentMargin/VBoxContainer/CardList/VBoxContainer");
int i = 0;
List<string> _blockCards = CardPrototypes.cardPrototypeDict.Where(kvp => kvp.Value.CardType == "Block").Select(kvp => kvp.Value.Id).ToList();
List<string> _blockCards = CardFactory.CardPrototypeDict.Where(kvp => kvp.Value.CardType == "Block").Select(kvp => kvp.Value.Id).ToList();

foreach (Card comboCard in combo.CardList)
{
Expand All @@ -56,7 +56,7 @@ public void Initialize(Deck<CardSleeve> deck, List<Combo> allCombos)
}
else
{
label.Text = (i+1).ToString() + ": " + CardPrototypes.cardPrototypeDict[comboCard.Id].CardName;
label.Text = (i+1).ToString() + ": " + CardFactory.CardPrototypeDict[comboCard.Id].CardName;
}

if ((deck.Cards.Any(deckCard => (deckCard.Card.Id == comboCard.Id) || (_blockCards.Contains(deckCard.Card.Id) && "card_FullBlock" == comboCard.Id) ) == false) && inDeck)
Expand Down
12 changes: 5 additions & 7 deletions scripts/battle/Battle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public override void _Ready() {

InitialiseGameState(playerCardIds, enemies);
InitialiseHud();

ComboGlossary comboGlossary = GetNode<ComboGlossary>("HUD/ComboGlossary");
comboGlossary.Initialize(_gameState.Hand.Deck, _gameState.AllCombos);

Expand Down Expand Up @@ -105,11 +105,9 @@ private List<Enemy> CreateEnemies(List<string> enemyIds) {
enemy.Deck = GetEnemyDeck(enemy.DeckId);
enemy.Position = GetEnemyPosition(i, idsCount);
enemy.EnemySelected += MoveSelectedIndicator;

if (GD.Randi() % 2 == 0) {
enemy.GetNode<Sprite2D>("EnemySprite").FlipH = false;
}


if (GD.Randi() % 2 == 0) { enemy.GetNode<Sprite2D>("EnemySprite").FlipH = false; }

AddChild(enemy);
enemies.Add(enemy);
}
Expand All @@ -135,7 +133,7 @@ private Deck<Card> GetEnemyDeck(string deckId) {

// _allDecks.TryGetValue("deck_enemy", out List<string> enemyCardIds);
_allDecks.TryGetValue(deckId, out List<string> enemyCardIds);
enemyDeck.AddCards(enemyCardIds.Select(CardPrototypes.CloneCard).ToList());
enemyDeck.AddCards(enemyCardIds.Select(CardFactory.CloneCard).ToList());
enemyDeck.Shuffle();
return enemyDeck;
}
Expand Down
3 changes: 1 addition & 2 deletions scripts/battle/Deck.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ public void AddCards(List<T> cards) {

public bool IsEmpty() { return Cards.Count == 0; }

public void Shuffle()
{
public void Shuffle() {
Cards = Shuffle(Cards);
DeckShuffledCustomEvent?.Invoke(this, EventArgs.Empty);
}
Expand Down
26 changes: 8 additions & 18 deletions scripts/battle/GameState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,7 @@ public void PlaySelectedCard() {
Hand.DiscardCard();
DeselectDeadEnemy();
HideDeadEnemies();
if (Hand.Cards.Count == 0) {
EndTurn();
}
if (Hand.Cards.Count == 0) { EndTurn(); }
}
}

Expand All @@ -111,22 +109,16 @@ public void ComboCheck(Card card) { // largely based on Cath's python code
}

public void PushCardStack(Card card) { ComboStack.Add(card); }


public Combo ComboCompare() {
List<string> _blockCards = CardPrototypes.cardPrototypeDict.Where(kvp => kvp.Value.CardType == "Block").Select(kvp => kvp.Value.Id).ToList();

foreach (Combo combo in AllCombos) {
int count = combo.CardList.Count;
if (ComboStack.Count < count) { continue; }

if (ComboStack.Count < combo.CardList.Count) { continue; }
bool match = true;
for (int i = 1; i <= count; i++) {
if (_blockCards.Contains(ComboStack[^i].Id) && "card_FullBlock" == combo.CardList[^i].Id)
{
continue;
}
if (ComboStack[^i].Id != combo.CardList[^i].Id) {
for (int i = 1; i <= combo.CardList.Count; i++) {
Card playedCard = ComboStack[^i];
Card comboCard = combo.CardList[^i];
if (playedCard.CardType == "Block" && comboCard.Id == "card_FullBlock") { continue; }
if (playedCard.Id != comboCard.Id) {
match = false;
break;
}
Expand Down Expand Up @@ -237,9 +229,7 @@ public void StopDiscarding() {
private void SelectedDiscard(CardSleeve sleeve) {
Discards--;
Hand.DiscardCard(sleeve);
if (Hand.Cards.Count == 0) {
EndTurn();
}
if (Hand.Cards.Count == 0) { EndTurn(); }
}

// Enemy methods
Expand Down
2 changes: 1 addition & 1 deletion scripts/battle/Hand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public void DrawCards(int n) {
}

public void InitialiseDeck(List<string> cardIds) {
Deck.AddCards(Deck<CardSleeve>.SleeveCards(cardIds.Select(CardPrototypes.CloneCard).ToList()));
Deck.AddCards(Deck<CardSleeve>.SleeveCards(cardIds.Select(CardFactory.CloneCard).ToList()));
Deck.Shuffle();
}

Expand Down
11 changes: 5 additions & 6 deletions scripts/battle/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,15 @@ public enum StatusEnum {
GetScars,
OpenedRecklessly,
}

public class DirectionEventArgs : EventArgs {
public string Direction { get; set; }
}
public static DirectionEventArgs CheckDirection (int oldValue, int newValue){

public static DirectionEventArgs CheckDirection(int oldValue, int newValue) {
DirectionEventArgs args = new DirectionEventArgs();
if (oldValue > newValue) { args.Direction = "down"; }
else if (oldValue < newValue) { args.Direction = "up"; }
else { args.Direction = "none"; }
if (oldValue > newValue) { args.Direction = "down"; } else if
(oldValue < newValue) { args.Direction = "up"; } else { args.Direction = "none"; }
return args;
}

Expand Down
148 changes: 70 additions & 78 deletions scripts/battle/card/CardFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,73 @@

namespace GLADIATE.scripts.battle.card;

public static class CardXmlParser {
public static Card ParseCardsFromXml(string filePath) {

public static class CardFactory {
private const string CARD_FILE_PATH = "res://data/cards/";
private static readonly Dictionary<string, Func<Card>> TYPE_DICTIONARY = new() {
{ "card_reckless", () => new StunCard() },
{ "card_Spartackle", () => new Spartackle() },
{ "card_BloodOnTheSand", () => new BloodOnSand() },
{ "card_gladius", () => new Gladius() },
{ "card_Grapple", () => new ModifierCard() },
{ "card_FlyingCrossBody", () => new FlyingCrossBody() },
{ "card_DropKick", () => new Dropkick() },
{ "card_headbutt", () => new Headbutt() },
{ "card_JudoThrow", () => new JudoThrow() },
{ "card_KipUp", () => new KipUp() },
{ "card_Throw", () => new ModifierCard() },
{ "card_Trip", () => new ModifierCard() },
{ "card_Showoff", () => new ShowOff() },
{ "card_PleaseTheCrowd", () => new PleaseTheCrowd() },
{ "card_DramaticTattooReveal", () => new DramaticTattooReveal() },
{ "card_GallicSuplex", () => new GallicSuplex() },
{ "card_ComeCloser", () => new ComeCloser() },
{ "card_ShoutYourMoveName", () => new ShoutYourMoveName() },
{ "card_Lariat", () => new Lariat() },
};
public static Dictionary<string, Card> CardPrototypeDict = ParseAllCards();

private static Dictionary<string, Card> ParseAllCards() {
Dictionary<string, Card> cardList = new();
foreach (string fileName in DirAccess.GetFilesAt(CARD_FILE_PATH)) {
if (fileName.EndsWith(".xml") && fileName != "card_template.xml") {
Card card = ParseCardsFromXml(CARD_FILE_PATH + fileName);
cardList.Add(card.Id, card);
}
}

return cardList;
}

public static Card CloneCard(string cardId) { return CardPrototypeDict[cardId].Clone(); }

public static void ReloadCardFactory() { CardPrototypeDict = ParseAllCards(); }

public static Card ConstructCard(string cardId) {
return TYPE_DICTIONARY.GetValueOrDefault(cardId, () => new Card()).Invoke();
}

public static Card MakeBlankCard(string cardId) {
Card card = ConstructCard(cardId);
card.Id = cardId;
return card;
}

private static Card MakeCard(
string type, string cardId, Utils.ModifierEnum modifier, Utils.PositionEnum position, int attack,
int defenseLower, int defenseUpper, int health, int draw, int discard, int spectaclePoints, string name,
string description, string lore, string tooltip, string imagePath, string animationPath, string soundPath,
bool targetRequired
) {
Card card = ConstructCard(cardId);

return card.Initialize(
type, cardId, modifier, position, targetRequired, attack, defenseLower, defenseUpper, health, draw, discard,
spectaclePoints, name, description, lore, tooltip, imagePath, animationPath, soundPath
);
}

private static Card ParseCardsFromXml(string filePath) {
using FileAccess file = FileAccess.Open(filePath, FileAccess.ModeFlags.Read);
string content = file.GetAsText();

Expand All @@ -22,11 +87,11 @@ public static Card ParseCardsFromXml(string filePath) {
string position = cardNode.Attributes["position"].Value;


if (!Enum.TryParse(modifier, out battle.Utils.ModifierEnum parsedModifier)) {
if (!Enum.TryParse(modifier, out Utils.ModifierEnum parsedModifier)) {
GD.Print("Failed to parse modifier: " + modifier);
}

if (!Enum.TryParse(position, out battle.Utils.PositionEnum parsedPosition)) {
if (!Enum.TryParse(position, out Utils.PositionEnum parsedPosition)) {
GD.Print("Failed to parse position: " + position);
}

Expand All @@ -52,82 +117,9 @@ public static Card ParseCardsFromXml(string filePath) {
string lore = XmlParsing.Utils.ParseTextNode(textNode, "lore");
string tooltip = XmlParsing.Utils.ParseTextNode(textNode, "tooltip_text");

return CardFactory.MakeCard(
return MakeCard(
cardType, cardId, parsedModifier, parsedPosition, attack, defenseLower, defenseUpper, health, draw, discard,
spectaclePoints, name, description, lore, tooltip, imagePath, animationPath, soundPath, targetRequired
);
}

public static Dictionary<string, Card> ParseAllCards() {
string cardFilePath = "res://data/cards/";

string[] filesAtPath = DirAccess.GetFilesAt(cardFilePath);


Dictionary<string, Card> cardList = new Dictionary<string, Card>();
foreach (string fileName in filesAtPath) {
if (fileName.EndsWith(".xml") && fileName != "card_template.xml") {
Card card = ParseCardsFromXml(cardFilePath + fileName);
cardList.Add(card.Id, card);
}
}

return cardList;
}
}

public static class CardPrototypes {
public static Dictionary<string, Card> cardPrototypeDict = CardXmlParser.ParseAllCards();

public static Card CloneCard(string cardId) { return cardPrototypeDict[cardId].Clone(); }

public static void ReloadCardPrototypes() { cardPrototypeDict = CardXmlParser.ParseAllCards(); }
}

public static class CardFactory {
private static Dictionary<string, Func<Card>> TypeDictionary = new() {
{ "card_reckless", () => new StunCard() },
{ "card_Spartackle", () => new Spartackle() },
{ "card_BloodOnTheSand", () => new BloodOnSand() },
{ "card_gladius", () => new Gladius() },
{ "card_Grapple", () => new ModifierCard() },
{ "card_FlyingCrossBody", () => new FlyingCrossBody() },
{ "card_DropKick", () => new Dropkick() },
{ "card_headbutt", () => new Headbutt() },
{ "card_JudoThrow", () => new JudoThrow() },
{ "card_KipUp", () => new KipUp() },
{ "card_Throw", () => new ModifierCard() },
{ "card_Trip", () => new ModifierCard() },
{ "card_Showoff", () => new ShowOff() },
{ "card_PleaseTheCrowd", () => new PleaseTheCrowd() },
{ "card_DramaticTattooReveal", () => new DramaticTattooReveal() },
{ "card_GallicSuplex", () => new GallicSuplex() },
{ "card_ComeCloser", () => new ComeCloser() },
{ "card_ShoutYourMoveName", () => new ShoutYourMoveName() },
{ "card_Lariat", () => new Lariat() },
};

public static Card ConstructCard(string cardId) {
return TypeDictionary.GetValueOrDefault(cardId, () => new Card()).Invoke();
}

public static Card MakeBlankCard(string cardId) {
Card card = ConstructCard(cardId);
card.Id = cardId;
return card;
}

public static Card MakeCard(
string type, string cardId, Utils.ModifierEnum modifier, Utils.PositionEnum position, int attack,
int defenseLower, int defenseUpper, int health, int draw, int discard, int spectaclePoints, string name,
string description, string lore, string tooltip, string imagePath, string animationPath, string soundPath,
bool targetRequired
) {
Card card = ConstructCard(cardId);

return card.Initialize(
type, cardId, modifier, position, targetRequired, attack, defenseLower, defenseUpper, health, draw, discard,
spectaclePoints, name, description, lore, tooltip, imagePath, animationPath, soundPath
);
}
}
34 changes: 11 additions & 23 deletions scripts/battle/target/Enemy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,23 +111,13 @@ public override void _Ready() {
}

public override void _Process(double delta) { }

private void OnJigglePhysicsTimerTimeout()
{
GD.RandRange(-5, 5);
GetNode<Sprite2D>("EnemySprite").Skew = (float)GD.RandRange(-0.05f, 0.05f);

if (GD.Randi() % 10 == 0)
{

if (GetNode<Sprite2D>("EnemySprite").FlipH)
{
GetNode<Sprite2D>("EnemySprite").FlipH = false;
}
else
{
GetNode<Sprite2D>("EnemySprite").FlipH = true;
}

private void OnJigglePhysicsTimerTimeout() {
Sprite2D sprite = GetNode<Sprite2D>("EnemySprite");
sprite.Skew = (float)GD.RandRange(-0.05f, 0.05f);

if (GD.Randi() % 10 == 0) {
if (sprite.FlipH) { sprite.FlipH = false; } else { sprite.FlipH = true; }
}
}

Expand Down Expand Up @@ -208,14 +198,12 @@ private void UpdateDefenseLowerDisplay() {
GetNode<Label>("LowerBlockDisplay").Text = DefenseLower.ToString();
}

private void OnCardPlayedTimer() {
GetNode<Label>("CardPlayed").Visible = false;
}

public override string ToString() {
return
$"{nameof(Id)}: {Id}, {nameof(Name)}: {Name}, {nameof(Image)}: {Image}, {nameof(SoundEffect)}: {SoundEffect}, {nameof(Lore)}: {Lore}, {nameof(DeckId)}: {DeckId}, {nameof(Modifier)}: {Modifier}, {nameof(Color)}: {Color}, {nameof(Deck)}: {Deck}, {nameof(_health)}: {_health}, {nameof(_defenseUpper)}: {_defenseUpper}, {nameof(_defenseLower)}: {_defenseLower}, {nameof(MaxHealth)}: {MaxHealth}, {nameof(Statuses)}: {Statuses}";
}

private void OnCardPlayedTimer() {
Label cardPlayedLabel = GetNode<Label>("CardPlayed");
cardPlayedLabel.Visible = false;
}
}

Loading

0 comments on commit 239acfe

Please sign in to comment.