Files
2nd/10_Wiki/Topics/AI_and_ML/2014 Combat Controls Update.md
T
koriweb d8a80f6272 chore(wiki): dangling 링크 canonical 정규화 (768파일/1200건)
이름만 다른(표기 변형) [[위키링크]]를 대상 문서의 canonical 제목으로 치환해
끊겼던 1,200개 링크를 연결. 제목/파일명 정규화 일치만 적용하고 별칭 매칭은
과병합 위험으로 제외(애매성 가드). 원본은 _link_reconcile_backup/ 에 백업.
도구: Datacollect/scripts/link_reconcile_apply.mjs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 12:24: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)

🕓 변경 이력 (Changelog)

날짜 변경 내용 처리 방식 신뢰도
2026-05-08 P-Reinforce Phase 1 정규화 UPDATE A
2026-05-09 Manual cleanup — Unity code + RTS pattern + 매 modern 비교 + 안티패턴 추가 UPDATE B