设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 577|回复: 9
打印 上一主题 下一主题

[有事请教] 心烦啊...ai写代码死路一条

[复制链接]

Lv2.观梦者

梦石
0
星屑
498
在线时间
52 小时
注册时间
2022-7-8
帖子
27
跳转到指定楼层
1
发表于 2026-4-17 21:28:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
想做个地域压制类战斗系统(就是玩家扮演的角色带兵,武器替换为兵种HP替换为人力,战斗画面就是一队人打另一队人之类的)结果遇到问题死活解决不了,干脆死了这条心吧......
JS 代码复制
  1. //=============================================================================
  2. // RTB_ArmyBattle.js
  3. //=============================================================================
  4. // 版本: 2.5.1 (Save Before Call)
  5. // 描述: 英雄带兵战斗系统 - 彻底修复首次攻击不显示
  6. //=============================================================================
  7.  
  8. /*:
  9. * @target MZ
  10. * @plugindesc v2.5.1 英雄带兵战斗系统 (数据保存版)
  11. * @author YourName
  12. * @help
  13. * ============================================================================
  14. * 插件说明
  15. * ============================================================================
  16. * 此插件将RPG Maker MZ的默认战斗界面改造为带兵打仗风格。
  17. *
  18. * 主要特性:
  19. * - 上方显示敌人头像、名称、HP条(隐藏默认敌人战斗图)
  20. * - 攻击时,左侧出现我方部队,右侧出现敌方部队
  21. * - 兵模图片从 /img/pictures/ 文件夹读取
  22. * - 若未配置映射,自动使用默认图片:Actor1_1, Actor1_2, Actor1_3
  23. *
  24. * @param generalMapping
  25. * @text 将领图片映射
  26. * @desc 角色ID与将领图片的对应关系。格式: ["1:图片名","2:图片名"]
  27. * @type string[]
  28. * @default ["1:Actor1_1"]
  29. *
  30. * @param supportMapping
  31. * @text 支援兵器映射
  32. * @desc 防具ID与支援兵器图片的对应关系。格式: ["1:图片名","2:图片名"]
  33. * @type string[]
  34. * @default ["1:Actor1_2"]
  35. *
  36. * @param troopMapping
  37. * @text 兵种映射
  38. * @desc 武器ID:兵模图片:类型:每单位人力。
  39. * @type string[]
  40. * @default ["1:Actor1_3:infantry:1"]
  41. *
  42. * @param enemyGeneralMapping
  43. * @text 敌将图片映射
  44. * @desc 敌人ID与将领图片的对应关系。
  45. * @type string[]
  46. * @default ["1:Monster_1"]
  47. *
  48. * @param enemyTroopMapping
  49. * @text 敌兵种映射
  50. * @desc 敌人ID:兵模图片:类型:每单位人力。
  51. * @type string[]
  52. * @default ["1:Monster_2:infantry:1"]
  53. *
  54. * @param enemyAvatarMapping
  55. * @text 敌人头像映射
  56. * @desc 敌人ID与头像图片的对应关系,用于上方敌人列表显示。
  57. * @type string[]
  58. * @default ["1:Monster_3"]
  59. */
  60.  
  61. (() => {
  62.     'use strict';
  63.  
  64.     console.log('[RTB] 插件初始化开始');
  65.  
  66.     //=============================================================================
  67.     // 参数解析 (完全容错)
  68.     //=============================================================================
  69.     const parameters = PluginManager.parameters('RTB_ArmyBattle');
  70.  
  71.     function safeJsonParse(str, defaultValue = []) {
  72.         if (!str) return defaultValue;
  73.         try {
  74.             return JSON.parse(str);
  75.         } catch (e) {
  76.             console.warn('[RTB] 参数解析失败,使用默认值。', str);
  77.             return defaultValue;
  78.         }
  79.     }
  80.  
  81.     const GENERAL_MAP_RAW = safeJsonParse(parameters.generalMapping, ["1:Actor1_1"]);
  82.     const SUPPORT_MAP_RAW = safeJsonParse(parameters.supportMapping, ["1:Actor1_2"]);
  83.     const TROOP_MAP_RAW = safeJsonParse(parameters.troopMapping, ["1:Actor1_3:infantry:1"]);
  84.     const ENEMY_GENERAL_MAP_RAW = safeJsonParse(parameters.enemyGeneralMapping, ["1:Monster_1"]);
  85.     const ENEMY_TROOP_MAP_RAW = safeJsonParse(parameters.enemyTroopMapping, ["1:Monster_2:infantry:1"]);
  86.     const ENEMY_AVATAR_MAP_RAW = safeJsonParse(parameters.enemyAvatarMapping, ["1:Monster_3"]);
  87.  
  88.     function parseSimpleMapping(rawArray) {
  89.         const map = new Map();
  90.         for (const entry of rawArray) {
  91.             if (typeof entry !== 'string') continue;
  92.             const parts = entry.split(':');
  93.             if (parts.length >= 2) {
  94.                 const id = Number(parts[0]);
  95.                 const name = parts[1].trim();
  96.                 if (!isNaN(id) && name) map.set(id, name);
  97.             }
  98.         }
  99.         return map;
  100.     }
  101.  
  102.     function parseTroopMapping(rawArray) {
  103.         const map = new Map();
  104.         for (const entry of rawArray) {
  105.             if (typeof entry !== 'string') continue;
  106.             const parts = entry.split(':');
  107.             if (parts.length >= 4) {
  108.                 const id = Number(parts[0]);
  109.                 const imageName = parts[1].trim();
  110.                 const type = parts[2].trim().toLowerCase();
  111.                 const unitHp = Number(parts[3]);
  112.                 if (!isNaN(id) && imageName) {
  113.                     map.set(id, { imageName, type, unitHp });
  114.                 }
  115.             }
  116.         }
  117.         return map;
  118.     }
  119.  
  120.     const GENERAL_MAP = parseSimpleMapping(GENERAL_MAP_RAW);
  121.     const SUPPORT_MAP = parseSimpleMapping(SUPPORT_MAP_RAW);
  122.     const TROOP_MAP = parseTroopMapping(TROOP_MAP_RAW);
  123.     const ENEMY_GENERAL_MAP = parseSimpleMapping(ENEMY_GENERAL_MAP_RAW);
  124.     const ENEMY_TROOP_MAP = parseTroopMapping(ENEMY_TROOP_MAP_RAW);
  125.     const ENEMY_AVATAR_MAP = parseSimpleMapping(ENEMY_AVATAR_MAP_RAW);
  126.  
  127.     console.log('[RTB] 映射加载完成');
  128.  
  129.     //=============================================================================
  130.     // 工具函数
  131.     //=============================================================================
  132.     function calculateTroopCount(currentHp, troopType, unitHp) {
  133.         if (currentHp <= 0) return 0;
  134.         const base = (unitHp && unitHp > 0) ? unitHp : (troopType === 'armor' ? 10 : 1);
  135.         return Math.max(1, Math.ceil(currentHp / base));
  136.     }
  137.  
  138.     function getActorForceData(actor) {
  139.         const actorId = actor.actorId();
  140.         const weapon = actor.weapons()[0];
  141.         const armor = actor.armors()[0];
  142.  
  143.         let generalImage = GENERAL_MAP.get(actorId) || 'Actor1_1';
  144.         let supportImage = armor ? (SUPPORT_MAP.get(armor.id) || 'Actor1_2') : '';
  145.         let troopImage = 'Actor1_3';
  146.         let troopType = 'infantry';
  147.         let unitHp = 1;
  148.  
  149.         if (weapon) {
  150.             const troopInfo = TROOP_MAP.get(weapon.id);
  151.             if (troopInfo) {
  152.                 troopImage = troopInfo.imageName;
  153.                 troopType = troopInfo.type;
  154.                 unitHp = troopInfo.unitHp;
  155.             }
  156.         }
  157.  
  158.         const soldierCount = calculateTroopCount(actor.hp, troopType, unitHp);
  159.         return { generalImage, supportImage, troopImage, troopType, soldierCount };
  160.     }
  161.  
  162.     function getEnemyForceData(enemy) {
  163.         const enemyId = enemy.enemyId();
  164.         const troopInfo = ENEMY_TROOP_MAP.get(enemyId);
  165.         let troopImage = troopInfo ? troopInfo.imageName : 'Monster_2';
  166.         let troopType = troopInfo ? troopInfo.type : 'infantry';
  167.         let unitHp = troopInfo ? troopInfo.unitHp : 1;
  168.         let generalImage = ENEMY_GENERAL_MAP.get(enemyId) || 'Monster_1';
  169.         const soldierCount = calculateTroopCount(enemy.hp, troopType, unitHp);
  170.         return { generalImage, troopImage, troopType, soldierCount };
  171.     }
  172.  
  173.     //=============================================================================
  174.     // 窗口:上方敌人状态列表
  175.     //=============================================================================
  176.     class Window_TroopStatus extends Window_Base {
  177.         initialize() {
  178.             const w = Graphics.boxWidth;
  179.             const h = 180;
  180.             super.initialize(new Rectangle(0, 0, w, h));
  181.             this._enemies = [];
  182.             this.opacity = 192;
  183.             this.refresh();
  184.         }
  185.  
  186.         setEnemies(enemies) {
  187.             this._enemies = enemies || [];
  188.             this.refresh();
  189.         }
  190.  
  191.         refresh() {
  192.             this.contents.clear();
  193.             if (!this._enemies.length) return;
  194.             const itemWidth = 200;
  195.             const padding = 10;
  196.             const startX = 20;
  197.             const y = 0;
  198.             this._enemies.forEach((enemy, index) => {
  199.                 const x = startX + index * (itemWidth + padding);
  200.                 this.drawEnemyItem(enemy, x, y, itemWidth);
  201.             });
  202.         }
  203.  
  204.         drawEnemyItem(enemy, x, y, width) {
  205.             const enemyId = enemy.enemyId();
  206.             const avatarName = ENEMY_AVATAR_MAP.get(enemyId) || 'Monster_3';
  207.             try {
  208.                 const bitmap = ImageManager.loadPicture(avatarName);
  209.                 this.contents.blt(bitmap, 0, 0, 48, 48, x, y, 48, 48);
  210.             } catch (e) {
  211.                 try {
  212.                     this.drawIcon(1, x, y);
  213.                 } catch (e2) {}
  214.             }
  215.             this.drawText(enemy.name(), x + 54, y, width - 54, 'left');
  216.  
  217.             const hpY = y + 24;
  218.             const hpWidth = width - 54;
  219.             const rate = enemy.hpRate();
  220.             const barHeight = 12;
  221.             this.contents.fillRect(x + 54, hpY, hpWidth, barHeight, '#000000');
  222.             const color1 = ColorManager.textColor(20);
  223.             const fillW = Math.max(0, Math.floor((hpWidth - 2) * rate));
  224.             this.contents.fillRect(x + 55, hpY + 1, fillW, barHeight - 2, color1);
  225.             this.drawText(`${enemy.hp}/${enemy.mhp}`, x + 54, hpY + barHeight, hpWidth, 'right');
  226.         }
  227.  
  228.         update() {
  229.             super.update();
  230.             if (this._enemies.length) this.refresh();
  231.         }
  232.     }
  233.  
  234.     //=============================================================================
  235.     // 隐藏默认敌人精灵
  236.     //=============================================================================
  237.     const _Spriteset_Battle_createEnemies = Spriteset_Battle.prototype.createEnemies;
  238.     Spriteset_Battle.prototype.createEnemies = function() {
  239.         _Spriteset_Battle_createEnemies.call(this);
  240.         if (this._enemySprites) {
  241.             this._enemySprites.forEach(sprite => sprite.visible = false);
  242.         }
  243.     };
  244.  
  245.     const _Spriteset_Battle_update = Spriteset_Battle.prototype.update;
  246.     Spriteset_Battle.prototype.update = function() {
  247.         _Spriteset_Battle_update.call(this);
  248.         if (this._enemySprites) {
  249.             this._enemySprites.forEach(sprite => sprite.visible = false);
  250.         }
  251.     };
  252.  
  253.     //=============================================================================
  254.     // 场景战斗扩展:创建容器和部队显示方法
  255.     //=============================================================================
  256.     const _Scene_Battle_createDisplayObjects = Scene_Battle.prototype.createDisplayObjects;
  257.     Scene_Battle.prototype.createDisplayObjects = function() {
  258.         _Scene_Battle_createDisplayObjects.call(this);
  259.         this._troopStatusWindow = new Window_TroopStatus();
  260.         this.addWindow(this._troopStatusWindow);
  261.         this._troopStatusWindow.setEnemies($gameTroop.members());
  262.  
  263.         // 确保容器存在
  264.         if (this._spriteset) {
  265.             this._spriteset._leftArmyContainer = new PIXI.Container();
  266.             this._spriteset._rightArmyContainer = new PIXI.Container();
  267.             // 添加到 _baseSprite 或直接添加到 spriteset
  268.             const target = this._spriteset._baseSprite || this._spriteset;
  269.             target.addChild(this._spriteset._leftArmyContainer);
  270.             target.addChild(this._spriteset._rightArmyContainer);
  271.         }
  272.     };
  273.  
  274.     const _Scene_Battle_update = Scene_Battle.prototype.update;
  275.     Scene_Battle.prototype.update = function() {
  276.         _Scene_Battle_update.call(this);
  277.         if (this._troopStatusWindow) {
  278.             this._troopStatusWindow.setEnemies($gameTroop.members());
  279.         }
  280.     };
  281.  
  282.     Scene_Battle.prototype.clearArmySprites = function() {
  283.         const spriteset = this._spriteset;
  284.         if (!spriteset) return;
  285.         if (spriteset._leftArmyContainer) spriteset._leftArmyContainer.removeChildren();
  286.         if (spriteset._rightArmyContainer) spriteset._rightArmyContainer.removeChildren();
  287.         if (this._armyClearTimer) {
  288.             clearTimeout(this._armyClearTimer);
  289.             this._armyClearTimer = null;
  290.         }
  291.     };
  292.  
  293.     Scene_Battle.prototype.showLeftArmy = function(actorData) {
  294.         const spriteset = this._spriteset;
  295.         if (!spriteset || !spriteset._leftArmyContainer) return;
  296.         spriteset._leftArmyContainer.removeChildren();
  297.         const centerX = 200;
  298.         const baseY = Graphics.boxHeight - 200;
  299.  
  300.         const addSprite = (img, x, y) => {
  301.             if (!img) return;
  302.             try {
  303.                 const bitmap = ImageManager.loadPicture(img);
  304.                 const sprite = new Sprite(bitmap);
  305.                 sprite.x = x;
  306.                 sprite.y = y;
  307.                 sprite.scale.set(0.8, 0.8);
  308.                 sprite.anchor.set(0.5, 1);
  309.                 spriteset._leftArmyContainer.addChild(sprite);
  310.             } catch (e) {
  311.                 console.warn(`[RTB] 加载左侧图片失败: ${img}`);
  312.             }
  313.         };
  314.  
  315.         addSprite(actorData.generalImage, centerX - 40, baseY - 60);
  316.         if (actorData.supportImage) {
  317.             addSprite(actorData.supportImage, centerX + 60, baseY - 60);
  318.         }
  319.         if (actorData.soldierCount > 0) {
  320.             const count = Math.min(actorData.soldierCount, 8);
  321.             for (let i = 0; i < count; i++) {
  322.                 const offsetX = (i % 4) * 30 - 45;
  323.                 const offsetY = Math.floor(i / 4) * 25 + 20;
  324.                 addSprite(actorData.troopImage, centerX + offsetX, baseY + offsetY);
  325.             }
  326.         }
  327.     };
  328.  
  329.     Scene_Battle.prototype.showRightArmy = function(enemyData) {
  330.         const spriteset = this._spriteset;
  331.         if (!spriteset || !spriteset._rightArmyContainer) return;
  332.         spriteset._rightArmyContainer.removeChildren();
  333.         const centerX = Graphics.boxWidth - 200;
  334.         const baseY = Graphics.boxHeight - 200;
  335.  
  336.         const addSprite = (img, x, y) => {
  337.             if (!img) return;
  338.             try {
  339.                 const bitmap = ImageManager.loadPicture(img);
  340.                 const sprite = new Sprite(bitmap);
  341.                 sprite.x = x;
  342.                 sprite.y = y;
  343.                 sprite.scale.set(0.8, 0.8);
  344.                 sprite.anchor.set(0.5, 1);
  345.                 spriteset._rightArmyContainer.addChild(sprite);
  346.             } catch (e) {
  347.                 console.warn(`[RTB] 加载右侧图片失败: ${img}`);
  348.             }
  349.         };
  350.  
  351.         addSprite(enemyData.generalImage, centerX - 40, baseY - 60);
  352.         if (enemyData.soldierCount > 0) {
  353.             const count = Math.min(enemyData.soldierCount, 8);
  354.             for (let i = 0; i < count; i++) {
  355.                 const offsetX = (i % 4) * 30 - 45;
  356.                 const offsetY = Math.floor(i / 4) * 25 + 20;
  357.                 addSprite(enemyData.troopImage, centerX + offsetX, baseY + offsetY);
  358.             }
  359.         }
  360.     };
  361.  
  362.     //=============================================================================
  363.     // 拦截行动开始 (关键修正:先保存数据,再调原版)
  364.     //=============================================================================
  365.     const _BattleManager_startAction = BattleManager.startAction;
  366.     BattleManager.startAction = function() {
  367.         const action = this._action;
  368.         const subject = this._subject;
  369.  
  370.         // 【关键】立即保存当前行动者和目标,避免被原版方法清空
  371.         const isActorAction = subject && subject.isActor() && action;
  372.         let actorData = null;
  373.         let enemyData = null;
  374.  
  375.         if (isActorAction) {
  376.             actorData = getActorForceData(subject);
  377.             const targets = action.makeTargets();
  378.             let target = targets.find(t => t.isEnemy());
  379.             if (!target) {
  380.                 for (const t of targets) {
  381.                     if (t.isEnemy()) { target = t; break; }
  382.                 }
  383.             }
  384.             if (target) enemyData = getEnemyForceData(target);
  385.         }
  386.  
  387.         // 执行原版逻辑
  388.         _BattleManager_startAction.call(this);
  389.  
  390.         // 显示部队
  391.         if (isActorAction) {
  392.             const scene = SceneManager._scene;
  393.             if (!scene) return;
  394.  
  395.             console.log('[RTB] 角色行动,显示部队');
  396.  
  397.             if (scene._armyClearTimer) {
  398.                 clearTimeout(scene._armyClearTimer);
  399.                 scene._armyClearTimer = null;
  400.             }
  401.  
  402.             scene.clearArmySprites();
  403.             scene.showLeftArmy(actorData);
  404.             if (enemyData) scene.showRightArmy(enemyData);
  405.  
  406.             // 设置清除定时器
  407.             scene._armyClearTimer = setTimeout(() => scene.clearArmySprites(), 600);
  408.         }
  409.     };
  410.  
  411.     const _Scene_Battle_terminate = Scene_Battle.prototype.terminate;
  412.     Scene_Battle.prototype.terminate = function() {
  413.         if (this._armyClearTimer) {
  414.             clearTimeout(this._armyClearTimer);
  415.             this._armyClearTimer = null;
  416.         }
  417.         this.clearArmySprites();
  418.         _Scene_Battle_terminate.call(this);
  419.     };
  420.  
  421.     console.log('[RTB] 插件加载完成');
  422. })();




*这个人并不懒,但是他还是没有写

Lv4.逐梦者

素材区好人

梦石
3
星屑
11154
在线时间
4172 小时
注册时间
2011-7-21
帖子
2528

极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

2
发表于 2026-4-17 21:41:48 | 只看该作者
本帖最后由 无忧谷主幻 于 2026-4-17 22:03 编辑

ai只能解决一些简单的,复杂的就别想了
而且大多时候还需要不断修改

点评

俗称和ai battle  发表于 2026-4-20 13:49
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
498
在线时间
52 小时
注册时间
2022-7-8
帖子
27
3
 楼主| 发表于 2026-4-17 21:57:03 | 只看该作者
自学插件都找不到去哪自学,要么狗屁不通要么太监......
*这个人并不懒,但是他还是没有写
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
24515
在线时间
1123 小时
注册时间
2019-3-5
帖子
1433
4
发表于 2026-4-17 22:15:07 | 只看该作者
一枚菜鸡大队长 发表于 2026-4-17 21:57
自学插件都找不到去哪自学,要么狗屁不通要么太监......

你都会用AI了,问一句AI推荐编程入门网站有那么难么

另外d老师写代码水平一坨,能用推荐GPT,GPT应该被人喂过数据库,平常问他一些脚本幻觉不算厉害
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
442
在线时间
958 小时
注册时间
2021-3-24
帖子
621

MZ评测员

5
发表于 2026-4-18 00:00:50 | 只看该作者
请为 RPG Maker MZ 编写一个名为 EcoSystem_Core.js 的插件框架。
全局存储: 在 $gameSystem 中初始化一个名为 _ecoManager 的对象,用于存储每个地图的经济数据(包含:物品库存、当前物价倍率、需求列表)。
备注解析: 扩展 Game_Event.prototype.setupPage 方法。当事件启动时,解析其备注栏(Note)中的标签:<EcoConfig: produce[id:count], consume[id:count], initial[id:count]>。
数据绑定: 将解析出的生产(produce)、消耗(consume)和初始库存(initial)存入对应地图的数据结构中,并确保这些数据能随存档保存。
API接口: 提供一个方法 EcoManager.getMapData(mapId) 方便后续调用。
基于之前的框架,现在实现核心的经济模拟逻辑:
结算周期: 定义一个‘周’的概念(例如每 10000 帧或通过插件指令触发)。
生产与消费: 每周结算时,遍历所有地图的 NPC 事件。根据备注的 produce 增加地图总库存,根据 consume 减少总库存。
如果某种维生品(食物等)库存归零,记录该地图为‘短缺状态’。
动态定价公式: 实现一个定价算法。价格倍率 $P = (总需求 + 10) / (总库存 + 10)$。将该倍率更新到对应地图的 priceScale 中。
属性注入: 确保每个事件的库存是独立的,但会汇总到所属地图的宏观市场中。
现在为插件添加商会(Chamber of Commerce)系统:
地图距离矩阵: 允许在插件参数中定义一个简单的地图连接矩阵(例如:Map1 到 Map2 距离为 5,Map2 到 Map3 距离为 3)。
自动补货: 在每周结算后,检查‘短缺状态’的地图。商会会从最近的、库存充裕的地图调配物资。
物流成本: 跨地图购买的物资价格 = 来源地物价 + (距离 * 基础运费)。这个成本将计入目标地图的下一周物价计算中。
逻辑解耦: 商会的行为不需要在地图上显示,仅作为数据层面的库存转移和价格修正。


-----------------------------
像这样,你先和AI捞5块钱的
全家活光光~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5973
在线时间
261 小时
注册时间
2018-1-22
帖子
211
6
发表于 2026-4-18 02:01:55 | 只看该作者
自学插件的前提是要懂js,真想学先从js入门开始,教程网上随便一搜就有
如果你没那个时间精力和想法,只想单纯玩玩AI的话 就得先从简单的逻辑开始训练,比如先从一个点移动到另一个点,然后播放一个攻击动画,再调用伤害逻辑、事件等等,一步步慢慢来,没有你这样上来就是一堆抽象描述的,说实话光凭这些信息真程序都不一定搞得出来
自分自身の神様になること
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2641
在线时间
663 小时
注册时间
2023-5-18
帖子
160
7
发表于 2026-4-18 07:46:07 | 只看该作者
RM官方就有教怎么写插件的官方教程,而且还是从js开始教
B站传送门
-----------------------------------------------------------------------
“与其为做不到的事耿耿于怀,不如为自己做到的事而喜悦
吧!”

-----------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7509
在线时间
1267 小时
注册时间
2006-7-18
帖子
595
8
发表于 2026-4-18 10:39:53 | 只看该作者
AI只能写一写简单的!改改UI,改改设定,想要大改系统太容易出问题了!
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3711
在线时间
631 小时
注册时间
2012-6-17
帖子
621

MZ评测员

9
发表于 2026-4-18 17:09:32 | 只看该作者
我也是劝你死了这条心

问渠那得清如许vs插件群:592798519  百鬼异闻录:887907636
为有源头活水来点击这里试玩
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2026-6-4 15:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表