package com.rpsg.rpg.object.game;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.mozilla.javascript.Context;
import com.rpsg.rpg.core.File;
/**
* GDX-RPG 脚本
*/
public class Scriptable {
String js;
List<String> include = new ArrayList<>();
private static final Pattern p = Pattern.compile("@include\\s(.+?)\n");
ScriptableManager manager;
protected Scriptable(String fileName, ScriptableManager manager) {
this.manager = manager;
js = File.readString(fileName);
//为了节省开销,include不允许嵌套,也就是说一个js脚本A,include了脚本B,那么仅仅简单读取B,并不再include其他脚本。
Matcher m = p.matcher(js);
while (m.find()) {
String scriptName = m.group(1);
if(scriptName != null)
include.add(scriptName);
}
}
/**
* 返回js脚本并且预编译上下文(以提升性能)
*/
public String get(Context ctx, org.mozilla.javascript.Scriptable scope) {
for(String file : include)
manager.get(this, ctx, file).exec(ctx, scope);
return js;
}
public boolean executable() {
return js != null && js.trim().length() != 0;
}
}