星路制作人

✨ 游玩权限验证 ✨

⬡ 八维能力
发行作品
奖项履历

💾 存档管理

推演流速设定 (右上角按钮生效):

🤖 AI 接口设定

🌍 娱乐圈地图

💡 企划中心

📱 手机桌面

// ==================== 奖项系统 ==================== function renderAwardsMap(){ let isAwardMonth = [2,5,8,11].includes(time.m); let awdName = time.m==2?"星耀留声机大奖":time.m==5?"BB榜音乐盛典":time.m==8?"V-视听大奖":time.m==11?"全星音乐盛典":""; if(isAwardMonth){ $("txtAwardStatus").innerText = `⭐ 本月正在举办【${awdName}】!`; $("btnJoinAward").style.display = "block"; $("btnJoinAward").onclick = function(){joinAward(awdName)}; } else { $("txtAwardStatus").innerText = "非颁奖季(固定 2,5,8,11 月)"; $("btnJoinAward").style.display = "none"; } $("listAwardsLog").innerHTML = historyAwards.length ? historyAwards.map(function(x){return `
${x}
`}).join('') : "暂无历史记录"; } window.checkAutoAward = function(){ let isAwardMonth = [2,5,8,11].includes(time.m); if(!isAwardMonth || (historyAwards.length>0 && historyAwards[0].includes(`${time.y}年${time.m}月`))) return; let awdName = ""; let aoty="", soty="", roty="", bna="", sub1="", sub2=""; let trks = trackPool.filter(function(x){ return x.type==="track"; }); let albsOnly = trackPool.filter(function(x){ return x.type==="album"; }); let popTrks = trks.filter(function(x){ return x.gnr.includes("流行")||x.gnr.includes("舞曲")||x.gnr.includes("电子"); }); let rckTrks = trks.filter(function(x){ return x.gnr.includes("摇滚")||x.gnr.includes("另类")||x.gnr.includes("乡村"); }); let hipTrks = trks.filter(function(x){ return x.gnr.includes("HipHop")||x.gnr.includes("R&B")||x.gnr.includes("灵魂乐"); }); const pickMeOrNpc = function(arr, sortKey, myProb){ let arrCopy = [].concat(arr); arrCopy.sort(function(a,b){ return b[sortKey]-a[sortKey]; }); if(!arrCopy.length) return "空缺"; let topItem = arrCopy[0]; if(topItem.isMe || Math.random() < myProb) { let myBest = null; for(let i=0; i arrCopy[0][sortKey]*0.3) { if(myBest.isMe) { ad.awd.unshift(`${time.y}年${time.m}月 获奖!`); updAttr(); } return escapeHTML(myBest.artist) + `《${escapeHTML(myBest.n)}》`; } } return escapeHTML(topItem.artist) + `《${escapeHTML(topItem.n)}》`; }; let resultMsg = ""; if(time.m==2) { awdName = "星耀留声机大奖"; aoty = pickMeOrNpc(albsOnly, 'Spub', 0.2); soty = pickMeOrNpc(trks, 'Spub', 0.2); roty = pickMeOrNpc(trks, 'ptsY', 0.2); let sortedNpc = [].concat(worldArtists).sort(function(a,b){ return b.fans-a.fans; }); bna = "黑马新人"; if(sortedNpc.length > 0) { let rIndex = Math.floor(Math.random() * Math.min(3, sortedNpc.length)); bna = escapeHTML(sortedNpc[rIndex].n); } if(Math.random()<0.15) bna = escapeHTML(ad.s); sub1 = pickMeOrNpc(popTrks, 'Spub', 0.25); sub2 = pickMeOrNpc(rckTrks, 'Spub', 0.25); resultMsg = `【年度专辑 AOTY】:${aoty}\n【年度歌曲 SOTY】:${soty}\n【年度制作 ROTY】:${roty}\n【最佳新人】:${bna}\n【最佳流行歌手】:${sub1}\n【最佳摇滚歌手】:${sub2}`; } else if(time.m==5) { awdName = "BB榜音乐盛典"; aoty = pickMeOrNpc(albsOnly, 'slTotal', 0.3); soty = pickMeOrNpc(trks, 'pts', 0.3); sub1 = pickMeOrNpc(trks, 'stm', 0.3); resultMsg = `【顶级公告牌专辑】:${aoty}\n【顶级Hot100单曲】:${soty}\n【顶级流媒体歌曲】:${sub1}`; } else if(time.m==8) { awdName = "V-视听大奖"; aoty = pickMeOrNpc(trks, 'mvN', 0.4); sub1 = pickMeOrNpc(popTrks, 'stmDly', 0.3); sub2 = pickMeOrNpc(hipTrks, 'stmDly', 0.3); resultMsg = `【年度最佳MV】:${aoty}\n【最佳流行MV】:${sub1}\n【最佳HipHop MV】:${sub2}`; } else if(time.m==11) { awdName = "全星音乐盛典"; aoty = escapeHTML(ad.s); let sortedNpc = [].concat(worldArtists).sort(function(a,b){ return b.fans-a.fans; }); if(sortedNpc.length > 0) aoty = escapeHTML(sortedNpc[0].n); if(ad.st.f > 20000000 && Math.random()<0.4) aoty = escapeHTML(ad.s); soty = pickMeOrNpc(albsOnly, 'stmDlyAlb', 0.4); resultMsg = `【年度最佳艺人】:${aoty}\n【最受欢迎专辑】:${soty}`; } let rec = `${time.y}年${time.m}月 - ${awdName}
${resultMsg.replace(/\n/g,'
')}
`; historyAwards.unshift(rec); let isMeWin = resultMsg.indexOf(ad.s) !== -1; if(isMeWin) { ad.awd.unshift(`${time.y}年${time.m}月 - 斩获【${awdName}】大奖!`); updAttr(); } $("txtAwardBannerMsg").innerHTML = `🏆 本月举办了【${awdName}】!

${resultMsg.replace(/\n/g,'
')}

${isMeWin ? "🎉 恭喜!成功斩获了奖项!荣誉已载入史册。" : "遗憾的是,你本次陪跑了,继续努力吧!"}`; $("mAwardBanner").classList.add("open"); } window.joinAward = function(awdName){ window.checkAutoAward(); renderAwardsMap(); saveGame(); } // ==================== MV与打单 ==================== function renderMVMap(){ let trks = trackPool.filter(function(x){return x.isMe && x.type==="track"}); $("listMV").innerHTML = trks.length ? trks.map(function(t){return `
${escapeHTML(t.n)} (在榜${t.weeks}周)
流媒: ${t.stm.toLocaleString()} | 历史MV次数: ${t.mvN||0}
`}).join('') : "

没有可拍MV的单曲

"; } window.shootMV = function(tid, type){ if(!costEnergy(10)) return; let t = trackPool.find(function(x){return x.id===tid}); if(!t) return; if(t.weeks > 12) return alert("⚠️ 这首歌发行已超过 12 周,错过了拍摄MV宣发的最佳时机,无法再拍MV了!"); let cost = type==1 ? 10000 : 2000; if(ad.m < cost) return alert("资金不足!"); ad.m -= cost; if(type==1) advHour(24); let Smv = Math.floor(Math.random()*50)+50; let loc = type==1 ? (Math.random()*0.4+0.8) : 0; let bonus = (Smv*0.5 + (cost/1000)*0.22 + type*loc*0.28) * ad.Geffect; let decay = Math.pow(0.72, t.mvN || 0); t.mvN = (t.mvN||0) + 1; let finalAdd = Math.floor(bonus * decay * 10000); t.stm += finalAdd; t.stmDly += Math.floor(finalAdd/7); let extraSl = Math.floor(finalAdd/150); t.slTotal += extraSl; t.slWk += extraSl; t.pts = t.slTotal + Math.floor(t.stm/1500) + Math.floor(t.rad/3000); t.stmY += finalAdd; t.stmD += finalAdd; ad.st.h += 5; updAttr(); updatePeakRanks(); renderMVMap(); saveGame(); alert(`🎬 MV拍摄完成!最终带来 ${finalAdd.toLocaleString()} 流媒爆发!`); } window.doTVPromo = function(){ if(!costEnergy(10)) return; let myTrks = trackPool.filter(function(x){return x.isMe && x.type==="track" && x.weeks<=12}); if(!myTrks.length) { alert("⚠️ 没有处于宣发期(发行12周以内)的新歌,电视台拒绝了你的打歌申请!"); return; } advHour(24); let t = myTrks.sort(function(a,b){return b.stm - a.stm})[0]; let extraStm = Math.floor(t.stm * 0.15 * ad.Geffect + 50000); t.stm += extraStm; t.slTotal += Math.floor(extraStm/150); t.pts += Math.floor(extraStm/1500); alert(`📺 打歌成功!近期新歌《${t.n}》流媒激增 ${extraStm.toLocaleString()}!`); updatePeakRanks(); saveGame(); } window.doTour = function(){ let currentMonthAbs = time.y * 12 + time.m; if (ad.lastTourMonth && (currentMonthAbs - ad.lastTourMonth < 6)) { return alert("✈️ 巡演过于频繁!团队和粉丝都需要休息,至少间隔半年才能再次开启全球巡演。"); } if(!costEnergy(30)) return; advTime(7, false); let ctry = escapeHTML($("selTourCountry").value); if(ctry==="custom") ctry = escapeHTML($("inTourCustom").value) || "未知国家"; ad.lastTourMonth = currentMonthAbs; let gainM = Math.floor(ad.st.f * 0.05 + 100000); let gainF = Math.floor(ad.st.f * 0.02 + 5000); ad.m += gainM; ad.st.f += gainF; let msg = `✈️ 在【${ctry}】的巡演圆满结束!\n门票狂赚 $${gainM.toLocaleString()},吸粉 ${gainF.toLocaleString()}!`; let myTrks = trackPool.filter(function(x){return x.isMe && x.type==="track" && x.weeks<=12}); if(myTrks.length){ let t = myTrks.sort(function(a,b){return b.stm - a.stm})[0]; let extraStm = Math.floor(t.stm * 0.25 * ad.Geffect); t.stm += extraStm; t.slTotal += Math.floor(extraStm/150); t.pts += Math.floor(extraStm/1500); msg += `\n🎸 触发【打单效应】!新曲流媒暴增 ${extraStm.toLocaleString()}!`; } updAttr(); updatePeakRanks(); saveGame(); alert(msg); } // ==================== 企划制作 (单曲内核系统) ==================== window.aiGenName = async function(type, targetId){ let btn = event.target; btn.innerText="..."; let r = await api(`随机生成一个带有欧美流行/摇滚质感的${type=="song"?"英文单曲名":"英文专辑名"},只要名字,不要引号和多余解释。`); btn.innerText="AI 取名"; if(r) $(targetId).value = r.trim().replace(/["']/g,""); } window.startWrite = function(){ if(curPj) return alert("有正在进行的企划!"); if(!costEnergy(10)) return; let n = escapeHTML($("inSName").value) || "Demo"; let ff = parseInt($("inFeat")?$("inFeat").value:0) || 0; if(ff>0) n += " (Feat.)"; let core = escapeHTML(document.getElementById("inSCore") ? document.getElementById("inSCore").value : ""); curPj = {type: "write", n: n, g: [...selG], c: escapeHTML($("inSCustom").value), core: core, ff: ff}; prog=0; $("txtProg").innerText="0%"; $("barProg").style.width="0%"; $("boxWriteProgress").style.display="block"; $("btnStartWriteProj").style.display="none"; alert(`企划立项:${n}。已扣除10精力。`); saveGame(); } window.writeSongStep = function(){ if(!curPj) return; if(!costEnergy(10)) return; advHour(1); prog += Math.floor(Math.random()*11)+20; if(prog>=100){ prog=100; lib.push({id:"lb_"+Date.now(), n:curPj.n, g:[...curPj.g], c:curPj.c, core:curPj.core, ff: curPj.ff}); alert(`✅ 创作完毕:${curPj.n}`); curPj=null; setTimeout(function(){$("txtProg").innerText="0%"; $("barProg").style.width="0%"; $("boxWriteProgress").style.display="none"; $("btnStartWriteProj").style.display="block";},1000); renderLib(); saveGame(); } else { $("txtProg").innerText=prog+"%"; $("barProg").style.width=prog+"%"; } } function renderLib(){ $("listLib").innerHTML=lib.map(function(x,i){return `
${escapeHTML(x.n)}未录制
`}).join(''); } function renderStdMap(){ $("listStudio").innerHTML = `一键录制(耗10精):
` + lib.map(function(x,i){return `
${escapeHTML(x.n)}
`}).join('') + `
成品库(可发单曲):
`+ std.map(function(x,i){return `
${escapeHTML(x.n)}
`}).join(''); } window.startRecord = function(i){ if(curPj && curPj.type==="write") return alert("正在写歌,请先完成!"); if(!costEnergy(10)) return; let s=lib.splice(i,1)[0]; s.released=false; s.id="st_"+Date.now()+"_"+Math.floor(Math.random()*1000); std.push(s); alert(`🎙️ 录制成功:${s.n}`); renderStdMap(); renderLib(); saveGame(); } // ==================== 发行与打榜 (内核无API备用判定) ==================== window.openRelSingle = function(sid){ tempIdx = sid; pickAction = "relSingleDirect"; $("mPickExt").style.display="block"; $("mPickTitle").innerText = "发行单曲定价"; $("mPickList").innerHTML=""; $("mPick").classList.add("open"); } window.confirmPick = async function(){ let price = parseInt($("sgPrice").value) || 1; if(pickAction === "relSingleDirect"){ let i = std.findIndex(function(x){return x.id===tempIdx}); if(i===-1)return; let s = std[i]; s.released = true; let baseF = ad.st.f + (s.ff * 0.3 || 0); let t = createEntity(s.n, ad.s, true, "track", s.g?s.g.join():"", baseF, ad.sk.w, ad.sk.v, time.y, time.m, time.w); t.price = price; t.revenue = 0; let aiAdj = 0; let aiCmt = ""; let searchCore = s.core || s.c; if($("apiToken").value && searchCore){ let r = await api(`我写了首【${s.g}】歌,内核是【${searchCore}】。给修正分(-15到+15整数)和15字短评。只返JSON: {"score_adj":5, "comment":"..."}`); if(r){ try{ let j=JSON.parse(r.match(/\{[\s\S]*\}/)[0]); aiAdj=parseInt(j.score_adj)||0; aiCmt=escapeHTML(j.comment)||""; }catch(e){} } } else if (searchCore) { aiAdj = Math.floor(Math.random() * 20) - 5; aiCmt = (aiAdj > 5) ? "系统判定:这首歌的内核表达很有深度!" : "系统判定:内核表达中规中矩。"; } t.Spub = Math.max(0, Math.min(100, t.Spub + aiAdj)); t.stm = Math.floor(t.stm * ad.H * ad.D * ad.Geffect); t.stmDly = Math.floor(t.stm/7); t.slTotal = Math.floor(t.stm/150); t.slWk = t.slTotal; t.rad = Math.floor(t.stm*1.5); t.pts = t.slTotal + Math.floor(t.stm/1500) + Math.floor(t.rad/3000); t.tier = getTierT(t.stm).l; ad.st.f += Math.floor(t.stm / 80); trackPool.push(t); myWorks.push({id:t.id, n:`《${s.n}》[单曲]`, slTotal:t.slTotal, revenue:0}); std.splice(i,1); updatePeakRanks(); updAttr(); renderStdMap(); closeM('mPick'); saveGame(); alert(`🎵 发行成功!定价: $${price}\n感知分: ${t.Spub.toFixed(1)} ${aiCmt?'\n评价: '+aiCmt:''}\n首发流媒: ${t.stm.toLocaleString()} (${t.tier})`); } else if(pickAction === "addWip"){ let avail=std.filter(function(x){return !x.released}); avail.forEach(function(x){if($(`pk_m_${x.id}`).checked){ curAlbPj.s.push(x); std.splice(std.findIndex(function(s){return s.id===x.id}),1); }}); updateAlbProjUI(); closeM('mPick'); renderStdMap(); saveGame(); } else if (pickAction === "relPre"){ let radios = document.getElementsByName("preR"); let selId = null; for(let i=0;i(已发)":"")}).join('
'); } else { $("boxNewAlb").style.display="block"; $("boxWipAlb").style.display="none"; } } window.startAlbum = function(){ if(curAlbPj) return alert("已有筹备中专辑!"); curAlbPj = { n:escapeHTML($("inAName").value)||"Album", g:[...selAG], core:escapeHTML($("inACore").value)||"无", s:[], hype: 1.0, preCount: 0 }; alert("新专立项成功!"); updateAlbProjUI(); saveGame(); } window.addWipSong = function(){ let avail=std.filter(function(x){return !x.released}); if(!avail.length) return alert("没新歌!"); pickAction = "addWip"; $("mPickTitle").innerText = "选入专辑"; $("mPickExt").style.display="none"; $("mPickList").innerHTML = avail.map(function(x){return `
${escapeHTML(x.n)}
`}).join(''); $("mPick").classList.add("open"); } window.relPreSingle = function(){ if(!curAlbPj || curAlbPj.s.length==0) return alert("专辑没加歌!"); let avail = curAlbPj.s.filter(function(x){return !x.released}); if(!avail.length) return alert("都发过了!"); pickAction = "relPre"; $("mPickTitle").innerText = "发行先行曲"; $("mPickExt").style.display="block"; $("mPickList").innerHTML = avail.map(function(x){return `
${escapeHTML(x.n)}
`}).join(''); $("mPick").classList.add("open"); } window.relWipAlb = async function(){ if(!curAlbPj || !curAlbPj.s.length) return alert("全专没歌!"); let price = parseInt($("albPrice")?$("albPrice").value:10) || 10; let a = {n:curAlbPj.n, g:curAlbPj.g, core:curAlbPj.core, s:curAlbPj.s, st:"已发", deluxeLevel:0}; let Dleak = 1 - (a.s.filter(function(x){return x.released}).length / a.s.length) * 0.35; a.s.forEach(function(x){x.released=true}); let tAlb = createEntity(a.n, ad.s, true, "album", a.g.join(), ad.st.f, ad.sk.w, ad.sk.v, time.y, time.m, time.w); tAlb.price = price; tAlb.revenue = 0; let aiAdj = 0; let aiCmt = ""; if($("apiToken").value && curAlbPj.core && curAlbPj.core !== "无"){ let r = await api(`新专内核【${curAlbPj.core}】。给修正分(-15到+15)和短评。只返JSON: {"score_adj":5, "comment":"..."}`); if(r){ try{ let j=JSON.parse(r.match(/\{[\s\S]*\}/)[0]); aiAdj=parseInt(j.score_adj)||0; aiCmt=escapeHTML(j.comment)||""; }catch(e){} } } else if (curAlbPj.core && curAlbPj.core !== "无") { aiAdj = Math.floor(Math.random() * 20) - 5; aiCmt = (aiAdj > 5) ? "系统判定:这张专辑传达了深刻的情感内核,饱受好评!" : "系统判定:概念尚可。"; } tAlb.Spub = Math.max(0, Math.min(100, tAlb.Spub + aiAdj)); if(a.preCount>0){ if(tAlb.Spub>80) { ad.Elead=1.2; ad.Kalbum=1.1; } else if(tAlb.Spub<55) { ad.Elead=0.7; ad.Kalbum=0.8; } } tAlb.stm = Math.floor(tAlb.stm * ad.Elead * ad.Kalbum * ad.H * ad.D * ad.Geffect * curAlbPj.hype * Dleak); tAlb.slTotal = Math.floor(tAlb.stm / 100); tAlb.slWk = tAlb.slTotal; tAlb.stmDlyAlb = Math.floor(tAlb.stm / 7); tAlb.tier = getTierA(tAlb.stm).l; a.trackRef = tAlb; trackPool.push(tAlb); myWorks.push({id:tAlb.id, n:`《${a.n}》[全专]`, slTotal:tAlb.slTotal, revenue:0}); ad.st.f += Math.floor(tAlb.slTotal * 2); a.s.forEach(function(song, idx){ if(!song.released){ let tTrk = createEntity(song.n, ad.s, true, "track", a.g.join(), ad.st.f, ad.sk.w, ad.sk.v, time.y, time.m, time.w); tTrk.stm = Math.floor(tAlb.stm * 0.2 * Math.pow(0.85, idx) * ad.Geffect); tTrk.stmDly = Math.floor(tTrk.stm/7); tTrk.slTotal = Math.floor(tTrk.stm/150); tTrk.rad = Math.floor(tTrk.stm*1.5); tTrk.pts = tTrk.slTotal + Math.floor(tTrk.stm/1500) + Math.floor(tTrk.rad/3000); tTrk.tier = getTierT(tTrk.stm).l; trackPool.push(tTrk); } }); albs.push(a); curAlbPj = null; updateAlbProjUI(); updatePeakRanks(); updAttr(); renderAlb(); saveGame(); alert(`🚀 全专上线!首周销量: ${tAlb.slTotal.toLocaleString()}`); } window.scrapAlb = function(){ let cost = Math.floor(ad.m * 0.2); ad.m -= cost; alert(`🗑️ 已推翻专辑!损失 $${cost.toLocaleString()}。`); curAlbPj = null; updateAlbProjUI(); updAttr(); saveGame(); } function renderAlb(){ $("listAList").innerHTML=albs.map(function(a,i){ let dlxBtn = ``; let detailBtn = ``; return `
${escapeHTML(a.n)} (${a.st}) ${a.trackRef?getCert(a.trackRef.slTotal):''}
收录:${a.s.length}首歌曲
感知分: ${a.trackRef.Spub.toFixed(1)} [${a.trackRef.tier}]
累计销量: ${a.trackRef.slTotal.toLocaleString()}
${dlxBtn} ${detailBtn}
`; }).join(''); } window.openAlbDetail = function(idx) { let a = albs[idx]; let h = a.s.map(function(song){ // 【核心修复:防同名合并Bug,严格比对歌曲ID(如果是已有曲目)或者通过名字+艺人严格匹配】 let t = trackPool.find(x => x.n === escapeHTML(song.n) && x.artist === ad.s); if(!t) return ""; return `
${escapeHTML(t.n)} (在榜${t.weeks}周)
总播放: ${t.stm.toLocaleString()} | 总销量: ${t.slTotal.toLocaleString()} ${getCert(t.slTotal)}
`; }).join(''); $("mAlbDetailTitle").innerText = `《${a.n}》收录曲`; $("mAlbDetailContent").innerHTML = h; $("mAlbDetail").classList.add("open"); } window.promoAlbSong = function(id) { if(!costEnergy(10)) return; let t = trackPool.find(x => x.id === id); if(!t) return; if(t.weeks > 12) return alert("⚠️ 这首收录曲发行已超过 12 周,过了黄金宣发期,公司拒绝再为其投入打单资源!"); advHour(24); let extraStm = Math.floor(t.stm * 0.18 * ad.Geffect + 30000); t.stm += extraStm; t.slTotal += Math.floor(extraStm/150); alert(`📺 打单成功!《${t.n}》流媒激增 ${extraStm.toLocaleString()}!`); updatePeakRanks(); saveGame(); let albIdx = albs.findIndex(a=>a.s.some(s=>s.n===t.n)); if(albIdx > -1) window.openAlbDetail(albIdx); } window.openDeluxe = function(idx){ tempIdx = idx; let avail = std.filter(function(x){return !x.released}); if(!avail.length) return alert("录音室没新歌!"); $("boxDeluxePick").innerHTML = avail.map(function(x){return `
${escapeHTML(x.n)}
`}).join(''); $("mDeluxe").classList.add("open"); } window.confirmDeluxe = function(){ let a = albs[tempIdx]; let tAlb = a.trackRef; let avail = std.filter(function(x){return !x.released}), added=[]; avail.forEach(function(x){if($(`dx_${x.id}`).checked)added.push(x);}); if(!added.length) return alert("请选歌!"); added.forEach(function(x){x.released=true}); a.s = a.s.concat(added); a.deluxeLevel = (a.deluxeLevel||0)+1; const sfx = ["", " (Deluxe)", " (Super Deluxe)", " (Ultra Deluxe)"]; let sAdd = a.deluxeLevel<4 ? sfx[a.deluxeLevel] : " (Ultimate Deluxe)"; tAlb.n = a.n + sAdd; a.n += sAdd; let extraStm = Math.floor(tAlb.stm * 0.5 * 1.35 * Math.pow(0.8, a.deluxeLevel-1) + 500000); tAlb.stm += extraStm; tAlb.stmDlyAlb += Math.floor(extraStm/7); let extraSl = Math.floor(extraStm / 150); tAlb.slTotal += extraSl; tAlb.slWk += extraSl; let totalBonusFan = Math.floor(extraSl / 5); added.forEach(function(song, idx){ let tTrk = createEntity(song.n, ad.s, true, "track", a.g.join(), ad.st.f, ad.sk.w, ad.sk.v, time.y, time.m, time.w); tTrk.stm = Math.floor(extraStm * 0.3 * Math.pow(0.85, idx) * ad.Geffect); tTrk.stmDly = Math.floor(tTrk.stm/7); tTrk.slTotal = Math.floor(tTrk.stm/150); tTrk.rad = Math.floor(tTrk.stm*1.5); tTrk.pts = tTrk.slTotal + Math.floor(tTrk.stm/1500) + Math.floor(tTrk.rad/3000); trackPool.push(tTrk); totalBonusFan += Math.floor(tTrk.stm / 5000); let sIdx = std.findIndex(function(x){return x.id===song.id}); if(sIdx>-1) std.splice(sIdx,1); }); ad.st.f += totalBonusFan; closeM('mDeluxe'); updatePeakRanks(); updAttr(); renderAlb(); renderStdMap(); saveGame(); alert(`🎉 豪华版脉冲生效!销量追加 ${extraSl.toLocaleString()} 张!`); } // ==================== 时间推演核心与大盘算法增幅 ==================== function updTimeUI(){ let s = `${time.y}年 ${time.m}月 第${time.w}周 星期${time.d} ${time.h}:00`; let els=document.querySelectorAll(".uiDateMap"); for(var i=0;i= 24) { time.h = 0; advTime(1, false); ad.energy=ad.maxEnergy; } } updTimeUI(); saveGameImmediate(); } window.advTimeByFlow = function(){ let v = parseInt($("selTimeFlow").value) || 7; advTime(Math.floor(v/7)||1, true); } function updatePeakRanks(){ let trks = trackPool.filter(function(x){return x.type==="track"}); trks.sort(function(a,b){return b.stm - a.stm}); trks.forEach(function(t,i){ if(i+14){ time.w=1; time.m++; genMarket(); trackPool.forEach(function(t){ if(t.type==="album" && !t.isMe && !t.hasDeluxe && t.weeks>4 && t.weeks<20 && Math.random()<0.05){ t.hasDeluxe = true; t.n += " (Deluxe)"; t.stm += Math.floor(t.stm * 0.3); t.slTotal += Math.floor(t.stm/150*0.3); } }); window.checkAutoAward(); } if(time.m>12){ time.m=1; time.y++; trackPool.forEach(function(t){ t.stmY = 0; t.ptsY = 0; }); if(time.y % 10 === 0) { trackPool.forEach(function(t){ t.stmD = 0; t.ptsD = 0; }); } } let sumMonster = 0, sumFlop = 0; trackPool.forEach(function(t){ let age = (time.y - t.y) + (time.m - t.m)/12; let Rbase = 0.15; let Ginv = t.G ? (2.0 - t.G) : 1.0; let Rand = (Math.random()*0.24)-0.12; let Delta = (t.G>1.15) ? (Math.random()*0.2) : 0; let F_residue = Math.max(1000, t.Spub * 0.28 * Math.pow(0.98, age) * 500); let C_cycle = (time.w==4 && (t.gnr.includes("舞曲")||t.gnr.includes("流行"))) ? 1.6 : 1.0; let P_revive = Math.max(0.001, 0.09 * (t.Spub/100) * (1 - 0.035 * age)); if(t.weeks > 4 && Math.random() < P_revive){ t.revP = t.Spub * 0.42 * 10000; t.revW = 0; } if(t.revP > 0){ t.revPulse = t.revP * Math.pow(0.93, t.revW); t.revW++; } else { t.revPulse = 0; } let C_holiday = (time.m==12 && t.n.includes("圣诞")) ? 1.55 : 1.0; t.stm = Math.floor(t.stm * (1 - Rbase*Ginv) * (1 + Delta) * (1 + Rand)); t.stm += Math.floor(F_residue * C_cycle + t.revPulse); t.rad = Math.floor(t.rad * (1 - 0.05*Ginv) * (1 + Rand*0.5)); let revRatio = ad.dealType==="7/3"? 0.3 : (ad.dealType==="2/8"? 0.8 : 1.0); if(t.type==="track") { let trkWkSl = Math.floor(t.stm/150 * (1 + Rand) * C_holiday); t.slTotal += trkWkSl; t.slWk = trkWkSl; t.pts = trkWkSl + Math.floor(t.stm/1500) + Math.floor(t.rad/3000); t.tier = getTierT(t.stm).l; t.ptsY += t.pts; t.ptsD += t.pts; if(t.isMe) { totalFanGain += Math.floor(t.stm / 80); let income = Math.floor((trkWkSl * (t.price||1) + t.stm * 0.005) * revRatio); weekRev += income; let mw = myWorks.find(function(x){return x.id===t.id}); if(mw){ mw.slTotal = t.slTotal; mw.revenue += income; } } } else if(t.type==="album") { let albWkSl = Math.floor(t.stm/150 * (1 + Rand) * C_holiday); t.slTotal += albWkSl; t.slWk = albWkSl; t.tier = getTierA(t.stm).l; if(t.isMe) { totalFanGain += Math.floor(albWkSl * 20); let income = Math.floor((albWkSl * (t.price||10) + t.stm * 0.005) * revRatio); weekRev += income; let mw = myWorks.find(function(x){return x.id===t.id}); if(mw){ mw.slTotal = t.slTotal; mw.revenue += income; } } } t.weeks++; t.stmY += t.stm; t.stmD += t.stm; if(t.stm > 40000000) sumMonster += 0.02; if(t.Spub < 50) sumFlop += 0.005; }); ad.m += weekRev; let Kdis = sumFlop > 0.05 ? 1.5 : 1.0; let Rmarket = (Math.random()*0.06)-0.03; Mt = Math.max(0.5, Math.min(1.5, 1.0 + sumMonster - Kdis*sumFlop + Rmarket)); // NPC 正常发歌逻辑 if(Math.random()>0.7){ let n = npcNames[Math.floor(Math.random()*npcNames.length)]+" "+ts[Math.floor(Math.random()*ts.length)]; let type = Math.random()>0.5?"album":"track"; let npcNName = (type==="album") ? ts[Math.floor(Math.random()*ts.length)] + " " + ts[Math.floor(Math.random()*ts.length)] : ts[Math.floor(Math.random()*ts.length)]; trackPool.push(createEntity(npcNName, n, false, type, gs[Math.floor(Math.random()*gs.length)], Math.random()*5000000, 60, 60, time.y, time.m, time.w)); } } ad.st.f += totalFanGain; updatePeakRanks(); if(weeks>0){ updAttr(); saveGame(); } if(showMsg){ $("weeklyReportContent").innerHTML = `⏩ 过了 ${weeks} 周!
🔥 本期吸粉: ${totalFanGain.toLocaleString()}
💰 本期版税入账: $${weekRev.toLocaleString()}`; $("mWeeklyReport").classList.add("open"); } updTimeUI(); if($("mInfo").classList.contains("open")) closeM("mInfo"); renderAlb(); } function renderRankRow(x,i,durKey,peakKey,valKey,isAlb){ let diff = x.lastW ? x.lastW-(i+1) : 0; let chg = diff>0?`▲${diff}`:diff<0?`▼${-diff}`:(!x.lastW?'NEW':'-'); let dText = durKey=='days'?'天':'周'; return `
#${i+1} ${chg}
${escapeHTML(x.n)}
by ${escapeHTML(x.artist)}
在榜: ${x[durKey]}${dText}Peak: #${x[peakKey]} (×${x.peakW}周)上周: #${x.lastW||'-'}
${x[valKey].toLocaleString()} ${valKey.includes('stm')?'播放':(isAlb?'张':'Pts')}
`; } function getCert(sl){ if(sl>=10000000) return `💎 钻石(x${Math.floor(sl/10000000)})`; if(sl>=1000000) return `💿 白金(x${Math.floor(sl/1000000)})`; if(sl>=500000) return `📀 金唱片`; return ""; } window.openApp = function(id){ if(['Wb','Ins','X','TikTok'].includes(id)){ curApp = id; $("mTextTitle").innerText=id; $("mText").classList.add("open"); drawP(id); } else if(id=='NPC'){ $("mCustomNPC").classList.add("open"); renderNpcList(); } else if(id=='V'){ $("mV").classList.add("open"); $("vList").style.display="block"; $("vChat").style.display="none"; $("vList").innerHTML=conts.map(function(c,i){return `
${escapeHTML(c.n)}
`}).join(''); } else if(id=='Spot'){ $("mInfoTitle").innerText = "🎵 Spotify 流媒体榜 (单曲)"; $("mInfoContent").innerHTML = `
日榜
周榜
年榜
10年榜
`; let tks=trackPool.filter(function(x){return x.type=="track"}); let tksD = [...tks].sort(function(a,b){return b.stmDly-a.stmDly}); $("sD").innerHTML = tksD.slice(0,100).map(function(x,i){return renderRankRow(x,i,"days","peakS","stmDly")}).join(''); let tksW = [...tks].sort(function(a,b){return b.stm-a.stm}); $("sW").innerHTML = tksW.slice(0,100).map(function(x,i){return renderRankRow(x,i,"weeks","peakS","stm")}).join(''); let tksY = [...tks].sort(function(a,b){return b.stmY-a.stmY}); $("sY").innerHTML = tksY.slice(0,100).map(function(x,i){return renderRankRow(x,i,"weeks","peakS","stmY")}).join(''); let tksDec = [...tks].sort(function(a,b){return b.stmD-a.stmD}); $("sDec").innerHTML = tksDec.slice(0,100).map(function(x,i){return renderRankRow(x,i,"weeks","peakS","stmD")}).join(''); $("mInfo").classList.add("open"); } else if(id=='BB'){ $("mInfoTitle").innerText = "📊 Billboard 综合榜"; $("mInfoContent").innerHTML = `
周榜(Hot100)
年榜
10年榜
`; let tks=trackPool.filter(function(x){return x.type=="track"}); let tksBW = [...tks].sort(function(a,b){return b.pts-a.pts}); $("bW").innerHTML = tksBW.slice(0,100).map(function(x,i){return renderRankRow(x,i,"weeks","peakB","pts")}).join(''); let tksBY = [...tks].sort(function(a,b){return b.ptsY-a.ptsY}); $("bY").innerHTML = tksBY.slice(0,100).map(function(x,i){return renderRankRow(x,i,"weeks","peakB","ptsY")}).join(''); let tksBDec = [...tks].sort(function(a,b){return b.ptsD-a.ptsD}); $("bDec").innerHTML = tksBDec.slice(0,100).map(function(x,i){return renderRankRow(x,i,"weeks","peakB","ptsD")}).join(''); $("mInfo").classList.add("open"); } else if(id=='Sale' || id=='Daily'){ $("mInfoTitle").innerText = id=='Sale' ? "📈 专辑总销量榜" : "📉 专辑日增榜"; let albsOnly = trackPool.filter(function(x){return x.type==="album"}); let sortedAlbs = [...albsOnly].sort(function(a,b){return (id=='Sale'?b.slTotal-a.slTotal : b.stmDlyAlb-a.stmDlyAlb)}); $("mInfoContent").innerHTML = sortedAlbs.slice(0,100).map(function(x,i){return `
#${i+1} ${escapeHTML(x.n)} - ${escapeHTML(x.artist)}
${getCert(x.slTotal)}
${id=='Sale'?x.slTotal.toLocaleString()+' 张':'+'+x.stmDlyAlb.toLocaleString()+'/日'}
`}).join(''); $("mInfo").classList.add("open"); } else { $("mInfoTitle").innerText=id; $("mInfo").classList.add("open"); let h="暂无数据"; if(id=='Bitch'||id=='RS'){ h = trackPool.slice(0,100).map(function(x,i){return `
${escapeHTML(x.n)} - ${escapeHTML(x.artist)}
${id=='Bitch'?x.bx:x.rs}
${x.pub}
`}).join(''); } else if(id=='Market'){ $("mInfoContent").innerHTML = `
Demo 市场
写手排行榜
${marketSongs.map(function(x,i){return `
${escapeHTML(x.n)}
${x.g.join()} | by ${escapeHTML(x.author)}
`}).join('')}
${[...writers].sort(function(a,b){return b.hot-a.hot}).map(function(w,i){return `
#${i+1} ${escapeHTML(w.n)}
奖项: ${w.awd||'无'}
热度: ${w.hot}
功底: ${w.sk}
`}).join('')}
`; return; } $("mInfoContent").innerHTML=h; } } window.buySong = function(i){ let s=marketSongs[i]; if(ad.m 0) { let sname = sel.options[sel.selectedIndex].text; t += `\n🔥 [打单宣传] 快去听我的歌曲:${sname}`; let trackId = sel.value; let tk = trackPool.find(function(x){return x.id === trackId}); if(tk) { tk.stm += 80000; tk.slTotal += 500; alert(`宣发成功!`); } } else { alert("没有发行的歌曲可以宣传!"); return; } } let h=`

${t}

`; if(curImgBase64){h+=`
`;curImgBase64="";$("mTextImg").value="";} posts[curApp.toLowerCase()].unshift(h); $("mTextInput").value=""; drawP(curApp); saveGame(); } function drawP(id){ $("mTextList").innerHTML=posts[id.toLowerCase()].map(function(x){return `
${x}
`}).join(''); } window.refreshFeed = function(){ api(`请模拟3条欧美娱乐圈${curApp}的网友动态。`).then(function(r){if(r)$("feedList").innerHTML=escapeHTML(r).split('\n').map(function(x){return `
${x}
`}).join('');}); } window.refreshTrend = function(){ api(`请模拟5条当前欧美娱乐圈的实时热搜。`).then(function(r){if(r)$("trendList").innerHTML=escapeHTML(r).split('\n').map(function(x){return `
${x}
`}).join('');}); } // ==================== 粉丝留言三选一互动分离 ==================== window.getFanCmts = function(n,g,btn){ btn.innerText="加载中..."; btn.disabled=true; let hasApi = !!$("apiToken").value; if (hasApi) { api(`给歌曲《${n}》模拟2条粉丝听后感。每条一行。`).then(function(r){ btn.disabled=false; btn.innerText="刷新留言"; if(r) { btn.nextElementSibling.innerHTML = escapeHTML(r).split('\n').filter(function(x){return x.trim()}).map(function(x){ return `
${x}
`; }).join(''); } }); } else { setTimeout(function(){ btn.disabled=false; btn.innerText="刷新留言"; let fakeCmts = [`太好听了!这首《${n}》简直是神作!`, `我觉得这首歌很一般,完全没有${g}的精髓。`]; btn.nextElementSibling.innerHTML = fakeCmts.map(function(x){ return `
${x}
`; }).join(''); }, 500); } } window.replyComment = function(btn, cmt, type){ let reply = ""; if (type === "custom") { reply = prompt(`对评论:\n${cmt}\n\n请输入你的自定义回复:`); if(!reply) return; } else if (type === "kind") { reply = "谢谢你的支持与真实评价,我会继续努力做出更好的音乐!"; } else if (type === "angry") { reply = "不爱听别听,我的艺术不需要你来指手画脚。"; } let btnGroup = btn.parentElement; btnGroup.innerHTML = "回复发送中..."; let hasApi = !!$("apiToken").value; if (hasApi) { api(`网友评论:"${cmt}"。艺人回复:"${reply}"。模拟一句全网吃瓜群众的简短反应。`).then(function(r){ if(r) btnGroup.parentElement.innerHTML += `
👉 你: ${escapeHTML(reply)}
💬 网友反应: ${escapeHTML(r)}
`; saveGame(); }); } else { setTimeout(function() { let reaction = ""; if (type === "kind") reaction = "网友:天呐,这也太温柔了吧!粉了粉了!"; else if (type === "angry") reaction = "网友:哇哦,霸气发言!热搜预定!"; else reaction = "网友:这波操作看不懂,但是吃瓜吃得很开心。"; btnGroup.parentElement.innerHTML += `
👉 你: ${escapeHTML(reply)}
💬 网友反应: ${reaction}
`; saveGame(); }, 500); } } let curC; window.oChat = function(i){ curC=conts[i]; $("vList").style.display="none"; $("vChat").style.display="block"; $("vName").innerText=escapeHTML(curC.n); dChat(); } window.vBack = function(){ $("vChat").style.display="none"; $("vList").style.display="block"; } function dChat(){ $("vHistory").innerHTML=curC.h.map(function(x){return `
${escapeHTML(x.t)}
`}).join(''); $("vHistory").scrollTop=9999; } window.vSendMsg = function(){ let v=$("vIn").value; if(!v)return; curC.h.push({m:1,t:v}); $("vIn").value=""; dChat(); if ($("apiToken").value) { api(`用自然的话语回复:${v}`).then(function(r){ if(r){ curC.h.push({m:0,t:r}); dChat(); saveGame(); } }); } else { setTimeout(function(){ curC.h.push({m:0,t:"好的,我知道啦!"}); dChat(); saveGame(); }, 500); } } window.vSendMom = function(){ let v=$("vMomIn").value; if(!v)return; posts.mom.unshift(escapeHTML(v)); $("vMomIn").value=""; $("vMomList").innerHTML = posts.mom.map(function(x){return `
${x}
`}).join(''); saveGame(); }