--- id: wiki-2026-0508-2014-combat-controls-update title: 2014 Combat Controls Update (War Commander) category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Combat Controls, War Commander 2014 update, RTS unit commands, attack-move, hold position] duplicate_of: none source_trust_level: B confidence_score: 0.85 verification_status: conceptual tags: [game-design, rts, war-commander, unit-control, ai-tactics, hotkey, micro-management, baiting] raw_sources: [] last_reinforced: 2026-05-09 github_commit: pending inferred_by: Claude Opus 4.7 (manual cleanup 2026-05-09) tech_stack: language: game design / process applicable_to: [Game Design, RTS, Combat AI, UX] --- # 2014 Combat Controls Update (War Commander) ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > **"λ§€ player 의 unit micro-management 의 hotkey-based realtime"**. μ˜› stance system β†’ modern dynamic command. λ§€ RTS / MOBA 의 standard interaction. **Player skill expression 의 큰 enable**. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) ### Background **War Commander** = Kixeye 의 browser RTS (2011-2020s). 2014-02-03 patch: - λ§€ μ˜› static defensive stance (set-and-forget) β†’ dynamic hotkey command. - λ§€ player 의 real-time micro 의 enable. - AI 의 strategic exploitation 의 deeper. ### λ§€ hotkey command (RTS ν‘œμ€€) #### Attack Move (A) - λ§€ unit 의 destination 의 move + λ§€ enemy on path 의 engage. - λ§€ click 의 target 도 λ§€ path enemy 의 priority. - λ§€ RTS 의 universal (StarCraft, AoE, Warcraft). #### Move (M) - λ§€ unit 의 stop 없이 destination. - λ§€ enemy 의 ignore. - Baiting / flanking / repositioning 의 essential. #### Stop (S) - λ§€ active command 의 cancel. - λ§€ over-pursue 의 prevent. - λ§€ defensive turret range 의 outside 의 stay. #### Hold Position (D) - λ§€ unit 의 stay + λ§€ in-range enemy 의 engage. - λ§€ μ˜› "Stand Ground" 의 modern. - λ§€ chokepoint defense 의 anchor. #### Fire at Will (F) - λ§€ unit 의 wide radius 의 enemy 의 actively pursue. - λ§€ μ˜› "Aggressive" 의 modern. - λ§€ baiting 의 vulnerable. #### Spread Units (X) - λ§€ platoon 의 instant disperse. - λ§€ mortar / artillery AoE 의 minimize. - λ§€ splash damage 의 mitigate. #### Enemy Health (B) - λ§€ enemy unit 의 HP 의 visible. - λ§€ attrition state 의 intel. - λ§€ retreat / push decision 의 input. #### Strike Team (Shift + Number) - λ§€ unit selection 의 group. - λ§€ multi-front attack. - λ§€ separated control. ### λ§€ strategic significance #### Baiting + Hold Position 의 trade-off | Stance | Easy to bait | Defense | |---|---|---| | Fire at Will | Very (chase) | Weak (out of position) | | Move | Very (passive) | None | | Hold Position | Impossible | Strong | | Attack Move | Some (path-based) | Medium | β†’ λ§€ defender 의 Hold = λ§€ attacker 의 baiting fail. β†’ λ§€ player 의 mode 의 awareness 의 gameplay. #### Command 의 cancel rule - λ§€ μƒˆ movement command = λ§€ stance 의 reset. - λ§€ base defense 의 setup ν›„ 의 deactivate 의 risk. - λ§€ player 의 λ§€ unit reposition ν›„ re-set. β†’ λ§€ micro-management 의 cognitive load. ### Modern RTS 의 비ꡐ #### StarCraft II - A-move, H-stop, S-stop similar. - λ§€ hold 의 default (patrol command). - λ§€ micro 의 PvP 의 핡심. #### MOBA (LoL, DotA) - λ§€ attack-move (A + click). - λ§€ last hit 의 important. - λ§€ hero 의 individual. #### War Commander (modern era) - λ§€ modern Kixeye game (Battle Pirates, VEGA Conflict) 의 inherit. - λ§€ Browser β†’ mobile. - λ§€ same hotkey 의 λ‹€λ₯Έ platform. ### Game design lesson #### λ§€ hotkey design - **Mnemonic**: A=Attack, M=Move, S=Stop, D=Defend(Hold), F=Fire. - **Reachable**: λ§€ left-hand 의 cluster. - **Customizable**: λ§€ player 의 own bind. #### λ§€ stance vs command - **Stance** (μ˜›): set-and-forget, λ§€ long-term. - **Command** (modern): per-action, λ§€ micro. β†’ λ§€ modern 의 dynamic. λ§€ single-player AI 의 stance. #### Player skill expression - λ§€ spread (X) 의 timing 의 crucial. - λ§€ baiting + hold 의 mind game. - λ§€ strike team 의 multi-front. - λ§€ enemy health (B) 의 economic decision. #### AI design 의 implication - λ§€ stance 의 player-friendly. - λ§€ default behavior 의 sensible. - λ§€ advanced 의 hotkey 의 power. ### War Commander 의 history - 2011 launch (Facebook). - 2014 Combat Controls Update (this doc). - 2020 shutdown (Facebook). - Kixeye 의 λ‹€λ₯Έ game 도. β†’ λ§€ specific game 의 historical artifact. ## πŸ’» μ½”λ“œ νŒ¨ν„΄ (Code Patterns) ### Hotkey-based command system (Unity) ```csharp public class UnitCommandHandler : MonoBehaviour { public Unit selectedUnit; void Update() { if (Input.GetKeyDown(KeyCode.A)) BeginAttackMove(); else if (Input.GetKeyDown(KeyCode.M)) BeginMove(); else if (Input.GetKeyDown(KeyCode.S)) StopCommand(); else if (Input.GetKeyDown(KeyCode.D)) HoldPosition(); else if (Input.GetKeyDown(KeyCode.F)) FireAtWill(); else if (Input.GetKeyDown(KeyCode.X)) SpreadUnits(); } void BeginAttackMove() { // Wait for next click for target commandMode = CommandMode.AttackMove; } void OnGroundClick(Vector3 worldPos) { if (commandMode == CommandMode.AttackMove) { selectedUnit.AttackMoveTo(worldPos); } else if (commandMode == CommandMode.Move) { selectedUnit.MoveTo(worldPos); } commandMode = CommandMode.Default; } } ``` ### Unit AI state (FSM-based) ```csharp public enum UnitStance { Default, AttackMove, Move, Hold, FireAtWill } public class Unit : MonoBehaviour { public UnitStance stance = UnitStance.Default; public Vector3 targetPosition; void Update() { switch (stance) { case UnitStance.AttackMove: if (HasEnemyInRange()) { EngageNearestEnemy(); } else { MoveToward(targetPosition); } break; case UnitStance.Move: MoveToward(targetPosition); // Ignore enemies. break; case UnitStance.Hold: // Don't move. Engage in-range only. if (HasEnemyInRange()) { EngageNearestEnemy(); } break; case UnitStance.FireAtWill: // Pursue enemy in radius. Enemy nearest = FindEnemyInRadius(pursuitRadius); if (nearest != null) { MoveToward(nearest.position); } break; } } } ``` ### Command cancel on new order ```csharp public void GiveOrder(Order order) { // λ§€ new movement = stance reset if (order is MoveOrder) { stance = UnitStance.Default; } currentOrder = order; } public void SetStance(UnitStance newStance) { stance = newStance; // Don't reset on stance change. } ``` ### Strike team (group selection) ```csharp public class GroupManager : MonoBehaviour { Dictionary> groups = new(); void Update() { for (int i = 1; i <= 9; i++) { if (Input.GetKey(KeyCode.LeftShift) && Input.GetKeyDown(KeyCode.Alpha0 + i)) { AssignGroup(i, currentSelection); } else if (Input.GetKeyDown(KeyCode.Alpha0 + i)) { SelectGroup(i); } } } void AssignGroup(int id, List units) { groups[id] = units; } void SelectGroup(int id) { if (groups.TryGetValue(id, out var units)) { currentSelection = units; } } } ``` ### Spread (AoE mitigation) ```csharp public void Spread(List units) { Vector3 center = AverageCenter(units); float spreadRadius = 5f; for (int i = 0; i < units.Count; i++) { float angle = (Mathf.PI * 2 * i) / units.Count; Vector3 offset = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * spreadRadius; units[i].MoveTo(center + offset); } } ``` ### Show enemy health (intel) ```csharp public class HealthBar : MonoBehaviour { public bool showAllEnemies = false; void Update() { if (Input.GetKeyDown(KeyCode.B)) { showAllEnemies = !showAllEnemies; UpdateAllEnemyBars(); } } void UpdateAllEnemyBars() { foreach (var enemy in FindObjectsOfType()) { enemy.healthBar.SetActive(showAllEnemies); } } } ``` ### AI stance vs player stance ```csharp // AI 의 default stance 의 design public class AIUnit : Unit { void Start() { // λ§€ base defender 의 hold. // λ§€ patrol 의 attack-move. if (role == UnitRole.Defender) stance = UnitStance.Hold; if (role == UnitRole.Patrol) stance = UnitStance.AttackMove; if (role == UnitRole.Aggressor) stance = UnitStance.FireAtWill; } } ``` ### Tutorial / hint system ```csharp public class TutorialHint : MonoBehaviour { void OnPlayerStrugglingWithBaiting() { ShowHint("Try 'M' (Move) to lure enemy without engaging. Then ambush with 'D' (Hold)."); } } ``` β†’ λ§€ player 의 mechanic 의 discover. ## πŸ€” μ˜μ‚¬κ²°μ • κΈ°μ€€ (Decision Criteria) | 상황 | μΆ”μ²œ command | |---|---| | Defending base | Hold Position (D) | | Pursuing scattered enemy | Fire at Will (F) | | Crossing dangerous map | Move (M, ignore enemy) | | Pushing with combat | Attack Move (A) | | Retreating | Move (M) + Stop (S) | | Anti-AoE | Spread (X) | | Multi-front | Strike Team (Shift+#) | **κΈ°λ³Έκ°’**: Attack Move 의 most common. λ§€ specific situation 의 specialized command. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & Updates) - **Stance 의 reset on movement**: λ§€ player 의 reposition ν›„ re-set 의 frustration. - **λ§€ hotkey 의 learning curve**: λ§€ new player 의 overwhelmed. - **λ§€ default 의 playstyle 의 lock-in**: λ§€ advanced player 의 micro 의 gap. - **AI 의 stance vs player 의 stance**: λ§€ player 의 strategic exploit. ## πŸ”— 지식 μ—°κ²° (Graph) - λ³€ν˜•: [[StarCraft-Micro]] - μ‘μš©: [[Baiting Tactics]] - κ²Œμž„: [[War-Commander]] Β· [[Kixeye]] - Adjacent: [[Behavior-Tree]] ## πŸ€– LLM ν™œμš© 힌트 (How to Use This Knowledge) **μ–Έμ œ 이 지식을 μ“°λŠ”κ°€:** - λ§€ RTS unit control system 의 design. - λ§€ combat AI 의 stance system. - λ§€ hotkey UX 의 design. - λ§€ player skill expression 의 enable. - λ§€ specific case study (War Commander). **μ–Έμ œ μ“°λ©΄ μ•ˆ λ˜λŠ”κ°€:** - Specific War Commander 의 modding (game shutdown). - Single-player turn-based (different paradigm). - Modern MOBA 의 specific mechanic (different). - Real-life military tactics (different scale). ## ❌ μ•ˆν‹°νŒ¨ν„΄ (Anti-Patterns) - **Static stance 만 (no command override)**: λ§€ micro 의 limit. - **Stance reset on every movement (unintended)**: λ§€ player 의 frustration. - **No hotkey customization**: λ§€ ergonomic mismatch. - **No tutorial / hint**: λ§€ new player 의 lost. - **AI stance 의 player stance 와 different naming**: confusion. ## πŸ§ͺ 검증 μƒνƒœ (Validation) - **정보 μƒνƒœ:** verified (concept-level). - **좜처 신뒰도:** B (War Commander wiki, Kixeye patch notes 2014, RTS design literature). - **κ²€ν†  이유:** Manual cleanup. λ§€ specific game 의 historical. λ§€ design pattern κ°€ universal. ## 🧬 쀑볡 검사 (Duplicate Check) - **κΈ°μ‘΄ μœ μ‚¬ λ¬Έμ„œ:** [[AI Exploitation (Game AI 곡랡)]] (related), [[RTS-Combat-Design]] (parent), [[Game-AI-Design]] (parent). - **처리 방식:** KEEP (specific historical case + transferable lesson). - **처리 이유:** λ§€ specific patch 의 historical record. ## πŸ•“ λ³€κ²½ 이λ ₯ (Changelog) | λ‚ μ§œ | λ³€κ²½ λ‚΄μš© | 처리 방식 | 신뒰도 | |------|-----------|-----------|--------| | 2026-05-08 | P-Reinforce Phase 1 μ •κ·œν™” | UPDATE | A | | 2026-05-09 | Manual cleanup β€” Unity code + RTS pattern + λ§€ modern 비ꡐ + μ•ˆν‹°νŒ¨ν„΄ μΆ”κ°€ | UPDATE | B |