--- id: wiki-2026-0508-pocket-land title: Pocket Land category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Pocket Land game, mobile builder game] duplicate_of: none source_trust_level: B confidence_score: 0.7 verification_status: applied tags: [game, mobile, casual-builder, idle] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: csharp framework: unity --- # Pocket Land ## 매 한 줄 > **"매 손바닥 안 작은 land 를 키우는 casual builder loop"**. 매 mobile builder + idle + light combat 의 hybrid genre — 매 Travel Town / Township / Royal Match 계열의 변형. 매 craft → upgrade → expand → repeat 의 짧은 session. ## 매 핵심 ### 매 core loop 1. **Tap to gather**: 매 tree/rock/animal tap → 매 resource. 2. **Craft / merge**: 매 resource 의 building / item 으로 변환. 3. **Expand land**: 매 fog / locked region 의 unlock. 4. **Quest progression**: 매 NPC quest 의 next chapter 잠금 해제. 5. **Idle return**: 매 offline gen + 매 daily reward. ### 매 core mechanic 변형 - **Merge-2/3**: 매 동일 item 합쳐서 upgrade. - **Energy economy**: 매 tap = energy 소비, 매 regen 또는 IAP. - **Decoration / collection**: 매 cosmetic completionist drive. - **Light combat**: 매 monster hut clear → 매 reward. ### 매 monetization (genre standard) - 매 IAP: energy refill, gem packs, premium decoration, season pass. - 매 ads: rewarded video (energy/double reward), interstitial. - 매 LiveOps: time-limited event, offer wall. ### 매 retention 핵심 - **D1/D7/D30**: 매 30/15/5% 의 industry healthy. - **Daily quests + streak**: 매 D1 의 핵심 driver. - **Social** (clan/visit): 매 D30 stretch. ## 💻 패턴 ### Resource gather (Unity ECS-ish) ```csharp public struct Tappable : IComponentData { public int Hits; public ResourceType Drops; public int DropAmount; } public partial struct TapSystem : ISystem { public void OnUpdate(ref SystemState s) { var tap = SystemAPI.GetSingleton(); if (!tap.Triggered) return; foreach (var (t, e) in SystemAPI.Query>().WithEntityAccess()) { if (HitTest(tap.Position, e)) { t.ValueRW.Hits--; if (t.ValueRW.Hits <= 0) { Inventory.Add(t.ValueRO.Drops, t.ValueRO.DropAmount); s.EntityManager.DestroyEntity(e); } } } } } ``` ### Energy economy ```ts class Energy { max = 100; current = 100; lastTick = Date.now(); regenSecPerPoint = 60; refresh(now = Date.now()) { const delta = (now - this.lastTick) / 1000; const gained = Math.floor(delta / this.regenSecPerPoint); this.current = Math.min(this.max, this.current + gained); this.lastTick += gained * this.regenSecPerPoint * 1000; } spend(n: number): boolean { this.refresh(); if (this.current < n) return false; this.current -= n; return true; } } ``` ### Idle offline reward ```ts function calcOfflineReward(producers: Producer[], lastSeen: number) { const now = Date.now(); const elapsedSec = Math.min((now - lastSeen) / 1000, 8 * 3600); // 매 cap 8h return producers.map(p => ({ type: p.output, amount: Math.floor(p.ratePerSec * elapsedSec * 0.5), // 매 50% offline rate })); } ``` ### Land expansion (fog-of-war unlock) ```csharp public class LandRegion : MonoBehaviour { public int unlockCost; public ResourceType currency; public LandRegion[] reveals; public void Unlock() { if (!Inventory.Spend(currency, unlockCost)) return; Fog.Clear(this); foreach (var r in reveals) r.SetVisible(true); Quest.Notify(QuestEvent.RegionUnlocked, this); } } ``` ### Quest chain ```ts type Quest = { id: string; prerequisites: string[]; goal: { type: "gather"|"build"|"defeat"; target: string; amount: number }; reward: Reward; }; class QuestEngine { active = new Set(); completed = new Set(); onEvent(ev: GameEvent) { for (const id of this.active) { const q = quests[id]; if (matches(q.goal, ev)) advance(id); if (isDone(id)) { this.completed.add(id); this.active.delete(id); grant(q.reward); for (const next of quests) { if (next.prerequisites.every(p => this.completed.has(p))) this.active.add(next.id); } } } } } ``` ### Server-side anti-cheat (resource gain) ```ts // 매 client 가 보고한 gather event 를 server 가 rate-limit async function reportGather(uid: string, evt: GatherEvent) { const last = await redis.get(`gather:${uid}:last`); if (last && Date.now() - +last < 200) return reject("rate"); // 매 5/sec cap await redis.set(`gather:${uid}:last`, Date.now(), "EX", 60); await db.inventory.add(uid, evt.resource, evt.amount); } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | Casual mobile target | Energy + idle + merge | | Mid-core target | Land expansion + light combat + clan | | Core loop length | 매 1-3분 session / 10+ daily | | Monetization | Soft (cosmetic) + hard (energy) hybrid | | 진입 장벽 | First 10 min 의 매 즉각적 progress visualization | **기본값**: 매 tap-gather + craft-merge + land-expand + 짧은 quest chain + IAP energy. ## 🔗 Graph - Adjacent: [[LiveOps]] ## 🤖 LLM 활용 **언제**: 매 mobile casual game 디자인 / live-ops content 생성. 매 quest chain authoring. **언제 X**: 매 hardcore PvP, 매 narrative-heavy AAA — 매 장르 mismatch. ## ❌ 안티패턴 - **Long first session 강제**: 매 tutorial 30분 → 매 D1 churn. - **Pay wall too early**: 매 D2 안에 wall → 매 review bomb. - **Unbalanced energy**: 매 너무 짧으면 frustration, 매 너무 길면 매 monetization fail. - **No social**: 매 D30 retention 의 vector 부재. - **Client-trusted resource**: 매 modding/cheating 폭증. ## 🧪 검증 / 중복 - Verified (genre best practices: Deconstructor of Fun, GameRefinery 2025 mobile reports). Title-specific 매 verify limited (B-tier). - 신뢰도 B (genre 일반은 A, 매 specific game 은 B). ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — casual builder loop + monetization patterns |