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

Project1

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

[交流讨论] RMMV的任务插件发布前研讨会~

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
145 小时
注册时间
2013-10-16
帖子
271
跳转到指定楼层
1
发表于 2015-11-13 21:47:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 rpg-sheep 于 2015-11-14 22:01 编辑

RT,RMMV任务系统即将发布了~想和大家讨论讨论效果需不需要改进之类的~{:2_282:}
感谢诸位提出的建议,部分问题已经被修复了,现在还有一个存档保存的问题,貌似RMMV的存档保存机制和VA不一样……有没有大神能够指导一下~
上图:

任务会以类似《天谕》任务界面那样,分主任务、介绍、任务要点(可以理解为子任务)、完成度四部分显示。
已经完成的要点会变成灰色。
这个窗口不影响点击地图。
任务要点可以监测某个变量,或是指定进度双重判定方法。
任务可以被染色~
地图上的窗口只显示未完成任务,菜单中的窗口还没做呢。
使用方法如下:
* @help 在脚本中输入以下内容来操作任务系统:
* ======================================================================
* 新增任务:
* $gameParty.addmission(id,name,description,childs,reward,autocomplete);
* id(string):可以任意填写,是你识别任务的唯一参数,注意最好不要重复。
* name(string):可以任意填写,是显示的任务名称。
* description(string):可以任意填写,是显示的任务介绍。
* childs(array):任务要点列表,以[child,child,...]的格式填写,在下一条目有介绍。
* reward(array):完成奖励,以[['EXP',数量],['MONEY',数量],[物品ID,数量],...]的格式填写。
* autocomplete(boolean):是否自动完成任务,自动完成的意思就是达成条件后无需NPC触发。
* ======================================================================
* 为某个任务新增要点:
* $gameParty.addmissionchild(id,child);
* id(string):任务ID。
* child(array):要点,以[id,name,maxnumber,readnumber,autocomplete,completed]的格式填写。
*     id(string):可以任意填写,是你识别要点的唯一参数,同一任务中注意最好不要重复。
*     name(string):可以任意填写,是显示的要点名称。
*     maxnumber(int):大于0!达到这个数本要点将会被判定为达成。
*     readnumber(int/变量指针):
*         如果填int:需要你手动改变,可以做类似“摘三朵花”之类的任务。
*         如果填变量指针:会自动监测那个变量,可以做类似“生命达到1000”之类的任务。
*     autocomplete(boolean):是否自动完成本条件,自动完成的意思就是达成要点后无需NPC触发。
*     completed(boolean):初始状态是否完成,一般填false。
* ======================================================================
* 为某个任务的某个要点中的readnumber+1:
* $gameParty.upratemissionchild(id,childid);
* id(string):任务ID。
* childid(string):要点ID。
* ======================================================================
* 指定某个任务的某个要点中的readnumber:
* $gameParty.setratemissionchild(id,childid,num);、
* id(string):任务ID。
* childid(string):要点ID。
* num(int):值。
* ======================================================================
* 强制完成任务要点:
* $gameParty.completemissionchild(id,childid);
* id(string):任务ID。
* childid(string):要点ID。
* ======================================================================
* 手动完成任务要点:
* $gameParty.donemissionchild(id,childid);
* id(string):任务ID。
* childid(string):要点ID。
* 这条与上面那个不一样之处在于:
*     1、这个方法会检测是否满足达成要点的条件,并返回一个布尔值。
*     2、如果不满足条件,还是不会完成。
* 所以这个方法我的建议是放在条件分歧的脚本一栏里。
* ======================================================================
* 强制完成任务:
* $gameParty.completemission(id);
* id(string):任务ID。
* ======================================================================
* 手动完成任务:
* $gameParty.donemission(id);
* id(string):任务ID。
* 与上一条的差别同前。
* ======================================================================
请注意!以下代码仅供学习与参考,还没有做完,只能使用一部分的功能……
JAVASCRIPT 代码复制
  1. /*:
  2.  * @plugindesc 为RPG Maker MV新增任务系统。
  3.  * @author 小优【66RPG:rpg-sheep】【百度贴吧:优加星爱兔子】
  4.  *
  5.  * @param Default Volume
  6.  * @desc This will be the volume of the BGM played.
  7.  * @default 90
  8.  *
  9.  * @help 在脚本中输入以下内容来操作任务系统:
  10.  * ======================================================================
  11.  * 新增任务:
  12.  * $gameParty.addmission(id,name,description,childs,reward,autocomplete);
  13.  * id(string):可以任意填写,是你识别任务的唯一参数,注意最好不要重复。
  14.  * name(string):可以任意填写,是显示的任务名称。
  15.  * description(string):可以任意填写,是显示的任务介绍。
  16.  * childs(array):任务要点列表,以[child,child,...]的格式填写,在下一条目有介绍。
  17.  * reward(array):完成奖励,以[['EXP',数量],['MONEY',数量],[物品ID,数量],...]的格式填写。
  18.  * autocomplete(boolean):是否自动完成任务,自动完成的意思就是达成条件后无需NPC触发。
  19.  * ======================================================================
  20.  * 为某个任务新增要点:
  21.  * $gameParty.addmissionchild(id,child);
  22.  * id(string):任务ID。
  23.  * child(array):要点,以[id,name,maxnumber,readnumber,autocomplete,completed]的格式填写。
  24.  *     id(string):可以任意填写,是你识别要点的唯一参数,同一任务中注意最好不要重复。
  25.  *     name(string):可以任意填写,是显示的要点名称。
  26.  *     maxnumber(int):大于0!达到这个数本要点将会被判定为达成。
  27.  *     readnumber(int/变量指针):
  28.  *         如果填int:需要你手动改变,可以做类似“摘三朵花”之类的任务。
  29.  *         如果填变量指针:会自动监测那个变量,可以做类似“生命达到1000”之类的任务。
  30.  *     autocomplete(boolean):是否自动完成本条件,自动完成的意思就是达成要点后无需NPC触发。
  31.  *     completed(boolean):初始状态是否完成,一般填false。
  32.  * ======================================================================
  33.  * 为某个任务的某个要点中的readnumber+1:
  34.  * $gameParty.upratemissionchild(id,childid);
  35.  * id(string):任务ID。
  36.  * childid(string):要点ID。
  37.  * ======================================================================
  38.  * 指定某个任务的某个要点中的readnumber:
  39.  * $gameParty.setratemissionchild(id,childid,num);、
  40.  * id(string):任务ID。
  41.  * childid(string):要点ID。
  42.  * num(int):值。
  43.  * ======================================================================
  44.  * 强制完成任务要点:
  45.  * $gameParty.completemissionchild(id,childid);
  46.  * id(string):任务ID。
  47.  * childid(string):要点ID。
  48.  * ======================================================================
  49.  * 手动完成任务要点:
  50.  * $gameParty.donemissionchild(id,childid);
  51.  * id(string):任务ID。
  52.  * childid(string):要点ID。
  53.  * 这条与上面那个不一样之处在于:
  54.  *     1、这个方法会检测是否满足达成要点的条件,并返回一个布尔值。
  55.  *     2、如果不满足条件,还是不会完成。
  56.  * 所以这个方法我的建议是放在条件分歧的脚本一栏里。
  57.  * ======================================================================
  58.  * 强制完成任务:
  59.  * $gameParty.completemission(id);
  60.  * id(string):任务ID。
  61.  * ======================================================================
  62.  * 手动完成任务:
  63.  * $gameParty.donemission(id);
  64.  * id(string):任务ID。
  65.  * 与上一条的差别同前。
  66.  * ======================================================================
  67.  */
  68.  
  69. function Window_XY_Mission() {this.initialize.apply(this, arguments);}
  70.  
  71. Window_XY_Mission.prototype = Object.create(Window_Base.prototype);
  72. Window_XY_Mission.prototype.constructor = Window_XY_Mission;
  73.  
  74. Window_XY_Mission.prototype.initialize = function() {
  75.     Window_Base.prototype.initialize.call(this, Graphics.boxWidth - this.windowWidth(), Graphics.boxHeight/2, this.windowWidth(), this.windowHeight());
  76.     this.opacity = 0;
  77.         this.line = 0;
  78.         this.padd = 1;
  79.     this.refresh();
  80. };
  81. Window_XY_Mission.prototype.standardFontSize = function() {return 18;};
  82. Window_XY_Mission.prototype.standardPadding = function() {return 0;};
  83. Window_XY_Mission.prototype.textPadding = function() {return 10;};
  84. Window_XY_Mission.prototype.windowWidth = function() {return 300;};
  85. Window_XY_Mission.prototype.windowHeight = function() {return 300};
  86. Window_XY_Mission.prototype.update = function() {
  87.         Window_Base.prototype.update.call(this);
  88.         $gameParty.testallmission();
  89.         this.refresh();
  90. };
  91. Window_XY_Mission.prototype.refresh = function() {
  92.     this.contents.clear();
  93.     var width = this.contentsWidth();
  94.         var height = this.standardFontSize()*$gameParty.getdrawline() + 2*this.textPadding();
  95.         this.line = 0;
  96.         this.padd = 0;
  97.     var missionlist = $gameParty.getallmission();
  98.         if(missionlist.length > 0){this.drawBackground(0, 0, width, height);}
  99.         for(var i = 0;i < missionlist.length;i++){
  100.                 var childinfos = [];
  101.                 for(var b = 0;b < missionlist[i].childs.length;b++){
  102.                     childinfos.push([missionlist[i].childs[b][1],missionlist[i].getchildratebyindex(b),missionlist[i].childs[b][6]]);       
  103.             }
  104.                 this.drawMission(width,missionlist[i].name,missionlist[i].description,childinfos);
  105.                 this.padd ++;
  106.         }
  107.  
  108. };
  109. Window_XY_Mission.prototype.drawBackground = function(x, y, width, height) {
  110.         this.contents.context.fillStyle = 'rgba(0, 0, 0, 0.4)';
  111.     this.contents.context.fillRect(0, 0, this.windowWidth(), this.windowHeight());
  112. };
  113. Window_XY_Mission.prototype.drawMission = function(width,name,description,childinfos) {
  114.     this.drawText(name, this.textPadding(), this.standardFontSize()*this.line + this.textPadding()*this.padd, width ,'left');
  115.         this.line ++;
  116.         if(description != ''){
  117.             this.drawText(description, this.textPadding()*3, this.standardFontSize()*this.line + this.textPadding()*this.padd, width, 'left');
  118.         this.line ++;
  119.         }
  120.         for(var i = 0;i < childinfos.length;i++){
  121.                 this.changeTextColor(childinfos[i][2] ? 'rgba(160, 160, 160, 0.4)' : 'rgba(255, 255, 255, 1)');
  122.                 this.drawText('▪' + childinfos[i][0], this.textPadding()*5, this.standardFontSize()*this.line + this.textPadding()*this.padd, width, 'left');
  123.         this.drawText(childinfos[i][1], 0, this.standardFontSize()*this.line + this.textPadding()*this.padd, width, 'right');
  124.         this.line ++;
  125.         }
  126. };/*
  127. Window_XY_Mission.prototype.drawMissionChild = function(name,rate,completed) {
  128.         this.changeTextColor(this.systemColor());
  129.     var color1 = this.dimColor1();
  130.     var color2 = this.dimColor2();
  131.     this.contents.FillRect(0, 0, width, height, 'rgba(0, 0, 0, 0.3)');
  132.     this.contents.gradientFillRect(x + width / 2, y, width / 2, height, color1, color2);
  133. };
  134. Window_XY_Mission.prototype.changeColorbycompleted = function(completed) {
  135.         complete ? this.changeTextColor('rgba(0, 0, 0, 0.6)') : this.changeTextColor('rgba(0, 0, 0, 0.6)');
  136. };*/
  137. /*
  138. Window_XY_Mission.prototype.isOpenAndActive = function() {
  139.     return this.isOpen() && this.active;
  140. };
  141.  
  142. Window_XY_Mission.prototype.processTouch = function() {
  143.     if (this.isOpenAndActive()) {
  144.         if (TouchInput.isTriggered() && this.isTouchedInsideFrame()) {
  145.             this._touching = true;
  146.             this.onTouch(true);
  147.         } else if (TouchInput.isCancelled()) {
  148.             if (this.isCancelEnabled()) {
  149.                 this.processCancel();
  150.             }
  151.         }
  152.         if (this._touching) {
  153.             if (TouchInput.isPressed()) {
  154.                 this.onTouch(false);
  155.             } else {
  156.                 this._touching = false;
  157.             }
  158.         }
  159.     } else {
  160.         this._touching = false;
  161.     }
  162. };
  163.  
  164. Window_XY_Mission.prototype.isTouchedInsideFrame = function() {
  165.     var x = this.canvasToLocalX(TouchInput.x);
  166.     var y = this.canvasToLocalY(TouchInput.y);
  167.     return ((x >= 0)&&(y >= 0)&&(x <= this.width)&&(y <= this.width));
  168. };
  169. Window_XY_Mission.prototype.onTouch = function(triggered) {
  170.     var x = this.canvasToLocalX(TouchInput.x);
  171.     var y = this.canvasToLocalY(TouchInput.y);
  172.     if (this.isTouchedInsideFrame() {
  173.         SoundManager.playCursor();
  174.     }
  175.         //SoundManager.playCursor();
  176. };
  177. */
  178. Scene_Map.prototype.old_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
  179. Scene_Map.prototype.createDisplayObjects = function() {
  180.         this.old_createDisplayObjects();
  181.         this.XY_createMissionWindow();
  182. };
  183. Scene_Map.prototype.XY_createMissionWindow = function() {
  184.     this._XY_MissionWindow = new Window_XY_Mission();
  185.     this.addWindow(this._XY_MissionWindow);
  186. };
  187. alert(1);
  188. /*XY_Mission*/
  189. function XY_Mission(id,name,description,childs,reward,autocomplete){
  190.         this.id = id;
  191.     this.name = name;
  192.     this.description = description;
  193.         //Child[id,name,maxnumber,readnumber,autocomplete,completed]
  194.     this.childs = childs;
  195.     this.reward = reward;
  196.     this.autocomplete = autocomplete;
  197.         this.completed = false;
  198.         //添加任务要点
  199.     this.addchild = function(child){
  200.         this.childs.push(child);
  201.     }
  202.         //根据id寻找任务要点
  203.         this.findchildindexbyid = function(id){
  204.         for(var i = 0;i < this.childs.length;i++){
  205.             if(this.childs[i][0] === id){
  206.                 return i;
  207.             }
  208.         }
  209.     }
  210.         //获取任务要点完成度(仅绘图用)
  211.         this.getchildratebyid = function(id){
  212.         return this.getchildratebyindex(this.findchildindexbyid(id));
  213.     }
  214.         this.getchildratebyindex = function(index){
  215.                 return this.childs[index][3] + "/" + this.childs[index][2];
  216.     }
  217.         //增加一点任务要点完成度
  218.         this.upchildratebyid = function(id){
  219.         this.upchildratebyindex(this.findchildindexbyid(id));
  220.     }
  221.         this.upchildratebyindex = function(index){
  222.                 this.childs[index][3]++;
  223.     }
  224.         //设置任务要点完成度
  225.         this.setchildratebyid = function(id,num){
  226.         this.setchildratebyindex(this.findchildindexbyid(id),num);
  227.     }
  228.         this.setchildratebyindex = function(index,num){
  229.                 this.childs[index][3] = num;
  230.     }
  231.         //设置任务要点完成度
  232.         this.removechildbyid = function(id){
  233.         this.removechildbyindex(this.findchildindexbyid(id));
  234.     }
  235.         this.removechildbyindex = function(index){
  236.                 this.childs.splice(index,1);
  237.     }
  238.         //强制完成任务要点
  239.         this.completechildbyid = function(id){
  240.         this.completechildbyindex(this.findchildindexbyid(id));
  241.     }
  242.         this.completechildbyindex = function(index){
  243.                 this.childs[index][5] = true;
  244.     }
  245.         //获取任务要点是否达成
  246.         this.ischildcompletebyid = function(id){
  247.         return this.ischildcompletebyindex(this.findchildindexbyid(id));
  248.     }
  249.         this.ischildcompletebyindex = function(index){
  250.                 return (this.childs[index][3] >= this.childs[index][2]);
  251.     }
  252.         //获取任务要点是否完成
  253.         this.ischildcompletedbyid = function(id){
  254.         return this.ischildcompletedbyindex(this.findchildindexbyid(id));
  255.     }
  256.         this.ischildcompletedbyindex = function(index){
  257.                 return this.childs[index][5];
  258.     }
  259.         //手动完成任务要点
  260.         this.donechildbyid = function(id){
  261.         return this.donechildbyindex(this.findchildindexbyid(id));
  262.     }
  263.         this.donechildbyindex = function(index){
  264.                 if(this.ischildcompletebyindex(index)){this.completechildbyindex(index);}
  265.                 return this.ischildcompletedbyindex(index);
  266.     }
  267.         //自动完成任务要点
  268.         this.testchildbyid = function(id){
  269.         this.testchildbyindex(this.findchildindexbyid(id));
  270.     }
  271.         this.testchildbyindex = function(index){
  272.                 if(this.ischildcompletebyindex(index)&&this.childs[index][4]){this.completechildbyindex(index);}
  273.     }
  274.         //自动完成全部任务要点
  275.         this.testallchild = function(){
  276.                 for(var i = 0;i < this.childs.length;i++){
  277.                         this.testchildbyindex(i);
  278.         }
  279.     }
  280.         //强制完成任务
  281.         this.complete = function(){
  282.                 this.completed = true;
  283.     }
  284.         //获取任务是否达成
  285.         this.iscomplete = function(){
  286.         var isco = true;
  287.         for(var i = 0;i < this.childs.length;i++){
  288.             if(!this.ischildcompletedbyindex(i)){
  289.                 isco = false;
  290.             }
  291.         }
  292.         return isco;
  293.     }
  294.         //获取任务是否完成
  295.         this.iscompleted = function(){
  296.                 return this.completed;
  297.     }
  298.         //手动完成任务
  299.         this.done = function(){
  300.                 if(this.iscomplete()){this.complete();}
  301.                 return this.iscompleted();
  302.     }
  303.         //自动完成任务
  304.         this.test = function(){
  305.                 if(this.iscomplete()&&this.autocomplete){this.complete();}
  306.     }
  307.         //自动完成任务并且自动完成任务要点
  308.         this.testall = function(){
  309.                 this.testallchild();
  310.                 this.test();
  311.     }
  312. }
  313. /*Game_Party*/
  314. Game_Party.prototype.XY_Mission_old_initialize = Game_Party.prototype.initialize;
  315. Game_Party.prototype.initialize = function() {
  316.     Game_Party.prototype.XY_Mission_old_initialize();
  317.     this._missionlist = [];
  318. };
  319. //添加任务
  320. Game_Party.prototype.addmission = function(id,name,description,childs,reward,autocomplete) {
  321.     this._missionlist.push(new XY_Mission(id,name,description,childs,reward,autocomplete));
  322. };
  323. //添加要点
  324. Game_Party.prototype.addmissionchild = function(id,child) {
  325.     this._missionlist[this.findmissionindexbyid(id)].addchild(child);
  326. };
  327. //根据id寻找任务
  328. Game_Party.prototype.findmissionindexbyid = function(id){
  329.     for(var i = 0;i < this._missionlist.length;i++){
  330.         if(this._missionlist[i].id === id){
  331.             return i;
  332.         }
  333.     }
  334. }
  335. //刷新所有
  336. Game_Party.prototype.testallmission = function(id){
  337.     for(var i = 0;i < this._missionlist.length;i++){
  338.         this._missionlist[i].testall();
  339.     }
  340. }
  341. //增加一点任务要点完成度
  342. Game_Party.prototype.upratemissionchild = function(id,childid){
  343.     this._missionlist[this.findmissionindexbyid(id)].upchildratebyid(childid);
  344. }
  345. //设置任务要点完成度
  346. Game_Party.prototype.setratemissionchild = function(id,childid,num){
  347.     this._missionlist[this.findmissionindexbyid(id)].setchildratebyid(childid,num);
  348. }
  349. //强制完成任务要点
  350. Game_Party.prototype.completemissionchild = function(id,childid){
  351.     this._missionlist[this.findmissionindexbyid(id)].completechildbyid(childid);
  352. }
  353. //手动完成任务要点
  354. Game_Party.prototype.donemissionchild = function(id,childid){
  355.     return this._missionlist[this.findmissionindexbyid(id)].donechildbyid(childid);
  356. }
  357. //强制完成任务
  358. Game_Party.prototype.completemission = function(id){
  359.     this._missionlist[this.findmissionindexbyid(id)].complete();
  360. }
  361. //手动完成任务
  362. Game_Party.prototype.donemission = function(id){
  363.     return this._missionlist[this.findmissionindexbyid(id)].done();
  364. }
  365. //获取所有未完成任务
  366. Game_Party.prototype.getallmission = function(){
  367.         var allmission = [];
  368.         for(var i = 0;i < this._missionlist.length;i++){
  369.                 if(!this._missionlist[i].iscompleted()){
  370.                         allmission.push(this._missionlist[i]);
  371.                 }
  372.         }
  373.     return allmission;
  374. }
  375. //获取绘图行数
  376. Game_Party.prototype.getdrawline = function(){
  377.         var templine = 0;
  378.         var tempmission = this.getallmission();
  379.         templine += tempmission.length;
  380.         for(var i = 0;i < tempmission.length;i++){
  381.                 if(tempmission[i].description != ''){
  382.                         templine++;
  383.                 }
  384.                 templine += tempmission[i].childs.length;
  385.         }
  386.         return templine;
  387. }
开心咸鱼每一天~

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
2
发表于 2015-11-13 21:52:14 | 只看该作者
其实我一直在想打怪的任务,MV可以判断打败了什么怪物不?如果不行,能不能让怪物在某一开关打开之后,才掉落任务道具?这样判断道具即可。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
145 小时
注册时间
2013-10-16
帖子
271
3
 楼主| 发表于 2015-11-13 22:03:35 | 只看该作者
lirn 发表于 2015-11-13 21:52
其实我一直在想打怪的任务,MV可以判断打败了什么怪物不?如果不行,能不能让怪物在某一开关打开之后,才掉 ...

如果你用默认战斗就这样

如果你用其他方式战斗(ARPG等)得自己改脚本……
开心咸鱼每一天~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
帖子
1102
4
发表于 2015-11-14 01:39:24 | 只看该作者
我就说一句 既然数据库都是用的json 那么手写个编辑器不难吧

点评

不是己有一个了麼?  发表于 2015-11-14 13:16
额……也对  发表于 2015-11-14 10:41
RM-GUI延期。。。最近被黑心老板压迫T_T
二次元少女的shitake,长着长脸,身高165,蓝色卷双马尾,FCUP,瞳色黑色,病气和御宅属性,是天才少女。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
3589
在线时间
32 小时
注册时间
2015-9-24
帖子
2
5
发表于 2015-11-14 11:55:47 | 只看该作者
大神,这脚本如何使用啊?怎么保存城.js文件啊

点评

我也有同感  发表于 2015-11-15 12:09
论坛的保存功能好像有BUG用不了  发表于 2015-11-14 22:02
新建记事本,然后复制粘贴,保存,强硬修改扩展名为JS,OK  发表于 2015-11-14 21:42
还没有做好,所以暂时用不了  发表于 2015-11-14 20:53
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
135
在线时间
450 小时
注册时间
2015-2-25
帖子
365
6
发表于 2015-11-14 12:16:45 | 只看该作者
我覺得,任務窗口右邊留點空位不要貼着邊框比較好(像下面一樣)

或者...如果是想要有從右邊冒出來的效果...那最少把0/3往左移一點,感覺比較好看

点评

嗯呢  发表于 2015-11-14 20:53
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-22 15:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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