Sync all projects

This commit is contained in:
github-actions[bot]
2026-07-13 06:22:17 +00:00
parent 5760fd2902
commit ed26d5b473
31 changed files with 28989 additions and 11123 deletions
+3918 -473
View File
@@ -1,506 +1,3951 @@
---
# (Variable Reference)
(async function() {
if (window._mvuFinalStableV110) return;
await waitGlobalInitialized('Mvu');
console.log(' MVU ZOD v11.1 ');
: #
: 0
: AI
: 200075%
: 200075%
: 751.5
: 2200
: 50
: 80500使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
: #
:
:
: 24HH:MM
:
: 100
: AI
: # AI
:
: true/false # true=false=
: true/false
: #
: /////
: /調//
:
: # (00:00)
# ----
# { "名稱": "文字","品階":"N/R/SR/SSR/UR", "描述": "文字", "需求點數": }
: ()
: 使便
:
: ()()()
: ''
-:
: ("某荒野求生漫畫")
:
滿:
-
-
-
- 使
:
-:
: ("某荒野求生漫畫")
:
滿:
-
-
-
-
:
-:
: /("某荒野求生漫畫")
:
滿:
-
-
-
- 滿
- 滿
:
: /
-:
: ("某荒野求生漫畫")
:
滿:
-
-
-
-
:
:
1.
2. '///'
3.
4.
5.
6. = + + 100~5000
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).; }
};
: #
{ "位置": "", "樣式": "", "物品": {}, "食材": {}, "醫藥": {}, "材料": {}, "牲畜": {}, "設施": {}, "奇物": {}, "武器": {} }
-
-
- ///////
insertremove + 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%
harvestActionREMOVE 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~80100~150200+
:
: : { '': { '': , '': }, ... }
: //"一座簡易的木結構小屋,約三米見方"
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~80100~150150+
:
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
View File
@@ -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
View File
@@ -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",
+2397
View File
@@ -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" : "♓️YouTubeSO",
"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"]
}
]
}