File indexing completed on 2024-05-12 15:21:09

0001 /* GCompris - editor_worker.js
0002  *
0003  * SPDX-FileCopyrightText: 2015 Holger Kaelberer <holger.k@elberer.de>
0004  *
0005  * Authors:
0006  *   Holger Kaelberer <holger.k@elberer.de>
0007  *
0008  *   SPDX-License-Identifier: GPL-3.0-or-later
0009  */
0010 
0011 Qt.include("../balancebox_common.js")
0012 
0013 WorkerScript.onMessage = function(msg) {
0014     var maxContactValue = 1;
0015     msg.lastBallIndex = -1;
0016     msg.lastGoalIndex = -1;
0017     msg.lastOrderNum = 0;
0018     msg.mapModel.clear();
0019     msg.targetList = [];
0020     for (var row = 0; row < msg.level.map.length; row++) {
0021         for (var col = 0; col < msg.level.map[row].length; col++) {
0022             var contactValue = "";
0023             var value = parseInt(msg.level.map[row][col]);  // always enforce number
0024             var orderNum = (value & 0xFF00) >> 8;
0025             if (orderNum > 0 && msg.level.targets[orderNum - 1] === undefined) {
0026                 console.error("Invalid level: orderNum " + orderNum
0027                               + " without target value!");
0028             } else if (orderNum > 0) {
0029                 if (orderNum > msg.lastOrderNum)
0030                     msg.lastOrderNum = orderNum;
0031                 var target = msg.level.targets[orderNum-1]
0032                 msg.targetList.push(parseInt(target));
0033                 contactValue = Number(target).toString();
0034                 if (target >= maxContactValue)
0035                     maxContactValue = target + 1;
0036             }
0037             msg.mapModel.append({
0038                 "row": row,
0039                 "col": col,
0040                 "value": value,
0041                 "contactValue": (orderNum > 0) ? contactValue : ""
0042             });
0043             if (value & GOAL) {
0044                 if (msg.lastGoalIndex > -1) {
0045                     console.error("Invalid level: multiple goal locations: row/col="
0046                                   + row + "/" + col);
0047                     return;
0048                 }
0049                 msg.lastGoalIndex = row * msg.level.map.length + col;
0050             }
0051             if (value & START) {
0052                 if (msg.lastBallIndex > -1) {
0053                     console.error("Invalid level: multiple start locations: row/col="
0054                                   + row + "/" + col);
0055                     return;
0056                 }
0057                 msg.lastBallIndex = row * msg.level.map.length + col;
0058             }
0059         }
0060         msg.mapModel.sync();  // sync per row
0061     }
0062     msg.maxContactValue = maxContactValue;
0063     // send result back to the gui-thread
0064     WorkerScript.sendMessage(msg);
0065 }