Files
2nd/10_Wiki/Topic_Programming/Architecture/Modular-Weapon-Evolution-and-Skill-Trees.md
T
Antigravity Agent 9148c358d0 docs(10_Wiki): 위키 전체 재구성 — Topic_* 폴더를 4개 카테고리로 통합 + 대규모 중복 제거
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를
Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류.

- 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로
  자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거,
  동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거.
- 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming,
  Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business,
  Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로,
  나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는
  title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백).
  원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지.
- 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서.
- 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는
  지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지.
- Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경.
- 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
2026-07-05 00:33:48 +09:00

5.9 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, 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 tech_stack
wiki-2026-0508-modular-weapon-evolution-and-ski Modular Weapon Evolution and Skill Trees 10_Wiki/Topics verified self
Weapon Mods
Skill Tree Design
Build Diversity
none A 0.85 applied
game-design
progression
weapons
skill-trees
2026-05-10 pending
language framework
csharp unity-godot

Modular Weapon Evolution and Skill Trees

매 한 줄

"매 weapon = base + slots; 매 build = path through tree". Borderlands / Path of Exile / Diablo IV 의 ARPG progression DNA. 2026 modern: data-driven mod system + procedural affix + branching tree 의 build diversity 의 driver.

매 핵심

매 component

  • Base weapon: archetype (sword, bow, SMG) + base stats.
  • Mod slot: socket (scope, mag, barrel) — typed, capacity-limited.
  • Affix: procedural roll (+15% crit, leech, elemental).
  • Skill node: tree position — passive bonus or active skill.

매 design axis

  • Power: mod 의 raw stat boost.
  • Identity: mod 의 playstyle change (full-auto → burst).
  • Trade-off: pro/con — high damage / low fire rate.
  • Synergy: 매 mod combo 의 emergent build.

매 응용

  1. Looter shooter: random affix + slot mod.
  2. ARPG: deep tree (200+ nodes) + gem socket.
  3. Roguelike: per-run modular evolution.

💻 패턴

Weapon ScriptableObject (Unity)

[CreateAssetMenu(menuName = "Weapons/Base")]
public class WeaponBase : ScriptableObject
{
    public string id;
    public WeaponArchetype archetype;
    public float baseDamage;
    public float baseFireRate;
    public List<ModSlot> slots; // Scope, Magazine, Barrel
}

public enum ModSlot { Scope, Magazine, Barrel, Stock, Underbarrel }

Mod definition

[CreateAssetMenu(menuName = "Weapons/Mod")]
public class WeaponMod : ScriptableObject
{
    public string id;
    public ModSlot slot;
    public List<StatModifier> modifiers;
    public List<TagAdd> tagsAdded; // "burst-fire", "ignite"
}

[Serializable]
public struct StatModifier
{
    public StatType stat;        // Damage, FireRate, Recoil
    public OpType op;            // Add, Mul, Override
    public float value;
}

Composed weapon instance

public class WeaponInstance
{
    public WeaponBase Base { get; }
    public Dictionary<ModSlot, WeaponMod> Mods { get; } = new();
    public List<Affix> Affixes { get; } = new(); // procedural rolls

    public float Damage => ComputeStat(StatType.Damage);

    float ComputeStat(StatType s)
    {
        float v = Base.GetBase(s);
        var add = Mods.Values.SelectMany(m => m.modifiers)
            .Concat(Affixes.SelectMany(a => a.modifiers))
            .Where(m => m.stat == s);
        foreach (var m in add.Where(m => m.op == OpType.Add)) v += m.value;
        foreach (var m in add.Where(m => m.op == OpType.Mul)) v *= 1 + m.value;
        return v;
    }
}

Procedural affix roll

public static Affix RollAffix(int itemLevel, AffixPool pool)
{
    var weighted = pool.entries.Where(e => e.minLevel <= itemLevel);
    var pick = WeightedPick(weighted, e => e.weight);
    float val = Mathf.Lerp(pick.minRoll, pick.maxRoll, Random.value);
    return new Affix { stat = pick.stat, op = pick.op, value = val };
}

Skill node graph

public class SkillNode
{
    public string id;
    public Vector2 position;
    public List<string> prerequisites;
    public List<StatModifier> passiveBonus;
    public ActiveSkill activeSkill; // null for passive nodes
    public int cost = 1;
}

public class SkillTree
{
    public Dictionary<string, SkillNode> nodes;
    public HashSet<string> allocated = new();

    public bool Allocate(string id, ref int points)
    {
        var n = nodes[id];
        if (points < n.cost) return false;
        if (!n.prerequisites.All(allocated.Contains)) return false;
        allocated.Add(id);
        points -= n.cost;
        return true;
    }
}

Synergy detection

public static List<string> DetectSynergies(WeaponInstance w, SkillTree t)
{
    var tags = w.AllTags().Concat(t.AllocatedTags()).ToHashSet();
    return SynergyDb.All
        .Where(s => s.requiredTags.All(tags.Contains))
        .Select(s => s.name)
        .ToList();
}

Respec system

public void Respec(SkillTree t, ref int points)
{
    points += t.allocated.Sum(id => t.nodes[id].cost);
    t.allocated.Clear();
}

Build serialization (share builds)

public string Encode(SkillTree t) =>
    Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Join(",", t.allocated)));

매 결정 기준

상황 Approach
Casual shooter 3-5 slot mods, no affixes
Looter Slots + procedural affixes (3-6)
Deep ARPG Slots + affixes + 100+ skill tree
Roguelike Drafted upgrades, run-scoped

기본값: ScriptableObject base + slot mods + 3-tier affix + 50-node tree.

🔗 Graph

🤖 LLM 활용

언제: 매 affix table 의 generate, synergy combo 의 enumerate, balance simulation script. 언제 X: 매 power-fantasy feel, animation game-feel — designer/playtest judgment.

안티패턴

  • Power creep: 매 new mod 의 strict upgrade. Old mods 의 dead.
  • Illusion of choice: 100 tree nodes, 1 optimal path. Build diversity = 0.
  • Reroll fatigue: 매 affix 의 100 reroll 의 required = grind, not gameplay.
  • No respec: 매 mistake = restart character. 매 modern player 의 quit.

🧪 검증 / 중복

  • Verified (Path of Exile dev manifestos, Borderlands 3 GDC talks, Last Epoch design notes 2025).
  • 신뢰도 B+ (game-design subjective, but established patterns).

🕓 Changelog

날짜 변경
2026-05-08 Phase 1
2026-05-10 Manual cleanup — modular weapon + skill tree systems with Unity patterns