RMMV的任务插件发布前研讨会~
RT,RMMV任务系统即将发布了~想和大家讨论讨论效果需不需要改进之类的~{:2_282:}感谢诸位提出的建议,部分问题已经被修复了,现在还有一个存档保存的问题,貌似RMMV的存档保存机制和VA不一样……有没有大神能够指导一下~
上图:
任务会以类似《天谕》任务界面那样,分主任务、介绍、任务要点(可以理解为子任务)、完成度四部分显示。
已经完成的要点会变成灰色。
这个窗口不影响点击地图。
任务要点可以监测某个变量,或是指定进度双重判定方法。
任务可以被染色~
地图上的窗口只显示未完成任务,菜单中的窗口还没做呢。
使用方法如下:
* @help 在脚本中输入以下内容来操作任务系统:
* ======================================================================
* 新增任务:
* $gameParty.addmission(id,name,description,childs,reward,autocomplete);
* id(string):可以任意填写,是你识别任务的唯一参数,注意最好不要重复。
* name(string):可以任意填写,是显示的任务名称。
* description(string):可以任意填写,是显示的任务介绍。
* childs(array):任务要点列表,以的格式填写,在下一条目有介绍。
* reward(array):完成奖励,以[['EXP',数量],['MONEY',数量],[物品ID,数量],...]的格式填写。
* autocomplete(boolean):是否自动完成任务,自动完成的意思就是达成条件后无需NPC触发。
* ======================================================================
* 为某个任务新增要点:
* $gameParty.addmissionchild(id,child);
* id(string):任务ID。
* child(array):要点,以的格式填写。
* 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 代码
/*:
* @plugindesc 为RPG Maker MV新增任务系统。
* @author 小优【66RPG:rpg-sheep】【百度贴吧:优加星爱兔子】
*
* @param Default Volume
* @desc This will be the volume of the BGM played.
* @default 90
*
* @help 在脚本中输入以下内容来操作任务系统:
* ======================================================================
* 新增任务:
* $gameParty.addmission(id,name,description,childs,reward,autocomplete);
* id(string):可以任意填写,是你识别任务的唯一参数,注意最好不要重复。
* name(string):可以任意填写,是显示的任务名称。
* description(string):可以任意填写,是显示的任务介绍。
* childs(array):任务要点列表,以的格式填写,在下一条目有介绍。
* reward(array):完成奖励,以[['EXP',数量],['MONEY',数量],[物品ID,数量],...]的格式填写。
* autocomplete(boolean):是否自动完成任务,自动完成的意思就是达成条件后无需NPC触发。
* ======================================================================
* 为某个任务新增要点:
* $gameParty.addmissionchild(id,child);
* id(string):任务ID。
* child(array):要点,以的格式填写。
* 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。
* 与上一条的差别同前。
* ======================================================================
*/
function Window_XY_Mission(){this.initialize.apply(this, arguments);}
Window_XY_Mission.prototype = Object.create(Window_Base.prototype);
Window_XY_Mission.prototype.constructor = Window_XY_Mission;
Window_XY_Mission.prototype.initialize = function(){
Window_Base.prototype.initialize.call(this, Graphics.boxWidth - this.windowWidth(), Graphics.boxHeight/2, this.windowWidth(), this.windowHeight());
this.opacity = 0;
this.line = 0;
this.padd = 1;
this.refresh();
};
Window_XY_Mission.prototype.standardFontSize = function(){return18;};
Window_XY_Mission.prototype.standardPadding = function(){return0;};
Window_XY_Mission.prototype.textPadding = function(){return10;};
Window_XY_Mission.prototype.windowWidth = function(){return300;};
Window_XY_Mission.prototype.windowHeight = function(){return300};
Window_XY_Mission.prototype.update = function(){
Window_Base.prototype.update.call(this);
$gameParty.testallmission();
this.refresh();
};
Window_XY_Mission.prototype.refresh = function(){
this.contents.clear();
var width = this.contentsWidth();
var height = this.standardFontSize()*$gameParty.getdrawline() + 2*this.textPadding();
this.line = 0;
this.padd = 0;
var missionlist = $gameParty.getallmission();
if(missionlist.length > 0){this.drawBackground(0, 0, width, height);}
for(var i = 0;i < missionlist.length;i++){
var childinfos = [];
for(var b = 0;b < missionlist.childs.length;b++){
childinfos.push(.childs,missionlist.getchildratebyindex(b),missionlist.childs]);
}
this.drawMission(width,missionlist.name,missionlist.description,childinfos);
this.padd ++;
}
};
Window_XY_Mission.prototype.drawBackground = function(x, y, width, height){
this.contents.context.fillStyle = 'rgba(0, 0, 0, 0.4)';
this.contents.context.fillRect(0, 0, this.windowWidth(), this.windowHeight());
};
Window_XY_Mission.prototype.drawMission = function(width,name,description,childinfos){
this.drawText(name, this.textPadding(), this.standardFontSize()*this.line + this.textPadding()*this.padd, width ,'left');
this.line ++;
if(description != ''){
this.drawText(description, this.textPadding()*3, this.standardFontSize()*this.line + this.textPadding()*this.padd, width, 'left');
this.line ++;
}
for(var i = 0;i < childinfos.length;i++){
this.changeTextColor(childinfos ? 'rgba(160, 160, 160, 0.4)' : 'rgba(255, 255, 255, 1)');
this.drawText('▪' + childinfos, this.textPadding()*5, this.standardFontSize()*this.line + this.textPadding()*this.padd, width, 'left');
this.drawText(childinfos, 0, this.standardFontSize()*this.line + this.textPadding()*this.padd, width, 'right');
this.line ++;
}
};/*
Window_XY_Mission.prototype.drawMissionChild = function(name,rate,completed) {
this.changeTextColor(this.systemColor());
var color1 = this.dimColor1();
var color2 = this.dimColor2();
this.contents.FillRect(0, 0, width, height, 'rgba(0, 0, 0, 0.3)');
this.contents.gradientFillRect(x + width / 2, y, width / 2, height, color1, color2);
};
Window_XY_Mission.prototype.changeColorbycompleted = function(completed) {
complete ? this.changeTextColor('rgba(0, 0, 0, 0.6)') : this.changeTextColor('rgba(0, 0, 0, 0.6)');
};*/
/*
Window_XY_Mission.prototype.isOpenAndActive = function() {
return this.isOpen() && this.active;
};
Window_XY_Mission.prototype.processTouch = function() {
if (this.isOpenAndActive()) {
if (TouchInput.isTriggered() && this.isTouchedInsideFrame()) {
this._touching = true;
this.onTouch(true);
} else if (TouchInput.isCancelled()) {
if (this.isCancelEnabled()) {
this.processCancel();
}
}
if (this._touching) {
if (TouchInput.isPressed()) {
this.onTouch(false);
} else {
this._touching = false;
}
}
} else {
this._touching = false;
}
};
Window_XY_Mission.prototype.isTouchedInsideFrame = function() {
var x = this.canvasToLocalX(TouchInput.x);
var y = this.canvasToLocalY(TouchInput.y);
return ((x >= 0)&&(y >= 0)&&(x
页:
[1]