/
domahes
/
Arcade
Обзор
Документация
Войти
/
domahes
/
Arcade
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
js/root/RF.js
615 строк
17 KB
domahes
Update game scripts and data configurations
01 июн 2026, 10:11
01 июн 2026, 10:11
83cd2f8
Код
Авторство
О чём код?
/** * Created by Yitian Chen on 2019/1/3. * Common Function */ function RF(){} /** * Game over */ RF.GameOver = function(){ if(IVal.scene instanceof SMain){ var ui = RV.NowUI.uis[9]; IVal.scene.initSelfUI(ui,""); } }; /** * Game win */ RF.GameWin = function(){ if(IVal.scene instanceof SMain){ var ui = RV.NowUI.uis[10]; IVal.scene.initSelfUI(ui,""); } }; /** * Game Menu */ RF.GameMenu = function(){ if(IVal.scene instanceof SMain){ IVal.scene.setDialog(new WMenu(), function(menu){ if(menu == "loadGame"){ RF.LoadGame(); }else if(menu == "backTitle"){ IVal.scene.dispose(); IAudio.BGMFade(2); IAudio.BGSFade(2); if (typeof RF.ClearAllCache === "function") { RF.ClearAllCache(); } IVal.scene = new STitle(); } }); } }; /** * Load bitmap * @param path path of image */ RF.LoadBitmap = function(path){ return IBitmap.WBitmap("Graphics/" + path); }; /** * Load cache * @param path | path of image * @param func | callback after loading * @param tag | Tag during reading * @returns {*} | image in cache */ RF.LoadCache = function(path,func,tag){ if(RV.Cache[path] == null){ RV.Cache[path] = RF.LoadBitmap(path); RV.Cache[path].loadTexture(); if(RV.Cache[path].complete){ if(func != null) func(RV.Cache[path],tag) }else if(func != null){ RV.Cache[path].onload = function(){ func(RV.Cache[path],tag); }; RV.Cache[path].onerror = function(){ func(null,tag); }; } return RV.Cache[path]; }else{ if(func != null){ if(func != null) func(RV.Cache[path],tag); } return RV.Cache[path]; } }; /** * Preload UI resource * @param fileAry | File array * @param loadOver callback after loading function(ary) */ RF.CacheUIRes = function(fileAry,loadOver){ var index = 0; var hash = {}; if(fileAry.length == 0){ loadOver([]); return; } for(var i = 0;i<fileAry.length;i++){ var bitmap = RF.LoadBitmap(fileAry[i]); hash[fileAry[i]] = bitmap; } for(var key in hash){ bitmap = hash[key]; if(bitmap.complete){ index += 1; if(index >= Object.keys(hash).length){ loadOver(hash) } }else{ bitmap.onload = function(){ index += 1; if(index >= Object.keys(hash).length){ loadOver(hash) } }; bitmap.onerror = function(){ index += 1; if(index >= Object.keys(hash).length){ loadOver(hash) } }; } } }; /** *Get time * @param s * @returns {string} * @constructor */ RF.MakerTime = function(s){ if(s >= 3600){ return parseInt(s / 3600) + ":" + (parseInt(s / 60) % 60) + ":" + (s % 60); }else if(s >= 60){ return parseInt(s / 60) + ":" + (s % 60); }else if(s >= 0){ return "00"+":"+ s ; } else{ s = 0; return "00"+":"+s; } }; /** * Get timestamp * @constructor */ RF.GetTime = function(){ var time = Number(new Date()); return parseInt(time / 1000); }; /** * Draw continuous window(dialog) * @param fbmp | Sprite * @param bmp | bitmap * @param w window width * @param h window height * @param x offset x of window * @param y offset y of window * @param l Unit grid size(square must); */ RF.DrawFrame = function( fbmp, bmp, w, h, x, y , l){ var width = w; var height = h; var g = fbmp; var lt = l; //edge g.drawBitmap(bmp[0], x, y); g.drawBitmap(bmp[2], x + width - lt, y); g.drawBitmap(bmp[5], x, y + height - lt); g.drawBitmap(bmp[7], x + width - lt, y + height - lt); //get width and height width = width - lt - lt; height = height- lt - lt; g.drawBitmapRect(bmp[1], new IRect(x + lt,y, x + lt + width , y + lt),false);//top g.drawBitmapRect(bmp[3], new IRect(x,y + lt,x + lt,y + lt + height),false);//left g.drawBitmapRect(bmp[6], new IRect(x + lt, y + height + lt, x + lt + width,y + height + lt + lt),false);//bottom g.drawBitmapRect(bmp[4], new IRect(x + width + lt , y + lt,x + width + lt + lt,y + lt + height),false);//right g.drawBitmapRect(bmp[8], new IRect(x + lt,y + lt,x + lt +width,y + lt+height),false);//center }; /** * Press continue or not * @returns {boolean} */ RF.IsNext = function(){ return IInput.up || IInput.isKeyDown(RC.Key.atk) || IInput.isKeyDown(RC.Key.ok)|| IInput.isKeyDown(13) || IInput.isKeyDown(27) || IInput.isKeyDown(32); }; /** * default color 0 * @returns {IColor} */ RF.C0 = function(){ return IColor.White(); }; /** * Show tips * @param m tips contents */ RF.ShowTips = function(m){ if(IVal.scene instanceof SMain == false) return; var main =IVal.scene.getMainUI(); var back = main.tipBack; var text = main.tipText; LUI.setText(text,RF.MakerValueText(m)); back.width = text.width + text.data.x * 2; back.height = text.height + text.data.y * 2; var r = LUI.getCtrlRect(back.data,main.ctrlItems,0,0); var r1 = back.GetRect(); var endX = r.x + DUI.HPoint(back.data.x,back.data.HAlign, r.width, r1.width); var endY = r.y + DUI.VPoint(back.data.y,back.data.VAlign, r.height,r1.height); back.x = endX; back.y = endY; text.x = back.x + text.data.x; text.y = back.y + text.data.y; back.opacity = 1; text.opacity = 1; back.pauseAnim(); text.pauseAnim(); back.addAction(action.wait,60 + m.length * 4); back.addAction(action.fade,1,0,60); text.addAction(action.wait,60 + m.length * 4); text.addAction(action.fade,1,0,60); }; /** * Key string translated to "empty" * @param str * @returns {String} */ RF.TextAnalysisNull = function(str){ var s = new String(str); s = ISprite.toRegular(s); s = s.replaceAll("\\r\\n", "\\n"); s = s.replaceAll("\\\\[Nn]", RF.CharToAScII(60000)); s = s.replaceAll("\\\\[Cc]\\[([0-9]+,[0-9]+,[0-9]+)]", ""); s = s.replaceAll("\\\\[Ss]\\[([0-9]+)]", ""); s = s.replaceAll("\\\\[Pp]", ""); s = s.replaceAll("\\\\[Ww]\\[([0-9]+)]", ""); s = s.replaceAll("\\\\[Vv]\\[([a-zA-Z0-9-_]+)]"," "); s = s.replaceAll("\\\\cd", ""); s = s.replaceAll("\\\\ck", ""); s = s.replaceAll("\\\\=", ""); s = s.replaceAll("\\\\>", ""); s = s.replaceAll("\\\\~", ""); s = s.replaceAll("\\\\\\|", ""); return s; }; /** * String converts to key encoding * @param str * @returns {String} * @constructor */ RF.TextAnalysis = function(str){ var s = new String(str); s = ISprite.toRegular(s); s = s.replaceAll("\\r\\n", "\\n"); s = s.replaceAll("\\\\[Nn]", RF.CharToAScII(60000)); s = s.replaceAll("\\\\[Cc]\\[([0-9]+,[0-9]+,[0-9]+)]",RF. CharToAScII(60001) + "[$1]"); s = s.replaceAll("\\\\[Ss]\\[([0-9]+)]", RF.CharToAScII(60002) + "[$1]"); s = s.replaceAll("\\\\[Pp]", RF.CharToAScII(60100)); s = s.replaceAll("\\\\[Ww]\\[([0-9]+)]", RF.CharToAScII(60104) + "[$1]"); s = s.replaceAll("\\\\[Vv]\\[([a-zA-Z0-9-_]+)]",RF.CharToAScII(60003) +"[$1]"); s = s.replaceAll("\\\\>", RF.CharToAScII(60105)); s = s.replaceAll("\\\\=", RF.CharToAScII(60106)); s = s.replaceAll("\\\\~", RF.CharToAScII(60101)); s = s.replaceAll("\\\\\\|", RF.CharToAScII(60103)); return s; }; /** * iFAction coordinates Translation * @param win | window * @param self | The object to calculate //{#RF.js_m_7#} * @param value | string or Fixed value * @param xy | x or y //{#RF.js_m_8#} * @returns Number */ RF.PointTranslation = function(win,self,value,xy){ if(typeof(value)=='string'){ var tag = value.split("_"); var obj = tag[0]; var alignment = tag[1]; var deviation = parseInt(tag[2]); var val = 0; var val2 = 0; var vars = 0; if(obj == "scene"){ if(xy == "x"){ val = IVal.GWidth; vars = self.width; }else{ val = IVal.GHeight; vars = self.height; } }else{ try{ if(xy == "x"){ val = win.getEval(obj + ".width"); val2 = win.getEval(obj + ".x"); vars = self.width; }else{ val = win.getEval(obj + ".height"); val2 = win.getEval(obj + ".y"); vars = self.height; } }catch(e){ return 0} } if(alignment == "left" || alignment == "top"){ return val2 + deviation; }else if(alignment == "center"){ return (val2 + (val - vars) / 2) + deviation; }else if(alignment == "right" || alignment == "bottom"){ return (val2 + val - vars) + deviation; } }else{ return value; } }; /** * calculate the damage number made by the attack of actor( to enemies) * @param enemy | enemy * @param dir | direction * @returns Object */ RF.ActorAtkEnemy = function(enemy,dir){ if(enemy.visible === false) return null; //get basic value var temp1 = RV.GameData.actor.getWAtk() - enemy.getWDef(); var attributeNum = RV.GameData.actor.getAttribute(enemy.getData().attributeId); //calculate the damage number var temp2 = Math.max(1,temp1) * attributeNum.atk - Math.max(1,temp1) * attributeNum.def; //Discrete var d1 = temp2 * 0.85; var d2 = temp2 * 1.15; var d = rand(Math.floor(d1),Math.ceil(d2)); //crit var crit = false; //dodge rate var luckNum1 = (enemy.getAddDodge() / 100) + Math.max( 0 , enemy.getSpeed() - RV.GameData.actor.getSpeed()) / (RV.GameData.actor.getSpeed() + enemy.getSpeed()) / 2; //crit rate var luckNum2 = ( RV.GameData.actor.getAddCrit() / 100) + Math.max( 0 , RV.GameData.actor.getLuck() - enemy.getLuck()) / (RV.GameData.actor.getLuck() + enemy.getLuck()) / 2; //calculate dodge if(RF.ProbabilityHit(luckNum1) || d == 0){ new LNum(3 , 0 , RV.NowMap.getView() , enemy.getActor().getCharacter().x , enemy.getActor().getCharacter().y); return null; } //calculate crit if(RF.ProbabilityHit(luckNum2)){ crit = true; d = d * (1.5 + ( RV.GameData.actor.getAddCritF() / 100)); } //calculate Knockback var r = RV.GameData.actor.getRepel(); //buff var buffs = RV.GameData.actor.getAtkBuffs(); for(var mid in buffs){ if(buffs[mid] === 1){ enemy.addBuff(mid); }else if(buffs[mid] === 2){ enemy.subBuff(mid); } } //return result return { crit : crit, damage : d, repel : r, dir : dir, fly : 0 }; }; /** * calculate the damage number made by enemy( to actor ) * @param enemy * @returns {{damage: *, repel: (number|DSetArms.repel), fly: number, crit: boolean, dir: number}|null} */ RF.EnemyAtkActor = function(enemy){ //get basic value var temp1 = enemy.getWAtk() - RV.GameData.actor.getWDef(); var attributeNum = enemy.getAttribute(); //calculate the damage number var temp2 = Math.max(1,temp1) * attributeNum.atk - Math.max(1,temp1) * attributeNum.def; //Discrete var d1 = temp2 * 0.85; var d2 = temp2 * 1.15; var d = rand(Math.floor(d1),Math.ceil(d2 + 1)); //crit var crit = false; //dodge rate var luckNum1 = (RV.GameData.actor.getAddDodge() / 100) + Math.max( 0 , RV.GameData.actor.getSpeed() - enemy.getSpeed()) / (RV.GameData.actor.getSpeed() + enemy.getSpeed()) / 2; //crit rate var luckNum2 = ( enemy.getAddCrit() / 100) + Math.max( 0 , enemy.getLuck() - RV.GameData.actor.getLuck()) / (RV.GameData.actor.getLuck() + enemy.getLuck()) / 2; //calculate dodge if(RF.ProbabilityHit(luckNum1) || d == 0){ new LNum(3 , 0 , RV.NowMap.getView() , RV.NowMap.getActor().getCharacter().x , RV.NowMap.getActor().getCharacter().y); return null; } //calculate crit if(RF.ProbabilityHit(luckNum2)){ crit = true; d = d * (1.5 + (enemy.getAddCritF() / 100)); } RV.NowCanvas.playAnim(enemy.atkAnim,null,RV.NowMap.getActor(),true,null); //calculate Knockback var r = enemy.getRepel(); //return result return { crit : crit, damage : d, repel : r, dir : enemy.getDir(), fly : 0 }; }; /** * calculate the damage number made by enemy( to enemies ) * @param enemy * @param enemy2 * @returns {{damage: *, repel: (number|DSetArms.repel), fly: number, crit: boolean, dir: number}|null} */ RF.EnemyAtkEnemy = function(enemy,enemy2){ //get basic value var temp1 = enemy.getWAtk() - enemy2.getWDef(); var attributeNum = enemy.getAttribute(enemy2); //calculate the damage number var temp2 = Math.max(1,temp1) * attributeNum.atk - Math.max(1,temp1) * attributeNum.def; //Discrete var d1 = temp2 * 0.85; var d2 = temp2 * 1.15; var d = rand(Math.floor(d1),Math.ceil(d2 + 1)); //crit var crit = false; //dodge rate var luckNum1 = (enemy2.getAddDodge() / 100) + Math.max( 0 , enemy2.getSpeed() - enemy.getSpeed()) / (enemy2.getSpeed() + enemy.getSpeed()) / 2; //crit rate var luckNum2 = ( enemy.getAddCrit() / 100) + Math.max( 0 , enemy.getLuck() - enemy2.getLuck()) / (enemy2.getLuck() + enemy.getLuck()) / 2; //calculate dodge if(RF.ProbabilityHit(luckNum1) || d == 0){ new LNum(3 , 0 , RV.NowMap.getView() , enemy2.getActor().getCharacter().x , enemy2.getActor().getCharacter().y); return null; } //calculate crit if(RF.ProbabilityHit(luckNum2)){ crit = true; d = d * (1.5 + (enemy.getAddCritF() / 100)); } RV.NowCanvas.playAnim(enemy.atkAnim,null,enemy2.getActor(),true,null); //calculate Knockback var r = enemy.getRepel(); //return result return { crit : crit, damage : d, repel : r, dir : enemy.getDir(), fly : 0 }; }; /** * Random selection of array values * @param ary * @returns {null|*} * @constructor */ RF.RandomChoose = function(ary){ if(ary == null || ary.length <= 0){ return null; } return ary[Math.floor(Math.random() * ary.length)]; }; /** * Whether the specified rate is achieved * @param rate | rate(floating point) * @returns {boolean} */ RF.ProbabilityHit = function(rate){ return rate > Math.random(); }; /** * String converts to AscII * @param num * @returns {string} */ RF.CharToAScII = function(num) { return String.fromCharCode(num); }; /** * Save game */ RF.SaveGame = function(){ RV.GameData.save(); RF.ShowTips("Save Completed"); }; /** * Load game */ RF.LoadGame = function(){ RV.IsDie = false; IAudio.BGMFade(2); IVal.scene.dispose(); if (typeof RF.ClearAllCache === "function") { RF.ClearAllCache(); } if(GMain.haveFile()){ RV.GameData.load(); }else{ RV.GameData.init(); } RV.InterpreterMain = new IMain(); RV.InterpreterOther = []; IVal.scene = new SMain(); }; RF.AddOtherEvent = function(events,tag,id){ var doEvent = new IMain(); doEvent.addEvents(events); doEvent.tag = tag; doEvent.NowEventId = id; RV.InterpreterOther.push(doEvent); }; RF.FindOtherEvent = function(tag){ for(var i = 0;i<RV.InterpreterOther.length;i++){ if(RV.InterpreterOther[i].tag == tag){ return RV.InterpreterOther[i]; } } return null; }; RF.CheckLanguage = function(str){ var reg = new RegExp("[\\u4E00-\\u9FFF]+","g"); if(reg.test(str)){ return true; } reg = new RegExp("[\\u3040-\\u309F\\u30A0-\\u30FF]+","g"); if(reg.test(str)){ return true; } reg = new RegExp("[\\u0E00-\\u0E7F]+","g"); if(reg.test(str)){ return true; } return false; }; RF.MakerValueText = function(str){ if(str != null){ var s = str.replaceAll("\\\\[Vv]\\[([a-zA-Z0-9-_]+)]",RF.CharToAScII(60003)+ "[$1]"); var end = ""; while(true){ if(s.length <= 0){ break; } var min = s.substring(0,1); s = s.substring(1,s.length); var c = min.charCodeAt(0); if(c == 60003){ var returnS = RF.TextToTemp(s , "[","]","\\[([a-zA-Z0-9-_]+)]"); s = RV.GameData.getValues(parseInt(returnS[0])) + returnS[1]; }else{ end += min; } } return end; } return ""; }; RF.TextToTemp = function( mainText, s, e, rex){ var tmp = mainText.substring(mainText.indexOf(s) + 1,mainText.indexOf(e)); mainText = mainText.substring(tmp.length + s.length + e.length, mainText.length); var temp1 = tmp.replaceAll(rex, "$1"); var temp_2 = temp1.replaceAll(" ", ""); var temp_e = temp_2.replaceAll(",", ","); return [temp_e,mainText]; }; /** * Clear map-specific graphics from the global cache (Blocks, Decorates, Scenes) */ RF.ClearMapCache = function(){ if(RV.Cache == null) return; var keys = Object.keys(RV.Cache); for(var i = 0; i < keys.length; i++){ var path = keys[i]; if(path.indexOf("Block/") === 0 || path.indexOf("Decorate/") === 0 || path.indexOf("Scene/") === 0){ delete RV.Cache[path]; } } }; /** * Clear the entire global cache */ RF.ClearAllCache = function(){ RV.Cache = []; };