[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -1,76 +1,386 @@
|
||||
---
|
||||
id: wiki-2026-0508-2014-combat-controls-update
|
||||
title: 2014 Combat Controls Update
|
||||
title: 2014 Combat Controls Update (War Commander)
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: []
|
||||
aliases: [Combat Controls, War Commander 2014 update, RTS unit commands, attack-move, hold position]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
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-08
|
||||
last_reinforced: 2026-05-09
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
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|2014 Combat Controls Update]]
|
||||
# 2014 Combat Controls Update (War Commander)
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
2014 Combat Controls Update는 2014년 2월 3일 게임 업데이트를 통해 도입된 새로운 전투 제어 시스템입니다 [1-3]. 이 시스템은 기존에 사용되던 정적인 방어 태세(Defensive Stances)를 동적이고 단축키 기반인 실시간 유닛 관리 체계로 대체했습니다 [3, 4]. 이를 통해 플레이어는 마이크로 컨트롤과 상황 인식 능력을 극대화할 수 있게 되었으며, 인공지능(AI)의 경로 및 교전 논리를 전략적으로 더 일관성 있게 조작할 수 있는 기반이 마련되었습니다 [3, 4].
|
||||
> **"매 player 의 unit micro-management 의 hotkey-based realtime"**. 옛 stance system → modern dynamic command. 매 RTS / MOBA 의 standard interaction. **Player skill expression 의 큰 enable**.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
**주요 전투 명령어 및 단축키 기능**
|
||||
* **공격 이동 (Attack Move, 단축키 'A')**: 유닛을 지정한 위치로 이동시키며, 경로상에 있는 모든 적을 향해 발포합니다 [5, 6]. 타겟을 직접 클릭하더라도 이동 중에 만나는 다른 적 병력을 공격할 수 있습니다 [5].
|
||||
* **이동 (Move, 단축키 'M')**: 적을 공격하기 위해 멈추지 않고 목표 위치로 직접 이동합니다 [5, 6]. 적의 시선을 끄는 미끼 전술(Baiting)이나 플랭킹, 빠른 재배치 등에 필수적으로 활용됩니다 [6].
|
||||
* **정지 (Stop, 단축키 'S')**: 선택된 유닛에 내려진 모든 명령을 취소하고 이동을 멈춥니다 [5, 6]. 적 방어탑 사거리 안으로 유닛이 너무 깊숙이 들어가는 것을 방지할 때 쓰입니다 [6].
|
||||
* **위치 사수 (Hold Position, 단축키 'D')**: 기존의 "제자리 대기(Stand Ground)" 태세를 대체하는 기능입니다 [5]. 유닛이 제자리에 머물며 사거리 내에 들어온 적만 공격하므로 병목 지점을 수비하거나 방어 진형을 유지하는 데 핵심적인 역할을 합니다 [5, 6].
|
||||
* **자유 사격 (Fire at Will, 단축키 'F')**: 기존의 "공격적(Aggressive)" 태세를 대체합니다 [5]. 넓은 반경 내의 적대적 대상을 적극적으로 추격하여 교전합니다 [5, 6].
|
||||
|
||||
**고급 전술 제어 기능**
|
||||
* **유닛 산개 (Spread Units, 단축키 'X')**: 전투 중 소대를 즉시 분산시켜 박격포나 중장갑 플랫폼으로부터 받는 광역(AoE) 및 스플래시 데미지의 영향을 최소화합니다 [1, 7].
|
||||
* **적 체력 확인 (Enemy Health, 단축키 'B')**: 전장에 있는 모든 적 유닛의 체력 상태를 표시해 주어 교전 시 소모전 상황(Attrition level)을 파악할 수 있는 중요한 정보(Intel)를 제공합니다 [1, 7].
|
||||
* **부대 지정 (단축키 'Shift + 숫자')**: 다중 전선 공격을 수행할 때 선택된 유닛들에 특정한 숫자를 부여하여 별도의 타격대(Strike teams)로 분할하여 관리할 수 있게 해줍니다 [1, 7].
|
||||
### 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.
|
||||
|
||||
**전술적 영향 및 AI 활용**
|
||||
* 이러한 시스템 업데이트는 적의 방어선을 무너뜨리기 위해 유닛을 유인해 내는 '미끼 전술(Baiting)'의 효율과 직결됩니다 [8]. '자유 사격(Fire at Will)'이 적용된 유닛은 꾀어내기가 매우 쉬운 반면, '위치 사수(Hold Position)' 중인 유닛에게는 이 전술이 통하지 않으므로 컨트롤에 따른 명확한 상성이 존재합니다 [8].
|
||||
### 매 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<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)
|
||||
```csharp
|
||||
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)
|
||||
```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>()) {
|
||||
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)
|
||||
- **Related Topics:** [[Defensive Stances|Defensive Stances]], [[Baiting Tactics|Baiting Tactics]], [[Command and Control (C2)|Command and Control (C2)]]
|
||||
- **Projects/Contexts:** [[War Commander AI and UI Enhancements|War Commander AI and UI Enhancements]]
|
||||
- **Contradictions/Notes:** 기존에 한 번 설정하면 계속 유지되던 '방어 태세(Stances)'와는 달리, '위치 사수(Hold Position)'나 '자유 사격(Fire at Will)' 등의 새로운 명령들은 플레이어가 유닛에게 새로운 이동 명령을 내리는 즉시 설정이 해제(Cancel)된다는 중요한 차이점이 있습니다 [5]. 따라서 기지 방어 시 유닛을 배치한 후 다시 명령을 활성화해야 합니다 [5].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-27*
|
||||
- 부모: [[Game-Design-RTS]] · [[Combat-AI]] · [[Unit-Control]]
|
||||
- 변형: [[StarCraft-Micro]] · [[MOBA-Last-Hit]] · [[Auto-Battler]]
|
||||
- 응용: [[AI-Exploitation-Game]] · [[Baiting-Tactics]] · [[Defensive-Design]]
|
||||
- 게임: [[War-Commander]] · [[Battle-Pirates]] · [[VEGA-Conflict]] · [[Kixeye]]
|
||||
- Adjacent: [[FSM-Game-AI]] · [[Behavior-Tree]] · [[Hotkey-Design]] · [[Player-Skill-Expression]]
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
- 매 RTS unit control system 의 design.
|
||||
- 매 combat AI 의 stance system.
|
||||
- 매 hotkey UX 의 design.
|
||||
- 매 player skill expression 의 enable.
|
||||
- 매 specific case study (War Commander).
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
- 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)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
- **정보 상태:** verified (concept-level).
|
||||
- **출처 신뢰도:** B (War Commander wiki, Kixeye patch notes 2014, RTS design literature).
|
||||
- **검토 이유:** Manual cleanup. 매 specific game 의 historical. 매 design pattern 가 universal.
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
|
||||
- **과거 데이터와의 충돌:** 없음
|
||||
- **정책 변화:** 없음
|
||||
- **기존 유사 문서:** [[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 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 | UPDATE | A |
|
||||
| 2026-05-09 | Manual cleanup — Unity code + RTS pattern + 매 modern 비교 + 안티패턴 추가 | UPDATE | B |
|
||||
|
||||
Reference in New Issue
Block a user