|
|
@@ -30,30 +30,345 @@
|
|
|
|
|
|
<script>
|
|
|
var levels = null;
|
|
|
+ var instances = null;
|
|
|
+ var templateFNs = null;
|
|
|
|
|
|
- function loadAndFillLvInfo() {
|
|
|
+ function getInstanceByName(name) {
|
|
|
+ for (let i = 0; i < instances.length; i++) {
|
|
|
+ if (instances[i].lvinst == name) {
|
|
|
+ return instances[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getTemplateByName(name) {
|
|
|
+ for (let i = 0; i < templateFNs.length; i++) {
|
|
|
+ if (templateFNs[i] == name) {
|
|
|
+ return templateFNs[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ function getAllLvIdsByInstName(name) {
|
|
|
+ // 返回所有用到了该实例的关卡的id
|
|
|
+ const ids = [];
|
|
|
+ for (let i = 0; i < levels.length; i++) {
|
|
|
+ if (levels[i].lvinst == name) {
|
|
|
+ ids.push(levels[i].lvid);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ids;
|
|
|
+ }
|
|
|
+
|
|
|
+ function showInstanceInfoAt(div, inst) {
|
|
|
+ // 将其显示在页面上,其中template应该是一个下拉框
|
|
|
+ // try1-10应该是一个表格, 表格的头部应该是:尝试次数,瓦片数,种子,参数模板,表格里面的每个值是可以编辑的
|
|
|
+ div.innerHTML = `
|
|
|
+ <h2>实例名: ${inst.lvinst}</h2>
|
|
|
+ `;
|
|
|
+ // 显示所有用到了该实例的关卡
|
|
|
+ const lvIds = getAllLvIdsByInstName(inst.lvinst);
|
|
|
+ div.innerHTML += `
|
|
|
+ <p>用到了该实例的关卡: ${lvIds}</p>
|
|
|
+ `;
|
|
|
+ // 加入 template 下拉框
|
|
|
+ div.innerHTML += `
|
|
|
+ <p>模板名称: </p>
|
|
|
+ `;
|
|
|
+ const templateSelect = document.createElement('select');
|
|
|
+ templateSelect.id = 'template-select';
|
|
|
+ templateFNs.forEach(fn => {
|
|
|
+ const option = document.createElement('option');
|
|
|
+ option.value = fn;
|
|
|
+ option.textContent = fn;
|
|
|
+ if (fn == inst.template) {
|
|
|
+ option.selected = true;
|
|
|
+ }
|
|
|
+ templateSelect.appendChild(option);
|
|
|
+ });
|
|
|
+ div.appendChild(templateSelect);
|
|
|
+ // 加入表格
|
|
|
+ const table = document.createElement('table');
|
|
|
+ const thead = document.createElement('thead');
|
|
|
+ const tbody = document.createElement('tbody');
|
|
|
+ const tr = document.createElement('tr');
|
|
|
+ const th1 = document.createElement('th');
|
|
|
+ const th2 = document.createElement('th');
|
|
|
+ const th3 = document.createElement('th');
|
|
|
+ const th4 = document.createElement('th');
|
|
|
+ th1.textContent = '尝试次数';
|
|
|
+ th2.textContent = '瓦片数';
|
|
|
+ th3.textContent = '种子';
|
|
|
+ th4.textContent = '参数模板';
|
|
|
+ tr.appendChild(th1);
|
|
|
+ tr.appendChild(th2);
|
|
|
+ tr.appendChild(th3);
|
|
|
+ tr.appendChild(th4);
|
|
|
+ thead.appendChild(tr);
|
|
|
+ table.appendChild(thead);
|
|
|
+ table.appendChild(tbody);
|
|
|
+ div.appendChild(table);
|
|
|
+ // 加入表格内容
|
|
|
+ for (let i = 1; i <= 10; i++) {
|
|
|
+ var trynParams = inst['try' + i + '(tileCnt|seed|param_template)'].split('|');
|
|
|
+ const tr = document.createElement('tr');
|
|
|
+ const td1 = document.createElement('td');
|
|
|
+ const td2 = document.createElement('td');
|
|
|
+ const td3 = document.createElement('td');
|
|
|
+ const td4 = document.createElement('td');
|
|
|
+ const input1 = document.createElement('input');
|
|
|
+ const input2 = document.createElement('input');
|
|
|
+ const input3 = document.createElement('input');
|
|
|
+ const input4 = document.createElement('input');
|
|
|
+ input1.type = 'text';
|
|
|
+ input1.value = trynParams[0];
|
|
|
+ input2.type = 'text';
|
|
|
+ input2.value = trynParams[1];
|
|
|
+ input3.type = 'text';
|
|
|
+ input3.value = trynParams[2];
|
|
|
+ td1.textContent = i;
|
|
|
+ td2.appendChild(input1);
|
|
|
+ td3.appendChild(input2);
|
|
|
+ td4.appendChild(input3);
|
|
|
+ tr.appendChild(td1);
|
|
|
+ tr.appendChild(td2);
|
|
|
+ tr.appendChild(td3);
|
|
|
+ tr.appendChild(td4);
|
|
|
+ tbody.appendChild(tr);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 增加一个按钮,点击后可以保存
|
|
|
+ const saveButton = document.createElement('button');
|
|
|
+ saveButton.id = 'save-instance-button';
|
|
|
+ saveButton.textContent = '保存';
|
|
|
+ div.appendChild(saveButton);
|
|
|
+ saveButton.addEventListener('click', () => {
|
|
|
+ // 保存实例信息
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function showTemplateInfoAt(div, templateInfo) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function initData() {
|
|
|
// 读取关卡信息并填充到页面
|
|
|
if (levels == null) {
|
|
|
window.electron.send('parse-csv', '../../conf/levelInfo.csv')
|
|
|
window.electron.receive('csv-data', (data) => {
|
|
|
- const levelList = document.getElementById('level-list');
|
|
|
- const levelDetails = document.getElementById('level-details');
|
|
|
- // 将levels里面的信息填充到页面
|
|
|
- data.forEach(level => {
|
|
|
- const listItem = document.createElement('div');
|
|
|
- listItem.textContent = level.lvid;
|
|
|
- listItem.addEventListener('click', () => {
|
|
|
- levelDetails.innerHTML = `
|
|
|
- <h2>关卡ID: ${level.lvid}</h2>
|
|
|
- <p>关卡说明: ${level.lvinst}</p>
|
|
|
- <p>类型: ${level.type}</p>
|
|
|
- <p>DDA类型: ${level.dda_type}</p>
|
|
|
- <p>DDA参数: ${level.dda_para}</p>
|
|
|
- `;
|
|
|
+ if (levels == null) {
|
|
|
+ levels = data;
|
|
|
+ window.electron.send('parse-csv', '../../conf/levelInstInfo.csv')
|
|
|
+ } else {
|
|
|
+ if (instances == null) {
|
|
|
+ instances = data
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (templateFNs == null) {
|
|
|
+ window.electron.send('get-file-list', '../../tf_templates')
|
|
|
+ window.electron.receive('file-list-error', (data) => {
|
|
|
+ console.error('Error reading directory: ', err);
|
|
|
+ });
|
|
|
+ window.electron.receive('file-list-data', (data) => {
|
|
|
+ // 过滤掉非 .json 后缀的文件
|
|
|
+ templateFNs = [];
|
|
|
+ for (let i = 0; i < data.length; i++) {
|
|
|
+ if (data[i].endsWith('.json')) {
|
|
|
+ templateFNs.push(data[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建一个新实例,并将其关联到指定的关卡中
|
|
|
+ function addNewInst(level, instDetails) {
|
|
|
+ // 获取实例名称
|
|
|
+ window.electron.send('open-newinst-prompt', 'some data');
|
|
|
+ window.electron.receive('prompt-newinst-reply', (event, arg) => {
|
|
|
+ const instName = arg;
|
|
|
+ // 检查是否已经存在
|
|
|
+ for (let i = 0; i < instances.length; i++) {
|
|
|
+ if (instances[i].lvinst == instName) {
|
|
|
+ alert('实例已经存在');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 不存在则加入
|
|
|
+ const inst = {
|
|
|
+ lvinst: instName,
|
|
|
+ template: '',
|
|
|
+ 'try1(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try2(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try3(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try4(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try5(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try6(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try7(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try8(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try9(tileCnt|seed|param_template)': '0|0|0',
|
|
|
+ 'try10(tileCnt|seed|param_template)': '0|0|0'
|
|
|
+ };
|
|
|
+ instances.push(inst);
|
|
|
+ showInstanceInfoAt(instDetails, inst);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ function saveLvInfo(lvDetails) {
|
|
|
+ // 保存关卡的详细信息
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function fillLvInfo() {
|
|
|
+ // 读取关卡信息并填充到页面
|
|
|
+ if (levels != null) {
|
|
|
+ const levelList = document.getElementById('level-list');
|
|
|
+ const levelDetails = document.getElementById('level-details');
|
|
|
+ const instDetails = document.getElementById('instance-details');
|
|
|
+ const templateDetails = document.getElementById('tempalte-details');
|
|
|
+ // 将levels里面的信息填充到页面
|
|
|
+ levels.forEach(level => {
|
|
|
+ const listItem = document.createElement('li');
|
|
|
+ listItem.textContent = level.lvid;
|
|
|
+ listItem.addEventListener('click', () => {
|
|
|
+ // 将选中的关卡id条目的背景颜色设置为蓝色
|
|
|
+ Array.from(levelList.children).forEach(node => {
|
|
|
+ if (node.textContent == level.lvid) {
|
|
|
+ node.style.backgroundColor = 'lightblue';
|
|
|
+ } else {
|
|
|
+ node.style.backgroundColor = 'white';
|
|
|
+ }
|
|
|
});
|
|
|
- levelList.appendChild(listItem);
|
|
|
+ levelDetails.innerHTML = `
|
|
|
+ <h2>关卡ID: ${level.lvid}</h2>
|
|
|
+ <p>关卡实例名称: ${level.lvinst}</p>`
|
|
|
+ //
|
|
|
+ if (level.lvinst == '') {
|
|
|
+ // 实例不存在,
|
|
|
+ // 显示一个下来列表,选择实例
|
|
|
+ const instSelect = document.createElement('select');
|
|
|
+ instSelect.id = 'inst-select';
|
|
|
+ instances.forEach(inst => {
|
|
|
+ const option = document.createElement('option');
|
|
|
+ option.value = inst.lvinst;
|
|
|
+ option.textContent = inst.lvinst;
|
|
|
+ instSelect.appendChild(option);
|
|
|
+ });
|
|
|
+ levelDetails.appendChild(instSelect);
|
|
|
+ }
|
|
|
+ // 加入一个按钮,点击后可以创建实例
|
|
|
+ const createInstButton = document.createElement('button');
|
|
|
+ createInstButton.id = 'create-instance-button';
|
|
|
+ createInstButton.textContent = '创建新的实例';
|
|
|
+ levelDetails.appendChild(createInstButton);
|
|
|
+ // createInstButton.addEventListener('click', () => {
|
|
|
+ // addNewInst(level);
|
|
|
+ // });
|
|
|
+ console.log(createInstButton.onclick);
|
|
|
+
|
|
|
+ // 增加一个下拉框,选择类型:normal,hard,super-hard
|
|
|
+ const typeSelect = document.createElement('select');
|
|
|
+ typeSelect.id = 'type-select';
|
|
|
+ const normalOption = document.createElement('option');
|
|
|
+ normalOption.value = 'normal';
|
|
|
+ normalOption.textContent = 'normal';
|
|
|
+ const hardOption = document.createElement('option');
|
|
|
+ hardOption.value = 'hard';
|
|
|
+ hardOption.textContent = 'hard';
|
|
|
+ const superHardOption = document.createElement('option');
|
|
|
+ superHardOption.value = 'super-hard';
|
|
|
+ superHardOption.textContent = 'super-hard';
|
|
|
+ typeSelect.appendChild(normalOption);
|
|
|
+ typeSelect.appendChild(hardOption);
|
|
|
+ typeSelect.appendChild(superHardOption);
|
|
|
+ levelDetails.innerHTML += `
|
|
|
+ <p>关卡难度级别:</p>`
|
|
|
+ levelDetails.appendChild(typeSelect);
|
|
|
+ // 如果 type(normal=0,hard=1,superHard=2)
|
|
|
+ type = level[2];
|
|
|
+ if (type == 0) {
|
|
|
+ normalOption.selected = true;
|
|
|
+ } else if (type == 1) {
|
|
|
+ hardOption.selected = true;
|
|
|
+ } else if (type == 2) {
|
|
|
+ superHardOption.selected = true;
|
|
|
+ }
|
|
|
+ // 显示dda类型和参数
|
|
|
+ levelDetails.innerHTML +=
|
|
|
+ `
|
|
|
+ <p>DDA类型: ${level.dda_type}</p>
|
|
|
+ <p>DDA参数: ${level.dda_para}</p>
|
|
|
+ `;
|
|
|
+
|
|
|
+ // 增加一个按钮,点击后可以保存
|
|
|
+ const saveButton = document.createElement('button');
|
|
|
+ saveButton.id = 'save-lv-button';
|
|
|
+ saveButton.textContent = '保存';
|
|
|
+ levelDetails.appendChild(saveButton);
|
|
|
+
|
|
|
+ levelDetails.addEventListener('click', (event) => {
|
|
|
+ if (event.target.id === 'create-instance-button') {
|
|
|
+ addNewInst(level, instDetails);
|
|
|
+ } else if (event.target.id === 'save-lv-button') {
|
|
|
+ saveLvInfo(levelDetails);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 显示实例信息
|
|
|
+ const inst = getInstanceByName(level.lvinst);
|
|
|
+ if (inst != null) {
|
|
|
+ showInstanceInfoAt(instDetails, inst);
|
|
|
+ // 显示模板信息
|
|
|
+ const template = getTemplateByName(inst.template);
|
|
|
+ if (template != null) {
|
|
|
+ showTemplateInfoAt(templateDetails, getTemplateByName(inst.template));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ instDetails.innerHTML = `
|
|
|
+ <h2>实例名: Error:未定义</h2>
|
|
|
+ `
|
|
|
+ }
|
|
|
});
|
|
|
- })
|
|
|
+ levelList.appendChild(listItem);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function fillInstanceInfo() {
|
|
|
+ // 读取关卡信息并填充到页面
|
|
|
+ if (instances != null) {
|
|
|
+ const lst = document.getElementById('instance-list');
|
|
|
+ const details = document.getElementById('instance-details');
|
|
|
+ // 将levels里面的信息填充到页面
|
|
|
+ instances.forEach(inst => {
|
|
|
+ const listItem = document.createElement('li');
|
|
|
+ listItem.textContent = inst.lvinst;
|
|
|
+ listItem.addEventListener('click', () => {
|
|
|
+ showInstanceInfoAt(details, inst)
|
|
|
+ });
|
|
|
+ lst.appendChild(listItem);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function fillTemplateInfo() {
|
|
|
+ if (templateFNs != null) {
|
|
|
+ const lst = document.getElementById('template-list');
|
|
|
+ const details = document.getElementById('template-details');
|
|
|
+ // 将levels里面的信息填充到页面
|
|
|
+ templateFNs.forEach(fn => {
|
|
|
+ const listItem = document.createElement('li');
|
|
|
+ listItem.textContent = fn;
|
|
|
+ listItem.addEventListener('click', () => {
|
|
|
+ // 放入截图
|
|
|
+ });
|
|
|
+ lst.appendChild(listItem);
|
|
|
+ });
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -62,18 +377,69 @@
|
|
|
.then(response => response.text())
|
|
|
.then(data => {
|
|
|
document.getElementById('content').innerHTML = data;
|
|
|
- loadAndFillLvInfo();
|
|
|
+ fillLvInfo();
|
|
|
+ // 绑定新增关卡按钮
|
|
|
+ document.getElementById('add-level-button').addEventListener('click', function() {
|
|
|
+ window.electron.send('open-newlv-prompt', 'some data')
|
|
|
+ window.electron.receive('prompt-newlv-reply', (event, arg) => {
|
|
|
+ const lvid = arg;
|
|
|
+ // 检查是否已经存在
|
|
|
+ for (let i = 0; i < levels.length; i++) {
|
|
|
+ if (levels[i].lvid == lvid) {
|
|
|
+ alert('关卡id已经存在');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 不存在则加入
|
|
|
+ const level = {
|
|
|
+ lvid: lvid,
|
|
|
+ lvinst: '',
|
|
|
+ type: 0,
|
|
|
+ dda_type: '0',
|
|
|
+ dda_para: '0|10000'
|
|
|
+ };
|
|
|
+ levels.push(level);
|
|
|
+ // 刷新页面
|
|
|
+ fillLvInfo();
|
|
|
+ // 选中该关卡
|
|
|
+ const levelList = document.getElementById('level-list');
|
|
|
+ levelList.childNodes.forEach(node => {
|
|
|
+ if (node.textContent == lvid) {
|
|
|
+ node.click();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ })
|
|
|
+ });
|
|
|
})
|
|
|
.catch(error => {
|
|
|
console.error('Error loading the levels content:', error);
|
|
|
});
|
|
|
});
|
|
|
document.getElementById('examples').addEventListener('click', function() {
|
|
|
- // 更改content区域为实例布局
|
|
|
+ fetch('instance.html')
|
|
|
+ .then(response => response.text())
|
|
|
+ .then(data => {
|
|
|
+ document.getElementById('content').innerHTML = data;
|
|
|
+ fillInstanceInfo();
|
|
|
+ })
|
|
|
+ .catch(error => {
|
|
|
+ console.error('Error loading the intance content:', error);
|
|
|
+ });
|
|
|
});
|
|
|
document.getElementById('templates').addEventListener('click', function() {
|
|
|
- // 更改content区域为模板布局
|
|
|
+ fetch('template.html')
|
|
|
+ .then(response => response.text())
|
|
|
+ .then(data => {
|
|
|
+ document.getElementById('content').innerHTML = data;
|
|
|
+ fillTemplateInfo();
|
|
|
+ })
|
|
|
+ .catch(error => {
|
|
|
+ console.error('Error loading the intance content:', error);
|
|
|
+ });
|
|
|
});
|
|
|
+
|
|
|
+ // 初始化数据
|
|
|
+ initData();
|
|
|
</script>
|
|
|
</body>
|
|
|
</html>
|