Sync all projects
This commit is contained in:
+3918
-473
@@ -1,506 +1,3951 @@
|
||||
---
|
||||
# 變量詳細參考文檔 (Variable Reference)
|
||||
(async function() {
|
||||
if (window._mvuFinalStableV110) return;
|
||||
await waitGlobalInitialized('Mvu');
|
||||
console.log('✅ MVU ZOD 最終穩定後處理 v11.1 已啓用');
|
||||
|
||||
生理: # 反映角色身體內部具體生理需求的數值。
|
||||
當前生命值: 代表綜合身體機能的抽象數值。降至0則角色死亡。受傷、疾病、飢餓、脫水等會降低此值。
|
||||
生命值上限: 由腳本自動計算,AI不需任何改動。
|
||||
碳水: 通過進食含有碳水的食物補充。在進行劇烈活動,處於寒冷環境或其他會消耗比基礎代謝更多的熱量的時候。先於脂肪和蛋白質消耗。當碳水超過2000的時候,多餘碳水的75%將會轉換爲脂肪。
|
||||
脂肪: 通過進食富含脂肪的食物補充。超過2000的碳水的75%也會轉換成脂肪。
|
||||
氮平衡: 身體每天消耗和合成蛋白質的平衡,食用富含蛋白質的食物時增加。75以上正氮平衡會獲得1.5倍力量經驗增長,更快從疲勞恢復。
|
||||
蛋白質: 每小時會增加或減少氮平衡值的五分之一。低於2200會導致力量下降,免疫下降,傷口難以癒合,更難恢復耐力或其他缺乏蛋白質的副作用,低於越多副作用越大。
|
||||
維生素: 通過進食水果、蔬菜等補充。低於50會影響免疫力並可能導致疾病。
|
||||
水分: 任何進食行為水分都直接恢復到80。在進行體力活動、處於高溫環境等出汗狀態加速消耗時,進行額外的扣除。低於50會開始影響耐力並造成生命值損傷。0時死亡。喝水或使用富含水分的食物補充,不可超過100的上限。
|
||||
體溫: 核心體溫,正常範圍36.5-37.5。受環境溫度、衣物、活動強度影響。過高或過低都會導致負面狀態。
|
||||
免疫負荷: 代表免疫系統當前承受的壓力。受傷、感染、疾病會增加此值。高於免疫力越多,越容易生病和感染。
|
||||
飽腹感: 只計算進食後增加。當超過100點時會嘔吐,睡眠期間消耗減半。絕對嚴禁睡醒後直接設定飽腹感歸零。
|
||||
排泄欲: 代表膀胱和腸道的充盈程度。隨時間增加,可通過如廁解決。過高會造成不適、降低專注力,極高時會強制排泄並造成清潔度下降和精神損失。
|
||||
var _ = window._;
|
||||
var get = function(o, p) { return _.get(o, p); };
|
||||
var set = function(o, p, v) { return _.set(o, p, v); };
|
||||
|
||||
精神: # 反映角色心理和情緒狀態的數值。
|
||||
當前精神值: 代表綜合精神狀態的抽象數值。降至0則角色崩潰。壓力、創傷、孤獨、恐懼等會降低此值。
|
||||
精神值上限: 由腳本自動計算,AI不需任何改動。
|
||||
壓力: 代表心理壓力水平。遭遇危險、疼痛、睡眠不足會增加。過高會持續降低精神值。
|
||||
性慾: 代表當前的性慾強度。看到吸引人的異性、親密接觸、滿月等會增加。過高會影響判斷力並持續降低精神值。可透過自慰、性行為或強烈刺激來宣洩降低。
|
||||
無聊: 長時間無所事事或重複單調活動會增加,代表精神刺激的缺乏程度。過高會降低精神值。娛樂、進行冒險或食用美味的食物會減少。
|
||||
孤獨: 代表社交需求的滿足程度。過高會降低精神值。跟生物交流或互動可降低
|
||||
睡眠: 通過睡眠或休息恢復。過低會導致疲勞並影響所有屬性。0時會強制昏迷。被動消耗已由腳本自動處理。
|
||||
var isProcessing = false;
|
||||
var lastSnapshot = null;
|
||||
var fixCount = 0;
|
||||
var delCount = 0;
|
||||
var lastLogHash = '';
|
||||
|
||||
天賦特性: # 在開局時insert,根據描述影響各種判定。
|
||||
# 格式:'天賦特性名': { '描述': '具體描述', '加值': { '加值項目名稱': 數值 } }
|
||||
# 說明:描述該天賦特性的主要內容,加值為對檢定的加值數據
|
||||
# 範例:`{"op":"insert","path":"/天賦特性/夜視","value":{"描述":"在黑暗中也能清晰視物","加值":{"夜間觀察":20}}}`
|
||||
// ==================== Debug 模式開關 ====================
|
||||
var DEBUG_MODE = false; // ← 設為 true 開啟詳細 Log
|
||||
|
||||
屬性: # 角色六大主屬性,影響各種檢定和生理、精神屬性。
|
||||
# 格式:'屬性名稱': { '等級': 1, '當前經驗': 0, '升級所需經驗': 100 , '加值': 0 }
|
||||
# 說明:當前經驗每次涉及屬性的檢定無論成功失敗都會增加,增加量為簡單難度+25,中等+50,困難+75。升級所需經驗: 等級*10,加值為生效效果的輔助效果,由腳本自動計算。
|
||||
力量: # 決定負重上限和近戰傷害。
|
||||
敏捷: # 影響閃避、命中和執行精細操作的速度。
|
||||
耐力: # 決定生命值上限、奔跑持久度和對疲勞、疾病的抵抗力。
|
||||
智力: # 影響學習速度、製作複雜物品和解決問題的能力。
|
||||
感知: # 決定發現隱藏物品、蹤跡和察覺危險的能力。
|
||||
意志: # 決定精神值上限和對緊急情況判斷、情感變化耐受度、壓力及疼痛的承受力。另外在緊急情況下沒有逃避而做出判斷,無論結果如何都會增加經驗。在男女感情做出抉擇、抵抗誘惑,又或是成功獲得同伴滿意的決定、色誘或勸誘同伴、調教同伴、欺騙同伴、成功與同伴進行性交等需要進行判定的行為時,無論成功與否都會增加經驗。
|
||||
function debugLog() {
|
||||
if (DEBUG_MODE) {
|
||||
console.log('[🔍]', ...arguments);
|
||||
}
|
||||
}
|
||||
|
||||
狀態: # 記錄角色的各種即時狀態和效果。
|
||||
當前負重: 當前所有攜帶物品和裝備的總重量。超過負重上限的50%開始影響行動速度和疲勞,超過越多影響越大,超過負重上限會完全無法移動。
|
||||
負重上限: 由腳本自動計算,AI不需任何改動
|
||||
表皮溼度: 代表皮膚表面的溼潤程度。出汗、淋雨會增加,乾燥環境會降低。影響體感溫度。
|
||||
疲勞: 代表身體的疲憊程度。由體力消耗和睡眠不足累積。在不進行明顯消耗體力的活動(如靜坐、釣魚、休息)時。
|
||||
受傷: 記錄身體的受傷情況,例如:'無'、'輕微擦傷'、'右臂骨折'。會影響相應身體機能和產生疼痛。
|
||||
流血: 流血類型,代表是否存在開放性傷口導致持續失血。會持續降低生命值,需包紮止血。
|
||||
感染: 代表傷口感染程度。100表示身體徹底被感染內臟衰竭,角色死亡。
|
||||
疾病: 疾病名稱,若免疫負荷大於免疫力,在免疫負荷繼續提高的時候獲得。
|
||||
清潔: 代表身體和衣物的清潔度。在骯髒環境活動會降低。過低會增加感染風險和社交負面影響。
|
||||
疼痛: 代表身體感受到的疼痛等級。由受傷程度決定。會持續降低精神值並影響行動。
|
||||
免疫力: 基礎免疫力等於耐力,維生素等的缺乏會降低,綜合計算的抵抗疾病能力。
|
||||
最低舒適溫度: 角色在當前衣物和狀態下不會過冷的最低溫度,越低越抗冷。受到裝備、溼度等元素影響。參考 rimworld。
|
||||
最高舒適溫度: 角色在當前衣物和狀態下不會過熱的最高體感溫度,越高越抗熱。受到裝備、溼度等元素影響。參考 rimworld。
|
||||
生效效果: 角色當前正在生效的狀態效果。會對角色屬性、檢定等產生影響。添加、移除已全部由腳本自動處理,禁止AI使用任何方式更改。
|
||||
function keyLog() {
|
||||
console.log('[📌]', ...arguments);
|
||||
}
|
||||
|
||||
function errorLog() {
|
||||
console.error('[❌]', ...arguments);
|
||||
}
|
||||
|
||||
技能: # 對象,一個可擴展的對象,以技能名稱為鍵,記錄角色掌握的各項技能。
|
||||
# 格式:'技能名稱': { '等級': 數字, '當前經驗': 數字, '升級所需經驗': 數字 }
|
||||
#
|
||||
# 特殊技能 - 好感(對象名稱):
|
||||
# 用於記錄同伴對特定對象的好感度
|
||||
# 經驗值獲取範圍:
|
||||
# - 日常(關懷、送禮、一起工作):5 ~ 10
|
||||
# - 交流(打動對方、深入對話、成功教導):15 ~ 30
|
||||
# - 親密(接吻、愛撫、誘惑):25 ~ 50
|
||||
# - 感動(犧牲、保護、重大決定):40 ~ 75
|
||||
# - 第一次(初吻、初體驗):50 ~ 100
|
||||
# 等級範圍:1-20+,對應性愛自訂規則中的階段
|
||||
# 範例: "好感(對阿彬)": { "等級": 3, "當前經驗": 120, "升級所需經驗": 300 }
|
||||
# 說明:
|
||||
# - 等級:技能等級,新獲得技能時,等級為1
|
||||
# - 當前經驗:使用技能時根據難度獲得 +25 ~ +250
|
||||
# - 升級所需經驗:1級以上為技能等級 * 100
|
||||
// ==================== 整數路徑(根據新設計更新) ====================
|
||||
var integerPaths = [
|
||||
'生理.當前生命值', '精神.當前精神值',
|
||||
'生理.碳水', '生理.脂肪', '生理.氮平衡', '生理.蛋白質', '生理.維生素', '生理.水分', '生理.排泄欲',
|
||||
'精神.壓力', '精神.無聊', '精神.孤獨', '精神.睡眠', '精神.性慾',
|
||||
'生理.飽腹感', '狀態.表皮溼度', '狀態.疲勞', '狀態.清潔', '生理.免疫負荷', '狀態.免疫力',
|
||||
'同伴.*.生理狀態.流產風險累積', '同伴.*.生理狀態.流產次數', '同伴.*.生理狀態.上次流產日', '同伴.*.生理狀態.流產待處理'
|
||||
];
|
||||
var decayRates = [0.06, 0.15, 0.35, 0.8, 2.4];
|
||||
|
||||
裝備: # 記錄角色當前穿戴的裝備,以部位為鍵。
|
||||
限制: 所有裝備都同時只能裝備一件。
|
||||
頭部: 記錄頭部佩戴的裝備信息。
|
||||
頸部: 記錄頸部佩戴的裝備信息。
|
||||
胸部: 記錄胸部佩戴的裝備信息。
|
||||
背部: 記錄背部佩戴的裝備信息。
|
||||
腰部: 記錄腰部佩戴的裝備信息。
|
||||
右手: 記錄右手佩戴的裝備信息。
|
||||
左手: 記錄左手佩戴的裝備信息。
|
||||
腿部: 記錄腿部佩戴的裝備信息。
|
||||
腳部: 記錄腳部佩戴的裝備信息。
|
||||
其他: 記錄佩戴的不適用於已有部位的裝備信息。
|
||||
var SEASON_CONFIG = {
|
||||
SPRING_DAYS: 30,
|
||||
SUMMER_DAYS: 30,
|
||||
AUTUMN_DAYS: 30,
|
||||
WINTER_DAYS: 30,
|
||||
SEASON_ORDER: ['春季', '夏季', '秋季', '冬季']
|
||||
};
|
||||
|
||||
裝備操作示例_JSON_Patch:
|
||||
# 穿裝備範例:{"op":"replace","path":"/裝備/背部","value":{"大容量登山包":{"狀態類型":"耐久度","狀態":100,"重量":1.8,"負重加成":1.5,"描述":"..."}}}
|
||||
# 脫裝備範例:{"op":"replace","path":"/裝備/背部","value":{}}
|
||||
# 同伴穿裝備範例:{"op":"replace","path":"/同伴/同伴名/裝備/腳部","value":{"簡易涼鞋":{"狀態類型":"耐久度","狀態":100,"重量":0.4,"描述":"..."}}}
|
||||
var SEASON_GROWTH_BONUS = {
|
||||
'春季': 15,
|
||||
'夏季': 20,
|
||||
'秋季': 0,
|
||||
'冬季': -50
|
||||
};
|
||||
|
||||
攜帶物品: # 對象,以物品名稱為鍵,記錄角色攜帶的物品。根據<模擬規則>中的物品格式說明,新增物品格式示例:'物品名稱': { '數量': 數字, '品質': '', '狀態類型': '耐久度/新鮮度/純淨度', '狀態': 數字, '重量': 數字, '描述': '', '負重加成': 數字, '加值': { '技能': 數字 }, '功能': '' }
|
||||
說明:
|
||||
數量:物品數量
|
||||
品質:物品的品質等級
|
||||
狀態類型:耐久度/新鮮度/純淨度
|
||||
狀態:物品的當前狀態值
|
||||
重量:單個物品的重量
|
||||
加值:物品的背景加值
|
||||
容量:當物品裝載液體時包含
|
||||
負重加成:攜帶物品的容器如背包時包含
|
||||
功能:該物品的功能說明
|
||||
描述:對物品的描述
|
||||
var PREGNANCY_CONFIG = {
|
||||
STAGES: [
|
||||
{ name: '懷孕初期', maxDays: 30 },
|
||||
{ name: '懷孕中期', maxDays: 60 },
|
||||
{ name: '懷孕後期', maxDays: 90 }
|
||||
],
|
||||
AUTO_BIRTH: true
|
||||
};
|
||||
|
||||
範例:
|
||||
新增:{"op":"insert","path":"/攜帶物品/野莓","value":{"數量":3,"狀態類型":"新鮮度","狀態":100,"重量":0.05,"描述":"酸甜的野生漿果"}}
|
||||
轉移:
|
||||
1. { "op": "remove", "path": "/源位置/物品名" }
|
||||
2. { "op": "insert", "path": "/目標位置/物品名", "value": { ... } }
|
||||
var LIVESTOCK_CONFIG = {
|
||||
GROWTH_STAGES: {
|
||||
'幼年期': { minAge: 0, maxAge: 3, canBreed: false },
|
||||
'成長期': { minAge: 3, maxAge: 12, canBreed: false },
|
||||
'成年期': { minAge: 12, maxAge: 72, canBreed: true },
|
||||
'老年期': { minAge: 72, maxAge: 999, canBreed: false }
|
||||
},
|
||||
LIFESPAN: { '野雞': 60, '野山羊': 120, '馬鹿': 180, '野兔': 84 },
|
||||
SEASON_PRODUCTION_BONUS: { '春季': 10, '夏季': 5, '秋季': 0, '冬季': -20 },
|
||||
BREEDING_CONFIG: {
|
||||
BASE_BREEDING_CHANCE: 0.25,
|
||||
MIN_BREEDING_AGE: 12,
|
||||
BREEDING_COOLDOWN: { '野雞': 30, '野山羊': 45, '馬鹿': 60, '野兔': 20 },
|
||||
GENDER_RATIO: { male: 0.48, female: 0.52 }
|
||||
}
|
||||
};
|
||||
|
||||
環境: # 描述角色當前所處環境的各項參數。
|
||||
當前位置: 當前所在地點名稱。
|
||||
舒適度: 角色在當前環境下的綜合主觀感受,範圍0-100。主要受天氣、溫度、風速及營地/居所設施情況影響。50爲中性,越高越舒適,越低則越感到不適。
|
||||
季節: 當前的季節,每30天變更,影響溫度,天氣,動物行爲等。
|
||||
體感溫度: 角色皮膚感受到的攝氏溫度,受環境溫度、風速、溼度、衣物等綜合影響。
|
||||
天氣: 當前的天氣狀況,由自然環境模擬引擎自動推演。
|
||||
亮度: 當前環境的亮度,由自然環境模擬引擎根據時間和天氣自動推演。
|
||||
風速: 當前的風速狀況,由自然環境模擬引擎自動推演。
|
||||
月相: 當前的月相,由天氣引擎根據經過天數自動計算。滿月夜間亮度提升至微光(晴朗時),新月完全黑暗。
|
||||
天氣趨勢: 天氣即將發生變化的徵兆描述,由天氣引擎自動寫入。AI只讀,禁止修改。
|
||||
氣溫: 環境氣溫(°C),由自然環境模擬引擎自動維護。引擎基於季節、氣團、地理環境、天氣等因素平滑推演氣溫變化。
|
||||
|
||||
系統: # 遊戲世界的核心數據和任務信息。
|
||||
經過天數: 遊戲經過的天數
|
||||
前次天數: 紀錄上一次的天數
|
||||
當前時間: 24小時制時間,格式爲HH:MM。隨行動和時間流逝而更新。
|
||||
前次時間: 腳本自動計算
|
||||
求生點數: 玩家擁有的求生點數,用來抽取抽卡卡池,每次消耗100點
|
||||
當前存糧天數: 當前剩餘糧食可供消耗的天數(單位:天),由AI根據食物消耗和補充情況更新
|
||||
性愛結果: # 由劇情AI輸出,腳本自動讀取並清除
|
||||
角色: 同伴名稱
|
||||
完成: true/false # true=射精完成,false=中斷
|
||||
內射: true/false
|
||||
授精者: 角色名稱 # 新增:內射者的名稱,用於懷孕判定時記錄父親
|
||||
避孕措施: 無/保險套/體外射精/避孕藥/安全期/肛交
|
||||
情境: 情感推進/調教誘騙/武力強迫/被動捲入
|
||||
腳本修正狀態: 記錄腳本修正的狀態
|
||||
|
||||
商店: # 每日跨日(00:00後)刷新販售物品,每天每個類別僅有一種。
|
||||
# 類型:包含材料、工具、奇物、夥伴-技術與後勤、夥伴-戰鬥與探索、夥伴-反派與妖魅、夥伴-純愛與保護控、藥物、盲盒九個類別
|
||||
# 每個類別都是單一物件(不是陣列),格式為:{ "名稱": "文字","品階":"N/R/SR/SSR/UR", "描述": "文字", "需求點數": 數字 }
|
||||
|
||||
材料: 材料的名稱、詳細描述(包含數量與計量單位),如汽(柴)油、礦物、合金、布匹、纖維絲線等。
|
||||
工具: 非一次性使用的工具,如鐵斧、狩獵弓、便攜式瓦斯爐。
|
||||
奇物: 人類無法製造的特殊物品。描述必須列出正式出處(神話、漫畫、動漫、小說、電影等)、功能、特殊效果。
|
||||
藥物: 治療(含恢復健康、體力、解毒、淨化)、提升抗性。強化(臨時大幅強化特定效果、永久性小幅度強化屬性或能力)、毒藥、促進作物生長、特殊功效(春藥、失憶、洗腦、催眠、致幻、誠實)。
|
||||
盲盒: 可能是材料、工具、奇物、夥伴、藥物或點數盲盒,品階均為'?'。
|
||||
|
||||
夥伴-技術與後勤:
|
||||
描述: 擅長維修、建造、醫療、戰術策劃、資源管理等非戰鬥支援型角色。描述中必須明確列出其正式出處(不可用"某荒野求生漫畫"等不明確作品名稱)、求生優勢、性愛優勢,這些優勢將直接決定該角色的技能、天賦特性及費用。
|
||||
品階: 按照其稀缺性、特殊性、知名度等,綜合評定夥伴的品階高低
|
||||
分類判定標準(滿足任一即可):
|
||||
- 職業或身份為:科學家、工程師、醫生、護士、機械師、建築師、程式設計師、會計、廚師、裁縫、教師、圖書館員、策劃師等
|
||||
- 核心能力為:維修、建造、醫療、戰術策劃、資源管理、情報分析、通訊、研發、生產
|
||||
- 性格特質為:理性、謹慎、善於規劃、喜歡待在安全的後方
|
||||
- 戰鬥能力為:較弱或非主要強項(即使有戰鬥能力,也以支援為主)
|
||||
求生優勢評分側重: 專業技能的不可替代性、資源管理效率、降低團隊消耗的能力
|
||||
|
||||
夥伴-戰鬥與探索:
|
||||
描述: 擁有卓越戰鬥技巧、偵查、潛行、野地生存等前線作戰能力的角色。描述中必須明確列出其正式出處(不可用"某荒野求生漫畫"等不明確作品名稱)、求生優勢、性愛優勢,這些優勢將直接決定該角色的技能、天賦特性及費用。
|
||||
品階: 按照其稀缺性、特殊性、知名度等,綜合評定夥伴的品階高低
|
||||
分類判定標準(滿足任一即可):
|
||||
- 職業或身份為:士兵、傭兵、獵人、偵查兵、遊俠、忍者、騎士、警衛、保鏢、格鬥家、運動員等
|
||||
- 核心能力為:戰鬥技巧、武器精通、偵查潛行、野地生存、追蹤獵殺、護衛、警戒
|
||||
- 性格特質為:果斷、警覺、勇猛、行動派、習慣於危險環境
|
||||
- 戰鬥能力為:明顯擅長一對一戰鬥或小規模衝突
|
||||
求生優勢評分側重: 個人戰力強度、野外適應力、偵查與護衛效能
|
||||
|
||||
夥伴-反派與妖魅:
|
||||
描述: 具有危險氣質、邪惡陣營、或帶有神秘/非人(如妖、魔)魅力的角色。忠誠度可能需要特殊手段維繫。描述中必須明確列出其正式出處(不可用"某荒野求生漫畫"等不明確作品名稱)、求生優勢、性愛優勢,這些優勢將直接決定該角色的技能、天賦特性及費用。
|
||||
品階: 按照其稀缺性、特殊性、知名度等,綜合評定夥伴的品階高低
|
||||
分類判定標準(滿足任一即可):
|
||||
- 陣營或立場為:反派、惡役、黑道、犯罪者、叛徒、墮落者、被詛咒者
|
||||
- 種族或身份為:魔族、妖怪、鬼魂、吸血鬼、狼人、惡魔、邪神眷屬、非人存在
|
||||
- 核心能力為:詛咒、下毒、操控、欺騙、脅迫、黑市知識、禁忌力量
|
||||
- 性格特質為:邪氣、危險、神秘、傲慢、算計、充滿誘惑力、令人又愛又怕
|
||||
- 與主角的關係為:敵對立場、相互利用、或充滿張力的曖昧危險關係
|
||||
求生優勢評分側重: 非常規手段的獨特價值(如用黑市管道取得物資、用恐懼操控他人)、神秘力量的特定情境優勢
|
||||
性愛優勢評分側重: 危險誘惑、邪魅氣質、非人美感、支配/被支配的魅力
|
||||
|
||||
夥伴-純愛與保護控:
|
||||
描述: 對主角(或特定對象)有極強忠誠、保護慾、或純粹愛慕之情的角色,其驅動力來自情感連結。描述中必須明確列出其正式出處(不可用"某荒野求生漫畫"等不明確作品名稱)、求生優勢、性愛優勢,這些優勢將直接決定該角色的技能、天賦特性及費用。
|
||||
品階: 按照其稀缺性、特殊性、知名度等,綜合評定夥伴的品階高低
|
||||
分類判定標準(滿足任一即可):
|
||||
- 與主角的關係為:戀人、青梅竹馬、未婚夫妻、暗戀者、前伴侶、命中注定之人
|
||||
- 核心驅動力為:對主角的愛、保護慾、佔有慾、忠誠、奉獻
|
||||
- 性格特質為:溫柔、專情、執著、體貼、或病嬌、過度保護、跟蹤狂(極端版)
|
||||
- 行為模式為:以主角為中心行動、將主角安全置於一切之上
|
||||
求生優勢評分側重: 忠誠帶來的可靠性、保護主角的決心(危急時爆發)、情感羈絆帶來的穩定後勤支援
|
||||
性愛優勢評分側重: 純粹愛意、溫柔呵護、或強烈佔有慾帶來的情感張力與獨特魅力
|
||||
|
||||
夥伴總則(四個夥伴類別通用):
|
||||
1. 查看當前同伴列表,不得抽取同名角色
|
||||
2. 本次抽取不得與歷史紀錄中任何夥伴類別的角色出處相同,操作方式:遍歷'/系統/商店歷史/商品',出處相同即須重新抽取
|
||||
3. 角色的基礎能力應符合當前遊戲進度
|
||||
4. 如果抽到強度過高的角色,請自動降低其能力(過強角色在荒野世界會有一定弱化)
|
||||
5. 必定是明確作品中的角色,不要自創素人角色。
|
||||
6. 總需求點數 = 求生優勢 + 性愛優勢 + 知名度,三項各為100~500,知名度可為0
|
||||
|
||||
分類衝突時的歸屬優先級(若角色同時符合多個類別):
|
||||
1. 純愛與保護控 > 反派與妖魅(即使角色是反派,若對主角有明確的愛/保護/佔有動機,優先歸此類)
|
||||
2. 反派與妖魅 > 戰鬥與探索(即使角色戰鬥力很強,若帶有明顯邪氣或非人魅力,優先歸此類)
|
||||
3. 技術與後勤 > 戰鬥與探索(即使角色能打,若其核心價值為後勤支援,優先歸此類)
|
||||
|
||||
每日刷新範例(AI 執行刷新時使用):
|
||||
{"op":"replace","path":"/商店/材料","value":{"名稱":"新商品名","品階":"N/R/SR/SSR/UR","描述":"...","需求點數":100}}
|
||||
{"op":"replace","path":"/商店/夥伴-技術與後勤","value":{"名稱":"XXX","品階":"SR","描述":"出自《XXX》,求生優勢:...,性愛優勢:...","需求點數":1000}}
|
||||
|
||||
任務: # 各種類型任務的信息。
|
||||
# 格式: { "標題": "任務名稱", "描述": "任務詳細說明", "狀態": "進行中", "完成情況": {"基礎要求完成": false, "進階目標完成": false}, "結算狀態": {"基礎獎勵已發放": false, "進階獎勵已發放": false}, "區域限制": "", "開始時間": "第3天 06:00", "結束時間": "第6天 06:00", "任務要求": { "基礎要求1": { "描述": "...", "進度": 0, "目標": 1, "已完成": false }}, "進階目標": { "進階要求1": { "描述": "...", "進度": 0, "目標": 1, "已完成": false }}, "基礎獎勵": "獎勵描述", "進階獎勵": "獎勵描述" }
|
||||
主線: 當前的主線任務,引導玩家生存。有且只有一個,空值時立即生成新的任務。
|
||||
支線: 當前的支線任務,引導玩家進行各種挑戰。有且只有一個,空值時立即生成新的任務。
|
||||
日常: 當前的日常任務,每天可做一次的簡單任務,穩定的求生點數來源。只有一個。
|
||||
羈絆: 用於記錄每位同伴(寵物)的羈絆任務,有幾位同伴就有幾個。
|
||||
背德: 當前的背德任務。
|
||||
# 範例
|
||||
"背德": {
|
||||
"標題": "曖昧的界線",
|
||||
"描述": "千鶴對你的好感升級了,她開始用不同的眼光看你。但這份感情,可能傷害到和也⋯⋯",
|
||||
"狀態": "進行中",
|
||||
"完成情況": {"基礎要求完成": false, "進階目標完成": false},
|
||||
"結算狀態": {"基礎獎勵已發放": false, "進階獎勵已發放": false},
|
||||
"區域限制": "",
|
||||
"開始時間": "第5天 14:00",
|
||||
"結束時間": "第8天 14:00",
|
||||
"任務要求": { "基礎要求1": { "描述": "在千鶴向你暗示好感時,做出選擇(接受/保持距離/拖延)", "進度": 0, "目標": 1, "已完成": false }},
|
||||
"進階目標": { "進階要求1": { "描述": "處理好與和也的關係,不讓他知道(或讓他接受)這件事", "進度": 0, "目標": 1, "已完成": false }},
|
||||
"基礎獎勵": "求生點數:80,千鶴好感經驗+90",
|
||||
"進階獎勵": "劇情演出:[事件-千鶴的告白-1-未發放:千鶴在雨夜向你坦白心意]",
|
||||
"失敗懲罰": "千鶴好感技能經驗-60,和也技能經驗好感-50,團隊氣氛惡化"
|
||||
var AFFECTION_SYSTEM = {
|
||||
STAGES: {
|
||||
1: { name: '陌生', range: [1,1], 模糊地帶: false, intimacyTolerance: 0, romanticThreshold: 0 },
|
||||
2: { name: '朋友-穩定期', range: [2,2], 模糊地帶: false, intimacyTolerance: 10, romanticThreshold: 10 },
|
||||
3: { name: '朋友-親密臨界區', range: [3,3], 模糊地帶: true, intimacyTolerance: 30, romanticThreshold: 20 },
|
||||
4: { name: '摯友-深度期', range: [4,5], 模糊地帶: false, intimacyTolerance: 40, romanticThreshold: 30 },
|
||||
6: { name: '摯友-戀人臨界區', range: [6,7], 模糊地帶: true, intimacyTolerance: 65, romanticThreshold: 50 },
|
||||
8: { name: '戀人-新晉期', range: [8,8], 模糊地帶: false, intimacyTolerance: 85, romanticThreshold: 70 },
|
||||
9: { name: '戀人-穩定臨界區', range: [9,9], 模糊地帶: true, intimacyTolerance: 95, romanticThreshold: 85 },
|
||||
10: { name: '摯愛', range: [10,999], 模糊地帶: false, intimacyTolerance: 100, romanticThreshold: 100 }
|
||||
},
|
||||
getStage: function(level) {
|
||||
var l = Number(level);
|
||||
if (isNaN(l) || l < 1) return this.STAGES[1];
|
||||
for (var key in this.STAGES) {
|
||||
var stage = this.STAGES[key];
|
||||
if (l >= stage.range[0] && l <= stage.range[1]) return stage;
|
||||
}
|
||||
緊急: 當前的緊急任務,打破玩家的安逸日常,給玩家增加壓力和緊迫感。只有一個。格式與背德任務相同。
|
||||
return this.STAGES[10];
|
||||
},
|
||||
getStageName: function(level) { return this.getStage(level).name; },
|
||||
isInGrayZone: function(level) { return this.getStage(level).模糊地帶; }
|
||||
};
|
||||
|
||||
營地: # 物件,以營地名稱為鍵,記錄角色建立的營地信息。
|
||||
格式:{ "位置": "", "樣式": "", "物品": {}, "食材": {}, "醫藥": {}, "材料": {}, "牲畜": {}, "設施": {}, "奇物": {}, "武器": {} }
|
||||
說明:
|
||||
- 位置:營地的地點及地形
|
||||
- 樣式:營地包含的主要建築及型式
|
||||
- 物品/食材/醫藥/材料/牲畜/設施/奇物/武器:存放在營地的各類物品
|
||||
操作:insert(新增營地),remove + insert(物品轉入/轉出)
|
||||
|
||||
【新增營地範例】:
|
||||
1. 先建立營地空殼(確保路徑存在)
|
||||
{"op":"insert","path":"/營地/聆風丘陵營地","value":{"位置":"聆風丘陵河畔","樣式":"簡易營地","物品":{},"食材":{},"醫藥":{},"材料":{},"牲畜":{},"設施":{},"奇物":{},"武器":{}}}
|
||||
|
||||
2. 再新增物品到對應分類
|
||||
{"op":"insert","path":"/營地/聆風丘陵營地/材料/木材","value":{"數量":20,"狀態類型":"耐久度","狀態":100,"重量":2,"描述":"堅硬的河畔楓原木"}}
|
||||
|
||||
3. 或者,建立營地時直接帶入初始物品(推薦)
|
||||
{"op":"insert","path":"/營地/聆風丘陵營地","value":{"位置":"聆風丘陵河畔","樣式":"簡易營地","物品":{},"食材":{},"醫藥":{},"材料":{"木材":{"數量":20,"狀態類型":"耐久度","狀態":100,"重量":2,"描述":"..."}},"牲畜":{},"設施":{},"奇物":{},"武器":{}}}
|
||||
var SEXUAL_CONFIG = {
|
||||
CORRUPTION_STAGES: {
|
||||
0: { name: '初次被迫', minCount: 1, maxCount: 1 },
|
||||
1: { name: '重複暴露', minCount: 2, maxCount: 3 },
|
||||
2: { name: '生理轉折點', minCount: 4, maxCount: 4 },
|
||||
3: { name: '矛盾加劇', minCount: 5, maxCount: 7 },
|
||||
4: { name: '開始沉淪', minCount: 8, maxCount: 999 }
|
||||
}
|
||||
};
|
||||
|
||||
遺留物: # 頂層結構,記錄以非正常方式脫離角色身體且未立即放入庫存的裝備或物品。與攜帶物品、營地同級。格式: '遺留物名': { '位置': '', '品質': '', '狀態類型': '耐久度', '狀態': 100, '重量': 0, '描述': '' }
|
||||
位置: 遺留物當前所處的環境位置描述(如"野豬屍體旁"、"河邊石頭上"、"戰鬥現場地面")。
|
||||
品質: 遺留物的品質等級(N/R/SR/UR)。
|
||||
狀態類型: 遺留物的狀態類型(耐久度/新鮮度/純淨度等)。
|
||||
狀態: 遺留物的當前狀態值。
|
||||
重量: 遺留物的單個重量。
|
||||
描述: 對遺留物當前狀態和所處情境的描述(如"一把插在野豬屍體上的石制短矛,矛尖沾滿血跡")。
|
||||
// ======================== 工具函數 ========================
|
||||
function int(v) { return Number.isFinite(v) ? Math.round(v) : v; }
|
||||
function clamp(v, min, max) { return Math.max(min, Math.min(max, v)); }
|
||||
function v(val, def) { return Number.isFinite(val) ? val : (Number.isFinite(def) ? def : 0); }
|
||||
// ========== 🔴 新增:性愛結果格式轉換(向後兼容) ==========
|
||||
function ensureSexResultArray(vars) {
|
||||
var raw = get(vars, '系統.性愛結果');
|
||||
|
||||
// 如果是空值或 undefined,初始化為空陣列
|
||||
if (raw === undefined || raw === null) {
|
||||
set(vars, '系統.性愛結果', []);
|
||||
return [];
|
||||
}
|
||||
|
||||
// 如果已經是陣列,直接返回
|
||||
if (Array.isArray(raw)) {
|
||||
return raw;
|
||||
}
|
||||
|
||||
// 🔴 重點:如果是物件(舊格式),轉換為陣列
|
||||
if (typeof raw === 'object' && Object.keys(raw).length > 0) {
|
||||
// 檢查是否是舊格式(有 角色 字段)
|
||||
if (raw.角色) {
|
||||
var migrated = [raw];
|
||||
set(vars, '系統.性愛結果', migrated);
|
||||
keyLog('🔄 性愛結果格式轉換:物件 → 陣列(1筆記錄)');
|
||||
return migrated;
|
||||
}
|
||||
}
|
||||
|
||||
// 其他情況(空物件或異常),設為空陣列
|
||||
set(vars, '系統.性愛結果', []);
|
||||
return [];
|
||||
}
|
||||
function parseTime(str) {
|
||||
var m = /^(\d{1,2}):(\d{2})$/.exec(str);
|
||||
return m ? parseInt(m[1]) * 60 + parseInt(m[2]) : null;
|
||||
}
|
||||
|
||||
function parseFullTime(str) {
|
||||
var m = /第(\d+)天\s+(\d{1,2}):(\d{2})/.exec(str);
|
||||
if (!m) return null;
|
||||
var d = parseInt(m[1]), h = parseInt(m[2]), mm = parseInt(m[3]);
|
||||
return { day: d, hour: h, minute: mm, total: d * 1440 + h * 60 + mm };
|
||||
}
|
||||
|
||||
function getCurrentTime(vars) {
|
||||
var day = get(vars, '系統.經過天數'),
|
||||
time = get(vars, '系統.當前時間');
|
||||
if (!Number.isFinite(day) || typeof time != 'string') return null;
|
||||
var m = parseTime(time);
|
||||
return m === null ? null : {
|
||||
day: day,
|
||||
hour: Math.floor(m / 60),
|
||||
minute: m % 60,
|
||||
total: day * 1440 + m
|
||||
};
|
||||
}
|
||||
|
||||
function fixTimeFormat(vars) {
|
||||
var currentTime = get(vars, '系統.當前時間');
|
||||
if (!currentTime || typeof currentTime !== 'string') return false;
|
||||
|
||||
// 匹配字串結尾的 HH:MM 或 H:MM
|
||||
var timePattern = /(\d{1,2}):(\d{2})$/;
|
||||
var match = timePattern.exec(currentTime);
|
||||
|
||||
if (match) {
|
||||
var hour = match[1].padStart(2, '0');
|
||||
var minute = match[2];
|
||||
var formattedTime = hour + ':' + minute;
|
||||
|
||||
// 只有當原本不是純 HH:MM 格式時才修正
|
||||
if (currentTime !== formattedTime) {
|
||||
set(vars, '系統.當前時間', formattedTime);
|
||||
keyLog('⏰ 時間格式修正: "' + currentTime + '" → "' + formattedTime + '"');
|
||||
fixCount++;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
同伴: # 物件,以同伴名為鍵,記錄同伴的各種信息。
|
||||
# {
|
||||
# "淪陷": { "強制次數": 0, "當前階段": 0 },
|
||||
# "狀態": {
|
||||
# "當前狀態":"當前人物狀況的簡要說明(18個字內)",
|
||||
# "疲勞":0,
|
||||
# "清潔":0,
|
||||
# "生效效果":{},
|
||||
# },
|
||||
# "生理": {
|
||||
# "生命值上限": 100,
|
||||
# "當前生命值": 100,
|
||||
# "水分":100,
|
||||
# "飽腹感":80,
|
||||
# "排泄欲":0
|
||||
# },
|
||||
# "精神": {
|
||||
# "精神值上限": 100,
|
||||
# "當前精神值": 100,
|
||||
# "壓力":0,
|
||||
# "睡眠":100
|
||||
# },
|
||||
# "關係": "陌生人(8個字內)",
|
||||
# "屬性": { "力量": {}, "敏捷": {}, "耐力": {}, "智力": {}, "感知": {}, "意志": {} },
|
||||
# "技能": { "好感(對阿彬)": { "等級": 1, "當前經驗": 0, "升級所需經驗": 100 } },
|
||||
# "裝備": { "頭部": {}, "頸部": {}, "胸部": {}, "背部": {}, "腰部": {}, "左手": {}, "右手": {}, "腿部": {}, "腳部": {} },
|
||||
# "天賦特性": {"性愛天才": {"描述": "天生熟悉各種性愛技巧","加值":{"性愛檢定":50}}},
|
||||
# "攜帶物品": {},
|
||||
# "劇情演出": [],
|
||||
# "敏感部位": { "耳朵": {"被吹氣": "感覺耳朵的癢會傳導到下體,開始濕潤"}},
|
||||
# "基礎信息": {
|
||||
# "姓名": "",
|
||||
# "年齡": 0,
|
||||
# "身份": "",
|
||||
# "性別": "男性/女性/雙性人",
|
||||
# "外貌": {
|
||||
# "身高": 165,
|
||||
# "髮色": "黑色",
|
||||
# "髮型": "長直髮/短髮/馬尾/雙馬尾等",
|
||||
# }
|
||||
# },
|
||||
# "性經驗": {
|
||||
# "性交經驗": "無/生澀/熟練/專家/天才",
|
||||
# "口交經驗": "無/生澀/熟練/專家/天才",
|
||||
# "肛交經驗": "無/生澀/熟練/專家/天才",
|
||||
# "性幻想對象": "鄰居家的大哥哥",
|
||||
# "性行為次數": 0,
|
||||
# "性伴侶數量": 0
|
||||
# },
|
||||
# "生理狀態": {
|
||||
# "乳頭狀態": "勃起"
|
||||
# },
|
||||
# "心理狀態": { "當前所想": "" },
|
||||
# "性癖好": { "NTR": "從他人處獲得快感" },
|
||||
# "性愛人設": "從角色的人設及相關資料分析,寫出85-95字的完整性愛方面的人設",
|
||||
# "背德經歷": {"初次偷情成功": { "描述": "成功與阿彬做愛,沒讓千鶴知道"}}
|
||||
# }
|
||||
function scaleValue(oldVal, oldMax, newMax) {
|
||||
if (!Number.isFinite(oldVal) || !Number.isFinite(oldMax) || !Number.isFinite(newMax) || oldMax <= 0 || newMax <= 0) return oldVal;
|
||||
return Math.round(oldVal / oldMax * newMax);
|
||||
}
|
||||
|
||||
function calculateTimeDifference(time1, time2) {
|
||||
if (!time1 || !time2) return 0;
|
||||
var h1 = parseInt(time1.split(':')[0]), m1 = parseInt(time1.split(':')[1]);
|
||||
var h2 = parseInt(time2.split(':')[0]), m2 = parseInt(time2.split(':')[1]);
|
||||
var minutes = (h2 * 60 + m2) - (h1 * 60 + m1);
|
||||
if (minutes < 0) minutes += 1440;
|
||||
return minutes / 60;
|
||||
}
|
||||
|
||||
function isItemInvalid(item) {
|
||||
// 檢查是否為有效物件
|
||||
if (!item || typeof item !== 'object') return true;
|
||||
|
||||
// 🔴 空物件直接視為無效
|
||||
if (Object.keys(item).length === 0) return true;
|
||||
|
||||
var q = get(item, '數量'),
|
||||
s = get(item, '狀態'),
|
||||
w = get(item, '重量');
|
||||
|
||||
// 有數量欄位但數量無效
|
||||
if (q !== undefined && !(Number(q) > 0)) return true;
|
||||
|
||||
// 有狀態欄位但狀態無效
|
||||
if (s !== undefined && !(Number(s) > 0)) return true;
|
||||
|
||||
// 有重量欄位但重量無效
|
||||
if (w !== undefined && !(Number(w) > 0)) return true;
|
||||
|
||||
// 🔴 沒有任何關鍵欄位(數量、狀態、重量),視為結構異常的無效物品
|
||||
if (q === undefined && s === undefined && w === undefined) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function tempFactor(t) {
|
||||
if (t < 0) return 0.1;
|
||||
if (t < 10) return 0.3;
|
||||
if (t < 20) return 0.6;
|
||||
if (t < 30) return 1;
|
||||
if (t < 40) return 1.5;
|
||||
return 1.8;
|
||||
}
|
||||
|
||||
function updateDesc(desc, val) {
|
||||
var d = desc || '';
|
||||
var patterns = [
|
||||
new RegExp('(看起來不太新鮮的樣子)$'),
|
||||
new RegExp('(開始有些變質的跡象)$'),
|
||||
new RegExp('(明顯變質了,需要儘快處理)$'),
|
||||
new RegExp('(已經壞了,可能不適合使用)$'),
|
||||
new RegExp('(腐爛了,使用可能會有危險)$')
|
||||
];
|
||||
patterns.forEach(function(r) { if (r.test(d)) d = d.replace(r, ''); });
|
||||
d = d.trim();
|
||||
if (val >= 50) return d;
|
||||
if (val >= 40) return d + '(看起來不太新鮮的樣子)';
|
||||
if (val >= 30) return d + '(開始有些變質的跡象)';
|
||||
if (val >= 20) return d + '(明顯變質了,需要儘快處理)';
|
||||
if (val >= 10) return d + '(已經壞了,可能不適合使用)';
|
||||
return d + '(腐爛了,使用可能會有危險)';
|
||||
}
|
||||
|
||||
function checkRequirement(req) {
|
||||
if (!_.isPlainObject(req)) return req;
|
||||
if (typeof req.進度 == 'number' && typeof req.目標 == 'number') {
|
||||
if (req.進度 >= req.目標 && !req.已完成) req.已完成 = true;
|
||||
else if (req.進度 < req.目標 && req.已完成) req.已完成 = false;
|
||||
}
|
||||
return req;
|
||||
}
|
||||
|
||||
function logChange(action, detail) {
|
||||
var hash = action + ':' + detail;
|
||||
if (hash === lastLogHash) return;
|
||||
lastLogHash = hash;
|
||||
console.log('🔧 ' + action + ': ' + detail);
|
||||
}
|
||||
|
||||
function updateStatus(vars, status, msg) {
|
||||
var display;
|
||||
switch (status) {
|
||||
case 'fixed': display = '✅ 已修正'; break;
|
||||
case 'normal': display = '✅ 無需修正'; break;
|
||||
case 'skipped': display = '⏭️ 未執行'; break;
|
||||
case 'error': display = '❌ 有錯誤'; break;
|
||||
default: display = '🔄 未知';
|
||||
}
|
||||
set(vars, '系統.腳本修正狀態', display);
|
||||
console.log('📊 腳本狀態: ' + display + ' - ' + msg);
|
||||
}
|
||||
|
||||
# ========== 女性/雙性人 專屬字段(保持不變)==========
|
||||
# "身體特徵": {
|
||||
# "類型": "female / hermaphrodite",
|
||||
# "體型": "幼女型/蘿莉型/少女型/御姐型/豐滿型/肉感型/貧乳型/健美型/年長型/誘惑型",
|
||||
# "三圍": {
|
||||
# "胸圍": 0,
|
||||
# "腰圍": 0,
|
||||
# "臀圍": 0,
|
||||
# "罩杯": ""
|
||||
# },
|
||||
# "乳房": {
|
||||
# "形狀": "圓潤碗型",
|
||||
# "乳頭顏色": "粉紅色"
|
||||
# },
|
||||
# "私處": {
|
||||
# "類型": "白虎無毛/肥大陰脣/粉嫩短毛/或ai自行構想(四個字)"
|
||||
# }
|
||||
# },
|
||||
# "性經驗": {
|
||||
# "處女": "是/否"
|
||||
# },
|
||||
# "生理狀態": {
|
||||
# "陰蒂狀態": "正常",
|
||||
# "月經週期": 1-28,
|
||||
# "懷孕狀態": "未懷孕/懷孕初期/懷孕中期/懷孕後期",
|
||||
# "懷孕天數": 0,
|
||||
# "授精者": "姓名",
|
||||
# "懷孕日": 0,
|
||||
# "流產風險累積": 0,
|
||||
# "流產待處理": false # 布爾值,腳本處理完後自動設為 false,
|
||||
# "流產次數": 0,
|
||||
# "上次流產日": 0
|
||||
# }
|
||||
#
|
||||
# ========== 男性/雙性人專屬字段(保持不變)==========
|
||||
# "身體特徵": {
|
||||
# "類型": "male / hermaphrodite",
|
||||
# "陰莖": {
|
||||
# "長度": 0,
|
||||
# "粗度": 0,
|
||||
# "類型": "包含但不限於:包莖/入珠/巨大/倒鉤/粗大/紋身/短小...等,由AI自行決定",
|
||||
# }
|
||||
# },
|
||||
# "性經驗": {
|
||||
# "處男": "是/否"
|
||||
# },
|
||||
# "生理狀態": {
|
||||
# "勃起狀態": "未勃起",
|
||||
# "射精狀態": "未射精"
|
||||
# }
|
||||
// ==================== 整數化與上下限修正(獨立函數) ====================
|
||||
function applyIntegerAndBounds(vars) {
|
||||
var changed = false;
|
||||
|
||||
var allNumericPaths = [
|
||||
'生理.當前生命值', '生理.生命值上限',
|
||||
'生理.碳水', '生理.脂肪', '生理.氮平衡', '生理.蛋白質',
|
||||
'生理.維生素', '生理.水分', '生理.排泄欲', '生理.飽腹感', '生理.體溫',
|
||||
'精神.當前精神值', '精神.精神值上限',
|
||||
'精神.壓力', '精神.無聊', '精神.孤獨', '精神.睡眠', '精神.性慾',
|
||||
'狀態.表皮溼度', '狀態.疲勞', '狀態.清潔', '狀態.免疫力',
|
||||
'生理.免疫負荷', '狀態.當前負重', '狀態.負重上限',
|
||||
'狀態.疼痛', '狀態.感染',
|
||||
'系統.求生點數', '系統.奇蹟點數', '系統.經過天數'
|
||||
];
|
||||
|
||||
function toInt(value, allowDecimal) {
|
||||
if (!Number.isFinite(value)) return value;
|
||||
if (allowDecimal === 'temp') return Math.round(value * 10) / 10;
|
||||
if (allowDecimal === 'immune') return Math.round(value); // 免疫負荷直接四捨五入
|
||||
return Math.round(value);
|
||||
}
|
||||
|
||||
allNumericPaths.forEach(function(p) {
|
||||
var val = get(vars, p);
|
||||
if (typeof val === 'number' && Number.isFinite(val)) {
|
||||
var allowDecimal = (p === '生理.體溫') ? 'temp' : false;
|
||||
var newVal = toInt(val, allowDecimal);
|
||||
if (newVal !== val) {
|
||||
set(vars, p, newVal);
|
||||
logChange('整數化', p + ': ' + val + ' → ' + newVal);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 同伴整數化
|
||||
var companions = get(vars, '同伴');
|
||||
if (_.isPlainObject(companions)) {
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var compPaths = [
|
||||
'同伴.' + name + '.生理.水分',
|
||||
'同伴.' + name + '.生理.飽腹感',
|
||||
'同伴.' + name + '.生理.排泄欲',
|
||||
'同伴.' + name + '.精神.壓力',
|
||||
'同伴.' + name + '.精神.睡眠',
|
||||
'同伴.' + name + '.狀態.疲勞',
|
||||
'同伴.' + name + '.狀態.清潔',
|
||||
'同伴.' + name + '.生理.當前生命值',
|
||||
'同伴.' + name + '.精神.當前精神值'
|
||||
];
|
||||
compPaths.forEach(function(p) {
|
||||
var val = get(vars, p);
|
||||
if (typeof val === 'number' && Number.isFinite(val)) {
|
||||
var newVal = Math.round(val);
|
||||
if (newVal !== val) {
|
||||
set(vars, p, newVal);
|
||||
logChange('同伴整數化', p + ': ' + val + ' → ' + newVal);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 🔴 強制修正主角脂肪(新增)
|
||||
var finalFat = get(vars, '生理.脂肪');
|
||||
if (typeof finalFat === 'number' && !Number.isInteger(finalFat)) {
|
||||
keyLog('⚠️ 警告:整數化後生理.脂肪 仍然是 ' + finalFat);
|
||||
set(vars, '生理.脂肪', Math.round(finalFat));
|
||||
keyLog('🔧 強制修正生理.脂肪: ' + finalFat + ' → ' + Math.round(finalFat));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
// 同時也強制修正其他常見有小數的欄位
|
||||
var finalNitrogen = get(vars, '生理.氮平衡');
|
||||
if (typeof finalNitrogen === 'number' && !Number.isInteger(finalNitrogen)) {
|
||||
set(vars, '生理.氮平衡', Math.round(finalNitrogen));
|
||||
keyLog('🔧 強制修正生理.氮平衡: ' + finalNitrogen + ' → ' + Math.round(finalNitrogen));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var finalVitamin = get(vars, '生理.維生素');
|
||||
if (typeof finalVitamin === 'number' && !Number.isInteger(finalVitamin)) {
|
||||
set(vars, '生理.維生素', Math.round(finalVitamin));
|
||||
keyLog('🔧 強制修正生理.維生素: ' + finalVitamin + ' → ' + Math.round(finalVitamin));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var finalExcretion = get(vars, '生理.排泄欲');
|
||||
if (typeof finalExcretion === 'number' && !Number.isInteger(finalExcretion)) {
|
||||
set(vars, '生理.排泄欲', Math.round(finalExcretion));
|
||||
keyLog('🔧 強制修正生理.排泄欲: ' + finalExcretion + ' → ' + Math.round(finalExcretion));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var finalFullness = get(vars, '生理.飽腹感');
|
||||
if (typeof finalFullness === 'number' && !Number.isInteger(finalFullness)) {
|
||||
set(vars, '生理.飽腹感', Math.round(finalFullness));
|
||||
keyLog('🔧 強制修正生理.飽腹感: ' + finalFullness + ' → ' + Math.round(finalFullness));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var finalSleep = get(vars, '精神.睡眠');
|
||||
if (typeof finalSleep === 'number' && !Number.isInteger(finalSleep)) {
|
||||
set(vars, '精神.睡眠', Math.round(finalSleep));
|
||||
keyLog('🔧 強制修正精神.睡眠: ' + finalSleep + ' → ' + Math.round(finalSleep));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var finalFatigue = get(vars, '狀態.疲勞');
|
||||
if (typeof finalFatigue === 'number' && !Number.isInteger(finalFatigue)) {
|
||||
set(vars, '狀態.疲勞', Math.round(finalFatigue));
|
||||
keyLog('🔧 強制修正狀態.疲勞: ' + finalFatigue + ' → ' + Math.round(finalFatigue));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
keyLog('🔧 整數化完成,共修正 ' + fixCount + ' 處');
|
||||
} else {
|
||||
keyLog('🔧 整數化執行完畢,無需修正');
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
子嗣: # 對象,一個可擴展的對象,以子嗣名爲鍵,記錄同伴所生的子女信息。新增子嗣格式: '子嗣名': { '性別': '男'|'女', '母親': '', '父親': '玩家名', '出生日期': 第X天, '年齡階段': '新生兒', '成長天數': 0, '核心狀態': {}, '生理': {}, '狀態': '', '屬性': {}, '技能': {}, '天賦特性': {}, '關係': {}, '依戀度': {} }
|
||||
性別: 子嗣的性別,'男'或'女'。
|
||||
母親: 子嗣的母親,對應同伴名。
|
||||
父親: 子嗣的父親,固定爲'玩家'。
|
||||
出生日期: 子嗣出生的遊戲天數。
|
||||
年齡階段: 當前所處的成長階段,'新生兒'、'嬰兒'、'幼兒'、'兒童'、'少年'、'成年'。會根據成長天數自動晉升。
|
||||
成長天數: 當前年齡階段內已度過的累計天數。每天自動累加。當年齡階段達到'成年'且成長天數達到上限時,子嗣將從本結構中移除,並作爲標準同伴插入到同伴結構中,保留屬性、技能、天賦特性,並將依戀度轉換爲對父母的初始好感度。
|
||||
// ==================== 擴充輔助函數 ====================
|
||||
function rollDice(formula) {
|
||||
if (!formula || typeof formula !== 'string') return 0;
|
||||
var m = formula.match(/^(\d+)d(\d+)$/);
|
||||
if (!m) { var n = parseInt(formula); return isNaN(n) ? 0 : n; }
|
||||
var count = parseInt(m[1]), sides = parseInt(m[2]);
|
||||
if (count <= 0 || sides <= 0) return 0;
|
||||
var total = 0;
|
||||
for (var i = 0; i < count; i++) total += Math.floor(Math.random() * sides) + 1;
|
||||
return total;
|
||||
}
|
||||
|
||||
核心狀態: 子嗣最基礎的生存指標。
|
||||
生命值上限: 初始值由遺傳規則決定,隨年齡階段成長。
|
||||
當前生命值: 範圍0-生命值上限。降至0則子嗣死亡。
|
||||
精神值上限: 初始值由遺傳規則決定,隨年齡階段成長。
|
||||
當前精神值: 範圍0-精神值上限。降至0則子嗣精神崩潰。
|
||||
function generateRandomGender() {
|
||||
return Math.random() < LIVESTOCK_CONFIG.BREEDING_CONFIG.GENDER_RATIO.male ? '雄性' : '雌性';
|
||||
}
|
||||
|
||||
生理: 反映子嗣身體內部具體生理需求的數值。
|
||||
飽腹感: 範圍0-100,消耗速度因年齡階段而異(新生兒極快)。
|
||||
水分: 範圍0-100。
|
||||
function getAffectionStageForSex(level) {
|
||||
var stage = AFFECTION_SYSTEM.getStage(level);
|
||||
var map = {
|
||||
'陌生': '初階期',
|
||||
'朋友-穩定期': '初階期',
|
||||
'朋友-親密臨界區': '初階期',
|
||||
'摯友-深度期': '中階期',
|
||||
'摯友-戀人臨界區': '中階期',
|
||||
'戀人-新晉期': '高階期',
|
||||
'戀人-穩定臨界區': '高階期',
|
||||
'摯愛': '頂階頂'
|
||||
};
|
||||
return map[stage.name] || '初階期';
|
||||
}
|
||||
|
||||
狀態: 反映子嗣當前的身體和情緒狀態,基於核心狀態、生理和年齡階段動態生成(20字內)描述,如“飢餓哭鬧”、“滿足安睡”、“活潑好動”。
|
||||
屬性: 包含力量、敏捷、耐力、智力、感知、意志六大屬性,初始在出生時根據父母屬性等級及遺傳規則設定。結構和機制與同伴屬性一致。
|
||||
技能: 幼兒期開始可學習技能,結構和機制與同伴技能一致。新生兒和嬰兒期爲空。
|
||||
天賦特性: 出生時基於父母天賦隨機繼承或產生新天賦。結構和機制與同伴天賦特性一致。
|
||||
關係: 記錄與父母的關係,固定包含母親和父親兩個字段。
|
||||
依戀度: 替代好感度的親子紐帶系統,衡量子嗣對照顧者的依賴和信任程度。
|
||||
母親: 範圍0-100,初始較高。通過照料互動提升或下降。
|
||||
父親: 範圍0-100,初始較低,需通過照料來提升。當子嗣成長爲成年後轉爲正式同伴時,依戀度將轉換爲對父母的初始好感度。
|
||||
function getSeasonGrowthBonus(season) {
|
||||
return SEASON_GROWTH_BONUS[season] || 0;
|
||||
}
|
||||
|
||||
# 成年轉換規則:當子嗣年齡階段達到“成年”時,將觸發成年禮。然後將其從子嗣結構中移除,並作爲標準同伴插入到同伴結構中,保留屬性、技能、天賦特性,並將依戀度轉換爲好感度。
|
||||
function extractCropBonusFromObject(obj) {
|
||||
if (!obj || typeof obj !== 'object') return 0;
|
||||
var bonus = Number(obj['作物加成']);
|
||||
return (!isNaN(bonus) && bonus > 0) ? bonus : 0;
|
||||
}
|
||||
|
||||
寵物: # 物件,以寵物名為鍵,記錄寵物的各種信息。
|
||||
格式:{
|
||||
"背景": "草原中的馬王",
|
||||
"狀態": "健康",
|
||||
"騎乘": "true",
|
||||
"速度加成": 2, #縮短移動時間倍速
|
||||
"屬性": {},
|
||||
"技能": { "好感(對主角)": { "等級": 1, "當前經驗": 0, "升級所需經驗": 100 } },
|
||||
"天賦特性": {},
|
||||
"攜帶物品": {},
|
||||
"劇情演出": []
|
||||
}
|
||||
說明:機制和格式參考同伴,但不包含健康度、水分值、飽腹感、排泄欲、淪陷、裝備、敏感部位、服裝、性經驗、生理狀態、心理狀態、性癖好、性愛人設、重要經歷、罪惡感。
|
||||
範例:`{"op":"insert","path":"/寵物/小白","value":{"狀態":"健康","騎乘":true,"速度加成":2,"屬性":{"力量":{"等級":15}},"技能":{"狩獵":{"等級":2}},"天賦特性":{},"劇情演出":[]}}`
|
||||
function extractCropBonusFromCarriedItems(items) {
|
||||
if (!_.isPlainObject(items)) return 0;
|
||||
var total = 0;
|
||||
for (var name in items) {
|
||||
if (name.startsWith('$')) continue;
|
||||
total += extractCropBonusFromObject(items[name]);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
作物: # 物件,以作物名為鍵,記錄所有種植的作物信息。
|
||||
播種數量:種植的數量
|
||||
品質:普通/優良/稀有
|
||||
種植日期:種植時的當前天數
|
||||
成長週期:需要幾天成長
|
||||
收成日期:種植日期 + 成長週期
|
||||
生長階段:幼苗期0-29%、生長期30-59%、熟成期60-99%、可收割100%
|
||||
harvestAction:REMOVE(收成後移除)或 RESET(收成後重置)
|
||||
格式:`{"播種數量": 數字, "品質": "普通/優良/稀有", "種植日期": 數字, "成長週期": 數字, "收成日期": 數字,"生長階段": "幼苗期/生長期/熟成期/可收割","harvestAction": "REMOVE/RESET"}`
|
||||
範例:`{"op":"insert","path":"/作物/小麥","value":{"播種數量":10,"品質":"普通","種植日期":5,"成長週期":10,"收成日期":15,"生長階段":"幼苗期","harvestAction":"REMOVE"}}`
|
||||
function calculateActualGrowthDays(vars, cropName, baseDays) {
|
||||
var totalBonus = 0;
|
||||
var season = get(vars, '環境.季節');
|
||||
totalBonus += getSeasonGrowthBonus(season);
|
||||
|
||||
var crops = get(vars, '作物');
|
||||
if (_.isPlainObject(crops)) {
|
||||
for (var name in crops) {
|
||||
if (name.startsWith('$') || name === cropName) continue;
|
||||
totalBonus += extractCropBonusFromObject(crops[name]);
|
||||
}
|
||||
}
|
||||
|
||||
var companions = get(vars, '同伴');
|
||||
if (_.isPlainObject(companions)) {
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
totalBonus += extractCropBonusFromCarriedItems(get(companions[name], '攜帶物品'));
|
||||
}
|
||||
}
|
||||
|
||||
if (totalBonus <= 0) return baseDays;
|
||||
if (totalBonus <= 50) return Math.max(1, baseDays - Math.floor(baseDays * (totalBonus / 100)));
|
||||
return Math.max(1, Math.floor(baseDays / (1 + totalBonus / 100)));
|
||||
}
|
||||
|
||||
畜牧: # 物件,以牲畜名為鍵,記錄所有飼養的牲畜信息。
|
||||
年齡:以月為單位
|
||||
飼養數量:區分雄性、雌性
|
||||
飼養開始日:飼養時的當前天數
|
||||
產出物:產出的物資,產量格式如"1d2"
|
||||
格式:{ "年齡": 數字, "飼養數量": { "雄性": 數字, "雌性": 數字 }, "生長階段": "幼年期/成長期/成年期/老年期", "產出物": { "名稱": "", "週期": 數字, "下次產出日": 數字, "產量": "" }, "飼養開始日": 數字}
|
||||
# 範例:`{"op":"insert","path":"/畜牧/雞","value":{"年齡":3,"飼養數量":{"雄性":1,"雌性":5},"生長階段":"成年期","產出物":{"名稱":"雞蛋","週期":3,"下次產出日":6,"產量":"1d2"},"飼養開始日":5}}`
|
||||
# 更新產出:{"op":"replace","path":"/畜牧/雞/產出物/下次產出日","value":7}
|
||||
function calculateGrowthStage(cropData, currentDay, actualDays) {
|
||||
var planted = v(cropData.種植日期, 0);
|
||||
var growthCycle = v(cropData.成長週期, 0);
|
||||
var hasBonus = extractCropBonusFromObject(cropData) > 0;
|
||||
if (growthCycle < 0 || hasBonus) return '特殊作物';
|
||||
var progress = Math.min(100, Math.round(((currentDay - planted) / actualDays) * 100));
|
||||
if (progress < 30) return '幼苗期';
|
||||
if (progress < 60) return '生長期';
|
||||
if (progress < 100) return '熟成期';
|
||||
return '可收割';
|
||||
}
|
||||
|
||||
捷徑或大型裝置: # 物件,以裝置名為鍵,記錄玩家建造的大型設施、道路、大型陷阱等。格式: '裝置名': {'位置':'地點', '狀態類型': '耐久度', '狀態': 100, '功能':'功能說明', '描述':'物品描述'}
|
||||
位置: 捷徑/裝置所在的地點。
|
||||
狀態類型: 物品狀態類型(如'耐久度')。
|
||||
狀態: 物品的當前狀態值。
|
||||
功能: 該物品的功能說明。
|
||||
描述: 對物品的描述。
|
||||
function calculateLivestockGrowthStage(data) {
|
||||
var age = v(data.年齡, 12);
|
||||
age = Math.max(12, age);
|
||||
for (var stage in LIVESTOCK_CONFIG.GROWTH_STAGES) {
|
||||
var cfg = LIVESTOCK_CONFIG.GROWTH_STAGES[stage];
|
||||
if (age >= cfg.minAge && age < cfg.maxAge) return stage;
|
||||
}
|
||||
return '成年期';
|
||||
}
|
||||
|
||||
項目: # 對象,一個可擴展的對象,以項目名爲鍵,記錄所有正在進行中的持續性活動。格式: '項目名': { 字段由AI根據項目性質自由決定 }
|
||||
【核心字段】
|
||||
位置: 項目進行的地點。
|
||||
類別: 項目的大類,用於快速識別。可選值:建造 / 大型製作 / 採集開採 / 馴養 / 拆解 / 教學。不設枚舉,可根據實際情況自行描述。
|
||||
狀態: 項目的當前狀態。可選值:進行中 / 待檢查
|
||||
當前進度: 已累計的進度值。達到總進度時項目完工。
|
||||
總進度: 完成所需的總進度值。根據項目規模和複雜度設定。簡單50~80,中等100~150,大型200+。
|
||||
描述: 用自然語言描述項目的當前外觀和進展。每次更新進度時同步更新描述。
|
||||
所需材料: 記錄材料名、需投入的總數量和已投入數量。格式: { '材料名': { '所需': 數量, '已消耗': 數量 }, ... }。材料必須從庫存實際扣除後才能更新已投入數量。
|
||||
項目產出: 記錄項目完成後將生成的產物,用自然語言描述產物名稱和基本特徵。生成產物時遵循已有的物品/設施/技能生成規則。如"一座簡易的木結構小屋,約三米見方"。
|
||||
function calculateActualProductionCycle(vars, animalName, baseCycle) {
|
||||
var totalBonus = 0;
|
||||
var season = get(vars, '環境.季節');
|
||||
totalBonus += LIVESTOCK_CONFIG.SEASON_PRODUCTION_BONUS[season] || 0;
|
||||
|
||||
var facilities = get(vars, '營地.設施');
|
||||
if (_.isPlainObject(facilities)) {
|
||||
for (var name in facilities) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var bonus = Number(facilities[name].畜牧加成);
|
||||
if (!isNaN(bonus) && bonus > 0) totalBonus += bonus;
|
||||
}
|
||||
}
|
||||
|
||||
if (totalBonus <= 0) return baseCycle;
|
||||
var reduction = Math.min(totalBonus / 100, 0.5);
|
||||
return Math.max(1, Math.floor(baseCycle * (1 - reduction)));
|
||||
}
|
||||
|
||||
【適用活動類型】
|
||||
以下持續性活動適合使用項目系統追蹤進度,不生成中間產物。包含但不限於:
|
||||
- 建造:房屋、圍牆、橋樑等
|
||||
- 大型製作:船隻、複雜器械等(小型一次性製作如削木矛不需要創建項目)
|
||||
- 採集/開採:大規模砍伐、挖礦等(日常採摘不需要)
|
||||
- 馴養:馴服野生動物
|
||||
- 拆解:拆除廢墟、拆解廢棄設施獲取材料
|
||||
- 教學:教同伴或子嗣某項技能
|
||||
// ==================== 作物與畜牧保護系統 ====================
|
||||
var PROTECTED_CROP_HARVEST_ACTIONS = ['RESET'];
|
||||
var CROP_REQUIRED_FIELDS = ['種植日期', '收成日期', '生長階段', '成長週期'];
|
||||
|
||||
範例: { "op": "insert", "path": "/項目/瞭望塔地基", "value": { "位置": "楓葉潭營地", "類別": "建造", "當前進度": 0, "總進度": 120, "所需材料": { "硬木": { "所需": 20, "已消耗": 0 }, "石子": { "所需": 30, "已消耗": 0 }}, "項目產出": "一座簡易的木石結構瞭望塔地基,高約一米。", "描述": "一片經過平整的土地,四周堆放著準備用於建造的硬木和石子。" }}
|
||||
function isSustainableCrop(cropData) {
|
||||
return cropData && cropData.harvestAction &&
|
||||
PROTECTED_CROP_HARVEST_ACTIONS.indexOf(cropData.harvestAction) !== -1;
|
||||
}
|
||||
|
||||
【生命週期】
|
||||
創建 → 推進進度(消耗材料、更新描述)→ 完工(生成最終產物,刪除該項目條目)。
|
||||
最終檢查:
|
||||
- 觸發條件:當前進度 = 100% 且 狀態 = 待檢查
|
||||
- 判定成功:完工,生成產物,刪除項目
|
||||
- 判定失敗:進度維持100%,狀態保持待檢查,描述缺陷
|
||||
完工後必須從項目對象中移除
|
||||
function fixCropData(vars, cropName, cropData, currentDay) {
|
||||
var changed = false;
|
||||
var growthCycle = cropData.成長週期 || 30;
|
||||
var fixedData = {};
|
||||
|
||||
for (var i = 0; i < CROP_REQUIRED_FIELDS.length; i++) {
|
||||
var field = CROP_REQUIRED_FIELDS[i];
|
||||
var value = cropData[field];
|
||||
if (value === undefined || value === null) {
|
||||
switch(field) {
|
||||
case '種植日期':
|
||||
fixedData[field] = currentDay;
|
||||
logChange('作物修復', cropName + ' 種植日期設為 ' + currentDay);
|
||||
break;
|
||||
case '收成日期':
|
||||
fixedData[field] = currentDay + growthCycle;
|
||||
logChange('作物修復', cropName + ' 收成日期設為 ' + (currentDay + growthCycle));
|
||||
break;
|
||||
case '生長階段':
|
||||
fixedData[field] = '幼苗期';
|
||||
logChange('作物修復', cropName + ' 生長階段設為 幼苗期');
|
||||
break;
|
||||
case '成長週期':
|
||||
fixedData[field] = growthCycle;
|
||||
logChange('作物修復', cropName + ' 成長週期設為 ' + growthCycle);
|
||||
break;
|
||||
}
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cropData.harvestAction || PROTECTED_CROP_HARVEST_ACTIONS.indexOf(cropData.harvestAction) === -1) {
|
||||
if (isSustainableCrop(cropData) || cropData.harvestAction === 'RESET') {
|
||||
fixedData.harvestAction = 'RESET';
|
||||
logChange('作物修復', cropName + ' harvestAction 設為 RESET');
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
for (var key in fixedData) {
|
||||
set(vars, '作物.' + cropName + '.' + key, fixedData[key]);
|
||||
}
|
||||
fixCount++;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
研究: # 對象,記錄所有正在進行中的研究項目。格式: '研究': { '類別': { '進行中': {'當前進度':0,'總進度':150,'描述':'...'} } }
|
||||
類別: 根據研究性質自行判斷,可參考以下分類:
|
||||
- '生存科技':工具製作、建築技術、食物加工保存等
|
||||
- '自然學識':植物辨識、動物習性、地理氣象、藥用提取等
|
||||
- '神祕學':龍族相關、魔法物品、古老符文、靈體感應等
|
||||
進行中: 對象,以研究項名爲鍵,記錄正在進行的項目。
|
||||
當前進度: 已累計的進度值。達到總進度時研究完成。
|
||||
總進度: 完成所需的總進度值。根據研究複雜度和現象深度設定。簡單50~80,中等100~150,高深研究150+。
|
||||
描述: 用自然語言描述當前的研究狀態、發現和瓶頸。每次推進時更新。當研究有突破性進展或深化時,可以在此描述中累積記錄,而不是新建條目。
|
||||
function checkAndRestoreSustainableCrops(vars, oldVars) {
|
||||
if (!oldVars) return false;
|
||||
var changed = false;
|
||||
var oldCrops = get(oldVars, '作物') || {};
|
||||
var currentCrops = get(vars, '作物') || {};
|
||||
var currentDay = v(get(vars, '系統.經過天數'), 0);
|
||||
|
||||
for (var name in oldCrops) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var oldCrop = oldCrops[name];
|
||||
if (isSustainableCrop(oldCrop) && !currentCrops[name]) {
|
||||
keyLog('🌱 檢測到永續作物被刪除: ' + name + ',正在恢復...');
|
||||
var growthCycle = oldCrop.成長週期 || 30;
|
||||
var restored = {
|
||||
種植日期: currentDay,
|
||||
收成日期: currentDay + growthCycle,
|
||||
生長階段: '幼苗期',
|
||||
harvestAction: 'RESET',
|
||||
成長週期: growthCycle,
|
||||
收穫次數: (oldCrop.收穫次數 || 0) + 1
|
||||
};
|
||||
set(vars, '作物.' + name, restored);
|
||||
logChange('作物恢復', name + ' 已恢復,收成次數 +1');
|
||||
changed = true;
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
function verifyAndFixAllCrops(vars) {
|
||||
var changed = false;
|
||||
var crops = get(vars, '作物');
|
||||
if (!_.isPlainObject(crops)) return false;
|
||||
var currentDay = v(get(vars, '系統.經過天數'), 0);
|
||||
|
||||
for (var name in crops) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var crop = crops[name];
|
||||
if (!_.isPlainObject(crop)) continue;
|
||||
if (fixCropData(vars, name, crop, currentDay)) changed = true;
|
||||
if (crop.種植日期 && crop.收成日期 && crop.種植日期 > crop.收成日期) {
|
||||
var growthCycle = crop.成長週期 || 30;
|
||||
var newHarvest = crop.種植日期 + growthCycle;
|
||||
set(vars, '作物.' + name + '.收成日期', newHarvest);
|
||||
logChange('作物修復', name + ' 收成日期已修正 ' + crop.收成日期 + ' → ' + newHarvest);
|
||||
changed = true;
|
||||
fixCount++;
|
||||
}
|
||||
if (crop.種植日期 > currentDay) {
|
||||
set(vars, '作物.' + name + '.種植日期', currentDay);
|
||||
logChange('作物修復', name + ' 種植日期不能大於當前天數,設為 ' + currentDay);
|
||||
changed = true;
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
if (changed) debugLog('作物驗證修復完成');
|
||||
return changed;
|
||||
}
|
||||
|
||||
var LIVESTOCK_REQUIRED_FIELDS = ['年齡', '飼養數量', '生長階段', '飼養開始日'];
|
||||
|
||||
function fixLivestockData(vars, animalName, animalData, currentDay) {
|
||||
var changed = false;
|
||||
for (var i = 0; i < LIVESTOCK_REQUIRED_FIELDS.length; i++) {
|
||||
var field = LIVESTOCK_REQUIRED_FIELDS[i];
|
||||
var value = animalData[field];
|
||||
if (value === undefined || value === null) {
|
||||
switch(field) {
|
||||
case '年齡':
|
||||
set(vars, '畜牧.' + animalName + '.年齡', 12);
|
||||
logChange('畜牧修復', animalName + ' 年齡設為 12');
|
||||
changed = true;
|
||||
break;
|
||||
case '飼養數量':
|
||||
set(vars, '畜牧.' + animalName + '.飼養數量', { 雄性: 1, 雌性: 1 });
|
||||
logChange('畜牧修復', animalName + ' 飼養數量設為 雄:1, 雌:1');
|
||||
changed = true;
|
||||
break;
|
||||
case '生長階段':
|
||||
set(vars, '畜牧.' + animalName + '.生長階段', '成年期');
|
||||
logChange('畜牧修復', animalName + ' 生長階段設為 成年期');
|
||||
changed = true;
|
||||
break;
|
||||
case '飼養開始日':
|
||||
set(vars, '畜牧.' + animalName + '.飼養開始日', currentDay - 12);
|
||||
logChange('畜牧修復', animalName + ' 飼養開始日設為 ' + (currentDay - 12));
|
||||
changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var livestock = get(vars, '畜牧');
|
||||
var animal = livestock[animalName];
|
||||
if (animal && animal.飼養數量) {
|
||||
var males = v(animal.飼養數量.雄性, 0);
|
||||
var females = v(animal.飼養數量.雌性, 0);
|
||||
if (males < 0 || females < 0) {
|
||||
set(vars, '畜牧.' + animalName + '.飼養數量.雄性', Math.max(0, males));
|
||||
set(vars, '畜牧.' + animalName + '.飼養數量.雌性', Math.max(0, females));
|
||||
logChange('畜牧修復', animalName + ' 數量修正為非負值 雄:' + Math.max(0, males) + ', 雌:' + Math.max(0, females));
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
var startDay = v(animalData.飼養開始日, currentDay - 12);
|
||||
if (startDay > currentDay) {
|
||||
set(vars, '畜牧.' + animalName + '.飼養開始日', currentDay - 12);
|
||||
logChange('畜牧修復', animalName + ' 飼養開始日修正 ' + startDay + ' → ' + (currentDay - 12));
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var calculatedAge = Math.max(12, 12 + Math.floor((currentDay - startDay) / 30));
|
||||
var currentAge = v(animalData.年齡, calculatedAge);
|
||||
if (Math.abs(currentAge - calculatedAge) > 6) {
|
||||
set(vars, '畜牧.' + animalName + '.年齡', calculatedAge);
|
||||
logChange('畜牧修復', animalName + ' 年齡修正 ' + currentAge + ' → ' + calculatedAge);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var expectedStage = calculateLivestockGrowthStage({ 年齡: calculatedAge });
|
||||
var currentStage = animalData.生長階段;
|
||||
if (currentStage && expectedStage && currentStage !== expectedStage) {
|
||||
set(vars, '畜牧.' + animalName + '.生長階段', expectedStage);
|
||||
logChange('畜牧修復', animalName + ' 生長階段修正 ' + currentStage + ' → ' + expectedStage);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (animalData.產出物 && animalData.產出物.週期) {
|
||||
var cycle = v(animalData.產出物.週期, 7);
|
||||
if (cycle <= 0) {
|
||||
set(vars, '畜牧.' + animalName + '.產出物.週期', 7);
|
||||
logChange('畜牧修復', animalName + ' 產出週期修正為 7');
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) fixCount++;
|
||||
return changed;
|
||||
}
|
||||
|
||||
function verifyAndFixAllLivestock(vars) {
|
||||
var changed = false;
|
||||
var livestock = get(vars, '畜牧');
|
||||
if (!_.isPlainObject(livestock)) return false;
|
||||
var currentDay = v(get(vars, '系統.經過天數'), 0);
|
||||
for (var name in livestock) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var animal = livestock[name];
|
||||
if (!_.isPlainObject(animal)) continue;
|
||||
if (fixLivestockData(vars, name, animal, currentDay)) changed = true;
|
||||
}
|
||||
if (changed) debugLog('畜牧驗證修復完成');
|
||||
return changed;
|
||||
}
|
||||
|
||||
// ==================== 新生兒生成系統(修改版:放在子嗣下) ====================
|
||||
function generateNewborn(vars, motherName, motherPath) {
|
||||
var litter = 1;
|
||||
var dice = Math.floor(Math.random() * 100) + 1;
|
||||
if (dice <= 10) {
|
||||
litter = 2;
|
||||
keyLog('👶👶 驚喜!' + motherName + ' 生下了雙胞胎!');
|
||||
} else {
|
||||
keyLog('👶 ' + motherName + ' 生下了1個寶寶');
|
||||
}
|
||||
|
||||
// ✅ 修改:使用「子嗣」而非「同伴」
|
||||
var children = get(vars, '子嗣');
|
||||
if (!_.isPlainObject(children)) {
|
||||
children = {};
|
||||
set(vars, '子嗣', children);
|
||||
}
|
||||
|
||||
var birthCount = get(vars, motherPath + '.生育次數') || 0;
|
||||
set(vars, motherPath + '.生育次數', birthCount + litter);
|
||||
|
||||
for (var i = 0; i < litter; i++) {
|
||||
var gender = Math.random() < 0.5 ? '女' : '男';
|
||||
|
||||
// 計算現有子女數量(只計算同一個母親的孩子)
|
||||
var existingChildren = 0;
|
||||
for (var name in children) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var data = children[name];
|
||||
if (data && data.母親 === motherName) existingChildren++;
|
||||
}
|
||||
var childNumber = existingChildren + i + 1;
|
||||
var childName = motherName + '的孩子' + childNumber;
|
||||
|
||||
var finalName = childName;
|
||||
var counter = 1;
|
||||
while (children[finalName]) finalName = childName + '_' + counter++;
|
||||
|
||||
var newborn = {
|
||||
人物背景: motherName + ' 的孩子',
|
||||
健康度: 80,
|
||||
水分值: 100,
|
||||
飽腹感: 100,
|
||||
疲勞度: 0,
|
||||
排泄欲: 0,
|
||||
狀態: '新生兒',
|
||||
關係: '子女',
|
||||
屬性: {},
|
||||
技能: {},
|
||||
天賦特性: {},
|
||||
裝備: {
|
||||
頭部: {}, 頸部: {}, 胸部: {}, 其他: {}, 背部: {},
|
||||
左手: {}, 右手: {}, 腰部: {}, 腿部: {}, 腳部: {}
|
||||
},
|
||||
攜帶物品: {},
|
||||
劇情演出: [],
|
||||
敏感部位: {},
|
||||
淪陷: { 強制次數: 0, 當前階段: 0, 抵抗值: 100, 順從值: 0 },
|
||||
心理狀態: { 當前所想: '' },
|
||||
性癖好: [],
|
||||
性愛人設: '',
|
||||
重要經歷: {},
|
||||
罪惡感: {},
|
||||
生育次數: 0,
|
||||
母親: motherName,
|
||||
父親: get(vars, motherPath + '.生理狀態.授精者') || '未知' // ✅ 新增:記錄父親
|
||||
};
|
||||
|
||||
if (gender === '女') {
|
||||
newborn.服裝 = { 上衣: '', 下裝: '', 內衣: '', 內褲: '', 鞋子: '', 絲襪: '' };
|
||||
newborn.身體特徵 = { 類型: 'female', 體型: '嬰兒型', 三圍: {}, 乳房: {}, 私處: {} };
|
||||
newborn.性經驗 = { 性交經驗: '無', 口交經驗: '無', 肛交經驗: '無', 性行為次數: 0, 性伴侶數量: 0, 處女: '是' };
|
||||
newborn.生理狀態 = { 陰蒂狀態: '正常', 子宮狀態: '正常', 月經週期: 1, 懷孕狀態: '未懷孕', 懷孕天數: 0 };
|
||||
newborn.性別 = '女';
|
||||
} else {
|
||||
newborn.服裝 = { 上衣: '', 下裝: '', 內衣: '', 內褲: '', 鞋子: '', 襪子: '' };
|
||||
newborn.身體特徵 = { 類型: 'male', 陰莖: { 長度: 0, 粗度: 0, 類型: '', 充血程度: '' } };
|
||||
newborn.性經驗 = { 性交經驗: '無', 口交經驗: '無', 肛交經驗: '無', 性行為次數: 0, 性伴侶數量: 0, 處男: '是' };
|
||||
newborn.生理狀態 = { 勃起狀態: '未勃起', 射精狀態: '未射精' };
|
||||
newborn.性別 = '男';
|
||||
}
|
||||
|
||||
// ✅ 修改:寫入「子嗣」而非「同伴」
|
||||
set(vars, '子嗣.' + finalName, newborn);
|
||||
logChange('新生兒', motherName + ' 生下 ' + finalName + ' (' + gender + ')');
|
||||
}
|
||||
keyLog('👶 ' + motherName + ' 共生下 ' + litter + ' 個寶寶');
|
||||
return litter;
|
||||
}
|
||||
|
||||
// ======================== 路徑確保 ========================
|
||||
function ensurePaths(vars) {
|
||||
// 強制刪除已廢棄的狀態.飽腹感
|
||||
if (get(vars, '狀態.飽腹感') !== undefined) {
|
||||
_.unset(vars, '狀態.飽腹感');
|
||||
console.log('🗑️ 已刪除廢棄路徑: 狀態.飽腹感');
|
||||
}
|
||||
if (!_.isPlainObject(get(vars, '任務'))) {
|
||||
set(vars, '任務', { 主線: {}, 支線: {}, 日常: {}, 緊急: {}, 羈絆: {} });
|
||||
}
|
||||
|
||||
var comps = get(vars, '同伴');
|
||||
if (_.isPlainObject(comps)) {
|
||||
for (var n in comps) {
|
||||
if (n.startsWith('$')) continue;
|
||||
// 🔴 確保狀態.生效效果存在
|
||||
if (!_.isPlainObject(get(vars, '同伴.' + n + '.狀態'))) {
|
||||
set(vars, '同伴.' + n + '.狀態', {});
|
||||
}
|
||||
if (!_.isPlainObject(get(vars, '同伴.' + n + '.狀態.生效效果'))) {
|
||||
set(vars, '同伴.' + n + '.狀態.生效效果', {});
|
||||
}
|
||||
if (!_.isPlainObject(get(vars, '任務.羈絆.' + n))) {
|
||||
set(vars, '任務.羈絆.' + n, {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var pets = get(vars, '寵物');
|
||||
if (_.isPlainObject(pets)) {
|
||||
for (var n in pets) {
|
||||
if (n.startsWith('$')) continue;
|
||||
if (!_.isPlainObject(get(vars, '寵物.' + n + '.攜帶物品'))) {
|
||||
set(vars, '寵物.' + n + '.攜帶物品', {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var camps = get(vars, '營地');
|
||||
if (_.isPlainObject(camps)) {
|
||||
for (var c in camps) {
|
||||
if (c.startsWith('$')) continue;
|
||||
['位置', '樣式', '物品', '食材', '醫藥', '材料', '牲畜', '設施', '奇物', '武器'].forEach(function(f) {
|
||||
if (get(vars, '營地.' + c + '.' + f) === undefined) {
|
||||
set(vars, '營地.' + c + '.' + f, (f === '位置' || f === '樣式') ? '' : {});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var equip = get(vars, '裝備');
|
||||
if (_.isPlainObject(equip)) {
|
||||
['頭部', '頸部', '胸部', '其他', '背部', '左手', '右手', '腰部', '腿部', '腳部'].forEach(function(p) {
|
||||
if (get(vars, '裝備.' + p) === undefined) set(vars, '裝備.' + p, {});
|
||||
});
|
||||
}
|
||||
|
||||
if (_.isPlainObject(comps)) {
|
||||
for (var n in comps) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var eq = get(vars, '同伴.' + n + '.裝備');
|
||||
if (!_.isPlainObject(eq)) {
|
||||
eq = {};
|
||||
['頭部', '頸部', '胸部', '其他', '背部', '左手', '右手', '腰部', '腿部', '腳部'].forEach(function(p) { eq[p] = {}; });
|
||||
set(vars, '同伴.' + n + '.裝備', eq);
|
||||
} else {
|
||||
['頭部', '頸部', '胸部', '其他', '背部', '左手', '右手', '腰部', '腿部', '腳部'].forEach(function(p) {
|
||||
if (get(vars, '同伴.' + n + '.裝備.' + p) === undefined) {
|
||||
set(vars, '同伴.' + n + '.裝備.' + p, {});
|
||||
}
|
||||
});
|
||||
}
|
||||
if (!Array.isArray(get(vars, '同伴.' + n + '.劇情演出'))) {
|
||||
set(vars, '同伴.' + n + '.劇情演出', []);
|
||||
}
|
||||
|
||||
var gender = get(vars, '同伴.' + n + '.基礎信息.性別');
|
||||
if (gender === '女' || gender === 'female') {
|
||||
if (get(vars, '同伴.' + n + '.生育次數') === undefined) {
|
||||
set(vars, '同伴.' + n + '.生育次數', 0);
|
||||
debugLog('初始化 同伴.' + n + '.生育次數 = 0');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var userGender = get(vars, '基礎信息.性別');
|
||||
if (userGender === '女' || userGender === 'female') {
|
||||
if (get(vars, '生育次數') === undefined) {
|
||||
set(vars, '生育次數', 0);
|
||||
debugLog('初始化 主角.生育次數 = 0');
|
||||
}
|
||||
}
|
||||
|
||||
if (get(vars, '系統.前次時間') === undefined) {
|
||||
set(vars, '系統.前次時間', '00:00');
|
||||
debugLog('初始化 系統.前次時間 = 00:00');
|
||||
}
|
||||
if (get(vars, '系統.前次天數') === undefined) {
|
||||
set(vars, '系統.前次天數', 1);
|
||||
debugLog('初始化 系統.前次天數 = 1');
|
||||
}
|
||||
|
||||
if (!_.isPlainObject(get(vars, '養殖'))) set(vars, '養殖', {});
|
||||
|
||||
var shop = get(vars, '商店');
|
||||
if (!_.isPlainObject(shop)) set(vars, '商店', {});
|
||||
}
|
||||
|
||||
// ======================== 等級升級處理 ========================
|
||||
function processLevelUp(vars, basePath) {
|
||||
var obj = get(vars, basePath);
|
||||
if (!_.isPlainObject(obj)) return;
|
||||
var isAttr = basePath.indexOf('屬性') !== -1,
|
||||
baseExp = isAttr ? 10 : 100;
|
||||
|
||||
for (var k in obj) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var item = obj[k];
|
||||
if (!_.isPlainObject(item)) continue;
|
||||
var lv = int(get(item, '等級')) || 0,
|
||||
exp = int(get(item, '當前經驗')) || 0,
|
||||
changed = false,
|
||||
oldLv = lv;
|
||||
|
||||
while (exp >= Math.max(1, lv * baseExp)) {
|
||||
exp -= lv * baseExp;
|
||||
lv++;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
set(vars, basePath + '.' + k + '.等級', lv);
|
||||
set(vars, basePath + '.' + k + '.當前經驗', exp);
|
||||
logChange('等級提升', basePath + '.' + k + ' ' + oldLv + ' → ' + lv);
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
var need = Math.max(1, lv * baseExp);
|
||||
if (get(item, '升級所需經驗') !== need) {
|
||||
set(vars, basePath + '.' + k + '.升級所需經驗', need);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ======================== 同伴邊界限制 ========================
|
||||
function processCompanionLimits(vars) {
|
||||
var comps = get(vars, '同伴');
|
||||
if (_.isPlainObject(comps)) {
|
||||
for (var n in comps) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var base = '同伴.' + n;
|
||||
|
||||
// ========== 邊界修正(更新為正確路徑) ==========
|
||||
// 生理數值
|
||||
var bounds = [
|
||||
{ p: base + '.生理.水分', min: 0, max: 100 },
|
||||
{ p: base + '.生理.飽腹感', min: 0, max: 100 },
|
||||
{ p: base + '.生理.排泄欲', min: 0, max: 100 },
|
||||
// 精神數值
|
||||
{ p: base + '.精神.壓力', min: 0, max: 100 },
|
||||
{ p: base + '.精神.睡眠', min: 0, max: 100 },
|
||||
// 次生屬性
|
||||
{ p: base + '.狀態.疲勞', min: 0, max: 4 * (get(vars, base + '.屬性.耐力.等級') || 20) },
|
||||
{ p: base + '.狀態.清潔', min: 0, max: 100 },
|
||||
// 核心狀態(生命/精神值)
|
||||
{ p: base + '.生理.當前生命值', min: 0, max: get(vars, base + '.生理.生命值上限') || 100 },
|
||||
{ p: base + '.精神.當前精神值', min: 0, max: get(vars, base + '.精神.精神值上限') || 100 }
|
||||
];
|
||||
|
||||
bounds.forEach(function(b) {
|
||||
var val = get(vars, b.p);
|
||||
if (typeof val === 'number' && Number.isFinite(val)) {
|
||||
var maxVal = typeof b.max === 'function' ? b.max(vars) : b.max;
|
||||
var minVal = b.min;
|
||||
var newVal = clamp(val, minVal, maxVal);
|
||||
if (!Number.isInteger(newVal)) newVal = Math.round(newVal);
|
||||
if (newVal !== val) {
|
||||
set(vars, b.p, newVal);
|
||||
logChange('同伴邊界修正', b.p + ' ' + val + ' → ' + newVal);
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// ========== 技能經驗修正 ==========
|
||||
var skills = get(vars, base + '.技能');
|
||||
if (_.isPlainObject(skills)) {
|
||||
for (var skillName in skills) {
|
||||
if (skillName.startsWith('$')) continue;
|
||||
var exp = get(vars, base + '.技能.' + skillName + '.當前經驗');
|
||||
if (typeof exp === 'number' && exp < 0) {
|
||||
set(vars, base + '.技能.' + skillName + '.當前經驗', 0);
|
||||
logChange('技能經驗修正', base + '.' + skillName + ' 經驗 ' + exp + ' → 0');
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ✅ 在這裡添加屬性經驗修正(在技能經驗修正之後)
|
||||
var attrs = ['力量', '敏捷', '耐力', '智力', '感知', '意志'];
|
||||
for (var i = 0; i < attrs.length; i++) {
|
||||
var attr = attrs[i];
|
||||
var exp = get(vars, base + '.屬性.' + attr + '.當前經驗');
|
||||
if (typeof exp === 'number' && exp < 0) {
|
||||
set(vars, base + '.屬性.' + attr + '.當前經驗', 0);
|
||||
logChange('同伴屬性經驗修正', base + '.' + attr + ' 經驗 ' + exp + ' → 0');
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 等級升級 ==========
|
||||
processLevelUp(vars, base + '.屬性');
|
||||
processLevelUp(vars, base + '.技能');
|
||||
}
|
||||
}
|
||||
|
||||
// 寵物邊界修正(如果有的話)
|
||||
var pets = get(vars, '寵物');
|
||||
if (_.isPlainObject(pets)) {
|
||||
for (var n in pets) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var base = '寵物.' + n;
|
||||
var fav = get(vars, base + '.好感度');
|
||||
if (Number.isFinite(fav)) {
|
||||
var newFav = clamp(fav, 0, 100);
|
||||
if (!Number.isInteger(newFav)) newFav = Math.round(newFav);
|
||||
if (newFav !== fav) {
|
||||
set(vars, base + '.好感度', newFav);
|
||||
logChange('邊界修正', base + '.好感度 ' + fav + ' → ' + newFav);
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
processLevelUp(vars, base + '.屬性');
|
||||
processLevelUp(vars, base + '.技能');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ======================== 物品狀態上限修正 ========================
|
||||
function fixItemStatusLimits(vars) {
|
||||
var paths = ['攜帶物品', '裝備', '捷徑或裝置'];
|
||||
paths.forEach(function(p) {
|
||||
var items = get(vars, p);
|
||||
if (!_.isPlainObject(items)) return;
|
||||
for (var k in items) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var s = get(items[k], '狀態');
|
||||
if (Number.isFinite(s) && s > 100) {
|
||||
set(vars, p + '.' + k + '.狀態', 100);
|
||||
logChange('物品狀態上限', p + '.' + k + ' ' + s + ' → 100');
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var camps = get(vars, '營地');
|
||||
if (_.isPlainObject(camps)) {
|
||||
for (var c in camps) {
|
||||
if (c.startsWith('$')) continue;
|
||||
var cats = ['物品', '食材', '醫藥', '材料', '牲畜', '設施', '奇物', '武器'];
|
||||
cats.forEach(function(cat) {
|
||||
var items = get(vars, '營地.' + c + '.' + cat);
|
||||
if (!_.isPlainObject(items)) return;
|
||||
for (var k in items) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var s = get(items[k], '狀態');
|
||||
if (Number.isFinite(s) && s > 100) {
|
||||
set(vars, '營地.' + c + '.' + cat + '.' + k + '.狀態', 100);
|
||||
logChange('物品狀態上限', '營地.' + c + '.' + cat + '.' + k + ' ' + s + ' → 100');
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ======================== 清理無效物品 ========================
|
||||
function cleanupAllItems(vars) {
|
||||
var paths = ['攜帶物品', '捷徑或裝置']; // 🔴 移除 '裝備'
|
||||
|
||||
function fixItemNumbers(item, itemPath) {
|
||||
if (!_.isPlainObject(item)) return;
|
||||
var changed = false;
|
||||
var s = get(item, '狀態');
|
||||
if (Number.isFinite(s) && !Number.isInteger(s)) {
|
||||
var newS = Math.round(s);
|
||||
set(item, '狀態', newS);
|
||||
logChange('狀態取整', itemPath + ' 狀態 ' + s + ' → ' + newS);
|
||||
fixCount++;
|
||||
changed = true;
|
||||
}
|
||||
var w = get(item, '重量');
|
||||
if (Number.isFinite(w)) {
|
||||
var newW = Math.round(w * 100) / 100;
|
||||
if (newW !== w) {
|
||||
set(item, '重量', newW);
|
||||
logChange('重量修正', itemPath + ' 重量 ' + w + ' → ' + newW);
|
||||
fixCount++;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
var q = get(item, '數量');
|
||||
if (Number.isFinite(q)) {
|
||||
var rounded = Math.round(q);
|
||||
if (Math.abs(q - rounded) < 1e-10 && rounded !== q) {
|
||||
set(item, '數量', rounded);
|
||||
logChange('數量誤差修正', itemPath + ' 數量 ' + q + ' → ' + rounded);
|
||||
fixCount++;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
// 🔴 只處理攜帶物品和捷徑,不處理裝備
|
||||
paths.forEach(function(p) {
|
||||
var items = get(vars, p);
|
||||
if (!_.isPlainObject(items)) return;
|
||||
var toDel = [];
|
||||
for (var k in items) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var item = items[k];
|
||||
fixItemNumbers(item, p + '.' + k);
|
||||
if (isItemInvalid(item)) toDel.push(k);
|
||||
}
|
||||
if (toDel.length) {
|
||||
toDel.forEach(function(k) { _.unset(vars, p + '.' + k); });
|
||||
logChange('清理異常物品', p + ': ' + toDel.join(', '));
|
||||
delCount += toDel.length;
|
||||
}
|
||||
});
|
||||
|
||||
// 營地物品處理(保持不變)
|
||||
var camps = get(vars, '營地');
|
||||
if (_.isPlainObject(camps)) {
|
||||
for (var c in camps) {
|
||||
if (c.startsWith('$')) continue;
|
||||
var cats = ['物品', '食材', '醫藥', '材料', '牲畜', '設施', '奇物', '武器'];
|
||||
cats.forEach(function(cat) {
|
||||
var items = get(vars, '營地.' + c + '.' + cat);
|
||||
if (!_.isPlainObject(items)) return;
|
||||
var toDel = [];
|
||||
for (var k in items) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var item = items[k];
|
||||
fixItemNumbers(item, '營地.' + c + '.' + cat + '.' + k);
|
||||
if (isItemInvalid(item)) toDel.push(k);
|
||||
}
|
||||
if (toDel.length) {
|
||||
toDel.forEach(function(k) { _.unset(vars, '營地.' + c + '.' + cat + '.' + k); });
|
||||
logChange('清理營地異常物品', c + '/' + cat + ': ' + toDel.join(', '));
|
||||
delCount += toDel.length;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 同伴攜帶物品(保持不變)
|
||||
var comps = get(vars, '同伴');
|
||||
if (_.isPlainObject(comps)) {
|
||||
for (var n in comps) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var items = get(vars, '同伴.' + n + '.攜帶物品');
|
||||
if (!_.isPlainObject(items)) continue;
|
||||
var toDel = [];
|
||||
for (var k in items) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var item = items[k];
|
||||
fixItemNumbers(item, '同伴.' + n + '.攜帶物品.' + k);
|
||||
if (isItemInvalid(item)) toDel.push(k);
|
||||
}
|
||||
if (toDel.length) {
|
||||
toDel.forEach(function(k) { _.unset(vars, '同伴.' + n + '.攜帶物品.' + k); });
|
||||
logChange('清理同伴異常物品', n + ': ' + toDel.join(', '));
|
||||
delCount += toDel.length;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 寵物攜帶物品(保持不變)
|
||||
var pets = get(vars, '寵物');
|
||||
if (_.isPlainObject(pets)) {
|
||||
for (var n in pets) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var items = get(vars, '寵物.' + n + '.攜帶物品');
|
||||
if (!_.isPlainObject(items)) continue;
|
||||
var toDel = [];
|
||||
for (var k in items) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var item = items[k];
|
||||
fixItemNumbers(item, '寵物.' + n + '.攜帶物品.' + k);
|
||||
if (isItemInvalid(item)) toDel.push(k);
|
||||
}
|
||||
if (toDel.length) {
|
||||
toDel.forEach(function(k) { _.unset(vars, '寵物.' + n + '.攜帶物品.' + k); });
|
||||
logChange('清理寵物異常物品', n + ': ' + toDel.join(', '));
|
||||
delCount += toDel.length;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ======================== 物品腐敗處理 ========================
|
||||
function decayLocation(vars, basePath, hours, factor) {
|
||||
var items = get(vars, basePath);
|
||||
if (!_.isPlainObject(items)) return;
|
||||
|
||||
(function walk(path, obj) {
|
||||
if (!_.isPlainObject(obj)) return;
|
||||
for (var k in obj) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var v = obj[k];
|
||||
if (_.isPlainObject(v)) {
|
||||
var shelf = int(get(v, '保質期'));
|
||||
if (shelf >= 1 && shelf <= 5) {
|
||||
var state = int(get(v, '狀態'));
|
||||
if (state > 0) {
|
||||
var decay = decayRates[5 - shelf] * hours * factor,
|
||||
newState = Math.max(0, Math.round(state - decay));
|
||||
if (newState !== state) {
|
||||
set(vars, path + '.' + k + '.狀態', newState);
|
||||
var desc = get(v, '描述'),
|
||||
newDesc = updateDesc(desc, newState);
|
||||
if (newDesc !== desc) set(vars, path + '.' + k + '.描述', newDesc);
|
||||
}
|
||||
}
|
||||
}
|
||||
walk(path + '.' + k, v);
|
||||
}
|
||||
}
|
||||
})(basePath, items);
|
||||
}
|
||||
|
||||
function processItemDecay(vars) {
|
||||
if (!lastSnapshot) return;
|
||||
var cur = getCurrentTime(vars);
|
||||
if (!cur) return;
|
||||
var prevDay = lastSnapshot.day,
|
||||
prevTime = lastSnapshot.time;
|
||||
if (!prevDay || !prevTime) return;
|
||||
var prevMins = prevDay * 1440 + parseTime(prevTime),
|
||||
curMins = cur.total,
|
||||
delta = curMins - prevMins;
|
||||
if (delta <= 0) return;
|
||||
|
||||
var hours = delta / 60,
|
||||
avgTemp = int(get(vars, '環境.體感溫度')) || 25,
|
||||
factor = tempFactor(avgTemp);
|
||||
|
||||
['攜帶物品', '裝備', '捷徑或裝置'].forEach(function(p) {
|
||||
decayLocation(vars, p, hours, factor);
|
||||
});
|
||||
|
||||
var camps = get(vars, '營地');
|
||||
if (_.isPlainObject(camps)) {
|
||||
for (var c in camps) {
|
||||
if (c.startsWith('$')) continue;
|
||||
['物品', '食材', '醫藥', '材料', '奇物', '武器'].forEach(function(cat) {
|
||||
decayLocation(vars, '營地.' + c + '.' + cat, hours, factor);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var comps = get(vars, '同伴');
|
||||
if (_.isPlainObject(comps)) {
|
||||
for (var n in comps) {
|
||||
if (n.startsWith('$')) continue;
|
||||
decayLocation(vars, '同伴.' + n + '.攜帶物品', hours, factor);
|
||||
}
|
||||
}
|
||||
|
||||
var pets = get(vars, '寵物');
|
||||
if (_.isPlainObject(pets)) {
|
||||
for (var n in pets) {
|
||||
if (n.startsWith('$')) continue;
|
||||
decayLocation(vars, '寵物.' + n + '.攜帶物品', hours, factor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 季節系統 ====================
|
||||
function calculateSeason(currentDay) {
|
||||
var total = SEASON_CONFIG.SPRING_DAYS + SEASON_CONFIG.SUMMER_DAYS +
|
||||
SEASON_CONFIG.AUTUMN_DAYS + SEASON_CONFIG.WINTER_DAYS;
|
||||
var pos = currentDay % total;
|
||||
var acc = 0;
|
||||
|
||||
acc += SEASON_CONFIG.SPRING_DAYS;
|
||||
if (pos < acc) return '春季';
|
||||
acc += SEASON_CONFIG.SUMMER_DAYS;
|
||||
if (pos < acc) return '夏季';
|
||||
acc += SEASON_CONFIG.AUTUMN_DAYS;
|
||||
if (pos < acc) return '秋季';
|
||||
return '冬季';
|
||||
}
|
||||
|
||||
function updateSeason(vars) {
|
||||
var currentDay = v(get(vars, '系統.經過天數'), 0);
|
||||
var newSeason = calculateSeason(currentDay);
|
||||
var currentSeason = get(vars, '環境.季節');
|
||||
|
||||
if (newSeason !== currentSeason) {
|
||||
set(vars, '環境.季節', newSeason);
|
||||
keyLog('季節更新: ' + currentSeason + ' → ' + newSeason);
|
||||
debugLog('季節計算 - 當前天數: ' + currentDay + ', 新季節: ' + newSeason);
|
||||
logChange('季節更新', currentSeason + ' → ' + newSeason);
|
||||
fixCount++;
|
||||
return true;
|
||||
}
|
||||
debugLog('季節無變化: ' + currentSeason);
|
||||
return false;
|
||||
}
|
||||
|
||||
// ==================== 懷孕系統 ====================
|
||||
function updatePregnancyStage(vars, characterPath) {
|
||||
var prefix = characterPath ? characterPath + '.' : '';
|
||||
var pregnant = get(vars, prefix + '生理狀態.懷孕狀態');
|
||||
|
||||
// 🔴 加入 '流產' 到排除清單
|
||||
if (!pregnant || pregnant === '未懷孕' || pregnant === '' || pregnant === '流產') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 🔴 使用計算函數獲取懷孕天數
|
||||
var days = calculatePregnancyDays(vars, characterPath);
|
||||
|
||||
// 如果懷孕天數為 0 且懷孕日不存在,可能出了問題
|
||||
if (days === 0 && get(vars, prefix + '生理狀態.懷孕日') === undefined) {
|
||||
// 回退到讀取儲存的天數
|
||||
days = get(vars, prefix + '生理狀態.懷孕天數') || 0;
|
||||
}
|
||||
|
||||
var newStage = null;
|
||||
if (days <= 30) {
|
||||
newStage = '懷孕初期';
|
||||
} else if (days <= 60) {
|
||||
newStage = '懷孕中期';
|
||||
} else {
|
||||
newStage = '懷孕後期';
|
||||
}
|
||||
|
||||
// 自動分娩(超過 90 天)
|
||||
if (days > 90) {
|
||||
var name = characterPath ? characterPath.split('.').pop() : '主角';
|
||||
var motherPath = characterPath || '主角';
|
||||
|
||||
keyLog('🤰 ' + name + ' 懷孕 ' + days + ' 天,自動分娩!');
|
||||
var litterCount = generateNewborn(vars, name, motherPath);
|
||||
|
||||
set(vars, prefix + '生理狀態.懷孕狀態', '未懷孕');
|
||||
set(vars, prefix + '生理狀態.懷孕天數', 0);
|
||||
set(vars, prefix + '生理狀態.懷孕日', 0); // 🔴 清空懷孕日
|
||||
set(vars, prefix + '生理狀態.月經週期', 1);
|
||||
logChange('分娩', name + ' 順利分娩,生下 ' + litterCount + ' 胎');
|
||||
fixCount++;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 更新懷孕狀態
|
||||
if (newStage && newStage !== pregnant) {
|
||||
keyLog('🤰 ' + (characterPath || '主角') + ' 懷孕階段更新: ' + pregnant + ' → ' + newStage + ' (第' + days + '天)');
|
||||
set(vars, prefix + '生理狀態.懷孕狀態', newStage);
|
||||
logChange('懷孕階段', (characterPath || '主角') + ' ' + pregnant + ' → ' + newStage);
|
||||
fixCount++;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function advancePregnancy(vars, days) {
|
||||
// 現在天數由 calculatePregnancyDays 計算,這個函數只需要更新階段
|
||||
var changed = false;
|
||||
|
||||
// 更新主角
|
||||
if (updatePregnancyStage(vars, '')) changed = true;
|
||||
|
||||
// 更新同伴
|
||||
var companions = get(vars, '同伴');
|
||||
if (_.isPlainObject(companions)) {
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
if (updatePregnancyStage(vars, '同伴.' + name)) changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
function calculatePregnancy(vars, characterName, isInternalEjaculation, contraceptive) {
|
||||
var base = '同伴.' + characterName;
|
||||
|
||||
// 1. 先檢查性別
|
||||
var gender = get(vars, base + '.基礎信息.性別');
|
||||
if (gender !== '女' && gender !== 'female' && gender !== '女性') {
|
||||
keyLog('🔍 [2] 性別不符,跳過 (性別=' + gender + ')');
|
||||
return false;
|
||||
}
|
||||
|
||||
// 2. 再檢查懷孕狀態(流產視為未懷孕)
|
||||
var pregnancyState = get(vars, base + '.生理狀態.懷孕狀態');
|
||||
if (pregnancyState && pregnancyState !== '未懷孕' && pregnancyState !== '流產') {
|
||||
keyLog('🔍 [4] 已懷孕,跳過');
|
||||
return false;
|
||||
}
|
||||
|
||||
// 3. 有效避孕檢查
|
||||
if (contraceptive === '保險套' || contraceptive === '避孕藥') {
|
||||
keyLog('🔍 [5] 有效避孕,懷孕機率=0%');
|
||||
set(vars, base + '.生理狀態.懷孕天數', 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 4. 獲取授精者
|
||||
var sexResults = ensureSexResultArray(vars);
|
||||
var inseminator = '未知';
|
||||
for (var i = 0; i < sexResults.length; i++) {
|
||||
if (sexResults[i].角色 === characterName && sexResults[i].授精者) {
|
||||
inseminator = sexResults[i].授精者;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (inseminator === '未知') {
|
||||
inseminator = get(vars, '基礎信息.名字') || '未知';
|
||||
}
|
||||
|
||||
keyLog('🔍 [1] 懷孕判斷入口: 角色=' + characterName + ', 性別=' + gender);
|
||||
keyLog('🔍 [6] 通過所有檢查,開始計算機率');
|
||||
|
||||
var isPullOut = (contraceptive === '體外射精');
|
||||
|
||||
var cycleDay = get(vars, base + '.生理狀態.月經週期') || 14;
|
||||
var cyclePhase = '安全期';
|
||||
if (cycleDay >= 1 && cycleDay <= 5) cyclePhase = '月經期';
|
||||
else if (cycleDay >= 10 && cycleDay <= 16) cyclePhase = '危險期';
|
||||
keyLog('🔍 [7] 月經週期: 第' + cycleDay + '天, 階段: ' + cyclePhase);
|
||||
|
||||
var baseChance = 0;
|
||||
if (cyclePhase === '危險期') {
|
||||
baseChance = isInternalEjaculation ? 25 : 8;
|
||||
} else if (cyclePhase === '安全期') {
|
||||
baseChance = isInternalEjaculation ? 2 : 0.5;
|
||||
} else {
|
||||
baseChance = isInternalEjaculation ? 0.3 : 0;
|
||||
}
|
||||
keyLog('🔍 [8] 基礎機率: ' + baseChance + '%');
|
||||
|
||||
if (isPullOut && isInternalEjaculation === false) {
|
||||
baseChance = Math.floor(baseChance * 0.25);
|
||||
keyLog('🔍 [9] 體外射精,機率降低至 ' + baseChance + '%');
|
||||
}
|
||||
|
||||
if (contraceptive === '安全期') {
|
||||
var originalChance = baseChance;
|
||||
baseChance = Math.min(baseChance, 2);
|
||||
if (originalChance !== baseChance) {
|
||||
keyLog('🔍 [10] 安全期避孕,機率從 ' + originalChance + '% 限制為 ' + baseChance + '%');
|
||||
}
|
||||
}
|
||||
|
||||
var talentBonus = 0;
|
||||
var talents = get(vars, base + '.天賦特性');
|
||||
if (_.isPlainObject(talents)) {
|
||||
for (var talentName in talents) {
|
||||
if (talentName.startsWith('$')) continue;
|
||||
var talent = talents[talentName];
|
||||
if (talent && talent.加值 && talent.加值.懷孕) {
|
||||
var bonusValue = talent.加值.懷孕;
|
||||
if (typeof bonusValue === 'number') talentBonus += Math.floor(bonusValue / 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
keyLog('🔍 [11] 天賦加成: ' + talentBonus + '%');
|
||||
|
||||
var finalChance = Math.min(99, Math.max(0, baseChance + talentBonus));
|
||||
var dice = Math.floor(Math.random() * 100) + 1;
|
||||
var isPregnant = dice <= finalChance;
|
||||
|
||||
keyLog('🔍 [12] 最終機率: ' + finalChance + '%, 骰子: ' + dice + ', 結果: ' + (isPregnant ? '懷孕' : '未懷孕'));
|
||||
|
||||
if (isPregnant) {
|
||||
var currentPregnancyState = get(vars, base + '.生理狀態.懷孕狀態');
|
||||
if (!currentPregnancyState || currentPregnancyState === '未懷孕' || currentPregnancyState === '流產') {
|
||||
set(vars, base + '.生理狀態.懷孕狀態', '懷孕初期');
|
||||
}
|
||||
|
||||
var currentDay = get(vars, '系統.經過天數') || 0;
|
||||
set(vars, base + '.生理狀態.懷孕日', currentDay);
|
||||
var pregnancyDays = 0;
|
||||
set(vars, base + '.生理狀態.懷孕天數', pregnancyDays);
|
||||
set(vars, base + '.生理狀態.授精者', inseminator);
|
||||
|
||||
keyLog('🤰 ' + characterName + ' 懷孕了! (懷孕日: 第' + currentDay + '天)');
|
||||
logChange('懷孕', characterName + ' 在第 ' + currentDay + ' 天懷孕,授精者: ' + inseminator);
|
||||
} else {
|
||||
set(vars, base + '.生理狀態.懷孕天數', 0);
|
||||
keyLog('❌ ' + characterName + ' 未懷孕 (週期: ' + cyclePhase + ', 機率: ' + finalChance + '%)');
|
||||
}
|
||||
return isPregnant;
|
||||
}
|
||||
|
||||
// ==================== 計算懷孕天數(基於懷孕日) ====================
|
||||
function calculatePregnancyDays(vars, characterPath) {
|
||||
var prefix = characterPath ? characterPath + '.' : '';
|
||||
var pregnant = get(vars, prefix + '生理狀態.懷孕狀態');
|
||||
|
||||
// 如果沒有懷孕,直接返回 0
|
||||
if (!pregnant || pregnant === '未懷孕' || pregnant === '') {
|
||||
return 0;
|
||||
}
|
||||
|
||||
var pregnancyDay = get(vars, prefix + '生理狀態.懷孕日');
|
||||
var currentDay = get(vars, '系統.經過天數') || 0;
|
||||
|
||||
// 如果沒有懷孕日記錄,回退到原本的懷孕天數
|
||||
if (pregnancyDay === undefined || pregnancyDay === null) {
|
||||
return get(vars, prefix + '生理狀態.懷孕天數') || 0;
|
||||
}
|
||||
|
||||
// 🔴 計算懷孕天數 = 當前天數 - 懷孕當天數
|
||||
var days = Math.max(0, currentDay - pregnancyDay);
|
||||
|
||||
// 同步更新懷孕天數欄位(保持一致性)
|
||||
set(vars, prefix + '生理狀態.懷孕天數', days);
|
||||
|
||||
return days;
|
||||
}
|
||||
|
||||
function updateMenstrualCycle(vars) {
|
||||
var changed = false;
|
||||
var companions = get(vars, '同伴');
|
||||
|
||||
if (_.isPlainObject(companions)) {
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var gender = get(vars, '同伴.' + name + '.基礎信息.性別');
|
||||
if (gender === '女' || gender === 'female' || gender === '女性') {
|
||||
var pregnant = get(vars, '同伴.' + name + '.生理狀態.懷孕狀態');
|
||||
var currentCycle = get(vars, '同伴.' + name + '.生理狀態.月經週期');
|
||||
var newCycle;
|
||||
|
||||
// 🔴 新增:流產後重置月經週期
|
||||
if (pregnant === '流產') {
|
||||
newCycle = 1;
|
||||
debugLog('同伴 ' + name + ' 流產,月經週期重置為 1');
|
||||
} else if (currentCycle === undefined || currentCycle === null) {
|
||||
newCycle = Math.floor(Math.random() * 28) + 1;
|
||||
} else {
|
||||
newCycle = currentCycle + 1;
|
||||
if (newCycle > 28) newCycle = 1;
|
||||
}
|
||||
set(vars, '同伴.' + name + '.生理狀態.月經週期', newCycle);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 主角同理
|
||||
var userGender = get(vars, '基礎信息.性別');
|
||||
if (userGender === '女' || userGender === 'female') {
|
||||
var userPregnant = get(vars, '生理狀態.懷孕狀態');
|
||||
var userCycle = get(vars, '生理狀態.月經週期');
|
||||
var newUserCycle;
|
||||
|
||||
// 🔴 新增:流產後重置月經週期
|
||||
if (userPregnant === '流產') {
|
||||
newUserCycle = 1;
|
||||
debugLog('主角流產,月經週期重置為 1');
|
||||
} else if (userCycle === undefined || userCycle === null) {
|
||||
newUserCycle = Math.floor(Math.random() * 28) + 1;
|
||||
} else {
|
||||
newUserCycle = userCycle + 1;
|
||||
if (newUserCycle > 28) newUserCycle = 1;
|
||||
}
|
||||
set(vars, '生理狀態.月經週期', newUserCycle);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (changed) debugLog('月經週期更新完成');
|
||||
return changed;
|
||||
}
|
||||
|
||||
// ==================== 作物系統 ====================
|
||||
function updateCropGrowthStages(vars) {
|
||||
var changed = false;
|
||||
var currentDay = v(get(vars, '系統.經過天數'), 0);
|
||||
var crops = get(vars, '作物');
|
||||
|
||||
if (!_.isPlainObject(crops)) return false;
|
||||
|
||||
for (var name in crops) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var data = crops[name];
|
||||
if (!_.isPlainObject(data)) continue;
|
||||
|
||||
var growthCycle = v(data.成長週期, 0);
|
||||
var planted = v(data.種植日期, 0);
|
||||
|
||||
if (planted <= 0) continue;
|
||||
|
||||
var actualDays = growthCycle > 0 ? calculateActualGrowthDays(vars, name, growthCycle) : Math.abs(growthCycle);
|
||||
var stage = calculateGrowthStage(data, currentDay, actualDays);
|
||||
var currentStage = get(vars, '作物.' + name + '.生長階段');
|
||||
|
||||
if (stage !== currentStage) {
|
||||
set(vars, '作物.' + name + '.生長階段', stage);
|
||||
keyLog('🌱 作物 ' + name + ' 生長階段: ' + currentStage + ' → ' + stage);
|
||||
changed = true;
|
||||
|
||||
if (stage === '可收割' && !get(vars, '作物.' + name + '.已成熟')) {
|
||||
set(vars, '作物.' + name + '.已成熟', true);
|
||||
keyLog('🌾 作物 ' + name + ' 已成熟,可收割!');
|
||||
}
|
||||
}
|
||||
|
||||
if (growthCycle > 0 && planted > 0) {
|
||||
var maturity = planted + actualDays;
|
||||
if (get(vars, '作物.' + name + '.收成日期') !== maturity) {
|
||||
set(vars, '作物.' + name + '.收成日期', maturity);
|
||||
debugLog('作物 ' + name + ' 收成日期更新: ' + maturity);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) debugLog('作物系統更新完成');
|
||||
return changed;
|
||||
}
|
||||
|
||||
// ==================== 畜牧系統 ====================
|
||||
function checkAndProcessBreeding(vars, currentDay, specificAnimal) {
|
||||
var updated = false;
|
||||
var livestock = get(vars, '畜牧');
|
||||
if (!_.isPlainObject(livestock)) return { success: false, updated: false };
|
||||
|
||||
var bred = [];
|
||||
var animals = specificAnimal ? [[specificAnimal, livestock[specificAnimal]]] : Object.entries(livestock);
|
||||
|
||||
for (var i = 0; i < animals.length; i++) {
|
||||
var name = animals[i][0], data = animals[i][1];
|
||||
if (name.startsWith('$') || !_.isPlainObject(data)) continue;
|
||||
if (!data.繁殖 || !data.繁殖.可繁殖) continue;
|
||||
|
||||
var stage = calculateLivestockGrowthStage(data);
|
||||
if (stage === '幼年期' || stage === '成長期') continue;
|
||||
|
||||
var males = v(data.飼養數量?.雄性, 0), females = v(data.飼養數量?.雌性, 0);
|
||||
if (males <= 0 || females <= 0) continue;
|
||||
if (data.繁殖.懷孕中) continue;
|
||||
|
||||
var lastBreed = v(data.繁殖.上次繁殖日, 0);
|
||||
var cooldown = LIVESTOCK_CONFIG.BREEDING_CONFIG.BREEDING_COOLDOWN[name] || 30;
|
||||
if (lastBreed > 0 && currentDay - lastBreed < cooldown) continue;
|
||||
|
||||
var chance = LIVESTOCK_CONFIG.BREEDING_CONFIG.BASE_BREEDING_CHANCE;
|
||||
var ageMonths = v(data.年齡, 12);
|
||||
if (ageMonths >= 12 && ageMonths < 36) chance = 0.4;
|
||||
else if (ageMonths >= 36) chance = 0.2;
|
||||
|
||||
if (Math.random() > chance) continue;
|
||||
|
||||
set(vars, '畜牧.' + name + '.繁殖.懷孕中', true);
|
||||
set(vars, '畜牧.' + name + '.繁殖.上次繁殖日', currentDay);
|
||||
updated = true;
|
||||
bred.push(name);
|
||||
keyLog('🐄 ' + name + ' 成功懷孕!');
|
||||
}
|
||||
|
||||
if (updated) logChange('畜牧繁殖', '懷孕動物: ' + bred.join(', '));
|
||||
return { success: bred.length > 0, updated: updated, bredAnimals: bred };
|
||||
}
|
||||
|
||||
function checkAndProcessBirth(vars, currentDay, specificAnimal) {
|
||||
var updated = false;
|
||||
var livestock = get(vars, '畜牧');
|
||||
if (!_.isPlainObject(livestock)) return { success: false, updated: false };
|
||||
|
||||
var birthed = [];
|
||||
var animals = specificAnimal ? [[specificAnimal, livestock[specificAnimal]]] : Object.entries(livestock);
|
||||
|
||||
for (var i = 0; i < animals.length; i++) {
|
||||
var name = animals[i][0], data = animals[i][1];
|
||||
if (name.startsWith('$') || !_.isPlainObject(data)) continue;
|
||||
if (!data.繁殖?.懷孕中) continue;
|
||||
|
||||
var lastBreed = v(data.繁殖.上次繁殖日, 0);
|
||||
var pregnancyCycle = v(data.繁殖.懷孕週期, 0);
|
||||
if (lastBreed <= 0 || pregnancyCycle <= 0) continue;
|
||||
|
||||
var dueDay = lastBreed + pregnancyCycle;
|
||||
if (currentDay < dueDay) continue;
|
||||
|
||||
var litter = rollDice(data.繁殖?.每胎數量 || '1d2');
|
||||
if (litter <= 0) litter = 1;
|
||||
|
||||
var males = 0, females = 0;
|
||||
for (var j = 0; j < litter; j++) {
|
||||
if (generateRandomGender() === '雄性') males++;
|
||||
else females++;
|
||||
}
|
||||
|
||||
var curMales = v(data.飼養數量?.雄性, 0);
|
||||
var curFemales = v(data.飼養數量?.雌性, 0);
|
||||
set(vars, '畜牧.' + name + '.飼養數量.雄性', curMales + males);
|
||||
set(vars, '畜牧.' + name + '.飼養數量.雌性', curFemales + females);
|
||||
set(vars, '畜牧.' + name + '.繁殖.懷孕中', false);
|
||||
|
||||
updated = true;
|
||||
birthed.push(name);
|
||||
keyLog('🐣 ' + name + ' 生產了 ' + litter + ' 隻幼崽 (雄:' + males + ', 雌:' + females + ')');
|
||||
}
|
||||
|
||||
if (updated) logChange('畜牧生產', '生產動物: ' + birthed.join(', '));
|
||||
return { success: birthed.length > 0, updated: updated, birthedAnimals: birthed };
|
||||
}
|
||||
|
||||
function updateLivestockStates(vars) {
|
||||
var changed = false;
|
||||
var currentDay = v(get(vars, '系統.經過天數'), 0);
|
||||
var livestock = get(vars, '畜牧');
|
||||
|
||||
if (!_.isPlainObject(livestock)) return false;
|
||||
|
||||
for (var name in livestock) {
|
||||
if (name.startsWith('$')) continue;
|
||||
var data = livestock[name];
|
||||
if (!_.isPlainObject(data)) continue;
|
||||
|
||||
var stage = calculateLivestockGrowthStage(data);
|
||||
if (stage !== get(vars, '畜牧.' + name + '.生長階段')) {
|
||||
set(vars, '畜牧.' + name + '.生長階段', stage);
|
||||
keyLog('🐑 ' + name + ' 生長階段: → ' + stage);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
var startDay = v(data.飼養開始日, 0);
|
||||
if (startDay > 0) {
|
||||
var age = Math.max(12, 12 + Math.floor((currentDay - startDay) / 30));
|
||||
if (age !== v(data.年齡, 0)) {
|
||||
set(vars, '畜牧.' + name + '.年齡', age);
|
||||
debugLog('畜牧 ' + name + ' 年齡更新: ' + age + '個月');
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (data.產出物 && data.產出物.週期) {
|
||||
var baseCycle = v(data.產出物.週期, 0);
|
||||
if (baseCycle > 0) {
|
||||
var actualCycle = calculateActualProductionCycle(vars, name, baseCycle);
|
||||
var nextDay = v(data.產出物.下次產出日, 0);
|
||||
|
||||
if (nextDay <= 0 && startDay > 0) {
|
||||
nextDay = startDay + actualCycle;
|
||||
set(vars, '畜牧.' + name + '.產出物.下次產出日', nextDay);
|
||||
debugLog('畜牧 ' + name + ' 初始化產出日: ' + nextDay);
|
||||
changed = true;
|
||||
} else if (currentDay > nextDay && nextDay > 0) {
|
||||
var cycles = Math.floor((currentDay - nextDay) / actualCycle) + 1;
|
||||
set(vars, '畜牧.' + name + '.產出物.下次產出日', nextDay + cycles * actualCycle);
|
||||
keyLog('🥚 ' + name + ' 產出物已生產!');
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (actualCycle !== baseCycle) {
|
||||
set(vars, '畜牧.' + name + '.產出物.週期', actualCycle);
|
||||
debugLog('畜牧 ' + name + ' 產出週期更新: ' + baseCycle + ' → ' + actualCycle);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var breedResult = checkAndProcessBreeding(vars, currentDay, name);
|
||||
if (breedResult.updated) changed = true;
|
||||
var birthResult = checkAndProcessBirth(vars, currentDay, name);
|
||||
if (birthResult.updated) changed = true;
|
||||
}
|
||||
|
||||
if (changed) debugLog('畜牧系統更新完成');
|
||||
return changed;
|
||||
}
|
||||
|
||||
// ==================== 商店歷史記錄 ====================
|
||||
// ==================== 商店歷史記錄 ====================
|
||||
function recordShopHistory(vars) {
|
||||
var shop = get(vars, '商店');
|
||||
if (!_.isPlainObject(shop)) return;
|
||||
|
||||
var history = get(vars, '系統.商店歷史');
|
||||
// 🔴 更新為 9 個類別(夥伴拆成 4 個獨立類別)
|
||||
var categories = ['材料', '工具', '奇物', '夥伴-技術與後勤', '夥伴-戰鬥與探索', '夥伴-反派與妖魅', '夥伴-純愛與保護控', '藥物', '盲盒'];
|
||||
var maxLength = 16;
|
||||
|
||||
// 轉換舊格式(如果還是陣列)
|
||||
if (Array.isArray(history)) {
|
||||
var newHistory = {
|
||||
"材料": [],
|
||||
"工具": [],
|
||||
"奇物": [],
|
||||
"夥伴-技術與後勤": [],
|
||||
"夥伴-戰鬥與探索": [],
|
||||
"夥伴-反派與妖魅": [],
|
||||
"夥伴-純愛與保護控": [],
|
||||
"藥物": [],
|
||||
"盲盒": []
|
||||
};
|
||||
|
||||
for (var i = 0; i < history.length; i++) {
|
||||
var day = history[i];
|
||||
if (day.商品 && Array.isArray(day.商品)) {
|
||||
for (var j = 0; j < day.商品.length; j++) {
|
||||
var item = day.商品[j];
|
||||
var cat = item.類別;
|
||||
// 🔴 舊版「夥伴」轉換為四個夥伴類別時,需要判斷歸屬,但舊格式沒有子類別資訊
|
||||
// 所以統一歸入「夥伴-技術與後勤」作為預設(或可根據名稱關鍵字判斷)
|
||||
if (cat === '夥伴') {
|
||||
cat = '夥伴-技術與後勤';
|
||||
}
|
||||
var rawName = item.名稱;
|
||||
var cleanName = rawName.replace(/\([^)]*\)/g, '').trim();
|
||||
|
||||
if (newHistory[cat] && newHistory[cat].indexOf(cleanName) === -1) {
|
||||
newHistory[cat].push(cleanName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
history = newHistory;
|
||||
set(vars, '系統.商店歷史', history);
|
||||
keyLog('🔄 舊格式轉換完成(已刪除括弧,夥伴類別已拆分)');
|
||||
}
|
||||
|
||||
// 確保格式正確(包含 9 個類別)
|
||||
if (!_.isPlainObject(history)) {
|
||||
history = {
|
||||
"材料": [],
|
||||
"工具": [],
|
||||
"奇物": [],
|
||||
"夥伴-技術與後勤": [],
|
||||
"夥伴-戰鬥與探索": [],
|
||||
"夥伴-反派與妖魅": [],
|
||||
"夥伴-純愛與保護控": [],
|
||||
"藥物": [],
|
||||
"盲盒": []
|
||||
};
|
||||
set(vars, '系統.商店歷史', history);
|
||||
}
|
||||
|
||||
// 🔴 同一天不重複記錄
|
||||
var currentDay = get(vars, '系統.經過天數');
|
||||
var lastRecordDay = get(vars, '系統.上次記錄天數');
|
||||
|
||||
if (currentDay === lastRecordDay) {
|
||||
debugLog('同一天跳過商店歷史記錄,天數=' + currentDay);
|
||||
return;
|
||||
}
|
||||
|
||||
// 記錄當天商品(9 個類別)
|
||||
var anyChange = false;
|
||||
|
||||
for (var i = 0; i < categories.length; i++) {
|
||||
var cat = categories[i];
|
||||
var item = shop[cat];
|
||||
if (item && typeof item === 'object' && item['名稱']) {
|
||||
var rawName = item['名稱'];
|
||||
var cleanName = rawName.replace(/\([^)]*\)/g, '').trim();
|
||||
|
||||
var list = history[cat] || [];
|
||||
|
||||
if (list.length >= maxLength) {
|
||||
list.shift();
|
||||
}
|
||||
|
||||
list.push(cleanName);
|
||||
history[cat] = list;
|
||||
anyChange = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (anyChange) {
|
||||
set(vars, '系統.商店歷史', history);
|
||||
set(vars, '系統.上次記錄天數', currentDay);
|
||||
keyLog('📜 商店歷史已更新,天數=' + currentDay + ',共9個類別');
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 性愛系統 ====================
|
||||
function calculateVoluntary(affectionLevel, interactionType, statusEffects, comfort, isSudden, hasTrauma, specialStatus) {
|
||||
var base = 50 + (affectionLevel * 5);
|
||||
if (interactionType === '情感推進') base += 10;
|
||||
else if (interactionType === '強制欺騙') base -= 40;
|
||||
|
||||
if (affectionLevel >= 10) base += 20;
|
||||
else if (affectionLevel >= 7) base += 10;
|
||||
else if (affectionLevel >= 4) base += 5;
|
||||
else if (affectionLevel === 1) base -= 10;
|
||||
|
||||
if (statusEffects && statusEffects.indexOf('恐懼') !== -1) base -= 15;
|
||||
if (statusEffects && statusEffects.indexOf('壓力') !== -1) base -= 10;
|
||||
if (statusEffects && statusEffects.indexOf('興致') !== -1) base += 15;
|
||||
|
||||
if (comfort > 80) base += 5;
|
||||
if (comfort < 30) base -= 10;
|
||||
if (isSudden) base -= 20;
|
||||
if (hasTrauma) base -= 20;
|
||||
|
||||
if (specialStatus === '自責傾向') base -= 10;
|
||||
else if (specialStatus === '共犯') base += 20;
|
||||
|
||||
return Math.max(0, Math.min(100, base));
|
||||
}
|
||||
|
||||
function getResultGrade(voluntary) {
|
||||
if (voluntary >= 90) return { grade: '高度自願-主動', description: '主動推進 + 愉悅表現' };
|
||||
if (voluntary >= 80) return { grade: '高度自願-積極', description: '積極配合 + 正向反饋' };
|
||||
if (voluntary >= 70) return { grade: '高度自願-害羞', description: '害羞但允許 + 輕微緊張' };
|
||||
if (voluntary >= 60) return { grade: '矛盾-逐漸接受', description: '初始抗拒→逐漸接受' };
|
||||
if (voluntary >= 50) return { grade: '矛盾-明顯猶豫', description: '明顯猶豫 + 內心掙扎' };
|
||||
if (voluntary >= 40) return { grade: '矛盾-持續輕拒', description: '持續輕拒 + 不情願' };
|
||||
if (voluntary >= 30) return { grade: '非自願-忍耐', description: '被動承受 + 事後懊悔' };
|
||||
if (voluntary >= 20) return { grade: '非自願-無力反抗', description: '持續抗拒但漸弱' };
|
||||
if (voluntary >= 10) return { grade: '非自願-被迫接受', description: '恐懼服從 + 無奈' };
|
||||
return { grade: '非自願-激烈反抗', description: '激烈抗拒 + 創傷反應' };
|
||||
}
|
||||
|
||||
function getCorruptionStage(forcedCount, affectionLevel) {
|
||||
var adj = forcedCount;
|
||||
if (affectionLevel >= 16) adj += 3;
|
||||
else if (affectionLevel >= 13) adj += 2;
|
||||
else if (affectionLevel >= 10) adj += 1;
|
||||
|
||||
for (var stage in SEXUAL_CONFIG.CORRUPTION_STAGES) {
|
||||
var cfg = SEXUAL_CONFIG.CORRUPTION_STAGES[stage];
|
||||
if (adj >= cfg.minCount && adj <= cfg.maxCount) {
|
||||
return { stage: parseInt(stage), name: cfg.name };
|
||||
}
|
||||
}
|
||||
return { stage: 4, name: '開始沉淪' };
|
||||
}
|
||||
|
||||
function calculateAffectionChange(voluntary, affectionLevel, interactionType, specialStatus, isSuccess) {
|
||||
var expChange = 0, levelChange = 0, newStatus = specialStatus, trauma = '';
|
||||
|
||||
if (!isSuccess) {
|
||||
if (voluntary < 30) {
|
||||
return { expChange: -999, levelChange: -1, newSpecialStatus: specialStatus, traumaMark: '嚴重創傷' };
|
||||
}
|
||||
return { expChange: 0, levelChange: 0, newSpecialStatus: specialStatus, traumaMark: '' };
|
||||
}
|
||||
|
||||
var stage = getAffectionStageForSex(affectionLevel);
|
||||
var isForced = (interactionType === '強制欺騙' && voluntary < 40);
|
||||
|
||||
if (voluntary >= 70) {
|
||||
expChange = Math.min(100, 30 + Math.floor(voluntary / 2));
|
||||
} else if (voluntary >= 40) {
|
||||
if (voluntary > 50) expChange = Math.min(50, Math.floor((voluntary - 50) * 5));
|
||||
else if (voluntary < 50) expChange = Math.max(-20, Math.floor((voluntary - 50) * 4));
|
||||
}
|
||||
|
||||
if (voluntary < 40 && isForced) {
|
||||
expChange = 0;
|
||||
if (stage === '初階期') {
|
||||
levelChange = -1;
|
||||
trauma = '關係動搖';
|
||||
} else if (stage === '中階期') {
|
||||
levelChange = 0;
|
||||
trauma = '關係動搖';
|
||||
} else if (stage === '高階期') {
|
||||
expChange = -999;
|
||||
newStatus = '自責傾向';
|
||||
trauma = '自責傾向觸發';
|
||||
} else if (stage === '頂階初') {
|
||||
expChange = 40;
|
||||
newStatus = '扭曲依賴';
|
||||
trauma = '扭曲依賴觸發';
|
||||
} else if (stage === '頂階中') {
|
||||
expChange = 100;
|
||||
if (Math.random() < 0.1) levelChange = 1;
|
||||
newStatus = '徹底沉淪';
|
||||
trauma = '徹底沉淪觸發';
|
||||
} else if (stage === '頂階頂') {
|
||||
expChange = 150;
|
||||
levelChange = 1;
|
||||
newStatus = '共犯';
|
||||
trauma = '共犯覺醒觸發';
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
expChange: expChange,
|
||||
levelChange: levelChange,
|
||||
newSpecialStatus: newStatus,
|
||||
traumaMark: trauma
|
||||
};
|
||||
}
|
||||
|
||||
function processSexualInteraction(vars, data) {
|
||||
var name = data.characterName;
|
||||
var base = '同伴.' + name;
|
||||
var affection = v(get(vars, base + '.技能.好感(對阿彬).等級'), 1);
|
||||
var affectionExp = v(get(vars, base + '.技能.好感(對阿彬).當前經驗'), 0);
|
||||
var forced = v(get(vars, base + '.淪陷.強制次數'), 0);
|
||||
var special = get(vars, base + '.淪陷.特殊狀態') || '';
|
||||
|
||||
var voluntary = calculateVoluntary(
|
||||
affection,
|
||||
data.interactionType || '情感推進',
|
||||
data.statusEffects || [],
|
||||
data.comfort || 50,
|
||||
data.isSudden || false,
|
||||
special.indexOf('關係動搖') !== -1 || special.indexOf('嚴重創傷') !== -1,
|
||||
special
|
||||
);
|
||||
|
||||
if (special === '徹底沉淪' && data.interactionType === '強制欺騙') {
|
||||
voluntary = calculateVoluntary(affection, '情感推進', data.statusEffects || [], data.comfort || 50, data.isSudden || false, false, special);
|
||||
}
|
||||
|
||||
var grade = getResultGrade(voluntary);
|
||||
var forcedInc = false;
|
||||
|
||||
if (data.interactionType === '強制欺騙' && voluntary < 30 && special !== '徹底沉淪') {
|
||||
forced++;
|
||||
forcedInc = true;
|
||||
}
|
||||
|
||||
var newCorruption = getCorruptionStage(forced, affection);
|
||||
var change = calculateAffectionChange(voluntary, affection, data.interactionType || '情感推進', special, data.isSuccess !== false);
|
||||
|
||||
var newExp = affectionExp + change.expChange;
|
||||
var newLevel = affection + change.levelChange;
|
||||
|
||||
if (change.expChange === -999) newExp = 0;
|
||||
newLevel = Math.max(1, newLevel);
|
||||
|
||||
if (newExp !== affectionExp) set(vars, base + '.技能.好感(對阿彬).當前經驗', newExp);
|
||||
if (newLevel !== affection) set(vars, base + '.技能.好感(對阿彬).等級', newLevel);
|
||||
if (forcedInc) set(vars, base + '.淪陷.強制次數', forced);
|
||||
if (newCorruption.stage !== get(vars, base + '.淪陷.當前階段', 0)) {
|
||||
set(vars, base + '.淪陷.當前階段', newCorruption.stage);
|
||||
}
|
||||
if (change.newSpecialStatus !== special) {
|
||||
set(vars, base + '.淪陷.特殊狀態', change.newSpecialStatus);
|
||||
}
|
||||
|
||||
var result = {
|
||||
角色: name,
|
||||
完成: data.isSuccess !== false ? true : false, // 改為「完成」
|
||||
內射: data.isInternalEjaculation === true,
|
||||
避孕措施: data.避孕措施 || '無',
|
||||
類型: data.interactionType || '情感推進',
|
||||
自願度: voluntary,
|
||||
自願分級: grade.grade,
|
||||
淪陷階段: {
|
||||
階段: newCorruption.stage,
|
||||
名稱: newCorruption.name
|
||||
},
|
||||
關係變化: {
|
||||
經驗變化: change.expChange,
|
||||
等級變化: change.levelChange
|
||||
},
|
||||
特殊狀態: change.newSpecialStatus || '無',
|
||||
描寫建議: grade.description
|
||||
};
|
||||
// 🔴 改為陣列版本
|
||||
var results = ensureSexResultArray(vars);
|
||||
results.push(result);
|
||||
set(vars, '系統.性愛結果', results);
|
||||
keyLog('💕 性愛事件已記錄 (' + results.length + ' 筆)');
|
||||
|
||||
keyLog('💕 性愛事件 - ' + name + ': 自願度=' + voluntary + ', 結果=' + grade.grade);
|
||||
logChange('性愛事件', name + ' 自願度=' + voluntary);
|
||||
|
||||
var isInternalEjaculation = data.是否內射 === true;
|
||||
var isSuccess = data.是否成功 !== false;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// ======================== 時間流逝與等級處理 ========================
|
||||
function updateDayOnTimePassed(vars) {
|
||||
keyLog('跨日檢查開始');
|
||||
|
||||
var prevTime = get(vars, '系統.前次時間');
|
||||
var curTime = get(vars, '系統.當前時間');
|
||||
var prevDay = get(vars, '系統.前次天數');
|
||||
var curDay = get(vars, '系統.經過天數');
|
||||
|
||||
if (curDay > prevDay) {
|
||||
keyLog('✓ 偵測到天數外部更新: ' + prevDay + ' → ' + curDay);
|
||||
advancePregnancy(vars, 1);
|
||||
updateMenstrualCycle(vars);
|
||||
updateSeason(vars);
|
||||
updateCropGrowthStages(vars);
|
||||
updateLivestockStates(vars);
|
||||
return true;
|
||||
}
|
||||
var prevMinutes = parseTime(prevTime);
|
||||
var curMinutes = parseTime(curTime);
|
||||
if (prevMinutes === null || curMinutes === null) return false;
|
||||
|
||||
var isTimeRewind = curMinutes < prevMinutes;
|
||||
var isSameDay = curDay === prevDay;
|
||||
|
||||
if (isTimeRewind && isSameDay) {
|
||||
var newDay = curDay + 1;
|
||||
set(vars, '系統.經過天數', newDay);
|
||||
keyLog('✓ 跨日成功!天數: ' + curDay + ' → ' + newDay + ' (' + prevTime + ' → ' + curTime + ')');
|
||||
logChange('天數修正', curDay + ' → ' + newDay);
|
||||
fixCount++;
|
||||
|
||||
advancePregnancy(vars, 1);
|
||||
updateMenstrualCycle(vars);
|
||||
updateSeason(vars);
|
||||
updateCropGrowthStages(vars);
|
||||
updateLivestockStates(vars);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function processTimeAndLevel(vars, oldVars) {
|
||||
updateDayOnTimePassed(vars);
|
||||
processLevelUp(vars, '屬性');
|
||||
processLevelUp(vars, '技能');
|
||||
|
||||
// 主角屬性經驗邊界修正
|
||||
var playerAttrs = ['力量', '敏捷', '耐力', '智力', '感知', '意志'];
|
||||
for (var i = 0; i < playerAttrs.length; i++) {
|
||||
var attr = playerAttrs[i];
|
||||
var exp = get(vars, '屬性.' + attr + '.當前經驗');
|
||||
if (typeof exp === 'number' && exp < 0) {
|
||||
set(vars, '屬性.' + attr + '.當前經驗', 0);
|
||||
logChange('主角屬性經驗修正', '屬性.' + attr + ' 經驗 ' + exp + ' → 0');
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// 根據生效效果計算屬性加值(正面加成 + 負面減值)
|
||||
var curEffs = get(vars, '狀態.生效效果') || {};
|
||||
var endBonus = 0, strBonus = 0, willBonus = 0, intBonus = 0, perBonus = 0;
|
||||
|
||||
// ==================== 水分 ====================
|
||||
if (curEffs.水分) {
|
||||
switch (curEffs.水分.狀態) {
|
||||
case '水分充足': endBonus += 2; break;
|
||||
case '輕微口渴': intBonus -= 2; perBonus -= 2; break;
|
||||
case '明顯口渴': strBonus -= 5; endBonus -= 5; break;
|
||||
case '輕度脫水': strBonus -= 10; endBonus -= 10; break;
|
||||
case '嚴重脫水': strBonus -= 15; endBonus -= 15; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 飽腹感 ====================
|
||||
if (curEffs.飽腹感) {
|
||||
switch (curEffs.飽腹感.狀態) {
|
||||
case '飽足': endBonus += 2; break;
|
||||
case '過飽': perBonus -= 5; break;
|
||||
case '輕微飢餓': intBonus -= 2; perBonus -= 2; break;
|
||||
case '明顯飢餓': strBonus -= 5; endBonus -= 5; intBonus -= 5; perBonus -= 5; break;
|
||||
case '極度飢餓': strBonus -= 15; endBonus -= 15; intBonus -= 15; perBonus -= 15; break;
|
||||
case '虛脫': strBonus -= 25; endBonus -= 25; intBonus -= 25; perBonus -= 25; willBonus -= 25; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 睡眠 ====================
|
||||
if (curEffs.睡眠) {
|
||||
switch (curEffs.睡眠.狀態) {
|
||||
case '精力充沛': endBonus += 1; intBonus += 5; perBonus += 5; break;
|
||||
case '疲倦': strBonus -= 5; endBonus -= 5; intBonus -= 5; perBonus -= 5; willBonus -= 5; break;
|
||||
case '非常疲憊': strBonus -= 15; endBonus -= 15; intBonus -= 15; perBonus -= 15; willBonus -= 15; break;
|
||||
case '精疲力竭': strBonus -= 30; endBonus -= 30; intBonus -= 30; perBonus -= 30; willBonus -= 30; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 疲勞 ====================
|
||||
if (curEffs.疲勞) {
|
||||
switch (curEffs.疲勞.狀態) {
|
||||
case '精力十足': strBonus += 2; break;
|
||||
case '微微出汗': strBonus -= 2; endBonus -= 2; break;
|
||||
case '有些疲憊': strBonus -= 5; endBonus -= 5; break;
|
||||
case '相當疲勞': strBonus -= 10; endBonus -= 10; break;
|
||||
case '筋疲力盡': strBonus -= 15; endBonus -= 15; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 壓力 ====================
|
||||
if (curEffs.壓力) {
|
||||
switch (curEffs.壓力.狀態) {
|
||||
case '心神沉靜': willBonus += 5; intBonus += 5; break;
|
||||
case '高度焦慮': willBonus -= 5; intBonus -= 5; break;
|
||||
case '不堪重負': willBonus -= 10; intBonus -= 10; break;
|
||||
case '精神崩潰': willBonus -= 20; intBonus -= 20; perBonus -= 10; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 無聊 ====================
|
||||
if (curEffs.無聊) {
|
||||
switch (curEffs.無聊.狀態) {
|
||||
case '興致盎然': intBonus += 3; perBonus += 3; break;
|
||||
case '感到無聊': intBonus -= 2; perBonus -= 2; break;
|
||||
case '非常無聊': intBonus -= 5; perBonus -= 5; break;
|
||||
case '極度無聊': intBonus -= 10; perBonus -= 10; willBonus -= 5; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 性慾 ====================
|
||||
if (curEffs.性慾) {
|
||||
switch (curEffs.性慾.狀態) {
|
||||
case '消退期': intBonus += 2; perBonus += 2; break;
|
||||
case '反應期': break; // 無影響
|
||||
case '持續期': intBonus -= 2; perBonus -= 2; break;
|
||||
case '興奮期': intBonus -= 5; willBonus -= 5; break;
|
||||
case '高潮期': intBonus -= 10; willBonus -= 10; break;
|
||||
case '失控期': intBonus -= 20; willBonus -= 20; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 排泄欲 ====================
|
||||
if (curEffs.排泄欲) {
|
||||
switch (curEffs.排泄欲.狀態) {
|
||||
case '輕微便意': intBonus -= 2; perBonus -= 2; break;
|
||||
case '明顯便意': intBonus -= 5; perBonus -= 5; break;
|
||||
case '快拉出來了': intBonus -= 10; perBonus -= 10; willBonus -= 5; break;
|
||||
case '大小便失禁': intBonus -= 20; perBonus -= 20; willBonus -= 10; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 體溫 ====================
|
||||
if (curEffs.體溫) {
|
||||
switch (curEffs.體溫.狀態) {
|
||||
case '體溫過低': strBonus -= 5; endBonus -= 5; intBonus -= 5; break;
|
||||
case '嚴重失溫': strBonus -= 10; endBonus -= 10; intBonus -= 10; willBonus -= 10; break;
|
||||
case '發燒': strBonus -= 5; endBonus -= 5; intBonus -= 5; willBonus -= 5; break;
|
||||
case '高熱': strBonus -= 10; endBonus -= 10; intBonus -= 10; willBonus -= 10; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 疼痛 ====================
|
||||
if (curEffs.疼痛) {
|
||||
switch (curEffs.疼痛.狀態) {
|
||||
case '輕微疼痛': intBonus -= 2; perBonus -= 2; break;
|
||||
case '劇烈疼痛': strBonus -= 10; endBonus -= 10; intBonus -= 10; perBonus -= 10; willBonus -= 10; break;
|
||||
case '極度痛苦': strBonus -= 15; endBonus -= 15; intBonus -= 15; perBonus -= 15; willBonus -= 15; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 清潔 ====================
|
||||
if (curEffs.清潔) {
|
||||
switch (curEffs.清潔.狀態) {
|
||||
case '有點髒': break; // 無屬性影響,主要影響免疫負荷
|
||||
case '污穢不堪': break; // 無屬性影響,主要影響免疫負荷
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 維生素 ====================
|
||||
if (curEffs.維生素) {
|
||||
switch (curEffs.維生素.狀態) {
|
||||
case '維生素缺乏': endBonus -= 5; intBonus -= 2; break;
|
||||
case '維生素嚴重缺乏': endBonus -= 10; intBonus -= 5; perBonus -= 5; break;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 氮平衡 ====================
|
||||
if (curEffs.氮平衡) {
|
||||
switch (curEffs.氮平衡.狀態) {
|
||||
case '負氮平衡': strBonus -= 5; endBonus -= 5; break;
|
||||
case '嚴重負氮平衡': strBonus -= 10; endBonus -= 10; break;
|
||||
}
|
||||
}
|
||||
|
||||
// 應用屬性加值
|
||||
set(vars, '屬性.耐力.加值', clamp(endBonus, -50, 50));
|
||||
set(vars, '屬性.力量.加值', clamp(strBonus, -50, 50));
|
||||
set(vars, '屬性.意志.加值', clamp(willBonus, -50, 50));
|
||||
set(vars, '屬性.智力.加值', clamp(intBonus, -50, 50));
|
||||
set(vars, '屬性.感知.加值', clamp(perBonus, -50, 50));
|
||||
|
||||
debugLog('屬性加值更新 - 力量:' + strBonus + ', 耐力:' + endBonus + ', 意志:' + willBonus + ', 智力:' + intBonus + ', 感知:' + perBonus);
|
||||
|
||||
var end = int(get(vars, '屬性.耐力.等級')) || 20;
|
||||
var will = int(get(vars, '屬性.意志.等級')) || 20;
|
||||
var str = int(get(vars, '屬性.力量.等級')) || 20;
|
||||
|
||||
var hpMax = 4 * end,
|
||||
spMax = 4 * will,
|
||||
baseCarry = 2 * str,
|
||||
carryBonus = 0;
|
||||
|
||||
var equip = get(vars, '裝備');
|
||||
if (_.isPlainObject(equip)) {
|
||||
_.forEach(equip, function(slot, slotName) {
|
||||
if (slotName.startsWith('$')) return;
|
||||
if (_.isPlainObject(slot)) {
|
||||
var bonus = int(get(slot, '負重加成'));
|
||||
if (Number.isFinite(bonus) && bonus > 0) carryBonus += bonus;
|
||||
}
|
||||
});
|
||||
}
|
||||
var carryMax = Math.round(baseCarry * (carryBonus > 0 ? carryBonus : 1));
|
||||
|
||||
if (lastSnapshot && lastSnapshot.hpMax && lastSnapshot.hpMax !== hpMax) {
|
||||
var newHp = scaleValue(lastSnapshot.hpCur, lastSnapshot.hpMax, hpMax);
|
||||
if (newHp !== get(vars, '生理.當前生命值')) {
|
||||
set(vars, '生理.當前生命值', newHp);
|
||||
logChange('生命值上限變化', '當前生命值按比例調整');
|
||||
}
|
||||
}
|
||||
|
||||
set(vars, '生理.生命值上限', hpMax);
|
||||
set(vars, '精神.精神值上限', spMax);
|
||||
set(vars, '狀態.負重上限', carryMax);
|
||||
|
||||
var totalWeight = 0;
|
||||
var items = get(vars, '攜帶物品');
|
||||
if (_.isPlainObject(items)) {
|
||||
_.forEach(items, function(item, key) {
|
||||
if (key.startsWith('$')) return;
|
||||
var q = get(item, '數量'), w = get(item, '重量');
|
||||
if (Number.isFinite(q) && Number.isFinite(w) && q > 0 && w > 0) totalWeight += q * w;
|
||||
});
|
||||
}
|
||||
if (_.isPlainObject(equip)) {
|
||||
_.forEach(equip, function(slot, slotName) {
|
||||
if (slotName.startsWith('$')) return;
|
||||
if (_.isPlainObject(slot)) {
|
||||
var w = get(slot, '重量');
|
||||
if (Number.isFinite(w) && w > 0) totalWeight += w;
|
||||
}
|
||||
});
|
||||
}
|
||||
set(vars, '狀態.當前負重', Math.round(totalWeight * 100) / 100);
|
||||
|
||||
var hpCur = get(vars, '生理.當前生命值');
|
||||
if (hpCur > hpMax) {
|
||||
set(vars, '生理.當前生命值', hpMax);
|
||||
logChange('邊界修正', '當前生命值 ' + hpCur + ' → ' + hpMax);
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
var spCur = get(vars, '精神.當前精神值');
|
||||
if (spCur > spMax) {
|
||||
set(vars, '精神.當前精神值', spMax);
|
||||
logChange('邊界修正', '當前精神值 ' + spCur + ' → ' + spMax);
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
var fatigueMax = 4 * end,
|
||||
fatigue = get(vars, '狀態.疲勞');
|
||||
if (fatigue > fatigueMax) {
|
||||
set(vars, '狀態.疲勞', fatigueMax);
|
||||
logChange('邊界修正', '疲勞 ' + fatigue + ' → ' + fatigueMax);
|
||||
fixCount++;
|
||||
} else if (fatigue < 0) {
|
||||
set(vars, '狀態.疲勞', 0);
|
||||
logChange('邊界修正', '疲勞 ' + fatigue + ' → 0');
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
var carbs = get(vars, '生理.碳水');
|
||||
if (carbs > 2000) {
|
||||
var excess = carbs - 2000,
|
||||
toFat = Math.round(excess * 0.75);
|
||||
set(vars, '生理.碳水', 2000);
|
||||
var oldFat = get(vars, '生理.脂肪') || 0;
|
||||
set(vars, '生理.脂肪', oldFat + toFat);
|
||||
logChange('碳水轉脂肪', '超出' + excess + 'kcal → +' + toFat + 'kcal脂肪');
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
var bounds = [
|
||||
{ p: '屬性.力量.加值', min: -50, max: 50 },
|
||||
{ p: '屬性.敏捷.加值', min: -50, max: 50 },
|
||||
{ p: '屬性.耐力.加值', min: -50, max: 50 },
|
||||
{ p: '屬性.智力.加值', min: -50, max: 50 },
|
||||
{ p: '屬性.感知.加值', min: -50, max: 50 },
|
||||
{ p: '屬性.意志.加值', min: -50, max: 50 },
|
||||
{ p: '生理.水分', min: 0, max: 100 },
|
||||
{ p: '生理.碳水', min: 0, max: 2000 },
|
||||
{ p: '生理.脂肪', min: 0, max: 100000 },
|
||||
{ p: '生理.蛋白質', min: 0, max: 2400 },
|
||||
{ p: '生理.維生素', min: 0, max: 100 },
|
||||
{ p: '生理.氮平衡', min: -100, max: 100 },
|
||||
{ p: '生理.免疫負荷', min: 0, max: 100 },
|
||||
{ p: '生理.體溫', min: 35, max: 40 },
|
||||
{ p: '生理.排泄欲', min: 0, max: 100 },
|
||||
{ p: '精神.壓力', min: 0, max: 100 },
|
||||
{ p: '精神.無聊', min: 0, max: 100 },
|
||||
{ p: '精神.孤獨', min: 0, max: 100 },
|
||||
{ p: '精神.睡眠', min: 0, max: 100 },
|
||||
{ p: '精神.性慾', min: 0, max: 100 },
|
||||
{ p: '生理.飽腹感', min: 0, max: 100 },
|
||||
{ p: '狀態.表皮溼度', min: 0, max: 100 },
|
||||
{ p: '狀態.感染', min: 0, max: 100 },
|
||||
{ p: '狀態.清潔', min: 0, max: 100 },
|
||||
{ p: '狀態.疼痛', min: 0, max: 100 },
|
||||
{ p: '系統.生存點數', min: 0, max: 99999 },
|
||||
{ p: '系統.奇蹟點數', min: 0, max: 99999 }
|
||||
];
|
||||
bounds.forEach(function(b) {
|
||||
var val = get(vars, b.p);
|
||||
if (Number.isFinite(val)) {
|
||||
var nv = clamp(val, b.min, b.max);
|
||||
if (nv !== val) {
|
||||
set(vars, b.p, nv);
|
||||
logChange('邊界修正', b.p + ' ' + val + ' → ' + nv);
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
processCompanionLimits(vars);
|
||||
}
|
||||
|
||||
// ======================== 狀態效果生成 ========================
|
||||
var statusCache = null;
|
||||
|
||||
function processStatusEffects(vars) {
|
||||
var cur = getCurrentTime(vars);
|
||||
if (!cur) return;
|
||||
|
||||
var water = int(get(vars, '生理.水分')) || 0;
|
||||
var excretion = int(get(vars, '生理.排泄欲')) || 0;
|
||||
var stress = int(get(vars, '精神.壓力')) || 0;
|
||||
var lust = int(get(vars, '精神.性慾')) || 0;
|
||||
var boring = int(get(vars, '精神.無聊')) || 0;
|
||||
var sleep = int(get(vars, '精神.睡眠')) || 0;
|
||||
var vit = int(get(vars, '生理.維生素')) || 0;
|
||||
var temp = int(get(vars, '生理.體溫')) || 37;
|
||||
var full = int(get(vars, '生理.飽腹感')) || 0;
|
||||
var fatigue = int(get(vars, '狀態.疲勞')) || 0;
|
||||
var nitrogen = int(get(vars, '生理.氮平衡')) || 0;
|
||||
var skin = int(get(vars, '狀態.表皮溼度')) || 0;
|
||||
var clean = int(get(vars, '狀態.清潔')) || 0;
|
||||
var pain = int(get(vars, '狀態.疼痛')) || 0;
|
||||
|
||||
var end = int(get(vars, '屬性.耐力.等級')) || 20;
|
||||
var will = int(get(vars, '屬性.意志.等級')) || 20;
|
||||
var str = int(get(vars, '屬性.力量.等級')) || 20;
|
||||
var maxFatigue = 4 * end;
|
||||
var fatiguePerc = maxFatigue > 0 ? fatigue / maxFatigue * 100 : 0;
|
||||
|
||||
var effects = {};
|
||||
var statuses = {};
|
||||
|
||||
function add(k, name, desc) {
|
||||
effects[k] = { 狀態: name, 效果: desc };
|
||||
statuses[k] = { name: name, value: arguments[3] };
|
||||
}
|
||||
|
||||
// 排泄欲效果
|
||||
if (excretion >= 100) add('排泄欲', '大小便失禁', '達到極限無法控制,直接在原地大小便失禁。', excretion);
|
||||
else if (excretion >= 71) add('排泄欲', '快拉出來了', '已經到了極限邊緣,頻繁放臭屁、漏尿,急著要找地方解放。', excretion);
|
||||
else if (excretion >= 51) add('排泄欲', '明顯便意', '腦中都是想要找地方拉屎或放尿,注意力難以集中。', excretion);
|
||||
else if (excretion >= 31) add('排泄欲', '輕微便意', '有點尿意想上廁所,但是還能忍耐。', excretion);
|
||||
else add('排泄欲', '消化正常', '無特殊效果。', excretion);
|
||||
|
||||
// 水分
|
||||
if (water > 90) add('水分', '水分充足', '身體水分充足,精神飽滿。所有與耐力相關的檢定獲得+5背景加值。', water);
|
||||
else if (water > 70) add('水分', '狀態正常', '沒什麼特別的感覺。', water);
|
||||
else if (water > 50) add('水分', '輕微口渴', '喉嚨有點幹,下意識想找水喝,注意力有點不集中。所有智力、感知相關檢定受到-2減值。', water);
|
||||
else if (water > 30) add('水分', '明顯口渴', '口乾舌燥,感覺有些煩躁,身體在強烈要求補水。所有重體力相關檢定(如力量、耐力)受到-5減值。', water);
|
||||
else if (water > 10) add('水分', '輕度脫水', '嘴脣乾裂,頭暈乏力,身體因缺水而變得遲鈍。所有重體力相關檢定受到-10減值。', water);
|
||||
else if (water > 0) add('水分', '嚴重脫水', '嚴重缺水,視野開始模糊,身體機能受到明顯影響,必須立刻補充水分。所有重體力相關檢定受到-15減值。', water);
|
||||
else add('水分', '瀕死:脫水', '身體因嚴重缺水而瀕臨崩潰。', water);
|
||||
|
||||
// 壓力
|
||||
if (stress < 10) add('壓力', '心神沉靜', '思維清晰,內心平靜。所有與意志和智力相關的檢定獲得+5加值', stress);
|
||||
else if (stress < 50) add('壓力', '狀態正常', '無特殊效果', stress);
|
||||
else if (stress < 80) add('壓力', '高度焦慮', '壓力極大,內心充滿焦慮和不安。所有檢定受到 -5 減值。', stress);
|
||||
else if (stress < 100) add('壓力', '不堪重負', '巨大的壓力使你瀕臨崩潰邊緣。所有檢定受到 -10 減值。', stress);
|
||||
else add('壓力', '精神崩潰', '精神防線徹底崩潰,角色陷入恐慌、偏執或絕望狀態。', stress);
|
||||
|
||||
// 性慾
|
||||
if (lust < 10) add('性慾', '消退期', '日常工作狀態,此時專注力提升,反應能力非常好。', lust);
|
||||
else if (lust < 25) add('性慾', '反應期', '開始會注意異性的身體曲線,被觸碰時會有輕微感覺。', lust);
|
||||
else if (lust < 45) add('性慾', '持續期', '盯著女性的胸部、臀部看,陰莖時不時半勃起,出現舔唇動作。', lust);
|
||||
else if (lust < 65) add('性慾', '興奮期', '主動觸碰女性身體,做出親密接觸,渴望更進一步。', lust);
|
||||
else if (lust < 85) add('性慾', '高潮期', '強烈渴望,克制力降到最低點,只要女性不強烈抗拒就會直接發生性愛。', lust);
|
||||
else add('性慾', '失控期', '理智幾乎喪失,陰莖硬到發痛。即使女性抗拒也會強行發生性愛。', lust);
|
||||
|
||||
// 無聊
|
||||
if (boring < 10) add('無聊', '興致盎然', '對周圍的一切充滿好奇和探索欲。技能經驗獲取幅度提升20%', boring);
|
||||
else if (boring < 50) add('無聊', '狀態正常', '無特殊效果', boring);
|
||||
else if (boring < 80) add('無聊', '感到無聊', '缺乏精神刺激讓你感到煩悶。', boring);
|
||||
else if (boring < 95) add('無聊', '非常無聊', '感到極度乏味,對什麼都提不起興趣。', boring);
|
||||
else add('無聊', '極度無聊', '單調的生活令人窒息,你迫切需要做點什麼來改變現狀。', boring);
|
||||
|
||||
// 睡眠
|
||||
if (sleep > 90) add('睡眠', '精力充沛', '充足的睡眠讓你恢復了所有精力。疲勞恢復速度加倍,精神屬性和技能相關檢定+5', sleep);
|
||||
else if (sleep > 60) add('睡眠', '狀態正常', '無特殊效果', sleep);
|
||||
else if (sleep > 30) add('睡眠', '疲倦', '開始感到身體和精神的疲勞。所有屬性檢定受到 -5 減值', sleep);
|
||||
else if (sleep > 0) add('睡眠', '非常疲憊', '嚴重缺乏睡眠,眼皮沉重,反應遲鈍。所有屬性檢定受到 -15 減值。', sleep);
|
||||
else add('睡眠', '精疲力竭', '身體達到極限,隨時可能因過度疲勞而昏倒。', sleep);
|
||||
|
||||
// 維生素
|
||||
if (vit > 80) add('維生素', '維生素充足', '維生素充足', vit);
|
||||
else if (vit > 30) add('維生素', '狀態正常', '無特殊效果', vit);
|
||||
else if (vit > 0) add('維生素', '維生素缺乏', '身體出現多種不良反應,更快疲勞等', vit);
|
||||
else add('維生素', '維生素嚴重缺乏', '出現壞血病、夜盲症等嚴重疾病', vit);
|
||||
|
||||
// 體溫
|
||||
if (temp > 40) add('體溫', '高熱', '身體滾燙,意識模糊,嚴重高燒讓人難以思考。所有屬性檢定-10減值。', temp);
|
||||
else if (temp > 38) add('體溫', '發燒', '身體發燙,感到乏力、惡寒,身體非常不適。所有屬性檢定-5減值。', temp);
|
||||
else if (temp > 36) add('體溫', '狀態正常', '體溫正常,沒什麼不適。', temp);
|
||||
else if (temp > 34) add('體溫', '體溫過低', '身體開始顫抖,手腳冰冷,思維和行動變得遲緩。所有屬性檢定-5減值。', temp);
|
||||
else add('體溫', '嚴重失溫', '身體劇烈顫抖,意識開始模糊,再這樣下去會有生命危險。所有屬性檢定-10減值。', temp);
|
||||
|
||||
// 飽腹感
|
||||
if (full > 95) add('飽腹感', '過飽', '吃撐了,行動有點不方便。所有敏捷和耐力相關檢定受到-5減值。', full);
|
||||
else if (full > 85) add('飽腹感', '飽足', '吃飽喝足,感覺充滿能量,體力充沛,疲勞感不易累積。', full);
|
||||
else if (full > 60) add('飽腹感', '狀態正常', '沒什麼特別的感覺。', full);
|
||||
else if (full > 30) add('飽腹感', '輕微飢餓', '肚子有點空,開始期待下一頓飯。', full);
|
||||
else if (full > 10) add('飽腹感', '明顯飢餓', '肚子在咕咕叫,有點想吃東西了,注意力難以集中。所有屬性檢定受到-5減值。', full);
|
||||
else if (full > 0) add('飽腹感', '極度飢餓', '餓得前胸貼後背,身體因爲缺乏能量而感到虛弱,必須儘快進食。所有屬性檢定受到-15減值。', full);
|
||||
else add('飽腹感', '虛脫', '身體因能量儲備完全耗盡而極度虛弱,各項機能開始下降,身體正在消耗自身以維持生命。必須立即進食以阻止進一步惡化。', full);
|
||||
|
||||
// 疲勞
|
||||
if (fatiguePerc < 10) add('疲勞', '精力十足', '渾身是勁,感覺還能再戰三百回合。所有與力量和耐力相關檢定獲得+5背景加值。', fatigue);
|
||||
else if (fatiguePerc <= 30) add('疲勞', '狀態正常', '身體狀態良好,沒什麼特別的感覺。', fatigue);
|
||||
else if (fatiguePerc <= 50) add('疲勞', '微微出汗', '身體開始發熱,呼吸稍微加快,但還遠未到累的時候。', fatigue);
|
||||
else if (fatiguePerc <= 70) add('疲勞', '有些疲憊', '肌肉微微發酸,呼吸比平時稍重,是時候考慮歇一歇了。所有重體力相關檢定受到-5減值。', fatigue);
|
||||
else if (fatiguePerc <= 90) add('疲勞', '相當疲勞', '身體變得沉重,每一下動作都需要更多力氣,疲倦感十分明顯。所有重體力相關檢定受到-10減值。', fatigue);
|
||||
else add('疲勞', '筋疲力盡', '身體非常沉重,每一下動作都變得吃力,只想找個地方坐下來喘口氣。所有重體力相關檢定受到-15減值。', fatigue);
|
||||
|
||||
// 氮平衡
|
||||
if (nitrogen > 75) add('氮平衡', '正氮平衡', '身體處於合成代謝狀態,有利於組織生長和修復。1.5倍力量經驗增長,更快從疲勞恢復', nitrogen);
|
||||
else if (nitrogen > -50) add('氮平衡', '狀態正常', '無特殊效果', nitrogen);
|
||||
else if (nitrogen > -90) add('氮平衡', '負氮平衡', '身體處於分解代謝狀態,肌肉開始流失,感到無力。力量和耐力相關檢定-5減值', nitrogen);
|
||||
else add('氮平衡', '嚴重負氮平衡', '嚴重的組織蛋白分解,身體虛弱。力量和耐力相關檢定-10減值', nitrogen);
|
||||
|
||||
// 表皮溼度
|
||||
if (skin > 80) add('表皮溼度', '全身溼透', '衣物和皮膚完全溼透,非常不適,體溫流失速度加快。在寒冷環境中更容易觸發"體溫過低"狀態', skin);
|
||||
else if (skin > 40) add('表皮溼度', '潮溼', '皮膚和衣物感到潮溼,略有不適', skin);
|
||||
else if (skin > 20) add('表皮溼度', '狀態正常', '無特殊效果', skin);
|
||||
else add('表皮溼度', '皮膚乾燥', '皮膚缺水,感到緊繃和輕微的瘙癢', skin);
|
||||
|
||||
// 清潔
|
||||
if (clean > 90) add('清潔', '乾淨整潔', '全身清爽,心情愉悅。精神值自然恢復速度提升10%', clean);
|
||||
else if (clean > 40) add('清潔', '狀態正常', '無特殊效果', clean);
|
||||
else if (clean > 10) add('清潔', '有點髒', '身上有污垢或異味,讓人不適。', clean);
|
||||
else add('清潔', '污穢不堪', '全身骯髒,散發惡臭,大大增加感染疾病的風險。', clean);
|
||||
|
||||
// 疼痛
|
||||
if (pain > 90) add('疼痛', '極度痛苦', '難以忍受的劇痛,幾乎無法思考和行動。所有檢定受到-15減值,有概率因劇痛而昏厥', pain);
|
||||
else if (pain > 50) add('疼痛', '劇烈疼痛', '強烈的疼痛感嚴重干擾了專注力。所有檢定受到-10減值', pain);
|
||||
else if (pain > 10) add('疼痛', '輕微疼痛', '持續的隱痛讓人煩躁,分散注意力。所有與智力、感知相關的檢定受到-2減值', pain);
|
||||
else add('疼痛', '狀態正常', '無特殊效果', pain);
|
||||
|
||||
var ignoreList = ['狀態正常', '沒什麼特別的感覺', '無特殊感覺', '無特殊效果', '體溫正常', '皮膚乾燥', '興致盎然', '精力充沛', '心神沉靜', '乾淨整潔'];
|
||||
for (var k in statuses) {
|
||||
if (ignoreList.includes(statuses[k].name)) delete statuses[k];
|
||||
}
|
||||
|
||||
var curEff = get(vars, '狀態.生效效果') || {};
|
||||
for (var k in effects) {
|
||||
var newEff = effects[k], old = curEff[k];
|
||||
if (!old || old.狀態 !== newEff.狀態 || old.效果 !== newEff.效果) {
|
||||
set(vars, '狀態.生效效果.' + k, newEff);
|
||||
logChange('生效效果更新', k + ': ' + newEff.狀態);
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
|
||||
for (var k in curEff) {
|
||||
if (k.startsWith('$')) continue;
|
||||
if (!effects[k] && curEff[k] !== undefined) {
|
||||
set(vars, '狀態.生效效果.' + k, null);
|
||||
}
|
||||
}
|
||||
|
||||
// 持續傷害計算(路徑已更新)
|
||||
if (statusCache && cur) {
|
||||
var prev = statusCache.time;
|
||||
var delta = (cur.total - prev.total) / 60;
|
||||
if (delta > 0 && statusCache.statuses) {
|
||||
var oldStats = statusCache.statuses;
|
||||
var damageStates = [
|
||||
'明顯口渴', '輕度脫水', '嚴重脫水', '過飽',
|
||||
'明顯飢餓', '極度飢餓', '虛脫', '相當疲勞', '筋疲力盡',
|
||||
'高度焦慮', '不堪重負', '感到無聊', '非常無聊', '極度無聊',
|
||||
'高熱', '發燒', '體溫過低', '嚴重失溫',
|
||||
'極度痛苦', '劇烈疼痛', '有點髒', '污穢不堪'
|
||||
];
|
||||
for (var k in statuses) {
|
||||
var s = statuses[k], old = oldStats[k];
|
||||
var effectiveName = s.name;
|
||||
if (old && old.name !== s.name && damageStates.includes(old.name)) effectiveName = old.name;
|
||||
if (damageStates.includes(effectiveName)) {
|
||||
debugLog('持續傷害觸發: ' + effectiveName + ', 時間差: ' + delta.toFixed(2) + '小時');
|
||||
switch(effectiveName) {
|
||||
case '明顯口渴':
|
||||
var newSp1 = clamp((get(vars, '精神.當前精神值')||0) - 0.5 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp1);
|
||||
logChange('持續傷害', '明顯口渴:精神值 -' + (0.5 * delta).toFixed(2) + ' → ' + newSp1.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '輕度脫水':
|
||||
var newHp2 = clamp((get(vars, '生理.當前生命值')||0) - 0.5 * delta, 0, 1000);
|
||||
var newSp2 = clamp((get(vars, '精神.當前精神值')||0) - 0.5 * delta, 0, 100);
|
||||
set(vars, '生理.當前生命值', newHp2);
|
||||
set(vars, '精神.當前精神值', newSp2);
|
||||
logChange('持續傷害', '輕度脫水:生命/精神值各 -' + (0.5 * delta).toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '嚴重脫水':
|
||||
var newHp3 = clamp((get(vars, '生理.當前生命值')||0) - 1 * delta, 0, 1000);
|
||||
var newSp3 = clamp((get(vars, '精神.當前精神值')||0) - 1 * delta, 0, 100);
|
||||
var newLoad3 = clamp(get(vars, '生理.免疫負荷') + 0.5 * delta, 0, 100);
|
||||
set(vars, '生理.當前生命值', newHp3);
|
||||
set(vars, '精神.當前精神值', newSp3);
|
||||
set(vars, '生理.免疫負荷', newLoad3);
|
||||
logChange('持續傷害', '嚴重脫水:生命/精神值各 -' + (1 * delta).toFixed(2) + ',免疫負荷 +' + (0.5 * delta).toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '過飽':
|
||||
var newFat4 = clamp(get(vars, '狀態.疲勞') + 1 * delta, 0, 4 * end);
|
||||
set(vars, '狀態.疲勞', newFat4);
|
||||
logChange('持續傷害', '過飽:疲勞值 +' + (1 * delta).toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '明顯飢餓':
|
||||
var newSp5 = clamp((get(vars, '精神.當前精神值')||0) - 0.5 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp5);
|
||||
logChange('持續傷害', '明顯飢餓:精神值 -' + (0.5 * delta).toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '極度飢餓':
|
||||
var newHp6 = clamp((get(vars, '生理.當前生命值')||0) - 0.5 * delta, 0, 1000);
|
||||
var newSp6 = clamp((get(vars, '精神.當前精神值')||0) - 1 * delta, 0, 100);
|
||||
set(vars, '生理.當前生命值', newHp6);
|
||||
set(vars, '精神.當前精神值', newSp6);
|
||||
if (get(vars, '環境.體感溫度') < get(vars, '狀態.最低舒適溫度')) {
|
||||
var newTemp6 = clamp(get(vars, '生理.體溫') - 0.5 * delta, 35, 40);
|
||||
set(vars, '生理.體溫', newTemp6);
|
||||
logChange('持續傷害', '極度飢餓(寒冷環境):生命值 -' + (0.5 * delta).toFixed(2) + ',精神值 -' + (1 * delta).toFixed(2) + ',體溫 -0.5℃');
|
||||
} else {
|
||||
logChange('持續傷害', '極度飢餓:生命值 -' + (0.5 * delta).toFixed(2) + ',精神值 -' + (1 * delta).toFixed(2));
|
||||
}
|
||||
fixCount++;
|
||||
break;
|
||||
case '虛脫':
|
||||
var newHp7 = clamp((get(vars, '生理.當前生命值')||0) - 1 * delta, 0, 1000);
|
||||
var newSp7 = clamp((get(vars, '精神.當前精神值')||0) - 2 * delta, 0, 100);
|
||||
set(vars, '生理.當前生命值', newHp7);
|
||||
set(vars, '精神.當前精神值', newSp7);
|
||||
if (get(vars, '環境.體感溫度') < get(vars, '狀態.最低舒適溫度')) {
|
||||
var newTemp7 = clamp(get(vars, '生理.體溫') - 0.5 * delta, 35, 40);
|
||||
set(vars, '生理.體溫', newTemp7);
|
||||
logChange('持續傷害', '虛脫(寒冷環境):生命值 -' + (1 * delta).toFixed(2) + ',精神值 -' + (2 * delta).toFixed(2) + ',體溫 -0.5℃');
|
||||
} else {
|
||||
logChange('持續傷害', '虛脫:生命值 -' + (1 * delta).toFixed(2) + ',精神值 -' + (2 * delta).toFixed(2));
|
||||
}
|
||||
fixCount++;
|
||||
break;
|
||||
case '相當疲勞':
|
||||
var newImm8 = clamp(get(vars, '狀態.免疫力') - 0.5 * delta, 0, 100);
|
||||
set(vars, '狀態.免疫力', newImm8);
|
||||
logChange('持續傷害', '相當疲勞:免疫力 -' + (0.5 * delta).toFixed(2) + ' → ' + newImm8.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '筋疲力盡':
|
||||
var newImm9 = clamp(get(vars, '狀態.免疫力') - 1 * delta, 0, 100);
|
||||
var newSleep9 = clamp(get(vars, '精神.睡眠') - 0.5 * delta, 0, 100);
|
||||
set(vars, '狀態.免疫力', newImm9);
|
||||
set(vars, '精神.睡眠', newSleep9);
|
||||
logChange('持續傷害', '筋疲力盡:免疫力 -' + (1 * delta).toFixed(2) + ' → ' + newImm9.toFixed(2) + ',睡眠值 -' + (0.5 * delta).toFixed(2) + ' → ' + newSleep9.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '高度焦慮':
|
||||
var newSp10 = clamp((get(vars, '精神.當前精神值')||0) - 0.3 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp10);
|
||||
logChange('持續傷害', '高度焦慮:精神值 -' + (0.3 * delta).toFixed(2) + ' → ' + newSp10.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '不堪重負':
|
||||
var newSp11 = clamp((get(vars, '精神.當前精神值')||0) - 0.5 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp11);
|
||||
logChange('持續傷害', '不堪重負:精神值 -' + (0.5 * delta).toFixed(2) + ' → ' + newSp11.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '感到無聊':
|
||||
var newSp12 = clamp((get(vars, '精神.當前精神值')||0) - 0.3 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp12);
|
||||
logChange('持續傷害', '感到無聊:精神值 -' + (0.3 * delta).toFixed(2) + ' → ' + newSp12.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '非常無聊':
|
||||
var newSp13 = clamp((get(vars, '精神.當前精神值')||0) - 0.5 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp13);
|
||||
logChange('持續傷害', '非常無聊:精神值 -' + (0.5 * delta).toFixed(2) + ' → ' + newSp13.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '極度無聊':
|
||||
var newSp14 = clamp((get(vars, '精神.當前精神值')||0) - 0.8 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp14);
|
||||
logChange('持續傷害', '極度無聊:精神值 -' + (0.8 * delta).toFixed(2) + ' → ' + newSp14.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '高熱':
|
||||
var newHp15 = clamp((get(vars, '生理.當前生命值')||0) - 1 * delta, 0, 1000);
|
||||
var newSp15 = clamp((get(vars, '精神.當前精神值')||0) - 1 * delta, 0, 100);
|
||||
set(vars, '生理.當前生命值', newHp15);
|
||||
set(vars, '精神.當前精神值', newSp15);
|
||||
logChange('持續傷害', '高熱:生命/精神值各 -' + (1 * delta).toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '發燒':
|
||||
var newHp16 = clamp((get(vars, '生理.當前生命值')||0) - 0.5 * delta, 0, 1000);
|
||||
var newSp16 = clamp((get(vars, '精神.當前精神值')||0) - 0.5 * delta, 0, 100);
|
||||
set(vars, '生理.當前生命值', newHp16);
|
||||
set(vars, '精神.當前精神值', newSp16);
|
||||
logChange('持續傷害', '發燒:生命/精神值各 -' + (0.5 * delta).toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '體溫過低':
|
||||
var newFat17 = clamp(get(vars, '狀態.疲勞') + 1.5 * delta, 0, 4 * end);
|
||||
set(vars, '狀態.疲勞', newFat17);
|
||||
logChange('持續傷害', '體溫過低:疲勞值 +' + (1.5 * delta).toFixed(2) + ' → ' + newFat17.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '嚴重失溫':
|
||||
var newHp18 = clamp((get(vars, '生理.當前生命值')||0) - 1.5 * delta, 0, 1000);
|
||||
var newFat18 = clamp(get(vars, '狀態.疲勞') + 2.5 * delta, 0, 4 * end);
|
||||
set(vars, '生理.當前生命值', newHp18);
|
||||
set(vars, '狀態.疲勞', newFat18);
|
||||
logChange('持續傷害', '嚴重失溫:生命值 -' + (1.5 * delta).toFixed(2) + ',疲勞值 +' + (2.5 * delta).toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '極度痛苦':
|
||||
var newSp19 = clamp((get(vars, '精神.當前精神值')||0) - 1.5 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp19);
|
||||
logChange('持續傷害', '極度痛苦:精神值 -' + (1.5 * delta).toFixed(2) + ' → ' + newSp19.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '劇烈疼痛':
|
||||
var newSp20 = clamp((get(vars, '精神.當前精神值')||0) - 0.5 * delta, 0, 100);
|
||||
set(vars, '精神.當前精神值', newSp20);
|
||||
logChange('持續傷害', '劇烈疼痛:精神值 -' + (0.5 * delta).toFixed(2) + ' → ' + newSp20.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '有點髒':
|
||||
var newLoad21 = clamp(get(vars, '生理.免疫負荷') + 0.3 * delta, 0, 100);
|
||||
set(vars, '生理.免疫負荷', newLoad21);
|
||||
logChange('持續傷害', '有點髒:免疫負荷 +' + (0.3 * delta).toFixed(2) + ' → ' + newLoad21.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
case '污穢不堪':
|
||||
var newLoad22 = clamp(get(vars, '生理.免疫負荷') + 0.5 * delta, 0, 100);
|
||||
set(vars, '生理.免疫負荷', newLoad22);
|
||||
logChange('持續傷害', '污穢不堪:免疫負荷 +' + (0.5 * delta).toFixed(2) + ' → ' + newLoad22.toFixed(2));
|
||||
fixCount++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 計算最終生命上限和免疫力
|
||||
var baseHpMax = 4 * end, immunity = end;
|
||||
|
||||
if (statuses.氮平衡 && statuses.氮平衡.name === '嚴重負氮平衡') {
|
||||
baseHpMax -= 10;
|
||||
immunity -= 10;
|
||||
}
|
||||
|
||||
if (statuses.維生素) {
|
||||
switch(statuses.維生素.name) {
|
||||
case '維生素充足': immunity += 5; break;
|
||||
case '維生素缺乏': immunity -= 5; break;
|
||||
case '維生素嚴重缺乏': immunity -= 10; break;
|
||||
}
|
||||
}
|
||||
|
||||
if (statuses.體溫) {
|
||||
switch(statuses.體溫.name) {
|
||||
case '發燒': immunity += 5; break;
|
||||
case '高熱': immunity += 10; break;
|
||||
}
|
||||
}
|
||||
var oldStatsForImmunity = (statusCache && statusCache.statuses) ? statusCache.statuses : {};
|
||||
|
||||
if (statuses.疲勞 && statuses.疲勞.name === '相當疲勞' && (!oldStatsForImmunity.疲勞 || oldStatsForImmunity.疲勞.name !== '相當疲勞')) immunity -= 2;
|
||||
if (statuses.疲勞 && statuses.疲勞.name === '筋疲力盡' && (!oldStatsForImmunity.疲勞 || oldStatsForImmunity.疲勞.name !== '筋疲力盡')) immunity -= 4;
|
||||
|
||||
var spMax = 4 * will;
|
||||
var spCur2 = get(vars, '精神.當前精神值');
|
||||
if (spCur2 > spMax) {
|
||||
set(vars, '精神.當前精神值', spMax);
|
||||
logChange('邊界修正', '當前精神值 ' + spCur2 + ' → ' + spMax);
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
var immLoadCurr = get(vars, '生理.免疫負荷');
|
||||
if (immLoadCurr > 100) {
|
||||
set(vars, '生理.免疫負荷', 100);
|
||||
logChange('邊界修正', '免疫負荷 ' + immLoadCurr + ' → 100');
|
||||
fixCount++;
|
||||
} else if (immLoadCurr < 0) {
|
||||
set(vars, '生理.免疫負荷', 0);
|
||||
logChange('邊界修正', '免疫負荷 ' + immLoadCurr + ' → 0');
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
var curImmunity = get(vars, '狀態.免疫力');
|
||||
var finalImm = clamp(immunity, 0, 100);
|
||||
if (curImmunity !== finalImm) {
|
||||
set(vars, '狀態.免疫力', finalImm);
|
||||
logChange('免疫力修正', curImmunity + ' → ' + finalImm);
|
||||
fixCount++;
|
||||
}
|
||||
|
||||
statusCache = { time: cur, statuses: statuses };
|
||||
}
|
||||
|
||||
// ======================== 清理已完結的劇情演出 ========================
|
||||
function cleanupCompletedPerformances(vars) {
|
||||
var comps = get(vars, '同伴');
|
||||
if (!_.isPlainObject(comps)) return;
|
||||
|
||||
for (var name in comps) {
|
||||
if (name.startsWith('$')) continue;
|
||||
|
||||
var performances = get(vars, '同伴.' + name + '.劇情演出');
|
||||
if (!Array.isArray(performances) || performances.length === 0) continue;
|
||||
|
||||
// 收集需要刪除的主題
|
||||
var themesToDelete = {};
|
||||
|
||||
// 第一遍:分析每個主題的狀態
|
||||
for (var i = 0; i < performances.length; i++) {
|
||||
var perf = performances[i];
|
||||
if (typeof perf !== 'string') continue;
|
||||
|
||||
// 解析格式:事件-主題-序號-狀態:描述
|
||||
var match = perf.match(/^事件-([^-]+)-(\d+)-(.+?):(.+)$/);
|
||||
if (!match) continue;
|
||||
|
||||
var theme = match[1];
|
||||
var seq = parseInt(match[2]);
|
||||
var status = match[3];
|
||||
var desc = match[4];
|
||||
|
||||
if (!themesToDelete[theme]) {
|
||||
themesToDelete[theme] = {
|
||||
maxSeq: 0,
|
||||
hasCompleted: false,
|
||||
indices: []
|
||||
};
|
||||
}
|
||||
|
||||
themesToDelete[theme].indices.push(i);
|
||||
if (seq > themesToDelete[theme].maxSeq) {
|
||||
themesToDelete[theme].maxSeq = seq;
|
||||
}
|
||||
if (status === '已完成') {
|
||||
themesToDelete[theme].hasCompleted = true;
|
||||
}
|
||||
}
|
||||
|
||||
// 第二遍:從後往前刪除(避免索引錯亂)
|
||||
var indicesToRemove = [];
|
||||
for (var theme in themesToDelete) {
|
||||
var info = themesToDelete[theme];
|
||||
|
||||
// 規則:當序號達到 5 且最後一個事件已完成時,刪除整個主題
|
||||
if (info.maxSeq >= 5 && info.hasCompleted) {
|
||||
indicesToRemove.push(...info.indices);
|
||||
logChange('劇情演出清理', name + ' 主題「' + theme + '」序號已達 ' + info.maxSeq + ',已完結,刪除 ' + info.indices.length + ' 條');
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// 從後往前刪除(保持索引有效)
|
||||
if (indicesToRemove.length > 0) {
|
||||
indicesToRemove.sort((a, b) => b - a);
|
||||
for (var i = 0; i < indicesToRemove.length; i++) {
|
||||
performances.splice(indicesToRemove[i], 1);
|
||||
}
|
||||
set(vars, '同伴.' + name + '.劇情演出', performances);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ======================== 任務和商店處理 ========================
|
||||
function processTasksAndShop(vars) {
|
||||
function updateTaskCompletion(tp) {
|
||||
var task = get(vars, tp);
|
||||
if (!_.isPlainObject(task) || !task.狀態) return;
|
||||
var changed = false;
|
||||
|
||||
var baseReqs = get(task, '任務要求');
|
||||
if (_.isPlainObject(baseReqs)) {
|
||||
var allDone = true;
|
||||
for (var k in baseReqs) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var req = baseReqs[k],
|
||||
newReq = checkRequirement(req);
|
||||
if (newReq !== req) {
|
||||
set(vars, tp + '.任務要求.' + k, newReq);
|
||||
changed = true;
|
||||
}
|
||||
if (!newReq.已完成) allDone = false;
|
||||
}
|
||||
var curDone = get(task, '完成情況.基礎要求完成');
|
||||
if (allDone !== curDone) {
|
||||
set(vars, tp + '.完成情況.基礎要求完成', allDone);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
var advReqs = get(task, '進階目標');
|
||||
if (_.isPlainObject(advReqs)) {
|
||||
var allDone = true;
|
||||
for (var k in advReqs) {
|
||||
if (k.startsWith('$')) continue;
|
||||
var req = advReqs[k],
|
||||
newReq = checkRequirement(req);
|
||||
if (newReq !== req) {
|
||||
set(vars, tp + '.進階目標.' + k, newReq);
|
||||
changed = true;
|
||||
}
|
||||
if (!newReq.已完成) allDone = false;
|
||||
}
|
||||
var curDone = get(task, '完成情況.進階目標完成');
|
||||
if (allDone !== curDone) {
|
||||
set(vars, tp + '.完成情況.進階目標完成', allDone);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
function updateTaskStatus(tp, type) {
|
||||
var task = get(vars, tp);
|
||||
if (!_.isPlainObject(task) || !task.狀態) return;
|
||||
var status = get(task, '狀態'),
|
||||
baseDone = get(task, '完成情況.基礎要求完成', false),
|
||||
advDone = get(task, '完成情況.進階目標完成', false),
|
||||
hasAdv = _.isPlainObject(get(task, '進階目標')) &&
|
||||
Object.keys(get(task, '進階目標')).filter(function(k) { return !k.startsWith('$'); }).length > 0,
|
||||
endTimeStr = get(task, '結束時間', ''),
|
||||
curTime = getCurrentTime(vars);
|
||||
var correct = status,
|
||||
endTime = endTimeStr ? parseFullTime(endTimeStr) : null,
|
||||
expired = endTime && curTime && curTime.total >= endTime.total;
|
||||
|
||||
if (expired) {
|
||||
if (baseDone) {
|
||||
correct = '待結算';
|
||||
if (hasAdv && !advDone) {
|
||||
var s = get(task, '結算狀態') || { 基礎獎勵已發放: false, 進階獎勵已發放: false, 失敗懲罰已發放: false };
|
||||
if (!s.進階獎勵已發放) set(vars, tp + '.結算狀態', { ...s, 進階獎勵已發放: true });
|
||||
}
|
||||
} else {
|
||||
if (type === '緊急') {
|
||||
correct = '已失敗';
|
||||
var s = get(task, '結算狀態') || { 基礎獎勵已發放: false, 進階獎勵已發放: false, 失敗懲罰已發放: false };
|
||||
if (s.失敗懲罰已發放 === undefined || s.失敗懲罰已發放 === false) {
|
||||
set(vars, tp + '.結算狀態', { ...s, 失敗懲罰已發放: false });
|
||||
}
|
||||
} else {
|
||||
correct = '已放棄';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!baseDone) correct = '進行中';
|
||||
else if (hasAdv && !advDone) correct = '進階中';
|
||||
else correct = '待結算';
|
||||
}
|
||||
|
||||
if (status !== correct) {
|
||||
set(vars, tp + '.狀態', correct);
|
||||
logChange('任務狀態修正', tp + ' ' + status + ' → ' + correct);
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 主線、支線、日常、緊急、背德(統一處理) ==========
|
||||
// 🔴 加入「背德」
|
||||
var types = ['主線', '支線', '日常', '緊急', '背德'];
|
||||
for (var i = 0; i < types.length; i++) {
|
||||
var t = types[i], p = '任務.' + t;
|
||||
var task = get(vars, p);
|
||||
if (_.isPlainObject(task) && task.狀態) {
|
||||
updateTaskCompletion(p);
|
||||
updateTaskStatus(p, t);
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 羈絆任務(保持原本的獨立迴圈,不做任何修改) ==========
|
||||
var bond = get(vars, '任務.羈絆');
|
||||
if (_.isPlainObject(bond)) {
|
||||
for (var n in bond) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var p = '任務.羈絆.' + n;
|
||||
var task = bond[n];
|
||||
if (_.isPlainObject(task) && task.狀態) {
|
||||
updateTaskCompletion(p);
|
||||
updateTaskStatus(p, '羈絆');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 清理 ==========
|
||||
function cleanup() {
|
||||
// 清理主類型任務(加入「背德」)
|
||||
var types = ['主線', '支線', '日常', '緊急', '背德'];
|
||||
for (var i = 0; i < types.length; i++) {
|
||||
var t = types[i], p = '任務.' + t;
|
||||
var task = get(vars, p);
|
||||
if (!_.isPlainObject(task) || _.isEmpty(task)) continue;
|
||||
var baseReward = get(task, '結算狀態.基礎獎勵已發放', false);
|
||||
var advReward = get(task, '結算狀態.進階獎勵已發放', false);
|
||||
var hasAdv = _.isPlainObject(get(task, '進階目標')) &&
|
||||
Object.keys(get(task, '進階目標')).filter(function(k) { return !k.startsWith('$'); }).length > 0;
|
||||
var allDone = baseReward && (!hasAdv || advReward);
|
||||
if (allDone) {
|
||||
_.set(vars, p, {});
|
||||
logChange('任務清理', p + ' 設爲空對象');
|
||||
continue;
|
||||
}
|
||||
var status = get(task, '狀態');
|
||||
if (status === '待結算' && baseReward && (!hasAdv || advReward)) {
|
||||
_.set(vars, p, {});
|
||||
logChange('任務清理', p + ' 設爲空對象');
|
||||
} else if (status === '已放棄') {
|
||||
_.set(vars, p, {});
|
||||
logChange('任務清理', p + ' 設爲空對象');
|
||||
} else if (status === '已失敗' && get(task, '結算狀態.失敗懲罰已發放', false)) {
|
||||
_.set(vars, p, {});
|
||||
logChange('任務清理', p + ' 設爲空對象');
|
||||
}
|
||||
}
|
||||
|
||||
// 羈絆任務清理(保持原本不變)
|
||||
var bond2 = get(vars, '任務.羈絆');
|
||||
if (_.isPlainObject(bond2)) {
|
||||
for (var n in bond2) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var p = '任務.羈絆.' + n;
|
||||
var task = bond2[n];
|
||||
if (!_.isPlainObject(task) || _.isEmpty(task)) continue;
|
||||
var baseReward = get(task, '結算狀態.基礎獎勵已發放', false);
|
||||
var advReward = get(task, '結算狀態.進階獎勵已發放', false);
|
||||
var hasAdv = _.isPlainObject(get(task, '進階目標')) &&
|
||||
Object.keys(get(task, '進階目標')).filter(function(k) { return !k.startsWith('$'); }).length > 0;
|
||||
var allDone = baseReward && (!hasAdv || advReward);
|
||||
if (allDone) {
|
||||
_.set(vars, p, {});
|
||||
logChange('羈絆任務清理', p + ' 設爲空對象');
|
||||
continue;
|
||||
}
|
||||
var status = get(task, '狀態');
|
||||
if (status === '待結算' && baseReward && (!hasAdv || advReward)) {
|
||||
_.set(vars, p, {});
|
||||
logChange('羈絆任務清理', p + ' 設爲空對象');
|
||||
} else if (status === '已放棄') {
|
||||
_.set(vars, p, {});
|
||||
logChange('羈絆任務清理', p + ' 設爲空對象');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cleanup();
|
||||
}
|
||||
|
||||
// ======================== 同伴生效效果(改寫版 - 適用你的路徑) ========================
|
||||
function processCompanionStatusEffects(vars) {
|
||||
var comps = get(vars, '同伴');
|
||||
if (!_.isPlainObject(comps)) return;
|
||||
|
||||
範例: { "op": "insert", "path": "/研究/生存科技", "value": { "進行中": { "基礎陶器燒製技術": { "當前進度": 0, "總進度": 100, "描述": "研究如何控制窯溫和燒製時間,以提高陶器成品率和硬度。" }}}}
|
||||
|
||||
【實驗消耗】
|
||||
純觀察/推理類研究不消耗材料。涉及反覆實驗的研究消耗少量材料作爲實驗損耗,不產出成品。消耗量根據研究內容判斷。
|
||||
|
||||
【智能聚合】
|
||||
AI應避免爲單一物品創建獨立研究項。研究對象應是概括性的技術或知識。對同一技術的深化研究,可替換現有條目的當前進度、總進度、描述,同時視深化程度決定是否更新研究項名稱。只有當研究方向發生本質變化時,才建議新建條目。
|
||||
|
||||
【生命週期】
|
||||
創建 → 推進進度 → 完成(從進行中移除,知識寫入知識庫)。
|
||||
var cur = getCurrentTime(vars);
|
||||
if (!cur) return;
|
||||
|
||||
知識庫: # 對象,記錄所有已完成研究的成果。格式: '知識庫': { '類別': { '知識名': { '描述': '...' } } }
|
||||
類別: 根據知識性質自行分類,可參考以下分類:
|
||||
- '生存科技':工具製作、建築技術、食物加工保存等
|
||||
- '自然學識':植物辨識、動物習性、地理氣象、藥用提取等
|
||||
- '神祕學':龍族相關、魔法物品、古老符文、靈體感應等
|
||||
知識名: 具體的知識條目名稱。
|
||||
描述: 用自然語言簡要描述該知識的內容和應用範圍。
|
||||
// 獲取主角的維生素和氮平衡(同伴會受影響)
|
||||
var playerVit = int(get(vars, '生理.維生素')) || 0;
|
||||
var playerNitro = int(get(vars, '生理.氮平衡')) || 0;
|
||||
|
||||
for (var n in comps) {
|
||||
if (n.startsWith('$')) continue;
|
||||
var base = '同伴.' + n;
|
||||
|
||||
// ========== 🔴 1. 初始化 effects 和 statuses(每個同伴獨立) ==========
|
||||
var effects = {};
|
||||
var statuses = {};
|
||||
|
||||
// ========== 🔴 2. 定義 add 函數(在使用之前) ==========
|
||||
function add(k, name, desc) {
|
||||
effects[k] = { 狀態: name, 效果: desc };
|
||||
statuses[k] = { name: name };
|
||||
}
|
||||
|
||||
// ========== 3. 確保生效效果路徑存在 ==========
|
||||
var effPath = base + '.狀態.生效效果';
|
||||
var curEff = get(vars, effPath);
|
||||
if (!_.isPlainObject(curEff)) {
|
||||
set(vars, effPath, {});
|
||||
curEff = {};
|
||||
debugLog('初始化 ' + n + ' 的生效效果路徑');
|
||||
}
|
||||
|
||||
// ========== 4. 讀取數據 ==========
|
||||
var water = int(get(vars, base + '.生理.水分')) || 0;
|
||||
var full = int(get(vars, base + '.生理.飽腹感')) || 0;
|
||||
var excretion = int(get(vars, base + '.生理.排泄欲')) || 0;
|
||||
|
||||
var stress = int(get(vars, base + '.精神.壓力')) || 0;
|
||||
var sleepVal = int(get(vars, base + '.精神.睡眠')) || 0;
|
||||
|
||||
var fatigue = int(get(vars, base + '.狀態.疲勞')) || 0;
|
||||
var cleanVal = int(get(vars, base + '.狀態.清潔')) || 0;
|
||||
|
||||
var endLv = int(get(vars, base + '.屬性.耐力.等級')) || 20;
|
||||
var maxFat = 4 * endLv;
|
||||
var fatPerc = maxFat > 0 ? fatigue / maxFat * 100 : 0;
|
||||
|
||||
// 生命/精神值(用於持續傷害)
|
||||
var hpCur = int(get(vars, base + '.生理.當前生命值')) || 100;
|
||||
var hpMaxV = int(get(vars, base + '.生理.生命值上限')) || 100;
|
||||
var spCur2 = int(get(vars, base + '.精神.當前精神值')) || 100;
|
||||
var spMaxV = int(get(vars, base + '.精神.精神值上限')) || 100;
|
||||
|
||||
// ========== 5. 生理週期計算 ==========
|
||||
var menses = int(get(vars, base + '.生理狀態.月經週期')) || 14;
|
||||
var pregnant = get(vars, base + '.生理狀態.懷孕狀態');
|
||||
var isPregnant = (pregnant && pregnant !== '未懷孕' && pregnant !== '流產');
|
||||
var preDays = isPregnant ? (get(vars, base + '.生理狀態.懷孕天數') || 0) : 0;
|
||||
|
||||
var cyclePhase = '';
|
||||
var phaseDesc = '';
|
||||
if (isPregnant) {
|
||||
cyclePhase = '懷孕中';
|
||||
phaseDesc = '受孕概率較高,部分同伴可能表現出性慾變化(依人設而定)。';
|
||||
} else {
|
||||
var cycleDay = menses;
|
||||
if (cycleDay >= 1 && cycleDay <= 5) {
|
||||
cyclePhase = '月經期';
|
||||
phaseDesc = '體力消耗+20%。腹部不適,感知檢定-2。情緒敏感,對互動反應可能更易煩躁。';
|
||||
} else if (cycleDay >= 10 && cycleDay <= 16) {
|
||||
cyclePhase = '危險期(易孕期)';
|
||||
phaseDesc = '受孕概率較高,部分同伴可能表現出性慾變化(依人設而定)。';
|
||||
} else if (cycleDay >= 6 && cycleDay <= 9) {
|
||||
cyclePhase = '安全期';
|
||||
phaseDesc = '受孕概率較低。';
|
||||
} else if (cycleDay >= 17 && cycleDay <= 28) {
|
||||
cyclePhase = '安全期';
|
||||
phaseDesc = '受孕概率較低。';
|
||||
} else {
|
||||
cyclePhase = '狀態正常';
|
||||
phaseDesc = '無特殊效果。';
|
||||
}
|
||||
}
|
||||
|
||||
// ✅ 現在可以安全使用 add 函數
|
||||
if (cyclePhase !== '狀態正常') {
|
||||
add('生理週期', cyclePhase, phaseDesc);
|
||||
}
|
||||
|
||||
// 如果懷孕,添加懷孕效果
|
||||
if (isPregnant) {
|
||||
var preStage, preDesc;
|
||||
if (preDays <= 30) {
|
||||
preStage = '懷孕初期';
|
||||
preDesc = '體力消耗+30%。飽腹感消耗每小時額外+2。全屬性檢定-5減值。排泄需求尿意累積速度+50%。可能出現噁心、食慾變化。';
|
||||
} else if (preDays <= 60) {
|
||||
preStage = '懷孕中期';
|
||||
preDesc = '體力消耗+20%。飽腹感消耗每小時額外+3。蛋白質和維生素需求+30%。力量/敏捷檢定-10減值。腹部開始隆起。';
|
||||
} else {
|
||||
preStage = '懷孕後期';
|
||||
preDesc = '體力消耗+40%。無法奔跑、無法重體力活動。力量/敏捷檢定-20減值。睡眠恢復效率-30%。尿意累積速度+100%。';
|
||||
}
|
||||
add('懷孕', preStage, preDesc);
|
||||
|
||||
// 移除生理週期效果(懷孕期間)
|
||||
if (effects['生理週期']) {
|
||||
delete effects['生理週期'];
|
||||
delete statuses['生理週期'];
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 6. 好感度效果 ==========
|
||||
var affection = get(vars, base + '.技能.好感(對阿彬).等級') || 1;
|
||||
var affectionStage = '';
|
||||
var affectionDesc = '';
|
||||
|
||||
if (affection >= 10) {
|
||||
affectionStage = '夫妻';
|
||||
affectionDesc = '完全信賴對方,願意為對方付出一切,對任何要求都會順從,包括特殊性癖和背德行為。';
|
||||
} else if (affection == 9) {
|
||||
affectionStage = '愛侶';
|
||||
affectionDesc = '會主動親近、撒嬌、討抱,願意配合正常體位的性行為,對特殊性行為會猶豫但可能嘗試。';
|
||||
} else if (affection == 8) {
|
||||
affectionStage = '伴侶';
|
||||
affectionDesc = '會主動親近、撒嬌、討抱,願意配合正常體位的性行為,對特殊性行為明確說不。';
|
||||
} else if (affection == 7) {
|
||||
affectionStage = '熱戀';
|
||||
affectionDesc = '渴望更多肢體接觸,不排斥正常體位的性行為(不接受特殊性行為,特殊人設例外)。';
|
||||
} else if (affection == 6) {
|
||||
affectionStage = '戀人';
|
||||
affectionDesc = '期待肢體接觸,對性行為半推半就,嘴上拒絕但身體不排斥,需要對方主動引導。';
|
||||
} else if (affection == 5) {
|
||||
affectionStage = '曖昧期';
|
||||
affectionDesc = '願意嘗試非插入式性行為(口交、手交、體外摩擦),對插入式性行為仍有猶豫,需要引導。';
|
||||
} else if (affection == 4) {
|
||||
affectionStage = '知己';
|
||||
affectionDesc = '會主動靠近對方,享受獨處時光,可以接受愛撫和深吻,但對插入式性行為仍有抗拒。';
|
||||
} else if (affection == 3) {
|
||||
affectionStage = '好友';
|
||||
affectionDesc = '會主動開啟話題,回應熱情,願意分享想法,可以接受親吻、牽手、擁抱等肢體接觸。';
|
||||
} else if (affection == 2) {
|
||||
affectionStage = '認識';
|
||||
affectionDesc = '願意回應對方,保持基本禮貌距離,不主動展開話題,但對方提問時會回答。';
|
||||
} else {
|
||||
affectionStage = '陌生';
|
||||
affectionDesc = '對不熟悉的人保持防備,回應簡短,不主動開啟話題,避免眼神接觸和肢體靠近。';
|
||||
}
|
||||
add('好感度', affectionStage, affectionDesc);
|
||||
|
||||
// ========== 7. 水分 ==========
|
||||
if (water > 90) add('水分', '水分充足', '身體水分充足,精神飽滿。所有與耐力相關的檢定獲得+5背景加值。');
|
||||
else if (water > 70) add('水分', '狀態正常', '沒什麼特別的感覺。');
|
||||
else if (water > 50) add('水分', '輕微口渴', '喉嚨有點幹,下意識想找水喝,注意力有點不集中。所有智力、感知相關檢定受到-2減值。');
|
||||
else if (water > 30) add('水分', '明顯口渴', '口乾舌燥,感覺有些煩躁,身體在強烈要求補水。所有重體力相關檢定(如力量、耐力)受到-5減值。');
|
||||
else if (water > 10) add('水分', '輕度脫水', '嘴脣乾裂,頭暈乏力,身體因缺水而變得遲鈍。所有重體力相關檢定受到-10減值。');
|
||||
else if (water > 0) add('水分', '嚴重脫水', '嚴重缺水,視野開始模糊,身體機能受到明顯影響,必須立刻補充水分。所有重體力相關檢定受到-15減值。');
|
||||
else add('水分', '瀕死:脫水', '身體因嚴重缺水而瀕臨崩潰。');
|
||||
|
||||
// ========== 8. 飽腹感 ==========
|
||||
if (full > 95) add('飽腹感', '過飽', '吃撐了,行動有點不方便。所有敏捷和耐力相關檢定受到-5減值。');
|
||||
else if (full > 85) add('飽腹感', '飽足', '吃飽喝足,感覺充滿能量,體力充沛,疲勞感不易累積。');
|
||||
else if (full > 60) add('飽腹感', '狀態正常', '沒什麼特別的感覺。');
|
||||
else if (full > 30) add('飽腹感', '輕微飢餓', '肚子有點空,開始期待下一頓飯。');
|
||||
else if (full > 10) add('飽腹感', '明顯飢餓', '肚子在咕咕叫,有點想吃東西了,注意力難以集中。所有屬性檢定受到-5減值。');
|
||||
else if (full > 0) add('飽腹感', '極度飢餓', '餓得前胸貼後背,身體因爲缺乏能量而感到虛弱,必須儘快進食。所有屬性檢定受到-15減值。');
|
||||
else add('飽腹感', '虛脫', '身體因能量儲備完全耗盡而極度虛弱,各項機能開始下降,身體正在消耗自身以維持生命。必須立即進食以阻止進一步惡化。');
|
||||
|
||||
// ========== 9. 疲勞 ==========
|
||||
if (fatPerc < 10) add('疲勞', '精力十足', '渾身是勁,感覺還能再戰三百回合。所有與力量和敏捷相關檢定獲得+5背景加值。');
|
||||
else if (fatPerc <= 30) add('疲勞', '狀態正常', '身體狀態良好,沒什麼特別感覺。');
|
||||
else if (fatPerc <= 50) add('疲勞', '微微出汗', '身體開始發熱,呼吸稍微加快,但還遠未到累的時候。');
|
||||
else if (fatPerc <= 70) add('疲勞', '有些疲憊', '肌肉微微發酸,呼吸比平時稍重,是時候考慮歇一歇了。所有重體力相關檢定受到-5減值。');
|
||||
else if (fatPerc <= 90) add('疲勞', '相當疲勞', '身體變得沉重,每一下動作都需要更多力氣,疲倦感十分明顯。所有重體力相關檢定受到-10減值。');
|
||||
else add('疲勞', '筋疲力盡', '身體非常沉重,每一下動作都變得吃力,只想找個地方坐下來喘口氣。所有重體力相關檢定受到-15減值。');
|
||||
|
||||
// ========== 10. 壓力 ==========
|
||||
if (stress < 10) add('壓力', '心神沉靜', '思維清晰,內心平靜。意志、智力檢定獲得+5加值。');
|
||||
else if (stress < 50) add('壓力', '狀態正常', '無特殊效果。');
|
||||
else if (stress < 80) add('壓力', '高度焦慮', '壓力極大,內心充滿焦慮和不安。所有檢定受到-5減值。');
|
||||
else if (stress < 100) add('壓力', '不堪重負', '巨大的壓力使她瀕臨崩潰邊緣。所有檢定受到-10減值。');
|
||||
else add('壓力', '精神崩潰', '精神防線徹底崩潰,陷入恐慌、偏執或絕望狀態。');
|
||||
|
||||
// ========== 11. 睡眠 ==========
|
||||
if (sleepVal > 90) add('睡眠', '精力充沛', '充足的睡眠讓她恢復了所有精力。疲勞恢復速度加倍,精神屬性和技能相關檢定+5。');
|
||||
else if (sleepVal > 60) add('睡眠', '狀態正常', '無特殊效果。');
|
||||
else if (sleepVal > 30) add('睡眠', '疲倦', '開始感到身體和精神的疲勞。所有屬性檢定受到-5減值。');
|
||||
else if (sleepVal > 0) add('睡眠', '非常疲憊', '嚴重缺乏睡眠,眼皮沉重,反應遲鈍。所有屬性檢定受到-15減值。');
|
||||
else add('睡眠', '精疲力竭', '身體達到極限,隨時可能因過度疲勞而昏倒。');
|
||||
|
||||
// ========== 12. 清潔 ==========
|
||||
if (cleanVal > 90) add('清潔', '乾淨整潔', '全身清爽,心情愉悅。所有與意志、智力相關的檢定獲得+2背景加值。');
|
||||
else if (cleanVal > 40) add('清潔', '狀態正常', '無特殊效果。');
|
||||
else if (cleanVal > 10) add('清潔', '有點髒', '身上有污垢或異味,讓人不適。');
|
||||
else add('清潔', '污穢不堪', '全身骯髒,散發惡臭,大大增加感染疾病的風險。');
|
||||
|
||||
// ========== 13. 維生素(受主角影響) ==========
|
||||
if (playerVit > 80) add('維生素', '維生素充足', '維生素充足。');
|
||||
else if (playerVit > 30) add('維生素', '狀態正常', '無特殊效果。');
|
||||
else if (playerVit > 0) add('維生素', '維生素缺乏', '身體出現多種不良反應,更快疲勞等。');
|
||||
else add('維生素', '維生素嚴重缺乏', '出現壞血病、夜盲症等嚴重疾病。');
|
||||
|
||||
// ========== 14. 氮平衡(受主角影響) ==========
|
||||
if (playerNitro >= 75) add('氮平衡', '正氮平衡', '蛋白質充足,力量相關檢定效果增強,更快從疲勞恢復。');
|
||||
else if (playerNitro >= 0) add('氮平衡', '狀態正常', '無特殊效果。');
|
||||
else if (playerNitro >= -50) add('氮平衡', '負氮平衡', '蛋白質不足,肌肉分解流失。力量下降,免疫力下降,傷口難以癒合,更難恢復耐力。');
|
||||
else add('氮平衡', '嚴重負氮平衡', '蛋白質嚴重缺乏,身體機能大幅受損。');
|
||||
|
||||
// ========== 15. 排泄需求(從單一排泄欲轉換) ==========
|
||||
var pee = excretion;
|
||||
var poo = excretion;
|
||||
|
||||
var peeStage = '', peeDesc = '', pooStage = '', pooDesc = '';
|
||||
if (pee < 20) { peeStage = '狀態正常'; peeDesc = '暫無尿意'; }
|
||||
else if (pee < 40) { peeStage = '輕微尿意'; peeDesc = '開始有排尿的感覺,尚可忍受'; }
|
||||
else if (pee < 60) { peeStage = '尿急'; peeDesc = '排尿需求變得強烈,注意力輕微分散(智力、感知檢定-2)'; }
|
||||
else if (pee < 80) { peeStage = '憋不住'; peeDesc = '排尿需求非常緊迫,難以集中精神(智力、感知檢定-5)'; }
|
||||
else { peeStage = '快要失禁'; peeDesc = '隨時可能失禁,必須立即排尿(智力、感知檢定-10)'; }
|
||||
|
||||
if (poo < 20) { pooStage = '狀態正常'; pooDesc = '暫無便意'; }
|
||||
else if (poo < 40) { pooStage = '輕微便意'; pooDesc = '開始有排便的感覺,尚可忍受'; }
|
||||
else if (poo < 60) { pooStage = '急需排便'; pooDesc = '排便需求強烈,腹部不適(智力、感知檢定-2)'; }
|
||||
else if (poo < 80) { pooStage = '忍不住'; pooDesc = '排便需求非常緊迫,必須立即解決(智力、感知檢定-5)'; }
|
||||
else { pooStage = '即將失禁'; pooDesc = '隨時可能失禁,必須立即排便(智力、感知檢定-10)'; }
|
||||
|
||||
var excreteDesc = '';
|
||||
if (peeStage === '狀態正常' && pooStage === '狀態正常') {
|
||||
excreteDesc = '暫無排泄需求,身體感覺輕鬆。';
|
||||
} else {
|
||||
excreteDesc = peeDesc + '。同時,' + pooDesc;
|
||||
}
|
||||
var dominant = (pee > poo) ? peeStage : pooStage;
|
||||
add('排泄需求', dominant, excreteDesc);
|
||||
|
||||
// ========== 16. 寫入生效效果 ==========
|
||||
var curEff = get(vars, base + '.狀態.生效效果') || {};
|
||||
|
||||
// 更新或新增效果
|
||||
for (var k in effects) {
|
||||
var newEff = effects[k];
|
||||
var old = curEff[k];
|
||||
if (!old || old.狀態 !== newEff.狀態 || old.效果 !== newEff.效果) {
|
||||
set(vars, base + '.狀態.生效效果.' + k, newEff);
|
||||
debugLog('同伴生效效果更新', n + ': ' + k + ' → ' + newEff.狀態);
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// 清理過期的效果(保留懷孕和生理週期,因為已單獨處理)
|
||||
for (var k in curEff) {
|
||||
if (k === '懷孕' || k === '生理週期') continue;
|
||||
if (!effects[k] && curEff[k] !== undefined) {
|
||||
_.unset(vars, base + '.狀態.生效效果.' + k);
|
||||
debugLog('同伴生效效果移除', n + ': ' + k);
|
||||
fixCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 17. 持續傷害計算 ==========
|
||||
if (statusCache && cur) {
|
||||
var delta = 0;
|
||||
try {
|
||||
var prevT = statusCache.time;
|
||||
if (prevT && prevT.total) delta = (cur.total - prevT.total) / 60;
|
||||
} catch(e) {}
|
||||
|
||||
if (delta > 0) {
|
||||
var damageStates = [
|
||||
'明顯口渴', '輕度脫水', '嚴重脫水', '過飽',
|
||||
'明顯飢餓', '極度飢餓', '虛脫', '相當疲勞', '筋疲力盡',
|
||||
'高度焦慮', '不堪重負', '有點髒', '污穢不堪',
|
||||
'維生素缺乏', '維生素嚴重缺乏', '負氮平衡', '嚴重負氮平衡'
|
||||
];
|
||||
|
||||
for (var k in statuses) {
|
||||
var s = statuses[k];
|
||||
if (s && damageStates.includes(s.name)) {
|
||||
debugLog('[同伴持續傷害] ' + n + ' ' + s.name + ' 時間差:' + delta.toFixed(2) + '小時');
|
||||
|
||||
switch (s.name) {
|
||||
case '明顯口渴':
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 0.5 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '輕度脫水':
|
||||
set(vars, base + '.生理.當前生命值', Math.round(clamp(hpCur - 0.5 * delta, 0, hpMaxV)));
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 0.5 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '嚴重脫水':
|
||||
set(vars, base + '.生理.當前生命值', Math.round(clamp(hpCur - 1 * delta, 0, hpMaxV)));
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 1 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '過飽':
|
||||
set(vars, base + '.狀態.疲勞', Math.round(clamp(fatigue + 1 * delta, 0, maxFat)));
|
||||
break;
|
||||
case '明顯飢餓':
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 0.5 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '極度飢餓':
|
||||
set(vars, base + '.生理.當前生命值', Math.round(clamp(hpCur - 0.5 * delta, 0, hpMaxV)));
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 1 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '虛脫':
|
||||
set(vars, base + '.生理.當前生命值', Math.round(clamp(hpCur - 1 * delta, 0, hpMaxV)));
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 2 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '高度焦慮':
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 0.3 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '不堪重負':
|
||||
set(vars, base + '.精神.當前精神值', Math.round(clamp(spCur2 - 0.5 * delta, 0, spMaxV)));
|
||||
break;
|
||||
case '有點髒':
|
||||
set(vars, base + '.精神.睡眠', Math.round(clamp(sleepVal - 0.2 * delta, 0, 100)));
|
||||
break;
|
||||
case '污穢不堪':
|
||||
set(vars, base + '.精神.睡眠', Math.round(clamp(sleepVal - 0.3 * delta, 0, 100)));
|
||||
set(vars, base + '.狀態.疲勞', Math.round(clamp(fatigue + 0.3 * delta, 0, maxFat)));
|
||||
break;
|
||||
case '維生素缺乏':
|
||||
set(vars, base + '.狀態.疲勞', Math.round(clamp(fatigue + 0.3 * delta, 0, maxFat)));
|
||||
break;
|
||||
case '維生素嚴重缺乏':
|
||||
set(vars, base + '.狀態.疲勞', Math.round(clamp(fatigue + 0.5 * delta, 0, maxFat)));
|
||||
set(vars, base + '.生理.當前生命值', Math.round(clamp(hpCur - 0.3 * delta, 0, hpMaxV)));
|
||||
break;
|
||||
case '負氮平衡':
|
||||
set(vars, base + '.狀態.疲勞', Math.round(clamp(fatigue + 0.2 * delta, 0, maxFat)));
|
||||
break;
|
||||
case '嚴重負氮平衡':
|
||||
set(vars, base + '.生理.當前生命值', Math.round(clamp(hpCur - 0.5 * delta, 0, hpMaxV)));
|
||||
set(vars, base + '.狀態.疲勞', Math.round(clamp(fatigue + 0.5 * delta, 0, maxFat)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
【研究成果的應用】
|
||||
研究完成後,解鎖的知識通過以下方式在敘事中自然體現:
|
||||
- 觸發技能學習:完成相關研究後,玩家在該領域實踐時更容易觸發技能生成判定。
|
||||
- 降低製作難度:相關研究已解鎖的製作項目,檢定難度適當降低。
|
||||
- 提升物品品質:知識積累可能讓製作品質更高。
|
||||
- 解鎖新研究方向:某些高階研究只有在建立了前置認知後才能觸發。
|
||||
// ==================== 流產後續清理 ====================
|
||||
function processMiscarriageCleanup(vars) {
|
||||
var companions = get(vars, '同伴');
|
||||
if (!_.isPlainObject(companions)) return;
|
||||
|
||||
var currentDay = get(vars, '系統.經過天數') || 0;
|
||||
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
|
||||
var pending = get(vars, '同伴.' + name + '.生理狀態.流產待處理');
|
||||
if (pending !== true) continue;
|
||||
|
||||
keyLog('💔 檢測到 ' + name + ' 流產待處理,執行後續清理...');
|
||||
|
||||
// 0. 🔴 新增:月經週期重置(雙重保障)
|
||||
set(vars, '同伴.' + name + '.生理狀態.月經週期', 1);
|
||||
keyLog('🔄 ' + name + ' 月經週期重置為 1');
|
||||
|
||||
// 1. 清除未出生的子嗣(母親 = name 且沒有出生日期)
|
||||
var children = get(vars, '子嗣');
|
||||
if (_.isPlainObject(children)) {
|
||||
var toRemove = [];
|
||||
for (var childName in children) {
|
||||
if (childName.startsWith('$')) continue;
|
||||
var child = children[childName];
|
||||
if (child.母親 === name && !child.出生日期) {
|
||||
toRemove.push(childName);
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < toRemove.length; i++) {
|
||||
_.unset(vars, '子嗣.' + toRemove[i]);
|
||||
keyLog('🗑️ 清除未出生子嗣: ' + toRemove[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 觸發劇情演出(如果有)
|
||||
var performances = get(vars, '同伴.' + name + '.劇情演出') || [];
|
||||
var hasEvent = false;
|
||||
for (var i = 0; i < performances.length; i++) {
|
||||
if (typeof performances[i] === 'string' && performances[i].indexOf('事件-流產-') !== -1) {
|
||||
hasEvent = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!hasEvent) {
|
||||
performances.push('事件-流產-1-待觸發:流產後的情感創傷與關係變化');
|
||||
set(vars, '同伴.' + name + '.劇情演出', performances);
|
||||
keyLog('📝 為 ' + name + ' 生成流產劇情演出');
|
||||
}
|
||||
|
||||
// 3. 清除待處理標記(避免重複執行)
|
||||
set(vars, '同伴.' + name + '.生理狀態.流產待處理', false);
|
||||
|
||||
keyLog('✅ ' + name + ' 流產後續清理完成');
|
||||
}
|
||||
}
|
||||
|
||||
// ======================== 主修正函數 ========================
|
||||
function applyCorrections(vars, oldVars) {
|
||||
fixCount = 0;
|
||||
delCount = 0;
|
||||
debugLog('修正開始');
|
||||
|
||||
applyIntegerAndBounds(vars);
|
||||
|
||||
try {
|
||||
ensurePaths(vars);
|
||||
fixTimeFormat(vars);
|
||||
|
||||
processStatusEffects(vars);
|
||||
processCompanionStatusEffects(vars);
|
||||
processMiscarriageCleanup(vars);
|
||||
processTimeAndLevel(vars, oldVars);
|
||||
|
||||
// 🔴 每次更新都重新計算懷孕天數和階段
|
||||
updatePregnancyStage(vars, ''); // 主角
|
||||
var companions = get(vars, '同伴');
|
||||
if (_.isPlainObject(companions)) {
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
updatePregnancyStage(vars, '同伴.' + name);
|
||||
}
|
||||
}
|
||||
|
||||
fixItemStatusLimits(vars);
|
||||
cleanupAllItems(vars);
|
||||
processItemDecay(vars);
|
||||
|
||||
// 時間差計算(每小時更新)
|
||||
if (lastSnapshot) {
|
||||
var prevTime = lastSnapshot.time;
|
||||
var curTime = get(vars, '系統.當前時間');
|
||||
if (prevTime && curTime) {
|
||||
var hoursDiff = calculateTimeDifference(prevTime, curTime);
|
||||
if (hoursDiff > 0 && hoursDiff < 24) {
|
||||
debugLog('時間差計算: ' + hoursDiff + ' 小時');
|
||||
|
||||
// ========== 自動入睡/喚醒規則(22:00-07:00)==========
|
||||
var currentTime = get(vars, '系統.當前時間');
|
||||
if (currentTime && typeof currentTime === 'string') {
|
||||
var hour = parseInt(currentTime.split(':')[0]);
|
||||
if (!isNaN(hour)) {
|
||||
var shouldBeSleeping = (hour >= 22 || hour < 8);
|
||||
var isCurrentlySleeping = get(vars, '狀態.入睡') === true;
|
||||
|
||||
if (shouldBeSleeping && !isCurrentlySleeping) {
|
||||
set(vars, '狀態.入睡', true);
|
||||
keyLog('😴 自動入睡:時間 ' + currentTime + ' 進入睡眠狀態');
|
||||
} else if (!shouldBeSleeping && isCurrentlySleeping) {
|
||||
set(vars, '狀態.入睡', false);
|
||||
keyLog('⏰ 自動喚醒:時間 ' + currentTime + ' 結束睡眠狀態');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var isSleeping = get(vars, '狀態.入睡') === true;
|
||||
var sleepMultiplier = isSleeping ? 0.5 : 1.0;
|
||||
|
||||
if (isSleeping) {
|
||||
keyLog('😴 當前為睡眠狀態,消耗減半');
|
||||
}
|
||||
|
||||
// 水分消耗
|
||||
var water = get(vars, '生理.水分') || 0;
|
||||
set(vars, '生理.水分', Math.max(0, water - 1.5 * hoursDiff * sleepMultiplier));
|
||||
|
||||
// 碳水消耗
|
||||
var carbs = get(vars, '生理.碳水') || 0;
|
||||
set(vars, '生理.碳水', Math.max(0, carbs - 100 * hoursDiff * sleepMultiplier));
|
||||
|
||||
// 脂肪消耗
|
||||
var fat = get(vars, '生理.脂肪') || 0;
|
||||
set(vars, '生理.脂肪', Math.max(0, fat - 100 * hoursDiff * sleepMultiplier));
|
||||
|
||||
// 氮平衡
|
||||
var nitrogen = get(vars, '生理.氮平衡') || 0;
|
||||
set(vars, '生理.氮平衡', Math.max(-100, nitrogen - 1 * hoursDiff * sleepMultiplier));
|
||||
|
||||
// 維生素
|
||||
var vitamin = get(vars, '生理.維生素') || 0;
|
||||
set(vars, '生理.維生素', Math.max(0, vitamin - 0.5 * hoursDiff * sleepMultiplier));
|
||||
|
||||
// 睡眠值
|
||||
var sleep = get(vars, '精神.睡眠') || 0;
|
||||
if (isSleeping) {
|
||||
set(vars, '精神.睡眠', Math.min(100, sleep + 8 * hoursDiff));
|
||||
} else {
|
||||
set(vars, '精神.睡眠', Math.max(0, sleep - 2 * hoursDiff));
|
||||
}
|
||||
|
||||
// 飽腹感
|
||||
var fullness = get(vars, '生理.飽腹感') || 0;
|
||||
set(vars, '生理.飽腹感', Math.max(0, fullness - 4 * hoursDiff * sleepMultiplier));
|
||||
|
||||
// 疲勞
|
||||
var end = int(get(vars, '屬性.耐力.等級')) || 20;
|
||||
var fatigueMax = 4 * end;
|
||||
var fatigue = get(vars, '狀態.疲勞') || 0;
|
||||
if (isSleeping) {
|
||||
set(vars, '狀態.疲勞', Math.max(0, fatigue - 4 * hoursDiff));
|
||||
} else {
|
||||
set(vars, '狀態.疲勞', Math.min(fatigueMax, fatigue + 2 * hoursDiff));
|
||||
}
|
||||
|
||||
// 排泄欲
|
||||
var excretionVal = get(vars, '生理.排泄欲') || 0;
|
||||
set(vars, '生理.排泄欲', Math.min(100, excretionVal + 2 * hoursDiff * sleepMultiplier));
|
||||
|
||||
// 同伴的日常消耗
|
||||
var companions = get(vars, '同伴');
|
||||
if (_.isPlainObject(companions)) {
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
|
||||
var compEnd = int(get(vars, '同伴.' + name + '.屬性.耐力.等級')) || 20;
|
||||
var compFatigueMax = 4 * compEnd;
|
||||
|
||||
var compFullness = get(vars, '同伴.' + name + '.生理.飽腹感') || 0;
|
||||
var compWater = get(vars, '同伴.' + name + '.生理.水分') || 0;
|
||||
var compExcretion = get(vars, '同伴.' + name + '.生理.排泄欲') || 0;
|
||||
var compFatigue = get(vars, '同伴.' + name + '.狀態.疲勞') || 0;
|
||||
var compClean = get(vars, '同伴.' + name + '.狀態.清潔') || 0;
|
||||
var compSleep = get(vars, '同伴.' + name + '.精神.睡眠') || 100;
|
||||
var compStress = get(vars, '同伴.' + name + '.精神.壓力') || 0;
|
||||
|
||||
var compIsSleeping = isSleeping;
|
||||
|
||||
var newFullness = compFullness - 4 * hoursDiff * (compIsSleeping ? 0.5 : 1);
|
||||
set(vars, '同伴.' + name + '.生理.飽腹感', Math.max(0, Math.min(100, newFullness)));
|
||||
|
||||
var newWater = compWater - 1.5 * hoursDiff * (compIsSleeping ? 0.5 : 1);
|
||||
set(vars, '同伴.' + name + '.生理.水分', Math.max(0, Math.min(100, newWater)));
|
||||
|
||||
var newExcretion = compExcretion + 2 * hoursDiff * (compIsSleeping ? 0.5 : 1);
|
||||
set(vars, '同伴.' + name + '.生理.排泄欲', Math.min(100, newExcretion));
|
||||
|
||||
var newFatigue;
|
||||
if (compIsSleeping) {
|
||||
newFatigue = compFatigue - 4 * hoursDiff;
|
||||
set(vars, '同伴.' + name + '.狀態.疲勞', Math.max(0, Math.min(compFatigueMax, newFatigue)));
|
||||
} else {
|
||||
newFatigue = compFatigue + 2 * hoursDiff;
|
||||
set(vars, '同伴.' + name + '.狀態.疲勞', Math.min(compFatigueMax, newFatigue));
|
||||
}
|
||||
|
||||
var newClean = compClean - 0.5 * hoursDiff;
|
||||
set(vars, '同伴.' + name + '.狀態.清潔', Math.max(0, Math.min(100, newClean)));
|
||||
|
||||
var newSleep;
|
||||
if (compIsSleeping) {
|
||||
newSleep = compSleep + 8 * hoursDiff;
|
||||
set(vars, '同伴.' + name + '.精神.睡眠', Math.min(100, newSleep));
|
||||
} else {
|
||||
newSleep = compSleep - 2 * hoursDiff;
|
||||
set(vars, '同伴.' + name + '.精神.睡眠', Math.max(0, newSleep));
|
||||
}
|
||||
|
||||
var newStress = compStress + 0.2 * hoursDiff;
|
||||
if (newClean < 30) newStress += 0.3 * hoursDiff;
|
||||
if (newFullness < 30) newStress += 0.3 * hoursDiff;
|
||||
set(vars, '同伴.' + name + '.精神.壓力', Math.min(100, Math.max(0, newStress)));
|
||||
}
|
||||
}
|
||||
|
||||
if (isSleeping) {
|
||||
keyLog('😴 睡眠狀態消耗 (主角): 水分-' + (1.5 * hoursDiff * sleepMultiplier).toFixed(1) +
|
||||
', 飽腹感-' + (4 * hoursDiff * sleepMultiplier).toFixed(1) +
|
||||
', 疲勞-' + (4 * hoursDiff).toFixed(1) + ' (恢復)');
|
||||
} else {
|
||||
keyLog('⏰ 自動消耗 (主角): 水分-' + (1.5 * hoursDiff).toFixed(1) +
|
||||
', 飽腹感-' + (4 * hoursDiff).toFixed(1) +
|
||||
', 疲勞+' + (2 * hoursDiff).toFixed(1));
|
||||
}
|
||||
|
||||
var companionCount = 0;
|
||||
var sampleCompName = '';
|
||||
if (_.isPlainObject(companions)) {
|
||||
for (var name in companions) {
|
||||
if (name.startsWith('$')) continue;
|
||||
companionCount++;
|
||||
if (sampleCompName === '') sampleCompName = name;
|
||||
}
|
||||
}
|
||||
if (companionCount > 0) {
|
||||
keyLog('👥 同伴消耗 (共 ' + companionCount + ' 位): 以 ' + sampleCompName + ' 為例 - 水分-1.5/時, 飽腹-4/時, 疲勞+' + (isSleeping ? '4(恢復)' : '2') + ', 清潔-0.5/時');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 🔴 第二次整數化移到這裡(在所有消耗計算完成之後)
|
||||
applyIntegerAndBounds(vars);
|
||||
|
||||
updateSeason(vars);
|
||||
|
||||
recordShopHistory(vars);
|
||||
|
||||
updateCropGrowthStages(vars);
|
||||
updateLivestockStates(vars);
|
||||
processTasksAndShop(vars);
|
||||
|
||||
processCompanionLimits(vars);
|
||||
|
||||
var currentTime = get(vars, '系統.當前時間');
|
||||
var currentDay = get(vars, '系統.經過天數');
|
||||
if (currentTime) set(vars, '系統.前次時間', currentTime);
|
||||
if (currentDay !== undefined) set(vars, '系統.前次天數', currentDay);
|
||||
|
||||
var total = fixCount + delCount;
|
||||
var status = total > 0 ? 'fixed' : 'normal';
|
||||
var msg = total > 0 ? '修正' + fixCount + '處,清理' + delCount + '件物品' : '所有數據均符合規則,無需修正';
|
||||
if (total > 0) keyLog('修正完成 - ' + msg);
|
||||
else debugLog('修正完成 - ' + msg);
|
||||
|
||||
checkAndRestoreSustainableCrops(vars, oldVars);
|
||||
verifyAndFixAllCrops(vars);
|
||||
verifyAndFixAllLivestock(vars);
|
||||
|
||||
cleanupCompletedPerformances(vars);
|
||||
|
||||
updateStatus(vars, status, msg);
|
||||
|
||||
} catch(e) {
|
||||
errorLog('修正錯誤:', e.message);
|
||||
if (DEBUG_MODE) console.error(e.stack);
|
||||
updateStatus(vars, 'error', e.message);
|
||||
}
|
||||
}
|
||||
|
||||
// ======================== 事件掛載 ========================
|
||||
eventOn(Mvu.events.VARIABLE_UPDATE_STARTED, function(vars) {
|
||||
var d = vars.stat_data;
|
||||
var currentDay = get(d, '系統.經過天數');
|
||||
var currentTime = get(d, '系統.當前時間');
|
||||
|
||||
lastSnapshot = {
|
||||
day: currentDay,
|
||||
time: currentTime,
|
||||
hpMax: get(d, '生理.生命值上限'),
|
||||
hpCur: get(d, '生理.當前生命值'),
|
||||
spMax: get(d, '精神.精神值上限'),
|
||||
spCur: get(d, '精神.當前精神值')
|
||||
};
|
||||
debugLog('記錄前次狀態: 天數=' + currentDay + ', 時間=' + currentTime);
|
||||
fixCount = 0;
|
||||
delCount = 0;
|
||||
lastLogHash = '';
|
||||
});
|
||||
|
||||
eventOn(Mvu.events.VARIABLE_UPDATE_ENDED, function(newVars, oldVars) {
|
||||
if (isProcessing) return;
|
||||
isProcessing = true;
|
||||
try {
|
||||
// ========== 1. 執行修正 ==========
|
||||
applyCorrections(newVars.stat_data, oldVars.stat_data);
|
||||
var vars = newVars.stat_data;
|
||||
|
||||
// ========== 2. 確保性愛結果是陣列 ==========
|
||||
var sexResults = ensureSexResultArray(vars);
|
||||
|
||||
// ========== 3. 如果沒有性愛結果,直接結束 ==========
|
||||
if (sexResults.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// ========== 4. 處理每一筆性愛結果 ==========
|
||||
var remaining = [];
|
||||
var INITIAL_COUNTDOWN = 2;
|
||||
|
||||
for (var i = 0; i < sexResults.length; i++) {
|
||||
var result = sexResults[i];
|
||||
|
||||
// =============================================
|
||||
// 情況 A:新事件(沒有刪除倒數)
|
||||
// =============================================
|
||||
if (result.刪除倒數 === undefined || result.刪除倒數 === null) {
|
||||
|
||||
// ----- 以下:原本的「補充計算」邏輯(完整保留)-----
|
||||
var name = result.角色;
|
||||
|
||||
if (name) {
|
||||
var base = '同伴.' + name;
|
||||
|
||||
// 1. 獲取計算參數
|
||||
var affection = v(get(vars, base + '.技能.好感(對阿彬).等級'), 1);
|
||||
var forced = v(get(vars, base + '.淪陷.強制次數'), 0);
|
||||
var special = get(vars, base + '.淪陷.特殊狀態') || '';
|
||||
var comfort = get(vars, '環境.舒適度') || 50;
|
||||
|
||||
var statusEffects = [];
|
||||
var compEff = get(vars, base + '.狀態.生效效果');
|
||||
if (_.isPlainObject(compEff)) {
|
||||
for (var k in compEff) {
|
||||
if (k.startsWith('$')) continue;
|
||||
if (compEff[k] && compEff[k].狀態) {
|
||||
statusEffects.push(compEff[k].狀態);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var isSudden = (result.有預警 === false);
|
||||
var hasTrauma = (special.indexOf('關係動搖') !== -1 || special.indexOf('嚴重創傷') !== -1);
|
||||
|
||||
// 2. 計算自願度
|
||||
var voluntary = calculateVoluntary(
|
||||
affection,
|
||||
result.情境 || '情感推進',
|
||||
statusEffects,
|
||||
comfort,
|
||||
isSudden,
|
||||
hasTrauma,
|
||||
special
|
||||
);
|
||||
var grade = getResultGrade(voluntary);
|
||||
|
||||
// 3. 計算淪陷階段
|
||||
var newCorruption = getCorruptionStage(forced, affection);
|
||||
|
||||
// 4. 計算關係變化
|
||||
var change = calculateAffectionChange(
|
||||
voluntary,
|
||||
affection,
|
||||
result.情境 || '情感推進',
|
||||
special,
|
||||
result.完成 !== false
|
||||
);
|
||||
|
||||
// 5. 建立完整的 updatedResult(和原本完全一樣)
|
||||
var updatedResult = {
|
||||
角色: result.角色,
|
||||
完成: result.完成,
|
||||
內射: result.內射,
|
||||
避孕措施: result.避孕措施 || '無',
|
||||
情境: result.情境 || '情感推進',
|
||||
自願度: voluntary,
|
||||
自願分級: grade.grade,
|
||||
描寫建議: grade.description,
|
||||
淪陷階段: {
|
||||
階段: newCorruption.stage,
|
||||
名稱: newCorruption.name
|
||||
},
|
||||
關係變化: {
|
||||
經驗變化: change.expChange,
|
||||
等級變化: change.levelChange
|
||||
},
|
||||
特殊狀態: change.newSpecialStatus || '無',
|
||||
刪除倒數: INITIAL_COUNTDOWN,
|
||||
授精者: result.授精者 || '阿彬'
|
||||
};
|
||||
|
||||
// 寫回更新後的結果
|
||||
sexResults[i] = updatedResult;
|
||||
result = updatedResult;
|
||||
|
||||
// 6. 執行懷孕判斷(和原本完全一樣)
|
||||
if (result.完成 === true && result.內射 === true) {
|
||||
calculatePregnancy(vars, name, true, result.避孕措施);
|
||||
}
|
||||
|
||||
// 7. 執行好感度更新(和原本完全一樣)
|
||||
if (change && (change.expChange !== 0 || change.levelChange !== 0)) {
|
||||
var currentExp = get(vars, base + '.技能.好感(對阿彬).當前經驗') || 0;
|
||||
var currentLevel = get(vars, base + '.技能.好感(對阿彬).等級') || 1;
|
||||
|
||||
var newExp = Math.max(0, currentExp + change.expChange);
|
||||
var newLevel = Math.max(1, currentLevel + change.levelChange);
|
||||
|
||||
if (newExp !== currentExp) {
|
||||
set(vars, base + '.技能.好感(對阿彬).當前經驗', newExp);
|
||||
}
|
||||
if (newLevel !== currentLevel) {
|
||||
set(vars, base + '.技能.好感(對阿彬).等級', newLevel);
|
||||
}
|
||||
}
|
||||
|
||||
// 8. 執行淪陷階段更新(和原本完全一樣)
|
||||
if (newCorruption.stage !== undefined) {
|
||||
var currentStage = get(vars, base + '.淪陷.當前階段') || 0;
|
||||
if (newCorruption.stage !== currentStage) {
|
||||
set(vars, base + '.淪陷.當前階段', newCorruption.stage);
|
||||
}
|
||||
}
|
||||
|
||||
// 9. 執行特殊狀態更新(和原本完全一樣)
|
||||
if (change.newSpecialStatus && change.newSpecialStatus !== special) {
|
||||
set(vars, base + '.淪陷.特殊狀態', change.newSpecialStatus);
|
||||
}
|
||||
}
|
||||
|
||||
// 保留這筆記錄(倒數還沒歸零)
|
||||
remaining.push(result);
|
||||
continue;
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// 情況 B:已有倒數 → 減數或清除
|
||||
// =============================================
|
||||
result.刪除倒數--;
|
||||
if (result.刪除倒數 > 0) {
|
||||
remaining.push(result);
|
||||
}
|
||||
// 倒數歸零則不保留(自動清除)
|
||||
}
|
||||
|
||||
// ========== 5. 寫回更新後的陣列 ==========
|
||||
set(vars, '系統.性愛結果', remaining);
|
||||
|
||||
} catch(e) {
|
||||
errorLog('處理錯誤:', e);
|
||||
if (DEBUG_MODE) console.error(e.stack);
|
||||
} finally {
|
||||
isProcessing = false;
|
||||
}
|
||||
});
|
||||
|
||||
window.processSexualInteraction = processSexualInteraction;
|
||||
window.getResultGrade = getResultGrade;
|
||||
window.calculateVoluntary = calculateVoluntary;
|
||||
window.calculatePregnancy = calculatePregnancy;
|
||||
window.updateAllCrops = function(vars) { return updateCropGrowthStages(vars); };
|
||||
window.updateAllLivestock = function(vars) { return updateLivestockStates(vars); };
|
||||
window.calculateMoonPhase = calculateMoonPhase;
|
||||
window.calculateSeason = calculateSeason;
|
||||
|
||||
window._mvuFinalStableV111 = true;
|
||||
|
||||
console.log('✅ 所有擴充功能已載入 (v11.1 路徑更新)');
|
||||
console.log('📊 功能模塊: 好感系統 | 性愛系統 | 季節系統 | 作物系統 | 畜牧系統 | 懷孕系統 | 幼兒系統 | 排泄系統 | 任務系統 | 入眠系統 | 狀態效果');
|
||||
})();
|
||||
Binary file not shown.
+4
-80
@@ -3,14 +3,6 @@
|
||||
"logo": "https://p3-pc.douyinpic.com/img/aweme-avatar/tos-cn-i-0813_6e2553f5708c414386eeca88b5f2674a~c5_300x300.jpeg?from=2956013662",
|
||||
"wallpaper": "https://tv.nxog.top/m/t/",
|
||||
"lives": [
|
||||
{
|
||||
"name": "欧华(需32位影视仅港有效)",
|
||||
"url": "http://dbmlosa.sylu.cc:8080/ouhua.txt",
|
||||
"playerType": 2,
|
||||
"epg": "http://epg.52sw.top:668/?ch={name}&date={date}",
|
||||
"logo": "https://gitee.com/mytv-android/myTVlogo/raw/main/img/{name}.png"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "四季线上",
|
||||
"url": "http://dreamtv.sylu.cc:2082/vtg4.m3u?token=dbm",
|
||||
@@ -32,14 +24,7 @@
|
||||
"playerType": 2,
|
||||
"epg": "http://epg.52sw.top:668/?ch={name}&date={date}",
|
||||
"logo": "https://gcore.jsdelivr.net/gh/taksssss/tv/icon/{name}.png"
|
||||
},
|
||||
{
|
||||
"name": "四季线上",
|
||||
"url": "http://dreamtv.sylu.cc:2082/vtg4.m3u?token=dbm",
|
||||
"playerType": 2,
|
||||
"epg": "http://epg.52sw.top:668/?ch={name}&date={date}",
|
||||
"logo": "https://gitee.com/mytv-android/myTVlogo/raw/main/img/{name}.png"
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "tv123",
|
||||
"type": 0,
|
||||
@@ -82,49 +67,7 @@
|
||||
"name": "🐬iptv直播",
|
||||
"type": 0,
|
||||
"ua": "okhttp/5.3.2",
|
||||
"url": "https://wget.la/https://raw.githubusercontent.com/vinkerq/iptv-api/refs/heads/master/iptv.txt"
|
||||
},
|
||||
{
|
||||
"name": "🐬小新TV",
|
||||
"type": 0,
|
||||
"ua": "okhttp/5.3.2",
|
||||
"url": "https://d.kstore.dev/download/9565/小新TV.txt"
|
||||
},
|
||||
{
|
||||
"name": "🐬北美长城源",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "https://ha.msbot.dpdns.org/wall.php"
|
||||
},
|
||||
{
|
||||
"name": "🐬港台",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "https://feer-cdn-bp.xpnb.qzz.io/xnkl.txt"
|
||||
},
|
||||
{
|
||||
"name": "🐬体育台",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "http://82.156.243.185:33389/fwc.m3u"
|
||||
},
|
||||
{
|
||||
"name": "🐬裤佬TV",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "https://gh-proxy.org/https://raw.githubusercontent.com/Jsnzkpg/Jsnzkpg/Jsnzkpg/Jsnzkpg1.m3u"
|
||||
},
|
||||
{
|
||||
"name": "🐬Mytv",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "https://cdn.qd.je/live.m3u"
|
||||
},
|
||||
{
|
||||
"name": "🐬新加坡(梯子)",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "http://xtvantsc.xyz/新加坡.m3u"
|
||||
"url": "https://raw.githubusercontent.com/vinkerq/iptv-api/refs/heads/master/iptv.txt"
|
||||
},
|
||||
{
|
||||
"name": "🐬风云源",
|
||||
@@ -150,13 +93,6 @@
|
||||
"ua": "okhttp",
|
||||
"url": "https://t.freetv.fun/m3u/playlist_all.txt"
|
||||
},
|
||||
{
|
||||
"name": "🐬4GTV(梯子台湾节点)720p",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/4gtv.txt"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "🐬4GTV(免梯子)1080p",
|
||||
"type": 0,
|
||||
@@ -169,12 +105,6 @@
|
||||
"ua": "okhttp",
|
||||
"url": "https://ha.msbot.dpdns.org/4gtv_api.php"
|
||||
},
|
||||
{
|
||||
"name": "🐬jackTV(梯子)",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "https://php.946985.filegear-sg.me/jackTV.m3u"
|
||||
},
|
||||
{
|
||||
"name": "FreeTV.fun",
|
||||
"type": 0,
|
||||
@@ -195,12 +125,6 @@
|
||||
"logo": "https://epg.112114.xyz/logo/{name}.png",
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "香蕉-MYTV",
|
||||
"url": "https://tv.iill.top/m3u/MyTV",
|
||||
"epg": "http://epg.112114.xyz/?ch={name}&date={date}&serverTimeZone=Asia/Taipei",
|
||||
"pass": true
|
||||
},
|
||||
{
|
||||
"name": "RobYang| http://RobYang.dpdns.org",
|
||||
"type": 0,
|
||||
@@ -225,7 +149,7 @@
|
||||
"name": "🔞秘密基地",
|
||||
"type": 0,
|
||||
"ua": "okhttp",
|
||||
"url": "https://ghfast.top/https://raw.githubusercontent.com/FGBLH/FG/refs/heads/main/xxx视频资源"
|
||||
"url": "https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/xxx视频资源.txt"
|
||||
},
|
||||
{
|
||||
"name": "🔞祕密花園",
|
||||
@@ -238,7 +162,7 @@
|
||||
},
|
||||
{
|
||||
"name": "🔞午夜劇場",
|
||||
"url": "https://raw.githubusercontent.com/FGBLH/GHK/refs/heads/main/%E5%8D%88%E5%A4%9C%E5%89%A7%E5%9C%BA.txt",
|
||||
"url": "https://raw.githubusercontent.com/FGBLH/HKL/refs/heads/main/午夜剧场.txt",
|
||||
"type": 0,
|
||||
"timeout": 10,
|
||||
"ua": "okhttp/3.8.1 okhttp/3.15 okhttp/4.12.0 Herissmon/2016 judy/5.2.1 RobYang/5.2.1 Lavf/58.12.100 catvod.com Goiptv/8.8.8 Goiptv/0.0.1 xieanqishiwoerzi/0.0.1 okHttp/Mod-1.0.0",
|
||||
|
||||
+19
-19
@@ -2,7 +2,7 @@
|
||||
"spider": "./jar/fm.jar;md5;b0adab2fad1de8871b9533527f407cdf",
|
||||
"logo": "https://p3-pc.douyinpic.com/img/aweme-avatar/tos-cn-i-0813_6e2553f5708c414386eeca88b5f2674a~c5_300x300.jpeg?from=2956013662",
|
||||
"wallpaper": "https://gitlab.com/tenrecha/recha/-/raw/main/background.jpg",
|
||||
"notice": "115.07.12_Ver.2 請群內準備進行測試",
|
||||
"notice": "115.07.13_Ver.1 請群內開始進行測試",
|
||||
"sites": [
|
||||
|
||||
|
||||
@@ -1122,19 +1122,6 @@
|
||||
},
|
||||
"timeout" : 20
|
||||
},
|
||||
{
|
||||
"key" : "drpyS_听友[听]",
|
||||
"name" : "🎧|听友|有聲書",
|
||||
"type" : 4,
|
||||
"api" : "http://149.118.133.251:5757/api/听友[听]",
|
||||
"searchable" : 2,
|
||||
"filterable" : 1,
|
||||
"quickSearch": 1,
|
||||
"title" : "听友[听]",
|
||||
"类型" : "听书",
|
||||
"lang" : "ds",
|
||||
"ext" : ""
|
||||
},
|
||||
{
|
||||
"key" : "py_愛電影.py",
|
||||
"name" : "🥇|金牌系列-愛電影",
|
||||
@@ -2235,7 +2222,7 @@
|
||||
},
|
||||
{
|
||||
"key": "TingShijie",
|
||||
"name": "🎧|聽世界|有声",
|
||||
"name": "🎧|聽世界|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingShijie",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
@@ -2247,7 +2234,7 @@
|
||||
},
|
||||
{
|
||||
"key": "TingYou",
|
||||
"name": "🎧|听友|有声",
|
||||
"name": "🎧|听友|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingYou",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
@@ -2256,10 +2243,23 @@
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
"key" : "drpyS_听友[听]",
|
||||
"name" : "🎧|听友|有聲(道長)",
|
||||
"type" : 4,
|
||||
"api" : "http://149.118.133.251:5757/api/听友[听]",
|
||||
"searchable" : 2,
|
||||
"filterable" : 1,
|
||||
"quickSearch": 1,
|
||||
"title" : "听友[听]",
|
||||
"类型" : "听书",
|
||||
"lang" : "ds",
|
||||
"ext" : ""
|
||||
},
|
||||
{
|
||||
"key": "TingBook",
|
||||
"name": "📻|六月|有声",
|
||||
"name": "📻|六月|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingBook",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
@@ -2272,7 +2272,7 @@
|
||||
},
|
||||
{
|
||||
"key": "TingBookJinXia",
|
||||
"name": "📻|堇夏|有声",
|
||||
"name": "📻|堇夏|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingBookJinXia",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
|
||||
@@ -0,0 +1,2397 @@
|
||||
{
|
||||
"spider": "./jar/fm.jar;md5;b0adab2fad1de8871b9533527f407cdf",
|
||||
"logo": "https://p3-pc.douyinpic.com/img/aweme-avatar/tos-cn-i-0813_6e2553f5708c414386eeca88b5f2674a~c5_300x300.jpeg?from=2956013662",
|
||||
"wallpaper": "https://gitlab.com/tenrecha/recha/-/raw/main/background.jpg",
|
||||
"notice": "115.07.13_Ver.8 移除愛影",
|
||||
"sites": [
|
||||
|
||||
|
||||
{
|
||||
"key": "豆瓣",
|
||||
"name": "🇹🇼|熱播排行榜|自動切換",
|
||||
"type": 3,
|
||||
"api": "csp_Douban",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 0,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "豆瓣-搜索",
|
||||
"name" : "🇹🇼|熱播排行榜|可選站",
|
||||
"type": 3,
|
||||
"api": "csp_Douban",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"indexs": 1,
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "YGP",
|
||||
"name": "🇹🇼|預告片",
|
||||
"type": 3,
|
||||
"api": "csp_YGP",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key" : "YouTube",
|
||||
"name" : "♓️|YouTube|SO",
|
||||
"type" : 3,
|
||||
"api" : "csp_Ytdl",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"playerType" : 2,
|
||||
"timeout" : 30,
|
||||
"filterable" : 1,
|
||||
"style" : {"type": "rect", "ratio": 1.33},
|
||||
"jar" : "./lib/Youtube.jar",
|
||||
"ext" : {"proxy": "", "youtube_txt": "./lib/Youtube.txt"}
|
||||
},
|
||||
{
|
||||
"key": "聚合短剧",
|
||||
"name": "📺|聚合短劇",
|
||||
"type": 3,
|
||||
"api": "./drpy_js/聚合短剧.js",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "csp_瓜皮",
|
||||
"name": "🐙|瓜皮|只能搜索用",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"playerType": 2,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"filterable": 1,
|
||||
"click": "document.querySelector(\"#playleft iframe\").contentWindow.document.querySelector(\"#start\").click();",
|
||||
"timeout": 60,
|
||||
"jar": "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"ext": {
|
||||
"主页url": "https://www.gpvod.cc",
|
||||
"副标题": "public-list-prb hide ft2\">&&</span>",
|
||||
"数组": "class=\"public-list-div public-list-bj\">&&</div>",
|
||||
"图片": "data-src=\"&&\"",
|
||||
"标题": "title=\"&&\"",
|
||||
"链接": "href=\"&&\"",
|
||||
"搜索url": "https://www.gpvod.cc/vodsearch.html?wd={wd}",
|
||||
"搜索数组": "class=\"left public-list-bj\">&&</div>",
|
||||
"搜索图片": "data-src=\"&&\"",
|
||||
"搜索标题": "alt=\"&&封面图\"referrerpolicy",
|
||||
"搜索链接": "href=\"&&\"",
|
||||
"搜索副标题": "public-list-prb hide ft2\">&&</span>",
|
||||
"简介": "class=\"text cor3\">&&</div>",
|
||||
"线路数组": "<a class=\"swiper-slide&&</a>",
|
||||
"线路标题": "</i>&&<span",
|
||||
"播放数组": "<ul class=\"anthology-list-play size\">&&</ul>",
|
||||
"播放标题": "\">&&</a>",
|
||||
"分类url": "https://www.gpvod.cc/vodshow/area/{area}/by/{by}/id/{cateId}/page/{catePg}/year/{year}.html",
|
||||
"分类": "电影$dianying#电视劇$juji#综艺$zongyi#动漫$dongman#短劇$shuangju"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "金牌影视",
|
||||
"name": "🏆|金牌|高清",
|
||||
"type": 3,
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"api": "csp_Jpys",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext": "https://y2s52n7.com,https://m.hkybqufgh.com,https://m.sizhengxt.com,https://m.9zhoukj.com,https://m.sizhengxt.com,https://m.jiabaide.cn"
|
||||
},
|
||||
{
|
||||
"key" : "AiGua",
|
||||
"name" : "🏆|銀牌|高清",
|
||||
"type" : 3,
|
||||
"api" : "csp_AiGuaAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "py_aidianying",
|
||||
"name" : "🏆|鐵牌|藍光",
|
||||
"type" : 3,
|
||||
"api" : "./py/aidianying.py",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "Qile优视频2",
|
||||
"name": "🏆|Uvod|藍光◎秒播",
|
||||
"type": 3,
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"api": "csp_Uvod",
|
||||
"jar": "./jar/custom_spider.jar;md5;5e53c8f9ddd4ede5359c16bee091db93",
|
||||
"playerType": 2,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "Uvod",
|
||||
"name": "🏆|Uvod|備用",
|
||||
"type": 3,
|
||||
"api": "./py/Uvod.py",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"order_num": 0,
|
||||
"style": {
|
||||
"type": "rect"
|
||||
},
|
||||
"ext": ""
|
||||
},
|
||||
{
|
||||
"key": "dttv",
|
||||
"name": "🏆|蛋塔|高清",
|
||||
"type": 3,
|
||||
"api": "./py/蛋挞TV.py"
|
||||
},
|
||||
{
|
||||
"key" : "Ysp",
|
||||
"name" : "🏆|優影|高清",
|
||||
"type" : 3,
|
||||
"api" : "csp_YspAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "Olyy",
|
||||
"name" : "🏆|歐樂|高清",
|
||||
"type" : 3,
|
||||
"api" : "csp_OlyyAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "py_jieyingshi",
|
||||
"name": "🏆|異界|高清",
|
||||
"type": 3,
|
||||
"api" : "csp_Jys",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : "https://www.ndhfiohk.com/",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "Dubk",
|
||||
"name": "🏆|獨播庫|",
|
||||
"type": 3,
|
||||
"api": "csp_DubkAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "https://nos.netease.com/youdata-netease/public-utilUpload-dETsDhhkydVym6T7qzn7WB.gz"
|
||||
},
|
||||
{
|
||||
"key": "Duboku",
|
||||
"name": "🏆|獨播庫|備用",
|
||||
"type": 3,
|
||||
"api": "csp_Duboku",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "php_无水印资源",
|
||||
"name" : "🏆|無水|(T4)",
|
||||
"type" : 4,
|
||||
"api" : "https://php.doube.eu.org/php/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"ext" : {
|
||||
"module_name": "CmsSuggest",
|
||||
"url" : "https://api.wsyzy.net/api.php/provide/vod"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "知予",
|
||||
"name": "🏆|知予|高清◎秒播(賭場廣告)",
|
||||
"api": "csp_AppNox",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"type": 3,
|
||||
"ext": "AXa/dhw2PLXN7GTzaamHOCEf9KWdx8b5bp7n8hAmf9Boa6AZrB5/hhb4qGO6kjkz/Oh5Uei9rzPWsZlQhgxQGSu7Zb/ZmT15NpqUP+qEjAXGPyOlfFWZbr4rxW3WZSqH6i+OT49idbNqqJdm1jXPR00G5O44GJb+9H7f1iioaW5GOEXjTbDGfBqd4uVVCz6vPPgb/k1NVY/Ze+bb5AsQMmZyAcHWgow8PEaTln0cVXxkb5VmKMQfj5sEq9ZnWGHbu4/32qI2Jjtkmj6VijcdWZSyxuwW/O1i8QbrqQZMeYyr16m5gwNFIyv3ppAxMfyjSz6P7J9dbMfS5PaT3xL3TKTAnZFjS0KyZIKYrJBLj9lXwgox8aFmPV1fT2CBX5t/dHX6gL8CfkhYGjFj7LnVLZo5se/1WjuMkzPTSZharqLvXySQsKpiGKLhfs8DsgQppW4BP8Lv2wPFDmbwB2op21RJDJNQhJXbOW6Z4rI5uXZJAW6LuvudGVKVD/RF3/yUlM4Boda3iuV/7ER45wPegGXouEiiuS7QHjYCgiMLVmUEiYLVhiTe3qDU6VlHqn5YhP7+1kibrXrRQ7JzyQ0sOxljdVHQw6IIRTQwzSBJLoDiiCddIncVXxYmKuhW6Pxen1bOfQgd723GkDyLB1Y5U9KXbzS9y6+ko37HVfmwUzDEcG+DYyxa2lJTCIXbdPbl8LBGUGMURx1S43wMLh1rurnz41qwPL5/WULQJmx4bt4E30dcTi/KfIBD8EUM8YZk8z7JSG5bi3oyYToXXRJCXK/qNpxaJ5I0s27MfnJRE/xF2k7Pv0YtFPmwdQr6Z3neEzOo/Vt1E5WlC0JiURC2bO+MWqA70m6B5WJkmnd46qPLtaofki6EzbH81AMvgsYAgjf8iAO6nYWFcrVoAsYMMgJkyPExJEUQStc+TB4gvUFUT9VeTHMXNSWiHMrhGkAQIA37PXzfig3c0sAUy+9iNlKXZv/lfbVFRgV9w8k0eDLrcR40Ma1Pmgnwq7v05RqJiSQCngiXOQgzR4wFar5anDJT73LmmP77+zaoJDH0aZeY"
|
||||
},
|
||||
{
|
||||
"key": "长泽",
|
||||
"name": "🏆|長澤|高清◎秒播",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api": "csp_App88",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"ext": "Aa+WBBIIxghmbVYkWqlC4wrZvlocl4rSZS9+QyJDF6RgWFfYSb+nEM6WkMHPVbQFva551Srt16FqFroyjNssEXemH+xC5pCMj/ewgFuLEIbY2mXCVJ1bJxWRJAggNgH1f3mjwrBxlZA0kGgfAd0os29Mdi3RNJilSo5VMkPpcQPMeF8/PTbZHNymotiTwtICNcA5Q0WXsqe/wJ3HoLU4gBYQs1lBmYdxtAuvsnte3SbumQEFlaQnygFscx6EGrwKMFZLVcmu9egAXxygsf5PmyzN/xvOr+b+HslccoKqDbHNU/C6yWFwaHBawww0ckXRtoJ8fFbV7Xv4NiRcEf6ePm/cd06xYiZmjRts11gE0r8f7D0vx/TgigmU3v8nrgNYDokUGl/jDdza3o7BXyQumCWRD45wYbmKJ1LKb0ybRvNt"
|
||||
},
|
||||
{
|
||||
"key": "悯善",
|
||||
"name": "🏆|憫鄯|高清◎秒播",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api": "csp_App88",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"ext": "AY/LmvuAAyhXffcGv5StyHm1MkGdY4inQLRC3KICnxUJBpq0d5dLhvE0+MW8XruH+M/Q/Ruqd6NayN9rihHGuotzXSTrDHgoZ2/dm2JlJ7GYOYfBorPhMPjuOhTNMg9w/J6oP4DXluvDpXNj9uOKq7g/Cx7vrKF6utOSaE1gUgDQwT251mOGTzGsd3ZrtEeepgI6hOdB2gJ4hHRumNhlbVtWDdpnVMYvhCIuH2HUqJFZWM5T+gEZTMLfeUEJt7ScfaQp90qNZID1YNo/tQOaFLGN12o4CkPtCNoYs+emjhVVqIjJzgfplCPIEyjRADqhur0c48FwCiJyp/XGZFmsMJaPKqvOkO+0H5YMKsR+EMmXCr6n0n1VnwGGpYl3maiq1SB78yDnh16291IjwXdERP1csTe41Vg3ppIixtk6q1etAikUle+6fjSFGvAvDYNr2Q=="
|
||||
},
|
||||
{
|
||||
"key": "景仪",
|
||||
"name": "🏆|景仪|高清◎秒播",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api": "csp_App88",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"ext": "AScEBDU8ZGTviWgGR4VE0GGkVwxm9FRojDfGdLd7Uq6yQW7ma68i5+t2StAnXVayevGqI3Kb0rJi2eqa1R3PW9cxHiFDbXAhtGajyY69GUpDZQ615h6l9jBlh/RMkOo3RfAvtXJdZasUTDhxflfJPCn0T5P68L/XHUV9ylgYmABoOSghqLVoMUNWDS5E2PAMVkm39vpIJOyKNEIhVd3EQmPxDSjSoDE56akhNdBPWsT+tZVbLO8rEccdRYGvxYsXmVjhxaXhmzQEoEme5LF/0+x+M2A880NZ5akhrKIl5ZjfREZCgQ6FClx7+L8f8fb2VNiLtFu5538MrSRozjub6WRKe1m5OOdgdOTsAXJXw5QG5IQ/Y/i9VBZTZUjqP+0TpP4h92QjLynjJAFzwSr3bAOOIvEJW2LsK+hocK72wpyVG93vl42XQpU5s95dAVJOOOnbawZUsOq8a0ctuSsSdWQ="
|
||||
},
|
||||
{
|
||||
"name" : "🏆|伊外|高清◎秒播",
|
||||
"key" : "YIys",
|
||||
"type" : 3,
|
||||
"api" : "csp_YIysAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"name" : "🏆|金牌|高清◎秒播",
|
||||
"key" : "JinPai",
|
||||
"type" : 3,
|
||||
"api" : "csp_JinPaiAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0
|
||||
},
|
||||
{
|
||||
"key" : "py_耐看点播",
|
||||
"name" : "🏆|耐看|高清◎秒播",
|
||||
"type" : 3,
|
||||
"api" : "./py/耐看点播.py",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "py_永乐视频",
|
||||
"name" : "🏆|永樂|高清◎秒播",
|
||||
"type" : 3,
|
||||
"api" : "./py/永乐视频修复搜索.py",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "飞飞",
|
||||
"name": "🏆|飛飛丨高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppYsV2",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "https://qpcj.69mini.com/api.php/app/"
|
||||
},
|
||||
{
|
||||
"key": "天堂",
|
||||
"name": "🏆|天堂|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppDrama",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"appName": "电影天堂",
|
||||
"publicKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCduNEnfxGaLuQRk5ABzXHhPV43zi00sCHjLo8BYc+Wi6xXm2b4v0i28Sq4WlNCKhseft9fz8kO/qLr6/022o1RcuOU7e4GFL3U9WnNODwRBYSYWd+K8nqpI/tAUDmZEBGRWqjrc7x6aMl3A+xpnWkLbPCLsuhbuuUE3tv09oeOpwIDAQAB",
|
||||
"dataKey": "D2KREWRIBVNAUJJYEDL4VFHOY2Q0PQ==",
|
||||
"dataIv": "OC1A06E197EF10CF3F6058CA7A803B5E",
|
||||
"pkg": "com.dytiantang.one",
|
||||
"host": "",
|
||||
"site": "https://dyttandroid04-1372779881.cos.ap-shanghai.myqcloud.com/app_dyttandroid.txt",
|
||||
"version": "3.0.0.7",
|
||||
"decrypt": "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "TvDy",
|
||||
"name": "🏆|天堂|備用",
|
||||
"type": 3,
|
||||
"api": "csp_TvDy",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "灵虎",
|
||||
"name": "🏆|靈虎|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppGet",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"site" : "https://bind.315999.xyz/89.txt",
|
||||
"dataKey": "#getapp@TMD@2025",
|
||||
"dataIv" : "#getapp@TMD@2025"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "Bidys",
|
||||
"name" : "🏆|哔嘀|2K",
|
||||
"type" : 3,
|
||||
"api" : "csp_BidysAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"ext" : "https://www.xlys02.com,https://xl02.com.de"
|
||||
},
|
||||
{
|
||||
"key" : "Aiyf",
|
||||
"name" : "🏆|愛壹帆|",
|
||||
"type" : 3,
|
||||
"api" : "csp_AiyfAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0
|
||||
},
|
||||
{
|
||||
"key" : "无极99",
|
||||
"name": "🏆|無極|?",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api" : "csp_App99",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : {
|
||||
"host": "http://111.170.140.70:19987/app/bn",
|
||||
"LoginPath": "/app/log",
|
||||
"version": "",
|
||||
"appkey": "c403317c2a2946659b0bcbabdd5de43a",
|
||||
"versionName": "1.0.1",
|
||||
"name": "无极影视",
|
||||
"package": "com.wujiys.app",
|
||||
"buildNumber": "2001",
|
||||
"buildSignature": "A0859BDC35AD3E81D4051E2A4678C77C62773EDB3423DDF1DEFF94CB331D398E"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "清沅",
|
||||
"name": "🏆|清沅|高清◎秒播",
|
||||
"api": "csp_AppNox",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"ext": "ASjKEhQKe/DZHt0fbLID47aB3aYcWUG5aIPwrmTCgGinaSykux5CZpbz57zl1moRZGFkoEXqk7decpKNU6W/p/6OTfj3JWvZtr89yPZSxNyjJm1Il5upXQT68sXR/0WG392H71MN7Q8NC8xkSOuwAq7EfX2cuHMsiqFeCCugzAiINUiEqvboCFdXiI97C6kqqqiaQIS9d+R1r7krr5vQXWtky7XJNsiK5ACjppyTh68cbONYIcgLp5Kg5woh/wj9xmNT6mFGqF2D3j2RUaLoWYf+K1+ltBiuzZ7THWKwrnpBBig8XUAG3lXNXiFhPILyYWfr+1j/UoInhNITzJJ+SSRc88KmOk5kpch+idGzVMzHIq/bLpRRxE0iV8Qdtc2atKF9QUqPXJLrwv21Dl+nxgPEGOZ+71L+gABeQdvXO7xvyzUnd+rOidPJr1mBsfu9ySbcqHkhL5EIEQpGHwRhG/yN3Y5xj0BU+SdSxnDo+CwMC+g+WCts34c2u8h2tz7G5vuTw8QvDF23kF/BZeD2QaoCBAd3SDG9ObAichfuO1nDa938+Ul+iekNOEPtPFr6k5o+px/JJkE7MKYhekE/2JfmIkbkBHdnewJYckdM37/9EKsnAozbDyFKhfKR06Es52KtuAhGyh1B8uyfsj33qFpreAqGam8kjEHdYA0i832o0BtTU2gS3mf3NoijVH/XNmlJRuNXo9yYxdjuip4Eq4iqIgajM16MGAIJ0rumYhxJ5uJUFDlf55b9iS+DvJ8wotnBvfdINpAaeXPPlVc/1JDp1rIOw0qg2XIRAafLL7kzXnW8djs2dPSQU1+j9LIrfQ6u3k4lqUs9gRMW1JhwC/4iqimnwg0KsVValaplt+fxFHhwCCkS45uLf8BaY+UZtp5ZDffbi3Q0EDAK8F210Bzd5l8W8MokURUSj374Z7y2hAROBAAgZ8qWRrFOmBC+I+LUCm7sV4h7Mwdpe8sDAtxBhxOpBAYyV8eACQsDbnQsBvizlafy16ptRrArViG0uB1VSPqvi8gqcFD1zMl+uRo="
|
||||
},
|
||||
{
|
||||
"key" : "bubutv",
|
||||
"name" : "🏆|步步|4K",
|
||||
"type" : 3,
|
||||
"api" : "./js/4k.js",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1
|
||||
},
|
||||
{
|
||||
"key": "山楂",
|
||||
"name": "🏆|山楂|?",
|
||||
"type": 3,
|
||||
"api": "./py/山楂.py",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "橘汁",
|
||||
"name": "🏆|橘子|?",
|
||||
"type": 3,
|
||||
"api": "csp_AppDrama",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"appName": "橘汁",
|
||||
"publicKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCr8SzZhjYy+rsya1K09t8d2K50pWFoBkgUqMpKOiW+3IEVKd4eTdvg9RSOjQ82kypL6R9BnsmrS1V8s4PVDwjQbUtYhTPPC9Hz16qY7rpD6m0d2vr09/UpWQ5uOy9PR0QTrsioveZ+DIe9jc3C+zBCu/kZSY/R8stwJoiitki3gwIDAQAB",
|
||||
"dataKey": "DGVQRUX5R1LWWDLHTGJSUKG1DJRVPQ==",
|
||||
"dataIv": "OC1A06E197EF10CF3F6058CA7A803B5E",
|
||||
"pkg": "com.lxf.snzlcgtzxyx",
|
||||
"host": "",
|
||||
"site": "https://123-1349250429.cos.ap-shanghai.myqcloud.com/app.txt",
|
||||
"version": "3.0.2.1",
|
||||
"decrypt": "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "星河",
|
||||
"name": "🏆|星河|4K",
|
||||
"type": 3,
|
||||
"api": "csp_AppQi",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"site": "https://daen-1256234123.cos.ap-shanghai.myqcloud.com/MuQi/mqxhqj.txt",
|
||||
"dataKey": "kj37zs29q22jk96t",
|
||||
"dataIv": "kj37zs29q22jk96t",
|
||||
"init": "initV122",
|
||||
"ua": "okhttp/3.10.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "星夜",
|
||||
"name": "🏆|星夜|4K",
|
||||
"type": 3,
|
||||
"api": "csp_AppQi",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"changeable": 1,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"url" : "https://qj4.catbb.xyz",
|
||||
"dataKey": "eecbio48dsq13kkk",
|
||||
"dataIv" : "eecbio48dsq13kkk",
|
||||
"init" : "initV122",
|
||||
"ua" : "Lavf/58.12.100"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "顾我99",
|
||||
"name": "🏆|顾我|3線有賭港廣告",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api" : "csp_App99",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : {
|
||||
"host": "http://117.50.200.113:19987/app/bn",
|
||||
"LoginPath": "/app/log",
|
||||
"appkey": "040f9b1bc5e942569b5c3e63943306ab",
|
||||
"versionName": "4.3.1",
|
||||
"name": "顾我追剧",
|
||||
"package": "com.guwozhuijux.app",
|
||||
"buildNumber": "2001",
|
||||
"buildSignature": "5AD4436C4730FFE26910C86278B80F3E661C317FFC3616F702D20A729262624A"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "听心99",
|
||||
"name": "🏆|庭馨|?",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api" : "csp_App99",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : {
|
||||
"host": "https://api.12321app.com/api",
|
||||
"LoginPath": "/app/log",
|
||||
"appkey": "a0a18659a9977a47e53442cd084b536c",
|
||||
"versionName": "2.8.1",
|
||||
"name": "听心视频",
|
||||
"package": "com.iksp.adsys.jjsp",
|
||||
"buildNumber": "2001",
|
||||
"buildSignature": "03DD38CE4C3D62D0F0DEFACC06768D14EB382C7BD77A05B2EBF4D66E154A0D47"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "🏆|哔嘀|2K",
|
||||
"key": "Bidys",
|
||||
"type": 3,
|
||||
"api": "csp_BidysAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "https://v.xl01.eu.cc,https://xl02.com.de,https://v.xl02.eu.cc,https://v.xl01.cc.ua"
|
||||
},
|
||||
{
|
||||
"key": "苹果",
|
||||
"name": "🏆|苹果|秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppDrama",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"appName": "小苹果",
|
||||
"publicKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCduNEnfxGaLuQRk5ABzXHhPV43zi00sCHjLo8BYc+Wi6xXm2b4v0i28Sq4WlNCKhseft9fz8kO/qLr6/022o1RcuOU7e4GFL3U9WnNODwRBYSYWd+K8nqpI/tAUDmZEBGRWqjrc7x6aMl3A+xpnWkLbPCLsuhbuuUE3tv09oeOpwIDAQAB",
|
||||
"dataKey": "S0VNDTJHOFHHCNMRAW5IV2TOS2PBPQ==",
|
||||
"dataIv": "OC1A06E197EF10CF3F6058CA7A803B5E",
|
||||
"pkg": "com.juechufsh.android.xpg1",
|
||||
"host": "",
|
||||
"site": "https://xpgandroid03-1372779881.cos.ap-beijing.myqcloud.com/app_xpg_android.txt",
|
||||
"version": "1.0.0.3",
|
||||
"decrypt": "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "爱瓜TV",
|
||||
"name": "🏆|愛瓜|PHP",
|
||||
"type": 4,
|
||||
"api": "http://zhangqun1818.serv00.net/aigua1.php",
|
||||
"jar": "./jar/pro.jar",
|
||||
"searchable": 1,
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.33
|
||||
},
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "huaisang",
|
||||
"name": "🥇|怀桑|高清",
|
||||
"type": 3,
|
||||
"api": "csp_AppQi",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": "AdYEovlEKsDy77+R58YGahWCxrDZyBxExcQNC2NSeH0n1b5mu6tvh8b4Eh0RCpoPF6eivKdrR1Hsb8X4sSVBS8zF6jkwLW+wze9yh+hSY5iimm4gM9mAtmt0obTi+6Iox/Jp4GCsN4MQyFebMK162SKnILklpXc1UMiJv9gnPOe5aOPUxCftL+x7/UGhBdFYWIegpiHvKeavUtCUkhxtDyC8KqVVPPW0StI5GdmUA3WBbnnrNiKqNc5GBmrffd6pDN+Cf9IIjzNNvos/5KXJmBbe/baAzTLkoafeIoDhO451"
|
||||
},
|
||||
{
|
||||
"key": "fishhxq",
|
||||
"name": "🥇|韓圈|備用",
|
||||
"type": 3,
|
||||
"api": "csp_FishHxq",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"ext": "http://www.小不点.com/api//2026/fishhxq.php"
|
||||
},
|
||||
{
|
||||
"key": "枫眠",
|
||||
"name": "🥇|楓眠|普清◎秒播(線路不穩)",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api": "csp_App88",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"ext": "AdzbT8Ti+fGJ2PrJDEahdT7+zU3sFruyF0fAaUTWAUOCrbG/s0KhC5zQusyXAkmDYai/yhecQAtwKkDfTqbVCQT15T0FDK1GX9GLxT9V3XyFRDT0ATcwcFfw5joxSB+YLlez1nGpT2AW5KomI3yNv3ORTd4B3NqAcM34Cioc6+xwfj3HJ4JO6kQvv4solNApeP7CqF/Ecpt1BCgvvPzswMOr+kgVG/Iu8btrVQFO+pRpY7cfpc/Y59ZqaJlrCTDNLxgwuG20RZ9gVWsW+vd3A9lRgeTiJ39vJPoK46+9LnYGWU9dlDR1qRg4y5ILVQjEnT4el2cKSZexf7nrXHVfF3nOmHH/w/R/OSGllwUB7FCHDMc7eDY7haDYHWAQpEmcn4+BfbC4cipsdZ+nVieVVuuaWSF9s+0xYPWdSYLJMxApplTYkO+/h5z9atdURJUMGQ=="
|
||||
},
|
||||
{
|
||||
"key": "BuBu",
|
||||
"name": "🥇|布布|普清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_BuBu",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"name": "🥇|夏天|很慢",
|
||||
"key": "NewGrV2",
|
||||
"type": 3,
|
||||
"api": "csp_NewGrV2Amns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "e5f15714a2413f05151fea686450950ace809216b88f37b7b1fb4f1ce80eff9fab1b6be3fd1f9df9a5a915365aefecb314d297b5e1747337c20236c3637c2aeaebfce371e9053be3898bb20a9ef20bbf13173fb2ad38b4474346328a3a354451a1b5f96c490cc09840a195bc498f9e11499df11b3946e58e4c705a8457521ed34c879c458a9b27e487496c7a63a7ca8b34133bca4943b0019d982462cc22294e7c4ab447899b0e8bc667c7e635e8291fa544e8e28d8b16b8b702912f2d5ec561e1fb8667cc44bef7cae73f5022c94518cb7f0845d772d44944a88ff71d9a562a6204729a8f1b00c81ba195664482e756859f12048f73e986ad3bb6584935696dff959b0f82055f23d94f6a935103b574a98d54079a0be6647fcaca4db0d177ac3004eb51819a8e539646a141"
|
||||
},
|
||||
{
|
||||
"name": "🥇|大师兄|秒播",
|
||||
"key": "AppV6Dxs",
|
||||
"type": 3,
|
||||
"api": "csp_AppV6Amns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "fbe15714a2413f05151fea6864509533510f3a0bb290dd40e3a2c65650bcf144db38b7a8945b776cf8933cb38e93a7d5d36988f5cbd33db73a1432681073eb45b4ce8224060c20ef229653f6b45f4e3a327a40e74bc51f710207b43b74b9bc3f9a2f70608e9c4783ddefc066662fb396be2d3c44dd2df48630d381176fd82e54565eccc47d944de1ff2bad4be0be043beaebd8fdcc0b6df5b1c2c3ec1f7d02b0e3f57e9af680cff3627e68d389379a8d3efdadb70e25135a3c473ddf249277ad12c9fa11002df91d7303627b06ac6bddd67ea082a758c6805628c06dcb22cafb109efad1389006e9c9518c7f85b2ab546315a1005adbf726ffe50d1f679fcf3b40e05f14698f8f5b6d1d829d6871d912056f1eee83cc1df1d9a126422781356e81cf24598a0216206fa59d2645a5812cc73e603190521454e77cc06c3640ea0799b83d60a3a0eaf5e28a7797ab77181d2b91aff50d9e1af419f10b839dc9fc61fb392ce138aaa6126f9eb3be09e94a87b96ac883c72c26d4b81d52de2696f40593b059ddd2279c354dc23d72a1f98150ec0be0dc0a5f6fdb93583b092c768b7fb8dd1bd43b59622810382fd21385606490610364fcd13e908f57a012f26e4cd4d1cee74c000bdc19edf27cb469f085c99cc9b8d9ae0f8b21473240c4a048a7dc8c6e5663258cc9184b1925ad8cb4e377f1cb78f06ee983263f47db396bb64d7118a2bb732d566408125f8ea1cb4158e6b70ac0bcff54ad45274772aaf96ca6183abfa8f0b3606404543823afc801edb734912f6777c30170a8fd0ddc9f69a3dc63885e23014f424e7a9fb8c29572d9d3004ea65a9dcf623f9c5c40abc52dc1c26e22ee9339b1ecdb0a3fe6e015cbeab7b7e091d8e7174fbbebdf82f2e1460ca94a61d3124272394619f9d84ac2b3be2fe70dfb9fa12fa8e153125327cb504b970380bf4bac66bcbf3fc3dd64855698ef82a4b0d88ef29e6bc89fe87a3354c941161e8c04a360402e906d30f095587c46ce26b9b7e1d15f7108cb01ff86c9b5a6c7bdfa9258d92602f04c6a77200754c0d4e8b1b5221e465ee36198100b53eb85eb59558016af86125162a95f24e329f87e371906d7f3fbed0f4994acd9a5b3fc2b206a5fcbc4316152f6fb6ac53b8dcffb65e2fde676f32cc9e24a2a954ade411b5ee92e809a86f8a8ac741aba21ce17a7dfb194a2ad36f5f44240669543e9051dc21c7a887d80f4a5cdfbab54903e7caaa2b7daa9ed00903093e33a95682a8fad5b5361a71a9f14f6917c964870994a6b9bca00732473bd6eed0c9e7d7a068d84cf395ae20639c545a1916786b27e85d5eb3189233da8e3361279a7d76ee6605fade068462ad8387a5be98a90d866807a98506d3efac36846329350701d3d0996f1c35009ac46493a76eccb702fd1762cd10bc50e22f3ea34c8902e2d92f07f9d519768e564c23fda9172b9b359bb8d3b508554bb4bf488f283c30f89a7320a542ba985b2df0ec20401a4ddf120f2cc427604c84d7b9340c323169cfd0a5e17d47991eb1bcc0d031297370df81f4ea242bdd5f4c76caac6f5651ba28683d2623ea5b988d3a5c938f2126bd9b49ee4579227ba7458a61bf7b2f88a0f6879242a1584593ca13d9915ec150110997cf3526d3dbdd70d9b1ef0f9c20ec0b7e394f9ae34d5b3b549805553434e9ad0baff73e8eb2dc58bcc38d2b377bb999dc5f940fed55a97951dfc5cda514c37dcdc88aff46de8617a66cfe1372c55e5bfc7d70634a51f39c665beb4bd95b7de9473da306ad9d3de48a301f01187864ff4682cb6852eb865aabb8bdb7de43daeedba1ebb755aba14d954d4a290fc6ac4e0af70577fe9850b631259eb63dfda69026955a6332fbbf84a63cba9d9253581771a61f2aa108c06e1e449637781d8c830b0e3ac20f10de7088175be90761afd66da37adead8a7241fcb4e2a571885bde71811daa240012cb6effe2fc7380027b3e85cf32c0dd40569775983451603ee7687273eeaad5825d58adec12b9489d5a22e8ba08978984f0274dc53537ecd285e2c12dafec32cd3419dde63a1639794bf70c102b6b53fa1fdff744d757c0d6c05a30a9b561821a8846ce9ef0f26",
|
||||
"timeout":240
|
||||
},
|
||||
{
|
||||
"key" : "三秋影视",
|
||||
"name": "🥇|三秋|普畫◎秒播",
|
||||
"type": 3,
|
||||
"api" : "csp_App3Q",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a"
|
||||
},
|
||||
{
|
||||
"key" : "听心99",
|
||||
"name": "🥇|聽心|高清◎秒播",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api" : "csp_App99",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : {
|
||||
"host": "https://api.12321app.com/api",
|
||||
"LoginPath": "/app/log",
|
||||
"appkey": "a0a18659a9977a47e53442cd084b536c",
|
||||
"versionName": "2.8.1",
|
||||
"name": "听心视频",
|
||||
"package": "com.iksp.adsys.jjsp",
|
||||
"buildNumber": "2001",
|
||||
"buildSignature": "03DD38CE4C3D62D0F0DEFACC06768D14EB382C7BD77A05B2EBF4D66E154A0D47"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "橙子99",
|
||||
"name": "🥇|橙子丨高清◎秒播",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api" : "csp_App99",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : {
|
||||
"host": "http://113.31.180.218:19987/app/bn",
|
||||
"LoginPath": "/app/log",
|
||||
"appkey": "6e8f3764a0644f3686ab5cdd57bcdf48",
|
||||
"versionName": "4.3.1",
|
||||
"name": "小橙子",
|
||||
"package": "com.xchengzix.app",
|
||||
"buildNumber": "2001",
|
||||
"buildSignature": "99DA983CF878CEC016616175464A91A94775E20A489F07F76FCDEA1A0F2B6B45"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "AppV6Dxs",
|
||||
"name": "🥇|大師|",
|
||||
"type": 3,
|
||||
"api": "csp_AppV6Amns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "fbe15714a2413f05151fea6864509533510f3a0bb290dd40e3a2c65650bcf144db38b7a8945b776cf8933cb38e93a7d5d36988f5cbd33db73a1432681073eb45b4ce8224060c20ef229653f6b45f4e3a327a40e74bc51f710207b43b74b9bc3f9a2f70608e9c4783ddefc066662fb396be2d3c44dd2df48630d381176fd82e54565eccc47d944de1ff2bad4be0be043beaebd8fdcc0b6df5b1c2c3ec1f7d02b0e3f57e9af680cff3627e68d389379a8d3efdadb70e25135a3c473ddf249277ad12c9fa11002df91d7303627b06ac6bddd67ea082a758c6805628c06dcb22cafb109efad1389006e9c9518c7f85b2ab546315a1005adbf726ffe50d1f679fcf3b40e05f14698f8f5b6d1d829d6871d912056f1eee83cc1df1d9a126422781356e81cf24598a0216206fa59d2645a5812cc73e603190521454e77cc06c3640ea0799b83d60a3a0eaf5e28a7797ab77181d2b91aff50d9e1af419f10b839dc9fc61fb392ce138aaa6126f9eb3be09e94a87b96ac883c72c26d4b81d52de2696f40593b059ddd2279c354dc23d72a1f98150ec0be0dc0a5f6fdb93583b092c768b7fb8dd1bd43b59622810382fd21385606490610364fcd13e908f57a012f26e4cd4d1cee74c000bdc19edf27cb469f085c99cc9b8d9ae0f8b21473240c4a048a7dc8c6e5663258cc9184b1925ad8cb4e377f1cb78f06ee983263f47db396bb64d7118a2bb732d566408125f8ea1cb4158e6b70ac0bcff54ad45274772aaf96ca6183abfa8f0b3606404543823afc801edb734912f6777c30170a8fd0ddc9f69a3dc63885e23014f424e7a9fb8c29572d9d3004ea65a9dcf623f9c5c40abc52dc1c26e22ee9339b1ecdb0a3fe6e015cbeab7b7e091d8e7174fbbebdf82f2e1460ca94a61d3124272394619f9d84ac2b3be2fe70dfb9fa12fa8e153125327cb504b970380bf4bac66bcbf3fc3dd64855698ef82a4b0d88ef29e6bc89fe87a3354c941161e8c04a360402e906d30f095587c46ce26b9b7e1d15f7108cb01ff86c9b5a6c7bdfa9258d92602f04c6a77200754c0d4e8b1b5221e465ee36198100b53eb85eb59558016af86125162a95f24e329f87e371906d7f3fbed0f4994acd9a5b3fc2b206a5fcbc4316152f6fb6ac53b8dcffb65e2fde676f32cc9e24a2a954ade411b5ee92e809a86f8a8ac741aba21ce17a7dfb194a2ad36f5f44240669543e9051dc21c7a887d80f4a5cdfbab54903e7caaa2b7daa9ed00903093e33a95682a8fad5b5361a71a9f14f6917c964870994a6b9bca00732473bd6eed0c9e7d7a068d84cf395ae20639c545a1916786b27e85d5eb3189233da8e3361279a7d76ee6605fade068462ad8387a5be98a90d866807a98506d3efac36846329350701d3d0996f1c35009ac46493a76eccb702fd1762cd10bc50e22f3ea34c8902e2d92f07f9d519768e564c23fda9172b9b359bb8d3b508554bb4bf488f283c30f89a7320a542ba985b2df0ec20401a4ddf120f2cc427604c84d7b9340c323169cfd0a5e17d47991eb1bcc0d031297370df81f4ea242bdd5f4c76caac6f5651ba28683d2623ea5b988d3a5c938f2126bd9b49ee4579227ba7458a61bf7b2f88a0f6879242a1584593ca13d9915ec150110997cf3526d3dbdd70d9b1ef0f9c20ec0b7e394f9ae34d5b3b549805553434e9ad0baff73e8eb2dc58bcc38d2b377bb999dc5f940fed55a97951dfc5cda514c37dcdc88aff46de8617a66cfe1372c55e5bfc7d70634a51f39c665beb4bd95b7de9473da306ad9d3de48a301f01187864ff4682cb6852eb865aabb8bdb7de43daeedba1ebb755aba14d954d4a290fc6ac4e0af70577fe9850b631259eb63dfda69026955a6332fbbf84a63cba9d9253581771a61f2aa108c06e1e449637781d8c830b0e3ac20f10de7088175be90761afd66da37adead8a7241fcb4e2a571885bde71811daa240012cb6effe2fc7380027b3e85cf32c0dd40569775983451603ee7687273eeaad5825d58adec12b9489d5a22e8ba08978984f0274dc53537ecd285e2c12dafec32cd3419dde63a1639794bf70c102b6b53fa1fdff744d757c0d6c05a30a9b561821a8846ce9ef0f26",
|
||||
"timeout":240
|
||||
},
|
||||
{
|
||||
"key": "薯条",
|
||||
"name": "🥇|薯條|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppDrama",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"appName": "薯条影视",
|
||||
"publicKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCduNEnfxGaLuQRk5ABzXHhPV43zi00sCHjLo8BYc+Wi6xXm2b4v0i28Sq4WlNCKhseft9fz8kO/qLr6/022o1RcuOU7e4GFL3U9WnNODwRBYSYWd+K8nqpI/tAUDmZEBGRWqjrc7x6aMl3A+xpnWkLbPCLsuhbuuUE3tv09oeOpwIDAQAB",
|
||||
"dataKey": "A1VACZJWDKRZY1P3MFV0DDRAZ3F3PT0=",
|
||||
"dataIv": "OC1A06E197EF10CF3F6058CA7A803B5E",
|
||||
"pkg": "com.st.standroid",
|
||||
"host": "",
|
||||
"site": "https://dyttandroid-1372779881.cos.ap-guangzhou.myqcloud.com/app_dyttandroid.txt",
|
||||
"version": "5.0.0.1",
|
||||
"decrypt": "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "奴娜",
|
||||
"name": "🥇|奴娜丨高清◎秒播(d線)",
|
||||
"type": 3,
|
||||
"api": "csp_AppYsV2",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "https://www.nntv.in/api.php/v1.vod"
|
||||
},
|
||||
{
|
||||
"key": "云播",
|
||||
"name": "🥇|云播|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppFox",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {"host": "http://app.hktvyb.cc"}
|
||||
},
|
||||
{
|
||||
"key": "蓝鹰",
|
||||
"name": "🥇|藍鷹|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppQi",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"site" : "https://xinlanyinghb.oss-cn-wuhan-lr.aliyuncs.com/xly.txt",
|
||||
"dataKey": "ca94b06ca359d80e",
|
||||
"dataIv" : "ca94b06ca359d80e",
|
||||
"init" : "initV120",
|
||||
"ua" : "okhttp/3.10.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "猎豹",
|
||||
"name": "🥇|獵豹|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppGet",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"url" : "https://444421.xyz",
|
||||
"dataKey": "#getapp@TMD@2025",
|
||||
"dataIv" : "#getapp@TMD@2025"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "秒看",
|
||||
"name": "🥇|秒看|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppGet",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"site": "https://mk1080.top/get.txt",
|
||||
"dataKey": "c60d88b2eep53za8",
|
||||
"dataIv": "c60d88b2eep53za8",
|
||||
"token": "4181e508e7a17657d6a6246e70b1b13553e5ae9d8d287dc47000fb2df638dffa"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "茉莉",
|
||||
"name": "🥇|茉莉|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppGet",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"site" : "https://gitee.com/wmmoliill/wimg/raw/master/img/bk/9.txt",
|
||||
"dataKey": "88689667dce61725",
|
||||
"dataIv" : "88689667dce61725"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "gulu",
|
||||
"name": "🥇|咕噜|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppQi",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"changeable": 1,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"site": "https://mobile-1251126973.cos.ap-guangzhou.myqcloud.com/maccos_config.txt",
|
||||
"dataKey": "8R33VQSxzmCaHpEX",
|
||||
"dataIv": "8R33VQSxzmCaHpEX",
|
||||
"init": "initV122",
|
||||
"ua": "Lavf/58.12.100"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "爱影",
|
||||
"name": "🥇|愛盈|高清◎秒播",
|
||||
"type": 3,
|
||||
"api": "csp_AppQi",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"changeable": 1,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"site" : "https://aysappto.oss-cn-chengdu.aliyuncs.com/q23.txt",
|
||||
"dataKey": "nzEqOgYk3QzHuEP8",
|
||||
"dataIv" : "nzEqOgYk3QzHuEP8",
|
||||
"init" : "initV122",
|
||||
"ua" : "Lavf/58.12.10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "大师兄",
|
||||
"name": "🥇|大師兄|高清◎秒播",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"jar": "https://s3plus.meituan.net/opapisdk/op_ticket_1_5677168484_1774853250308_PA5tmo8g_vip.jar;md5;a4f403a000bc5e4ebdd9da27fcb05852",
|
||||
"api": "csp_AppV6",
|
||||
"ext": "7lj763gg0939790h44298182lk5j9k99k2g4ih53jl9i376l514k16hilj0443400h9k4jgh8312j1912818glikl7lh1jk9k4222k1kg696igkk32ig6lhj3kl50j08lkl6j0h6gi7k2j31jj0k7i1784l25g757hhkl42i7jg68illihj867l82g53532j62i92kljhj5llh498k24796l57j55ji0ji2g22i501jl541j9j4i68i5j602744l10413k457hl80l91j5l44139j23g64h27k08l5509h202gl84338hi17082hkj5746g298j640i002jk1265h745j289303h6i6j6j15jgkg15485h8g935hk83g9g7j661l4i557jl56h6l0h40i5j9hkiig7066523l2h24gj9k1083g6l2gihh2j5hhgkgij04j8900jhg4l6731hkhij7kk2i594536563674gki85li59jhk79067964197h5k7k2641h03l45074jkkklhik123407146l1i0jk90k1hgl151076ig7i4gi0858h62j37lh8l4hl519ghi7g04h2h900jlj7ll333i736549624gjk8k508g9499gj3jj7050jjhgh4i57326j83301i0kkl88040ih52gj8j0gk0h4g5g7lh561k2gk6k7k56h01598ji23g27k3i17878j92k2gj1l5ih8h0jj73k94g9hl5g7h229i10g099k09l958h3hk18l72h1j43gg7177g4h7ll8987644383606klgh9h4ll42h7293k694kl20j539g6jl17ig655461138jgj7306i1296k3i03586k6l32j5hlik4051187741218271j8j4g3i1h6719877l10k1ijl220i8hlil3j3g129ll3k2i5164lkg12k253kk1h8j5l0gki49jg25hlii704l5ih74439hlj9jih5ki53242ijgh6359i8i5j4h2j2i4581l244j4ij728490hk0k34542916i2lig57836gg7kji3l160234i24hik5g18h790488748j680k5i0l885lj66kjk78j2i57i5021g283ik9g38g62259h1lgi811ihki506k5934g7h737hg9360lll98l4j8i049903l1354lg00019g0934h005h8jjkl60j91k7j74i96h8h26hk59i653209lgj07g1g298k48jllgh00l4i742gi72l27038157gji9j32gh0k5672167k2588h31967l3867g50k503ik403781ki72j47hh4363l0708k4g961k4hl8g4j35ilk143h3424010i165lj612h50k68l61ghl9h80kh874k14ggk2ilg018hi5l1g34262196lkl45ih981jkl42271l4232k93hk8ih3g814i6h63h0g64l300i42il1g0454921j12h4844ii714ih71lg172326009812833h62kj8009kijk5hhg763031235l45h78614l7h9k579h6lj290i98851gll70024834hgj2lg5hk3l905i346gij11kl5j9i7h5j5k12hl061l488k061564g398i2150h9j343901865h7567g874i1gghl5ihg8il8hh0650h6308l2i5053997g8g12g16l3l7h5lhlji71i1i23h0ljl1h14688h7g13987h548h33k34hi6h2i63h424jhl1kik26kl3h60662846j6j0749l8kh95018kl1971j5j5gjk9hg70542391j77hjj65l127627h6h8h0hi003i2hih6h0k9k878lj858k30iljgik0l9248jk25l4h701l6gllhkhi54g24g926jgj884266514056805k2h15hh442i3170ilik20h88i561k0682k04459i154i03ikglg6220i4jii1g32067il925g450k0i1241l3il2jjl6k186gjj53h611il59k650i4kjhi87i798hg6h01g306ig104145ig9h68i092ghhh59jig99j12383792452h44206glk62g67gj204hk874l5li8646g65i9085244i092g70ig9h8657kg0413466ii87k9i32hglh24hi2li7174735i520ik608ilg71292838j5k1h39271ghg5288g930lg6h75626l71h8h5g011k9l9lgk691i04166h7996g452kij4l4l72881k6kl5701jl707hi415j8h3k67576966g2k94k03k0lj31995h2j26hi69jhjji162625l50j7790093hli0jjkh1ll804i3lhh40lk4k240kh48k0k16l544hg033k594gh0l93682l86h35i1i36klhgjg90lkl54746i2k63481h37hilj3ikig52h0j80k5gj6h879lk6g8ll6k616966h59h42l24h824ljj77g6l03kg260i80h2g2k123251j22jg36k5j14781i6197929il9j03k16h4l1i78693g45k64j0jl0k58hj8493h76gj2202470ig12lh2llj2l5k5541k4h506i3hij81lg9i037jgk22i2l3j12j6l394h51ii2ll0022j292h8036767i835k47071jl9illl2gli06524g66984902j6j1h5g788019hl4712032977h41l0k36073ig880g2jgklh26k736180591639h4k2gjk9gl2071h685923kl5363l5lj0ll91901g12kk29hll4280h9h51870j721516j6g66i379g203932726h42g927h19733k237492l8j0jh148gl95048l5524j4j0l2445130153i802169102i14g586h8g64j2lk28492169li3292877837108k7i9557h3jk31il2lklg494lgl4j91jig614216ki68i2j140l1jg03lk16lljg039h21kj313h8jk79h99j2g89j327i7h9052h9hj71721jg927340956k6jl4i7k0430"
|
||||
},
|
||||
{
|
||||
"key": "zhiqiu",
|
||||
"name": "🥇|聽風|高清◎挑線路",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api": "csp_zhiqiu",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"ext": "http://www.小不点.com/api//2026/zhiqiu.php"
|
||||
},
|
||||
{
|
||||
"key" : "顾我99",
|
||||
"name": "🥇|故我丨普畫◎普速",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api" : "csp_App99",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : {
|
||||
"host": "http://117.50.200.113:19987/app/bn",
|
||||
"LoginPath": "/app/log",
|
||||
"appkey": "040f9b1bc5e942569b5c3e63943306ab",
|
||||
"versionName": "4.3.1",
|
||||
"name": "顾我追剧",
|
||||
"package": "com.guwozhuijux.app",
|
||||
"buildNumber": "2001",
|
||||
"buildSignature": "5AD4436C4730FFE26910C86278B80F3E661C317FFC3616F702D20A729262624A"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Wwys",
|
||||
"name": "🥇|糯米|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wwys",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": "https://vip.wwgz.cn:5200"
|
||||
},
|
||||
{
|
||||
"key" : "农民影视",
|
||||
"name": "🥇|農民|無廣",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"api" : "csp_Wwys",
|
||||
"jar" : "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext" : "https://vip.wwgz.cn:5200"
|
||||
},
|
||||
{
|
||||
"key": "星空2",
|
||||
"name": "🥇|櫻花|藍光◎無廣",
|
||||
"type": 3,
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"api": "csp_AppGet",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext": {
|
||||
"url" : "https://cms140.yhg.one/",
|
||||
"dataKey": "bM7iC9eA3oZ1nB7z",
|
||||
"dataIv" : "bM7iC9eA3oZ1nB7z"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "4kmx",
|
||||
"name" : "🥇|木兮|藍光◎無廣",
|
||||
"type" : 3,
|
||||
"api" : "http://itv666.cc/pyplugin/木兮.py",
|
||||
"searchable" : 1,
|
||||
"changeable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "py_mv4r4",
|
||||
"name" : "🥇|有兮|高清",
|
||||
"type" : 3,
|
||||
"api" : "./py/1.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 0
|
||||
},
|
||||
{
|
||||
"key" : "bilimd",
|
||||
"name" : "🎖︎|bilbil|官源",
|
||||
"type" : 3,
|
||||
"api" : "csp_Bilimd",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"style" : {"type": "rect", "ratio": 1.433},
|
||||
"ext" : {
|
||||
"cookie": "http://127.0.0.1:9978/file/tvbox/bili_cookie.txt"
|
||||
},
|
||||
"timeout" : 10
|
||||
},
|
||||
{
|
||||
"key" : "bili",
|
||||
"name" : "🎖︎|bilbil合集|",
|
||||
"type" : 3,
|
||||
"api" : "csp_Bili",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"style" : {"type": "rect", "ratio": 1.433},
|
||||
"ext" : {
|
||||
"cookie": "http://127.0.0.1:9978/file/tvbox/bili_cookie.txt",
|
||||
"json" : "./json/哔哩合集.json"
|
||||
},
|
||||
"timeout" : 20
|
||||
},
|
||||
{
|
||||
"key" : "py_愛電影.py",
|
||||
"name" : "🥇|金牌系列-愛電影",
|
||||
"type" : 3,
|
||||
"api" : "./py/又是一個金牌.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {"site": "https://www.gs4x7nq4.com"}
|
||||
},
|
||||
{
|
||||
"key" : "py_文才",
|
||||
"name" : "🥇|金牌系列-界界",
|
||||
"type" : 3,
|
||||
"api" : "./py/又是一個金牌.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"site": "https://www.hkybqufgh.com,https://www.sizhengxt.com,https://0996zp.com,https://9zhoukj.com/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "wencai",
|
||||
"name": "🥇|金牌系列-文才",
|
||||
"type": 3,
|
||||
"api": "csp_WenCai",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"ext": "https://www.tjrongze.com,https://y2s52n7.com,https://m.hkybqufgh.com,https://m.sizhengxt.com,https://m.9zhoukj.com,https://m.jiabaide.cn"
|
||||
},
|
||||
{
|
||||
"key" : "py_zjuys.py",
|
||||
"name" : "🥇|金牌系列-zjuys",
|
||||
"type" : 3,
|
||||
"api" : "./py/又是一個金牌.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {"site": "https://zjuys.com/"}
|
||||
},
|
||||
{
|
||||
"key" : "py_jiabaide",
|
||||
"name" : "🥇|金牌系列-jiabaide",
|
||||
"type" : 3,
|
||||
"api" : "./py/又是一個金牌.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {"site": "https://www.jiabaide.cn"}
|
||||
},
|
||||
{
|
||||
"key" : "py_cqzuoer",
|
||||
"name" : "🥇|金牌系列-cqzuoer",
|
||||
"type" : 3,
|
||||
"api" : "./py/又是一個金牌.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {"site": "https://cqzuoer.com"}
|
||||
},
|
||||
{
|
||||
"key" : "py_xiong_di_ying_shi",
|
||||
"name" : "🥇|兄弟",
|
||||
"type" : 3,
|
||||
"api" : "./py/兄弟影视.min.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 0,
|
||||
"changeable" : 0
|
||||
},
|
||||
{
|
||||
"key" : "csp_看片狂人",
|
||||
"name" : "🥇|狂人|藍光(超多線路)",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"免嗅": "1",
|
||||
"线路数组": "class=\"fed-drop-btns fed-padding&&</li>",
|
||||
"线路标题": "data-linename=\"&&\"[不包含:腾讯视频-VIP解析#芒果-VIP解析#超清FM线#超清STP线#超清VH线#超清RP线#超清SW线#超清UP线#超清ST线]",
|
||||
"搜索url": "https://www.kpkuang.fun/vodsearch/-------------.html?wd={wd}",
|
||||
"分类url": "https://www.kpkuang.fun/vodshow/{cateId}-{area}-time------{catePg}---{year}--.html",
|
||||
"分类": "电影$1#连续劇$2#综艺$3#动漫$4",
|
||||
"地区": "中国大陆&香港&台湾&日本&韩国&泰国&美国&英国&德国&法国||中国大陆&韩国&香港&台湾&日本&美国&泰国&英国&新加坡&其他||香港&台湾&韩国&中国大陆&英国&美国&日本&加拿大&泰国&其它||日本&大陆&中国大陆&中国&美国&台湾&韩国&法国&英国&加拿大"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "csp_Wwys",
|
||||
"name": "🥇|农民|高清",
|
||||
"type": 3,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_XYQHiker",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"ext": "./json/农民影视.json"
|
||||
},
|
||||
{
|
||||
"key" : "csp_If101",
|
||||
"name" : "️🥇|歐視|高清",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"简介": "content_desc context clearfix\">&&</span>",
|
||||
"分类url": "https://www.olehdtv.com/index.php/vod/show/area/{area}/by/{by}/id/{cateId}/page/{catePg}/year/{year}.html",
|
||||
"分类": "電影$1#電視劇$2#綜藝$3#動漫$4",
|
||||
"地区": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "csp_歐樂影院ORG",
|
||||
"name" : "🥇|歐吉|高清",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"简介": "content_desc context clearfix\">&&</span>",
|
||||
"分类url": "https://www.oulevod.org/index.php/vod/show/area/{area}/by/{by}/id/{cateId}/page/{catePg}/year/{year}.html",
|
||||
"分类": "電視劇$2#電影$1#動漫$4#綜藝$3#短劇$53",
|
||||
"地区": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "csp_YLSP",
|
||||
"name" : "🥇|永樂|高清",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"线路数组": "data-dropdown-value=&&</div>",
|
||||
"线路标题": "<span>&&</span>[不包含:全球1线]",
|
||||
"简介": "video-info-item video-info-content vod_content\">&&</span>",
|
||||
"分类url": "https://ylsp.tv/vodshow/{cateId}-{area}-{by}------{cateIPg}---{year}/",
|
||||
"分类": "電影$1#電視劇$2#綜藝$3#動漫$4",
|
||||
"地区": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||内地&港台&日韩&欧美||国产&日本&欧美&其他"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "永乐影视",
|
||||
"name": "🥇|永乐|高清",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"ext" : {
|
||||
"请求头": "User-Agent$MOBILE_UA",
|
||||
"编码": "UTF-8",
|
||||
"分类url": "https://www.ylys.tv/vodshow/{cateId}-{area}-{by}-{class}-{lang}-{letter}---{catePg}---{year}.html",
|
||||
"分类": "电影$1#电视劇$2#综艺$3#动漫$4",
|
||||
"类型": "动作片$6#喜劇片$7#爱情片$8#科幻片$9#奇幻片$10#恐怖片$11#劇情片$12#战争片$20#动画片$26#悬疑片$22#冒险片$23#犯罪片$24#惊悚片$45#歌舞片$46#灾难片$47#网络片$48||国产劇$13#港台劇$14#日劇$15#韩劇$33#欧美劇$16#泰劇$34#新马劇$35#其他劇$25||内地综艺$27#港台综艺$28#日本综艺$29#韩国综艺$36#欧美综艺$30#新马泰综艺$37#其他综艺$38||国产动漫$31#日本动漫$32#韩国动漫$39#港台动漫$40#新马泰动漫$41#欧美动漫$42#其他动漫$43"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "影视天堂",
|
||||
"name": "🥇|影天|高清",
|
||||
"type": 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"ext" : {
|
||||
"数组": "<a class=\"video-card\"&&</a>[不包含:伦理#情色]",
|
||||
"标题": "title=\"&&\"",
|
||||
"图片": "data-src=\"&&\"",
|
||||
"副标题": "text-white\">&&</span>",
|
||||
"链接": "href=\"&&\"",
|
||||
"导演": "导演:&&</div>",
|
||||
"主演": "主演:&&</div>",
|
||||
"状态": "更新:&&</div>",
|
||||
"集数": "集数:&&</div>",
|
||||
"TAG": "TAG:&&</div>",
|
||||
"简介": "劇情:&&</div>",
|
||||
"线路数组": "<h4&&h4>",
|
||||
"线路标题": ">&&</",
|
||||
"播放数组": " <ul class=\"flex items-center md:&&</ul>",
|
||||
"播放标题": ">&&</",
|
||||
"播放列表": "<a&&a>",
|
||||
"播放链接": "href=\"&&\"",
|
||||
"搜索模式": "1",
|
||||
"搜索url": "https://ysttv.com/search/index/type/1/keyword/{wd}",
|
||||
"分类url": "https://ysttv.com/library/index/c/{cateId}/t/all/y/{year}/all/s/1/page/{catePg}",
|
||||
"分类": "电影$1#电视劇$2#综艺$3#动漫$4#短劇$5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Guazi",
|
||||
"name": "🥇|瓜子|高清",
|
||||
"type": 3,
|
||||
"api": "csp_GuaziAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"sites": "",
|
||||
"filters": "https://file.icve.com.cn/file_doc/822/528/CD984013F5776F759DFC815995F87BFB.aowu"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "py_缘梦_APP",
|
||||
"name" : "📱|緣夢|APP",
|
||||
"type" : 3,
|
||||
"api" : "./py/app/getapp.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"host" : "https://www.zipfve.cn",
|
||||
"api" : "/api.php/getappapi",
|
||||
"datakey": "1234567890987654",
|
||||
"dataiv" : "1234567890987654"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "py_哇哇APP",
|
||||
"name" : "📱|哇哇|APP",
|
||||
"type" : 3,
|
||||
"api" : "./py/哇哇APP.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 0,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "py_数字_APP",
|
||||
"name" : "📱|数字|APP",
|
||||
"type" : 3,
|
||||
"api" : "./py/app/getapp.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"host" : "http://app1-0-0.87333.cc",
|
||||
"api" : "/api.php/getappapi",
|
||||
"datakey": "VwsHxkCViDXEExWa",
|
||||
"dataiv" : "VwsHxkCViDXEExWa"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "py_八天_APP",
|
||||
"name" : "📱|八天|APP",
|
||||
"type" : 3,
|
||||
"api" : "./py/app/getapp.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"host" : "https://dy.8ttv.cn",
|
||||
"api" : "/api.php/getappapi",
|
||||
"datakey": "1111111111111111",
|
||||
"dataiv" : "1111111111111111"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "hgdj",
|
||||
"name": "📺|红果短劇",
|
||||
"type": 3,
|
||||
"api": "./py/红果短剧.py"
|
||||
},
|
||||
{
|
||||
"key": "星芽短剧",
|
||||
"name": "📺|星芽短劇",
|
||||
"type": 3,
|
||||
"api": "https://git.yylx.win/raw.githubusercontent.com/PizazzGY/NewTVBox/main/movie/py/XYDJ.py",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key" : "HHkk",
|
||||
"name" : "📺|好看短剧",
|
||||
"type" : 3,
|
||||
"api" : "csp_HHkkAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"genre" : "shortdrama"
|
||||
},
|
||||
{
|
||||
"key" : "Hema",
|
||||
"name" : "📺|盒马短剧",
|
||||
"type" : 3,
|
||||
"api" : "csp_HemaAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"genre" : "shortdrama"
|
||||
},
|
||||
{
|
||||
"key" : "Bddj",
|
||||
"name" : "📺|拜拜短剧",
|
||||
"type" : 3,
|
||||
"api" : "csp_BddjAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"genre" : "shortdrama"
|
||||
},
|
||||
{
|
||||
"key" : "Wgdj",
|
||||
"name" : "📺|圍觀短剧",
|
||||
"type" : 3,
|
||||
"api" : "csp_WgdjAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"genre" : "shortdrama"
|
||||
},
|
||||
{
|
||||
"key" : "Qmdj",
|
||||
"name" : "📺|喵喵短剧",
|
||||
"type" : 3,
|
||||
"api" : "csp_QmdjAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"genre" : "shortdrama"
|
||||
},
|
||||
{
|
||||
"key" : "Xydj",
|
||||
"name" : "📺|星星短剧",
|
||||
"type" : 3,
|
||||
"api" : "csp_XydjAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"genre" : "shortdrama"
|
||||
},
|
||||
{
|
||||
"key" : "bilitingshu",
|
||||
"name" : "🎖︎|bili聽書趣",
|
||||
"type" : 3,
|
||||
"api" : "csp_Bili",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"ext" : {
|
||||
"json": "./json/bili听书.json",
|
||||
"cookie": "SESSDATA=819d93e8%2C1764426658%2C4ec10%2A61CjA74Z7n0isRlTABldomYIMAwyRBPDvLaJl9ERae-vTzTalKiYoDX6Qu9J0E5fof-h0SVlJfUUE0T1RLaExUQWloSUNBNG9ROEZQazBJX3FDX0VkWUFZQ0t2LXFtbnJmdUI1eEkwUnVJVl96Nk1sZTBDeFYtTkxVUjc5MjZsVjFWSENjR0hnZUVBIIEC;bili_jct=b655010f87e4dcb20ea46a191d23a443;DedeUserID=3546382984022310;DedeUserID__ckMd5=9728526c8c2ad2a5;sid=51az4mji"
|
||||
},
|
||||
"style" : {"type": "rect", "ratio": 1.333}
|
||||
},
|
||||
{
|
||||
"key" : "bilimanhua",
|
||||
"name" : "🎖︎|bili漫畫屋",
|
||||
"type" : 3,
|
||||
"api" : "csp_Bili",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"ext" : {
|
||||
"json": "./json/bili漫画.json",
|
||||
"cookie": "SESSDATA=819d93e8%2C1764426658%2C4ec10%2A61CjA74Z7n0isRlTABldomYIMAwyRBPDvLaJl9ERae-vTzTalKiYoDX6Qu9J0E5fof-h0SVlJfUUE0T1RLaExUQWloSUNBNG9ROEZQazBJX3FDX0VkWUFZQ0t2LXFtbnJmdUI1eEkwUnVJVl96Nk1sZTBDeFYtTkxVUjc5MjZsVjFWSENjR0hnZUVBIIEC;bili_jct=b655010f87e4dcb20ea46a191d23a443;DedeUserID=3546382984022310;DedeUserID__ckMd5=9728526c8c2ad2a5;sid=51az4mji"
|
||||
},
|
||||
"style" : {"type": "rect", "ratio": 1.333}
|
||||
},
|
||||
{
|
||||
"key" : "biligequ",
|
||||
"name" : "🎖︎|bili靜聽歌",
|
||||
"type" : 3,
|
||||
"api" : "csp_Bili",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable": 1,
|
||||
"ext" : {
|
||||
"json": "./json/bili歌曲.json",
|
||||
"cookie": "SESSDATA=819d93e8%2C1764426658%2C4ec10%2A61CjA74Z7n0isRlTABldomYIMAwyRBPDvLaJl9ERae-vTzTalKiYoDX6Qu9J0E5fof-h0SVlJfUUE0T1RLaExUQWloSUNBNG9ROEZQazBJX3FDX0VkWUFZQ0t2LXFtbnJmdUI1eEkwUnVJVl96Nk1sZTBDeFYtTkxVUjc5MjZsVjFWSENjR0hnZUVBIIEC;bili_jct=b655010f87e4dcb20ea46a191d23a443;DedeUserID=3546382984022310;DedeUserID__ckMd5=9728526c8c2ad2a5;sid=51az4mji"
|
||||
},
|
||||
"style" : {"type": "rect", "ratio": 1.333}
|
||||
},
|
||||
{
|
||||
"key" : "py_bi星河影视ili",
|
||||
"name" : "🎖︎|bili看電影",
|
||||
"type" : 3,
|
||||
"api" : "./py/哔哩.py",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key" : "tufun采集",
|
||||
"name" : "🧲|菠菜|高清",
|
||||
"type" : 1,
|
||||
"api" : "https://tyyszyapi.com/api.php/provide/vod/?ac=list",
|
||||
"playerType": 2,
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_蜜雪",
|
||||
"name" : "🧲|夢想網頁版|嚴禁外流",
|
||||
"type" : 0,
|
||||
"api" : "http://www.mixuetv.top/api.php/provide/vod/at/xml",
|
||||
"categories" : [
|
||||
"国产剧", "台灣剧", "日本剧", "美国剧", "短剧", "大陆综艺", "日韩综艺", "港台综艺",
|
||||
"欧美综艺", "国产动漫", "日韓动漫", "欧美动漫", "奈飞电视剧", "奈飞电影", "動作片", "韓國劇",
|
||||
"海外劇", "港劇", "恐怖片", "科幻片", "劇情片", "戰爭片", "愛情片"
|
||||
],
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "采集集合",
|
||||
"name": "🧲|采集集合|PHP",
|
||||
"type": 4,
|
||||
"api": "http://zhangqun1818.serv00.net/cj/cjjh.php",
|
||||
"jar": "./jar/pro.jar",
|
||||
"searchable": 1,
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.33
|
||||
},
|
||||
"ext": "0",
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_360",
|
||||
"name" : "🧲|360|高清",
|
||||
"type" : 1,
|
||||
"api" : "https://360zy.com/api.php/provide/vod",
|
||||
"categories": [
|
||||
"国产劇", "短片", "动画片", "香港劇", "韩国劇", "欧美劇", "动作片", "喜劇片", "爱情片",
|
||||
"科幻片", "恐怖片", "劇情片", "战争片", "NBA", "惊悚片", "家庭篇", "古装片", "历史片",
|
||||
"悬疑片", "犯罪片", "纪录片", "台湾劇", "大陆综艺", "国产动漫", "日韩动漫", "西部片"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "vod_优质",
|
||||
"name" : "🧲|優質|高清",
|
||||
"type" : 1,
|
||||
"api" : "https://api.1080zyku.com/inc/api_mac10.php",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_天涯",
|
||||
"name" : "🧲|天涯|高清◎順播",
|
||||
"type" : 1,
|
||||
"api" : "https://tyyszyapi.com/api.php/provide/vod/?ac=list",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_豆瓣",
|
||||
"name" : "🧲|豆瓣|高清◎順播(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://caiji.dbzy5.com/api.php/provide/vod/at/josn/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"key": "Ikanbot",
|
||||
"name": "🧲|愛看機器人",
|
||||
"type": 3,
|
||||
"api": "csp_Ikanbot",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||
},
|
||||
{
|
||||
"key" : "vod_四个圈影视",
|
||||
"name" : "🧲|四圈|高清(滿版廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://pg.fenwe078.cf/api.php/provide/vod/",
|
||||
"quickSearch": 1,
|
||||
"searchable" : 1,
|
||||
"changeable" : 1,
|
||||
"categories" : [
|
||||
"电影", "连续劇", "国产劇", "韩国劇", "台湾劇", "日本劇", "美国劇", "港台劇", "日韩劇",
|
||||
"综艺", "国产动漫", "日韩动漫", "短劇"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "vod_极速",
|
||||
"name" : "🧲|極速|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://jszyapi.com/api.php/provide/vod/at/json",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"categories" : [
|
||||
"内地劇", "欧美劇", "日劇", "韩劇", "台湾劇", "香港劇", "马泰劇", "悬疑片", "喜劇片",
|
||||
"动作片", "爱情片", "科幻片", "恐怖片", "劇情片", "战争片", "犯罪片", "记录片", "动画片",
|
||||
"日本动漫", "欧美动漫", "中国动漫", "大陆综艺", "日韩综艺", "港台综艺", "欧美综艺", "体育赛事"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "vod_豪华",
|
||||
"name" : "🧲|豪華|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://hhzyapi.com/api.php/provide/vod/?ac=list",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"categories" : [
|
||||
"动作片", "喜劇片", "爱情片", "科幻片", "恐怖片", "劇情片", "战争片", "悬疑片", "犯罪片",
|
||||
"奇幻片", "记录片", "动画片", "内地劇", "香港劇", "台湾劇", "日劇", "韩劇", "欧美劇",
|
||||
"马泰劇", "大陆综艺", "港台综艺", "日韩综艺", "欧美综艺", "中国动漫", "日本动漫", "欧美动漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "vod_金鹰",
|
||||
"name" : "🧲|金鹰|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://jyzyapi.com/api.php/provide/vod/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_飘零",
|
||||
"name" : "🧲|飘零|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://p2100.net/api.php/provide/vod/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"categories" : [
|
||||
"电影", "连续劇", "综艺", "动漫", "动作片", "电影", "喜劇片", "爱情片", "科幻片",
|
||||
"恐怖片", "劇情片", "战争片", "国产劇", "香港劇", "台湾劇", "日本劇", "韩国劇", "欧美劇",
|
||||
"海外劇", "纪录片", "动漫电影", "邵氏大片"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "天翼影视",
|
||||
"name" : "🧲|天翼|普清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "http://7.qqqtv.top/api.php/provide/vod/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"categories" : ["推荐", "电影", "电视劇", "综艺", "动漫"]
|
||||
},
|
||||
{
|
||||
"key" : "vod_虎牙",
|
||||
"name" : "🧲|虎牙|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://www.huyaapi.com/api.php/provide/vod/at/",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_魔都",
|
||||
"name" : "🧲|魔都|高清(浮水印廣告+成人動畫)",
|
||||
"type" : 1,
|
||||
"api" : "https://www.moduzy.com/api.php/provide/vod/?ac=list",
|
||||
"searchable" : 1,
|
||||
"changeable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "非凡采集资源",
|
||||
"name" : "🧲|非凡|高清◎速播(賭城廣告+成人)",
|
||||
"type" : 1,
|
||||
"api" : "http://api.ffzyapi.com/api.php/provide/vod/",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "量子采集资源",
|
||||
"name" : "🧲|量子|高清(賭城廣告+成人)",
|
||||
"type" : 1,
|
||||
"api" : "https://cj.lziapi.com/api.php/provide/vod/at/json/",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "无忧采集资源",
|
||||
"name" : "🧲|无忧|高清(賭城廣告+成人)",
|
||||
"type" : 1,
|
||||
"api" : "https://www.wyvod.com/api.php/provide/vod/",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "如意采集资源",
|
||||
"name" : "🧲|如意|高清(賭城廣告+成人)",
|
||||
"type" : 1,
|
||||
"api" : "https://cj.rycjapi.com/api.php/provide/vod/at/json/",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "魔抓采集资源",
|
||||
"name" : "🧲|魔抓|高清◎慢播(賭城廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://mozhuazy.com/api.php/provide/vod/",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_艾旦",
|
||||
"name" : "🧲|艾旦|高清(浮水印廣告+圖壞)",
|
||||
"type" : 1,
|
||||
"api" : "https://lovedan.net/api.php/provide/vod/",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"categories" : [
|
||||
"动作片", "喜劇片", "爱情片", "科幻片", "恐怖片", "犯罪片", "战争片", "劇情片", "动画电影",
|
||||
"国产劇", "港台劇", "日韩劇", "欧美劇", "海外劇", "网红主播", "日韩综艺", "港台综艺", "欧美综艺",
|
||||
"大陆综艺", "国产动漫", "日韩动漫", "欧美动漫", "海外动漫", "海外抖音", "影视解说", "直播"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "vod_索尼",
|
||||
"name" : "🧲|索尼|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://suoniapi.com/api.php/provide/vod/?ac=list",
|
||||
"searchable" : 1,
|
||||
"changeable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"categories" : [
|
||||
"动作片", "喜劇片", "爱情片", "科幻片", "恐怖片", "劇情片", "战争片", "悬疑片", "犯罪片",
|
||||
"冒险片", "动画片", "惊悚片", "奇幻片", "国产劇", "欧美劇", "韩劇", "日劇", "港劇",
|
||||
"台劇", "泰劇", "大陆综艺", "日韩综艺", "港台综艺", "欧美综艺", "国产动漫", "日韩动漫", "欧美动漫",
|
||||
"动画片", "港台动漫", "海外动漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "vod_無盡",
|
||||
"name" : "🧲|無盡|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://api.wujinapi.me/api.php/provide/vod/?ac=list",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"categories" : [
|
||||
"动作片", "动画片", "喜劇片", "爱情片", "科幻片", "恐怖片", "劇情片", "战争片", "悬疑片",
|
||||
"犯罪片", "奇幻片", "邵氏电影", "纪录片", "短劇", "国产劇", "香港劇", "台湾劇", "日本劇",
|
||||
"韩国劇", "美国劇", "泰劇", "海外劇", "大陆综艺", "港台综艺", "日韩综艺", "欧美综艺", "国产动漫",
|
||||
"日韩动漫", "欧美动漫", "影视解说", "体育赛事"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "vod_优酷",
|
||||
"name" : "🧲|優酷|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://api.ukuapi.com/api.php/provide/vod/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_順播",
|
||||
"name" : "🧲|順播|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://subocaiji.com/api.php/provide/vod/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1
|
||||
},
|
||||
{
|
||||
"key" : "vod_红牛",
|
||||
"name" : "🧲|红牛|高清(浮水印廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://www.hongniuzy2.com/api.php/provide/vod/",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1
|
||||
},
|
||||
{
|
||||
"key": "drpyS_枫林影视",
|
||||
"name": "🧲|楓林|高清(浮水印廣告)",
|
||||
"type": 4,
|
||||
"api": "http://192.129.140.23:5757/api/枫林影视?pwd=dzyyds",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "vod_光速",
|
||||
"name": "🧲|光速|高清◎慢播(浮水印廣告)",
|
||||
"type": 1,
|
||||
"api": "https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/?ac=list",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"categories": [
|
||||
"动作片", "爱情片", "科幻片", "战争片", "劇情片", "恐怖片", "喜劇片", "大陆劇", "港澳劇",
|
||||
"台湾劇", "欧美劇", "动漫电影", "韩劇", "日劇", "泰劇"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "如意",
|
||||
"name" : "🧲|如意|高清(各種廣告)",
|
||||
"type" : 1,
|
||||
"api" : "https://cj.rycjapi.com/api.php/provide/vod",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1,
|
||||
"filterable" : 1,
|
||||
"timeout" : 10,
|
||||
"categories" : [
|
||||
"国产剧", "香港剧", "韩国剧", "欧美剧", "记录片", "台湾剧", "日本剧", "海外剧", "泰国剧",
|
||||
"动作片", "喜剧片", "爱情片", "科幻片", "恐怖片", "剧情片", "战争片", "大陆综艺", "港台综艺",
|
||||
"日韩综艺", "欧美综艺", "国产动漫", "日韩动漫", "欧美动漫", "港台动漫", "海外动漫", "体育", "足球",
|
||||
"篮球", "网球", "斯诺克", "预告片", "短剧", "动画电影"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key" : "py_西瓜卡通",
|
||||
"name" : "🎡|西瓜",
|
||||
"type" : 3,
|
||||
"api" : "./py/西瓜卡通.py",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"name" : "🎡|番薯",
|
||||
"key" : "FanShu",
|
||||
"type" : 3,
|
||||
"api" : "csp_FanShuAmns",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0
|
||||
},
|
||||
{
|
||||
"key" : "Dm84",
|
||||
"name" : "🎡|巴士",
|
||||
"type" : 3,
|
||||
"api" : "csp_Dm84Guard",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"timeout" : 10,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 1
|
||||
},
|
||||
{
|
||||
"key": "AowuDmAw",
|
||||
"name": "🎡|嗷嗚",
|
||||
"type": 3,
|
||||
"api": "csp_AowuDmAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "563357143fce50cabe524135fd3fb26e4af09034942cb186addd2322edf17ab6c9b78627645980399087f30260707c8613b0ad40dab539ddb35d7ac9f78fcf015b7e10bc9ca2f37e127890269cdd3efdfa6ce6789494fdc5352c9e544f3b048a43885af6fb083f8545f6bfa3d33291ea4210bb397b004f1b5c2660408febda99840eec91efa7142878bb1e553ad0872a0851f903d7748b0bdee1ad7975b8f4c4838fda079f1bdebb0ab77f51da3dfa8eb30ca3c0bf56e584abfd70e025a03aeff2bca60aa9075588a4953a1b7fef021b"
|
||||
},
|
||||
{
|
||||
"key": "AowuDmFc",
|
||||
"name": "🎡|番茶",
|
||||
"type": 3,
|
||||
"api": "csp_AowuDmAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "a2a157143fce50cabe524135fd3fb26e4af09034942cb186addd2360d64a7fb5c9b7ddaede42dd983c638ddd5064f276cfa6afb8c43429de354b19c59f234352d43c095b60cf88bba8346f1b792fdc917ed229f084939e631faf8eed7cc1d53bdfd143be9e1c38ef8228663806c2e74f046ea6dae90f06581eafc6b6a4ee34ae6ac583ae5beb6bc49e710536a49f66feb74afc1950841752c37975c85f1b60cc0408b4f3b4c80e2b187fe843378e7ebfbfcd128e48a2195bfc5d1104cfc58ed98ccf5c17428aafdce4d3b14ada75f28c5c2f8856"
|
||||
},
|
||||
{
|
||||
"key": "AowuDmMw",
|
||||
"name": "🎡|喵物",
|
||||
"type": 3,
|
||||
"api": "csp_AowuDmAmns",
|
||||
"jar": "./jar/aowu-0713.jar;md5;dd6fbafde59756e7f5043a20c74b1961",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "db8b57143fce50cabe524135fd3fb26e4af09034942cb186addd2322edf17ab6c9b7862764598039301c43cf706efcd55499494d72c680001c30550747b3dc5994760e3d6e17208e5ed771b2b4162f65e72b3e530fdd9622474e1c5f8aecda41dcd17901c7ddc61193a63fd8aaa1a96dc8673f93a8116755fd04bb1baaa93215334aaa1327972f2dd7292eb3d593e60cad0b9a3dde2a1158640cfc93dac5af45ddd8f971e3be0ccb5c776752b9b92a7f67dc89375d7ad442bddb0c661554a03c420029010a932d2dd8e65d6dc5"
|
||||
},
|
||||
{
|
||||
"key": "MiFun",
|
||||
"name": "🎡|MiFun",
|
||||
"type": 3,
|
||||
"api": "./py/MiFun动漫.py"
|
||||
},
|
||||
{
|
||||
"key" : "py_方舟_APP",
|
||||
"name" : "🎡|方舟",
|
||||
"type" : 3,
|
||||
"api" : "./py/app/getapp.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"host" : "https://www.cyfz.vip",
|
||||
"api" : "/api.php/getappapi",
|
||||
"datakey": "e72cdfd629e8895d",
|
||||
"dataiv" : "e72cdfd629e8895d"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "py_元咲_APP",
|
||||
"name" : "🎡|元纓",
|
||||
"type" : 3,
|
||||
"api" : "./py/app/getapp.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"host" : "http://cic.aicg.fun",
|
||||
"api" : "/api.php/getappapi",
|
||||
"datakey": "2c4h36abd96se10u",
|
||||
"dataiv" : "2c4h36abd96se10u"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "py_曼波_APP",
|
||||
"name" : "🎡|曼波",
|
||||
"type" : 3,
|
||||
"api" : "./py/app/getapp.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"host" : "https://app.omofun1.top",
|
||||
"api" : "/api.php/getappapi",
|
||||
"datakey": "66dc309cbeeca454",
|
||||
"dataiv" : "66dc309cbeeca454"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "py_咕咕_APP",
|
||||
"name" : "🎡|咕咕",
|
||||
"type" : 3,
|
||||
"api" : "./py/app/getapp.py",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"host" : "https://www.gugu3.com",
|
||||
"api" : "/api.php/getappapi",
|
||||
"datakey": "nKfZ8KX6JTNWRzTD",
|
||||
"dataiv" : "nKfZ8KX6JTNWRzTD"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "csp_動漫巴士",
|
||||
"name" : "🎡|動漫巴士",
|
||||
"type" : 3,
|
||||
"api" : "csp_XYQHiker",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : "./json/動漫巴士.json"
|
||||
},
|
||||
{
|
||||
"key" : "巴士动漫",
|
||||
"name": "🎡|巴士动漫",
|
||||
"type": 3,
|
||||
"api" : "csp_XYQHiker",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"ext" : "./json/巴士动漫.json"
|
||||
},
|
||||
{
|
||||
"key" : "csp_天天動漫",
|
||||
"name" : "🎡|天天動漫",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"请求头": "User-Agent$MOBILE_UA",
|
||||
"编码": "UTF-8",
|
||||
"线路二次截取": "class=\"module-tab-items-box&&lass=\"swiper[替换:</div>>></a>]",
|
||||
"线路数组": "class=\"module-tab-item tab-item&&</a>",
|
||||
"线路标题": "<span>&&</span>",
|
||||
"跳转播放链接": "var player_*\"url\":\"&&\"",
|
||||
"主页url": "https://www.ttdm.me/vod-type/1/",
|
||||
"分类url": "https://www.ttdm.me/vod-show/{cateId}--{by}-{class}-----{catePg}---/",
|
||||
"分类": " 中国动漫$1#日本动漫$2#欧美动漫$3#其他动漫$4#动画电影$5",
|
||||
"劇情": "玄幻&科幻&武侠&冒险&战斗&搞笑&恋爱&魔幻&竞技&热血&治愈&励志&机战&奇幻&悬疑&日常&校园&真人&推理&历史&经典&美食&偶像"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "csp_桵空",
|
||||
"name" : "🎡|桵空动漫",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"分类url": "https://www.maigo.cc/vodshow/{cateId}---{class}-----{catePg}---{year}/",
|
||||
"分类": "电影$84#综艺$91#大陆劇$81#港台劇$82#海外劇$83#纪录片$88#动漫$1#日劇$32#日漫$46#国漫$47#美漫$85"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "櫻花動漫2",
|
||||
"name" : "🎡|櫻花动漫",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"分类url": "https://www.857kan.com/show/{cateId}--------{catePg}---{year}.html",
|
||||
"分类": "動漫電影$4#日本動漫$1#大陸動漫$3#歐美動漫$6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "魔都",
|
||||
"name" : "🎡|魔都动漫",
|
||||
"type" : 0,
|
||||
"api" : "https://caiji.moduapi.cc/api.php/provide/vod/at/xml/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": ["国产动漫", "日韩动漫", "欧美动漫", "港台动漫", "动漫电影", "里番动漫"]
|
||||
},
|
||||
{
|
||||
"key" : "魔都资源",
|
||||
"name" : "🎡|魔資动漫",
|
||||
"type" : 1,
|
||||
"api" : "https://caiji.moduapi.cc/api.php/provide/vod",
|
||||
"jar" : "./jar/panda1123.jar;md5;d9004aa2e16f60b04baed361713fb710",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "csp_AG動漫",
|
||||
"name" : "🎡|AG動漫",
|
||||
"type" : 3,
|
||||
"api" : "csp_XBPQ",
|
||||
"jar" : "./jar/xyqxbpq.jar;md5;fd3cefc7302f3a39a442682f802b11e5",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : {
|
||||
"分类url": "https://agdm.tv/show/{cateId}/area/{area}/by/{by}/page/{catePg}/year/{year}.html",
|
||||
"分类": "日本动漫$6#国产动漫$7#欧美动漫$8#海外动漫$21#劇场版$9",
|
||||
"地区": "日本&大陆&美国"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "drpy_js_去看吧",
|
||||
"name" : "🎡|去看动漫",
|
||||
"type" : 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"api" : "./drpy_libs/drpy2.min.js",
|
||||
"ext" : "./drpy_js/去看吧.js"
|
||||
},
|
||||
{
|
||||
"key" : "好看动漫",
|
||||
"name" : "🎡|好看动漫",
|
||||
"type" : 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"api" : "./drpy_libs/drpy2.min.js",
|
||||
"ext" : "./drpy_js/HKDM.js"
|
||||
},
|
||||
{
|
||||
"key" : "drpy_js_爱弹幕",
|
||||
"name" : "🎡|爱动漫",
|
||||
"type" : 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"api" : "./drpy_libs/drpy2.min.js",
|
||||
"ext" : "./drpy_js/爱弹幕.js"
|
||||
},
|
||||
{
|
||||
"key" : "hipy_js_七色番[漫]",
|
||||
"name" : "🎡|七色番动漫",
|
||||
"type" : 3,
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"api" : "./drpy_libs/drpy2.min.js",
|
||||
"ext" : "./drpy_js/七色番[漫].js"
|
||||
},
|
||||
{
|
||||
"key" : "hipy_js_爱弹幕[漫]",
|
||||
"name" : "🎡|爱动漫",
|
||||
"type" : 3,
|
||||
"api" : "./drpy_libs/drpy2.min.js",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"filterable" : 1,
|
||||
"ext" : "./drpy_js/爱弹幕[漫].js"
|
||||
},
|
||||
{
|
||||
"key" : "异世界",
|
||||
"name" : "🎡|异世界动漫",
|
||||
"type" : 3,
|
||||
"api" : "./drpy_libs/drpy2.min.js",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"ext" : "./drpy_js/异世界.js"
|
||||
},
|
||||
{
|
||||
"key": "虎牙",
|
||||
"name": "📡|虎牙|Live",
|
||||
"type": 3,
|
||||
"api": "http://itv666.cc/星河传媒/py/网络直播.py",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "瓜子体育",
|
||||
"name": "⚽|瓜子|體育",
|
||||
"type": 3,
|
||||
"api": "csp_GuaziTY",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "咖啡",
|
||||
"name": "⚽|咖啡|體育",
|
||||
"type": 3,
|
||||
"api": "http://itv666.cc/星河传媒/py/kafei2.py",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "88看球",
|
||||
"name": "⚽|88|體育",
|
||||
"type": 4,
|
||||
"api": "http://itv666.cc/吼吼吼吼吼/bbkq.php",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"gridview": 3,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "TingShijie",
|
||||
"name": "🎧|聽世界|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingShijie",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"indexs": 0,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "TingYou",
|
||||
"name": "🎧|听友|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingYou",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"indexs": 0,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key" : "drpyS_听友[听]",
|
||||
"name" : "🎧|听友|有聲(道長)",
|
||||
"type" : 4,
|
||||
"api" : "http://149.118.133.251:5757/api/听友[听]",
|
||||
"searchable" : 2,
|
||||
"filterable" : 1,
|
||||
"quickSearch": 1,
|
||||
"title" : "听友[听]",
|
||||
"类型" : "听书",
|
||||
"lang" : "ds",
|
||||
"ext" : ""
|
||||
},
|
||||
{
|
||||
"key": "TingBook",
|
||||
"name": "📻|六月|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingBook",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"indexs": 0,
|
||||
"ext": "https://app.365ting.com",
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "TingBookJinXia",
|
||||
"name": "📻|堇夏|有声(魚)",
|
||||
"type": 3,
|
||||
"api": "csp_TingBookJinXia",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"indexs": 0,
|
||||
"ext": "https://m.ting15.com",
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Buguyy",
|
||||
"name": "🎧|布谷|音乐",
|
||||
"type": 3,
|
||||
"api": "csp_Buguyy",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "ChuXin",
|
||||
"name": "🎧|初心|音乐",
|
||||
"type": 3,
|
||||
"api": "csp_ChuXin",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "aiting",
|
||||
"name": "🎧|爱听|音乐",
|
||||
"type": 3,
|
||||
"api": "csp_AiTingMusic",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "Music24bit",
|
||||
"name": "🎧|无损|音乐",
|
||||
"type": 3,
|
||||
"api": "csp_Music24bit",
|
||||
"jar": "./jar/fish07100101.jar;md5;2842ac71d2d05492ed808c4ac9faa533",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key" : "KuGou-1",
|
||||
"name" : "🎧|酷狗音樂",
|
||||
"type" : 3,
|
||||
"api" : "csp_KuGouAmns",
|
||||
"jar": "./jar/river-fman.jar;md5;ca48f92eac069c85a17e4ccf381d5f0a",
|
||||
"searchable" : 1,
|
||||
"quickSearch": 1,
|
||||
"changeable" : 0,
|
||||
"genre" : "music"
|
||||
},
|
||||
{
|
||||
"key" : "网易云音乐",
|
||||
"name": "🎧|網易雲1",
|
||||
"type": 3,
|
||||
"api" : "https://xn--fjq53n.xyz/Ting/yinyue/网易云音乐.py"
|
||||
},
|
||||
{
|
||||
"key" : "网易云音乐1",
|
||||
"name": "🎧|網易雲2",
|
||||
"type": 3,
|
||||
"api" : "https://xn--fjq53n.xyz/Ting/yinyue/网易云音乐1.py"
|
||||
}
|
||||
],
|
||||
"parses": [
|
||||
{"name": "聚合1", "type": 3, "url": "Demo"},
|
||||
{"name": "聚合0", "type": 3, "url": "Web"},
|
||||
{"name": "ikun", "type": 0, "url": "https://jx.hls.one/?url="},
|
||||
{
|
||||
"name": "A6",
|
||||
"type": 0,
|
||||
"url" : "https://pl.a6club.com/player/analysis.php?v="
|
||||
},
|
||||
{
|
||||
"name": "虾米",
|
||||
"type": 0,
|
||||
"url" : "https://jx.xmflv.com/?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "云解",
|
||||
"type": 0,
|
||||
"url" : "https://yparse.ik9.cc/index.php?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "咸鱼",
|
||||
"type": 0,
|
||||
"url" : "https://jx.xymp4.cc/?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "淘片",
|
||||
"type": 0,
|
||||
"url" : "https://jx.yparse.com/index.php?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "冰豆",
|
||||
"type": 0,
|
||||
"url" : "https://bd.jx.cn/?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "七七",
|
||||
"type": 0,
|
||||
"url" : "https://jx.77flv.cc/?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "盘古",
|
||||
"type": 0,
|
||||
"url" : "https://www.playm3u8.cn/jiexi.php?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "夜幕",
|
||||
"type": 0,
|
||||
"url" : "https://yemu.xyz/?url=",
|
||||
"ext" : {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{"name": "8090", "type": 0, "url": "https://www.8090g.cn/?url="},
|
||||
{"name": "M3u8TV", "type": 0, "url": "https://jx.m3u8.tv/jiexi/?url="},
|
||||
{"name": "CK", "type": 0, "url": "https://www.ckplayer.vip/jiexi/?url="},
|
||||
{"name": "XY", "type": 0, "url": "https://jx.xymp4.cc/?url="},
|
||||
{
|
||||
"name": "推荐",
|
||||
"type": 1,
|
||||
"url" : "https://zy.qiaoji8.com/gouzi.php?url=94b07e0b2c0e8244&url="
|
||||
},
|
||||
{
|
||||
"name": "臻享",
|
||||
"type": 1,
|
||||
"url" : "https://150.138.78.37:4399/api?key=94b07e0b2c0e8244&url="
|
||||
},
|
||||
{
|
||||
"name": "优选",
|
||||
"type": 1,
|
||||
"url" : "http://1.94.221.189:88/algorithm.php?url="
|
||||
}
|
||||
],
|
||||
"doh": [
|
||||
{
|
||||
"name": "Google",
|
||||
"url" : "https://dns.google/dns-query",
|
||||
"ips" : ["8.8.4.4", "8.8.8.8"]
|
||||
},
|
||||
{
|
||||
"name": "Cloudflare",
|
||||
"url" : "https://cloudflare-dns.com/dns-query",
|
||||
"ips" : [
|
||||
"1.1.1.1", "1.0.0.1", "2606:4700:4700::1111",
|
||||
"2606:4700:4700::1001"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "AdGuard",
|
||||
"url" : "https://dns.adguard.com/dns-query",
|
||||
"ips" : ["94.140.14.140", "94.140.14.141"]
|
||||
},
|
||||
{
|
||||
"name": "DNSWatch",
|
||||
"url" : "https://resolver2.dns.watch/dns-query",
|
||||
"ips" : ["84.200.69.80", "84.200.70.40"]
|
||||
},
|
||||
{
|
||||
"name": "Quad9",
|
||||
"url" : "https://dns.quad9.net/dns-quer",
|
||||
"ips" : ["9.9.9.9", "149.112.112.112"]
|
||||
}
|
||||
],
|
||||
"ads": ["mozai.4gtv.tv"],
|
||||
"ijk": [
|
||||
{
|
||||
"group" : "软解码",
|
||||
"options": [
|
||||
{"category": 4, "name": "opensles", "value": "0"},
|
||||
{"category": 4, "name": "overlay-format", "value": "842225234"},
|
||||
{"category": 4, "name": "framedrop", "value": "1"},
|
||||
{"category": 4, "name": "soundtouch", "value": "1"},
|
||||
{"category": 4, "name": "start-on-prepared", "value": "1"},
|
||||
{"category": 1, "name": "http-detect-range-support", "value": "0"},
|
||||
{"category": 1, "name": "fflags", "value": "fastseek"},
|
||||
{"category": 2, "name": "skip_loop_filter", "value": "48"},
|
||||
{"category": 4, "name": "reconnect", "value": "1"},
|
||||
{"category": 4, "name": "enable-accurate-seek", "value": "0"},
|
||||
{"category": 4, "name": "mediacodec", "value": "0"},
|
||||
{"category": 4, "name": "mediacodec-auto-rotate", "value": "0"},
|
||||
{
|
||||
"category": 4,
|
||||
"name" : "mediacodec-handle-resolution-change",
|
||||
"value" : "0"
|
||||
},
|
||||
{"category": 4, "name": "mediacodec-hevc", "value": "0"},
|
||||
{"category": 1, "name": "dns_cache_timeout", "value": "600000000"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group" : "硬解码",
|
||||
"options": [
|
||||
{"category": 4, "name": "opensles", "value": "0"},
|
||||
{"category": 4, "name": "overlay-format", "value": "842225234"},
|
||||
{"category": 4, "name": "framedrop", "value": "1"},
|
||||
{"category": 4, "name": "soundtouch", "value": "1"},
|
||||
{"category": 4, "name": "start-on-prepared", "value": "1"},
|
||||
{"category": 1, "name": "http-detect-range-support", "value": "0"},
|
||||
{"category": 1, "name": "fflags", "value": "fastseek"},
|
||||
{"category": 2, "name": "skip_loop_filter", "value": "48"},
|
||||
{"category": 4, "name": "reconnect", "value": "1"},
|
||||
{"category": 4, "name": "enable-accurate-seek", "value": "0"},
|
||||
{"category": 4, "name": "mediacodec", "value": "1"},
|
||||
{"category": 4, "name": "mediacodec-auto-rotate", "value": "1"},
|
||||
{
|
||||
"category": 4,
|
||||
"name" : "mediacodec-handle-resolution-change",
|
||||
"value" : "1"
|
||||
},
|
||||
{"category": 4, "name": "mediacodec-hevc", "value": "1"},
|
||||
{"category": 1, "name": "dns_cache_timeout", "value": "600000000"}
|
||||
]
|
||||
}
|
||||
],
|
||||
"proxy": [
|
||||
"raw.githubusercontent.com",
|
||||
"googlevideo.com",
|
||||
"cdn.v82u1l.com",
|
||||
"cdn.iz8qkg.com",
|
||||
"cdn.kin6c1.com",
|
||||
"c.biggggg.com",
|
||||
"c.olddddd.com",
|
||||
"haiwaikan.com",
|
||||
"www.histar.tv",
|
||||
"youtube.com",
|
||||
"uhibo.com",
|
||||
".*boku.*",
|
||||
".*nivod.*",
|
||||
".*ulivetv.*",
|
||||
"iill.top"
|
||||
],
|
||||
"rules": [
|
||||
{ "name": "cl", "hosts": ["magnet"], "regex": ["最 新", "直 播", "更 新"] },
|
||||
{ "name": "火山嗅探", "hosts": ["huoshan.com"], "regex": ["item_id="] },
|
||||
{ "name": "抖音嗅探", "hosts": ["douyin.com"], "regex": ["is_play_url="] },
|
||||
{ "name": "农民嗅探", "hosts": ["toutiaovod.com"], "regex": ["video/tos/cn"] },
|
||||
{ "name": "七新嗅探", "hosts": ["api.52wyb.com"], "regex": ["m3u8?pt=m3u8"] },
|
||||
{
|
||||
"name" : "夜市",
|
||||
"hosts" : ["yeslivetv.com"],
|
||||
"script": [
|
||||
"document.getElementsByClassName('vjs-big-play-button')[0].click()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "毛驴",
|
||||
"hosts" : ["www.maolvys.com"],
|
||||
"script": [
|
||||
"document.getElementsByClassName('swal-button swal-button--confirm')[0].click()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name" : "czzy",
|
||||
"hosts": ["10086.cn"],
|
||||
"regex": ["/storageWeb/servlet/downloadServlet"]
|
||||
},
|
||||
{
|
||||
"name" : "bdys",
|
||||
"hosts" : [
|
||||
"bytetos.com", "byteimg.com", "bytednsdoc.com", "pstatp.com"
|
||||
],
|
||||
"regex" : ["/tos-cn"],
|
||||
"exclude": [".m3u8"]
|
||||
},
|
||||
{
|
||||
"name" : "bdys10",
|
||||
"hosts" : ["bdys10.com"],
|
||||
"regex" : ["/obj/"],
|
||||
"exclude": [".m3u8"]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user