Loading...
Loading...
Compare original and translation side by side
market-analyst/docs/market-analysis-*.mdmarket-analysis-fps-games-2025-10-26.md/docs/*-game-concepts-*.md/docs/plans/*-design.mdfps-game-concepts-market-driven-2025-10-26.mdmarket-analyst/docs/market-analysis-*.mdmarket-analysis-fps-games-2025-10-26.md/docs/*-game-concepts-*.md/docs/plans/*-design.mdfps-game-concepts-market-driven-2025-10-26.mdWTP_Signals = {
price_sentiment: {
"$0 (F2P)": {positive: X%, negative: Y%, mentions: N},
"$10-20": {positive: X%, negative: Y%, mentions: N},
"$20-30": {positive: X%, negative: Y%, mentions: N},
"$60-70": {positive: X%, negative: Y%, mentions: N},
"$70 + MTX": {positive: X%, negative: Y%, mentions: N}
},
monetization_pain_points: [
{issue: "Premium + battle pass", severity: "CRITICAL", mentions: N},
{issue: "Loot boxes", severity: "HIGH", mentions: N}
],
value_propositions: [
{model: "F2P cosmetic-only", sentiment: X%, examples: []},
{model: "Budget indie ($15-25)", sentiment: X%, examples: []}
]
}GameConcept = {
name: string,
price_point: number | "F2P",
monetization_model: string,
target_audience: {
primary_persona: {},
market_size_estimate: number,
spending_behavior: string
},
competitors: [{name, price, model, performance}],
distribution_channels: [{platform, percentage, rationale}],
lifecycle_commitment: string,
development_cost_estimate: number
}WTP_Signals = {
price_sentiment: {
"$0 (F2P)": {positive: X%, negative: Y%, mentions: N},
"$10-20": {positive: X%, negative: Y%, mentions: N},
"$20-30": {positive: X%, negative: Y%, mentions: N},
"$60-70": {positive: X%, negative: Y%, mentions: N},
"$70 + MTX": {positive: X%, negative: Y%, mentions: N}
},
monetization_pain_points: [
{issue: "Premium + battle pass", severity: "CRITICAL", mentions: N},
{issue: "Loot boxes", severity: "HIGH", mentions: N}
],
value_propositions: [
{model: "F2P cosmetic-only", sentiment: X%, examples: []},
{model: "Budget indie ($15-25)", sentiment: X%, examples: []}
]
}GameConcept = {
name: string,
price_point: number | "F2P",
monetization_model: string,
target_audience: {
primary_persona: {},
market_size_estimate: number,
spending_behavior: string
},
competitors: [{name, price, model, performance}],
distribution_channels: [{platform, percentage, rationale}],
lifecycle_commitment: string,
development_cost_estimate: number
}function calculateWTP(concept, marketData) {
const score = {
price_sentiment_alignment: 0, // Does price match positive sentiment tier?
value_perception: 0, // Content/$ ratio vs. market expectations
monetization_model_fit: 0, // Model aligns with audience preferences?
competitive_positioning: 0, // Price competitive advantage?
pain_point_avoidance: 0 // Avoids monetization red flags?
};
// Price Sentiment Alignment (0-30 points)
const priceТier = getPriceTier(concept.price_point);
const sentiment = marketData.price_sentiment[priceTier];
score.price_sentiment_alignment = (sentiment.positive / 100) * 30;
// Value Perception (0-25 points)
const contentHours = estimateContentHours(concept);
const pricePerHour = concept.price_point / contentHours;
const marketAvgPricePerHour = calculateMarketAverage();
if (pricePerHour < marketAvgPricePerHour * 0.8) {
score.value_perception = 25; // Excellent value
} else if (pricePerHour < marketAvgPricePerHour) {
score.value_perception = 18; // Good value
} else if (pricePerHour < marketAvgPricePerHour * 1.2) {
score.value_perception = 10; // Fair value
} else {
score.value_perception = 0; // Poor value
}
// Monetization Model Fit (0-20 points)
const modelSentiment = marketData.value_propositions.find(
vp => vp.model === concept.monetization_model
);
score.monetization_model_fit = (modelSentiment.sentiment / 100) * 20;
// Competitive Positioning (0-15 points)
const competitorPrices = concept.competitors.map(c => c.price);
const avgCompetitorPrice = average(competitorPrices);
if (concept.price_point < avgCompetitorPrice * 0.7) {
score.competitive_positioning = 15; // Undercut leaders
} else if (concept.price_point < avgCompetitorPrice) {
score.competitive_positioning = 10; // Competitive pricing
} else {
score.competitive_positioning = 5; // Premium positioning
}
// Pain Point Avoidance (0-10 points)
const painPoints = marketData.monetization_pain_points;
let violations = 0;
painPoints.forEach(pp => {
if (conceptViolatesPainPoint(concept, pp)) {
violations += (pp.severity === "CRITICAL") ? 5 : 2;
}
});
score.pain_point_avoidance = Math.max(0, 10 - violations);
return {
total: Object.values(score).reduce((a, b) => a + b, 0),
breakdown: score,
confidence: calculateConfidence(marketData.sample_size)
};
}function calculateWTP(concept, marketData) {
const score = {
price_sentiment_alignment: 0, // 定价是否匹配正向舆情区间?
value_perception: 0, // 内容性价比是否符合市场预期?
monetization_model_fit: 0, // 模型是否契合用户偏好?
competitive_positioning: 0, // 定价是否具备竞争优势?
pain_point_avoidance: 0 // 是否避开变现雷区?
};
// 定价舆情匹配度(0-30分)
const priceТier = getPriceTier(concept.price_point);
const sentiment = marketData.price_sentiment[priceTier];
score.price_sentiment_alignment = (sentiment.positive / 100) * 30;
// 价值感知(0-25分)
const contentHours = estimateContentHours(concept);
const pricePerHour = concept.price_point / contentHours;
const marketAvgPricePerHour = calculateMarketAverage();
if (pricePerHour < marketAvgPricePerHour * 0.8) {
score.value_perception = 25; // 极高性价比
} else if (pricePerHour < marketAvgPricePerHour) {
score.value_perception = 18; // 高性价比
} else if (pricePerHour < marketAvgPricePerHour * 1.2) {
score.value_perception = 10; // 中等性价比
} else {
score.value_perception = 0; // 低性价比
}
// 变现模型契合度(0-20分)
const modelSentiment = marketData.value_propositions.find(
vp => vp.model === concept.monetization_model
);
score.monetization_model_fit = (modelSentiment.sentiment / 100) * 20;
// 竞争定价定位(0-15分)
const competitorPrices = concept.competitors.map(c => c.price);
const avgCompetitorPrice = average(competitorPrices);
if (concept.price_point < avgCompetitorPrice * 0.7) {
score.competitive_positioning = 15; // 大幅低于竞品定价
} else if (concept.price_point < avgCompetitorPrice) {
score.competitive_positioning = 10; // 具备竞争力的定价
} else {
score.competitive_positioning = 5; // 高端定价定位
}
// 雷区规避(0-10分)
const painPoints = marketData.monetization_pain_points;
let violations = 0;
painPoints.forEach(pp => {
if (conceptViolatesPainPoint(concept, pp)) {
violations += (pp.severity === "CRITICAL") ? 5 : 2;
}
});
score.pain_point_avoidance = Math.max(0, 10 - violations);
return {
total: Object.values(score).reduce((a, b) => a + b, 0),
breakdown: score,
confidence: calculateConfidence(marketData.sample_size)
};
}function calculateViralPotential(concept, marketData) {
const score = {
shareability: 0, // Content naturally creates shareable moments?
accessibility: 0, // Low barrier to entry?
network_effects: 0, // Benefits from friend invites?
streamer_appeal: 0, // Twitch/YouTube friendly?
novelty_factor: 0, // Unique enough to generate buzz?
social_features: 0 // Built for social play/sharing?
};
// Shareability (0-20 points)
const shareableGenres = ["party game", "asymmetric", "sports hybrid", "roguelike"];
if (shareableGenres.some(g => concept.genre.includes(g))) {
score.shareability = 20;
} else if (concept.genre.includes("competitive") || concept.genre.includes("co-op")) {
score.shareability = 12;
} else {
score.shareability = 5; // Single-player, narrative
}
// Accessibility (0-20 points)
if (concept.price_point === "F2P") {
score.accessibility = 20; // Zero barrier
} else if (concept.price_point <= 15) {
score.accessibility = 15; // Impulse purchase
} else if (concept.price_point <= 25) {
score.accessibility = 10; // Reasonable
} else {
score.accessibility = 5; // Higher barrier
}
// Network Effects (0-20 points)
if (concept.monetization_model.includes("F2P") || concept.monetization_model.includes("viral")) {
score.network_effects = 20;
} else if (concept.description.includes("co-op") || concept.description.includes("multiplayer")) {
score.network_effects = 12;
} else {
score.network_effects = 0;
}
// Streamer Appeal (0-15 points)
const streamerFriendly = [
concept.genre.includes("asymmetric"),
concept.genre.includes("roguelike"),
concept.genre.includes("party"),
concept.description.includes("viral moments"),
concept.description.includes("spectator")
];
score.streamer_appeal = streamerFriendly.filter(Boolean).length * 3;
// Novelty Factor (0-15 points)
const noveltyIndicators = marketData.novelty_successes || [];
if (noveltyIndicators.some(n => concept.description.includes(n.innovation))) {
score.novelty_factor = 15;
} else if (concept.description.includes("unique") || concept.description.includes("first")) {
score.novelty_factor = 10;
} else {
score.novelty_factor = 5;
}
// Social Features (0-10 points)
const socialKeywords = ["co-op", "multiplayer", "friend", "clan", "team", "squad"];
const socialCount = socialKeywords.filter(kw =>
concept.description.toLowerCase().includes(kw)
).length;
score.social_features = Math.min(10, socialCount * 2);
return {
total: Object.values(score).reduce((a, b) => a + b, 0),
breakdown: score,
viral_coefficient: estimateViralCoefficient(score.total)
};
}
function estimateViralCoefficient(viralScore) {
// Viral coefficient: How many new users does each user bring?
// K > 1 = exponential growth, K < 1 = paid acquisition needed
if (viralScore >= 85) return 1.5; // Exceptional viral growth
if (viralScore >= 70) return 1.2; // Strong organic growth
if (viralScore >= 55) return 0.8; // Some viral mechanics
if (viralScore >= 40) return 0.4; // Minimal viral spread
return 0.2; // Requires paid marketing
}function calculateViralPotential(concept, marketData) {
const score = {
shareability: 0, // 游戏内容是否天然具备传播点?
accessibility: 0, // 入门门槛是否较低?
network_effects: 0, // 是否具备好友邀请激励机制?
streamer_appeal: 0, // 是否适合Twitch/YouTube直播?
novelty_factor: 0, // 是否具备足够独特性以引发讨论?
social_features: 0 // 是否内置社交玩法/分享功能?
};
// 传播性(0-20分)
const shareableGenres = ["party game", "asymmetric", "sports hybrid", "roguelike"];
if (shareableGenres.some(g => concept.genre.includes(g))) {
score.shareability = 20;
} else if (concept.genre.includes("competitive") || concept.genre.includes("co-op")) {
score.shareability = 12;
} else {
score.shareability = 5; // 单人叙事类游戏
}
// 易获取性(0-20分)
if (concept.price_point === "F2P") {
score.accessibility = 20; // 零门槛
} else if (concept.price_point <= 15) {
score.accessibility = 15; // 冲动消费区间
} else if (concept.price_point <= 25) {
score.accessibility = 10; // 合理定价区间
} else {
score.accessibility = 5; // 较高门槛
}
// 网络效应(0-20分)
if (concept.monetization_model.includes("F2P") || concept.monetization_model.includes("viral")) {
score.network_effects = 20;
} else if (concept.description.includes("co-op") || concept.description.includes("multiplayer")) {
score.network_effects = 12;
} else {
score.network_effects = 0;
}
// 主播吸引力(0-15分)
const streamerFriendly = [
concept.genre.includes("asymmetric"),
concept.genre.includes("roguelike"),
concept.genre.includes("party"),
concept.description.includes("viral moments"),
concept.description.includes("spectator")
];
score.streamer_appeal = streamerFriendly.filter(Boolean).length * 3;
// 新颖度(0-15分)
const noveltyIndicators = marketData.novelty_successes || [];
if (noveltyIndicators.some(n => concept.description.includes(n.innovation))) {
score.novelty_factor = 15;
} else if (concept.description.includes("unique") || concept.description.includes("first")) {
score.novelty_factor = 10;
} else {
score.novelty_factor = 5;
}
// 社交功能(0-10分)
const socialKeywords = ["co-op", "multiplayer", "friend", "clan", "team", "squad"];
const socialCount = socialKeywords.filter(kw =>
concept.description.toLowerCase().includes(kw)
).length;
score.social_features = Math.min(10, socialCount * 2);
return {
total: Object.values(score).reduce((a, b) => a + b, 0),
breakdown: score,
viral_coefficient: estimateViralCoefficient(score.total)
};
}
function estimateViralCoefficient(viralScore) {
// 病毒传播系数:每个用户能带来多少新用户?
// K > 1 = 指数级增长,K < 1 = 需要付费获客
if (viralScore >= 85) return 1.5; // 极强病毒传播潜力
if (viralScore >= 70) return 1.2; // 强劲自然增长
if (viralScore >= 55) return 0.8; // 具备一定病毒传播机制
if (viralScore >= 40) return 0.4; // 病毒传播能力较弱
return 0.2; // 完全依赖付费营销
}function projectRevenue(concept, wtpScore, viralScore, marketData) {
const model = concept.monetization_model;
// Addressable Market Size
const TAM = estimateTotalAddressableMarket(concept, marketData);
const SAM = TAM * 0.15; // Serviceable addressable (15% of TAM realistic)
const SOM = SAM * getMarketShareEstimate(viralScore, concept.competitors.length);
// Player Acquisition Model
const year1Players = calculateYear1Players(concept, viralScore, SOM);
const year2Players = year1Players * getRetentionMultiplier(concept.lifecycle_commitment);
const year3Players = year2Players * getGrowthMultiplier(viralScore);
// Revenue Calculations
if (model.includes("F2P")) {
return projectF2PRevenue(year1Players, year2Players, year3Players, concept);
} else if (model.includes("premium") || typeof concept.price_point === "number") {
return projectPremiumRevenue(year1Players, year2Players, year3Players, concept);
} else {
return projectHybridRevenue(year1Players, year2Players, year3Players, concept);
}
}
function projectF2PRevenue(y1Players, y2Players, y3Players, concept) {
// F2P Model: Base * Conversion Rate * ARPPU
const conversionRate = 0.03; // Industry avg: 3-5% pay
const ARPPU = estimateARPPU(concept); // Average revenue per paying user
const y1Revenue = y1Players * conversionRate * ARPPU;
const y2Revenue = y2Players * (conversionRate * 1.1) * (ARPPU * 1.15); // Improve over time
const y3Revenue = y3Players * (conversionRate * 1.15) * (ARPPU * 1.25);
return {
year1: {players: y1Players, revenue: y1Revenue, ARPU: y1Revenue / y1Players},
year2: {players: y2Players, revenue: y2Revenue, ARPU: y2Revenue / y2Players},
year3: {players: y3Players, revenue: y3Revenue, ARPU: y3Revenue / y3Players},
total_3yr: y1Revenue + y2Revenue + y3Revenue,
LTV: (y1Revenue + y2Revenue + y3Revenue) / y1Players
};
}
function projectPremiumRevenue(y1Players, y2Players, y3Players, concept) {
// Premium Model: Units Sold * Price + Optional DLC
const basePrice = concept.price_point;
const dlcAttachRate = 0.25; // 25% buy DLC
const avgDLCSpend = basePrice * 0.6; // DLC ~60% of base price
const y1Revenue = (y1Players * basePrice) + (y1Players * dlcAttachRate * avgDLCSpend * 0.5);
const y2Revenue = (y2Players * 0.3 * basePrice) + (y2Players * 0.3 * dlcAttachRate * avgDLCSpend);
const y3Revenue = (y3Players * 0.1 * basePrice) + (y3Players * 0.1 * dlcAttachRate * avgDLCSpend);
return {
year1: {players: y1Players, revenue: y1Revenue, ARPU: basePrice},
year2: {players: y2Players * 0.3, revenue: y2Revenue, ARPU: basePrice},
year3: {players: y3Players * 0.1, revenue: y3Revenue, ARPU: basePrice},
total_3yr: y1Revenue + y2Revenue + y3Revenue,
LTV: basePrice + (dlcAttachRate * avgDLCSpend)
};
}
function estimateARPPU(concept) {
// Average Revenue Per Paying User (F2P)
if (concept.genre.includes("competitive")) return 45; // Esports skin buyers spend more
if (concept.genre.includes("party")) return 20; // Casual spenders
if (concept.genre.includes("co-op")) return 30; // Mid-tier
return 25; // Default
}
function estimateTotalAddressableMarket(concept, marketData) {
// Use market analysis data + platform data
const steamActivePlayers = 120000000; // ~120M monthly active on Steam
const genreMultiplier = getGenreMarketShare(concept.genre);
return steamActivePlayers * genreMultiplier;
}
function getMarketShareEstimate(viralScore, competitorCount) {
// Viral potential + competitive landscape determines realistic share
let baseShare = 0.01; // 1% of SAM baseline
if (viralScore >= 85) baseShare *= 3; // Viral hit
else if (viralScore >= 70) baseShare *= 2; // Strong growth
else if (viralScore >= 55) baseShare *= 1.5;
// Competitive penalty
if (competitorCount > 5) baseShare *= 0.7;
else if (competitorCount > 3) baseShare *= 0.85;
return baseShare;
}function calculateROI(concept, revenueProjection) {
const devCost = concept.development_cost_estimate || estimateDevCost(concept);
const marketingCost = estimateMarketingCost(concept, revenueProjection.year1.players);
const totalInvestment = devCost + marketingCost;
const grossRevenue = revenueProjection.total_3yr;
const platformFees = grossRevenue * 0.30; // Steam/console take 30%
const netRevenue = grossRevenue - platformFees;
const netProfit = netRevenue - totalInvestment;
return {
investment: totalInvestment,
gross_revenue: grossRevenue,
net_revenue: netRevenue,
net_profit: netProfit,
ROI_percentage: (netProfit / totalInvestment) * 100,
payback_period_months: calculatePaybackPeriod(totalInvestment, revenueProjection),
break_even_units: totalInvestment / (concept.price_point || 25)
};
}
function estimateDevCost(concept) {
// Based on scope, team size, timeline
if (concept.description.includes("solo") || concept.description.includes("small team")) {
return 150000; // $150K
} else if (concept.description.includes("128-player") || concept.description.includes("large-scale")) {
return 8000000; // $8M
} else {
return 1200000; // $1.2M (AA indie default)
}
}
function estimateMarketingCost(concept, year1Players) {
// Cost per acquisition based on viral coefficient
const viralCoef = concept.viral_coefficient || 0.5;
if (viralCoef >= 1.2) {
// Viral growth, minimal paid marketing
return year1Players * 0.50; // $0.50 CPA (mostly organic)
} else if (viralCoef >= 0.8) {
return year1Players * 2; // $2 CPA
} else {
return year1Players * 5; // $5 CPA (heavy paid)
}
}function projectRevenue(concept, wtpScore, viralScore, marketData) {
const model = concept.monetization_model;
// 目标市场规模
const TAM = estimateTotalAddressableMarket(concept, marketData);
const SAM = TAM * 0.15; // 可触达市场(TAM的15%为合理值)
const SOM = SAM * getMarketShareEstimate(viralScore, concept.competitors.length);
// 用户获客模型
const year1Players = calculateYear1Players(concept, viralScore, SOM);
const year2Players = year1Players * getRetentionMultiplier(concept.lifecycle_commitment);
const year3Players = year2Players * getGrowthMultiplier(viralScore);
// 收入计算
if (model.includes("F2P")) {
return projectF2PRevenue(year1Players, year2Players, year3Players, concept);
} else if (model.includes("premium") || typeof concept.price_point === "number") {
return projectPremiumRevenue(year1Players, year2Players, year3Players, concept);
} else {
return projectHybridRevenue(year1Players, year2Players, year3Players, concept);
}
}
function projectF2PRevenue(y1Players, y2Players, y3Players, concept) {
// F2P模型:用户基数 * 付费转化率 * 付费用户平均收入(ARPPU)
const conversionRate = 0.03; // 行业平均:3-5%的付费率
const ARPPU = estimateARPPU(concept); // 付费用户平均收入
const y1Revenue = y1Players * conversionRate * ARPPU;
const y2Revenue = y2Players * (conversionRate * 1.1) * (ARPPU * 1.15); // 逐年优化
const y3Revenue = y3Players * (conversionRate * 1.15) * (ARPPU * 1.25);
return {
year1: {players: y1Players, revenue: y1Revenue, ARPU: y1Revenue / y1Players},
year2: {players: y2Players, revenue: y2Revenue, ARPU: y2Revenue / y2Players},
year3: {players: y3Players, revenue: y3Revenue, ARPU: y3Revenue / y3Players},
total_3yr: y1Revenue + y2Revenue + y3Revenue,
LTV: (y1Revenue + y2Revenue + y3Revenue) / y1Players
};
}
function projectPremiumRevenue(y1Players, y2Players, y3Players, concept) {
// 付费买断模型:销量 * 定价 + 可选DLC收入
const basePrice = concept.price_point;
const dlcAttachRate = 0.25; // 25%的用户会购买DLC
const avgDLCSpend = basePrice * 0.6; // DLC定价约为基础游戏的60%
const y1Revenue = (y1Players * basePrice) + (y1Players * dlcAttachRate * avgDLCSpend * 0.5);
const y2Revenue = (y2Players * 0.3 * basePrice) + (y2Players * 0.3 * dlcAttachRate * avgDLCSpend);
const y3Revenue = (y3Players * 0.1 * basePrice) + (y3Players * 0.1 * dlcAttachRate * avgDLCSpend);
return {
year1: {players: y1Players, revenue: y1Revenue, ARPU: basePrice},
year2: {players: y2Players * 0.3, revenue: y2Revenue, ARPU: basePrice},
year3: {players: y3Players * 0.1, revenue: y3Revenue, ARPU: basePrice},
total_3yr: y1Revenue + y2Revenue + y3Revenue,
LTV: basePrice + (dlcAttachRate * avgDLCSpend)
};
}
function estimateARPPU(concept) {
// 付费用户平均收入(F2P模式)
if (concept.genre.includes("competitive")) return 45; // 电竞类用户在皮肤等道具上花费更高
if (concept.genre.includes("party")) return 20; // 休闲类用户花费较低
if (concept.genre.includes("co-op")) return 30; // 中等花费区间
return 25; // 默认值
}
function estimateTotalAddressableMarket(concept, marketData) {
// 结合市场分析数据与平台数据
const steamActivePlayers = 120000000; // Steam月活跃用户约1.2亿
const genreMultiplier = getGenreMarketShare(concept.genre);
return steamActivePlayers * genreMultiplier;
}
function getMarketShareEstimate(viralScore, competitorCount) {
// 病毒传播潜力与竞争格局决定合理市场份额
let baseShare = 0.01; // 基准为SAM的1%
if (viralScore >= 85) baseShare *= 3; // 爆款潜力
else if (viralScore >= 70) baseShare *= 2; // 强劲增长
else if (viralScore >= 55) baseShare *= 1.5;
// 竞争惩罚系数
if (competitorCount > 5) baseShare *= 0.7;
else if (competitorCount > 3) baseShare *= 0.85;
return baseShare;
}function calculateROI(concept, revenueProjection) {
const devCost = concept.development_cost_estimate || estimateDevCost(concept);
const marketingCost = estimateMarketingCost(concept, revenueProjection.year1.players);
const totalInvestment = devCost + marketingCost;
const grossRevenue = revenueProjection.total_3yr;
const platformFees = grossRevenue * 0.30; // Steam/主机平台抽成30%
const netRevenue = grossRevenue - platformFees;
const netProfit = netRevenue - totalInvestment;
return {
investment: totalInvestment,
gross_revenue: grossRevenue,
net_revenue: netRevenue,
net_profit: netProfit,
ROI_percentage: (netProfit / totalInvestment) * 100,
payback_period_months: calculatePaybackPeriod(totalInvestment, revenueProjection),
break_even_units: totalInvestment / (concept.price_point || 25)
};
}
function estimateDevCost(concept) {
// 根据项目规模、团队人数、开发周期估算
if (concept.description.includes("solo") || concept.description.includes("small team")) {
return 150000; // 15万美元
} else if (concept.description.includes("128-player") || concept.description.includes("large-scale")) {
return 8000000; // 800万美元
} else {
return 1200000; // 120万美元(AA级独立游戏默认值)
}
}
function estimateMarketingCost(concept, year1Players) {
// 根据病毒传播系数估算用户获取成本(CPA)
const viralCoef = concept.viral_coefficient || 0.5;
if (viralCoef >= 1.2) {
// 病毒式增长,付费营销投入极少
return year1Players * 0.50; // CPA为0.5美元(主要依赖自然增长)
} else if (viralCoef >= 0.8) {
return year1Players * 2; // CPA为2美元
} else {
return year1Players * 5; // CPA为5美元(依赖大量付费营销)
}
}function analyzeMonetizationModel(concept, wtpScore, viralScore, marketData) {
const currentModel = concept.monetization_model;
const alternativeModels = [];
// Test F2P vs. Premium
if (currentModel.includes("premium") && viralScore >= 70) {
alternativeModels.push({
model: "F2P with cosmetic monetization",
rationale: `High viral score (${viralScore}) suggests F2P could 5-10x player base`,
projected_revenue_delta: "+40-80%",
risk: "ARPPU uncertainty, requires cosmetic art pipeline"
});
}
// Test pricing tiers
if (typeof concept.price_point === "number") {
const sentiment = marketData.price_sentiment;
const currentTier = getPriceTier(concept.price_point);
Object.keys(sentiment).forEach(tier => {
if (tier !== currentTier && sentiment[tier].positive > sentiment[currentTier].positive + 10) {
alternativeModels.push({
model: `Price adjustment to ${tier}`,
rationale: `${tier} has ${sentiment[tier].positive}% positive vs. current ${sentiment[currentTier].positive}%`,
projected_revenue_delta: estimatePriceChangeDelta(concept, tier),
risk: "Value perception vs. content ratio"
});
}
});
}
// Test monetization add-ons
if (!currentModel.includes("DLC") && concept.lifecycle_commitment.includes("2-3 year")) {
alternativeModels.push({
model: "Add expansion DLC model",
rationale: "Long lifecycle supports premium content drops",
projected_revenue_delta: "+15-25%",
risk: "Community expectations for free updates"
});
}
return {
current_model: currentModel,
current_model_score: scoreMonetizationModel(currentModel, wtpScore, viralScore),
alternatives: alternativeModels.sort((a, b) =>
parseFloat(b.projected_revenue_delta) - parseFloat(a.projected_revenue_delta)
)
};
}function analyzeMonetizationModel(concept, wtpScore, viralScore, marketData) {
const currentModel = concept.monetization_model;
const alternativeModels = [];
// 测试F2P与付费买断模式
if (currentModel.includes("premium") && viralScore >= 70) {
alternativeModels.push({
model: "F2P with cosmetic monetization",
rationale: `高病毒传播得分(${viralScore})表明F2P模式可使用户基数增长5-10倍`,
projected_revenue_delta: "+40-80%",
risk: "ARPPU存在不确定性,需搭建外观道具制作流水线"
});
}
// 测试定价区间
if (typeof concept.price_point === "number") {
const sentiment = marketData.price_sentiment;
const currentTier = getPriceTier(concept.price_point);
Object.keys(sentiment).forEach(tier => {
if (tier !== currentTier && sentiment[tier].positive > sentiment[currentTier].positive + 10) {
alternativeModels.push({
model: `Price adjustment to ${tier}`,
rationale: `${tier}区间的正向舆情为${sentiment[tier].positive}%,高于当前区间的${sentiment[currentTier].positive}%`,
projected_revenue_delta: estimatePriceChangeDelta(concept, tier),
risk: "需平衡内容性价比与用户感知"
});
}
});
}
// 测试附加变现模块
if (!currentModel.includes("DLC") && concept.lifecycle_commitment.includes("2-3 year")) {
alternativeModels.push({
model: "Add expansion DLC model",
rationale: "长期运营周期支持推出付费扩展内容",
projected_revenue_delta: "+15-25%",
risk: "用户可能期望免费更新"
});
}
return {
current_model: currentModel,
current_model_score: scoreMonetizationModel(currentModel, wtpScore, viralScore),
alternatives: alternativeModels.sort((a, b) =>
parseFloat(b.projected_revenue_delta) - parseFloat(a.projected_revenue_delta)
)
};
}function calculateMonetizationScore(concept, wtpScore, viralScore, revenueProjection, roi) {
const score = {
willingness_to_pay: wtpScore.total * 0.25, // 25% weight
viral_potential: viralScore.total * 0.20, // 20% weight
revenue_potential: normalizeRevenue(revenueProjection.total_3yr) * 0.30, // 30% weight
roi_efficiency: normalizeROI(roi.ROI_percentage) * 0.15, // 15% weight
time_to_profit: normalizePaybackPeriod(roi.payback_period_months) * 0.10 // 10% weight
};
return {
total: Object.values(score).reduce((a, b) => a + b, 0),
breakdown: score,
tier: getMonetizationTier(Object.values(score).reduce((a, b) => a + b, 0))
};
}
function normalizeRevenue(revenue) {
// Normalize to 0-100 scale (assuming $50M = 100)
return Math.min(100, (revenue / 50000000) * 100);
}
function normalizeROI(roiPercentage) {
// Normalize to 0-100 scale (500% ROI = 100)
return Math.min(100, (roiPercentage / 500) * 100);
}
function normalizePaybackPeriod(months) {
// Shorter = better (6 months = 100, 36 months = 0)
return Math.max(0, 100 - ((months - 6) / 30) * 100);
}
function getMonetizationTier(score) {
if (score >= 90) return "S-TIER: Blockbuster potential";
if (score >= 80) return "A-TIER: Strong monetization";
if (score >= 70) return "B-TIER: Solid revenue opportunity";
if (score >= 60) return "C-TIER: Moderate monetization";
return "D-TIER: Weak monetization";
}function rankConcepts(concepts, scores) {
const ranked = concepts.map((concept, i) => ({
concept: concept,
scores: scores[i],
monetization_score: scores[i].total,
recommendation: generateRecommendation(concept, scores[i])
})).sort((a, b) => b.monetization_score - a.monetization_score);
return {
top3: ranked.slice(0, 3),
all_ranked: ranked,
summary: generateRankingSummary(ranked)
};
}
function generateRecommendation(concept, scores) {
const strengths = [];
const weaknesses = [];
const actions = [];
// Analyze strengths
if (scores.breakdown.willingness_to_pay >= 20) strengths.push("Strong price/value fit");
if (scores.breakdown.viral_potential >= 16) strengths.push("High organic growth potential");
if (scores.breakdown.revenue_potential >= 24) strengths.push("Large revenue opportunity");
// Analyze weaknesses
if (scores.breakdown.willingness_to_pay < 15) weaknesses.push("Price optimization needed");
if (scores.breakdown.viral_potential < 12) weaknesses.push("Lacks viral mechanics");
if (scores.breakdown.roi_efficiency < 10) weaknesses.push("Long payback period");
// Generate actions
if (weaknesses.includes("Price optimization needed")) {
actions.push("Test alternative price points ($X-Y range)");
}
if (weaknesses.includes("Lacks viral mechanics")) {
actions.push("Add social features (friend invites, sharing, spectator mode)");
}
if (scores.breakdown.revenue_potential < 20) {
actions.push("Expand addressable market (additional platforms, regions)");
}
return {strengths, weaknesses, priority_actions: actions};
}function calculateMonetizationScore(concept, wtpScore, viralScore, revenueProjection, roi) {
const score = {
willingness_to_pay: wtpScore.total * 0.25, // 权重25%
viral_potential: viralScore.total * 0.20, // 权重20%
revenue_potential: normalizeRevenue(revenueProjection.total_3yr) * 0.30, // 权重30%
roi_efficiency: normalizeROI(roi.ROI_percentage) * 0.15, // 权重15%
time_to_profit: normalizePaybackPeriod(roi.payback_period_months) * 0.10 // 权重10%
};
return {
total: Object.values(score).reduce((a, b) => a + b, 0),
breakdown: score,
tier: getMonetizationTier(Object.values(score).reduce((a, b) => a + b, 0))
};
}
function normalizeRevenue(revenue) {
// 归一化到0-100区间(假设5000万美元对应100分)
return Math.min(100, (revenue / 50000000) * 100);
}
function normalizeROI(roiPercentage) {
// 归一化到0-100区间(500% ROI对应100分)
return Math.min(100, (roiPercentage / 500) * 100);
}
function normalizePaybackPeriod(months) {
// 回收期越短得分越高(6个月对应100分,36个月对应0分)
return Math.max(0, 100 - ((months - 6) / 30) * 100);
}
function getMonetizationTier(score) {
if (score >= 90) return "S-TIER: 爆款潜力";
if (score >= 80) return "A-TIER: 变现能力强劲";
if (score >= 70) return "B-TIER: 稳定收入机会";
if (score >= 60) return "C-TIER: 变现能力中等";
return "D-TIER: 变现能力较弱";
}function rankConcepts(concepts, scores) {
const ranked = concepts.map((concept, i) => ({
concept: concept,
scores: scores[i],
monetization_score: scores[i].total,
recommendation: generateRecommendation(concept, scores[i])
})).sort((a, b) => b.monetization_score - a.monetization_score);
return {
top3: ranked.slice(0, 3),
all_ranked: ranked,
summary: generateRankingSummary(ranked)
};
}
function generateRecommendation(concept, scores) {
const strengths = [];
const weaknesses = [];
const actions = [];
// 分析优势
if (scores.breakdown.willingness_to_pay >= 20) strengths.push("定价与价值匹配度高");
if (scores.breakdown.viral_potential >= 16) strengths.push("自然增长潜力强");
if (scores.breakdown.revenue_potential >= 24) strengths.push("收入规模空间大");
// 分析劣势
if (scores.breakdown.willingness_to_pay < 15) weaknesses.push("需优化定价策略");
if (scores.breakdown.viral_potential < 12) weaknesses.push("缺乏病毒传播机制");
if (scores.breakdown.roi_efficiency < 10) weaknesses.push("投资回收期较长");
// 生成行动建议
if (weaknesses.includes("需优化定价策略")) {
actions.push("测试备选定价区间($X-Y)");
}
if (weaknesses.includes("缺乏病毒传播机制")) {
actions.push("添加社交功能(好友邀请、内容分享、 spectator模式)");
}
if (scores.breakdown.revenue_potential < 20) {
actions.push("拓展目标市场(新增平台、覆盖地区)");
}
return {strengths, weaknesses, priority_actions: actions};
}undefinedundefined| Component | Score | Weight | Contribution |
|---|---|---|---|
| Willingness-to-Pay | XX/100 | 25% | XX.X |
| Viral Potential | XX/100 | 20% | XX.X |
| Revenue Potential | XX/100 | 30% | XX.X |
| ROI Efficiency | XX/100 | 15% | XX.X |
| Time-to-Profit | XX/100 | 10% | XX.X |
| TOTAL | XX/100 | 100% | XX.X |
| 维度 | 得分 | 权重 | 贡献值 |
|---|---|---|---|
| 用户付费意愿 | XX/100 | 25% | XX.X |
| 病毒传播潜力 | XX/100 | 20% | XX.X |
| 收入潜力 | XX/100 | 30% | XX.X |
| ROI效率 | XX/100 | 15% | XX.X |
| 盈利周期 | XX/100 | 10% | XX.X |
| 总分 | XX/100 | 100% | XX.X |
| Metric | #1: [Name] | #2: [Name] | #3: [Name] |
|---|---|---|---|
| Monetization Score | XX/100 | XX/100 | XX/100 |
| WTP Score | XX/100 | XX/100 | XX/100 |
| Viral Score | XX/100 | XX/100 | XX/100 |
| 3-Year Revenue | $XXM | $XXM | $XXM |
| ROI % | XXX% | XXX% | XXX% |
| Payback Period | XX mo | XX mo | XX mo |
| Investment Required | $X.XM | $X.XM | $X.XM |
| Year 1 Players | XXXk | XXXk | XXXk |
| Risk Level | [Low/Med/High] | [Low/Med/High] | [Low/Med/High] |
| 指标 | 第1名:[名称] | 第2名:[名称] | 第3名:[名称] |
|---|---|---|---|
| 变现得分 | XX/100 | XX/100 | XX/100 |
| WTP得分 | XX/100 | XX/100 | XX/100 |
| 病毒传播得分 | XX/100 | XX/100 | XX/100 |
| 3年收入 | $XXM | $XXM | $XXM |
| ROI | XXX% | XXX% | XXX% |
| 投资回收期 | XX个月 | XX个月 | XX个月 |
| 所需总投资 | $X.XM | $X.XM | $X.XM |
| 第1年用户数 | XXXk | XXXk | XXXk |
| 风险等级 | [低/中/高] | [低/中/高] | [低/中/高] |
| Rank | Game Name | Score | Tier | Revenue (3yr) | ROI | Why it ranked here |
|---|---|---|---|---|---|---|
| 1 | [Name] | XX | S | $XXM | XXX% | [1-sentence reason] |
| 2 | [Name] | XX | A | $XXM | XXX% | [1-sentence reason] |
| 3 | [Name] | XX | A | $XXM | XXX% | [1-sentence reason] |
| 4 | [Name] | XX | B | $XXM | XXX% | [1-sentence reason] |
| 5 | [Name] | XX | B | $XXM | XXX% | [1-sentence reason] |
| ... |
| 排名 | 游戏名称 | 得分 | 等级 | 3年收入 | ROI | 排名理由 |
|---|---|---|---|---|---|---|
| 1 | [名称] | XX | S | $XXM | XXX% | [一句话理由] |
| 2 | [名称] | XX | A | $XXM | XXX% | [一句话理由] |
| 3 | [名称] | XX | A | $XXM | XXX% | [一句话理由] |
| 4 | [名称] | XX | B | $XXM | XXX% | [一句话理由] |
| 5 | [名称] | XX | B | $XXM | XXX% | [一句话理由] |
| ... |
undefinedundefinedTodoWrite([
"Load market analysis report and extract WTP signals",
"Load game concepts document and extract monetization data",
"Calculate WTP score for each game concept",
"Calculate viral potential score for each concept",
"Project 3-year revenue for each concept",
"Calculate ROI and financial metrics",
"Compute total monetization score",
"Rank all concepts by monetization score",
"Select top 3 and generate detailed analysis",
"Create optimization recommendations for top 3",
"Generate comprehensive monetization report"
])TodoWrite([
"加载市场分析报告并提取WTP信号",
"加载游戏概念文档并提取变现相关数据",
"为每个游戏概念计算WTP得分",
"为每个概念计算病毒传播潜力得分",
"为每个概念预测3年收入",
"计算ROI与财务指标",
"计算总变现得分",
"按变现得分对所有概念排名",
"筛选Top3并生成详细分析",
"为Top3生成优化建议",
"生成完整变现分析报告"
])[Single Message - Load All Inputs]:
Read("/docs/market-analysis-[category]-[date].md")
Read("/docs/[category]-game-concepts-[date].md")
// Optional: Read competitor data if available[Single Message - Load All Inputs]:
Read("/docs/market-analysis-[category]-[date].md")
Read("/docs/[category]-game-concepts-[date].md")
// 可选:若有竞品数据则加载/docs/monetization-analysis-[category]-top3-[date].md/docs/monetization-analysis-[category]-top3-[date].md