Skip to content

Latest commit

Β 

History

History
468 lines (428 loc) Β· 27.3 KB

File metadata and controls

468 lines (428 loc) Β· 27.3 KB
╔════════════════════════════════════════════════════════════════════════════╗
β•‘                    TURN-BASED BATTLE SYSTEM ARCHITECTURE                  β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

πŸ—οΈ SYSTEM ARCHITECTURE

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         GAME APPLICATION LAYER                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  BattleSimulator (Interactive)              BattleDemo (Automated)     β”‚
β”‚  - Player input handling                    - AI decision making        β”‚
β”‚  - Character selection                      - Automated demo            β”‚
β”‚  - Turn prompt                              - Statistics display        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚
                                    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         BATTLE ENGINE CORE                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                            Battle.java                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Key Methods:                                                     β”‚  β”‚
β”‚  β”‚ β€’ start() β†’ determineTurnOrder() β†’ initialize battle             β”‚  β”‚
β”‚  β”‚ β€’ executePlayerAction() β†’ skill validation β†’ execution           β”‚  β”‚
β”‚  β”‚ β€’ processStatusEffects() β†’ update all active effects             β”‚  β”‚
β”‚  β”‚ β€’ endTurn() β†’ shift turn, regenerate FP                          β”‚  β”‚
β”‚  β”‚ β€’ isBattleFinished() β†’ check victory conditions                  β”‚  β”‚
β”‚  β”‚ β€’ displayStatus() β†’ visual battle state                          β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                                                      β”‚
        β”‚                                                      β”‚
        β–Ό                                                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      State Management Layer          β”‚   β”‚   Logging & Event Layer      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€   β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  BattleState (Enum)                  β”‚   β”‚  BattleLog.java              β”‚
β”‚  - WAITING                           β”‚   β”‚  - Stores all actions        β”‚
β”‚  - PLAYER1_TURN                      β”‚   β”‚  - Manages log records       β”‚
β”‚  - PLAYER2_TURN                      β”‚   β”‚  - Display capabilities      β”‚
β”‚  - FINISHED                          β”‚   β”‚                              β”‚
β”‚                                      β”‚   β”‚  BattleAction.java           β”‚
β”‚  Manages flow control & validation   β”‚   β”‚  - Action metadata           β”‚
β”‚                                      β”‚   β”‚  - Damage/Healing tracking   β”‚
β”‚                                      β”‚   β”‚  - Timestamp recording       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                                            β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
                             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    CHARACTER & ENTITY LAYER                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                         β”‚
β”‚  BaseCharacter (Abstract)                                               β”‚
β”‚  β”œβ”€ name, HP, FP, ATK, DEF, SPD                                         β”‚
β”‚  β”œβ”€ skills: List<Skill>                                                β”‚
β”‚  β”œβ”€ activeEffects: List<StatusEffect>                                   β”‚
β”‚  β”œβ”€ Methods:                                                            β”‚
β”‚  β”‚  β€’ takeDamage() / takeDamageWithMechanics()                          β”‚
β”‚  β”‚  β€’ heal()                                                            β”‚
β”‚  β”‚  β€’ useFocusPoints() / regenFocusPoints()                             β”‚
β”‚  β”‚  β€’ addEffect() / processEffects() / updateStatusEffects()            β”‚
β”‚  β”‚  β€’ canMove()                                                         β”‚
β”‚  └─ getActiveEffectNames()                                              β”‚
β”‚                                                                         β”‚
β”‚  Concrete Character Implementations:                                    β”‚
β”‚  β”œβ”€ FireCharacter      (HP:100, ATK:35, DEF:15, SPD:30) πŸ”₯             β”‚
β”‚  β”œβ”€ WaterCharacter     (HP:120, ATK:25, DEF:25, SPD:10) πŸ’§             β”‚
β”‚  β”œβ”€ EarthCharacter     (HP:140, ATK:25, DEF:30, SPD:5)  🌍             β”‚
β”‚  └─ WindCharacter      (HP:90,  ATK:30, DEF:10, SPD:50) πŸ’¨             β”‚
β”‚                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        └─────────────────────────────────┬──────────────────────────────┐
                                          β”‚                              β”‚
                                          β–Ό                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         SKILL EXECUTION LAYER                     β”‚  β”‚  EFFECT SYSTEM   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                   β”‚  β”‚                  β”‚
β”‚  Skill (Interface)                                β”‚  β”‚ StatusEffect     β”‚
β”‚  β”œβ”€ getName()                                    β”‚  β”‚ β”œβ”€ apply()       β”‚
β”‚  β”œβ”€ getFpCost()                                  β”‚  β”‚ β”œβ”€ tick()        β”‚
β”‚  └─ use(user, target)                            β”‚  β”‚ β”œβ”€ remove()      β”‚
β”‚                                                   β”‚  β”‚ └─ decreaseDur() β”‚
β”‚  Common Skills:                                   β”‚  β”‚                  β”‚
β”‚  β”œβ”€ AttackSkill      (0 FP)                       β”‚  β”‚ Concrete Effects:β”‚
β”‚  β”œβ”€ GuardSkill       (0 FP)                       β”‚  β”‚ β”œβ”€ BurnEffect   β”‚
β”‚  └─ HealSkill        (10 FP)                      β”‚  β”‚ β”‚  (5 dmg/turn)  β”‚
β”‚                                                   β”‚  β”‚ β”œβ”€ FreezeEffect β”‚
β”‚  Elemental Skills (Special):                      β”‚  β”‚ β”‚  (skip turn)   β”‚
β”‚  β”œβ”€ FireballSkill    (25 FP) β†’ Burn Effect       β”‚  β”‚ └─ AttackBuffEffβ”‚
β”‚  β”œβ”€ IceBlastSkill    (30 FP) β†’ Freeze Effect     β”‚  β”‚                  β”‚
β”‚  β”œβ”€ RockThrowSkill   (20 FP)                      β”‚  β”‚ EffectType Enum:β”‚
β”‚  └─ AirSlashSkill    (25 FP)                      β”‚  β”‚ β”œβ”€ DAMAGE       β”‚
β”‚                                                   β”‚  β”‚ β”œβ”€ CROWD_CONTROLβ”‚
β”‚                                                   β”‚  β”‚ β”œβ”€ BUFF         β”‚
β”‚                                                   β”‚  β”‚ └─ DEBUFF       β”‚
β”‚                                                   β”‚  β”‚                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                                                          β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                       β”‚
                                       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    UTILITY LAYER                                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                          β”‚
β”‚  ElementalAdvantage (Utility)                                            β”‚
β”‚  β”œβ”€ getMultiplier(attacker, defender) β†’ 0.75, 1.0, or 1.5              β”‚
β”‚  └─ getEffectivenessMessage()                                           β”‚
β”‚                                                                          β”‚
β”‚  ElementType (Enum)                                                      β”‚
β”‚  β”œβ”€ FIRE   ──┐                                                           β”‚
β”‚  β”œβ”€ WATER  ──┼─ Rock-Paper-Scissors cycle                              β”‚
β”‚  β”œβ”€ EARTH  ───                                                           β”‚
β”‚  β”œβ”€ WIND   β”€β”€β”˜                                                           β”‚
β”‚  └─ NEUTRAL                                                              β”‚
β”‚                                                                          β”‚
β”‚  Constants.java (Configuration)                                          β”‚
β”‚                                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š DATA FLOW DIAGRAM

Battle Initialization Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   START     β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Create Battle(p1, p2)        β”‚
β”‚ BattleState = WAITING        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ battle.start()               β”‚
β”‚ - determine Turn Order       β”‚
β”‚ - check speed diff           β”‚
β”‚ - if equal: coin flip        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Set CurrentState:            β”‚
β”‚ PLAYER1_TURN or PLAYER2_TURN β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ MAIN LOOP    β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Turn Execution Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ displayStatus()                     β”‚
β”‚ - Show HP bars, FP bars             β”‚
β”‚ - Show active effects               β”‚
β”‚ - Show available skills             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Check canMove()                     β”‚
β”‚ - Frozen? β†’ Skip turn               β”‚
β”‚ - Continue: get skill input         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ executePlayerAction(skillIndex)     β”‚
β”‚ - Validate skill index              β”‚
β”‚ - Check FP >= FpCost                β”‚
β”‚ - Execute: skill.use(user, target)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ Skill Executes β”‚
        β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
        β”‚ β€’ Calculate damage
        β”‚ β€’ Check dodge
        β”‚ β€’ Check crit
        β”‚ β€’ Apply elem bonus
        β”‚ β€’ Apply defense
        β”‚ β€’ Add effect
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚
                 β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ processStatusEffects()               β”‚
β”‚ - Tick all active effects            β”‚
β”‚ - Apply damage/effects               β”‚
β”‚ - Remove expired effects             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ isBattleFinished()?                 β”‚
β”‚ - HP <= 0? β†’ END BATTLE              β”‚
β”‚ - Surrender? β†’ END BATTLE            β”‚
β”‚ - Continue: next turn                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ endTurn()                            β”‚
β”‚ - Switch player (P1↔P2)              β”‚
β”‚ - Increment turn counter             β”‚
β”‚ - Regenerate FP (+10)                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
         Loop back to displayStatus()

Damage Calculation Pipeline

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Raw Damage = ATK     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Check Critical Hit?                  β”‚
β”‚ Chance = Speed / 4.0 (max 25%)       β”‚
β”‚ If crit: damage *= 1.5               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Apply Elemental Multiplier            β”‚
β”‚ 0.75x (disadvantage)                  β”‚
β”‚ 1.0x  (neutral)                       β”‚
β”‚ 1.5x  (advantage)                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Apply Defense                         β”‚
β”‚ finalDamage = damage - defense        β”‚
β”‚ min(0)                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Apply to Target HP                    β”‚
β”‚ target.HP -= finalDamage              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Dodge Check Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ dodgeChance = (defender.speed  β”‚
β”‚   - attacker.speed) / 100 * 100β”‚
β”‚ max = 30%                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ random() * 100 < dodgeChance?  β”‚
β”‚ YES β†’ "Dodge! Attack missed"   β”‚
β”‚ NO β†’ Damage applied            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”„ CLASS RELATIONSHIPS

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”‚
β”‚  β”‚   Battle     │◄────────│ BattleState  β”‚                 β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
β”‚  β”‚ - state      β”‚                                          β”‚
β”‚  β”‚ - turnCount  β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”‚
β”‚  β”‚ - player1    │◄────────│ BaseCharacterβ”‚                 β”‚
β”‚  β”‚ - player2    β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
β”‚  β”‚ - battleLog  │◄────────┐                                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚                                β”‚
β”‚         β”‚                 β”‚                                β”‚
β”‚         β–Ό                 β”‚                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚                                β”‚
β”‚  β”‚ BattleLog    β”‚         β”‚                                β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€         β”‚                                β”‚
β”‚  β”‚ - actions[]  β”‚         β”‚                                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚                                β”‚
β”‚         β”‚                 β”‚                                β”‚
β”‚         β–Ό                 β”‚                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚                                β”‚
β”‚  β”‚BattleAction  β”‚         β”‚                                β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€         β”‚                                β”‚
β”‚  β”‚ - actor      β”‚         β”‚                                β”‚
β”‚  β”‚ - skill      β”‚         β”‚                                β”‚
β”‚  β”‚ - damage     β”‚         β”‚                                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚                                β”‚
β”‚                           β”‚                                β”‚
β”‚         BaseCharacterβ—„β”€β”€β”€β”€β”˜                                β”‚
β”‚         β”œβ”€ FireCharacter                                   β”‚
β”‚         β”œβ”€ WaterCharacter                                  β”‚
β”‚         β”œβ”€ EarthCharacter                                  β”‚
β”‚         β”œβ”€ WindCharacter                                   β”‚
β”‚         β”‚                                                  β”‚
β”‚         β”œβ”€ skills: List◄────┐                              β”‚
β”‚         β”‚                   β”‚                              β”‚
β”‚         β”‚     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚         β”‚     β”‚                           β”‚               β”‚
β”‚         β”‚     β–Ό                           β–Ό               β”‚
β”‚         β”‚  Skill (Interface)              β”‚               β”‚
β”‚         β”‚  β”œβ”€ AttackSkill                 β”‚               β”‚
β”‚         β”‚  β”œβ”€ GuardSkill                  β”‚               β”‚
β”‚         β”‚  β”œβ”€ HealSkill                   β”‚               β”‚
β”‚         β”‚  └─ *Elemental Skills           β”‚               β”‚
β”‚         β”‚     β”œβ”€ FireballSkill            β”‚               β”‚
β”‚         β”‚     β”œβ”€ IceBlastSkill            β”‚               β”‚
β”‚         β”‚     β”œβ”€ RockThrowSkill           β”‚               β”‚
β”‚         β”‚     └─ AirSlashSkill            β”‚               β”‚
β”‚         β”‚                                  β”‚               β”‚
β”‚         └─ activeEffects: List◄────────────               β”‚
β”‚                                           β”‚               β”‚
β”‚              StatusEffect (Abstract)β—„β”€β”€β”€β”€β”€β”˜               β”‚
β”‚              β”œβ”€ BurnEffect                                β”‚
β”‚              └─ FreezeEffect                              β”‚
β”‚                                                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🎯 DESIGN PATTERNS USED

1. State Pattern (BattleState)

Purpose: Track battle state transitions
Implementation: Enum BattleState {WAITING, PLAYER1_TURN, ...}
Benefit: Clear state management, prevents invalid transitions

2. Strategy Pattern (Skill interface)

Purpose: Different skill implementations
Implementation: Skill interface with multiple implementations
Benefit: Easy to add new skills, polymorphic execution

3. Observer Pattern (BattleLog)

Purpose: Record and replay events
Implementation: BattleLog observes all actions
Benefit: Decoupled logging, can extend with reports

4. Template Method (BaseCharacter)

Purpose: Define battle character structure
Implementation: Abstract class with abstract methods
Benefit: Consistent character interface, customizable skills

5. Decorator Pattern (Status Effects)

Purpose: Add effects to characters
Implementation: StatusEffect wrapper pattern
Benefit: Can stack effects, easy to add new effects

6. Factory Pattern (BattleSimulator)

Purpose: Create character instances
Implementation: Switch statement creating characters
Benefit: Centralized character creation

πŸ“ˆ PERFORMANCE CHARACTERISTICS

Operation Complexity Notes
Turn execution O(n) n = number of active effects
Skill selection O(1) Direct array access
Damage calculation O(1) Fixed set of operations
Battle log O(1) Capped at 100 entries
Status effect update O(n) n = active effects (usually 1-3)
Victory check O(1) Simple HP comparison

Memory: ~5-10 KB per battle (excluding display)


πŸ” Thread Safety

Current implementation: Single-threaded

  • All operations happen sequentially
  • No concurrent modifications

If future multiplayer online:

  • Use synchronized collections
  • Add thread-safe queue for battle commands
  • Implement message passing for turn validation

πŸš€ SCALABILITY ROADMAP

Level 1: Current (Single Player, 1v1)
β”œβ”€ Interactive mode: βœ…
└─ Demo mode: βœ…

Level 2: Local Multiplayer
β”œβ”€ Split screen display
β”œβ”€ Controller input support
└─ Tournament mode

Level 3: Online Multiplayer
β”œβ”€ Network serialization
β”œβ”€ Latency compensation
└─ Server-side battle validation

Level 4: Advanced Features
β”œβ”€ Item system
β”œβ”€ Leveling/Experience
β”œβ”€ Skill trees
└─ Campaign mode

Level 5: Meta Game
β”œβ”€ Rank/Rating system
β”œβ”€ Cosmetics/Skins
β”œβ”€ Seasonal updates
└─ Esports integration

πŸ“¦ DEPLOYMENT

Development:
β”œβ”€ mvn clean compile
β”œβ”€ mvn test
└─ java -cp target/classes com.game.battle.BattleSimulator

Distribution:
β”œβ”€ mvn package
β”œβ”€ java -jar target/TurnBaseGameJava-1.0-SNAPSHOT.jar
└─ OR create standalone executable with Maven Assembly Plugin

Architecture Version: 1.0 Last Updated: 2025 Status: Production Ready βœ