f8b21af4be
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>
202 lines
6.2 KiB
Markdown
202 lines
6.2 KiB
Markdown
---
|
|
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<TapInput>();
|
|
if (!tap.Triggered) return;
|
|
|
|
foreach (var (t, e) in SystemAPI.Query<RefRW<Tappable>>().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<string>();
|
|
completed = new Set<string>();
|
|
|
|
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 |
|