// 物品相关函数

function 拥有金币() { // 返回金币的持有数量
    return $gameParty.gold();
}

function 拥有物品(id) { // 返回指定物品ID的持有数量
    return $gameParty.numItems($dataItems[id]);
}

function 拥有武器(id) { // 返回指定武器ID的持有数量
    return $gameParty.numItems($dataWeapons[id]);
}

function 拥有防具(id) { // 返回指定防具ID的持有数量
    return $gameParty.numItems($dataArmors[id]);
}

function 装备武器(武器id, 角色id = null) { // 传入角色id检查指定角色是否持有该武器，否则为任意角色持有。
    if (角色id !== null) {
        const actor = $gameActors.actor(角色id);
        return actor && actor.equips().some(equip => 
            equip && equip.id === 武器id && DataManager.isWeapon(equip)
        );
    } else {
        // 检查任意角色是否装备了该武器
        return $gameParty.members().some(actor => 
            actor.equips().some(equip => 
                equip && equip.id === 武器id && DataManager.isWeapon(equip)
            )
        );
    }
}

function 装备防具(防具id, 角色id = null) {// 传入角色id检查指定角色是否装备了该防具，否则为任意角色装备。
    if (角色id !== null) {
        const actor = $gameActors.actor(角色id);
        return actor && actor.equips().some(equip => 
            equip && equip.id === 防具id && DataManager.isArmor(equip)
        );
    } else {
        // 检查任意角色是否装备了该防具
        return $gameParty.members().some(actor => 
            actor.equips().some(equip => 
                equip && equip.id === 防具id && DataManager.isArmor(equip)
            )
        );
    }
}


function 增加物品(id, 数量 = 1) { // 增加指定物品的数量
    if (数量 <= 0) return 拥有物品数量(id);
    $gameParty.gainItem($dataItems[id], 数量);
    return 拥有物品数量(id);
}

function 增加武器(id, 数量 = 1) { // 增加指定武器的数量
    if (数量 <= 0) return 拥有武器数量(id);
    $gameParty.gainItem($dataWeapons[id], 数量);
    return 拥有武器数量(id);
}

function 增加防具(id, 数量 = 1) { // 增加指定防具的数量
    if (数量 <= 0) return 拥有防具数量(id);
    $gameParty.gainItem($dataArmors[id], 数量);
    return 拥有防具数量(id);
}

function 增加金钱(数量) { // 增加金钱
    if (数量 <= 0) return $gameParty.gold();
    $gameParty.gainGold(数量);
    return $gameParty.gold();
}

// 地图相关函数
function 当前地图ID() { // 返回玩家当前所在的地图ID
    return $gameMap.mapId();
}

function 玩家X坐标() { // 返回玩家在当前地图中的X坐标
    return $gamePlayer.x;
}

function 玩家Y坐标() { // 返回玩家在当前地图中的Y坐标
    return $gamePlayer.y;
}

function 玩家朝向() { // 返回玩家当前面向的方向(2=下,4=左,6=右,8=上)
    return $gamePlayer.direction();
}

// 队伍相关函数
function 队伍人数() { // 返回当前队伍中的成员数量
    return $gameParty.size();
}

function 最大战斗人数() { // 返回队伍最大战斗人数限制
    return $gameParty.maxBattleMembers();
}

function 队伍成员ID(位置) { // 返回队伍中指定位置(0开始)的成员角色ID，如果该位置无人返回0
    return $gameParty.members()[位置] ? $gameParty.members()[位置].actorId() : 0;
}

function 是否在队伍中(角色id) { // 检查角色是否在队伍中
    return $gameParty.members().some(member => member.actorId() === 角色id);
}

function 角色在队伍中的位置(角色id) { // 返回角色在队伍中的位置，不在队伍中返回-1
    return $gameParty.members().findIndex(member => member.actorId() === 角色id);
}

function 加入队伍(角色id) { // 将指定角色加入队伍
    const actor = $gameActors.actor(角色id);
    if (actor && !$gameParty.members().some(m => m.actorId() === 角色id)) {
        $gameParty.addActor(角色id);
        return true;
    }
    return false;
}

function 移除队伍(角色id) { // 将指定角色移出队伍
    if ($gameParty.members().some(m => m.actorId() === 角色id)) {
        $gameParty.removeActor(角色id);
        return true;
    }
    return false;
}

function 交换位置(位置1, 位置2) { // 交换两个位置的成员
    if (位置1 >= 0 && 位置2 >= 0 && 位置1 < $gameParty.size() && 位置2 < $gameParty.size()) {
        $gameParty.swapOrder(位置1, 位置2);
        return true;
    }
    return false;
}

function 移动到首位(角色id) { // 将指定角色移动到队伍首位
    const index = $gameParty.members().findIndex(m => m.actorId() === 角色id);
    if (index > 0) {
        $gameParty.swapOrder(index, 0);
        return true;
    }
    return false;
}

function 队伍平均等级() { // 计算队伍平均等级
    const members = $gameParty.members();
    if (members.length === 0) return 0;
    
    const 总等级 = members.reduce((sum, member) => sum + member.level, 0);
    return Math.round(总等级 / members.length);
}

function 队伍总HP() { // 计算队伍总HP
    return $gameParty.members().reduce((sum, member) => sum + member.hp, 0);
}

function 队伍总MP() { // 计算队伍总MP
    return $gameParty.members().reduce((sum, member) => sum + member.mp, 0);
}

function 队伍生存人数() { // 返回存活的成员数量
    return $gameParty.members().filter(member => member.isAlive()).length;
}

function 队伍死亡人数() { // 返回死亡的成员数量
    return $gameParty.members().filter(member => member.isDead()).length;
}

// 开关变量相关函数
function 开关状态(开关id) { // 返回指定开关ID的当前状态(true/false)
    return $gameSwitches.value(开关id);
}

function 开启开关(开关id) { // 开启指定开关(设置为true)
    $gameSwitches.setValue(开关id, true);
    return true;
}

function 关闭开关(开关id) { // 关闭指定开关(设置为false)
    $gameSwitches.setValue(开关id, false);
    return true;
}

function 切换开关(开关id) { // 切换开关状态(true↔false)
    const 当前状态 = $gameSwitches.value(开关id);
    $gameSwitches.setValue(开关id, !当前状态);
    return !当前状态;
}


function 变量值(变量id) { // 返回指定变量ID的当前数值
    return $gameVariables.value(变量id);
}

function 设置变量(变量id, 数值) { // 设置指定变量的值
    $gameVariables.setValue(变量id, 数值);
    return 数值;
}

function 增加变量(变量id, 增加值) { // 为变量增加指定数值
    const 当前值 = $gameVariables.value(变量id);
    const 新值 = 当前值 + 增加值;
    $gameVariables.setValue(变量id, 新值);
    return 新值;
}



// 角色及战斗相关函数
function 战斗次数() { // 返回游戏至今的总战斗次数
    return $gameSystem.battleCount();
}

function 逃跑次数() { // 返回游戏至今的总逃跑次数
    return $gameSystem.escapeCount();
}

// 角色关函数
function 角色技能列表(角色id) { // 返回指定角色ID已学会的所有技能ID数组
    const actor = $gameActors.actor(角色id);
    return actor.skills().map(skill => skill.id);
}

function 是否学会技能(角色id, 技能id) { // 检查指定角色是否已学会指定技能，返回true/false
    const actor = $gameActors.actor(角色id);
    return actor.hasSkill(技能id);
}

function 角色状态(角色id) { // 返回指定角色ID当前附加的所有状态ID数组
    const actor = $gameActors.actor(角色id);
    return actor.states().map(state => state.id);
}

function 是否有状态(角色id, 状态id) { // 检查指定角色是否处于指定状态，返回true/false
    const actor = $gameActors.actor(角色id);
    return actor.isStateAffected(状态id);
}

function 队伍最高等级(战斗成员 = false) { // 检查队伍最高等级，true为战斗成员，默认false所有成员。
    const members = 战斗成员 ? $gameParty.battleMembers() : $gameParty.members();
    return Math.max(0, ...members.map((member) => member.level));
}

function 队伍平均等级(战斗成员 = false) { // 检查队伍平均等级，true为战斗成员，默认false所有成员。
    const members = 战斗成员 ? $gameParty.battleMembers() : $gameParty.members();
    if (members.length === 0) return 0;
    const total = members.reduce((sum, member) => sum + member.level, 0);
    return Math.floor(total / members.length);
}

// 游戏系统相关函数
function 游戏时间() { // 返回游戏总游玩时间(秒)
    return $gameSystem.playtime();
}

function 存档次数() { // 返回游戏至今的总存档次数
    return $gameSystem.saveCount();
}

function 公共事件(事件id) { // 执行指定ID的公共事件
    if ($dataCommonEvents && $dataCommonEvents[事件id]) {
        $gameTemp.reserveCommonEvent(事件id);
        return true;
    }
    return false;
}

// 工具相关函数
function 随机数(最小值, 最大值) { // 生成指定范围内的随机整数(包含最小值和最大值)
    return Math.floor(Math.random() * (最大值 - 最小值 + 1)) + 最小值;
}

function 概率(百分比) {// 传入百分比数值(0-100)，返回该概率是否触发
    if (百分比 <= 0) return false;
    if (百分比 >= 100) return true; 
    return Math.random() * 100 < 百分比;
} 

// DdDiGame在线系统相关函数
function 登陆用户() { // 返回当前登录的在线用户名
    return $online.name();
}

function 当前版本() { // 返回当前客服端游戏版本
    return $online.version();
}

function 联网判断() {// 返回当前网络状态
    if (typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean') {
        return navigator.onLine;
    }
    return false;
}
    
function 网络公共事件(事件id) { // 执行指定ID的网络公共事件
    const id = 事件id - 1;
    if (Ldd.online[id]) {
        $gameTemp.reserveOnlineEvent(事件id);
        return true;
    }
    return false;
}

function 今天签到() { // 返回今日是否签到(需配合签到插件)
    const ri = $gameSystem.onlineTime().ri;
    return $gameSystem.qiandaojilu[ri] === 10;
}

function 本月签到() { // 返回本月签到天数(需配合签到插件)
    return $gameSystem.qiandaojilu[35] || 0;
}

function 永久签到() { // 返回永久签到天数(需配合签到插件)
    return $gameSystem.qiandaojilu[0] || 0;
}


function 年(id = null) {// 不填参数返回当前年份，填参数返回是否匹配
    const currentNian = $gameSystem.onlineTime().nian;
    return id === null ? currentNian : currentNian === id;
}

function 月(id = null) {// 不填参数返回当前月，填参数返回是否匹配
    const currentYue = $gameSystem.onlineTime().yue;
    return id === null ? currentYue : currentYue === id;
}

function 周(id = null) {// 不填参数返回周几，填参数返回是否匹配
    const time = $gameSystem.onlineTime();
    const y = time.nian, m = time.yue, d = time.ri;
    const adjustedMonth = m < 3 ? m + 12 : m;
    const adjustedYear = m < 3 ? y - 1 : y;
    const h = (d + Math.floor(13 * (adjustedMonth + 1) / 5) + (adjustedYear % 100) 
              + Math.floor((adjustedYear % 100) / 4) + Math.floor(adjustedYear / 400) 
              - 2 * Math.floor(adjustedYear / 100)) % 7;
    const currentXingqi = (h + 6) % 7;
    return id === null ? currentXingqi : currentXingqi === id;
}

function 日(id = null) {// 不填参数返回当前日，填参数返回是否匹配
    const currentRi = $gameSystem.onlineTime().ri;
    return id === null ? currentRi : currentRi === id;
}

function 时(id = null) {// 不填参数返回当前小时，填参数返回是否匹配
    const currentShi = $gameSystem.onlineTime().shi;
    return id === null ? currentShi : currentShi === id;
}

function 分(id = null) {// 不填参数返回当前分钟，填参数返回是否匹配
    const currentFen = $gameSystem.onlineTime().fen;
    return id === null ? currentFen : currentFen === id;
}


