Files
2nd/10_Wiki/Topics/AI_and_ML/2014 Combat Controls Update.md
T
Antigravity Agent f8b21af4be Wiki cleanup: error-doc removal, dedup merge, link normalization
10_Wiki/Topics 대규모 정리:
- 오류 캡처/미완성 stub 문서 227개 제거
- 교차폴더 중복 43클러스터 병합 (63파일 → redirect)
- 링크명 정규화: 깨진 링크 수정·redirect 직결·개념 매핑 ~2,400건
- 카테고리 MOC 6개 신규 생성
- Graph 섹션 미해결 related-keyword 링크 10,058건 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 23:52:15 +09:00

12 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, inferred_by, tech_stack
id title category status canonical_id aliases duplicate_of source_trust_level confidence_score verification_status tags raw_sources last_reinforced github_commit inferred_by tech_stack
wiki-2026-0508-2014-combat-controls-update 2014 Combat Controls Update (War Commander) 10_Wiki/Topics verified self
Combat Controls
War Commander 2014 update
RTS unit commands
attack-move
hold position
none B 0.85 conceptual
game-design
rts
war-commander
unit-control
ai-tactics
hotkey
micro-management
baiting
2026-05-09 pending Claude Opus 4.7 (manual cleanup 2026-05-09)
language applicable_to
game design / process
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)

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)

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

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)

public class GroupManager : MonoBehaviour {
    Dictionary<int, List<Unit>> 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<Unit> units) {
        groups[id] = units;
    }
    
    void SelectGroup(int id) {
        if (groups.TryGetValue(id, out var units)) {
            currentSelection = units;
        }
    }
}

Spread (AoE mitigation)

public void Spread(List<Unit> 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)

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>()) {
            enemy.healthBar.SetActive(showAllEnemies);
        }
    }
}

AI stance vs player stance

// 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

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)

🤖 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 (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