From 8d77c11bc800762a0142398ff850932b18a7fb8e Mon Sep 17 00:00:00 2001
From: Lorenz <lorenz-martin.diel@informatik.hs-fulda.de>
Date: Wed, 29 Jan 2025 14:10:00 +0100
Subject: [PATCH] first integration of XML to units

---
 src/unit.cpp | 69 +++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 55 insertions(+), 14 deletions(-)

diff --git a/src/unit.cpp b/src/unit.cpp
index b07f449..15078fa 100644
--- a/src/unit.cpp
+++ b/src/unit.cpp
@@ -75,8 +75,8 @@ namespace advanced_wars
     }
 
     MatchupTabel damageMatrix;
-    std::vector<Unit*> units;
-    
+    std::vector<Unit *> units;
+    /*
     void Unit::attack(Unit& enemy) {
 
         int offDamage = 50;
@@ -88,6 +88,47 @@ namespace advanced_wars
             this->health = this->health - defDamage;
             std::cout << "Health ally:" << this->health << std::endl;
         }
+    }*/
+
+    void Unit::attack(Unit &enemy)
+    {
+
+        
+        // Zuerst die Tabel für die primäre Waffe der angreifenden Einheit holen
+        auto &attackerSecondaryWeaponTable = secWeapon[id];
+
+        // Schadenswert für die angreifende Einheit gegen die verteidigende Einheit berechnen
+        if (attackerSecondaryWeaponTable.find(enemy.id) != attackerSecondaryWeaponTable.end())
+        {
+            int attackerDamageValue = attackerSecondaryWeaponTable[enemy.id];
+            // Berechne den Schaden in Abhängigkeit der Gesundheit der angreifenden Einheit
+            int offDamage = attackerDamageValue * (static_cast<float>(health) / max_health);
+
+            // Schaden auf den Gegner anwenden
+            enemy.health -= offDamage;
+            std::cout << "Enemy health after attack: " << enemy.health << std::endl;
+
+            // Prüfen, ob der Gegner noch am Leben ist um zurückzuschlagen
+            if (enemy.health > 0)
+            {
+                // Tabelle für die primäre Waffe der verteidigenden Einheit holen
+                auto &defenderSecondaryWeaponTable = secWeapon[enemy.id];
+                if (defenderSecondaryWeaponTable.find(this->id) != defenderSecondaryWeaponTable.end())
+                {
+                    int defenderDamageValue = defenderSecondaryWeaponTable[this->id];
+                    int defDamage = defenderDamageValue * (static_cast<float>(enemy.health) / enemy.max_health);
+
+                    // Schaden auf die angreifende Einheit anwenden
+                    this->health -= defDamage;
+                    std::cout << "Ally health after retaliation: " << this->health << std::endl;
+                }
+            }
+        }
+        else
+        {
+            std::cerr << "No damage value found for attack from unit " << static_cast<int>(id)
+                      << " against unit " << static_cast<int>(enemy.id) << std::endl;
+        }
     }
 
     void Unit::update_position(int posX, int posY)
@@ -96,19 +137,19 @@ namespace advanced_wars
         this->y = posY;
     }
 
-/*
-Features:
-//select unit 
-    - show context menu
-    - show move range
-    - MAYBE show valid targets
+    /*
+    Features:
+    //select unit
+        - show context menu
+        - show move range
+        - MAYBE show valid targets
 
-//deselect unit
+    //deselect unit
 
-//attack unit
-    - show context menu
+    //attack unit
+        - show context menu
 
-*/
+    */
     void Unit::onClick(SDL_Event event, std::vector<Unit> &unitVector)
     {
 
@@ -133,7 +174,7 @@ Features:
             }
             */
 
-           //make move range calc
+            // make move range calc
             break;
         case SDL_BUTTON_RIGHT:
 
@@ -160,7 +201,7 @@ Features:
 
             if (attacker != nullptr && defender != nullptr)
             {
-                //attack(attacker, defender);
+                // attack(attacker, defender);
                 std::cout << "We are fighting!!" << std::endl;
                 break;
             }
-- 
GitLab